ProcurementController.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  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 App\Services\SupplierService;
  13. use Carbon\Carbon;
  14. use Illuminate\Database\Eloquent\Builder;
  15. use Illuminate\Http\Request;
  16. use Illuminate\Support\Facades\Auth;
  17. use Illuminate\Support\Facades\DB;
  18. class ProcurementController extends Controller
  19. {
  20. use ApiProcurementResponse;
  21. public function getWaitQuotation(Request $request): \Illuminate\Http\JsonResponse
  22. {
  23. $user=Auth::user();
  24. /**@var SupplierService $supplierService*/
  25. $supplierService=app(SupplierService::class);
  26. $supplier_ids=$supplierService->screenSupplierIds();
  27. $status=$request->input('status');//0:待报价,2:待接单
  28. switch ($status){
  29. case 0:
  30. $procurements=Procurement::query()
  31. ->withCount('procurementQuotations')
  32. ->with('ownerMaterial.material')
  33. ->where('status',$status)
  34. ->whereHas("ownerMaterial",function (Builder $query)use($supplier_ids){
  35. $query->whereHas("material",function (Builder $query)use($supplier_ids){
  36. $query->whereHas("supplier",function (Builder $query)use($supplier_ids){
  37. $query->whereIn('id',$supplier_ids);
  38. });
  39. });
  40. })
  41. ->get();
  42. break;
  43. case 2:
  44. $procurements=Procurement::query()
  45. ->withCount('procurementQuotations')
  46. ->with('ownerMaterial.material')
  47. ->where('status',$status)
  48. ->whereIn('supplier_id',$supplier_ids)
  49. ->get();
  50. break;
  51. }
  52. if (!isset($procurements))return $this->error('未查到相应单据');
  53. foreach ($procurements as $key=>$procurement){
  54. if ($status==0 && $procurement->procurement_quotations_count>0 && !$user->isSuperAdmin()){
  55. foreach ($procurement->procurementQuotations as $procurementQuotation){
  56. if (in_array($procurementQuotation->supplier_id,$supplier_ids))unset($procurements[$key]);
  57. }
  58. }
  59. if ($procurement->type==2 && $procurement->supplier_id )unset($procurements[$key]);
  60. if (Carbon::parse($procurement->deadline)->gt(Carbon::now())) $procurement->deadline=Carbon::parse($procurement->deadline)->diffInMilliseconds();
  61. else $procurement->deadline=0;
  62. }
  63. if (!empty($procurements)) return $this->success($procurements);
  64. }
  65. public function getQuotationDetailById(Request $request): \Illuminate\Http\JsonResponse
  66. {
  67. $id=$request->input('id');
  68. $procurement=Procurement::query()
  69. ->with(['ownerMaterial.material','ownerMaterial.owner','ownerMaterial.file'])
  70. ->find($id);
  71. $procurement->deadline=Carbon::parse($procurement->deadline)->diffInMilliseconds(Carbon::now());
  72. if ($procurement) return $this->success($procurement);
  73. }
  74. //报价
  75. public function setOffer(Request $request): \Illuminate\Http\JsonResponse
  76. {
  77. $param=$request->all(['id','offer']);
  78. $user= Auth::user();
  79. $procurement=Procurement::query()->with('ownerMaterial.material')->find($param['id']);
  80. $material=$procurement->ownerMaterial->material;
  81. /** @var ProcurementService $procurementService*/
  82. $procurementService=app(ProcurementService::class);
  83. $supplier=$procurementService->screenSupplier($user,$material);
  84. $procurementQuotation=ProcurementQuotation::query()->create([
  85. 'procurement_id'=>$param['id'],
  86. 'offer'=>$param['offer'],
  87. 'operator'=>$user->id,
  88. 'supplier_id'=>$supplier->id,
  89. 'quoted_at'=>Carbon::now()->toDateTimeString(),
  90. 'status'=>1,//1:已报价
  91. ]);
  92. DB::transaction(function ()use($procurement,$param,$supplier){
  93. if (!$procurement->supplier_id)$procurement->update([
  94. "supplier_id" => $supplier->id,
  95. // "status" =>1,
  96. "cost_price" =>$param['offer'],
  97. ]);
  98. DB::commit();
  99. });
  100. if ($procurementQuotation) return $this->success($procurementQuotation);
  101. }
  102. //接单
  103. public function accept(Request $request): \Illuminate\Http\JsonResponse
  104. {
  105. $id=$request->input('id');
  106. $user= Auth::user();
  107. $procurement=Procurement::query()->with('ownerMaterial.material')->find($id);
  108. if ($procurement->type==2){
  109. $material=$procurement->ownerMaterial->material;
  110. /** @var ProcurementService $procurementService*/
  111. $procurementService=app(ProcurementService::class);
  112. $supplier=$procurementService->screenSupplier($user,$material);
  113. $procurement->update(['status'=>4,'supplier_id'=>$supplier->id,'deadline'=>Carbon::now()->toDateTimeString()]);//4:生产中
  114. }else{
  115. $procurement->update(['status'=>4,'deadline'=>Carbon::now()->toDateTimeString()]);//4:生产中
  116. }
  117. if ($procurement) return $this->success($procurement);
  118. }
  119. //生产中的订单
  120. public function getProductionProcurement(): \Illuminate\Http\JsonResponse
  121. {
  122. /**@var SupplierService $supplierService*/
  123. $supplierService=app(SupplierService::class);
  124. $supplier_ids=$supplierService->screenSupplierIds();
  125. $procurements=Procurement::query()
  126. ->with('ownerMaterial.material')
  127. ->whereIn('type',[0,2])
  128. ->where('status',4) //4:生产中
  129. ->whereIn('supplier_id',$supplier_ids)
  130. ->get();
  131. if ($procurements) return $this->success($procurements);
  132. }
  133. //结束生产
  134. public function finishProductionProcurement(Request $request): \Illuminate\Http\JsonResponse
  135. {
  136. $id=$request->input('id');
  137. $procurement=Procurement::query()->find($id)->update(['status'=>5]);// 5 => "待收货",
  138. if ($procurement) return $this->success($procurement);
  139. }
  140. //取消生产
  141. public function cancelProcurement(Request $request): \Illuminate\Http\JsonResponse
  142. {
  143. $id=$request->input('id');
  144. $procurement=Procurement::query()->find($id)->update(['status'=>10]);// 10 => "订单取消",
  145. if ($procurement) return $this->success($procurement);
  146. }
  147. public function getProcurementDeliveries(): \Illuminate\Http\JsonResponse
  148. {
  149. /**@var SupplierService $supplierService*/
  150. $supplierService=app(SupplierService::class);
  151. $supplier_ids=$supplierService->screenSupplierIds();
  152. $procurementDeliveries=ProcurementDeliverie::query()
  153. ->with('procurement.ownerMaterial.material')
  154. ->whereIn('status',[0,1])//1:待送货,2:送货中
  155. ->whereHas('procurement',function (Builder $query)use($supplier_ids){
  156. $query->whereIn('supplier_id',$supplier_ids);
  157. })
  158. ->get();
  159. $procurementDeliveries=$procurementDeliveries->filter(function ($item){
  160. return isset($item->procurement);
  161. });
  162. if ($procurementDeliveries) return $this->success($procurementDeliveries);
  163. }
  164. public function makeProcurementDelivery(Request $request): \Illuminate\Http\JsonResponse
  165. {
  166. $param=$request->all(['id','deliverAmount']);
  167. $procurement=Procurement::query()
  168. ->with('procurementDeliveries')
  169. ->find($param['id']);
  170. $deliveryAmount=$param['deliverAmount'];
  171. if (!empty($procurement->procurementDeliveries)){
  172. foreach ($procurement->procurementDeliveries as $delivery){
  173. if (!$delivery->amount)continue;
  174. $deliveryAmount=$deliveryAmount+$delivery->amount;
  175. }
  176. }
  177. if ((int)$deliveryAmount>(int)$procurement->quantity) return response()->json(['status'=>0,'message' => '当前送货数量叠加已送货数量大于采购数量','data'=>$deliveryAmount], 401);
  178. //生成送货单
  179. $procurementDelivery=new ProcurementDeliverie();
  180. $procurementDelivery['procurement_id']=$param['id'];
  181. $procurementDelivery['amount']=$param['deliverAmount'];
  182. $procurementDelivery['initiator']=Auth::user()['id'];
  183. $procurementDelivery['signer']=$procurement->initiator ?? 0;
  184. $procurementDelivery['created_at']=Carbon::now()->toDateTimeString();
  185. $procurementDelivery['updated_at']=Carbon::now()->toDateTimeString();
  186. $procurementDelivery->save();
  187. $procurementDelivery->loadMissing( 'procurement.ownerMaterial.material');
  188. //当前采购单不是打样单生成对账单
  189. if ($procurement->type!=2)ProcurementCheckSheet::query()->create(['procurement_delivery_id'=>$procurementDelivery->id,'account_payable'=>$procurementDelivery->receipt_amount*$procurement->cost_price,'auditor'=>0]);
  190. if ($procurementDelivery) return $this->success($procurementDelivery);
  191. }
  192. public function getProcurementDeliveryById(Request $request): \Illuminate\Http\JsonResponse
  193. {
  194. $procurementDelivery=ProcurementDeliverie::query()
  195. ->with(['procurement.ownerMaterial.material','receiver.userDetail','procurement.ownerMaterial.owner.customer','procurement.supplier','procurement.ownerMaterial.file'])
  196. ->find($request->input('id'));
  197. if ($procurementDelivery) return $this->success($procurementDelivery);
  198. }
  199. public function updateProcurementDeliveryAmount(Request $request): \Illuminate\Http\JsonResponse
  200. {
  201. $param=$request->all(['id','delivernum']);
  202. $procurementDelivery=ProcurementDeliverie::query()->where('id',$param['id'])->update(['amount'=>$param['delivernum']]);
  203. if ($procurementDelivery)return $this->success($procurementDelivery);
  204. }
  205. public function getProcurementTotalBill(): \Illuminate\Http\JsonResponse
  206. {
  207. $procurementTotalBills=ProcurementTotalBill::query()
  208. ->orderByDesc('id')
  209. ->get();
  210. foreach ($procurementTotalBills as $procurementTotalBill){
  211. /** @var ProcurementTotalBill $procurementTotalBill */
  212. $procurementTotalBill->setCurrentMothProcurements();
  213. }
  214. if ($procurementTotalBills) return $this->success($procurementTotalBills);
  215. }
  216. public function markProcurementTotalBillStatus(Request $request): \Illuminate\Http\JsonResponse//供应商提交对账单
  217. {
  218. $id=$request->input('id');
  219. $procurementTotalBill=ProcurementTotalBill::query()->find($id)->update(['status'=>1]);//1:已出账
  220. /** @var ProcurementTotalBill $procurementTotalBill */
  221. $procurementTotalBill->setCurrentMothProcurements();
  222. if (isset($procurementTotalBill->procurementCheckSheets)){
  223. $procurementCheckSheets=$procurementTotalBill->procurementCheckSheets;
  224. foreach ($procurementCheckSheets as $procurementCheckSheet){
  225. $procurementCheckSheet->update(['status'=>2]);//2 已出账
  226. }
  227. }
  228. return $this->success($procurementTotalBill);
  229. }
  230. //收货员确认收货
  231. public function makeReceipt(Request $request): \Illuminate\Http\JsonResponse
  232. {
  233. $param=$request->all(['id','delivernum']);
  234. $procurementDelivery=ProcurementDeliverie::query()->with('procurement')->find($param['id']);
  235. if ($param['delivernum']!=0) {
  236. $receipt_amount=$param['delivernum'];
  237. }else{
  238. $receipt_amount=$procurementDelivery['amount'];
  239. }
  240. $procurementDelivery ->update([
  241. 'status'=>1,
  242. 'receipt_amount'=>$receipt_amount,
  243. 'created_at'=>Carbon::now()->toDateTimeString(),
  244. 'signed_at'=>Carbon::now()->toDateString()]
  245. );
  246. $procurementDelivery->procurement->update(['status'=>6]);
  247. if ($procurementDelivery) return $this->success($procurementDelivery);
  248. }
  249. public function supplierDeliverConfirm(Request $request): \Illuminate\Http\JsonResponse
  250. {
  251. $procurementDelivery=ProcurementDeliverie::query()
  252. ->with(['procurement','procurementCheckSheet'])->find($request->input('id'));
  253. $procurementDelivery->update(['status'=>2]);//2:送货完成
  254. $procurementCheckSheet=$procurementDelivery->procurementCheckSheet;
  255. if ($procurementDelivery->procurement
  256. && $procurementDelivery->procurement->type!=2
  257. && $procurementCheckSheet)
  258. $procurementCheckSheet->update(['status'=>1,'account_payable'=>($procurementDelivery->receipt_amount*$procurementDelivery->procurement->cost_price)]);
  259. $procurementDelivery->procurement->update(['status'=>7]);//待出账
  260. if ($procurementDelivery) return $this->success($procurementDelivery);
  261. }
  262. }