AdoptCostOrderListForm.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\admin\models\adopt;
  8. use app\models\common\admin\order\CommonOrderSearch;
  9. use app\models\DeliveryInfo;
  10. use app\models\Express;
  11. use app\models\Md;
  12. use app\models\Order;
  13. use app\models\OrderDetail;
  14. use app\models\OrderForm;
  15. use app\models\OrderRefund;
  16. use app\models\OrderStateFlow;
  17. use app\models\SaasUser;
  18. use app\models\Shop;
  19. use app\models\User;
  20. use app\plugins\adopt\models\AdoptCostOrder;
  21. use app\plugins\adopt\models\AdoptOrderInfo;
  22. use app\utils\Delivery\Delivery;
  23. use app\utils\Export;
  24. use app\utils\ExportList;
  25. use yii\base\Model;
  26. use yii\db\Query;
  27. use yii\helpers\Json;
  28. class AdoptCostOrderListForm extends Model
  29. {
  30. public $store_id;
  31. public $user_id;
  32. public $keyword;
  33. public $status;
  34. public $page;
  35. public $limit;
  36. public $md_name;
  37. public $order_no;
  38. public $goods_name;
  39. public $mobile;
  40. public $is_offline;
  41. public $clerk_id;
  42. public $parent_id;
  43. public $shop_id;
  44. public $order_type;
  45. public $dateStart;
  46. public $dateEnd;
  47. public $express_type;
  48. public $keywordType;
  49. public $seller_comments;
  50. public $fields;
  51. public $type;
  52. public $mch_id;
  53. public $flag; // 是否导出
  54. public $supplier_id;
  55. public $supplier;
  56. /**
  57. * @var 所属平台
  58. */
  59. public $platform;//所属平台
  60. /**
  61. * @var bool 是否是配送员订单
  62. */
  63. public $is_delivery = false;//是否是配送员订单
  64. /**
  65. * @var bool 是否是配送员订单
  66. */
  67. public $is_same_city = false;//是否是配送员订单
  68. /**
  69. * @var 获取默写城市的订单 例如:["\u5357\u5b81","\u4e0a\u6d77"]
  70. */
  71. public $shop_list;
  72. public $order_id;
  73. public function rules()
  74. {
  75. return [
  76. [['keyword', 'flag'], 'trim'],
  77. [['status', 'page', 'limit', 'user_id', 'is_offline', 'clerk_id', 'shop_id', 'keywordType', 'platform', 'order_type'], 'integer'],
  78. [['status',], 'default', 'value' => -1],
  79. [['page',], 'default', 'value' => 1],
  80. [['dateStart', 'dateEnd', 'express_type', 'md_name', 'order_no', 'goods_name', 'mobile'], 'trim'],
  81. [['seller_comments', 'flag'], 'string'],
  82. [['fields', 'is_delivery', 'shop_list'], 'safe']
  83. ];
  84. }
  85. public function search($is_scan_pay = false)
  86. {
  87. if (!$this->validate()) {
  88. return [
  89. 'code' => 1,
  90. 'msg' => $this->getErrorSummary(false)[0],
  91. ];
  92. }
  93. $query = AdoptCostOrder::find()->alias('o')->where([
  94. 'o.store_id' => $this->store_id
  95. ])->andWhere(['!=','order_type', 5]);
  96. if (get_md_id()) {
  97. $query->andWhere(['o.md_id' => get_md_id()]);
  98. }
  99. if (!is_null($this->order_type) && in_array($this->order_type, [0, 1])) {
  100. $query->andWhere([
  101. 'o.order_type' => $this->order_type
  102. ]);
  103. }
  104. $query->leftJoin(['u' => User::tableName()], 'u.id = o.user_id')
  105. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding')
  106. ->leftJoin(['od' => OrderDetail::tableName()], 'od.order_id=o.order_id');
  107. switch ($this->status) {
  108. case 0:
  109. $query->andWhere(['o.is_delete' => Order::IS_DELETE_FALSE, 'is_pay' => Order::IS_PAY_FALSE]);
  110. break;
  111. case 1:
  112. $query->andWhere([
  113. 'o.trade_status' => Order::ORDER_FLOW_NO_SEND,
  114. 'o.is_delete' => Order::IS_DELETE_FALSE
  115. ])->andWhere(['or', ['o.is_pay' => Order::IS_PAY_TRUE], ['o.pay_type' => Order::PAY_TYPE_COD]]);
  116. break;
  117. case 2:
  118. $query->andWhere([
  119. 'o.trade_status' => Order::ORDER_FLOW_SEND,
  120. 'o.is_delete' => Order::IS_DELETE_FALSE
  121. ])->andWhere(['or', ['o.is_pay' => Order::IS_PAY_TRUE], ['o.pay_type' => Order::PAY_TYPE_COD]]);
  122. break;
  123. case 3:
  124. $query->andWhere([
  125. 'o.trade_status' => Order::ORDER_FLOW_CONFIRM,
  126. 'o.is_delete' => Order::IS_DELETE_FALSE
  127. ])->andWhere(['or', ['o.is_pay' => Order::IS_PAY_TRUE], ['o.pay_type' => Order::PAY_TYPE_COD]]);
  128. break;
  129. case 4:
  130. break;
  131. case 5:
  132. $query->andWhere(['and',['o.is_delete' => 1]]);
  133. break;
  134. case 6:
  135. $query->andWhere(['and',['o.apply_delete' => Order::ORDER_APPLY_DELETE], ['!=', 'o.trade_status', Order::ORDER_FLOW_CANCEL]]);
  136. break;
  137. default:
  138. if (empty($this->order_id)) {
  139. $query->andWhere([
  140. 'o.is_delete' => Order::IS_DELETE_FALSE
  141. ]);
  142. }
  143. break;
  144. }
  145. if (get_params('is_recycle')) {
  146. $query->andWhere([
  147. 'o.is_recycle' => Order::IS_DELETE_TRUE
  148. ]);
  149. } else {
  150. $query->andWhere([
  151. 'o.is_recycle' => Order::IS_DELETE_FALSE
  152. ]);
  153. }
  154. if ($this->order_id && $this->order_id > 0) {
  155. $query->andWhere(['o.id' => $this->order_id]);
  156. }
  157. // TODO:
  158. $commonOrderSearch = new CommonOrderSearch();
  159. if (!$this->order_id) {
  160. // $query = $commonOrderSearch->search($query, $this);
  161. // $query = $commonOrderSearch->keyword($query, $this->keywordType, $this->keyword);
  162. if ($this->md_name) {
  163. $query->leftJoin(['md' => Md::tableName()], 'md.id=o.md_id')->andWhere(['like', 'md.name', $this->md_name]);
  164. }
  165. if ($this->order_no) {
  166. $query->andWhere(['like', 'o.order_no', $this->order_no]);
  167. }
  168. if ($this->mobile) {
  169. $query->andWhere([
  170. 'or',
  171. ['like', 'o.mobile', $this->mobile],
  172. ['like', 'u.binding', $this->mobile],
  173. ]);
  174. }
  175. if ($this->goods_name) {
  176. $query->andWhere(['like', 'od.goods_name', $this->goods_name]);
  177. }
  178. }
  179. if ($this->dateStart) {
  180. $query->andWhere(['>=', 'o.created_at', strtotime($this->dateStart)]);
  181. }
  182. if ($this->dateEnd) {
  183. $query->andWhere(['<=', 'o.created_at', strtotime($this->dateEnd)]);
  184. }
  185. if ($this->flag == Export::EXPORT) {
  186. $query_ex = clone $query;
  187. $list_ex = $query_ex;
  188. $export = new ExportList();
  189. $export->is_offline = $this->is_offline;
  190. $export->order_type = 0;
  191. $export->fields = $this->fields;
  192. $export->dataTransform_new($list_ex);
  193. }
  194. if (!$this->order_id) {
  195. $query->andWhere(['o.is_offline' => $this->is_offline]);
  196. }
  197. if ($this->platform !== null && $this->platform !== '') {
  198. $query->andWhere([
  199. 'u.platform' => $this->platform
  200. ]);
  201. }
  202. // $refundQuery1 = OrderRefund::find()->alias('or')
  203. // ->select('or.status, or.order_id, or.created_at')
  204. // ->where(['or.store_id' => $this->store_id, 'or.is_delete' => 0]);
  205. // $refundQuery = (new Query())->from(['or' => $refundQuery1])->where('`or`.order_id=o.id')
  206. // ->select('or.status')
  207. // ->orderBy(['or.created_at' => SORT_DESC])
  208. // ->limit(1);
  209. $query->orderBy('o.created_at DESC')
  210. ->select(['o.*', 'su.name as nickname', 'u.nickname as de_name', 'u.platform',
  211. 'od.delivery_type', 'od.attr', 'o.name user_name', 'o.mobile user_mobile', 'o.address user_address']);
  212. // print_r($query);die;
  213. $query->groupBy('o.order_no');
  214. $pagination = pagination_make($query);
  215. $listArray = $pagination['list'];
  216. foreach ($listArray as $i => &$item) {
  217. $order = Order::find()->alias('o')
  218. ->leftJoin(['aoi' => AdoptOrderInfo::tableName()], 'o.id = aoi.order_id')
  219. ->where([
  220. 'o.id' => $item['order_id'],
  221. 'o.store_id' => $this->store_id,
  222. 'o.order_type' => 5
  223. ])->select(['o.order_no','aoi.harvest_weight'])->asArray()->one();
  224. $item['adopt_order_no'] = $order['order_no'];
  225. $item['harvest_weight'] = $order['harvest_weight'];
  226. $item['book'] = [];
  227. if ($item['order_type'] == 1) {
  228. $attr = Json::decode($item['attr']);
  229. if (count($attr) > 1) {
  230. $date_data = current($attr)['date'] . '/' . end($attr)['date'];
  231. } else {
  232. $date_data = $attr[0]['date'];
  233. }
  234. $item['book'] = [
  235. 'date' => $date_data
  236. ];
  237. }
  238. if ($item['order_type'] == 2) {
  239. $tmp_attr = Json::decode($item['attr']);
  240. $item['book']['date'] = $tmp_attr['date'] . ' ' . $tmp_attr['time'];
  241. }
  242. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  243. $item['goods_list'] = $this->getOrderGoodsList($item['order_id']);
  244. $item['clerk_name'] = '';
  245. $shop = Shop::findOne($item['shop_id']);
  246. if ($shop) {
  247. $user = User::findOne(Shop::findOne($item['shop_id'])->user_id);
  248. if ($user) {
  249. $item['clerk_name'] = $user->nickname;
  250. }
  251. }
  252. $item['integral'] = json_decode($item['integral'], true);
  253. if (isset($item['address_data'])) {
  254. $item['address_data'] = json_decode($item['address_data']);
  255. }
  256. $item['flag'] = 0;
  257. $item['delivery_info'] = [];
  258. // 同城配送配送信息
  259. if ($item['delivery_type'] == OrderDetail::GOODS_DELIVERY_IM) {
  260. $delivery_info = DeliveryInfo::findOne(['order_no' => $item['order_no']]);
  261. $item['delivery_info'] = [
  262. 'waybill_id' => $delivery_info->waybill_id,
  263. 'status' => Delivery::$validOrderStatus[$delivery_info->status],
  264. 'reason' => $delivery_info->reason_id > 0 ? Delivery::$validReason[$delivery_info->reason_id] : '',
  265. 'fee' => $delivery_info->fee,
  266. 'duct_fee' => $delivery_info->deduct_fee,
  267. 'delivery_type' => Delivery::$deliveryType[$delivery_info->delivery_type],
  268. 'rider_name' => $delivery_info->rider_name,
  269. 'rider_mobile' => $delivery_info->rider_mobile
  270. ];
  271. }
  272. $item['md_info'] = null;
  273. if ($item['md_id']) {
  274. $item['md_info'] = Md::findOne($item['md_id']);
  275. }
  276. $item['pay_user_info'] = null;
  277. if ($item['pay_user_id'] > 0) {
  278. $pay_saas_user = SaasUser::findOne(['mobile' => User::findOne($item['pay_user_id'])->binding]);
  279. $item['pay_user_info'] = [
  280. 'name' => $pay_saas_user->name,
  281. 'mobile' => $pay_saas_user->mobile
  282. ];
  283. }
  284. $item['cost_detail'] = json_decode($item['cost_detail'],true);
  285. }
  286. // 获取可导出数据
  287. $f = new ExportList();
  288. $exportList = $f->getList();
  289. return [
  290. 'code' => 0,
  291. 'msg' => 'success',
  292. 'data' => [
  293. 'export_list' => $exportList,
  294. 'express_list' => $this->getExpressList(),
  295. 'data' => $listArray,
  296. 'pageNo' => $pagination['pageNo'],
  297. 'totalCount' => $pagination['totalCount'],
  298. ],
  299. ];
  300. }
  301. /**
  302. * @param $data array 需要处理的数据
  303. */
  304. public function dataTransform($data)
  305. {
  306. //TODO 测试数据 需要换成真实的字段
  307. $newFields = [];
  308. foreach ($this->fields as &$item) {
  309. if ($this->is_offline == 1) {
  310. if (in_array($item['key'], ['clerk_name', 'shop_name'])) {
  311. $item['selected'] = 1;
  312. }
  313. } else {
  314. if (in_array($item['key'], ['express_price', 'express_no', 'express'])) {
  315. $item['selected'] = 1;
  316. }
  317. }
  318. if (isset($item['selected']) && $item['selected'] == 1) {
  319. $newFields[$item['key']] = $item['value'];
  320. }
  321. }
  322. $newList = [];
  323. foreach ($data as $datum) {
  324. $newItem = [];
  325. $newItem['order_no'] = $datum->order_no;
  326. $newItem['nickname'] = $datum->user->nickname;
  327. $newItem['name'] = $datum->name;
  328. $newItem['mobile'] = $datum->mobile;
  329. $newItem['address'] = $datum->address;
  330. $newItem['total_price'] = $datum->total_price;
  331. $newItem['pay_price'] = $datum->pay_price;
  332. $newItem['pay_time'] = $datum->pay_time ? date('Y-m-d H:i', $datum->pay_time) : '';
  333. $newItem['send_time'] = $datum->send_time ? date('Y-m-d H:i', $datum->send_time) : '';
  334. $newItem['confirm_time'] = $datum->confirm_time ? date('Y-m-d H:i', $datum->confirm_time) : '';
  335. $newItem['words'] = $datum->words;
  336. $newItem['goods_list'] = $this->getOrderGoodsList($datum['id']);
  337. $newItem['is_pay'] = $datum['is_pay'] == 1 ? "已付款" : "未付款";
  338. $newItem['addtime'] = date('Y-m-d H:i', $datum['created_at']);
  339. $newItem['express_price'] = $datum['express_price'] . "元";
  340. $newItem['apply_delete'] = ($datum['apply_delete'] == Order::ORDER_APPLY_DELETE) ? ($datum['trade_status'] == Order::ORDER_FLOW_CANCEL || $datum['is_delete'] == Order::IS_DELETE_TRUE ? '取消成功' : '取消中') : "无";
  341. $newItem['trade_status'] = OrderStateFlow::getFlowWords($datum['trade_status']);
  342. // 是否到店自提 0--否 1--是
  343. if ($datum['is_offline']) {
  344. $newItem['clerk_name'] = $datum->clerk ? $datum->clerk->nickname : '';
  345. $newItem['shop_name'] = $datum->shop ? $datum->shop->name : '';
  346. } else {
  347. $newItem['express_price'] = $datum->express_price;
  348. $newItem['express_no'] = $datum->express_no;
  349. $newItem['express'] = $datum->express;
  350. }
  351. if ($datum->orderForm) {
  352. $str = '';
  353. foreach ($datum->orderForm as $key => $item) {
  354. $str .= $item['key'] . ':' . $item['value'] . ',';
  355. }
  356. $newItem['content'] = rtrim($str, ',');
  357. } else {
  358. $newItem['content'] = $datum->content;
  359. }
  360. $newList[] = $newItem;
  361. }
  362. //Export::order_3($newList, $newFields);
  363. }
  364. public function getOrderGoodsList($order_id)
  365. {
  366. $orderDetailList = OrderDetail::find()->alias('od')
  367. ->where([
  368. 'od.is_delete' => 0,
  369. 'od.order_id' => $order_id,
  370. ])->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();
  371. foreach ($orderDetailList as &$item) {
  372. $item['form'] = OrderForm::findAll(['goods_id' => $item['goods_id'], 'order_id' => $order_id]);
  373. $item['attr_list'] = json_decode($item['attr'], true);
  374. $item['unit'] = Json::decode($item['goods_info'])['unit'];
  375. $item['shop'] = [];
  376. if ($item['delivery_type'] == OrderDetail::GOODS_DELIVERY_SHOP) {
  377. $shop_info = Shop::find()->where(['id' => $item['shop_id']])->asArray()->one();
  378. $item['shop']['address'] = $shop_info['address'];
  379. $item['shop']['id'] = $shop_info['id'];
  380. $item['shop']['name'] = $shop_info['name'];
  381. $item['shop']['mobile'] = $shop_info['mobile'];
  382. }
  383. }
  384. return $orderDetailList;
  385. }
  386. public static function getCountData($store_id)
  387. {
  388. $form = new OrderListForm();
  389. $form->limit = 0;
  390. $form->store_id = $store_id;
  391. $data = [];
  392. $form->status = -1;
  393. $res = $form->search();
  394. $data['all'] = $res['row_count'];
  395. $form->status = 0;
  396. $res = $form->search();
  397. $data['status_0'] = $res['row_count'];
  398. $form->status = 1;
  399. $res = $form->search();
  400. $data['status_1'] = $res['row_count'];
  401. $form->status = 2;
  402. $res = $form->search();
  403. $data['status_2'] = $res['row_count'];
  404. $form->status = 3;
  405. $res = $form->search();
  406. $data['status_3'] = $res['row_count'];
  407. $form->status = 5;
  408. $res = $form->search();
  409. $data['status_5'] = $res['row_count'];
  410. return $data;
  411. }
  412. /**
  413. * @return array
  414. */
  415. private function getExpressList()
  416. {
  417. $storeExpressList = Order::find()
  418. ->select('express')
  419. ->where([
  420. 'and',
  421. ['store_id' => $this->store_id],
  422. ['is_pay' => Order::IS_PAY_TRUE],
  423. ['in', 'trade_status', [Order::ORDER_FLOW_SEND, Order::ORDER_FLOW_CONFIRM]],
  424. ['!=', 'express', ''],
  425. ])->groupBy('express, send_time')->orderBy('send_time DESC')->limit(5)->asArray()->all();
  426. $expressLst = Express::getExpressList();
  427. $newStoreExpressList = [];
  428. foreach ($storeExpressList as $i => $item) {
  429. foreach ($expressLst as $value) {
  430. if ($value['name'] == $item['express']) {
  431. $newStoreExpressList[] = $item['express'];
  432. break;
  433. }
  434. }
  435. }
  436. $newPublicExpressList = [];
  437. foreach ($expressLst as $i => $item) {
  438. $newPublicExpressList[] = $item['name'];
  439. }
  440. return array_merge($newStoreExpressList, $newPublicExpressList);
  441. }
  442. }