| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 | <?phpnamespace app\common\model;use app\common\util\AppMsg;use app\hander\HelpHander;use think\Db;use think\Exception;use think\Log;use tools\Hwsms;class PhOrderPay extends Base{    // 用户生成支付单    public function addSave($userId,$orgId,$orderId,$money,$busType=0){        $data = [            'sn' => get_unique_id('PH'),            'order_id' => $orderId,            'money' => $money,            'type' => 2,            'cate' => 1,            'status' => 0,            'create_time' => date('Y-m-d H:i:s'),            'bus_type' => $busType,            'from' =>input('from',1)        ];        $map[] = ['id','=',$orderId];        $map[] = ['form','=',1];        $map[] = ['user_id','=',$userId];        $map[] = ['org_id','=',$orgId];        if($busType == 1){            $map[] = ['status','=',0];        }else{            $map[] = ['status','in',[0,1]];        }        $order = Db::name('ph_orders')            ->where($map)            ->find();        if(!$order){            HelpHander::error('订单不存在');        }        $payId = Db::name('ph_order_pay')->insertGetId($data);        if(!$payId){            HelpHander::error('操作失败');        }        return $payId;    }    // 用户支付成功预收款,改变状态    public function paySuccess($payId,$type=2){        Db::startTrans();        try{            $pay = Db::name('ph_order_pay')                ->where('id',$payId)                ->find();            if(!$pay){                \exception('支付单不存在');            }            $order = Db::name('ph_orders')                ->where('id',$pay['order_id'])                ->lock(true)                ->find();            if(!$order){                \exception('订单不存在');            }            $res = Db::name('ph_order_pay')->where('id',$payId)->update([                'status' => 1,                'type' => $type,                'pay_time' => date('Y-m-d H:i:s')            ]);            if(!$res){                \exception('操作失败');            }            if($pay['bus_type'] == 0){                $ret = Db::name('ph_orders')->where('id',$pay['order_id'])->update([                    'pre_money' => $order['pre_money'] + $pay['money']                ]);                if(!$ret){                    \exception('操作失败');                }            }else{                $ret = Db::name('ph_orders')->where('id',$pay['order_id'])->update([                    'is_service' => 1,                    'update_time' => date("Y-m-d H:i:s")                ]);                if(!$ret){                    \exception('操作失败');                }            }            Db::commit();        }catch (Exception $e){            Db::rollback();            $this->error = $e->getMessage();            return false;        }        return true;    }    // 调度生成支付单    public function addSaveDispatch($orgId,$orderId,$money,$remark='',$busType=0){        $data = [            'sn' => get_unique_id('PH'),            'order_id' => $orderId,            'money' => $money,            'type' => 1,            'cate' => 2,            'status' => 1,            'create_time' => date('Y-m-d H:i:s'),            'pay_time' => date('Y-m-d H:i:s'),            'remark' => $remark,            'bus_type' => $busType        ];        Db::startTrans();        try{            $order = Db::name('ph_orders')                ->where('id',$orderId)                ->where('status','in',[0,1])                ->where('org_id',$orgId)                ->lock(true)                ->find();            if(!$order){                \exception('订单不存在');            }            $payId = Db::name('ph_order_pay')->insertGetId($data);            if(!$payId){                \exception('操作失败');            }            if($busType == 1){                $ret = Db::name('ph_orders')->where('id',$orderId)->update([                    'service_money' => $order['service_money'] + $money                ]);            }else{                $ret = Db::name('ph_orders')->where('id',$orderId)->update([                    'pre_money' => $order['pre_money'] + $money                ]);            }            if(!$ret){                \exception('操作失败');            }            Db::commit();        }catch (Exception $e){            Db::rollback();            $this->error = $e->getMessage();            return false;        }        return true;    }    public function refundOrder($userId,$orgId){        $data = [            'type' => input('type/d',1),            'money' => input('money/f',0),            'pay_id' => input('id/d',0),            'user_id' => $userId,            'remark' => input('remark','','trim'),            'create_time' => date('Y-m-d H:i:s'),        ];        if(!in_array($data['type'],[1,2])){            $this->error = '类型不正确';            return false;        }        if($data['money'] <= 0){            $this->error = '金额必须大于0';            return false;        }        $pay = Db::name('ph_order_pay')->where('id',$data['pay_id'])->find();        if(!$pay||$pay['status'] != 1){            $this->error = '订单不存在';            return false;        }        $data['sn'] = get_unique_id('TPH');        $data['order_id'] = $pay['order_id'];        if($data['money'] > ($pay['money'] - $pay['money2'])){            $this->error = '退款金额过大';            return false;        }        if($pay['type'] == 1 && $data['type'] == 2){            $this->error = '线下的记录不能线上退款';            return false;        }        Db::startTrans();        try{            $ret = Db::name('ph_order_refund')->insert($data);            if(!$ret){                \exception('操作失败');            }            $ret2 = Db::name('ph_order_pay')->where('id',$data['pay_id'])->update(['money2' => $pay['money2'] + $data['money']]);            if(!$ret2){                \exception('操作失败');            }            $order = Db::name('ph_orders')                ->where('id',$pay['order_id'])                ->lock(true)                ->find();            if(!$order){                \exception('订单不存在');            }            if($pay['bus_type'] == 1){                $ret = Db::name('ph_orders')->where('id',$pay['order_id'])->update([                    'service_money' => $order['service_money'] - $data['money']                ]);            }else{                if ($order['status'] == 2){ //已完成状态下,要从订单金额里面减去退款金额                    $ret = Db::name('ph_orders')->where('id',$pay['order_id'])->update([                        'pre_money' => $order['pre_money'] - $data['money'],                        'amount' => $order['amount'] - $data['money'],                    ]);                }else{                    $ret = Db::name('ph_orders')->where('id',$pay['order_id'])->update([                        'pre_money' => $order['pre_money'] - $data['money']                    ]);                }            }            if(!$ret){                \exception('操作失败');            }            if($data['type'] == 2){ // 线上,微信退款                $config = getPhConfig($orgId,$pay['from']);                $app = \EasyWeChat\Factory::payment($config);                $ret = $app->refund->byOutTradeNumber($pay['sn'], $data['sn'], $pay['money']*100, $data['money']*100);                if($ret['return_code'] != 'SUCCESS' || $ret['result_code'] != 'SUCCESS'){                    \exception('退款申请提交失败');                }            }            Db::commit();        }catch (\Exception $e){            Db::rollback();            trace($e->getMessage());            $this->error = $e->getMessage();            return false;        }        return true;    }}
 |