ProcurementController.php 18 KB

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