InventoryAccountController.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Exports\Export;
  4. use App\InventoryAccount;
  5. use App\InventoryAccountMission;
  6. use App\Services\InventoryAccountService;
  7. use App\Services\OwnerService;
  8. use Exception;
  9. use Illuminate\Http\Request;
  10. use Illuminate\Support\Facades\Auth;
  11. use Illuminate\Support\Facades\Gate;
  12. use Illuminate\Support\Facades\Http;
  13. use Illuminate\Support\Facades\Redis;
  14. use Maatwebsite\Excel\Facades\Excel;
  15. class InventoryAccountController extends Controller
  16. {
  17. public function __construct()
  18. {
  19. app()->singleton('inventoryAccountService',InventoryAccountService::class);
  20. }
  21. //创建盘点任务
  22. public function createStockInventoryMission(Request $request){
  23. if(!Gate::allows("库存管理-盘点")){ return redirect(url('/')); }
  24. // $date_start=$request->input('formData.date_start');
  25. // $date_end=$request->input('formData.date_end');
  26. // $ownerId=$request->input('formData.owner_id')[0];
  27. $date_start=$request->input('date_start');
  28. $date_end=$request->input('date_end');
  29. $ownerId=$request->input('owner_id');
  30. $location=$request->input('location');
  31. $barcode=$request->input('barcode');
  32. $inventoryAccount=app('inventoryAccountService')->createMission($date_start,$date_end,$ownerId,$location,$barcode);
  33. $inventoryAccount=InventoryAccount::with('owner')->find($inventoryAccount->id);
  34. if (is_null($inventoryAccount)) return ['success'=>false,'data'=>'参数错误!'];
  35. return ['success'=>true,'data'=>$inventoryAccount];
  36. }
  37. //删除盘点任务
  38. public function deleteStockInventoryMission($id){
  39. if(!Gate::allows('库存管理-盘点')){return['success'=>0,'status'=>'没有权限'];}
  40. if(is_null($id)){return ['success'=>false,'data'=>'传入id为空'];}
  41. $inventoryAccount=InventoryAccount::where('id',$id)->delete();
  42. return ['success'=>true,'data'=>$inventoryAccount];
  43. }
  44. public function inventoryChecked(Request $request){
  45. if(!Gate::allows('库存管理-盘点-项目审核')){return['success'=>false,'msg'=>'没有权限'];}
  46. $id=$request->id;
  47. if(is_null($id)){return ['success'=>false,'msg'=>'传入id为空'];}
  48. $inventoryAccount=InventoryAccount::query()->where('id',$id)->update([
  49. 'auditor'=>Auth::user()['id'],
  50. 'status'=>'已审核',
  51. ]);
  52. if ($inventoryAccount==1) {
  53. $inventoryAccount=InventoryAccount::query()->with('userAuditor')->find($id);
  54. return ['success'=>true,'data'=>$inventoryAccount];
  55. }else{
  56. return ['success'=>false,'msg'=>'审核失败!'];
  57. }
  58. }
  59. //盘点-任务页面
  60. public function mission(Request $request,OwnerService $ownerService){
  61. if(!Gate::allows("库存管理-盘点")){ return redirect(url('/')); }
  62. $paginateParams = $request->input();
  63. $queryParam=$request->all();
  64. $inventoryAccounts=app('inventoryAccountService')->paginate($queryParam);
  65. $owners=$ownerService->getSelection();
  66. return view('inventory.stockInventory.mission',compact('owners','inventoryAccounts','paginateParams'));
  67. }
  68. //进入盘点中或复盘页面
  69. public function enterStockInventory($id,Request $request){
  70. if (!Gate::allows('库存管理-盘点')){return redirect(url('/')); }
  71. if (!$id) return ['success'=>false,'data'=>'参数错误!'];
  72. $inventoryAccount=InventoryAccount::with('owner')->find($id);
  73. $inventoryAccountMissions=InventoryAccountMission::with(['commodity.barcodes','stockInventoryPersons'])->where('inventory_account_id',$id)->orderBy('difference_amount','desc')->get();
  74. return view('inventory.stockInventory.inventoryMission',compact('inventoryAccount','inventoryAccountMissions'));
  75. }
  76. public function enterBlindReceive($id){
  77. if (!Gate::allows('库存管理-盘点')){return redirect(url('/')); }
  78. if (!$id) return ['success'=>false,'data'=>'参数错误!'];
  79. $inventoryAccount=InventoryAccount::with('owner')->find($id);
  80. return view('inventory.stockInventory.blindReceive',compact('inventoryAccount'));
  81. }
  82. //依据盘点任务id进行 --盘点
  83. public function stockInventory(Request $request){
  84. if (!Gate::allows('库存管理-盘点')){return redirect(url('/')); }
  85. $location=$request->input('location');
  86. $barcode=$request->input('barcode');
  87. $inventoryId=$request->input('inventoryId');
  88. $count=$request->input('count');
  89. $id=$request->input('id');
  90. if (is_null($count)) return ['success'=>false,'data'=>'盘点数不能为空!'];
  91. /** @var InventoryAccountService $inventoryAccountMission */
  92. $inventoryAccountService=app('inventoryAccountService');
  93. $inventoryAccountMission=$inventoryAccountService->stockInventory($id,$location,$barcode,$count,$inventoryId);
  94. if (!$inventoryAccountMission)return ['success'=>false,'data'=>'参数错误!'];
  95. /** @var InventoryAccountService $inventoryService */
  96. $inventoryService=app('inventoryAccountService');
  97. $inventoryAccount=$inventoryService->updateInventory($inventoryId);
  98. $stockInventoryPersons=$inventoryAccountMission->stockInventoryPersons;
  99. return ['success'=>true,'inventoryMission'=>$inventoryAccountMission,'inventory'=>$inventoryAccount,'stockInventoryPersons'=>$stockInventoryPersons];
  100. }
  101. public function baseOnBlindReceive(Request $request){
  102. if (!Gate::allows('库存管理-盘点')){return redirect(url('/')); }
  103. $location=$request->input('location');
  104. $inventoryId=$request->input('inventoryId');
  105. $owner_code=$request->input('owner_code');
  106. $goodses=$request->input('goodses');
  107. if (!$location) return ['success'=>false,'fail_info'=>'盘点库位不存在!'];
  108. if (count($goodses)<1) return ['success'=>false,'fail_info'=>'盘点商品不存在!'];
  109. //dd($location,$owner_code,$goodses,$inventoryId,$owner_id);
  110. /** @var InventoryAccountService $inventoryAccountMission */
  111. $inventoryAccountService=app('inventoryAccountService');
  112. $inventoryAccountMissions=$inventoryAccountService->baseOnBlindReceive($location,$owner_code,$goodses,$inventoryId);
  113. if (count($inventoryAccountMissions)<0)return ['success'=>false,'fail_info'=>'盲收盘点失败!'];
  114. /** @var InventoryAccountService $inventoryService */
  115. $inventoryService=app('inventoryAccountService');
  116. $inventoryAccount=$inventoryService->updateInventory($inventoryId);
  117. if ($inventoryAccountMissions&&$inventoryAccount)
  118. $stockInventoryPersons=$inventoryAccountMissions[0]->stockInventoryPersons;
  119. return ['success'=>true,'inventoryMissions'=>$inventoryAccountMissions,'inventory'=>$inventoryAccount,'stockInventoryPersons'=>$stockInventoryPersons];
  120. }
  121. //根据该库存和产品条码查询该条盘点记录??
  122. public function searchStockInventoryRecord(Request $request){
  123. if (!Gate::allows('库存管理-盘点')){return redirect(url('/')); }
  124. $location=$request->input('location');
  125. $barcode=$request->input('barcode');
  126. $inventoryId=$request->input('inventoryId');
  127. /** @var InventoryAccountService $application */
  128. $application = app('inventoryAccountService');
  129. $inventoryAccountMissions= $application->searchStockInventoryRecord($location,$barcode,$inventoryId);
  130. if ($inventoryAccountMissions->isEmpty())return ['success'=>false,'data'=>'没有找到相应记录!'];
  131. // $stockInventoryPersons=$inventoryAccountMissions->stockInventoryPersons;
  132. // return ['success'=>true,'data'=>$inventoryAccountMissions,'stockInventoryPersons'=>$stockInventoryPersons];
  133. return ['success'=>true,'data'=>$inventoryAccountMissions];
  134. }
  135. //盘点任务导出
  136. public function stockInventoryExport(Request $request){
  137. if (!Gate::allows('库存管理-盘点')){return redirect(url('/')); }
  138. ini_set('max_execution_time',3500);
  139. ini_set('memory_limit','3526M');
  140. if ($request->checkAllSign){
  141. $request->offsetUnset('checkAllSign');
  142. $queryParam=$request->all();
  143. $inventoryAccounts=app('inventoryAccountService')->get($queryParam);
  144. }else{
  145. $queryParam=$request->all();
  146. $inventoryAccounts=app('inventoryAccountService')->some($queryParam);
  147. }
  148. $row=[[
  149. 'id'=>'盘点编号',
  150. 'status'=>'盘点状态',
  151. 'created_at'=>'创建时间',
  152. 'owner_id'=>'货主',
  153. 'type'=>'任务类型',
  154. 'start_at'=>'起始时间',
  155. 'end_at'=>'结束时间',
  156. 'total'=>'记录数',
  157. 'processed'=>'已盘数',
  158. 'surplus'=>'剩余数',
  159. 'difference'=>'复盘差异',
  160. 'returned'=>'复盘归位',
  161. ]];
  162. $list=[];
  163. for ($i=0; $i<count($inventoryAccounts);$i++){
  164. $inventoryAccount=$inventoryAccounts[$i];
  165. $w=[
  166. 'id'=>isset($inventoryAccount->id)?$inventoryAccount->id:'',
  167. 'status'=>isset($inventoryAccount->status)?$inventoryAccount->status:'',
  168. 'created_at'=>isset($inventoryAccount->created_at)?$inventoryAccount->created_at:'',
  169. 'owner_id'=>isset($inventoryAccount->owner->name)?$inventoryAccount->owner->name:'',
  170. 'type'=>isset($inventoryAccount->type)?$inventoryAccount->type:'',
  171. 'start_at'=>isset($inventoryAccount->start_at)?$inventoryAccount->start_at:'',
  172. 'end_at'=>isset($inventoryAccount->end_at)?$inventoryAccount->end_at:'',
  173. 'total'=>isset($inventoryAccount->total)?$inventoryAccount->total:'',
  174. 'processed'=>isset($inventoryAccount->processed)?$inventoryAccount->processed:'',
  175. 'surplus'=>isset($inventoryAccount->surplus)?$inventoryAccount->surplus:'',
  176. 'difference'=>isset($inventoryAccount->difference)?$inventoryAccount->difference:'',
  177. 'returned'=>isset($inventoryAccount->returned)?$inventoryAccount->returned:'',
  178. ];
  179. $list[$i]=$w;
  180. }
  181. return Excel::download(new Export($row,$list),date('YmdHis', time()).'-盘点任务记录单.xlsx');
  182. }
  183. public function stockInventoryEnd(Request $request){
  184. if (!Gate::allows('库存管理-盘点-结束初盘')){return ['success'=>false,'data'=>'没有权限']; }
  185. $id=$request->input('id');
  186. if (!$id) return ['success'=>false,'data'=>'参数错误!'];
  187. $inventoryAccount=InventoryAccount::query()->where('id',$id)->update(['status'=>'复盘中']);
  188. app('LogService')->log(__METHOD__,'结束初盘任务'.__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
  189. if ($inventoryAccount>0) return ['success'=>true,'data'=>'复盘中'];
  190. return ['success'=>false,'data'=>'参数错误!'];
  191. }
  192. public function syncOwners(OwnerService $ownerService){
  193. if (!Gate::allows('库存管理-盘点')){return redirect(url('/')); }
  194. $owners=$ownerService->syncOwnersData();
  195. if (!$owners)return ['success'=>false,'data'=>'同步货主失败!'];
  196. return ['success'=>true,'data'=>$owners];
  197. }
  198. public function 修改质量状态(Request $request){
  199. if (!Gate::allows('库存管理-盘点')){return redirect(url('/')); }
  200. $id=$request->input('id');
  201. $location=$request->location;
  202. $sku=$request->sku;
  203. $quality=$request->quality;
  204. $ownerCode=$request->ownerCode;
  205. $inventoryAccountMission=app('inventoryAccountService')->修改质量状态($id,$location,$sku,$quality,$ownerCode);
  206. app('LogService')->log(__METHOD__,__FUNCTION__,json_encode($request->toArray()),Auth::user()['id']);
  207. if ($inventoryAccountMission==null) return ['success'=>false,'data'=>'WMS中不存在该条记录!'];
  208. return ['success'=>true,'data'=>'质量状态修改成功'];
  209. }
  210. public function 完结盘点任务($id){
  211. if(!Gate::allows('库存管理-盘点-完结')){return['success'=>false,'status'=>'没有权限'];}
  212. if (!$id)return['success'=>false,'status'=>'参数错误!'];
  213. $inventoryAccount=app('inventoryAccountService')->完结盘点任务($id);
  214. if (!$inventoryAccount)return['success'=>false,'status'=>'修改完结状态失败!'];
  215. return['success'=>true,'data'=>$inventoryAccount];
  216. }
  217. public function 增加系统之外的盘点记录(Request $request){
  218. if(!Gate::allows('库存管理-盘点')){return['success'=>false,'data'=>'没有权限'];}
  219. $location=$request->input('location');
  220. $barcode=$request->input('barcode');
  221. $inventoryId=$request->input('inventoryId');
  222. $count=$request->input('count');
  223. $owner_code=$request->input('owner_code');
  224. $param=$request->input('param');
  225. if (is_null($count)) return ['success'=>false,'data'=>'盘点数不能为空!'];
  226. $inventoryAccountMission=app('inventoryAccountService')->增加系统之外的盘点记录($location,$barcode,$inventoryId,$count,$owner_code,$param);
  227. if (!$inventoryAccountMission)return ['success'=>false,'data'=>'添加系统之外的库位记录失败!'];
  228. $inventoryAccountMission=InventoryAccountMission::with(['commodity.barcodes','stockInventoryPersons'])->where('id',$inventoryAccountMission->id)->first();
  229. $stockInventoryPersons=$inventoryAccountMission->stockInventoryPersons;
  230. return ['success'=>true,'inventoryAccountMission'=>$inventoryAccountMission,'stockInventoryPersons'=>$stockInventoryPersons];
  231. }
  232. public function 盘点选中任务(Request $request){
  233. if(!Gate::allows('库存管理-盘点')){return['success'=>false,'data'=>'没有权限'];}
  234. $id=$request->input('id');
  235. $count=$request->count;
  236. $inventoryId=$request->input('inventoryId');
  237. $produced_at=$request->input('produced_at');
  238. $valid_at=$request->input('valid_at');
  239. $batch_number=$request->input('batch_number');
  240. if (is_null($count)) return ['success'=>false,'data'=>'盘点数不能为空!'];
  241. if ($produced_at||$valid_at||$batch_number){
  242. /** @var InventoryAccountService $inventoryAccountMission */
  243. $inventoryAccountService=app('inventoryAccountService');
  244. $inventoryAccountMission=$inventoryAccountService ->盘点生产日期_失效日期_批号有改动任务($id,$count,$inventoryId,$produced_at,$valid_at,$batch_number);
  245. if (!$inventoryAccountMission)return ['success'=>false,'data'=>'盘点生产日期_失效日期_批号有改动任务失败!'];
  246. /** @var InventoryAccountService $inventoryService */
  247. $inventoryService=app('inventoryAccountService');
  248. $inventoryAccount=$inventoryService->updateInventory($inventoryId);
  249. $stockInventoryPersons=$inventoryAccountMission[0]->stockInventoryPersons;
  250. return ['success'=>true,'inventoryMission'=>$inventoryAccountMission,'inventory'=>$inventoryAccount,'stockInventoryPersons'=>$stockInventoryPersons];
  251. }else{
  252. /** @var InventoryAccountService $inventoryAccountMission */
  253. $inventoryAccountService=app('inventoryAccountService');
  254. $inventoryAccountMission=$inventoryAccountService ->盘点选中任务($id,$count,$inventoryId);
  255. if (!$inventoryAccountMission)return ['success'=>false,'data'=>'盘点选中任务失败!'];
  256. /** @var InventoryAccountService $inventoryService */
  257. $inventoryService=app('inventoryAccountService');
  258. $inventoryAccount=$inventoryService->updateInventory($inventoryId);
  259. $stockInventoryPersons=$inventoryAccountMission->stockInventoryPersons;
  260. return ['success'=>true,'inventoryMission'=>$inventoryAccountMission,'inventory'=>$inventoryAccount,'stockInventoryPersons'=>$stockInventoryPersons];
  261. }
  262. }
  263. public function 删除盘点记录(Request $request){
  264. if(!Gate::allows('库存管理-盘点-删除')){return['success'=>false,'data'=>'没有权限'];}
  265. $inventoryAccountMissionId=$request->input('inventoryAccountMissionId');
  266. $inventoryAccountId=$request->input('inventoryAccountId');
  267. if(is_null($inventoryAccountMissionId)){return ['success'=>false,'data'=>'传入id为空'];}
  268. /** @var InventoryAccountService $inventoryService */
  269. $inventoryService=app('inventoryAccountService');
  270. $inventoryAccountMission=$inventoryService->删除盘点记录($inventoryAccountMissionId,$inventoryAccountId);
  271. return ['success'=>true,'data'=>$inventoryAccountMission];
  272. }
  273. public function 跳过盘点记录(Request $request){
  274. if(!Gate::allows('库存管理-盘点')){return['success'=>false,'data'=>'没有权限'];}
  275. $inventoryAccountMissionId=$request->inventoryAccountMissionId;
  276. $inventoryAccountId=$request->input('inventoryAccountId');
  277. if(is_null($inventoryAccountMissionId)){return ['success'=>false,'data'=>'传入id为空'];}
  278. /** @var InventoryAccountService $inventoryService */
  279. $inventoryService=app('inventoryAccountService');
  280. $inventoryAccountMission=$inventoryService->跳过盘点记录($inventoryAccountMissionId,$inventoryAccountId);
  281. return ['success'=>true,'inventoryAccountMission'=>$inventoryAccountMission];
  282. }
  283. public function 确认盘点差异(Request $request){
  284. if(!Gate::allows('库存管理-盘点')){return['success'=>false,'data'=>'没有权限'];}
  285. $inventoryAccountMissionId=$request->inventoryAccountMissionId;
  286. $inventoryAccountId=$request->input('inventoryAccountId');
  287. if(is_null($inventoryAccountMissionId)){return ['success'=>false,'data'=>'传入id为空'];}
  288. /** @var InventoryAccountService $inventoryService */
  289. $inventoryService=app('inventoryAccountService');
  290. $inventoryAccountMission=$inventoryService->确认盘点差异($inventoryAccountMissionId,$inventoryAccountId);
  291. return ['success'=>true,'inventoryAccountMission'=>$inventoryAccountMission];
  292. }
  293. public function 批量跳过或确认差异(Request $request){
  294. if(!Gate::allows('库存管理-盘点')){return['success'=>false,'data'=>'没有权限'];}
  295. $checkData=$request->checkData;
  296. if(is_null($checkData)){return ['success'=>false,'data'=>'传入勾选盘点记录为空'];}
  297. $marks=[];
  298. foreach ($checkData as $inventoryMission){
  299. array_push($marks,$inventoryMission['mark']);
  300. }
  301. if (in_array('确认差异',$marks)||in_array('跳过',$marks)||in_array('无差异',$marks)||in_array('已复盘无差异',$marks))return ['success'=>false,'data'=>'传入勾选盘点记录存在不可操作项!'];
  302. /** @var InventoryAccountService $inventoryService */
  303. $inventoryService=app('inventoryAccountService');
  304. $inventoryAccountMissions=$inventoryService->批量跳过或确认差异($checkData);
  305. return ['success'=>true,'inventoryAccountMissions'=>$inventoryAccountMissions];
  306. }
  307. public function exportInventoryAccountMission(Request $request){
  308. if(!Gate::allows("库存管理-盘点")){ return redirect(url('/')); }
  309. $post = Http::post(config('go.export.url'),['type'=>'inventoryAccountMission','data'=>$request->data]);
  310. if ($post->status() == 500){
  311. throw new Exception($post->header("Msg"));
  312. }
  313. return response($post,200, [
  314. "Content-type"=>"application/octet-stream",
  315. "Content-Disposition"=>"attachment; filename=库存盘点记录-".date('ymdHis').'.xlsx',
  316. ]);
  317. }
  318. public function searchCommodityByBarcode(Request $request){
  319. if(!Gate::allows('库存管理-盘点')){return['success'=>false,'data'=>'没有权限'];}
  320. $barcode=$request->input('barcode');
  321. $owner_code=$request->input('owner_code');
  322. /** @var InventoryAccountService $inventoryService */
  323. $inventoryService=app('inventoryAccountService');
  324. $commodity=$inventoryService->searchCommodityByBarcode($barcode,$owner_code);
  325. if ($commodity){
  326. return ['success'=>true,'data'=>$commodity];
  327. }else{
  328. return ['success'=>false,'data'=>'输入的条码没有对应商品!'];
  329. }
  330. }
  331. }