DeleteOrderService.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. <?php
  2. namespace App\Service;
  3. use App\Model\Dispatch;
  4. use App\Model\DispatchEmpSub;
  5. use App\Model\DispatchSub;
  6. use App\Model\Orders;
  7. use App\Model\OrdersProduct;
  8. use App\Model\OrdersProductBom;
  9. use App\Model\OrdersProductMain;
  10. use App\Model\OrdersProductProcess;
  11. use App\Model\SaleOrdersProduct;
  12. use Illuminate\Support\Facades\DB;
  13. class DeleteOrderService extends Service
  14. {
  15. public function del($data){
  16. if($this->isEmpty($data,'id')) return [false,'数据必须选择!'];
  17. if($this->isEmpty($data,'type')) return [false,'单据类型不能为空!'];
  18. switch ($data['type']){
  19. case 1:
  20. list($status,$msg) = $this->delSaleOrdersProduct($data['id']);
  21. break;
  22. case 2:
  23. list($status,$msg) = $this->delOrdersProduct($data['id']);
  24. break;
  25. case 3:
  26. list($status,$msg) = $this->delDispatch($data['id']);
  27. break;
  28. case 4:
  29. list($status,$msg) = $this->delFinished($data['id']);
  30. break;
  31. default:
  32. list($status,$msg) = [false,'删除失败!'];
  33. }
  34. return [$status,$msg];
  35. }
  36. //销售订单删除
  37. public function delSaleOrdersProduct($id){
  38. $bool = OrdersProduct::where('del_time',0)
  39. ->whereIn('sale_orders_product_id',$id)
  40. ->exists();
  41. if($bool) return [false,'销售订单已生成生产订单,删除失败!'];
  42. try {
  43. DB::beginTransaction();
  44. //销售订单
  45. SaleOrdersProduct::whereIn('id',$id)->update([
  46. 'del_time' => time()
  47. ]);
  48. //内部订单号与销售订单关联表
  49. $subquery = DB::table('sale_orders_product')
  50. ->select('order_no')
  51. ->whereIn('id',$id);
  52. $order_no = DB::table('sale_orders_product')
  53. ->select('sale_orders_product.order_no','sale_orders_product.del_time')
  54. ->joinSub($subquery, 'sub', function ($join) {
  55. $join->on('sale_orders_product.order_no', '=', 'sub.order_no');
  56. })->get()->toArray();
  57. $update_order = [];
  58. if(! empty($order_no)){
  59. $tmp = [];
  60. foreach ($order_no as $value){
  61. $value = (array)$value;
  62. if($value['del_time'] == 0){
  63. $tmp[] = $value['order_no'];
  64. }else{
  65. $update_order[] = $value['order_no'];
  66. }
  67. }
  68. $tmp = array_unique($tmp);
  69. $update_order = array_unique($update_order);
  70. $update_order = array_diff($update_order, $tmp);
  71. }
  72. if(! empty($update_order)) Orders::whereIn('order_no',$update_order)->update(['del_time' => time()]);
  73. DB::commit();
  74. }catch (\Throwable $e){
  75. DB::rollBack();
  76. return [false,$e->getMessage()];
  77. }
  78. return [true,''];
  79. }
  80. //生产订单删除
  81. public function delOrdersProduct($id){
  82. $bool = DispatchSub::where('del_time',0)
  83. ->whereIn('order_product_id',$id)
  84. ->exists();
  85. if($bool) return [false,'生产订单已生成派工单,删除失败!'];
  86. try {
  87. DB::beginTransaction();
  88. //生产订单
  89. OrdersProduct::whereIn('id',$id)->update([
  90. 'del_time' => time()
  91. ]);
  92. //生产订单主表
  93. $subquery = DB::table('orders_product')
  94. ->select('production_no')
  95. ->whereIn('id',$id);
  96. $order_no = DB::table('orders_product')
  97. ->select('orders_product.production_no','orders_product.del_time')
  98. ->joinSub($subquery, 'sub', function ($join) {
  99. $join->on('orders_product.production_no', '=', 'sub.production_no');
  100. })->get()->toArray();
  101. $update_order = [];
  102. if(! empty($order_no)){
  103. $tmp = [];
  104. foreach ($order_no as $value){
  105. $value = (array)$value;
  106. if($value['del_time'] == 0){
  107. $tmp[] = $value['production_no'];
  108. }else{
  109. $update_order[] = $value['production_no'];
  110. }
  111. }
  112. $tmp = array_unique($tmp);
  113. $update_order = array_unique($update_order);
  114. $update_order = array_diff($update_order, $tmp);
  115. }
  116. if(! empty($update_order)) OrdersProductMain::whereIn('production_no',$update_order)->update(['del_time' => time()]);
  117. //生产订单子表
  118. $message = OrdersProduct::whereIn('id',$id)->select('out_order_no_time','sale_orders_product_id')->get()->toArray();
  119. $time = array_unique(array_column($message,'out_order_no_time'));
  120. $arr_time = [];
  121. if(! empty($time)){
  122. foreach ($time as $value){
  123. $time_tmp = date("Ymd", $value);
  124. if(! in_array($time_tmp,$arr_time)) $arr_time[] = $time_tmp;
  125. }
  126. }
  127. if(! empty($arr_time)){
  128. foreach ($arr_time as $value){
  129. $modelBom = new OrdersProductBom(['channel'=> $value]);
  130. $modelBom->where('order_product_id',$id)->update(['del_time' => time()]);
  131. $modelProcess = new OrdersProductProcess(['channel' => $value]);
  132. $modelProcess->where('order_product_id',$id)->update(['del_time' => time()]);
  133. }
  134. }
  135. //销售订单里的已生产数量
  136. (new ProductionOrderService())->writeProductionQuantityDEL(array_column($message,'sale_orders_product_id'));
  137. DB::commit();
  138. }catch (\Throwable $e){
  139. DB::rollBack();
  140. return [false,$e->getMessage()];
  141. }
  142. return [true,''];
  143. }
  144. //派工单删除
  145. public function delDispatch($id){
  146. $bool = DispatchSub::where('del_time',0)
  147. ->whereIn('id',$id)
  148. ->where('finished_num','>',0)
  149. ->exists();
  150. if($bool) return [false,'工序派工单已有完工操作,删除失败!'];
  151. try {
  152. DB::beginTransaction();
  153. //工序派工单
  154. DispatchSub::whereIn('id',$id)->update([
  155. 'del_time' => time()
  156. ]);
  157. //工序派工单主表
  158. $subquery = DB::table('dispatch_sub')
  159. ->select('dispatch_no')
  160. ->whereIn('id',$id);
  161. $order_no = DB::table('dispatch_sub')
  162. ->select('dispatch_sub.dispatch_no','dispatch_sub.del_time')
  163. ->joinSub($subquery, 'sub', function ($join) {
  164. $join->on('dispatch_sub.dispatch_no', '=', 'sub.dispatch_no');
  165. })->get()->toArray();
  166. $update_order = [];
  167. if(! empty($order_no)){
  168. $tmp = [];
  169. foreach ($order_no as $value){
  170. $value = (array)$value;
  171. if($value['del_time'] == 0){
  172. $tmp[] = $value['dispatch_no'];
  173. }else{
  174. $update_order[] = $value['dispatch_no'];
  175. }
  176. }
  177. $tmp = array_unique($tmp);
  178. $update_order = array_unique($update_order);
  179. $update_order = array_diff($update_order, $tmp);
  180. }
  181. if(! empty($update_order)) Dispatch::whereIn('dispatch_no',$update_order)->update(['del_time' => time()]);
  182. //工序表
  183. $message = DispatchSub::whereIn('id',$id)->select('out_order_no_time','sale_orders_product_id','dispatch_no','dispatch_quantity','order_product_id','process_id')->get()->toArray();
  184. if(! empty($message)){
  185. foreach ($message as $value){
  186. $tmp_time = date('Ymd',$value['out_order_no_time']);
  187. $modelProcess = new OrdersProductProcess(['channel' => $tmp_time]);
  188. $modelProcess->where('order_product_id',$value['order_product_id'])
  189. ->where('process_id',$value['process_id'])
  190. ->where('dispatch_no',$value['dispatch_no'])
  191. ->take($value['dispatch_quantity'])
  192. ->update([
  193. 'dispatch_no' => '',
  194. 'status' => 0
  195. ]);
  196. DispatchEmpSub::where('order_product_id',$value['order_product_id'])
  197. ->where('dispatch_no',$value['dispatch_no'])
  198. ->update([
  199. 'del_time' => time()
  200. ]);
  201. }
  202. }
  203. //已派工数量
  204. (new DispatchService())->writeDispatchQuantity(array_column($message,'order_product_id'));
  205. DB::commit();
  206. }catch (\Throwable $e){
  207. DB::rollBack();
  208. return [false,$e->getMessage()];
  209. }
  210. return [true,''];
  211. }
  212. //完工单删除
  213. public function delFinished($id){
  214. $result = DispatchSub::whereIn('id',$id)
  215. ->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')
  216. ->orderBy('id','desc')
  217. ->get()->toArray();
  218. try {
  219. DB::beginTransaction();
  220. foreach ($result as $key => $value){
  221. SaleOrdersProduct::where('id',$value['sale_orders_product_id'])->decrement('finished_num', $value['finished_num']);
  222. $process_model = new OrdersProductProcess(['channel' => date("Ymd",$value['out_order_no_time'])]);
  223. $process_model->where('order_product_id',$value['order_product_id'])
  224. ->where('process_id',$value['process_id'])
  225. ->where('dispatch_no',$value['dispatch_no'])
  226. ->take($value['finished_num'])
  227. ->update([
  228. 'finished_time' => 0,
  229. 'status' => 1,
  230. 'finished_id' => 0,
  231. 'team_id' => 0,
  232. 'equipment_id' => 0
  233. ]);
  234. $process_model->where('order_product_id',$value['order_product_id'])
  235. ->where('process_id',$value['process_id'])
  236. ->where('dispatch_no',$value['dispatch_no'])
  237. ->where('status',4)
  238. ->update([
  239. 'del_time' => time()
  240. ]);
  241. $result[$key]['quantity'] = $value['finished_num'];
  242. }
  243. DispatchSub::whereIn('id',$id)->update([
  244. 'finished_num' => 0,
  245. 'waste_num' => 0
  246. ]);
  247. DB::commit();
  248. }catch (\Throwable $e){
  249. DB::rollBack();
  250. return [false,$e->getMessage()];
  251. }
  252. return [true,''];
  253. }
  254. }