ProcurementController.php 16 KB

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