InspectService.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. <?php
  2. namespace App\Service;
  3. use App\Model\DeviceOrder;
  4. use App\Model\DeviceOrderInfo;
  5. use App\Model\Employee;
  6. use App\Model\Equipment;
  7. use App\Model\EquipmentXj;
  8. use Illuminate\Support\Facades\DB;
  9. class InspectService extends Service
  10. {
  11. //生成巡检单据
  12. public function addOnSiteInspectionOrder(){
  13. $deviceList = Equipment::where('del_time',0)
  14. ->where('check_cycle','>',0)
  15. ->select('id','title','code','check_cycle')
  16. ->get()->toArray();
  17. if(empty($deviceList)) return [false,'1.暂无启用巡检的设备'];
  18. $timestamp1 = strtotime(date('Y-m-d 00:00:00'));
  19. $timestamp2 = strtotime(date('Y-m-d 23:59:59'));
  20. $equipment_id = array_column($deviceList,'id');
  21. //今天已巡检的设备
  22. $xj_data = DeviceOrderInfo::where('del_time',0)
  23. ->where('type',DeviceOrder::Model_type_one)
  24. ->whereIn('equipment_id', $equipment_id)
  25. ->where('crt_time','>=',$timestamp1)
  26. ->where('crt_time','<=',$timestamp2)
  27. ->select('equipment_id')
  28. ->get()->toArray();
  29. $xj_data = array_column($xj_data,'equipment_id');
  30. if(! empty($xj_data)) {
  31. foreach ($deviceList as $key => $value){
  32. if(in_array($value['id'], $xj_data)) unset($deviceList[$key]);
  33. }
  34. }
  35. if(empty($deviceList)) return [false,'2.今日设备已全部生产巡检单'];
  36. // 设备最大一次的巡检的时间 设置的首次巡检
  37. list($equipment_map,$equipment_first_map) = $this->getXJLastData($equipment_id);
  38. $insert_detail = [];
  39. foreach ($deviceList as $value){
  40. //设备巡检的时间
  41. $first_time = $equipment_map[$value['id']] ?? 0;
  42. if($first_time <= 0) continue;
  43. if($timestamp2 >= $first_time && $timestamp1 <= $first_time){
  44. $insert_detail[] = [
  45. 'equipment_id' => $value['id'],
  46. 'equipment_no' => $value['code'],
  47. ];
  48. }else{
  49. //存在巡检数据 获取数据最近一次的时间 加上巡检周期
  50. $detail_time = strtotime("+{$value['check_cycle']} days", $first_time);
  51. if($timestamp2 >= $detail_time && $timestamp1 <= $detail_time){
  52. $insert_detail[] = [
  53. 'equipment_id' => $value['id'],
  54. 'equipment_no' => $value['code'],
  55. ];
  56. }
  57. }
  58. }
  59. if(empty($insert_detail)) return [false, '3.暂无今日要生成的巡检数据'];
  60. //生成巡检单号
  61. $order_number = $this->createOrderNumber();
  62. try {
  63. DB::beginTransaction();
  64. $time = time();
  65. $model = new DeviceOrder();
  66. $model->type = DeviceOrder::Model_type_one;
  67. $model->order_number = $order_number;
  68. $model->crt_time = $time;
  69. $model->hand_time = $time;
  70. $model->save();
  71. $device_order_id = $model->id;
  72. //详情数据
  73. foreach ($insert_detail as $key => $value){
  74. $insert_detail[$key]['type'] = DeviceOrder::Model_type_one;
  75. $insert_detail[$key]['crt_time'] = $time;
  76. $insert_detail[$key]['device_order_id'] = $device_order_id;
  77. $insert_detail[$key]['order_number'] = $order_number;
  78. }
  79. DeviceOrderInfo::insert($insert_detail);
  80. DB::commit();
  81. }catch (\Throwable $exception){
  82. DB::rollBack();
  83. return [false, $exception->getMessage()];
  84. }
  85. return [true, ''];
  86. }
  87. public function deviceOrderEdit($data,$user){
  88. list($status,$msg) = $this->deviceRule($data, $user, false);
  89. if(!$status) return [$status,$msg];
  90. try {
  91. DB::beginTransaction();
  92. $model = DeviceOrder::where('id',$data['id'])->first();
  93. if($model->del_time > 0) return [false, '单据不存在或已被删除'];
  94. $model->mark = $data['mark'] ?? '';
  95. $model->state = $data['state'] ?? 0;
  96. $model->hand_time = $data['hand_time'] ?? 0;
  97. $model->crt_id = $data['crt_id'] ?? 0;
  98. $model->save();
  99. $time = time();
  100. DeviceOrderInfo::where('del_time',0)
  101. ->where('device_order_id',$data['id'])
  102. ->update(['del_time' => $time]);
  103. if(! empty($data['sub'])){
  104. $insert = [];
  105. foreach ($data['sub'] as $value){
  106. $insert[] = [
  107. 'type' => $data['type'],
  108. 'device_order_id' => $data['id'],
  109. 'order_number' => $model->order_number,
  110. 'equipment_id' => $value['equipment_id'],
  111. 'equipment_no' => $value['equipment_no'],
  112. 'state' => $value['state'],
  113. 'mark' => $value['mark'] ?? "",
  114. 'crt_time' => $time,
  115. ];
  116. }
  117. DeviceOrderInfo::insert($insert);
  118. }
  119. DB::commit();
  120. }catch (\Exception $exception){
  121. DB::rollBack();
  122. return [false,$exception->getMessage()];
  123. }
  124. return [true, ''];
  125. }
  126. public function deviceOrderAdd($data,$user){
  127. list($status,$msg) = $this->deviceRule($data, $user);
  128. if(!$status) return [$status,$msg];
  129. try {
  130. DB::beginTransaction();
  131. $order_number = $this->createOrderNumber($data['type']);
  132. $model = new DeviceOrder();
  133. $model->type = $data['type'];
  134. $model->order_number = $order_number;
  135. $model->mark = $data['mark'] ?? '';
  136. $model->state = $data['state'] ?? 0;
  137. $model->hand_time = $data['hand_time'] ?? 0;
  138. $model->crt_id = $data['crt_id'];
  139. $model->save();
  140. $device_order_id = $model->id;
  141. $time = time();
  142. if(! empty($data['sub'])){
  143. $insert = [];
  144. foreach ($data['sub'] as $value){
  145. $insert[] = [
  146. 'type' => $data['type'],
  147. 'device_order_id' => $device_order_id,
  148. 'order_number' => $order_number,
  149. 'equipment_id' => $value['equipment_id'],
  150. 'equipment_no' => $value['equipment_no'],
  151. 'state' => $value['state'],
  152. 'mark' => $value['mark'] ?? "",
  153. 'crt_time' => $time,
  154. ];
  155. }
  156. DeviceOrderInfo::insert($insert);
  157. }
  158. DB::commit();
  159. }catch (\Exception $exception){
  160. DB::rollBack();
  161. return [false,$exception->getMessage()];
  162. }
  163. return [true, ''];
  164. }
  165. public function deviceRule(&$data, $user, $is_add = true){
  166. if(empty($data['type'])) return [false,'单据类型不能为空'];
  167. if(! isset(DeviceOrder::$prefix[$data['type']])) return [false,'单据类型不存在'];
  168. if(! isset($data['crt_id'])) return [false,'单据创建人不能为空'];
  169. if(empty($data['hand_time'])) return [false,'单据日期不能为空'];
  170. if($data['type'] == DeviceOrder::Model_type_one) $data['hand_time'] = strtotime($data['hand_time']);
  171. if(empty($data['sub'])) return [false, '表体信息不能为空'];
  172. foreach ($data['sub'] as $value){
  173. if(empty($value['equipment_id']) || empty($value['equipment_no'])) return [false, '设备信息不能为空'];
  174. if(! isset($value['state']) || ! isset(DeviceOrderInfo::$prefix[$value['state']])) return [false, '设备状态信息不能为空'];
  175. }
  176. if(! $is_add){
  177. if(empty($data['id'])) return [false, 'ID不能为空'];
  178. }
  179. return [true, $data];
  180. }
  181. public function deviceOrderDel($data,$user){
  182. if($this->isEmpty($data,'id')) return [false,'请选择数据'];
  183. try {
  184. DB::beginTransaction();
  185. $time = time();
  186. DeviceOrder::where('del_time',0)->where('id',$data['id'])->update(['del_time' => $time]);
  187. DeviceOrderInfo::where('device_order_id',$data['id'])
  188. ->where('del_time',0)
  189. ->update(['del_time' => $time]);
  190. DB::commit();
  191. }catch (\Exception $exception){
  192. DB::rollBack();
  193. return [false,$exception->getMessage()];
  194. }
  195. return [true, ''];
  196. }
  197. public function deviceOrderDetail($data,$user){
  198. if($this->isEmpty($data,'id')) return [false,'请选择数据'];
  199. $customer = DeviceOrder::where('del_time',0)
  200. ->where('id',$data['id'])
  201. ->first();
  202. if(empty($customer)) return [false,'单据不存在或已被删除'];
  203. $customer = $customer->toArray();
  204. $customer['type_title'] = DeviceOrder::$prefix_title[$customer['type']] ?? "";
  205. $customer['crt_title'] = Employee::where('id',$customer['crt_id'])->value('emp_name') ?? "系统生成";
  206. $customer['crt_time'] = $customer['crt_time'] ? date("Y-m-d H:i:s",$customer['crt_time']): '';
  207. $customer['hand_time'] = $customer['hand_time'] ? date("Y-m-d",$customer['hand_time']): '';
  208. $customer['sub'] = [];
  209. $sub = DeviceOrderInfo::where('del_time',0)
  210. ->where('device_order_id',$data['id'])
  211. ->select('equipment_id','equipment_no','state','mark')
  212. ->get()->toArray();
  213. $equ = Equipment::whereIn('id',array_unique(array_column($sub,'equipment_id')))
  214. ->pluck('title','id')
  215. ->toArray();
  216. foreach ($sub as $key => $value){
  217. $sub[$key]['equipment_title'] = $equ[$value['equipment_id']] ?? "";
  218. }
  219. $customer['sub'] = $sub;
  220. return [true, $customer];
  221. }
  222. //单据列表
  223. public function deviceOrderList($data){
  224. $model = new DeviceOrder;
  225. $model = $model->where('del_time',0)
  226. ->select('type','id','order_number','crt_id','crt_time','mark','state','hand_time')
  227. ->orderby('id', 'desc');
  228. if(! empty($data['order_number'])) $model->where('order_number', 'LIKE', '%'.$data['order_number'].'%');
  229. if(isset($data['type'])) $model->where('type', $data['type']);
  230. if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) $model->whereBetween('crt_time',[$data['crt_time'][0],$data['crt_time'][1]]);
  231. if(! empty($data['hand_time'][0]) && ! empty($data['hand_time'][1])) $model->whereBetween('hand_time',[$data['hand_time'][0],$data['hand_time'][1]]);
  232. if(! empty($data['crt_id'])) $model->where('crt_id', $data['crt_id']);
  233. $list = $this->limit($model,'',$data);
  234. $list = $this->fillData($list);
  235. return [true, $list];
  236. }
  237. public function fillData($data){
  238. if(empty($data['data'])) return $data;
  239. $emp = Employee::whereIn('id',array_unique(array_filter(array_column($data['data'],'crt_id'))))
  240. ->pluck('emp_name','id')
  241. ->toArray();
  242. foreach ($data['data'] as $key => $value){
  243. $data['data'][$key]['type_title'] = DeviceOrder::$prefix_title[$value['type']] ?? "";
  244. $data['data'][$key]['crt_time'] = $value['crt_time'] ? date('Y-m-d',$value['crt_time']) : '';
  245. $data['data'][$key]['hand_time'] = $value['hand_time'] ? date('Y-m-d',$value['hand_time']) : '';
  246. $data['data'][$key]['crt_title'] = $value['crt_id'] ? $emp[$value['crt_id']] : "系统生成";
  247. }
  248. return $data;
  249. }
  250. public function createOrderNumber($type = 1){
  251. $str = DeviceOrder::$prefix[$type] . date('Ymd',time());
  252. $order_number = DeviceOrder::where('order_number','Like','%'. $str . '%')
  253. ->where('type',$type)
  254. ->max('order_number');
  255. if(empty($order_number)){
  256. $number = str_pad(1,2,'0',STR_PAD_LEFT);
  257. $number = $str . $number;
  258. }else{
  259. $tmp = substr($order_number, -2);
  260. $tmp = $tmp + 1;
  261. //超过99999
  262. if(strlen($tmp) > 5) return '';
  263. $number = str_pad($tmp,2,'0',STR_PAD_LEFT);
  264. $number = $str . $number;
  265. }
  266. return $number;
  267. }
  268. // 设置的首次巡检,设备最大一次的巡检的时间
  269. public function getXJLastData($equipment_id = []){
  270. if(empty($equipment_id)) return [];
  271. //设置的首次巡检
  272. $equipment = EquipmentXj::where('del_time',0)
  273. ->whereIn('equipment_id',$equipment_id)
  274. ->select('equipment_id',DB::raw('MAX(first_time) as first_time'))
  275. ->groupBy('equipment_id')
  276. ->get()->toArray();
  277. $equipment_first_map = array_column($equipment,'first_time','equipment_id');
  278. //巡检单明细数据
  279. $xj_data = DeviceOrderInfo::where('del_time',0)
  280. ->where('type',DeviceOrder::Model_type_one)
  281. ->whereIn('equipment_id', $equipment_id)
  282. ->select('equipment_id', DB::raw('MAX(crt_time) as crt_time'))
  283. ->groupBy('equipment_id')
  284. ->get()->toArray();
  285. $map = array_column($xj_data,'crt_time','equipment_id');
  286. //设备最近一次的巡检的时间 (通过比较 巡检单明细数据 设置的首次巡检 谁大取谁)
  287. $equipment_map = [];
  288. foreach ($equipment as $value){
  289. $xj_tmp = $map[$value['equipment_id']] ?? 0;
  290. if(empty($xj_tmp)) {
  291. $equipment_map[$value['equipment_id']] = $value['first_time'] ?? 0;
  292. }else{
  293. if($xj_tmp < $value['first_time']){
  294. $equipment_map[$value['equipment_id']] = $value['first_time'] ?? 0;
  295. }else{
  296. $equipment_map[$value['equipment_id']] = $xj_tmp;
  297. }
  298. }
  299. }
  300. return [$equipment_map,$equipment_first_map];
  301. }
  302. }