ProcurementController.php 10 KB

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