mirror of
https://gitee.com/ShopeX/OMS
synced 2026-04-28 03:35:32 +08:00
1. 【新增】售后单售后原因类型支持搜索
2. 【新增】手工创建订单折扣可输入正数 3. 【优化】盘点申请单确认 4. 【修复】采购退货单模拟出库失败问题 5. 【新增】订单金额客户实付与结算金额 6. 【优化】仓库发货统计报表物料名称显示 7. 【优化】自有仓储虚拟发货逻辑 8. 【修复】基础物料分类管理问题
This commit is contained in:
136
app/omeauto/lib/split/customerclassify.php
Normal file
136
app/omeauto/lib/split/customerclassify.php
Normal file
@@ -0,0 +1,136 @@
|
||||
<?php
|
||||
/**
|
||||
* 按客户分类拆Lib方法类
|
||||
*
|
||||
* @author wangbiao@shopex.cn
|
||||
* @version 2025.09.23
|
||||
*/
|
||||
class omeauto_split_customerclassify extends omeauto_split_abstract
|
||||
{
|
||||
/**
|
||||
* 拆单规则配置获取数据
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getSpecial() {
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* 拆单规则配置保存
|
||||
*
|
||||
* @param $sdf
|
||||
* @return array
|
||||
*/
|
||||
public function preSaveSdf(&$sdf)
|
||||
{
|
||||
if(empty($sdf['split_config']['class_id'])) {
|
||||
return array(false, '[客户分类]未选择,请检查!');
|
||||
}
|
||||
|
||||
return array(true, '保存成功');
|
||||
}
|
||||
|
||||
/**
|
||||
* 开始拆单处理
|
||||
*
|
||||
* @param $group 订单组
|
||||
* @param $splitConfig 拆单规则配置信息
|
||||
* @return array|true[]
|
||||
*/
|
||||
public function splitOrder(&$group, $splitConfig)
|
||||
{
|
||||
$salesMaterialObj = app::get('material')->model('sales_material');
|
||||
|
||||
// orders
|
||||
$arrOrder = $group->getOrders();
|
||||
|
||||
// 指定拆单的客户分类
|
||||
$class_id = isset($splitConfig['class_id']) ? $splitConfig['class_id'] : 0;
|
||||
if(empty($class_id)){
|
||||
return array(false, '按客户分类拆单失败:没有指定客户分类');
|
||||
}
|
||||
|
||||
// format
|
||||
$goodsIds = [];
|
||||
foreach ($arrOrder as $orderKey => $orderVal)
|
||||
{
|
||||
// order_objects
|
||||
foreach ($orderVal['objects'] as $objectKey => $objectVal)
|
||||
{
|
||||
$goods_id = $objectVal['goods_id'];
|
||||
|
||||
// order items
|
||||
foreach ($objectVal['items'] as $itemKey => $itemVal)
|
||||
{
|
||||
// 过滤没有可拆分的子商品
|
||||
$itemVal['nums'] = $itemVal['nums'] - $itemVal['split_num'];
|
||||
if($itemVal['nums'] < 1) {
|
||||
continue 2;
|
||||
}
|
||||
}
|
||||
|
||||
$goodsIds[$goods_id] = $goods_id;
|
||||
}
|
||||
}
|
||||
|
||||
// check
|
||||
if(empty($goodsIds)){
|
||||
return array(false, '按客户分类拆单失败:没有可审核的SKU货品');
|
||||
}
|
||||
|
||||
// 销售物料列表
|
||||
$saleMaterialList = $salesMaterialObj->getList('sm_id,sales_material_bn,class_id', array('sm_id'=>$goodsIds));
|
||||
if(empty($saleMaterialList)){
|
||||
return array(false, '按客户分类拆单失败:没有销售物料');
|
||||
}
|
||||
$saleMaterialList = array_column($saleMaterialList, null, 'sm_id');
|
||||
|
||||
// split
|
||||
$arrOrderId = array();
|
||||
$splitOrder = array();
|
||||
foreach ($arrOrder as $orderKey => $orderVal)
|
||||
{
|
||||
$order_id = $orderVal['order_id'];
|
||||
|
||||
// order_objects
|
||||
foreach ($orderVal['objects'] as $objectKey => $objectVal)
|
||||
{
|
||||
$goods_id = $objectVal['goods_id'];
|
||||
|
||||
// 订单商品是:指定客户分类,则进行拆分
|
||||
if(isset($saleMaterialList[$goods_id]) && $saleMaterialList[$goods_id]['class_id'] == $class_id){
|
||||
// 初始化订单信息
|
||||
if(empty($splitOrder[$orderKey])) {
|
||||
$tempOrderInfo = $orderVal;
|
||||
|
||||
// unset objects
|
||||
unset($tempOrderInfo['objects']);
|
||||
|
||||
$splitOrder[$orderKey] = $tempOrderInfo;
|
||||
}
|
||||
|
||||
$splitOrder[$orderKey]['objects'][$objectKey] = $objectVal;
|
||||
|
||||
// unset
|
||||
unset($arrOrder[$orderKey]['objects'][$objectKey]);
|
||||
}else{
|
||||
$arrOrderId[$order_id] = $order_id;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 剩余需要审单的order_id
|
||||
if ($arrOrderId) {
|
||||
$group->setSplitOrderId($arrOrderId);
|
||||
}
|
||||
|
||||
// 本次需要拆单的货品明细
|
||||
$group->updateOrderInfo($splitOrder);
|
||||
if (empty($splitOrder)) {
|
||||
return array(false, '按客户分类拆单失败:无法拆单');
|
||||
}
|
||||
|
||||
return array(true);
|
||||
}
|
||||
}
|
||||
@@ -81,6 +81,7 @@ class omeauto_split_storemax extends omeauto_split_abstract
|
||||
*/
|
||||
public function splitOrder(&$group, $splitConfig)
|
||||
{
|
||||
$startTime = microtime(true);
|
||||
$arrOrder = $group->getOrders();
|
||||
$arrOrderId = array();
|
||||
$splitOrder = array();
|
||||
@@ -111,7 +112,7 @@ class omeauto_split_storemax extends omeauto_split_abstract
|
||||
if (empty($splitOrder)) {
|
||||
return array(false, '无法拆单');
|
||||
}
|
||||
return array(true);
|
||||
return array(true, '');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -127,6 +128,7 @@ class omeauto_split_storemax extends omeauto_split_abstract
|
||||
|
||||
protected function _splitOrderByStore(&$arrOrder, &$group, $splitConfig)
|
||||
{
|
||||
$startTime = microtime(true);
|
||||
$group->setConfirmBranch(true);
|
||||
$bmIdNum = array();
|
||||
foreach ($arrOrder as $k => $order) {
|
||||
@@ -243,18 +245,36 @@ class omeauto_split_storemax extends omeauto_split_abstract
|
||||
$group->setStoreBranch();
|
||||
$group->setStoreDlyType('o2o_ship');
|
||||
}
|
||||
$logResult = [
|
||||
'初始值' => $branchInfo,
|
||||
'拆分情况' => $rs,
|
||||
'初选仓' => $canBranchId,
|
||||
'终选仓' => $branchId
|
||||
];
|
||||
$this->writeSuccessLog($logResult, $arrOrder);
|
||||
$endTime = microtime(true);
|
||||
$executionTime = $endTime - $startTime;
|
||||
|
||||
if(isset($tid)) {#有仓库规则需要重置仓库
|
||||
$group->setBranchId(array($branchId));
|
||||
}
|
||||
$arrOrder = $rs['order'][$branchId];
|
||||
return [true];
|
||||
|
||||
// 记录插件性能数据
|
||||
$optimizedRs = $this->optimizeSplitDetailsForLog($rs);
|
||||
|
||||
$details = array(
|
||||
'success' => true,
|
||||
'message' => '拆单处理完成',
|
||||
'order_bns' => implode(',', array_column($arrOrder, 'order_bn')),
|
||||
'split_type' => 'storemax',
|
||||
'split_result' => array(
|
||||
'success' => true,
|
||||
'message' => '拆单成功',
|
||||
'split_type' => 'storemax',
|
||||
'initial_branch_info' => $branchInfo,
|
||||
'split_details' => $optimizedRs,
|
||||
'candidate_branches' => $canBranchId,
|
||||
'final_branch' => $branchId
|
||||
)
|
||||
);
|
||||
|
||||
ome_api_log::add_message('plugin', 'split', $executionTime, $details);
|
||||
|
||||
return [true, ''];
|
||||
}
|
||||
|
||||
#根据库存订单处理拆分
|
||||
@@ -518,51 +538,7 @@ class omeauto_split_storemax extends omeauto_split_abstract
|
||||
return $this->sortBranchById($storeRows, $arrO2oBranchId);
|
||||
}
|
||||
|
||||
protected function writeSuccessLog($logResult, $arrOrder)
|
||||
{
|
||||
$bmIdBn = array();
|
||||
$arrOrderBn = array();
|
||||
foreach ($arrOrder as $order) {
|
||||
foreach ($order['objects'] as $ok => $object) {
|
||||
foreach ($object['items'] as $ik => $item) {
|
||||
$bmIdBn[$item['product_id']] = $item['bn'];
|
||||
}
|
||||
}
|
||||
$arrOrderBn[] = $order['order_bn'];
|
||||
}
|
||||
$branchId = array();
|
||||
foreach ($logResult['初始值'] as $v) {
|
||||
$branchId[] = $v['branch_id'];
|
||||
}
|
||||
$branchLib = kernel::single('ome_interface_branch');
|
||||
$branchRows = $branchLib->getList('branch_id, branch_bn', array('branch_id' => $branchId));
|
||||
$branchIdBn = array();
|
||||
foreach ($branchRows as $v) {
|
||||
$branchIdBn[$v['branch_id']] = $v['branch_bn'];
|
||||
}
|
||||
$logResult['id对应编码'] = [
|
||||
'基础物料'=>$bmIdBn,
|
||||
'仓库'=>$branchIdBn,
|
||||
];
|
||||
$apilogModel = app::get('ome')->model('api_log');
|
||||
$log_id = $apilogModel->gen_id();
|
||||
$logsdf = array(
|
||||
'log_id' => $log_id,
|
||||
'task_name' => '按库存就全拆结果',
|
||||
'status' => 'success',
|
||||
'worker' => '',
|
||||
'params' => json_encode(array('store.split', $logResult), JSON_UNESCAPED_UNICODE), #longtext
|
||||
'msg' => '', #text json字符串
|
||||
'log_type' => '',
|
||||
'api_type' => 'response',
|
||||
'memo' => '',
|
||||
'original_bn' => $arrOrderBn[0],
|
||||
'createtime' => time(),
|
||||
'last_modified' => time(),
|
||||
'msg_id' => '',
|
||||
);
|
||||
$apilogModel->insert($logsdf);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 过滤出管控库存的仓库
|
||||
@@ -593,4 +569,72 @@ class omeauto_split_storemax extends omeauto_split_abstract
|
||||
|
||||
return $branchIds;
|
||||
}
|
||||
|
||||
/**
|
||||
* 优化拆单详情数据用于日志记录
|
||||
* 只记录代码中实际使用的字段,减少冗余数据
|
||||
*
|
||||
* @param array $rs 原始拆单结果数据
|
||||
* @return array 优化后的拆单结果数据
|
||||
*/
|
||||
private function optimizeSplitDetailsForLog($rs) {
|
||||
$optimizedRs = array();
|
||||
|
||||
// 优化 order 信息,只记录实际使用的字段
|
||||
if (isset($rs['order'])) {
|
||||
$optimizedOrder = array();
|
||||
foreach ($rs['order'] as $branchId => $orders) {
|
||||
$optimizedOrder[$branchId] = array();
|
||||
foreach ($orders as $order) {
|
||||
$optimizedOrderData = array(
|
||||
'order_id' => $order['order_id'],
|
||||
'order_bn' => $order['order_bn']
|
||||
);
|
||||
|
||||
// 只记录代码中实际使用的 item 字段
|
||||
if (isset($order['objects'])) {
|
||||
$optimizedOrderData['items'] = array();
|
||||
foreach ($order['objects'] as $object) {
|
||||
if (isset($object['items'])) {
|
||||
foreach ($object['items'] as $item) {
|
||||
$optimizedOrderData['items'][] = array(
|
||||
'product_id' => $item['product_id'], // 用于库存计算
|
||||
'nums' => $item['nums'] ?? 0, // 用于数量计算
|
||||
'split_num' => $item['split_num'] ?? 0, // 用于拆单逻辑
|
||||
'original_num' => $item['original_num'] ?? 0 // 用于记录原始数量
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$optimizedOrder[$branchId][] = $optimizedOrderData;
|
||||
}
|
||||
}
|
||||
$optimizedRs['order'] = $optimizedOrder;
|
||||
}
|
||||
|
||||
// 优化 branchInfo 信息,只保留实际使用的字段
|
||||
if (isset($rs['branchInfo'])) {
|
||||
$optimizedBranchInfo = array();
|
||||
foreach ($rs['branchInfo'] as $branchId => $branchData) {
|
||||
$optimizedBranchInfo[$branchId] = array(
|
||||
'branch_id' => $branchData['branch_id'],
|
||||
'store' => $branchData['store'] // 用于库存计算,保留完整数据
|
||||
);
|
||||
}
|
||||
$optimizedRs['branchInfo'] = $optimizedBranchInfo;
|
||||
}
|
||||
|
||||
// 保留 sku_num 和 is_split 信息(代码中直接使用)
|
||||
if (isset($rs['sku_num'])) {
|
||||
$optimizedRs['sku_num'] = $rs['sku_num'];
|
||||
}
|
||||
|
||||
if (isset($rs['is_split'])) {
|
||||
$optimizedRs['is_split'] = $rs['is_split'];
|
||||
}
|
||||
|
||||
return $optimizedRs;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user