PurchaseOrderService.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <?php
  2. namespace App\Service;
  3. use App\Model\Depart;
  4. use App\Model\Employee;
  5. use App\Model\PurchaseOrder;
  6. use App\Model\PurchaseOrderInfo;
  7. use Illuminate\Support\Facades\DB;
  8. class PurchaseOrderService extends Service
  9. {
  10. public function edit($data,$user){
  11. list($status,$msg) = $this->orderRule($data,false);
  12. if(!$status) return [$status,$msg];
  13. try{
  14. DB::beginTransaction();
  15. $material_model = PurchaseOrder::where('order_number',$data['order_number'])->first();
  16. $material_model->depart_id = $data['depart_id'];
  17. $material_model->mark = $data['mark'] ?? '';
  18. $material_model->save();
  19. PurchaseOrderInfo::where('order_number',$data['order_number'])
  20. ->where('del_time',0)
  21. ->update(['del_time' => time()]);
  22. if(!empty($data['product'])){
  23. $sub = [];
  24. foreach ($data['product'] as $value){
  25. $sub[] = [
  26. 'order_number' => $data['order_number'],
  27. 'depart_id' => $data['depart_id'],
  28. 'product_id' => $value['product_id'],
  29. 'number' => $value['number'],
  30. 'mark' => $value['mark'] ?? '',
  31. ];
  32. }
  33. PurchaseOrderInfo::insert($sub);
  34. }
  35. DB::commit();
  36. }catch (\Throwable $e){
  37. DB::rollBack();
  38. return [false,$e->getMessage()];
  39. }
  40. return [true,''];
  41. }
  42. public function add($data,$user){
  43. list($status,$msg) = $this->orderRule($data);
  44. if(!$status) return [$status,$msg];
  45. try{
  46. DB::beginTransaction();
  47. $material_model = new PurchaseOrder();
  48. $material_model->order_number = $data['order_number'];
  49. $material_model->depart_id = $data['depart_id'];
  50. $material_model->mark = $data['mark'] ?? '';
  51. $material_model->crt_id = $user['id'];
  52. $material_model->save();
  53. if(!empty($data['product'])){
  54. $sub = [];
  55. foreach ($data['product'] as $value){
  56. $sub[] = [
  57. 'order_number' => $data['order_number'],
  58. 'depart_id' => $data['depart_id'],
  59. 'product_id' => $value['product_id'],
  60. 'number' => $value['number'],
  61. 'mark' => $value['mark'] ?? '',
  62. ];
  63. }
  64. PurchaseOrderInfo::insert($sub);
  65. }
  66. DB::commit();
  67. }catch (\Throwable $e){
  68. DB::rollBack();
  69. return [false,$e->getMessage()];
  70. }
  71. return [true,''];
  72. }
  73. public function detail($data){
  74. if($this->isEmpty($data,'order_number')) return [false,'请选择数据'];
  75. $order = PurchaseOrder::where('order_number',$data['order_number'])
  76. ->where('del_time',0)
  77. ->select('id','order_number','depart_id','mark','state','crt_id')
  78. ->first();
  79. if(empty($order)) return [false, '采购订单不存在或已被删除'];
  80. $info = PurchaseOrderInfo::where('del_time',0)
  81. ->where('order_number',$data['order_number'])
  82. ->select('id','order_number','depart_id','product_id','number','mark')
  83. ->get()->toArray();
  84. $order['product'] = $info;
  85. return [true, $order];
  86. }
  87. public function del($data){
  88. if($this->isEmpty($data,'order_number')) return [false,'请选择数据!'];
  89. $bool = PurchaseOrder::where('order_number',$data['order_number'])
  90. ->where('state','>',PurchaseOrder::STATE_ZERO)->exists();
  91. if($bool) return [false,'采购订单已审核,删除失败!'];
  92. try{
  93. DB::beginTransaction();
  94. PurchaseOrder::where('order_number',$data['order_number'])->update([
  95. 'del_time'=>time()
  96. ]);
  97. PurchaseOrderInfo::where('order_number',$data['order_number'])->update([
  98. 'del_time'=>time()
  99. ]);
  100. DB::commit();
  101. }catch (\Throwable $e){
  102. DB::rollBack();
  103. return [false,$e->getMessage()];
  104. }
  105. return [true,''];
  106. }
  107. public function getList($data,$user){
  108. $model = PurchaseOrder::where('del_time',0)
  109. ->select('order_number','id','depart_id','mark','crt_time','state','crt_id')
  110. ->orderby('id', 'desc');
  111. if(! empty($data['order_number'])) $model->where('order_number', 'LIKE', '%'.$data['order_number'].'%');
  112. if(! empty($data['depart_id'])) $model->where('depart_id', $data['depart_id']);
  113. if(! empty($data['company_id'])) $model->where('company_id', $data['company_id']);
  114. if(isset($data['state'])) $model->where('state',$data['state']);
  115. if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) {
  116. $return = $this->changeDateToTimeStampAboutRange($data['crt_time']);
  117. $model->whereBetween('crt_time',[$return[0],$return[1]]);
  118. }
  119. $list = $this->limit($model,'',$data);
  120. $list = $this->fillListData($list);
  121. return [true, $list];
  122. }
  123. public function fillListData($data){
  124. if(empty($data['data'])) return $data;
  125. $depart_id = array_unique(array_column($data['data'],'depart_id'));
  126. $depart_map = Depart::whereIn('id',$depart_id)
  127. ->pluck('title','id')
  128. ->toArray();
  129. $emp_id = array_unique(array_column($data['data'],'crt_id'));
  130. $emp_map = Employee::whereIn('id',$emp_id)
  131. ->pluck('emp_name','id')
  132. ->toArray();
  133. foreach ($data['data'] as $key => $value){
  134. $data['data'][$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d H:i:s",$value['crt_time']) : '';
  135. $data['data'][$key]['depart_name'] = $depart_map[$value['depart_id']] ?? '';
  136. $data['data'][$key]['crt_name'] = $emp_map[$value['crt_id']] ?? '';
  137. }
  138. return $data;
  139. }
  140. public function orderRule(&$data, $is_check = true){
  141. if($this->isEmpty($data,'depart_id')) return [false,'部门不能为空!'];
  142. if($this->isEmpty($data,'product')) return [false,'产品不能为空!'];
  143. foreach ($data['product'] as $value){
  144. if(empty($value['number'])) return [false,'产品数量不能为空'];
  145. if(! is_numeric($value['number']) || $value['number'] < 0) return [false,'产品数量不正确'];
  146. $formattedNumber = number_format($value['number'], 2, '.', '');
  147. if($formattedNumber != $value['number']) return [false,'产品数量请不要超过两位小数'];
  148. }
  149. if($is_check){
  150. $order_number = (new OrderNoService())->createOrderNumber(PurchaseOrder::prefix);
  151. if(empty($order_number)) return [false,'采购单号生成失败!'];
  152. $data['order_number'] = $order_number;
  153. }else{
  154. if($this->isEmpty($data,'order_number')) return [false,'采购单号不能为空!'];
  155. }
  156. return [true, ''];
  157. }
  158. public function purchaseOrderConfirm($data,$user){
  159. if(empty($data['order_number'])) return [false, '请选择数据'];
  160. $order = PurchaseOrder::where('order_number',$data['order_number'])
  161. ->where('del_time',0)
  162. ->first();
  163. if(empty($order)) return [false, '采购订单不存在或已被删除'];
  164. if($order->state != PurchaseOrder::STATE_ZERO) return [false, '请确认采购订单状态,操作失败'];
  165. PurchaseOrder::where('order_number',$data['order_number'])
  166. ->where('del_time',0)
  167. ->update(['state' => PurchaseOrder::STATE_TWO]);
  168. return [true,''];
  169. }
  170. }