Files
OMS/app/ome/lib/order/platform.php
chenping 656bbbabf6 [TBID:SCRUM-7446] V8.6.0发版
【优化】微信小店退款金额
【修复】自建仓储在线盘点条码输入后无响应
【修复】邮编异常拼接导致的客户保存失败
【新增】hold单规则支持选择多个客户分类
【新增】店铺每日统计报表支持按金额排序展示
【优化】店铺授权到期提示文案
【新增】特殊订单条件配置增加一个排除商品的条件
【新增】在售库存高级筛选增加未匹配和已匹配
【新增】京东引凤业务对接
2026-08-05 19:28:08 +08:00

273 lines
10 KiB
PHP
Raw Permalink 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
/**
* Copyright 2012-2026 ShopeX (https://www.shopex.cn)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
class ome_order_platform
{
/**
* deliveryConsign
* @param mixed $orderId ID
* @return mixed 返回值
*/
public function deliveryConsign($orderId)
{
$orderMdl = app::get('ome')->model('orders');
$deliveryMdl = app::get('ome')->model('delivery');
$logMdl = app::get('ome')->model('operation_log');
$orderObjectMdl = app::get('ome')->model('order_objects');
$order = $orderMdl->db_dump(array('order_id' => $orderId));
if($order['is_fail'] == 'true') {
return array('rsp' => 'fail', 'order_bn' => $order['order_bn'], 'msg' => '失败订单不能发货');
}
$shShipCount = $orderObjectMdl->count([
'order_id' => $orderId,
'is_sh_ship' => 'true',
'delete' => 'false',
]);
$rs = array('rsp' => 'fail', 'order_bn' => $order['order_bn']);
if ($order['order_type'] != 'platform' && $shShipCount == 0) {
$rs['msg'] = '不是平台自发订单';
return $rs;
}
if (!in_array($order['source_status'], ['WAIT_BUYER_CONFIRM_GOODS', 'TRADE_FINISHED'])) {
//$rs['msg'] = '平台订单状态不对'; return $rs;
}
$delivery_id_list = array();
$delivery_list = $deliveryMdl->getDeliversByOrderId($order['order_id']);
foreach ($delivery_list as $key => $value) {
if (in_array($value['status'], array('ready', 'progress'))) {
$delivery_id_list[] = $value['delivery_id'];
}
}
if (!$delivery_id_list) {
foreach ($this->_get_order_items($order['order_id']) as $store_code => $value) {
$order['order_items'] = $value;
list($rsp, $msg, $delivery_id) = $this->addDelivery($order, $store_code);
if ($rsp === false){
$rs['msg'] = $msg;return $rs;
}
$delivery_id_list[] = $delivery_id;
}
}
if (!$delivery_id_list) {
$rs['msg'] = '订单已经发货';return $rs;
}
/////////////////////////////////////////////////////////
// 发货单发货 //
////////////////////////////////////////////////////////
$delivery_list = $deliveryMdl->getList('delivery_bn,delivery_id', array('delivery_id' => $delivery_id_list));
foreach ($delivery_list as $delivery) {
$params = array(
'status' => 'delivery',
'delivery_bn' => $delivery['delivery_bn'],
);
$consignRs = kernel::single('ome_event_receive_delivery')->update($params);
if ($consignRs['rsp'] == 'fail') {
app::get('ome')->model('operation_log')->write_log('delivery_process@ome', $delivery['delivery_id'], '发货单发货失败:'.$consignRs['msg']);
$rs['msg'] = '发货单发货失败:'.$consignRs['msg'];
return $rs;
}
}
return array('rsp' => 'succ');
}
/**
* 添加Delivery
* @param mixed $order order
* @param mixed $store_code store_code
* @return mixed 返回值
*/
public function addDelivery($order, $store_code)
{
$brRelMdl = app::get('wmsmgr')->model('branch_relation');
$brMdl = app::get('ome')->model('branch');
$logMdl = app::get('ome')->model('operation_log');
$deliveryMdl = app::get('ome')->model('delivery');
$orderMdl = app::get('ome')->model('orders');
// 判断是否指定平台仓
$branch_id = null;
if ($store_code) {
$wms_branch = $brRelMdl->db_dump(array('wms_branch_bn' => $store_code), 'sys_branch_bn');
if ($wms_branch['sys_branch_bn']) {
$branch = $brMdl->db_dump(array('branch_bn' => $wms_branch['sys_branch_bn'], 'check_permission' => 'false'), 'branch_id');
} else {
$branch = $brMdl->db_dump(array('branch_bn' => $store_code, 'check_permission' => 'false'), 'branch_id');
}
$branch_id = $branch['branch_id'];
}
if (!$branch_id) {
// 京东引凤对接:引凤订单优先匹配 type=yinfeng 仓
// 引凤识别口径sendPayMap[1410]=='1' → __yinfeng_order → SOMS_YINFENG 标签
$err = null;
if (kernel::single('ome_bill_label')->getBillLabelInfo($order['order_id'], 'order', 'SOMS_YINFENG', $err)) {
$branch = $brMdl->db_dump(array('type' => 'yinfeng', 'check_permission' => 'false'), 'branch_id');
if ($branch) {
$branch_id = $branch['branch_id'];
}
}
// 普通平台自发仍 owner=3 fallback
if (!$branch_id) {
$branch = $brMdl->db_dump(array('owner' => '3','platform' => $order['shop_type'], 'check_permission' => 'false'), 'branch_id');
if (!$branch) {
$branch = $brMdl->db_dump(array('owner' => '3','type'=>'main', 'check_permission' => 'false' ,'filter_sql' => '(platform is null or platform="")'), 'branch_id');
}
$branch_id = $branch['branch_id'];
}
}
if (!$branch_id) {
$errmsg = '平台自发仓库未添加';
$logMdl->write_log('order_confirm@ome', $order['order_id'], $errmsg);
return array(false, $errmsg);
}
$delivery = array(
'branch_id' => $branch_id,
'delivery_waybillCode' => $order['logi_no'],
'consignee' => array(
'name' => $order['ship_name'],
'r_time' => $order['ship_time'],
'mobile' => $order['ship_mobile'],
'zip' => $order['ship_zip'],
'area' => $order['ship_area'],
'telephone' => $order['ship_tel'],
'email' => $order['ship_email'],
'addr' => $order['ship_addr'],
),
'delivery_items' => array(),
);
$order_items = array();
foreach ($order['order_items'] as $item) {
if ($item['delete'] == 'true' || !$item['nums']) {
continue;
}
if (!$item['product_id']) {
$errmsg = '明细未修复,无法生成发货单';
$logMdl->write_log('order_confirm@ome', $order['order_id'], $errmsg);
return array(false, $errmsg);
}
if(!$delivery['delivery_items'][$item['product_id']]) {
$delivery['delivery_items'][$item['product_id']] = array(
'product_id' => $item['product_id'],
'bn' => $item['bn'],
'product_name' => $item['name'],
'shop_product_id' => $item['shop_product_id'],
);
}
$delivery['delivery_items'][$item['product_id']]['number'] += $item['nums'];
$order_items[] = array(
'item_id' => $item['item_id'],
'product_id' => $item['product_id'],
'number' => $item['nums'],
'bn' => $item['bn'],
'product_name' => $item['name'],
'obj_id' => $item['obj_id'],
);
}
if (!$order_items) {
$errmsg = '明细已删除';
$logMdl->write_log('order_confirm@ome', $order['order_id'], $errmsg);
return array(false, $errmsg);
}
$result = $deliveryMdl->addDelivery($order['order_id'], $delivery, array(), $order_items, $split_status);
$delivery_id = $result['data'];
if (!$delivery_id) {
$logMdl->write_log('order_confirm@ome', $order['order_id'], $result['msg']);
return array(false, $result['msg']);
}
//更新订单信息
$orderMdl->update(array(
'process_status' => $split_status,
'confirm' => 'Y',
'dispatch_time' => time(),
'refund_status' => 0,
'splited_num_upset_sql' => 'IF(`splited_num` IS NULL, 1, `splited_num` + 1)',
), array('order_id' => $order['order_id']));
$d = $deliveryMdl->db_dump($delivery_id, 'delivery_id,delivery_bn');
$log_msg = sprintf('订单确认(发货单号:<a href="index.php?app=ome&ctl=admin_receipts_print&act=show_delivery_items&id=%s" target="_blank">%s</a>)', $d['delivery_id'], $d['delivery_bn']);
$logMdl->write_log('order_confirm@ome', $order['order_id'], $log_msg);
return array(true, '生成发货单成功', $delivery_id);
}
private function _get_order_items($order_id)
{
$objectMdl = app::get('ome')->model('order_objects');
$itemMdl = app::get('ome')->model('order_items');
$object_list = $item_list = array();
foreach ($objectMdl->getList('*', array('order_id' => $order_id, 'is_sh_ship' => 'true', 'delete' => 'false')) as $value) {
$object_list[$value['obj_id']] = $value;
}
if (!$object_list) {
return [];
}
foreach ($itemMdl->getList('*', array('order_id' => $order_id, 'obj_id' => array_column($object_list, 'obj_id'), 'delete' => 'false', 'filter_sql' => ' nums > split_num')) as $value) {
$store_code = (string) $object_list[$value['obj_id']]['store_code'];
if ($left_nums = $value['nums'] - $value['split_num']) {
$value['nums'] = $left_nums;
$item_list[$store_code][$value['item_id']] = $value;
}
}
return $item_list;
}
}