Files
OMS/app/finance/lib/cronjob/tradeScript.php
2025-12-28 23:13:25 +08:00

781 lines
34 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
/**
* Copyright © ShopeX http://www.shopex.cn. All rights reserved.
* See LICENSE file for license details.
*/
class finance_cronjob_tradeScript
{
protected $proofTime = 1750;
/**
* 定时获取销售数量
*
* @return array
* @author
* */
public function get_sales()
{
@ini_set('memory_limit', '512M');@set_time_limit(0);
$tmp_shop_list = financebase_func::getShopList(financebase_func::getShopType());
if(empty($tmp_shop_list)) {
return [false, 'shop_list_empty'];
}
$shopId = array_column($tmp_shop_list, 'shop_id');
$proofIndex = 'finance-trade-sale';
$proof = cachecore::fetch($proofIndex);
if($proof == 'running') {
return [false, 'script_running'];
}
cachecore::store($proofIndex, 'running', 3000);
$financeObj = base_kvstore::instance('setting/finance');
$now_time = time() - 10; //每次获取时间提前10秒
$financeObj->fetch("sales_run_time", $sales_run_time);
$sales_run_time = $sales_run_time ? $sales_run_time : 0;
$financeObj->fetch('sales_last_run_time', $sales_last_run_time);
if($sales_run_time) {
$sales_last_run_time = $sales_last_run_time ? : 0;
$sql = "select min(s.sale_id) sale_id from sdb_ome_sales s
where s.sale_time >= {$sales_last_run_time} and s.sale_time < {$sales_run_time} and s.shop_id in('".implode("','", $shopId)."')
and s.sale_bn not in (select serial_number from sdb_finance_ar)";
$rs = kernel::database()->selectrow($sql);
if($rs['sale_id']) {
$now_time = $sales_run_time;
$sales_run_time = $sales_last_run_time;
$last_sale_id = $rs['sale_id'];
}
}
$financeObj->store('sales_last_run_time', $sales_run_time);
$financeObj->store('sales_run_time', $now_time);
$saleModel = app::get('ome')->model('sales');
$mdlBillAr = app::get('finance')->model('ar');
$offset = 0;
$limit = 9000;
$last_sale_id = $last_sale_id ? ($last_sale_id - 1) : 0;
while (true) {
$sales = array();
$filter = array(
'sale_id|than' => $last_sale_id,
'sale_time|between' => array(
0 => $sales_run_time,
1 => $now_time,
),
'shop_id' => $shopId,
);
$list = $saleModel->getList('*', $filter, 0, $limit, ' sale_id ');
if (!$list) {
break;
}
$last = end($list);
$last_sale_id = $last['sale_id'];
$list = array_column($list, null, 'sale_bn');
// 判断是否重复
$ar_exist_list = $mdlBillAr->getList('serial_number', array('serial_number|in' => array_keys($list)));
if ($ar_exist_list) {
foreach ($ar_exist_list as $v) {
unset($list[$v['serial_number']]);
}
}
if (!$list) {
continue;
}
$this->dealSales($list);
if(time() - $now_time > $this->proofTime) {
break;
}
}
cachecore::store($proofIndex, 'finish', 1);
return [true, 'success',['sale_time_start'=>$sales_run_time, 'sale_time_end'=>$now_time]];
}
/**
* dealSales
* @param mixed $list list
* @return mixed 返回值
*/
public function dealSales($list) {
$saleItemModel = app::get('ome')->model('sales_items');
$orderModel = app::get('ome')->model('orders');
$sale_id = [];
$order_id = [];
$arrShop = app::get('ome')->model('shop')->getList('shop_id, shop_type, name');
$arrShop = array_column($arrShop, null, 'shop_id');
$init_time = app::get('finance')->getConf('finance_setting_init_time');
if ($list) {
foreach ($list as $k => $v) {
if($init_time['ying_shou'] == 'settlement') {
$sale_amount = $v['settlement_amount'];
} elseif($init_time['ying_shou'] == 'actually') {
$sale_amount = $v['actually_amount'];
} else {
$sale_amount = $v['sale_amount'];
}
$sales[$v['sale_id']] = array(
'sale_time' => $v['sale_time'],
'delivery_time' => $v['ship_time'],
'member_id' => $v['member_id'],
'sale_amount' => bcsub($sale_amount, $v['cost_freight'], 3), //$v['sale_amount'],
'delivery_cost' => $v['cost_freight'],
'actually_amount' => $v['actually_amount'],
'sale_bn' => $v['sale_bn'],
'iostock_type' => &$orders[$v['order_id']]['iostock_type'],
'sales_items' => &$sales_items[$v['sale_id']],
'order_id' => &$orders[$v['order_id']]['order_id'],
'order_bn' => &$orders[$v['order_id']]['order_bn'],
'relate_order_bn' => &$orders[$v['order_id']]['relate_order_bn'],
'shop_id' => &$orders[$v['order_id']]['shop_id'],
'shop_name' => &$orders[$v['order_id']]['shop_name'],
);
if($v['platform_order_bn']) {
$orders[$v['order_id']]['order_bn'] = $v['platform_order_bn'];
}
$sale_id[] = $v['sale_id'];
$order_id[] = $v['order_id'];
}
$list = $orderModel->getList('order_id,order_bn,relate_order_bn,shop_id,createway,order_type', array('order_id' => $order_id));
foreach ($list as $k => $v) {
$orders[$v['order_id']]['order_id'] = $v['order_id'];
if($v['order_type'] == 'custom') {
// 定制类订单
$orders[$v['order_id']]['order_bn'] = $v['relate_order_bn'];
$orders[$v['order_id']]['relate_order_bn'] = $v['order_bn'];
$orders[$v['order_id']]['iostock_type'] = 'SALE_STORAGE';
} elseif($v['createway'] == 'after') {
$orders[$v['order_id']]['relate_order_bn'] = $v['order_bn'];
if(empty($orders[$v['order_id']]['order_bn'])) {
$orders[$v['order_id']]['order_bn'] = $this->_getOrderBn(['order_bn'=>$v['relate_order_bn']])['order_bn'];
}
$orders[$v['order_id']]['iostock_type'] = 'RE_STORAGE';
} else {
$orders[$v['order_id']]['order_bn'] = $v['order_bn'];
$orders[$v['order_id']]['relate_order_bn'] = $v['relate_order_bn'];
$orders[$v['order_id']]['iostock_type'] = 'SALE_STORAGE';
}
$orders[$v['order_id']]['shop_id'] = $v['shop_id'];
$orders[$v['order_id']]['shop_name'] = $arrShop[$v['shop_id']]['name'];
}
$iOffset = 0;
$iLimit = 9000;
do {
$list = $saleItemModel->getList('*', array('sale_id' => $sale_id), $iOffset, $iLimit);
if (empty($list)) {
break;
}
foreach ($list as $k => $v) {
if($init_time['ying_shou'] == 'settlement') {
$v['sales_amount'] = $v['settlement_amount'];
} elseif($init_time['ying_shou'] == 'actually') {
$v['sales_amount'] = $v['actually_amount'];
}
$sales_items[$v['sale_id']][] = array(
'bn' => $v['bn'],
'name' => $v['name'],
'nums' => $v['nums'],
'sales_amount' => $v['sales_amount'],
'actually_amount' => $v['actually_amount'],
'shop_name' => $sales[$v['sale_id']]['shop_name'],
'shop_id' => $sales[$v['sale_id']]['shop_id'],
'order_id' => $sales[$v['sale_id']]['order_id'],
'order_bn' => $sales[$v['sale_id']]['order_bn'],
);
}
$iOffset += $iLimit;
} while (true);
}
foreach ($sales as $sale_id => $value) {
$data = array('sales' => $value);
kernel::single('finance_iostocksales')->do_iostock_sales_data($data);
}
}
/**
* _getOrderBn
* @param mixed $filter filter
* @return mixed 返回值
*/
public function _getOrderBn($filter) {
$field = 'order_id, order_bn, createway, relate_order_bn, order_type';
$order = app::get('ome')->model('orders')->db_dump($filter, $field);
if(empty($order)) {
$order = app::get('archive')->model('orders')->db_dump($filter, $field);
}
// 如果是定制订单的退款不进AR
if ($order['order_type'] == 'custom') {
return ['order_bn' => $order['relate_order_bn']];
}
if($order['createway'] == 'after' && $order['relate_order_bn']) {
return $this->_getOrderBn(['order_bn'=>$order['relate_order_bn']]);
}
return $order;
}
/**
* 获取费用
*
* @return void
* @author
* */
public function get_bills()
{
// 以下时间段不请求接口
$denytime = array(
0 => array(mktime(9, 30, 0, date('m'), date('d'), date('Y')), mktime(11, 0, 0, date('m'), date('d'), date('Y'))),
1 => array(mktime(14, 0, 0, date('m'), date('d'), date('Y')), mktime(17, 0, 0, date('m'), date('d'), date('Y'))),
2 => array(mktime(20, 0, 0, date('m'), date('d'), date('Y')), mktime(22, 30, 0, date('m'), date('d'), date('Y'))),
2 => array(mktime(1, 0, 0, date('m'), date('d'), date('Y')), mktime(3, 0, 0, date('m'), date('d'), date('Y'))),
);
$now = time();
foreach ($denytime as $value) {
if ($value[0] <= $now && $now <= $value[1]) {
return false;
}
}
$run_time = 120; //每次执行脚本的时间间隔 单位 分钟
$time = time();
$financeObj = base_kvstore::instance('setting/finance');
$financeObj->fetch("bills_get", $last_time);
#获取账单日
$billObj = kernel::single('finance_monthly_report');
$bill_status = $billObj->get_init_time();
$last_time = $last_time ? $last_time : 0;
if ($time - $run_time * 60 - $last_time > $run_time * 60) {
#设置脚本最后执行时间
$financeObj->store("bills_get", $time);
#店铺信息:淘宝已授权
$funcObj = kernel::single('finance_func');
$shop_list = $funcObj->shop_list(array('tbbusiness_type' => 'B', 'node_type' => 'taobao'));
if ($shop_list) {
$worker = 'finance_cronjob_execQueue.bills_get';
foreach ($shop_list as $shop) {
if (!$shop['node_id']) {
continue;
}
unset($last_end_time);
//店铺上一次同步时间,为空,则取当前脚本的最后执行时间
$financeObj->fetch("shop_bills_get_" . $shop['node_id'], $last_end_time);
if (empty($last_end_time)) {
// 取期当前时间之前一个月
$last_end_time = time() - 30 * 24 * 60 * 60;
}
#时间范围超过6天的处理逻辑:将此时间范围分成每隔5天进行获取
$day2second = 23 * 60 * 60;
// $last_end_time = $shop_start_time;
if (($last_end_time + $day2second) > $time) {
continue;
}
$max = 1;
do {
if ($max > 99) {
break;
}
$next_start_time = $last_end_time;
$next_end_time = $last_end_time + $day2second;
if ($next_end_time > $time) {
break;
}
#添加队列
$params = array(
'start_time' => date('Y-m-d H:i:s', $next_start_time - 5 * 60), #交易开始时间提前5分钟,确保不遗漏
'end_time' => date('Y-m-d H:i:s', $next_end_time),
'node_name' => $shop['name'],
'node_id' => $shop['node_id'],
'shop_id' => $shop['shop_id'],
);
$log_title = '请求账单数据:' . $params['start_time'] . '至' . $params['end_time'] . '';
if (!$funcObj->addTask($log_title, $worker, $params, $type = 'slow')) {
#添加日志:失败
$log_type = 'bills_get';
$logObj = kernel::single('finance_tasklog');
$log_id = $logObj->write_log($log_title, $log_type, $params, $status = 'fail', $msg = '添加队列失败');
}
$max++;
$last_end_time = $next_end_time;
} while (1);
//更新当前店铺的最后执行时间
$financeObj->store("shop_bills_get_" . $shop['node_id'], $last_end_time);
}
}
}
}
/**
* 获取虚拟账户明细数据
*
* @return void
* @author
* */
public function get_book_bills()
{
$run_time = 360; //每次执行脚本的时间间隔 单位 分钟
$time = time();
// 上次脚本执行的时间
$financeObj = base_kvstore::instance('setting/finance');
$financeObj->fetch("book_bills_get", $last_time);
if (($time - $last_time) <= $run_time * 60) {
return false;
}
// 记录本次脚本执行的时间
$financeObj->store("book_bills_get", $time);
$feeItemModel = app::get('finance')->model('bill_fee_item');
$feeItemList = $feeItemModel->getList('outer_account_id');
$funcObj = kernel::single('finance_func');
$worker = 'finance_cronjob_execQueue.sync_book_bills_get';
$shopList = $funcObj->shop_list(array('tbbusiness_type' => 'B', 'node_type' => 'taobao'));
foreach ($shopList as $shop) {
if (!$shop['node_id']) {
continue;
}
unset($shop_last_endtime);
//店铺上一次同步时间,为空,则取当前脚本的最后执行时间
$financeObj->fetch("shop_book_bills_get_" . $shop['node_id'], $shop_last_endtime);
if (!$shop_last_endtime) {
// 取一个月之前的数量
$shop_last_endtime = $time - 30 * 24 * 60 * 60;
}
$day2second = 24 * 60 * 60;
if (($shop_last_endtime + $day2second) > $time) {
continue;
}
$max = 1;
do {
if ($max >= 2) {
break;
}
$shop_next_starttime = $shop_last_endtime;
$shop_last_endtime = $shop_next_starttime + $day2second;
$params = array(
'start_time' => date('Y-m-d H:i:s', $shop_next_starttime - 5 * 60), #交易开始时间提前5分钟,确保不遗漏
'end_time' => date('Y-m-d H:i:s', $shop_last_endtime),
'node_name' => $shop['name'],
'node_id' => $shop['node_id'],
'shop_id' => $shop['shop_id'],
'page_no' => 1,
'page_size' => 50,
// 'account_id' => $fee_item['outer_account_id'],
);
foreach ($feeItemList as $fee_item) {
if (!$fee_item['outer_account_id']) {
continue;
}
$params['account_id'] = $fee_item['outer_account_id'];
$log_title = '请求获取虚拟账户明细:' . $params['start_time'] . '至' . $params['end_time'] . '';
if (!$funcObj->addTask($log_title, $worker, $params, $type = 'slow')) {
#添加日志:失败
$log_type = 'book_bills_get';
$logObj = kernel::single('finance_tasklog');
$log_id = $logObj->write_log($log_title, $log_type, $params, $status = 'fail', $msg = '添加队列失败');
}
}
$max++;
} while (1);
$financeObj->store("shop_book_bills_get_" . $shop['node_id'], $shop_last_endtime);
}
}
/**
* 定时获取应退单
*
* @return array
* @author
* */
public function get_aftersales()
{
$tmp_shop_list = financebase_func::getShopList(financebase_func::getShopType());
if(empty($tmp_shop_list)) {
return [false, 'shop_list_empty'];
}
$shopId = array_column($tmp_shop_list, 'shop_id');
$proofIndex = 'finance-trade-aftersale';
$proof = cachecore::fetch($proofIndex);
if($proof == 'running') {
return [false, 'script_running'];
}
cachecore::store($proofIndex, 'running', 3000);
$financeObj = base_kvstore::instance('setting/finance');
$mdlSalesAftersale = app::get('sales')->model('aftersale');
$mdlBillAr = app::get('finance')->model('ar');
$now_time = time() - 10; //每次获取时间提前10秒
$financeObj->fetch("aftersales_run_time", $aftersales_run_time);
$aftersales_run_time = $aftersales_run_time ? $aftersales_run_time : 0;
$financeObj->fetch('aftersales_last_run_time', $aftersales_last_run_time);
if($aftersales_run_time) {
$aftersales_last_run_time = $aftersales_last_run_time ? : 0;
$sql = "select min(s.aftersale_id) aftersale_id from sdb_sales_aftersale s
where s.aftersale_time >= {$aftersales_last_run_time} and s.aftersale_time < {$aftersales_run_time} and s.shop_id in('".implode("','", $shopId)."')
and s.aftersale_bn not in (select serial_number from sdb_finance_ar a where a.trade_time >= {$aftersales_last_run_time} and a.trade_time < {$aftersales_run_time})";
$rs = kernel::database()->selectrow($sql);
if($rs['aftersale_id']) {
$now_time = $aftersales_run_time;
$aftersales_run_time = $aftersales_last_run_time;
$last_aftersale_id = $rs['aftersale_id'];
}
}
$financeObj->store("aftersales_run_time", $now_time);
$financeObj->store("aftersales_last_run_time", $aftersales_run_time);
$aftersale_id = $last_aftersale_id ? ($last_aftersale_id - 1) :0;
$page_size = 200;
while (true) {
$filter = array('aftersale_id|than' => $aftersale_id, 'aftersale_time|between' => [$aftersales_run_time, $now_time], 'shop_id'=>$shopId);
$list = $mdlSalesAftersale->getList('*', $filter, 0, $page_size, 'aftersale_id');
if (!$list) {
break;
}
$last = end($list);
$aftersale_id = $last['aftersale_id'];
$list = array_column($list, null, 'aftersale_bn');
// 判断是否有重复数据
$ar_list = $mdlBillAr->getList('serial_number', array('serial_number|in' => array_keys($list)));
if ($ar_list) {
foreach ($ar_list as $v) {
unset($list[$v['serial_number']]);
}
}
if (!$list) {
continue;
}
$this->dealAftersale($list);
if(time() - $now_time > $this->proofTime) {
break;
}
}
cachecore::store($proofIndex, 'finish', 1);
return [true, 'success',['aftersales_time_start'=>$aftersales_run_time, 'aftersales_time_end'=>$now_time]];
}
/**
* dealAftersale
* @param mixed $list list
* @return mixed 返回值
*/
public function dealAftersale($list) {
$mdlSalesAftersaleItems = app::get('sales')->model('aftersale_items');
$mdlBillAr = app::get('finance')->model('ar');
$mdlBillArItem = app::get('finance')->model('ar_items');
$oBillAr = kernel::single('finance_ar');
$oFunc = kernel::single('financebase_func');
$arrOrderId = array_column($list, 'order_id');
$arrSale = app::get('ome')->model('sales')->getList('order_id, ship_time, sale_id,order_type', ['order_id'=>$arrOrderId]);
$arrSale = array_column($arrSale, null, 'order_id');
$arrShop = app::get('ome')->model('shop')->getList('shop_id, shop_type');
$arrShop = array_column($arrShop, null, 'shop_id');
foreach ($list as $sdf) {
$aftersale_id = $sdf['aftersale_id'];
$init_time = app::get('finance')->getConf('finance_setting_init_time');
if($init_time['ying_tui'] == 'settlement' && $sdf['return_type'] != 'refund') {
$sdf['refundmoney'] = $sdf['settlement_amount'];
}
if($init_time['ying_tui'] == 'apply') {
$sdf['refundmoney'] = $sdf['refund_apply_money'];
}
if($init_time['ying_tui'] == 'real_refund_amount') {
$sdf['refundmoney'] = $sdf['real_refund_amount'];
}
// 如果是定制订单的退款不进AR
if ($arrSale[$sdf['order_id']]['order_type'] == 'custom' && $sdf['return_type'] == 'refund') {
continue;
}
//0元不转
// 开始处理
$db = kernel::database();
$db->beginTransaction();
try {
$money = sprintf('%.2f', $sdf['refundmoney'] * -1);
$relate_order_bn = $sdf['reship_bn'];
!$relate_order_bn and $relate_order_bn = $sdf['return_apply_bn'];
!$relate_order_bn and $relate_order_bn = $sdf['diff_order_bn'];
!$relate_order_bn and $relate_order_bn = $sdf['order_bn'];
$ar_data = array(
'ar_bn' => $oBillAr->gen_ar_bn(),
'trade_time' => $sdf['aftersale_time'],
'delivery_time' => $arrSale[$sdf['order_id']]['ship_time'],
'create_time' => time(), #单据进入系统的时间
'member' => $sdf['member_uname'],
'type' => $oBillAr->get_name_by_return_type($sdf['return_type'], $sdf['reship_bn']),
'order_bn' => $sdf['platform_order_bn'] ? : $this->_getOrderBn(['order_bn'=>$sdf['order_bn']])['order_bn'],
'crc32_order_bn' => sprintf('%u', crc32($sdf['order_bn'])),
'relate_order_bn' => $relate_order_bn,
'crc32_relate_order_bn' => $relate_order_bn ? sprintf('%u', crc32($relate_order_bn)) : null,
'channel_id' => $sdf['shop_id'],
'channel_name' => $sdf['shop_name'],
'unconfirm_money' => $money,
'charge_status' => 1,
'charge_time' => time(),
'money' => $money,
'actually_money' => sprintf('%.2f', $sdf['actually_amount'] * -1),
'serial_number' => $sdf['aftersale_bn'],
'unique_id' => md5($sdf['aftersale_bn']),
'ar_type' => 1,
'verification_flag' => 0,
'addon' => '',
'memo' => '',
);
$ar_data['monthly_id'] = 0;
$ar_data['monthly_item_id'] = 0;
$ar_data['monthly_status'] = 0;
$ar_id = $mdlBillAr->insert($ar_data);
if (!$ar_id) {
throw new Exception('插入ar单据表失败');
}
$aftersale_items = $mdlSalesAftersaleItems->getList('bn,num,refunded,settlement_amount,actually_amount,product_name', array(
'aftersale_id' => $sdf['aftersale_id'],
'return_type' => ['return','refunded','refuse'],
));
if ($aftersale_items) {
$m = array_sum(array_column($aftersale_items, 'refunded'));
if($m>0.01) {
$aftersale_items = kernel::single('ome_order')->calculate_part_porth($aftersale_items,array (
'part_total' => $sdf['real_refund_amount'],
'part_field' => 'real_refund_amount',
'porth_field' => 'refunded',
));
}
foreach ($aftersale_items as $v) {
$ar_item = array(
'ar_id' => $ar_id,
'bn' => $v['bn'],
'name' => $v['product_name'],
'num' => $v['num'],
'money' => sprintf('%.2f', $v['refunded'] * -1),
'actually_money' => sprintf('%.2f', $v['actually_amount'] * -1),
);
if($init_time['ying_tui'] == 'settlement' && $sdf['return_type'] != 'refund') {
$ar_item['money'] = sprintf('%.2f', $v['settlement_amount'] * -1);
}
if($init_time['ying_tui'] == 'real_refund_amount') {
$ar_item['money'] = (float) $v['real_refund_amount'];
}
if (!$mdlBillArItem->insert($ar_item)) {
throw new Exception('插入ar_items表失败');
}
}
}
$db->commit();
kernel::single('finance_monthly_report_items')->dealArMatchReport($ar_id);
} catch (Exception $e) {
$db->rollBack();
$msg = $e->getMessage();
$oFunc->writelog('导入应退单' . $sdf['aftersale_bn'] . '出错:', 'aftersales', $msg);
/**kernel::single('monitor_event_notify')->addNotify('finance_refunds', [
'bn' => $ar_data['serial_number'],
'errmsg' => $msg,
]);**/
}
}
}
/**
* 定时获取赔付单
*
* @return array
* @author
* */
public function get_compensate()
{
$tmp_shop_list = financebase_func::getShopList(financebase_func::getShopType());
if(empty($tmp_shop_list)) {
return [false, 'shop_list_empty'];
}
$shopId = array_column($tmp_shop_list, 'shop_id');
$proofIndex = 'finance-trade-compensate';
$proof = cachecore::fetch($proofIndex);
if($proof == 'running') {
return [false, 'script_running'];
}
cachecore::store($proofIndex, 'running', 3000);
$financeObj = base_kvstore::instance('setting/finance');
$mdlCompensate = app::get('ome')->model('compensate_record');
$mdlBillAr = app::get('finance')->model('ar');
$now_time = time() - 10; //每次获取时间提前10秒
$financeObj->fetch("compensate_run_time", $compensate_run_time);
$compensate_run_time = $compensate_run_time ? $compensate_run_time : 0;
$financeObj->fetch('compensate_last_run_time', $compensate_last_run_time);
if($compensate_run_time) {
$compensate_last_run_time = $compensate_last_run_time ? : 0;
$format_compensate_last_run_time = date('Y-m-d H:i:s', $compensate_last_run_time);
$format_compensate_run_time = date('Y-m-d H:i:s', $compensate_run_time);
$sql = "select min(s.id) compensate_id from sdb_ome_compensate_record s
where s.up_time >= '{$format_compensate_last_run_time}' and s.up_time < '{$format_compensate_run_time}' and s.shop_id in('".implode("','", $shopId)."')
and s.compensate_bn not in (select serial_number from sdb_finance_ar a where a.trade_time >= {$compensate_last_run_time} and a.trade_time < {$compensate_run_time})";
$rs = kernel::database()->selectrow($sql);
if($rs['compensate_id']) {
$now_time = $compensate_run_time;
$compensate_run_time = $compensate_last_run_time;
$last_compensate_id = $rs['compensate_id'];
}
}
$financeObj->store("compensate_run_time", $now_time);
$financeObj->store("compensate_last_run_time", $compensate_run_time);
$compensate_id = $last_compensate_id ? ($last_compensate_id - 1) :0;
$page_size = 200;
while (true) {
$filter = array('id|than' => $compensate_id, 'up_time|betweenstr' => [date('Y-m-d H:i:s',$compensate_run_time), date('Y-m-d H:i:s',$now_time)], 'shop_id'=>$shopId);
$list = $mdlCompensate->getList('*', $filter, 0, $page_size, 'id');
if (!$list) {
break;
}
$last = end($list);
$compensate_id = $last['id'];
$list = array_column($list, null, 'compensate_bn');
// 判断是否有重复数据
$ar_list = $mdlBillAr->getList('serial_number', array('serial_number|in' => array_keys($list)));
if ($ar_list) {
foreach ($ar_list as $v) {
unset($list[$v['serial_number']]);
}
}
if (!$list) {
continue;
}
$this->dealCompensate($list);
if(time() - $now_time > $this->proofTime) {
break;
}
}
cachecore::store($proofIndex, 'finish', 1);
return [true, 'success',['compensate_time_start'=>$compensate_run_time, 'compensate_time_end'=>$now_time]];
}
/**
* dealCompensate
* @param mixed $list list
* @return mixed 返回值
*/
public function dealCompensate($list) {
$mdlBillAr = app::get('finance')->model('ar');
$oBillAr = kernel::single('finance_ar');
$oFunc = kernel::single('financebase_func');
$arrOrderId = array_column($list, 'order_id');
$arrSale = app::get('ome')->model('sales')->getList('order_id, ship_time, sale_id', ['order_id'=>$arrOrderId]);
$arrSale = array_column($arrSale, null, 'order_id');
$arrShop = app::get('ome')->model('shop')->getList('shop_id, shop_type, name');
$arrShop = array_column($arrShop, null, 'shop_id');
foreach ($list as $sdf) {
//0元不转
// 开始处理
$db = kernel::database();
$db->beginTransaction();
try {
$money = sprintf('%.2f', $sdf['compensateamount'] * -1);
$ar_data = array(
'ar_bn' => $oBillAr->gen_ar_bn(),
'trade_time' => strtotime($sdf['outer_created']),
'delivery_time' => $arrSale[$sdf['order_id']]['ship_time'],
'create_time' => time(), #单据进入系统的时间
'member' => '',
'type' => '12',
'order_bn' => $sdf['order_bn'],
'crc32_order_bn' => sprintf('%u', crc32($sdf['order_bn'])),
'relate_order_bn' => $sdf['compensate_bn'],
'crc32_relate_order_bn' => $sdf['compensate_bn'] ? sprintf('%u', crc32($sdf['compensate_bn'])) : null,
'channel_id' => $sdf['shop_id'],
'channel_name' => $arrShop[$sdf['shop_id']]['name'],
'unconfirm_money' => $money,
'charge_status' => 1,
'charge_time' => time(),
'money' => $money,
'serial_number' => $sdf['compensate_bn'],
'unique_id' => md5($sdf['compensate_bn']),
'ar_type' => 1,
'verification_flag' => 0,
'addon' => '',
'memo' => '',
);
$ar_data['monthly_id'] = 0;
$ar_data['monthly_item_id'] = 0;
$ar_data['monthly_status'] = 0;
$ar_id = $mdlBillAr->insert($ar_data);
if (!$ar_id) {
throw new Exception('插入ar单据表失败');
}
$db->commit();
kernel::single('finance_monthly_report_items')->dealArMatchReport($ar_id);
} catch (Exception $e) {
$db->rollBack();
$msg = $e->getMessage();
$oFunc->writelog('导入应退单' . $sdf['compensate_bn'] . '出错:', 'compensate', $msg);
/**kernel::single('monitor_event_notify')->addNotify('finance_refunds', [
'bn' => $ar_data['serial_number'],
'errmsg' => $msg,
]);**/
}
}
}
}