| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971 | <?phpnamespace app\common\model;use app\hander\HelpHander;use think\Db;use EasyWeChat\Factory;use think\Exception;class WxOrders extends Base{    public $status = [        '未支付',        '已支付',        '已发货',        '已完成',        '已取消',        '已评价',    ];    public $rStatus = [        '退款处理中',        '退款成功',        '退款拒绝',    ];    public function add($cartId,$addressId,$userId,$orgId,$type,$goodsId,$isHasBarrel,$deliveryDate,$deliveryType,$orderRemark,$payType,$num){        $addressInfo=Db::name('shop_address')->where('id',$addressId)->find();        if(!$addressInfo){            $this->error = "未选择地址";            return false;        }        $ids = [];        if($type==0){            if(empty($goodsId) || empty($num)){                $this->error ='参数错误';            }            $ids[] = ['id'=>$goodsId,'num'=>$num];        }else if($type==1){            if(empty($cartId)){                $this->error='参数错误';            }            $gId = Db::name('wx_goods_cart')                ->alias('a')                ->join('wx_goods b','a.goods_id=b.id')                ->where('a.id','in',explode(',',$cartId))                ->where('a.user_id',$userId)                ->where('b.del',0)                ->where('b.org_id',$orgId)                ->group('a.goods_id')                ->select();            foreach ($gId as $k=>$v){                $ids[] = [                    'id'=>$v['goods_id'],                    'num'=>$v['nums'],                ];            }        }        $data =$this->formatOrder($ids);        Db::startTrans();        try {            $params=[                'order_sn'=>get_unique_id(),                'org_id'=>$orgId,                'user_id'=>$userId,                'amount'=>$data['total'],                'status'=>0,                'create_time'=>date('Y-m-d H:i:s'),                'name'=>$addressInfo['name'],                'phone'=>$addressInfo['phone'],                'address'=>$addressInfo['content'],                'pay_type'=>$payType,                'order_remark'=>$orderRemark,                'delivery_date'=>$deliveryDate,                'delivery_type'=>$deliveryType,                'cash_price'=>$isHasBarrel==1?$data['cash_price']:0,                'is_has_barrel'=>$isHasBarrel,                'remark'=>$isHasBarrel==1?$data['remark']:"",                'order_type'=>$data['isWater'],                'create_yyyy'=>date('Y'),                'create_yyyymm'=>date('Ym'),                'create_yyyymmdd'=>date('Ymd'),                'create_yyyymmddhh'=>date('YmdH'),            ];            $addOrder=Db::name('wx_orders')->insertGetId($params);            if(!$addOrder){                exception('操作失败');            }            foreach ($data['list'] as $kay=>$val){                $gdata=[                    'order_id'=>$addOrder,                    'goods_id'=>$val['goods_id'],                    'nums'=>$val['num'],                    'price'=>$val['price'],                ];                $addOrderGoods=Db::name('wx_orders_goods')->insert($gdata);                if(!$addOrderGoods){                    exception('操作失败');                }//                 //减少库存//                 $dec= Db::name('wx_goods')//                    ->where('id',$val['goods_id'])//                    ->dec('stock', $val['num'])//                    ->update();//                if(!$dec){//                    exception('操作失败');//                }            }            //删除用户购物车信息            if($type==1){                $delCart=Db::name('wx_goods_cart')                    ->where('user_id',$userId)                    ->whereIn('id',explode(',',$cartId))->delete();                if(!$delCart){                    exception('操作失败');                }            }            Db::commit();            return $addOrder;        } catch (\Exception $e) {            // 回滚事务            $this->error = $e->getMessage();            Db::rollback();            return false;        }    }    public function lists($page,$size,$userId,$orgId,$status){        if($status>0){            if($status==1){                $map[]=['status','=',0];            }elseif ($status==2){                $ids = Db::name('wx_orders_refund')                    ->where('org_id',$orgId)                    ->where('user_id',$userId)                    ->where('del',0)                    ->column('order_id');                foreach ($ids as $k=>$v){                    $r = $this->checkOrderSend($v);                    if($r==2){//全部退款                        unset($ids[$k]);                    }                }                if(!empty($ids)){                    $map[]=['id','not in',$ids];                }                $map[]=['status','=',1];            }elseif ($status==3){                $map[]=['status','=',2];            }elseif ($status==4){                $ids = Db::name('wx_orders_refund')                    ->where('org_id',$orgId)                    ->where('user_id',$userId)                    ->where('del',0)                    ->column('order_id');                if(empty($ids)){                    $map[]=['id','=',-1];                }else{                    $map[]=['id','in',$ids];                }            }        }        $map[]=['user_id','=',$userId];        $map[]=['org_id','=',$orgId];        $map[]=['del','=',0];        $ret=Db::name('wx_orders')            ->field('id,order_sn,status,amount')            ->where($map)            ->order('id','desc')            ->page($page,$size)            ->select();        foreach ($ret as $k=>$v){            $ret[$k]['is_refund'] = $this->haveRefund($v['id']);            $ret[$k]['is_can_refund'] = $this->checkOrderRefund($v['id']);            $orderGoods=Db::name('wx_orders_goods')                ->alias('og')                ->field('og.nums,og.price,og.goods_id,g.title,g.img,g.label')                ->join('wx_goods g','g.id=og.goods_id')                ->where('og.order_id',$v['id'])                ->select();            $nums=0;            foreach ($orderGoods as $kk=>$vv){                $nums+=$vv['nums'];                $orderGoods[$kk]['label_name'] = $vv['label']>0?Db::name('wx_goods_label')                    ->where('id',$vv['label'])                    ->value('title'):"";                $r = $this->checkGoodsRefund1($v['id'],$vv['goods_id']);                $orderGoods[$kk]['is_refund'] =$r['is'];                $orderGoods[$kk]['refund_status_name'] =$r['refund_status_name'];            }            $ret[$k]['total_num']=$nums;            $ret[$k]['goods_num']=count($orderGoods);            $ret[$k]['order_goods']=$orderGoods;            $r  = $this->checkOrderSend($v['id']);            $ret[$k]['refund_status']=$r;            $ret[$k]['refund_name'] = '';            if($r==2){                $ret[$k]['refund_name'] =  '(已退款)';            }elseif ($r==1){                $ret[$k]['refund_name'] =  '(部分退款)';            }elseif ($r==3){                $ret[$k]['refund_name'] =  '(退款中)';            }        }        return $ret?$ret:[];    }    public function details($ordersId){        $ret = Db::name('wx_orders')            ->field('del,del_time,create_yyyy,create_yyyymm,create_yyyymmdd,create_yyyymmddhh',true)            ->where('id',$ordersId)->find();        $ret['pay_time'] =  $ret['pay_time']? $ret['pay_time']:"";        $ret['send_time'] =  $ret['send_time']? $ret['send_time']:"";        $ret['finish_time'] =  $ret['finish_time']? $ret['finish_time']:"";        $ret['cancel_time'] =  $ret['cancel_time']? $ret['cancel_time']:"";        $ret['delivery_date'] =  $ret['delivery_date']? $ret['delivery_date']:"";        $ret['status_name'] =  isset($this->status[$ret['status']])?$this->status[$ret['status']]:'';        $r  = $this->checkOrderSend($ordersId);        if($r==2){            $ret['status_name'] =  $ret['status_name'].'(已退款)';        }elseif ($r==1){            $ret['status_name'] =  $ret['status_name'].'(部分退款)';        }elseif ($r==3){            $ret['status_name'] =  $ret['status_name'].'(退款中)';        }        $ret['refund_status']=$r;        $ret['refund_name'] = '';        if($r==2){            $ret['refund_name'] =  '(已退款)';        }elseif ($r==1){            $ret['refund_name'] =  '(部分退款)';        }elseif ($r==3){            $ret['refund_name'] =  '(退款中)';        }        $ret['pay_type_name'] = $ret['pay_type']==1?'微信支付':'';        $ret['delivery_type_name'] = $ret['delivery_type']==1?'商家配送':'';        $ret['order_type_name'] = $ret['order_type']==1?'普通订单':'桶装水订单';        $ret['goods'] = Db::name('wx_orders_goods')            ->alias('og')            ->field('og.nums as num,og.price,og.goods_id,g.title,g.img,g.label')            ->join('wx_goods g', 'g.id=og.goods_id')            ->where('og.order_id', $ret['id'])            ->select();        $totalNum = 0;        $ret['is_refund'] = $this->haveRefund($ordersId);;        $ret['is_can_refund'] = $this->checkOrderRefund($ordersId);        foreach ($ret['goods'] as $k=>$v){            $ret['goods'][$k]['label_name'] = $v['label']>0?Db::name('wx_goods_label')                ->where('id',$v['label'])                ->value('title'):"";            $r = $this->checkGoodsRefund($ordersId,$v['goods_id']);            $ret['goods'][$k]['is_refund'] =$r['is'];            $ret['goods'][$k]['refund_status_name'] =$r['refund_status_name'];            $totalNum+=$v['num'];        }        $ret['comment'] = Db::name('wx_comment')            ->field('create_yyyy,create_yyyymm,create_yyyymmdd',true)            ->where('order_id',$ordersId)            ->find();        $ret['totalNum'] = $totalNum;        $ret['goodsNum'] = count($ret['goods']);        return $ret;    }    public function haveRefund($id){        $refund = Db::name('wx_orders_refund')            ->where('del',0)            ->where('order_id',$id)            ->find();        return $refund?1:0;    }    public function checkOrderRefund($id){        $goodsList = Db::name('wx_orders_goods')            ->alias('og')            ->field('og.nums as num,og.price,og.goods_id,g.title,g.img,g.label,o.status')            ->join('wx_goods g', 'g.id=og.goods_id')            ->join('wx_orders o', 'og.order_id=o.id')            ->where('og.order_id', $id)            ->select();        $is = 0;        foreach ($goodsList as $k=>$v){            $refund = Db::name('wx_orders_refund')                ->where('order_id',$id)                ->where('del',0)                ->where('goods_id',$v['goods_id'])               // ->where('status','in',[0,1])                ->find();            if(!$refund && in_array($v['status'],[1,2])){                $is=1;            }        }        return $is;    }    public function checkOrderSend($id){        $goodsList = Db::name('wx_orders_goods')            ->alias('og')            ->field('og.nums as num,og.price,og.goods_id,g.title,g.img,g.label,o.status')            ->join('wx_goods g', 'g.id=og.goods_id')            ->join('wx_orders o', 'og.order_id=o.id')            ->where('og.order_id', $id)            ->select();        $is = 0;        $iss= 0;        foreach ($goodsList as $k=>$v){            $refund = Db::name('wx_orders_refund')                ->where('order_id',$id)                ->where('del',0)                ->where('goods_id',$v['goods_id'])                ->where('status','in',[1])                ->find();            if($refund){                $is++;            }            $refund = Db::name('wx_orders_refund')                ->where('order_id',$id)                ->where('del',0)                ->where('goods_id',$v['goods_id'])                ->where('status','in',[0])                ->find();            if($refund){                $iss++;            }        }        $r = 0;//未退款        if($is >0 || $iss >0){            if($is==count($goodsList)){                $r = 2;//全部退款            }elseif ($is < count($goodsList)){                if ($iss >0){                    $r = 3;//退款中                }else{                    $r = 1;//部分退款                }            }        }        return $r;    }    public function checkGoodsRefund1($orderId,$goodsId){        $is = 0;//不显示        $is_name = '';//不显示        $refund = Db::name('wx_orders_refund')            ->where('order_id',$orderId)            ->where('goods_id',$goodsId)            ->where('del',0)            ->where('status','=',1)            ->find();        if($refund){            $is=2;//显示退款成功            $is_name = '退款成功';        }        $refund = Db::name('wx_orders_refund')            ->where('order_id',$orderId)            ->where('goods_id',$goodsId)            ->where('del',0)            ->where('status','=',2)            ->find();        if($refund){            $is=3;//显示退款拒绝            $is_name = '退款拒绝';        }        $refund = Db::name('wx_orders_refund')            ->where('del',0)            ->where('order_id',$orderId)            ->where('goods_id',$goodsId)            ->where('status','=',0)            ->find();        if($refund){            $is=4;//显示审核处理中            $is_name = '退款处理中';        }        return ['is'=>$is,'refund_status_name'=>$is_name];    }    public function checkGoodsRefund($orderId,$goodsId){        $goodsList = Db::name('wx_orders_goods')            ->alias('og')            ->field('og.nums as num,og.price,og.goods_id,g.title,g.img,g.label,o.status')            ->join('wx_goods g', 'g.id=og.goods_id')            ->join('wx_orders o', 'og.order_id=o.id')            ->where('og.order_id', $orderId)            ->where('g.id', $goodsId)            ->find();        $is = 0;//不显示        $is_name = '';//不显示        $refund = Db::name('wx_orders_refund')            ->where('del',0)            ->where('order_id',$orderId)            ->where('goods_id',$goodsId)           // ->where('status','in',[0,1])            ->find();        if(!$refund  && in_array($goodsList['status'],[1,2])){            $is=1;//显示申请退款            $is_name = '申请退款';        }        $refund = Db::name('wx_orders_refund')            ->where('del',0)            ->where('order_id',$orderId)            ->where('goods_id',$goodsId)            ->where('status','=',1)            ->find();        if($refund){            $is=2;//显示退款成功            $is_name = '退款成功';        }        $refund = Db::name('wx_orders_refund')            ->where('del',0)            ->where('order_id',$orderId)            ->where('goods_id',$goodsId)            ->where('status','=',2)            ->find();        if($refund){            $is=3;//显示退款拒绝            $is_name = '退款拒绝';        }        $refund = Db::name('wx_orders_refund')            ->where('del',0)            ->where('order_id',$orderId)            ->where('goods_id',$goodsId)            ->where('status','=',0)            ->find();        if($refund){            $is=4;//显示审核处理中            $is_name = '退款处理中';        }        return ['is'=>$is,'refund_status_name'=>$is_name];    }    public function getRefundGoodsNum($goodsId,$orderId){        $refund = Db::name('wx_orders_refund')            ->where('del',0)            ->where('order_id',$orderId)            ->where('goods_id',$goodsId)           // ->where('status','=',3)            ->sum('num');        return $refund?$refund:0;    }    public function accomplish($ordersId){        $data=[            'status'=>2,            'finish_time'=>date('Y-m-d H:i:s'),        ];        $ret = Db::name('g_orders')->where('id', $ordersId)->update($data);        return $ret;    }    public function refundOrder($userId){        $id = input('id/d',0);        $data = [            'money' => input('money/f',0),            'status' => input('status/d',0),            'remark' => input('remark','','trim'),            'deal_user_id'=>$userId,            'deal_time'=>getTime(),        ];        if($data['money'] <= 0){            $this->error = '金额必须大于0';            return false;        }        $pay = Db::name('wx_orders_refund')            ->where('del',0)            ->where('id',$id)->find();        if(!$pay||$pay['status'] != 0){            $this->error = '申请单不存在';            return false;        }        if(!in_array($data['status'],[1,2])){            $this->error = '参数错误';            return false;        }        $sn = get_unique_id('TPH');        if($data['money'] > $pay['amount']){            $this->error = '退款金额过大';            return false;        }        Db::startTrans();        try{            $order = Db::name('wx_orders_refund')                ->where('del',0)                ->where('id',$pay['id'])                ->lock(true)                ->find();            if(!$order){                \exception('订单不存在');            }            if($data['status']==2){                $data['money'] = 0;            }            $ret = Db::name('wx_orders_refund')                ->where('id',$pay['id'])->update($data);            if(!$ret){                \exception('操作失败');            }            if($data['status']==1){                $orderInfo = Db::name('wx_orders')                    ->where('id',$pay['order_id'])                    ->find();                $r = Db::name('wx_orders')                    ->where('id',$pay['order_id'])                    ->setInc('refund_money',$data['money']);                if(!$r){                    \exception('修改退款金额失败');                }                $config = config('app.wx_mini_config');                $app = \EasyWeChat\Factory::payment($config);                $ret = $app->refund->byOutTradeNumber($orderInfo['order_sn'], $sn, $orderInfo['amount']*100, $data['money']*100);                if($ret['return_code'] != 'SUCCESS' || $ret['result_code'] != 'SUCCESS'){                    trace(json_encode($ret));                    \exception('退款申请提交失败');                }            }            Db::commit();            return true;        }catch (\Exception $e){            Db::rollback();            trace($e->getMessage());            $this->error = $e->getMessage();            return false;        }    }    public function formatOrder($ids){        $list = [];        $total = 0;        $isWater = 0;        $cash_price = 0;        $remark = [];        $totalNum = 0;        foreach ($ids as $k=>$v){            $ret=Db::name('wx_goods')                ->field('price,id as goods_id,title,img,label,barrel_id')                ->where('id','=',$v['id'])                ->find();            $ret['label_name'] = $ret['label']>0?Db::name('wx_goods_label')                ->where('id',$ret['label'])                ->value('title'):"";            $ret['num'] = $v['num'];            $total+=$v['num']*$ret['price'];            $totalNum+=$v['num'];            if($ret['barrel_id'] >0){                $isWater = 1;                $wx_barrel = Db::name('wx_barrel')                    ->where('id',$ret['barrel_id'])                    ->find();                $cash_price+=$wx_barrel['cash_price']*$v['num'];                $remark[] =$ret['title'].'押金:'.$wx_barrel['cash_price']*$v['num'];            }            $list[] = $ret;        }        $data = [            'list'=>$list,            'goodsNum'=>count($list),            'totalNum'=>$totalNum,            'isWater'=>$isWater,            'remark'=>$remark?implode(';',$remark):"",            'cash_price'=>sprintf("%01.2f", $cash_price),            'total'=>sprintf("%01.2f", $total),        ];        return $data;    }    public function buyBarrel($orgId,$userId,$id,$num){        $info = Db::name('wx_barrel')            ->where('id',$id)            ->where('enable',1)            ->where('del',0)            ->find();        if(empty($info)){            HelpHander::error('空桶不存在');        }        $params = [            'sn'=>get_unique_id(),            'user_id'=>$userId,            'barrel_id'=>$id,            'org_id'=>$orgId,            'num'=>$num,            'amount'=>$num*$info['cash_price'],            'create_time'=>getTime()        ];        $res = Db::name('wx_cash_pay_log')            ->insertGetId($params);        return $res;    }    public function refundBarrel($orgId,$userId,$id,$num){        $cash = Db::name('wx_cash')            ->where('id',$id)            ->find();        if($cash['num'] <$num){            HelpHander::error('超出退款数量');        }        Db::startTrans();        try{            $params = [                'sn'=>get_unique_id(),                'user_id'=>$userId,                'barrel_id'=>$cash['barrel_id'],                'org_id'=>$orgId,                'num'=>$num,                'amount'=>$num*$cash['price'],                'create_time'=>getTime(),                'cash_id'=>$id            ];            $res = Db::name('wx_cash')                ->where('id',$cash['id'])                ->setDec('num',$num);            Db::name('wx_cash')                ->where('id',$cash['id'])                ->setDec('amount',$num*$cash['price']);            if(!$res){                \exception('操作失败1');            }            $res = Db::name('wx_cash_refund')                ->insertGetId($params);            Db::commit();            return $res;        }catch (Exception $e){            Db::rollback();            HelpHander::error($e->getMessage());        }    }    public function checkoutApplyRefund($userId,$orgId,$type,$orderId,$goodsId){        if(empty($orderId)){            $this->error='参数错误';            return false;        }        if($type==0 && empty($goodsId)){            $this->error='参数错误';            return false;        }        if($type==0){            $goodsList = Db::name('wx_orders_goods')                ->alias('og')                ->field('og.nums as num,og.price,og.goods_id,g.title,g.img,g.label')                ->join('wx_goods g', 'g.id=og.goods_id')                ->where('og.order_id', $orderId)                ->where('og.goods_id', $goodsId)                ->select();        }else{            $goodsList = Db::name('wx_orders_goods')                ->alias('og')                ->field('og.nums as num,og.price,og.goods_id,g.title,g.img,g.label')                ->join('wx_goods g', 'g.id=og.goods_id')                ->where('og.order_id', $orderId)                ->select();        }        foreach ($goodsList as $k=>$v){            //$rNum = $this->getRefundGoodsNum($v['goods_id'],$orderId);            //$goodsList[$k]['refund_num'] = $v['num']-$rNum;           // $goodsList[$k]['refund_num'] = $v['num'];            $goodsList[$k]['label_name'] = $v['label']>0?Db::name('wx_goods_label')                ->where('id',$v['label'])                ->value('title'):"";            $flag= Db::name('wx_orders_refund')                ->where('del',0)                ->where('goods_id',$v['goods_id'])                ->where('order_id',$orderId)                ->find();            if($flag){                unset($goodsList[$k]);            }        }        return $goodsList;    }    public function checkoutApplyRefund1($orderId,$goodsId){        if(empty($orderId)){            $this->error='参数错误';            return false;        }        if(empty($goodsId)){            $this->error='参数错误';            return false;        }        $goodsList = Db::name('wx_orders_goods')            ->alias('og')            ->field('og.nums as num,og.price,og.goods_id,g.title,g.img,g.label')            ->join('wx_goods g', 'g.id=og.goods_id')            ->where('og.order_id', $orderId)            ->where('og.goods_id', 'in',explode(',',$goodsId))            ->select();        foreach ($goodsList as $k=>$v){            //$rNum = $this->getRefundGoodsNum($v['goods_id'],$orderId);            //$goodsList[$k]['refund_num'] = $v['num']-$rNum;            // $goodsList[$k]['refund_num'] = $v['num'];            $goodsList[$k]['label_name'] = $v['label']>0?Db::name('wx_goods_label')                ->where('id',$v['label'])                ->value('title'):"";            $flag= Db::name('wx_orders_refund')                ->where('del',0)                ->where('goods_id',$v['goods_id'])                ->where('order_id',$orderId)                ->find();            if($flag){                unset($goodsList[$k]);            }        }        return $goodsList;    }    public function addApplyRefund($userId,$orgId,$goodsJson,$orderId,$remark){        if(empty($orderId)){            $this->error='参数错误3';            return false;        }        if(empty($goodsJson)){            $this->error='参数错误2';            return false;        }        $goodsList = json_decode($goodsJson,'true');        if(empty($goodsList)){            $this->error='参数错误1';            return false;        }        if(!$this->checkOrderRefund($orderId)){            $this->error='当前订单不能申请退款';            return false;        }        foreach ($goodsList as $k=>$v){            $flag= Db::name('wx_orders_refund')                ->where('del',0)                ->where('goods_id',$v['id'])                ->where('order_id',$orderId)                ->find();            if(!$flag){                $wx_orders_goods = Db::name('wx_orders_goods')                    ->where('order_id',$orderId)                    ->where('goods_id',$v['id'])                    ->find();                $goodsInfo = Db::name('wx_goods')                    ->where('id',$v['id'])                    ->find();                if(empty($goodsInfo)){                    $this->error='商品不存在';                    return false;                }                if($v['num'] >$wx_orders_goods['nums']){                    $this->error=$goodsInfo['title'].'退款数量超过购买数量';                    return false;                }                $a[] = [                    'sn'=>get_unique_id(),                    'order_id'=>$orderId,                    'goods_id'=>$v['id'],                    'amount'=>$v['num']*$wx_orders_goods['price'],                    'num'=>$v['num'],                    'reason'=>$remark,                    'user_id'=>$userId,                    'org_id'=>$orgId,                    'create_time'=>getTime(),                ];            }        }        if(empty($a)){            $this->error = '没有符合退款条件的商品';            return false;        }        $res =Db::name('wx_orders_refund')            ->insertAll($a);        if(!$res){            $this->error = '操作失败';            return false;        }        $data = [            'orderId'=>$orderId,            'goodsId'=>implode(',',array_column($a,'goods_id')),        ];        return $data;    }    public function orderRefundDetail($orgId,$orderId,$goodsId){        $map = [];        if($goodsId!=''){            $map[] = ['goods_id','in',explode(',',$goodsId)];        }        $list = Db::name('wx_orders_refund')            ->where('del',0)            ->field('order_id,goods_id,status,create_time,num')            ->where('order_id',$orderId)            ->where($map)            ->where('org_id',$orgId)            ->select();        $sn = Db::name('wx_orders')            ->where('id',$orderId)            ->value('order_sn');        foreach ($list  as $k=>&$v){            $goodsInfo = Db::name('wx_orders_goods')                ->alias('og')                ->field('og.price,g.title,g.img')                ->join('wx_goods g', 'g.id=og.goods_id')                ->where('og.order_id', $orderId)                ->where('g.id', $v['goods_id'])                ->find();            $v['price'] = $goodsInfo['price'];            $v['title'] = $goodsInfo['title'];            $v['img'] = $goodsInfo['img'];            $v['statusName'] = $this->rStatus[$v['status']];        }        return ['list'=>$list,'sn'=>$sn];     }    public function goodsRefundDetail($orgId,$orderId,$goodsId){        $v = Db::name('wx_orders_refund')            ->field('deal_user_id,user_id,order_id,goods_id,status,create_time,num,amount,reason,deal_time,money,remark')            ->where('order_id',$orderId)            ->where('goods_id',$goodsId)            ->where('del',0)            ->where('org_id',$orgId)            ->find();        $goodsInfo = Db::name('wx_orders_goods')            ->alias('og')            ->field('og.price,g.title,g.img')            ->join('wx_goods g', 'g.id=og.goods_id')            ->where('og.order_id', $orderId)            ->where('g.id', $goodsId)            ->find();        $v['order_sn'] = Db::name('wx_orders')            ->where('id',$orderId)            ->value('order_sn');        $v['user_name'] = Db::name('wxuser')            ->where('id',$v['user_id'])            ->value('nickname');        $v['deal_user_name'] = Db::name('user')            ->where('id',$v['deal_user_id'])            ->value('real_name');        $v['goods'] = [            'price'=>$goodsInfo['price'],            'title'=>$goodsInfo['title'],            'img'=>$goodsInfo['img'],            'num'=>$v['num'],        ];        $v['statusName'] = $this->rStatus[$v['status']];        $v['deal_time'] =  $v['deal_time']? $v['deal_time']:'';        unset($v['num']);        return $v;     }     public function orderRefund($userId,$orgId){        $params = input('num',[]);        $orderId = input('id/d',0);        $reason = input('reason','');         if(empty($orderId)){             $this->error='参数错误3';             return false;         }         if(empty($params)){             $this->error='参数错误2';             return false;         }         if(!$this->checkOrderRefund($orderId)){             $this->error='当前订单不能申请退款';             return false;         }         $goodsList = [];         foreach ($params as $k=>$v){             $goodsList[] = [                 'id'=>$k,                 'num'=>$v,             ];         }         if(empty($goodsList)){             $this->error='参数错误1';             return false;         }         $total = 0;         foreach ($goodsList as $k=>$v){             $flag= Db::name('wx_orders_refund')                 ->where('del',0)                 ->where('goods_id',$v['id'])                 ->where('order_id',$orderId)                 ->find();             if(!$flag){                 $wx_orders_goods = Db::name('wx_orders_goods')                     ->where('order_id',$orderId)                     ->where('goods_id',$v['id'])                     ->find();                 $goodsInfo = Db::name('wx_goods')                     ->where('id',$v['id'])                     ->find();                 if(empty($goodsInfo)){                     $this->error='商品不存在';                     return false;                 }                 if($v['num'] >$wx_orders_goods['nums']){                     $this->error=$goodsInfo['title'].'退款数量超过购买数量';                     return false;                 }                 $m = $v['num']*$wx_orders_goods['price'];                 $a[] = [                     'sn'=>get_unique_id(),                     'order_id'=>$orderId,                     'goods_id'=>$v['id'],                     'amount'=>$m,                     'num'=>$v['num'],                     'reason'=>$reason,                     'user_id'=>$userId,                     'org_id'=>$orgId,                     'status'=>1,                     'money'=>$m,                     'create_time'=>getTime(),                 ];                 $total+=$m;             }         }         if(empty($a)){             $this->error = '没有符合退款条件的商品';             return false;         }         Db::startTrans();         try{             $res =Db::name('wx_orders_refund')                 ->insertAll($a);             if(!$res){                \exception( '操作失败');             }             $orderInfo = Db::name('wx_orders')                 ->where('id',$orderId)                 ->find();             $r = Db::name('wx_orders')                 ->where('id',$orderId)                 ->setInc('refund_money',$total);             if(!$r){                 \exception('修改退款金额失败');             }             $sn = get_unique_id('TPH');             $config = config('app.wx_mini_config');             $app = \EasyWeChat\Factory::payment($config);             $ret = $app->refund->byOutTradeNumber($orderInfo['order_sn'], $sn, $orderInfo['amount']*100, $total*100);             if($ret['return_code'] != 'SUCCESS' || $ret['result_code'] != 'SUCCESS'){                 trace(json_encode($ret));                 \exception('退款申请提交失败');             }             Db::commit();             return true;         }catch (Exception $e){             Db::rollback();             $this->error = $e->getMessage();             return false;         }     }}
 |