OrderService.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. <?php
  2. namespace App\Service;
  3. use App\Model\Employee;
  4. use App\Model\Order;
  5. use App\Model\OrderDetails;
  6. use App\Model\Reminder;
  7. use App\Model\ReminderDetails;
  8. use Illuminate\Support\Facades\DB;
  9. class OrderService extends Service
  10. {
  11. public function orderEdit($data,$user){
  12. list($status,$msg) = $this->orderRule($data, $user, false);
  13. if(!$status) return [$status,$msg];
  14. try {
  15. DB::beginTransaction();
  16. $model = Order::where('id',$data['id'])->first();
  17. $model->order_number = $data['order_number'] ?? '';
  18. $model->customer_id = $data['customer_id'] ?? 0;
  19. $model->supply_id = $data['supply_id'] ?? 0;
  20. $model->order_time = $data['order_time'] ?? 0;
  21. $model->quantity = $data['quantity'] ?? 0;
  22. $model->save();
  23. $time = time();
  24. OrderDetails::where('del_time',0)
  25. ->where('order_id', $model->id)
  26. ->update(['del_time' => $time]);
  27. $this->saveDetail($model->id, $time, $data);
  28. DB::commit();
  29. }catch (\Exception $exception){
  30. DB::rollBack();
  31. return [false,$exception->getMessage()];
  32. }
  33. return [true, ''];
  34. }
  35. public function orderAdd($data,$user){
  36. list($status,$msg) = $this->orderRule($data, $user);
  37. if(!$status) return [$status,$msg];
  38. try {
  39. DB::beginTransaction();
  40. $model = new Order();
  41. $model->order_number = $data['order_number'] ?? '';
  42. $model->customer_id = $data['customer_id'] ?? 0;
  43. $model->supply_id = $data['supply_id'] ?? 0;
  44. $model->order_time = $data['order_time'] ?? 0;
  45. $model->quantity = $data['quantity'] ?? 0;
  46. $model->crt_id = $user['id'];
  47. $model->save();
  48. $this->saveDetail($model->id, time(), $data);
  49. DB::commit();
  50. }catch (\Exception $exception){
  51. DB::rollBack();
  52. return [false,$exception->getMessage()];
  53. }
  54. return [true, ''];
  55. }
  56. private function saveDetail($id, $time, $data){
  57. if(! empty($data['details'])){
  58. $unit = [];
  59. foreach ($data['details'] as $value){
  60. $unit[] = [
  61. 'order_id' => $id,
  62. 'code' => $value['code'],
  63. 'title' => $value['title'],
  64. 'size' => $value['size'] ?? "",
  65. 'unit' => $value['unit'] ?? "",
  66. 'quantity' => $value['quantity'],
  67. 'crt_time' => $time,
  68. ];
  69. }
  70. if(! empty($unit)) OrderDetails::insert($unit);
  71. }
  72. }
  73. private function getDetail($id){
  74. $data = OrderDetails::where('del_time',0)
  75. ->where('order_id', $id)
  76. ->get()->toArray();
  77. $unit = [];
  78. foreach ($data as $value){
  79. $unit[] = [
  80. 'code' => $value['code'],
  81. 'title' => $value['title'],
  82. 'size' => $value['size'],
  83. 'unit' => $value['unit'],
  84. 'quantity' => $value['quantity'],
  85. ];
  86. }
  87. $detail = [
  88. 'details' => $unit,
  89. ];
  90. foreach ($detail as $key => $value) {
  91. if (empty($value)) {
  92. $detail[$key] = (object)[]; // 转成 stdClass 对象
  93. }
  94. }
  95. return $detail;
  96. }
  97. public function orderDel($data){
  98. if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
  99. try {
  100. DB::beginTransaction();
  101. $time = time();
  102. Order::where('del_time',0)
  103. ->whereIn('id',$data['id'])
  104. ->update(['del_time' => $time]);
  105. OrderDetails::where('del_time',0)
  106. ->where('order_id', $data['id'])
  107. ->update(['del_time' => $time]);
  108. DB::commit();
  109. }catch (\Exception $exception){
  110. DB::rollBack();
  111. return [false,$exception->getMessage()];
  112. }
  113. return [true, ''];
  114. }
  115. public function orderDetail($data, $user){
  116. if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
  117. $customer = Order::where('del_time',0)
  118. ->where('id',$data['id'])
  119. ->first();
  120. if(empty($customer)) return [false,'订单不存在或已被删除'];
  121. $customer = $customer->toArray();
  122. $customer['crt_name'] = Employee::where('id',$customer['crt_id'])->value('emp_name');
  123. $customer['crt_time'] = $customer['crt_time'] ? date("Y-m-d H:i:s",$customer['crt_time']): '';
  124. $details = $this->getDetail($data['id']);
  125. $customer = array_merge($customer, $details);
  126. return [true, $customer];
  127. }
  128. public function orderCommon($data,$user, $field = []){
  129. if(empty($field)) $field = Order::$field;
  130. $model = Order::Clear($user,$data);
  131. $model = $model->where('del_time',0)
  132. ->select($field)
  133. ->orderby('id', 'desc');
  134. if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
  135. if(! empty($data['order_number'])) $model->where('order_number', 'LIKE', '%'.$data['order_number'].'%');
  136. if(! empty($data['id'])) $model->whereIn('id', $data['id']);
  137. if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) {
  138. $return = $this->changeDateToTimeStampAboutRange($data['crt_time']);
  139. $model->where('crt_time','>=',$return[0]);
  140. $model->where('crt_time','<=',$return[1]);
  141. }
  142. if(! empty($data['order_time'][0]) && ! empty($data['order_time'][1])) {
  143. $return = $this->changeDateToTimeStampAboutRange($data['order_time']);
  144. $model->where('order_time','>=',$return[0]);
  145. $model->where('order_time','<=',$return[1]);
  146. }
  147. return $model;
  148. }
  149. public function orderList($data,$user){
  150. $model = $this->orderCommon($data, $user);
  151. $list = $this->limit($model,'',$data);
  152. $list = $this->fillData($list,$user,$data);
  153. $list['count'] = $this->countTotal($list['data'], $user['header_default']);
  154. return [true, $list];
  155. }
  156. public function orderRule(&$data, $user, $is_add = true){
  157. if(empty($data['order_number'])) return [false, '订单号不能为空'];
  158. if(empty($data['order_time'])) return [false, '订单日期不能为空'];
  159. $data['order_time'] = $this->changeDateToDate($data['order_time']);
  160. if(empty($data['details'])) return [false, '物料不能为空'];
  161. $total = 0;
  162. foreach ($data['details'] as $value){
  163. if(empty($value['code'])) return [false, '物料编码不能为空'];
  164. if(empty($value['title'])) return [false, '物料名称不能为空'];
  165. $res = $this->checkNumber($data['quantity'],2,'positive');
  166. if(! $res['valid']) return [false,'物料数量:' . $res['error']];
  167. $total = bcadd($total, $value['quantity'],2);
  168. }
  169. $data['quantity'] = $total;
  170. list($status, $msg) = $this->checkArrayRepeat($data['details'],'code','物料编码');
  171. if(! $status) return [false, $msg];
  172. if($is_add){
  173. $bool = Order::where('order_number',$data['order_number'])
  174. ->where('crt_id', $user['id'])
  175. ->where('del_time',0)
  176. ->exists();
  177. }else{
  178. if(empty($data['id'])) return [false,'ID不能为空'];
  179. $bool = Order::where('order_number',$data['order_number'])
  180. ->where('crt_id', $user['id'])
  181. ->where('id','<>',$data['id'])
  182. ->where('del_time',0)
  183. ->exists();
  184. }
  185. if($bool) return [false, '订单号已存在'];
  186. return [true, $data];
  187. }
  188. public function fillData($data, $user, $search){
  189. if(empty($data['data'])) return $data;
  190. $emp = (new EmployeeService())->getEmployeeMap(array_unique(array_column($data['data'],'id')));
  191. $emp_2 = (new CustomerSupplyService())->getEmployeeMap(array_unique(array_merge_recursive(array_column($data['data'],'customer_id'), array_column($data['data'],'supply_id'))));
  192. foreach ($data['data'] as $key => $value){
  193. $data['data'][$key]['crt_time'] = $value['crt_time'] ? date('Y-m-d H:i:s',$value['crt_time']) : '';
  194. $data['data'][$key]['order_time'] = $value['order_time'] ? date('Y-m-d',$value['order_time']) : '';
  195. $data['data'][$key]['crt_name'] = $emp[$value['crt_id']] ?? '';
  196. $data['data'][$key]['customer_title'] = $emp_2[$value['customer_id']] ?? '';
  197. $data['data'][$key]['supply_title'] = $emp_2[$value['supply_id']] ?? '';
  198. }
  199. return $data;
  200. }
  201. //催单管理---------------------------------------------
  202. public function reminderEdit($data,$user){
  203. list($status,$msg) = $this->reminderRule($data, $user, false);
  204. if(!$status) return [$status,$msg];
  205. try {
  206. DB::beginTransaction();
  207. $model = Reminder::where('id',$data['id'])->first();
  208. $model->order_id = $data['order_id'] ?? 0;
  209. $model->order_no = $data['order_no'] ?? '';
  210. $model->product_code = $data['product_code'] ?? '';
  211. $model->product_size = $data['product_size'] ?? '';
  212. $model->product_unit = $data['product_unit'] ?? '';
  213. $model->product_title = $data['product_title'] ?? '';
  214. $model->quantity = $data['quantity'] ?? 0;
  215. $model->order_time = $data['order_time'] ?? 0;
  216. $model->lt_arrived_time = $data['lt_arrived_time'] ?? 0;
  217. $model->tl_arrived_time = $data['tl_arrived_time'] ?? 0;
  218. $model->tl_quantity = $data['tl_quantity'] ?? 0;
  219. $model->df_type = $data['df_type'] ?? 0;
  220. $model->save();
  221. $time = time();
  222. ReminderDetails::where('del_time',0)
  223. ->where('reminder_id', $model->id)
  224. ->update(['del_time' => $time]);
  225. $this->saveDetail1($model->id, $time, $data);
  226. DB::commit();
  227. }catch (\Exception $exception){
  228. DB::rollBack();
  229. return [false,$exception->getMessage()];
  230. }
  231. return [true, ''];
  232. }
  233. public function reminderAdd($data,$user){
  234. list($status,$msg) = $this->reminderRule($data, $user);
  235. if(!$status) return [$status,$msg];
  236. try {
  237. DB::beginTransaction();
  238. $model = new Reminder();
  239. $model->order_number = $this->createOrderNumber();
  240. $model->order_id = $data['order_id'] ?? 0;
  241. $model->order_no = $data['order_no'] ?? '';
  242. $model->product_code = $data['product_code'] ?? '';
  243. $model->product_size = $data['product_size'] ?? '';
  244. $model->product_unit = $data['product_unit'] ?? '';
  245. $model->product_title = $data['product_title'] ?? '';
  246. $model->quantity = $data['quantity'] ?? 0;
  247. $model->order_time = $data['order_time'] ?? 0;
  248. $model->lt_arrived_time = $data['lt_arrived_time'] ?? 0;
  249. $model->tl_arrived_time = $data['tl_arrived_time'] ?? 0;
  250. $model->tl_quantity = $data['tl_quantity'] ?? 0;
  251. $model->df_type = $data['df_type'] ?? 0;
  252. $model->crt_id = $user['id'];
  253. $model->save();
  254. $this->saveDetail1($model->id, time(), $data);
  255. DB::commit();
  256. }catch (\Exception $exception){
  257. DB::rollBack();
  258. return [false,$exception->getMessage()];
  259. }
  260. return [true, ''];
  261. }
  262. private function saveDetail1($id, $time, $data){
  263. if(! empty($data['details'])){
  264. $unit = [];
  265. foreach ($data['details'] as $value){
  266. $unit[] = [
  267. 'reminder_id' => $id,
  268. 'customer_supply_id' => $value['customer_supply_id'],
  269. 'is_main' => $value['is_main'],
  270. 'quantity' => $value['quantity'],
  271. 'crt_time' => $time,
  272. ];
  273. }
  274. if(! empty($unit)) ReminderDetails::insert($unit);
  275. }
  276. }
  277. private function getDetail1($id){
  278. $data = ReminderDetails::from('reminder_details as a')
  279. ->leftJoin('customer_supply as b','b.id','a.customer_supply_id')
  280. ->where('a.del_time',0)
  281. ->where('a.reminder_id', $id)
  282. ->select('a.customer_supply_id','a.is_main','b.title')
  283. ->get()->toArray();
  284. $unit = [];
  285. foreach ($data as $value){
  286. $unit[] = [
  287. 'customer_supply_id' => $value['customer_supply_id'],
  288. 'is_main' => $value['is_main'],
  289. ];
  290. }
  291. $detail = [
  292. 'details' => $unit,
  293. ];
  294. foreach ($detail as $key => $value) {
  295. if (empty($value)) {
  296. $detail[$key] = (object)[]; // 转成 stdClass 对象
  297. }
  298. }
  299. return $detail;
  300. }
  301. public function reminderDel($data){
  302. if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
  303. $bool = Reminder::where('del_time',0)
  304. ->whereIn('id',$data['id'])
  305. ->where('status','>',Reminder::status_zero)
  306. ->exists();
  307. if($bool) return [false, '催单状态已变更,删除失败'];
  308. try {
  309. DB::beginTransaction();
  310. $time = time();
  311. Reminder::where('del_time',0)
  312. ->whereIn('id',$data['id'])
  313. ->update(['del_time' => $time]);
  314. ReminderDetails::where('del_time',0)
  315. ->where('reminder_id', $data['id'])
  316. ->update(['del_time' => $time]);
  317. DB::commit();
  318. }catch (\Exception $exception){
  319. DB::rollBack();
  320. return [false,$exception->getMessage()];
  321. }
  322. return [true, ''];
  323. }
  324. public function reminderDetail($data, $user){
  325. if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
  326. $customer = Reminder::where('del_time',0)
  327. ->where('id',$data['id'])
  328. ->first();
  329. if(empty($customer)) return [false,'催单不存在或已被删除'];
  330. $customer = $customer->toArray();
  331. $customer['crt_name'] = Employee::where('id',$customer['crt_id'])->value('emp_name');
  332. $customer['crt_time'] = $customer['crt_time'] ? date("Y-m-d H:i:s",$customer['crt_time']): '';
  333. $customer['order_time'] = $customer['order_time'] ? date("Y-m-d",$customer['order_time']): '';
  334. $customer['lt_arrived_time'] = $customer['lt_arrived_time'] ? date("Y-m-d",$customer['lt_arrived_time']): '';
  335. $customer['tl_arrived_time'] = $customer['tl_arrived_time'] ? date("Y-m-d",$customer['tl_arrived_time']): '';
  336. $customer['df_type_title'] = Reminder::$df_type_name[$customer['df_type']] ?? "";
  337. $customer['rule_title'] = Reminder::$rule_name[$customer['rule']] ?? "";
  338. $customer['status_title'] = Reminder::$status_name[$customer['status']] ?? "";
  339. $details = $this->getDetail1($data['id']);
  340. $customer = array_merge($customer, $details);
  341. return [true, $customer];
  342. }
  343. public function reminderCommon($data,$user, $field = []){
  344. if(empty($field)) $field = Order::$field;
  345. $model = Reminder::Clear($user,$data);
  346. $model = $model->where('del_time',0)
  347. ->select($field)
  348. ->orderby('id', 'desc');
  349. if(! empty($data['order_number'])) $model->where('order_number', 'LIKE', '%'.$data['order_number'].'%');
  350. if(! empty($data['order_no'])) $model->where('order_no', 'LIKE', '%'.$data['order_no'].'%');
  351. if(! empty($data['product_title'])) $model->where('product_title', 'LIKE', '%'.$data['product_title'].'%');
  352. if(! empty($data['product_code'])) $model->where('product_code', 'LIKE', '%'.$data['product_code'].'%');
  353. if(! empty($data['id'])) $model->whereIn('id', $data['id']);
  354. if(isset($data['status'])) $model->where('status', $data['status']);
  355. if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) {
  356. $return = $this->changeDateToTimeStampAboutRange($data['crt_time']);
  357. $model->where('crt_time','>=',$return[0]);
  358. $model->where('crt_time','<=',$return[1]);
  359. }
  360. if(! empty($data['order_time'][0]) && ! empty($data['order_time'][1])) {
  361. $return = $this->changeDateToTimeStampAboutRange($data['order_time']);
  362. $model->where('order_time','>=',$return[0]);
  363. $model->where('order_time','<=',$return[1]);
  364. }
  365. return $model;
  366. }
  367. public function reminderList($data,$user){
  368. $model = $this->reminderCommon($data, $user);
  369. $list = $this->limit($model,'',$data);
  370. $list = $this->fillReminderData($list,$user,$data);
  371. $list['count'] = $this->countTotal($list['data'], $user['header_default']);
  372. return [true, $list];
  373. }
  374. public function reminderRule(&$data, $user, $is_add = true){
  375. if(empty($data['order_id'])) return [false, '订单ID不能为空'];
  376. if(empty($data['order_no'])) return [false, '订单号不能为空'];
  377. if(empty($data['order_time'])) return [false, '订单日期不能为空'];
  378. $data['order_time'] = strtotime($data['order_time']);
  379. if(empty($data['product_code'])) return [false, '物料编码不能为空'];
  380. if(empty($data['product_title'])) return [false, '物料名称不能为空'];
  381. if(empty($data['quantity'])) return [false, '物料数量不能为空'];
  382. if(empty($data['lt_arrived_time'])) return [false, 'LT要求到货日期不能为空'];
  383. $data['lt_arrived_time'] = $this->changeDateToDate($data['lt_arrived_time']);
  384. if(empty($data['tl_arrived_time'])) return [false, '提拉到货日期不能为空'];
  385. $data['tl_arrived_time'] = $this->changeDateToDate($data['tl_arrived_time']);
  386. $res = $this->checkNumber($data['tl_quantity'],2,'positive');
  387. if(! $res['valid']) return [false,'提拉到货数量:' . $res['error']];
  388. if(empty($data['df_type'])) return [false, '要求答复时间不能为空'];
  389. if(! isset(Reminder::$df_type_name[$data['df_type']])) return [false, '要求答复时间错误'];
  390. if(empty($data['rule'])) return [false, '主要人员关系规则不能为空'];
  391. if(! isset(Reminder::$rule_name[$data['rule']])) return [false, '主要人员关系规则不存在'];
  392. if(empty($data['details'])) return [false, '催单提醒人员不能为空'];
  393. $is_bool = false;
  394. $main_ids = [];
  395. $sub_ids = [];
  396. foreach ($data['details'] as $value) {
  397. if (empty($value['customer_supply_id'])) return [false, '人员id不能为空'];
  398. if (empty($value['is_main'])) return [false, 'is_main不能为空'];
  399. $customer_id = $value['customer_supply_id'];
  400. $is_main_val = $value['is_main'];
  401. if ($is_main_val == ReminderDetails::is_main_one) {
  402. // 检查主要人员重复
  403. if (in_array($customer_id, $main_ids)) {
  404. return [false, "主要成员不能重复"];
  405. }
  406. $main_ids[] = $customer_id;
  407. $is_bool = true;
  408. } elseif ($is_main_val == ReminderDetails::is_main_two) {
  409. // 检查次要人员重复
  410. if (in_array($customer_id, $sub_ids)) {
  411. return [false, "次要成员不能重复"];
  412. }
  413. $sub_ids[] = $customer_id;
  414. }
  415. }
  416. // 检查主要成员至少一个
  417. if (!$is_bool) return [false, '主要成员必须选择'];
  418. // 检查主要与次要是否有重复
  419. $intersect = array_intersect($main_ids, $sub_ids);
  420. if (!empty($intersect)) return [false, "主要成员与次要成员不能重复"];
  421. if($is_add){
  422. }else{
  423. if(empty($data['id'])) return [false,'ID不能为空'];
  424. $order = Order::where('id',$data['id'])
  425. ->where('del_time',0)
  426. ->fist();
  427. if(empty($order)) return [false, '催单不存在或已被删除'];
  428. $order = $order->toArray();
  429. if($order['status'] > Reminder::status_zero) return [false, '催单状态已变更,编辑失败'];
  430. }
  431. return [true, $data];
  432. }
  433. public function fillReminderData($data, $user, $search){
  434. if(empty($data['data'])) return $data;
  435. $emp = (new EmployeeService())->getEmployeeMap(array_unique(array_column($data['data'],'id')));
  436. foreach ($data['data'] as $key => $value){
  437. $data['data'][$key]['crt_time'] = $value['crt_time'] ? date('Y-m-d H:i:s',$value['crt_time']) : '';
  438. $data['data'][$key]['order_time'] = $value['order_time'] ? date('Y-m-d',$value['order_time']) : '';
  439. $data['data'][$key]['crt_name'] = $emp[$value['crt_id']] ?? '';
  440. $data['data'][$key]['lt_arrived_time'] = $value['lt_arrived_time'] ? date("Y-m-d",$value['lt_arrived_time']): '';
  441. $data['data'][$key]['tl_arrived_time'] = $value['tl_arrived_time'] ? date("Y-m-d",$value['tl_arrived_time']): '';
  442. $data['data'][$key]['df_type_title'] = Reminder::$df_type_name[$value['df_type']] ?? "";
  443. $data['data'][$key]['rule_title'] = Reminder::$rule_name[$value['rule']] ?? "";
  444. $data['data'][$key]['status_title'] = Reminder::$status_name[$value['status']] ?? "";
  445. }
  446. return $data;
  447. }
  448. public function createOrderNumber(){
  449. return date('YmdHis',time()) . rand(1000,9999);
  450. }
  451. }