1. 【新增】售后单售后原因类型支持搜索

2. 【新增】手工创建订单折扣可输入正数

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

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

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

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

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

8. 【修复】基础物料分类管理问题
This commit is contained in:
chenping
2026-04-01 11:59:17 +08:00
parent 9341122827
commit 61783b7d01
754 changed files with 46179 additions and 5700 deletions

View File

@@ -0,0 +1,439 @@
<?php
/**
* 补寄申请业务处理
*
* @category
* @package
* @author
* @version $Id: Z
*/
class erpapi_shop_response_process_reshipping
{
/**
* 补寄申请业务处理
*
* @param array $sdf 格式化后的补寄申请数据(已经过参数验证)
* @return array
*/
public function add($sdf)
{
try {
// 获取店铺ID
$shop_id = $sdf['shop_id'];
if (empty($shop_id)) {
return array('rsp' => 'fail', 'msg' => '店铺ID不能为空');
}
// 查找关联订单
$order_id = $this->_getOrderId($sdf, $shop_id);
if (empty($order_id)) {
return array('rsp' => 'fail', 'msg' => '未找到关联订单,订单号:' . ($sdf['alipay_no'] ?: $sdf['biz_order_id']));
}
// 状态值映射
$status = $this->_mapStatus($sdf['status']);
if ($status === false) {
return array('rsp' => 'fail', 'msg' => '未知的状态值:' . $sdf['status']);
}
$reshippingData = $this->_formatReshippingData($sdf, $order_id);
// 保存或更新补寄申请单
$reshippingModel = app::get('ome')->model('return_reshipping');
$existingReshipping = $reshippingModel->dump(array(
'reshipping_bn' => $sdf['dispute_id'],
'shop_id' => $shop_id,
));
if (!$existingReshipping) {
$existingReshipping = $reshippingData;
$existingReshipping['status'] = '0';
$rsTran = kernel::database()->beginTransaction();
$reshipping_id = $reshippingModel->insert($existingReshipping);
if (!$reshipping_id) {
kernel::database()->rollBack();
return array('rsp' => 'fail', 'msg' => '保存补寄申请单失败');
}
// 处理商品信息
if (!empty($sdf['bought_sku']) || !empty($sdf['new_bought_sku'])) {
$this->_saveItems($reshipping_id, $sdf);
}
kernel::database()->commit($rsTran);
$memo = '创建补寄申请单';
// 记录操作日志
$operationLog = app::get('ome')->model('operation_log');
$operationLog->write_log('return_reshipping@ome', $reshipping_id, $memo);
// 如果状态为0直接返回结果
if ($status == '0') {
return array('rsp' => 'succ', 'msg' => $memo, 'data' => array('reshipping_id' => $reshipping_id, 'reshipping_bn' => $sdf['dispute_id']));
}
}
$reshippingData['status'] = $status;
$reshippingData['bought_sku'] = $sdf['bought_sku'];
$reshippingData['new_bought_sku'] = $sdf['new_bought_sku'];
return $this->_reshippingUpdateStatus($reshippingData, $existingReshipping);
} catch (Exception $e) {
return array('rsp' => 'fail', 'msg' => '处理补寄申请失败:' . $e->getMessage());
}
}
/**
* 查找关联订单ID
*
* @param array $sdf
* @param int $shop_id
* @return int|false
*/
private function _getOrderId($sdf, $shop_id)
{
$orderModel = app::get('ome')->model('orders');
// 优先使用alipay_no主订单号
if (!empty($sdf['alipay_no'])) {
$order = $orderModel->dump(array(
'order_bn' => $sdf['alipay_no'],
'shop_id' => $shop_id,
), 'order_id');
if ($order && $order['order_id']) {
return $order['order_id'];
}
}
// 使用biz_order_id子订单号查找
if (!empty($sdf['biz_order_id'])) {
// 先通过order_objects表查找
$orderObjectsModel = app::get('ome')->model('order_objects');
$obj = $orderObjectsModel->dump(array(
'oid' => $sdf['biz_order_id'],
'shop_id' => $shop_id,
), 'order_id');
if ($obj && $obj['order_id']) {
return $obj['order_id'];
}
}
return false;
}
/**
* 状态值映射
*
* @param string $platformStatus 平台状态字符串
* @return string|false 数据库状态值
*/
private function _mapStatus($platformStatus)
{
if (empty($platformStatus)) {
return '0'; // 默认补寄待处理
}
$status_mapping = array(
'WAIT_SELLER_AGREE' => '0', // 补寄待处理
'WAIT_SELLER_SEND_GOODS' => '1', // 等待卖家发货
'WAIT_BUYER_CONFIRM_REDO_SEND_GOODS' => '2', // 等待买家收货
'SUCCESS' => '3', // 补寄成功
'SELLER_REFUSE_BUYER' => '4', // 卖家拒绝补寄
'CLOSED' => '5', // 补寄关闭
'EXCHANGE_TRANSFORM_TO_REFUND' => '6', // 转退款
);
return isset($status_mapping[$platformStatus]) ? $status_mapping[$platformStatus] : false;
}
/**
* 格式化补寄申请单数据(不包含状态)
*
* @param array $sdf
* @param int $order_id
* @return array
*/
private function _formatReshippingData($sdf, $order_id)
{
$orderModel = app::get('ome')->model('orders');
$order = $orderModel->dump(array('order_id' => $order_id), 'order_bn,platform_order_bn');
$data = array(
'reshipping_bn' => $sdf['dispute_id'],
'shop_id' => $sdf['shop_id'],
'shop_type' => $sdf['shop_type'],
'order_id' => $order_id,
'order_bn' => $order['order_bn'] ?: '',
'platform_order_bn' => $order['platform_order_bn'] ?: $sdf['alipay_no'],
'source' => 'matrix',
'buyer_address' => $sdf['buyer_address'] ?: '',
'buyer_province' => $sdf['buyer_province'] ?: '',
'buyer_city' => $sdf['buyer_city'] ?: '',
'buyer_district' => $sdf['buyer_district'] ?: '',
'buyer_town' => $sdf['buyer_town'] ?: '',
'buyer_phone' => $sdf['buyer_phone'] ?: '',
'buyer_name' => $sdf['buyer_name'] ?: '',
'buyer_open_uid' => $sdf['buyer_open_uid'] ?: '',
'oaid' => $sdf['oaid'] ?: '',
'real_receiver_open_id' => $sdf['real_receiver_open_id'] ?: '',
'real_receiver_display_nick' => $sdf['real_receiver_display_nick'] ?: '',
'reason' => $sdf['reason'] ?: '',
'desc' => $sdf['desc'] ?: '',
'refund_phase' => $sdf['refund_phase'] ?: '',
'cs_status' => $sdf['cs_status'] ?: '',
'advance_status' => $sdf['advance_status'] ?: '',
'operation_contraint' => $sdf['operation_contraint'] ?: '',
'logi_name' => $sdf['logi_name'] ?: '',
'logi_no' => $sdf['logi_no'] ?: '',
'refuse_reason' => $sdf['refuse_reason'] ?: '',
'refuse_reason_id' => $sdf['refuse_reason_id'] ?: '',
'extend_field' => $sdf['extend_field'] ?: '',
);
// 时间信息
if ($sdf['created']) {
$data['outer_create_time'] = kernel::single('ome_func')->date2time($sdf['created']);
}
if ($sdf['modified']) {
$data['outer_modified_time'] = kernel::single('ome_func')->date2time($sdf['modified']);
}
if ($sdf['time_out']) {
$data['time_out'] = kernel::single('ome_func')->date2time($sdf['time_out']);
}
return $data;
}
/**
* 更新补寄申请单状态
*
* @param array $reshippingData 格式化后的补寄申请数据
* @param array $existingReshipping 已存在的补寄申请数据
* @return array
*/
private function _reshippingUpdateStatus($reshippingData, $existingReshipping)
{
$status = $reshippingData['status'];
if($status != 0){
if($status == $existingReshipping['status']){
return ['rsp' => 'fail', 'msg' => '状态未发生变化'];
}
}
$outerModifiedTime = $reshippingData['outer_modified_time'];
$reshippingModel = app::get('ome')->model('return_reshipping');
$reshipping_id = $existingReshipping['reshipping_id'];
$operateLog = app::get('ome')->model('operation_log');
switch($status) {
case '0':
if($existingReshipping['status'] > 0){
return ['rsp' => 'fail', 'msg' => '已存在补寄申请单不能更改,状态为:' . $existingReshipping['status']];
}
if($reshippingData['outer_modified_time'] <= $existingReshipping['outer_modified_time']){
return ['rsp' => 'fail', 'msg' => '更新时间未变化'];
}
$rsTran = kernel::database()->beginTransaction();
$rs = $reshippingModel->update($reshippingData, array('reshipping_id' => $reshipping_id, 'status' => $status));
// 防并发:检查更新影响行数
if(is_bool($rs) || (is_numeric($rs) && $rs <= 0)) {
kernel::database()->rollBack();
if(is_numeric($rs) && $rs == 0) {
return ['rsp' => 'fail', 'msg' => '补寄申请单状态已被其他进程更新,更新失败'];
}
return ['rsp' => 'fail', 'msg' => '更新补寄申请单失败'];
}
$this->_saveItems($reshipping_id, $reshippingData);
kernel::database()->commit($rsTran);
$memo = '变更补寄单信息成功';
$operateLog->write_log('return_reshipping@ome', $reshipping_id, $memo);
return ['rsp' => 'succ', 'msg' => $memo];
case '1':
if($existingReshipping['status'] != 0){
return ['rsp' => 'fail', 'msg' => '已存在补寄申请单不能更改,状态为:' . $existingReshipping['status']];
}
// 等待卖家发货
$upData = array(
'status' => $status,
'outer_modified_time' => $outerModifiedTime,
);
$rs = $reshippingModel->update($upData, array('reshipping_id' => $reshipping_id, 'status|noequal' => $status));
// 防并发:检查更新影响行数
if(is_bool($rs) || (is_numeric($rs) && $rs <= 0)) {
if(is_numeric($rs) && $rs == 0) {
return ['rsp' => 'fail', 'msg' => '补寄申请单状态已被其他进程更新,更新失败'];
}
return ['rsp' => 'fail', 'msg' => '更新补寄申请单状态失败'];
}
$memo = '状态更新为:等待卖家发货';
$operateLog->write_log('return_reshipping@ome', $reshipping_id, $memo);
return ['rsp' => 'succ', 'msg' => $memo];
case '2':
if($existingReshipping['status'] != 1){
return ['rsp' => 'fail', 'msg' => '已存在补寄申请单不能更改,状态为:' . $existingReshipping['status']];
}
// 等待买家收货
$upData = array(
'status' => $status,
'outer_modified_time' => $outerModifiedTime,
);
$rs = $reshippingModel->update($upData, array('reshipping_id' => $reshipping_id, 'status|noequal' => $status));
// 防并发:检查更新影响行数
if(is_bool($rs) || (is_numeric($rs) && $rs <= 0)) {
if(is_numeric($rs) && $rs == 0) {
return ['rsp' => 'fail', 'msg' => '补寄申请单状态已被其他进程更新,更新失败'];
}
return ['rsp' => 'fail', 'msg' => '更新补寄申请单状态失败'];
}
$memo = '状态更新为:等待买家收货';
$operateLog->write_log('return_reshipping@ome', $reshipping_id, $memo);
return ['rsp' => 'succ', 'msg' => $memo];
case '3':
if(!in_array($existingReshipping['status'], [1, 2])){
return ['rsp' => 'fail', 'msg' => '已存在补寄申请单不能更改,状态为:' . $existingReshipping['status']];
}
// 补寄成功
$upData = array(
'status' => $status,
'outer_modified_time' => $outerModifiedTime,
);
$rs = $reshippingModel->update($upData, array('reshipping_id' => $reshipping_id, 'status|noequal' => $status));
// 防并发:检查更新影响行数
if(is_bool($rs) || (is_numeric($rs) && $rs <= 0)) {
if(is_numeric($rs) && $rs == 0) {
return ['rsp' => 'fail', 'msg' => '补寄申请单状态已被其他进程更新,更新失败'];
}
return ['rsp' => 'fail', 'msg' => '更新补寄申请单状态失败'];
}
$memo = '状态更新为:补寄成功';
$operateLog->write_log('return_reshipping@ome', $reshipping_id, $memo);
return ['rsp' => 'succ', 'msg' => $memo];
case '4':
if(!in_array($existingReshipping['status'], [0])){
return ['rsp' => 'fail', 'msg' => '已存在补寄申请单不能更改,状态为:' . $existingReshipping['status']];
}
// 卖家拒绝补寄
$upData = array(
'status' => $status,
'outer_modified_time' => $outerModifiedTime,
);
if($reshippingData['refuse_reason']){
$upData['refuse_reason'] = $reshippingData['refuse_reason'];
}
if($reshippingData['refuse_reason_id']){
$upData['refuse_reason_id'] = $reshippingData['refuse_reason_id'];
}
$rs = $reshippingModel->update($upData, array('reshipping_id' => $reshipping_id, 'status|noequal' => $status));
// 防并发:检查更新影响行数
if(is_bool($rs) || (is_numeric($rs) && $rs <= 0)) {
if(is_numeric($rs) && $rs == 0) {
return ['rsp' => 'fail', 'msg' => '补寄申请单状态已被其他进程更新,更新失败'];
}
return ['rsp' => 'fail', 'msg' => '更新补寄申请单状态失败'];
}
$memo = '状态更新为:卖家拒绝补寄';
$operateLog->write_log('return_reshipping@ome', $reshipping_id, $memo);
return ['rsp' => 'succ', 'msg' => $memo];
case '5':
if(!in_array($existingReshipping['status'], [0,4])){
return ['rsp' => 'fail', 'msg' => '已存在补寄申请单不能更改,状态为:' . $existingReshipping['status']];
}
// 补寄关闭
$upData = array(
'status' => $status,
'outer_modified_time' => $outerModifiedTime,
);
$rs = $reshippingModel->update($upData, array('reshipping_id' => $reshipping_id, 'status|noequal' => $status));
// 防并发:检查更新影响行数
if(is_bool($rs) || (is_numeric($rs) && $rs <= 0)) {
if(is_numeric($rs) && $rs == 0) {
return ['rsp' => 'fail', 'msg' => '补寄申请单状态已被其他进程更新,更新失败'];
}
return ['rsp' => 'fail', 'msg' => '更新补寄申请单状态失败'];
}
$memo = '状态更新为:补寄关闭';
$operateLog->write_log('return_reshipping@ome', $reshipping_id, $memo);
return ['rsp' => 'succ', 'msg' => $memo];
case '6':
if(!in_array($existingReshipping['status'], [0,1,4])){
return ['rsp' => 'fail', 'msg' => '已存在补寄申请单不能更改,状态为:' . $existingReshipping['status']];
}
// 转退款
$upData = array(
'status' => $status,
'outer_modified_time' => $outerModifiedTime,
);
$rs = $reshippingModel->update($upData, array('reshipping_id' => $reshipping_id, 'status|noequal' => $status));
// 防并发:检查更新影响行数
if(is_bool($rs) || (is_numeric($rs) && $rs <= 0)) {
if(is_numeric($rs) && $rs == 0) {
return ['rsp' => 'fail', 'msg' => '补寄申请单状态已被其他进程更新,更新失败'];
}
return ['rsp' => 'fail', 'msg' => '更新补寄申请单状态失败'];
}
$reshippingLib = kernel::single('ome_reshipping');
// 处理转退款逻辑
$transformResult = $reshippingLib->handleTransformToRefund($reshipping_id);
if ($transformResult['rsp'] == 'fail') {
// 记录错误日志,但不影响主流程
$operateLog->write_log('return_reshipping@ome', $reshipping_id, '转退款处理失败:' . $transformResult['msg']);
return ['rsp' => 'fail', 'msg' => '状态更新为:转退款(处理失败)'];
} else {
$memo = '状态更新为:转退款';
$operateLog->write_log('return_reshipping@ome', $reshipping_id, $memo);
return ['rsp' => 'succ', 'msg' => $memo];
}
default:
return ['rsp' => 'fail', 'msg' => '未知状态:' . $status];
}
}
/**
* 保存商品信息
*
* @param int $reshipping_id
* @param array $sdf
* @return void
*/
private function _saveItems($reshipping_id, $sdf)
{
$itemsModel = app::get('ome')->model('return_reshipping_items');
// 使用new_bought_sku优先如果没有则使用bought_sku
$sku = !empty($sdf['new_bought_sku']) ? $sdf['new_bought_sku'] : $sdf['bought_sku'];
if (empty($sku)) {
return;
}
// 查找销售物料信息
$salesMaterialModel = app::get('material')->model('sales_material');
$salesMaterial = $salesMaterialModel->db_dump(array('sales_material_bn' => $sku), 'sm_id,sales_material_bn');
// 查找是否已存在该商品记录
$existingItem = $itemsModel->db_dump(array(
'reshipping_id' => $reshipping_id,
), 'item_id');
$itemData = array(
'reshipping_id' => $reshipping_id,
'oid' => $sdf['biz_order_id'] ?: '',
'sku_uuid' => '',
'goods_id' => $salesMaterial ? $salesMaterial['sm_id'] : 0,
'bn' => $sku,
'nums' => isset($sdf['num']) ? intval($sdf['num']) : 1,
'price' => isset($sdf['price']) ? floatval($sdf['price']) : 0,
);
if ($existingItem && $existingItem['item_id']) {
// 更新已存在的商品信息
$itemsModel->update($itemData, array('item_id' => $existingItem['item_id']));
} else {
// 插入新的商品信息
$itemsModel->insert($itemData);
}
}
}