217 lines
7.9 KiB
PHP
217 lines
7.9 KiB
PHP
<?php
|
|
/***
|
|
* 检查未分账
|
|
*/
|
|
|
|
namespace addon\dividemoney\model;
|
|
|
|
use addon\aliapp\model\MinCode;
|
|
use app\model\order\Config;
|
|
use think\facade\Db;
|
|
|
|
class CheckDividend
|
|
{
|
|
public function CheckAccountBill()
|
|
{
|
|
$startTime = mktime(0, 0, 0, date('m'), date('d') - 14, date('Y'));
|
|
$endTime = mktime(0, 0, 0, date('m'), date('d') - 180, date('Y'));
|
|
$toDay = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
|
|
$where = [
|
|
['b.states', 'in', [0, 2, 3]],
|
|
['b.create_time', '<=', $startTime],
|
|
['b.create_time', '>=', $endTime],
|
|
['b.update_time', '<=', $toDay],
|
|
['o.order_status', '>', 0],
|
|
];
|
|
$bill = Db::name('dividemoney_bill')
|
|
->join('member m', 'm.member_id=b.member_id', 'inner')
|
|
->join('order o', 'o.order_id=b.order_id', 'inner')
|
|
->alias('b')
|
|
->where($where)
|
|
->limit(20)
|
|
->order('b.create_time asc')
|
|
->field('b.site_id,b.states,b.order_id,b.out_trade_no,b.create_time,b.out_trade_no,b.is_video_number,b.channel_type,m.ali_openid,o.order_status')
|
|
->select();
|
|
if ($bill) {
|
|
foreach ($bill as $item) {
|
|
switch ($item['channel_type']) {
|
|
case 'aliapp':
|
|
case 'alipay': //开始分账
|
|
if ($item['is_video_number']) {
|
|
if (in_array($item['order_status'], [3, 4, 10])) {
|
|
$this->CheckDelivery($item['site_id'], $item['out_trade_no'], $item['ali_openid'], $item['order_id'], $item['states']); //检查是否发货
|
|
} else if (in_array($item['states'], [0, 2, 3])) {
|
|
$this->CheckDivide($item['out_trade_no'], $item['states']); //开始发起分账
|
|
}
|
|
} else {
|
|
$this->CheckDivide($item['out_trade_no'], $item['states']); //开始发起分账
|
|
}
|
|
break;
|
|
case 'weapp':
|
|
case 'wechat':
|
|
case 'wechatpay':
|
|
$this->CheckWechatDivide($item['out_trade_no'], $item); //开始发起分账
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return success();
|
|
}
|
|
|
|
|
|
/***
|
|
* 检查微信分账未成功订单
|
|
* @param $out_trade_no
|
|
* @param $item
|
|
* @return void
|
|
*/
|
|
public function CheckWechatDivide($out_trade_no, $item = [])
|
|
{
|
|
|
|
}
|
|
|
|
/***
|
|
* 检查是否发货
|
|
* @param $site_id
|
|
* @param $out_trade_no
|
|
* @param $openid
|
|
* @param $order_id
|
|
* @return void
|
|
*/
|
|
public function CheckDelivery($site_id, $out_trade_no, $openid, $order_id, $states)
|
|
{
|
|
$mini = new MinCode($site_id);
|
|
$info = $mini->miniOrderQuery($out_trade_no, $openid);
|
|
if ($info['code'] == '10000') {
|
|
$status = $info['status'];
|
|
switch ($status) {
|
|
case 'PAID':
|
|
$this->pushOrder($info, $order_id);//检查推送订单
|
|
break;
|
|
case 'RECEIVED_CONFIRM':
|
|
$this->confirmDelivery($info, $site_id, $out_trade_no, $openid);//自动确认收货
|
|
break;
|
|
case 'DELIVERED':
|
|
case 'CONFIRMED':
|
|
case 'FINISHED':
|
|
$res = $this->CheckDivide($out_trade_no, $states);//检查分账
|
|
break;
|
|
case 'REFUND_CLOSED':
|
|
model('dividemoney_bill')->update(['states' => 5, 'refuse' => '订单已退款'], ['order_id' => $order_id]);
|
|
break;
|
|
case 'TIMEOUT_CLOSED':
|
|
model('dividemoney_bill')->update(['states' => 5, 'refuse' => '订单超时关闭'], ['order_id' => $order_id]);
|
|
break;
|
|
}
|
|
} else if ($info['code'] != 10000) {
|
|
model('dividemoney_bill')->update(['states' => 3, 'refuse' => $info['sub_msg'], 'update_time' => time()], ['order_id' => $order_id]);
|
|
}
|
|
return success();
|
|
}
|
|
|
|
/***
|
|
* 检查分账
|
|
* @param $site_id
|
|
* @param $out_trade_no
|
|
* @return void
|
|
*/
|
|
public function CheckDivide($out_trade_no, $states)
|
|
{
|
|
$split = new OrderPay();
|
|
$res = $split->startSplitAccount('', $out_trade_no, $states, true);
|
|
return success();
|
|
}
|
|
|
|
/***
|
|
* 设置发货
|
|
* @param $info
|
|
* @return void
|
|
*/
|
|
public function confirmDelivery($info, $site_id, $out_trade_no, $openid)
|
|
{
|
|
$create_time = strtotime($info['create_time']);
|
|
$config_model = new Config();
|
|
$auto_take_delivery = $config_model->getOrderEventTimeConfig($site_id)['data']['value']['auto_take_delivery'];
|
|
$res = [];
|
|
if ((time() - $create_time) / 86400 >= $auto_take_delivery) {
|
|
$apiApp = new MinCode($site_id);
|
|
$res = $apiApp->recieveDelivery(['out_order_id' => $out_trade_no, 'user_id' => $openid]);
|
|
}
|
|
return $res;
|
|
}
|
|
|
|
/***
|
|
* 推送订单
|
|
* @param $item
|
|
* @return void
|
|
*/
|
|
public function pushOrder($info, $order_id)
|
|
{
|
|
$res = event('OrderDelivery', ['order_id' => $order_id]);//设置发货同步
|
|
if ($res[0]['code'] == 0) {
|
|
model('order')->update(['is_sync_order' => 1], ['order_id' => $order_id]);
|
|
} else {
|
|
model('order')->update(['is_sync_order' => 2, 'sync_msg' => $res[0]['message']], ['order_id' => $order_id]);
|
|
}
|
|
return success();
|
|
}
|
|
|
|
|
|
/***
|
|
* 获取分账权限
|
|
* @param $data
|
|
* @return bool[]
|
|
*/
|
|
public function checkAccountsAuth($data)
|
|
{
|
|
$divideStatet = true;
|
|
$isDivide = false;
|
|
$is_pay_error = '';
|
|
$res = event('getDivideAccounts', $data);//获取分账权限
|
|
$Accounts = [];
|
|
if ($res) {
|
|
foreach ($res as $v) {
|
|
foreach ($v as $item) {
|
|
$Accounts[] = $item;
|
|
}
|
|
}
|
|
$is_commission = array_sum(array_column($Accounts, 'is_commission'));
|
|
if ($is_commission <= 0) return '';//剔除免佣账号
|
|
$isDivide = true;
|
|
if ($data['pay_type'] == 'alipay') {//验证支付宝是否开启分账
|
|
$is_pay_error = cache('is_pay_error' . $data['site_id']);
|
|
if (!cache('alipayTradeBatchquery' . $data['site_id']) || $is_pay_error) {
|
|
$micode = new MinCode($data['site_id']);
|
|
$request = $micode->requestApi('alipay.trade.royalty.relation.batchquery', ['out_request_no' => date('YmdHisw')])['alipay_trade_royalty_relation_batchquery_response'];
|
|
if ($request['code'] == 10000) {
|
|
cache('alipayTradeBatchquery' . $data['site_id'], 1, 7200);
|
|
cache('is_pay_error' . $data['site_id'], null);
|
|
} else {
|
|
$divideStatet = false;
|
|
$is_pay_error = '未检开启分账权限';
|
|
}
|
|
}
|
|
} else if ($data['pay_type'] == 'wechatpay') { //微信验证账号分账全权
|
|
|
|
}
|
|
$startTime = mktime(0, 0, 0, date('m'), date('d') - 20, date('Y'));
|
|
$where = [
|
|
['site_id', '=', $data['site_id']],
|
|
['states', 'in', [0, 2, 3]],
|
|
['is_order_account_locking', '=', 0],
|
|
['create_time', '<', $startTime],
|
|
];
|
|
$countMone = model('dividemoney_bill')->getSum($where, 'amount');
|
|
if ($countMone >= 50) {
|
|
$divideStatet = false;
|
|
$is_pay_error = '服务佣金未结清';
|
|
}
|
|
}
|
|
return [
|
|
'isDivide' => $isDivide,
|
|
'divideState' => $divideStatet,
|
|
'err_msg' => $is_pay_error,
|
|
];
|
|
}
|
|
}
|