Files
OMS/app/console/lib/delivery/cancel.php
chenping 61783b7d01 1. 【新增】售后单售后原因类型支持搜索
2. 【新增】手工创建订单折扣可输入正数

3. 【优化】盘点申请单确认

4. 【修复】采购退货单模拟出库失败问题

5. 【新增】订单金额客户实付与结算金额

6. 【优化】仓库发货统计报表物料名称显示

7. 【优化】自有仓储虚拟发货逻辑

8. 【修复】基础物料分类管理问题
2026-04-01 11:59:17 +08:00

151 lines
6.4 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
/**
* 发货单取消处理类
*/
class console_delivery_cancel {
/**
* 发货单强制取消后的处理如果拆分数量为0且支付状态为全额退款则更新为已删除并更新主表金额
* @param int $delivery_id 发货单ID
* @return array [bool, array]
*/
public function afterForce($delivery_id)
{
try {
// 初始化模型
$deliveryItemsDetailModel = app::get('ome')->model('delivery_items_detail');
$orderItemsModel = app::get('ome')->model('order_items');
$orderObjectsModel = app::get('ome')->model('order_objects');
// 1. 获取发货单关联的订单明细信息
$deliveryItemsDetails = $deliveryItemsDetailModel->getList('order_item_id,order_id,order_obj_id', [
'delivery_id' => $delivery_id
]);
if (empty($deliveryItemsDetails)) {
return [true, ['msg' => '发货单没有关联的订单明细']];
}
// 2. 获取符合条件的订单明细拆分数量为0且未删除
$orderItemIds = array_column($deliveryItemsDetails, 'order_item_id');
$orderItems = $orderItemsModel->getList('item_id,obj_id,order_id,split_num,`delete`', [
'item_id' => $orderItemIds,
'split_num' => 0,
'delete' => 'false'
]);
if (empty($orderItems)) {
return [true, ['msg' => '没有符合条件的订单明细需要处理']];
}
// 3. 获取订单子单支付状态映射
$objIds = array_column($orderItems, 'obj_id');
$orderObjects = $orderObjectsModel->getList('obj_id,pay_status', ['obj_id' => $objIds]);
$objPayStatusMap = [];
foreach ($orderObjects as $obj) {
$objPayStatusMap[$obj['obj_id']] = $obj['pay_status'];
}
// 4. 分析需要删除的订单明细和子单
$itemsToDeleteByOrder = [];
$objectsToDeleteByOrder = [];
$totalDeletedCount = 0;
// 按订单ID分组处理
$orderItemsGrouped = [];
foreach ($orderItems as $item) {
$orderItemsGrouped[$item['order_id']][] = $item;
}
foreach ($orderItemsGrouped as $order_id => $items) {
$itemsToDelete = [];
$objectsToDelete = [];
// 按子单分组检查
$itemsByObject = [];
foreach ($items as $item) {
$itemsByObject[$item['obj_id']][] = $item;
}
foreach ($itemsByObject as $obj_id => $objItems) {
// 检查支付状态是否为全额退款(5)且所有明细拆分数量都为0
if (isset($objPayStatusMap[$obj_id]) && $objPayStatusMap[$obj_id] == '5') {
$allSplitNumZero = true;
foreach ($objItems as $item) {
if ($item['split_num'] != 0) {
$allSplitNumZero = false;
break;
}
}
// 只有该子单下所有明细的拆分数量都为0时才删除
if ($allSplitNumZero) {
foreach ($objItems as $item) {
$itemsToDelete[] = $item['item_id'];
}
$objectsToDelete[] = $obj_id;
}
}
}
if (!empty($itemsToDelete)) {
$itemsToDeleteByOrder[$order_id] = $itemsToDelete;
$objectsToDeleteByOrder[$order_id] = array_unique($objectsToDelete);
$totalDeletedCount += count($itemsToDelete);
}
}
if (empty($itemsToDeleteByOrder)) {
return [true, ['msg' => '没有需要删除的订单明细']];
}
// 5. 执行删除操作
// 更新订单明细为已删除
$allItemsToDelete = array_merge(...array_values($itemsToDeleteByOrder));
$updateResult = $orderItemsModel->update(['delete' => 'true'], ['item_id' => $allItemsToDelete]);
if (!$updateResult) {
return [false, ['msg' => '更新订单明细删除状态失败']];
}
// 更新订单子单为已删除
$allObjectsToDelete = array_merge(...array_values($objectsToDeleteByOrder));
if (!empty($allObjectsToDelete)) {
$updateObjectResult = $orderObjectsModel->update(['delete' => 'true'], ['obj_id' => $allObjectsToDelete]);
if (!$updateObjectResult) {
return [false, ['msg' => '更新订单子单删除状态失败']];
}
}
// 6. 重新计算每个订单的金额
$recalculateResults = [];
foreach ($objectsToDeleteByOrder as $order_id => $objectsToDelete) {
if (empty($objectsToDelete)) {
continue;
}
$orderObjectsData = $orderObjectsModel->getList('obj_id,amount,divide_order_fee,pmt_price,part_mjz_discount,actually_amount,settlement_amount', [
'obj_id' => $objectsToDelete
]);
$recalculateResult = kernel::single('ome_order_object_amount')->recalculateOrderAmount($order_id, $orderObjectsData);
if (!$recalculateResult[0]) {
$recalculateResults[] = "订单ID {$order_id}: " . $recalculateResult[1]['msg'];
}
}
if (!empty($recalculateResults)) {
return [false, ['msg' => '部分订单金额重新计算失败:' . implode('; ', $recalculateResults)]];
}
return [true, ['msg' => '订单明细和子单处理成功']];
} catch (Exception $e) {
// 记录错误日志
return [false, ['msg' => '处理订单明细失败:' . $e->getMessage()]];
}
}
}