DeleteService.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688
  1. <?php
  2. namespace App\Service;
  3. use App\Model\Construction;
  4. use App\Model\ConstructionInfo;
  5. use App\Model\Customer;
  6. use App\Model\CustomerAccessFlat;
  7. use App\Model\CustomerInfo;
  8. use App\Model\Depart;
  9. use App\Model\Employee;
  10. use App\Model\EmployeeDepartPermission;
  11. use App\Model\OrderOperation;
  12. use App\Model\SalesOrder;
  13. use App\Model\SalesOrderInfo;
  14. use App\Model\ScheduleInfo;
  15. use App\Model\SeeRange;
  16. use Illuminate\Support\Facades\DB;
  17. class DeleteService extends Service
  18. {
  19. public function getMan($data,$user){
  20. if(empty($data['id']) || empty($data['type']) || empty($data['man_type'])) return [false, '必填参数不能为空!'];
  21. $return = [];
  22. if($data['type'] == 1){
  23. $return = $this->getSaleOrderMan($data);
  24. }
  25. return [true, $return];
  26. }
  27. public function delete($data,$user){
  28. if(empty($data['id']) || empty($data['type']) || empty($data['man_type']) || empty($data['man'])) return [false, '必填参数不能为空!'];
  29. try {
  30. DB::beginTransaction();
  31. if($data['type'] == 1){
  32. $this->delSaleOrderMan($data,$user);
  33. }
  34. DB::commit();
  35. }catch (\Exception $exception){
  36. DB::rollBack();
  37. return [false,$exception->getMessage()];
  38. }
  39. return [true,''];
  40. }
  41. public function getSaleOrderMan($data){
  42. $man_id = SalesOrderInfo::where('del_time',0)
  43. ->where('sales_order_id',$data['id'])
  44. ->where('type',$data['man_type'])
  45. ->get('data_id')->toArray();
  46. $man_id = array_column($man_id,'data_id');
  47. return Employee::whereIn('id',$man_id)->select('id', 'emp_name')->get()->toArray();
  48. }
  49. public function delSaleOrderMan($data,$user){
  50. $time = time();
  51. SalesOrderInfo::where('del_time',0)
  52. ->where('sales_order_id',$data['id'])
  53. ->where('type',$data['man_type'])
  54. ->update(['del_time' => $time]);
  55. if(! empty($data['man'])){
  56. $insert = [];
  57. foreach ($data['man'] as $value){
  58. $insert[] = [
  59. 'sales_order_id' => $data['id'],
  60. 'data_id' => $value,
  61. 'type' => $data['man_type'],
  62. 'crt_time' => $time,
  63. ];
  64. }
  65. SalesOrderInfo::insert($insert);
  66. $type = 0;
  67. if($data['man_type'] == SalesOrderInfo::type_two) $type = OrderOperation::sixty;
  68. if($data['man_type'] == SalesOrderInfo::type_three) $type = OrderOperation::seventeen;
  69. $order = SalesOrder::where('id',$data['id'])->first();
  70. $order = $order->toArray();
  71. if($type){
  72. (new OrderOperationService())->add([
  73. 'order_number' => $order['order_number'],
  74. 'msg' => OrderOperation::$type[$type] ?? "",
  75. 'type' => $type
  76. ],$user);
  77. }
  78. }
  79. }
  80. public function fp($data,$user){
  81. if(empty($data['id']) || empty($data['type']) || empty($data['man'])) return [false, '必填参数不能为空!'];
  82. try {
  83. DB::beginTransaction();
  84. if($data['type'] == 1){
  85. list($status, $msg) = $this->fpSaleOrderMan($data,$user);
  86. }elseif ($data['type'] == 2){
  87. list($status, $msg) = $this->fpCustomerMan($data,$user);
  88. }elseif($data['type'] == 3){
  89. list($status, $msg) = $this->fpConstructionMan($data,$user);
  90. }else{
  91. return [false, '非法操作'];
  92. }
  93. if(! $status) {
  94. DB::rollBack();
  95. return [false, $msg];
  96. }
  97. DB::commit();
  98. }catch (\Exception $exception){
  99. DB::rollBack();
  100. return [false,$exception->getMessage()];
  101. }
  102. return [true,''];
  103. }
  104. public function fpSaleOrderMan($data,$user){
  105. $time = time();
  106. if(! empty($data['man'])){
  107. $insert = [];
  108. foreach ($data['man'] as $value){
  109. $insert[] = [
  110. 'sales_order_id' => $data['id'],
  111. 'data_id' => $value,
  112. 'type' => SalesOrderInfo::type_two,
  113. 'crt_time' => $time,
  114. ];
  115. }
  116. SalesOrderInfo::insert($insert);
  117. $order = SalesOrder::where('id',$data['id'])->first();
  118. $order = $order->toArray();
  119. (new OrderOperationService())->add([
  120. 'order_number' => $order['order_number'],
  121. 'msg' => OrderOperation::$type[OrderOperation::eighteen] ?? "",
  122. 'type' => OrderOperation::eighteen
  123. ],$user);
  124. }
  125. return [true, ''];
  126. }
  127. public function fpCustomerMan($data,$user){
  128. if(! is_array($data['id'])) $data_id = [$data['id']];
  129. else $data_id = $data['id'];
  130. $top_depart_id_map = Customer::whereIn('id', $data_id)->pluck('top_depart_id','id')->all();
  131. $time = time();
  132. if(! empty($data['man'])){
  133. $insert = [];
  134. //协同人
  135. $xt = CustomerInfo::where('del_time',0)
  136. ->whereIn('customer_id',$data_id)
  137. ->where('type',CustomerInfo::type_three)
  138. ->where('data_id',$user['id'])
  139. ->pluck('customer_id')->all();
  140. $emp_map = Employee::whereIn('id',$data['man'])
  141. ->pluck('emp_name','id')
  142. ->toArray();
  143. //获取删除id
  144. $source_id = CustomerInfo::where('del_time',0)
  145. ->whereIn('customer_id',$data_id)
  146. ->where('type',CustomerInfo::type_two)
  147. ->pluck('id')
  148. ->all();
  149. //负责人清除
  150. CustomerInfo::where('del_time',0)
  151. ->whereIn('customer_id',$data_id)
  152. ->where('type', CustomerInfo::type_two)
  153. ->update(['del_time' => $time]);
  154. $send_data = $added_xt = [];
  155. foreach ($data['man'] as $value){
  156. $emp_tmp = $emp_map[$value] ?? "";
  157. if($emp_tmp) $emp_tmp .= "(负责人)";
  158. foreach ($data_id as $c){
  159. //负责人累加
  160. $insert[] = [
  161. 'customer_id' => $c,
  162. 'data_id' => $value,
  163. 'type' => CustomerInfo::type_two,
  164. 'crt_time' => $time,
  165. ];
  166. if(!in_array($c, $xt) && !in_array($c, $added_xt)){
  167. // 协同人累加
  168. $insert[] = [
  169. 'customer_id' => $c,
  170. 'data_id' => $user['id'],
  171. 'type' => CustomerInfo::type_three,
  172. 'crt_time' => $time,
  173. ];
  174. // 记录一下,防止下一个负责人循环时再次进入
  175. $added_xt[] = $c;
  176. }
  177. $send_data[] = [
  178. 'employee_id' => $value,
  179. 'type' => 2,
  180. 'state' => 0,
  181. 'menu_id' => 16,
  182. 'order_number' => $c,
  183. 'tmp_data' => [
  184. $c,
  185. "客户分配",
  186. '成功',
  187. $emp_tmp,
  188. date('Y-m-d H:i:s'),
  189. ],
  190. ];
  191. }
  192. }
  193. if(! empty($insert)){
  194. CustomerInfo::insert($insert);
  195. // 新增
  196. $insertArray = CustomerInfo::whereIn('customer_id', $data_id)
  197. ->where('crt_time', $time)
  198. ->whereIn('type', [CustomerInfo::type_two,CustomerInfo::type_three])
  199. ->select('id as source_id',DB::raw(CustomerAccessFlat::source_type_one .' as source_type'), 'customer_id','data_id as target_id',DB::raw(CustomerAccessFlat::source_type_one .' as type'))
  200. ->get()
  201. ->toArray();
  202. foreach ($insertArray as $key => $value){
  203. $insertArray[$key]['top_depart_id'] = $top_depart_id_map[$value['customer_id']];
  204. }
  205. if(! empty($insertArray)) CustomerAccessFlat::insert($insertArray);
  206. }
  207. if(! empty($source_id)) {
  208. CustomerAccessFlat::where('source_type', CustomerAccessFlat::source_type_one)
  209. ->whereIn('source_id', $source_id)
  210. ->delete();
  211. }
  212. if(! is_array($data['id'])){
  213. $title = Customer::where('id',$data['id'])->value('title') ?? "";
  214. (new OrderOperationService())->add([
  215. 'order_number' => Customer::$order_number . "|" . $data['id'] . "|" . $title,
  216. 'msg' => OrderOperation::$type[OrderOperation::twenty_three] ?? "",
  217. 'type' => OrderOperation::twenty_three
  218. ],$user);
  219. Customer::where('id',$data['id'])->update(['fp_time' => $time]);
  220. }else{
  221. $title = Customer::whereIn('id',$data['id'])->pluck('title','id')->toArray();
  222. foreach($data['id'] as $value){
  223. $t_title = $title[$value] ?? "";
  224. (new OrderOperationService())->add([
  225. 'order_number' => Customer::$order_number . "|" . $value . "|" . $t_title,
  226. 'msg' => OrderOperation::$type[OrderOperation::twenty_three] ?? "",
  227. 'type' => OrderOperation::twenty_three
  228. ],$user);
  229. }
  230. Customer::whereIn('id',$data['id'])->update(['fp_time' => $time]);
  231. }
  232. (new OaService())->sendWxOaCheckMessage($send_data);
  233. }
  234. $see_id = SeeRange::where('del_time',0)
  235. ->whereIn('data_id', $data_id)
  236. ->where('data_type',SeeRange::type_one)
  237. ->where('type',SeeRange::data_three)
  238. ->pluck('id')
  239. ->all();
  240. if(! empty($see_id)) {
  241. CustomerAccessFlat::where('source_type', CustomerAccessFlat::source_type_two)
  242. ->whereIn('source_id', $see_id)
  243. ->delete();
  244. }
  245. //客户被指派的门店 先清空
  246. SeeRange::where('del_time',0)
  247. ->whereIn('data_id', $data_id)
  248. ->where('data_type',SeeRange::type_one)
  249. ->where('type',SeeRange::data_three)
  250. ->update(['del_time' => $time]);
  251. if(! empty($data['fp_top_depart_id'])){
  252. if(! is_array($data['fp_top_depart_id'])) $fp_top_depart_id = [$data['fp_top_depart_id']];
  253. else $fp_top_depart_id = $data['fp_top_depart_id'];
  254. $man = $data['man'] ?? [];
  255. $list = Depart::where('del_time',0)->select('id','parent_id')->get()->toArray();
  256. list($status,$msg) = $this->checkRule($man, $fp_top_depart_id, $list);
  257. if(! $status) return [false, $msg];
  258. $insert = [];
  259. foreach ($data_id as $id){
  260. foreach ($fp_top_depart_id as $value){
  261. $insert[] = [
  262. 'data_id' => $id, //客户id
  263. 'data_type' => SeeRange::type_one,
  264. 'param_id' => $value, //门店id
  265. 'type' => SeeRange::data_three,
  266. 'crt_time' => $time,
  267. ];
  268. }
  269. }
  270. if(! empty($insert)) {
  271. SeeRange::insert($insert);
  272. // 新增
  273. $insertArray2 = SeeRange::whereIn('data_id', $data_id)
  274. ->where('crt_time', $time)
  275. ->where('type', SeeRange::data_three)
  276. ->where('data_type', SeeRange::type_one)
  277. ->select('id as source_id',DB::raw(CustomerAccessFlat::source_type_two .' as source_type'), 'data_id as customer_id','param_id as target_id',DB::raw(CustomerAccessFlat::type_three .' as type'))
  278. ->get()
  279. ->toArray();
  280. foreach ($insertArray2 as $key => $value){
  281. $insertArray2[$key]['top_depart_id'] = $top_depart_id_map[$value['customer_id']];
  282. }
  283. if(! empty($insertArray2)) CustomerAccessFlat::insert($insertArray2);
  284. }
  285. }
  286. return [true, ''];
  287. }
  288. public function fpConstructionMan($data,$user){
  289. $time = time();
  290. //负责人清除
  291. ConstructionInfo::where('del_time',0)
  292. ->where('construction_id',$data['id'])
  293. ->where('type', ConstructionInfo::type_three)
  294. ->update(['del_time' => $time]);
  295. $send_data = [];
  296. if(! empty($data['man'])){
  297. $emp_map = Employee::whereIn('id',$data['man'])
  298. ->pluck('emp_name','id')
  299. ->toArray();
  300. $insert = [];
  301. foreach ($data['man'] as $value){
  302. $emp_tmp = $emp_map[$value] ?? "";
  303. if($emp_tmp) $emp_tmp .= "(施工员)";
  304. $insert[] = [
  305. 'construction_id' => $data['id'],
  306. 'employee_id' => $value,
  307. 'type' => ConstructionInfo::type_three,
  308. 'crt_time' => $time,
  309. 'opt_id' => $user['id'],
  310. ];
  311. $send_data[] = [
  312. 'employee_id' => $value,
  313. 'type' => 2,
  314. 'state' => 0,
  315. 'menu_id' => 34,
  316. 'order_number' => $data['id'],
  317. 'tmp_data' => [
  318. $data['id'],
  319. "施工分配",
  320. '成功',
  321. $emp_tmp,
  322. date('Y-m-d H:i:s'),
  323. ],
  324. ];
  325. }
  326. ConstructionInfo::insert($insert);
  327. $order = Construction::where('id',$data['id'])->first();
  328. $order = $order->toArray();
  329. (new OrderOperationService())->add([
  330. 'order_number' => $order['order_number'],
  331. 'msg' => OrderOperation::$type[OrderOperation::twenty_six] ?? "",
  332. 'type' => OrderOperation::twenty_six
  333. ],$user);
  334. }
  335. (new OaService())->sendWxOaCheckMessage($send_data);
  336. return [true, ''];
  337. }
  338. public function yj($data,$user){
  339. if(empty($data['id']) || empty($data['type']) || empty($data['man'])) return [false, '必填参数不能为空!'];
  340. // $key = "fpyj".$data['id'].$data['type'];
  341. // list($status,$msg) = $this->limitingSendRequestBackgExpire($key);
  342. // if(! $status) return [false,$msg];
  343. try {
  344. DB::beginTransaction();
  345. if($data['type'] == 1){
  346. list($status, $msg) = $this->yjSaleOrderMan($data,$user);
  347. }elseif ($data['type'] == 2){
  348. list($status, $msg) = $this->yjCustomerMan($data,$user);
  349. }else{
  350. return [false, '非法操作'];
  351. }
  352. if(! $status) {
  353. DB::rollBack();
  354. return [false, $msg];
  355. }
  356. DB::commit();
  357. }catch (\Exception $exception){
  358. DB::rollBack();
  359. return [false,$exception->getMessage()];
  360. }
  361. return [true,''];
  362. }
  363. public function yjSaleOrderMan($data,$user){
  364. $time = time();
  365. SalesOrderInfo::where('del_time',0)
  366. ->where('sales_order_id',$data['id'])
  367. ->where('type', SalesOrderInfo::type_two)
  368. ->where('data_id', $user['id'])
  369. ->update(['del_time' => $time]);
  370. if(! empty($data['man'])){
  371. $insert = [];
  372. foreach ($data['man'] as $value){
  373. $insert[] = [
  374. 'sales_order_id' => $data['id'],
  375. 'data_id' => $value,
  376. 'type' => SalesOrderInfo::type_two,
  377. 'crt_time' => $time,
  378. ];
  379. }
  380. SalesOrderInfo::insert($insert);
  381. $order = SalesOrder::where('id',$data['id'])->first();
  382. $order = $order->toArray();
  383. (new OrderOperationService())->add([
  384. 'order_number' => $order['order_number'],
  385. 'msg' => OrderOperation::$type[OrderOperation::nineteen] ?? "",
  386. 'type' => OrderOperation::nineteen
  387. ],$user);
  388. }
  389. return [true, ''];
  390. }
  391. public function yjCustomerMan($data,$user){
  392. $time = time();
  393. if(! is_array($data['id'])) $data_id = [$data['id']];
  394. else $data_id = $data['id'];
  395. $top_depart_id_map = Customer::whereIn('id', $data_id)->pluck('top_depart_id','id')->all();
  396. //获取删除id
  397. $source_id = CustomerInfo::where('del_time',0)
  398. ->whereIn('customer_id',$data_id)
  399. ->where('type',CustomerInfo::type_two)
  400. ->pluck('id')
  401. ->all();
  402. if(! empty($source_id)) {
  403. CustomerAccessFlat::where('source_type', CustomerAccessFlat::source_type_one)
  404. ->whereIn('source_id', $source_id)
  405. ->delete();
  406. }
  407. CustomerInfo::where('del_time',0)
  408. ->whereIn('customer_id', $data_id)
  409. ->where('type', CustomerInfo::type_two)
  410. ->update(['del_time' => $time]);
  411. if(! empty($data['man'])){
  412. $insert = [];
  413. foreach ($data['man'] as $value){
  414. foreach ($data_id as $c){
  415. $insert[] = [
  416. 'customer_id' => $c,
  417. 'data_id' => $value,
  418. 'type' => CustomerInfo::type_two,
  419. 'crt_time' => $time,
  420. ];
  421. }
  422. }
  423. if(! empty($insert)){
  424. CustomerInfo::insert($insert);
  425. // 新增
  426. $insertArray = CustomerInfo::whereIn('customer_id', $data_id)
  427. ->where('crt_time', $time)
  428. ->whereIn('type', [CustomerInfo::type_two])
  429. ->select('id as source_id',DB::raw(CustomerAccessFlat::source_type_one .' as source_type'), 'customer_id','data_id as target_id',DB::raw(CustomerAccessFlat::type_one .' as type'))
  430. ->get()
  431. ->toArray();
  432. foreach ($insertArray as $key => $value){
  433. $insertArray[$key]['top_depart_id'] = $top_depart_id_map[$value['customer_id']];
  434. }
  435. if(! empty($insertArray)) CustomerAccessFlat::insert($insertArray);
  436. }
  437. if(! is_array($data['id'])){
  438. $title = Customer::where('id',$data['id'])->value('title') ?? "";
  439. (new OrderOperationService())->add([
  440. 'order_number' => Customer::$order_number . "|" . $data['id'] . "|" . $title,
  441. 'msg' => OrderOperation::$type[OrderOperation::twenty_four] ?? "",
  442. 'type' => OrderOperation::twenty_four
  443. ],$user);
  444. Customer::where('id',$data['id'])->update(['fp_time' => $time]);
  445. }else{
  446. $title = Customer::whereIn('id',$data['id'])->pluck('title','id')->toArray();
  447. foreach($data['id'] as $value){
  448. $t_title = $title[$value] ?? "";
  449. (new OrderOperationService())->add([
  450. 'order_number' => Customer::$order_number . "|" . $value . "|" . $t_title,
  451. 'msg' => OrderOperation::$type[OrderOperation::twenty_four] ?? "",
  452. 'type' => OrderOperation::twenty_four
  453. ],$user);
  454. }
  455. Customer::whereIn('id',$data['id'])->update(['fp_time' => $time]);
  456. }
  457. }
  458. $see_id = SeeRange::where('del_time',0)
  459. ->whereIn('data_id', $data_id)
  460. ->where('data_type',SeeRange::type_one)
  461. ->where('type',SeeRange::data_three)
  462. ->pluck('id')
  463. ->all();
  464. if(! empty($see_id)) {
  465. CustomerAccessFlat::where('source_type', CustomerAccessFlat::source_type_two)
  466. ->whereIn('source_id', $see_id)
  467. ->delete();
  468. }
  469. //客户被移交的门店 先清空
  470. SeeRange::where('del_time',0)
  471. ->whereIn('data_id', $data_id)
  472. ->where('data_type',SeeRange::type_one)
  473. ->where('type',SeeRange::data_three)
  474. ->update(['del_time' => $time]);
  475. if(! empty($data['fp_top_depart_id'])){
  476. if(! is_array($data['fp_top_depart_id'])) $fp_top_depart_id = [$data['fp_top_depart_id']];
  477. else $fp_top_depart_id = $data['fp_top_depart_id'];
  478. $man = $data['man'] ?? [];
  479. $list = Depart::where('del_time',0)->select('id','parent_id')->get()->toArray();
  480. list($status,$msg) = $this->checkRule($man, $fp_top_depart_id, $list);
  481. if(! $status) return [false, $msg];
  482. $insert = [];
  483. foreach ($data_id as $id){
  484. foreach ($fp_top_depart_id as $value){
  485. $insert[] = [
  486. 'data_id' => $id, //客户id
  487. 'data_type' => SeeRange::type_one,
  488. 'param_id' => $value, //门店id
  489. 'type' => SeeRange::data_three,
  490. 'crt_time' => $time,
  491. ];
  492. }
  493. }
  494. if(! empty($insert)) {
  495. SeeRange::insert($insert);
  496. // 新增
  497. $insertArray2 = SeeRange::whereIn('data_id', $data_id)
  498. ->where('crt_time', $time)
  499. ->where('type', SeeRange::data_three)
  500. ->where('data_type', SeeRange::type_one)
  501. ->select('id as source_id',DB::raw(CustomerAccessFlat::source_type_two .' as source_type'), 'data_id as customer_id','param_id as target_id',DB::raw(CustomerAccessFlat::type_three .' as type'))
  502. ->get()
  503. ->toArray();
  504. foreach ($insertArray2 as $key => $value){
  505. $insertArray2[$key]['top_depart_id'] = $top_depart_id_map[$value['customer_id']];
  506. }
  507. if(! empty($insertArray2)) CustomerAccessFlat::insert($insertArray2);
  508. }
  509. }
  510. return [true, ''];
  511. }
  512. public function checkRule($man_id = [], $top_depart_id = [], $depart_list){
  513. $depart = EmployeeDepartPermission::whereIn('employee_id', $man_id)
  514. ->select('employee_id','depart_id')
  515. ->get()->toArray();
  516. $depart_has = [];
  517. foreach ($depart as $value){
  518. $p = $this->findTopLevelId($depart_list, $value['depart_id']);
  519. if($p > 0) $depart_has[$value['employee_id']][] = $p;
  520. }
  521. if(empty($depart_has)) return [false, '无相关信息能获取到门店数据,校验失败'];
  522. if(count($depart_has) == 1){
  523. $intersection = array_values($depart_has);
  524. $intersection = $intersection[0];
  525. }else{
  526. // 提取所有的子数组
  527. $subArrays = array_map(function($item) {
  528. return $item;
  529. }, $depart_has);
  530. // 使用 array_intersect 计算交集
  531. $intersection = call_user_func_array('array_intersect', $subArrays);
  532. if(empty($intersection)) return [false, '非法数据,请刷新网页重新操作'];
  533. }
  534. foreach ($top_depart_id as $value){
  535. if(! in_array($value, $intersection)) return [false, '非法数据,请刷新网页重新操作'];
  536. }
  537. return [true, ''];
  538. }
  539. public function pq($data,$user){
  540. list($status,$msg) = $this->pqRule($data,$user);
  541. if(! $status) return [false,$msg];
  542. try {
  543. DB::beginTransaction();
  544. if(! empty($msg['schedule_id']) && ! empty($msg['day_start_stamp']) && ! empty($msg['day_end_stamp'])){
  545. //如果已经设置过排期 将子表占用数据释放
  546. $schedule = ScheduleInfo::where('del_time',0)
  547. ->where('schedule_id',$msg['schedule_id'])
  548. ->where('start_time',$msg['day_start_stamp'])
  549. ->where('end_time',$msg['day_end_stamp'])
  550. ->where('is_use','>', ScheduleInfo::not_use)
  551. ->first();
  552. if(! empty($schedule)) ScheduleInfo::where('id',$schedule->id)->update(['is_use' => ScheduleInfo::not_use]);
  553. }
  554. Construction::where('id',$data['id'])->update([
  555. 'schedule_id' => $data['schedule_id'],
  556. 'day_stamp' => $data['day_stamp'],
  557. 'day_start_stamp' => $data['day_start_stamp'],
  558. 'day_end_stamp' => $data['day_end_stamp'],
  559. 'pq_state' => Construction::STATE_ONE
  560. ]);
  561. if(! empty($data['schedule_info_id'])) ScheduleInfo::where('id',$data['schedule_info_id'])->update(['is_use' => 1]);
  562. DB::commit();
  563. }catch (\Exception $exception){
  564. $this->dellimitingSendRequestBackg(ScheduleInfo::limit_key . $data['schedule_info_id']);
  565. DB::rollBack();
  566. return [false,$exception->getMessage()];
  567. }
  568. $this->dellimitingSendRequestBackg(ScheduleInfo::limit_key . $data['schedule_info_id']);
  569. return [true,''];
  570. }
  571. public function pqRule(&$data,$user){
  572. if(empty($data['id'])) return [false, '施工单不能为空!'];
  573. $construction = Construction::where('id',$data['id'])->where('del_time',0)->first();
  574. if(empty($construction)) return [false,'施工单不存在或已被删除'];
  575. $construction = $construction->toArray();
  576. if($construction['state'] != Construction::STATE_TWO) return [false,'施工单未确认无法排期!'];
  577. if(empty($data['schedule_id']) ||empty($data['day_stamp']) || empty($data['day_start_stamp']) || empty($data['day_end_stamp'])) return [false,'排班时间信息不能为空'];
  578. //day_stamp 日期的时间戳(0点的) day_start_stamp 日期加上开始时分的时间戳 day_end_stamp 日期加上结束时分的时间戳
  579. if($construction['day_stamp'] != $data['day_stamp'] || $construction['day_start_stamp'] != $data['day_start_stamp'] && $construction['day_end_stamp'] != $data['day_end_stamp']) {
  580. $schedule_info = ScheduleInfo::where('del_time',0)
  581. ->where('day',$data['day_stamp'])
  582. ->where('start_time',$data['day_start_stamp'])
  583. ->where('end_time',$data['day_end_stamp'])
  584. ->where('is_use',ScheduleInfo::not_use)
  585. ->first();
  586. if(empty($schedule_info)) return [false,'该时间段排班已满或不存在!'];
  587. $data['schedule_info_id'] = $schedule_info->id;
  588. list($status,$msg) = $this->limitingSendRequestBackg(ScheduleInfo::limit_key . $data['schedule_info_id']);
  589. if(! $status) return [false,'操作频繁,请稍等!'];
  590. }else{
  591. return [false,'排期未做更新!'];
  592. }
  593. return [true, $construction];
  594. }
  595. }