StoreCheckingReceiveController.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Imports\StoreCheckingReceiveSheets;
  4. use App\Services\CommodityService;
  5. use App\Services\LogService;
  6. use App\Services\OracleDocAsnDetailService;
  7. use App\Services\StoreCheckingReceiveService;
  8. use App\StoreCheckingReceive;
  9. use Exception;
  10. use Illuminate\Http\Request;
  11. use Illuminate\Support\Facades\Cache;
  12. use Illuminate\Support\Facades\Gate;
  13. use Illuminate\Support\Facades\Http;
  14. use Maatwebsite\Excel\Facades\Excel;
  15. class StoreCheckingReceiveController extends Controller
  16. {
  17. public function mission(Request $request){
  18. if(!Gate::allows('入库管理-盘收一体-盘收-查看')){ return view('store/index'); }
  19. /** @var StoreCheckingReceiveService $service */
  20. $service = app('storeCheckingReceiveService');
  21. $params = $request->input();
  22. $storeCheckingReceives = $service->paginate($params);
  23. $owners = app('ownerService')->getSelection();
  24. return view('store.checkingReceive.mission',compact('storeCheckingReceives','params','owners'));
  25. }
  26. public function import(Request $request){
  27. if(!Gate::allows('入库管理-盘收一体-盘收-编辑')){ return ['success'=>false, 'data'=>'无权操作!']; }
  28. $fileSuffix=$request->file('file')->getClientOriginalExtension();
  29. if ($fileSuffix != 'xlsx' && $fileSuffix != 'xls' && $fileSuffix != 'csv')
  30. return ['success'=>false,'data'=>'不支持该文件类型'];
  31. ini_set('max_execution_time',2500);
  32. ini_set('memory_limit','1526M');
  33. $fileSuffix = ucwords($fileSuffix);
  34. Excel::import(new StoreCheckingReceiveSheets(),$request->file('file')->path(),null,$fileSuffix);
  35. if (Cache::has('storeCheckingReceive')){
  36. return Cache::pull('storeCheckingReceive');
  37. }
  38. return ["success"=>false, "data"=>"读取导入文件错误"];
  39. }
  40. public function show($id,Request $request){
  41. if(!Gate::allows('入库管理-盘收一体-盘收-查看')){ return redirect(url('/')); }
  42. /** @var StoreCheckingReceiveService $service */
  43. $service = app('storeCheckingReceiveService');
  44. $storeCheckingReceive = $service->find($id);
  45. $is_show = $request->is_show ?? true;
  46. if ($storeCheckingReceive->owner ?? false){
  47. $commodityController = new CommodityController();
  48. $sku = [];
  49. foreach ($storeCheckingReceive->storeCheckingReceiveItems as $item){
  50. $sku[] = $item->commodity->sku;
  51. }
  52. $commodityController->syncOwnerCommodities($storeCheckingReceive->owner->id, $storeCheckingReceive->owner->code, $sku);
  53. }
  54. return view('store.checkingReceive.show',compact('storeCheckingReceive','is_show'));
  55. }
  56. public function insertItem(Request $request){
  57. if(!Gate::allows('入库管理-盘收一体-盘收-编辑')){ return ['success'=>false, 'data'=>'无权操作!']; }
  58. $mission_id = $request->mission_id ?? false;
  59. $goods = $request->goods ?? false;
  60. if (!($goods["amount"] ?? false))$goods["amount"] = 1;
  61. if (!$mission_id || !$goods)return ['success'=>false, 'data'=>'参数传递错误!'];
  62. $storeCheckingReceive = app('storeCheckingReceiveService')->find($mission_id);
  63. if (!$storeCheckingReceive)return ['success'=>false, 'data'=>'盘收任务不存在'];
  64. if ($storeCheckingReceive->status == '已收货')return ['success'=>false, 'data'=>'盘收任务已结束'];
  65. $storeCheckingReceiveItem = null;
  66. $is_receive_diff = "否";
  67. $is_asn_diff = "否";
  68. $is_inventory_complete = true;
  69. foreach ($storeCheckingReceive->storeCheckingReceiveItems as $item){
  70. if (!$item->commodity)continue;
  71. if (count($item->commodity->barcodes) < 1)continue;
  72. foreach ($item->commodity->barcodes as $barcode){
  73. if ($barcode->code == $goods['barcode']){
  74. if ($goods['batch_number'] == $item->batch_code &&
  75. $goods['produce_date'] == $item->produced_at &&
  76. $goods['unique_code'] == $item->unique_code &&
  77. $goods['valid_date'] == $item->invalid_at){
  78. $storeCheckingReceiveItem = $item;
  79. break;
  80. }
  81. }
  82. }
  83. if ($storeCheckingReceiveItem)continue;
  84. if ($item->imported_diff_amount > 0)$is_receive_diff = "是";
  85. if (!$item->counted_amount)$is_inventory_complete = false;
  86. }
  87. if ($storeCheckingReceiveItem){
  88. $counted_amount = $storeCheckingReceiveItem->counted_amount+$goods['amount'];
  89. $params = ['counted_amount'=>$counted_amount];
  90. if (!$storeCheckingReceiveItem->imported_amount){
  91. $params['imported_amount'] = 0;
  92. $params['imported_diff_amount'] = $counted_amount;
  93. }else $params['imported_diff_amount'] = $counted_amount-$storeCheckingReceiveItem->imported_amount;
  94. if ($storeCheckingReceiveItem->asn_amount)$params['asn_diff_amount'] = $counted_amount-$storeCheckingReceiveItem->asn_amount;
  95. if (!$storeCheckingReceiveItem->bin_number && $goods['bin_number'])$params['bin_number'] = $goods['bin_number'];
  96. if (isset($params['imported_diff_amount']) && $params['imported_diff_amount'] > 0)$is_receive_diff = "是";
  97. if (isset($params['asn_diff_amount']) && $params['asn_diff_amount'] > 0)$is_asn_diff = "是";
  98. $item = app('storeCheckingReceiveItemService')->updateFind($storeCheckingReceiveItem,$params);
  99. LogService::log(__METHOD__,"清点数量",json_encode($item,JSON_UNESCAPED_UNICODE));
  100. switch ($storeCheckingReceive->status){
  101. case '已导入':
  102. $SCR = app('storeCheckingReceiveService')->updateFind($storeCheckingReceive,['status'=>'清点中']);
  103. LogService::log(__METHOD__,"修改盘收任务状态为清点中",json_encode($SCR,JSON_UNESCAPED_UNICODE));
  104. break;
  105. case '清点中':
  106. $res = [];
  107. if ($is_inventory_complete){
  108. $res['status']='已清点';
  109. }
  110. //差异存在时 判断差异是否变化,变化则更新,差异不存在时 判断差异是否存在 存在则更新
  111. if (($storeCheckingReceive->is_receive_diff && $storeCheckingReceive->is_receive_diff != $is_receive_diff)
  112. || (!$storeCheckingReceive->is_receive_diff && isset($params['imported_diff_amount'])))
  113. $res['is_receive_diff'] = $is_receive_diff;
  114. if (($storeCheckingReceive->is_asn_diff && $storeCheckingReceive->is_asn_diff != $is_asn_diff)
  115. || (!$storeCheckingReceive->is_asn_diff && isset($params['asn_diff_amount'])))
  116. $res['is_receive_diff'] = $is_receive_diff;
  117. if (count($res) > 0){
  118. $SCR = app('storeCheckingReceiveService')->updateFind($storeCheckingReceive,$res);
  119. LogService::log(__METHOD__,"修改盘收任务",json_encode($SCR,JSON_UNESCAPED_UNICODE));
  120. }
  121. break;
  122. }
  123. return ['success'=>true, 'type'=>"update", 'data'=>$item];
  124. }
  125. $commodity = app('commodityService')->ownerBarcodeSeekCommodityFirst(['id'=>$storeCheckingReceive->owner_id], $goods['barcode']);
  126. if (!$commodity) {
  127. if (!$storeCheckingReceive->owner) return ['success'=>false, 'data'=>'未找到货主'];
  128. $basSku = app('oracleBasSkuService')->first(['customerid'=>$storeCheckingReceive->owner->code, "barcode"=>$goods['barcode']]);
  129. if ($basSku){
  130. $commodity = app('commodityService')->firstOrCreate(['owner_id'=>$storeCheckingReceive->owner_id, 'sku'=>$basSku->sku],[
  131. "name"=>$basSku->descr_c,
  132. "sku"=>$basSku->sku,
  133. "owner_id"=>$storeCheckingReceive->owner_id,
  134. 'length' => $basSku->skulength,
  135. 'width' => $basSku->skuwidth,
  136. 'height' => $basSku->skuhigh,
  137. 'volumn' => $basSku->cube
  138. ]);
  139. if ($commodity) app('commodityBarcodeService')->firstOrCreate(['commodity_id'=>$commodity->id, 'code'=>$goods['barcode']]);
  140. }else{
  141. $commodity = app('commodityService')->createTemporaryCommodity([
  142. "sku"=>$goods['barcode'],
  143. "owner_id"=>$storeCheckingReceive->owner_id,
  144. ]);
  145. app('commodityBarcodeService')->create([
  146. "commodity_id"=>$commodity->id,
  147. "code" => $goods['barcode'],
  148. ]);
  149. }
  150. };
  151. $item = app('storeCheckingReceiveItemService')->create([
  152. 'store_checking_receive_id' => $mission_id,
  153. 'bin_number' => $goods['bin_number'],
  154. 'commodity_id' => $commodity->id,
  155. 'imported_amount' => 0,
  156. 'imported_diff_amount' => $goods['amount'],
  157. 'produced_at' => $goods['produce_date'],
  158. 'invalid_at' => $goods['valid_date'],
  159. 'batch_code' => $goods['batch_number'],
  160. 'unique_code' => $goods['unique_code'],
  161. 'counted_amount' => $goods['amount'],
  162. ]);
  163. $item->load(['commodity'=>function($query){
  164. $query->with('barcodes');
  165. }]);
  166. switch ($storeCheckingReceive->status){
  167. case '已导入':
  168. $SCR = app('storeCheckingReceiveService')->updateFind($storeCheckingReceive,['status'=>'清点中']);
  169. LogService::log(__METHOD__,"修改盘收任务状态为清点中",json_encode($SCR,JSON_UNESCAPED_UNICODE));
  170. break;
  171. case '清点中':
  172. $res = [];
  173. if ($is_inventory_complete){
  174. $res['status']='已清点';
  175. }
  176. //差异存在时 判断差异是否变化,变化则更新,差异不存在时 判断差异是否存在 存在则更新
  177. if ($is_receive_diff == "否")$is_receive_diff = $item->imported_diff_amount>0 ? "是" : "否";
  178. if ($storeCheckingReceive->is_receive_diff != $is_receive_diff)
  179. $res['is_receive_diff'] = $is_receive_diff;
  180. if ($storeCheckingReceive->is_asn_diff && ($storeCheckingReceive->is_asn_diff != $is_asn_diff))
  181. $res['is_receive_diff'] = $is_receive_diff;
  182. if (count($res) > 0){
  183. $SCR = app('storeCheckingReceiveService')->updateFind($storeCheckingReceive,$res);
  184. LogService::log(__METHOD__,"修改盘收任务",json_encode($SCR,JSON_UNESCAPED_UNICODE));
  185. }
  186. break;
  187. }
  188. return ['success'=>true, 'type'=>'create', 'data'=>$item];
  189. }
  190. public function export(Request $request){
  191. if(!Gate::allows('入库管理-盘收一体-盘收-查看')){ return redirect(url('/')); }
  192. $id = $request->mission_id ?? false;
  193. $storeCheckingReceive = app('storeCheckingReceiveService')->find($id);
  194. if (!$storeCheckingReceive) new \Exception('盘收任务不存在');
  195. $row = ['ID','格口号','商品名','商品条码','导入数量','实盘数量','ASN数量','导入差异数','ASN差异数','生产日期','有效日期','批次号','唯一码'];
  196. $list = [];
  197. foreach ($storeCheckingReceive->storeCheckingReceiveItems as $item){
  198. $code = '';
  199. foreach ($item->commodity ? $item->commodity->barcodes : [] as $barcode){
  200. $code .= $barcode->code;
  201. }
  202. $list[] = [
  203. $item->id,
  204. $item->bin_number,
  205. $item->commodity ? $item->commodity->name : '',
  206. $code,
  207. $item->imported_amount,
  208. $item->counted_amount,
  209. $item->asn_amount,
  210. $item->imported_diff_amount,
  211. $item->asn_diff_amount,
  212. $item->produced_at,
  213. $item->invalid_at,
  214. $item->batch_code,
  215. $item->unique_code,
  216. ];
  217. }
  218. $post = Http::post(config('go.export.url'),['type'=>'base','data'=>json_encode([
  219. 'row'=>$row,'list'=>$list
  220. ],JSON_UNESCAPED_UNICODE)]);
  221. if ($post->status() == 500){
  222. throw new Exception($post->header("Msg"));
  223. }
  224. return response($post,200, [
  225. "Content-type"=>"application/octet-stream",
  226. "Content-Disposition"=>"attachment; filename=盘收任务详情-".date('ymdHis').'.xlsx',
  227. ]);
  228. }
  229. public function resetAmount(Request $request){
  230. if(!Gate::allows('入库管理-盘收一体-盘收-编辑')){ return ['success'=>false, 'data'=>'无权操作!']; }
  231. $id = $request->mission_id ?? false;
  232. if (!$id) return ['success'=>false, 'data'=>'盘收任务不存在'];
  233. app('storeCheckingReceiveItemService')->update(['store_checking_receive_id'=>$id],[
  234. 'counted_amount'=>0,
  235. 'imported_diff_amount'=>null,
  236. 'asn_diff_amount'=>null,
  237. ]);
  238. LogService::log(__METHOD__,"重置盘收任务所有数量","store_checking_receive_id:".$id);
  239. return ['success'=>true];
  240. }
  241. public function matchASN(Request $request){
  242. if(!Gate::allows('入库管理-快速入库-录入')){ return ['success'=>false, 'data'=>'无权操作!']; }
  243. $asn = $request->asn ?? false;
  244. $id = $request->mission_id ?? false;
  245. if (!$asn || !$id)return ['success'=>false, 'data'=>'传递参数错误'];
  246. $storeCheckingReceive = app('storeCheckingReceiveService')->find($id);
  247. if (!$storeCheckingReceive) return ['success'=>false, 'data'=>'未找到此盘点任务!'];
  248. if ($storeCheckingReceive->status == '已收货')return ['success'=>false, 'data'=>'盘收任务已结束'];
  249. /** @var OracleDocAsnDetailService $oracleDocAsnDetailService */
  250. $oracleDocAsnDetailService = app('oracleDocAsnDetailService');
  251. $docAsnDetails = $oracleDocAsnDetailService->get([
  252. 'asnno'=>$asn,
  253. 'customerid'=>$storeCheckingReceive->owner ? $storeCheckingReceive->owner->code : null],[
  254. 'asnno','customerid','asnlineno','sku','expectedqty'
  255. ]);
  256. if (count($docAsnDetails) < 1) return ['success'=>false, 'data'=>'该货主下此ASN号不存在'];
  257. $diffAmount = 0;
  258. $skus = [];
  259. foreach ($docAsnDetails as $detail){
  260. if ($skus[$detail->sku] ?? false) $skus[$detail->sku] += $detail->expectedqty;
  261. else $skus[$detail->sku] = $detail->expectedqty;
  262. }
  263. $deleteItems = [];
  264. $updateItems = [];
  265. $updateItems[] = ['id','asn_amount','asn_diff_amount'];
  266. foreach ($storeCheckingReceive->storeCheckingReceiveItems as $item){
  267. if (!($item->commodity ? $item->commodity->sku : null))continue;
  268. if ($storeCheckingReceive->asn && ($item->asn_amount != null)
  269. && (!($item->counted_amount ?? false))){
  270. $deleteItems[] = $item->id;
  271. continue;
  272. }
  273. if ($skus[$item->commodity->sku] ?? false){
  274. $asn_diff_amount = $skus[$item->commodity->sku] - $item->counted_amount;
  275. $updateItems[] = [
  276. 'id'=>$item->id,
  277. 'asn_amount'=>$skus[$item->commodity->sku],
  278. 'asn_diff_amount'=>$asn_diff_amount,
  279. ];
  280. $item->asn_diff_amount = $asn_diff_amount;
  281. unset($skus[$item->commodity->sku]);
  282. }
  283. $diffAmount += $item->asn_diff_amount;
  284. }
  285. if (count($updateItems) > 0){
  286. app('storeCheckingReceiveItemService')->batchUpdate($updateItems);
  287. LogService::log(__METHOD__,"匹配ASN-批量更新ASN数量",json_encode($updateItems));
  288. }
  289. if (count($deleteItems) > 0){
  290. app('storeCheckingReceiveItemService')->destroy($deleteItems);
  291. LogService::log(__METHOD__,"重新匹配ASN-删除原有ASN生成数据",json_encode($updateItems));
  292. }
  293. if (count($skus) > 0){
  294. $skuArr = array_keys($skus);
  295. /** @var CommodityService $commodityService */
  296. $commodityService = app('commodityService');
  297. $commodities = $commodityService->get(['owner_id'=>$storeCheckingReceive->owner ? $storeCheckingReceive->owner->id : null,'sku'=>$skuArr]);
  298. $createItems = [];
  299. foreach ($commodities as $commodity){
  300. $createItems[] = [
  301. 'store_checking_receive_id' => $storeCheckingReceive->id,
  302. 'commodity_id' => $commodity->id,
  303. 'imported_amount' => 0,
  304. 'counted_amount' => 0,
  305. 'asn_amount' => $skus[$commodity->sku],
  306. 'imported_diff_amount' => 0,
  307. 'asn_diff_amount' => $skus[$commodity->sku],
  308. ];
  309. $diffAmount += $skus[$commodity->sku];
  310. }
  311. if (count($createItems) > 0)app('storeCheckingReceiveItemService')->insert($createItems);
  312. }
  313. $data = app('storeCheckingReceiveService')->updateFind($storeCheckingReceive,[
  314. 'asn'=>$asn,'is_asn_diff'=>$diffAmount==0 ? "否" : "是",'status'=>'已ASN入库'
  315. ]);
  316. LogService::log(__METHOD__,"修改盘收任务",json_encode($data,JSON_UNESCAPED_UNICODE));
  317. return ['success'=>true, 'data'=>$data];
  318. }
  319. public function receipt(Request $request){
  320. if(!Gate::allows('入库管理-快速入库-录入')){ return redirect(url('/')); }
  321. $id = $request->id ?? false;
  322. /** @var StoreCheckingReceiveService $storeCheckingReceiveService */
  323. $storeCheckingReceiveService = app('storeCheckingReceiveService');
  324. /** @var StoreCheckingReceive $storeCheckingReceive */
  325. $storeCheckingReceive = $storeCheckingReceiveService->find($id);
  326. if (!$storeCheckingReceive)return ['success'=>false, 'data'=>'盘收任务不存在'];
  327. if ($storeCheckingReceive->status == '已收货')return ['success'=>false, 'data'=>'盘收任务已结束'];
  328. $storeController = new StoreController();
  329. $result = $storeController->quickStorage($storeCheckingReceive->asn,"正品",null);
  330. if ($result['success']) $data = $storeCheckingReceiveService->updateFind($storeCheckingReceive,['status'=>"已收货"]);
  331. else{
  332. $data = $storeCheckingReceiveService->updateFind($storeCheckingReceive,['status'=>"收货失败"]);
  333. LogService::log(__METHOD__,"盘收快速收货失败",json_encode($result['data'],JSON_UNESCAPED_UNICODE)." | ".json_encode($data,JSON_UNESCAPED_UNICODE));
  334. }
  335. return ['success'=>true, 'data'=>$data];
  336. }
  337. //修改实盘数量
  338. public function updateCountedAmount(Request $request){
  339. if(!Gate::allows('入库管理-盘收一体-盘收-编辑')){ return ['success'=>false, 'data'=>'无权操作!']; }
  340. $id = $request->id ?? null;
  341. $counted_amount = $request->counted_amount ?? null;
  342. if (!$id || !$counted_amount)return ['success'=>false, 'data'=>'参数传递错误!'];
  343. $item = app('storeCheckingReceiveItemService')->find($id);
  344. if (!$item)return ['success'=>false, 'data'=>'被盘项不存在'];
  345. app('storeCheckingReceiveItemService')->updateFind($item,["counted_amount"=>$counted_amount]);
  346. LogService::log(__METHOD__,"盘点修改实盘数",'item:'.json_encode($item)."update:",$counted_amount);
  347. return ['success'=>true];
  348. }
  349. }