mirror of
https://gitee.com/ShopeX/OMS
synced 2026-05-03 05:25:51 +08:00
1. 【新增】售后单售后原因类型支持搜索
2. 【新增】手工创建订单折扣可输入正数 3. 【优化】盘点申请单确认 4. 【修复】采购退货单模拟出库失败问题 5. 【新增】订单金额客户实付与结算金额 6. 【优化】仓库发货统计报表物料名称显示 7. 【优化】自有仓储虚拟发货逻辑 8. 【修复】基础物料分类管理问题
This commit is contained in:
@@ -104,29 +104,33 @@ class erpapi_shop_matrix_360buy_request_delivery extends erpapi_shop_request_del
|
||||
if ('SOPL' == $this->__channelObj->channel['addon']['type']) {
|
||||
$param['package_num'] = $sdf['itemNum'];
|
||||
}
|
||||
|
||||
// 拆单回写
|
||||
$logi_no = array ();
|
||||
foreach ($sdf['delivery_items'] as $key => $value) {
|
||||
$logi_no[$value['logi_type']][$value['logi_no']] = $value['logi_no'];
|
||||
}
|
||||
|
||||
foreach ($sdf['delivery_bill_list'] as $key => $value) {
|
||||
if(strpos($value['logi_no'], '-')) {
|
||||
continue;
|
||||
if($sdf['is_split'] == 1) {
|
||||
$param['package_type'] = 'break';
|
||||
$packages = $this->_getPackages($sdf);
|
||||
$param['packages'] = json_encode($packages);
|
||||
} else {
|
||||
// 拆单回写
|
||||
$logi_no = array ();
|
||||
foreach ($sdf['delivery_items'] as $key => $value) {
|
||||
$logi_no[$value['logi_type']][$value['logi_no']] = $value['logi_no'];
|
||||
}
|
||||
$logi_no[$value['logi_type']][$value['logi_no']] = $value['logi_no'];
|
||||
}
|
||||
|
||||
foreach ($logi_no as $key => $value) {
|
||||
$logi_no[$key] = implode(',',(array)$value);
|
||||
}
|
||||
foreach ($sdf['delivery_bill_list'] as $key => $value) {
|
||||
if(strpos($value['logi_no'], '-')) {
|
||||
continue;
|
||||
}
|
||||
$logi_no[$value['logi_type']][$value['logi_no']] = $value['logi_no'];
|
||||
}
|
||||
|
||||
if ($logi_no) {
|
||||
$param['company_code'] = implode('|',array_keys($logi_no));
|
||||
$param['logistics_no'] = implode('|',array_values($logi_no));
|
||||
}
|
||||
foreach ($logi_no as $key => $value) {
|
||||
$logi_no[$key] = implode(',',(array)$value);
|
||||
}
|
||||
|
||||
if ($logi_no) {
|
||||
$param['company_code'] = implode('|',array_keys($logi_no));
|
||||
$param['logistics_no'] = implode('|',array_values($logi_no));
|
||||
}
|
||||
}
|
||||
$order_id = $sdf['orderinfo']['order_id'];
|
||||
$fenxiao_order = kernel::single('ome_bill_label')->getBillLabelInfo($order_id, 'order', 'SOMS_FENXIAO');
|
||||
if ($fenxiao_order) {
|
||||
@@ -136,6 +140,125 @@ class erpapi_shop_matrix_360buy_request_delivery extends erpapi_shop_request_del
|
||||
return $param;
|
||||
}
|
||||
|
||||
protected function _getPackages($sdf)
|
||||
{
|
||||
//多包裹
|
||||
$dlyPackages = array();
|
||||
foreach ($sdf['delivery_package'] as $key => $val)
|
||||
{
|
||||
$product_bn = $val['bn'];
|
||||
$logi_no = $val['logi_no'] ? $val['logi_no'] : $sdf['logi_no'];
|
||||
|
||||
//check
|
||||
if(empty($product_bn) || empty($logi_no)){
|
||||
continue;
|
||||
}
|
||||
|
||||
//按[货号+物流单号]纬度
|
||||
//@todo:天猫平台一个订单有2行SKU一模一样(买一赠一商品有金额多数量)并且有多个不同物流单号的场景;
|
||||
if(isset($dlyPackages[$product_bn][$logi_no])){
|
||||
$dlyPackages[$product_bn][$logi_no]['number'] += $val['number'];
|
||||
}else{
|
||||
$dlyPackages[$product_bn][$logi_no] = array(
|
||||
'package_key' => $key,
|
||||
'number' => $val['number'],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//按发货单明细获取包裹信息
|
||||
$packageList = array();
|
||||
foreach ($sdf['delivery_items'] as $itemKey => $itemVal)
|
||||
{
|
||||
$product_bn = $itemVal['product_bn'];
|
||||
$item_number = $itemVal['number'];
|
||||
$oid = $itemVal['sku_uuid'];
|
||||
|
||||
//check
|
||||
if(empty($oid)){
|
||||
continue;
|
||||
}
|
||||
|
||||
if(empty($dlyPackages[$product_bn])){
|
||||
continue;
|
||||
}
|
||||
|
||||
//初始化打包数量
|
||||
$sdf['delivery_items'][$itemKey]['pack_nums'] = 0;
|
||||
|
||||
//oid信息
|
||||
$oidList[$oid] = array('nums'=>$itemVal['nums'], 'sendnum'=>$itemVal['sendnum']);
|
||||
|
||||
//一个货号有多个物流包裹的场景
|
||||
foreach ($dlyPackages[$product_bn] as $logi_no => $packVal)
|
||||
{
|
||||
$package_key = $packVal['package_key'];
|
||||
$packageInfo = $sdf['delivery_package'][$package_key];
|
||||
|
||||
//check
|
||||
if($packVal['number'] < 1){
|
||||
continue;
|
||||
}
|
||||
|
||||
if(empty($packageInfo)){
|
||||
continue;
|
||||
}
|
||||
|
||||
//检查已经打包的数量(PKG组合商品没有sendnum字段)
|
||||
if(isset($sdf['delivery_items'][$itemKey]['sendnum'])){
|
||||
if($sdf['delivery_items'][$itemKey]['pack_nums'] >= $sdf['delivery_items'][$itemKey]['sendnum']){
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
//包裹发货数量
|
||||
if($packVal['number'] >= $item_number){
|
||||
$package_num = $item_number;
|
||||
|
||||
$dlyPackages[$product_bn][$logi_no]['number'] -= $item_number;
|
||||
}else{
|
||||
$package_num = $packVal['number'];
|
||||
|
||||
$dlyPackages[$product_bn][$logi_no]['number'] = 0;
|
||||
}
|
||||
|
||||
//已经打包的数量
|
||||
$sdf['delivery_items'][$itemKey]['pack_nums'] += $package_num;
|
||||
//data
|
||||
if(!isset($packageList[$logi_no])){
|
||||
$packageList[$logi_no] = array(
|
||||
'company_code' => $sdf['logi_type'],
|
||||
'company_name' => $sdf['logi_name'],
|
||||
'out_sid' => $packageInfo['logi_no'],
|
||||
'goods' => array(),
|
||||
);
|
||||
if($sdf['logi_type'] == 'OTHER' || $sdf['logi_type'] == 'virtual_delivery'){
|
||||
$packageList[$logi_no]['company_code'] = 'OTHER';
|
||||
$packageList[$logi_no]['zsDelivererName'] = $sdf['logi_name'];
|
||||
$packageList[$logi_no]['zsDelivererPhone'] = 12341234123;
|
||||
}
|
||||
}
|
||||
$packageList[$logi_no]['goods'][] = array(
|
||||
'num' => $package_num,
|
||||
'sku_id' => $itemVal['shop_product_id'],
|
||||
'sku_uuid' => $oid,
|
||||
'sub_tid' => $sdf['orderinfo']['order_bn'],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// 调用miele service处理特定物流编码,应用OTHER相同的处理逻辑
|
||||
if ($service = kernel::servicelist('erpapi.service.shop.360buy.delivery.packages.format')) {
|
||||
foreach ($service as $object => $instance) {
|
||||
if (method_exists($instance, 'getPackageAfter')) {
|
||||
$packageList = $instance->getPackageAfter($packageList, $sdf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return array_values($packageList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 发货回调
|
||||
*
|
||||
|
||||
@@ -166,5 +166,45 @@ class erpapi_shop_matrix_360buy_request_order extends erpapi_shop_request_order
|
||||
}
|
||||
return $return_data;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* [京东700虚拟号]隐私号G组更新:报备外呼主叫号码组
|
||||
*
|
||||
* @param array $params
|
||||
* @return array
|
||||
*/
|
||||
public function bindSecretMobiles($params)
|
||||
{
|
||||
$title = '隐私号G组更新';
|
||||
|
||||
$original_bn = $params['order_bn'];
|
||||
|
||||
// check
|
||||
if(empty($original_bn) || empty($params['mobile_list'])){
|
||||
return $this->error('没有order_bn 或 mobile_list');
|
||||
}
|
||||
|
||||
// mobile_list
|
||||
if(is_array($params['mobile_list'])){
|
||||
$json_mobile = json_encode($params['mobile_list'], JSON_UNESCAPED_UNICODE);
|
||||
}else{
|
||||
$json_mobile = $params['mobile_list'];
|
||||
}
|
||||
|
||||
// params
|
||||
$params = array(
|
||||
'operate_type' => 'ADD_GXB_GROUP', // ADD_GXB_GROUP: 添加,DELETE_GXB_GROUP: 删除
|
||||
'tid' => $params['order_bn'], //订单号
|
||||
'mobile_list' => $json_mobile, // JSON格式
|
||||
//'virtual_id' => '', //此字段不需要传入
|
||||
);
|
||||
|
||||
// callback
|
||||
$callback = array();
|
||||
|
||||
// 使用矩阵透传接口请求淘宝
|
||||
$result = $this->__caller->call(STORE_VIRTUAL_NUMBER_GROUP_UPDATE, $params, $callback, $title, 10, $original_bn);
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,11 +51,10 @@ class erpapi_shop_matrix_360buy_response_aftersalev2 extends erpapi_shop_respons
|
||||
}else if( in_array($status,array('3','9')) ){ //成功
|
||||
$sdf['status'] = 'SUCCESS';
|
||||
}
|
||||
if ($sdf['order']['pay_bn'] == 'deposit' && $sdf['refund_fee']<=0){
|
||||
$sdf['refund_fee'] = $sdf['order']['payed'];
|
||||
}
|
||||
if ($sdf['bool_type'] != ome_refund_bool_type::__PROTECTED_CODE && $params['partRefundType']!=1){
|
||||
$sdf['refund_all_money'] = true;
|
||||
$order = $this->getOrder('order_id,payed', $this->__channelObj->channel['shop_id'], $sdf['order_bn'],'aftersale');
|
||||
$sdf['real_refund_amount'] = $params['refund_fee'];
|
||||
$sdf['refund_fee'] = $order['payed'] ? : $params['refund_fee'];
|
||||
}
|
||||
|
||||
if ($sdf['logistics_company'] == '自动审核' && in_array($status,array('1'))){
|
||||
@@ -64,13 +63,14 @@ class erpapi_shop_matrix_360buy_response_aftersalev2 extends erpapi_shop_respons
|
||||
}
|
||||
|
||||
if ($sdf['extend_field']){
|
||||
|
||||
|
||||
if($sdf['extend_field'] && $sdf['extend_field']['refundAmt']>0){
|
||||
$sdf['jsrefund_flag']=1;
|
||||
|
||||
}
|
||||
}
|
||||
if($sdf['status'] == 'confirm_success') {
|
||||
$sdf['jsrefund_flag'] = 1;
|
||||
}
|
||||
|
||||
$sdf['pickware_type'] = $params['pickware_type'];
|
||||
$sdf['refund_version'] = $params['refund_version'];
|
||||
@@ -102,6 +102,37 @@ class erpapi_shop_matrix_360buy_response_aftersalev2 extends erpapi_shop_respons
|
||||
&& count($params['apply_detail_list'])== 1) {
|
||||
$sdf['refund_item_list']['return_item'][0]['sku_uuid'] = $params['apply_detail_list'][0]['skuUuid'];
|
||||
}
|
||||
|
||||
// 价保退款没有 sku_uuid,通过 item_id 与订单上的平台 skuid(shop_product_id) 匹配找出 oid,多条时用 PHP 取金额最大的子单,并回填 sku_uuid
|
||||
if ($sdf['bool_type'] & ome_refund_bool_type::__PROTECTED_CODE) {
|
||||
$order = $this->getOrder('order_id', $this->__channelObj->channel['shop_id'], $sdf['order_bn'], 'aftersale');
|
||||
if ($order && $order['order_id']) {
|
||||
$db = kernel::database();
|
||||
foreach ($sdf['refund_item_list']['return_item'] as $k => $item) {
|
||||
if (!empty($item['item_id'])) {
|
||||
$item_id = $db->quote($item['item_id']);
|
||||
$order_id = intval($order['order_id']);
|
||||
$sql = "SELECT ob.oid, ob.sku_uuid, COALESCE(ob.divide_order_fee, ob.amount, 0) AS order_fee "
|
||||
. "FROM sdb_ome_order_objects ob "
|
||||
. "INNER JOIN sdb_ome_order_items oi ON ob.obj_id = oi.obj_id AND oi.delete = 'false' "
|
||||
. "WHERE ob.order_id = {$order_id} AND oi.shop_product_id = {$item_id} AND ob.delete = 'false'";
|
||||
$rows = $db->select($sql);
|
||||
if ($rows && is_array($rows)) {
|
||||
usort($rows, function ($a, $b) {
|
||||
return bccomp((string)$b['order_fee'], (string)$a['order_fee'], 4);
|
||||
});
|
||||
$row = reset($rows);
|
||||
if (!empty($row['oid'])) {
|
||||
$sdf['refund_item_list']['return_item'][$k]['oid'] = $row['oid'];
|
||||
if (isset($row['sku_uuid']) && $row['sku_uuid'] !== '' && $row['sku_uuid'] !== null) {
|
||||
$sdf['refund_item_list']['return_item'][$k]['sku_uuid'] = $row['sku_uuid'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $sdf;
|
||||
|
||||
@@ -246,11 +246,17 @@ class erpapi_shop_matrix_360buy_response_order extends erpapi_shop_response_orde
|
||||
if (is_string($popSignMap)) {
|
||||
$popSignMap = json_decode($popSignMap, 1);
|
||||
}
|
||||
if ($popSignMap && $popSignMap['24'] == '2') {
|
||||
// 重置guobu_info,专项补贴是商家自补行为
|
||||
// popSignMap[24] 对应的 guobu_type 映射
|
||||
$popSignMap24TypeMap = [
|
||||
'2' => ['1024'], // 专项补贴
|
||||
'4' => [0x2000], // 纯商家出资
|
||||
'5' => [0x10000], // 政府和商家混合出资
|
||||
];
|
||||
if ($popSignMap && isset($popSignMap['24']) && isset($popSignMap24TypeMap[$popSignMap['24']])) {
|
||||
// 重置guobu_info
|
||||
$this->_ordersdf['guobu_info'] = [
|
||||
'use_gov_subsidy_new' => true,
|
||||
'guobu_type' => ['1024'] // 专项补贴
|
||||
'guobu_type' => $popSignMap24TypeMap[$popSignMap['24']]
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -267,6 +273,8 @@ class erpapi_shop_matrix_360buy_response_order extends erpapi_shop_response_orde
|
||||
if(is_string($orderExt)) {
|
||||
$orderExt = json_decode($orderExt, 1);
|
||||
}
|
||||
|
||||
$paymentDetailList = [];
|
||||
if($this->_ordersdf['extend_field']['version'] >= 3){
|
||||
if($orderExt
|
||||
&& !isset($orderExt['totalSellerReceivable'])){
|
||||
@@ -326,8 +334,11 @@ class erpapi_shop_matrix_360buy_response_order extends erpapi_shop_response_orde
|
||||
}
|
||||
}
|
||||
|
||||
// type = 244 && bearer = 5 国补立减,也需要算在订单总额里
|
||||
if($value['type'] == 244) {
|
||||
// bearer = 5 国补立减,也需要算在订单总额里
|
||||
//@todo:官方文档:https://open.jd.com/v2/#/doc/scene?listId=2168
|
||||
// type = 244 代表:244-新品国补立减
|
||||
// type = 1080 代表:1080-政府消费券(可开票)
|
||||
if(in_array($value['type'], [244, 1080])) {
|
||||
foreach ($value['orderCostAmounts'] as $orderCostAmount) {
|
||||
|
||||
if($orderCostAmount['bearer'] == 5 && $orderCostAmount['bearAmount'] > 0) {
|
||||
@@ -336,7 +347,7 @@ class erpapi_shop_matrix_360buy_response_order extends erpapi_shop_response_orde
|
||||
|
||||
$this->_ordersdf['payments'][] = [
|
||||
"money" => $orderCostAmount['bearAmount'],
|
||||
"paymethod" => '国补立减-政府承担'
|
||||
"paymethod" => isset($value['typeName']) ? $value['typeName'] : '国补立减-政府承担',
|
||||
];
|
||||
}
|
||||
|
||||
@@ -344,8 +355,32 @@ class erpapi_shop_matrix_360buy_response_order extends erpapi_shop_response_orde
|
||||
}
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if(isset($this->_ordersdf['extend_field']['paymentDetailList'])){
|
||||
$paymentDetailList = $this->_ordersdf['extend_field']['paymentDetailList'];
|
||||
if(is_string($paymentDetailList)) {
|
||||
$paymentDetailList = json_decode($paymentDetailList, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 京东E卡
|
||||
if($paymentDetailList){
|
||||
foreach ($paymentDetailList as $pdKey => $payDetais)
|
||||
{
|
||||
if(!isset($payDetais['amountExpands'])){
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($payDetais['amountExpands'] as $payDetailKey => $payDetailInfo)
|
||||
{
|
||||
if(isset($payDetailInfo['type']) && $payDetailInfo['type'] == 101){
|
||||
$this->_ordersdf['extend_field']['is_jd_e_card'] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 国补金额(下单立减)
|
||||
if ($orderExt) {
|
||||
|
||||
@@ -388,10 +423,23 @@ class erpapi_shop_matrix_360buy_response_order extends erpapi_shop_response_orde
|
||||
}
|
||||
$this->_ordersdf['guobu_info']['gov_subsidy_amount_new'] = $govSubsidyInfo['govSubsidyAmount'];
|
||||
}
|
||||
|
||||
// 国补订单拍照规则
|
||||
if(isset($orderExt['SnImgRule'])){
|
||||
$SnImgRuleInfo = $orderExt['SnImgRule'];
|
||||
if (is_string($SnImgRuleInfo)) {
|
||||
$SnImgRuleInfo = json_decode($SnImgRuleInfo, true);
|
||||
}
|
||||
|
||||
// 是否需要拍照
|
||||
if($SnImgRuleInfo['checkImg'] == 1){
|
||||
$this->_ordersdf['guobu_info'] = ['use_gov_subsidy_new' => true];
|
||||
$this->_ordersdf['guobu_info']['guobu_type'][] = 1024; // 需要拍照(十六制数值)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
if(is_array($this->_ordersdf['extend_field']['sendpayMap'])) {
|
||||
foreach($this->_ordersdf['extend_field']['sendpayMap'] as $spVal){
|
||||
if(is_string($spVal)) {
|
||||
@@ -823,6 +871,29 @@ class erpapi_shop_matrix_360buy_response_order extends erpapi_shop_response_orde
|
||||
{
|
||||
if($this->_ordersdf['extend_field']['version'] >= 3) {
|
||||
$this->_ordersdf['coupon_oid_field'] = 'sku_uuid';
|
||||
if (isset($this->_ordersdf['coupon_field']) && is_array($this->_ordersdf['coupon_field'])) {
|
||||
// 调用自定义的service来修改$coupon
|
||||
foreach (kernel::servicelist('erpapi.service.360buy.order.coupon.format') as $service) {
|
||||
if (method_exists($service, 'format_coupon')) {
|
||||
$service->format_coupon($this, $this->_ordersdf['coupon_field']);
|
||||
}
|
||||
}
|
||||
// 先构建sku_uuid到实付金额的映射
|
||||
$skuCalcActuallyPayMap = [];
|
||||
foreach ($this->_ordersdf['coupon_field'] as $cf) {
|
||||
if (isset($cf['sku_uuid']) && isset($cf['calcActuallyPay'])) {
|
||||
$skuCalcActuallyPayMap[$cf['sku_uuid']] += $cf['calcActuallyPay'];
|
||||
}
|
||||
}
|
||||
// 将实付金额写入到order_objects
|
||||
if (!empty($skuCalcActuallyPayMap) && isset($this->_ordersdf['order_objects']) && is_array($this->_ordersdf['order_objects'])) {
|
||||
foreach ($this->_ordersdf['order_objects'] as $k => $object) {
|
||||
if (isset($object['sku_uuid']) && isset($skuCalcActuallyPayMap[$object['sku_uuid']])) {
|
||||
$this->_ordersdf['order_objects'][$k]['actually_amount'] = $skuCalcActuallyPayMap[$object['sku_uuid']];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
//矩阵返回优惠数据不请求接口,否则请求接口
|
||||
$ext_data = array();
|
||||
|
||||
Reference in New Issue
Block a user