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

@@ -64,6 +64,7 @@ class erpapi_shop_response_process_aftersalev2 {
switch($sdf['status']) {
case '0':
$upData = $this->_refundApplySdfToData($sdf);
unset($upData['bool_type']); // 退款金额、原因或版本变化更新为未审核时不更改 bool_type保留原值
$memo = '(退款金额、原因或版本变化)退款申请单更新为未审核';
break;
default :
@@ -71,6 +72,7 @@ class erpapi_shop_response_process_aftersalev2 {
'status' => $sdf['status'],
'source_status' => $sdf['source_status'], //平台状态
'outer_lastmodify'=> $sdf['modified'],
'cs_status' => $sdf['cs_status'],
);
if($sdf['refund_version_change']) {
$upData['memo'] = $sdf['reason'];
@@ -105,6 +107,10 @@ class erpapi_shop_response_process_aftersalev2 {
if ($sdf['status'] == '3') {
//延迟5分钟自动重新路由审核订单
$sdf = array('op_type'=>'timing_confirm', 'timing_time'=>strtotime('5 minutes'), 'memo'=>'退款申请拒绝后重新路由');
//@todo当系统设置里未开启[是否开启系统自动审核]时,未调用延迟自动审核;
$sdf['cnAuto'] = 'true';
kernel::single('ome_order')->auto_order_combine($sdf['order']['order_id'], $sdf);
}
} else {
@@ -123,7 +129,7 @@ class erpapi_shop_response_process_aftersalev2 {
return array('rsp'=>'fail', 'msg'=>'退款申请单生成失败');
}
kernel::database()->commit($trans);
kernel::single('monitor_notice_refund_apply')->erpapi_create($insertData['apply_id']);
$idBn = array(
'apply_id' => $insertData['apply_id'],
'refund_apply_bn' => $insertData['refund_apply_bn']
@@ -140,7 +146,8 @@ class erpapi_shop_response_process_aftersalev2 {
}
}
kernel::single('ome_refund_apply')->updateOrderObjectsPayStatusByItemIds($insertData['apply_id']);
//识别是否天猫退款触发AG接口
$noticeParams = array_merge($sdf, $idBn);
$this->_noticeAg($noticeParams);
@@ -148,8 +155,7 @@ class erpapi_shop_response_process_aftersalev2 {
return array('rsp'=>'succ', 'msg'=>$memo);
}
private function _refundApplySdfToData($sdf)
{
private function _getRefundRefer($sdf) {
//退款来源(normal:普通退款,aftersale:售后仅退款,不退货;)
if($sdf['refund_refer'] == 'aftersale'){
$refund_refer = '1';
@@ -161,6 +167,12 @@ class erpapi_shop_response_process_aftersalev2 {
if($sdf['refund_to_returnProduct']) {
$refund_refer = '0';
}
return $refund_refer;
}
private function _refundApplySdfToData($sdf)
{
$refund_refer = $this->_getRefundRefer($sdf);
//oid子单过滤掉重复的oid
//@todo之前代码中--PKG组合商品退款时会保存多个oid; 本次只是过滤了重复的oid子单;
@@ -195,6 +207,7 @@ class erpapi_shop_response_process_aftersalev2 {
'source_status' => kernel::single('ome_refund_func')->get_source_status($sdf['source_status']),
'tag_type' => ($sdf['tag_type'] ? $sdf['tag_type'] : '0'), //退款类型
'jsrefund_flag' => ($sdf['jsrefund_flag'] ? $sdf['jsrefund_flag'] : '0'), //极速退款标识
'cs_status' => $sdf['cs_status'],
);
// 经销店铺的单据delivery_mode冗余到退款单申请表
@@ -298,11 +311,13 @@ class erpapi_shop_response_process_aftersalev2 {
return array('rsp'=>'fail', 'msg'=>'退款单创建失败');
}
if ($refundApply) {
$refund_refer = $this->_getRefundRefer($sdf);
$filter = array(
'apply_id' => $refundApply['apply_id'],
);
$updateData = array('status' => '4','refunded' => $sdf['refund_fee']);
$updateData = array('status' => '4','refunded' => $sdf['refund_fee'], 'refund_refer' => $refund_refer, 'cs_status' => $sdf['cs_status']);
app::get('ome')->model('refund_apply')->update($updateData,$filter);
$refundApply = array_merge($refundApply, $updateData);
app::get('ome')->model('operation_log')->write_log('refund_apply@ome', $refundApply['apply_id'], '退款成功');
$msg .= "  更新退款申请单[{$refundApply['refund_apply_bn']}]为已退款";
if ($refundApply['addon']) {
@@ -345,7 +360,6 @@ class erpapi_shop_response_process_aftersalev2 {
if($this->_updateOrderPayed($sdf['order']['order_id'],$sdf['refund_fee'],$must_pause)) {
$msg .= '  更新订单支付状态';
}
//扣除原单的运费 要在原单退款单上加日志
if($sdf['shop_type'] == 'website'){
$this->_upOriginalOrder($sdf,$refundApply);
@@ -397,7 +411,18 @@ class erpapi_shop_response_process_aftersalev2 {
}
//退款未退货
$this->_refundNoreturn($sdf,$refundApply);
kernel::single('monitor_notice_refund_apply')->erpapi_refund($refundApply['apply_id']);
kernel::single('ome_refund_apply')->updateOrderObjectsPayStatusByItemIds($refundApply['apply_id']);
// 增加service扩展点允许外部service在退款成功后做自定义处理
$services = kernel::servicelist('ome.service.refund.apply.accept.refund.after');
if ($services) {
foreach ($services as $service) {
if (method_exists($service, 'after_refund')) {
$service->after_refund($refundApply['apply_id']);
}
}
}
return array('rsp'=>'succ', 'msg'=>$msg);
}
@@ -461,7 +486,7 @@ class erpapi_shop_response_process_aftersalev2 {
$filter = array(
'apply_id' => $refundApply['apply_id'],
);
$updateData = array('status' => '4','refunded' => $sdf['refund_fee']);
$updateData = array('status' => '4','refunded' => $sdf['refund_fee'], 'cs_status' => $sdf['cs_status']);
app::get('ome')->model('refund_apply')->update($updateData, $filter);
//logs
@@ -498,6 +523,17 @@ class erpapi_shop_response_process_aftersalev2 {
}
kernel::single('ome_order_refund')->lanjieDelivery($refundApply['apply_id']);
}
kernel::single('monitor_notice_refund_apply')->erpapi_refund($refundApply['apply_id']);
kernel::single('ome_refund_apply')->updateOrderObjectsPayStatusByItemIds($refundApply['apply_id']);
// 增加service扩展点允许外部service在退款成功后做自定义处理
$services = kernel::servicelist('ome.service.refund.apply.accept.refund.after');
if ($services) {
foreach ($services as $service) {
if (method_exists($service, 'after_refund')) {
$service->after_refund($refundApply['apply_id']);
}
}
}
return array('rsp'=>'succ', 'msg'=>$msg);
}
@@ -774,7 +810,7 @@ class erpapi_shop_response_process_aftersalev2 {
$data['return_product_items'][] = array(
'product_id' => $val['product_id'] ? $val['product_id'] : 0,
'bn' => $val['bn'],
'name' => $val['title'] ? $val['title']: $val['name'],
'name' => $val['name'],
'num' => $val['num'],
'price' => $val['price'],
'amount' => $val['amount'],
@@ -1072,6 +1108,12 @@ class erpapi_shop_response_process_aftersalev2 {
);
$reshipObj->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']);
}
}
}elseif($is_update_platform_status){
//更新平台售后单状态(并标记异常)
$updateSdf = array(
@@ -1101,7 +1143,8 @@ class erpapi_shop_response_process_aftersalev2 {
//自动审核标记
if($sdf['reship']['is_check'] == '0'){
$is_auto_confirm = true;
}elseif($updateLogiResult && $sdf['reship']['reship_id']){
}
if($sdf['reship']['return_logi_name'] != $sdf['logistics_company'] || $sdf['reship']['return_logi_no'] != $sdf['logistics_no']) {
//请求WMS更新最新物流单号
$error_msg = '';
kernel::single('ome_reship')->request_wms_returnorder($sdf['reship']['reship_id'], $error_msg);
@@ -1192,6 +1235,10 @@ class erpapi_shop_response_process_aftersalev2 {
$upData['platform_status'] = $sdf['platform_status'];
$upData['is_modify'] = 'true';
}
if($reship['return_logi_no'] && $reship['return_logi_no'] == $sdf['delivery_logistics_no'] && $logisticsNo != $sdf['delivery_logistics_no']){
$upData['flag_type'] = $reship['flag_type'] & (~ome_reship_const::__LANJIE_RUKU);
$memo .= ',拦截入库标识已移除。';
}
//换货转退货更新类型
if (isset($sdf['exchange_to_return']) && $sdf['exchange_to_return'] && $sdf['reship']['return_type'] == 'change') {
$upData['return_type'] = 'return';
@@ -1212,6 +1259,16 @@ class erpapi_shop_response_process_aftersalev2 {
$operateLog = app::get('ome')->model('operation_log');
$operateLog->write_log('reship@ome',$reship['reship_id'],$memo);
$this->_updateReturnProductLogistics($reship['return_id'], $logisticsCompany, $logisticsNo,$sdf);
// 物流单号重复检测打标flag_type 位)
if ($reship['reship_id']) {
kernel::single('ome_reship')->markDuplicateReturnLogiNo($reship['reship_id'], $logisticsNo);
}
foreach(kernel::servicelist('erpapi.service.aftersale.update.reship.logistics.after') as $object) {
if(method_exists($object, 'after_update_logistics')){
$object->after_update_logistics($reship['reship_id']);
}
}
return $rs;
}
@@ -1233,7 +1290,7 @@ class erpapi_shop_response_process_aftersalev2 {
$is_update_platform_status = false;
$msg = '仅处理未审核、拒绝状态和物流信息';
if($sdf['reship']['shipcompany'] != $sdf['logistics_company'] || $sdf['reship']['return_logi_no'] != $sdf['logistics_no']) {
if($sdf['reship']['return_logi_name'] != $sdf['logistics_company'] || $sdf['reship']['return_logi_no'] != $sdf['logistics_no']) {
if($this->_updateReshipLogistics($sdf)) {
$msg = '更新物流信息成功';
@@ -1279,6 +1336,12 @@ class erpapi_shop_response_process_aftersalev2 {
}
kernel::single('console_reship')->releaseChangeFreeze($sdf['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($sdf['reship']['reship_id']);
}
}
if ($sdf['return_product']) {
$returnId = $sdf['return_product']['return_id'];
$rpData = array('status' => '5', 'last_modified' => time());
@@ -1376,6 +1439,11 @@ class erpapi_shop_response_process_aftersalev2 {
$this->_insertReshipItems($reshipItems, $insertData['reship_id']);
$operateLog->write_log('reship@ome',$insertData['reship_id'], '新建退货单');
foreach(kernel::servicelist('ome.service.reship.create.after') as $object) {
if(method_exists($object, 'after_create')){
$object->after_create($insertData['reship_id']);
}
}
if ($sdf['return_product']['return_type']=='jdchange') {
kernel::single('ome_return_product')->releaseChangeFreeze($insertData['return_id']);
@@ -1592,13 +1660,30 @@ class erpapi_shop_response_process_aftersalev2 {
public function cleanReturnStatus($reship){
$return_id = (int) $reship['return_id'];
$reship_id = (int) $reship['reship_id'];
$reship_bn = $reship['reship_bn'];
$oReship = app::get('ome')->model('reship');
$oOperation_log = app::get('ome')->model('operation_log');//写日志
$oReship->db->exec('DELETE FROM sdb_ome_reship WHERE reship_id='.$reship_id);
$oReship->db->exec('DELETE FROM sdb_ome_reship_items WHERE reship_id='.$reship_id);
$oReship->db->exec('DELETE FROM sdb_ome_return_process WHERE reship_id='.$reship_id);
$oReship->db->exec('DELETE FROM sdb_ome_return_process_items WHERE reship_id='.$reship_id);
$memo = '退款原因、金额或版本变化,已生成退货单' . $reship['reship_bn'] . '清除';
if($reship_id) {
// 在作废 reship 数据之前,先释放库存冻结
list($rs, $rsData) = kernel::single('console_reship')->releaseChangeFreeze($reship_id);
if($rs == false){
// 释放失败记录日志,但不影响作废操作
$oOperation_log->write_log('reship@ome', $reship_id, '释放库存冻结失败:'.($rsData['msg'] ? $rsData['msg'] : ''));
}
$updateData = array(
'return_id' => 0,
'is_check' => 5,
'reship_bn' => $reship_bn . '_' . $reship_id
);
$oReship->update($updateData, array('reship_id'=>$reship_id));
}
$memo = '退款原因、金额或版本变化,已生成退货单' . $reship['reship_bn'] . '作废处理';
// 增加调用所有 cleanReturnStatus 扩展 service
foreach(kernel::servicelist('erpapi.service.aftersale.clean.return.status.after') as $object) {
if (method_exists($object, 'cleanReturnStatusAfter')) {
$object->cleanReturnStatusAfter($reship);
}
}
$oOperation_log->write_log('return@ome',$return_id,$memo);
}
@@ -1707,7 +1792,6 @@ class erpapi_shop_response_process_aftersalev2 {
*/
public function _autoEditorder($sdf, &$error_msg=null, &$is_abnormal=false)
{
$orderObj = app::get('ome')->model('orders');
$orderObjMdl = app::get('ome')->model('order_objects');
$orderItemObj = app::get('ome')->model("order_items");
@@ -1721,7 +1805,7 @@ class erpapi_shop_response_process_aftersalev2 {
$order_detail = $orderObj->dump($order_filter, '*');
//check支持的平台
if(!in_array($order_detail['shop_type'], array('taobao','tmall','luban','website_d1m','website','weimobv','youzan','website_v2','pinduoduo','wxshipin','meituan4sg'))){
if(!in_array($order_detail['shop_type'], array('taobao','tmall','luban','website_d1m','website','weimobv','weimobr','youzan','website_v2','pinduoduo','wxshipin','meituan4sg'))){
$error_msg = $order_detail['shop_type'] . '平台订单不支持编辑';
return false;
}
@@ -1797,13 +1881,11 @@ class erpapi_shop_response_process_aftersalev2 {
{
foreach($items as $item)
{
$refund_items = $refund_item_list[$item['oid']] ? $refund_item_list[$item['oid']] : array();
if($item['oid'] != $sdf['oid'] && !$refund_items){
continue;
}
//天猫权益金
if ($sdf['refund_fee'] != $item['divide_order_fee'] && $sdf['tmall_mcard_pz_sp']){
$sdf['refund_fee'] = $sdf['refund_fee'] + $sdf['tmall_mcard_pz_sp'];
@@ -1813,7 +1895,7 @@ class erpapi_shop_response_process_aftersalev2 {
if ($sdf['refund_fee'] != $item['divide_order_fee'] && $sdf['isPriceProtect'] !== true && $item['refund_money']){
$sdf['refund_fee'] = $sdf['refund_fee'] + $item['refund_money'];
}
if ($sdf['shop_type'] == 'website' && $refund_items) {
$refund_fee = array_sum(array_column($refund_items,'amount'));
$sdf['refund_fee'] = number_format($refund_fee, 3, '.', '');
@@ -1828,9 +1910,8 @@ class erpapi_shop_response_process_aftersalev2 {
if($oObjRow && $oObjRow['pay_status'] != 5) {
$update_sql = "UPDATE sdb_ome_order_objects SET pay_status='5' WHERE order_id=". $order_id ." AND obj_id=". $item['obj_id'];
$orderObj->db->exec($update_sql);
$order_sql = "UPDATE sdb_ome_orders SET pmt_goods=pmt_goods-".$item['pmt_price'].", pmt_order=pmt_order-".($item['part_mjz_discount']?:0).", cost_item=cost_item-".$item['amount'];
$order_sql .= ", total_amount=total_amount-".$sdf['refund_fee'].", final_amount=final_amount-".$sdf['refund_fee']." WHERE order_id=". $order_id;
$orderObj->db->exec($order_sql);
//退款单先下来,订单单拉商品优惠在矩阵已经处理过了
kernel::single('ome_order_object_amount')->recalculateOrderAmount($order_id, [$item], false);
$edit_flag = true;
}
continue;
@@ -1956,10 +2037,7 @@ class erpapi_shop_response_process_aftersalev2 {
//更新订单金额
$order_sql = "UPDATE sdb_ome_orders SET pmt_goods=pmt_goods-".$item['pmt_price'].", pmt_order=pmt_order-".($item['part_mjz_discount']?:0).", cost_item=cost_item-".$item['amount'];
$order_sql .= ", total_amount=total_amount-".$sdf['refund_fee'].", final_amount=final_amount-".$sdf['refund_fee']." WHERE order_id=". $order_id;
$orderObj->db->exec($order_sql);
kernel::single('ome_order_object_amount')->recalculateOrderAmount($order_id, [$item]);
// custom 根据子订单id查询是否有关联赠品
$this->__deletePlatformGift($item['oid'], $order_id, $needChangeFreezeItem);
@@ -2038,8 +2116,15 @@ class erpapi_shop_response_process_aftersalev2 {
//编辑订单删除退款商品后,重新调用赠品规则
$this->_dealCrmGift($order_id);
// [大家电订单]商品被修改,订单需要重新预约时间
kernel::single('ome_order_reservation')->againReservation($order_id, 'goods_change');
//延迟5分钟自动重新路由审核订单
$sdf = array('op_type'=>'timing_confirm', 'timing_time'=>strtotime('5 minutes'), 'memo'=>'退款完成编辑订单后重新路由');
//@todo当系统设置里未开启[是否开启系统自动审核]时,未调用延迟自动审核;
$sdf['cnAuto'] = 'true';
kernel::single('ome_order')->auto_order_combine($order_id, $sdf);
}else{
//订单退款商品无法删除,如有CRM赠品则打标记
@@ -2346,14 +2431,6 @@ class erpapi_shop_response_process_aftersalev2 {
$needChangeFreezeItem[] = $giftOrderObjItem;
}
// 订单金额处理
$giftOrderObject['part_mjz_discount'] = $giftOrderObject['part_mjz_discount'] ? $giftOrderObject['part_mjz_discount'] : 0;
$giftOrderObject['divide_order_fee'] = $giftOrderObject['divide_order_fee'] ? $giftOrderObject['divide_order_fee'] : 0;
$giftOrderObject['amount'] = $giftOrderObject['amount'] ? $giftOrderObject['amount'] : 0;
$giftOrderObject['pmt_price'] = $giftOrderObject['pmt_price'] ? $giftOrderObject['pmt_price'] : 0;
$sql = "update sdb_ome_orders set pmt_goods=pmt_goods-" . $giftOrderObject['pmt_price'] . ",pmt_order=pmt_order-" .($giftOrderObject['part_mjz_discount']?:0). ",cost_item=cost_item-" . $giftOrderObject['amount'] . ",total_amount=total_amount-" . $giftOrderObject['divide_order_fee'] . ",final_amount=final_amount-" . $giftOrderObject['divide_order_fee'] . " where order_id=" . $order_id;
kernel::database()->exec($sql);
}
}

View File

@@ -37,6 +37,7 @@ class erpapi_shop_response_process_bookingrefund{
return array('rsp'=>'succ', 'msg'=>'订单暂停成功');
}
}
//发起暂停订单
$pause_status = false;
if ($orderInfo["status"] == "active" && $orderInfo["ship_status"] == "0"){
@@ -82,6 +83,26 @@ class erpapi_shop_response_process_bookingrefund{
}
}
public function fxordermsg($params){
// shopbee供销供应商订单信息同步
$order_bn = $params['order_bn'];
$orderModel = app::get('ome')->model('orders');
$orderInfo = $orderModel->dump(array('order_bn' => $order_bn, 'shop_id'=>$params['shop_id']), 'order_id,order_bn,shop_id,status,ship_status,order_bool_type,payed,org_id');
if(!$orderInfo || !$orderInfo['order_id']){
return array('rsp'=>'fail', 'msg'=>'订单不存在');
}
// 暂时只处理sellerComments添加到订单备注
if (!empty($params['sellerComments'])) {
list($success, $message) = kernel::single('ome_order_marktext')->add($orderInfo['order_id'], $params['sellerComments'], '供销供应商');
if (!$success) {
return array('rsp' => 'fail', 'msg' => $message);
}
}
return array('rsp' => 'succ', 'msg' => '订单信息同步成功');
}
protected function ordermsg_back($orderInfo, $params) {
$orderExtend = app::get('ome')->model('order_extend')->db_dump($orderInfo['order_id'], 'extend_field');
$sdf = [
@@ -107,10 +128,10 @@ class erpapi_shop_response_process_bookingrefund{
'memo' => '平台已经完成退款且关闭了交易订单',
'trade_no' => $sdf['order_bn'],
'modifiey' => time(),
'payment' => '',
'payment' => 0,
't_ready' => time(),
't_sent' => time(),
't_received' => '',
't_received' => 0,
'org_id' => $sdf['org_id'],
'refund_refer' => '0', //退款来源
);
@@ -146,4 +167,6 @@ class erpapi_shop_response_process_bookingrefund{
return $rsp;
}
}

View File

@@ -563,11 +563,6 @@ class erpapi_shop_response_process_exchange {
'return_logi_no'=>$logisticsNo,
'outer_lastmodify'=>$sdf['modified'],
);
//退换货自动审批(系统-->退换货自动审核设置-->是否启用退换货自动审批)
$is_auto_approve = app::get('ome')->getConf('return.auto_approve');
if($is_auto_approve == 'on'){
kernel::single('ome_reship')->batch_reship_queue($sdf['reship']['reship_id']);
}
//flag
$is_update_logi = true;
@@ -587,6 +582,10 @@ class erpapi_shop_response_process_exchange {
$rs = app::get('ome')->model('reship')->update($upData,array('reship_id'=>$reship['reship_id']));
$operateLog = app::get('ome')->model('operation_log');
$operateLog->write_log('reship@ome',$reship['reship_id'],$memo);
// 物流单号重复检测打标flag_type 位)
if ($reship['reship_id']) {
kernel::single('ome_reship')->markDuplicateReturnLogiNo($reship['reship_id'], $logisticsNo);
}
if ($returnData){
app::get('ome')->model('return_product')->update($returnData,array('return_id'=>$sdf['return_product']['return_id']));
$operateLog->write_log('return@ome', $sdf['return_product']['return_id'],'版本变化更新成接受申请状态');
@@ -594,6 +593,16 @@ class erpapi_shop_response_process_exchange {
//请求WMS更新最新物流单号
if($is_update_logi){
//退换货自动审批(系统-->退换货自动审核设置-->是否启用退换货自动审批)
$is_auto_approve = app::get('ome')->getConf('return.auto_approve');
if($is_auto_approve == 'on'){
kernel::single('ome_reship')->batch_reship_queue($sdf['reship']['reship_id']);
}
foreach(kernel::servicelist('erpapi.service.aftersale.update.reship.logistics.after') as $object) {
if(method_exists($object, 'after_update_logistics')){
$object->after_update_logistics($reship['reship_id']);
}
}
$error_msg = '';
kernel::single('ome_reship')->request_wms_returnorder($reship['reship_id'], $error_msg);
}

View File

@@ -27,6 +27,9 @@ class erpapi_shop_response_process_order
//店铺ID
public $_shop_id = null;
// 是否更新订单中的商品
protected $_is_update_change_goods = false;
/**
* undocumented function
*
@@ -75,7 +78,6 @@ class erpapi_shop_response_process_order
$errorinfo = '';
$rs = app::get('ome')->model('orders')->create_order($ordersdf, $errorinfo);
if (!$rs) {
if (!$errorinfo) {
$errorinfo = kernel::database()->errorinfo();
@@ -102,7 +104,7 @@ class erpapi_shop_response_process_order
// 更新订单下载时间
$shopModel = app::get('ome')->model('shop');
$shopModel->update(array('last_download_time'=>time()), array('shop_id'=>$ordersdf['shop_id']));
if($service = kernel::servicelist('service.order')){
foreach ($service as $instance){
if (method_exists($instance, 'after_add_order')){
@@ -110,8 +112,16 @@ class erpapi_shop_response_process_order
}
}
}
#抖音全链路 已转单
//[SAP创建]调用service进行SAP创建
foreach(kernel::servicelist('ome.service.order.create.after') as $object)
{
if(method_exists($object, 'after_create')){
$object->after_create($ordersdf);
}
}
// 抖音全链路 已转单
kernel::single('ome_event_trigger_shop_order')->order_message_produce($ordersdf['order_id'],'build');
# 闪购订单确认
@@ -163,7 +173,23 @@ class erpapi_shop_response_process_order
$ordersdf['shop_id'] = $this->_shop_id;
}
// [更新]预约订单的相关状态
$error_msg = '';
kernel::single('ome_order_reservation')->operateReservationOrder($ordersdf, $error_msg);
// 是否订单商品被修改
$is_change_order_goods = false;
if($this->_is_update_change_goods){
$is_change_order_goods = true;
}
//[SAP更新]调用service进行SAP更新
foreach(kernel::servicelist('ome.service.order.update.after') as $object)
{
if(method_exists($object, 'afterUpdateOrder')){
$object->afterUpdateOrder($ordersdf['order_id'], $is_change_order_goods);
}
}
return array('rsp' => 'succ','msg'=>$msg,);
}
@@ -174,7 +200,7 @@ class erpapi_shop_response_process_order
* @author
* */
private function _afterUpdate($ordersdf)
{
{
$orderModel = app::get('ome')->model('orders');
// 如果订单已经拆分
@@ -189,10 +215,47 @@ class erpapi_shop_response_process_order
//shop_id
$this->_shop_id = $tgorder['shop_id'];
//检测source_status变化如果从WAIT_SELLER_SEND_GOODS变为其他状态触发重新审单
// 注意在luban/response/order.php的_operationSel()中source_status已经被更新到数据库
// 所以这里需要从$ordersdf中获取更新前的old_source_status和更新后的new_source_status进行比较
if (isset($ordersdf['old_source_status']) && isset($ordersdf['new_source_status'])) {
$oldSourceStatus = $ordersdf['old_source_status'];
$newSourceStatus = $ordersdf['new_source_status'];
// 只处理 Luban 订单
if ($tgorder['shop_type'] == 'luban' && $tgorder['createway'] == 'matrix') {
// 如果从 WAIT_SELLER_SEND_GOODS 变为其他状态
if ($oldSourceStatus == 'WAIT_SELLER_SEND_GOODS'
&& $newSourceStatus != 'WAIT_SELLER_SEND_GOODS') {
// 触发重新审单延迟5分钟
if ($tgorder['status'] == 'active'
&& in_array($tgorder['process_status'], array('unconfirmed', 'confirmed'))
&& $tgorder['pay_status'] == '1'
&& $tgorder['ship_status'] == '0') {
//订单恢复暂停状态
$orderModel->renewOrder($tgorder['order_id'], '平台订单状态更新自动');
//延迟5分钟自动重新路由审核订单
$sdf = array(
'op_type' => 'timing_confirm',
'timing_time' => strtotime('5 minutes'),
'memo' => '平台订单状态从WAIT_SELLER_SEND_GOODS更新为'.$newSourceStatus.',触发重新路由',
'is_check_last_time' => true
);
kernel::single('ome_order')->auto_order_combine($tgorder['order_id'], $sdf);
}
}
}
}
//是否允许自动审核订单
$is_review_order = false;
$cnAuto = 'false'; // 未开启自动审单的情况下是否允许自动审核订单
$renewMemo = '';
// 写一下日志
$write_log = array();
if ($ordersdf['consignee']) {
@@ -204,7 +267,9 @@ class erpapi_shop_response_process_order
);
$is_review_order = true;
$is_change_address = true;
$renewMemo .= '地址变更';
$cnAuto = 'true';
}
if ($ordersdf['mark_text']) {
@@ -238,6 +303,9 @@ class erpapi_shop_response_process_order
);
$is_review_order = false;
// 订单商品信息修改
$this->_is_update_change_goods = true;
}
if ($ordersdf['order_bool_type'] & ome_order_bool_type::__UPDATEITEM_CODE) {
@@ -249,6 +317,7 @@ class erpapi_shop_response_process_order
);
$is_review_order = true;
$is_change_goods = true;
$renewMemo .= 'sku替换';
}
@@ -325,11 +394,12 @@ class erpapi_shop_response_process_order
$orderModel->rebackDeliveryByOrderId($tgorder['order_id']);
//订单恢复暂停状态
$orderModel->renewOrder($tgorder['order_id']);
$orderModel->renewOrder($tgorder['order_id'], '平台更新订单,撤消发货单成功');
//延迟5分钟自动重新路由审核订单
//@todo防止有退款并发导致明细未删除生成了发货单;
$sdf = array('op_type'=>'timing_confirm', 'timing_time'=>strtotime('5 minutes'), 'memo'=>'更新订单撤销发货单后重新路由', 'is_check_last_time'=>true);
$cnAuto == 'true' && $sdf['cnAuto'] = 'true';
kernel::single('ome_order')->auto_order_combine($tgorder['order_id'], $sdf);
return true;
@@ -354,11 +424,22 @@ class erpapi_shop_response_process_order
//延迟5分钟自动重新路由审核订单
//@todo防止有退款并发导致明细未删除生成了发货单;
$sdf = array('op_type'=>'timing_confirm', 'timing_time'=>strtotime('5 minutes'), 'memo'=>'订单更新后重新路由', 'is_check_last_time'=>true);
//@todo当系统设置里未开启[是否开启系统自动审核]时,未调用延迟自动审核;
$sdf['cnAuto'] = 'true';
kernel::single('ome_order')->auto_order_combine($tgorder['order_id'], $sdf);
}
}
}
// [大家电]收货人信息或SKU商品变更,重新进行预约
if($is_change_address){
kernel::single('ome_order_reservation')->againReservation($tgorder['order_id'], 'address_change');
}elseif($is_change_goods){
kernel::single('ome_order_reservation')->againReservation($tgorder['order_id'], 'goods_change');
}
return true;
}
@@ -581,6 +662,9 @@ class erpapi_shop_response_process_order
kernel::single('ome_batch_order')->create_refund($sdf['order_id']);
// [更新]预约订单取消状态
$error_msg = '';
kernel::single('ome_order_reservation')->operateReservationOrder($sdf, $error_msg);
$msg = '订单取消成功';

View File

@@ -90,8 +90,10 @@ class erpapi_shop_response_process_qianniu extends erpapi_shop_response_abstract
}
}
// [大家电]收货人信息变更后,重新进行预约
kernel::single('ome_order_reservation')->againReservation($order_id, 'address_change');
return array('rsp'=>'succ','msg'=>'千牛/平台改地址成功');
}
/**

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);
}
}
}