ProcurementController.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Components\AsyncResponse;
  4. use App\Filters\ProcurementCheckSheetFilters;
  5. use App\Filters\ProcurementFilters;
  6. use App\Http\Requests\Procurement\EnquiryRequest;
  7. use App\Http\Requests\Procurement\ProcurementAmountRequest;
  8. use App\Http\Requests\Procurement\ProcurementRequest;
  9. use App\Http\Requests\Procurement\ProofRequest;
  10. use App\Jobs\ProcurementConfirmInform;
  11. use App\Jobs\ProcurementEnquiry;
  12. use App\Jobs\ProcurementReceive;
  13. use App\Jobs\ProcurementWaitConfirmInform;
  14. use App\Material;
  15. use App\Procurement;
  16. use App\ProcurementCheckSheet;
  17. use App\ProcurementDeliverie;
  18. use App\ProcurementTotalBill;
  19. use App\Services\common\ExportService;
  20. use App\Services\ConfigurationService;
  21. use App\Services\OwnerMaterialService;
  22. use App\Services\ProcurementService;
  23. use App\Services\ProcurementTotalBillService;
  24. use App\Services\SupplierService;
  25. use App\Supplier;
  26. use Illuminate\Http\Request;
  27. use Illuminate\Support\Carbon;
  28. use Illuminate\Support\Facades\Auth;
  29. use Illuminate\Support\Facades\Gate;
  30. use Matrix\Builder;
  31. use Oursdreams\Export\Export;
  32. class ProcurementController extends Controller
  33. {
  34. use AsyncResponse;
  35. private function newProcurement($param,$userId,$type=0,$status=0): Procurement
  36. {
  37. $this->error("移至SWMS下达采购单,该系统已关闭");
  38. $procurement=new Procurement([
  39. 'owner_material_id'=>$param['owner_material_id'],
  40. 'quantity'=>$param['quantity'],
  41. 'amount'=>$param['amount'],
  42. 'unit_price'=>$param['unit_price'],
  43. 'initiator'=>$userId,
  44. 'type'=>$type,
  45. 'status'=>$status,
  46. 'remark'=>$param['remark'],
  47. ]);
  48. $procurement->save();
  49. $number_id=$procurement['id'];
  50. $procurement_code='BSHC';
  51. $procurement_code .= date ("ymd").str_pad($number_id>99999?$number_id%99999:$number_id,4,"0",STR_PAD_LEFT);
  52. /** @var ProcurementService $procurementService*/
  53. $procurementService=app(ProcurementService::class);
  54. $deadline=$procurementService->computeDeadline(Carbon::now()->toDateTimeString());
  55. $procurement->update(['code'=>$procurement_code,'deadline'=>$deadline]);
  56. if ($procurement->type==0) dispatch(new ProcurementEnquiry($procurement))->delay(Carbon::parse($deadline)); //采购单创建时 推送到队列中
  57. dispatch(new ProcurementConfirmInform($procurement)); //推送发送订单通知消息模板 队列
  58. return $procurement;
  59. }
  60. public function index(Request $request,ProcurementFilters $filters)
  61. {
  62. if(!Gate::allows('采购管理-采购-查询')){ return redirect(url('/')); }
  63. $paginateParams=$request->input();
  64. $owner_ids = app("OwnerService")->getIdArr();
  65. $procurements = Procurement::query()
  66. ->orderByDesc('id')
  67. ->filter($filters)
  68. ->withCount('procurementQuotations')
  69. ->with(['initiator','ownerMaterial.file','ownerMaterial.material','supplier','ownerMaterial.owner'=>function($query)use($owner_ids){
  70. $query->with('customer')->whereIn('id',$owner_ids);
  71. },'procurementDeliveries','procurementQuotations.supplier'])
  72. ->whereHas('ownerMaterial',function($builder)use($owner_ids){
  73. $builder->whereHas('owner',function ($build)use($owner_ids){
  74. $build->whereIn('id',$owner_ids);
  75. });
  76. })
  77. ->paginate($paginateParams['paginate'] ?? 50);
  78. foreach ($procurements as $procurement){
  79. if ($procurement->procurement_quotations_count>0 && $procurement->status==0) $procurement->status=1;
  80. if (empty($procurement->procurementDeliveries))continue;
  81. if (Carbon::now()->gt($procurement['deadline'])){
  82. $procurement->isFinishEnquiry=true;
  83. }else{
  84. $procurement->isFinishEnquiry=false;
  85. }
  86. $procurement->deliver_amount=$procurement->procurementDeliveries->sum('amount');
  87. }
  88. /** @var OwnerMaterialService $ownerMaterialService*/
  89. $ownerMaterialService=app(OwnerMaterialService::class);
  90. $owners=$ownerMaterialService->getOwnerPermittingWithMaterial();
  91. $materials=Material::query()->select('id','name')->get();
  92. $date=date('Y-m-d');
  93. $countReceive=ProcurementDeliverie::query()->where('signed_at',$date)->count();
  94. $countProcurement=Procurement::query()->where('type',0)->where('created_at','like',$date.'%')->count();
  95. return view('procurement/procurement/index',compact('procurements','owners','materials','paginateParams','countReceive','countProcurement'));
  96. }
  97. public function create()
  98. {
  99. $this->error("移至SWMS下达采购单,该系统已关闭");
  100. if(!Gate::allows('采购管理-采购-新建')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  101. /** @var OwnerMaterialService $ownerMaterialService*/
  102. $ownerMaterialService=app(OwnerMaterialService::class);
  103. $owners=$ownerMaterialService->getOwnerPermittingWithMaterial();
  104. return view('procurement/procurement/create',compact('owners'));
  105. }
  106. public function store(Request $request)
  107. {
  108. $this->error("移至SWMS下达采购单,该系统已关闭");
  109. $this->gate('采购管理-采购-新建');
  110. $param=$request->all(['owner_material_id','quantity','amount','unit_price','remark']);
  111. $procurement=$this->newProcurement($param,Auth::user()['id']);
  112. return redirect('procurement/procurement/index')->with('successTip','新采购单“'.$procurement->code.'”添加成功');
  113. }
  114. public function createProcurement(ProcurementRequest $request): array
  115. {
  116. $this->error("移至SWMS下达采购单,该系统已关闭");
  117. $this->gate('采购管理-采购-新建');
  118. $request->validated();
  119. $param=$request->all(['owner_material_id','quantity','amount','unit_price','remark']);
  120. $procurement=$this->newProcurement($param,Auth::user()['id']);
  121. $procurement = $procurement->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer','ownerMaterial.file','supplier']);
  122. if ($procurement) return ['success' => true,'data' => $procurement];
  123. else return ['success' => false, 'message' => '添加失败'];
  124. }
  125. //新增询价
  126. public function createEnquiry(EnquiryRequest $request): array
  127. {
  128. $this->error("移至SWMS下达采购单,该系统已关闭");
  129. $this->gate('采购管理-采购-新建');
  130. $request->validated();
  131. $param=$request->all(['owner_material_id']);
  132. $procurement=new Procurement([
  133. 'owner_material_id'=>$param['owner_material_id'],
  134. 'quantity'=>0,
  135. 'amount'=>0,
  136. 'unit_price'=>0,
  137. 'initiator'=>Auth::user()['id'],
  138. 'type'=>1,
  139. 'status'=>0,
  140. ]);
  141. $procurement->save();
  142. $number_id=$procurement['id'];
  143. $procurement_code='BSHC';
  144. $procurement_code .= date ("ymd").str_pad($number_id>99999?$number_id%99999:$number_id,4,"0",STR_PAD_LEFT);
  145. /** @var ProcurementService $procurementService*/
  146. $procurementService=app(ProcurementService::class);
  147. $deadline=$procurementService->computeDeadline($procurement->created_at);
  148. $procurement->update(['code'=>$procurement_code,'deadline'=>$deadline]);
  149. dispatch(new ProcurementConfirmInform($procurement)); //推送发送订单通知消息模板 队列
  150. $procurement = $procurement->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer','ownerMaterial.file','supplier']);
  151. if ($procurement) return ['success' => true,'data' => $procurement];
  152. else return ['success' => false, 'message' => '添加失败'];
  153. }
  154. //新增打样
  155. public function createProof(ProofRequest $request): array
  156. {
  157. $this->error("移至SWMS下达采购单,该系统已关闭");
  158. $this->gate('采购管理-采购-新建');
  159. $request->validated();
  160. $param=$request->all(['owner_material_id']);
  161. $procurement=new Procurement([
  162. 'owner_material_id'=>$param['owner_material_id'],
  163. 'quantity'=>1,
  164. 'amount'=>0,
  165. 'unit_price'=>0,
  166. 'initiator'=>Auth::user()['id'],
  167. 'type'=>2,
  168. 'status'=>2,
  169. ]);
  170. $procurement->save();
  171. $number_id=$procurement['id'];
  172. $procurement_code='BSHC';
  173. $procurement_code .= date ("ymd").str_pad($number_id>99999?$number_id%99999:$number_id,4,"0",STR_PAD_LEFT);
  174. /** @var ProcurementService $procurementService*/
  175. $procurementService=app(ProcurementService::class);
  176. $deadline=$procurementService->computeDeadline($procurement->created_at);
  177. $procurement->update(['code'=>$procurement_code,'deadline'=>$deadline]);
  178. dispatch(new ProcurementConfirmInform($procurement)); //推送发送订单通知消息模板 队列
  179. $procurement = $procurement->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer','ownerMaterial.file','supplier']);
  180. if ($procurement) return ['success' => true,'data' => $procurement];
  181. else return ['success' => false, 'message' => '添加失败'];
  182. }
  183. //取消采购单
  184. public function cancel($id): array
  185. {
  186. $this->gate('采购管理-采购-编辑');
  187. $procurement=Procurement::query()->find($id);
  188. $procurement->update(['status'=>10]);
  189. $procurement = $procurement->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer']);
  190. if ($procurement) return ['success' => true,'data' => $procurement];
  191. else return ['success' => false, 'message' => '取消失败'];
  192. }
  193. //询价单提交采购申请
  194. public function submitProcurement(ProcurementAmountRequest $request): array
  195. {
  196. $this->error("移至SWMS下达采购单,该系统已关闭");
  197. $this->gate('采购管理-采购-编辑');
  198. $request->validated();
  199. $param=$request->all();
  200. /**@var ConfigurationService $configurationService */
  201. $configurationService=app(ConfigurationService::class);
  202. $receive_time=$configurationService->getReceiveTime();
  203. $priceCoefficient=$configurationService->getPriceCoefficient();
  204. /** @var Procurement $procurement */
  205. $procurement=Procurement::query()->find($param['id']);
  206. $unit_price=$param['unit_price'];
  207. if (!$unit_price) $unit_price=$priceCoefficient*$param['offer'];
  208. $procurement->update([
  209. 'type'=>0,
  210. 'status'=>2,
  211. 'quantity'=>$param['quantity'],
  212. 'amount'=>$param['amount'],
  213. 'unit_price'=>$unit_price,
  214. 'cost_price'=>$param['offer'],
  215. 'supplier_id'=>$param['supplier_id'],
  216. 'deadline'=>Carbon::parse(Carbon::now()->toDateTimeString())->subHours(-$receive_time)->toDateTimeString(),
  217. ]);
  218. dispatch(new ProcurementReceive($procurement))->delay(now()->addHours($receive_time)); //可从系统配置获取
  219. dispatch(new ProcurementWaitConfirmInform($procurement));
  220. $procurement = $procurement->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer','ownerMaterial.file','supplier']);
  221. if ($procurement) return ['success' => true,'data' => $procurement];
  222. else return ['success' => false, 'message' => '发起采购失败'];
  223. }
  224. public function initiateProcurement(Request $request): array
  225. {
  226. $this->gate('采购管理-采购-编辑');
  227. $id=$request->input('id');
  228. /** @var ProcurementService $procurementService*/
  229. $procurementService=app(ProcurementService::class);
  230. $procurementQuotation=$procurementService->screenLowestQuotation($id);
  231. if ($procurementQuotation) return ['success' => true,'data' => $procurementQuotation];
  232. else return ['success' => false, 'message' => '暂无供应商报价!'];
  233. }
  234. public function costPrice(Request $request): array
  235. {
  236. $this->gate('采购管理-财务-采购账单');
  237. $id=$request->input('id');
  238. $cost_price=$request->input('cost_price');
  239. $procurement=Procurement::query()->find($id);
  240. if ($procurement->cost_price!=$cost_price)$procurement->update(['cost_price'=>$cost_price]);
  241. $procurement = $procurement->loadMissing(['initiator','supplier','ownerMaterial.material','ownerMaterial.owner.customer','ownerMaterial.file','supplier']);
  242. if ($procurement) return ['success' => true,'data' => $procurement];
  243. else return ['success' => false, 'message' => '修改采购单价失败!'];
  244. }
  245. public function createAnew(Request $request): array
  246. {
  247. $this->error("移至SWMS下达采购单,该系统已关闭");
  248. $this->gate('采购管理-采购-新建');
  249. $ids=$request->input('checkData');
  250. if (empty($ids)) return ['success' => false, 'message' => '当前未勾选指定订单!'];
  251. $collect=collect();
  252. $procurements=Procurement::query()->whereIn('id',$ids)->get();
  253. foreach ($procurements as $procurement){
  254. if ($procurement->type==2){
  255. $pro=$this->newProcurement($procurement,Auth::user()['id'],$procurement->type,2);
  256. }else{
  257. $pro=$this->newProcurement($procurement,Auth::user()['id'],$procurement->type);
  258. }
  259. $pro->loadMissing(['initiator','ownerMaterial.material','ownerMaterial.owner.customer','ownerMaterial.file','supplier']);
  260. $collect->add($pro);
  261. }
  262. if (!empty($collect)) return ['success' => true,'data' => $collect];
  263. }
  264. public function checkBill(Request $request,ProcurementCheckSheetFilters $filters)
  265. {
  266. if(!Gate::allows('采购管理-财务-对账单')){ return redirect(url('/')); }
  267. $paginateParams=$request->input();
  268. /**@var SupplierService $supplierService*/
  269. $supplierService=app(SupplierService::class);
  270. $supplier_ids=$supplierService->screenSupplierIds();
  271. $procurementCheckSheets=ProcurementCheckSheet::query()
  272. ->orderByDesc('id')
  273. ->filter($filters)
  274. ->with(['procurementDelivery.procurement.supplier','procurementDelivery.procurement.ownerMaterial.material','procurementDelivery.receiver'])
  275. ->whereHas('procurementDelivery',function($builder)use($supplier_ids){
  276. $builder->whereHas('procurement',function ($build)use($supplier_ids){
  277. $build->whereHas('supplier',function ($build)use($supplier_ids){
  278. $build->whereIn('id',$supplier_ids);
  279. });
  280. });
  281. })
  282. ->paginate($paginateParams['paginate'] ?? 50);
  283. $suppliers=Supplier::query()->select('id','name')->get();
  284. $materials=Material::query()->select('id','name')->get();
  285. return view('procurement/finance/checkBill',compact('procurementCheckSheets','suppliers','paginateParams','materials'));
  286. }
  287. public function fillInvoice(Request $request): array
  288. {
  289. $this->gate('采购管理-财务-对账单');
  290. $id=$request->input('procurementCheckSheetId');
  291. $invoice_number=$request->input('invoice_number');
  292. $procurementCheckSheet=ProcurementCheckSheet::query()->find($id);
  293. $procurementTotalBill=null;
  294. $procurementCheckSheet->update([
  295. 'invoice_number'=>$invoice_number,
  296. 'status'=>3,//3 已完结
  297. ]);
  298. $supplier_id = $procurementCheckSheet->procurementDelivery->procurement->supplier_id ?? null;
  299. $ProcurementQuery = Procurement::query()->select("id")
  300. ->where('supplier_id',$supplier_id);
  301. $procurementDeliveryQuery= ProcurementDeliverie::query()->select('id')
  302. ->whereIn("procurement_id",$ProcurementQuery)
  303. ->where("created_at","like",Carbon::parse($procurementCheckSheet['procurementDelivery']['created_at'])->format('Y-m')."%");
  304. $count=ProcurementCheckSheet::query()
  305. ->with(['procurementDelivery.procurement.ownerMaterial.material','procurementDelivery.procurement.supplier'])
  306. ->whereIn('procurement_delivery_id',$procurementDeliveryQuery)->where('status','!=',3)->count();
  307. if($count==0){
  308. $procurementTotalBill=ProcurementTotalBill::query()
  309. ->where('counting_month','like',Carbon::parse($procurementCheckSheet['procurementDelivery']['created_at'])->format('Y-m')."%")
  310. ->where('supplier_id',$supplier_id)
  311. ->update(['status'=>2]);
  312. }
  313. if ($procurementTotalBill) {
  314. return ['success' => true,'data' => $invoice_number,'status'=>3,'totalStatus'=>2];
  315. }
  316. elseif ($procurementCheckSheet){
  317. return ['success' => true,'data' => $invoice_number,'status'=>3];
  318. }else return ['success' => false, 'message' => '添加失败'];
  319. }
  320. public function procurementBill(Request $request,ProcurementFilters $filters)
  321. {
  322. if(!Gate::allows('采购管理-财务-采购账单')){ return redirect(url('/')); }
  323. $paginateParams=$request->input();
  324. $owner_ids = app("OwnerService")->getIdArr();
  325. $owners=app("OwnerService")->getIntersectPermitting();
  326. $materials=Material::query()->select('id','name')->get();
  327. $suppliers=Supplier::query()->select('id','name')->get();
  328. $procurements = Procurement::query()
  329. ->orderByDesc('id')
  330. ->filter($filters)
  331. ->with(['initiator','supplier','ownerMaterial.material','ownerMaterial.owner'=>function($query)use($owner_ids){
  332. /** @var Builder $query */
  333. $query->with('customer')->whereIn('id',$owner_ids);
  334. },'procurementDeliveries'])
  335. ->whereHas('ownerMaterial',function($builder)use($owner_ids){
  336. $builder->whereHas('owner',function ($build)use($owner_ids){
  337. $build->whereIn('id',$owner_ids);
  338. });
  339. })
  340. ->where('type',0) //只取采购单
  341. ->paginate($paginateParams['paginate'] ?? 50);
  342. foreach ($procurements as $procurement){
  343. if (empty($procurement->procurementDeliveries))continue;
  344. $procurement->receive_amount=$procurement->procurementDeliveries->sum('amount');
  345. $procurement->signed_at=$procurement->procurementDeliveries->first()['signed_at']??'';
  346. }
  347. return view('procurement/finance/procurementBill',compact('suppliers','materials','owners','paginateParams','procurements'));
  348. }
  349. public function monthlyBillReport(Request $request)
  350. {
  351. if(!Gate::allows('采购管理-财务-月账单报表')){ return redirect(url('/')); }
  352. $paginateParams=$request->input();
  353. /** @var ProcurementTotalBillService $procurementTotalBillService*/
  354. $procurementTotalBillService=app(ProcurementTotalBillService::class);
  355. $procurementTotalBills=$procurementTotalBillService->paginate($paginateParams);
  356. $suppliers=Supplier::query()->select('id','name')->get();
  357. return view('procurement/finance/monthlyBillReport',compact('suppliers','procurementTotalBills','paginateParams'));
  358. }
  359. public function getCheckBillMonth(Request $request)
  360. {
  361. if(!Gate::allows('采购管理-财务-月账单报表')){ return ["success"=>false,"data"=>"您无此权限操作!"]; }
  362. $procurementTotalBill=ProcurementTotalBill::query()->find($request->input('procurement_total_bill_id'));
  363. /** @var ProcurementTotalBill $procurementTotalBill */
  364. $procurementTotalBill->setCurrentMothProcurements();
  365. return ["success"=>true,"data"=>$procurementTotalBill->procurementCheckSheets??[]];
  366. }
  367. //采购导出
  368. public function procurementExport(Request $request,ProcurementFilters $filters){
  369. $this->gate('采购管理-采购-查询');
  370. $owner_ids=app("OwnerService")->getIdArr();
  371. $procurements = Procurement::query()
  372. ->filter($filters)
  373. ->withCount('procurementQuotations')
  374. ->with(['initiator','ownerMaterial.material','ownerMaterial.owner'=>function($query)use($owner_ids){
  375. $query->with('customer')->whereIn('id',$owner_ids);
  376. },'procurementDeliveries'])
  377. ->whereHas('ownerMaterial',function($builder)use($owner_ids){
  378. $builder->whereHas('owner',function ($build)use($owner_ids){
  379. $build->whereIn('id',$owner_ids);
  380. });
  381. })
  382. ->get();
  383. foreach ($procurements as $procurement){
  384. if ($procurement->procurement_quotations_count>0 && $procurement->status==0) $procurement->status=1;
  385. if (empty($procurement->procurementDeliveries))continue;
  386. $procurement->deliver_amount=$procurement->procurementDeliveries->sum('amount');
  387. }
  388. $procurementStatus=Procurement::status;
  389. $procurementType=Procurement::type;
  390. $row = ['采购编号','项目','单据类型','采购公司','耗材编号','耗材','尺寸大小','特殊要求','材质规格','供应商','采购单价(元)','采购数量','销售单价(元)','送货数量','销售总价(元)','采购单状态','供应商联系方式','备注'];
  391. $list = [];
  392. foreach ($procurements as $procurement){
  393. $list[] = [
  394. $procurement->code,
  395. $procurement->ownerMaterial->owner ? $procurement->ownerMaterial->owner->name :'',
  396. is_null($procurement->type) ? '' :$procurementType[$procurement->type],
  397. $procurement->ownerMaterial->owner->customer ? $procurement->ownerMaterial->owner->customer->company_name :'',
  398. $procurement->ownerMaterial ? $procurement->ownerMaterial->material_code :'',
  399. $procurement->ownerMaterial->material ? $procurement->ownerMaterial->material->name :'',
  400. $procurement->ownerMaterial ? $procurement->ownerMaterial->size :'',
  401. $procurement->ownerMaterial ? $procurement->ownerMaterial->special :'',
  402. $procurement->ownerMaterial ? $procurement->ownerMaterial->specification :'',
  403. $procurement->supplier ? $procurement->supplier->name :'',
  404. $procurement->cost_price,
  405. $procurement->quantity,
  406. $procurement->unit_price,
  407. $procurement->deliver_amount ? $procurement->deliver_amount :'',//送货数量
  408. $procurement->unit_price*$procurement->amount,//销售总价=销售数量*销售单价
  409. is_null($procurement->status) ? '' :$procurementStatus[$procurement->status],
  410. $procurement->supplier ? $procurement->supplier->phone :'',
  411. $procurement->remark,
  412. ];
  413. }
  414. return Export::make($row,$list,"采购管理-采购报表记录");
  415. }
  416. //对账单报表导出
  417. public function checkBillExport(Request $request,ProcurementCheckSheetFilters $filters){
  418. $this->gate('采购管理-财务-对账单');
  419. /**@var SupplierService $supplierService*/
  420. $supplierService=app(SupplierService::class);
  421. $supplier_ids=$supplierService->screenSupplierIds();
  422. $procurementCheckSheets=ProcurementCheckSheet::query()
  423. ->filter($filters)
  424. ->with(['procurementDelivery.procurement.supplier','procurementDelivery.procurement.ownerMaterial.material','procurementDelivery.receiver'])
  425. ->whereHas('procurementDelivery',function($builder)use($supplier_ids){
  426. $builder->whereHas('procurement',function ($build)use($supplier_ids){
  427. $build->whereHas('supplier',function ($build)use($supplier_ids){
  428. $build->whereIn('id',$supplier_ids);
  429. });
  430. });
  431. })
  432. ->get();
  433. $procurementCheckSheetStatus=ProcurementCheckSheet::status;
  434. $row = ['采购编号','采购日期','送货日期','供应商名称','耗材编号','耗材','采购数量','送货数量','签收人','签收日期','应付金额','发票号','状态'];
  435. $list = [];
  436. foreach ($procurementCheckSheets as $procurementCheckSheet){
  437. $list[] = [
  438. $procurementCheckSheet->procurementDelivery->procurement ? $procurementCheckSheet->procurementDelivery->procurement->code : '',
  439. $procurementCheckSheet->procurementDelivery->procurement ? $procurementCheckSheet->procurementDelivery->procurement->created_at :'',
  440. $procurementCheckSheet->procurementDelivery ? $procurementCheckSheet->procurementDelivery->created_at :'',
  441. $procurementCheckSheet->procurementDelivery->procurement->supplier ? $procurementCheckSheet->procurementDelivery->procurement->supplier->name :'',
  442. $procurementCheckSheet->procurementDelivery->procurement->ownerMaterial ? $procurementCheckSheet->procurementDelivery->procurement->ownerMaterial->material_code :'',
  443. $procurementCheckSheet->procurementDelivery->procurement->ownerMaterial->material ? $procurementCheckSheet->procurementDelivery->procurement->ownerMaterial->material->name :'',
  444. $procurementCheckSheet->procurementDelivery->procurement ? $procurementCheckSheet->procurementDelivery->procurement->quantity :'',
  445. $procurementCheckSheet->procurementDelivery ? $procurementCheckSheet->procurementDelivery->amount :'',
  446. $procurementCheckSheet->procurementDelivery->receiver ? $procurementCheckSheet->procurementDelivery->receiver->name :'',
  447. $procurementCheckSheet->procurementDelivery ? $procurementCheckSheet->procurementDelivery->signed_at :'',
  448. $procurementCheckSheet->account_payable,
  449. $procurementCheckSheet->invoice_number,
  450. is_null($procurementCheckSheet->status) ? '' :$procurementCheckSheetStatus[$procurementCheckSheet->status],
  451. ];
  452. }
  453. return Export::make($row,$list,"采购管理-对账单报表记录");
  454. }
  455. //采购账单导出
  456. public function procurementBillExport(Request $request,ProcurementFilters $filters){
  457. $this->gate('采购管理-财务-采购账单');
  458. $owner_ids=app("OwnerService")->getIdArr();
  459. $procurements = Procurement::query()
  460. ->filter($filters)
  461. ->with(['supplier','initiator','ownerMaterial.material','ownerMaterial.owner'=>function($query)use($owner_ids){
  462. /** @var Builder $query */
  463. $query->with('customer')->whereIn('id',$owner_ids);
  464. },'procurementDeliveries'])
  465. ->whereHas('ownerMaterial',function($builder)use($owner_ids){
  466. $builder->whereHas('owner',function ($build)use($owner_ids){
  467. $build->whereIn('id',$owner_ids);
  468. });
  469. })
  470. ->where('type',0) //只取采购单
  471. ->get();
  472. foreach ($procurements as $procurement){
  473. if (empty($procurement->procurementDeliveries))continue;
  474. $procurement->receive_amount=$procurement->procurementDeliveries->sum('receipt_amount');
  475. $procurement->signed_at=$procurement->procurementDeliveries->first()['signed_at']??'';
  476. }
  477. $procurementStatus=Procurement::status;
  478. $row = ['采购编号','采购日期','接单日期','签收日期','项目名称','采购公司','供应商','耗材编号','耗材','尺寸大小','特殊要求',
  479. '材质规格','备注','采购数量','销售数量','收货数量','采购单价(元)','销售单价(元)','应收金额(元)','应付金额(元)','状态'];
  480. $list = [];
  481. foreach ($procurements as $procurement){
  482. $list[] = [
  483. $procurement->code,
  484. $procurement->created_at,
  485. $procurement->deadline ? $procurement->deadline : '',//接单日期
  486. $procurement->signed_at ? $procurement->signed_at : '',//签收日期
  487. $procurement->ownerMaterial->owner ? $procurement->ownerMaterial->owner->name :'',
  488. $procurement->ownerMaterial->owner->customer ? $procurement->ownerMaterial->owner->customer->company_name :'',
  489. $procurement->supplier ? $procurement->supplier->name :'',
  490. $procurement->ownerMaterial ? $procurement->ownerMaterial->material_code :'',
  491. $procurement->ownerMaterial->material ? $procurement->ownerMaterial->material->name :'',
  492. $procurement->ownerMaterial ? $procurement->ownerMaterial->size :'',
  493. $procurement->ownerMaterial ? $procurement->ownerMaterial->special :'',
  494. $procurement->ownerMaterial ? $procurement->ownerMaterial->specification :'',
  495. $procurement->remark,
  496. $procurement->quantity,
  497. $procurement->amount,
  498. $procurement->receive_amount ? $procurement->receive_amount : '',//收货数量
  499. $procurement->cost_price,
  500. $procurement->unit_price,
  501. $procurement->amount*$procurement->cost_price,//应收金额
  502. $procurement->quantity*$procurement->unit_price,//应付金额
  503. is_null($procurement->status) ? '' :$procurementStatus[$procurement->status],
  504. ];
  505. }
  506. return Export::make($row,$list,"采购账单报表记录");
  507. }
  508. //月账单报表导出
  509. public function procurementTotalBillExport(Request $request){
  510. $this->gate('采购管理-财务-月账单报表');
  511. /** @var ProcurementTotalBillService $procurementTotalBillService*/
  512. $procurementTotalBillService=app(ProcurementTotalBillService::class);
  513. if ($request->input('checkAllSign')){
  514. $params = $request->input();
  515. unset($params["checkAllSign"]);
  516. $procurementTotalBills=$procurementTotalBillService->get($params);
  517. }else{
  518. $procurementTotalBills=$procurementTotalBillService->get(["id"=>$request->data]);
  519. }
  520. $procurementTotalBillStatus=ProcurementTotalBill::status;
  521. $row = ['对账编号','账单日期','提交日期','供应商','总金额','状态'];
  522. $list = [];
  523. foreach ($procurementTotalBills as $procurementTotalBill){
  524. $list[] = [
  525. $procurementTotalBill->id,
  526. $procurementTotalBill->counting_month,
  527. $procurementTotalBill->created_at,
  528. $procurementTotalBill->supplier ? $procurementTotalBill->supplier :'',
  529. $procurementTotalBill->total_payable,
  530. $procurementTotalBill->status ? $procurementTotalBillStatus[$procurementTotalBill->status] :'',
  531. ];
  532. }
  533. return Export::make($row,$list,"采购管理-月账单报表记录");
  534. }
  535. }