OrderListForm.php 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\admin\models\cashier;
  8. use app\constants\OptionSetting;
  9. use app\models\AccountLog;
  10. use app\models\Admin;
  11. use app\models\CashierActionLog;
  12. use app\models\common\admin\order\CommonOrderSearch;
  13. use app\models\common\ExpressDetail;
  14. use app\models\DeliveryInfo;
  15. use app\models\Express;
  16. use app\models\FoodFlag;
  17. use app\models\Goods;
  18. use app\models\Md;
  19. use app\models\Order;
  20. use app\models\OrderDetail;
  21. use app\models\OrderForm;
  22. use app\models\OrderRefund;
  23. use app\models\OrderStateFlow;
  24. use app\models\SaasUser;
  25. use app\models\Salesman;
  26. use app\models\Shop;
  27. use app\models\Store;
  28. use app\models\StoreCloud;
  29. use app\models\User;
  30. use app\models\CloudGoodsBind;
  31. use app\models\OrderTransit;
  32. use app\models\Supplier;
  33. use app\models\VerifyCardSale;
  34. use app\utils\Delivery\Delivery;
  35. use app\utils\Export;
  36. use app\utils\ExportList;
  37. use app\utils\OrderNo;
  38. use app\utils\Refund;
  39. use app\utils\Tools;
  40. use yii\base\Model;
  41. use yii\db\Query;
  42. use yii\helpers\Json;
  43. use \app\models\AlipayAcitvityVoucherOrder;
  44. class OrderListForm extends Model
  45. {
  46. public $name;
  47. public $export;
  48. public $store_id;
  49. public $user_id;
  50. public $md_id;
  51. public $keyword;
  52. public $status;
  53. public $page;
  54. public $limit;
  55. public $md_name;
  56. public $order_no;
  57. public $goods_name;
  58. public $mobile;
  59. public $book_name;
  60. public $book_mobile;
  61. public $is_offline;
  62. public $clerk_id;
  63. public $parent_id;
  64. public $shop_id;
  65. public $order_type;
  66. public $dateStart;
  67. public $dateEnd;
  68. public $express_type;
  69. public $keywordType;
  70. public $seller_comments;
  71. public $fields;
  72. public $type;
  73. public $mch_id;
  74. public $flag; // 是否导出
  75. public $supplier_id;
  76. public $supplier;
  77. public $user_name;
  78. public $salesman_id;
  79. /**
  80. * @var 所属平台
  81. */
  82. public $platform;//所属平台
  83. /**
  84. * @var bool 是否是配送员订单
  85. */
  86. public $is_delivery = false;//是否是配送员订单
  87. /**
  88. * @var bool 是否是配送员订单
  89. */
  90. public $is_same_city = false;//是否是配送员订单
  91. /**
  92. * @var 获取默写城市的订单 例如:["\u5357\u5b81","\u4e0a\u6d77"]
  93. */
  94. public $shop_list;
  95. public $order_id;
  96. public function rules()
  97. {
  98. return [
  99. [['keyword', 'flag'], 'trim'],
  100. [['status', 'page', 'limit', 'user_id', 'is_offline', 'clerk_id', 'shop_id', 'keywordType', 'platform', 'order_type', 'salesman_id', 'md_id'], 'integer'],
  101. [['status',], 'default', 'value' => -1],
  102. [['page',], 'default', 'value' => 1],
  103. [['dateStart', 'dateEnd', 'express_type', 'md_name', 'order_no', 'goods_name', 'mobile'], 'trim'],
  104. [['seller_comments', 'flag', 'user_name'], 'string'],
  105. [['export'], 'safe'],
  106. [['fields', 'is_delivery', 'shop_list', 'book_name', 'book_mobile', 'name'], 'safe']
  107. ];
  108. }
  109. public function search($is_scan_pay = false)
  110. {
  111. if (!$this->validate()) {
  112. return [
  113. 'code' => 1,
  114. 'msg' => $this->getErrorSummary(false)[0],
  115. ];
  116. }
  117. $query = Order::find()->alias('o')->where(['o.order_origin'=>Order::ORDER_SOURCE_CASHIER])->andWhere(['<>','o.trade_status',Order::ORDER_FLOW_CANCEL]);
  118. if (get_md_id()) {
  119. $query->andWhere(['o.md_id' => get_md_id()]);
  120. }
  121. if (!is_null($this->order_type) && in_array($this->order_type, [0, 1, 2, 3])) {
  122. $query->andWhere([
  123. 'o.order_type' => $this->order_type
  124. ]);
  125. }
  126. $admin = get_admin();
  127. $admin_id = $admin->id;
  128. if ($admin->username == 'admin') {
  129. $admin_id = null;
  130. }
  131. if ($admin_id) {
  132. $salesman_id = $this->salesman_id;
  133. $salesman_where = [
  134. 'admin_id' => $admin_id,
  135. 'is_delete' => 0
  136. ];
  137. if ($salesman_id) {
  138. $salesman_where['id'] = $salesman_id;
  139. }
  140. $ids = Salesman::find()->where($salesman_where)->select('id')->asArray()->all();
  141. $admin_model = Admin::findOne($admin_id);
  142. $area_level = $admin_model->area_level;
  143. $store_query = Store::find()->where(['is_delete' => 0]);
  144. if ($this->salesman_id) {
  145. $store_query->andWhere(['in', 'salesman_id', array_column($ids, 'id')]);
  146. } else {
  147. if($area_level == 1){
  148. $store_query->andWhere([
  149. 'or',
  150. ['province_id' => $admin_model->province_id, 'city_id' => $admin_model->city_id, 'district_id' => $admin_model->district_id],
  151. ['admin_id' => $admin_id],
  152. ['in', 'salesman_id', array_column($ids, 'id')]
  153. ]);
  154. } elseif ($area_level == 2){
  155. $store_query->andWhere([
  156. 'or',
  157. ['province_id' => $admin_model->province_id, 'city_id' => $admin_model->city_id],
  158. ['admin_id' => $admin_id],
  159. ['in', 'salesman_id', array_column($ids, 'id')]
  160. ]);
  161. } elseif ($area_level == 3){
  162. $store_query->andWhere([
  163. 'or',
  164. ['province_id' => $admin_model->province_id],
  165. ['admin_id' => $admin_id],
  166. ['in', 'salesman_id', array_column($ids, 'id')]
  167. ]);
  168. } else {
  169. $store_query->andWhere([
  170. 'or',
  171. ['admin_id' => $admin_id],
  172. ['in', 'salesman_id', array_column($ids, 'id')]
  173. ]);
  174. }
  175. }
  176. $ids = $store_query->select('id')->column();
  177. }
  178. if (!empty($this->name)) {
  179. $query->andWhere(['o.name' => $this->name]);
  180. }
  181. if (!empty($ids)) {
  182. $query->andWhere(['o.store_id' => $ids]);
  183. } else {
  184. $query->andWhere([
  185. 'o.store_id' => $this->store_id
  186. ]);
  187. }
  188. $query->leftJoin(['u' => User::tableName()], 'u.id = o.user_id')
  189. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding')
  190. ->leftJoin(['od' => OrderDetail::tableName()], 'od.order_id=o.id');
  191. switch ($this->status) {
  192. case 0:
  193. $query->andWhere(['o.is_delete' => Order::IS_DELETE_FALSE, 'is_pay' => Order::IS_PAY_FALSE]);
  194. break;
  195. case 1:
  196. $query->andWhere([
  197. 'o.trade_status' => Order::ORDER_FLOW_NO_SEND,
  198. 'o.is_delete' => Order::IS_DELETE_FALSE
  199. ])->andWhere(['or', ['o.is_pay' => Order::IS_PAY_TRUE], ['o.pay_type' => Order::PAY_TYPE_COD]]);
  200. break;
  201. case 2:
  202. $query->andWhere([
  203. 'o.trade_status' => Order::ORDER_FLOW_SEND,
  204. 'o.is_delete' => Order::IS_DELETE_FALSE
  205. ])->andWhere(['or', ['o.is_pay' => Order::IS_PAY_TRUE], ['o.pay_type' => Order::PAY_TYPE_COD]]);
  206. break;
  207. case 3:
  208. $query->andWhere([
  209. 'o.trade_status' => Order::ORDER_FLOW_CONFIRM,
  210. 'o.is_delete' => Order::IS_DELETE_FALSE
  211. ])->andWhere(['or', ['o.is_pay' => Order::IS_PAY_TRUE], ['o.pay_type' => Order::PAY_TYPE_COD]]);
  212. break;
  213. case 4:
  214. break;
  215. case 5:
  216. $query->andWhere(['or', ['o.trade_status' => Order::ORDER_FLOW_CANCEL],
  217. ['o.is_delete' => Order::IS_DELETE_TRUE]]);
  218. break;
  219. case 6:
  220. $query->andWhere(['and',['o.apply_delete' => Order::ORDER_APPLY_DELETE], ['!=', 'o.trade_status', Order::ORDER_FLOW_CANCEL]]);
  221. break;
  222. default:
  223. if (empty($this->order_id)) {
  224. $query->andWhere([
  225. 'o.is_delete' => Order::IS_DELETE_FALSE
  226. ]);
  227. }
  228. break;
  229. }
  230. if (get_params('is_recycle')) {
  231. $query->andWhere([
  232. 'o.is_recycle' => Order::IS_DELETE_TRUE
  233. ]);
  234. } else {
  235. $query->andWhere([
  236. 'o.is_recycle' => Order::IS_DELETE_FALSE
  237. ]);
  238. }
  239. if ($this->order_id && $this->order_id > 0) {
  240. $query->andWhere(['o.id' => $this->order_id]);
  241. }
  242. // TODO:
  243. $commonOrderSearch = new CommonOrderSearch();
  244. if (!$this->order_id) {
  245. // $query = $commonOrderSearch->search($query, $this);
  246. // $query = $commonOrderSearch->keyword($query, $this->keywordType, $this->keyword);
  247. if ($this->md_name) {
  248. $query->leftJoin(['md' => Md::tableName()], 'md.id=o.md_id')->andWhere(['like', 'md.name', $this->md_name]);
  249. }
  250. if ($this->order_no) {
  251. $query->andWhere(['OR', ['like', 'o.order_no', $this->order_no],
  252. ['like', 'su.name', $this->order_no],
  253. ['like', 'su.mobile', $this->order_no],
  254. ['like', 'o.address', $this->order_no]
  255. ]);
  256. }
  257. if ($this->mobile) {
  258. $query->andWhere([
  259. 'or',
  260. ['like', 'o.mobile', $this->mobile],
  261. ['like', 'u.binding', $this->mobile],
  262. ]);
  263. }
  264. if ($this->goods_name) {
  265. $query->andWhere(['like', 'od.goods_name', $this->goods_name]);
  266. }
  267. if ($this->user_name) {
  268. $query->andWhere(['or', ['like', 'o.name', $this->user_name], ['like', 'su.name', $this->user_name]]);
  269. }
  270. }
  271. if ($this->dateStart) {
  272. $query->andWhere(['>=', 'o.created_at', strtotime($this->dateStart)]);
  273. }
  274. if ($this->dateEnd) {
  275. $query->andWhere(['<=', 'o.created_at', strtotime($this->dateEnd)]);
  276. }
  277. if (!$this->order_id) {
  278. // $query->andWhere(['o.is_offline' => $this->is_offline]);
  279. }
  280. if ($this->platform !== null && $this->platform !== '') {
  281. $query->andWhere([
  282. 'u.platform' => $this->platform
  283. ]);
  284. }
  285. if($this->book_name){
  286. $query->andWhere(['like', 'o.book_info', $this->book_name]);
  287. }
  288. if($this->book_mobile){
  289. $query->andWhere(['like', 'o.book_info', $this->book_mobile]);
  290. }
  291. if($this->md_id){
  292. $query->andWhere(['o.md_id' => $this->md_id]);
  293. }
  294. $refundQuery1 = OrderRefund::find()->alias('or')
  295. ->select('or.status, or.order_id, or.created_at')
  296. ->where(['or.store_id' => $this->store_id, 'or.is_delete' => 0]);
  297. $refundQuery = (new Query())->from(['or' => $refundQuery1])->where('`or`.order_id=o.id')
  298. ->select('or.status')
  299. ->orderBy(['or.created_at' => SORT_DESC])
  300. ->limit(1);
  301. $query->orderBy('o.id DESC')
  302. ->select(['o.*', 'su.name as nickname', 'u.nickname as de_name', 'u.platform', 'u.binding', 'u.avatar_url',
  303. 'refund' => $refundQuery, 'od.delivery_type', 'od.attr', 'o.name user_name', 'o.mobile user_mobile', 'o.address user_address', 'su.avatar', 'od.order_transit_id']);
  304. $query->groupBy('o.id');
  305. $pagination = pagination_make($query);
  306. $listArray = $pagination['list'];
  307. foreach ($listArray as $i => &$item) {
  308. $item['name'] = $item['name'] ?: $item['nickname'];
  309. $item['mobile'] = $item['mobile'] ?: $item['binding'];
  310. $item['book'] = [];
  311. if ($item['order_type'] == 1) {
  312. $attr = Json::decode($item['attr']);
  313. if (count($attr) > 1) {
  314. $date_data = current($attr)['date'] . '/' . end($attr)['date'];
  315. } else {
  316. $date_data = $attr[0]['date'];
  317. }
  318. $item['book'] = [
  319. 'date' => $date_data
  320. ];
  321. }
  322. if (empty($item['binding'])) {
  323. $item['nickname'] = $item['de_name'];
  324. $item['avatar'] = $item['avatar_url'];
  325. }
  326. if ($item['order_type'] == 2) {
  327. $tmp_attr = Json::decode($item['attr']);
  328. $item['book']['date'] = $tmp_attr['date'] . ' ' . $tmp_attr['time'];
  329. }
  330. $rmList = [];
  331. if ($this->order_id && $this->order_id > 0) {
  332. $rmQuery = \app\models\OrderRefundMoney::find()->where(['is_delete' => 0, 'order_id' => $this->order_id]);
  333. $rmList = $rmQuery->orderBy('id DESC')->asArray()->all();
  334. foreach($rmList as &$k){
  335. $k['created_at'] = date('Y-m-d H:i:s', $k['created_at']);
  336. }
  337. }
  338. $item['rmList'] = $rmList;
  339. if (!empty($item['food_flag_id'])) {
  340. $food_flag = FoodFlag::findOne($item['food_flag_id']);
  341. $item['food_table_num'] = $food_flag->table_num;
  342. }
  343. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  344. $item['goods_list'] = $this->getOrderGoodsList($item['id']);
  345. $item['clerk_name'] = '';
  346. $shop = Shop::findOne($item['shop_id']);
  347. if ($shop) {
  348. $user = User::findOne(Shop::findOne($item['shop_id'])->user_id);
  349. if ($user) {
  350. $item['clerk_name'] = $user->nickname;
  351. }
  352. }
  353. $item['integral'] = json_decode($item['integral'], true);
  354. if (isset($item['address_data'])) {
  355. $item['address_data'] = json_decode($item['address_data']);
  356. }
  357. $item['flag'] = 0;
  358. $item['delivery_info'] = [];
  359. // 同城配送配送信息
  360. if ($item['delivery_type'] == OrderDetail::GOODS_DELIVERY_IM) {
  361. $delivery_info = DeliveryInfo::findOne(['order_no' => $item['order_no']]);
  362. $item['delivery_info'] = [
  363. 'waybill_id' => $delivery_info->waybill_id,
  364. 'status' => Delivery::$validOrderStatus[$delivery_info->status],
  365. 'reason' => $delivery_info->reason_id > 0 ? Delivery::$validReason[$delivery_info->reason_id] : '',
  366. 'fee' => $delivery_info->fee,
  367. 'duct_fee' => $delivery_info->deduct_fee,
  368. 'delivery_type' => Delivery::$deliveryType[$delivery_info->delivery_type],
  369. 'rider_name' => $delivery_info->rider_name,
  370. 'rider_mobile' => $delivery_info->rider_mobile
  371. ];
  372. }
  373. $item['md_info'] = null;
  374. if ($item['md_id']) {
  375. $item['md_info'] = Md::find()->where(['id' => $item['md_id']])
  376. ->select('id, name, address, cover_url, start_time, end_time, mobile, open_status, shop_time_type, is_single')->one();
  377. }
  378. $item['pay_user_info'] = null;
  379. if ($item['pay_user_id'] > 0) {
  380. $pay_saas_user = SaasUser::findOne(['mobile' => User::findOne($item['pay_user_id'])->binding]);
  381. $item['pay_user_info'] = [
  382. 'name' => $pay_saas_user->name,
  383. 'mobile' => $pay_saas_user->mobile
  384. ];
  385. }
  386. $item['all_discount'] = sprintf("%.2f", ($item['integral']['forehead'] + $item['coupon_sub_price']));
  387. $item['alipay_activity_voucher'] = AlipayAcitvityVoucherOrder::getByOrder($item['alipay_trade_no']);
  388. if ($item['store_id']) {
  389. $item['store'] = Store::find()->where(['id' => $item['store_id']])->select('id, name, province_id, city_id, district_id, address')->one();
  390. }
  391. if (empty($item['address']) && (int)$item['is_offline']) {
  392. if (!empty($item['store'])) {
  393. $item['address'] = '配送到门店:' . $item['store']['name'];
  394. }
  395. if (!empty($item['md_info'])) {
  396. $item['address'] = '配送到门店:' . $item['md_info']['name'];
  397. }
  398. }
  399. }
  400. //处理订单是否存在云仓转单商品结束
  401. return [
  402. 'code' => 0,
  403. 'msg' => 'success',
  404. 'data' => [
  405. 'data' => $listArray,
  406. 'pageNo' => $pagination['pageNo'],
  407. 'totalCount' => $pagination['totalCount'],
  408. ],
  409. ];
  410. }
  411. public function orderRefund(){
  412. $order = Order::find()->where(['order_origin'=>Order::ORDER_SOURCE_CASHIER,'id'=>$this->order_id])->one();
  413. if(empty($order)){
  414. return ['code' => 1,'msg' => '订单不存在'];
  415. }
  416. if($order->trade_status == Order::ORDER_FLOW_CANCEL){
  417. return ['code' => 1,'msg' => '订单已取消'];
  418. }
  419. if($order->is_pay != 1){
  420. return ['code' => 1,'msg' => '订单未支付'];
  421. }
  422. $order_detail_list = OrderDetail::find()->where(['order_id' => $order->id,
  423. 'is_delete' => Order::IS_DELETE_FALSE])->all();
  424. $t = \Yii::$app->db->beginTransaction();
  425. $other_msg = " ";
  426. // 恢复库存
  427. foreach ($order_detail_list as $order_detail) {
  428. if($order->order_type == 1){
  429. continue;
  430. }
  431. $goods = Goods::findOne($order_detail->goods_id);
  432. $attr_id_list = [];
  433. foreach (json_decode($order_detail->attr) as $item) {
  434. array_push($attr_id_list, $item->attr_id);
  435. }
  436. // $goods->numAdd($attr_id_list, $order_detail->num);
  437. if (!in_array($order->order_type, [1, 2])) {
  438. if (!$goods->numAdd($attr_id_list, $order_detail->num)) {
  439. // $t->rollBack();
  440. // return [
  441. // 'code' => 1,
  442. // 'msg' => '订单取消失败,库存操作失败',
  443. // ];
  444. $other_msg .= "库存操作失败";
  445. }
  446. }
  447. }
  448. // 用户积分恢复
  449. if ($order->pay_type !== Order::PAY_TYPE_CASHIER_PURSE) {
  450. $integral = json_decode($order->integral)->forehead_integral;
  451. $user = User::findOne(['id' => $order->user_id]);
  452. if (! $user) {
  453. return [
  454. 'code' => 1,
  455. 'msg' => '用户数据未找到',
  456. ];
  457. }
  458. if ($integral > 0) {
  459. $desc = "商城订单取消, 订单号:{$order->order_no}";
  460. AccountLog::saveLog($user->id, $order->pay_price, AccountLog::TYPE_INTEGRAL, AccountLog::LOG_TYPE_INCOME, AccountLog::TYPE_PLATFORM_ORDER, $order->id, $desc);
  461. }
  462. }
  463. // 余额支付 退换余额
  464. if ($order->is_pay == Order::IS_PAY_TRUE && $order->pay_type == Order::PAY_TYPE_BALANCE_PAID) {
  465. $desc = "商城订单退款,订单号:{$order->order_no}";
  466. AccountLog::saveLog($user->id, $order->pay_price, AccountLog::TYPE_BALANCE, AccountLog::LOG_TYPE_INCOME, AccountLog::TYPE_PLATFORM_REFUND_ORDER, $order->id, $desc);
  467. }
  468. $order->trade_status = Order::ORDER_FLOW_CANCEL;
  469. if($order->pay_type == 1 || $order->pay_type == 4){
  470. $refund_res = Refund::refund($order, $order->order_union_id ? OrderNo::ORDER_UNION : '',$order->order_no, $order->pay_price);
  471. if ($refund_res !== true) {
  472. $t->rollBack();
  473. return $refund_res;
  474. }
  475. }
  476. if($order->save()){
  477. // 记录操作日志
  478. CashierActionLog::setLog($this->store_id,get_user_id(),CashierActionLog::REFUND_ORDER,'订单'.$order->order_no.'退款', $order->md_id);
  479. $t->commit();
  480. return [
  481. 'code' => 0,
  482. 'msg' => '订单退款成功' . $other_msg
  483. ];
  484. }else{
  485. $t->rollBack();
  486. return [
  487. 'code' => 1,
  488. 'msg' => '订单退款失败'
  489. ];
  490. }
  491. }
  492. private function export($list) {
  493. $rows = [[
  494. 'ID',
  495. '会员信息',
  496. '订单号',
  497. '订单状态',
  498. '总金额(元)',
  499. '运费',
  500. '优惠金额',
  501. '实际支付(元)',
  502. '是否已付款',
  503. '快递名称',
  504. '快递单号',
  505. '快递状态',
  506. '收货人',
  507. '收货人电话',
  508. '收货人地址',
  509. '下单门店',
  510. '商品',
  511. '时间',
  512. ]];
  513. foreach($list as $item){
  514. $tradStatus = '';
  515. if($item['order_type'] == 1){
  516. if(in_array($item['trade_status'], [0,2])){
  517. $tradStatus = '待使用';
  518. }
  519. }
  520. if ($item['trade_status'] == 1) {
  521. $tradStatus = '已取消';
  522. }
  523. if ($item['is_pay'] == 0) {
  524. $tradStatus = '未支付';
  525. }
  526. if ($item['is_pay'] == 1 && $item['trade_status']== 0) {
  527. $tradStatus = '待发货';
  528. }
  529. if ($item['is_pay'] == 1 && $item['trade_status'] == 2) {
  530. $tradStatus = '待收货';
  531. }
  532. if ($item['is_pay'] == 1 && $item['trade_status'] == 3) {
  533. $tradStatus = '已完成';
  534. }
  535. $goods = [];
  536. foreach ($item['goods_list'] as $i => $gitem) {
  537. $attr = [];
  538. foreach ($gitem['attr_list'] as $atitem) {
  539. $attr[] = isset($atitem['attr_name']) ? $atitem['attr_name'] : '';
  540. }
  541. $goods[] = $gitem['name'] . '(' . implode(',', $attr) . ')' . '(' . $gitem['num'] . $gitem['unit'] . ')' . '(' . $gitem['total_price'] . '元)';
  542. }
  543. $r = [
  544. $item['id'],
  545. $item['nickname'],
  546. $item['order_no'],
  547. $tradStatus,
  548. $item['total_price'],
  549. $item['express_price'],
  550. $item['all_discount'],
  551. $item['pay_price'],
  552. $item['is_pay'] ? '已付款' : '未付款',
  553. $item['express'],
  554. $item['express_no'],
  555. $item['status_text'],
  556. $item['name'],
  557. $item['mobile'],
  558. $item['address'],
  559. (($item['md_info'] && $item['md_info']['name']) ? $item['md_info']['name'] : '') . '-' . $item['store']['name'],
  560. '【' . implode('】,【', $goods) . '】',
  561. $item['created_at'],
  562. ];
  563. $rows[] = $r;
  564. }
  565. $writer = \Spatie\SimpleExcel\SimpleExcelWriter::streamDownload(time() . '.xlsx')->noHeaderRow()
  566. ->addRows($rows)->toBrowser();
  567. }
  568. //获取快递信息
  569. public function getExpressData()
  570. {
  571. try {
  572. $order_id = $this->order_id;
  573. $order = Order::find()->where(['id' => $order_id, 'is_pay' => 1])->select("express, express_no, mobile")->one();
  574. if ($order) {
  575. $OrderTransit = OrderTransit::findOne(['order_id' => $order->id]);
  576. if ($OrderTransit) {
  577. $order['express_name'] = $OrderTransit->express_name;
  578. $order['express_no'] = $OrderTransit->express_no;
  579. }
  580. }
  581. if (!empty($order['express']) && !empty($order['express_no'])) {
  582. // 查询物流信息
  583. $model = new ExpressDetail();
  584. $model->express = $order['express'];
  585. $model->express_no = $order['express_no'];
  586. $model->receive_mobile = $order['mobile'];
  587. $model->store_id = $this->store_id;
  588. $res = $model->search();
  589. if ($res['code'] != 0) {
  590. $res['code'] = 0;
  591. if (!$res['data']) {
  592. $res['data'] = [];
  593. }
  594. $res['data']['status'] = 0;
  595. $res['data']['status_text'] = '未知';
  596. }
  597. $res['data']['express'] = $order['express'];
  598. $res['data']['express_no'] = $order['express_no'];
  599. return $res;
  600. }
  601. return [
  602. 'code' => 0,
  603. 'msg' => "没有快递信息",
  604. 'data' => null
  605. ];
  606. } catch (\Exception $e) {
  607. return [
  608. 'code' => 1,
  609. 'msg' => $e->getMessage()
  610. ];
  611. }
  612. }
  613. /**
  614. * @param $data array 需要处理的数据
  615. */
  616. public function dataTransform($data)
  617. {
  618. //TODO 测试数据 需要换成真实的字段
  619. $newFields = [];
  620. foreach ($this->fields as &$item) {
  621. if ($this->is_offline == 1) {
  622. if (in_array($item['key'], ['clerk_name', 'shop_name'])) {
  623. $item['selected'] = 1;
  624. }
  625. } else {
  626. if (in_array($item['key'], ['express_price', 'express_no', 'express'])) {
  627. $item['selected'] = 1;
  628. }
  629. }
  630. if (isset($item['selected']) && $item['selected'] == 1) {
  631. $newFields[$item['key']] = $item['value'];
  632. }
  633. }
  634. $newList = [];
  635. foreach ($data as $datum) {
  636. $newItem = [];
  637. $newItem['order_no'] = $datum->order_no;
  638. $newItem['nickname'] = $datum->user->nickname;
  639. $newItem['name'] = $datum->name;
  640. $newItem['mobile'] = $datum->mobile;
  641. $newItem['address'] = $datum->address;
  642. $newItem['total_price'] = $datum->total_price;
  643. $newItem['pay_price'] = $datum->pay_price;
  644. $newItem['pay_time'] = $datum->pay_time ? date('Y-m-d H:i', $datum->pay_time) : '';
  645. $newItem['send_time'] = $datum->send_time ? date('Y-m-d H:i', $datum->send_time) : '';
  646. $newItem['confirm_time'] = $datum->confirm_time ? date('Y-m-d H:i', $datum->confirm_time) : '';
  647. $newItem['words'] = $datum->words;
  648. $newItem['goods_list'] = $this->getOrderGoodsList($datum['id']);
  649. $newItem['is_pay'] = $datum['is_pay'] == 1 ? "已付款" : "未付款";
  650. $newItem['addtime'] = date('Y-m-d H:i', $datum['created_at']);
  651. $newItem['express_price'] = $datum['express_price'] . "元";
  652. $newItem['apply_delete'] = ($datum['apply_delete'] == Order::ORDER_APPLY_DELETE) ? ($datum['trade_status'] == Order::ORDER_FLOW_CANCEL || $datum['is_delete'] == Order::IS_DELETE_TRUE ? '取消成功' : '取消中') : "无";
  653. $newItem['trade_status'] = OrderStateFlow::getFlowWords($datum['trade_status']);
  654. // 是否到店自提 0--否 1--是
  655. if ($datum['is_offline']) {
  656. $newItem['clerk_name'] = $datum->clerk ? $datum->clerk->nickname : '';
  657. $newItem['shop_name'] = $datum->shop ? $datum->shop->name : '';
  658. } else {
  659. $newItem['express_price'] = $datum->express_price;
  660. $newItem['express_no'] = $datum->express_no;
  661. $newItem['express'] = $datum->express;
  662. }
  663. if ($datum->orderForm) {
  664. $str = '';
  665. foreach ($datum->orderForm as $key => $item) {
  666. $str .= $item['key'] . ':' . $item['value'] . ',';
  667. }
  668. $newItem['content'] = rtrim($str, ',');
  669. } else {
  670. $newItem['content'] = $datum->content;
  671. }
  672. $newList[] = $newItem;
  673. }
  674. //Export::order_3($newList, $newFields);
  675. }
  676. public function getOrderGoodsList($order_id)
  677. {
  678. $orderDetailList = OrderDetail::find()->alias('od')
  679. ->where([
  680. 'od.is_delete' => 0,
  681. 'od.order_id' => $order_id,
  682. ])->select(['od.num', 'od.total_price', 'od.attr', 'od.is_level', 'od.batch_price_tips', 'name' => 'od.goods_name','od.pic', 'od.goods_info', 'od.delivery_type', 'od.shop_id', 'od.goods_id'])->asArray()->all();
  683. foreach ($orderDetailList as &$item) {
  684. $item['form'] = OrderForm::findAll(['goods_id' => $item['goods_id'], 'order_id' => $order_id]);
  685. $item['attr_list'] = json_decode($item['attr'], true);
  686. $item['unit'] = Json::decode($item['goods_info'])['unit'];
  687. $item['price'] = $item['total_price'] == 0 ? 0 : bcdiv($item['total_price'],$item['num'],2);
  688. $goods = Goods::findOne($item['goods_id']);
  689. $warn_goods_timeout = Goods::warn_goods_timeout($goods->store_id);
  690. $item['timeout_day'] = $goods->time_made_day ? date('Y-m-d', $goods->time_made_day + 86400 * $goods->time_shelf_life) : '--';
  691. $item['is_warn_goods_timeout'] = ($goods->time_made_day && ($goods->time_made_day + 86400 * $goods->time_shelf_life) < (time() + $warn_goods_timeout * 86400)) ? 1 : 0;
  692. $item['shop'] = [];
  693. if ($item['delivery_type'] == OrderDetail::GOODS_DELIVERY_SHOP) {
  694. $shop_info = Shop::find()->where(['id' => $item['shop_id']])->asArray()->one();
  695. if(!$shop_info) continue;
  696. $item['shop']['address'] = $shop_info['address'];
  697. $item['shop']['id'] = $shop_info['id'];
  698. $item['shop']['name'] = $shop_info['name'];
  699. $item['shop']['mobile'] = $shop_info['mobile'];
  700. }
  701. }
  702. return $orderDetailList;
  703. }
  704. public static function getCountData($store_id)
  705. {
  706. $form = new OrderListForm();
  707. $form->limit = 0;
  708. $form->store_id = $store_id;
  709. $data = [];
  710. $form->status = -1;
  711. $res = $form->search();
  712. $data['all'] = $res['row_count'];
  713. $form->status = 0;
  714. $res = $form->search();
  715. $data['status_0'] = $res['row_count'];
  716. $form->status = 1;
  717. $res = $form->search();
  718. $data['status_1'] = $res['row_count'];
  719. $form->status = 2;
  720. $res = $form->search();
  721. $data['status_2'] = $res['row_count'];
  722. $form->status = 3;
  723. $res = $form->search();
  724. $data['status_3'] = $res['row_count'];
  725. $form->status = 5;
  726. $res = $form->search();
  727. $data['status_5'] = $res['row_count'];
  728. return $data;
  729. }
  730. /**
  731. * @return array
  732. */
  733. private function getExpressList()
  734. {
  735. $storeExpressList = Order::find()
  736. ->select('express')
  737. ->where([
  738. 'and',
  739. ['store_id' => $this->store_id],
  740. ['is_pay' => Order::IS_PAY_TRUE],
  741. ['in', 'trade_status', [Order::ORDER_FLOW_SEND, Order::ORDER_FLOW_CONFIRM]],
  742. ['!=', 'express', ''],
  743. ])->groupBy('express, send_time')->orderBy('send_time DESC')->limit(5)->asArray()->all();
  744. $expressLst = Express::getExpressList();
  745. $newStoreExpressList = [];
  746. foreach ($storeExpressList as $i => $item) {
  747. foreach ($expressLst as $value) {
  748. if ($value['name'] == $item['express']) {
  749. $newStoreExpressList[] = $item['express'];
  750. break;
  751. }
  752. }
  753. }
  754. $newPublicExpressList = [];
  755. foreach ($expressLst as $i => $item) {
  756. $newPublicExpressList[] = $item['name'];
  757. }
  758. return array_merge($newStoreExpressList, $newPublicExpressList);
  759. }
  760. }