WeightBaseController.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. <?php
  2. namespace App\Http\Controllers\api\thirdPart\weight;
  3. use App\Events\WeighedEvent;
  4. use App\Jobs\WeightUpdateInstantBill;
  5. use App\MeasuringMachine;
  6. use App\OracleActAllocationDetails;
  7. use App\OracleDOCOrderHeader;
  8. use App\OrderPackage;
  9. use App\Services\OrderService;
  10. use Carbon\Carbon;
  11. use Illuminate\Database\Eloquent\Builder;
  12. use Illuminate\Http\Request;
  13. class WeightBaseController
  14. {
  15. protected $weight = ''; // 重量
  16. protected $length = ''; // 长
  17. protected $width = ''; // 宽
  18. protected $height = ''; // 高
  19. protected $code = ''; // 快递单号
  20. protected $weight_at = ''; // 称重时间
  21. protected $hid = ''; // 称重设备id
  22. protected $name = ''; // 名称
  23. public function new(Request $request)
  24. {
  25. $errors = $this->validator($request);
  26. if(count($errors)){
  27. return $this->validatorErrors($errors);
  28. }
  29. return $this->weightOrderPackage($request);
  30. }
  31. public function weightOrderPackage(Request $request)
  32. {
  33. /**
  34. * @var OrderPackage $orderPackage
  35. * @var MeasuringMachine $measuringMachine
  36. */
  37. // 1、转化数据
  38. $params = [];
  39. foreach ($request->input() as $key => $item) {
  40. $params[strtolower($key)] = $item;
  41. }
  42. // 2.获取快递单号
  43. $logistic_number = $this->getCode($params);
  44. // 3、获取称重设备
  45. $measuringMachine = $this->getMeasuringMachine($params);
  46. // 4、快递单号对应的OrderPackage
  47. $orderPackage = $this->getOrderPackageByCode($logistic_number);
  48. if (is_null($orderPackage)) {
  49. /** @var OracleDOCOrderHeader $orderHeader */
  50. $orderHeader = $this->findOrderHeaderByLogisticNumber($logistic_number);
  51. if (is_null($orderHeader)) {
  52. return $this->getNotFindOrderHeaderMessage($params, $orderPackage);
  53. }
  54. try {
  55. $order = $this->createOrderByOrderHeader($orderHeader);
  56. $orderPackage = $this->createOrderPackage($params, $measuringMachine, $order);
  57. } catch (\Exception $e) {
  58. return json_encode(["success" => false, "message" => "写入WAS失败!"], JSON_UNESCAPED_UNICODE);
  59. }
  60. }
  61. // 5、更新包裹信息
  62. $bool = $this->updateOrderPackage($orderPackage, $params, $measuringMachine);
  63. if (!$bool) return $this->getUpdatePackageMessage($orderPackage);
  64. // 6、处理波次信息
  65. try {
  66. $this->activityWaveNoProcessing($orderPackage);
  67. } catch (\Exception $e) {
  68. app('LogService')->log(__METHOD__, $this->name, ' weightApi (Error)', json_encode($orderPackage) . '||' . json_encode($e), null);
  69. return $this->getWeightMessage($orderPackage, $e);
  70. }
  71. // 7、称重完成之后操作
  72. $this->afterApply($orderPackage);
  73. $response = $this->getSuccessMessage($params, $orderPackage);
  74. app('LogService')->log(__METHOD__, $this->name, "下发写入包裹成功:" . json_encode($request->getContent()) . '||' . json_encode($response), null);
  75. return json_encode($response, JSON_UNESCAPED_UNICODE);
  76. }
  77. // region ---称重完成之后的操作
  78. // 后续操作
  79. public function afterApply(OrderPackage $orderPackage)
  80. {
  81. $orderPackage->loadMissing(['order' => function ($query) {
  82. $query->with('owner', 'logistic');
  83. }, 'measuringMachine', 'paperBox']);
  84. event(new WeighedEvent($orderPackage));
  85. dispatch(new WeightUpdateInstantBill($orderPackage));
  86. }
  87. // endregion
  88. // region ---消息返回
  89. // 返回称重成功信息
  90. public function getSuccessMessage($params, $orderPackage): array
  91. {
  92. return ['success' => true, 'message' => '称重成功'];
  93. }
  94. // 返回包裹未找到异常
  95. public function getNotFindOrderPackageMessage($params, $orderPackage): string
  96. {
  97. return json_encode(['success' => false, 'message' => '未找打包裹信息', JSON_UNESCAPED_UNICODE]);
  98. }
  99. // 返回富勒信息未找到异常
  100. public function getNotFindOrderHeaderMessage($params, $orderPackage): string
  101. {
  102. return json_encode(['success' => false, 'message' => '富勒信息未找到'], JSON_UNESCAPED_UNICODE);
  103. }
  104. // 返回称重下发错误
  105. public function getWeightMessage($orderPackage, $e)
  106. {
  107. return json_encode(['success' => false, 'message' => $e->getMessage], JSON_UNESCAPED_UNICODE);
  108. }
  109. public function getUpdatePackageMessage($orderPackage)
  110. {
  111. return json_encode(['success' => false, 'message' => '更新包裹信息出现异常'], JSON_UNESCAPED_UNICODE);
  112. }
  113. // endregion
  114. // region ---参数校验
  115. public function validator(Request $request): array
  116. {
  117. return [];
  118. }
  119. public function validatorErrors($errors)
  120. {
  121. return json_encode(['success' => false, 'message' => '更新包裹信息出现异常'.json_encode($errors)],JSON_UNESCAPED_UNICODE);
  122. }
  123. // endregion
  124. // region ---参数获取
  125. // 重量
  126. public function getWeight($params)
  127. {
  128. return $this->getValue($this->width, $params);
  129. }
  130. // 高
  131. public function getHeight($params)
  132. {
  133. return $this->getValue($this->height, $params);
  134. }
  135. // 长
  136. public function getLength($params)
  137. {
  138. return $this->getValue($this->length, $params);
  139. }
  140. // 宽
  141. public function getWidth($params)
  142. {
  143. return $this->getValue($this->width, $params);
  144. }
  145. // 快递单号
  146. public function getCode($params)
  147. {
  148. return $this->getValue($this->code, $params);
  149. }
  150. // 称重时间
  151. public function getWeightAt($params)
  152. {
  153. return $this->getValue($this->weight_at, $params);
  154. }
  155. // 获取参数
  156. public function getValue($name, $param)
  157. {
  158. $names = explode(',', $name);
  159. $value = array_reduce($names, function ($data, $key) {
  160. if (isset($data[$key])) $data = $data[$key];
  161. else $data = [];
  162. return $data;
  163. }, $param);
  164. if (is_array($value) && count($value) == 0) return null;
  165. return $value;
  166. }
  167. // 排序参数
  168. public function getEdges($params): array
  169. {
  170. $length = $this->getLength($params);
  171. $height = $this->getHeight($params);
  172. $width = $this->getWidth($params);
  173. $edges = [$length ?? 0, $width ?? 0, $height ?? 0];
  174. rsort($edges);
  175. return $edges;
  176. }
  177. // endregion
  178. // region ---包裹
  179. // 获取包裹
  180. public function getOrderPackageByCode($code)
  181. {
  182. return OrderPackage::query()
  183. ->with(['order' => function ($query) {
  184. /** @var Builder $query */
  185. $query->with('owner', 'logistic');
  186. }])->where('logistic_number', $code)->first();
  187. }
  188. // 更新包裹
  189. public function updateOrderPackage(OrderPackage $orderPackage, $params, $measuringMachine)
  190. {
  191. $edges = $this->getEdges($params);
  192. $req_date = Carbon::now();
  193. $orderPackage->weight = $params['weight'];
  194. $orderPackage->measuring_machine_id = $measuringMachine->id;
  195. $orderPackage->length = $edges[0];
  196. $orderPackage->width = $edges[1];
  197. $orderPackage->height = $edges[2];
  198. $orderPackage->weighed_at = $req_date;
  199. $orderPackage->bulk = $edges[0] * $edges[1] * $edges[2] / 1000;
  200. if ($orderPackage->isActivityBatch()) {
  201. $result = $this->activityWaveNoProcessing($orderPackage);
  202. if (!$result) return false;
  203. }
  204. return $orderPackage->save();
  205. }
  206. // 创建包裹信息
  207. public function createOrderPackage($params, $measuringMachine, $order)
  208. {
  209. $weighed_at = Carbon::now();
  210. $edges = $this->getEdges($params);
  211. OrderPackage::query()->create([
  212. 'order_id' => $order->id,
  213. 'logistic_number' => $this->getCode($params),
  214. 'measuring_machine_id' => $measuringMachine->id,
  215. 'weight' => $this->getWeight($params),
  216. 'length' => $edges[0],
  217. 'width' => $edges[1],
  218. 'height' => $edges[2],
  219. 'bulk' => $edges[0] * $edges[1] * $edges[2],
  220. 'weighed_at' => $weighed_at,
  221. 'status' => "无",
  222. ]);
  223. return $this->getOrderPackageByCode($this->getCode($params));
  224. }
  225. // endregion
  226. // region ---称重设备
  227. // 获取称重设备
  228. public function getMeasuringMachine($params): MeasuringMachine
  229. {
  230. $hid = $this->getValue($this->hid, $params);
  231. /** @var MeasuringMachine $measuringMachine */
  232. $measuringMachine = MeasuringMachine::query()->firstOrCreate(['code' => $hid]); // 称重设备
  233. $measuringMachine->turnOn();
  234. $measuringMachine->turnOffInMinutes(30);
  235. return $measuringMachine;
  236. }
  237. // endregion
  238. // region ---wms操作
  239. // 获取orderHeader
  240. public function findOrderHeaderByLogisticNumber($code)
  241. {
  242. $query = OracleActAllocationDetails::query()->select('order_no')->where('picktotraceid', $code);
  243. return OracleDOCOrderHeader::query()->with('actAllocationDetails', 'oracleBASCode')->whereIn('Order_No', $query)->first();
  244. }
  245. // 根据WMS订单信息创建订单信息
  246. public function createOrderByOrderHeader($orderHeader)
  247. {
  248. /** @var OrderService $orderService */
  249. $orderService = app('OrderService');
  250. $order_create_params = $orderService->getParamByOrderHeader($orderHeader);
  251. $order = $orderService->first(['code' => $orderHeader->orderno]);
  252. if ($order) return $order;
  253. $order = $orderService->createOrder($order_create_params);
  254. app('LogService')->log(__METHOD__, $this->name, ' 创建Order', json_encode($order) . " || " . $orderHeader);
  255. return $order;
  256. }
  257. //处理活动波次
  258. public function activityWaveNoProcessing(&$orderPackage)
  259. {
  260. $fluxController = new \App\Http\Controllers\api\thirdPart\flux\PackageController();
  261. if ($orderPackage->isActivityBatch()) {
  262. app('LogService')->log(__METHOD__, $this->name . " 依波次号同步所有包裹:", json_encode($orderPackage), null);
  263. OrderPackage::query()->where('batch_number', $orderPackage['batch_number'])->update([
  264. 'weight' => $orderPackage['weight'] ?? null,
  265. 'length' => $orderPackage['length'] ?? null,
  266. 'width' => $orderPackage['width'] ?? null,
  267. 'height' => $orderPackage['height'] ?? null,
  268. 'bulk' => $orderPackage['bulk'] ?? null,
  269. 'measuring_machine_id' => $orderPackage['measuring_machine_id'] ?? null,
  270. 'weighed_at' => $orderPackage['weighed_at'] ?? null,
  271. 'paper_box_id' => $orderPackage['paper_box_id'] ?? null,
  272. ]);
  273. $result = $fluxController->markWMSOnBatch($orderPackage['batch_number'], $orderPackage['weight']);
  274. if (!$result['result']) {
  275. $orderPackage->uploaded_to_wms = "异常";
  276. }
  277. } else {
  278. app('LogService')->log(__METHOD__, $this->name . " 写入包裹至WMS:", json_encode($orderPackage), null);
  279. try {
  280. $result = $fluxController->accomplishToWMS($orderPackage);
  281. if ($result['result'] == 'false') $orderPackage->uploaded_to_wms = "是";
  282. else $orderPackage->uploaded_to_wms = "异常";
  283. } catch (\Exception $e) {
  284. $orderPackage->uploaded_to_wms = "否";
  285. }
  286. }
  287. return $orderPackage->save();
  288. }
  289. // endregion
  290. }