| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 | <?phpnamespace app\common\model;use think\Db;use EasyWeChat\Factory;class WxCash extends Base{    public $status = [        0=> '退款处理中',        1=> '退款成功',        2=> '退款拒绝',    ];    public function lists($page,$size,$userId,$orgId,$status){        if($status>0){            if($status==1){                $map[]=['status','=',0];            }elseif ($status==2){                $map[]=['status','=',1];            }elseif ($status==3){                $map[]=['status','=',2];            }elseif ($status==4){                $map[]=['status','in',[5,6,7]];            }        }        $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){            $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[$k]['label_name'] = $vv['label']>0?Db::name('wx_goods_label')                    ->where('id',$vv['label'])                    ->value('title'):"";            }            $ret[$k]['total_num']=$nums;            $ret[$k]['goods_num']=count($orderGoods);            $ret[$k]['order_goods']=$orderGoods;        }        return $ret?$ret:[];    }    public function details($ordersId){        $ret = Db::name('g_orders')->where('id', $ordersId)->find();        $ret['goods'] = Db::name('g_order_goods')            ->alias('og')            ->field('og.nums,og.price,og.goods_id,g.title,g.img')            ->join('g_goods g', 'g.id=og.goods_id')            ->where('og.order_id', $ret['id'])            ->select();        $rd = Db::name('g_order_refund')            ->where('order_id', $ret['id'])            ->find();        if(empty($rd)){            $rd = [                'sn'=>'',                'order_id'=>'',                'money'=>'',                'remark'=>'',                'refund_money'=>'',                'refund_remark'=>'',            ];        }        $ret['refund'] = $rd;        $nums=0;        foreach ($ret['goods'] as $k=>$v){            $nums+=$v['nums'];        }        $ret['sum']=$nums;        if($ret['status']==1 && time() < (strtotime($ret['create_time'])+(30*24*3600))){            $ret['tk'] = 1;        }else{            $ret['tk'] = 0;        }        $s = [            '未支付',            '已支付',            '已完成',            '已取消',            '已退款',            '退款拒绝',            '退款中',        ];        $ret['statusTxt']=isset($s[$ret['status']])?$s[$ret['status']]:'';        return $ret;    }    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){        $data = [            'money' => input('money/f',0),            'order_id' => input('id/d',0),            'user_id' => $userId,            'remark' => input('remark','','trim'),            'create_time' => date('Y-m-d H:i:s'),        ];        if($data['money'] <= 0){            $this->error = '金额必须大于0';            return false;        }        $pay = Db::name('g_orders')            ->where('id',$data['order_id'])->find();        if(!$pay||$pay['status'] != 1){            $this->error = '订单不存在';            return false;        }        $data['sn'] = get_unique_id('TPH');        $data['org_id'] = $pay['org_id'];        if($data['money'] > $pay['amount']){            $this->error = '退款金额过大';            return false;        }        Db::startTrans();        try{            $ret = Db::name('g_order_refund')->insert($data);            if(!$ret){                \exception('操作失败');            }            $order = Db::name('g_orders')                ->where('id',$pay['id'])                ->lock(true)                ->find();            if(!$order){                \exception('订单不存在');            }            $ret = Db::name('g_orders')                ->where('id',$pay['id'])->update([                    'refund_money' => $data['money'],                    'status' => 4                ]);            if(!$ret){                \exception('操作失败');            }            $config = config('app.wx_mini_config');            $app = \EasyWeChat\Factory::payment($config);            $ret = $app->refund->byOutTradeNumber($pay['order_sn'], $data['sn'], $pay['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 = [];        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'];            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,            'isWater'=>$isWater,            'remark'=>$remark?implode(';',$remark):"",            'cash_price'=>sprintf("%01.2f", $cash_price),            'total'=>sprintf("%01.2f", $total),        ];        return $data;    }}
 |