admin/app/model/member/Withdraw.php

680 lines
26 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* ThinkShop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都云之牛科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.cdcloudshop.com
* =========================================================
*/
namespace app\model\member;
use app\model\BaseModel;
use app\model\message\Message;
use app\model\message\Sms;
use app\model\shop\ShopAcceptMessage;
use app\model\system\Config as ConfigModel;
use app\model\system\Pay;
use app\model\system\Stat;
use think\facade\Cache;
use addon\memberwithdraw\model\Withdraw as MemberWithdraw;
use addon\wechat\model\Message as WechatMessage;
use addon\weapp\model\Message as WeappMessage;
use think\facade\Db;
/**
* 会员提现
*/
class Withdraw extends BaseModel
{
/**************************************************************************** 会员提现设置 *************************************************************/
/**
* 会员提现设置
* array $data
*/
public function setConfig($data, $is_use, $site_id = 0, $app_module = 'shop')
{
$config = new ConfigModel();
$res = $config->setConfig($data, '会员提现设置', $is_use, [['site_id', '=', $site_id], ['app_module', '=', $app_module], ['config_key', '=', 'MEMBER_WITHDRAW_CONFIG']]);
return $res;
}
/**
* 会员提现设置
*/
public function getConfig($site_id = 0, $app_module = 'shop')
{
$config = new ConfigModel();
$res = $config->getConfig([['site_id', '=', $site_id], ['app_module', '=', $app_module], ['config_key', '=', 'MEMBER_WITHDRAW_CONFIG']]);
if (empty($res['data']['value'])) {
$res['data']['value'] = [
'is_auto_audit' => 0,
'rate' => 0,
'transfer_type' => '',
'is_auto_transfer' => 0,
'min' => 0,
'max' => 0,
'money_num' => 0,
'time_week' => 0,
];
}
return $res;
}
/**************************************************************************** 会员提现设置 *************************************************************/
/**************************************************************************** 会员提现设置 *************************************************************/
/**
* 申请提现
* @param $data
*/
public function apply($data, $site_id = 0, $app_module = 'shop')
{
$config_result = $this->getConfig($site_id, $app_module);
$config = $config_result["data"]['value'];
if ($config_result["data"]["is_use"] == 0)
return $this->error([], "提现未开启");
if ($config['time_week']) {
$time_week = explode(',', $config['time_week']);
if (!in_array(date('w'), $time_week)) {
return $this->error([], "不在提现日,请在提现日申请");
}
}
if ($config['money_num']) {
$time = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
$where = [
['member_id', '=', $data["member_id"]],
['status', 'in', [1, 2]],
['apply_time', '>=', $time],
];
$conunt = model("member_withdraw")->getCount($where, 'id');
if ($conunt >= $config['money_num']) {
return $this->error([], '超出每日提现次数');
}
}
$withdraw_no = $this->createWithdrawNo();
$apply_money = round($data["apply_money"], 2);
if ($apply_money < $config["min"])
return $this->error([], "最小提现金额为¥" . $config["min"]);
if ($apply_money > $config['max']) return $this->error([], "最大提现金额为¥" . $config["max"]);
if ($config["money_multiple"] && $apply_money % $config["money_multiple"]) {
return $this->error([], "提现金额为{$config["money_multiple"]}倍数");
}
$member_id = $data["member_id"];
$identity = $data["identity"]??'';
$member_model = new Member();
$member_info_result = $member_model->getMemberInfo([["member_id", "=", $member_id]], "balance_money,headimg,wx_openid,username,mobile,weapp_openid,nickname");
$member_info = $member_info_result["data"];
if (empty($member_info))
return $this->error([], "MEMBER_NOT_EXIST");
$balance_money = $member_info["balance_money"];
if ($apply_money > $balance_money)
return $this->error([], "申请提现金额不能大于会员可提现金额");
$transfer_type = $data["transfer_type"];
$transfer_type_list = $this->getTransferType($site_id, $app_module);
$transfer_type_name = $transfer_type_list[$transfer_type];
if (empty($transfer_type_name))
return $this->error([], "不支持的提现方式");
model('member_withdraw')->startTrans();
try {
$rate = $config["rate"];
$bank_name = "";
$account_number = "";
$applet_type = 0;
switch ($transfer_type) {
case "bank":
$bank_name = $data["bank_name"];
$account_number = $data["account_number"];
if (empty($identity)) {
return $this->error('', '请绑定身份证号码');
}
break;
case "alipay":
$bank_name = '';
$account_number = $data["account_number"];
break;
case "wechatpay":
$bank_name = '';
if (empty($member_info["wx_openid"]) && empty($member_info["weapp_openid"])) {
return $this->error('', '请绑定微信或更换提现账户');
}
if (!empty($member_info["wx_openid"])) {
$account_number = $member_info["wx_openid"];
$applet_type = 0; // 公众号
} else {
$account_number = $member_info["weapp_openid"];
$applet_type = 1; // 小程序
}
break;
}
$service_money = round($apply_money * $rate / 100, 2);//手续费
$money = $apply_money - $service_money;
$data = array(
"site_id" => $site_id,
"withdraw_no" => $withdraw_no,
"member_name" => $member_info["username"] == '' ? $member_info["mobile"] : $member_info["username"],
"member_id" => $data["member_id"],
"transfer_type" => $data["transfer_type"],
"transfer_type_name" => $transfer_type_name,
"apply_money" => $apply_money,
"service_money" => $service_money,
"rate" => $rate,
"money" => $money,
"apply_time" => time(),
"status" => 0,
"status_name" => "待审核",
"member_headimg" => $member_info["headimg"],
"realname" => $data["realname"],
"bank_name" => $bank_name,
"account_number" => $account_number,
// "identity" => $identity,
"mobile" => $data["mobile"],
"applet_type" => $applet_type
);
//减少现金余额
$member_account = new MemberAccount();
$account_res = $member_account->addMemberAccount($site_id, $member_id, 'balance_money', -$apply_money, 'withdraw', '会员提现', '会员提现扣除');
if ($account_res['code'] != 0) return $account_res;
//增加提现中余额
model("member")->setInc([["member_id", "=", $member_id]], "balance_withdraw_apply", $apply_money);
$result = model("member_withdraw")->add($data);
//是否启用自动通过审核(必须是微信)
if ($config["is_auto_audit"] == 0) {
$this->agree([["id", "=", $result], ['site_id', '=', $site_id]]);
}
model('member_withdraw')->commit();
//申请提现发送消息
$data['keywords'] = 'USER_WITHDRAWAL_APPLY';
$data['member_name'] = $member_info['nickname'];
$message_model = new Message();
$message_model->sendMessage($data);
return $this->success();
} catch (\Exception $e) {
model('member_withdraw')->rollback();
return $this->error('', $e->getMessage());
}
}
/***
* 会员余额互转
* @param $memberInfo
* @param $apply_money
* @param $member_id
* @param $to_member_id
* @param $site_id
* @return array
*/
public function MemberBalanceTransfer($memberInfo, $apply_money, $member_id, $to_member_id, $site_id, $to_member_info)
{
try {
//减少可提现余额
$member_account = new MemberAccount();
$member_account->addMemberAccount($site_id, $member_id, 'balance_money', -$apply_money, 'transfer', "{$to_member_id}_会员转账", "给会员{$to_member_info['data']['nickname']}转账" . (-$apply_money));
//增加转账余额
$account_res = $member_account->addMemberAccount($site_id, $to_member_id, 'balance_money', $apply_money, 'transfer', "{$member_id}_会员转账", $memberInfo['data']['nickname'] . '转账' . (+$apply_money));
if ($account_res['code'] != 0) return $account_res;
return $this->success();
} catch (\Exception $e) {
model('member_withdraw')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
* 同意提现申请
* @param $condition
*/
public function agree($condition)
{
$check_condition = array_column($condition, 2, 0);
$site_id = $check_condition['site_id'];
$app_module = $check_condition['app_module'] ?? 'shop';
if (empty($site_id)) {
return $this->error(-1, '参数错误');
}
$info = model("member_withdraw")->getInfo($condition);
if (empty($info))
return $this->error();
$config_result = $this->getConfig($site_id, $app_module);
$config = $config_result["data"];
model('member_withdraw')->startTrans();
try {
$data = array(
"status" => 1,
"status_name" => "待转账",
"audit_time" => time(),
);
$result = model("member_withdraw")->update($data, $condition);
//是否启用自动转账(必须是微信或支付宝)
if ($config["value"]["is_auto_transfer"] == 1) {
$member_withdraw_model = new MemberWithdraw();
$member_withdraw_model->transfer($info["id"]);
/*if ($transfer_res['code'] == 0) {
//提现成功发送消息
$info['keywords'] = 'USER_WITHDRAWAL_SUCCESS';
$message_model = new Message();
$res = $message_model->sendMessage($info);
}*/
}
model('member_withdraw')->commit();
return $this->success();
} catch (\Exception $e) {
model('member_withdraw')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
* 拒绝提现申请
* @param $condition
*/
public function refuse($condition, $param)
{
$info = model("member_withdraw")->getInfo($condition, "site_id,transfer_type,member_id,apply_money");
if (empty($info))
return $this->error();
model('member_withdraw')->startTrans();
try {
$data = array(
"status" => -1,
"status_name" => "已拒绝",
"refuse_reason" => $param["refuse_reason"],
"audit_time" => time(),
);
$result = model("member_withdraw")->update($data, $condition);
//增加现金余额
$member_account = new MemberAccount();
$account_res = $member_account->addMemberAccount($info['site_id'], $info['member_id'], 'balance_money', $info["apply_money"], 'withdraw', '会员提现申请未通过', '提现申请未通过返还');
if ($account_res['code'] != 0) {
model('member_withdraw')->rollback();
return $account_res;
}
//减少提现中余额
model("member")->setDec([["member_id", "=", $info["member_id"]]], "balance_withdraw_apply", $info["apply_money"]);
model('member_withdraw')->commit();
return $this->success();
} catch (\Exception $e) {
model('member_withdraw')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
* 提现转账完成
* @param $id
*/
public function transferFinish($param = [])
{
$condition = [
['id', '=', $param['id'] ],
['site_id', '=', $param['site_id'] ],
['status', '=', 1]
];
$info = model("member_withdraw")->getInfo($condition);
if (empty($info)) return $this->error();
$payment_time = time();
model('member_withdraw')->startTrans();
try {
$data = [
'status' => 2,
'status_name' => '已转账',
'payment_time' => $payment_time,
'certificate' => $param['certificate'] ?? '',
'certificate_remark' => $param['certificate_remark'] ?? ''
];
$result = model("member_withdraw")->update($data, $condition);
//增加已提现余额
model("member")->setInc([["member_id", "=", $info["member_id"]]], "balance_withdraw", $info["apply_money"]);
//减少提现中余额
model("member")->setDec([["member_id", "=", $info["member_id"]]], "balance_withdraw_apply", $info["apply_money"]);
model('member_withdraw')->commit();
$member_info = model("member")->getInfo([["member_id", "=", $info["member_id"]]], 'nickname');
//提现成功发送消息
$info['keywords'] = 'USER_WITHDRAWAL_SUCCESS';
$info['payment_time'] = $payment_time;
$info['member_name'] = $member_info['nickname'];
$message_model = new Message();
$message_model->sendMessage($info);
$stat_model = new Stat();
$stat_model->switchStat(['type' => 'member_withdraw', 'data' => ['site_id' => $info['site_id'], 'id' => $info['id']]]);
return $this->success();
} catch (\Exception $e) {
model('member_withdraw')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
* @param $condition
* @param string $field
*/
public function getMemberWithdrawInfo($condition, $field = "*")
{
$info = model('member_withdraw')->getInfo($condition, $field);
return $this->success($info);
}
/**
* 提现详情
* @param $condition
* @return array
*/
public function getMemberWithdrawDetail($condition)
{
$info = model('member_withdraw')->getInfo($condition, "*");
return $this->success($info);
}
/**
* 提现单数
* @param $condition
*/
public function getMemberWithdrawCount($condition)
{
$count = model('member_withdraw')->getCount($condition, "id");
return $this->success($count);
}
/**
* 提现总和
* @param $condition
*/
public function getMemberWithdrawSum($condition, $field = 'apply_money')
{
$count = model('member_withdraw')->getSum($condition, $field);
return $this->success($count);
}
/**
* 获取会员提现分页列表
* @param array $condition
* @param int $page
* @param int $page_size
* @param string $order
* @param string $field
* @return array
*/
public function getMemberWithdrawPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*')
{
$list = model('member_withdraw')->pageList($condition, $field, $order, $page, $page_size, '', '', '');
return $this->success($list);
}
/**
* 获取会员提现列表
* @param array $where
* @param bool $field
* @param string $order
* @param string $alias
* @param array $join
* @param string $group
* @param null $limit
* @return array
*/
public function getMemberWithdrawList($where = [], $field = true, $order = '', $alias = 'a', $join = [], $group = '', $limit = null)
{
$res = model('member_withdraw')->getList($where, $field, $order, $alias, $join, $group, $limit);
return $this->success($res);
}
/**
* 提现流水号
*/
private function createWithdrawNo()
{
$cache = Cache::get("member_withdraw_no" . time());
if (empty($cache)) {
Cache::set("niutk" . time(), 1000);
$cache = Cache::get("member_withdraw_no" . time());
} else {
$cache = $cache + 1;
Cache::set("member_withdraw_no" . time(), $cache);
}
$no = date('Ymdhis', time()) . rand(1000, 9999) . $cache;
return $no;
}
/**
* 转账方式
*/
public function getTransferType($site_id = 0, $app_module = 'shop')
{
$pay_model = new Pay();
$transfer_type_list = $pay_model->getTransferType($site_id);
$config_result = $this->getConfig($site_id, $app_module);
$config = $config_result["data"]['value'];
$data = [];
$support_type = explode(",", $config["transfer_type"]);
foreach ($transfer_type_list as $k => $v) {
if (in_array($k, $support_type)) {
$data[$k] = $v;
}
}
return $data;
}
/**
* 会员提现成功通知
* @param $data
*/
public function messageUserWithdrawalSuccess($data)
{
//发送短信
$sms_model = new Sms();
$var_parse = array(
'username' => $data["member_name"],//会员名
'money' => $data['apply_money']
);
$data["sms_account"] = $data["mobile"];//手机号
$data["var_parse"] = $var_parse;
$sms_model->sendMessage($data);
$member_model = new Member();
$member_info_result = $member_model->getMemberInfo([["member_id", "=", $data["member_id"]]]);
$member_info = $member_info_result["data"];
//绑定微信公众号才发送
if (!empty($member_info) && !empty($member_info["wx_openid"])) {
$wechat_model = new WechatMessage();
$data["openid"] = $member_info["wx_openid"];
$data["template_data"] = [
'keyword1' => $data['apply_money'],
'keyword2' => time_to_date($data['payment_time']),
];
$data["page"] = "";
$wechat_model->sendMessage($data);
}
//发送订阅消息
if (!empty($member_info) && !empty($member_info["weapp_openid"])) {
$weapp_model = new WeappMessage();
$data["openid"] = $member_info["weapp_openid"];
$data["template_data"] = [
'amount6' => [
'value' => $data['apply_money']
],
'date3' => [
'value' => time_to_date(time())
]
];
$data["page"] = "";
$weapp_model->sendMessage($data);
}
}
/**
* 会员提现失败通知
* @param $data
*/
public function messageUserWithdrawalError($data)
{
//发送短信
$sms_model = new Sms();
$var_parse = array(
'username' => $data["member_name"],//会员名
'money' => $data['apply_money']
);
$data["sms_account"] = $data["mobile"];//手机号
$data["var_parse"] = $var_parse;
$sms_model->sendMessage($data);
$member_model = new Member();
$member_info_result = $member_model->getMemberInfo([["member_id", "=", $data["member_id"]]]);
$member_info = $member_info_result["data"];
//绑定微信公众号才发送
if (!empty($member_info) && !empty($member_info["wx_openid"])) {
$wechat_model = new WechatMessage();
$data["openid"] = $member_info["wx_openid"];
$data["template_data"] = [
'keyword1' => time_to_date($data['create_time']),
'keyword2' => '审核失败',
'keyword3' => '会员申请提现',
'keyword4' => $data['apply_money'],
];
$data["page"] = "";
$wechat_model->sendMessage($data);
}
//发送订阅消息
if (!empty($member_info) && !empty($member_info["weapp_openid"])) {
$weapp_model = new WeappMessage();
$data["openid"] = $member_info["weapp_openid"];
$data["template_data"] = [
'amount3' => [
'value' => $data['apply_money']
],
'phrase4' => [
'value' => '审核失败'
],
'date2' => [
'value' => time_to_date(time())
]
];
$data["page"] = "";
$weapp_model->sendMessage($data);
}
}
/**
* 会员申请提现通知,卖家通知
* @param $data
*/
public function messageUserWithdrawalApply($data)
{
//发送短信
$sms_model = new Sms();
$var_parse = array(
"username" => replaceSpecialChar($data["member_name"]),//会员名
"money" => $data["apply_money"],//退款申请金额
);
// $site_id = $data['site_id'];
// $shop_info = model("shop")->getInfo([["site_id", "=", $site_id]], "mobile,email");
// $message_data["sms_account"] = $shop_info["mobile"];//手机号
$data["var_parse"] = $var_parse;
$shop_accept_message_model = new ShopAcceptMessage();
$result = $shop_accept_message_model->getShopAcceptMessageList();
$list = $result['data'];
if (!empty($list)) {
foreach ($list as $v) {
$message_data = $data;
$message_data["sms_account"] = $v["mobile"];//手机号
$sms_model->sendMessage($message_data);
if($v['wx_openid'] != ""){
$wechat_model = new WechatMessage();
$data["openid"] = $v['wx_openid'];
$data["template_data"] = [
'keyword1' => replaceSpecialChar($data["member_name"]),
'keyword2' => time_to_date($data['apply_time']),
'keyword3' => $data["apply_money"]
];
$data["page"] = "";
$wechat_model->sendMessage($data);
}
}
}
}
public function exportWithdraw($condition, $order){
try {
$file_name = date('Y年m月d日-余额提现', time()) . '.csv';
// $file_name = date('YmdHis').'.csv';//csv文件名
//通过分批次执行数据导出(防止内存超出配置设置的)
set_time_limit(0);
ini_set('memory_limit', '256M');
//设置header头
header('Content-Description: File Transfer');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="' . $file_name . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
//打开php数据输入缓冲区
$fp = fopen('php://output', 'a');
// fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF)); // 添加 BOM
$heade = [ '会员账号', '提现方式', '申请提现金额', '提现手续费', '实际转账金额', '提现状态', '申请时间', '银行名称', '收款账号', '真实姓名', '手机号' ];
//将数据编码转换成GBK格式
mb_convert_variables('GBK', 'UTF-8', $heade);
//将数据格式化为CSV格式并写入到output流中
fputcsv($fp, $heade);
//写入第一行表头
Db::name('member_withdraw')->where($condition)->order($order)->chunk(500, function($item_list) use ($fp) {
//写入导出信息
foreach ($item_list as $k => $item_v) {
$temp_data = [
$item_v['member_name'] . "\t",
$item_v[ 'transfer_type_name' ] . "\t",
(float) $item_v[ 'apply_money' ] . "\t",
(float) $item_v[ 'service_money' ] . "\t",
(float) $item_v[ 'money' ] . "\t",
$item_v[ 'status_name' ] . "\t",
time_to_date($item_v[ 'apply_time' ]) . "\t",
$item_v['bank_name']. "\t" ,
$item_v['account_number']. "\t",
$item_v['realname']. "\t",
$item_v['mobile']. "\t",
];
mb_convert_variables('GBK', 'UTF-8', $temp_data);
fputcsv($fp, $temp_data);
//将已经存储到csv中的变量数据销毁释放内存
unset($item_v);
}
unset($item_list);
});
//关闭句柄
fclose($fp);
die;
} catch (\Exception $e) {
return $this->error([], $e->getMessage() . $e->getFile() . $e->getLine());
}
}
}