OrderIssueController.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Imports\OrderIssueExport;
  4. use App\Imports\OrderIssueImport;
  5. use App\Logistic;
  6. use App\OrderIssue;
  7. use App\OrderIssueOnTop;
  8. use App\OrderIssueProcessLog;
  9. use App\OrderIssueType;
  10. use App\Owner;
  11. use App\Services\OrderIssueService;
  12. use App\Services\OrderService;
  13. use App\UserWorkgroup;
  14. use Illuminate\Http\Request;
  15. use Illuminate\Support\Facades\Auth;
  16. use Illuminate\Support\Facades\Cache;
  17. use Illuminate\Support\Facades\Gate;
  18. use Maatwebsite\Excel\Facades\Excel;
  19. class OrderIssueController extends Controller
  20. {
  21. public function __construct()
  22. {
  23. app()->bind("orderIssueService", OrderIssueService::class);
  24. app()->bind("orderService", OrderService::class);
  25. }
  26. public function index(Request $request)
  27. {
  28. if (!Gate::allows('订单管理-问题件-查询')) {
  29. return redirect(url('/'));
  30. }
  31. $orderIssueService = app('orderIssueService');
  32. $owners = Owner::all();
  33. $orderIssues = $orderIssueService->paginate($request);
  34. return view('order.issue.index', compact('owners', 'orderIssues'));
  35. }
  36. // 置顶
  37. public function orderIssueOnTop(Request $request)
  38. {
  39. if (!Gate::allows('订单管理-问题件-置顶')) {
  40. ['success' => false, 'fail_info' => '没有对应权限'];
  41. }
  42. $orderIssueService = app('orderIssueService');
  43. $meg = $orderIssueService->orderIssueOnTop($request);
  44. if ($meg['success']) {
  45. $description = '订单问题件id' . $request->input('id') . '置顶信息' . $request->input('remark');
  46. $this->log(__METHOD__, "订单问题件置顶" . __FUNCTION__, $description, Auth::user()['id']);
  47. }
  48. return $meg;
  49. }
  50. // 取消置顶
  51. public function cancelTop(Request $request)
  52. {
  53. if (!Gate::allows('订单管理-问题件-置顶')) {
  54. ['success' => false, 'fail_info' => '没有对应权限'];
  55. }
  56. if(!$request->has('orderIssue_id')){
  57. return ['success'=>false,'fail_info'=>'没有传入对应的id'];
  58. } else if(!$request->has('remark')){
  59. return ['success'=>false,'fail_info'=>'没有传入对应的备注信息'];
  60. }
  61. $orderIssueOnTop = OrderIssueOnTop::create($request->all());
  62. if(!$orderIssueOnTop){
  63. return ['success'=>false,'fail_info'=>'订单置顶失败,稍后重试'];
  64. }
  65. return ['success'=>true];
  66. }
  67. // 校验Oracle 订单号
  68. public function verifyOracleOrderNo(Request $request)
  69. {
  70. $orderIssueService = app('orderIssueService');
  71. if (!$request->input('oracleOrderNo')) {
  72. $meg['success'] = false;
  73. $meg['fail_info'] = '没有参入对应的参数';
  74. return $meg;
  75. }
  76. $meg = $orderIssueService->verifyOracleOrderNo($request->input('oracleOrderNo'));
  77. return $meg;
  78. }
  79. // 校验快递单号
  80. public function verifyLogisticNumber(Request $request)
  81. {
  82. $orderIssueService = app('orderIssueService');
  83. if (!$request->input('logisticNumber')) {
  84. $meg['success'] = false;
  85. $meg['fail_info'] = '没有参入对应的参数';
  86. return $meg;
  87. }
  88. return $orderIssueService->verifyLogisticNumber($request);
  89. }
  90. // 订单问题件标记
  91. public function orderIssueTag(Request $request)
  92. {
  93. if (!Gate::allows('订单管理-订单问题件生成')) {
  94. return ['success' => false, 'fail_info' => '没有对应权限'];
  95. }
  96. if (!$request->input('orderNos')) {
  97. return ['success' => false, 'fail_info' => '没有传入的订单编号'];
  98. }
  99. $orderIssueService = app('orderIssueService');
  100. return $orderIssueService->orderIssueTag($request);
  101. }
  102. // 创建订单问题件页面
  103. public function create()
  104. {
  105. if (!Gate::allows('订单管理-订单问题件生成')) {
  106. return redirect(url('/'));
  107. }
  108. $types = OrderIssueType::all();
  109. $meg = ['success' => true];
  110. $userWorkGroup = UserWorkgroup::all();
  111. $logistic = Logistic::all();
  112. return view('order.issue.create', compact(['types', 'meg', 'userWorkGroup', 'logistic']));
  113. }
  114. // 创建订单问题件
  115. public function store(Request $request)
  116. {
  117. if (!Gate::allows('订单管理-订单问题件生成')) {
  118. return redirect(url('/'));
  119. }
  120. $orderIssueService = app('orderIssueService');
  121. $type = $request->input('type');
  122. $orderIssue = null;
  123. if ($type == 'RejectedBill') {
  124. $orderIssue = $orderIssueService->createByRejectedBill($request);
  125. } else if ($type == 'WMSOrderNo') {
  126. $orderIssue = $orderIssueService->createByOracleOrderNo($request);
  127. } else if ($type == 'LogisticNumber') {
  128. $orderIssue = $orderIssueService->createByLogisticNumber($request);
  129. }
  130. $msg = '';
  131. if ($orderIssue == null) {
  132. $msg = '创建订单问题件失败';
  133. } else {
  134. $msg = '创建订单问题件成功';
  135. }
  136. $owners = Owner::all();
  137. $orderIssues = $orderIssueService->paginate($request);
  138. return view('order.issue.index', compact('owners', 'orderIssues', 'msg'));
  139. }
  140. public function edit($id)
  141. {
  142. if (!Gate::allows('订单管理-问题件-编辑')) {
  143. return redirect(url('/'));
  144. }
  145. $orderIssue = OrderIssue::where('id', $id)->first();
  146. $owners = Owner::all();
  147. return view('order/issue/edit', compact(['orderIssue', 'owners']));
  148. }
  149. public function update(Request $request, OrderIssue $orderIssue)
  150. {
  151. if (!Gate::allows('订单管理-问题件-编辑')) {
  152. return redirect(url('/'));
  153. }
  154. $orderIssue->fill($request);
  155. $orderIssue->update();
  156. $this->log(__METHOD__, __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
  157. return redirect('order/issue/index');
  158. }
  159. public function destroy(Request $request)
  160. {
  161. if (!Gate::allows('订单管理-问题件-删除')) {
  162. return ['success' => false, 'fail_info' => '没有对应权限'];
  163. }
  164. if (!($request->has('id'))) {
  165. return ['success' => 'false', 'fail_info' => '没有问题题件相关的参数'];
  166. }
  167. $bool = OrderIssue::find($request->input('id'))->delete();
  168. if ($bool) {
  169. $this->log(__METHOD__, __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
  170. return ['success' => 'true'];
  171. } else {
  172. return ['success' => 'false', 'fail_info' => '删除问题单出现异常,请联系管理员'];
  173. }
  174. }
  175. public function ajaxGetOrderHead(Request $request)
  176. {
  177. $logisticNumberReturn = $request->input('logisticNumberReturn');
  178. $type = $request->input('type');
  179. $orderNo = $request->input('orderNo');
  180. $orderIssueService = app('orderIssueService');
  181. if ($type == 'logisticNumberReturn') {
  182. if (!$logisticNumberReturn) {
  183. return ['success' => false, 'fail_info' => '没有传入对应的参数'];
  184. }
  185. $arr = $orderIssueService->GetOrderHead($request);
  186. return ['success' => true, 'data' => $arr];
  187. } else if ($type = 'WMSOrderNo') {
  188. if (!$orderNo) {
  189. return ['success' => false, 'fail_info' => '没有传入对应的参数'];
  190. }
  191. $arr = $orderIssueService->getOrderHeadByOrderNo($request);
  192. return ['success' => true, 'data' => $arr];
  193. } else if ($type == 'logisticNumber') {
  194. if (!$request->has('logisticNumber')) {
  195. return ['success' => false, 'fail_info' => '没有传入对应的参数'];
  196. }
  197. $orderIssueService->createByLogisticNumber($request);
  198. } else {
  199. return ['success' => false, 'fail_info' => '没有传入对应的参数'];
  200. }
  201. }
  202. public function import(Request $request)
  203. {
  204. if (!Gate::allows('订单管理-订单问题件生成')) {
  205. return redirect(url('/'));
  206. }
  207. $file = $request->file('file');
  208. $fileSuffix = $request->file('file')->getClientOriginalExtension();
  209. if (in_array($fileSuffix, ['xlsx', 'xlsm', 'xltx', 'xltm', 'xls', 'xlt', 'ods', 'ots', 'slk', 'xml', 'gnumeric', 'htm', 'html', 'csv', 'tsv'])) {
  210. ini_set('max_execution_time', 2100);
  211. ini_set('memory_limit', '512M');
  212. $extension = $request->file()['file']->getClientOriginalExtension();
  213. $extension[0] = strtoupper($extension[0]);
  214. Excel::import(new OrderIssueImport(), $request->file()['file']->path(), null, $extension);
  215. if (Cache::has('error')) {
  216. return '<h1 class="text-danger">导入Excel失败<br><p style="color: red">' . Cache::pull('error') . '</p></h1>';
  217. } else {
  218. $exception = Cache::get('exception');
  219. $a = '';
  220. for ($i = 0; $i < count($exception); $i++) {
  221. $a .= implode(',', $exception[$i]) . '&#10';
  222. };
  223. $this->log(__METHOD__, __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
  224. return '<h1 class="text-danger">导入Excel成功<br><textarea style="width: 50%;height: 50%">' . $a . '</textarea></h1>';
  225. }
  226. } else {
  227. return '<h1 class="text-danger">失败<br><p style="color: red">不支持该文件类型</p></h1>';
  228. }
  229. }
  230. public function exportOrderIssue(Request $request)
  231. {
  232. $orderIssueService = app('orderIssueService');
  233. $resultdata = $orderIssueService->exportExcel($request);
  234. $row = [[
  235. 'ID' => 'id', 'created_at' => '登记日期', 'order_created_at' => '订单日期', 'owner' => '客户', 'shop' => '店铺', 'order_no' => '原始订单号',
  236. 'logistic' => '原始承运商', 'consignee_name' => '收货人名称', 'consignee_phone' => '收货人电话',
  237. 'province' => '省', 'city' => '市', 'district' => '区', 'address' => '收货人地址',
  238. // order -> package -> commodity
  239. 'commodity_code' => '条码', 'commodity_name' => '商品', 'amount' => '数量',
  240. 'status' => '退单状态',
  241. // 退回商品信息 rejectedBill -> items
  242. 'barcode_goods' => '条码', 'name_goods' => '商品名', 'goods_amount' => '数量', 'is_checked' => '是否正品', 'remark' => '备注',
  243. 'order_issue_type' => '问题类别',
  244. 'second_order' => '二次订单', 'second_logistic' => '二次承运商', 'second_logistic_number' => '二次运单号',
  245. // order -> package -> commodity
  246. 's_commodity_code' => '条码', 's_commodity_name' => '商品名', 's_amount' => '数量', 's_is_checked' => '是否正品', 's_remark' => '备注',
  247. 'final_status' => '最终状态', 'logistic_indemnity_money' => '承运商赔偿金额', 'logistic_express_remission' => '承运商快递减免',
  248. 'baoshi_indemnity_money' => '宝石赔偿金额', 'baoshi_express_remission' => '宝石快递减免', 'user_workgroup' => '事故责任方']];
  249. $data = [];
  250. foreach ($resultdata as $result) {
  251. // orderIssue
  252. $rowData = [
  253. 'ID' => $result->id,
  254. 'created_at' => $result->created_at, // 登记日期
  255. 'order_created_at' => $result->order ? $result->order->created_at : '', // 订单创建日期
  256. 'owner' => $result->owner ? $result->owner->name : '',
  257. 'shop' => $result->shop ? $result->shop->name : '',
  258. 'order_no' => $result->code,
  259. 'final_status' => $result->final_status,
  260. 'logistic_indemnity_money' => $result->logistic_indemnity_money,
  261. 'logistic_express_remission' => $result->logistic_express_remission,
  262. 'baoshi_indemnity_money' => $result->baoshi_indemnity_money,
  263. 'baoshi_express_remission' => $result->baoshi_express_remission,
  264. 'user_workgroup' => $result->userWorkGroup ? $result->userWorkGroup->name : '',
  265. ];
  266. // order
  267. if (isset($result->order)) {
  268. $rowData['logistic'] = $result->order->logistic ? $result->order->logistic->name : '';
  269. $rowData['consignee_name'] = $result->order->consignee_name;
  270. $rowData['consignee_phone'] = $result->order->consignee_phone;
  271. $rowData['province'] = $result->order->province;
  272. $rowData['city'] = $result->order->city;
  273. $rowData['district'] = $result->order->district;
  274. $rowData['address'] = $result->order->address;
  275. $packages = [];
  276. if (isset($result->packages)) {
  277. foreach ($result->packages as $key => $value) {
  278. $arr = [
  279. 'commodity_code'=>$value->barcode_goods,
  280. 'commodity_name'=>$value->name_goods,
  281. 'amount'=>$value->amount
  282. ];
  283. array_push($packages,$arr);
  284. }
  285. }
  286. $rowData['packages'] = $packages;
  287. }
  288. // secondOrder
  289. if (isset($result->secondOrder)) {
  290. $rowData['second_order'] = $result->secondOrder->code;
  291. $rowData['second_logistic'] = $result->secondOrder->logistic->name;
  292. $rowData['second_logistic_number'] = $result->secondOrder->code;
  293. $secondOrder = $result->secondOrder;
  294. if (isset($secondOrder->packages)) {
  295. $packages = [];
  296. foreach ($secondOrder->packages as $key => $value) {
  297. $arr = [
  298. 'commodity_code'=>$value->barcode_goods,
  299. 'commodity_name'=>$value->name_goods,
  300. 'amount'=>$value->amount
  301. ];
  302. array_push($packages,$arr);
  303. }
  304. $rowData['s_packages'] = $packages;
  305. }
  306. }
  307. // rejectedBill
  308. if (isset($result->rejectedBill)) {
  309. $rejectedBillItems = [];
  310. $items = $result->rejectedBill->items ?? [];
  311. foreach ($items as $key => $value) {
  312. $item = [
  313. 'barcode_goods' => $value['barcode_goods'],
  314. 'name_goods' => $value['name_goods'],
  315. 'goods_amount' => $value['amount'],
  316. 'is_checked' => $value['is_checked'],
  317. 'remark' => $value['remark'],
  318. ];
  319. array_push($rejectedBillItems, $item);
  320. }
  321. $rowData['rejectedBillItems'] = $rejectedBillItems;
  322. }
  323. array_push($data, $rowData);
  324. }
  325. }
  326. public function excelImport(Request $request)
  327. {
  328. if (!Gate::allows('订单管理-订单问题件生成')) {
  329. return redirect(url('/'));
  330. }
  331. return view('order.issue.import');
  332. }
  333. // 完结订单
  334. public function endOrderIssue(Request $request)
  335. {
  336. if (!Gate::allows('订单管理-问题件-编辑')) {
  337. return ['success' => false, 'fail_info' => '没有对应的权限'];
  338. }
  339. if (!$request->has('ids')) {
  340. return ['success' => false, 'fail_info' => '没有传入对应的参数'];
  341. }
  342. $count = OrderIssue::whereIn('id', $request->input('ids'))->where('handle_status', 2)->count();
  343. if ($count > 0) {
  344. return ['success' => false, 'fail_info' => '勾选的内容中已有完结的订单问题件,取消勾选后重试'];
  345. } else {
  346. $count = OrderIssue::whereIn('id', $request->input('ids'))->update(['handle_status' => 2]);
  347. foreach ($request->input('ids') as $id) {
  348. OrderIssueProcessLog::create(['order_issue_id' => $id, 'user_id' => Auth::user()['id'], 'type' => 3]);
  349. }
  350. $this->log(__METHOD__, __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
  351. return ['success' => true];
  352. }
  353. }
  354. // 添加处理日志
  355. public function addOrderIssuesLog(Request $request)
  356. {
  357. if (!Gate::allows('订单管理-问题件-编辑')) {
  358. return ['success' => false, 'fail_info' => '没有对应的权限'];
  359. }
  360. if ($request->has(['id', 'content'])) {
  361. $orderIssueProcessLog = OrderIssueProcessLog::create(['order_issue_id' => $request->input('id'), 'content' => $request->input('content'), 'user_id' => Auth::user()['id'], 'type' => 2]);
  362. if ($orderIssueProcessLog) {
  363. $this->log(__METHOD__, __FUNCTION__, json_encode($request->toArray()), Auth::user()['id']);
  364. return ['success' => true, 'data' => $orderIssueProcessLog];
  365. } else {
  366. return ['success' => false, 'fail_info' => '录入失败'];
  367. }
  368. } else {
  369. return ['success' => false, 'fail_info' => '没有传入对应参数'];
  370. }
  371. }
  372. }