ProcurementController.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <?php
  2. namespace App\Http\Controllers\api\procurement\wechat;
  3. use App\Http\Controllers\Controller;
  4. use App\Procurement;
  5. use App\ProcurementCheckSheet;
  6. use App\ProcurementDeliverie;
  7. use App\ProcurementQuotation;
  8. use App\ProcurementTotalBill;
  9. use App\Services\api\UserService;
  10. use App\Services\ProcurementService;
  11. use Carbon\Carbon;
  12. use Illuminate\Http\Request;
  13. use Illuminate\Support\Facades\Auth;
  14. class ProcurementController extends Controller
  15. {
  16. public function getWaitQuotation(Request $request)
  17. {
  18. $status=$request->input('status');//0:待报价,2:待接单
  19. $procurements=Procurement::query()
  20. ->withCount('procurementQuotations')
  21. ->with('ownerMaterial.material')
  22. ->where('status',$status)
  23. ->get();
  24. $keys = [];
  25. foreach ($procurements as $key=>$procurement){
  26. if ($procurement->procurement_quotations_count>0 && $status==0 )$keys[]= $key;
  27. if ($procurement->type==2 && $procurement->supplier_id )$keys[]= $key;
  28. if($status==0)$procurement->deadline=Carbon::parse($procurement->deadline)->diffInMilliseconds(Carbon::now()); //待报价倒计时4小时
  29. if($status==2)$procurement->deadline=Carbon::parse($procurement->deadline)->subHours(-24)->diffInMilliseconds(Carbon::now()); //待接单倒计时24小时
  30. }
  31. $procurements = $procurements->diffKeys($keys);
  32. if (!empty($procurements))return response()->json(['status'=>1,'data'=>$procurements], 200);
  33. }
  34. public function getQuotationDetailById(Request $request)
  35. {
  36. $id=$request->input('id');
  37. $procurement=Procurement::query()
  38. ->with(['ownerMaterial.material','ownerMaterial.owner','ownerMaterial.file'])
  39. ->find($id);
  40. $procurement->deadline=Carbon::parse($procurement->deadline)->diffInMilliseconds(Carbon::now());
  41. if ($procurement) return response()->json(['status'=>1,'data'=>$procurement], 200);
  42. }
  43. //报价
  44. public function setOffer(Request $request)
  45. {
  46. $param=$request->all(['id','offer']);
  47. $user= Auth::user();
  48. $procurement=Procurement::query()->with('ownerMaterial.material')->find($param['id']);
  49. $material=$procurement->ownerMaterial->material;
  50. /** @var ProcurementService $procurementService*/
  51. $procurementService=app(ProcurementService::class);
  52. $supplier=$procurementService->screenSupplier($user,$material);
  53. $procurementQuotation=ProcurementQuotation::query()->create([
  54. 'procurement_id'=>$param['id'],
  55. 'offer'=>$param['offer'],
  56. 'operator'=>$user->id,
  57. 'supplier_id'=>$supplier->id,
  58. 'quoted_at'=>Carbon::now()->toDateTimeString(),
  59. 'status'=>1,//2:已报价
  60. ]);
  61. $procurement->update(['status'=>1]);//1:已报价
  62. if ($procurementQuotation) return response()->json(['status'=>1,'data'=>$procurementQuotation], 200);
  63. }
  64. //接单
  65. public function accept(Request $request)
  66. {
  67. $id=$request->input('id');
  68. $user= Auth::user();
  69. $procurement=Procurement::query()->with('ownerMaterial.material')->find($id);
  70. if ($procurement->type==2){
  71. $material=$procurement->ownerMaterial->material;
  72. /** @var ProcurementService $procurementService*/
  73. $procurementService=app(ProcurementService::class);
  74. $supplier=$procurementService->screenSupplier($user,$material);
  75. $procurement->update(['status'=>4,'supplier_id'=>$supplier->id,'deadline'=>Carbon::now()->toDateTimeString()]);//4:生产中
  76. }else{
  77. $procurement->update(['status'=>4,'deadline'=>Carbon::now()->toDateTimeString()]);//4:生产中
  78. }
  79. if ($procurement) return response()->json(['status'=>1,'data'=>$procurement], 200);
  80. }
  81. //生产中的订单
  82. public function getProductionProcurement()
  83. {
  84. $procurements=Procurement::query()
  85. ->with('ownerMaterial.material')
  86. ->whereIn('type',[0,2])
  87. ->where('status',4) //4:生产中
  88. ->get();
  89. if ($procurements) return response()->json(['status'=>1,'data'=>$procurements], 200);
  90. }
  91. //结束生产
  92. public function finishProductionProcurement(Request $request)
  93. {
  94. $id=$request->input('id');
  95. $procurement=Procurement::query()->find($id)->update(['status'=>5]);
  96. if ($procurement) return response()->json(['status'=>1,'data'=>$procurement], 200);
  97. }
  98. public function getProcurementDeliveries()
  99. {
  100. $procurementDeliveries=ProcurementDeliverie::query()
  101. ->with('procurement.ownerMaterial.material')
  102. ->whereIn('status',[0,1])//1:待送货,2:送货中
  103. ->get();
  104. if ($procurementDeliveries) return response()->json(['status'=>1,'data'=>$procurementDeliveries], 200);
  105. }
  106. public function makeProcurementDelivery(Request $request)
  107. {
  108. $param=$request->all(['id','deliverAmount']);
  109. $procurement=Procurement::query()
  110. ->with('procurementDeliveries')
  111. ->find($param['id']);
  112. $deliveryAmount=$param['deliverAmount'];
  113. if (!empty($procurement->procurementDeliveries)){
  114. foreach ($procurement->procurementDeliveries as $delivery){
  115. if (!$delivery->amount)continue;
  116. $deliveryAmount=$deliveryAmount+$delivery->amount;
  117. }
  118. }
  119. if ((int)$deliveryAmount>(int)$procurement->quantity) return response()->json(['status'=>0,'message' => '当前送货数量叠加已送货数量大于采购数量','data'=>$deliveryAmount], 401);
  120. /** @var $apiUserService UserService */
  121. $apiUserService=app(UserService::class);
  122. $user= $apiUserService->getUser($request->header('token'));
  123. //生成送货单
  124. $procurementDelivery=new ProcurementDeliverie();
  125. $procurementDelivery['procurement_id']=$param['id'];
  126. $procurementDelivery['amount']=$param['deliverAmount'];
  127. $procurementDelivery['initiator']=$user->data->id;
  128. $procurementDelivery['signer']=$procurement->initiator ?? 0;
  129. $procurementDelivery['created_at']=Carbon::now()->toDateTimeString();
  130. $procurementDelivery['updated_at']=Carbon::now()->toDateTimeString();
  131. $procurementDelivery->save();
  132. $procurementDelivery->loadMissing( 'procurement.ownerMaterial.material');
  133. //当前采购单不是打样单生成对账单
  134. if ($procurement->type!=2)ProcurementCheckSheet::query()->create(['procurement_delivery_id'=>$procurementDelivery->id,'account_payable'=>$procurementDelivery->receipt_amount*$procurement->cost_price,'auditor'=>0]);
  135. if ($procurementDelivery) return response()->json(['status'=>1,'data'=>$procurementDelivery], 200);
  136. }
  137. public function getProcurementDeliveryById(Request $request)
  138. {
  139. $procurementDelivery=ProcurementDeliverie::query()
  140. ->with(['procurement.ownerMaterial.material','receiver.userDetail','procurement.ownerMaterial.owner.customer','procurement.supplier','procurement.ownerMaterial.file'])
  141. ->find($request->input('id'));
  142. if ($procurementDelivery) return response()->json(['status'=>1,'data'=>$procurementDelivery], 200);
  143. }
  144. public function updateProcurementDeliveryAmount(Request $request)
  145. {
  146. $param=$request->all(['id','delivernum']);
  147. $procurementDelivery=ProcurementDeliverie::query()->where('id',$param['id'])->update(['amount'=>$param['delivernum']]);
  148. if ($procurementDelivery)return response()->json(['status'=>1,'data'=>$procurementDelivery], 200);
  149. }
  150. public function getProcurementTotalBill()
  151. {
  152. $procurementTotalBills=ProcurementTotalBill::query()
  153. ->get();
  154. foreach ($procurementTotalBills as $procurementTotalBill){
  155. /** @var ProcurementTotalBill $procurementTotalBill */
  156. $procurementTotalBill->setCurrentMothProcurements();
  157. }
  158. if ($procurementTotalBills) return response()->json(['status'=>1,'data'=>$procurementTotalBills], 200);
  159. }
  160. public function markProcurementTotalBillStatus(Request $request)//供应商提交对账单
  161. {
  162. $id=$request->input('id');
  163. $procurementTotalBill=ProcurementTotalBill::query()->find($id)->update(['status'=>1]);//1:已出账
  164. return response()->json(['status'=>1,'data'=>$procurementTotalBill], 200);
  165. }
  166. //收货员确认收货
  167. public function makeReceipt(Request $request)
  168. {
  169. $param=$request->all(['id','delivernum']);
  170. $procurementDelivery=ProcurementDeliverie::query()->with('procurement')->find($param['id']);
  171. $procurementDelivery ->update(['status'=>1,'receipt_amount'=>$param['delivernum'],'created_at'=>Carbon::now()->toDateTimeString(),'signed_at'=>Carbon::now()->toDateString()]);
  172. $procurementDelivery->procurement->update(['status'=>6]);
  173. if ($procurementDelivery) return response()->json(['status'=>1,'data'=>$procurementDelivery], 200);
  174. }
  175. public function supplierDeliverConfirm(Request $request)
  176. {
  177. $procurementDelivery=ProcurementDeliverie::query()
  178. ->with(['procurement','procurementCheckSheet'])->find($request->input('id'));
  179. $procurementDelivery->update(['status'=>2]);//2:送货完成
  180. $procurementCheckSheet=$procurementDelivery->procurementCheckSheet;
  181. if ($procurementDelivery->procurement
  182. && $procurementDelivery->procurement->type!=2
  183. && $procurementCheckSheet)
  184. $procurementCheckSheet->update(['status'=>1,'account_payable'=>($procurementDelivery->receipt_amount*$procurementDelivery->procurement->cost_price)]);
  185. $procurementDelivery->procurement->update(['status'=>7]);//待出账
  186. if ($procurementDelivery) return response()->json(['status'=>1,'data'=>$procurementDelivery], 200);
  187. }
  188. }