ProcurementController.php 28 KB

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