WeightBaseController.php 11 KB

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