OrderDetailForm.php 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\client\models\v1;
  8. use app\constants\OptionSetting;
  9. use app\jobs\AlipayThirdOrderJob;
  10. use app\models\AgentGoodsInstallLog;
  11. use app\models\common\ExpressDetail;
  12. use app\models\Coupon;
  13. use app\models\DeliveryInfo;
  14. use app\models\DeliveryRules;
  15. use app\models\District;
  16. use app\models\FoodFlag;
  17. use app\models\FoodTableNumber;
  18. use app\models\Goods;
  19. use app\models\LevelOrder;
  20. use app\models\LocalDeliveryCourier;
  21. use app\models\LocalDeliveryCourierComment;
  22. use app\models\LocalDeliveryCourierTag;
  23. use app\models\Mch;
  24. use app\models\Md;
  25. use app\models\Option;
  26. use app\models\Order;
  27. use app\models\OrderComment;
  28. use app\models\OrderDetail;
  29. use app\models\OrderForm;
  30. use app\models\OrderGoodsCancel;
  31. use app\models\OrderRefund;
  32. use app\models\SaasUser;
  33. use app\models\Shop;
  34. use app\models\Store;
  35. use app\models\User;
  36. use app\models\UserCoupon;
  37. use app\models\VerifyCard;
  38. use app\models\OrderTransit;
  39. use app\models\VerifyCardAccount;
  40. use app\models\VerifyCardSale;
  41. use app\utils\Delivery\Delivery;
  42. use app\utils\Tools;
  43. use yii\base\Model;
  44. use yii\helpers\Json;
  45. use yii\helpers\Json as HelpersJson;
  46. use \app\models\AlipayAcitvityVoucherOrder;
  47. use app\utils\Notice\NoticeAction;
  48. use app\models\DeliveryMaiyatian;
  49. use app\models\DeliveryKeloop;
  50. use app\modules\admin\models\keloop\KeloopForm;
  51. class OrderDetailForm extends Model
  52. {
  53. public $store_id;
  54. public $user_id;
  55. public $order_id;
  56. public $order_no;
  57. public $order_user_id;
  58. public $delivery_type;
  59. public $latitude;
  60. public $longitude;
  61. public function rules()
  62. {
  63. return [
  64. [['order_id'], 'required'],
  65. ];
  66. }
  67. public function search()
  68. {
  69. if (!$this->validate()) {
  70. return ['code' => 1, 'msg' => $this->getErrorSummary(false)[0]];
  71. }
  72. $order = Order::findOne([
  73. // 'store_id' => $this->store_id,//解决供应链两个用户不用店铺问题
  74. 'id' => $this->order_id,
  75. // 'user_id' => $this->user_id,
  76. 'is_delete' => 0,
  77. 'is_recycle'=> 0,
  78. ]);
  79. if (!$order) {
  80. return [
  81. 'code' => 1,
  82. 'msg' => '订单不存在',
  83. ];
  84. }
  85. $res = \queue_push(new AlipayThirdOrderJob(['order_id' => $this->order_id]), 5);
  86. $status = "";
  87. if ($order->is_pay == 0) {
  88. $status = '订单未付款';
  89. } elseif ($order->is_pay == 1 && $order->trade_status == Order::ORDER_FLOW_NO_SEND) {
  90. $status = '订单待发货';
  91. } elseif ($order->trade_status == Order::ORDER_FLOW_SEND) {
  92. $status = '订单已发货';
  93. } elseif ($order->trade_status == Order::ORDER_FLOW_CONFIRM) {
  94. $status = '订单已完成';
  95. }
  96. $goods_list = OrderDetail::find()->alias('od')
  97. ->where(['od.order_id' => $order->id, 'od.is_delete' => 0])->asArray()->all();
  98. $num = 0;
  99. $book = [];
  100. $sum_goods_price = 0;
  101. $is_can_confirm = true;
  102. // 获取联动2+1商品条件
  103. $holderLevelOption = \app\utils\Share\BonusPool::getShareHolderLevelOption($this->store_id);
  104. $coupon_cards = [];
  105. foreach ($goods_list as $i => $item) {
  106. $sum_goods_price += $item['total_price'];
  107. if ($order->order_type == 1 || $order->order_type == 2) {
  108. $attr = Json::decode($item['attr']);
  109. if ($order->order_type == 1) {
  110. if (count($attr) > 1) {
  111. $date_data = current($attr)['date'] . '/' . end($attr)['date'];
  112. } else {
  113. $date_data = $attr[0]['date'];
  114. }
  115. $book = [
  116. 'date' => $date_data
  117. ];
  118. } else{
  119. $book['date'] = $attr['date'] . ' ' . $attr['time'];
  120. }
  121. }
  122. $goods = HelpersJson::decode($item['goods_info']);
  123. $orderComment = OrderComment::findOne(['store_id' => $this->store_id, 'order_id' => $order->id, 'goods_id' => $item['goods_id']]);
  124. $newItem = [];
  125. $goods_model = Goods::findOne($item['goods_id']);
  126. $cards = [];
  127. // if (!empty($goods_model->verify_card_id)) {
  128. // $ids = explode(',', $goods_model->verify_card_id);
  129. // $cards = Tools::getVerifyList($ids, $order, $goods_model);
  130. // } else {
  131. // $cards = [];
  132. // }
  133. //获取已经取消多少件
  134. $newItem['cancel_num'] = OrderGoodsCancel::getCancelGoodsOrderQuery(
  135. $order->id,
  136. 'SUM(num)',
  137. 'order_detail_id',
  138. $item['id'])->scalar() ?: 0;
  139. //获取可取消数量
  140. $newItem['max_cancel_num'] = bcsub($item['num'], $newItem['cancel_num']);
  141. $newItem['is_can_cancel'] = OrderGoodsCancel::is_activity_goods($order->id, $item['goods_id']);
  142. //如果是营销活动产品就不给取消
  143. if (!$newItem['is_can_cancel']) {
  144. $newItem['max_cancel_num'] = 0;
  145. }
  146. //取消信息
  147. $cancel_info = [];
  148. $cancel_info['num'] = OrderGoodsCancel::find()->where([
  149. 'order_id' => $order->id,
  150. 'order_detail_id' => $item['id']
  151. ])->sum('num') ?: 0;
  152. $cancel_info['cancel_list'] = OrderGoodsCancel::find()->where([
  153. 'order_id' => $order->id,
  154. 'order_detail_id' => $item['id'],
  155. ])->orderBy('id desc')
  156. ->select('status, num, refund_price, created_at, updated_at')
  157. ->asArray()
  158. ->all();
  159. foreach ($cancel_info['cancel_list'] as &$cancel_item) {
  160. $cancel_item['status_text'] = OrderGoodsCancel::$status_text[$cancel_item['status']];
  161. $cancel_item['status'] = intval($cancel_item['status']);
  162. if ($cancel_item['status'] === OrderGoodsCancel::STATUS_PAY) {
  163. $cancel_item['status'] = 1;
  164. }
  165. if ($cancel_item['status'] === OrderGoodsCancel::STATUS_PAY_FAIL) {
  166. $cancel_item['status'] = 0;
  167. }
  168. if ($cancel_item['status'] === OrderGoodsCancel::STATUS_CANCEL) {
  169. $cancel_item['status'] = 2;
  170. }
  171. $cancel_item['created_at'] = date('Y-m-d H:i:s', $cancel_item['created_at']);
  172. if (in_array($cancel_item['status'], [OrderGoodsCancel::STATUS_PASS, OrderGoodsCancel::STATUS_REFUSE])) {
  173. $cancel_item['created_at'] = date('Y-m-d H:i:s', $cancel_item['updated_at']);
  174. }
  175. }
  176. $newItem['cancel_info'] = $cancel_info ?: null;
  177. $newItem['cancel_num'] = OrderGoodsCancel::find()->where([
  178. 'order_detail_id' => $item['id'],
  179. 'status' => [
  180. OrderGoodsCancel::STATUS_PAY,
  181. OrderGoodsCancel::STATUS_PASS,
  182. OrderGoodsCancel::STATUS_PAY_FAIL
  183. ]
  184. ])->sum('num') ?: 0;
  185. $newItem['cancel_text'] = '';
  186. if ($newItem['cancel_num'] > 0) {
  187. $newItem['cancel_text'] = '已退款' .$newItem['cancel_num'] .'件';
  188. if ($newItem['cancel_num'] >= $item['num']) {
  189. $newItem['cancel_text'] = '已退款';
  190. }
  191. }
  192. if ($order->get_verify_id) {
  193. $get_verify_id = explode(',', $order->get_verify_id);
  194. $VerifyCardSale = VerifyCardSale::find()->alias('vcs')->where(['and', [
  195. 'vcs.id' => $get_verify_id,
  196. 'vcs.is_delete' => 0,
  197. 'vcs.is_trans_send' => 0,
  198. // 'vca.status' => 0,
  199. 'vc.status' => 0
  200. ], [
  201. '>', 'vcs.left_num', 0
  202. ]
  203. // ,[
  204. // '>', 'vcs.end_time', time()
  205. // ]
  206. ])
  207. ->leftJoin(['vc' => VerifyCard::tableName()], 'vcs.verify_card_id = vc.id')
  208. ->leftJoin(['vca' => VerifyCardAccount::tableName()], 'vcs.account_id = vca.id')
  209. ->select('vca.account, vc.begin_time, vc.bg_pic_url, vc.business_status, vc.business_type, vc.content
  210. , vc.created_at, vc.date_type, vc.end_time, vc.expire_day, vc.freight_id, vcs.id, vc.is_business
  211. , vc.is_give, vc.money, vc.name, vc.num, vca.password, vc.pic_url, vc.price, vcs.id sale_id, vcs.status sale_status
  212. , vc.savingsType, vc.sort, vc.status, vc.total_num, vc.total_price, vc.type, vcs.use_num, vc.video_ids
  213. , vcs.video_status, vcs.goods_id, vcs.verify_card_id')->orderBy('vcs.verify_card_id ASC')->asArray()->all();
  214. if ($VerifyCardSale) {
  215. // $verify_card_id = 0;
  216. // $arr = [];
  217. // $card_index = 0;
  218. foreach ($VerifyCardSale as &$card_item) {
  219. $card_item['num'] = 1;
  220. // if (intval($verify_card_id) !== intval($card_item['verify_card_id'])) {
  221. // $arr[$card_index] = $card_item;
  222. // $verify_card_id = $card_item['verify_card_id'];
  223. // ++$card_index;
  224. // } else {
  225. // $arr[$card_index - 1]['num'] += 1;
  226. // }
  227. }
  228. $cards = $VerifyCardSale;
  229. }
  230. } else {
  231. $cards = [];
  232. }
  233. if ((int)$this->user_id !== (int)$order->user_id) {
  234. $cards = [];
  235. }
  236. if ($order->get_coupon_id) {
  237. $get_coupon_id = explode(',', $order->get_coupon_id);
  238. if ($get_coupon_id) {
  239. $coupon = UserCoupon::find()->alias('uc')->leftJoin(['c' => Coupon::tableName()], 'uc.coupon_id=c.id')
  240. ->where(['uc.id' => $get_coupon_id, 'uc.is_use' => 0])->select('c.name, uc.id, uc.begin_time, uc.end_time, c.discount_type, c.min_price, c.sub_price, c.discount, c.discount_max_price, c.desc')->asArray()->all();
  241. foreach ($coupon as &$coupon_item) {
  242. $coupon_item['discount_type'] = (int)$coupon_item['discount_type'];
  243. $coupon_item['discount'] = (int)$coupon_item['discount'];
  244. $coupon_item['begin_time'] = date('Y-m-d', $coupon_item['begin_time']);
  245. $coupon_item['end_time'] = date('Y-m-d', $coupon_item['end_time']);
  246. }
  247. $coupon_cards = $coupon;
  248. }
  249. }
  250. if ($order->pay_type == 2 && intval($order->is_pay) === 0) {
  251. $is_can_confirm = false;
  252. }
  253. //是否需要上门安装
  254. $install_log = AgentGoodsInstallLog::findOne(['order_detail_id' => $item['id'], 'order_type' => AgentGoodsInstallLog::ORDER_TYPE_NORMAL]);
  255. $newItem['goods_install'] = 0;
  256. if ($install_log->is_need_install && (int)$install_log->status >= 1) {
  257. $newItem['goods_install'] = (int)$install_log->status;
  258. }
  259. //判断是否可点击确认收货
  260. $is_can_confirm_sub = ((bool)AgentGoodsInstallLog::findOne(['order_detail_id' => $item['id'], 'status' => [0, 1], 'is_need_install' => 1, 'order_type' => AgentGoodsInstallLog::ORDER_TYPE_NORMAL]));
  261. if ($is_can_confirm_sub) {
  262. $is_can_confirm = false;
  263. }
  264. $newItem['integral_price'] = $item->integral_price;
  265. $newItem['verify_card'] = $cards;
  266. $newItem['is_comment'] = (!$orderComment && $order->is_pay == Order::IS_PAY_TRUE && $order->trade_status == Order::ORDER_FLOW_CONFIRM) ? 1 : 0;
  267. $newItem['goods_id'] = $item['goods_id'];
  268. $newItem['order_detail_id'] = $item['id'];
  269. $newItem['name'] = $item['goods_name'] ?: $goods['name'];
  270. $newItem['total_price'] = $item['total_price'];
  271. $newItem['num'] = $item['num'];
  272. $newItem['attr'] = json_decode($item['attr']);
  273. $newItem['food_ext_goods'] = (array)json_decode($item['food_ext_goods'], true);
  274. $num += intval($item['num']);
  275. $newItem['goods_pic'] = $item['pic'] ?: $goods['cover_pic'];
  276. if ($item['is_refund'] == 1) {
  277. $newItem['is_order_refund'] = 1;
  278. } else {
  279. $newItem['is_order_refund'] = 0;
  280. }
  281. if ($order->is_pay == 1 && ($order->trade_status == Order::ORDER_FLOW_CONFIRM) && $order->order_type != 4 && intval($order->is_sale) === 0) {
  282. $newItem['order_refund_enable'] = 1;
  283. } else {
  284. $newItem['order_refund_enable'] = 0;
  285. }
  286. $holderLevelConditionDay = null;
  287. foreach ($holderLevelOption as $holderLevelOptionItem) {
  288. if (\in_array($item['goods_id'], $holderLevelOptionItem['goods_ids'])) {
  289. $holderLevelConditionDay = $holderLevelOptionItem['day'];
  290. break;
  291. }
  292. }
  293. if ($order->trade_status == Order::ORDER_FLOW_CONFIRM && intval($order->is_sale) === 0) {
  294. // if ($holderLevelConditionDay === null) {
  295. // $after_sale_time = Option::get(OptionSetting::STORE_AFTER_SALE_TIME, $this->store_id);
  296. // } else {
  297. // $after_sale_time = $holderLevelConditionDay;
  298. // }
  299. // if ((time() - $order->confirm_time) > $after_sale_time['value'] * 86400) {//超过可售后时间
  300. $newItem['order_refund_enable'] = 1;
  301. // }
  302. }
  303. if($item['is_level'] == 1 && ($order->discount && $order->discount < 10)){
  304. $newItem['is_level'] = 1;
  305. }
  306. // 商品配送方式信息
  307. $newItem['delivery_type'] = $item['delivery_type'];
  308. $newItem['shop'] = [];
  309. if ($item['delivery_type'] == OrderDetail::GOODS_DELIVERY_SHOP) {
  310. $shop_info = Shop::find()->where(['id' => $item['shop_id']])->asArray()->one();
  311. $newItem['shop']['address'] = $shop_info['address'];
  312. $newItem['shop']['id'] = $shop_info['id'];
  313. $newItem['shop']['name'] = $shop_info['name'];
  314. $newItem['shop']['mobile'] = $shop_info['mobile'];
  315. }
  316. $newItem['order_form']['is_form'] = $goods['is_form'];
  317. $newItem['order_form']['name'] = $goods['form_name'];
  318. $newItem['order_form']['list'] = OrderForm::find()->where(['order_id' => $order->id, 'goods_id' => $item['goods_id']])->asArray()->all();
  319. foreach ($newItem['order_form']['list'] as &$form_item) {
  320. $form_item['default'] = $form_item['value'];
  321. if ($form_item['type'] == "checkbox" || $form_item['type'] == "radio") {
  322. $list = explode(',', $form_item['value']);
  323. $list_arr = [];
  324. foreach ($list as &$list_item) {
  325. $arr = [];
  326. $arr['name'] = $list_item;
  327. $arr['checked'] = true;
  328. array_push($list_arr, $arr);
  329. }
  330. $form_item['default_list'] = $list_arr;
  331. }
  332. $form_item['name'] = $form_item['key'];
  333. unset($form_item['key']);
  334. }
  335. //是否是云仓转单信息
  336. if($item['order_transit_id']>0){
  337. $transitInfo = OrderTransit::find()->where(['id'=>$item['order_transit_id'],'is_delete'=>0])->one();
  338. if($transitInfo->attributes['send_type'] == 1){ //正常物流
  339. $newItem['cloudInfo']['send_type'] = $transitInfo->attributes['send_type'];
  340. $newItem['cloudInfo']['express_name'] = $transitInfo->attributes['express_name'];
  341. $newItem['cloudInfo']['express_no'] = $transitInfo->attributes['express_no'];
  342. // 查询物流信息
  343. $model = new ExpressDetail();
  344. $model->express = $order->express;
  345. $model->express_no = $order->express_no;
  346. $model->receive_mobile = $order->mobile;
  347. $model->store_id = $this->store_id;
  348. $res = $model->search();
  349. $express_detail = [];
  350. if ($res['code'] != 0) {
  351. $express_detail['list'] = [];
  352. $express_detail['status'] = 0;
  353. $express_detail['status_text'] = '未知';
  354. } else {
  355. $express_detail = $res['data'];
  356. }
  357. $newItem['cloudInfo']['express_detail'] = $express_detail;
  358. }elseif($transitInfo->attributes['send_type'] == 2){ //同城配送
  359. $newItem['cloudInfo']['send_type'] = $transitInfo->attributes['send_type'];
  360. }else{
  361. $newItem['cloudInfo'] = false; //未发货
  362. }
  363. }else{
  364. $newItem['cloudInfo'] = false; //不是可转单
  365. }
  366. //配送时间逻辑
  367. $delivery_rules = DeliveryRules::find()->where(['id' => $goods_model->delivery_rules_id, 'is_delete' => 0, 'status' => 1, 'store_id' => get_store_id()])->select('type, times, days, name')->asArray()->one();
  368. if ($delivery_rules) {
  369. $days = "下单" . $delivery_rules['days'] . "天后";
  370. $delivery_rules['times'] =
  371. (int)$delivery_rules['type'] === 1 ? $days : date("m月d日 H:i:s", $delivery_rules['times']);
  372. $delivery_rules['type'] .= '';
  373. }
  374. $newItem['delivery_rules'] = $delivery_rules ?: null;
  375. $newList[] = $newItem;
  376. }
  377. if ($order->before_update_price) {
  378. if ($order->before_update_price < $order->pay_price) {
  379. $before_update = "加价";
  380. $money = $order->pay_price - $order->before_update_price;
  381. } else {
  382. $before_update = "优惠";
  383. $money = $order->before_update_price - $order->pay_price;
  384. }
  385. } else {
  386. $before_update = "";
  387. $money = "";
  388. }
  389. if(!$order->integral){
  390. $order->integral = 0;
  391. }
  392. // 查询物流信息
  393. $model = new ExpressDetail();
  394. $model->express = $order->express;
  395. $model->express_no = $order->express_no;
  396. $model->receive_mobile = $order->mobile;
  397. $model->store_id = $this->store_id;
  398. $res = $model->search();
  399. $express_detail = [];
  400. if ($res['code'] != 0) {
  401. $express_detail['list'] = [];
  402. $express_detail['status'] = 0;
  403. $express_detail['status_text'] = '未知';
  404. } else {
  405. $express_detail = $res['data'];
  406. }
  407. $deliveryInfo = null;
  408. $deliveryKeloop = null;
  409. if ($order->is_delivery == 1 && intval($order->trade_status) !== -1) {
  410. $deliveryInfo = DeliveryInfo::find()->where(['order_no' => $order->order_no])->asArray()->one();
  411. if ($deliveryInfo) {
  412. $deliveryInfo['rider'] = [
  413. 'real_name' => '-',
  414. 'avatar' => null,
  415. 'star' => '0.00',
  416. 'mobile' => null
  417. ];
  418. $deliveryInfo['is_can_comment'] = 0;
  419. $deliveryInfo['order_star'] = 0;
  420. $deliveryInfo['order_status'] = '待接单';
  421. $deliveryInfo['comment_tags'] = [];
  422. $rider = LocalDeliveryCourier::find()->where(['id' => $deliveryInfo['rider_id']])
  423. ->select('id, real_name, avatar, star, mobile')->asArray()->one();
  424. if (!empty($rider)) {
  425. $rider['star'] *= 5;
  426. $deliveryInfo['rider'] = $rider;
  427. if($deliveryInfo['local_status'] == DeliveryInfo::LOCAL_STATUS_SENDING) {
  428. $deliveryInfo['order_status'] = '配送中';
  429. } elseif($deliveryInfo['local_status'] == DeliveryInfo::LOCAL_STATUS_WAITING) {
  430. $deliveryInfo['order_status'] = '待取货';
  431. } elseif($deliveryInfo['local_status'] == DeliveryInfo::LOCAL_STATUS_CONFIRM) {
  432. $deliveryInfo['order_status'] = '已送达';
  433. $comment = LocalDeliveryCourierComment::findOne(['d_order_id' => $deliveryInfo['id'], 'rider_id' => $deliveryInfo['rider_id']]);
  434. if (!$comment) {
  435. $deliveryInfo['is_can_comment'] = 1;
  436. $courierTag = LocalDeliveryCourierTag::find()->where(['is_delete' => 0, 'is_show' => 1])
  437. ->select('id, star, tag')->asArray()->all();
  438. $star_key = array_column($courierTag, 'star');
  439. sort($star_key);
  440. $tag_arr = [];
  441. foreach ($star_key as $key) {
  442. $tag_arr[$key] = [];
  443. foreach ($courierTag as $tag) {
  444. if ($tag['star'] == $key) {
  445. $tag_arr[$key][] = $tag;
  446. }
  447. }
  448. }
  449. $deliveryInfo['comment_tags'] = $tag_arr;
  450. } else {
  451. $deliveryInfo['order_star'] = $comment->star;
  452. }
  453. }
  454. }
  455. }
  456. $keloopOrderInfo = null;
  457. $deliveryKeloop = DeliveryKeloop::find()->where(['order_no' => $order->order_no])->asArray()->one();
  458. if ($deliveryKeloop) {
  459. $deliveryKeloop['delivery_status_name'] = KeloopForm::$order_status_list[$deliveryKeloop['delivery_status']] ?? '';
  460. $keloopOrderInfo = KeloopForm::getOrderInfo($order->store_id, $deliveryKeloop['trade_no']);
  461. }
  462. }
  463. $final_pay_type = [];
  464. $pay_type_list = [];
  465. $is_open_friend_pay = false;
  466. $pay_type_list_json = Option::get(OptionSetting::STORE_PAYMENT, get_store_id(), 'pay', Option::get(OptionSetting::STORE_PAYMENT, get_store_id(), 'store')['value']);
  467. if (!empty($pay_type_list_json)) {
  468. $pay_type_list_arr = Json::decode($pay_type_list_json['value']);
  469. $user_pay_list_json = Option::get('payment_' . $this->user_id, get_store_id(), 'user')['value'];
  470. if ($user_pay_list_json) {
  471. $user_pay_list_arr = Json::decode($user_pay_list_json);
  472. if (!empty($pay_type_list_arr)) {
  473. foreach ($pay_type_list_arr as $key => &$value) {
  474. if (isset($user_pay_list_arr[$key]) && $user_pay_list_arr[$key]['value'] == 0 && $value['value'] == 1) {
  475. $value['value'] = 0;
  476. }
  477. }
  478. }
  479. }
  480. if (!isset($pay_type_list_arr)) {
  481. $pay_type_list_arr = [
  482. 'wechat'=> [
  483. 'text' => '微信支付',
  484. 'value' => 1
  485. ],
  486. 'alipay' => [
  487. 'text' => '支付宝支付',
  488. 'value' => 1
  489. ],
  490. 'huodao' => [
  491. 'text' => '货到付款',
  492. 'value' => 1
  493. ],
  494. 'friend' => [
  495. 'text' => '朋友代付',
  496. 'value' => 1,
  497. ],
  498. ];
  499. }
  500. foreach ($pay_type_list_arr as $index => $pay_type) {
  501. if ($index == 'friend' && $pay_type['value'] == 1) {
  502. $pay_type_list[] = [
  503. 'name' => '朋友代付',
  504. 'payment' => 7,
  505. ];
  506. $is_open_friend_pay = true;
  507. }
  508. if (!is_alipay_platform() && $index == 'wechat' && $pay_type['value'] == 1) {
  509. $pay_type_list[] = [
  510. 'name' => '微信支付',
  511. 'payment' => 1,
  512. ];
  513. }
  514. if ((is_alipay_platform() || is_h5()) && $index == 'alipay' && $pay_type['value'] == 1) {
  515. $pay_type_list[] = [
  516. 'name' => '支付宝支付',
  517. 'payment' => 4,
  518. ];
  519. }
  520. if (is_toutiao_platform()) {
  521. $pay_type_list[] = [
  522. 'name' => '线上支付',
  523. 'payment' => 5,
  524. ];
  525. }
  526. if ($index == 'huodao' && $pay_type['value'] == 1 && $order->pay_type != Order::PAY_TYPE_COD) {
  527. $pay_type_list[] = [
  528. 'name' => '货到付款',
  529. 'payment' => 2,
  530. ];
  531. }
  532. if ((is_app_platform() || is_wechat_platform()) && $index == Order::PAY_TYPE_KEY_ADAPAY_WX && $pay_type['value'] == 1) {
  533. $pay_type_list[] = [
  534. 'name' => Order::PAY_TYPE_NAME_ADAPAY_WX,
  535. 'payment' => Order::PAY_TYPE_ADAPAY_WX,
  536. ];
  537. }
  538. if ((is_wechat_platform()) && $index == Order::PAY_TYPE_KEY_WX_B2B && $pay_type['value'] == 1) {
  539. $pay_type_list[] = [
  540. 'name' => Order::PAY_TYPE_NAME_WX_B2B,
  541. 'payment' => Order::PAY_TYPE_WX_B2B,
  542. ];
  543. }
  544. if ((is_app_platform() || is_alipay_platform()) && $index == Order::PAY_TYPE_KEY_ADAPAY_ALIPAY && $pay_type['value'] == 1) {
  545. $pay_type_list[] = [
  546. 'name' => Order::PAY_TYPE_NAME_ADAPAY_ALIPAY,
  547. 'payment' => Order::PAY_TYPE_ADAPAY_ALIPAY,
  548. ];
  549. }
  550. if ($index == Order::PAY_TYPE_KEY_ADAPAY_QUICKPAY_FRONTPAY && $pay_type['value'] == 1) {
  551. $pay_type_list[] = [
  552. 'name' => Order::PAY_TYPE_NAME_ADAPAY_QUICKPAY_FRONTPAY,
  553. 'payment' => Order::PAY_TYPE_ADAPAY_QUICKPAY_FRONTPAY,
  554. ];
  555. }
  556. if ((is_wechat_platform()) && $index == Order::PAY_TYPE_KEY_HUIFU_V2_JSPAY_WX && $pay_type['value'] == 1) {
  557. $pay_type_list[] = [
  558. 'name' => Order::PAY_TYPE_NAME_HUIFU_V2_JSPAY_WX,
  559. 'payment' => Order::PAY_TYPE_HUIFU_V2_JSPAY_WX,
  560. ];
  561. }
  562. if ($index == Order::PAY_TYPE_KEY_ALLINPAY_WX && $pay_type['value'] == 1) {
  563. $pay_type_list[] = [
  564. 'name' => Order::PAY_TYPE_NAME_ALLINPAY_WX,
  565. 'payment' => Order::PAY_TYPE_ALLINPAY_WX,
  566. ];
  567. }
  568. if ($index == Order::PAY_TYPE_KEY_OFFLINE && $pay_type['value'] == 1) {
  569. $pay_type_list[] = [
  570. 'name' => Order::PAY_TYPE_NAME_OFFLINE,
  571. 'payment' => Order::PAY_TYPE_OFFLINE,
  572. ];
  573. }
  574. if ($index == Order::PAY_TYPE_KEY_MONTH && $pay_type['value'] == 1) {
  575. $pay_type_list[] = [
  576. 'name' => Order::PAY_TYPE_NAME_MONTH,
  577. 'payment' => Order::PAY_TYPE_MONTH,
  578. ];
  579. }
  580. }
  581. }
  582. // 判断是否开启好友代付
  583. if ($order->food_flag_id > 0) {
  584. if ($order->md_id > 0) {
  585. $md = Md::findOne($order->md_id);
  586. $food_payment = $md->food_payment;
  587. } else if($order['mch_id'] > 0){
  588. $mchModel = Mch::findOne($order['mch_id']);
  589. $food_payment = $mchModel->food_payment;
  590. } else {
  591. $store = Store::findOne($order->store_id);
  592. $food_payment = $store->food_payment;
  593. }
  594. if (!empty($food_payment)) {
  595. $pay_type_list = [];
  596. $food_pay_type = Json::decode($food_payment);
  597. foreach ($food_pay_type as &$value) {
  598. if ($value['key'] == 'friend') {
  599. $value['payment'] = 7;
  600. if(!$value['name']){
  601. $value['name'] = "朋友代付";
  602. }
  603. }
  604. if ($value['key'] == 'alipay') {
  605. $value['payment'] = 4;
  606. if(!$value['name']){
  607. $value['name'] = "支付宝支付";
  608. }
  609. }
  610. if ($value['key'] == 'wechat') {
  611. $value['payment'] = 1;
  612. if(!$value['name']){
  613. $value['name'] = "微信支付";
  614. }
  615. }
  616. if ($value['key'] == 'huodao') {
  617. $value['payment'] = 2;
  618. if(!$value['name']){
  619. $value['name'] = "货到付款";
  620. }
  621. }
  622. }
  623. foreach ($food_pay_type as $k => $val) {
  624. if ($val['payment'] == 4 && is_wechat_platform() || ($val['payment'] == 4 && intval($val['value']) === 0)) {
  625. unset($food_pay_type[$k]);
  626. }
  627. if ($val['payment'] == 1 && is_alipay_platform() || ($val['payment'] == 1 && intval($val['value']) === 0)) {
  628. unset($food_pay_type[$k]);
  629. }
  630. if ($val['payment'] == 7 && intval($val['value']) === 0) {
  631. unset($food_pay_type[$k]);
  632. }
  633. if ($val['payment'] == 2 && intval($val['value']) === 0) {
  634. unset($food_pay_type[$k]);
  635. }
  636. if ($val['payment'] == 5 && intval($val['value']) === 0) {
  637. unset($food_pay_type[$k]);
  638. }
  639. }
  640. $food_pay_type = array_values($food_pay_type);
  641. $final_pay_type = $food_pay_type;
  642. }
  643. } else {
  644. $final_pay_type = $pay_type_list;
  645. }
  646. // 订单人信息
  647. $user = User::findOne($order->user_id);
  648. $user_info = [
  649. 'name' => $user->nickname,
  650. 'avatar' => $user->avatar_url
  651. ];
  652. if($user->binding){
  653. $saas_user = SaasUser::findOne(['mobile' => $user->binding]);
  654. }else{
  655. if($user->alipay_open_id){
  656. $saas_user = SaasUser::findOne(['ali_user_id' => $user->alipay_open_id]);
  657. }
  658. }
  659. if($saas_user){
  660. $user_info = [
  661. 'name' => $saas_user->name,
  662. 'avatar' => $saas_user->avatar
  663. ];
  664. }
  665. // 代付人信息
  666. $pay_user_info = [];
  667. if ($order->pay_user_id > 0) {
  668. $pay_saas_user = SaasUser::findOne(['mobile' => User::findOne($order->pay_user_id)->binding]);
  669. $pay_user_info = [
  670. 'name' => $pay_saas_user->name,
  671. 'mobile' => $pay_saas_user->mobile
  672. ];
  673. }
  674. // 门店信息
  675. $md_info = [];
  676. if ($order->md_id > 0) {
  677. $md = Md::findOne($order->md_id);
  678. $md_info = [
  679. 'name' => $md->name,
  680. 'address' => District::findOne($md->province)->name . District::findOne($md->city)->name
  681. . District::findOne($md->district)->name . $md->address,
  682. 'latitude' => $md->latitude,
  683. 'longitude' => $md->longitude,
  684. 'mobile' => $md->mobile,
  685. 'distance' => Tools::getDistance($md->latitude, $md->longitude, get_params('latitude'), get_params('longitude'))
  686. ];
  687. }else if ($order->mch_id > 0) {
  688. $mchInfo = (new \app\modules\admin\models\MchForm(['mch_id' => $order->mch_id, 'lat' => get_params('latitude'), 'lng' => get_params('longitude')]))->mchInfo();
  689. $md_info = [
  690. 'name' => $mchInfo['data']->name,
  691. 'address' => District::findOne($mchInfo['data']->province_id)->name . District::findOne($mchInfo['data']->city_id)->name
  692. . District::findOne($mchInfo['data']->district_id)->name . $mchInfo['data']->address,
  693. 'latitude' => $mchInfo['data']->latitude,
  694. 'longitude' => $mchInfo['data']->longitude,
  695. 'mobile' => $mchInfo['data']->tel,
  696. 'distance' => $mchInfo['dis'],
  697. ];
  698. } else {
  699. $store = Store::findOne($order->store_id);
  700. $province_name = District::findOne($store->province_id)->name;
  701. $city_name = District::findOne($store->city_id)->name;
  702. $district_name = District::findOne($store->district_id)->name;
  703. $lat = '';
  704. $long = '';
  705. $coordinate = explode(',', $store->coordinate);
  706. if ($coordinate) {
  707. $lat = $coordinate[0];
  708. $long = $coordinate[1];
  709. }
  710. $md_info = [
  711. 'name' => $store->name,
  712. 'address' => $province_name .$city_name
  713. . $district_name . $store->address,
  714. 'latitude' => $lat,
  715. 'longitude' => $long,
  716. 'mobile' => $store->contact_tel,
  717. 'distance' => Tools::getDistance($lat, $long, get_params('latitude'), get_params('longitude'))
  718. ];
  719. }
  720. $food_num = null;
  721. $food_type = 0;
  722. if (!empty($order->food_flag_id)) {
  723. $FoodFlag = FoodFlag::findOne($order->food_flag_id);
  724. $FoodNum = FoodTableNumber::findOne($FoodFlag->table_num);
  725. $food_num = $FoodNum->num;
  726. $food_type = $FoodFlag->type;
  727. }
  728. $LevelOrderPrice = 0;
  729. if ($order->level_order_id) {
  730. $LevelOrder = LevelOrder::findOne($order->level_order_id);
  731. $LevelOrderPrice = $LevelOrder->pay_price;
  732. }
  733. $diy_shop_name = Option::get(OptionSetting::DIY_SHOP_NAME, get_store_id(), 'pay', Option::get(OptionSetting::DIY_SHOP_NAME, get_store_id(), 'store', '自提配送')['value'] ?: '自提配送')['value'];
  734. $diy_express_name = Option::get(OptionSetting::DIY_EXPRESS_NAME, get_store_id(), 'pay', Option::get(OptionSetting::DIY_EXPRESS_NAME, get_store_id(), 'store', '快递配送')['value'] ?: '快递配送')['value'];
  735. $diy_delivery_name = Option::get(OptionSetting::DIY_DELIVERY_NAME, get_store_id(), 'pay', Option::get(OptionSetting::DIY_DELIVERY_NAME, get_store_id(), 'store', '同城配送')['value'] ?: '同城配送')['value'];
  736. $allinpayConf = \app\utils\Allinpay\Allinpay::conf($this->store_id);
  737. $allinpay_app_wx_mini_id_type = $allinpayConf['app_wx_gh_id_type'];
  738. $allinpay_app_wx_mini_id = $allinpayConf['app_wx_gh_id'];
  739. $adapayConf = \app\utils\Adapay\Adapay::conf($this->store_id);
  740. //小程序版本 0-正式版; 1-测试版; 2-体验版
  741. $app_wx_mini_id_type = $adapayConf['app_wx_gh_id_type'];
  742. //微信开放平台 --- 绑定的微信小程序的 --- 原始id
  743. $app_wx_mini_id = $adapayConf['app_wx_gh_id'];
  744. $app_alipay_mini_id = $adapayConf['app_alipay_mini_id'];
  745. $app_user_code = 'app_user_code_' . md5(microtime(true));
  746. cache()->set($app_user_code, $this->user_id, 60 * 3);
  747. ($order->pay_type == Order::PAY_TYPE_OFFLINE) && $payOffLine = \app\models\OrderPayOffline::getPayByOrderId($order->store_id, $order->id);
  748. $tencent_map_key = Option::get('tencent_map_key', 0, 'saas', '')['value'];
  749. if ($this->store_id > 0) {
  750. $tencent_map_key = Option::get(OptionSetting::TENCENT_MAP_KEY, $this->store_id, 'pay', Option::get(OptionSetting::TENCENT_MAP_KEY, $this->store_id, 'store', '')['value'] ?: $tencent_map_key)['value'];
  751. }
  752. $orderTransit = OrderTransit::findOne(['order_id' => $order->id, 'is_delete' => 0]);
  753. if($orderTransit){
  754. $supplierStbz = \app\models\Supplier::findOne(['cloud_supplier_id' => $orderTransit->cloud_supplier_id, 'is_stbz' => 1]);
  755. }
  756. if($orderTransit && $supplierStbz){
  757. $token = get_merchant_token(0, $order->store_id);
  758. $stbzRrfund = (new \app\modules\alliance\models\purchase\order\OrderListForm)->stbzRrfundOrderHandle($token, $orderTransit->cloud_order_id, 1);
  759. }
  760. $hideBtn = self::hideBtn($order);
  761. return [
  762. 'code' => 0,
  763. 'msg' => 'success',
  764. 'template_id' => NoticeAction::getSendTamplateId(['order_cancel', 'order_send'], is_h5() ? 'wxaapi' : 'miapp'),
  765. 'stbzRrfund' => $stbzRrfund,
  766. 'data' => [
  767. 'order' => $order,
  768. 'hideBtn' => $hideBtn,
  769. 'givingGiftsOrderData' => \app\modules\admin\models\givingGifts\GivingGiftsForm::givingGiftsOrderData($order),
  770. 'payOffLine' => $payOffLine ?? [],
  771. 'app_user_code' => $app_user_code,
  772. 'allinpay_app_wx_mini_id' => $allinpay_app_wx_mini_id,
  773. 'allinpay_app_wx_mini_id_type' => $allinpay_app_wx_mini_id_type,
  774. 'app_wx_mini_id' => $app_wx_mini_id,
  775. 'app_wx_mini_id_type' => $app_wx_mini_id_type,
  776. 'app_alipay_mini_id' => $app_alipay_mini_id,
  777. 'activity_cut_price_order_id' => $order->activity_cut_price_order_id,
  778. 'alipay_activity_voucher' => AlipayAcitvityVoucherOrder::getByOrder($order->alipay_trade_no),
  779. 'verify_card' => $cards ?? [],
  780. 'coupon_card' => $coupon_cards,
  781. 'shop_name' => $order->md_id > 0 || !empty($md_info['name']) ? $md_info['name'] : '平台自营',
  782. 'pay_user_info' => $pay_user_info,
  783. 'pay_user_id' => $order->pay_user_id,
  784. 'pay_type_list' => $final_pay_type,
  785. 'pay_type_list_default' => Option::get(OptionSetting::STORE_PAYMENT_DEFAULT, $order->store_id, 'pay', Option::get(OptionSetting::STORE_PAYMENT_DEFAULT, $order->store_id, 'store')['value'])['value'],
  786. 'is_delivery' => $order->is_delivery,
  787. 'express_detail' => $express_detail ?? [],
  788. 'order_id' => $order->id,
  789. 'is_pay' => $order->is_pay,
  790. 'status' => $status,
  791. 'express' => $order->express,
  792. 'express_no' => $order->express_no,
  793. 'name' => $order->name,
  794. 'mobile' => $order->mobile,
  795. 'address' => $order->address,
  796. 'order_no' => $order->order_no,
  797. 'rand_discount' => $order->rand_discount,
  798. 'level_diff_price' => $order->level_diff_price,
  799. 'addtime' => date('Y-m-d H:i:s', $order->created_at),
  800. 'total_price' => doubleval(sprintf('%.2f', $order->total_price)),
  801. 'express_price' => doubleval(sprintf('%.2f', $order->express_price)),
  802. 'tax_price' => doubleval(sprintf('%.2f', $order->tax_price)),
  803. 'invoice' => \app\models\OrderInvoice::findOne(['order_id' => $order['id'], 'is_delete' => 0]),
  804. 'goods_total_price' => doubleval(sprintf('%.2f', $sum_goods_price)),
  805. 'coupon_sub_price' => $order->coupon_sub_price ?? 0,
  806. 'pay_price' => sprintf("%1.2f", $order->pay_price),
  807. 'num' => $num,
  808. 'level_card_price' => $LevelOrderPrice,
  809. 'md_info' => $md_info,
  810. 'goods_list' => $newList,
  811. 'is_offline' => $order->is_offline,
  812. 'diy_express_name' => intval($order->is_offline) === 1 ? $diy_shop_name : (intval($order->is_delivery) === 1 ? $diy_delivery_name : $diy_express_name),
  813. 'content' => $order->content ? $order->content : "",
  814. 'before_update' => $before_update,
  815. 'money' => $money,
  816. 'discount' => $order->discount,
  817. 'user_coupon_id' => $order->user_coupon_id,
  818. 'words' => $order->words,
  819. 'pay_type' => $order->pay_type,
  820. 'integral'=> json_decode($order->integral),
  821. 'apply_delete' => $order->apply_delete,
  822. 'trade_status' => $order->trade_status,
  823. 'type' => $order->type,
  824. 'order_type' => $order->order_type,
  825. 'book' => $book,
  826. 'book_man_info' => json_decode($order->book_info, true) ?? [],
  827. 'book_info' => OrderForm::findAll(['order_id' => $order->id]),
  828. 'cancel_reason' => Delivery::$validReason,
  829. 'delivery_info' => $deliveryInfo,
  830. 'delivery_keloop' => $deliveryKeloop,
  831. 'keloopOrderInfo' => $keloopOrderInfo,
  832. 'flag_id' => $order->food_flag_id,
  833. 'food_code' => $order->food_code,
  834. 'food_num' => $food_num,
  835. 'food_type' => $food_type,
  836. 'food_book_ext' => $order->food_book_ext ? Json::decode($order->food_book_ext) : [],
  837. 'open_friend_pay' => intval($is_open_friend_pay),
  838. 'user_info' => $user_info,
  839. 'integral_price' => $order->integral_price,
  840. 'balance' => $order->balance,
  841. 'is_can_confirm' => $is_can_confirm,
  842. 'tencent_map_key' => $tencent_map_key,
  843. //20240816订单详情增加联盟券显示
  844. 'take_price' => $order->take_price,
  845. 'send_price' => $order->send_price,
  846. 'integral_appreciation_price' => $order->integral_appreciation_price
  847. ],
  848. ];
  849. }
  850. public static function hideBtn($order) {
  851. $hide = [
  852. 'hideBtnCancel' => 0,
  853. 'hideBtnRefund' => 0,
  854. ];
  855. $LocalPublicRankingTask = \app\models\LocalPublicRankingTask::findOne(['order_id' => $order['id']]);
  856. if($LocalPublicRankingTask){
  857. $hide['hideBtnCancel'] = 1;
  858. $hide['hideBtnRefund'] = 1;
  859. }
  860. return $hide;
  861. }
  862. //点金计划订单详情
  863. public function goldplan($orderNo = '') {
  864. try{
  865. $order = Order::findOne([
  866. 'order_no' => $orderNo,
  867. ]);
  868. if(!$order){
  869. throw new \Exception('订单信息不存在');
  870. }
  871. $store = Store::findOne($order->store_id);
  872. $price = $order->pay_price;
  873. // $deliveryInfo = null;
  874. // if ($order->is_delivery == 1) {
  875. // $deliveryInfo = DeliveryInfo::find()->where(['order_no' => $order->order_no])->one();
  876. // $deliveryInfo && $price += $deliveryInfo->fee;
  877. // }
  878. return [
  879. 'code' => 0,
  880. 'msg' => 'ok',
  881. 'data' => [
  882. 'store' => [
  883. 'name' => $store->name,
  884. 'logo' => $store->logo,
  885. ],
  886. 'order' => [
  887. 'order_no_last' => substr($orderNo, -4),
  888. 'is_pay' => $order->is_pay,
  889. 'pay_price' => sprintf('%.2f', $price),
  890. ],
  891. ],
  892. ];
  893. } catch (\Exception $ex) {
  894. \Yii::error($ex);
  895. return [
  896. 'code' => 1,
  897. 'msg' => '系统错误,' . $ex->getMessage(),
  898. ];
  899. }
  900. }
  901. /**
  902. * @description: 地图-导航收货人地址
  903. * @return Array
  904. */
  905. public function map(): array {
  906. $order = Order::findOne([
  907. 'store_id' => $this->store_id,
  908. 'id' => $this->order_id,
  909. 'is_delete' => 0,
  910. 'is_recycle' => 0,
  911. ]);
  912. if (!$order) {
  913. return [
  914. 'code' => 1,
  915. 'msg' => '订单不存在',
  916. ];
  917. }
  918. $tencent_map_key = Option::get('tencent_map_key', 0, 'saas', '')['value'];
  919. if ($this->store_id > 0) {
  920. $tencent_map_key = Option::get(OptionSetting::TENCENT_MAP_KEY, $this->store_id, 'pay', Option::get(OptionSetting::TENCENT_MAP_KEY, $this->store_id, 'store', '')['value'] ?: $tencent_map_key)['value'];
  921. }
  922. $url = 'https://apis.map.qq.com/ws/geocoder/v1/?';
  923. $params = [
  924. 'key' => $tencent_map_key,
  925. 'address' => $order->address,
  926. ];
  927. $url .= http_build_query($params);
  928. $json = file_get_contents($url);
  929. $result = json_decode($json, true);
  930. if ($result['status'] == 0) {
  931. $rider = [
  932. 'lat' => 0,
  933. 'lng' => 0,
  934. 'distance' => 0
  935. ];
  936. $deliveryInfo = DeliveryInfo::findOne(['order_no' => $order->order_no, 'is_delete' => 0]);
  937. if ($deliveryInfo) {
  938. if ($deliveryInfo['last_latitude'] > 0 && $deliveryInfo['last_longitude'] > 0) {
  939. $distance = Tools::getDistance($deliveryInfo['last_latitude'], $deliveryInfo['last_longitude'], $result['result']['location']['lat'], $result['result']['location']['lng']);
  940. $rider = [
  941. 'lat' => floatval($deliveryInfo['last_latitude']),
  942. 'lng' => floatval($deliveryInfo['last_longitude']),
  943. 'distance' => $distance
  944. ];
  945. }
  946. }
  947. $deliveryInfo = DeliveryKeloop::findOne(['order_no' => $order->order_no, 'is_delete' => 0]);
  948. if ($deliveryInfo && $order->trade_status == Order::ORDER_FLOW_SEND) {
  949. $getCourierTag = KeloopForm::getCourierTag($deliveryInfo->store_id, $deliveryInfo->trade_no);
  950. $rider['$getCourierTag'] = $getCourierTag;
  951. if (!$getCourierTag['code']) {
  952. $lng = $getCourierTag['data']['longitude'];
  953. $lat = $getCourierTag['data']['latitude'];
  954. $distance = Tools::getDistance($lat, $lng, $result['result']['location']['lat'], $result['result']['location']['lng']);
  955. $rider = [
  956. 'lat' => floatval($lat),
  957. 'lng' => floatval($lng),
  958. 'distance' => $distance
  959. ];
  960. }
  961. $keloopOrderInfo = KeloopForm::getOrderInfo($deliveryInfo->store_id, $deliveryInfo->trade_no);
  962. $rider['$keloopOrderInfo'] = $keloopOrderInfo;
  963. if(!$keloopOrderInfo['code']){
  964. if($keloopOrderInfo['data']['pre_deliver_times'] && $keloopOrderInfo['data']['status'] == KeloopForm::DELIVERY_STATUS_DELIVERING){
  965. $rider['distance'] .= ' -预计' . date('H时i分送达', $keloopOrderInfo['data']['pre_deliver_times']);
  966. }
  967. }
  968. }
  969. return [
  970. 'code' => 0,
  971. 'msg' => 'success',
  972. 'data' => [
  973. 'location' => $result['result']['location'],
  974. 'title' => $result['result']['title'],
  975. 'rider' => $rider,
  976. 'tencent_map_key' => $tencent_map_key
  977. ]
  978. ];
  979. } else {
  980. return [
  981. 'code' => 0,
  982. 'msg' => 'error',
  983. 'data' => $result['message']
  984. ];
  985. }
  986. }
  987. }