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; } } }