FaceSheetOrderLogic.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php
  2. namespace app\adminapi\logic\express_assistant;
  3. use app\common\enum\DeliveryEnum;
  4. use app\common\enum\NoticeEnum;
  5. use app\common\enum\OrderEnum;
  6. use app\common\enum\OrderLogEnum;
  7. use app\common\enum\YesNoEnum;
  8. use app\common\logic\BaseLogic;
  9. use app\common\model\AddressLibrary;
  10. use app\common\model\Delivery;
  11. use app\common\model\Express;
  12. use app\common\model\FaceSheetSender;
  13. use app\common\model\FaceSheetTemplate;
  14. use app\common\model\Order;
  15. use app\common\model\OrderLog;
  16. use app\common\service\ConfigService;
  17. use app\common\service\express_assistant\Kuaidi100Service;
  18. use think\facade\Db;
  19. class FaceSheetOrderLogic extends BaseLogic
  20. {
  21. /**
  22. * @notes 打印电子面单
  23. * @param $params
  24. * @author Tab
  25. * @date 2021/11/22 17:07
  26. */
  27. public static function print($params)
  28. {
  29. $template = FaceSheetTemplate::findOrEmpty($params['template_id'])->toArray();
  30. $sender = FaceSheetSender::findOrEmpty($params['sender_id'])->toArray();
  31. $express = Express::findOrEmpty($template['express_id'])->toArray();
  32. foreach ($params['order_ids'] as $orderId) {
  33. $order = Order::with('orderGoods')->findOrEmpty($orderId)->toArray();
  34. $result = self::singlePrint($order, $template, $sender, $express, $params['admin_id']);
  35. if ($result !== true) {
  36. // 打印电子面单出错,中断打印
  37. self::$error = '订单' . $order['sn'] . '打印出错:' . $result;
  38. return false;
  39. }
  40. }
  41. return true;
  42. }
  43. /**
  44. * @notes 单条打印
  45. * @author Tab
  46. * @date 2021/11/22 17:09
  47. */
  48. public static function singlePrint($order, $template, $sender, $express, $adminId)
  49. {
  50. Db::startTrans();
  51. try {
  52. $goodsName = '';
  53. $totalWeight = 0;
  54. foreach($order['orderGoods'] as $item) {
  55. $totalWeight = round($item['goods_snap']->weight+$totalWeight,2);
  56. $goodsName .= $item['goods_snap']->goods_name . '(' . $item['goods_snap']->spec_value_str . $item['goods_num'] . '件)\n';
  57. }
  58. $type = ConfigService::get('face_sheet', 'type', '');
  59. if (empty($type)) {
  60. throw new \Exception('未设置面单类型');
  61. }
  62. $data = [
  63. 'order' => $order,
  64. 'template' => $template,
  65. 'sender' => $sender,
  66. 'express' => $express,
  67. 'totalWeight' => $totalWeight,
  68. 'remark' => $goodsName,
  69. ];
  70. // 打印电子面单
  71. $result = (new Kuaidi100Service((int)$type))->print($data);
  72. // 添加发货记录
  73. $delivery = self::addDelivery($result, $order, $express, $adminId);
  74. // 更新订单信息
  75. self::updateOrder($order, $delivery->id);
  76. //订单日志
  77. (new OrderLog())->record([
  78. 'type' => OrderLogEnum::TYPE_SHOP,
  79. 'channel' => OrderLogEnum::SHOP_DELIVERY_ORDER,
  80. 'order_id' => $order['id'],
  81. 'operator_id' => $adminId,
  82. ]);
  83. // 消息通知
  84. event('Notice', [
  85. 'scene_id' => NoticeEnum::ORDER_SHIP_NOTICE,
  86. 'params' => [
  87. 'user_id' => $order['user_id'],
  88. 'order_id' => $order['id'],
  89. 'express_name' => $express['name'],
  90. 'invoice_no' => $result['data']['kuaidinum'],
  91. 'ship_time' => date('Y-m-d H:i:s')
  92. ]
  93. ]);
  94. Db::commit();
  95. return true;
  96. } catch (\Exception $e) {
  97. Db::rollback();
  98. return $e->getMessage();
  99. }
  100. }
  101. /**
  102. * @notes 添加发货记录
  103. * @param $order
  104. * @param $template
  105. * @param $sender
  106. * @param $express
  107. * @param $adminId
  108. * @author Tab
  109. * @date 2021/11/23 9:55
  110. */
  111. public static function addDelivery($result, $order, $express, $adminId)
  112. {
  113. $deliveryAddressInfo = AddressLibrary::order(['is_deliver_default'=>'desc','id'=>'asc'])->append(['province','city','district'])->findOrEmpty()->toArray();
  114. $returnAddressInfo = AddressLibrary::order(['is_return_default'=>'desc','id'=>'asc'])->append(['province','city','district'])->findOrEmpty()->toArray();$orderGoodsInfo = [];
  115. foreach ($order['orderGoods'] as $value) {
  116. $orderGoodsInfo[] = [
  117. 'order_goods_id' => $value['id'],
  118. 'delivery_num' => $value['goods_num']
  119. ];
  120. }
  121. $deliveryData = [
  122. 'order_id' => $order['id'],
  123. 'order_sn' => $order['sn'],
  124. 'user_id' => $order['user_id'],
  125. 'admin_id' => $adminId,
  126. 'contact' => $order['address']->contact,
  127. 'mobile' => $order['address']->mobile,
  128. 'province' => $order['address']->province,
  129. 'city' => $order['address']->city,
  130. 'district' => $order['address']->district,
  131. 'address' => $order['address']->address,
  132. 'express_status' => YesNoEnum::YES,
  133. 'express_id' => $express['id'],
  134. 'express_name' => $express['name'],
  135. 'invoice_no' => $result['data']['kuaidinum'],
  136. 'send_type' => DeliveryEnum::EXPRESS_DELIVERY,
  137. 'remark' => '电子面单发货',
  138. 'order_goods_info' => json_encode($orderGoodsInfo),
  139. 'delivery_address_info' => json_encode($deliveryAddressInfo),
  140. 'return_address_info' => json_encode($returnAddressInfo),
  141. ];
  142. return Delivery::create($deliveryData);
  143. }
  144. /**
  145. * @notes 更新订单信息
  146. * @param $order
  147. * @param $deliveryId
  148. * @author Tab
  149. * @date 2021/11/23 10:11
  150. */
  151. public static function updateOrder($order, $deliveryId)
  152. {
  153. $order = Order::findOrEmpty($order['id']);
  154. $order->order_status = OrderEnum::STATUS_WAIT_RECEIVE;
  155. $order->express_status = DeliveryEnum::SHIPPED;
  156. $order->express_time = time();
  157. $order->delivery_id = $deliveryId;
  158. $order->save();
  159. }
  160. }