DeleteOrderService.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  1. <?php
  2. namespace App\Service;
  3. use App\Model\ApplyOrder;
  4. use App\Model\ApplyOrderForYy;
  5. use App\Model\Box;
  6. use App\Model\BoxDetail;
  7. use App\Model\CommandList;
  8. use App\Model\Dispatch;
  9. use App\Model\DispatchEmpSub;
  10. use App\Model\DispatchSub;
  11. use App\Model\Orders;
  12. use App\Model\OrdersProduct;
  13. use App\Model\OrdersProductBom;
  14. use App\Model\OrdersProductMain;
  15. use App\Model\OrdersProductProcess;
  16. use App\Model\Process;
  17. use App\Model\SaleOrdersProduct;
  18. use App\Service\Box\BoxService;
  19. use Illuminate\Support\Facades\DB;
  20. class DeleteOrderService extends Service
  21. {
  22. public function del($data){
  23. if($this->isEmpty($data,'id')) return [false,'数据必须选择!'];
  24. if($this->isEmpty($data,'type')) return [false,'单据类型不能为空!'];
  25. switch ($data['type']){
  26. case 1:
  27. list($status,$msg) = $this->delSaleOrdersProduct($data['id']);
  28. break;
  29. case 2:
  30. list($status,$msg) = $this->delOrdersProduct($data['id']);
  31. break;
  32. case 3:
  33. list($status,$msg) = $this->delDispatch($data['id']);
  34. break;
  35. case 4:
  36. // list($status,$msg) = $this->delFinished($data['id']);
  37. list($status,$msg) = [false,'删除失败!'];
  38. case 5:
  39. list($status,$msg) = $this->delBox($data['id']);
  40. break;
  41. default:
  42. list($status,$msg) = [false,'删除失败!'];
  43. }
  44. return [$status,$msg];
  45. }
  46. //销售订单删除
  47. public function delSaleOrdersProduct($id){
  48. $bool = OrdersProduct::where('del_time',0)
  49. ->whereIn('sale_orders_product_id',$id)
  50. ->exists();
  51. if($bool) return [false,'销售订单已生成生产订单,删除失败!'];
  52. try {
  53. DB::beginTransaction();
  54. //销售订单
  55. SaleOrdersProduct::whereIn('id',$id)->update([
  56. 'del_time' => time()
  57. ]);
  58. //内部订单号与销售订单关联表
  59. $subquery = DB::table('sale_orders_product')
  60. ->select('order_no')
  61. ->whereIn('id',$id);
  62. $order_no = DB::table('sale_orders_product')
  63. ->select('sale_orders_product.order_no','sale_orders_product.del_time')
  64. ->joinSub($subquery, 'sub', function ($join) {
  65. $join->on('sale_orders_product.order_no', '=', 'sub.order_no');
  66. })->get()->toArray();
  67. $update_order = [];
  68. if(! empty($order_no)){
  69. $tmp = [];
  70. foreach ($order_no as $value){
  71. $value = (array)$value;
  72. if($value['del_time'] == 0){
  73. $tmp[] = $value['order_no'];
  74. }else{
  75. $update_order[] = $value['order_no'];
  76. }
  77. }
  78. $tmp = array_unique($tmp);
  79. $update_order = array_unique($update_order);
  80. $update_order = array_diff($update_order, $tmp);
  81. }
  82. if(! empty($update_order)) Orders::whereIn('order_no',$update_order)->update(['del_time' => time()]);
  83. DB::commit();
  84. }catch (\Throwable $e){
  85. DB::rollBack();
  86. return [false,$e->getMessage()];
  87. }
  88. return [true,''];
  89. }
  90. //生产订单删除
  91. public function delOrdersProduct($id){
  92. $bool = DispatchSub::where('del_time',0)
  93. ->whereIn('order_product_id',$id)
  94. ->exists();
  95. if($bool) return [false,'生产订单已生成派工单,删除失败!'];
  96. $bool = OrdersProduct::whereIn('id', $id)
  97. ->where('status','>',OrdersProduct::status_zero)
  98. ->exists();
  99. if($bool) return [false,'生产订单已审核,删除失败!'];
  100. try {
  101. DB::beginTransaction();
  102. //生产订单
  103. OrdersProduct::whereIn('id',$id)->update([
  104. 'del_time' => time()
  105. ]);
  106. //生产订单主表
  107. $subquery = DB::table('orders_product')
  108. ->select('production_no')
  109. ->whereIn('id',$id);
  110. $order_no = DB::table('orders_product')
  111. ->select('orders_product.production_no','orders_product.del_time')
  112. ->joinSub($subquery, 'sub', function ($join) {
  113. $join->on('orders_product.production_no', '=', 'sub.production_no');
  114. })->get()->toArray();
  115. $update_order = [];
  116. if(! empty($order_no)){
  117. $tmp = [];
  118. foreach ($order_no as $value){
  119. $value = (array)$value;
  120. if($value['del_time'] == 0){
  121. $tmp[] = $value['production_no'];
  122. }else{
  123. $update_order[] = $value['production_no'];
  124. }
  125. }
  126. $tmp = array_unique($tmp);
  127. $update_order = array_unique($update_order);
  128. $update_order = array_diff($update_order, $tmp);
  129. }
  130. if(! empty($update_order)) OrdersProductMain::whereIn('production_no',$update_order)->update(['del_time' => time()]);
  131. //生产订单子表
  132. $message = OrdersProduct::whereIn('id',$id)->select('out_order_no_time','sale_orders_product_id')->get()->toArray();
  133. $time = array_unique(array_column($message,'out_order_no_time'));
  134. $arr_time = [];
  135. if(! empty($time)){
  136. foreach ($time as $value){
  137. $time_tmp = date("Ymd", $value);
  138. if(! in_array($time_tmp,$arr_time)) $arr_time[] = $time_tmp;
  139. }
  140. }
  141. if(! empty($arr_time)){
  142. foreach ($arr_time as $value){
  143. $modelBom = new OrdersProductBom(['channel'=> $value]);
  144. $modelBom->whereIn('order_product_id',$id)->update(['del_time' => time()]);
  145. $modelProcess = new OrdersProductProcess(['channel' => $value]);
  146. $modelProcess->whereIn('order_product_id',$id)->update(['del_time' => time()]);
  147. }
  148. }
  149. //销售订单里的已生产数量
  150. (new ProductionOrderService())->writeProductionQuantityDEL(array_column($message,'sale_orders_product_id'));
  151. DB::commit();
  152. }catch (\Throwable $e){
  153. DB::rollBack();
  154. return [false,$e->getMessage()];
  155. }
  156. return [true,''];
  157. }
  158. //派工单删除
  159. public function delDispatch($id){
  160. $bool = DispatchSub::whereIn('id', $id)
  161. ->where('status','>',DispatchSub::status_zero)
  162. ->exists();
  163. if($bool) return [false,'工序派工单已审核,删除失败!'];
  164. //校验工序派工单是否完工
  165. $dispatch = DispatchSub::where('del_time',0)
  166. ->whereIn('id',$id)
  167. ->select('id','dispatch_no','process_id','order_product_id','crt_time','finished_num')
  168. ->get()
  169. ->toArray();
  170. $process_map = Process::whereIn('id',array_unique(array_column($dispatch,'process_id')))->pluck('title','id')->toArray();
  171. $search = "";
  172. foreach ($dispatch as $value){
  173. $tmp_process = $process_map[$value['process_id']] ?? "";
  174. if($value['finished_num'] > 0) return [false,'派工单号:' . $value['dispatch_no']. '的工序:' . $tmp_process .'已存在完工操作,删除失败!'];
  175. $search .= "(order_product_id = {$value['order_product_id']} and crt_time = {$value['crt_time']}) OR ";
  176. }
  177. //校验同一批工序派工单是否完工
  178. $search = rtrim($search,'OR ');
  179. $search = "($search)";
  180. $dispatch = DispatchSub::where('del_time',0)
  181. ->whereRaw($search)
  182. ->select('id','dispatch_no','process_id','order_product_id','crt_time','finished_num','out_order_no_time','sale_orders_product_id','dispatch_no','dispatch_quantity','order_product_id')
  183. ->get()
  184. ->toArray();
  185. $process_map = Process::whereIn('id',array_unique(array_column($dispatch,'process_id')))->pluck('title','id')->toArray();
  186. foreach ($dispatch as $value){
  187. $tmp_process = $process_map[$value['process_id']] ?? "";
  188. if($value['finished_num'] > 0) return [false,'派工单号:' . $value['dispatch_no']. '的工序:' . $tmp_process .'已存在完工操作,删除失败!'];
  189. }
  190. $new_del_id = array_column($dispatch,'id');
  191. try {
  192. DB::beginTransaction();
  193. //工序派工单
  194. DispatchSub::whereIn('id',$new_del_id)->update([
  195. 'del_time' => time()
  196. ]);
  197. //工序派工单主表
  198. $subquery = DB::table('dispatch_sub')
  199. ->select('dispatch_no')
  200. ->whereIn('id',$new_del_id);
  201. $order_no = DB::table('dispatch_sub')
  202. ->select('dispatch_sub.dispatch_no','dispatch_sub.del_time')
  203. ->joinSub($subquery, 'sub', function ($join) {
  204. $join->on('dispatch_sub.dispatch_no', '=', 'sub.dispatch_no');
  205. })->get()->toArray();
  206. $update_order = [];
  207. if(! empty($order_no)){
  208. $tmp = [];
  209. foreach ($order_no as $value){
  210. $value = (array)$value;
  211. if($value['del_time'] == 0){
  212. $tmp[] = $value['dispatch_no'];
  213. }else{
  214. $update_order[] = $value['dispatch_no'];
  215. }
  216. }
  217. $tmp = array_unique($tmp);
  218. $update_order = array_unique($update_order);
  219. $update_order = array_diff($update_order, $tmp);
  220. }
  221. if(! empty($update_order)) Dispatch::whereIn('dispatch_no',$update_order)->update(['del_time' => time()]);
  222. //工序表
  223. $message = $dispatch;
  224. if(! empty($message)){
  225. foreach ($message as $value){
  226. $tmp_time = date('Ymd',$value['out_order_no_time']);
  227. $modelProcess = new OrdersProductProcess(['channel' => $tmp_time]);
  228. $modelProcess->where('order_product_id',$value['order_product_id'])
  229. ->where('process_id',$value['process_id'])
  230. ->where('dispatch_no',$value['dispatch_no'])
  231. ->take($value['dispatch_quantity'])
  232. ->update([
  233. 'dispatch_no' => '',
  234. 'status' => 0
  235. ]);
  236. }
  237. }
  238. //已派工数量
  239. (new DispatchService())->writeDispatchQuantityDEL(array_column($message,'order_product_id'));
  240. DB::commit();
  241. }catch (\Throwable $e){
  242. DB::rollBack();
  243. return [false,$e->getMessage()];
  244. }
  245. return [true,''];
  246. }
  247. //完工单删除
  248. public function delFinished($id){
  249. $result = DispatchSub::whereIn('id',$id)
  250. ->select('id','finished_num','dispatch_quantity','out_order_no_time','process_id','dispatch_no','order_product_id','sale_orders_product_id','order_no','product_no','product_title','price')
  251. ->orderBy('id','desc')
  252. ->get()->toArray();
  253. try {
  254. DB::beginTransaction();
  255. foreach ($result as $key => $value){
  256. SaleOrdersProduct::where('id',$value['sale_orders_product_id'])->decrement('finished_num', $value['finished_num']);
  257. $process_model = new OrdersProductProcess(['channel' => date("Ymd",$value['out_order_no_time'])]);
  258. $process_model->where('order_product_id',$value['order_product_id'])
  259. ->where('process_id',$value['process_id'])
  260. ->where('dispatch_no',$value['dispatch_no'])
  261. ->take($value['finished_num'])
  262. ->update([
  263. 'finished_time' => 0,
  264. 'status' => 1,
  265. 'finished_id' => 0,
  266. 'team_id' => 0,
  267. 'equipment_id' => 0
  268. ]);
  269. // $process_model->where('order_product_id',$value['order_product_id'])
  270. // ->where('process_id',$value['process_id'])
  271. // ->where('dispatch_no',$value['dispatch_no'])
  272. // ->where('status',4)
  273. // ->update([
  274. // 'del_time' => time()
  275. // ]);
  276. $result[$key]['quantity'] = $value['finished_num'];
  277. }
  278. DispatchSub::whereIn('id',$id)->update([
  279. 'finished_num' => 0,
  280. 'waste_num' => 0
  281. ]);
  282. DB::commit();
  283. }catch (\Throwable $e){
  284. DB::rollBack();
  285. return [false,$e->getMessage()];
  286. }
  287. return [true,''];
  288. }
  289. //包装单删除
  290. public function delBox($id){
  291. $box = Box::whereIn('id', $id)->get()->toArray();
  292. try {
  293. DB::beginTransaction();
  294. $order_no = [];
  295. foreach ($box as $value){
  296. if($value['status'] > Box::status_zero) return [false, '包装单已审核,删除失败'];
  297. $order_no[] = $value['order_no'];
  298. }
  299. $service = new BoxService();
  300. list($status, $msg) = $service->delBoxDetail(['order_nos' => $order_no]);
  301. if(! $status) return [false, $msg];
  302. DB::commit();
  303. }catch (\Throwable $e){
  304. DB::rollBack();
  305. return [false,$e->getMessage()];
  306. }
  307. return [true,''];
  308. }
  309. public function checkOrders($data,$user){
  310. if($this->isEmpty($data,'id')) return [false,'数据必须选择!'];
  311. if($this->isEmpty($data,'type')) return [false,'单据类型不能为空!'];
  312. if($this->isEmpty($data,'check')) return [false,'审核操作数值不能为空!'];
  313. switch ($data['type']){
  314. case 1:
  315. list($status,$msg) = $this->checkOrdersProduct($data);
  316. break;
  317. case 2:
  318. list($status,$msg) = $this->checkDispatch($data);
  319. break;
  320. case 3:
  321. list($status,$msg) = $this->checkFinish($data);
  322. break;
  323. case 4:
  324. list($status,$msg) = $this->checkBox($data);
  325. break;
  326. case 5:
  327. list($status,$msg) = $this->checkSP($data,$user);
  328. break;
  329. default:
  330. list($status,$msg) = [false,'审核失败'];
  331. }
  332. return [$status,$msg];
  333. }
  334. public function checkOrdersProduct($data){
  335. $order = OrdersProduct::where('del_time',0)
  336. ->whereIn('id',$data['id'])
  337. ->get()->toArray();
  338. $check = $data['check'];// 1 通过 2 弃审
  339. if($check == 1){
  340. $status = 1;
  341. }else{
  342. $status = 0;
  343. }
  344. try {
  345. DB::beginTransaction();
  346. foreach ($order as $value){
  347. if($check == 1 && $value['status'] > OrdersProduct::status_zero) return [false, '生产订单已审核,操作失败'];
  348. if($check == 2 && $value['status'] < OrdersProduct::status_one) return [false, '生产订单未审核,操作失败'];
  349. }
  350. //生产订单
  351. OrdersProduct::whereIn('id',$data['id'])->update([
  352. 'status' => $status
  353. ]);
  354. DB::commit();
  355. }catch (\Throwable $e){
  356. DB::rollBack();
  357. return [false,$e->getMessage()];
  358. }
  359. return [true,''];
  360. }
  361. public function checkDispatch($data){
  362. $order = DispatchSub::where('del_time',0)
  363. ->whereIn('id',$data['id'])
  364. ->get()->toArray();
  365. $check = $data['check'];// 1 通过 2 弃审
  366. if($check == 1){
  367. $status = 1;
  368. }else{
  369. $status = 0;
  370. }
  371. try {
  372. DB::beginTransaction();
  373. foreach ($order as $value){
  374. if($check == 1 && $value['status'] > DispatchSub::status_zero) return [false, '派工单已审核,操作失败'];
  375. if($check == 2 && $value['status'] < DispatchSub::status_one) return [false, '派工单未审核,操作失败'];
  376. }
  377. DispatchSub::whereIn('id',$data['id'])->update([
  378. 'status' => $status
  379. ]);
  380. DB::commit();
  381. }catch (\Throwable $e){
  382. DB::rollBack();
  383. return [false,$e->getMessage()];
  384. }
  385. return [true,''];
  386. }
  387. public function checkFinish($data){
  388. $order = DispatchSub::where('del_time',0)
  389. ->whereIn('id',$data['id'])
  390. ->get()->toArray();
  391. $check = $data['check'];// 1 通过 2 弃审
  392. if($check == 1){
  393. $status = 1;
  394. }else{
  395. $status = 0;
  396. }
  397. try {
  398. DB::beginTransaction();
  399. foreach ($order as $value){
  400. if($check == 1 && $value['wg_status'] > DispatchSub::status_zero) return [false, '完工单已审核,操作失败'];
  401. if($check == 2 && $value['wg_status'] < DispatchSub::status_one) return [false, '完工单未审核,操作失败'];
  402. }
  403. DispatchSub::whereIn('id',$data['id'])->update([
  404. 'wg_status' => $status
  405. ]);
  406. DB::commit();
  407. }catch (\Throwable $e){
  408. DB::rollBack();
  409. return [false,$e->getMessage()];
  410. }
  411. return [true,''];
  412. }
  413. public function checkBox($data){
  414. $order = Box::where('del_time',0)
  415. ->whereIn('id',$data['id'])
  416. ->get()->toArray();
  417. $check = $data['check'];// 1 通过 2 弃审
  418. if($check == 1){
  419. $status = 1;
  420. }else{
  421. $status = 0;
  422. }
  423. try {
  424. DB::beginTransaction();
  425. foreach ($order as $value){
  426. if($check == 1 && $value['status'] > Box::status_zero) return [false, '包装单已审核,操作失败'];
  427. if($check == 2 && $value['status'] < Box::status_one) return [false, '包装单未审核,操作失败'];
  428. }
  429. Box::whereIn('id',$data['id'])->update([
  430. 'status' => $status
  431. ]);
  432. DB::commit();
  433. }catch (\Throwable $e){
  434. DB::rollBack();
  435. return [false,$e->getMessage()];
  436. }
  437. return [true,''];
  438. }
  439. public function checkSP($data,$user){
  440. $order = ApplyOrder::where('del_time',0)
  441. ->whereIn('id',$data['id'])
  442. ->get()->toArray();
  443. $check = $data['check'];// 1 通过 2 弃审
  444. if($check == 1){
  445. $status = 1;
  446. }else{
  447. $status = 0;
  448. }
  449. try {
  450. DB::beginTransaction();
  451. foreach ($order as $value){
  452. if($check == 1 && $value['status'] > ApplyOrder::state_zero) return [false, '申请单已审核,操作失败'];
  453. if($check == 2 && $value['status'] < ApplyOrder::state_one) return [false, '申请单未审核,操作失败'];
  454. }
  455. ApplyOrder::whereIn('id',$data['id'])->update([
  456. 'status' => $status
  457. ]);
  458. DB::commit();
  459. if($check == 1){
  460. $result = ApplyOrderForYy::whereIn('apply_order_id', $data['id'])->get()->toArray();
  461. if(! empty($result)){
  462. $service = new FinishedOrderService();
  463. foreach ($result as $value){
  464. list($status, $msg) = $service->insertYy($value,$user);
  465. }
  466. }
  467. }
  468. }catch (\Throwable $e){
  469. DB::rollBack();
  470. return [false,$e->getMessage()];
  471. }
  472. return [true,''];
  473. }
  474. }