PackageController.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. <?php
  2. namespace App\Http\Controllers\Api\thirdPart\weight;
  3. use App\Events\WeighedEvent;
  4. use App\Http\Controllers\Controller;
  5. use App\Http\Controllers\LogisticNumberFeatureController;
  6. use App\Jobs\FetchPackageFromOracle;
  7. use App\Jobs\WeightUpdateInstantBill;
  8. use App\MeasuringMachine;
  9. use App\Order;
  10. use App\OrderPackage;
  11. use App\Services\OrderService;
  12. use App\Waybill;
  13. use Illuminate\Http\Request;
  14. use Illuminate\Support\Carbon;
  15. use Illuminate\Support\Facades\Validator;
  16. class PackageController extends Controller
  17. {
  18. // public function new_(Request $requestInitial){
  19. // $request=[];
  20. // foreach ($requestInitial->all() as $k=>$v){
  21. // $request[strtolower($k)]=$v;
  22. // }
  23. // $reqDate=isset($request['time'])?$request['time']:Carbon::now();
  24. // $errors=$this->validatorWeight($request)->errors();
  25. //
  26. // if (count($errors)>0){
  27. // app('LogService')->log(__METHOD__,'error'.__FUNCTION__,json_encode($request).'||'.json_encode($errors),null);
  28. // $response=["msg"=>$errors,"code"=>500,"data"=>null];
  29. // return json_encode($response);
  30. // }
  31. //
  32. // $measuringMachine=MeasuringMachine::where('code',$request['id'])->first();
  33. // if (!$measuringMachine){
  34. // $measuringMachine=new MeasuringMachine([
  35. // 'name'=>$request['id'],
  36. // 'code'=>$request['id'],
  37. // 'status'=>'在线'
  38. // ]);
  39. // $measuringMachine->save();
  40. // app('LogService')->log(__METHOD__,'weightApi(new measuring machine)'.__FUNCTION__,json_encode($request),null);
  41. // }else{
  42. // $measuringMachineStatus=new MeasuringMachine();
  43. // $measuringMachineStatus->changeStatus($measuringMachine);
  44. // }
  45. // MeasuringMachineQueue::dispatch($measuringMachine)->delay(Carbon::now()->addMinutes(30));
  46. //
  47. // $package=Package::where('logistic_number',$request['barcode'])->first();
  48. // if (isset($request['length'])&&isset($request['width'])&&isset($request['height'])){
  49. // $length=$request['length'];
  50. // $width=$request['width'];
  51. // $height=$request['height'];
  52. // $max=($length>=($width>=$height?$width:$height)?$length:($width>=$height?$width:$height));
  53. // if ($max==$length){
  54. // $centre=$width>=$height?$width:$height;
  55. // $min=$width<$height?$width:$height;
  56. // }elseif ($max==$width){
  57. // $centre=$length>=$height?$length:$height;
  58. // $min=$length<$height?$length:$height;
  59. // }else{
  60. // $centre=$width>=$length?$width:$length;
  61. // $min=$width<$length?$width:$length;
  62. // }
  63. // }else{
  64. // $max=0;$centre=0;$min=0;
  65. // }
  66. // $apiController=new \App\Http\Controllers\Api\thirdPart\flux\PackageController();
  67. // if ($package){
  68. // $packageController=new \App\Http\Controllers\PackageController();
  69. // $package->fetchPaperBox($max,$centre,$min,$package->owner_id);
  70. // //处理活动波次
  71. // if ($package->batch_rule&&strstr($package->batch_rule,'组合')){
  72. // $packageController->syncBatch($package->batch_number,$request['weight'],$max,$centre,$min,$reqDate,$package['paper_box_id']);
  73. // }else{
  74. // $package->measuring_machine_id=$measuringMachine->id;
  75. // $package->weight=$request['weight'];
  76. // $package->length=$max;
  77. // $package->width=$centre;
  78. // $package->height=$min;
  79. // $package->bulk=$max*$centre*$min;
  80. // $package->weighed_at=$reqDate;
  81. // $package->status="未上传";
  82. // app('LogService')->log(__METHOD__,'Batch_'.__FUNCTION__,json_encode($package),null);
  83. // $package->save();
  84. // $result=$apiController->accomplishToWMS($package);
  85. // if ($result['result']){
  86. // if ($package->status=="记录异常")$package->status="已上传异常";
  87. // else $package->status="已上传";
  88. // }else{
  89. // $package->status="上传异常";
  90. // }
  91. // $package->save();
  92. // }
  93. // if ($package->order_code){
  94. // $waybill=Waybill::where('wms_bill_number',$package->order_code)->where('status','!=','已完结')
  95. // ->where('status','!=','无模型')->first();
  96. // if ($waybill){
  97. // $waybill->warehouse_weight_other=$package->weight;
  98. // $waybill->warehouse_weight_unit_id_other=1;
  99. // $waybill->update();
  100. // }
  101. // }
  102. // event(new WeighedEvent($package));
  103. // $response=["msg"=>"保存成功",
  104. // "code"=>200,
  105. // "data"=>true,
  106. // "serverMsg"=>null,
  107. // "requestor"=>[
  108. // "requestor"=>"1",
  109. // "eventCode"=>"0",
  110. // "reqDate"=>$reqDate,
  111. // "resDate"=>Carbon::now()]
  112. // ];
  113. // app('LogService')->log(__METHOD__,'weightApi'.__FUNCTION__,json_encode($request).'|'.json_encode($response),null);
  114. // return json_encode($response,JSON_UNESCAPED_UNICODE);
  115. // }
  116. // if (!$package){
  117. // $logisticNumber=$request['barcode'];
  118. // $createPackage=new Package([
  119. // 'logistic_number'=>$logisticNumber,
  120. // 'delivery_number'=>$logisticNumber,
  121. // 'measuring_machine_id'=>$measuringMachine->id,
  122. // 'weight'=>$request['weight'],
  123. // 'length'=>$max,
  124. // 'width'=>$centre,
  125. // 'height'=>$min,
  126. // 'bulk'=>$max*$centre*$min,
  127. // 'weighed_at'=>$reqDate,
  128. // 'status'=>"未下发",
  129. // ]);
  130. // $createPackage->fetchAllFromOracle();
  131. // $createPackage->fetchPaperBox($max, $centre, $min);
  132. // $result=$apiController->accomplishToWMS($createPackage);
  133. // if(!$result['result']){
  134. // app('LogService')->log(__METHOD__,'weightApi'.__FUNCTION__,json_encode($request).'||'.json_encode($createPackage),null);
  135. // $response=["msg"=>"写入WMS失败!","code"=>500,"data"=>null];
  136. // return json_encode($response,JSON_UNESCAPED_UNICODE);
  137. // }
  138. // if ($createPackage->save()){
  139. // $measuringMachine->touch();
  140. // MeasuringMachineQueue::dispatch($measuringMachine)->delay(Carbon::now()->addMinutes(30));
  141. // MarkPackageExcepted::dispatch($createPackage)->delay(Carbon::now()->addMinutes(1440));
  142. // event(new WeighedEvent($createPackage));
  143. // $response=["msg"=>"保存成功",
  144. // "code"=>200,
  145. // "data"=>true,
  146. // "serverMsg"=>null,
  147. // "requestor"=>[
  148. // "requestor"=>"1",
  149. // "eventCode"=>"0",
  150. // "reqDate"=>$reqDate,
  151. // "resDate"=>Carbon::now()]
  152. // ];
  153. // app('LogService')->log(__METHOD__,'weightApi'.__FUNCTION__,json_encode($request).'||'.json_encode($response),null);
  154. // return json_encode($response,JSON_UNESCAPED_UNICODE);
  155. // }
  156. //
  157. // $response=["msg"=>"保存时发生错误(未下发)!","code"=>500,"data"=>null];
  158. // app('LogService')->log(__METHOD__,'weightApi(ERROR)'.__FUNCTION__,json_encode($request).'||'.json_encode($response),null);
  159. // return json_encode($response,JSON_UNESCAPED_UNICODE);
  160. // }
  161. // }
  162. public function new_(Request $requestInitial){
  163. $request=[];
  164. foreach ($requestInitial->all() as $k=>$v){
  165. $request[strtolower($k)]=$v;
  166. }
  167. // $reqDate=isset($request['time'])?$request['time']:Carbon::now();
  168. $reqDate=Carbon::now();
  169. $errors=$this->validatorWeight($request)->errors();
  170. if (count($errors)>0){
  171. app('LogService')->log(__METHOD__,'error'.__FUNCTION__,json_encode($request).'||'.json_encode($errors),null);
  172. return json_encode(["msg"=>$errors,"code"=>500,"data"=>null]);
  173. }
  174. $id = $request['id']??'无ID设备';
  175. $measuringMachine=MeasuringMachine::query()->firstOrCreate(['code'=> $id]);
  176. $measuringMachine->turnOn();
  177. $measuringMachine->turnOffInMinutes(30);
  178. /** @var OrderPackage $package */
  179. $package=OrderPackage::query()->where('logistic_number',$request['barcode'])->first();
  180. $edges=[$request['length']??0,$request['width']??0,$request['height']??0];
  181. rsort($edges);
  182. $fluxController=new \App\Http\Controllers\Api\thirdPart\flux\PackageController();
  183. if ($package){
  184. $package['measuring_machine_id']=$measuringMachine->id;
  185. $package['weight']=$request['weight'];
  186. $package['length']=$edges[0];
  187. $package['width']=$edges[1];
  188. $package['height']=$edges[2];
  189. $package['weighed_at']=$reqDate;
  190. $package->fetchAllFromOracle();
  191. $package->fetchPaperBox();
  192. $package['bulk']=$edges[0]*$edges[1]*$edges[2];
  193. if ($package->isActivityBatch()){//处理活动波次
  194. app('LogService')->log(__METHOD__,__FUNCTION__,"依波次号同步所有包裹:".json_encode($package),null);
  195. $package->unifyThisMeasureUnderSameBatch();
  196. $result=$fluxController->markWMSOnBatch($package['batch_number'], $request['weight']);
  197. if(!$result['result']){
  198. $package->uploaded_to_wms="异常";
  199. }
  200. }else{
  201. app('LogService')->log(__METHOD__,__FUNCTION__,"写入包裹至WMS:".json_encode($package),null);
  202. try{
  203. $result=$fluxController->accomplishToWMS($package);
  204. if ($result['result']){
  205. $package->uploaded_to_wms="是";
  206. }else{
  207. $package->uploaded_to_wms="异常";
  208. }
  209. }catch (\Exception $e){
  210. $package->uploaded_to_wms="否";
  211. }
  212. }
  213. try{
  214. $package->save();
  215. $package->load(['order'=>function($query){
  216. $query->with('owner','logistic');
  217. },'paperBox','measuringMachine']);
  218. $logisticNumberController = new LogisticNumberFeatureController();
  219. if (!$package->order){
  220. $package->order = new Order();
  221. $logistic=$logisticNumberController->getLogisticByFeatures($package->logistic_number);
  222. $package->order->logistic = $logistic;
  223. }else{
  224. if(!$package->order->logistic){
  225. $logistic=$logisticNumberController->getLogisticByFeatures($package->logistic_number);
  226. $package->order->logistic_id = $logistic['id'];
  227. $package->order->save();
  228. }
  229. }
  230. }catch (\Exception $e){
  231. $response=["msg"=>"称重下发修改时发生错误!".json_encode($e),"code"=>500,"data"=>null];
  232. app('LogService')->log(__METHOD__,'weightApi(ERROR)'.__FUNCTION__,json_encode($request).'||'.json_encode($response).'||'.json_encode($e),null);
  233. return json_encode($response,JSON_UNESCAPED_UNICODE);
  234. }
  235. }
  236. if (!$package){
  237. $logisticNumber=$request['barcode'];
  238. /** @var $orderService OrderService */
  239. $orderService = app('OrderService');
  240. $order = $orderService->logisticNumberFirstOrCreateOrder($logisticNumber);
  241. if (!$order) {
  242. $response=["msg"=>"保存时发生错误(未在WMS找到该单)!","code"=>500,"data"=>null];
  243. return json_encode($response,JSON_UNESCAPED_UNICODE);
  244. }
  245. $package=new OrderPackage([
  246. 'order_id' => $order->id,
  247. 'logistic_number'=>$logisticNumber,
  248. 'measuring_machine_id'=>$measuringMachine->id,
  249. 'weight'=>$request['weight'],
  250. 'length'=>$edges[0],
  251. 'width'=>$edges[1],
  252. 'height'=>$edges[2],
  253. 'bulk'=>$edges[0]*$edges[1]*$edges[2],
  254. 'weighed_at'=>$reqDate,
  255. 'status'=>"无",
  256. ]);
  257. $package->fetchAllFromOracle();
  258. $package->fetchPaperBox();
  259. try{
  260. $package->save();
  261. $package->load(['order'=>function($query){
  262. $query->with('owner','logistic');
  263. },'paperBox','measuringMachine']);
  264. $logisticNumberController = new LogisticNumberFeatureController();
  265. if (!$package->order){
  266. $package->order = new Order();
  267. $logistic=$logisticNumberController->getLogisticByFeatures($package->logistic_number);
  268. $package->order->logistic = $logistic;
  269. }else{
  270. if(!$package->order->logistic){
  271. $logistic=$logisticNumberController->getLogisticByFeatures($package->logistic_number);
  272. $package->order->logistic_id = $logistic['id'];
  273. $package->order->save();
  274. }
  275. }
  276. }catch (\Exception $e){
  277. $response=["msg"=>$e->getMessage(),"code"=>500,"data"=>$e->getTraceAsString()];
  278. app('LogService')->log(__METHOD__,'weightApi(ERROR)'.__FUNCTION__,json_encode($request).'||'.json_encode($response).'||'.$e->getTraceAsString(),null);
  279. return json_encode($response,JSON_UNESCAPED_UNICODE);
  280. }
  281. $result=$fluxController->accomplishToWMS($package);
  282. if(!$package['batch_number'])
  283. FetchPackageFromOracle::dispatch($package)->delay(Carbon::now()->addMinutes(1440));
  284. if(!$result['result']){
  285. app('LogService')->log(__METHOD__,'weightApi'.__FUNCTION__,json_encode($request).'||'.json_encode($package),null);
  286. $response=["msg"=>"写入WMS失败!","code"=>500,"data"=>null];
  287. return json_encode($response,JSON_UNESCAPED_UNICODE);
  288. }
  289. }
  290. if(!empty($package->order))
  291. Waybill::setWeightByOrderCode($package->order->code,$package->weight);
  292. event(new WeighedEvent($package));
  293. dispatch(new WeightUpdateInstantBill($package));
  294. $response=["msg"=>"保存成功",
  295. "code"=>200,
  296. "data"=>true,
  297. "serverMsg"=>null,
  298. "requestor"=>[
  299. "requestor"=>"1",
  300. "eventCode"=>"0",
  301. "reqDate"=>$reqDate,
  302. "resDate"=>Carbon::now()]
  303. ];
  304. app('LogService')->log(__METHOD__,__FUNCTION__,"下发写入包裹成功:".json_encode($request).'|'.json_encode($response),null);
  305. return json_encode($response,JSON_UNESCAPED_UNICODE);
  306. }
  307. public function validatorWeight(array $request){
  308. $validator=Validator::make($request,[
  309. 'id'=>['nullable','max:30',/*function ($attribute, $value, $fail) {
  310. $measuringMachine=MeasuringMachine::where('code',$value)->first();
  311. if (!$measuringMachine) {
  312. $fail($attribute.' 设备未录入在系统中!');
  313. }}*/],
  314. 'barcode'=>['required','max:191'],
  315. 'weight'=>['required','numeric','min:0'],
  316. 'length'=>['nullable','numeric','min:0'],
  317. 'width'=>['nullable','numeric','min:0'],
  318. 'height'=>['nullable','numeric','min:0'],
  319. ],[
  320. 'required'=>':attribute 为必填项',
  321. 'max'=>':attribute 字符过多或数值过大',
  322. 'min'=>':attribute 不得为负',
  323. 'numeric'=>':attribute 应为数字',
  324. ],[]);
  325. return $validator;
  326. }
  327. }