WorkOrderController.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Filters\WorkOrderFilters;
  4. use App\Http\Requests\WorkOrder\WorkOrderRequest;
  5. use App\Logistic;
  6. use App\OrderIssue;
  7. use App\Services\OrderService;
  8. use App\Services\OwnerService;
  9. use App\Services\WorkOrderCommoditiesService;
  10. use App\Services\WorkOrderLogService;
  11. use App\Services\WorkOrderService;
  12. use App\WorkOrder;
  13. use Illuminate\Http\Request;
  14. use Illuminate\Support\Facades\Gate;
  15. class WorkOrderController extends Controller
  16. {
  17. /**
  18. * @var WorkOrderService $service
  19. * @var WorkOrderCommoditiesService $commoditiesService
  20. * @var WorkOrderLogService $logService
  21. * @var OrderService $orderService
  22. * @var OwnerService $ownerService
  23. */
  24. public $service;
  25. public $commoditiesService;
  26. public $logService;
  27. public $orderService;
  28. public $ownerService;
  29. public function __construct(
  30. WorkOrderService $service,
  31. WorkOrderCommoditiesService $commoditiesService,
  32. WorkOrderLogService $logService,
  33. OrderService $orderService,
  34. OwnerService $ownerService)
  35. {
  36. $this->service = $service;
  37. $this->commoditiesService = $commoditiesService;
  38. $this->logService = $logService;
  39. $this->orderService = $orderService;
  40. $this->ownerService = $ownerService;
  41. }
  42. public function index(Request $request, WorkOrderFilters $filters)
  43. {
  44. if (Gate::denies('订单管理-工单处理-查询')) return redirect('/');
  45. $workOrders = WorkOrder::query()->filter($filters)->defaultWith()->orderBy('created_at')->orderByDesc('status')->paginate($request['paginate'] ?? 50);
  46. $logistics = Logistic::all();
  47. $orderIssueTypes = $this->service->getIssueType();
  48. $owners = $this->ownerService->getAuthorizedOwners();
  49. $this->service->tags($workOrders);
  50. return view('order.workOrder.index', compact('workOrders', 'logistics', 'orderIssueTypes', 'owners'));
  51. }
  52. // 审核 api
  53. public function reviewApi(Request $request): array
  54. {
  55. if (Gate::denies('订单管理-工单处理-审核')) return ['success' => false, 'message' => '没有对应的编辑权限'];
  56. $workOrder = WorkOrder::query()->find($request['id']);
  57. return $this->service->review($workOrder);
  58. }
  59. // 批量审核 api
  60. public function batchReviewApi(Request $request): array
  61. {
  62. if (Gate::denies('订单管理-工单处理-审核')) {
  63. return ['success' => false, 'message' => '没有对应的编辑权限'];
  64. }
  65. if (WorkOrder::query()->whereIn('id', $request['ids'])->whereNotNull('review_at')->exists())
  66. return ['success' => false, 'message' => '选中的工单已有审核完成,刷新页面重试'];
  67. $work_orders = WorkOrder::query()->whereIn('id', $request['ids'])->get();
  68. $this->service->tags($work_orders);
  69. return $this->service->batchReview($work_orders);
  70. }
  71. public function buildOrderIssueApi(Request $request): array
  72. {
  73. if (Gate::denies('订单管理-订单问题件生成'))
  74. return ['success' => false, 'message' => '没有对应权限'];
  75. $work_orders = WorkOrder::query()->whereIn('id', $request['ids'])->get();
  76. if (count($work_orders) == 0) return ['success' => false, 'message' => '刷新当前页面重试'];
  77. if (OrderIssue::query()->whereIn('order_id', $work_orders->map(function ($item) {
  78. return $item['order_id'];
  79. }))->exists()) {
  80. return ['success' => false, 'message' => '已有对应的问题件'];
  81. }
  82. $result = $this->service->buildOrderIssue($work_orders);
  83. if (!$result['success']) return $result;
  84. $workOrders = WorkOrder::query()->defaultWith()->whereIn('id', $request['ids'])->get();
  85. $this->service->tags($workOrders);
  86. return ['success' => true, 'data' => $workOrders];
  87. }
  88. public function storeApi(Request $request): array
  89. {
  90. if (Gate::denies('订单管理-订单-生成工单'))
  91. return ['success' => false, 'message' => '没有对应权限'];
  92. $params = $request->all();
  93. if (count($params) == 0) return ['success' => false, 'message' => '参数异常'];
  94. app('OrderService')->syncOrderByCodes(array_map(function ($param) {
  95. return $param['order_no'];
  96. }, $params));
  97. return $this->service->build($params);
  98. }
  99. public function interceptApi(WorkOrderRequest $request):array
  100. {
  101. if (Gate::denies('订单管理-订单-生成工单'))
  102. return ['success' => false, 'message' => '没有对应权限'];
  103. $orderNos = $request->input('orderNos',[]);
  104. $this->orderService->syncOrderByCodes($orderNos);
  105. $remark = $request->input('remark','拦截工单');
  106. foreach ($orderNos as $item) {
  107. $this->service->createInterceptWorkOrder(['order_no'=>$item,'remark' => $remark]);
  108. }
  109. return ['success' => true];
  110. }
  111. public function informationChangeApi(WorkOrderRequest $request): array
  112. {
  113. if (Gate::denies('订单管理-订单-生成工单'))
  114. return ['success' => false, 'message' => '没有对应权限'];
  115. $orderNo = $request->input('order_no','');
  116. $this->orderService->syncOrderByCodes([$orderNo]);
  117. $this->service->createInformationChangeWorkOrder(['order_no'=>$orderNo,'remark' => $request->input('remark')]);
  118. return ['success' => true];
  119. }
  120. public function lossApi(WorkOrderRequest $request): array
  121. {
  122. if (Gate::denies('订单管理-订单-生成工单'))
  123. return ['success' => false, 'message' => '没有对应权限'];
  124. $orderNo = $request->input('order_no','');
  125. $this->orderService->syncOrderByCodes([$orderNo]);
  126. $this->service->createLossWorkOrder($request->all());
  127. return ['success' => true];
  128. }
  129. public function damagedApi(WorkOrderRequest $request): array
  130. {
  131. if (Gate::denies('订单管理-订单-生成工单'))
  132. return ['success' => false, 'message' => '没有对应权限'];
  133. $this->orderService->syncOrderByCodes([$request->input('order_no')]);
  134. $workOrder = $this->service->createDamagedWorkOrder($request->all());
  135. if ($workOrder) return ['success' => true];
  136. else return ['success' => false];
  137. }
  138. public function expressAbnormalApi(Request $request): array
  139. {
  140. if (Gate::denies('订单管理-订单-生成工单'))
  141. return ['success' => false, 'message' => '没有对应权限'];
  142. $this->orderService->syncOrderByCodes([$request->input('order_no')]);
  143. $this->service->createExpressAbnormalWorkOrder($request->all());
  144. return ['success' => true];
  145. }
  146. public function mistakeApi(Request $request): array
  147. {
  148. if (Gate::denies('订单管理-订单-生成工单'))
  149. return ['success' => false, 'message' => '没有对应权限'];
  150. $this->orderService->syncOrderByCodes([$request->input('order_no')]);
  151. $this->service->createMistakeWorkOrder($request->all());
  152. return ['success' => true];
  153. }
  154. public function fillLossApi(Request $request): array
  155. {
  156. if (Gate::denies('订单管理-订单-宝时编辑') || Gate::denies('订单管理-订单-货主编辑')){
  157. return ['success' => false, 'message' => '没有对应权限'];
  158. }
  159. $workOrder = $this->service->find($request->input('id'));
  160. $this->service->fillLossWorkOrder($workOrder,$request->all());
  161. $workOrder->loadDefaultWith();
  162. return ['success' => true,'data' => $workOrder];
  163. }
  164. public function updateLossApi(Request $request): array
  165. {
  166. if (Gate::denies('订单管理-工单处理-货主编辑'))
  167. return ['success' => false, 'message' => '没有对应权限'];
  168. $workOrder = $this->service->find($request->input('id'));
  169. if (!$workOrder) return ['success' => false, 'message' => '参数异常'];
  170. $workOrder = $this->service->fillLossWorkOrder($workOrder, $request->all());
  171. if (!$workOrder) return ['success' => false, 'message' => '创建异常'];
  172. $workOrder->loadDefaultWith();
  173. return ['success' => true, 'data' => $workOrder];
  174. }
  175. public function updateIssueTypeApi(Request $request): array
  176. {
  177. if (Gate::denies('订单管理-工单处理-审核'))
  178. return ['success' => false, 'message' => '没有对应权限'];
  179. WorkOrder::query()->where('id', $request['id'])->update(['order_issue_type_id' => $request['type_id']]);
  180. return ['success' => true];
  181. }
  182. public function batchUpdateIssueTypeApi(Request $request): array
  183. {
  184. if (Gate::denies('订单管理-工单处理-审核'))
  185. return ['success' => false, 'message' => '没有对应权限'];
  186. WorkOrder::query()->whereIn('id', $request['ids'])->update(['order_issue_type_id' => $request['type']]);
  187. $items = WorkOrder::query()->defaultWith()->whereIn('id', $request['ids'])->get();
  188. $this->service->tags($items);
  189. return ['success' => true, 'data' => $items];
  190. }
  191. public function destroyApi($id): array
  192. {
  193. if (Gate::denies('订单管理-工单处理-删除'))
  194. return ['success' => false, 'message' => '没有对应权限'];
  195. $workOrder = $this->service->find($id);
  196. if (!$workOrder)
  197. return ['success' => false, 'message' => '对应工单信息未找到'];
  198. if ($workOrder->status == '已处理') {
  199. return ['success' => false, 'message' => '对应工单已处理,拒绝删除'];
  200. }
  201. WorkOrder::query()->where('id', $id)->Delete();
  202. return ['success' => true];
  203. }
  204. public function updateWorkOrderStatusApi(Request $request): array
  205. {
  206. if (Gate::denies('订单管理-工单处理-宝时编辑'))
  207. return ['success' => false, 'message' => '没有对应权限'];
  208. try {
  209. $workOrder = $this->service->find($request->input('id'));
  210. $workOrder->work_order_status = $request['work_order_status'];
  211. $workOrder->update();
  212. } catch (\Exception $e) {
  213. return ['success' => false, 'message' => '编辑工单状态失败'];
  214. }
  215. return ['success' => true];
  216. }
  217. public function logisticUpdateWorkOrderStatusApi(Request $request): array
  218. {
  219. if (Gate::denies('订单管理-工单处理-承运商编辑'))
  220. return ['success' => false, 'message' => '没有对应权限'];
  221. try {
  222. $workOrder = $this->service->find($request->input('id'));
  223. $workOrder->work_order_status = $request['work_order_status'];
  224. $workOrder->update();
  225. } catch (\Exception $e) {
  226. return ['success' => false, 'message' => '编辑工单状态失败'];
  227. }
  228. return ['success' => true];
  229. }
  230. public function ownerUpdateCommoditiesApi(Request $request): array
  231. {
  232. if (Gate::denies('订单管理-工单处理-货主编辑')) {
  233. return ['success' => false, 'message' => '没有对应权限'];
  234. }
  235. $workOrder = $this->service->find($request->input('id'));
  236. if (!$workOrder) return ['success' => false, 'message' => '参数异常'];
  237. $this->commoditiesService->updateWorkOrderCommoditiesByJsonArray($workOrder, $request->input('commodities'));
  238. $workOrder->loadDefaultWith();
  239. $issueType = $workOrder->issueType->name ?? '';
  240. if($issueType == '丢件'){
  241. $this->logService->createLog($workOrder,'处理','货主填充数据');
  242. $workOrder->changeStatus('宝时处理');
  243. }
  244. return ['success' => true, 'data' => $workOrder];
  245. }
  246. public function logisticUpdateCommoditiesApi(Request $request): array
  247. {
  248. if (Gate::denies('订单管理-工单处理-承运商编辑')) {
  249. return ['success' => false, 'message' => '没有对应权限'];
  250. }
  251. $workOrder = $this->service->find($request->input('id'));
  252. if (!$workOrder) return ['success' => false, 'message' => '参数异常'];
  253. $this->commoditiesService->updateWorkOrderCommoditiesByJsonArray($workOrder, $request->input('commodities'));
  254. $workOrder->loadDefaultWith();
  255. $issueType = $workOrder->issueType->name ?? '';
  256. if (in_array($issueType,['快递异常','快递丢件','破损'])){
  257. $workOrder->changeStatus('完成');
  258. $this->logService->createLog($workOrder,'处理','承运商处理');
  259. $this->logService->createLog($workOrder,'完结','承运商完成');
  260. }
  261. return ['success' => true, 'data' => $workOrder];
  262. }
  263. public function baoShiUpdateCommoditiesApi(Request $request): array
  264. {
  265. if (Gate::denies('订单管理-工单处理-宝时编辑')) {
  266. return ['success' => false, 'message' => '没有对应权限'];
  267. }
  268. $workOrder = $this->service->find($request->input('id'));
  269. if (!$workOrder) return ['success' => false, 'message' => '参数异常'];
  270. $this->commoditiesService->updateWorkOrderCommoditiesByJsonArray($workOrder, $request->input('commodities'));
  271. $workOrder->loadDefaultWith();
  272. if (($workOrder->issueType->name ?? '') === '错漏发') {
  273. $workOrder->changeStatus('完成');
  274. $this->logService->createLog($workOrder, '完结', '错漏发完结');
  275. }
  276. return ['success' => true, 'data' => $workOrder];
  277. }
  278. public function logisticEndApi(Request $request): array
  279. {
  280. if (Gate::denies('订单管理-工单处理-承运商编辑')) {
  281. return ['success' => false, 'message' => '没有对应权限'];
  282. }
  283. $workOrder = $this->service->find($request->input('id'));
  284. if (!$workOrder) return ['success' => false, 'message' => '参数错误,刷新重试'];
  285. $this->service->logisticEnd($workOrder);
  286. $workOrder->loadDefaultWith();
  287. return ['success' => true, 'data' => $workOrder];
  288. }
  289. }