ProcurementController.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Components\AsyncResponse;
  4. use App\Configuration;
  5. use App\Filters\ProcurementCheckSheetFilters;
  6. use App\Filters\ProcurementFilters;
  7. use App\Http\Requests\Procurement\EnquiryRequest;
  8. use App\Http\Requests\Procurement\ProcurementAmountRequest;
  9. use App\Http\Requests\Procurement\ProcurementRequest;
  10. use App\Http\Requests\Procurement\ProofRequest;
  11. use App\Material;
  12. use App\Procurement;
  13. use App\ProcurementCheckSheet;
  14. use App\ProcurementDeliverie;
  15. use App\ProcurementTotalBill;
  16. use App\Services\common\ExportService;
  17. use App\Services\OwnerMaterialService;
  18. use App\Services\ProcurementService;
  19. use App\Services\ProcurementTotalBillService;
  20. use App\Supplier;
  21. use Carbon\Traits\Date;
  22. use Illuminate\Http\Request;
  23. use Illuminate\Support\Facades\Auth;
  24. use Illuminate\Support\Facades\Gate;
  25. class ProcurementController extends Controller
  26. {
  27. use AsyncResponse;
  28. private function newProcurement($param){
  29. $procurement=new Procurement([
  30. 'owner_material_id'=>$param['owner_material_id'],
  31. 'quantity'=>$param['quantity'],
  32. 'amount'=>$param['amount'],
  33. 'unit_price'=>$param['unit_price'],
  34. 'initiator'=>Auth::user()['id'],
  35. 'type'=>0,
  36. ]);
  37. $procurement->save();
  38. $number_id=$procurement['id'];
  39. $procurement_code='BSHC';
  40. $procurement_code .= date ("ymd").str_pad($number_id>99999?$number_id%99999:$number_id,4,"0",STR_PAD_LEFT);
  41. $procurement->update(['code'=>$procurement_code]);
  42. return $procurement;
  43. }
  44. public function index(Request $request,ProcurementFilters $filters)
  45. {
  46. if(!Gate::allows('采购管理-采购-查询')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  47. $paginateParams=$request->input();
  48. $owner_ids=app('UserService')->getPermittingOwnerIds(auth()->user());
  49. $procurements = Procurement::query()
  50. ->filter($filters)
  51. ->with(['initiator','ownerMaterial.material','ownerMaterial.owner'=>function($query)use($owner_ids){
  52. $query->with('customer')->whereIn('id',$owner_ids);
  53. }])->paginate($param['paginate'] ?? 50);
  54. /** @var OwnerMaterialService $ownerMaterialService*/
  55. $ownerMaterialService=app(OwnerMaterialService::class);
  56. $owners=$ownerMaterialService->getOwnerPermittingWithMaterial();
  57. $materials=Material::query()->select('id','name')->get();
  58. $date=date('Y-m-d');
  59. $countReceive=ProcurementDeliverie::query()->where('signed_at',$date)->count();
  60. $countProcurement=Procurement::query()->where('type',0)->where('created_at','like',$date.'%')->count();
  61. return view('procurement/procurement/index',compact('procurements','owners','materials','paginateParams','countReceive','countProcurement'));
  62. }
  63. public function create()
  64. {
  65. if(!Gate::allows('采购管理-采购-新建')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  66. /** @var OwnerMaterialService $ownerMaterialService*/
  67. $ownerMaterialService=app(OwnerMaterialService::class);
  68. $owners=$ownerMaterialService->getOwnerPermittingWithMaterial();
  69. return view('procurement/procurement/create',compact('owners'));
  70. }
  71. public function store(Request $request)
  72. {
  73. $this->gate('采购管理-采购-新建');
  74. $param=$request->all(['owner_material_id','quantity','amount','unit_price']);
  75. $procurement=$this->newProcurement($param);
  76. return redirect('procurement/procurement/index')->with('successTip','新采购单“'.$procurement->code.'”添加成功');
  77. }
  78. public function createProcurement(ProcurementRequest $request)
  79. {
  80. $this->gate('采购管理-采购-新建');
  81. $request->validated();
  82. $param=$request->all(['owner_material_id','quantity','amount','unit_price']);
  83. try {
  84. $procurement=$this->newProcurement($param);
  85. $procurement = $procurement->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer']);
  86. if ($procurement) return ['success' => true,'data' => $procurement];
  87. else return ['success' => false, 'message' => '添加失败'];
  88. } catch (\Exception $e) {
  89. return ['success' => false,'message' => $e->getMessage()];
  90. }
  91. }
  92. //新增询价
  93. public function createEnquiry(EnquiryRequest $request)
  94. {
  95. $this->gate('采购管理-采购-新建');
  96. $request->validated();
  97. $param=$request->all(['owner_material_id']);
  98. try {
  99. $procurement=new Procurement([
  100. 'owner_material_id'=>$param['owner_material_id'],
  101. 'quantity'=>0,
  102. 'amount'=>0,
  103. 'unit_price'=>0,
  104. 'initiator'=>Auth::user()['id'],
  105. 'type'=>1,
  106. 'status'=>9,
  107. //'is_enquiry'=>'是',
  108. ]);
  109. $procurement->save();
  110. $number_id=$procurement['id'];
  111. $procurement_code='BSHC';
  112. $procurement_code .= date ("ymd").str_pad($number_id>99999?$number_id%99999:$number_id,4,"0",STR_PAD_LEFT);
  113. $procurement->update(['code'=>$procurement_code]);
  114. $procurement = $procurement->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer']);
  115. if ($procurement) return ['success' => true,'data' => $procurement];
  116. else return ['success' => false, 'message' => '添加失败'];
  117. } catch (\Exception $e) {
  118. return ['success' => false,'message' => $e->getMessage()];
  119. }
  120. }
  121. //新增打样
  122. public function createProof(ProofRequest $request)
  123. {
  124. $this->gate('采购管理-采购-新建');
  125. $request->validated();
  126. $param=$request->all(['owner_material_id']);
  127. try {
  128. $procurement=new Procurement([
  129. 'owner_material_id'=>$param['owner_material_id'],
  130. 'quantity'=>1,
  131. 'amount'=>0,
  132. 'unit_price'=>0,
  133. 'initiator'=>Auth::user()['id'],
  134. 'type'=>2,
  135. ]);
  136. $procurement->save();
  137. $number_id=$procurement['id'];
  138. $procurement_code='BSHC';
  139. $procurement_code .= date ("ymd").str_pad($number_id>99999?$number_id%99999:$number_id,4,"0",STR_PAD_LEFT);
  140. $procurement->update(['code'=>$procurement_code]);
  141. $procurement = $procurement->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer']);
  142. if ($procurement) return ['success' => true,'data' => $procurement];
  143. else return ['success' => false, 'message' => '添加失败'];
  144. } catch (\Exception $e) {
  145. return ['success' => false,'message' => $e->getMessage()];
  146. }
  147. }
  148. public function cancel($id){
  149. $this->gate('采购管理-采购-编辑');
  150. try {
  151. $procurement=Procurement::query()->find($id);
  152. $procurement->update(['status'=>3]);
  153. $procurement = $procurement->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer']);
  154. if ($procurement) return ['success' => true,'data' => $procurement];
  155. else return ['success' => false, 'message' => '取消失败'];
  156. } catch (\Exception $e) {
  157. return ['success' => false,'message' => $e->getMessage()];
  158. }
  159. }
  160. //询价单提交采购申请
  161. public function submitProcurement(ProcurementAmountRequest $request){
  162. $this->gate('采购管理-采购-编辑');
  163. $request->validated();
  164. $param=$request->all();
  165. try {
  166. $procurement=Procurement::query()->find($param['id']);
  167. $unit_price=$param['unit_price'];
  168. if (!$unit_price){
  169. $priceCoefficient=Configuration::query()->where('name','priceCoefficient')->value('value');
  170. $unit_price=$priceCoefficient*$param['offer'];
  171. }
  172. $procurement->update([
  173. 'type'=>0,
  174. 'status'=>0,
  175. 'quantity'=>$param['quantity'],
  176. 'amount'=>$param['amount'],
  177. 'unit_price'=>$unit_price,
  178. 'cost_price'=>$param['offer'],
  179. 'supplier_id'=>$param['supplier_id'],
  180. ]);
  181. $procurement = $procurement->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer']);
  182. if ($procurement) return ['success' => true,'data' => $procurement];
  183. else return ['success' => false, 'message' => '取消失败'];
  184. } catch (\Exception $e) {
  185. return ['success' => false,'message' => $e->getMessage()];
  186. }
  187. }
  188. public function initiateProcurement(Request $request){
  189. $this->gate('采购管理-采购-编辑');
  190. $id=$request->input('id');
  191. /** @var ProcurementService $procurementService*/
  192. $procurementService=app(ProcurementService::class);
  193. try {
  194. $procurementQuotation=$procurementService->screenLowestQuotation($id);
  195. if ($procurementQuotation) return ['success' => true,'data' => $procurementQuotation];
  196. else return ['success' => false, 'message' => '暂无供应商报价!'];
  197. } catch (\Exception $e) {
  198. return ['success' => false,'message' => $e->getMessage()];
  199. }
  200. }
  201. public function costPrice(Request $request){
  202. $this->gate('采购管理-财务-采购账单');
  203. $id=$request->input('id');
  204. $cost_price=$request->input('cost_price');
  205. try {
  206. $procurement=Procurement::query()->find($id);
  207. if ($procurement->cost_price!=$cost_price)$procurement->update(['cost_price'=>$cost_price]);
  208. $procurement = $procurement->loadMissing(['initiator','supplier','ownerMaterial.material','ownerMaterial.owner.customer']);
  209. if ($procurement) return ['success' => true,'data' => $procurement];
  210. else return ['success' => false, 'message' => '修改采购单价失败!'];
  211. } catch (\Exception $e) {
  212. return ['success' => false,'message' => $e->getMessage()];
  213. }
  214. }
  215. public function show(Procurement $procurement)
  216. {
  217. //
  218. }
  219. public function edit(Procurement $procurement)
  220. {
  221. //
  222. }
  223. public function update(Request $request, Procurement $procurement)
  224. {
  225. //
  226. }
  227. public function destroy(Procurement $procurement)
  228. {
  229. //
  230. }
  231. public function checkBill(Request $request,ProcurementCheckSheetFilters $filters)
  232. {
  233. if(!Gate::allows('采购管理-财务-对账单')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  234. $paginateParams=$request->input();
  235. $procurementCheckSheets=ProcurementCheckSheet::query()
  236. ->filter($filters)
  237. ->with(['procurementDelivery.procurement.supplier','procurementDelivery.procurement.ownerMaterial.material','procurementDelivery.receiver'])
  238. ->paginate($param['paginate'] ?? 50);
  239. $suppliers=Supplier::query()->select('id','name')->get();
  240. $materials=Material::query()->select('id','name')->get();
  241. return view('procurement/finance/checkBill',compact('procurementCheckSheets','suppliers','paginateParams','materials'));
  242. }
  243. public function fillInvoice(Request $request){
  244. $this->gate('采购管理-财务-对账单');
  245. $id=$request->input('procurementCheckSheetId');
  246. $invoice_number=$request->input('invoice_number');
  247. try {
  248. $procurementCheckSheet=ProcurementCheckSheet::query()->where('id',$id)->update(['invoice_number'=>$invoice_number]);
  249. if ($procurementCheckSheet) return ['success' => true,'data' => $invoice_number];
  250. else return ['success' => false, 'message' => '添加失败'];
  251. } catch (\Exception $e) {
  252. return ['success' => false,'message' => $e->getMessage()];
  253. }
  254. }
  255. public function procurementBill(Request $request,ProcurementFilters $filters)
  256. {
  257. if(!Gate::allows('采购管理-财务-采购账单')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  258. $paginateParams=$request->input();
  259. $owner_ids=app('UserService')->getPermittingOwnerIds(auth()->user());
  260. $owners=app("OwnerService")->getIntersectPermitting();
  261. $materials=Material::query()->select('id','name')->get();
  262. $suppliers=Supplier::query()->select('id','name')->get();
  263. $procurements = Procurement::query()
  264. ->filter($filters)
  265. ->with(['initiator','supplier','ownerMaterial.material','ownerMaterial.owner'=>function($query)use($owner_ids){
  266. $query->with('customer')->whereIn('id',$owner_ids);
  267. }])
  268. ->where('type',0) //只取采购单
  269. ->paginate($param['paginate'] ?? 50);
  270. return view('procurement/finance/procurementBill',compact('suppliers','materials','owners','paginateParams','procurements'));
  271. }
  272. public function monthlyBillReport(Request $request)
  273. {
  274. if(!Gate::allows('采购管理-财务-月账单报表')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  275. $paginateParams=$request->input();
  276. /** @var ProcurementTotalBillService $procurementTotalBillService*/
  277. $procurementTotalBillService=app(ProcurementTotalBillService::class);
  278. $procurementTotalBills=$procurementTotalBillService->paginate($paginateParams);
  279. $suppliers=Supplier::query()->select('id','name')->get();
  280. return view('procurement/finance/monthlyBillReport',compact('suppliers','procurementTotalBills','paginateParams'));
  281. }
  282. //采购导出
  283. public function procurementExport(Request $request,ProcurementFilters $filters){
  284. $this->gate('采购管理-采购-查询');
  285. $owner_ids=app('UserService')->getPermittingOwnerIds(auth()->user());
  286. $procurements = Procurement::query()
  287. ->filter($filters)
  288. ->with(['initiator','ownerMaterial.material','ownerMaterial.owner'=>function($query)use($owner_ids){
  289. $query->with('customer')->whereIn('id',$owner_ids);
  290. }])->get();
  291. $procurementStatus=Procurement::status;
  292. $procurementType=Procurement::type;
  293. $row = ['采购编号','项目','单据类型','采购公司','耗材编号','耗材','尺寸大小','特殊要求','材质规格','采购数量','销售单价(元)','送货数量','销售总价(元)','采购单状态','联系方式'];
  294. $list = [];
  295. foreach ($procurements as $procurement){
  296. $list[] = [
  297. $procurement->code,
  298. $procurement->ownerMaterial->owner ? $procurement->ownerMaterial->owner->name :'',
  299. is_null($procurement->type) ? '' :$procurementType[$procurement->type],
  300. $procurement->ownerMaterial->owner->customer ? $procurement->ownerMaterial->owner->customer->company_name :'',
  301. $procurement->ownerMaterial->material ? $procurement->ownerMaterial->material->code :'',
  302. $procurement->ownerMaterial->material ? $procurement->ownerMaterial->material->name :'',
  303. $procurement->ownerMaterial ? $procurement->ownerMaterial->size :'',
  304. $procurement->ownerMaterial ? $procurement->ownerMaterial->special :'',
  305. $procurement->ownerMaterial ? $procurement->ownerMaterial->specification :'',
  306. $procurement->quantity,
  307. $procurement->unit_price,
  308. '',//送货数量
  309. '',//销售总价
  310. is_null($procurement->status) ? '' :$procurementStatus[$procurement->status],
  311. $procurement->ownerMaterial->owner->customer ? $procurement->ownerMaterial->owner->customer->phone :'',
  312. ];
  313. }
  314. return app(ExportService::class)->json($row,$list,"采购管理-采购报表记录");
  315. }
  316. //对账单报表导出
  317. public function checkBillExport(Request $request,ProcurementCheckSheetFilters $filters){
  318. $this->gate('采购管理-财务-对账单');
  319. $procurementCheckSheets=ProcurementCheckSheet::query()
  320. ->filter($filters)
  321. ->with(['procurementDelivery.procurement.supplier','procurementDelivery.procurement.ownerMaterial.material','procurementDelivery.receiver'])
  322. ->get();
  323. $procurementCheckSheetStatus=ProcurementCheckSheet::status;
  324. $row = ['采购编号','采购日期','送货日期','供应商名称','耗材编号','耗材','采购数量','送货数量','签收人','签收日期','应付金额','发票号','状态'];
  325. $list = [];
  326. foreach ($procurementCheckSheets as $procurementCheckSheet){
  327. $list[] = [
  328. $procurementCheckSheet->procurementDelivery->procurement ? $procurementCheckSheet->procurementDelivery->procurement->code : '',
  329. $procurementCheckSheet->procurementDelivery->procurement ? $procurementCheckSheet->procurementDelivery->procurement->created_at :'',
  330. $procurementCheckSheet->procurementDelivery ? $procurementCheckSheet->procurementDelivery->created_at :'',
  331. $procurementCheckSheet->procurementDelivery->procurement->supplier ? $procurementCheckSheet->procurementDelivery->procurement->supplier->name :'',
  332. $procurementCheckSheet->procurementDelivery->procurement->ownerMaterial->material ? $procurementCheckSheet->procurementDelivery->procurement->ownerMaterial->material->code :'',
  333. $procurementCheckSheet->procurementDelivery->procurement->ownerMaterial->material ? $procurementCheckSheet->procurementDelivery->procurement->ownerMaterial->material->name :'',
  334. $procurementCheckSheet->procurementDelivery->procurement ? $procurementCheckSheet->procurementDelivery->procurement->quantity :'',
  335. $procurementCheckSheet->procurementDelivery ? $procurementCheckSheet->procurementDelivery->amount :'',
  336. $procurementCheckSheet->procurementDelivery->receiver ? $procurementCheckSheet->procurementDelivery->receiver->name :'',
  337. $procurementCheckSheet->procurementDelivery ? $procurementCheckSheet->procurementDelivery->signed_at :'',
  338. $procurementCheckSheet->account_payable,
  339. $procurementCheckSheet->invoice_number,
  340. is_null($procurementCheckSheet->status) ? '' :$procurementCheckSheetStatus[$procurementCheckSheet->status],
  341. ];
  342. }
  343. return app(ExportService::class)->json($row,$list,"采购管理-对账单报表记录");
  344. }
  345. //采购账单导出
  346. public function procurementBillExport(Request $request,ProcurementFilters $filters){
  347. $this->gate('采购管理-财务-采购账单');
  348. $owner_ids=app('UserService')->getPermittingOwnerIds(auth()->user());
  349. $procurements = Procurement::query()
  350. ->filter($filters)
  351. ->with(['initiator','supplier','ownerMaterial.material','ownerMaterial.owner'=>function($query)use($owner_ids){
  352. $query->with('customer')->whereIn('id',$owner_ids);
  353. }])->get();
  354. $procurementStatus=Procurement::status;
  355. $row = ['采购编号','采购日期','接单日期','签收日期','项目名称','采购公司','供应商','耗材编号','耗材','尺寸大小','特殊要求',
  356. '材质规格','采购数量','销售数量','收货数量','采购单价(元)','销售单价(元)','应收金额(元)','应付金额(元)','状态'];
  357. $list = [];
  358. foreach ($procurements as $procurement){
  359. $list[] = [
  360. $procurement->code,
  361. $procurement->created_at,
  362. '',//接单日期
  363. '',//签收日期
  364. $procurement->ownerMaterial->owner ? $procurement->ownerMaterial->owner->name :'',
  365. $procurement->ownerMaterial->owner->customer ? $procurement->ownerMaterial->owner->customer->company_name :'',
  366. $procurement->supplier ? $procurement->supplier->name :'',
  367. $procurement->ownerMaterial->material ? $procurement->ownerMaterial->material->code :'',
  368. $procurement->ownerMaterial->material ? $procurement->ownerMaterial->material->name :'',
  369. $procurement->ownerMaterial ? $procurement->ownerMaterial->size :'',
  370. $procurement->ownerMaterial ? $procurement->ownerMaterial->special :'',
  371. $procurement->ownerMaterial ? $procurement->ownerMaterial->specification :'',
  372. $procurement->quantity,
  373. $procurement->amount,
  374. '',//收货数量
  375. $procurement->cost_price,
  376. $procurement->unit_price,
  377. '',//应收金额
  378. '',//应付金额
  379. is_null($procurement->status) ? '' :$procurementStatus[$procurement->status],
  380. ];
  381. }
  382. return app(ExportService::class)->json($row,$list,"采购账单报表记录");
  383. }
  384. //月账单报表导出
  385. public function procurementTotalBillExport(Request $request){
  386. $this->gate('采购管理-财务-月账单报表');
  387. /** @var ProcurementTotalBillService $procurementTotalBillService*/
  388. $procurementTotalBillService=app(ProcurementTotalBillService::class);
  389. if ($request->input('checkAllSign')){
  390. $params = $request->input();
  391. unset($params["checkAllSign"]);
  392. $procurementTotalBills=$procurementTotalBillService->get($params);
  393. }else{
  394. $procurementTotalBills=$procurementTotalBillService->get(["id"=>$request->data]);
  395. }
  396. $procurementTotalBillStatus=ProcurementTotalBill::status;
  397. $row = ['对账编号','账单日期','提交日期','供应商','总金额','状态'];
  398. $list = [];
  399. foreach ($procurementTotalBills as $procurementTotalBill){
  400. $list[] = [
  401. $procurementTotalBill->id,
  402. $procurementTotalBill->counting_month,
  403. $procurementTotalBill->created_at,
  404. $procurementTotalBill->supplier ? $procurementTotalBill->supplier :'',
  405. $procurementTotalBill->total_payable,
  406. $procurementTotalBill->status ? $procurementTotalBillStatus[$procurementTotalBill->status] :'',
  407. ];
  408. }
  409. return app(ExportService::class)->json($row,$list,"采购管理-月账单报表记录");
  410. }
  411. }