mirror of
https://gitee.com/ShopeX/OMS
synced 2026-04-20 20:10:28 +08:00
1. 【新增】售后单售后原因类型支持搜索
2. 【新增】手工创建订单折扣可输入正数 3. 【优化】盘点申请单确认 4. 【修复】采购退货单模拟出库失败问题 5. 【新增】订单金额客户实付与结算金额 6. 【优化】仓库发货统计报表物料名称显示 7. 【优化】自有仓储虚拟发货逻辑 8. 【修复】基础物料分类管理问题
This commit is contained in:
311
app/ome/lib/autotask/timer/autoconfirmorderstockinc.php
Normal file
311
app/ome/lib/autotask/timer/autoconfirmorderstockinc.php
Normal file
@@ -0,0 +1,311 @@
|
||||
<?php
|
||||
/**
|
||||
* 基础物料增加库存时,每小时定时运行,自动审核库存不足的订单
|
||||
*
|
||||
* 逻辑:
|
||||
* 1) 读取60分钟内“库存增加”的基础物料;
|
||||
* 2) 获取库存不足的未审核订单;
|
||||
* 3) 每小时匹配有库存的基础物料,进行自动审核订单。
|
||||
*
|
||||
* 注意:定时任务本身由外部调度高频触发,本类内部通过kvstore控制60分钟频率。
|
||||
*/
|
||||
class ome_autotask_timer_autoconfirmorderstockinc
|
||||
{
|
||||
/**
|
||||
* 60分钟执行一次
|
||||
*/
|
||||
const FREQUENCY_SECONDS = 3600;
|
||||
|
||||
/**
|
||||
* 并发锁(缓存锁)
|
||||
*/
|
||||
const LOCK_KEY = 'inc_store_autoconfirmorder_lock';
|
||||
|
||||
/**
|
||||
* 最后执行时间(kvstore)
|
||||
*/
|
||||
const LAST_EXEC_TIME_KEY = 'inc_store_autoconfirmorder';
|
||||
|
||||
public function process($params, &$error_msg = '')
|
||||
{
|
||||
set_time_limit(0);
|
||||
ignore_user_abort(1);
|
||||
@ini_set('memory_limit', '512M');
|
||||
|
||||
$now = time();
|
||||
|
||||
// 60分钟频控(即使本次无数据也会更新lasttime,避免高频空跑)
|
||||
base_kvstore::instance('ome')->fetch(self::LAST_EXEC_TIME_KEY, $lastExecTime);
|
||||
$lastExecTime = $lastExecTime ? (int)$lastExecTime : 0;
|
||||
if ($lastExecTime && ($now - $lastExecTime) < self::FREQUENCY_SECONDS) {
|
||||
$error_msg = 'its not time yet,lastExecTime:'. $lastExecTime;
|
||||
return true;
|
||||
}
|
||||
|
||||
// 防并发
|
||||
$isRun = cachecore::fetch(self::LOCK_KEY);
|
||||
if ($isRun) {
|
||||
$error_msg = 'running';
|
||||
return true;
|
||||
}
|
||||
cachecore::store(self::LOCK_KEY, 'running', self::FREQUENCY_SECONDS);
|
||||
|
||||
// 指定时间前的时间戳
|
||||
$lastmodify = $now - self::FREQUENCY_SECONDS;
|
||||
|
||||
// 查询订单时间范围
|
||||
$start_time = strtotime('-7 days', strtotime('today')); // 7天前零点的时间戳
|
||||
$end_time = $now - 1800; // 30分钟前的时间戳
|
||||
|
||||
// 库存不足的二进制
|
||||
$storeCode = omeauto_auto_const::__STORE_CODE;
|
||||
|
||||
try {
|
||||
$db = kernel::database();
|
||||
$orderItemMdl = app::get('ome')->model('order_items');
|
||||
|
||||
// 第一步:查询60分钟内有“库存增加”的基础物料行数。
|
||||
$sql = "SELECT count(*) AS nums FROM sdb_material_basic_material_stock WHERE inc_store_lastmodify >= {$lastmodify} AND store>store_freeze";
|
||||
$row = $db->selectrow($sql);
|
||||
if($row['nums'] <= 0){
|
||||
// kvstore
|
||||
base_kvstore::instance('ome')->store(self::LAST_EXEC_TIME_KEY, $now);
|
||||
|
||||
$error_msg = '没有获取到“库存增加”的基础物料';
|
||||
return true;
|
||||
}
|
||||
|
||||
// 第二步:根据库存不足状态码(omeauto_auto_const::__STORE_CODE)查询订单行数,并且订单是未审核的。
|
||||
$sql = "SELECT count(*) AS nums FROM sdb_ome_orders WHERE process_status IN('unconfirmed', 'splitting') ";
|
||||
$sql .= " AND status='active' AND createtime>={$start_time} AND createtime<{$end_time} ";
|
||||
$sql .= "AND (auto_status & {$storeCode} = {$storeCode}) ";
|
||||
$row = $db->selectrow($sql);
|
||||
if($row['nums'] <= 0){
|
||||
// kvstore
|
||||
base_kvstore::instance('ome')->store(self::LAST_EXEC_TIME_KEY, $now);
|
||||
|
||||
$error_msg = '没有获取到“库存不足”的订单';
|
||||
return true;
|
||||
}
|
||||
|
||||
$orderCountNums = $row['nums'];
|
||||
|
||||
// 第三步:获取60分钟内有“库存增加”的基础物料列表
|
||||
$sql = "SELECT bm_id,store,store_freeze FROM sdb_material_basic_material_stock WHERE inc_store_lastmodify >= {$lastmodify} AND store>store_freeze LIMIT 0, 5000";
|
||||
$tempList = $db->select($sql);
|
||||
if (empty($tempList)) {
|
||||
// kvstore
|
||||
base_kvstore::instance('ome')->store(self::LAST_EXEC_TIME_KEY, $now);
|
||||
|
||||
$error_msg = '没有可执行的基础物料';
|
||||
return true;
|
||||
}
|
||||
|
||||
// format
|
||||
$bmList = [];
|
||||
foreach ($tempList as $bmKey => $bmVal)
|
||||
{
|
||||
$bm_id = $bmVal['bm_id'];
|
||||
|
||||
// 可用库存数量
|
||||
$avail_qty = $bmVal['store'] - $bmVal['store_freeze'];
|
||||
|
||||
$bmList[$bm_id] = ['bm_id'=>$bm_id, 'avail_qty'=>$avail_qty];
|
||||
}
|
||||
|
||||
// bm_id
|
||||
$bmIds = array_keys($bmList);
|
||||
|
||||
// 第四步:获取符合条件的订单
|
||||
$execOrderIds = [];
|
||||
|
||||
// exec
|
||||
$limit = 100;
|
||||
$pageCount = ceil($orderCountNums / $limit);
|
||||
for($page_i=1; $page_i <= $pageCount; $page_i++)
|
||||
{
|
||||
// offset
|
||||
$offset = ($page_i - 1) * $limit;
|
||||
|
||||
// select
|
||||
$order_sql = "SELECT order_id,order_bn,archive,is_fail,abnormal,pause,pay_status,ship_status,is_not_combine FROM sdb_ome_orders WHERE ";
|
||||
$order_sql .= " process_status IN('unconfirmed', 'splitting') AND status='active' AND createtime>={$start_time} AND createtime<{$end_time} ";
|
||||
$order_sql .= "AND (auto_status & {$storeCode} = {$storeCode}) ";
|
||||
$order_sql .= " LIMIT ". $offset .", ". $limit;
|
||||
$orderList = $db->select($order_sql);
|
||||
if(empty($orderList)){
|
||||
continue;
|
||||
}
|
||||
|
||||
// order_id
|
||||
$orderIds = array_column($orderList, 'order_id');
|
||||
|
||||
// order_items
|
||||
$itemList = $orderItemMdl->getList('item_id,order_id,product_id,bn,nums,split_num', ['order_id'=>$orderIds, 'delete'=>'false']);
|
||||
if(empty($itemList)){
|
||||
continue;
|
||||
}
|
||||
|
||||
// format
|
||||
$orderItems = [];
|
||||
foreach ($itemList as $itemKey => $itemVal)
|
||||
{
|
||||
$order_id = $itemVal['order_id'];
|
||||
$product_id = $itemVal['product_id'];
|
||||
|
||||
// check
|
||||
if($itemVal['split_num'] >= $itemVal['nums']){
|
||||
continue;
|
||||
}
|
||||
|
||||
// 检查基础物料ID是否在有效列表中
|
||||
if(!in_array($product_id, $bmIds)){
|
||||
continue;
|
||||
}
|
||||
|
||||
// 需要审核的基础物料数量
|
||||
$itemVal['true_num'] = $itemVal['nums'] - $itemVal['split_num'];
|
||||
|
||||
$orderItems[$order_id][$product_id] = $itemVal;
|
||||
}
|
||||
|
||||
// 订单行循环
|
||||
foreach ($orderList as $orderKey => $orderVal)
|
||||
{
|
||||
$order_id = $orderVal['order_id'];
|
||||
|
||||
// 检查订单状态
|
||||
if($orderVal['archive'] != '0' || $orderVal['pause'] != 'false'){
|
||||
continue;
|
||||
}
|
||||
|
||||
if($orderVal['is_fail'] != 'false' || $orderVal['abnormal'] != 'false'){
|
||||
continue;
|
||||
}
|
||||
|
||||
if($orderVal['pay_status'] != '1'){
|
||||
continue;
|
||||
}
|
||||
|
||||
if($orderVal['is_not_combine'] != 0){
|
||||
continue;
|
||||
}
|
||||
|
||||
// 仅处理未发货/部分发货的订单
|
||||
if(!in_array((int)$orderVal['ship_status'], [0, 2])){
|
||||
continue;
|
||||
}
|
||||
|
||||
// 检查订单明细是否存在
|
||||
if(!isset($orderItems[$order_id])){
|
||||
continue;
|
||||
}
|
||||
|
||||
$execOrderIds[$order_id] = $order_id;
|
||||
}
|
||||
}
|
||||
|
||||
// 检查是否有可执行的订单
|
||||
if(empty($execOrderIds)){
|
||||
// kvstore
|
||||
base_kvstore::instance('ome')->store(self::LAST_EXEC_TIME_KEY, $now);
|
||||
|
||||
$error_msg = '没有可执行的订单';
|
||||
return true;
|
||||
}
|
||||
|
||||
// 第五步:检验可用库存数量,是否符合审核订单的基础物料购买数量,如果订单不符合,则注销掉:unset($execOrderIds[$order_id]);
|
||||
foreach ($execOrderIds as $order_id => $tmp)
|
||||
{
|
||||
// check
|
||||
if(!isset($orderItems[$order_id]) || empty($orderItems[$order_id])){
|
||||
// unset
|
||||
unset($execOrderIds[$order_id]);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// 汇总该订单在“库存增加物料”上的需求数量(按bm_id汇总)
|
||||
$needMap = [];
|
||||
foreach ($orderItems[$order_id] as $bm_id => $itemVal)
|
||||
{
|
||||
// check
|
||||
if(!isset($itemVal['true_num'])){
|
||||
continue;
|
||||
}
|
||||
|
||||
if($itemVal['true_num'] <= 0){
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isset($needMap[$bm_id])) {
|
||||
$needMap[$bm_id] = 0;
|
||||
}
|
||||
|
||||
$needMap[$bm_id] += $itemVal['true_num'];
|
||||
}
|
||||
|
||||
// check
|
||||
if (empty($needMap)) {
|
||||
// unset
|
||||
unset($execOrderIds[$order_id]);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// 校验可用库存是否满足该订单需求
|
||||
foreach ($needMap as $bm_id => $needQty)
|
||||
{
|
||||
$availQty = isset($bmList[$bm_id]) ? (int)$bmList[$bm_id]['avail_qty'] : 0;
|
||||
if ($availQty < $needQty) {
|
||||
// unset
|
||||
unset($execOrderIds[$order_id]);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// check
|
||||
if (empty($execOrderIds)) {
|
||||
// kvstore
|
||||
base_kvstore::instance('ome')->store(self::LAST_EXEC_TIME_KEY, $now);
|
||||
|
||||
$error_msg = '符合基础物料库存的订单为0条';
|
||||
return true;
|
||||
}
|
||||
|
||||
// 延迟自动审核订单
|
||||
$line_i = 0;
|
||||
foreach ($execOrderIds as $order_id)
|
||||
{
|
||||
$line_i++;
|
||||
|
||||
// 递增延迟的秒数
|
||||
$second = 300 + ($line_i * 3);
|
||||
|
||||
// params
|
||||
$params = [
|
||||
'op_type' => 'timing_confirm',
|
||||
'timing_time' => time() + $second, // 延迟5分钟
|
||||
'memo' => '基础物料增加库存,自动审核库存不足的订单',
|
||||
'cnAuto' => 'true', // 防止系统设置里未开启[是否开启系统自动审核]
|
||||
];
|
||||
$result = kernel::single('ome_order')->auto_order_combine($order_id, $params);
|
||||
}
|
||||
|
||||
// kvstore
|
||||
base_kvstore::instance('ome')->store(self::LAST_EXEC_TIME_KEY, $now);
|
||||
|
||||
$error_msg = '符合条件的订单:'. count($execOrderIds) .'条,系统会触发延迟自动审核订单';
|
||||
|
||||
return true;
|
||||
} catch (Exception $e) {
|
||||
$error_msg = $e->getMessage();
|
||||
return false;
|
||||
} finally {
|
||||
cachecore::delete(self::LOCK_KEY);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,8 +48,8 @@ class ome_autotask_timer_hour
|
||||
kernel::single('ome_compensate_record')->timeSync();
|
||||
|
||||
//[京东云交易]每小时定时拉取退货寄件地址
|
||||
$keplerLib = kernel::single('ome_reship_kepler');
|
||||
$keplerLib->getReshipAddress();
|
||||
//$keplerLib = kernel::single('ome_reship_kepler');
|
||||
//$keplerLib->getReshipAddress();
|
||||
|
||||
//[兼容]重试推送回传平台发货状态是"发货中"的订单
|
||||
//todo:最近发现回传抖音平台发货状态,矩阵没有响应结果
|
||||
@@ -59,6 +59,9 @@ class ome_autotask_timer_hour
|
||||
//每小时触发回写 在misctask中
|
||||
//kernel::single('erpapi_misc_task')->hour();
|
||||
|
||||
// 每小时触发:库存增加自动审核订单
|
||||
kernel::single('ome_autotask_timer_autoconfirmorderstockinc')->process($params, $error_msg);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
98
app/ome/lib/autotask/timer/platform/timeliness.php
Normal file
98
app/ome/lib/autotask/timer/platform/timeliness.php
Normal file
@@ -0,0 +1,98 @@
|
||||
<?PHP
|
||||
/**
|
||||
* 订单发货时效检查定时任务
|
||||
*
|
||||
* @author AI Assistant
|
||||
* @version 1.0
|
||||
*/
|
||||
|
||||
class ome_autotask_timer_platform_timeliness
|
||||
{
|
||||
public function process($params, &$error_msg=''){
|
||||
set_time_limit(0);
|
||||
ignore_user_abort(1);
|
||||
ini_set('memory_limit', '512M');
|
||||
try {
|
||||
// 1. 获取平台时效数据
|
||||
$platformSetModel = app::get('ome')->model('platform_set');
|
||||
$timelinessList = $platformSetModel->getList('shop_type, kname, kvalue', array('scene' => 'delivery', 'kname' => 'delivery_hour'));
|
||||
|
||||
if (empty($timelinessList)) {
|
||||
$error_msg = '未找到平台时效配置数据';
|
||||
return false;
|
||||
}
|
||||
|
||||
// 2. 获取符合条件的订单数据
|
||||
$orderModel = app::get('ome')->model('orders');
|
||||
$currentTime = time();
|
||||
|
||||
// 构建查询条件:status=active, pay_status=1, ship_status=0
|
||||
$filter = array(
|
||||
'status' => 'active',
|
||||
'pay_status' => '1',
|
||||
'ship_status' => '0',
|
||||
'paytime|than' => strtotime('-7 days'), // 近7天已支付订单
|
||||
);
|
||||
|
||||
$orders = $orderModel->getList('order_id, order_bn, shop_type, paytime', $filter, 0, 10000);
|
||||
|
||||
if (empty($orders)) {
|
||||
$error_msg = '未找到符合条件的订单';
|
||||
return true;
|
||||
}
|
||||
|
||||
// 3. 检查每个订单的发货时效
|
||||
$timelinessAlerts = array(); // 时效提醒
|
||||
|
||||
foreach ($orders as $order) {
|
||||
if (empty($order['paytime'])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$payTime = $order['paytime'];
|
||||
$timeDiff = $currentTime - $payTime;
|
||||
$timeDiffHours = $timeDiff / 3600; // 转换为小时
|
||||
|
||||
// 获取该平台配置的时效
|
||||
$platformHour = 24; // 默认24小时
|
||||
foreach ($timelinessList as $timeliness) {
|
||||
if ($timeliness['shop_type'] == $order['shop_type']) {
|
||||
$platformHour = intval($timeliness['kvalue']);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 计算剩余时间
|
||||
$remainingHours = $platformHour - $timeDiffHours;
|
||||
|
||||
// 检查是否需要发送提醒(剩余时间小于等于1小时时提醒)
|
||||
if ($remainingHours <= 1 && $remainingHours > 0) {
|
||||
$timelinessAlerts[] = array(
|
||||
'order_bn' => $order['order_bn'],
|
||||
'shop_type' => ome_shop_type::shop_name($order['shop_type']),
|
||||
'paytime' => date('Y-m-d H:i:s', $order['paytime']),
|
||||
'remaining_hours' => round($remainingHours, 1)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// 4. 发送提醒通知
|
||||
$alertCount = 0;
|
||||
|
||||
// 发送时效提醒
|
||||
if (!empty($timelinessAlerts)) {
|
||||
foreach ($timelinessAlerts as $alert) {
|
||||
kernel::single('monitor_event_notify')->addNotify('order_delivery_timeliness', $alert);
|
||||
$alertCount++;
|
||||
}
|
||||
}
|
||||
|
||||
$error_msg = "处理完成,共发送 {$alertCount} 条时效提醒";
|
||||
return true;
|
||||
|
||||
} catch (Exception $e) {
|
||||
$error_msg = '处理过程中发生错误:' . $e->getMessage();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -23,248 +23,72 @@
|
||||
* @version 0.1
|
||||
*/
|
||||
|
||||
class ome_autotask_timer_retrydeliverycancel extends ome_autotask_timer_common
|
||||
class ome_autotask_timer_retrydeliverycancel
|
||||
{
|
||||
private $ttl = 60*6; // kv过期时间
|
||||
|
||||
public function process($params, &$error_msg = '')
|
||||
{
|
||||
set_time_limit(0);
|
||||
ignore_user_abort(1);
|
||||
|
||||
base_kvstore::instance('ome/retrydeliverycancel')->fetch('process_status', $process_status);
|
||||
if (!$process_status) {
|
||||
$process_status = 'finish';
|
||||
}
|
||||
if ($process_status == 'running') {
|
||||
$error_msg = 'is running';
|
||||
return true; // 时间未到
|
||||
// 防重逻辑
|
||||
base_kvstore::instance(__CLASS__)->fetch('status', $status);
|
||||
if ($status == 'running') {
|
||||
$error_msg = '重试推送WMS发货单取消任务正在运行,请勿重复操作!';
|
||||
return true;
|
||||
}
|
||||
|
||||
// $db = kernel::database();
|
||||
base_kvstore::instance(__CLASS__)->store('status', 'running', 3600);
|
||||
|
||||
// ==================================================================
|
||||
// ==================================================================
|
||||
|
||||
base_kvstore::instance('ome/retrydeliverycancel')->store('process_status', 'running', $this->ttl);
|
||||
|
||||
$orderMdl = app::get('ome')->model('orders');
|
||||
$oderObjectMdl = app::get('ome')->model('order_objects');
|
||||
$deliveryMdl = app::get('ome')->model('delivery');
|
||||
$deliveryItemDtlMdl = app::get('ome')->model('delivery_items_detail');
|
||||
$refundApplyMdl = app::get('ome')->model('refund_apply');
|
||||
$dlyOrderMdl = app::get('ome')->model('delivery_order');
|
||||
$apiFailMdl = app::get('erpapi')->model('api_fail');
|
||||
|
||||
|
||||
// 每次取最早30条,order by last_modified asc
|
||||
$retryError = [
|
||||
'系统繁忙',
|
||||
'请稍后再试',
|
||||
'不存在',
|
||||
'timed out',
|
||||
'请求超时',
|
||||
];
|
||||
// 发货单取消推送wms失败
|
||||
$filter = array(
|
||||
'sync_status' => '4', // 取消失败
|
||||
'status' => ['ready','progress'],
|
||||
'parent_id' => '0',
|
||||
'filter_sql' => ' sync_msg REGEXP "'.implode('|',$retryError).'"',
|
||||
// 'delivery_bn' => '25052610029788',
|
||||
);
|
||||
$deliveryList = $deliveryMdl->getList('delivery_id, delivery_bn', $filter, 0 ,30, 'last_modified ASC');
|
||||
|
||||
if (!$deliveryList) {
|
||||
$error_msg = 'no info to work';
|
||||
return $this->_finish();
|
||||
}
|
||||
|
||||
$deliveryList = array_column($deliveryList, null, 'delivery_id');
|
||||
$deliveryIds = array_column($deliveryList, 'delivery_id');
|
||||
$deliveryBns = array_column($deliveryList, 'delivery_bn');
|
||||
|
||||
// 检测失败重试里,是否有发货单推送失败的,有则过滤掉不处理
|
||||
$addDeliveryFailList = $apiFailMdl->getList('obj_bn', ['obj_type'=>'delivery', 'obj_bn|in'=>$deliveryBns]);
|
||||
if ($addDeliveryFailList) {
|
||||
$addDeliveryFailList = array_column($addDeliveryFailList, 'obj_bn');
|
||||
}
|
||||
|
||||
foreach ($deliveryList as $delivery_id => $dv) {
|
||||
// 先更新最后更新时间,保证数据流动
|
||||
$deliveryMdl->update(['last_modified'=>time()], ['delivery_id'=>$delivery_id]);
|
||||
|
||||
if (in_array($dv['delivery_bn'], $addDeliveryFailList)) {
|
||||
unset($deliveryList[$delivery_id]);
|
||||
}
|
||||
}
|
||||
if (!$deliveryList) {
|
||||
$error_msg = 'no normal info to work';
|
||||
return $this->_finish();
|
||||
}
|
||||
|
||||
|
||||
// 根据delivery_id获取sdb_ome_delivery_items_detail里的oid,order_id,order_obj_id
|
||||
$deliveryItemDtlList = $deliveryItemDtlMdl->getList('delivery_id,oid,order_id,order_obj_id', ['delivery_id' => $deliveryIds]);
|
||||
if (!$deliveryItemDtlList) {
|
||||
$error_msg = 'delivery_items_detail is null';
|
||||
return $this->_finish();
|
||||
}
|
||||
foreach ($deliveryItemDtlList as $dv) {
|
||||
$deliveryList[$dv['delivery_id']]['detail'][$dv['order_id']][] = $dv;
|
||||
}
|
||||
|
||||
// 根据delivery_id获取对应的order_id
|
||||
$deliveryOrderList = $dlyOrderMdl->getList('*', ['delivery_id|in' => $deliveryIds]);
|
||||
$orderIds = array_column($deliveryOrderList, 'order_id');
|
||||
if (!$orderIds) {
|
||||
$error_msg = 'delivery_order is null';
|
||||
return $this->_finish();
|
||||
}
|
||||
|
||||
// 获取order信息
|
||||
$orderList = $orderMdl->getList('order_id, pay_status, status, process_status', ['order_id|in' => $orderIds]);
|
||||
$orderList = array_column($orderList, null, 'order_id');
|
||||
if (!$orderList) {
|
||||
$error_msg = 'orders is null';
|
||||
return $this->_finish();
|
||||
}
|
||||
foreach ($deliveryOrderList as $_doinfo) {
|
||||
$deliveryList[$_doinfo['delivery_id']]['orders'][$_doinfo['order_id']] = $orderList[$_doinfo['order_id']];
|
||||
}
|
||||
|
||||
// 根据order_id获取order_object信息
|
||||
$orderObjectList = $oderObjectMdl->getList('order_id,oid,pay_status', ['order_id|in'=>$orderIds]);
|
||||
$orderObjectList = array_column($orderObjectList, null, 'order_id');
|
||||
if (!$orderObjectList) {
|
||||
$error_msg = 'order_objects is null';
|
||||
return $this->_finish();
|
||||
}
|
||||
|
||||
// 根据order_id获取退款状态是‘已退款’的退款单申请单
|
||||
$refundApplyList = [];
|
||||
$_refundApplyList = $refundApplyMdl->getList('*', [
|
||||
'order_id' => $orderIds,
|
||||
'status|in' => ['4'],
|
||||
// 获取取消失败的发货单(6小时之内创建的)
|
||||
$sync = kernel::single('console_delivery_bool_sync')->getBoolSync([
|
||||
'in' => [console_delivery_bool_sync::__CANCEL_FAIL]
|
||||
]);
|
||||
foreach ($_refundApplyList as $_rainfo) {
|
||||
$_rainfo['product_data'] = @unserialize($_rainfo['product_data']);
|
||||
//价保退款标识
|
||||
if ($_rainfo['bool_type'] & ome_refund_bool_type::__PROTECTED_CODE) {
|
||||
$_rainfo['isPriceProtect'] = true;
|
||||
}
|
||||
$refundApplyList[$_rainfo['order_id']][] = $_rainfo;
|
||||
|
||||
$sixHoursAgo = time() - 6 * 3600;
|
||||
|
||||
$deliveryList = app::get('console')->model('delivery')->getList(
|
||||
'delivery_id,branch_id,delivery_bn,status',
|
||||
[
|
||||
'filter_sql' => 'sync in (' . implode(',', $sync) . ') AND sync > 9 AND create_time >= ' . $sixHoursAgo,
|
||||
'status' => ['ready', 'progress'],
|
||||
'parent_id' => 0
|
||||
],
|
||||
0,
|
||||
30,
|
||||
'last_modified ASC'
|
||||
);
|
||||
|
||||
if (empty($deliveryList)) {
|
||||
$error_msg = 'no delivery to retry';
|
||||
base_kvstore::instance(__CLASS__)->delete('status');
|
||||
return true;
|
||||
}
|
||||
|
||||
foreach ($deliveryList as $delivery_id => $delivery) {
|
||||
|
||||
$memo = '系统自动重试发货单取消 ';
|
||||
|
||||
// 订单是全额退款的,并且订单状态是active的,直接cancel
|
||||
foreach ($delivery['detail'] as $order_id => $deliveryDetails) {
|
||||
if (!isset($delivery['orders'][$order_id]) || !$delivery['orders'][$order_id]) {
|
||||
unset($delivery['detail'][$order_id]);
|
||||
continue;
|
||||
}
|
||||
if (!isset($refundApplyList[$order_id]) || !$refundApplyList[$order_id]) {
|
||||
unset($delivery['detail'][$order_id]);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($delivery['orders'][$order_id]['pay_status'] == '5') {
|
||||
if ($delivery['orders'][$order_id]['status'] == 'active' && in_array($delivery['orders'][$order_id]['process_status'], ['splitting', 'splited'])) {
|
||||
$res = $orderMdl->cancel($order_id, $memo, 'false', 'async', false);
|
||||
}
|
||||
unset($delivery['detail'][$order_id]);
|
||||
}
|
||||
}
|
||||
|
||||
// 暂时只处理订单全额退款的单据
|
||||
// 暂时只处理订单全额退款的单据
|
||||
// $deliveryMdl->update(['last_modified'=>time()], ['delivery_id'=>$delivery_id]);
|
||||
continue;
|
||||
// 暂时只处理订单全额退款的单据
|
||||
// 暂时只处理订单全额退款的单据
|
||||
|
||||
if (!$delivery['detail']) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$deliveryMdl = app::get('console')->model('delivery');
|
||||
|
||||
// 处理每个发货单
|
||||
foreach ($deliveryList as $delivery) {
|
||||
$delivery_id = $delivery['delivery_id'];
|
||||
|
||||
// 取消发货单
|
||||
$result = $deliveryMdl->rebackDelivery($delivery_id, $memo);
|
||||
if (!$result) {
|
||||
continue;
|
||||
$res = ome_delivery_notice::cancel($delivery, true);
|
||||
|
||||
if ($res['rsp'] == 'success' || $res['rsp'] == 'succ') {
|
||||
// 更新发货单状态(update方法内已记录日志)
|
||||
$data = array(
|
||||
'status' => 'cancel',
|
||||
'memo' => '系统自动重试取消发货单',
|
||||
'delivery_bn' => $delivery['delivery_bn'],
|
||||
);
|
||||
kernel::single('ome_event_receive_delivery')->update($data);
|
||||
} else {
|
||||
// 失败时更新 last_modified,让数据流动
|
||||
$deliveryMdl->update(['last_modified' => time()], ['delivery_id' => $delivery_id]);
|
||||
}
|
||||
|
||||
// delivery对应的order,如果pay_status=5,直接调用ordercancel
|
||||
// deliver下的oid对应的退款申请单
|
||||
// 再用退款申请单查order_obj,pay_status是不是5,不是5,调用_autoEditorder,如果是5,continue。
|
||||
|
||||
foreach ($delivery['detail'] as $order_id => $deliveryDetails) {
|
||||
|
||||
// 退款申请单详情
|
||||
$refundApplys = $refundApplyList[$order_id];
|
||||
if (!$refundApplys) {
|
||||
// 如果没有对应的退款申请单,只取消发货单
|
||||
continue;
|
||||
}
|
||||
|
||||
// 订单详情
|
||||
$orderDetails = [];
|
||||
if ($orderObjectList[$order_id]) {
|
||||
$orderDetails = array_column($orderObjectList[$order_id], null, 'oid');
|
||||
}
|
||||
|
||||
$deliveryOids = array_column($deliveryDetails, 'oid');
|
||||
$deliveryDetails = array_column($deliveryDetails, null, 'oid');
|
||||
|
||||
foreach ($refundApplys as $_k => $refundApply) {
|
||||
$refundApplyOids = array_column($refundApply['product_data'], 'oid');
|
||||
if (!$refundApplyOids) {
|
||||
continue;
|
||||
}
|
||||
// 判断当前发货单详情是否在退款申请单的详情里,如果一张订单有多张发货单,退款申请一次全退,暂不处理
|
||||
if (count(array_intersect($deliveryOids, $refundApplyOids)) != count($refundApplyOids)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 退款申请单的oid对应的order_object的oid如果有pay_status=5,暂不处理这个退款申请单
|
||||
foreach ($refundApplyOids as $_refundOid) {
|
||||
if (isset($orderDetails[$_refundOid]) && $orderDetails[$_refundOid]['pay_status']== '5') {
|
||||
continue 2;
|
||||
}
|
||||
}
|
||||
|
||||
// 组参数把order_objcts明细做删除处理
|
||||
$sdf = [
|
||||
'order' => [
|
||||
'order_id' => $refundApply['order_id'],
|
||||
],
|
||||
'reason' => $memo,
|
||||
'refund_item_list' => $refundApply['product_data'],
|
||||
// 'oid' => $refundApply['oid'],
|
||||
'refund_fee' => $refundApply['money'],
|
||||
'shop_type' => $refundApply['shop_type'],
|
||||
'isPriceProtect' => $refundApply['isPriceProtect'],
|
||||
'tmall_mcard_pz_sp' => '0',
|
||||
];
|
||||
$error_msg = '';
|
||||
$is_abnormal = false;
|
||||
$isResultEdit = kernel::single('erpapi_shop_response_process_aftersalev2')->_autoEditorder($sdf, $error_msg, $is_abnormal);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return $this->_finish();
|
||||
}
|
||||
|
||||
|
||||
private function _finish($status = true, $process_status = 'finish')
|
||||
{
|
||||
base_kvstore::instance('ome/retrydeliverycancel')->store('process_status', $process_status, $this->ttl);
|
||||
return $status;
|
||||
base_kvstore::instance(__CLASS__)->delete('status');
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -110,6 +110,12 @@ class ome_autotask_timer_retryreshipcancel extends ome_autotask_timer_common
|
||||
);
|
||||
$reshipMdl->update($updateSdf, array('reship_id'=>$reship['reship_id']));
|
||||
kernel::single('console_reship')->releaseChangeFreeze($reship['reship_id']);
|
||||
// 退货单取消后的service扩展点
|
||||
foreach(kernel::servicelist('console.service.reship.cancel.after') as $object) {
|
||||
if(method_exists($object, 'cancel_reship_after')) {
|
||||
$object->cancel_reship_after($reship['reship_id']);
|
||||
}
|
||||
}
|
||||
$msg = "取消成功";
|
||||
} elseif ($rs['rsp'] == 'fail'){
|
||||
$msg = "取消失败,返回:".$rs['msg'];
|
||||
|
||||
Reference in New Issue
Block a user