| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 | <?phpnamespace app\common\model;use think\Model;use think\Db;/** * 货币模型 */class Wallet extends Model{    /**     * 获取交易类型配置     * @return mixed     */    public function getlogtype($type = '')    {        $conf = config('wallet.logtype');        if($type){            return $conf[$type] ?: $type;        }        return $conf;    }    //获取钱包名称    public function getwalletname($name = ''){        $conf = config('wallet.moneyname');        if($name){            return $conf[$name] ?: $name;        }        return $conf;    }    /**     * 获取钱包余额     * @param string $username 用户编号     * @param string $wallet_name 指定钱包名     * @return array|float     */    public function getWallet($user_id = '', $wallet_name = '')    {        //所有钱包余额        $wallet = Db::name('user_wallet')->lock(true)->where(['user_id' => $user_id])->find();        if(!$wallet) {            abort(500,'钱包余额获取失败');        }        if($wallet_name) { //返回指定钱包            return isset($wallet[$wallet_name]) ? $wallet[$wallet_name] : 0;        } else { //返回所有钱包            return $wallet;        }    }    public function getWallettotal($user_id = '')    {        //所有钱包余额        $wallet = Db::name('user_wallet')->lock(true)->where(['user_id' => $user_id])->find();        if(!$wallet) {            abort(500,'钱包余额获取失败');        }        return bcadd($wallet['gold'],$wallet['jewel'],1);    }    /**     *     * @param floatval $number 金额(正数进账,负数出账)     * @param $accountType 货币类型,money,score     * @param $logtype 日志的类型     * @param $remark  备注     * @param $user_id  用户id     * @param $table  来源表     * @param $data_id  表id     * @param $isAdmin 是否是管理员处理     * @return array     * @return array[status]     * @return array[msg]     * @return array[log_table]     * @return array[log_id]     */    public function lockChangeAccountRemain($user_id,$accountType='gold',$number,$logtype='',$remark='',$table='',$table_id=0,$isAdmin=false)    {        //初始化        $result = array(            'status'=>false,            'msg'=>'',            'log_table' => '',            'log_id' => '',        );        //获取小数点        $point = 1;        if($accountType == 'agentjewel'){            $point = 2;        }        bcscale($point);        //检测0        $number = floatval( $number );        if( $number == 0 )        {            $result['status'] = true;            $result['msg'] = '交易金额:0';            return $result;        }        if(0 === bccomp($number, 0)){            $result['status'] = true;            $result['msg'] = '交易金额:0';            return $result;        }        //查询余额        $wallet = Db::name('user_wallet')->lock(true)->where(['user_id'=>$user_id])->find();        if(empty($wallet))        {            $result['msg'] = '不存在的用户';            return $result;        }        //钱包冻结        if($wallet['status'] == 2 && in_array($logtype,[11,12,13,14,30,55])){            $result['msg'] = '您的钱包已被冻结,请联系客服';            return $result;        }        //扣除金币单独方法        if($accountType == 'gold' && bccomp($number, 0) === -1){            //两个钱包的合,是否足够            $wallet_sum = bcadd($wallet['gold'],$wallet['jewel']);            if(bccomp(bcadd($wallet_sum, $number), 0) === -1)            {                $result['msg'] = '余额不足!';                return $result;            }            //gold不够,            if(bccomp(bcadd($wallet['gold'], $number), 0) === -1)            {                $jewel_change = $number;//jewel需要扣掉的                //gold全扣                if(bccomp($wallet['gold'],0) === 1){                    //钱币操作                    $data = array();                    $data['user_id'] = $user_id;                    $data['log_type'] = $logtype;                    $data['money_type'] = $accountType;                    $data['before'] = $wallet['gold'];                    $data['change_value'] = -$wallet['gold'];                    $data['remain'] = 0;                    $data['table'] = $table;                    $data['table_id'] = $table_id;                    $data['remark'] = $remark;                    $data['createtime'] = time();                    $data['updatetime'] = time();                    $result = $this->wallet_do($user_id,$accountType,$data,$result);                    if($result['status'] == false){                        return $result;                    }                    $result['status'] = false;//回归默认                    $jewel_change = bcadd($number,$wallet['gold']);//jewel需要扣掉的                }                //jewel扣剩余部分                $jewel_after  = bcadd($wallet['jewel'],$jewel_change);                //钱币操作                $data = array();                $data['user_id'] = $user_id;                $data['log_type'] = $logtype;                $data['money_type'] = 'jewel';                $data['before'] = $wallet['jewel'];                $data['change_value'] = $jewel_change;                $data['remain'] = $jewel_after;                $data['table'] = $table;                $data['table_id'] = $table_id;                $data['remark'] = $remark;                $data['createtime'] = time();                $data['updatetime'] = time();                $result = $this->wallet_do($user_id,'jewel',$data,$result);                if($result['status'] == false){                    return $result;                }            }else{                //gold自己扣                //之前的余额                $wallet_before = $wallet[$accountType];                //钱币操作                $data = array();                $data['user_id'] = $user_id;                $data['log_type'] = $logtype;                $data['money_type'] = $accountType;                $data['before'] = $wallet_before;                $data['change_value'] = $number;                $data['remain'] = bcadd($wallet_before, $number);                $data['table'] = $table;                $data['table_id'] = $table_id;                $data['remark'] = $remark;                $data['createtime'] = time();                $data['updatetime'] = time();                $result = $this->wallet_do($user_id,$accountType,$data,$result);                if($result['status'] == false){                    return $result;                }            }            return $result;        }else{            //gold的增加,jewel的增、减            //之前的余额            $wallet_before = $wallet[$accountType];            //正常方法            if(bccomp(bcadd($wallet_before, $number), 0) === -1)            {                $result['msg'] = '余额不足!';                return $result;            }            //钱币操作            $data = array();            $data['user_id'] = $user_id;            $data['log_type'] = $logtype;            $data['money_type'] = $accountType;            $data['before'] = $wallet_before;            $data['change_value'] = $number;            $data['remain'] = bcadd($wallet_before, $number);            $data['table'] = $table;            $data['table_id'] = $table_id;            $data['remark'] = $remark;            $data['createtime'] = time();            $data['updatetime'] = time();            $result = $this->wallet_do($user_id,$accountType,$data,$result);            return $result;        }    }    private function wallet_do($user_id,$accountType,$data,$result){        $log_table = 'user_gold_log';        if($accountType == 'agentjewel'){            $log_table = 'user_agentjewel_log';        }        $rs2_id = Db::name($log_table)->insertGetId($data);        //修改金额        $rs1 = Db::name('user_wallet')->where(['user_id'=>$user_id])->update([$accountType => $data['remain']]);        //操作数据库失败        if($rs1 === false || $rs2_id === false){            $result['msg'] = '更新财务记录失败!';            return $result;        }        //默认成功        $result['status'] = true;        $result['msg'] = '账户余额已更新!';        $result['log_table'] = $log_table;        $result['log_id'] = $rs2_id;        return $result;    }}
 |