InventoryService.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. <?php
  2. namespace App\Service;
  3. use App\Model\Employee;
  4. use App\Model\InventoryOrder;
  5. use App\Model\InventoryOrderAsset;
  6. use Illuminate\Support\Facades\DB;
  7. class InventoryService extends Service
  8. {
  9. public function edit($data){
  10. list($status,$msg) = $this->orderRule($data,false);
  11. if(!$status) return [$status,$msg];
  12. try{
  13. DB::beginTransaction();
  14. $inventory_model = InventoryOrder::where('order_no',$data['order_no'])->first();
  15. $inventory_model->order_no = $data['order_no'];
  16. $inventory_model->oa_employee_id = $data['oa_employee_id'] ?? 0;
  17. $inventory_model->save();
  18. InventoryOrderAsset::where('order_no',$data['order_no'])->update([
  19. 'del_time' => time()
  20. ]);
  21. if(! empty($data['sub'])){
  22. $sub = [];
  23. foreach ($data['sub'] as $value){
  24. $sub[] = [
  25. 'asset_id' => $value['asset_id'],
  26. 'remark' => $value['remark'],
  27. 'order_no' => $data['order_no'],
  28. 'area' => $value['area'],
  29. ];
  30. }
  31. InventoryOrderAsset::insert($sub);
  32. }
  33. DB::commit();
  34. }catch (\Throwable $e){
  35. DB::rollBack();
  36. return [false,$e->getMessage()];
  37. }
  38. return [true,''];
  39. }
  40. public function add($data,$user){
  41. list($status,$msg) = $this->orderRule($data);
  42. if(!$status) return [$status,$msg];
  43. try{
  44. DB::beginTransaction();
  45. $inventory_model = new InventoryOrder();
  46. $inventory_model->order_no = $data['order_no'];
  47. $inventory_model->oa_employee_id = $data['oa_employee_id'] ?? 0;
  48. $inventory_model->crt_id = $user['id'];
  49. $inventory_model->save();
  50. if(! empty($data['sub'])){
  51. $sub = [];
  52. foreach ($data['sub'] as $value){
  53. $sub[] = [
  54. 'asset_id' => $value['asset_id'],
  55. 'remark' => $value['remark'],
  56. 'order_no' => $data['order_no'],
  57. 'area' => $value['area'],
  58. ];
  59. }
  60. InventoryOrderAsset::insert($sub);
  61. }
  62. DB::commit();
  63. }catch (\Throwable $e){
  64. DB::rollBack();
  65. return [false,$e->getMessage()];
  66. }
  67. return [true,''];
  68. }
  69. public function detail($data){
  70. if($this->isEmpty($data,'order_no')) return [false,'请选择数据'];
  71. $order = InventoryOrder::where('order_no',$data['order_number'])
  72. ->where('del_time',0)
  73. ->select('id','order_no','crt_time','state','crt_id')
  74. ->first();
  75. if(empty($order)) return [true,[]];
  76. $order = $order->toArray();
  77. $apply = InventoryOrderAsset::where('order_no',$data['order_no'])
  78. ->where('del_time',0)
  79. ->select('id','asset_id','state','remark','order_no','area')
  80. ->get()
  81. ->toArray();
  82. $order['sub'] = $apply;
  83. return [true,$order];
  84. }
  85. public function del($data){
  86. if($this->isEmpty($data,'order_no')) return [false,'请选择数据!'];
  87. $bool = InventoryOrder::whereIn('order_no',$data['order_no'])
  88. ->where('status','>',InventoryOrder::STATE_ZERO)
  89. ->exists();
  90. if($bool) return [false,'请确认盘点单状态,删除失败!'];
  91. try{
  92. DB::beginTransaction();
  93. InventoryOrder::whereIn('order_no',$data['order_no'])
  94. ->where('del_time',0)
  95. ->update(['del_time' => time()]);
  96. InventoryOrderAsset::whereIn('order_no',$data['order_no'])
  97. ->where('del_time',0)
  98. ->update(['del_time' => time()]);
  99. DB::commit();
  100. }catch (\Throwable $e){
  101. DB::rollBack();
  102. return [false,$e->getMessage()];
  103. }
  104. return [true,'删除成功'];
  105. }
  106. public function getList($data){
  107. $model = InventoryOrder::where('del_time',0)
  108. ->select('order_no','id','crt_time','state','crt_id')
  109. ->orderby('id', 'desc');
  110. if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])){
  111. $return = $this->changeDateToTimeStampAboutRange($data['crt_time']);
  112. $model->where('crt_time','>=',$return[0]);
  113. $model->where('crt_time','<',$return[1]);
  114. }
  115. if(! empty($data['order_no'])) $model->where('order_no', 'LIKE', '%'.$data['order_no'].'%');
  116. if(! empty($data['state'])) $model->where('state', $data['state']);
  117. $list = $this->limit($model,'',$data);
  118. $list = $this->fillListData($list);
  119. return [true, $list];
  120. }
  121. public function fillListData($data){
  122. if(empty($data['data'])) return $data;
  123. $emp_map = Employee::whereIn('id',array_column($data['data'],'crt_id'))->pluck('emp_name','id')->toArray();
  124. date_default_timezone_set('PRC');
  125. foreach ($data['data'] as $key => $value){
  126. $data['data'][$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d",$value['crt_time']) : '';
  127. $data['data'][$key]['crt_name'] = $emp_map[$value['crt_id']] ?? '';
  128. }
  129. return $data;
  130. }
  131. public function orderRule(&$data, $is_check = true){
  132. if($this->isEmpty($data,'sub')) return [false,'盘点数据不能为空!'];
  133. if($is_check){
  134. $order_no = $this->createOrderNumber();
  135. if(empty($order_no)) return [false,'盘点单号生成失败!'];
  136. $data['order_no'] = $order_no;
  137. }else{
  138. if($this->isEmpty($data,'order_no')) return [false,'盘点单号不能为空!'];
  139. $bool = InventoryOrder::where('del_time',0)
  140. ->where('state','>',InventoryOrder::STATE_ZERO)
  141. ->exists();
  142. if($bool) return [false,'编辑失败,请确认盘点单状态!'];
  143. }
  144. return [true, ];
  145. }
  146. public function createOrderNumber(){
  147. $str = InventoryOrder::prefix . date('Ymd',time());
  148. $order_number = InventoryOrder::where('order_no','Like','%'. $str . '%')
  149. ->max('order_no');
  150. if(empty($order_number)){
  151. $number = str_pad(1,6,'0',STR_PAD_LEFT);
  152. $number = $str . $number;
  153. }else{
  154. $tmp = substr($order_number, -6);
  155. $tmp = $tmp + 1;
  156. if(strlen($tmp) > 6) return '';
  157. $number = str_pad($tmp,6,'0',STR_PAD_LEFT);
  158. $number = $str . $number;
  159. }
  160. return $number;
  161. }
  162. public function updateAssetState($data){
  163. list($status,$msg) = $this->updateAssetStateRule($data);
  164. if(! $status) return [false,$msg];
  165. try {
  166. DB::beginTransaction();
  167. foreach ($data as $value){
  168. InventoryOrderAsset::whereIn('id',$value['id'])
  169. ->where('del_time',0)
  170. ->update([
  171. 'remark' => $value['remark'],
  172. 'state' => $value['state']
  173. ]);
  174. }
  175. DB::commit();
  176. }catch (\Exception $exception){
  177. DB::rollBack();
  178. return [false,$exception->getMessage()];
  179. }
  180. return [true,''];
  181. }
  182. public function updateAssetStateRule($data){
  183. if(empty($data['data'])) return [false,'盘点单资产数据不能为空'];
  184. $id = array_column($data['data'],'id');
  185. $bool = InventoryOrderAsset::whereIn('id',$id)
  186. ->where('del_time',0)
  187. ->where('state','>',InventoryOrderAsset::STATE_ZERO)
  188. ->exists();
  189. if($bool) return [false,'请确认盘点数据资产的状态,盘点失败!'];
  190. return [true,''];
  191. }
  192. public function updateOrderState($data){
  193. list($status,$msg) = $this->updateOrderStateRule($data);
  194. if(! $status) return [false,$msg];
  195. InventoryOrder::where('order_no',$data['order_no'])
  196. ->where('del_time',0)
  197. ->update(['state' => $data['state']]);
  198. return [true,''];
  199. }
  200. public function updateOrderStateRule($data){
  201. if(empty($data['order_no'])) return [false,'盘点单单号不能为空'];
  202. if(empty($data['state'])) return [false,'盘点单状态不能为空'];
  203. $bool = InventoryOrder::where('order_no',$data['order_no'])
  204. ->where('del_time',0)
  205. ->where('state','>',InventoryOrder::STATE_ZERO)
  206. ->exists();
  207. if($bool) return [false,'请确认盘点单的状态,操作失败!'];
  208. return [true,''];
  209. }
  210. }