Order.php 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. <?php
  2. namespace app\shop\model\order;
  3. use app\common\model\order\Order as OrderModel;
  4. use app\common\library\helper;
  5. use app\common\enum\order\OrderTypeEnum;
  6. use app\common\service\message\MessageService;
  7. use app\common\service\order\OrderRefundService;
  8. use app\common\enum\order\OrderPayStatusEnum;
  9. use app\common\service\product\factory\ProductFactory;
  10. use app\common\model\plus\coupon\UserCoupon as UserCouponModel;
  11. use app\common\model\user\User as UserModel;
  12. use app\common\enum\settings\DeliveryTypeEnum;
  13. use app\shop\service\order\ExportService;
  14. use think\facade\Filesystem;
  15. use PhpOffice\PhpSpreadsheet\IOFactory;
  16. use app\common\model\settings\Express as ExpressModel;
  17. use app\common\service\order\OrderCompleteService;
  18. use app\common\model\order\OrderProduct as OrderProductModel;
  19. /**
  20. * 订单模型
  21. */
  22. class Order extends OrderModel
  23. {
  24. /**
  25. * 订单列表
  26. */
  27. public function getList($dataType, $data = null)
  28. {
  29. $model = $this;
  30. // 检索查询条件
  31. $model = $model->setWhere($model, $data);
  32. // 获取数据列表
  33. return $model->alias('order')->with(['product' => ['image', 'refund', 'last_refund'], 'user'])
  34. ->order(['order.create_time' => 'desc'])
  35. ->where($this->transferDataType($dataType))
  36. ->paginate($data);
  37. }
  38. /**
  39. * 获取订单总数
  40. */
  41. public function getCount($dataType, $data)
  42. {
  43. $model = $this;
  44. // 检索查询条件
  45. $model = $model->setWhere($model, $data);
  46. // 获取数据列表
  47. return $model->alias('order')
  48. ->where($this->transferDataType($dataType))
  49. ->count();
  50. }
  51. /**
  52. * 订单列表(全部)
  53. */
  54. public function getListAll($dataType, $query = [])
  55. {
  56. $where[] = ['order.is_delete','=',0];
  57. //搜索订单号
  58. if (!empty($query['order_no'])) {
  59. $where[] =['order.order_no','like','%'.trim($query['order_no']).'%'];
  60. }
  61. //搜索订单号
  62. if (!empty($query['user_no'])) {
  63. $userid = (new UserModel)->where('user_no', 'like','%'.trim($query['user_no']) .'%')->value('user_id');
  64. if (!empty($userid)) {
  65. $where[] =['order.user_id','=',$userid];
  66. }
  67. }
  68. //搜索时间段
  69. if (!empty($query['create_time'])) {
  70. $sta_time = strtotime($query['create_time'][0].' 00:00:00');
  71. $end_time = strtotime($query['create_time'][1].' 23:59:59');
  72. if ($query['is_time'] == 1) {
  73. $time = 'order.pay_time';
  74. }else{
  75. $time = 'order.create_time';
  76. }
  77. $where[] =[$time,'between',[$sta_time,$end_time]];
  78. }
  79. $field = 'order.order_no,order.create_time,order.pay_time,order.express_price,
  80. order.express_price,order.express_no,order.delivery_type,order.buyer_remark,order.delivery_status,
  81. order.delivery_time,u.user_no,p.grade_product_price,p.product_price,p.product_name,p.total_num,p.total_price,
  82. add.name,add.phone,add.detail,r.name as province,re.name as city,reg.name as region,order.order_status,
  83. order.pay_status,order.delivery_status,order.receipt_status,exp.express_name,pro.product_no,p.pv,sku.product_no as sku_product_no,
  84. p.order_product_id';
  85. // 获取数据列表
  86. return (new OrderProductModel)->alias('p')
  87. ->join('order order','p.order_id = order.order_id')
  88. ->join('user u','u.user_id = order.user_id')
  89. ->join('order_address add','add.order_id = order.order_id')
  90. ->join('region r','r.id = add.province_id','left')
  91. ->join('region re','re.id = add.city_id','left')
  92. ->join('region reg','reg.id = add.region_id','left')
  93. ->join('product pro','pro.product_id = p.product_id')
  94. ->join('product_sku sku','sku.product_sku_id = p.product_sku_id','left')
  95. ->join('express exp','exp.express_id = order.express_id','left')
  96. ->field($field)
  97. ->where($this->transferDataType($dataType))
  98. ->where($where)
  99. ->order(['order.create_time' => 'desc'])
  100. ->select()->toArray();
  101. }
  102. /**
  103. * 订单导出
  104. */
  105. public function exportList($dataType, $query)
  106. {
  107. // 获取订单列表
  108. $list = $this->getListAll($dataType, $query);
  109. // 导出excel文件
  110. (new Exportservice)->orderList($list);
  111. }
  112. /**
  113. * 设置检索查询条件
  114. */
  115. private function setWhere($model, $data)
  116. {
  117. //搜索订单号
  118. if (isset($data['order_no']) && $data['order_no'] != '') {
  119. $model = $model->where('order.order_no', 'like', '%' . trim($data['order_no']) . '%');
  120. }
  121. //搜索订单号
  122. if (isset($data['user_no']) && $data['user_no'] != '') {
  123. $userid = (new UserModel)->where('user_no', 'like','%'.trim($data['user_no']) .'%')->column('user_id');
  124. if (!empty($userid)) {
  125. $model = $model->where('order.user_id', 'in', $userid);
  126. }
  127. }
  128. //搜索自提门店
  129. if (isset($data['store_id']) && $data['store_id'] != '') {
  130. $model = $model->where('order.extract_store_id', '=', $data['store_id']);
  131. }
  132. //搜索配送方式
  133. if (isset($data['style_id']) && $data['style_id'] != '') {
  134. $model = $model->where('order.delivery_type', '=', $data['style_id']);
  135. }
  136. //搜索时间段
  137. if (isset($data['create_time']) && $data['create_time'] != '') {
  138. $sta_time = array_shift($data['create_time']).'00:00:00';
  139. $end_time = array_pop($data['create_time']).'23:59:59';
  140. if ($data['is_time'] == 1) {
  141. $time = 'order.pay_time';
  142. }else{
  143. $time = 'order.create_time';
  144. }
  145. $model = $model->whereBetweenTime($time, $sta_time, $end_time);
  146. }
  147. return $model;
  148. }
  149. /**
  150. * 转义数据类型条件
  151. */
  152. private function transferDataType($dataType)
  153. {
  154. $filter = [];
  155. // 订单数据类型
  156. switch ($dataType) {
  157. case 'all':
  158. break;
  159. case 'payment';
  160. $filter['order.pay_status'] = OrderPayStatusEnum::PENDING;
  161. $filter['order.order_status'] = 10;
  162. break;
  163. case 'delivery';
  164. $filter['order.pay_status'] = OrderPayStatusEnum::SUCCESS;
  165. $filter['order.delivery_status'] = 10;
  166. $filter['order.order_status'] = 10;
  167. break;
  168. case 'received';
  169. $filter['order.pay_status'] = OrderPayStatusEnum::SUCCESS;
  170. $filter['order.delivery_status'] = 20;
  171. $filter['order.receipt_status'] = 10;
  172. $filter['order.order_status'] = 10;
  173. break;
  174. case 'cancel';
  175. $filter['order.pay_status'] = OrderPayStatusEnum::SUCCESS;
  176. $filter['order.delivery_status'] = 10;
  177. $filter['order.receipt_status'] = 10;
  178. $filter['order.order_status'] = 21;
  179. break;
  180. case 'comment';
  181. $filter['order.is_comment'] = 0;
  182. $filter['order.order_status'] = 30;
  183. break;
  184. case 'six';
  185. $filter['order.is_comment'] = 1;
  186. $filter['order.order_status'] = 30;
  187. break;
  188. }
  189. return $filter;
  190. }
  191. /**
  192. * 确认发货(单独订单)
  193. */
  194. public function delivery($data)
  195. {
  196. // 转义为订单列表
  197. $orderList = [$this];
  198. // 验证订单是否满足发货条件
  199. if (!$this->verifyDelivery($orderList)) {
  200. return false;
  201. }
  202. // 整理更新的数据
  203. $updateList = [[
  204. 'order_id' => $this['order_id'],
  205. 'express_id' => $data['express_id'],
  206. 'express_no' => $data['express_no']
  207. ]];
  208. // 更新订单发货状态
  209. if ($status = $this->updateToDelivery($updateList)) {
  210. // 获取已发货的订单
  211. $completed = self::detail($this['order_id'], ['user', 'address', 'product', 'express']);
  212. // 发送消息通知
  213. $this->sendDeliveryMessage([$completed]);
  214. }
  215. return $status;
  216. }
  217. /**
  218. * 确认发货后发送消息通知
  219. */
  220. private function sendDeliveryMessage($orderList)
  221. {
  222. // 实例化消息通知服务类
  223. $Service = new MessageService;
  224. foreach ($orderList as $item) {
  225. // 发送消息通知
  226. $Service->delivery($item, OrderTypeEnum::MASTER);
  227. }
  228. return true;
  229. }
  230. /**
  231. * 更新订单发货状态(批量)
  232. */
  233. private function updateToDelivery($orderList)
  234. {
  235. $data = [];
  236. foreach ($orderList as $item) {
  237. $data[] = [
  238. 'data' => [
  239. 'express_no' => $item['express_no'],
  240. 'express_id' => $item['express_id'],
  241. 'delivery_status' => 20,
  242. 'delivery_time' => time(),
  243. ],
  244. 'where' => [
  245. 'order_id' => $item['order_id']
  246. ],
  247. ];
  248. }
  249. return $this->updateAll($data);
  250. }
  251. /**
  252. * 验证订单是否满足发货条件
  253. */
  254. private function verifyDelivery($orderList)
  255. {
  256. foreach ($orderList as $order) {
  257. if (
  258. $order['pay_status']['value'] != 20
  259. || $order['delivery_type']['value'] != DeliveryTypeEnum::EXPRESS
  260. || $order['delivery_status']['value'] != 10
  261. || $order['order_status']['value'] != 10 //非进行中的订单不可发货
  262. ) {
  263. $this->error = "订单号[{$order['order_no']}] 不满足发货条件!";
  264. return false;
  265. }
  266. }
  267. return true;
  268. }
  269. /**
  270. * 修改订单价格
  271. */
  272. public function updatePrice($data)
  273. {
  274. if ($this['pay_status']['value'] != 10) {
  275. $this->error = '该订单不合法';
  276. return false;
  277. }
  278. if ($this['order_source'] != 10) {
  279. $this->error = '该订单不合法';
  280. return false;
  281. }
  282. // 实际付款金额
  283. $payPrice = bcadd($data['update_price'], $data['update_express_price'], 2);
  284. if ($payPrice <= 0) {
  285. $this->error = '订单实付款价格不能为0.00元';
  286. return false;
  287. }
  288. return $this->save([
  289. 'order_no' => $this->orderNo(), // 修改订单号, 否则微信支付提示重复
  290. 'order_price' => $data['update_price'],
  291. 'pay_price' => $payPrice,
  292. 'update_price' => helper::bcsub($data['update_price'], helper::bcsub($this['total_price'], $this['coupon_money'])),
  293. 'express_price' => $data['update_express_price']
  294. ]) !== false;
  295. }
  296. /**
  297. * 审核:用户取消订单
  298. */
  299. public function confirmCancel($data)
  300. {
  301. // 判断订单是否有效 无效情况 1未支付 或 2已发货
  302. if ($this['pay_status']['value'] != 20 || $this['delivery_status']['value'] != 10) {
  303. $this->error = '该订单不合法';
  304. return false;
  305. }
  306. // 订单取消事件
  307. return $this->transaction(function () use ($data) {
  308. if ($data['is_cancel'] == true) {
  309. // 执行退款操作
  310. (new OrderRefundService)->execute($this);
  311. // 回退商品库存
  312. ProductFactory::getFactory($this['order_source'])->backProductStock($this['product'], true);
  313. // 回退用户优惠券
  314. $this['coupon_id'] > 0 && UserCouponModel::setIsUse($this['coupon_id'], false);
  315. // 回退用户积分
  316. $user = UserModel::detail($this['user_id']);
  317. $describe = "订单取消:{$this['order_no']}";
  318. $this['points_num'] > 0 && $user->setIncPoints($this['points_num'], $describe);
  319. }
  320. // 更新订单状态
  321. return $this->save(['order_status' => $data['is_cancel'] ? 20 : 10]);
  322. });
  323. }
  324. /**
  325. * 获取已付款订单总数 (可指定某天)
  326. */
  327. public function getOrderData($startDate, $endDate, $type)
  328. {
  329. $model = $this;
  330. !is_null($startDate) && $model = $model->where('pay_time', '>=', strtotime($startDate));
  331. if (is_null($endDate)) {
  332. !is_null($startDate) && $model = $model->where('pay_time', '<', strtotime($startDate) + 86400);
  333. } else {
  334. $model = $model->where('pay_time', '<', strtotime($endDate) + 86400);
  335. }
  336. $model = $model->where('is_delete', '=', 0)
  337. ->where('pay_status', '=', 20)
  338. ->where('order_status', '<>', 20);
  339. if ($type == 'order_total') {
  340. // 订单数量
  341. return $model->count();
  342. } else if ($type == 'order_total_price') {
  343. // 订单总金额
  344. return $model->sum('pay_price');
  345. } else if ($type == 'order_user_total') {
  346. // 支付用户数
  347. return count($model->distinct(true)->column('user_id'));
  348. }
  349. return 0;
  350. }
  351. /**
  352. * 获取待处理订单
  353. */
  354. public function getReviewOrderTotal()
  355. {
  356. $filter['pay_status'] = OrderPayStatusEnum::SUCCESS;
  357. $filter['delivery_status'] = 10;
  358. $filter['order_status'] = 10;
  359. return $this->where($filter)->count();
  360. }
  361. /**
  362. * 获取某天的总销售额
  363. * 结束时间不传则查一天
  364. */
  365. public function getOrderTotalPrice($startDate = null, $endDate = null)
  366. {
  367. $model = $this;
  368. $model = $model->where('pay_time', '>=', strtotime($startDate));
  369. if (is_null($endDate)) {
  370. $model = $model->where('pay_time', '<', strtotime($startDate) + 86400);
  371. } else {
  372. $model = $model->where('pay_time', '<', strtotime($endDate) + 86400);
  373. }
  374. return $model->where('pay_status', '=', 20)
  375. ->where('order_status', '<>', 20)
  376. ->where('is_delete', '=', 0)
  377. ->sum('pay_price');
  378. }
  379. /**
  380. * 获取某天的客单价
  381. * 结束时间不传则查一天
  382. */
  383. public function getOrderPerPrice($startDate = null, $endDate = null)
  384. {
  385. $model = $this;
  386. $model = $model->where('pay_time', '>=', strtotime($startDate));
  387. if (is_null($endDate)) {
  388. $model = $model->where('pay_time', '<', strtotime($startDate) + 86400);
  389. } else {
  390. $model = $model->where('pay_time', '<', strtotime($endDate) + 86400);
  391. }
  392. return $model->where('pay_status', '=', 20)
  393. ->where('order_status', '<>', 20)
  394. ->where('is_delete', '=', 0)
  395. ->avg('pay_price');
  396. }
  397. /**
  398. * 获取某天的下单用户数
  399. */
  400. public function getPayOrderUserTotal($day)
  401. {
  402. $startTime = strtotime($day);
  403. $userIds = $this->distinct(true)
  404. ->where('pay_time', '>=', $startTime)
  405. ->where('pay_time', '<', $startTime + 86400)
  406. ->where('pay_status', '=', 20)
  407. ->where('is_delete', '=', 0)
  408. ->column('user_id');
  409. return count($userIds);
  410. }
  411. /**
  412. * 获取兑换记录
  413. * @param $param array
  414. * @return \think\Paginator
  415. */
  416. public function getExchange($param)
  417. {
  418. $model = $this;
  419. if (isset($param['order_status']) && $param['order_status'] > -1) {
  420. $model = $model->where('order.order_status', '=', $param['order_status']);
  421. }
  422. if (isset($param['nickName']) && !empty($param['nickName'])) {
  423. $model = $model->where('user.nickName', 'like', '%' . trim($param['nickName']) . '%');
  424. }
  425. return $model->with(['user'])->alias('order')
  426. ->join('user', 'user.user_id = order.user_id')
  427. ->where('order.order_source', '=', 20)
  428. ->where('order.is_delete', '=', 0)
  429. ->order(['order.create_time' => 'desc'])
  430. ->paginate($param);
  431. }
  432. // /**
  433. // * 批量发货
  434. // */
  435. // public function batchDelivery($file)
  436. // {
  437. // try {
  438. // /* 转码 */
  439. // $file = iconv("utf-8", "gb2312", $file);
  440. // if (empty($file) OR !file_exists($file)) {
  441. // $this->error = '文件不存在';
  442. // return false;
  443. // }
  444. // /** @var Xlsx $objRead */
  445. // $objRead = IOFactory::createReader('Xlsx');
  446. // if (!$objRead->canRead($file)) {
  447. // $objRead = IOFactory::createReader('Xls');
  448. // if (!$objRead->canRead($file)) {
  449. // $this->error = '只支持导入Excel文件!';
  450. // return false;
  451. // }
  452. // }
  453. // $file_size = $_FILES['iFile']['size'];
  454. // if ($file_size > 5 * 1024 * 1024) {
  455. // $this->error = '文件大小不能超过5M';
  456. // return false;
  457. // }
  458. // /* 建立excel对象 */
  459. // $objPHPExcel = $objRead->load($file);
  460. // $sheet = $objPHPExcel->getSheet(0); //excel中的第一张sheet
  461. // $highestRow = $sheet->getHighestRow(); // 取得总行数
  462. // $highestColumn = $sheet->getHighestColumn(); // 取得总列数
  463. // \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn);
  464. // $lines = $highestRow -1;
  465. // if($lines <= 0){
  466. // $this->error = 'excel表格,没有数据';
  467. // return false;
  468. // }
  469. // // if($lines > 1000){
  470. // // $this->error = '单次最多发货500个订单';
  471. // // return false;
  472. // // }
  473. // p($lines);
  474. // // 遍历并记录订单信息
  475. // for ($j = 2; $j <= $highestRow; $j++) {
  476. // $mobile = trim($objPHPExcel->getActiveSheet()->getCell('A' . $j)->getValue());
  477. // p($mobile);
  478. // }
  479. // if (count($list) > 0) {
  480. // $this->updateAll($list);
  481. // // 发送消息通知
  482. // $this->sendDeliveryMessage($orderList);
  483. // }
  484. // unlink($savePath);
  485. // return true;
  486. // } catch (\Exception $e) {
  487. // $this->error = $e->getMessage();
  488. // return false;
  489. // }
  490. // }
  491. /**
  492. * 批量发货
  493. */
  494. public function batchDelivery($fileInfo)
  495. {
  496. try {
  497. $saveName = Filesystem::disk('public')->putFile('', $fileInfo);
  498. $savePath = public_path() . "uploads/{$saveName}";
  499. //载入excel表格
  500. $inputFileType = IOFactory::identify($savePath); //传入Excel路径
  501. $reader = IOFactory::createReader($inputFileType);
  502. $PHPExcel = $reader->load($savePath);
  503. $sheet = $PHPExcel->getSheet(0); // 读取第一個工作表
  504. // 遍历并记录订单信息
  505. $list = [];
  506. $orderList = [];
  507. $sheet = $sheet->toArray();
  508. $orderNoLineMap = [];
  509. $updateOrderNo = [];
  510. $line = 1;
  511. foreach ($sheet as $key => $val) {
  512. if ($key > 0 && !is_null($val[0])) {
  513. $orderNumb = trim($val[0]);
  514. $orderNoLineMap[$orderNumb] = $line++;
  515. if ($val[1] && $val[2]) {
  516. // 查找发货公司是否存在
  517. $express = ExpressModel::findByName(trim($val[1]));
  518. $order = self::detail([
  519. 'order_no' => $orderNumb,
  520. 'order_status' => 10, 'delivery_status' => 10,//限制订单状态为进行中,发货状态为未发货
  521. ], ['user', 'address', 'product', 'express']);
  522. if ($express && $order) {
  523. $list[] = [
  524. 'data' => [
  525. 'express_no' => trim($val[2]),
  526. 'express_id' => $express['express_id'],
  527. 'delivery_status' => 20,
  528. 'delivery_time' => time(),
  529. ],
  530. 'where' => [
  531. 'order_id' => $order['order_id']
  532. ],
  533. ];
  534. array_push($orderList, $order);
  535. $updateOrderNo[] = $orderNumb;
  536. }
  537. }
  538. }
  539. if ($key > 0 && is_null($val[0])) {
  540. unset($sheet[$key]);
  541. }
  542. }
  543. unset($sheet[0]);//去掉表头
  544. if (count($list) > 500) {
  545. $this->error = '单次最多发货500个订单';
  546. return false;
  547. }
  548. if (count($list) > 0) {
  549. $this->updateAll($list);
  550. // 发送消息通知
  551. $this->sendDeliveryMessage($orderList);
  552. }
  553. unlink($savePath);
  554. if (count($sheet) != count($updateOrderNo)) {
  555. $orgOrderNo = array_column($sheet, 0);
  556. $updateOrderNo = array_flip($updateOrderNo);
  557. $info = [];
  558. foreach ($orgOrderNo as $orderNumber) {
  559. if (!isset($updateOrderNo[(int)$orderNumber])) {
  560. $info[] = '第' . ($orderNoLineMap[(int)$orderNumber] ?? 0) . '行,订单号:' . $orderNumber ;
  561. }
  562. }
  563. $info = '文件中' . implode(';', $info) . '订单状态有误,无法发货';
  564. $this->error = $info;
  565. return false;
  566. }
  567. return true;
  568. } catch (\Exception $e) {
  569. $this->error = $e->getMessage();
  570. return false;
  571. }
  572. }
  573. /**
  574. * 取消订单
  575. */
  576. public function orderCancel($data)
  577. {
  578. // 判断订单是否有效
  579. if ($this['delivery_status']['value'] == 20 || $this['order_status']['value'] != 10 || $this['pay_status']['value'] != 20) {
  580. $this->error = "订单不允许取消";
  581. return false;
  582. }
  583. // 订单取消事件
  584. return $this->transaction(function () use ($data) {
  585. // 执行退款操作
  586. (new OrderRefundService)->execute($this);
  587. // 回退商品库存
  588. ProductFactory::getFactory($this['order_source'])->backProductStock($this['product'], true);
  589. // 回退用户优惠券
  590. $this['coupon_id'] > 0 && UserCouponModel::setIsUse($this['coupon_id'], false);
  591. // 回退用户积分
  592. $user = UserModel::detail($this['user_id']);
  593. $describe = "订单取消:{$this['order_no']}";
  594. $this['points_num'] > 0 && $user->setIncPoints(-$this['points_num'], $describe);
  595. // 更新订单状态
  596. return $this->save(['order_status' => 20, 'cancel_remark' => $data['cancel_remark']]);
  597. });
  598. }
  599. /**
  600. * 确认发货(虚拟订单)
  601. * @param $extractClerkId
  602. * @return bool|mixed
  603. */
  604. public function virtual($data)
  605. {
  606. if (
  607. $this['pay_status']['value'] != 20
  608. || $this['delivery_type']['value'] != DeliveryTypeEnum::NO_EXPRESS
  609. || $this['delivery_status']['value'] == 20
  610. || in_array($this['order_status']['value'], [20, 21])
  611. ) {
  612. $this->error = '该订单不满足发货条件';
  613. return false;
  614. }
  615. return $this->transaction(function () use ($data) {
  616. // 更新订单状态:已发货、已收货
  617. $status = $this->save([
  618. 'delivery_status' => 20,
  619. 'delivery_time' => time(),
  620. 'receipt_status' => 20,
  621. 'receipt_time' => time(),
  622. 'order_status' => 30,
  623. 'virtual_content' => $data['virtual_content'],
  624. ]);
  625. // 执行订单完成后的操作
  626. $OrderCompleteService = new OrderCompleteService(OrderTypeEnum::MASTER);
  627. $OrderCompleteService->complete([$this], $this['app_id']);
  628. return $status;
  629. });
  630. }
  631. }