|
@@ -0,0 +1,971 @@
|
|
|
+<?php
|
|
|
+namespace 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;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|