WorkOrderController.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Filters\WorkOrderFilters;
  4. use App\Logistic;
  5. use App\OrderIssue;
  6. use App\Services\OrderIssueTypeService;
  7. use App\Services\OrderService;
  8. use App\Services\OwnerService;
  9. use App\Services\WorkOrderCommoditiesService;
  10. use App\Services\WorkOrderDetailService;
  11. use App\Services\WorkOrderLogService;
  12. use App\Services\WorkOrderService;
  13. use App\UserOwnerGroup;
  14. use App\UserWorkgroup;
  15. use App\Warehouse;
  16. use App\WorkOrder;
  17. use App\WorkOrderDetail;
  18. use Illuminate\Http\Request;
  19. use Illuminate\Support\Facades\Gate;
  20. use Oursdreams\Export\Export;
  21. class WorkOrderController extends Controller
  22. {
  23. public $service;
  24. public $detailService;
  25. public $commoditiesService;
  26. public $logService;
  27. public $orderService;
  28. public $ownerService;
  29. public $orderIssueTypeService;
  30. public function __construct(
  31. WorkOrderService $service,
  32. WorkOrderCommoditiesService $commoditiesService,
  33. WorkOrderDetailService $detailService,
  34. WorkOrderLogService $logService,
  35. OrderService $orderService,
  36. OwnerService $ownerService,
  37. OrderIssueTypeService $orderIssueTypeService
  38. )
  39. {
  40. $this->service = $service;
  41. $this->detailService = $detailService;
  42. $this->commoditiesService = $commoditiesService;
  43. $this->logService = $logService;
  44. $this->orderService = $orderService;
  45. $this->ownerService = $ownerService;
  46. $this->orderIssueTypeService = $orderIssueTypeService;
  47. }
  48. /**
  49. * 承运商标记处理中
  50. * @param Request $request
  51. * @return array
  52. */
  53. public function logisticHandlerTagApi(Request $request): array
  54. {
  55. if (Gate::denies('订单管理-工单处理-承运商编辑'))
  56. return ['success' => false, 'message' => '没有对应权限'];
  57. $detail = WorkOrderDetail::query()->with('workOrder')->find($request->input('detail_id'));
  58. if ($detail->status === '完成') return ['success' => false, 'message' => '工单已完成,请刷新重试'];
  59. $this->service->logisticHandlerTag($detail);
  60. $data = $this->service->getDefaultWith($detail->work_order_id);
  61. return ['success' => true, 'data' => $data];
  62. }
  63. public function index(Request $request, WorkOrderFilters $filters)
  64. {
  65. if (Gate::denies('订单管理-工单处理-查询')) return redirect('/');
  66. $workOrders = WorkOrder::query()->filter($filters)->defaultWith()->paginate($request['paginate'] ?? 50);
  67. $logistics = Logistic::all();
  68. $orderIssueTypes = $this->orderIssueTypeService->getWorkOrderIssueType();
  69. $owners = $this->ownerService->getAuthorizedOwners();
  70. $userWorkgroup = UserWorkgroup::query()->select('id', 'name')->get();
  71. $userOwnerGroup = UserOwnerGroup::query()->select('id', 'name')->get();
  72. $warehouses = Warehouse::all();
  73. $this->service->tags($workOrders);
  74. return view('order.workOrder.index', compact('workOrders', 'logistics', 'orderIssueTypes', 'owners', 'userWorkgroup', 'userOwnerGroup','warehouses'));
  75. }
  76. /**
  77. * 工单生成问题件
  78. * @param Request $request
  79. * @return array
  80. */
  81. public function buildOrderIssueApi(Request $request): array
  82. {
  83. if (Gate::denies('订单管理-订单问题件生成'))
  84. return ['success' => false, 'message' => '没有对应权限'];
  85. $work_orders = WorkOrder::query()->whereIn('id', $request['ids'])->get();
  86. if (count($work_orders) == 0) return ['success' => false, 'message' => '刷新当前页面重试'];
  87. if (OrderIssue::query()->whereIn('order_id', $work_orders->map(function ($item) {
  88. return $item['order_id'];
  89. }))->exists()) {
  90. return ['success' => false, 'message' => '已有对应的问题件'];
  91. }
  92. $result = $this->service->buildOrderIssue($work_orders);
  93. if (!$result['success']) return $result;
  94. $workOrders = WorkOrder::query()->defaultWith()->whereIn('id', $request['ids'])->get();
  95. $this->service->tags($workOrders);
  96. return ['success' => true, 'data' => $workOrders];
  97. }
  98. /**
  99. * 删除工单
  100. * @param $id
  101. * @return array|bool[]
  102. */
  103. public function destroyApi($id): array
  104. {
  105. if (Gate::denies('订单管理-工单处理-删除'))
  106. return ['success' => false, 'message' => '没有对应权限'];
  107. $workOrder = $this->service->find($id);
  108. if (!$workOrder) {
  109. return ['success' => false, 'message' => '对应工单信息未找到'];
  110. } else {
  111. if ($workOrder->status == '已处理') {
  112. return ['success' => false, 'message' => '对应工单已处理,拒绝删除'];
  113. }
  114. }
  115. WorkOrder::query()->where('id', $id)->Delete();
  116. return ['success' => true];
  117. }
  118. /**
  119. * 校验工单是否存在
  120. * @param Request $request
  121. * @return array
  122. */
  123. public function checkWorkOrderApi(Request $request): array
  124. {
  125. $nos = $request->input('no', '');
  126. if (is_string($nos)) {
  127. $nos = [$nos];
  128. }
  129. $data = $this->service->checkWorkOrder($nos);
  130. return ['success' => true, 'data' => $data];
  131. }
  132. /**
  133. * 货主完结工单
  134. * @param Request $request
  135. * @return array
  136. */
  137. public function ownerEndWorkOrderApi(Request $request): array
  138. {
  139. if (Gate::denies('订单管理-工单处理-货主编辑'))
  140. return ['success' => false, 'message' => '没有对应权限'];
  141. $detail_id = $request->input('detail_id');
  142. $detail = WorkOrderDetail::query()->with('workOrder')->where('id', $detail_id)->first();
  143. if (!$detail || !$detail->workOrder) {
  144. return ['success' => false, 'message' => '参数异常'];
  145. }
  146. try {
  147. $this->service->ownerEndWorkOrderDetail($detail);
  148. return ['success' => true];
  149. } catch (\Exception $e) {
  150. return ['success' => false, 'message' => '工单完结异常'];
  151. }
  152. }
  153. /**
  154. * 货主批量完结工单
  155. * @param Request $request
  156. * @return array
  157. */
  158. public function ownerBatchEndWorkOrderApi(Request $request): array
  159. {
  160. if (Gate::denies('订单管理-工单处理-货主编辑'))
  161. return ['success' => false, 'message' => '没有对应权限'];
  162. $detail_ids = $request->input('detail_ids', []);
  163. if (count($detail_ids) == 0) return ['success' => false, 'message' => '参数异常'];
  164. $details = WorkOrderDetail::query()->find($detail_ids);
  165. if (count($details) == 0) return ['success' => false, 'message' => '参数异常'];
  166. try {
  167. $this->service->ownerBatchEndWorkOrderDetails($details);
  168. return ['success' => true];
  169. } catch (\Exception $e) {
  170. return ['success' => false, 'message' => '工单完结异常,请刷新后重试'];
  171. }
  172. }
  173. public function updateRemissionApi(Request $request): array
  174. {
  175. if (Gate::denies('订单管理-工单处理-宝时编辑')) {
  176. return ['success' => false, 'message' => '没有对应权限'];
  177. }
  178. if (!$request->has(['id', 'column'])) {
  179. return ['success' => false, 'message' => '参数异常'];
  180. }
  181. /** @var WorkOrder $workOrder */
  182. $workOrder = WorkOrder::query()->find($request->input('id'));
  183. if (!$workOrder) {
  184. return ['success' => false, 'message' => '未找到对应的工单'];
  185. }
  186. $column = $request->input('column');
  187. $workOrder->update(["{$column}" => $request->input('value') ?? null]);
  188. return ['success' => true];
  189. }
  190. public function updateUserOwnerGroupApi(Request $request): array
  191. {
  192. if (Gate::denies('订单管理-工单处理-宝时编辑')) {
  193. return ['success' => false, 'message' => '没有对应权限'];
  194. }
  195. if (!$request->has(['id', 'user_owner_group_id'])) {
  196. return ['success' => false, 'message' => '参数异常'];
  197. }
  198. /** @var WorkOrder $workOrder */
  199. $workOrder = WorkOrder::query()->find($request->input('id'));
  200. if (!$workOrder) {
  201. return ['success' => false, 'message' => '未找到对应的工单'];
  202. }
  203. $workOrder->update(['user_owner_group_id' => $request->input('user_owner_group_id')]);
  204. return ['success' => true];
  205. }
  206. public function storeUserWorkGroupApi(Request $request): array
  207. {
  208. if (Gate::denies('订单管理-工单处理-宝时编辑')) {
  209. return ['success' => false, 'message' => '没有对应权限'];
  210. }
  211. if (!$request->has(['id', 'user_workgroup_id'])) {
  212. return ['success' => false, 'message' => '参数异常'];
  213. }
  214. /** @var WorkOrder $workOrder */
  215. $workOrder = WorkOrder::query()->find($request->input('id'));
  216. if (!$workOrder) {
  217. return ['success' => false, 'message' => '未找到对应的工单'];
  218. }
  219. $hasExists = $workOrder->userWorkGroups()->where('user_workgroup_id', $request->input('user_workgroup_id'))->exists();
  220. if ($hasExists) return ['success' => false, 'message' => '已有对应的关系'];
  221. $workOrder->userWorkGroups()->attach($request->input('user_workgroup_id'));
  222. return ['success' => true, 'data' => $workOrder->userWorkGroups];
  223. }
  224. public function destroyUserWorkGroupApi(Request $request): array
  225. {
  226. if (Gate::denies('订单管理-工单处理-宝时编辑')) {
  227. return ['success' => false, 'message' => '没有对应权限'];
  228. }
  229. if (!$request->has(['id', 'user_workgroup_id'])) {
  230. return ['success' => false, 'message' => '参数异常'];
  231. }
  232. /** @var WorkOrder $workOrder */
  233. $workOrder = WorkOrder::query()->find($request->input('id'));
  234. if (!$workOrder) {
  235. return ['success' => false, 'message' => '未找到对应的工单'];
  236. }
  237. $workOrder->userWorkGroups()->detach($request->input('user_workgroup_id'));
  238. return ['success' => true];
  239. }
  240. public function exportJsonExcel(Request $request, WorkOrderFilters $filters)
  241. {
  242. $work_orders = WorkOrder::query()->filter($filters)->defaultWith()->get();
  243. return $this->exportJson($work_orders);
  244. }
  245. public function exportJson($workOrders)
  246. {
  247. $json = [];
  248. $row = [
  249. '工单类型', '当前进度', '客户', '店铺名称', '客户订单号', '承运人', '快递单号', '创建时间', '当前处理人', '创建人', '情况说明', '退回单号', '退回商品', '退回商品名称', '退回商品数量', '是否正品', '操作类型', '操作人', '内容','退回标记'
  250. ];
  251. $workOrders->each(function ($item) use (&$json) {
  252. $logistic_numbers = $item->order->packages->implode('logistic_number', ",\r\n");
  253. $logistic_numbers_return = $item->orderIssueRejectedBills->implode('logistic_number_return', ",\r\n");
  254. $rejected_item_name = '';
  255. $rejected_item_sku = '';
  256. $rejected_item_label = '';
  257. $rejected_item_amount = '';
  258. $item->orderIssueRejectedBills->each(function ($item) use (&$rejected_item_name, &$rejected_item_sku, &$rejected_item_label, &$rejected_item_amount) {
  259. if ($item->rejectedBill)
  260. $item->rejectedBill->items->each(function ($item) use (&$rejected_item_name, &$rejected_item_sku, &$rejected_item_label, &$rejected_item_amount) {
  261. $rejected_item_name = $rejected_item_name . $item->name_goods . ",\r\n";
  262. $rejected_item_sku = $rejected_item_sku . $item->barcode_goods . ",\r\n";
  263. $rejected_item_label = $rejected_item_label . $item->quality_label . ",\r\n";
  264. $rejected_item_amount = $rejected_item_amount . $item->amount . ",\r\n";
  265. });
  266. });
  267. $work_order_process_logs_type = '';
  268. $work_order_process_logs_user = '';
  269. $work_order_process_logs = '';
  270. $work_order_details = $item->details->filter(function ($detail) use ($item) {
  271. return $detail->order_issue_type_id == $item->order_issue_type_id;
  272. });
  273. if (count($work_order_details) > 0) {
  274. $work_order_details->first()->processLogs->each(function ($log) use (&$work_order_process_logs_type, &$work_order_process_logs_user, &$work_order_process_logs) {
  275. $work_order_process_logs_type .= $log->type . ",\r\n";
  276. $work_order_process_logs_user .= ($log->user->name ?? '') . ",\r\n";
  277. $work_order_process_logs .= $log->content . ",\r\n";
  278. });
  279. }
  280. $json[] = [
  281. $item->issueType->name ?? '',
  282. $item->process_progress,
  283. $item->owner->name ?? '',
  284. $item->order->shop->name ?? '',
  285. $item->order->client_code ?? '',
  286. $item->logistic->name ?? '',
  287. rtrim($logistic_numbers, ",\r\n"),
  288. isset($item->created_at) ? str_split($item->created_at, 10)[0] : '',
  289. $item->status,
  290. $item->creator->name ?? '',
  291. $item->remark,
  292. rtrim($logistic_numbers_return, ",\r\n"),
  293. rtrim($rejected_item_sku, ",\r\n"),
  294. rtrim($rejected_item_name, ",\r\n"),
  295. rtrim($rejected_item_amount, ",\r\n"),
  296. rtrim($rejected_item_label, ",\r\n"),
  297. rtrim($work_order_process_logs_type, ",\r\n"),
  298. rtrim($work_order_process_logs_user, ",\r\n"),
  299. rtrim($work_order_process_logs, ",\r\n"),
  300. $item->custom_rejected_status ?? '',
  301. ];
  302. });
  303. return Export::make($row, $json, "工单");
  304. }
  305. public function customRejectedStatusApi(Request $request): array
  306. {
  307. $result = $this->service->customRejectedStatus($request->input('ids'), $request->input('rejectedStatus'));
  308. if ($result > 0) {
  309. return ['success' => true,];
  310. }
  311. return ['success' => false, 'message' => '操作异常请稍后重试'];
  312. }
  313. public function batchOthersApi(Request $request): array
  314. {
  315. if (Gate::denies('订单管理-工单处理-宝时编辑')) {
  316. return ['success' => false, 'message' => '没有对应权限'];
  317. }
  318. if (!$request->has(['ids'])) {
  319. return ['success' => false, 'message' => '参数异常'];
  320. } else if (!$request->hasAny(['logistic_express_remission', 'bao_shi_express_remission', 'userWorkGroupIds'])) {
  321. return ['success' => false, 'message' => '参数异常'];
  322. }
  323. $query = WorkOrder::query()->whereIn('id', $request->input('ids', []));
  324. $query->update(array_filter($request->only(['logistic_express_remission', 'bao_shi_express_remission']), function ($item) {
  325. return $item;
  326. }));
  327. if ($request->has(['userWorkGroupIds'])) {
  328. $query->get()->each(function ($item) use ($request) {
  329. $item->userWorkGroups()->attach($request->input('userWorkGroupIds', []));
  330. });
  331. }
  332. return ['success' => true];
  333. }
  334. public function batchWorkOrder(OrderIssueTypeService $orderIssueTypeService){
  335. if (Gate::denies('订单管理-订单-生成工单')){
  336. return redirect(url("/order/index/delivering"));
  337. }
  338. $types = $orderIssueTypeService->getWorkOrderIssueType();
  339. return view("order.index.batchWorkOrder.index",compact("types"));
  340. }
  341. }