'int',//主键,自动递增 'code'=>'string',//订单或记录的唯一标识符 'invoiceCode'=>'string',//订单或记录的唯一标识符 'type'=>'int',//记录类型 1入库2出库 3入库红冲 4 出库红冲 'source'=>'int',//数据来源,1结算 2 线下订单 'channel'=>'int',//渠道 1订单导入 2 非订单商品导入 3 c端无发票导入 'seller_code'=>'string',//卖方代码 'seller_name'=>'string',//卖方名称 'buyer_code'=>'string',//买方代码 'buyer_name'=>'string',//买方名称 'orderCode'=>'string',//订单编号 'cxCode'=>'string',//客户编号 'poCode'=>'string',//采购订单编号 'platform_type'=>'int',//平台类型,1ToB 2ToC 'goodType'=>'int',//商品类型 1库存 2非库存 3采返 'goodNo'=>'string',//商品编号 'goodName'=>'string',//商品名称 'unit'=>'string',//商品单位 'num'=>'int',//商品数量 'goodPrice'=>'decimal',//商品单价 'totalPrice'=>'decimal',//商品总价 'cat_code'=>'string',//商品分类代码 'cat_name'=>'string',//商品分类名称 'tax'=>'decimal',//税率或税费 'inv_fee'=>'decimal',//发票费用 'inv_seller_code'=>'string',//发票卖方代码 'inv_seller_name'=>'string',//发票卖方名称 'inv_buyer_code'=>'string',//发票买方代码 'inv_buyer_name'=>'string',//发票买方名称 'inv_number'=>'string',//发票编号 'inv_type'=>'string',//发票类型 'inv_item_id'=>'int',//发票项目ID 'inv_good_name'=>'string',//发票商品名称 'inv_cat_code'=>'string',//发票商品分类代码 'inv_spec'=>'string',//发票商品规格 'inv_unit'=>'string',//发票商品单位 'inv_num'=>'decimal',//发票商品数量 'inv_subprice'=>'decimal',//发票商品子项单价 'inv_subtotal'=>'decimal',//发票商品子项总价 'inv_tax'=>'decimal',//发票税额 'inv_tax_total'=>'decimal',//发票总税额 'inv_price'=>'decimal',//发票单价 'inv_total'=>'decimal',//发票总价 'inv_open_date'=>'datetime', 'cat_diff'=>'int',//分类差异 'tax_diff'=>'int',//税费差异 'remark'=>'string',//备注或说明 'error_remark'=>'string',//备注或说明 'status'=>'int',//1 待处理 2 处理完成 'manager_status'=>'int',//1 正常 2计提 3 异常 'balance_num'=>'decimal',//库存数量 'total_num'=>'decimal',//总库存数量, 'check_fee'=>'decimal', 'is_checkOrder'=>'int', 'fz_date'=>'varchar', 'apply_id'=>'int', 'apply_name'=>'string', 'create_time'=>'datetime', 'update_time'=>'datetime', 'delete_time'=>'datetime', ]; protected $createTime='create_time'; protected $updateTime='update_time'; protected $deleteTime='delete_time'; public static $ManagerType=[1=>'入库',2=>'出库']; public static $ManagerSource=[1=>'结算',2=>'线下订单']; public static $PlatformType=[1=>'ToB',2=>'ToC']; public static $ManagerStatusCn=[1=>'正常',2=>'计提',3=>'异常']; public function ProductRela(){ return $this->hasMany(ManagerProduct::class,'manager_id','id'); } public function setErrorRemarkAttr($value,$data){ return $data['manager_status']==3?$value:''; } public function CreateData($data){ if(!empty($data)){ switch ($data['channel']){ case 1: $this->OrderImport($data); break; case 2: $this->OfflineImport($data); break; case 3: $this->CImport($data); break; default: throw new \Exception('导入渠道不存在'); break; } } return true; } // 订单导入 public function OrderImport($data){ $data['total_num'] = $data['balance_num'] =$data['inv_num']; try{ if($data['type']==1){ $product= $this->inProduct($data); } if($data['type']==2){ $product= $this->outProduct($data); } $data['manager_status']=$data['balance_num']=='0'?1:2; }catch (\Exception $e){ $data['manager_status'] =3; $data['error_remark'] = $e->getMessage(); } $data['status'] = $data['manager_status'] ==1?2:1; $info=$this->create($data); if($info->isEmpty()) throw new \Exception('添加失败'); if (isset($product)) ManagerProduct::AddProduct($info->id,$product); } // 线下订单导入入库 public function inProduct(&$data){ $productID=[]; try{ $product = FinancialProducts::with(['productStock','ProductsCombind'])->where($this->getCondition($data))->findOrEmpty(); if($product->isEmpty()){ if($data['type']==4) throw new \Exception('红冲未找到财务商品信息'); if($data['channel']==2 || $data['channel']==3) throw new \Exception('入库未找到财务商品信息'); else{ $goodinfo = Good::where('spuCode',$data['goodNo'])->findOrEmpty(); $good_type=3; if(!$goodinfo->isEmpty()){ $good_type=$goodinfo->isZx==1?3:($goodinfo->is_stock==1?1:2); } $product_data=[ 'skuCode'=>$data['goodNo'], 'goodName'=>$data['goodName'], 'good_type'=>$good_type, 'buyer_name'=>$data['inv_buyer_name'], 'buyer_code'=>$data['inv_buyer_code'], 'seller_name'=>$data['inv_seller_name'], 'seller_code'=>$data['inv_seller_code'], 'good_source'=>1, 'good_type'=>$data['goodType'], 'inv_good_name'=>$data['inv_good_name'], 'unit'=>$data['inv_unit'], 'unit_price'=>$data['inv_price'], 'subunit_price'=>$data['inv_subprice'], 'unit_weight'=>$data['unit_weight']??0, 'cat_code'=>$data['inv_cat_code'], 'cat_tax'=>$data['inv_tax'], "spec"=>$data['inv_spec'], 'inv_type'=>$data['inv_type'], "is_combind"=>0, 'basic_status'=>1, 'spectral'=>'', 'apply_id'=>$data['apply_id'], 'apply_name'=>$data['apply_name'], 'status'=>1 ]; $product = FinancialProducts::create($product_data); } } if($product->is_combin==1){ $rednum=$data['balance_num']; if($product->ProductsCombind->isEmpty()) throw new \Exception('组合商品未找到明细'); $product->ProductsCombind->each(function ($item) use ($rednum, &$productID) { ProductStock::AddStock($item->child_id, $rednum * $item->child_num); $productID[] = ['product_id' => $item->child_id, 'type'=>1,'num' => $rednum * $item->child_num]; }); }else{ ProductStock::AddStock($product->id,$data['balance_num']); $productID[]=["product_id"=>$product->id,"type"=>1,"num"=>$data['balance_num']]; } $data['balance_num']="0"; $data['status']=1; return $productID; }catch (\Exception $e){ throw new \Exception($e->getMessage()); } } // 出库 public function outProduct(&$data){ $productID=[]; try{ if($data['channel'] == 1) { $product = FinancialProducts::with(['productStock','ProductsCombind'])->where($this->getCondition($data))->findOrEmpty(); if($product->isEmpty()) throw new \Exception('出库未找到财务商品信息'); if($data['balance_num']>$product->residue_stock) throw new \Exception('出库数量大于库存'); $item=['id'=>$product->id,'num'=> $data['balance_num']]; $this->processSingleProduct($item, $productID,$data); } else { if (isset($data['relaArr']) && is_array($data['relaArr'])) { foreach ($data['relaArr'] as $item) { if (!isset($item['id']) || !isset($item['num'])) { throw new \Exception('relaArr 中的元素缺少 id 或 num'); } $this->processSingleProduct($item, $productID, $data); } } else { throw new \Exception('relaArr 为空或格式不正确'); } } }catch (\Exception $e){ throw new \Exception($e->getMessage()); } return $productID; } // 单商品处理 private function processSingleProduct($data, &$productID, &$mainData = null) { $product = FinancialProducts::with(['productStock',"ProductsCombind"])->findOrEmpty($data['id']); if (!$product->isEmpty()) { if($mainData['type']!=2 && $product->basic_status==2) throw new \Exception($product->skuCode.'商品不可为预估成本商品'); $rednum = $data['num']; if ($product->residue_stock < $data['num']) { if($mainData['type']==4) throw new \Exception($product->skuCode.'商品库存不足'); $rednum = $product->residue_stock; if ($mainData !== null) { $mainData['balance_num'] = bcsub($mainData['balance_num'], $product->residue_stock, 8); } } else { if ($mainData !== null) { $mainData['balance_num'] = bcsub($mainData['balance_num'], $data['num'], 8); } } if($product->is_combind==1 ){ if($product->ProductsCombind->isEmpty()) throw new \Exception('组合商品未找到明细'); $product->ProductsCombind->each(function ($item) use ($rednum, &$productID) { ProductStock::OutStock($item->child_id, $rednum * $item->child_num); $productID[] = ['product_id' => $item->child_id, 'type'=>2,'num' => $rednum * $item->child_num]; }); }else{ ProductStock::OutStock($product->id, $rednum); $productID[] = ['product_id' => $product->id, 'type'=>2,'num' => $rednum]; } // $mainData['manager_status']=$mainData['balance_num']=='0'?1:2; } else { throw new \Exception('出库未找到财务商品信息'); } } public function getCondition($data){ $where=[]; if($data['channel']==1 && (empty($data['relaArr'])|| !isset($data['relaArr']))) { $where=[ 'skuCode'=>$data['goodNo'], 'goodName'=>$data['goodName'], 'good_type'=>$data['goodType'], 'seller_code'=>$data['inv_seller_code'], 'buyer_code'=>$data['inv_buyer_code'], 'inv_good_name'=>$data['inv_good_name'], 'unit'=>$data['inv_unit'], 'unit_price'=>$data['inv_price'], 'subunit_price'=>$data['inv_subprice'], 'inv_type'=>$data['inv_type'], 'cat_tax'=>$data['inv_tax'], 'cat_code'=>$data['inv_cat_code'], "basic_status"=>1 ]; if($data['type']==2){ $where=[ 'skuCode'=>$data['goodNo'], 'buyer_code'=>$data['inv_seller_code'], "basic_status"=>1 ]; } } else $where[]=[ 'id','in',array_column($data['relaArr'],"id") ]; return $where; } // 线下订单导入 public function OfflineImport($data){ $data['total_num'] = $data['balance_num'] =$data['inv_num']; if($data['orderCode']=="")$data['orderCode']=makeNo("PQR"); try{ if($data['type']==1){ $product=$this->inProduct($data); } if($data['type']==2){ $product=$this->outProduct($data); } $data['manager_status']=$data['balance_num']=='0'?1:2; }catch (\Exception $e){ $data['manager_status'] =3; $data['error_remark'] = $e->getMessage(); } $data['status'] = $data['manager_status'] ==1?2:1; $info=$this->create($data); if($info->isEmpty()) throw new \Exception('添加失败'); if(isset($product) && !empty($product))ManagerProduct::AddProduct($info->id,$product); } // c端无发票导入 public function CImport($data){ $data['total_num'] = $data['balance_num'] =$data['num']; try{ if($data['type']==1){ $product=$this->inProduct($data); } if($data['type']==2){ $product=$this->outProduct($data); } $data['manager_status']=$data['balance_num']=='0'?1:2; }catch (\Exception $e){ $data['manager_status'] =3; $data['error_remark'] = $e->getMessage(); } $data['status'] = $data['manager_status'] ==1?2:1; $info=$this->create($data); if($info->isEmpty()) throw new \Exception('添加失败'); if(isset($product) && !empty($product))ManagerProduct::AddProduct($info->id,$product); } // 校验数据 public function CheckDatas($data){ $error=[]; $invoice = PayInvoice::where('hpNo',$data['invoiceCode'])->findOrEmpty(); if($invoice->isEmpty()){ $invoice = InvoicePool::where("invNo",$data['invoiceCode'])->findOrEmpty(); if($invoice->isEmpty()){ $error[] = ['code'=>$data['invoiceCode'],'msg'=>'发票号未找到数据']; } } if(!$invoice->isEmpty() && $invoice->status!=4) $error[] = ['code'=>$data['invoiceCode'],'msg'=>'发票状态不正确']; $order = CgdInfo::where("sequenceNo",$data['orderCode'])->findOrEmpty(); if($order->isEmpty()){ $order = QrdInfo::where("sequenceNo",$data['orderCode'])->findOrEmpty(); if($order->isEmpty())$error[] = ['code'=>$data['orderCode'],'msg'=>'订单未找到数据']; } if(!$order->isEmpty() && $order->cxCode!=$data['cxCode']) $error[] = ['code'=>$data['orderCode'],'msg'=>'订单主单号不一致']; return $error; } public static function onAfterWrite(Model $model) { $changedData = $model->getChangedData(); $origin = $model->getOrigin(); Log::info("changeData:".json_encode($changedData,JSON_UNESCAPED_UNICODE)); Log::info("origin:".json_encode($origin,JSON_UNESCAPED_UNICODE)); if(isset($origin['manager_status']) && $origin['manager_status']==2 && $origin['status']==1&& isset($origin['is_checkOrder'])&& $origin['is_checkOrder']==0){ if($changedData['is_checkOrder']==1 && $changedData['status']==2){ $check=[ "checkCode"=>makeNo("CWTZ"), "type"=>1, "code"=>$model->code, "itemid"=>$model->inv_item_id, "goodNo"=>$model->goodNo, 'goodType'=>$model->goodType, "goodName"=>$model->goodName, "spec"=>$model->inv_spec, "unit"=>$model->inv_unit, "company_code"=>$model->seller_code, "company_name"=>$model->seller_name, "num"=>0, // 出库调整金额 "price"=>$model->inv_price, "subprice"=>$model->inv_subprice, "check_fee"=>$model->check_fee, "check_uid"=>$changedData['uid'], "fz_date"=>date("Y-m"), "check_uname"=>$changedData['uname'], ]; FinancialCheck::create($check); } } } }