wugg 4 months ago
parent
commit
aa0d895c2b
4 changed files with 177 additions and 14 deletions
  1. 34 11
      app/cxinv/controller/Trade.php
  2. 2 2
      app/cxinv/model/Assoc.php
  3. 4 0
      app/cxinv/model/Trade.php
  4. 137 1
      app/cxinv/model/TradePool.php

+ 34 - 11
app/cxinv/controller/Trade.php

@@ -13,6 +13,7 @@ use think\facade\Validate;
 use think\helper\Str;
 class Trade extends Base{
     public function __construct(App $app) {
+        $this->noLogin=["*"];
         parent::__construct($app);
         $this->model = new \app\cxinv\model\Trade();
     }
@@ -103,6 +104,7 @@ class Trade extends Base{
         $log = TradePool::where(["logNo"=>$params['logNo'],"is_del"=>0])->findOrEmpty();
         if($log->isEmpty()) return error("资金认领信息不存在");
         if($log->status==$params['status']) return error("当前状态与修改状态一致");
+        if($log->tag_type==1) return error('平台衍生资金认领不允许操作');
         $trade = $this->model->where(["tradNo"=>$log->tradNo,"is_del"=>0])->findOrEmpty();
         if($trade->isEmpty()) return error("资金流水信息不存在");
         $this->model->startTrans();
@@ -112,7 +114,7 @@ class Trade extends Base{
             $save=$log->save();
             if(!$save) throw new \Exception("资金认领状态更新失败");
             Assoc::CheckTrad($log->logNo,$params['status']);
-            if($params['status']==3){
+            if($params['status']==3|| $params['status']==5){
                 if($trade->used_fee<$log->total_fee) throw new \Exception("资金流水已使用金额不足");
                 $trade->balance+=$log->total_fee;
                 $trade->used_fee-=$log->total_fee;
@@ -130,7 +132,7 @@ class Trade extends Base{
 
     public function list(){
         $params = $this->request->param(["tradNo"=>"","status"=>[],"name"=>"","bank"=>"","start"=>"","end"=>"","companyNo"=>"",'poCode'=>'',
-        "page"=>1,"size"=>20,'used_lower'=>"",'used_upper'=>'','total_lower'=>'','total_upper'=>'',"relaComNo"=>""],"post","trim");
+        "page"=>1,"size"=>20,'used_lower'=>"",'used_upper'=>'','total_lower'=>'','total_upper'=>'',"relaComNo"=>"","trade_type"=>""],"post","trim");
         $where=[["is_del","=",0]];
         if($params['tradNo']!=="")$where[]=["tradNo","like","%".$params['tradNo']."%"];
         if(!empty($params['status']))$where[]=["status","in",$params['status']];
@@ -145,7 +147,8 @@ class Trade extends Base{
         if($params['total_lower']!=="") $where[]=["total_fee",">=",$params['total_lower']];
         if($params['total_upper']!=="") $where[]=["total_fee","<=",$params['total_upper']];
         if($params['poCode']!=="") $where[]=["poCode","like","%".$params['poCode']."%"];
-        $list = $this->model->with(["company"])->where($where)->order("id desc")->paginate(["list_rows"=>$params['size'],"page"=>$params['page']]);
+        if($params['trade_type']!=="") $where[]=["trade_type","=",$params['trade_type']];
+        $list = $this->model->with(["company",'Lib'])->withJoin("Lib","left")->where($where)->order("id desc")->paginate(["list_rows"=>$params['size'],"page"=>$params['page']]);
         return success("成功",['list'=>$list->items(),'count'=>$list->total()]);
     }
 
@@ -170,7 +173,8 @@ class Trade extends Base{
 
     public function PoolList(){
         $params=$this->request->param(["logNo"=>"","status"=>"","name"=>"","bank"=>"","start"=>"","end"=>"","companyNo"=>"",
-        "page"=>1,"size"=>20,'apply_id'=>"",'orderCode'=>'','platform_type'=>'',"relaComNo"=>"",'cxCode'=>''],"post","trim");
+        "page"=>1,"size"=>20,'apply_id'=>"",'orderCode'=>'','platform_type'=>'',"relaComNo"=>"",'cxCode'=>'',"pcCode"=>"",
+        "trade_type"=>"","tag_type"=>""],"post","trim");
         $where=[["a.is_del","=",0],["b.is_del","=",0]];
         if($params['logNo']!=="")$where[]=["a.logNo","like","%".$params['logNo']."%"];
         if($params['apply_id']!=="")$where[]=["a.apply_id","like","%".$params['apply_id']."%"];
@@ -184,15 +188,31 @@ class Trade extends Base{
         if($params['companyNo']!=="")$where[]=["a.companyNo","like","%".$params['companyNo']."%"];
         if($params['relaComNo']!=="")$where[]=["a.companyNo","like","%".$params['relaComNo']."%"];
         if($params['cxCode']!=="")$where[]=["c.cxCode","like","%".$params['cxCode']."%"];
+         $pcData=['totalPrice'=>0,'usedPrice'=>0,'balancePrce'=>0,'tradPrice'=>0];// 统计数据
+
+        if($params['pcCode']!==""){
+            $where[]=['e.pcCode','like','%'.$params['pcCode'].'%'];
+            $pc= $this->model->with(["lib"])->withJoin("Lib","left")->where('pcCode',$params['pcCode'])
+            ->select();
+            if(!$pc->isEmpty()){
+                $pcData['totalPrice'] = array_sum(array_column($pc->toArray(),"total_fee"));
+                $pcData["usedPrice"]= TradePool::where(["tradNo"=>array_column($pc->toArray(),'tradNo'),"status"=>2,"is_del"=>0,'tag_type'=>0])->sum("total_fee");
+                $pcData['tradPrice']= TradePool::where(['tradNo'=>array_column($pc->toArray(),'tradNo'),'status'=>1,'is_del'=>0,'tag_type'=>0])->sum('total_fee');
+                $pcData["balancePrce"] = array_sum(array_column($pc->toArray(),'balance'));
+            }
+        }
+        if($params['trade_type']!=="") $where[]=["b.trade_type","=",$params['trade_type']];
+        if($params['tag_type']!=="") $where[]=["a.tag_type","=",$params['tag_type']];
         $list = TradePool::alias("a")
+        ->leftjoin('trade_lib e','a.tradNo=e.tradNo')
         ->leftJoin('trade b','a.tradNo=b.tradNo')
         ->leftJoin('assoc d','a.logNo=d.viceCode AND d.type = 2')
         ->leftJoin('qrd_info c','d.orderCode=c.sequenceNo')
         ->where($where)
         ->field('a.*,b.trade_bank,b.trade_account,b.trade_out,b.total_fee as btotal_fee,b.used_fee,b.balance,c.customerName,c.customerNo,
-           d.orderCode,c.qrdSource,c.cxCode,c.goodNo,c.goodName,c.qrdType,c.ownerName,c.ownerid,c.department,c.poCode,c.platName,c.totalPrice,d.cancel_fee')
-        ->order("a.id desc")->paginate(["list_rows"=>$params['size'],"page"=>$params['page']]);
-        return success("成功",['list'=>$list->items(),'count'=>$list->total()]);
+           d.orderCode,c.qrdSource,c.cxCode,c.goodNo,c.goodName,c.qrdType,c.ownerName,c.ownerid,c.department,c.poCode,c.platName,c.totalPrice,d.cancel_fee,
+           e.pcCode,e.palt_po')->order("a.id desc")->paginate(["list_rows"=>$params['size'],"page"=>$params['page']]);
+        return success("成功",['list'=>$list->items(),'count'=>$list->total(),"pcData"=>$pcData]);
     }
 
     public function PoolQuery(){
@@ -205,14 +225,16 @@ class Trade extends Base{
         if($params['companyNo']!=="")$where[]=["companyNo","like","%".$params['companyNo']."%"];
         if($params['relaComNo']!=="")$where[]=["companyNo","like","%".$params['relaComNo']."%"];
         if($params['platform_type']!=="") $where[]=["platform_type","=",$params['platform_type']];
-        $list = TradePool::where($where)->order("id desc")->select();
+        $list = TradePool::with(["Lib"])->where($where)->order("id desc")->select();
         return success("成功",$list);
     }
 
     public function PoolInfo(){
         $logNo = $this->request->post("logNo","","trim");
         if($logNo=="") return error("参数错误");
-        $info = TradePool::with(["trade"=>"company"])->where(["logNo"=>$logNo,"is_del"=>0])->findOrEmpty();
+        $info = TradePool::with(["Trade"=>["company"],"Lib"])
+        ->where(["logNo"=>$logNo,"is_del"=>0])
+        ->findOrEmpty();
         if($info->isEmpty()) return error("资金认领信息不存在");
         $info['orderinfo']= Assoc::alias("a")
         ->leftJoin('qrd_info b','a.orderCode=b.sequenceNo')
@@ -271,6 +293,7 @@ class Trade extends Base{
         $info = TradePool::where(["logNo"=>$params['logNo'],"is_del"=>0])->findOrEmpty();
         if($info->isEmpty()) return error("资金认领信息不存在");
         if($info->status!=2) return error("资金认领当前状态不允许退回");
+        if($info->tag_type==1) return error("平台衍生资金认领不允许退回");
         $isT = TradeReturn::where(["logNo"=>$params['logNo'],"status"=>[0,1]])->findOrEmpty();
         if(!$isT->isEmpty()) return error("当前资金认领已申请退款,请勿重复申请");
         $data = [
@@ -316,7 +339,7 @@ class Trade extends Base{
     public function BackInfo(){
         $returnCode = $this->request->post("returnCode","","trim");
         if($returnCode=="") return error("参数错误");
-        $info = TradeReturn::with(["trade"=>"company","pool"])->where(["returnCode"=>$returnCode,"is_del"=>0])->findOrEmpty();
+        $info = TradeReturn::with(["trade"=>["company"],"pool"])->where(["returnCode"=>$returnCode,"is_del"=>0])->findOrEmpty();
         if($info->isEmpty()) return error("退款申请数据未找到");
          $info['log_total_fee']= $info->pool->total_fee;
          $info['log_apply_id']= $info->pool->apply_id;
@@ -350,7 +373,7 @@ class Trade extends Base{
            $save=$info->save();
            if ($save===false) throw new \Exception("操作失败");
            if($params['status']==1){
-               $loginfo->status= $info->type==1?5:4;
+               $loginfo->status= 4;
                $logsave=$loginfo->save();
                if ($logsave===false) throw new \Exception("操作失败");
                Assoc::CheckTrad($info['logNo'],$loginfo->status);

+ 2 - 2
app/cxinv/model/Assoc.php

@@ -31,8 +31,8 @@ class Assoc extends Base
         if($Ascc->isEmpty()) throw new \Exception("资金{$logNo}关联订单不存在");
         $Ascc->each(function($item) use($status){
             if($status==2) self::CheckFinsh($item);
-            if($status==3) self::CheckBack($item);
-            if($status==4||$status==5) self::CheckRefund($item);
+            if($status==3||$status==5) self::CheckBack($item);
+            if($status==4) self::CheckRefund($item);
         });
     }
     # 核销金额 付款完成

+ 4 - 0
app/cxinv/model/Trade.php

@@ -36,4 +36,8 @@ use app\user\model\Business;class Trade extends Base
     public function company(){
         return $this->belongsTo(Business::class,'companyNo','companyNo')->bind(["companyName"=>"company"]);
     }
+
+    public function Lib(){
+       return $this->belongsTo(TradeLib::class,'tradNo','tradNo')->bind(["palt_po","skuCode","goodName","goodNum","platPrice","plat_total","tax","cat_code","cat_name","comPrice","com_total","pcCode"]);
+    }
 }

+ 137 - 1
app/cxinv/model/TradePool.php

@@ -1,6 +1,7 @@
 <?php
 namespace app\cxinv\model;
 
+use think\Model;
 class TradePool extends Base
 {
 //设置字段信息
@@ -28,6 +29,141 @@ class TradePool extends Base
     
     public function Trade(){
         return $this->belongsTo(Trade::class,"tradNo","tradNo")
-        ->bind(["trade_out","trade_in","trade_bank","companyName","companyNo","customerName","customerNo","total_fee","balance","used_fee","poCode","NdCode"]);
+        ->bind(["trade_out","trade_in","trade_bank","companyName","pcompanyNo"=>"companyNo","customerName","pcustomerNo"=>"customerNo","ptotal_fee"=>"total_fee","trade_type","balance","used_fee","poCode","NdCode"]);
     }
+    public function Lib(){
+        return $this->belongsTo(TradeLib::class,"tradNo","tradNo")->bind(['palt_po','skuCode','goodName','goodNum','platPrice','plat_total','tax','cat_code','cat_name','comPrice','com_total','pcCode']);
+    }
+
+    public static function onAfterInsert(Model $model) : void{
+        if($model->status==2 && $model->tag_type==0){
+             self::makeChangeOrder($model->logNo,2);
+        }
+    }
+    public static function onAfterUpdate(Model $model) : void{
+        $changedData = $model->getChangedData();
+        if(isset($changedData['status'])&& $model->tag_type==0){
+            self::makeChangeOrder($model->logNo,$changedData['status']);
+        }
+    }
+        //修改衍生数据
+
+    public static function makeChangeOrder($logNo,$status){
+        $info = self::with(["Trade","Lib"])->where("logNo",$logNo)->findOrEmpty();
+        if($info->isEmpty()) throw new \Exception("数据不存在");
+        if($info->trade_type==0) return;
+        switch ($status){
+            case 2:
+               self::createTrade($info);
+               break;
+            case 4:
+                self::returnTrade($info);
+               break;
+            default:
+               throw new \Exception("状态错误");
+        }
+
+    }
+
+    public static function createTrade($info){
+          $assoc = Assoc::alias('a')
+          ->leftJoin('qrd_info b','a.orderCode = b.sequenceNo')
+          ->where('a.viceCode',$info->logNo)
+          ->where(['a.status'=>2,'a.is_del'=>0])
+          ->where('b.cxCode','<>','')
+          ->field('a.cancel_fee,b.order_total,b.sequenceNo,b.cxCode')
+          ->select();
+        if($assoc->isEmpty()) throw new \Exception('数据不存在');
+        $qrdArr = QrdInfo::where(['cxCode'=>array_column($assoc->toArray(),'cxCode'),'is_comon'=>1,'is_del'=>0])
+        ->column('totalPrice,wpay_fee,apay_fee,platform_type,companyNo,customerNo,sequenceNo,id','cxCode');
+        $assoc=[];
+        $log=[];
+        foreach ($assoc->toArray() as $k=>$v){
+            $orderLv= bcdiv($v['cancel_fee'],$v['order_total'],6);
+            if(!isset($qrdArr[$v['cxCode']])) throw new \Exception("{$v['sequenceNo']}关联通用订单数据不存在");
+             $trade_fee= bcmul($qrdArr[$v['cxCode']]['totalPrice'],$orderLv,2);
+             $temp=['logNo' => makeNo('TRC',str_pad($k+1,4,'0',STR_PAD_LEFT)),
+                     'tradNo' => $info->tradNo,
+                     'platform_type' => $qrdArr[$v['cxCode']]['platform_type'],
+                     'companyNo' => $qrdArr[$v['cxCode']]['companyNo'],
+                     'customerNo' => $qrdArr[$v['cxCode']]['customerNo'],
+                     'apply_id' =>0,
+                     'apply_name' => 'system',
+                     'trade_time' =>  $info->trade_time,
+                     'total_fee' => $trade_fee,
+                     "tag_type"=>1,//1平台衍生
+                     'relaNo' => $info->logNo,
+                     'status' => 2,//2审核通过
+                     ];
+             $Assoc[]=[
+                'assocNo' =>makeNo('AS',str_pad($k+1,4,'0',STR_PAD_LEFT)),
+                'apply_id' =>0,
+                'apply_name' =>'system',
+                'type' => 2,
+                'orderCode' => $qrdArr[$v['cxCode']]['sequenceNo'],
+                'customerNo' => $qrdArr[$v['cxCode']]['customerNo'],
+                'viceCode' => $temp['logNo'],
+                'order_total' =>$qrdArr[$v['cxCode']]['totalPrice'],
+                'vice_total' => $info->plat_total,
+                'cancel_fee' =>$trade_fee,
+                'status' => 2,//认领通过
+             ];
+             $log[]=$temp;
+             if($qrdArr[$v['cxCode']]['wpay_fee']<$trade_fee) throw new \Exception("{$qrdArr[$v['cxCode']]['sequenceNo']}待支付支付金额不足");
+             $qrdArr[$v['cxCode']]['wpay_fee']-= $trade_fee;
+             $qrdArr[$v['cxCode']]['apay_fee']+= $trade_fee;
+             $qrdArr[$v['cxCode']]['pay_status']= ($qrdArr[$v['cxCode']]['wpay_fee']==0 &&$qrdArr[$v['cxCode']]['pay_fee']==0) ?3:2;
+             $qrdArr[$v['cxCode']]['status']=1;
+        }
+           $qrdArr = array_values($qrdArr);
+           $up= (new QrdInfo)->saveAll($qrdArr);
+           if(!$up) throw new \Exception('通用订单数据修改失败');
+           $up= (new Assoc)->saveAll($Assoc);
+           if(!$up) throw new \Exception('关联数据创建失败');
+           $up= (new TradePool)->saveAll($log);
+           if(!$up) throw new \Exception('衍生数据创建失败');
+    }
+
+    public static function returnTrade($info){
+        $return = TradeReturn::where(["logNo"=>$info->logNo,"status"=>2])->findOrEmpty();
+        if($return->isEmpty()) throw new \Exception("{$info->logNo}退款记录未找到");
+        $trade = self::where(["relaNo"=>$info->logNo,"tag_type"=>1,"status"=>2,"tradNo"=>$info->tradNo,"is_del"=>0])->select();
+        if($trade->isEmpty()) throw new \Exception("未找到关联资金数据");
+        $assoc = Assoc::alias('a')
+          ->leftJoin('qrd_info b','a.orderCode = b.sequenceNo')
+          ->whereIn('a.viceCode',array_column($trade->toArray(),"logNo"))
+          ->where(['a.status'=>2,'a.is_del'=>0])
+          ->where('b.cxCode','<>','')
+          ->field('a.cancel_fee,a.orderCode,a.viceCode,a.id,a.status')
+          ->select();
+        if($assoc->isEmpty()) throw new \Exception('关联通用订单数据不存在');
+        $qrdArr = QrdInfo::where(['sequenceNo'=>array_column($assoc->toArray(),'orderCode'),'is_comon'=>1,'is_del'=>0])
+                ->column('totalPrice,wpay_fee,pay_fee,apay_fee,inv_status,platform_type,companyNo,customerNo,sequenceNo,id','sequenceNo');
+        if(empty($qrdArr)) throw new \Exception('通用订单数据不存在');
+        foreach ($assoc->toArray() as $k=>&$v){
+            if(!isset($qrdArr[$v['orderCode']])) throw new \Exception("{$v['sequenceNo']}关联通用订单数据不存在");
+            Assoc::CheckTrad($v->viceCode,4);
+        }
+        $returns=[];
+        foreach ($trade as $k=>$v){
+            $v->status = 3;
+           $up= $v->save();
+           if(!$up) throw new \Exception('资金数据修改失败');
+            $returns[]=[ 'returnCode'=>makeNo('RTA',str_pad($k+1,4,'0',STR_PAD_LEFT)),
+            'logNo'=>$v->logNo,
+            'companyNo'=>$v->companyNo,
+            'tradNo'=>$v->tradNo,
+            'return_img'=>'',
+            'type'=>2,
+            'apply_id'=>"0",
+            'apply_name'=>"system",
+            'return_reason'=>$return->return_reason,
+            'remark'=>$return->remark,
+            'status'=>2];
+        }
+
+        $up= (new TradeReturn)->saveAll($returns);
+        if(!$up) throw new \Exception('退款记录创建失败');
+    }
+
 }