jh-admin/addon/dividemoney/model/CheckDividend.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,
];
}
}