FaceSheetOrderLogic.php 5.3 KB

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