Files
OMS/app/ome/lib/order/platform.php
2026-01-04 17:22:44 +08:00

261 lines
9.6 KiB
PHP

<?php
/**
* Copyright 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) {
$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;
}
}