input('status');//0:待报价,2:待接单 $procurements=Procurement::query() ->withCount('procurementQuotations') ->with('ownerMaterial.material') ->where('status',$status) ->get(); $keys = []; foreach ($procurements as $key=>$procurement){ if ($procurement->procurement_quotations_count>0 && $status==0 )$keys[]= $key; if ($procurement->type==2 && $procurement->supplier_id )$keys[]= $key; if (Carbon::parse($procurement->deadline)->gt(Carbon::now())) $procurement->deadline=Carbon::parse($procurement->deadline)->diffInMilliseconds(); else $procurement->deadline=0; } $procurements = $procurements->diffKeys($keys); if (!empty($procurements)) return $this->success($procurements); } public function getQuotationDetailById(Request $request): \Illuminate\Http\JsonResponse { $id=$request->input('id'); $procurement=Procurement::query() ->with(['ownerMaterial.material','ownerMaterial.owner','ownerMaterial.file']) ->find($id); $procurement->deadline=Carbon::parse($procurement->deadline)->diffInMilliseconds(Carbon::now()); if ($procurement) return $this->success($procurement); } //报价 public function setOffer(Request $request): \Illuminate\Http\JsonResponse { $param=$request->all(['id','offer']); $user= Auth::user(); $procurement=Procurement::query()->with('ownerMaterial.material')->find($param['id']); $material=$procurement->ownerMaterial->material; /** @var ProcurementService $procurementService*/ $procurementService=app(ProcurementService::class); $supplier=$procurementService->screenSupplier($user,$material); $procurementQuotation=ProcurementQuotation::query()->create([ 'procurement_id'=>$param['id'], 'offer'=>$param['offer'], 'operator'=>$user->id, 'supplier_id'=>$supplier->id, 'quoted_at'=>Carbon::now()->toDateTimeString(), 'status'=>1,//2:已报价 ]); DB::transaction(function ()use($procurement,$param,$supplier){ if (!$procurement->supplier_id)$procurement->update([ "supplier_id" => $supplier->id, "status" =>1, "cost_price" =>$param['offer'], ]); DB::commit(); }); // $procurement->update(['status'=>1]);//1:已报价 if ($procurementQuotation) return $this->success($procurementQuotation); } //接单 public function accept(Request $request): \Illuminate\Http\JsonResponse { $id=$request->input('id'); $user= Auth::user(); $procurement=Procurement::query()->with('ownerMaterial.material')->find($id); if ($procurement->type==2){ $material=$procurement->ownerMaterial->material; /** @var ProcurementService $procurementService*/ $procurementService=app(ProcurementService::class); $supplier=$procurementService->screenSupplier($user,$material); $procurement->update(['status'=>4,'supplier_id'=>$supplier->id,'deadline'=>Carbon::now()->toDateTimeString()]);//4:生产中 }else{ $procurement->update(['status'=>4,'deadline'=>Carbon::now()->toDateTimeString()]);//4:生产中 } if ($procurement) return $this->success($procurement); } //生产中的订单 public function getProductionProcurement(): \Illuminate\Http\JsonResponse { $procurements=Procurement::query() ->with('ownerMaterial.material') ->whereIn('type',[0,2]) ->where('status',4) //4:生产中 ->get(); if ($procurements) return $this->success($procurements); } //结束生产 public function finishProductionProcurement(Request $request): \Illuminate\Http\JsonResponse { $id=$request->input('id'); $procurement=Procurement::query()->find($id)->update(['status'=>5]); if ($procurement) return $this->success($procurement); } public function getProcurementDeliveries(): \Illuminate\Http\JsonResponse { $procurementDeliveries=ProcurementDeliverie::query() ->with('procurement.ownerMaterial.material') ->whereIn('status',[0,1])//1:待送货,2:送货中 ->get(); if ($procurementDeliveries) return $this->success($procurementDeliveries); } public function makeProcurementDelivery(Request $request): \Illuminate\Http\JsonResponse { $param=$request->all(['id','deliverAmount']); $procurement=Procurement::query() ->with('procurementDeliveries') ->find($param['id']); $deliveryAmount=$param['deliverAmount']; if (!empty($procurement->procurementDeliveries)){ foreach ($procurement->procurementDeliveries as $delivery){ if (!$delivery->amount)continue; $deliveryAmount=$deliveryAmount+$delivery->amount; } } if ((int)$deliveryAmount>(int)$procurement->quantity) return response()->json(['status'=>0,'message' => '当前送货数量叠加已送货数量大于采购数量','data'=>$deliveryAmount], 401); /** @var $apiUserService UserService */ $apiUserService=app(UserService::class); $user= $apiUserService->getUser($request->header('token')); //生成送货单 $procurementDelivery=new ProcurementDeliverie(); $procurementDelivery['procurement_id']=$param['id']; $procurementDelivery['amount']=$param['deliverAmount']; $procurementDelivery['initiator']=$user->data->id; $procurementDelivery['signer']=$procurement->initiator ?? 0; $procurementDelivery['created_at']=Carbon::now()->toDateTimeString(); $procurementDelivery['updated_at']=Carbon::now()->toDateTimeString(); $procurementDelivery->save(); $procurementDelivery->loadMissing( 'procurement.ownerMaterial.material'); //当前采购单不是打样单生成对账单 if ($procurement->type!=2)ProcurementCheckSheet::query()->create(['procurement_delivery_id'=>$procurementDelivery->id,'account_payable'=>$procurementDelivery->receipt_amount*$procurement->cost_price,'auditor'=>0]); if ($procurementDelivery) return $this->success($procurementDelivery); } public function getProcurementDeliveryById(Request $request): \Illuminate\Http\JsonResponse { $procurementDelivery=ProcurementDeliverie::query() ->with(['procurement.ownerMaterial.material','receiver.userDetail','procurement.ownerMaterial.owner.customer','procurement.supplier','procurement.ownerMaterial.file']) ->find($request->input('id')); if ($procurementDelivery) return $this->success($procurementDelivery); } public function updateProcurementDeliveryAmount(Request $request): \Illuminate\Http\JsonResponse { $param=$request->all(['id','delivernum']); $procurementDelivery=ProcurementDeliverie::query()->where('id',$param['id'])->update(['amount'=>$param['delivernum']]); if ($procurementDelivery)return $this->success($procurementDelivery); } public function getProcurementTotalBill(): \Illuminate\Http\JsonResponse { $procurementTotalBills=ProcurementTotalBill::query() ->get(); foreach ($procurementTotalBills as $procurementTotalBill){ /** @var ProcurementTotalBill $procurementTotalBill */ $procurementTotalBill->setCurrentMothProcurements(); } if ($procurementTotalBills) return $this->success($procurementTotalBills); } public function markProcurementTotalBillStatus(Request $request): \Illuminate\Http\JsonResponse//供应商提交对账单 { $id=$request->input('id'); $procurementTotalBill=ProcurementTotalBill::query()->find($id)->update(['status'=>1]);//1:已出账 return $this->success($procurementTotalBill); } //收货员确认收货 public function makeReceipt(Request $request): \Illuminate\Http\JsonResponse { $param=$request->all(['id','delivernum']); $procurementDelivery=ProcurementDeliverie::query()->with('procurement')->find($param['id']); $procurementDelivery ->update(['status'=>1,'receipt_amount'=>$param['delivernum'],'created_at'=>Carbon::now()->toDateTimeString(),'signed_at'=>Carbon::now()->toDateString()]); $procurementDelivery->procurement->update(['status'=>6]); if ($procurementDelivery) return $this->success($procurementDelivery); } public function supplierDeliverConfirm(Request $request): \Illuminate\Http\JsonResponse { $procurementDelivery=ProcurementDeliverie::query() ->with(['procurement','procurementCheckSheet'])->find($request->input('id')); $procurementDelivery->update(['status'=>2]);//2:送货完成 $procurementCheckSheet=$procurementDelivery->procurementCheckSheet; if ($procurementDelivery->procurement && $procurementDelivery->procurement->type!=2 && $procurementCheckSheet) $procurementCheckSheet->update(['status'=>1,'account_payable'=>($procurementDelivery->receipt_amount*$procurementDelivery->procurement->cost_price)]); $procurementDelivery->procurement->update(['status'=>7]);//待出账 if ($procurementDelivery) return $this->success($procurementDelivery); } }