Parcourir la source

Merge branch 'master-new-wgg' of wugg/phpstock into master-new

wugg il y a 1 an
Parent
commit
5f26b9345d

+ 1 - 1
app/admin/controller/After.php

@@ -48,7 +48,7 @@ class After extends Base
         if (empty($orderout)) return error_show(1005, "未找到发货单数据");
 
         $after_num = Db::name("order_return")
-            ->where(["orderCode" => $orderout['orderCode'], "outCode" => $param['outCode']])
+            ->where(["orderCode" => $orderout['orderCode'], "outCode" => $param['outCode'], 'is_del' => 0])
             ->where("status", "not in", [5, 6, 8])
             ->sum("error_num");
 

+ 254 - 0
app/admin/controller/CombindStock.php

@@ -0,0 +1,254 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\admin\controller;
+
+use app\admin\model\ActionLog;use app\admin\model\CombindBninfo;use app\admin\model\CombindStockInfo;use app\admin\model\GoodCombind;use app\admin\model\GoodStock;use app\admin\model\GoodStockInfo;use app\admin\model\ProcessOrder;use think\App;use think\facade\Db;use think\facade\Validate;
+
+class CombindStock extends Base
+{
+	private  $combind ;
+	private  $combindStock ;
+	private  $combindStockInfo ;
+	private  $combindBninfo;
+	public function __construct(App $app) {
+		parent::__construct($app);
+		$this->combindStock =new \app\admin\model\CombindStock();
+		$this->combindStockInfo =new \app\admin\model\CombindStockInfo();
+		$this->combindBninfo =new \app\admin\model\CombindBninfo();
+		$this->combind =new \app\admin\model\GoodCombind();
+	}
+ 
+	public function list(){
+		$param=$this->request->only(['spuCode'=>'','wsm_code'=>'','good_name'=>'','cat_id'=>'','status'=>'','flag'=>'','companyNo'=>'','companyName'=>'',
+		"create_start"=>"2023-01-01 00:00:00","create_end"=>date("Y-m-d H:i:s"),"page"=>1,"size"=>15],'post','trim');
+		$where=[["combind_stock.createtime","between",[$param['create_start']?:  '2023-01-01 00:00:00',$param['create_end']?: date("Y-m-d H:i:s")]]];
+		$param['spuCode']==''?:$where[]=["combind_stock.spuCode","like","%{$param['spuCode']}%"];
+		$param['wsm_code']==''?:  $where[]=["combind_stock.wsm_code","like","%{$param['wsm_code']}%"];
+		$param['good_name']==''?: $where[]=["combind_stock.good_name","like","%{$param['good_name']}%"];
+		$param['companyNo']==''?: $where[]=["good.companyNo","like","%{$param['companyNo']}%"];
+		$param['companyName']==''?: $where[]=["good.companyName","like","%{$param['companyName']}%"];
+		$param['cat_id']==''?:  $where[]=["good.cat_id","=",$param['cat_id']];
+		$param['flag']==''?:  $where[]=["combind_stock.flag","=",$param['flag']];
+		$param['status']==''?:  $where[]=["combind_stock.status","=",$param['status']];
+		$list = $this->combindStock
+		->alias("a")
+		->withJoin(["wsminfo","good"],"left")
+		->where($where)->order("id desc")
+		->paginate(["page"=>$param['page'],"list_rows"=>$param['size']]);
+
+		return app_show(0,"获取成功",["list"=>$list->items(),"count"=>$list->total()]);
+		
+	}
+	/**@param spuCode 商品编号
+	 **@param wsm_code 仓库编号
+	 **@param stock_num  库存数量
+	 **@param flag  0 减库存 1 加库存
+	 * @return \think\response\Json|void
+	 */
+	public function create(){
+		$param =$this->request->only(["spuCode"=>"","wsm_code"=>"","stock_num"=>"",'flag'=>''],"post","trim");
+		$valid =Validate::rule([
+			"spuCode|商品编号"=>"require",
+			"wsm_code|仓库编号"=>"require",
+			"stock_num|库存数量"=>"require|number|gt:0",
+			"flag|库存变化标识"=>"require|number|in:0,1"]);
+		if($valid->check($param)==false)return error_show(1004,$valid->getError());
+		$goodbasic =Db::name("good_basic")->where("spuCode",$param["spuCode"])->find();
+		if($goodbasic==false) return error_show(1004,"未找到组合商品信息");
+		if($goodbasic['is_combind']==0) return error_show(1004,'商品不是组合商品');
+		if($param['flag']==0){//减库存 先判断库存是否足够
+			$stock = (new GoodStock())->where(["spuCode"=>$param['spuCode'],"wsm_code"=>$param["wsm_code"]])
+			->findOrEmpty();
+			if($stock->isEmpty())return error_show(1004,'商品库存信息为找到');
+			if($stock->usable_stock< $param['stock_num'])return error_show(1004,'商品库存数不足');
+			$isT = (new \app\admin\model\Good())->where(['spuCode'=>$param['spuCode']])->findOrEmpty();
+			if($isT->isEmpty()==false){
+				if($isT->usable_stock<  $param['stock_num'])return error_show(1004,'商品库存数不足');
+			}
+		}
+		$isTs = $this->combindStock->where(["spuCode"=>$param['spuCode'],"status"=>1])->findOrEmpty();
+		if($isTs->isEmpty()==false) return error_show(1004,"组合商品库存变化存在未完成得流程{$isTs->stockCode}");
+		$combindList = $this->combind->where(["spuCode"=>$param["spuCode"],"is_del"=>0])->select()->toArray();
+		if(empty($combindList)) return error_show(1004,"未找到组合商品的商品组合信息");
+		$childarr= Db::name('good')->whereIn('spuCode',array_unique(array_column($combindList,'childCode')))->column("spuCode,usable_stock,is_combind","spuCode");
+		
+		$stockCode=makeNo("CB");
+		$this->combindStock->startTrans();
+		try{
+			$data=[
+				"stockCode"=>$stockCode,
+				"spuCode"=>$param["spuCode"],
+				"wsm_code"=>$param["wsm_code"],
+				"good_name"=>$goodbasic['good_name'],
+				"flag"=>$param["flag"],
+				"bnCode"=>$param['flag']==1?makeNo("BN"):"",
+				"stock_num"=>$param['stock_num'],
+				"apply_name"=>$this->uname,
+				"apply_id"=>$this->uid,
+				"status"=>1
+			];
+			$up =$this->combindStock->save($data);
+			if($up==false) throw new \Exception("创建失败");
+			if($param["flag"]==0){
+				if($isT->isEmpty()==false){
+					$stockup = Db::name('good')->where('spuCode',$param['spuCode'])->dec('usable_stock',intval($param['stock_num']))->update();
+					if($stockup==false) throw new \Exception('组合商品库存占用失败');
+				}
+				$stock->usable_stock = bcsub($stock->usable_stock,$param['stock_num']);
+				$stock->total_stock = bcsub($stock->total_stock ,$param['stock_num']);
+				$reld=$stock->save();
+				if($reld==false) throw new \Exception('组合商品库存占用失败');
+			}else{
+				$bnArr=[];
+				foreach ($combindList as $item){
+					$num = bcmul($item['child_num'],$param['stock_num'],2);
+					if(isset($childarr[$item['childCode']])) {
+						if($childarr[$item['childCode']]['usable_stock']<$num)throw new \Exception($item['childCode'].'组合商品的子商品库存不足');
+						$stockup = Db::name('good')->where('spuCode',$item['childCode'])->dec('usable_stock',intval($num))
+						->update();
+						if($stockup==false) throw new \Exception($item['childCode'].'组合商品的子商品信息库存占用失败');
+					}
+					$bnlist= (new GoodStock())->stockSub($item['childCode'],$num);
+					$bnArr=array_merge($bnArr,$bnlist);
+				}
+				if(empty($bnArr)) throw new \Exception('组合商品的子商品信息库存占用失败');
+				(new CombindBninfo())->AaddBNLog($param['spuCode'],$data['bnCode'],$bnArr,$stockCode);
+			}
+			 $stn = ['order_code' => $stockCode, 'status' =>1, 'action_remark' => '', 'action_type' => 'add'];
+                ActionLog::logAdd(['id'=>$this->uid,'nickname'=>$this->uname], $stn, $param["flag"]==0?'ZHJC':"ZHTJ", 1,$data);
+                			$process=[
+                            'order_type' => $param["flag"]==0?'ZHJC':"ZHTJ",
+                            'order_code' => $stockCode,//出库单号
+                            'order_id' => $this->combindStock->id ,
+                            'order_status' => 1,
+                            'before_status' =>1,
+                            'holder_id'=>0,
+                        ];
+			ProcessOrder::AddProcess(['id'=>$this->uid,'nickname'=>$this->uname],$process);
+			$this->combindStock->commit();
+		}catch (\Exception $exception){
+			$this->combindStock->rollback();
+			return error_show(1004,$exception->getMessage());
+		}
+		return app_show(0,"数据创建成功",$stockCode);
+	}
+	
+	
+	public function info(){
+		$param=$this->request->only(["id"=>""],"post","trim");
+		$info =$this->combindStock->withJoin(["good","wsminfo"],"left")->with(['combindgood'])->findOrEmpty($param['id']);
+		if($info->isEmpty())return error_show(1004,"未找到数据");
+		if(!empty($info->combindgood)){
+			foreach ($info->combindgood as &$item){
+				$item['stock'] = bcmul($info->stock_num,$item['child_num']);
+			}
+		}
+		return app_show(0,"获取成功",$info);
+	}
+	
+	//status 1 待审核 2审核通过 3 审核驳回
+	public  function status(){
+		$param=$this->request->only(['id'=>'',"status"=>"","remark"=>""],'post','trim');
+		$valid=Validate::rule(["id|主键ID"=>"require","status|状态"=>"require|number|in:2,3"]);
+		if($valid->check($param)==false)return error_show(1004,$valid->getError());
+		$row = $this->combindStock->findOrEmpty($param['id']);
+		if($row->status!=1)return error_show(1004,"数据状态有误");
+		$goodinfo = (new \app\admin\model\GoodBasic())->where(['spuCode'=>$row->spuCode])->findOrEmpty();
+		if($goodinfo->isEmpty())return error_show(1004,'未找到对应得组合商品信息');
+		$comblist = (new GoodCombind())->where(["spuCode"=>$row->spuCode,"is_del"=>0])->select()->toArray();
+		if(empty($comblist)) return error_show(1004,'组合商品子商品信息未找到');
+		$good= (new \app\admin\model\Good())->where(['spuCode'=>$row->spuCode])->findOrEmpty();
+		$GoodStock =new GoodStock();
+		$stock =$GoodStock->where(['spuCode'=>$row->spuCode,'wsm_code'=>$row->wsm_code])->findOrEmpty();
+		$row->status = $param['status'];
+		$row->remark = $param['remark'];
+		$row->startTrans();
+		try{
+			$up =$row->save();
+			if($up==false) throw new \Exception("数据状态更新失败");
+			if($param['status']==2){
+				if($row->flag==1){
+					$bn = $row->bnCode;
+					if($stock->isEmpty()){
+						$wsm_stock = [
+							"spuCode"=>$row->spuCode,
+							"wsm_code"=>$row->wsm_code,
+							"usable_stock"=>$row->stock_num,
+							"total_stock"=>$row->stock_num,
+							];
+						$id =$stock->insertGetId($wsm_stock);
+						if($id<=0) throw new \Exception('仓库库存数更新失败');
+					}else{
+						$wsm_stock=[
+							'usable_stock'=>bcadd($stock->usable_stock,$row->stock_num),
+							'total_stock'=>bcadd($stock->total_stock,$row->stock_num)
+							];
+						$up=$stock->save($wsm_stock);
+						if($up==false) throw new \Exception("仓库库存数更新失败");
+						$id = $stock->id;
+					}
+					if($good->isEmpty()==false){
+						$good->usable_stock=bcadd($good->usable_stock,$row->stock_num);
+						$upe=$good->save();
+						if($upe==false)throw new \Exception('商品可用库存数更新失败');
+					}
+					$origin = Db::name('good_nake')->where([['spuCode', '=', $row->spuCode], ['min_num', '<=',$row->stock_num], ['is_del', '=', 0]])->order('min_num desc')->find();
+		            if ($origin == false) {
+		                throw new \Exception( '未找到相关阶梯成本价格');
+		            }
+		            $origin_price = $origin['nake_total'];
+		            $stcoc=GoodStockInfo::AddBn(intval($id),$bn,intval($row->stock_num),floatval($origin_price) );
+		            if($stcoc==false)  throw new \Exception( '组合商品bn库存生成失败');
+		            $stockCodeLog= $this->combindStockInfo->save(["stockCode"=>$row->stockCode,"flag"=>1,
+		            "stock_num"=>$row->stock_num,"bnCode"=>$bn,"origin_price"=>$origin_price]);
+					if($stockCodeLog==false)throw new \Exception( '组合商品bn库存生成失败');
+				}
+				else{
+					$up =GoodStockInfo::StockBnSub($stock->id,intval($row->stock_num));
+			        if(empty($up)) throw new \Exception('未找到对应子商品BN库存信息');
+					foreach ($up as $item){
+						$bnlist =$this->combind->subStock($row->spuCode,$item['bnCode'],$item['num'],$row->stockCode);
+						if($bnlist==false)throw new \Exception('子商品BN库存信息更新失败');
+						$stockLog=$this->combindStockInfo->save(["stockCode"=>$row->stockCode,"flag"=>$row->flag,
+						'stock_num'=>$item['num'],'bnCode'=>$item['bnCode'],'origin_price'=>$item['origin_price']]);
+						if($stockLog==false)throw new \Exception( '组合商品bn库存修改失败');
+					}
+				}
+			}
+			if($param['status']==3){
+						if($row->flag==0){
+							if($good->isEmpty()==false){
+								$good->usable_stock = bcadd($good->usable_stock ,$row->stock_num);
+								$stockup = $good->save();
+								if($stockup==false) throw new \Exception('组合商品库存解除驳回失败');
+							}
+							$stock->usable_stock = bcadd($stock->usable_stock,$row->stock_num);
+							$stock->total_stock = bcadd($stock->total_stock ,$row->stock_num);
+							$reld=$stock->save();
+							if($reld==false) throw new \Exception('组合商品库存解除驳回失败');
+						}else{
+							$bnlist =$this->combindBninfo->stockSub($row->stockCode);
+							if($bnlist==false)throw new \Exception('子商品BN库存信息更新失败');
+						}
+					}
+				$stn = ['order_code' => $row->stockCode, 'status' =>1, 'action_remark' => '', 'action_type' => 'add'];
+                ActionLog::logAdd(['id'=>$this->uid,'nickname'=>$this->uname], $stn,  $row->flag==0?'ZHJC':'ZHTJ',
+                 $param['status'],$param);
+                			$process=[
+                            'order_type' => $row->flag==0?'ZHJC':'ZHTJ',
+                            'order_code' =>$row->stockCode,//出库单号
+                            'order_id' => $row->id ,
+                            'order_status' => $param['status'],
+                            'before_status' =>1,
+                            'holder_id'=>0,
+                        ];
+			ProcessOrder::AddProcess(['id'=>$this->uid,'nickname'=>$this->uname],$process);
+			$row->commit();
+		}catch (\Exception $exception){
+		 $row->rollback();
+		 return error_show(1004,$exception->getMessage());
+		}
+		return app_show(0,"数据更新成功");
+	}
+}

+ 119 - 0
app/admin/controller/DataChange.php

@@ -0,0 +1,119 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\admin\controller;
+
+use think\App;
+use think\facade\Validate;
+use think\facade\Db;
+class DataChange extends Base
+{
+	protected $model;
+  public function __construct(App $app) {
+  	parent::__construct($app);
+  	$this->model=new \app\admin\model\DataChange();
+  }
+	  /**
+	* @return \think\response\Json|void
+	* @throws \think\db\exception\DataNotFoundException
+	* @throws \think\db\exception\DbException
+	* @throws \think\db\exception\ModelNotFoundException
+	 */
+  public function create(){
+  	$param =$this->request->only(["code"=>'',"type"=>"",'oaCode'=>'',"change"=>"","apply_id"=>"","apply_name"=>""],
+  	"post","trim");
+  	$valid =Validate::rule([
+  		"code|订单编号"=>"require",
+  	"type|订单类型"=>"require|number|in:1,2,3",
+  	"appply_id|申请人"=>"require|number",
+  	"change|修改字段内容"=>"require|array"]);
+  	if($valid->check($param)==false) return error_show(1004,$valid->getError());
+  	if($param['type']==1){
+  		$orderinfo = Db::name("purchease_order")->where(["cgdNo"=>$param['code']])->find();
+  	}
+  	if($param['type']==2){
+  		$orderinfo = Db::name('sale')->where(['orderCode'=>$param['code']])->find();
+  	}
+  	
+  	if($param['type']==3){
+  		$orderinfo = Db::name('good_zixun')->where(['spuCode'=>$param['code']])->find();
+  	}
+  	$ist =$this->model->where(["code"=>$param['code'],"status"=>1])->findOrEmpty();
+  	if($ist->isEmpty()==false)return error_show(1004,"订单修改存在未完成得流程");
+  	if($orderinfo==false) return error_show(1004,"订单数据未找到");
+  	if($param['type']!=3 && $orderinfo['order_source']!=2 )return error_show(1004,'非咨询单订单不可修改');
+  	$array_diff=array_diff($param['change'],$orderinfo);
+  	$order=[];
+  	$userCommon= \app\admin\common\User::getIns();
+  	foreach ($array_diff as $key=>$iten){
+  	        $order[$key] = $orderinfo[$key]??"";
+  	        if($param['type']==1 && $key=='supplierNo'){
+  	            $persion =$userCommon->handle("sInfo",["code"=>$iten]);
+  	            if(isset($persion['data'])&& !empty($persion['data'])){
+	                $array_diff['cgder'] =$persion['data']['person']?:"";
+	                $array_diff['cgder_id'] =$persion['data']['personid']?:"";
+  	            }
+  	        }
+  	}
+  	$before = json_encode($order,JSON_UNESCAPED_UNICODE);
+  	$after = json_encode($array_diff,JSON_UNESCAPED_UNICODE);
+  	$data=[
+  		"code"=>$param['code'],
+  		"type"=>$param['type'],
+  		"before"=>$before,
+  		"after"=>$after,
+  		"oaCode"=>$param['oaCode'],
+  		"apply_id"=>$param['apply_id'],
+  		"apply_name"=>$param['apply_name'],
+  		'creater_id'=>$this->uid,
+  		'creater'=>$this->uname,
+  		"status"=>1,
+  		];
+  	$in =$this->model->save($data);
+  	return $in? app_show(0,"新建成功"):error_show(1004,"新建失败");
+  }
+  
+  public function list(){
+  	$param = $this->request->only(["code"=>"","oaCode"=>"","type"=>"","apply_name"=>"","status"=>"","page"=>1,
+  	"size"=>15],"post","trim");
+  	$where=[];
+  	$param['code']==''?: $where[]=["code","like","%{$param['code']}%"];
+  	$param['apply_name']==''?: $where[]=["apply_name","like","%{$param['apply_name']}%"];
+  	$param['oaCode']==''?: $where[]=["oaCode","like","%{$param['oaCode']}%"];
+  	$param['type']==''?: $where[]=["type","=",$param['type']];
+  	$param['status']==''?: $where[]=["status","=",$param['status']];
+  	$list = $this->model->where($where)->json(["before","after"])->order("id","desc")->paginate(["page"=>$param['page'],
+  	"list_rows"=>$param['size']]);
+  	return app_show(0,"获取成功",["list"=>$list->items(),"count"=>$list->total()]);
+  }
+  
+  public function  info(){
+     $param = $this->request->only(['id'],'post','trim');
+     $info = $this->model->json(['before','after'])->findOrEmpty($param['id']);
+     return app_show(0,'获取成功',$info);
+  }
+  
+  public function status(){
+  	$param = $this->request->only(['id'=>"",'status'=>"",'remark'=>""],'post','trim');
+  	$Valid =Validate::rule(["id|申请id"=>"require","status|状态"=>"require|number|in:1,2"]);
+  	if($Valid->check($param)==false) return error_show(1004,$Valid->getError());
+  	$info = $this->model->findOrEmpty($param['id']);
+  	if($info->isEmpty())return error_show(1004,'未找到申请单数据');
+  	if($info->status!=1) return error_show(1004,'申请单数据已审核');
+    $info->status=$param['status'];
+    $info->remark=$param['remark'];
+    $this->model->startTrans();
+    try{
+        $up=$info->save();
+        if($up==false)throw  new \Exception("申请单审核失败");
+        if($param['status']==2){
+            $this->model->updateOrder($info);
+        }
+    	$this->model->commit();
+    }catch (\Exception $exception){
+        $this->model->rollback();
+        return error_show(1004,$exception->getMessage());
+    }
+    return app_show(0,"申请数据处理完成");
+  }
+}

+ 15 - 9
app/admin/controller/Good.php

@@ -4,8 +4,8 @@
 namespace app\admin\controller;
 
 use app\admin\model\DataGroup as DataGroupModel;
-use app\admin\model\GoodLog;
-use app\txx\model\YzGood;
+use app\admin\model\GoodCombind;use app\admin\model\GoodLog;
+use app\admin\model\GoodStock;use app\txx\model\YzGood;
 use think\App;
 use think\db\Raw;
 use think\facade\Db;
@@ -130,7 +130,7 @@ class Good extends Base
         $page = $page >= $total ? $total : $page;
         $list = Db::name('good')
             ->alias("a")
-            ->field("b.skuCode,b.platform_code,b.plat_code,b.id as good_id,a.cat_id,a.good_name,a.good_img,
+            ->field("b.skuCode,b.platform_code,b.plat_code,b.id as good_id,a.cat_id,a.good_name,a.good_img,b.is_fixed,
             a.good_info_img,a.good_thumb_img,b.createrid,a.is_exclusive,a.brand_id,a.supplierNo,a.supplierName,
             a.good_unit,a.noble_metal,a.companyNo,a.companyName,a.spuCode,a.good_type,b.creater,b.addtime,b.updatetime,
             b.exam_status,a.createrid purchase_id,a.creater purchase,a.is_stock,p.platform_name,b.is_compliance,b.compliance_remark")
@@ -377,6 +377,7 @@ class Good extends Base
         }
         $plat =Db::name("platform")->where(["id"=>$good_platform['platform_code']])->find();
         $data['skuCode']=$good_platform['skuCode'];
+        $data['is_fixed']=$good_platform['is_fixed'];
         $data['platform_id']=$good_platform['platform_code'];
         $data['platform_code_en']=isset($plat['platform_code'])?$plat['platform_code']:"";
         $data['platform_name']=isset($plat['platform_name'])?$plat['platform_name']:"";
@@ -393,19 +394,24 @@ class Good extends Base
         $data['unit'] = isset($unit['unit'])?$unit['unit']:'';
         $data['cat_info'] = made($data['cat_id'],[]);
         $spec = Db::name("good_spec")->where(["spuCode"=>$good_platform['spuCode'],"is_del"=>0])->select()->toArray();
-
         $userCommon = \app\admin\common\User::getIns();
         $names = $userCommon->handle('getCodeAndName',['code'=>[$data['supplierNo'],$data['companyNo']]]);
-
         $supplier = $userCommon->handle('sInfo',['code'=>$data['supplierNo']]);
-//        $supplier = Db::name("supplier")->where(["code"=>$data['supplierNo']])->find();
         $data['supplierName'] = $names['data'][$data['supplierNo']]??'';//isset($supplier['name'])?$supplier['name']:"";
-
-//        $company = Db::name("business")->where(["companyNo"=>$data['companyNo']])->find();
         $data['company'] = $names['data'][$data['companyNo']]??'';//isset($company['company'])?$company['company']:"";
 
         $data['noble_name']=isset($data['noble_metal'])&&$data['noble_metal']!=0?$this->noble[$data['noble_metal']] :"";
-
+        $data['combind_list']=[];
+        $data['wsm_list']=[];
+		 if($data['is_combind']==1){
+        	$data['combind_list'] = (new GoodCombind())->where(['spuCode'=>$good_platform['spuCode'],'is_del'=>0])->select()->toArray();
+        	foreach ($data['combind_list'] as &$item){
+        		$item['stock'] =bcmul($item['child_num'],$data['usable_stock']);
+        	}
+        	  $data['wsm_list']=(new GoodStock())->withJoin(['wsminfo'] , 'left')
+	                                           ->where(['spuCode'=>$good_platform['spuCode'] , 'wsm_type'=>[2 , 5]])
+	                                           ->column('good_stock.id stock_id,name,good_stock.wsm_code,usable_stock');
+        }
         if($data['brand_id']!=0){
             $brand=Db::name("brand")->where(["id"=>$data['brand_id']])->find();
             $data["brand_name"]=isset($brand['brand_name'])?$brand['brand_name']:"";

+ 210 - 107
app/admin/controller/Goodup.php

@@ -5,7 +5,7 @@ namespace app\admin\controller;
 use app\admin\model\ActionLog;
 use app\admin\model\ChangeLog;
 use app\admin\model\DataGroup as DataGroupModel;
-use app\admin\model\ProcessOrder;
+use app\admin\model\GoodCombind;use app\admin\model\GoodStock;use app\admin\model\ProcessOrder;
 use app\youzan\model\PlatformYouzan;
 use think\App;
 use think\Exception;
@@ -35,6 +35,13 @@ class Goodup extends Base
             $where[]=['gb.cat_id',"in",$cat_ids];
             $condit[]=['a.cat_id',"in",$cat_ids];
         }
+        
+       $is_combind = isset($this->post['is_combind']) && $this->post['is_combind'] !=='' ? intval($this->post['is_combind']):'';
+        if($is_combind!==''){
+           
+            $where[]=['gb.is_combind','=',$is_combind];
+           
+        }
         $good_name = isset($this->post['good_name']) && $this->post['good_name'] !=="" ? trim($this->post['good_name']):"";
         if($good_name!==""){
             $where[]=['gb.good_name',"like","%$good_name%"];
@@ -136,7 +143,7 @@ class Goodup extends Base
                     ->name('supplier')
                     ->where(['is_del' => 0, 'personid' => $arr])
                     ->column('code');
-
+				array_push($supplierNos,'');
                 $where[] = ['gb.supplierNo', 'in', $supplierNos];
             }
         }
@@ -283,7 +290,12 @@ class Goodup extends Base
             }
 
         }
-
+		 $is_combind = isset($this->post['is_combind']) && $this->post['is_combind'] !=='' ? intval($this->post['is_combind']):'';
+        if($is_combind!==''){
+           
+            $where[]=['gb.is_combind','=',$is_combind];
+           
+        }
         $brandid = isset($this->post['brandid']) && $this->post['brandid'] !== "" ? intval($this->post['brandid']) : "";
         if ($brandid !== "") {
             $where[] = ['gb.brand_id', "=", $brandid];
@@ -465,6 +477,8 @@ class Goodup extends Base
                 return error_show(1004,"参数customized不能为空");
             }
         }
+        $isCombind= $this->post['is_combind']??0;
+        
         $is_exclusive = isset($this->post['is_exclusive'])&&$this->post['is_exclusive']!==""? intval($this->post['is_exclusive']):"";
         if($is_exclusive===''){
             return error_show(1004,"参数is_exclusive不能为空");
@@ -473,39 +487,39 @@ class Goodup extends Base
         if($tax===''){
             return error_show(1004,"参数tax不能为空");
         }
-        $supplierNo = isset($this->post['supplierNo'])&&$this->post['supplierNo']!=""? trim($this->post['supplierNo']):"";
-        if($supplierNo==''){
-            return error_show(1004,"参数supplierNo不能为空");
-        }
-        $userCommon= \app\admin\common\User::getIns();
-        $supplier_temp =$userCommon->handle("hqInfo",["code"=>$supplierNo]);
-        if($supplier_temp['code']!=0 || empty($supplier_temp['data']) ) return error_show(1004,"供应商信息未找到");
-		$supplierArr=$supplier_temp['data']??[];
-		$supplier=$supplierArr['child']??[];
-
-        if ($this->level == 2) {
-            $supplier_account = checkHasAccountBySupplierNos([$supplierNo]);
-            if (isset($supplier_account[$supplierNo])) return json_show(1004, '该供应商已开通账号,不允许操作');
-        }
-
+        $supplierNo = isset($this->post['supplierNo'])&&$this->post['supplierNo']!=''? trim($this->post['supplierNo']):'';
+        $supplierArr=[];
+        $supplier=[];
+         $userCommon= \app\admin\common\User::getIns();
+  
+	        if($supplierNo==''){
+	            return error_show(1004,'参数supplierNo不能为空');
+	        }
+	        $supplier_temp =$userCommon->handle('hqInfo',['code'=>$supplierNo]);
+	        if($supplier_temp['code']!=0 || empty($supplier_temp['data']) ) return error_show(1004,'供应商信息未找到');
+			$supplierArr=$supplier_temp['data']??[];
+			$supplier=$supplierArr['child']??[];
+	
+	        if ($this->level == 2) {
+	            $supplier_account = checkHasAccountBySupplierNos([$supplierNo]);
+	            if (isset($supplier_account[$supplierNo])) return json_show(1004, '该供应商已开通账号,不允许操作');
+	        }
+    
+        
+       
         $good_size = isset($this->post['good_size'])&&$this->post['good_size']!=""? trim($this->post['good_size']):"";
         if($good_size==''){
             return error_show(1004,"参数good_size不能为空");
         }
-        $proof_type = isset($this->post['proof_type'])&&$this->post['proof_type']!=""? trim($this->post['proof_type']):"";
-//          if($proof_type==''){
-//            return error_show(1004,"参数proof_type不能为空");
-//        }
+       $proof_type = isset($this->post['proof_type'])&&$this->post['proof_type']!=""? trim($this->post['proof_type']):"";
        $proof_url = isset($this->post['proof_url'])&&$this->post['proof_url']!=""? trim($this->post['proof_url']):"";
-//         if($proof_url==''){
-//            return error_show(1004,"参数proof_url不能为空");
-//        }
+
         $company_id = isset($this->post['company_id'])&&$this->post['company_id']!=""? trim($this->post['company_id']) :"";
         if($company_id==''){
             return error_show(1004,"参数company_id不能为空");
         }
          $companyinfo =$userCommon->handle("getCodeAndName",["code"=>$company_id]);
-        if($supplierArr['relation_code']==$company_id){
+        if(isset($supplierArr['relation_code'])&&$supplierArr['relation_code']==$company_id){
         	 return error_show(1004,"业务公司与供应商属于同一家公司");
         }
         $is_auth = isset($this->post['is_auth'])&&$this->post['is_auth']!==""? intval($this->post['is_auth']):"";
@@ -513,9 +527,6 @@ class Goodup extends Base
             return error_show(1004,"参数is_auth不能为空");
         }
         $auth_img = isset($this->post['auth_img'])&&$this->post['auth_img']!=""? trim($this->post['auth_img']):"";
-//        if($auth_img==''){
-//            return error_show(1004,"商品不能为空");
-//        }
 
         $after_sales = isset($this->post['after_sales'])&&$this->post['after_sales']!=""? trim($this->post['after_sales']):"";
         if($after_sales==""){
@@ -589,6 +600,7 @@ class Goodup extends Base
         if($is_stock==1 && $stock_moq ==0){
             return error_show(1004,"库存品备库起订量不能为零");
         }
+        if($is_stock==0 && $isCombind==1)   return error_show(1004,'非库存品不支持组合商品类型');
         $is_diff = isset($this->post['is_diff'])&&$this->post['is_diff']!==""? intval($this->post['is_diff']):"0";
 
         $good_img = isset($this->post['good_img'])&&$this->post['good_img']!=""? trim($this->post['good_img']):"";
@@ -631,18 +643,23 @@ class Goodup extends Base
 //            return error_show(1004,"启用阶梯,阶梯价不能为空");
 //        }
         $is_support_barter = isset($this->post['is_support_barter']) && $this->post['is_support_barter'] !== "" ? intval($this->post['is_support_barter']) : 1;
-
-        $token = isset($this->post['token'])&& $this->post['token']!='' ? trim($this->post['token']):"";
-        if($token==''){
-            return error_show(105,"参数token不能为空");
-        }
-//        $user =GetUserInfo($token);
-//        if(empty($user)||$user['code']!=0){
-//            return error_show(1002,"创建人数据不存在");
-//        }
+        $combindList = $this->post["combind_list"]??[];
+		
         $createrid= $this->uid;
         $creater= $this->uname;
         $spucode=makeNo("SKU");
+        if($isCombind==1){
+			if(empty($combindList)) return error_show(1004,'组合商品子商品信息不能为空');
+			$spucode=makeNo("SSU");
+			$dchild=[];
+			$valid = Validate::rule(['childCode|子商品成本编号'=>'require','child_name|子商品名称'=>'require','child_num|组合比例'=>'require|number|gt:0']);
+			foreach ($combindList as $value){
+				if($valid->check($value)==false)return error_show(1004,$valid->getError());
+				$value['spuCode'] = $spucode;
+				$value['good_name'] =$good_name;
+				$dchild[]=$value;
+			}
+		}
         Db::startTrans();
         try {
             $data=[
@@ -710,6 +727,7 @@ class Goodup extends Base
                 "addtime"=>date("Y-m-d H:i:s"),
                 "updatetime"=>date("Y-m-d H:i:s"),
                 'is_support_barter'=>$is_support_barter,
+                'is_combind'=>$isCombind,
                 'chargerid'=>$supplier['personid']??$createrid,
                 'charger'=>$supplier['person']??$creater,//负责人跟创建人一致
             ];
@@ -745,9 +763,7 @@ class Goodup extends Base
 		                $inproof = Db::name("good_proof")->insert($proof);
 		                if($inproof==false)throw new \Exception("商品凭证新建失败");
                 }
-
-//                $catinfo = Db::name("cat")->where(["id"=>$cat_id])->find();
-//                $budget = isset($catinfo['order_rate']) ? $catinfo['order_rate']/100:0;
+                
                 $top_cat_id = made($cat_id);//获取所有分类
                 $top_cat_id = isset($top_cat_id[0]['id']) ? $top_cat_id[0]['id'] : 0;//获取顶级分类id
                 if($good_ladder!=="" && !empty($good_ladder)){
@@ -787,7 +803,9 @@ class Goodup extends Base
                     	throw new \Exception("商品成本创建失败");
                     }
                 }
-
+				if($isCombind==1 && !empty($dchild)){
+					 (new GoodCombind())->saveAll($dchild);
+				}
                 //修改状态,添加待办
                 ActionLog::logAdd(['id' => $createrid, 'nickname' => $creater], [
                     "order_code" =>$spucode,//咨询单详情编号
@@ -839,9 +857,6 @@ class Goodup extends Base
             return error_show(1004,"商品分类不能为空");
         }
         $brandid = isset($this->post['brandid'])&&$this->post['brandid']!=""? intval($this->post['brandid']):"0";
-//        if($brandid==''){
-//            return error_show(1004,"商品品牌不能为空");
-//        }
         $unit = isset($this->post['unit'])&&$this->post['unit']!=""? trim($this->post['unit']):"";
         if($unit==''){
             return error_show(1004,"商品单位不能为空");
@@ -867,23 +882,24 @@ class Goodup extends Base
         if($is_exclusive===''){
             return error_show(1004,"参数is_exclusive不能为空");
         }
-//        $customized = isset($this->post['customized'])&&$this->post['customized']!==""? intval($this->post['customized']):"";
-//        if($customized===''){
-//            return error_show(1004,"参数customized不能为空");
-//        }
+		  
         $tax = isset($this->post['tax'])&&$this->post['tax']!==""? intval($this->post['tax']):"";
         if($tax===''){
             return error_show(1004,"参数tax不能为空");
         }
         $supplierNo = isset($this->post['supplierNo'])&&$this->post['supplierNo']!=""? trim($this->post['supplierNo']):"";
-        if($supplierNo==''){
-            return error_show(1004,"参数supplierNo不能为空");
-        }
+         $isCombind= $this->post['is_combind']??0;
+        $supplierArr=[];
+        $supplier=[];
         $userCommon= \app\admin\common\User::getIns();
-		$supplier_temp =$userCommon->handle("hqInfo",["code"=>$supplierNo]);
-        if($supplier_temp['code']!=0 || empty($supplier_temp['data']) ) return error_show(1004,"供应商信息未找到");
-		$supplierArr=$supplier_temp['data']??[];
-		$supplier=$supplierArr['child']??[];
+
+	        if($supplierNo=='')return error_show(1004,'参数supplierNo不能为空');
+	        
+			$supplier_temp =$userCommon->handle('hqInfo',['code'=>$supplierNo]);
+	        if($supplier_temp['code']!=0 || empty($supplier_temp['data']) ) return error_show(1004,'供应商信息未找到');
+			$supplierArr=$supplier_temp['data']??[];
+			$supplier=$supplierArr['child']??[];
+     
         $good_size = isset($this->post['good_size'])&&$this->post['good_size']!=""? trim($this->post['good_size']) :"";
         if($good_size==''){
             return error_show(1004,"参数good_size不能为空");
@@ -893,7 +909,7 @@ class Goodup extends Base
             return error_show(1004,"参数company_id不能为空");
         }
         $companyinfo =$userCommon->handle("getCodeAndName",["code"=>$company_id]);
-        if($supplierArr['relation_code']==$company_id){
+        if(isset($supplierArr['relation_code'])&&$supplierArr['relation_code']==$company_id){
         	 return error_show(1004,"业务公司与供应商属于同一家公司");
         }
         $is_auth = isset($this->post['is_auth'])&&$this->post['is_auth']!==""? intval($this->post['is_auth']):"";
@@ -989,7 +1005,23 @@ class Goodup extends Base
         $speclist = isset($this->post['speclist'])&&!empty($this->post['speclist'])? $this->post['speclist']:"";
         $proof_type = isset($this->post['proof_type'])&&$this->post['proof_type']!=""? trim($this->post['proof_type']):"";
         $proof_url = isset($this->post['proof_url'])&&$this->post['proof_url']!=""? trim($this->post['proof_url']):"";
-
+        $combindList = $this->post['combind_list']??[];
+		 if($isCombind==1){
+			if(empty($combindList)) return error_show(1004,'组合商品子商品信息不能为空');
+			$dchild=[];
+			$valid = Validate::rule(['childCode|子商品成本编号'=>'require','child_name|子商品名称'=>'require','child_num|组合比例'=>'require|number|gt:0']);
+			foreach ($combindList as $value){
+				if($valid->check($value)==false)return error_show(1004,$valid->getError());
+				$value['spuCode'] = $data['spuCode'];
+				$value['good_name'] =$good_name;
+				$value['updatetime'] =date("Y-m-d H:i:s");
+				if($value['is_del']==1){
+					$usable_stock = Db::name("good")->where(["spuCode"=>$data['spuCode']])->value("usable_stock",0);
+					if($usable_stock>0) return error_show(1004,'组合商品库存未处理完不可删除子商品');
+				}
+				$dchild[]=$value;
+			}
+		}
         Db::startTrans();
         try {
             $temp=[
@@ -1035,6 +1067,7 @@ class Goodup extends Base
                 "good_info_img"=>$good_info_img,
                 "status"=>$count>0?2:1,
                 "updatetime" => date("Y-m-d H:i:s"),
+                'is_combind'=>$isCombind,
                 'chargerid' => $supplier['personid'] ?? $this->uid,
                 'charger' => $supplier['person'] ?? $this->uname,//负责人跟创建人一致
             ];
@@ -1077,7 +1110,9 @@ class Goodup extends Base
 		                $inproof = Db::name("good_proof")->insert($proof);
 		                if($inproof==false)throw new \Exception("商品凭证新建失败");
                 }
-
+			if($isCombind==1 && !empty($dchild)){
+					 (new GoodCombind())->saveAll($dchild);
+			}
                 //修改状态,添加待办
                 ActionLog::logAdd(['id' => $this->uid, 'nickname' => $this->uname], [
                     "order_code" =>$supcode,//咨询单详情编号
@@ -1400,14 +1435,25 @@ class Goodup extends Base
         $spec = Db::name("good_spec")->where(["spuCode"=>$supcode,"is_del"=>0])->select()->toArray();
 
         $userCommon = \app\admin\common\User::getIns();
-        $sinfo = $userCommon->handle('sInfo',['code'=>$data['supplierNo']]);
-//        $names = $userCommon->handle('getCodeAndName', ['code' => [$data['supplierNo'], $data['companyNo']]]);
-
-//        $supplier = Db::name("supplier")->where(["code"=>$data['supplierNo']])->find();
-//        $data['supplierName'] = $names['data'][$data['supplierNo']] ?? '';//isset($supplier['name'])
-        //?$supplier['name']:"";
-//        $company = Db::name("business")->where(["companyNo"=>$data['companyNo']])->find();
-//        $data['company'] = $names['data'][$data['companyNo']] ?? ''; //isset($company['company'])?$company['company']:"";
+         $sinfo = $userCommon->handle('sInfo',['code'=>$data['supplierNo']]);
+        	   $data['cgderid'] = $sinfo['data']['personid'] ?? '';
+        	   $data['cgder'] = $sinfo['data']['person'] ?? '';
+        $data['combind_list'] =[];
+        $data['wsm_list']=[];
+        $data['usable_stock']=(new GoodStock())->withJoin(['wsminfo'],'left')
+            ->where(['spuCode' => $supcode, 'wsm_type'=>[2,5]])
+            ->sum('usable_stock');
+        if($data['is_combind']==1){
+        	$data['combind_list'] = (new GoodCombind())->where(["spuCode"=>$supcode,"is_del"=>0])->select()->toArray();
+        	foreach ($data['combind_list'] as &$item){
+        		$item['stock'] =bcmul($item['child_num'],$data['usable_stock']);
+        	}
+            $data['wsm_list']=(new GoodStock())->withJoin(['wsminfo'] , 'left')
+	                                           ->where(['spuCode'=>$supcode , 'wsm_type'=>[2 , 5]])
+	                                           ->column('good_stock.id stock_id,name,good_stock.wsm_code,usable_stock');
+        }
+       
+
         $data['field_change'] = $data['field_change']!=''?json_decode($data['field_change']):"";
         if($data['brand_id']!=0){
             $brand=Db::name("brand")->where(["id"=>$data['brand_id']])->find();
@@ -1443,10 +1489,7 @@ class Goodup extends Base
             }
         }
         $data["speclist"]=empty($speclist)?[]:$speclist;
-       // $nake=[];
         $nakelist = Db::name("good_nake")->where(['spuCode'=>$supcode,"is_del"=>0])->select()->toArray();
-//        $catinfo = Db::name("cat")->where(["id"=>$data['cat_id']])->find();
-//        $budget = isset($catinfo['order_rate']) ? $catinfo['order_rate']/100:0;
         $nakearry=[];
         if(!empty($nakelist)){
             foreach ($nakelist as $value) {
@@ -1455,8 +1498,7 @@ class Goodup extends Base
         }
         $data["nakelist"]=$nakearry;
 
-        $data['cgderid'] = $sinfo['data']['personid'] ?? '';
-        $data['cgder'] = $sinfo['data']['person'] ?? '';
+      
         return app_show(0,"获取成功",$data);
     }
 
@@ -1539,9 +1581,16 @@ class Goodup extends Base
         if($online_remark===""){
             return error_show(1004,"参数online_remark不能为空");
         }
+        $fixed = isset($this->post['is_fixed'])&&$this->post['is_fixed']!==''? intval($this->post['is_fixed']):0;
+        if($fixed==1){
+        	//使用实时金价
+        	 $nake=Db::name('good_nake')->where(['spuCode'=> $spuCode,'is_del'=>0,"nake_fee"=>0])->findOrEmpty();
+        	 if(!empty($nake)) return error_show(1004,'一口价商品请先完善商品成本单价');
+          
+        }
         $createrid= $this->uid;//isset($user["data"]['id']) ?  $user["data"]['id'] : "";
         $creater= $this->uname;//isset($user["data"]['nickname']) ?  $user["data"]['nickname'] : "";
-
+		
         //区分是否是对接平台
         $platform_info=Db::name('platform')
             ->field('id,platform_type,is_select_pay_rate,status')
@@ -1556,7 +1605,10 @@ class Goodup extends Base
 			}
         }
 
-        if($platform_info['platform_type']==1) return \app\youzan\logic\Goodup::create([
+        if($platform_info['platform_type']==1){
+        	if($fixed==0) return error_show(1005,'有赞平台商品不可使用实时金价');
+        	
+        	return \app\youzan\logic\Goodup::create([
             'platform_id'=>$platform,
             'online_reason'=>$online_reason,
             'online_remark'=>$online_remark,
@@ -1564,6 +1616,7 @@ class Goodup extends Base
             'createrid'=>$createrid,
             'creater'=>$creater,
         ]);
+        }
 
 
         $data=[];
@@ -1619,6 +1672,7 @@ class Goodup extends Base
                     "online_remark"=>$online_remark,
                     "exam_status"=>$count>0 ?2:1,
                     "is_online"=>0,
+                    "is_fixed"=>$fixed,
                     "status"=>1,
                     "is_del"=>0,
                     "creater"=>$creater,
@@ -1710,6 +1764,14 @@ class Goodup extends Base
         $platform = Db::name("good_platform")->where(["skuCode"=>$post['skuCode'],"is_del"=>0])->find();
         if($platform==false){
             return error_show(1004,"未找到数据");
+        }
+        
+         if($platform['is_fixed']==1){
+        	//使用实时金价
+        	 $nake=Db::name('good_nake')->where(['spuCode'=> $platform['spuCode'],'is_del'=>0,'nake_fee'=>0])
+        	 ->findOrEmpty();
+        	 if(!empty($nake)) return error_show(1004,'一口价商品请先完善商品成本单价');
+          
         }
         if($post['exam_status']==3){
 
@@ -2092,6 +2154,17 @@ class Goodup extends Base
         $nake = Db::name("good_nake")->where(["spuCode"=>$supcode,"is_del"=>0])->select()->toArray();
         $ladd=[];
         $newCode =makeNo("SKU");
+        if($data['is_combind']==1){
+        	$newCode =makeNo('SSU');
+        	$combindList =  (new GoodCombind())->where(["spuCode"=>$supcode,"is_del"=>0])->hidden(["id"])
+        	->select()->toArray();
+        	if(!empty($combindList)){
+        	    foreach ($combindList as &$item){
+        	    	$item['spuCode']=$newCode;
+        	    	$item['good_name']=$data['good_name'];
+        	    }
+        	}
+        }
         if(!empty($nake)){
             foreach ($nake as $value){
                     $tmp=[];
@@ -2157,22 +2230,25 @@ class Goodup extends Base
                 if(!empty($ladd)){
                     $na = Db::name("good_nake")->insertAll($ladd);
                     if($na==0){
-                        Db::rollback();
-                        return error_show(1005,"成本数据复制失败");
+                       throw new \Exception('成本数据复制失败');
                     }
                 }
                 if(!empty($specArr)){
                     $sp = Db::name("good_spec")->insertAll($specArr);
                     if($sp==0){
-                        Db::rollback();
-                        return error_show(1005,"规格数据复制失败");
+                    	 throw new \Exception('规格数据复制失败');
+                    }
+                }
+                if(!empty($combindList)){
+                	$in =(new GoodCombind())->saveAll($combindList);
+                	 if($in->isEmpty()){
+                        throw new \Exception("组合商子商品品信息复制失败");
                     }
                 }
                 Db::commit();
                 return app_show(0,"复制数据成功",["spuCode"=>$newCode]);
             }else{
-                Db::rollback();
-                return error_show(1005,"数据复制失败");
+               throw new \Exception('数据复制失败');
             }
 
         }catch (\Exception $e){
@@ -2245,34 +2321,41 @@ class Goodup extends Base
         if($tax===''){
             return error_show(1004,"参数tax不能为空");
         }
-        $supplierNo = isset($this->post['supplierNo'])&&$this->post['supplierNo']!=""? trim($this->post['supplierNo']):"";
-        if($supplierNo==''){
-            return error_show(1004,"参数supplierNo不能为空");
-        }
-
-        if (($this->level == 2) && ($supplierNo != $data['supplierNo'])) {
-            $supplier_account = checkHasAccountBySupplierNos([$supplierNo]);
-            if (isset($supplier_account[$supplierNo])) return json_show(1004, '该供应商已开通账号,不允许操作');
-            if (isset($supplier_account[$data['supplierNo']])) return json_show(1004, '原供应商已开通账号,不允许操作');
+         $company_id = isset($this->post['companyNo'])&&$this->post['companyNo']!=''? trim($this->post['companyNo']) :'';
+        if($company_id==''){
+            return error_show(1004,'参数companyNo不能为空');
         }
-
         $userCommon= \app\admin\common\User::getIns();
-        $supplier_temp =$userCommon->handle("hqInfo",["code"=>$supplierNo]);
-        if($supplier_temp['code']!=0 || empty($supplier_temp['data']) ) return error_show(1004,"供应商信息未找到");
-		$supplierArr=$supplier_temp['data']??[];
-		$supplier=$supplierArr['child']??[];
+        $companyinfo =$userCommon->handle('getCodeAndName',['code'=>$company_id]);
+        $supplierNo = isset($this->post['supplierNo'])&&$this->post['supplierNo']!=""? trim($this->post['supplierNo']):"";
+        $isCombind= $data['is_combind'];
+        $supplierArr=[];
+        $supplier=[];
+
+	        if($supplierNo==''){
+	            return error_show(1004,"参数supplierNo不能为空");
+	        }
+	
+	        if (($this->level == 2) && ($supplierNo != $data['supplierNo'])) {
+	            $supplier_account = checkHasAccountBySupplierNos([$supplierNo]);
+	            if (isset($supplier_account[$supplierNo])) return json_show(1004, '该供应商已开通账号,不允许操作');
+	            if (isset($supplier_account[$data['supplierNo']])) return json_show(1004, '原供应商已开通账号,不允许操作');
+	        }
+	
+	       
+	        $supplier_temp =$userCommon->handle("hqInfo",["code"=>$supplierNo]);
+	        if($supplier_temp['code']!=0 || empty($supplier_temp['data']) ) return error_show(1004,"供应商信息未找到");
+			$supplierArr=$supplier_temp['data']??[];
+			$supplier=$supplierArr['child']??[];
+			  if($supplierArr['relation_code']==$company_id){
+        	    return error_show(1004,'业务公司与供应商属于同一家公司');
+            }
+
         $good_size = isset($this->post['good_size'])&&$this->post['good_size']!=""? trim($this->post['good_size']) :"";
         if($good_size==''){
             return error_show(1004,"参数good_size不能为空");
         }
-        $company_id = isset($this->post['companyNo'])&&$this->post['companyNo']!=""? trim($this->post['companyNo']) :"";
-        if($company_id==''){
-            return error_show(1004,"参数companyNo不能为空");
-        }
-          $companyinfo =$userCommon->handle("getCodeAndName",["code"=>$company_id]);
-        if($supplierArr['relation_code']==$company_id){
-        	 return error_show(1004,"业务公司与供应商属于同一家公司");
-        }
+    
         $is_auth = isset($this->post['is_auth'])&&$this->post['is_auth']!==""? intval($this->post['is_auth']):"";
         if($is_auth===''){
             return error_show(1004,"参数is_auth不能为空");
@@ -2378,7 +2461,23 @@ class Goodup extends Base
         $is_support_barter = isset($this->post['is_support_barter']) && $this->post['is_support_barter'] !== "" ? intval($this->post['is_support_barter']) : 1;
 		$proof_type = isset($this->post['proof_type'])&&$this->post['proof_type']!=""? trim($this->post['proof_type']):"";
         $proof_url = isset($this->post['proof_url'])&&$this->post['proof_url']!=""? trim($this->post['proof_url']):"";
-
+		$combindList = $this->post['combind_list']??[];
+		 if($isCombind==1){
+			if(empty($combindList)) return error_show(1004,'组合商品子商品信息不能为空');
+			$dchild=[];
+			$valid = Validate::rule(['childCode|子商品成本编号'=>'require','child_name|子商品名称'=>'require','child_num|组合比例'=>'require|number|gt:0']);
+			foreach ($combindList as $value){
+				if($valid->check($value)==false)return error_show(1004,$valid->getError());
+				$value['spuCode'] = $data['spuCode'];
+				$value['good_name'] =$good_name;
+				$value['updatetime'] =date('Y-m-d H:i:s');
+				if($value['is_del']==1){
+					$usable_stock = Db::name('good')->where(['spuCode'=>$data['spuCode']])->value('usable_stock',0);
+					if($usable_stock>0) return error_show(1004,'组合商品库存未处理完不可删除子商品');
+				}
+				$dchild[]=$value;
+			}
+		}
         Db::startTrans();
         try {
             $temp=[
@@ -2394,7 +2493,7 @@ class Goodup extends Base
                 "customized"=>$customized,
                 "tax"=>$tax,
                 "supplierNo"=>$supplierNo,
-                "supplierName"=>$supplierArr['name'],
+                "supplierName"=>$supplierArr['name']??"",
                 "is_auth"=>$is_auth,
                 "good_size"=>$good_size,
                 "auth_img"=>$auth_img,
@@ -2437,6 +2536,7 @@ class Goodup extends Base
                 "is_step" => count($good_ladder) > 1 ? 1 : 0,
                 "stock_moq"=>$stock_moq,
                 "status"=>"0",
+                'is_combind'=>$isCombind,
                 "updatetime"=>date("Y-m-d H:i:s"),
                 'is_support_barter'=>$is_support_barter,
                 'chargerid' => $supplier['personid'] ?? $this->uid,
@@ -2540,7 +2640,9 @@ class Goodup extends Base
                         }
                     }
                 }
-
+				if($isCombind==1 && !empty($dchild)){
+					 (new GoodCombind())->saveAll($dchild);
+			}
                 Db::commit();
                 return app_show(0,"更新成功");
             }else{
@@ -2555,12 +2657,13 @@ class Goodup extends Base
 
     public function checkPrice(){
 
-        $param = $this->request->only(['spuCode', 'min_num', 'platform_id', 'relaComNo'], 'post', 'trim');
+        $param = $this->request->only(['spuCode', 'min_num', 'platform_id', 'relaComNo',"is_fixed"], 'post', 'trim');
 
         $val = Validate::rule([
             'spuCode|商品成本编码' => 'require',
             'min_num|起订量' => 'require|number|gt:0',
             'platform_id|上线平台ID' => 'require|number|gt:0',
+            'is_fixed|定价模式' => 'require|number|in:0,1',
             'relaComNo'=>'require'
         ]);
         if($val->check($param) == false) return json_show(1005,$val->getError());
@@ -2601,7 +2704,7 @@ class Goodup extends Base
         $sale_cost_fee = 0;
         if ($good['is_gold_price'] == 1 && $top_cat_id == 6) {
 //            $saleprice =  $good['noble_weight']*$good["cgd_gold_price"] + $nakelist['cost_fee']/(1-$budget)*$good['noble_weight']+$nakelist['mark_fee']+$nakelist['package_fee']+$nakelist['cert_fee']+$nakelist['nake_fee']+$nakelist['delivery_fee'];
-
+			if($param['is_fixed']==0) $nakelist['nake_fee']=0;
             //系统售价=(贵金属重量*供应商采购金价 + 工艺费*贵金属重量+加标费+包装费+证书费+成本裸价+运费+其他费用)/(1-成本售价/100)
             $saleprice = ($good['noble_weight'] * $good["cgd_gold_price"] + $nakelist['cost_fee'] * $good['noble_weight'] + $nakelist['mark_fee'] + $nakelist['package_fee'] + $nakelist['cert_fee'] + $nakelist['nake_fee'] + $nakelist['delivery_fee'] + $nakelist['other_fee']) / (1 - $budget);
 

+ 32 - 22
app/admin/controller/Sale.php

@@ -41,7 +41,7 @@ class Sale extends Base
 		$tmp = $userCommon->handle('getCodeAndName',['code'=>[$customer_code,$supplierNo]]);
         if(!isset($tmp['code']) || $tmp['code']!=0) return json_show($tmp['code'],$tmp['message'],$tmp['data']);
         if(!isset($tmp['data'][$customer_code])) return json_show(1004, "未找到客户数据");
-        if(!isset($tmp['data'][$supplierNo])) return json_show(1004, "未找到平台供应商数据");
+        if(!isset($tmp['data'][$supplierNo])) return json_show(1004, '未找到平台供应商数据');
         $goodtype = isset($this->post['goodtype']) && $this->post['goodtype'] !== "" ? intval($this->post['goodtype']) : "1";
         $order_type = isset($this->post['order_type']) && $this->post['order_type'] !== "" ? intval($this->post['order_type']) : "1";
         $sendtype = isset($this->post['sendtype']) && $this->post['sendtype'] !== "" ? intval($this->post['sendtype']) : "";
@@ -72,10 +72,21 @@ class Sale extends Base
         $paytime = isset($this->post['paytime']) && $this->post['paytime'] != "" ? $this->post['paytime'] : "";
         $workNo = isset($this->post['workNo']) && $this->post['workNo'] != "" ? trim($this->post['workNo']) : "";
         $ct = Db::name('good_platform')->alias('a')->join('good b', 'b.spuCode=a.spuCode', 'left')
-            ->where(['a.skuCode' => $good_code])->field("b.*,a.skuCode,a.platform_code,a.plat_code")->findOrEmpty();
+            ->where(['a.skuCode' => $good_code])->field("b.*,a.skuCode,a.platform_code,a.plat_code,a.is_fixed")
+            ->findOrEmpty();
         if (empty($ct)) {
             return error_show(1002, "未找到商品数据");
         }
+        $holder_id=0;
+		$holder_name='';
+		$supplier_name=$ct['supplierName'];
+        if($ct['is_combind']==0){
+            $supplier_temp =$userCommon->handle('sInfo',['code'=>$ct['supplierNo']]);
+			if($supplier_temp['code']!=0 || empty($supplier_temp['data']) ) return error_show(1002,'采购单供应商不存在');
+			$holder_id=$supplier_temp['data']['personid']??0;
+			$holder_name=$supplier_temp['data']['person']??'';
+			$supplier_name=$supplier_temp['data']['name']??'';
+        }
 
         $goodinfo = $ct;
         $is_stock = $ct['is_stock'];
@@ -137,7 +148,7 @@ class Sale extends Base
                         ->where(["type" => $ct['noble_metal'], "is_del" => 0, "status" => 1])
                         ->order("addtime desc")
                         ->find();
-
+					if($ct['is_fixed']==0) $origin['nake_fee']=0;
                     //$saleprice(最终售价) = (打样费/购买数量 + 开模费/购买数量 + 商品重量* 最新金价 + 工艺费* 商品重量+包装费+加标费+证书费+产品裸价+物流费)/(1-成本售价/100);
                     $sale_price = $sale_price !== "" ? $sale_price : ($ct['demo_fee'] / $good_num + $ct['open_fee'] / $good_num
                         + $ct['noble_weight'] * $gold["price"] + $good['cost_fee'] * $ct['noble_weight'] + $origin['package_fee'] + $origin['mark_fee'] + $origin['cert_fee'] + $origin['nake_fee'] + $origin['delivery_fee']);
@@ -148,11 +159,7 @@ class Sale extends Base
         } else {
             $sale_price = 0;
         }
-		$supplier_temp =$userCommon->handle("sInfo",["code"=>$ct['supplierNo']]);
-		if($supplier_temp['code']!=0 || empty($supplier_temp['data']) ) return error_show(1002,"采购单供应商不存在");
-		$holder_id=$supplier_temp['data']['personid']??0;
-		$holder_name=$supplier_temp['data']['person']??'';
-		$supplier_name=$supplier_temp['data']['name']??'';
+        
         $cgd = [
             "supplierNo" => $ct['supplierNo'],
             "supplierName" => $supplier_name,
@@ -1774,7 +1781,7 @@ class Sale extends Base
             ->alias("a")
             ->leftJoin("good_platform b", "a.spuCode=b.spuCode")
             ->where(["b.skuCode" => $data['skuCode'], "a.is_del" => 0, "b.is_del" => 0])
-            ->field("a.*,b.skuCode,b.platform_code")->find();
+            ->field("a.*,b.skuCode,b.platform_code,b.is_fixed")->find();
 
         if ($good == false) {
 //            return 4; //商品信息未找到
@@ -1802,17 +1809,21 @@ class Sale extends Base
                 ->where(["type" => $good['noble_metal'], "is_del" => 0, "status" => 1])
                 ->order("addtime desc")
                 ->find();
-
+			if($good['is_fixed']==0) $origin['nake_fee']=0;
             //$saleprice(最终售价) = (打样费/购买数量 + 开模费/购买数量 + 商品重量* 最新金价 + 工艺费* 商品重量+包装费+加标费+证书费+产品裸价+物流费)/(1-成本售价/100);
             $sale_price = $good['demo_fee'] / $data['good_num'] + $good['open_fee'] / $data['good_num'] + $good['noble_weight'] * $gold["price"] + $goodlass['cost_fee'] * $good['noble_weight'] + $origin['package_fee'] + $origin['mark_fee'] + $origin['cert_fee'] + $origin['nake_fee'] + $origin['delivery_fee'];
             $good['cgd_gold_price'] = $gold["price"];
         }
 
         $orderCode = makeNo("QR");
-		$userCommon= \app\admin\common\User::getIns();
-		$supplier_temp =$userCommon->handle("sInfo",["code"=>$good['supplierNo']]);
-		if($supplier_temp['code']!=0 || empty($supplier_temp['data']) )  throw new Exception("供应商不存在");
-		$supplier_temp_info = $supplier_temp['data'];
+        $supplier_temp_info =[];
+        if($good['supplierNo']!=''){
+	        $userCommon= \app\admin\common\User::getIns();
+			$supplier_temp =$userCommon->handle('sInfo',['code'=>$good['supplierNo']]);
+			if($supplier_temp['code']!=0 || empty($supplier_temp['data']) )  throw new Exception('供应商不存在');
+			$supplier_temp_info = $supplier_temp['data'];
+        }
+
         $datas = [
             "orderCode" => $orderCode,
             "good_code" => $data['spuCode'],
@@ -1835,7 +1846,7 @@ class Sale extends Base
             "send_type" => $data['sendtype'],
             "supplierNo" => $data['companyNo'],
             "supplierName" => $data['companyName'],
-            "supName" => $supplier_temp_info['name'],
+            "supName" => $good['supplierName'],
             "supNo" => $good['supplierNo'],
             "is_del" => 0,
             "zxNo" => $data["pgNo"],
@@ -1856,8 +1867,8 @@ class Sale extends Base
             "addtime" => date("Y-m-d H:i:s"),
             "updatetime" => date("Y-m-d H:i:s"),
             'total_price' => round($sale_price * $data['good_num'], 2),
-            'cgderid' => $supplier_temp_info['personid'],
-            'cgder' => $supplier_temp_info['person'],//采购员(供应商负责人)
+            'cgderid' => $supplier_temp_info['personid']??"0",
+            'cgder' => $supplier_temp_info['person']??"",//采购员(供应商负责人)
             'good_createrid' => $good['createrid'],
             'good_creater' => $good['creater'],//商品创建人
         ];
@@ -1883,7 +1894,7 @@ class Sale extends Base
             ]);
             $cgd = [
                 "supplierNo" => $good['supplierNo'],
-                "supplierName" => $supplier_temp_info['name'],
+                "supplierName" =>$good['supplierName'],
                 "companyNo" => $data['companyNo'],
                 "companyName" => $data['companyName'],
                 "orderCode" => $orderCode,
@@ -1904,8 +1915,8 @@ class Sale extends Base
                 "good_type" => 1,
                 "weight" => $good['noble_weight'],
                 "gold_price" => isset($good['cgd_gold_price']) ? $good['cgd_gold_price'] : 0,
-                "createrid" => $supplier_temp_info['personid'],
-                "creater" => $supplier_temp_info['person'],
+                "createrid" => $supplier_temp_info['personid']??0,
+                "creater" => $supplier_temp_info['person']??"",
                 "order_type" => $good['is_stock'] == 1 ? 1 : 2,
                 'order_source' => 3,//3项目
                 'send_way' => 2,
@@ -4488,7 +4499,7 @@ class Sale extends Base
                     ->where(["type" => $ct['noble_metal'], "is_del" => 0, "status" => 1])
                     ->order("addtime desc")
                     ->find();
-
+				if($ct['is_fixed']==0) $origin['nake_fee']=0;
                 $saleprice = $ct['demo_fee'] / $sale_num + $ct['open_fee'] / $sale_num + $ct['noble_weight'] * $gold["price"] + $good_temp['cost_fee'] * $ct['noble_weight'] + $origin['package_fee'] + $origin['mark_fee'] + $origin['cert_fee'] + $origin['nake_fee'] + $origin['delivery_fee'];
 
 
@@ -5177,7 +5188,6 @@ class Sale extends Base
                     if (empty($good)) throw new Exception('未找到商品信息');
                     $stock = Db::name("good")->where($good)
                     ->inc("usable_stock",$sale['wsend_num'])
-                     ->data(["updatetime" => date("Y-m-d H:i:s")])
                     ->update();
                     if ($stock == false) throw new Exception('商品库存更新失败');
                 }

+ 22 - 12
app/admin/controller/SaleReport.php

@@ -2684,7 +2684,7 @@ class SaleReport extends Base
 	        'start_day' => date('Y-m-01'),
 	        'end_day' => date('Y-m-t')], 'post', 'trim');
 
-        $where = [['a.is_del', '=', 0],['a.status',"<>",4]];
+        $where = [['a.is_del', '=', 0]];
         if ($param['supplierNo'] != '') $where[] = ['a.supplierNo', 'like', '%' . $param['supplierNo'] . '%'];
         if ($param['companyNo'] != '') $where[] = ['a.companyNo', 'like', '%' . $param['companyNo'] . '%'];
         if ($param['supplier_name'] != '') $where[] = ['a.supplier_name', 'like', '%' . $param['supplier_name'] . '%'];
@@ -2702,7 +2702,7 @@ class SaleReport extends Base
             ->leftJoin("platform p", "p.id=s.platform_id AND p.is_del=0")
             ->where($where)
 	        ->group("a.supplierNo,a.supplier_name,a.order_type,p.use_type,a.order_source,a.status")
-	        ->field("a.supplierNo,a.supplier_name,a.order_type,p.use_type,a.order_source,a.status,count(a.id) as total_cgd,sum(total_fee) as total_fee,sum(a.wsend_num*a.good_price) as wtotal_fee")
+	        ->field("a.supplierNo,a.supplier_name,a.order_type,p.use_type,a.order_source,a.status,count(a.id) as total_cgd,sum(a.total_fee-a.th_fee) as total_fee,sum(a.wsend_num*a.good_price) as wtotal_fee")
 	        ->select()
 	        ->toArray();
         $list = [];
@@ -2821,7 +2821,7 @@ class SaleReport extends Base
         $param = $this->request->only(['token', 'supplierNo' => '', 'companyNo' => '', 'supplier_name' => '','status' => '',
 	        'person_id' => '', 'start_day' => date('Y-m-01'), 'end_day' => date('Y-m-t')], 'post', 'trim');
 
-        $where = [['a.is_del', '=', 0],['a.status','<>',4]];
+        $where = [['a.is_del', '=', 0]];
 
         if ($param['supplierNo'] != '') $where[] = ['a.supplierNo', 'like', '%' . $param['supplierNo'] . '%'];
         if ($param['companyNo'] != '') $where[] = ['a.companyNo', 'like', '%' . $param['companyNo'] . '%'];
@@ -2841,7 +2841,7 @@ class SaleReport extends Base
             ->leftJoin("platform p", "p.id=s.platform_id AND p.is_del=0")
             ->where($where)
 	        ->group("a.supplierNo,a.supplier_name,a.order_type,p.use_type,a.order_source,a.status")
-	        ->field("a.supplierNo,a.supplier_name,a.order_type,p.use_type,a.order_source,a.status,count(a.id) as total_cgd,sum(total_fee) as total_fee,sum(a.wsend_num*a.good_price) as wtotal_fee")
+	        ->field("a.supplierNo,a.supplier_name,a.order_type,p.use_type,a.order_source,a.status,count(a.id) as total_cgd,sum(a.total_fee-a.th_fee) as total_fee,sum(a.wsend_num*a.good_price) as wtotal_fee")
 	        ->select()
 	        ->toArray();
         $list = $tmp = [];
@@ -3297,7 +3297,11 @@ class SaleReport extends Base
 		 	'person_id' => '',
 		 	'page' => 1,
 		 	'size' => 15,
-		 	'start_day' => date('Y-m-01'), 'end_day' => date('Y-m-t')], 'post', 'trim');
+		 	'start_day' => date('Y-m-01'),
+		 	'end_day' => date('Y-m-t'),
+		 	'order_start_day' => date('Y-m-01'),
+		 	'order_end_day' => date('Y-m-t')],
+		 	'post', 'trim');
 
         $where = [['a.is_del', '=', 0],["a.status","in",[0,1]]];
 			  if ($param['depart_id'] != ''){
@@ -3311,8 +3315,10 @@ class SaleReport extends Base
         if ($param['supplier_name'] != '') $where[] = ['a.supplierName', 'like', '%' . $param['supplier_name'] . '%'];
         if ($param['companyNo'] != '') $where[] = ['a.companyNo', 'like', '%' . $param['companyNo'] . '%'];
         if ($param['companyName'] != '') $where[] = ['a.companyName', 'like', '%' . $param['companyName'] . '%'];
-        if ($param['start_day'] != '' && $param['end_day'] != '') $where[] = ['a.addtime', 'between', [$param['start_day'] . ' 00:00:00', $param['end_day'] . ' 23:59:59']];
-        $count = Db::name("order_out_child")->alias("a")->where($where)->count();
+         if ($param['start_day'] != '' && $param['end_day'] != '') $where[] = ['a.addtime', 'between', [$param['start_day'] . ' 00:00:00', $param['end_day'] . ' 23:59:59']];
+         if ($param['order_start_day'] != '' && $param['order_end_day'] != '') $where[] = ['c.addtime', 'between',
+         [$param['order_start_day'] . ' 00:00:00', $param['order_end_day'] . ' 23:59:59']];
+        $count = Db::name("order_out_child")->alias("a")->leftJoin('sale c','a.orderCode=c.orderCode')->where($where)->count();
         $list = Db::name("order_out_child")
         ->alias("a")
         ->leftJoin("warehouse_info b","a.wsm_code=b.wsm_code")
@@ -3370,7 +3376,9 @@ class SaleReport extends Base
 		 	'depart_id' => '',
 		 	'person_id' => '',
 		 	'supplier_name' => '',
-		 	'start_day' => date('Y-m-01'), 'end_day' => date('Y-m-t')], 'post', 'trim');
+		 	'start_day' => date('Y-m-01'), 'end_day' => date('Y-m-t'),
+		 	'order_start_day' => date('Y-m-01'), 'order_end_day' => date('Y-m-t'),
+		 	], 'post', 'trim');
 
         $where = [['a.is_del', '=', 0],["a.status","in",[0,1]]];
 		  if ($param['depart_id'] != ''){
@@ -3385,6 +3393,8 @@ class SaleReport extends Base
         if ($param['companyNo'] != '') $where[] = ['a.companyNo', 'like', '%' . $param['companyNo'] . '%'];
         if ($param['companyName'] != '') $where[] = ['a.companyName', 'like', '%' . $param['companyName'] . '%'];
         if ($param['start_day'] != '' && $param['end_day'] != '') $where[] = ['a.addtime', 'between', [$param['start_day'] . ' 00:00:00', $param['end_day'] . ' 23:59:59']];
+        if ($param['order_start_day'] != '' && $param['order_end_day'] != '') $where[] = ['c.addtime', 'between',
+         [$param['order_start_day'] . ' 00:00:00', $param['order_end_day'] . ' 23:59:59']];
         $list = Db::name("order_out_child")
         ->alias("a")
         ->leftJoin("warehouse_info b","a.wsm_code=b.wsm_code")
@@ -3398,10 +3408,10 @@ class SaleReport extends Base
         a.addrid,'' 收货地址,'' 收货联系人,'' 联系方式, d.cgdNo 采购单号,c.remark 备注,datediff(now(),a.addtime) 时效,b.contactor_name 仓库负责人,'' 供应商负责人")
         ->select()
         ->toArray();
-		$supArr =array_column($list,"供应商编号");
-		$platArr =array_column($list,"对接类型");
-		$AddrArr =array_column($list,"addrid");
-		$applyArr =array_column($list,"申请人部门");
+		$supArr =array_unique( array_column($list,'supplierNo'));
+		$platArr =array_unique(array_column($list,'platform_id'));
+		$AddrArr =array_unique(array_column($list,'addrid'));
+		$applyArr =array_unique(array_column($list,'apply_id'));
 		$supp=checkHasAccountBySupplierNos($supArr);
 		$preson = get_personid_by_supplierNo($supArr,"person");
 		$plafrom = Db::name("platform")->where("id","in",$platArr)->column("use_type","id");

+ 4 - 4
app/admin/controller/WareHouse.php

@@ -173,10 +173,10 @@ class WareHouse extends Base
 
         $condition= [['a.is_del',"=",0],["b.is_del","=",0]];
 
-//        $supplier = isset($post['supplierNo'])&&$post['supplierNo']!="" ? trim($post['supplierNo']) :"";
-//        if($supplier!=""){
-//            $condition[]=["supplierNo","=",$supplier];
-//        }
+        $supplier = isset($post['supplierNo'])&&$post['supplierNo']!="" ? trim($post['supplierNo']) :"";
+        if($supplier!=""){
+            $condition[]=["supplierNo","=",$supplier];
+        }
 //        $companyNo = isset($post['companyNo'])&&$post['companyNo']!="" ? trim($post['companyNo']) :"";
 //        if($companyNo!=""){
 //            $condition[]=["companyNo","=",$companyNo];

+ 93 - 0
app/admin/model/CombindBninfo.php

@@ -0,0 +1,93 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\admin\model;
+
+use think\Model;
+
+/**
+ * @mixin \think\Model
+ */
+class CombindBninfo extends Model
+{
+    protected $createTime="addtime";
+	protected $updateTime='updatetime';
+    
+    public function AaddBNLog($spuCode='',$bnCode='',$bnArr=[],$stockCode=''){
+        if(empty($bnArr)) return ;
+        $list=[];
+        foreach ($bnArr as $item){
+                $tmp=[];
+                $tmp["bnCode"]=$bnCode;
+                $tmp["stockCode"]=$stockCode;
+                $tmp["flag"]=1;
+                $tmp["spuCode"]=$spuCode;
+                $tmp["child_bnCode"]=$item['bnCode'];
+                $tmp["stock_id"]=$item['stockid'];
+                $tmp["childCode"]=$item['spuCode'];
+                $tmp["childBnNum"]=$item['num'];
+                $tmp["bnNum"]=$item['num'];
+                $tmp["origin_price"]=$item['origin_price'];
+                $list[]=$tmp;
+        }
+        
+        $this->saveAll($list);
+    }
+    /**解除库存
+	* @param string $spuCode
+	* @param string $bnCode
+	* @param string $num
+	*/
+    public function  subBN($spuCode='',$bnCode='',$childCode='',$num='',$stockCode=''){
+        $stockinfo = $this->where(["spuCode"=>$spuCode,"bnCode"=>$bnCode,"childCode"=>$childCode,"flag"=>1])->where("childBnNum",">",0)->order("id desc")
+        ->select()->toArray();
+        if(empty($stockinfo)) throw new \Exception("未找到关联得bn库存数据");
+        foreach ($stockinfo as $item){
+        	$tempnum=0;
+        	if($num<=0) break;
+        	if($num > $item['childBnNum']){
+        		$tempnum = $item['childBnNum'];
+        		$num= $num -$item['childBnNum'];
+        		$item['childBnNum']=0;
+        	}else{
+        		$tempnum = $num;
+        		$item['childBnNum']=$item['childBnNum']-$num;
+        		$num =0;
+        	}
+        	self::update($item);
+        	unset($item['id']);
+        	$item['stockCode']=$stockCode;
+        	$item['flag']=0;
+        	$item['childBnNum']=$tempnum;
+        	$this->save($item);
+        	$up=GoodStockInfo::AddBn(intval($item['stock_id']),$item['child_bnCode'],intval($tempnum),floatval($item['origin_price']));
+        	if($up==false) throw new \Exception('bn库存数据更新失败');
+        	$save=  (new GoodStock())->where(["id"=>$item['stock_id']])->inc("usable_stock",intval($tempnum))->inc("total_stock",intval($tempnum))->update();
+        	if($save==false) throw new \Exception('bn库存数据更新失败');
+        }
+       return true;
+    }
+    
+    /**解除库存
+	* @param string $stockCode
+	*/
+    public function  stockSub($stockCode=''){
+        $stockinfo = $this->where(["stockCode"=>$stockCode,'flag'=>1])->where('childBnNum','>',0)->order('id desc')
+        ->select()->toArray();
+        if(empty($stockinfo)) throw new \Exception('未找到关联得bn库存数据');
+        $goodinfo =new Good();
+        foreach ($stockinfo as $item){
+        	$up=GoodStockInfo::AddBn(intval($item['stock_id']),$item['child_bnCode'],intval($item['childBnNum']),floatval($item['origin_price']));
+        	if($up==false) throw new \Exception('bn库存数据更新失败');
+        	$save=  (new GoodStock())->where(['id'=>$item['stock_id']])->inc('usable_stock',intval($item['childBnNum']))->inc('total_stock',intval($item['childBnNum']))->update();
+        	if($save==false) throw new \Exception('bn库存数据更新失败');
+        	 $good = $goodinfo->where(['spuCode'=>$item['childCode']])->findOrEmpty();
+			 if($good->isEmpty()==false){
+			 	$good->usable_stock = bcadd($good->usable_stock,$item['childBnNum']);
+			 	$gdup=$good->save();
+			 	if($gdup==false)throw new \Exception('子商品库存更新失败');
+			 }
+        }
+       return true;
+    }
+}

+ 54 - 0
app/admin/model/CombindStock.php

@@ -0,0 +1,54 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\admin\model;
+
+use think\facade\Db;use think\Model;
+
+/**
+ * @mixin \think\Model
+ */
+class CombindStock extends Model
+{
+   protected $createTime='createtime';
+   protected $updateTime='updatetime';
+   
+   protected $hidden=["wsminfo","good"];
+   
+   protected $append=["specInfo","catInfo"];
+   public function good(){
+   	    return $this->belongsTo(GoodBasic::class,"spuCode","spuCode")->bind(["cat_id","companyNo","companyName"]);
+   }
+   
+   public function WsmInfo(){
+   	return $this->belongsTo(WarehouseInfo::class,'wsm_code','wsm_code')->bind(['wsm_name'=>"name","wsm_type"]);
+   }
+   
+   public function CombindGood(){
+   		return $this->hasMany(GoodCombind::class,'spuCode','spuCode')->where("is_del",0);
+   }
+   
+   public function  getSpecInfoAttr($v,$row){
+         $spec = Db::name('good_spec')->where(['spuCode'=>$row['spuCode'],'is_del'=>0])->select()->toArray();
+          $speclist=[];
+         if(!empty($spec)){
+            foreach ($spec as $value){
+                $temp=[];
+                $temp['id']=$value['id'];
+                $temp['spuCode']=$value['spuCode'];
+                $temp['spec_id']=$value['spec_id'];
+                $temp['spec_value_id']=$value['spec_value_id'];
+                $temp['is_del']=$value['is_del'];
+                $sp = Db::name('specs')->where(['id'=>$value['spec_id']])->find();
+                $temp['spec_name']=isset($sp['spec_name']) ? $sp['spec_name']:'';
+                $spv = Db::name('spec_value')->where(['id'=>$value['spec_value_id']])->find();
+                $temp['spec_value']=isset($spv['spec_value']) ? $spv['spec_value']:'';
+                $speclist[]=$temp;
+            }
+        }
+         return  $speclist;
+   }
+   public function  getCatInfoAttr($v,$row){
+        return made($row['cat_id']);
+   }
+}

+ 16 - 0
app/admin/model/CombindStockInfo.php

@@ -0,0 +1,16 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\admin\model;
+
+use think\Model;
+
+/**
+ * @mixin \think\Model
+ */
+class CombindStockInfo extends Model
+{
+ protected $createTime="addtime";
+ 
+
+}

+ 192 - 0
app/admin/model/DataChange.php

@@ -0,0 +1,192 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\admin\model;
+
+use think\facade\Db;
+use think\Model;
+use think\model\concern\SoftDelete;
+
+/**
+ * @mixin \think\Model
+ */
+class DataChange extends Model
+{
+	use SoftDelete;
+    protected $createTime='createtime';
+    protected $updateTime='updatetime';
+    protected $deleteTime = 'delete_time';
+    protected $append=["orderInfo"];
+    /**
+	* @param $v
+	* @param $row
+    * @return \app\admin\model\DataChange|array|mixed|\think\Model
+    */
+    public function getOrderInfoAttr($v,$row){
+	    $orderinfo=[];
+    	if(isset($row["type"])) {
+		    if ($row['type'] == 1) {
+			    $orderinfo=Db::name("purchease_order")->where(["cgdNo"=>$row['code']])->findOrEmpty();
+		    }
+		    if ($row['type'] == 2) {
+			    $orderinfo=Db::name('sale')->where(['orderCode'=>$row['code']])->findOrEmpty();
+		    }
+		    if ($row['type'] == 3) {
+			    $orderinfo=Db::name('good_zixun')->where(['spuCode'=>$row['code']])->json(["specinfo"])
+			                                                                          ->findOrEmpty();
+		    }
+	    }
+        return $orderinfo;
+    }
+    
+    public function updateOrder($data) {
+		   if($data['type']==1){
+		    $this->cgdUpdate($data);
+		   }
+		   if($data['type']==2){
+		     $this->qrdUpdate($data);
+		   }
+		   if($data['type']==3){
+		     $this->goodUpdate($data);
+		   }
+	}
+	
+	/**
+	* @param $row
+	* @throws \Exception
+    */
+	public function cgdUpdate($row){
+        $purchease = Db::name('purchease_order')->where(['cgdNo'=>$row['code']])->findOrEmpty();
+        if(empty($purchease)) throw new \Exception("未找到采购单");
+        $after= json_decode($row->after,true);
+        foreach ($after as $key=>$item){
+        	$purchease[$key]=$item;
+        }
+        $wsm=Db::name('warehouse_info')->where(['supplierNo' => $purchease["supplierNo"], 'companyNo' =>
+        $purchease['companyNo'], 'wsm_type' => 2, 'is_del' => 0])->findOrEmpty();
+        if(empty($wsm)){
+        	$wsm_code = makeNo('WSM');
+            $inwsm = [
+                'wsm_code' => $wsm_code,
+                'name' =>$purchease['supplier_name'],
+                'wsm_type' => 2,
+                'supplierNo' =>$purchease['supplierNo'],
+                'supplierName' => $purchease['supplier_name'],
+                'addr' => '',
+                'addrs_code' => '',
+                'contactor' => $purchease['good_createrid'],
+                'contactor_name' =>$purchease['good_creater'],
+                'mobile' => '',
+                'position' => '',
+                'companyNo' => $purchease['companyNo'],
+                'companyName' => $purchease['companyName'],
+                'status' => 1,
+                'is_del' => 0,
+                'addtime' => date('Y-m-d H:i:s'),
+                'updatetime' => date('Y-m-d H:i:s'),
+                'createrid' => $row->apply_id,
+                'creater' => $row->apply_name,
+                'updaterid' =>  $row->apply_id,
+                'updater' => $row->apply_name,
+            ];
+          $sin= Db::name('warehouse_info')->save($inwsm);
+          if($sin==false) throw new \Exception('采购单对应得仓库创建失败');
+        }else $wsm_code = $wsm['wsm_code'];
+        if($purchease['wsm_code']!=$wsm_code){
+        	 $good_stock= Db::name("good_stock")->where(["spuCode"=>$purchease['spuCode'],
+        	 "wsm_code"=>$purchease['wsm_code']])->findOrEmpty();
+        	 if(empty(($good_stock))) throw new \Exception('商品库存数据未找到');
+        	 $good_stock['wsm_code'] = $wsm_code;
+        	 $goodup =Db::name('good_stock')->save($good_stock);
+        	 if($goodup==false) throw new \Exception('商品库存数据更新失败');
+        	 $purchease['wsm_code'] = $wsm_code;
+        }
+        $purchease['updatetime'] = date("Y-m-d H:i:s");
+        $up=Db::name('purchease_order')->save($purchease);
+        if($up==false) throw new \Exception('采购单数据更新失败');
+        $this->upQrd($purchease);
+        $good=Db::name("good_zixun")->where(["spuCode"=>$purchease['spuCode']])->findOrEmpty();
+        if(empty($good))throw new \Exception('商品数据未找到');
+        $good['supplierNo']=$purchease['supplierNo'];
+        $good['supplierName']=$purchease['supplier_name'];
+        $goodup = Db::name("good_zixun")->save($good);
+        if($goodup ==false) throw new \Exception('商品数据更新失败');
+	}
+	
+	/**
+	* @param $row
+	* @throws \Exception
+	*/
+	public function qrdUpdate($row){
+        $sale =Db::name("sale")->where("orderCode",$row->code)->findOrEmpty();
+        if(empty($sale)) throw new \Exception("销售单数据未找到");
+         $after= json_decode($row->after,true);
+        foreach ($after as $key=>$item){
+        	$sale[$key]=$item;
+        }
+        $sale['updatetime']=date('Y-m-d H:i:s');
+		$saleup=Db::name('sale')->save($sale);
+		if($saleup==false) throw new \Exception('销售单数据更新失败');
+         $outchild =Db::name('order_out_child')->where(['orderCode'=>$sale['orderCode'],'is_del'=>0])->findOrEmpty();
+        
+        if(empty($outchild)==false){
+        	$outChidup=Db::name('order_out_child')->where(['orderCode'=>$sale['orderCode'],'is_del'=>0])->update
+        	([
+        	'customer_code'=>$sale['customer_code'],
+        	'customer_name'=>$sale['customerName'],
+        	'updatetime'=>date('Y-m-d H:i:s')]);
+        	if($outChidup==false) throw new \Exception('发货工单数据更新失败');
+        }
+	}
+	/**
+	* @param $cgd
+	* @throws \think\Exception
+	* @throws \think\db\exception\DbException
+	 */
+	public function upQrd($cgd){
+        $qrd = Db::name("sale")->alias("a")
+        ->leftJoin("order_num b","a.orderCode=b.orderCode")
+        ->where("b.cgdNo",$cgd['cgdNo'])
+        ->field("a.*")->findOrEmpty();
+        if(empty($qrd)) throw new \Exception('未找到对应得销售单');
+        $data=["supNo"=>$cgd['supplierNo'],"supName"=>$cgd['supplier_name'],"updatetime"=>date("Y-m-d H:i:s")];
+        $up=Db::name("sale")->where($qrd)->update($data);
+        if($up==false) throw new \Exception('销售单数据更新失败');
+        $out =Db::name("order_out")->where(["orderCode"=>$qrd['orderCode'],"is_del"=>0])->findOrEmpty();
+        if(!empty($out)){
+            $outUp=	Db::name('order_out')->where(['orderCode'=>$qrd['orderCode'],'is_del'=>0])->update
+        	(["wsm_code"=>$cgd['wsm_code'],"updatetime"=>date('Y-m-d H:i:s')]);
+            if($outUp==false) throw new \Exception('发货单数据更新失败');
+        }
+        
+        $outchild =Db::name('order_out_child')->where(['orderCode'=>$qrd['orderCode'],'is_del'=>0])->findOrEmpty();
+        
+        if(!empty($outchild)){
+        	$outChidup=Db::name('order_out_child')->where(['orderCode'=>$qrd['orderCode'],'is_del'=>0])->update
+        	(['wsm_code'=>$cgd['wsm_code'],
+        	"supplierNo"=>$cgd['supplierNo'],
+        	"supplierName"=>$cgd['supplier_name'],
+        	'updatetime'=>date('Y-m-d H:i:s')]);
+        	if($outChidup==false) throw new \Exception('发货工单数据更新失败');
+        }
+	}
+	/**
+	* @param $row
+	 */
+	public function goodUpdate($row){
+        $good = Db::name("good_zixun")->where("spuCode",$row->code)->findOrEmpty();
+        if(empty($good))throw new \Exception('未找到对应得商品数据');
+           $after= json_decode($row->after,true);
+         foreach ($after as $key=>$item){
+        	$good[$key]=$item;
+        }
+         $good['updatetime']=date("Y-m-d H:i:s");
+         $goodup= Db::name('good_zixun')->save($good);
+         if($goodup==false) throw new \Exception('商品数据更新失败');
+         $saleup =Db::name("sale")->where("good_code",$row->code)->update(["updatetime"=>date('Y-m-d H:i:s')]);
+         if($saleup==false) throw new \Exception('商品数据销售单更新失败');
+         $cgdup =Db::name("purchease_order")->where("spuCode",$row->code)->update(["updatetime"=>date('Y-m-d
+         H:i:s')]);
+          if($cgdup==false) throw new \Exception('商品数据采购单更新失败');
+	}
+}

+ 15 - 0
app/admin/model/Good.php

@@ -0,0 +1,15 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\admin\model;
+
+use think\Model;
+
+/**
+ * @mixin \think\Model
+ */
+class Good extends Model
+{
+    protected $createTime='createtime';
+	protected $updateTime='updatetime';
+}

+ 14 - 0
app/admin/model/GoodBasic.php

@@ -0,0 +1,14 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\admin\model;
+
+use think\Model;
+
+/**
+ * @mixin \think\Model
+ */
+class GoodBasic extends Model
+{
+    //
+}

+ 77 - 0
app/admin/model/GoodCombind.php

@@ -0,0 +1,77 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\admin\model;
+
+use think\Model;
+
+/**
+ * @mixin \think\Model
+ */
+class GoodCombind extends Model
+{
+	protected $createTime="createtime";
+	protected $updateTime="updatetime";
+	protected $append=["usable_stock"];
+	  // 定义全局的查询范围
+    protected $globalScope = ['is_del'];
+
+    public function scopeIsDel($query)
+    {
+        $query->where('is_del',0);
+    }
+	public function getUsableStockAttr($v,$row){
+		return (new GoodStock())->withJoin(['wsminfo'] , 'left')
+		                 ->where(['spuCode'=>$row['childCode'] , 'wsm_type'=>[2 , 5]])
+		                 ->sum('usable_stock');
+	}
+	
+	public function  AddStock($spuCode='',$num="0"){
+		$comblist = $this->where(['spuCode'=>$spuCode,'is_del'=>0])->select()->toArray();
+		if(empty($comblist))throw new \Exception("未找到对应子商品信息");
+		$GoodStock=new GoodStock();
+		$returnBn=[];
+		foreach ($comblist as $item){
+			 $row =$GoodStock->withJoin(["wsminfo"],"left")
+            ->field('id,usable_stock')
+            ->where(['spuCode' => $item['childCode'], 'warehouse_info.wsm_type'=>[2,5]])
+            ->findOrEmpty();
+			 if($row->isEmpty()) throw new \Exception('未找到对应子商品信息');
+			 $stocknum =bcmul($num,$item["child_num"]);
+			 $up =GoodStockInfo::StockBnSub($row->id,intval($stocknum));
+			 if(empty($up)) throw new \Exception('未找到对应子商品BN库存信息');
+			$returnBn=array_merge($returnBn,$up);
+		}
+		
+		return $returnBn;
+	}
+	/**
+	* @param string $spuCode
+	* @param string $bnCode
+	* @param string $num
+	* @param string $stockCode  库存变化申请编号
+	* @param int $flag 0 解除库存 1 占用库存驳回
+	 * @return bool
+	* @throws \think\db\exception\DataNotFoundException
+	* @throws \think\db\exception\DbException
+	* @throws \think\db\exception\ModelNotFoundException
+	 */
+	public function subStock($spuCode='',$bnCode='',$num='0',$stockCode=''){
+		$comblist = $this->where(['spuCode'=>$spuCode,'is_del'=>0])->select()->toArray();
+		if(empty($comblist))throw new \Exception('未找到对应子商品信息');
+				$goodinfo = new Good();
+				$combind = new CombindBninfo();
+		foreach ($comblist as $item){
+			 $stocknum =bcmul($num.'',$item['child_num']);
+			 $good = $goodinfo->where(["spuCode"=>$item['childCode']])->findOrEmpty();
+			 if($good->isEmpty()==false){
+			 	$good->usable_stock = bcadd($good->usable_stock,$stocknum);
+			 	$gdup=$good->save();
+			 	if($gdup==false)throw new \Exception('子商品库存更新失败');
+			 }
+			$up=$combind->subBN($spuCode,$bnCode,$item['childCode'],$stocknum,$stockCode);
+			if($up==false)throw new \Exception('子商品库存更新失败');
+		}
+		return true;
+	}
+}

+ 47 - 0
app/admin/model/GoodStock.php

@@ -0,0 +1,47 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\admin\model;
+
+use think\Model;
+
+/**
+ * @mixin \think\Model
+ */
+class GoodStock extends Model
+{
+    protected $createTime="addtime";
+    protected $updateTime="updatetime";
+    
+    public function WsmInfo(){
+    	return $this->belongsTo(WarehouseInfo::class,"wsm_code","wsm_code")->bind(["wsm_name"=>"name","wsm_supplierNo"=>"supplierNo","wsm_supplierName"=>"supplierName"]);
+    }
+    
+    //组合商品占用 库存
+    public function stockSub($spuCode,$num){
+    	 $row =$this->withJoin(['wsminfo'],'left')
+            ->field('good_stock.id,usable_stock')
+            ->where(['spuCode' => $spuCode, 'wsm_type'=>[2,5]])
+            ->where("usable_stock",">",0)
+            ->select();
+		 if($row->isEmpty()) throw new \Exception('未找到对应子商品库存信息');
+		 $usable = array_sum(array_column($row->toArray(),"usable_stock"));
+		 if($usable < $num)throw new \Exception('对应子商品库存数不足');
+		    $returen=[];
+			foreach ($row as $item){
+				if($num<=0) break;
+				if($item->usable_stock >= $num){
+					$temp = $num;
+					$num =0;
+				}else{
+					$temp = $item->usable_stock;
+					$num =bcsub($num,$item->usable_stock);
+				}
+				$bn=GoodStockInfo::StockBnSub($item->id,intval($temp),1);
+				$returen=array_merge($returen,$bn);
+			}
+			
+			return $returen;
+    }
+    
+}

+ 39 - 3
app/admin/model/GoodStockInfo.php

@@ -60,7 +60,7 @@ class GoodStockInfo extends Model
 		if(empty($arr)) throw new Exception("库存批次数量不足",1006);
 		$list=[];
 		foreach ($arr as $item) {
-			$stock = self::name("good_stock")->where(["id"=>$item['stockid']])->field("id,usable_stock,wait_out_stock")->find()->toArray();
+			$stock = self::name("good_stock")->where(["id"=>$item['stockid']])->field("id,usable_stock,wait_out_stock,spuCode")->find()->toArray();
 			if($num<=0) break;
 			$update=[];
 		    if($item['balance_num']<=$num){
@@ -68,13 +68,13 @@ class GoodStockInfo extends Model
 		    	$update['used_num']= $item['used_num']+$item['balance_num'];
 		    	$num-=$item['balance_num'];
 		    	$update['updatetime'] =date("Y-m-d H:i:s");
-		    	$temp=["stockid"=>$item['stockid'],"bnCode"=>$item['bnCode'],"num"=>$item['balance_num'],"origin_price"=>$item["origin_price"]];
+		    	$temp=["stockid"=>$item['stockid'],"bnCode"=>$item['bnCode'],"spuCode"=>$stock['spuCode'],"num"=>$item['balance_num'],"origin_price"=>$item["origin_price"]];
 		    	$stockup=["usable_stock"=>$stock['usable_stock']-$item['balance_num'],"wait_out_stock"=>$stock['wait_out_stock']+$item['balance_num'],"updatetime"=>date("Y-m-d H:i:s")];
 		    }else{
 				$update['balance_num']=$item['balance_num']-$num;
 		    	$update['used_num']=$item['used_num']+$num;
 		    	$update['updatetime'] =date("Y-m-d H:i:s");
-		    	$temp=["stockid"=>$item['stockid'],"bnCode"=>$item['bnCode'],"num"=>$num,"origin_price"=>$item["origin_price"]];
+		    	$temp=["stockid"=>$item['stockid'],"bnCode"=>$item['bnCode'],"spuCode"=>$stock['spuCode'],"num"=>$num,"origin_price"=>$item["origin_price"]];
 		    	$stockup=["usable_stock"=>$stock['usable_stock']-$num,"wait_out_stock"=>$stock['wait_out_stock']+$num,"updatetime"=>date("Y-m-d H:i:s")];
 				$num=0;
 		    }
@@ -301,4 +301,40 @@ class GoodStockInfo extends Model
 		}
 		return true;
 	}
+	
+	
+	public static function StockBnSub($stockid,$num,$add=0){
+		$arr = self::where([['balance_num','>',0]])->where(['stockid'=>$stockid])->select()->toArray();
+		if(empty($arr)) throw new Exception('库存批次数量不足',1006);
+		$list=[];
+		foreach ($arr as $item) {
+			$stock = self::name('good_stock')->where(['id'=>$item['stockid']])->field('id,usable_stock,wait_out_stock,spuCode')->find()->toArray();
+			if($num<=0) break;
+			$update=[];
+		    if($item['balance_num']<=$num){
+		    	$update['balance_num'] =0;
+		    	$update['used_num']= $item['used_num']+$item['balance_num'];
+		    	$num-=$item['balance_num'];
+		    	$update['updatetime'] =date('Y-m-d H:i:s');
+		    	$temp=['stockid'=>$item['stockid'],'bnCode'=>$item['bnCode'],'spuCode'=>$stock['spuCode'],'num'=>$item['balance_num'],'origin_price'=>$item['origin_price']];
+		    	$stockup=['usable_stock'=>$stock['usable_stock']-$item['balance_num'],'updatetime'=>date('Y-m-d H:i:s')];
+		    }else{
+				$update['balance_num']=$item['balance_num']-$num;
+		    	$update['used_num']=$item['used_num']+$num;
+		    	$update['updatetime'] =date('Y-m-d H:i:s');
+		    	$temp=['stockid'=>$item['stockid'],'bnCode'=>$item['bnCode'],'spuCode'=>$stock['spuCode'],'num'=>$num,'origin_price'=>$item['origin_price']];
+		    	$stockup=['usable_stock'=>$stock['usable_stock']-$num,'updatetime'=>date('Y-m-d H:i:s')];
+				$num=0;
+		    }
+			$up=self::update($update,$item);
+		    if($up==false)  throw new Exception('库存批次库存更新失败',1006);
+		    if($add==1){
+			     $stup=self::name('good_stock')->where($stock)->update($stockup);
+			    if($stup==false)  throw new Exception('库存更新失败',1006);
+		    }
+
+		    $list[]=$temp;
+		}
+		return $list;
+	}
 }

+ 1 - 0
app/admin/model/OrderOutChild.php

@@ -21,6 +21,7 @@ class OrderOutChild extends Model
         if ($outCode == '') throw new \Exception("工单发货单单号不能为空");
         $out = self::name("order_out")->where(["outCode" => $outCode, "is_del" => 0])->findOrEmpty();
         if ($out->isEmpty()) throw new \Exception("发货单信息未找到");
+        if($out['send_num']<=0) throw new \Exception("发货单{$outCode}发货数量不能小于1");
         if ($out['send_status'] != 1) throw new \Exception("发货单拆单状态有误");
         $sale = self::name("sale")->where(["orderCode" => $out['orderCode'], "is_del" => 0])->findOrEmpty();
         if ($sale->isEmpty()) throw new \Exception("订单信息未找到");

+ 14 - 0
app/admin/model/WarehouseInfo.php

@@ -0,0 +1,14 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\admin\model;
+
+use think\Model;
+
+/**
+ * @mixin \think\Model
+ */
+class WarehouseInfo extends Model
+{
+    //
+}

+ 11 - 0
app/admin/route/app.php

@@ -844,4 +844,15 @@ route::rule('channeldel', 'admin/Channel/delete');//渠道新建
 route::rule('channelcatlist', 'admin/Channel/channelCatList');//渠道新建
 route::rule('channelcatsave', 'admin/Channel/channleCatSave');//渠道新建
 
+route::rule("combindlist","admin/CombindStock/list");
+route::rule("combindadd","admin/CombindStock/create");
+route::rule("combindinfo","admin/CombindStock/info");
+route::rule("combindstatus","admin/CombindStock/status");
+
+route::rule('dachangelist','admin/DataChange/list');
+route::rule('dachangeadd','admin/DataChange/create');
+route::rule('dachangeinfo','admin/DataChange/info');
+route::rule('dachangestatus','admin/DataChange/status');
+
+
 

+ 1 - 1
app/command/handleYzOrderData.php

@@ -440,7 +440,7 @@ class handleYzOrderData extends Command
 
                 //回调更新有赞订单数据
                 $callback_rs = $this->callbackYz(['status' => 6, 'id' => $c_data['id'], 'orderCode' => $orderCode]);
-                if ($callback_rs['code'] != 0) throw new Exception($callback_rs['message']);
+                if ($callback_rs['code'] != 0) throw new \Exception($callback_rs['message']);
 
                 //将采购单数据塞入到队列中
                 if ($this->cgd_data) {