ProcessController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. <?php
  2. namespace App\Http\Controllers\Api\thirdPart\flux;
  3. use App\Commodity;
  4. use App\OracleBasCode;
  5. use App\OracleBasSKU;
  6. use App\OracleDOCASNDetail;
  7. use App\OracleDOCMovementDetail;
  8. use App\OracleDOCMovementHeader;
  9. use App\OracleDOCOrderDetail;
  10. use App\Http\Controllers\Controller;
  11. use App\Owner;
  12. use App\ProcessesContent;
  13. use Carbon\Carbon;
  14. use Illuminate\Http\Request;
  15. use Illuminate\Support\Facades\Auth;
  16. use Illuminate\Support\Facades\DB;
  17. class ProcessController extends Controller
  18. {
  19. public function getProcessContent(Request $request){
  20. $wms_code=$request->input('wms_code');
  21. if (!$wms_code)return ['error'=>'提交的单据号为空'];
  22. try{
  23. $basCodes = OracleBasCode::query()->select('code','codename_c')
  24. ->whereIn('codename_c',['部分收货','订单创建'])->where('codeid','ASN_STS')->get();
  25. $basCodeMap = [];
  26. foreach ($basCodes as $basCode){
  27. $basCodeMap[$basCode->code] = $basCode->codename_c;
  28. }
  29. $docASNs=OracleDOCASNDetail::query()->where("ASNNo",$wms_code)->get(); //入库单
  30. }
  31. catch (\Exception $e){
  32. return ['error'=>'数据库连接失败'];
  33. }
  34. if (count($docASNs)>0){
  35. $owner=Owner::query()->where("code",$docASNs[0]->customerid)->first();
  36. if (!$owner)$owner=$this->storeOwner($docASNs[0]->customerid);
  37. if (!$owner)return ['error'=>'找到了入库单,但未查询到货主代码!'];
  38. $docASNs[0]->load('oracleDocAsnHeader');
  39. $asnstatus = $basCodeMap[$docASNs[0]['oracleDocAsnHeader'] ? $docASNs[0]['oracleDocAsnHeader']['asnstatus'] : null] ?? null;
  40. $commodities=$this->resetData($docASNs,"sku","customerid","receivedqty","asnlineno");
  41. $commodities = $this->resetCommodityAmount($wms_code,$request->is_finished_product,$commodities);
  42. $processContent=[
  43. 'wms_code'=>$wms_code,
  44. 'owner_name'=>$owner->name,
  45. 'owner_id'=>$owner->id,
  46. 'commodities'=>$commodities,
  47. 'bill_type'=>'入库单',
  48. 'asnstatus' => $asnstatus,
  49. ];
  50. return json_encode($processContent);
  51. }
  52. $docOrders=OracleDOCOrderDetail::query()->where("OrderNo",$wms_code)->get();//出库单
  53. if (count($docOrders)>0){
  54. $owners=Owner::query()->where("code",$docOrders[0]->customerid)->get();
  55. if ($owners->isEmpty()){
  56. $owner=$this->storeOwner($docOrders[0]->customerid);
  57. }else{
  58. $owner=$owners->first();
  59. }
  60. if (!$owner)return ['error'=>'找到了入库单,但未查询到货主代码!'];
  61. $commodities=$this->resetData($docOrders,"sku","customerid","qtyshipped",'orderlineno');
  62. $commodities = $this->resetCommodityAmount($wms_code,$request->is_finished_product,$commodities);
  63. $processContent=[
  64. 'wms_code'=>$wms_code,
  65. 'owner_name'=>$owner->name,
  66. 'owner_id'=>$owner->id,
  67. 'commodities'=>$commodities,
  68. 'bill_type'=>'出库单',
  69. ];
  70. return json_encode($processContent);
  71. }
  72. $docMovementDetails=OracleDOCMovementDetail::query()->where("MDOCNO",$wms_code)->get();//移库单
  73. if (count($docMovementDetails)>0){
  74. $docMovementHeaders=OracleDOCMovementHeader::query()->select('customerid')->where('MDOCNO',$wms_code)->get();
  75. if (count($docMovementHeaders)<1)return ['error'=>'找到了移库单,但未查询移库单表头!'];
  76. $owner=Owner::query()->where("code",$docMovementHeaders[0]->customerid)->first();
  77. if (!$owner)$owner=$this->storeOwner($docMovementHeaders[0]->customerid);
  78. if (!$owner)return ['error'=>'找到了入库单,但未查询到货主代码!'];
  79. $commodities=$this->resetData($docMovementDetails,"sku","customerid","toqty","mdoclineno",$docMovementHeaders);
  80. $processContent=[
  81. 'wms_code'=>$wms_code,
  82. 'owner_name'=>$owner->name,
  83. 'owner_id'=>$owner->id,
  84. 'commodities'=>$commodities,
  85. 'bill_type'=>'移库单',
  86. ];
  87. return json_encode($processContent);
  88. }
  89. return ['error'=>'未查到对应单据号'];
  90. }
  91. //重组商品数据
  92. private function resetData($doc,$skuColumn,$customeridColumn,$amountColumn,$lineNoColumn,$docHeader=null){
  93. //处理重组数据
  94. $docs=['owner_code'=>[],'sku'=>[]];
  95. $commodities=[];
  96. $commodity_ids=[];
  97. $i=0;
  98. $docSKUs=array_column($doc->toArray(),'sku');
  99. $docOwnerCodes=array_column($docHeader?$docHeader->toArray():$doc->toArray(),'customerid');
  100. $commoditiesTem=Commodity::with(['barcodes','owner'=>function($query)use($docOwnerCodes){
  101. return $query->whereIn('code',$docOwnerCodes);
  102. }])->whereIn('sku',$docSKUs)->get();
  103. $commoditiesData=[];
  104. foreach ($commoditiesTem as $commodityTem){
  105. $commoditiesData[$commodityTem->sku."_".$commodityTem->owner_code]=$commodityTem;
  106. }
  107. foreach ($doc as $docOne){
  108. $customerid=$docHeader?$docHeader[0][$customeridColumn]:$docOne[$customeridColumn];
  109. $commodity=isset($commoditiesData[$docOne[$skuColumn]."_".$customerid])
  110. ?$commoditiesData[$docOne[$skuColumn]."_".$customerid]:null;
  111. if (!$commodity){
  112. array_push($docs['owner_code'],$docHeader?$docHeader[0][$customeridColumn]:$docOne[$customeridColumn]);
  113. array_push($docs['sku'],$docOne[$skuColumn]);
  114. $i++;
  115. continue;
  116. }
  117. $commodity->amount=$docOne[$amountColumn];
  118. $commodity->lineNo=$docOne[$lineNoColumn];
  119. if (isset($commodity_ids[$commodity->id]))
  120. $commodities[$commodity_ids[$commodity->id]]['amount'] += $commodity->amount;
  121. else{
  122. array_push($commodities,$commodity->toArray());
  123. $commodity_ids[$commodity->id] = count($commodities)-1;
  124. }
  125. unset($doc[$i]);
  126. $i++;
  127. }
  128. unset($docSKUs,$docOwnerCodes,$commoditiesTem,$commoditiesData,$customerid);
  129. if (count($docs['sku'])>0 && count($docs['owner_code'])>0){
  130. $this->storeCommodity($docs);
  131. $docSKUs=array_column($doc->toArray(),'sku');
  132. $docOwnerCodes=array_column($docHeader?$docHeader->toArray():$doc->toArray(),'customerid');
  133. $commoditiesTem=Commodity::with(['barcodes','owner'=>function($query)use($docOwnerCodes){
  134. return $query->whereIn('code',$docOwnerCodes);
  135. }])->whereIn('sku',$docSKUs)->get();
  136. $commoditiesData=[];
  137. foreach ($commoditiesTem as $commodityTem){
  138. $commoditiesData[$commodityTem->sku."_".$commodityTem->owner_code]=$commodityTem;
  139. }
  140. foreach ($doc as $docOne){
  141. $customerid=$docHeader?$docHeader[0][$customeridColumn]:$docOne[$customeridColumn];
  142. $commodity=isset($commoditiesData[$docOne[$skuColumn]."_".$customerid])
  143. ?$commoditiesData[$docOne[$skuColumn]."_".$customerid]:null;
  144. if (!$commodity)continue;
  145. $commodity->amount=$docOne[$amountColumn];
  146. $commodity->lineNo=$docOne[$lineNoColumn];
  147. if (isset($commodity_ids[$commodity->id]))
  148. $commodities[$commodity_ids[$commodity->id]]['amount'] += $commodity->amount;
  149. else{
  150. array_push($commodities,$commodity->toArray());
  151. $commodity_ids[$commodity->id] = count($commodities)-1;
  152. }
  153. }
  154. }
  155. return $commodities;
  156. }
  157. private function storeCommodity($basSKUs){
  158. $oracleBasSkus=OracleBasSKU::query()->whereIn("CustomerID",$basSKUs['owner_code'])->whereIn("SKU",$basSKUs['sku'])->get();
  159. if (count($oracleBasSkus)<1)return;
  160. $commoditiesData=[];
  161. $commoditiesTem=["sku"=>[],"owner_id"=>[]];
  162. $commodityBarCodeData=[];
  163. $owners_code=array_column($oracleBasSkus->toArray(),'customerid');
  164. $ownersTem=Owner::query()->whereIn('code',$owners_code)->get();
  165. $owners=array_column($ownersTem->toArray(),'id','code');
  166. for($i=0;$i<count($oracleBasSkus);$i++){
  167. if (!$owners[$oracleBasSkus[$i]->customerid])$owners[$oracleBasSkus[$i]->customerid]=$this->storeOwner($oracleBasSkus[$i]->customerid);
  168. array_push($commoditiesData,["owner_id"=>$owners[$oracleBasSkus[$i]->customerid],"name"=>$oracleBasSkus[$i]->descr_c,"sku"=>$oracleBasSkus[$i]->sku,"created_at"=>Carbon::now()]);
  169. array_push($commoditiesTem['sku'],$oracleBasSkus[$i]->sku);
  170. array_push($commoditiesTem['owner_id'],$owners[$oracleBasSkus[$i]->customerid]);
  171. if ($oracleBasSkus[$i]->alternate_sku1)$commodityBarCodeData[$oracleBasSkus[$i]->sku."_".$owners[$oracleBasSkus[$i]->customerid]]=["code"=>$oracleBasSkus[$i]->alternate_sku1,"commodity_id"=>'','created_at'=>Carbon::now()];
  172. }
  173. //保留:根据条码与货主批量二次查找商品
  174. if (count($commoditiesData) > 0){
  175. app('CommodityService')->insert($commoditiesData);
  176. app('LogService')->log(__METHOD__, 'FLUX二次加工单接口录入商品__' . __FUNCTION__, json_encode($commoditiesData), Auth::user()['id']);
  177. $commodities=Commodity::query()->whereIn('sku',$commoditiesTem['sku'])->whereIn('owner_id',$commoditiesTem['owner_id'])->get();
  178. foreach ($commodities as $commodity){
  179. if (isset($commodityBarCodeData[$commodity->sku."_".$commodity->owner_id]))
  180. $commodityBarCodeData[$commodity->sku."_".$commodity->owner_id]['commodity_id']=$commodity->id;
  181. }
  182. if (count($commodityBarCodeData) > 0){
  183. app('CommodityBarcodeService')->insert(array_values($commodityBarCodeData));
  184. app('LogService')->log(__METHOD__, 'FLUX二次加工单接口录入商品条码__' . __FUNCTION__, json_encode($commodityBarCodeData), Auth::user()['id']);
  185. }
  186. }
  187. }
  188. private function storeOwner($code){
  189. $owner=new Owner([
  190. "name"=>$code,
  191. "code"=>$code
  192. ]);
  193. $owner->save();
  194. app('LogService')->log(__METHOD__, 'FLUX二次加工单接口录入货主__' . __FUNCTION__, json_encode($owner), Auth::user()['id']);
  195. return $owner;
  196. }
  197. private function resetCommodityAmount($code,$is_finished_product,$commodities){
  198. if ($is_finished_product) $type = "成品单";
  199. else $type="原料单";
  200. $ids = array_column($commodities,'id');
  201. $processesContent = ProcessesContent::query()->where('type',$type)->where('wms_code',$code)
  202. ->whereIn('commodity_id',$ids)->get();
  203. if (count($processesContent) < 1)return $commodities;
  204. $amountMap = [];
  205. foreach ($processesContent as $content){
  206. if ($amountMap[$content->commodity_id] ?? false)$amountMap[$content->commodity_id] += $content->amount;
  207. else $amountMap[$content->commodity_id] = $content->amount;
  208. }
  209. foreach ($commodities as &$commodity){
  210. if (($amountMap[$commodity['id']] ?? false) && $amountMap[$commodity['id']] < $commodity['amount']){
  211. $commodity['former_amount'] = $commodity['amount'];
  212. $commodity['amount'] = ($commodity['amount'])-$amountMap[$commodity['id']];
  213. }
  214. }
  215. return $commodities;
  216. }
  217. }