LocalDeliveryController.php 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. /**
  8. * @file LocalDeliveryController
  9. * @editor Created by vscode
  10. * @author WPing丶
  11. * @date 2023/07/06
  12. * @time 11:56:13
  13. *
  14. * 备注:同城配送服务端相关接口
  15. */
  16. namespace app\modules\alliance\controllers;
  17. use app\constants\OptionSetting;
  18. use app\models\Admin;
  19. use app\models\DeliveryInfo;
  20. use app\models\FrontDeliveryOrder;
  21. use app\models\LocalDeliveryCash;
  22. use app\models\LocalDeliveryCourier;
  23. use app\models\LocalDeliveryLog;
  24. use app\models\Md;
  25. use app\models\Option;
  26. use app\models\Order;
  27. use app\models\Store;
  28. use app\models\WorkerOrderExt;
  29. use app\modules\admin\models\MerchantForm;
  30. use app\modules\admin\models\SupplierForm;
  31. use app\modules\alliance\controllers\BaseController;
  32. use app\modules\admin\models\OrderListForm;
  33. use app\utils\OrderNo;
  34. use app\utils\Tools;
  35. use yii\helpers\Json;
  36. class LocalDeliveryController extends BaseController
  37. {
  38. //抢单
  39. public function actionOrderBind()
  40. {
  41. $order_id = input_params('order_id');
  42. $type = input_params('type', 1);
  43. $saas_user = get_saas_user();
  44. $courier = LocalDeliveryCourier::findOne(['saas_user_id' => $saas_user->id, 'is_delete' => 0, 'state' => 2]);
  45. if (!$courier) {
  46. return $this->asJson([
  47. 'code' => 1,
  48. 'msg' => '当前用户不是骑手',
  49. ]);
  50. }
  51. if($type == 2){
  52. $cacheV = WorkerOrderExt::cacheIgnoreOrderId($courier->id, $order_id);
  53. return $this->asJson([
  54. 'code' => 0,
  55. 'msg' => 'success',
  56. ]);
  57. }
  58. $cacheK = 'DeliveryTypeSelf_OrderBind' . $order_id;
  59. $cacheV = cache()->get($cacheK);
  60. if($cacheV){
  61. return $this->asJson([
  62. 'code' => 1,
  63. 'msg' => '抢单失败0,请稍后再试~',
  64. ]);
  65. }
  66. cache()->set($cacheK, 1, 10);
  67. $rider_id = $courier->id; //骑手ID
  68. $now_num = DeliveryInfo::find()->alias('di')
  69. ->leftJoin(['o' => Order::tableName()], 'di.order_no = o.order_no')
  70. ->where(['o.trade_status' => Order::ORDER_FLOW_SEND, 'is_local' => 1, 'rider_id' => $rider_id])
  71. ->count();
  72. if ($courier->max_num != 0 && $now_num >= $courier->max_num) {
  73. return $this->asJson([
  74. 'code' => 1,
  75. 'msg' => '当前配送订单已达到上限,请稍后再试',
  76. ]);
  77. }
  78. $t = \Yii::$app->db->beginTransaction();
  79. try{
  80. $order = Order::findOne($order_id);
  81. $delivery_info = DeliveryInfo::findOne(['order_no' => $order->order_no]);
  82. if (intval($delivery_info->is_store_delivery_type) === 1) {
  83. return $this->asJson([
  84. 'code' => 1,
  85. 'msg' => '当前配送订单只能由商城配送员配送',
  86. ]);
  87. }
  88. $delivery_info->rider_id = $rider_id;
  89. $delivery_info->rider_name = $courier->real_name;
  90. $delivery_info->rider_mobile = $courier->mobile;
  91. $delivery_info->local_status = DeliveryInfo::LOCAL_STATUS_WAITING;
  92. if (!$delivery_info->save()) {
  93. throw new \Exception('delivery_info保存失败' . array_shift($delivery_info->getFirstErrors()));
  94. }
  95. $order->send_time = time();
  96. $order->trade_status = Order::ORDER_FLOW_SEND;
  97. if (!$order->save()) {
  98. throw new \Exception('order保存失败' . array_shift($order->getFirstErrors()));
  99. }
  100. $t->commit();
  101. return $this->asJson([
  102. 'code' => 0,
  103. 'msg' => '操作成功',
  104. ]);
  105. } catch (\Exception $ex) {
  106. \Yii::error($ex);
  107. $t->rollBack();
  108. return $this->asJson([
  109. 'code' => 1,
  110. 'msg' => '操作失败,' . $ex->getMessage(),
  111. ]);
  112. }
  113. }
  114. /**
  115. * 模块名:actionGetOrderList
  116. * 代码描述:获取订单列表
  117. * 作者:WPing丶
  118. * 请求方式:POST
  119. * 创建时间:2023/07/06 15:19:43
  120. * @param int status 1=新任务,2=待取货,3=配送中
  121. */
  122. public function actionGetOrderList()
  123. {
  124. $status = post_params('status'); //1=新任务,2=待取货,3=配送中,4=历史订单(已完成)
  125. $start_time = post_params('start_time');
  126. $end_time = post_params('end_time');
  127. $lng = input_params('lng');
  128. $lat = input_params('lat');
  129. $saas_user = get_saas_user();
  130. $courier = LocalDeliveryCourier::findOne(['saas_user_id' => $saas_user->id, 'is_delete' => 0, 'state' => 2]);
  131. if (!$courier) {
  132. return $this->asJson([
  133. 'code' => 1,
  134. 'msg' => '当前用户不是骑手',
  135. ]);
  136. }
  137. $query = Order::find()->alias('o')
  138. ->leftJoin(['di' => DeliveryInfo::tableName()], 'o.order_no = di.order_no')
  139. ->leftJoin(['md' => Md::tableName()], 'o.md_id = md.id')
  140. ->where(['o.order_type' => [Order::ORDER_TYPE_STORE, 3], 'di.is_local' => 1])
  141. ->select('o.*, di.id d_order_id, di.fee,di.rider_id,di.rider_name,di.rider_mobile,di.arrive_time,di.rush_time,di.confirm_time,di.serial_num, di.is_front_delivery')->orderBy('o.created_at DESC');
  142. if (intval($courier->type) === 1) {
  143. $query->andWhere(['di.is_store_delivery_type' => 0]);
  144. } else {
  145. $query->andWhere(['di.is_store_delivery_type' => 1]);
  146. }
  147. switch ($status) {
  148. case 1:
  149. $query->andWhere([
  150. 'o.trade_status' => Order::ORDER_FLOW_NO_SEND,
  151. 'o.is_delete' => Order::IS_DELETE_FALSE,
  152. 'di.local_status' => DeliveryInfo::LOCAL_STATUS_NO_SEND,
  153. 'di.rider_id' => 0,
  154. ])->andWhere(['or', ['o.is_pay' => Order::IS_PAY_TRUE], ['o.pay_type' => Order::PAY_TYPE_COD]]);
  155. $courierArea = json_decode($courier['area'], true);
  156. // $courierCity = $courierArea[0]['city_id'] ?? 0;
  157. $courierDistrict = $courierArea[0]['district_id'] ?? 0;
  158. if(empty($courierDistrict)){
  159. return $this->asJson([
  160. 'code' => 1,
  161. 'msg' => '请先配置自己的常驻地区',
  162. ]);
  163. }
  164. $query->andWhere(['OR', ['o.district_id' => $courierDistrict], ['md.district' => $courierDistrict, 'o.is_offline' => 1, 'di.is_front_delivery' => 1]]);
  165. $query->andWhere(['<', 'o.delivery_time', time() + 3600 * 1.5]);
  166. break;
  167. case 2:
  168. $query->andWhere([
  169. 'o.trade_status' => Order::ORDER_FLOW_SEND,
  170. 'o.is_delete' => Order::IS_DELETE_FALSE,
  171. 'di.local_status' => DeliveryInfo::LOCAL_STATUS_WAITING,
  172. 'di.rider_id' => $courier->id,
  173. ])->andWhere(['or', ['o.is_pay' => Order::IS_PAY_TRUE], ['o.pay_type' => Order::PAY_TYPE_COD]]);
  174. break;
  175. case 3:
  176. $query->andWhere([
  177. 'o.trade_status' => Order::ORDER_FLOW_SEND,
  178. 'o.is_delete' => Order::IS_DELETE_FALSE,
  179. 'di.local_status' => DeliveryInfo::LOCAL_STATUS_SENDING,
  180. 'di.rider_id' => $courier->id,
  181. ])->andWhere(['or', ['o.is_pay' => Order::IS_PAY_TRUE], ['o.pay_type' => Order::PAY_TYPE_COD]]);
  182. break;
  183. case 4:
  184. $query->andWhere([
  185. // 'o.trade_status' => Order::ORDER_FLOW_CONFIRM,//暂时注释
  186. 'o.is_delete' => Order::IS_DELETE_FALSE,
  187. 'di.local_status' => DeliveryInfo::LOCAL_STATUS_CONFIRM,
  188. 'di.rider_id' => $courier->id,
  189. ])->andWhere(['or', ['o.is_pay' => Order::IS_PAY_TRUE], ['o.pay_type' => Order::PAY_TYPE_COD]]);
  190. break;
  191. default:
  192. return $this->asJson([
  193. 'code' => 1,
  194. 'msg' => 'status参数错误'
  195. ]);
  196. break;
  197. }
  198. if ($start_time) {
  199. $query->andWhere(['>=', 'di.confirm_time', strtotime($start_time . ' 00:00:00')]);
  200. }
  201. if ($end_time) {
  202. $query->andWhere(['<=', 'di.confirm_time', strtotime($end_time . ' 23:59:59')]);
  203. }
  204. // $sql = $query->createCommand()->getRawSql();
  205. // return $this->asJson([
  206. // 'code' => 0,
  207. // 'msg' => 'success',
  208. // 'data' => $sql
  209. // ]);
  210. $setting = json_decode(Option::get(OptionSetting::LOCAL_DELIVERY_SETTING, 0, '', '{}')['value'], true);
  211. $list = pagination_make($query);
  212. foreach ($list['list'] as &$val) {
  213. $address_data = json::decode($val['address_data'], true);
  214. $store = Store::findOne($val['store_id']);
  215. $store_latitude = $store->latitude;
  216. $store_longitude = $store->longitude;
  217. $store_address = $store->address;
  218. $store_name = $val['store_id'] > 0 ? $store->name : '';
  219. //判断是仓库订单
  220. $is_front_delivery = intval($val['is_front_delivery']);
  221. if ($is_front_delivery) {
  222. $frontDeliveryOrder = FrontDeliveryOrder::findOne(['delivery_info_id' => $val['d_order_id']]);
  223. $front_agent_admin_id = $frontDeliveryOrder->front_agent_admin_id;
  224. $admin = Admin::findOne($front_agent_admin_id);
  225. if ($admin) {
  226. $store_latitude = $admin->lat ?: 0;
  227. $store_longitude = $admin->lng ?: 0;
  228. $store_address = $admin->address;
  229. $store_name = $admin->name;
  230. }
  231. if (intval($val['is_offline'])) {
  232. $mdInfo = Md::findOne($val['md_id']);
  233. if ($mdInfo) {
  234. $address_data = [
  235. 'latitude' => $mdInfo->latitude,
  236. 'longitude' => $mdInfo->longitude
  237. ];
  238. $val['address'] = $mdInfo->address;
  239. }
  240. }
  241. }
  242. $form = new OrderListForm();
  243. $val['goods_list'] = $form->getOrderGoodsList($val['id']);
  244. $val['store_name'] = $store_name;
  245. $val['user_latitude'] = $address_data['latitude'];
  246. $val['user_longitude'] = $address_data['longitude'];
  247. $val['store_latitude'] = $store_latitude;
  248. $val['store_longitude'] = $store_longitude;
  249. $val['distance'] = Tools::getDistance($address_data['latitude'], $address_data['longitude'], $store_latitude, $store_longitude);
  250. $val['contact_tel'] = $store->contact_tel;
  251. $val['store_address'] = $store_address;
  252. if($lng){
  253. $val['distance1'] = Tools::getDistance($store_latitude, $store_longitude, $lat, $lng);
  254. $val['distance2'] = Tools::getDistance($address_data['latitude'], $address_data['longitude'], $lat, $lng);
  255. }else{
  256. $val['distance1'] = '';
  257. $val['distance2'] = '';
  258. }
  259. if($val['mch_id']){
  260. $mch = \app\models\Mch::findOne($val['mch_id']);
  261. $val['store_name'] .= '-入驻商:' . $mch->name;
  262. $val['store_latitude'] = $mch->latitude;
  263. $val['store_longitude'] = $mch->longitude;
  264. $val['distance'] = Tools::getDistance($address_data['latitude'], $address_data['longitude'], $mch->latitude, $mch->longitude);
  265. $val['contact_tel'] = $mch->tel;
  266. $val['store_address'] = $mch->address;
  267. if($lng){
  268. $val['distance1'] = Tools::getDistance($mch->latitude, $mch->longitude, $lat, $lng);
  269. }
  270. }
  271. $default_cost = 0;
  272. if(!empty($setting['default_cost']) && !empty($setting['default_cost']['value'])){
  273. $default_cost = $setting['default_cost']['value'];
  274. }
  275. if($default_cost == -1){
  276. $default_cost = $val['fee'];
  277. }
  278. $val['fee_cost'] = $default_cost;
  279. if (in_array($status, [2, 3])) {
  280. $delivery_info = DeliveryInfo::findOne($val['d_order_id']);
  281. if ($delivery_info) {
  282. if ($lat > 0) {
  283. $delivery_info->last_latitude = $lat;
  284. }
  285. if ($lng > 0) {
  286. $delivery_info->last_longitude = $lng;
  287. }
  288. $delivery_info->save();
  289. }
  290. }
  291. }
  292. $data = [
  293. 'q' => $query->createCommand()->getRawSql(),
  294. 'data' => $list['list'],
  295. 'pageNo' => $list['pageNo'],
  296. 'totalCount' => $list['totalCount']
  297. ];
  298. return $this->asJson([
  299. 'code' => 0,
  300. 'msg' => 'success',
  301. 'data' => $data
  302. ]);
  303. }
  304. /**
  305. * 模块名:actionCourierStatus
  306. * 代码描述:骑手上下线
  307. * 作者:WPing丶
  308. * 请求方式:POST
  309. * 创建时间:2023/07/06 18:20:19
  310. * @param int status 0=离线 1=在线
  311. */
  312. public function actionCourierStatus()
  313. {
  314. $status = (int)post_params('status'); //0=离线 1=在线
  315. if ($status != 0 && $status != 1) {
  316. return $this->asJson([
  317. 'code' => 1,
  318. 'msg' => 'status参数错误',
  319. ]);
  320. }
  321. $saas_user = get_saas_user();
  322. $courier = LocalDeliveryCourier::findOne(['saas_user_id' => $saas_user->id, 'is_delete' => 0, 'state' => 2]);
  323. if (!$courier) {
  324. return $this->asJson([
  325. 'code' => 1,
  326. 'msg' => '当前用户不是骑手',
  327. ]);
  328. }
  329. if ($courier->status == $status) {
  330. $msg = $status == 0 ? '已离线,请勿重复操作' : '已上线,请勿重复操作';
  331. return $this->asJson([
  332. 'code' => 1,
  333. 'msg' => $msg,
  334. 'status' => $status
  335. ]);
  336. }
  337. if ($status == 0) { //离线时需要查询一下,是否有未配送订单
  338. $count = Order::find()->alias('o')
  339. ->leftJoin(['di' => DeliveryInfo::tableName()], 'o.order_no = di.order_no')
  340. ->where(['o.order_type' => Order::ORDER_TYPE_STORE, 'di.is_local' => 1])
  341. ->andWhere([
  342. 'o.trade_status' => Order::ORDER_FLOW_SEND,
  343. 'o.is_delete' => Order::IS_DELETE_FALSE,
  344. 'di.rider_id' => $courier->id,
  345. ])
  346. ->andWhere(['or', ['o.is_pay' => Order::IS_PAY_TRUE], ['o.pay_type' => Order::PAY_TYPE_COD]])
  347. ->andWhere([
  348. 'or',
  349. ['di.local_status' => DeliveryInfo::LOCAL_STATUS_WAITING],
  350. ['di.local_status' => DeliveryInfo::LOCAL_STATUS_SENDING],
  351. ])
  352. ->select('o.id,o.order_no,o.store_id,o.total_price,o.pay_price,o.name,o.mobile,o.address,o.created_at,o.trade_status,o.delivery_time,o.pay_time,o.address_data,di.fee,di.rider_id,di.rider_name,di.rider_mobile,di.serial_num')
  353. ->count();
  354. if ($count > 0) {
  355. $courier->status = $status;
  356. if (!$courier->save()) {
  357. return $this->asJson([
  358. 'code' => 1,
  359. 'msg' => $courier->errors[0],
  360. ]);
  361. }
  362. return $this->asJson([
  363. 'code' => 0,
  364. 'msg' => '已下线停止接单,请继续完成未完成订单。',
  365. ]);
  366. }
  367. }
  368. $courier->status = $status;
  369. if (!$courier->save()) {
  370. return $this->asJson([
  371. 'code' => 1,
  372. 'msg' => $courier->errors[0],
  373. ]);
  374. }
  375. return $this->asJson([
  376. 'code' => 0,
  377. 'msg' => '操作成功',
  378. ]);
  379. }
  380. /**
  381. * 模块名:actionArriveStore
  382. * 代码描述:上报到店
  383. * 作者:WPing丶
  384. * 请求方式:POST
  385. * 创建时间:2023/07/06 19:13:17
  386. * @param int id 订单ID
  387. */
  388. public function actionArriveStore()
  389. {
  390. $t = \Yii::$app->db->beginTransaction();
  391. try {
  392. $id = post_params('id'); //订单ID
  393. $saas_user = get_saas_user();
  394. $courier = LocalDeliveryCourier::findOne(['saas_user_id' => $saas_user->id, 'is_delete' => 0, 'state' => 2]);
  395. if (!$courier) {
  396. throw new \Exception('当前用户不是骑手');
  397. }
  398. $order = Order::findOne($id);
  399. $delivery_info = DeliveryInfo::findOne(['order_no' => $order->order_no]);
  400. if ($delivery_info->rider_id != $courier->id) {
  401. throw new \Exception('订单骑手不一致,请刷新列表');
  402. }
  403. if ($delivery_info->local_status != DeliveryInfo::LOCAL_STATUS_WAITING) {
  404. throw new \Exception('订单状态发生变化,请刷新列表');
  405. }
  406. $delivery_info->local_status = DeliveryInfo::LOCAL_STATUS_SENDING;
  407. $delivery_info->arrive_time = time();
  408. if (!$delivery_info->save()) {
  409. throw new \Exception($delivery_info->errors[0]);
  410. }
  411. //如果是云仓订单发货操作(给供货商结算使用)
  412. $frontDeliveryOrder = FrontDeliveryOrder::findOne(['delivery_info_id' => $delivery_info->id]);
  413. if ($frontDeliveryOrder) {
  414. $supplier = new SupplierForm();
  415. $supplier->send_type = 2;
  416. $supplier->order_id = (string)$frontDeliveryOrder->cloud_order_id;
  417. $result = $supplier->supplierPurchaseSend($frontDeliveryOrder->cloud_supplier_id);
  418. if ($result['code'] !== 0) {
  419. throw new \Exception($result['msg']);
  420. }
  421. }
  422. $t->commit();
  423. return $this->asJson([
  424. 'code' => 0,
  425. 'msg' => '取货成功',
  426. ]);
  427. } catch (\Exception $e) {
  428. $t->rollBack();
  429. return $this->asJson([
  430. 'code' => 1,
  431. 'msg' => $e->getMessage(),
  432. ]);
  433. }
  434. }
  435. /**
  436. * 模块名:actionOrderConfirm
  437. * 代码描述:订单完成
  438. * 作者:WPing丶
  439. * 请求方式:POST
  440. * 创建时间:2023/07/06 19:13:17
  441. * @param int id 订单ID
  442. */
  443. public function actionOrderConfirm()
  444. {
  445. $id = post_params('id'); //订单ID
  446. $saas_user = get_saas_user();
  447. $courier = LocalDeliveryCourier::findOne(['saas_user_id' => $saas_user->id, 'is_delete' => 0, 'state' => 2]);
  448. if (!$courier) {
  449. return $this->asJson([
  450. 'code' => 1,
  451. 'msg' => '当前用户不是骑手',
  452. ]);
  453. }
  454. $order = Order::findOne($id);
  455. $delivery_info = DeliveryInfo::findOne(['order_no' => $order->order_no]);
  456. if ($delivery_info->rider_id != $courier->id) {
  457. return $this->asJson([
  458. 'code' => 1,
  459. 'msg' => '订单骑手不一致,请刷新列表',
  460. ]);
  461. }
  462. if ($delivery_info->local_status != DeliveryInfo::LOCAL_STATUS_SENDING) {
  463. return $this->asJson([
  464. 'code' => 1,
  465. 'msg' => '订单状态发生变化,请刷新列表',
  466. ]);
  467. }
  468. $t = \Yii::$app->db->beginTransaction(); //开始事务
  469. $delivery_info->local_status = DeliveryInfo::LOCAL_STATUS_CONFIRM;
  470. $delivery_info->confirm_time = time();
  471. if (!$delivery_info->save()) {
  472. $t->rollBack(); //事务回滚
  473. return $this->asJson([
  474. 'code' => 1,
  475. 'msg' => $delivery_info->errors[0],
  476. ]);
  477. }
  478. $store_id = 0;
  479. if (intval($delivery_info->is_store_delivery_type)) {
  480. $store_id = $delivery_info->store_id;
  481. }
  482. $set = Option::get(OptionSetting::LOCAL_DELIVERY_SETTING, $store_id, OptionSetting::LOCAL_DELIVERY_GROUP_NAME, '{}')['value'];
  483. $local_setting = json_decode($set, true);
  484. if($local_setting['confirm_type'] && $local_setting['confirm_type']['value']){
  485. if (intval($order->is_delivery)) {
  486. $order->trade_status = Order::ORDER_FLOW_CONFIRM;
  487. $order->confirm_time = time();
  488. } else {
  489. $order->trade_status = Order::ORDER_FLOW_SEND;
  490. $order->send_time = time();
  491. }
  492. if (!$order->save()) {
  493. $t->rollBack(); //事务回滚
  494. return $this->asJson([
  495. 'code' => 1,
  496. 'msg' => array_shift($order->getFirstErrors()),
  497. ]);
  498. }
  499. // /* 骑手完成订单后发放收入 */
  500. if ($store_id > 0) {
  501. $local_setting['default_cost']['value'] = -1;
  502. }
  503. $amount = (float)$local_setting['default_cost']['value'] == -1 ? $delivery_info->fee : (float)$local_setting['default_cost']['value'];
  504. $log = LocalDeliveryLog::saveLog($saas_user->id, $amount, 1, 1, $id, "骑手配送收入:" . $amount . "元");
  505. if (!$log) {
  506. $t->rollBack(); //事务回滚
  507. return $this->asJson([
  508. 'code' => 1,
  509. 'msg' => '发放骑手佣金报错',
  510. ]);
  511. }
  512. //如果是云仓订单收货操作(给供货商结算使用)
  513. // $frontDeliveryOrder = FrontDeliveryOrder::findOne(['delivery_info_id' => $delivery_info->id]);
  514. // if ($frontDeliveryOrder && intval($order->is_delivery)) {
  515. // $form = new MerchantForm();
  516. // $data = $form->mchPurchaseOrderConfirm(0, $frontDeliveryOrder->store_id, $frontDeliveryOrder->cloud_order_id);
  517. // debug_log(json_encode($data));
  518. // if ((int)$data['code'] !== 0) {
  519. // $t->rollBack(); //事务回滚
  520. // return $this->asJson($data);
  521. // }
  522. // }
  523. }
  524. $t->commit(); //事务执行
  525. return $this->asJson([
  526. 'code' => 0,
  527. 'msg' => '订单已完成',
  528. ]);
  529. }
  530. /**
  531. * 模块名:actionSetting
  532. * 代码描述:骑手设置
  533. * 作者:WPing丶
  534. * 请求方式:POST
  535. * 创建时间:2023/07/06 20:38:45
  536. * @param int max_num
  537. */
  538. public function actionSetting()
  539. {
  540. $params = post_params(); //设置项
  541. $saas_user = get_saas_user();
  542. $courier = LocalDeliveryCourier::findOne(['saas_user_id' => $saas_user->id, 'is_delete' => 0, 'state' => 2]);
  543. if (!$courier) {
  544. return $this->asJson([
  545. 'code' => 1,
  546. 'msg' => '当前用户不是骑手',
  547. ]);
  548. }
  549. if (array_key_exists('max_num', $params)) {
  550. $courier->max_num = $params['max_num'];
  551. }
  552. if (array_key_exists('work_time', $params)) {
  553. $courier->work_time = $params['work_time'];
  554. }
  555. if (array_key_exists('is_auto', $params)) {
  556. $courier->is_auto = $params['is_auto'];
  557. }
  558. // if (array_key_exists('store_id', $params)) {
  559. // $courier->store_id = $params['store_id'];
  560. // }
  561. if (array_key_exists('real_name', $params)) {
  562. $courier->real_name = $params['real_name'];
  563. }
  564. if (array_key_exists('real_code', $params)) {
  565. $courier->real_code = $params['real_code'];
  566. }
  567. if (array_key_exists('avatar', $params)) {
  568. $courier->avatar = $params['avatar'];
  569. }
  570. if (array_key_exists('area', $params)) {
  571. $courier->area = $params['area'];
  572. }
  573. if (!$courier->save()) {
  574. return $this->asJson([
  575. 'code' => 1,
  576. 'msg' => $courier->errors[0],
  577. ]);
  578. }
  579. return $this->asJson([
  580. 'code' => 0,
  581. 'msg' => '修改成功',
  582. ]);
  583. }
  584. /**
  585. * 模块名:actionTotalOrder
  586. * 代码描述:订单统计
  587. * 作者:WPing丶
  588. * 请求方式:GET
  589. * 创建时间:2023/07/06 15:19:43
  590. * @param int start_time 时间范围
  591. * @param int end_time 时间范围
  592. */
  593. public function actionTotalOrder()
  594. {
  595. $start_time = get_params('start_time', get_params('begin_time'));
  596. $end_time = get_params('end_time');
  597. $saas_user = get_saas_user();
  598. $courier = LocalDeliveryCourier::findOne(['saas_user_id' => $saas_user->id, 'is_delete' => 0, 'state' => 2]);
  599. if (!$courier) {
  600. return $this->asJson([
  601. 'code' => 1,
  602. 'msg' => '当前用户不是骑手',
  603. ]);
  604. }
  605. $query = Order::find()->alias('o')
  606. ->leftJoin(['di' => DeliveryInfo::tableName()], 'o.order_no = di.order_no')
  607. ->where(['o.order_type' => Order::ORDER_TYPE_STORE, 'di.is_local' => 1])
  608. ->select('o.id,o.order_no,o.store_id,o.total_price,o.pay_price,o.name,o.mobile,o.address,o.created_at,o.trade_status,o.delivery_time,o.pay_time,o.address_data,o.remark,di.fee,di.rider_id,di.rider_name,di.rider_mobile,di.arrive_time,di.rush_time,di.confirm_time,di.serial_num')->orderBy('o.created_at DESC');
  609. if ($start_time) {
  610. $query->andWhere(['>=', 'di.confirm_time', strtotime($start_time . ' 00:00:00')]);
  611. }
  612. if ($end_time) {
  613. $query->andWhere(['<=', 'di.confirm_time', strtotime($end_time . ' 23:59:59')]);
  614. }
  615. //完成订单
  616. $confirm_query = clone $query;
  617. $confirm_query->andWhere([
  618. 'o.trade_status' => Order::ORDER_FLOW_CONFIRM,
  619. 'o.is_delete' => Order::IS_DELETE_FALSE,
  620. 'di.local_status' => DeliveryInfo::LOCAL_STATUS_CONFIRM,
  621. 'di.rider_id' => $courier->id,
  622. ])->andWhere(['or', ['o.is_pay' => Order::IS_PAY_TRUE], ['o.pay_type' => Order::PAY_TYPE_COD]]);
  623. $list = pagination_make($confirm_query);
  624. $total_distance = 0;
  625. foreach ($list['list'] as &$val) {
  626. $form = new OrderListForm();
  627. $val['goods_list'] = $form->getOrderGoodsList($val['id']);
  628. $store = Store::findOne($val['store_id']);
  629. $val['store_name'] = $val['store_id'] > 0 ? $store->name : '';
  630. $address_data = json::decode($val['address_data'], true);
  631. $val['user_latitude'] = $address_data['latitude'];
  632. $val['user_longitude'] = $address_data['longitude'];
  633. $val['store_latitude'] = $store->latitude;
  634. $val['store_longitude'] = $store->longitude;
  635. $val['distance'] = Tools::getDistance($address_data['latitude'], $address_data['longitude'], $store->latitude, $store->longitude);
  636. $val['contact_tel'] = $store->contact_tel;
  637. $val['store_address'] = $store->address;
  638. //处理距离
  639. $distance_str = $val['distance'];
  640. if (strpos($distance_str, 'km') !== false) {
  641. // 如果包含 'km' 则将字符串转换为浮点数并乘以 1000
  642. $distance = (float) str_replace('km', '', $distance_str) * 1000;
  643. } elseif (strpos($distance_str, 'm') !== false) {
  644. // 如果包含 'm' 则将字符串转换为整数
  645. $distance = (int) str_replace('m', '', $distance_str);
  646. }
  647. $distance = bcdiv($distance, 1000, 2);
  648. $total_distance += $distance;
  649. }
  650. $confirm_data = [
  651. 'q' => $confirm_query->createCommand()->getRawSql(),
  652. 'data' => $list['list'],
  653. 'pageNo' => $list['pageNo'],
  654. 'totalCount' => $list['totalCount']
  655. ];
  656. //取消订单
  657. $cancel_query = clone $query;
  658. $cancel_query->andWhere([
  659. 'o.trade_status' => Order::ORDER_FLOW_CANCEL,
  660. 'o.is_delete' => Order::IS_DELETE_FALSE,
  661. 'di.rider_id' => $courier->id,
  662. ]);
  663. $list = pagination_make($cancel_query);
  664. foreach ($list['list'] as &$val) {
  665. $form = new OrderListForm();
  666. $val['goods_list'] = $form->getOrderGoodsList($val['id']);
  667. $store = Store::findOne($val['store_id']);
  668. $val['store_name'] = $val['store_id'] > 0 ? $store->name : '';
  669. $address_data = json::decode($val['address_data'], true);
  670. $val['user_latitude'] = $address_data['latitude'];
  671. $val['user_longitude'] = $address_data['longitude'];
  672. $val['store_latitude'] = $store->latitude;
  673. $val['store_longitude'] = $store->longitude;
  674. $val['distance'] = Tools::getDistance($address_data['latitude'], $address_data['longitude'], $store->latitude, $store->longitude);
  675. $val['contact_tel'] = $store->contact_tel;
  676. $val['store_address'] = $store->address;
  677. }
  678. $cancel_data = [
  679. 'data' => $list['list'],
  680. 'pageNo' => $list['pageNo'],
  681. 'totalCount' => $list['totalCount']
  682. ];
  683. //统计
  684. $total = [
  685. 'confirm_num' => $confirm_data['totalCount'], //完成订单数
  686. 'cancel_num' => $cancel_data['totalCount'], //取消订单数
  687. 'total_distance' => bcdiv($total_distance, 1)
  688. ];
  689. return $this->asJson([
  690. 'code' => 0,
  691. 'msg' => 'success',
  692. 'data' => [
  693. 'confirm_list' => $confirm_data, //已完成订单列表
  694. 'cancel_list' => $cancel_data, //已取消订单列表
  695. 'total' => $total,
  696. ]
  697. ]);
  698. }
  699. /**
  700. * 模块名:actionCashInfo
  701. * 代码描述:提现基础设置
  702. * 作者:WPing丶
  703. * 请求方式:POST
  704. * 创建时间:2023/07/11 09:32:30
  705. */
  706. public function actionCashInfo()
  707. {
  708. $saas_user = get_saas_user();
  709. $courier = LocalDeliveryCourier::findOne(['saas_user_id' => $saas_user->id, 'is_delete' => 0, 'state' => 2]);
  710. if (!$courier) {
  711. return $this->asJson([
  712. 'code' => 1,
  713. 'msg' => '当前用户不是骑手',
  714. ]);
  715. }
  716. //今日收入
  717. $today_money = LocalDeliveryLog::find()->where(['saas_user_id' => $saas_user->id, 'log_type' => 1])->andWhere(['>' ,'order_id', 0])->andWhere(['>', 'created_at', strtotime(date('Y-m-d'))])->select('sum(amount) as today_money')->asArray()->all();
  718. //今日订单数
  719. $today_order = LocalDeliveryLog::find()->where(['saas_user_id' => $saas_user->id, 'log_type' => 1])->andWhere(['>' ,'order_id', 0])->andWhere(['>', 'created_at', strtotime(date('Y-m-d'))])->count();
  720. //今日提现
  721. // $today_cash = LocalDeliveryLog::find()->where(['saas_user_id' => $saas_user->id, 'log_type' => 2])->andWhere(['>', 'created_at', strtotime(date('Y-m-d'))])->select('sum(amount) as today_cash')->asArray()->all();
  722. $today_cash = LocalDeliveryCash::find()->where(['saas_user_id' => $saas_user->id])->andWhere(['<>' ,'status', 2])->andWhere(['>', 'created_at', strtotime(date('Y-m-d'))])->select('sum(price) as today_cash')->asArray()->all();
  723. //同城配送设置相关
  724. $values = Option::find()->where([
  725. 'store_id' => 0,
  726. 'group' => OptionSetting::LOCAL_DELIVERY_GROUP_NAME, 'name' => OptionSetting::LOCAL_DELIVERY_SETTING
  727. ])->select('value')->one();
  728. $local_setting = json_decode($values->value, true);
  729. //今日未到账收入(配送中)
  730. $query = Order::find()->alias('o')
  731. ->leftJoin(['di' => DeliveryInfo::tableName()], 'o.order_no = di.order_no')
  732. ->where(['o.order_type' => Order::ORDER_TYPE_STORE, 'di.is_local' => 1])
  733. ->andWhere([
  734. 'o.trade_status' => Order::ORDER_FLOW_SEND,
  735. 'o.is_delete' => Order::IS_DELETE_FALSE,
  736. 'di.local_status' => DeliveryInfo::LOCAL_STATUS_SENDING,
  737. 'di.rider_id' => $courier->id,
  738. ])
  739. ->andWhere(['or', ['o.is_pay' => Order::IS_PAY_TRUE], ['o.pay_type' => Order::PAY_TYPE_COD]])
  740. ->andWhere(['>', 'di.created_at', strtotime(date('Y-m-d'))]);
  741. if ((float)$local_setting['default_cost']['value'] == -1) {
  742. $frozen_money = $query->select('sum(di.fee) as frozen_money')->asArray()->all()['frozen_money'];
  743. } else {
  744. $frozen_money = bcmul((float)$local_setting['default_cost']['value'], $query->count(), 2);
  745. }
  746. return $this->asJson([
  747. 'code' => 0,
  748. 'data' => [
  749. 'money' => $courier->money ?: 0, //账户余额
  750. 'total_money' => $courier->total_money ?: 0, //账户总收入
  751. 'today_money' => $today_money[0]['today_money'] ?: 0, //今日收入
  752. 'today_cash' => $today_cash[0]['today_cash'] ?: 0, //今日提现支出
  753. 'today_order' => $today_order ?: 0, //今日订单数
  754. 'frozen_money' => $frozen_money ?: 0, //未到账
  755. 'service_charge' => $local_setting['cash_service_charge']['value'] ?: 0, //提现手续费
  756. 'data' => LocalDeliveryLog::find()->alias('l')->where(['l.saas_user_id' => $saas_user->id])->orderBy('l.id DESC')->limit(3)->asArray()->all(),
  757. ],
  758. 'msg' => 'success',
  759. ]);
  760. }
  761. /**
  762. * 模块名:actionCashList
  763. * 代码描述:提现记录
  764. * 作者:WPing丶
  765. * 请求方式:POST
  766. * 创建时间:2023/07/11 11:04:47
  767. * @param int id
  768. * @param string str
  769. * @param bool bool
  770. */
  771. public function actionCashList()
  772. {
  773. $status = get_params('status');
  774. $saas_user = get_saas_user();
  775. $query = LocalDeliveryCash::find()->where(['saas_user_id' => $saas_user->id, 'is_delete' => 0]);
  776. if ($status > -1) { //状态,0:待审核,1:审核通过,2:审核驳回
  777. $query->andWhere(['status' => $status]);
  778. }
  779. $query->orderBy('id DESC');
  780. $pagination = pagination_make($query);
  781. $list = $pagination['list'];
  782. foreach ($list as &$value) {
  783. $value['created_at'] = $value['created_at'] > 0 ? date('Y-m-d H:i:s', $value['created_at']) : '';
  784. $value['updated_at'] = $value['updated_at'] > 0 ? date('Y-m-d H:i:s', $value['updated_at']) : '';
  785. $value['pay_time'] = $value['pay_time'] > 0 ? date('Y-m-d H:i:s', $value['pay_time']) : '';
  786. }
  787. return $this->asJson([
  788. 'code' => 0,
  789. 'msg' => 'success',
  790. 'data' => [
  791. 'list' => $list,
  792. 'pageNo' => $pagination['pageNo'],
  793. 'totalCount' => $pagination['totalCount']
  794. ]
  795. ]);
  796. }
  797. /**
  798. * 模块名:actionCashApply
  799. * 代码描述:提现申请
  800. * 作者:WPing丶
  801. * 请求方式:POST
  802. * 创建时间:2023/07/11 15:13:16
  803. * @param int id
  804. * @param string str
  805. * @param bool bool
  806. */
  807. public function actionCashApply()
  808. {
  809. $saas_user = get_saas_user();
  810. $courier = LocalDeliveryCourier::findOne(['saas_user_id' => $saas_user->id, 'is_delete' => 0, 'state' => 2]);
  811. if (!$courier) {
  812. return $this->asJson([
  813. 'code' => 1,
  814. 'msg' => '当前用户不是骑手',
  815. ]);
  816. }
  817. $price = post_params('cash');
  818. $type = post_params('type');
  819. if (!$price || !in_array($type, ['alipay', 'bank_card', 'wechat'])) {
  820. return $this->asJson([
  821. 'code' => 1,
  822. 'msg' => '参数非法',
  823. ]);
  824. }
  825. //商城余额是否充足
  826. if ($price > $courier->money) {
  827. \Yii::error([__METHOD__, $price, $courier->money]);
  828. return $this->asJson([
  829. 'code' => 1,
  830. 'msg' => '可提现金额不足'
  831. ]);
  832. }
  833. //同城配送设置相关
  834. $values = Option::find()->where([
  835. 'store_id' => 0,
  836. 'group' => OptionSetting::LOCAL_DELIVERY_GROUP_NAME, 'name' => OptionSetting::LOCAL_DELIVERY_SETTING
  837. ])->select('value')->one();
  838. $local_setting = json_decode($values->value, true);
  839. $cash_max_day = $local_setting['cash_max_day']['value'];
  840. $min_money = $local_setting['min_money']['value'];
  841. //今日提现金额
  842. $today_cash = LocalDeliveryCash::find()
  843. ->where(['<>', 'status', LocalDeliveryCash::CASH_STATUS_FAIL])
  844. ->andWhere(['saas_user_id' => $saas_user->id])
  845. ->andWhere(['>', 'created_at', strtotime(date('Y-m-d'))])
  846. ->sum('price');
  847. if ($cash_max_day > 0 && ($price > $cash_max_day || bcadd($price, (float)$today_cash, 2) > $cash_max_day)) {
  848. \Yii::error([__METHOD__, $price, $cash_max_day]);
  849. return $this->asJson([
  850. 'code' => 1,
  851. 'msg' => '今日提现金额已超过每天提现最大额度' . $cash_max_day . '元'
  852. ]);
  853. }
  854. if ($price <= $min_money) {
  855. \Yii::error([__METHOD__, $price, $min_money]);
  856. return $this->asJson([
  857. 'code' => 1,
  858. 'msg' => '提现金额不能小于' . $min_money . '元'
  859. ]);
  860. }
  861. $exit = LocalDeliveryCash::find()->andWhere(['=', 'status', 0])->andWhere(['saas_user_id' => $saas_user->id])->exists();
  862. if ($exit) {
  863. \Yii::error([__METHOD__, $saas_user->id, $exit]);
  864. // return $this->asJson([
  865. // 'code' => 1,
  866. // 'msg' => '尚有未完成的提现申请'
  867. // ]);
  868. }
  869. $t = \Yii::$app->db->beginTransaction();
  870. $cash = new LocalDeliveryCash();
  871. $cash->order_no = OrderNo::getOrderNo(OrderNo::ORDER_LOCAL_CASH);
  872. $cash->is_delete = 0;
  873. $cash->status = 0;
  874. $cash->price = $price;
  875. $cash->created_at = time();
  876. $cash->saas_user_id = $saas_user->id;
  877. $cash->store_id = $courier->store_id ?: 0;
  878. $cash->service_charge = bcmul(bcdiv($local_setting['cash_service_charge']['value'], 100, 4), $price, 2);
  879. $withdraw_method = json_decode($saas_user->withdraw_method, true);
  880. $withdraw_method = array_column($withdraw_method, null, 'type');
  881. if ($type == 'wechat') {
  882. $cash->type = 0;
  883. $cash->name = $withdraw_method['wechat']['name'];
  884. $cash->mobile = $withdraw_method['wechat']['account'];
  885. }
  886. if ($type == 'alipay') {
  887. $cash->type = 1;
  888. $cash->name = $withdraw_method['alipay']['name'];
  889. $cash->mobile = $withdraw_method['alipay']['account'];
  890. }
  891. if ($type == 'bank_card') {
  892. $cash->type = 2;
  893. $cash->name = $withdraw_method['bank_card']['name'];
  894. $cash->mobile = $withdraw_method['bank_card']['account'];
  895. $cash->bank_name = $withdraw_method['bank_card']['bank'];
  896. }
  897. $cash->pay_time = 0;
  898. if ($cash->save()) {
  899. $subMoney = \app\models\LocalDeliveryCourier::subMoney($courier, $price, '配送员提现');
  900. if (!$subMoney) {
  901. $t->rollBack();
  902. \Yii::error([__METHOD__, $subMoney, $cash]);
  903. return $this->asJson([
  904. 'code' => 1,
  905. 'msg' => '扣款失败',
  906. ]);
  907. }
  908. $t->commit();
  909. return $this->asJson([
  910. 'code' => 0,
  911. 'msg' => '申请成功'
  912. ]);
  913. } else {
  914. $t->rollBack();
  915. return $this->asJson([
  916. 'code' => 1,
  917. 'msg' => $cash->errors
  918. ]);
  919. }
  920. }
  921. /**
  922. * 模块名:actionAccountLogList
  923. * 代码描述:佣金明细
  924. * 作者:WPing丶
  925. * 请求方式:GET
  926. * 创建时间:2023/07/12 09:03:52
  927. * @param int id
  928. * @param string str
  929. * @param bool bool
  930. */
  931. public function actionAccountLogList()
  932. {
  933. $start_time = get_params('start_time');
  934. $end_time = get_params('end_time');
  935. $type = get_params('type');
  936. $saas_user = get_saas_user();
  937. $query = LocalDeliveryLog::find()->alias('l')->where(['l.saas_user_id' => $saas_user->id]);
  938. if ($start_time) {
  939. $query->andWhere(['>=', 'l.created_at', strtotime($start_time . ' 00:00:00')]);
  940. }
  941. if ($end_time) {
  942. $query->andWhere(['<=', 'l.created_at', strtotime($end_time . ' 23:59:59')]);
  943. }
  944. if ($type > 0) {
  945. $query->andWhere(['l.type' => $type]);
  946. }
  947. $query->orderBy('l.id DESC');
  948. $pagination = pagination_make($query);
  949. $list = $pagination['list'];
  950. return $this->asJson([
  951. 'code' => 0,
  952. 'msg' => 'success',
  953. 'data' => [
  954. 'data' => $list,
  955. 'pageNo' => $pagination['pageNo'],
  956. 'totalCount' => $pagination['totalCount']
  957. ],
  958. ]);
  959. }
  960. /**
  961. * 模块名:actionApplyCourier
  962. * 代码描述:骑手申请
  963. * 作者:WPing丶
  964. * 请求方式:GET
  965. * 创建时间:2023/07/13 17:31:20
  966. * @param int id
  967. * @param string str
  968. * @param bool bool
  969. */
  970. public function actionApplyCourier()
  971. {
  972. $saas_user = get_saas_user();
  973. $params = post_params();
  974. $courier = LocalDeliveryCourier::findOne(['is_delete' => 0, 'saas_user_id' => $saas_user->id]);
  975. if ($courier) {
  976. if ($courier->state == 1) {
  977. return $this->asJson([
  978. 'code' => 1,
  979. 'msg' => '正在审核中,请耐心等待'
  980. ]);
  981. } elseif ($courier->state == 2) {
  982. return $this->asJson([
  983. 'code' => 1,
  984. 'msg' => '审核已通过'
  985. ]);
  986. }
  987. } else {
  988. $courier = new LocalDeliveryCourier;
  989. }
  990. /* 参数验证begin */
  991. if (!$params['real_name']) {
  992. return $this->asJson([
  993. 'code' => 1,
  994. 'msg' => '请填写骑手姓名'
  995. ]);
  996. }
  997. if (!$params['mobile']) {
  998. return $this->asJson([
  999. 'code' => 1,
  1000. 'msg' => '请填写手机号'
  1001. ]);
  1002. }
  1003. if (!$params['real_code']) {
  1004. return $this->asJson([
  1005. 'code' => 1,
  1006. 'msg' => '请填写身份证号'
  1007. ]);
  1008. }
  1009. if (!$params['real_just_pic']) {
  1010. return $this->asJson([
  1011. 'code' => 1,
  1012. 'msg' => '请上传身份证正面照'
  1013. ]);
  1014. }
  1015. if (!$params['real_back_pic']) {
  1016. return $this->asJson([
  1017. 'code' => 1,
  1018. 'msg' => '请上传身份证反面照'
  1019. ]);
  1020. }
  1021. if (!$params['type']) {
  1022. return $this->asJson([
  1023. 'code' => 1,
  1024. 'msg' => '请选择骑手类型'
  1025. ]);
  1026. }
  1027. if ($params['type'] == 2 && !$params['store_id']) {
  1028. return $this->asJson([
  1029. 'code' => 1,
  1030. 'msg' => '请选择所属店铺'
  1031. ]);
  1032. }
  1033. /* end */
  1034. $courier->real_name = $params['real_name'];
  1035. $courier->mobile = $params['mobile'];
  1036. $courier->real_code = $params['real_code'];
  1037. $courier->real_just_pic = $params['real_just_pic'];
  1038. $courier->real_back_pic = $params['real_back_pic'];
  1039. $courier->type = $params['type'];
  1040. $courier->store_id = $params['store_id'];
  1041. $courier->saas_user_id = $saas_user->id;
  1042. $courier->work_time = '[{"begin_time":"00:00","end_time":"00:00"}]';
  1043. $courier->area = '[{"province_id":0,"city_id":0,"district_id":0,"town_id":0,"village_id":0}]';
  1044. $courier->state = 1;
  1045. if (!$courier->save()) {
  1046. return $this->asJson([
  1047. 'code' => 1,
  1048. 'msg' => $courier->errors
  1049. ]);
  1050. }
  1051. return $this->asJson([
  1052. 'code' => 0,
  1053. 'msg' => '申请已提交'
  1054. ]);
  1055. }
  1056. }