";
+ }
+
var $column_order_combined_confirm = '已合并审单';
var $column_order_combined_confirm_width = "60";
function column_order_combined_confirm($row) {
diff --git a/app/ome/lib/order/fail.php b/app/ome/lib/order/fail.php
index e5e92346..921aa7d3 100644
--- a/app/ome/lib/order/fail.php
+++ b/app/ome/lib/order/fail.php
@@ -124,7 +124,11 @@ class ome_order_fail
if($pbn){
$salesMLib = kernel::single('material_sales_material');
- foreach($pbn as $obj_id=>$bn){
+ foreach($pbn as $obj_id=>$bn)
+ {
+ // trim
+ $bn = trim($bn);
+
//获取对应的obj层数据
$objInfo = $Oorder_objects->getList('*',array('obj_id'=>$obj_id), 0 , 1);
//销售物料没对上,进行修复
@@ -172,10 +176,11 @@ class ome_order_fail
$price = bcdiv($amount, $basicMInfo['number']*$quantity, 2);
$sendnum = $orderInfo[0]['ship_status'] == '0' ? 0 : $basicMInfo['number']*$quantity;
+ $shop_product_id = $this->_getWxshipinShopProductId($orderInfo[0], $objInfo[0], 0);
$order_items[] = array(
'shop_goods_id' => $objInfo[0]['shop_goods_id'] ? $objInfo[0]['shop_goods_id'] : 0,
'product_id' => $basicMInfo['bm_id'] ? $basicMInfo['bm_id'] : 0,
- 'shop_product_id' => 0,
+ 'shop_product_id' => $shop_product_id,
'bn' => $basicMInfo['material_bn'],
'name' => $basicMInfo['material_name'],
'cost' => $basicMInfo['cost'] ? $basicMInfo['cost'] : 0.00,
@@ -201,10 +206,11 @@ class ome_order_fail
//组织item数据
foreach($basicMInfos as $k => $basicMInfo){
$sendnum = $orderInfo[0]['ship_status'] == '0' ? 0 : $basicMInfo['number'];
+ $shop_product_id = $this->_getWxshipinShopProductId($orderInfo[0], $objInfo[0], 0);
$order_items[] = array(
'shop_goods_id' => $objInfo[0]['shop_goods_id'] ? $objInfo[0]['shop_goods_id'] : 0,
'product_id' => $basicMInfo['bm_id'] ? $basicMInfo['bm_id'] : 0,
- 'shop_product_id' => 0,
+ 'shop_product_id' => $shop_product_id,
'bn' => $basicMInfo['material_bn'],
'name' => $basicMInfo['material_name'],
'cost' => (float)$objInfo[0]['cost'] ? $objInfo[0]['cost'] : $basicMInfo['cost'],
@@ -234,10 +240,11 @@ class ome_order_fail
$luckybag_id = ($basicMInfo['combine_id'] ? $basicMInfo['combine_id'] : 0);
//items
+ $shop_product_id = $this->_getWxshipinShopProductId($orderInfo[0], $objInfo[0], 0);
$order_items[] = array(
'shop_goods_id' => $objInfo[0]['shop_goods_id'] ? $objInfo[0]['shop_goods_id'] : 0,
'product_id' => $basicMInfo['bm_id'] ? $basicMInfo['bm_id'] : 0,
- 'shop_product_id' => 0,
+ 'shop_product_id' => $shop_product_id,
'bn' => $basicMInfo['material_bn'],
'name' => $basicMInfo['material_name'],
'cost' => $basicMInfo['cost'] ? $basicMInfo['cost'] : 0.00,
@@ -275,10 +282,11 @@ class ome_order_fail
$sendnum = $orderInfo[0]['ship_status'] == '0' ? 0 : $objInfo[0]['sendnum']*$basicMInfo['number'];
//普通销售物料item层数据以object为主,原本就是1:1的两层结构,item合并object,item层数据真实
+ $shop_product_id = $this->_getWxshipinShopProductId($orderInfo[0], $objInfo[0], $objInfo[0]['shop_product_id']);
$order_items[] = array(
'shop_goods_id' => $objInfo[0]['shop_goods_id'] ? $objInfo[0]['shop_goods_id'] : 0,
'product_id' => $basicMInfo['bm_id'] ? $basicMInfo['bm_id'] : 0,
- 'shop_product_id' => $objInfo[0]['shop_product_id'] ? $objInfo[0]['shop_product_id'] : 0,
+ 'shop_product_id' => $shop_product_id,
'bn' => $basicMInfo['material_bn'],
'name' => $basicMInfo['material_name'],
'cost' => (float)$objInfo[0]['cost'] ? $objInfo[0]['cost'] : $basicMInfo['cost'],
@@ -583,10 +591,11 @@ class ome_order_fail
foreach($basicMInfos as $k => $basicMInfo){
//$basicMInfo['retail_price'] ? $basicMInfo['retail_price'] : 0.00
$sendnum = $orderInfo[0]['ship_status'] == '0' ? 0 : $basicMInfo['number']*$quantity;
+ $shop_product_id = $this->_getWxshipinShopProductId($orderInfo[0], $objInfo[0], 0);
$order_items[] = array(
'shop_goods_id' => $objInfo[0]['shop_goods_id'] ? $objInfo[0]['shop_goods_id'] : 0,
'product_id' => $basicMInfo['bm_id'] ? $basicMInfo['bm_id'] : 0,
- 'shop_product_id' => 0,
+ 'shop_product_id' => $shop_product_id,
'bn' => $basicMInfo['material_bn'],
'name' => $basicMInfo['material_name'],
'cost' => $basicMInfo['cost'] ? $basicMInfo['cost'] : 0.00,
@@ -610,10 +619,11 @@ class ome_order_fail
//组织item数据
foreach($basicMInfos as $k => $basicMInfo){
$sendnum = $orderInfo[0]['ship_status'] == '0' ? 0 : $basicMInfo['number'];
+ $shop_product_id = $this->_getWxshipinShopProductId($orderInfo[0], $objInfo[0], 0);
$order_items[] = array(
'shop_goods_id' => $objInfo[0]['shop_goods_id'] ? $objInfo[0]['shop_goods_id'] : 0,
'product_id' => $basicMInfo['bm_id'] ? $basicMInfo['bm_id'] : 0,
- 'shop_product_id' => 0,
+ 'shop_product_id' => $shop_product_id,
'bn' => $basicMInfo['material_bn'],
'name' => $basicMInfo['material_name'],
'cost' => (float)$objInfo[0]['cost'] ? $objInfo[0]['cost'] : $basicMInfo['cost'],
@@ -643,10 +653,11 @@ class ome_order_fail
$luckybag_id = ($basicMInfo['combine_id'] ? $basicMInfo['combine_id'] : 0);
//items
+ $shop_product_id = $this->_getWxshipinShopProductId($orderInfo[0], $objInfo[0], 0);
$order_items[] = array(
'shop_goods_id' => $objInfo[0]['shop_goods_id'] ? $objInfo[0]['shop_goods_id'] : 0,
'product_id' => $basicMInfo['bm_id'] ? $basicMInfo['bm_id'] : 0,
- 'shop_product_id' => 0,
+ 'shop_product_id' => $shop_product_id,
'bn' => $basicMInfo['material_bn'],
'name' => $basicMInfo['material_name'],
'cost' => $basicMInfo['cost'] ? $basicMInfo['cost'] : 0.00,
@@ -683,10 +694,11 @@ class ome_order_fail
$sendnum = $orderInfo[0]['ship_status'] == '0' ? 0 : $objInfo[0]['sendnum']*$basicMInfo['number'];
//普通销售物料item层数据以object为主,原本就是1:1的两层结构,item合并object,item层数据真实
+ $shop_product_id = $this->_getWxshipinShopProductId($orderInfo[0], $objInfo[0], $objInfo[0]['shop_product_id']);
$order_items[] = array(
'shop_goods_id' => $objInfo[0]['shop_goods_id'] ? $objInfo[0]['shop_goods_id'] : 0,
'product_id' => $basicMInfo['bm_id'] ? $basicMInfo['bm_id'] : 0,
- 'shop_product_id' => $objInfo[0]['shop_product_id'] ? $objInfo[0]['shop_product_id'] : 0,
+ 'shop_product_id' => $shop_product_id,
'bn' => $basicMInfo['material_bn'],
'name' => $basicMInfo['material_name'],
'cost' => (float)$objInfo[0]['cost'] ? $objInfo[0]['cost'] : $basicMInfo['cost'],
@@ -914,6 +926,48 @@ class ome_order_fail
$orderObj->write_log_detail($log_id,$orders);
}
+ /**
+ * 获取微信视频号失败订单恢复时使用的平台 SKU ID。
+ *
+ * 非微信视频号订单保持原默认值;微信视频号订单优先使用已有 SKU,
+ * 没有时从 order_objects.addon 里备份的原始平台明细继承。
+ *
+ * @param array $orderInfo 订单主信息
+ * @param array $objectInfo 订单对象信息
+ * @param mixed $defaultShopProductId 默认平台 SKU ID
+ * @return mixed
+ */
+ private function _getWxshipinShopProductId($orderInfo, $objectInfo, $defaultShopProductId = 0)
+ {
+ if ($orderInfo['shop_type'] != 'wxshipin') {
+ return $defaultShopProductId ? $defaultShopProductId : 0;
+ }
+ if ($defaultShopProductId && $defaultShopProductId != '0') {
+ return $defaultShopProductId;
+ }
+
+ // 微信视频号发货回写依赖平台 SKU ID。失败订单恢复时 item 是重建的,
+ // 这里从订单转换阶段备份的原始平台明细中继承,避免恢复后 sku_id 变成 0。
+ $addon = $objectInfo['addon'];
+ $addonData = is_array($addon) ? $addon : ($addon ? json_decode($addon, true) : array());
+ if (!is_array($addonData) || empty($addonData['wxshipin_platform_items'])) {
+ return 0;
+ }
+
+ $platformItems = $addonData['wxshipin_platform_items'];
+ if ($platformItems['shop_product_id'] && $platformItems['shop_product_id'] != '0') {
+ return $platformItems['shop_product_id'];
+ }
+
+ foreach ((array)$platformItems['items'] as $item) {
+ if ($item['shop_product_id'] && $item['shop_product_id'] != '0') {
+ return $item['shop_product_id'];
+ }
+ }
+
+ return 0;
+ }
+
public function getFailOrderByBn($smBns=array())
{
$orderObj = app::get('ome')->model('orders');
@@ -925,6 +979,7 @@ class ome_order_fail
$sql = "SELECT I.order_id FROM sdb_ome_order_objects as I LEFT JOIN sdb_ome_orders AS O ON I.order_id=O.order_id ";
$sql .= " WHERE O.org_id>0 AND O.is_fail='true' AND O.edit_status='true' AND O.archive='1' ";
+ $sql .= " AND O.process_status='unconfirmed' ";
$sql .= " AND I.goods_id=0 AND I.bn IN('". implode("','", $smBns). "') GROUP BY order_id LIMIT 0,1000";
$orderList = $orderObj->db->select($sql);
@@ -942,12 +997,67 @@ class ome_order_fail
$sql = "SELECT I.order_id FROM sdb_ome_order_objects as I LEFT JOIN sdb_ome_orders AS O ON I.order_id=O.order_id ";
$sql .= " WHERE O.org_id>0 AND O.is_fail='true' AND O.edit_status='true' AND O.archive='1' ";
+ $sql .= " AND O.process_status='unconfirmed' ";
$sql .= " AND I.goods_id=0 AND I.shop_goods_id IN('". implode("','", $shopGoodsIds). "') GROUP BY order_id LIMIT 0,1000";
$orderList = $orderObj->db->select($sql);
return $orderList;
}
+
+ /**
+ * 统计可批量修复的失败订单数量
+ *
+ * @param array $smBns
+ * @param bool $requireUnconfirmed true=与批量修复条件一致(未确认)
+ * @return int
+ */
+ public function countFailOrderByBn($smBns = array(), $requireUnconfirmed = true)
+ {
+ $orderObj = app::get('ome')->model('orders');
+
+ if (empty($smBns)) {
+ return 0;
+ }
+
+ $sql = "SELECT COUNT(DISTINCT O.order_id) AS cnt FROM sdb_ome_order_objects as I LEFT JOIN sdb_ome_orders AS O ON I.order_id=O.order_id ";
+ $sql .= " WHERE O.org_id>0 AND O.is_fail='true' AND O.edit_status='true' AND O.archive='1' ";
+ if ($requireUnconfirmed) {
+ $sql .= " AND O.process_status='unconfirmed' ";
+ }
+ $sql .= " AND I.goods_id=0 AND I.bn IN('". implode("','", $smBns). "')";
+
+ $row = $orderObj->db->selectrow($sql);
+
+ return intval($row['cnt']);
+ }
+
+ /**
+ * 统计可批量修复的失败订单数量(按平台商品ID)
+ *
+ * @param array $shopGoodsIds
+ * @param bool $requireUnconfirmed true=与批量修复条件一致(未确认)
+ * @return int
+ */
+ public function countFailOrderByName($shopGoodsIds = array(), $requireUnconfirmed = true)
+ {
+ $orderObj = app::get('ome')->model('orders');
+
+ if (empty($shopGoodsIds)) {
+ return 0;
+ }
+
+ $sql = "SELECT COUNT(DISTINCT O.order_id) AS cnt FROM sdb_ome_order_objects as I LEFT JOIN sdb_ome_orders AS O ON I.order_id=O.order_id ";
+ $sql .= " WHERE O.org_id>0 AND O.is_fail='true' AND O.edit_status='true' AND O.archive='1' ";
+ if ($requireUnconfirmed) {
+ $sql .= " AND O.process_status='unconfirmed' ";
+ }
+ $sql .= " AND I.goods_id=0 AND I.shop_goods_id IN('". implode("','", $shopGoodsIds). "')";
+
+ $row = $orderObj->db->selectrow($sql);
+
+ return intval($row['cnt']);
+ }
/**
* 修复[淘宝平台]原始属性值
diff --git a/app/ome/lib/order/urgent.php b/app/ome/lib/order/urgent.php
new file mode 100644
index 00000000..bb1d3296
--- /dev/null
+++ b/app/ome/lib/order/urgent.php
@@ -0,0 +1,672 @@
+model('orders')->dump($orderId, 'pay_status,order_id,order_bn,process_status,status,ship_status,sync,sync_fail_type,abnormal,pause,logi_no,source,createway,shop_id,shop_type,last_modified,createtime');
+ if (!$order) {
+ return [];
+ }
+
+ // 获取订单关联发货单列表,并使用最早创建的主发货单作为订单级状态时间参考
+ $deliveryRows = app::get('ome')->model('delivery')->getDeliversByOrderId($orderId);
+ $delivery = $this->getPrimaryUrgentDelivery($deliveryRows);
+
+ $details = $this->buildUrgentOrderDetails($orderId, $deliveryRows, $order);
+ $mainStatusData = $this->buildUrgentMainStatus($order, $details, $delivery);
+
+ return [
+ 'orderStatus' => $mainStatusData['orderStatus'],
+ 'status_update_time' => $mainStatusData['status_update_time'],
+ 'tracking_number' => $mainStatusData['tracking_number'],
+ 'exception_reason' => $mainStatusData['exception_reason'],
+ 'order_details' => $details,
+ 'is_split' => $this->isSplitOrder($order),
+ ];
+ }
+
+ /**
+ * 构建加急发货回告 DTO。
+ *
+ * @param int|string $orderId
+ * @param string $orderBn
+ * @return array
+ */
+ public function buildUrgentOrderReportDto($orderId, $orderBn = '')
+ {
+ $statusPayload = $this->buildUrgentOrderStatus($orderId);
+ if (empty($statusPayload['orderStatus'])) {
+ return [];
+ }
+
+ if (!$orderBn) {
+ $order = app::get('ome')->model('orders')->dump($orderId, 'order_bn');
+ $orderBn = $order['order_bn'] ?: '';
+ }
+
+ return $this->formatUrgentOrderReportDto($statusPayload, $orderBn);
+ }
+
+ /**
+ * 构建矩阵出站参数 erp_synergy_callback_req_dto。
+ *
+ * @param int|string $orderId
+ * @param string $orderBn
+ * @return array
+ */
+ public function buildUrgentOrderReportParams($orderId, $orderBn = '')
+ {
+ return $this->wrapUrgentOrderDtoPayload(
+ $this->buildUrgentOrderReportDto($orderId, $orderBn),
+ 'erp_synergy_callback_req_dto'
+ );
+ }
+
+ /**
+ * 构建加急发货入站响应参数 urgent_delivery_notify_response。
+ *
+ * @param int|string $orderId
+ * @param string $orderBn
+ * @return array
+ */
+ public function buildUrgentNotifyResponseParams($orderId, $orderBn = '')
+ {
+ return $this->wrapUrgentOrderDtoPayload(
+ $this->buildUrgentOrderReportDto($orderId, $orderBn),
+ 'urgent_delivery_notify_response'
+ );
+ }
+
+ /**
+ * 将 DTO 内容包装为指定字段名的 JSON 字符串参数。
+ *
+ * @param array $payload
+ * @param string $fieldName
+ * @return array
+ */
+ protected function wrapUrgentOrderDtoPayload($payload, $fieldName)
+ {
+ if (!$payload) {
+ return [];
+ }
+
+ $dtoJson = $this->encodeUrgentOrderDtoJson($payload);
+ if ($dtoJson === '') {
+ return [];
+ }
+
+ return [
+ $fieldName => $dtoJson,
+ ];
+ }
+
+ /**
+ * 编码加急回告 DTO,入站响应与主动回告共用。
+ *
+ * @param array $payload
+ * @return string
+ */
+ public function encodeUrgentOrderDtoJson($payload)
+ {
+ $dtoJson = json_encode($payload, JSON_UNESCAPED_UNICODE);
+ if ($dtoJson !== false) {
+ return $dtoJson;
+ }
+
+ array_walk_recursive($payload, function (&$value) {
+ if (is_string($value)) {
+ $value = iconv('UTF-8', 'UTF-8//IGNORE', $value);
+ }
+ });
+
+ $dtoJson = json_encode($payload, JSON_UNESCAPED_UNICODE);
+ return $dtoJson === false ? '' : $dtoJson;
+ }
+
+ /**
+ * 将状态聚合结果格式化为 erp_synergy_callback_req_dto 内容。
+ *
+ * @param array $statusPayload
+ * @param string $orderBn
+ * @return array
+ */
+ public function formatUrgentOrderReportDto($statusPayload, $orderBn)
+ {
+ $payload = [
+ 'trade_order_code' => (string)$orderBn,
+ 'order_status' => (string)$statusPayload['orderStatus'],
+ 'status_update_time' => $statusPayload['status_update_time'] ?: date('Y-m-d H:i:s'),
+ 'tracking_number' => '',
+ 'exception_reason' => '',
+ 'extend_fields' => '{}',
+ 'order_details' => array_values((array)($statusPayload['order_details'] ?: [])),
+ 'is_split' => (bool)($statusPayload['is_split'] ?? false),
+ ];
+
+ if (!empty($statusPayload['tracking_number'])) {
+ $payload['tracking_number'] = (string)$statusPayload['tracking_number'];
+ }
+ if (!empty($statusPayload['exception_reason'])) {
+ $payload['exception_reason'] = (string)$statusPayload['exception_reason'];
+ }
+
+ return $payload;
+ }
+
+ /**
+ * 判断订单是否拆单,逻辑与发货同步 _is_split_order 保持一致。
+ *
+ * @param array $order
+ * @return bool
+ */
+ public function isSplitOrder($order)
+ {
+ if ($order['ship_status'] == '2'
+ || $order['process_status'] == 'remain_cancel'
+ || $order['process_status'] == 'splitting') {
+ return true;
+ }
+
+ return count($this->getOrderDeliveryIds($order['order_id'])) > 1;
+ }
+
+ /**
+ * 获取订单有效主发货单列表。
+ *
+ * @param int|string $orderId
+ * @return array
+ */
+ protected function getOrderDeliveryIds($orderId)
+ {
+ $sql = "SELECT d.delivery_id,d.status,d.delivery_time
+ FROM sdb_ome_delivery_order AS dord
+ LEFT JOIN sdb_ome_delivery AS d
+ ON(dord.delivery_id=d.delivery_id)
+ WHERE dord.order_id='" . intval($orderId) . "'
+ AND d.parent_id='0'
+ AND d.disabled='false'
+ AND d.status IN('succ','progress','ready')";
+ $rows = kernel::database()->select($sql);
+
+ $deliveryIds = [];
+ foreach ((array)$rows as $row) {
+ $deliveryIds[$row['delivery_id']] = $row;
+ }
+
+ return $deliveryIds;
+ }
+
+ /**
+ * 解析加急状态的更新时间
+ *
+ * 按优先级从发货单和订单中取最合适的时间戳,格式化为 Y-m-d H:i:s 返回。
+ * 优先级:发货时间 > 发货单修改时间 > 订单修改时间 > 订单创建时间
+ *
+ * @param array $order 订单信息
+ * @param array $delivery 发货单信息
+ * @return string 格式化后的时间字符串
+ */
+ protected function resolveUrgentStatusUpdateTime($order, $delivery)
+ {
+ // 按优先级取时间戳
+ $timestamp = 0;
+ if (!empty($delivery['delivery_time'])) {
+ $timestamp = $delivery['delivery_time'];
+ } elseif (!empty($delivery['last_modified'])) {
+ $timestamp = $delivery['last_modified'];
+ } elseif (!empty($order['last_modified'])) {
+ $timestamp = $order['last_modified'];
+ } elseif (!empty($order['createtime'])) {
+ $timestamp = $order['createtime'];
+ }
+
+ // 无有效时间戳时返回当前时间
+ if (!$timestamp) {
+ return date('Y-m-d H:i:s');
+ }
+ // 数字型时间戳转格式化字符串
+ if (is_numeric($timestamp)) {
+ return date('Y-m-d H:i:s', intval($timestamp));
+ }
+
+ return (string)$timestamp;
+ }
+
+ /**
+ * 构建加急订单的商品明细列表
+ *
+ * 优先使用 order_items 表(含 SKU 信息)拼装明细;
+ * 若 order_items 无有效数据则降级使用 order_objects 表。
+ *
+ * @param int|string $orderId 订单ID
+ * @return array 订单明细数组,每项包含 sub_trade_order_code、item_id、sku_id、quantity
+ */
+ protected function buildUrgentOrderDetails($orderId, $deliveryRows = [], $order = [])
+ {
+ $details = [];
+ $deliveryRows = (array)$deliveryRows;
+ // 查询订单货品和订单商品行
+ $objectRows = app::get('ome')->model('order_objects')->getList('obj_id,oid,shop_goods_id,quantity', ['order_id' => $orderId, 'delete' => 'false']);
+ $orderItemRows = app::get('ome')->model('order_items')->getList('item_id,obj_id,shop_goods_id,shop_product_id,nums,item_type', ['order_id' => $orderId, 'delete' => 'false']);
+ $deliveryDetailRows = app::get('ome')->model('delivery_items_detail')->getList(
+ 'delivery_id,order_obj_id,order_item_id,oid,number',
+ ['order_id' => $orderId]
+ );
+
+ // 构建 obj_id => object 映射,便于关联查找
+ $objectMap = [];
+ foreach ((array)$objectRows as $objectRow) {
+ $objectMap[$objectRow['obj_id']] = $objectRow;
+ }
+
+ // 统计每个 obj_id 下的 order_items 数量,用于判断 obj 级映射是否会歧义。
+ $objectItemCountMap = [];
+ foreach ((array)$orderItemRows as $itemRow) {
+ if (empty($itemRow['obj_id'])) {
+ continue;
+ }
+ if (!isset($objectItemCountMap[$itemRow['obj_id']])) {
+ $objectItemCountMap[$itemRow['obj_id']] = 0;
+ }
+ $objectItemCountMap[$itemRow['obj_id']]++;
+ }
+
+ // 构建发货单映射与订单货品 -> 发货单映射,便于按真实发货单状态生成明细状态
+ $deliveryMap = [];
+ foreach ($deliveryRows as $deliveryRow) {
+ $deliveryMap[$deliveryRow['delivery_id']] = $deliveryRow;
+ }
+
+ $detailDeliveryMap = [];
+ foreach ((array)$deliveryDetailRows as $deliveryDetailRow) {
+ if (!empty($deliveryDetailRow['order_item_id'])) {
+ $detailDeliveryMap['item_' . $deliveryDetailRow['order_item_id']] = $deliveryMap[$deliveryDetailRow['delivery_id']];
+ }
+ if (!empty($deliveryDetailRow['order_obj_id'])) {
+ $detailDeliveryMap['obj_' . $deliveryDetailRow['order_obj_id']] = $deliveryMap[$deliveryDetailRow['delivery_id']];
+ }
+ if (!empty($deliveryDetailRow['oid'])) {
+ $detailDeliveryMap['oid_' . $deliveryDetailRow['oid']] = $deliveryMap[$deliveryDetailRow['delivery_id']];
+ }
+ }
+
+ // 优先从 order_items 构建明细(包含 SKU 维度信息)
+ foreach ((array)$orderItemRows as $itemRow) {
+ $objectRow = $objectMap[$itemRow['obj_id']] ?: [];
+ if (!$objectRow) {
+ continue;
+ }
+ // 过滤非商品类型且无商品编码的行
+ if ($itemRow['item_type'] !== 'product' && !$itemRow['shop_product_id'] && !$itemRow['shop_goods_id']) {
+ continue;
+ }
+
+ if (empty($objectRow['oid'])){
+ continue;
+ }
+
+ $deliveryRow = [];
+ if (!empty($detailDeliveryMap['item_' . $itemRow['item_id']])) {
+ $deliveryRow = $detailDeliveryMap['item_' . $itemRow['item_id']];
+ } elseif (!empty($objectRow['oid']) && !empty($detailDeliveryMap['oid_' . $objectRow['oid']])) {
+ $deliveryRow = $detailDeliveryMap['oid_' . $objectRow['oid']];
+ } elseif (($objectItemCountMap[$itemRow['obj_id']] ?: 0) === 1 && !empty($detailDeliveryMap['obj_' . $itemRow['obj_id']])) {
+ // 仅当该 obj_id 下只有一个明细时,才允许退化到 obj 级发货单映射,避免把别的明细发货单借给当前明细。
+ $deliveryRow = $detailDeliveryMap['obj_' . $itemRow['obj_id']];
+ }
+ $detailStatus = $this->buildUrgentDetailStatus($deliveryRow, $order);
+ $trackingNumber = $this->resolveDetailTrackingNumber($deliveryRow, $detailStatus['order_status']);
+
+ $details[] = [
+ 'sub_trade_order_code' => (string)$objectRow['oid'],
+ 'item_id' => (string)($itemRow['shop_goods_id'] ?: $objectRow['shop_goods_id']),
+ 'sku_id' => (string)$itemRow['shop_product_id'],
+ 'quantity' => intval($itemRow['nums']),
+ 'sub_trade_order_status' => $detailStatus['order_status'],
+ 'status_update_time' => $detailStatus['status_update_time'],
+ 'tracking_number' => $trackingNumber,
+ ];
+ }
+
+ if ($details) {
+ return $details;
+ }
+
+ // 降级方案:直接使用 order_objects 构建明细(无 SKU 信息)
+ foreach ((array)$objectRows as $objectRow) {
+ $deliveryRow = [];
+ if (!empty($objectRow['oid']) && !empty($detailDeliveryMap['oid_' . $objectRow['oid']])) {
+ $deliveryRow = $detailDeliveryMap['oid_' . $objectRow['oid']];
+ } elseif (!empty($detailDeliveryMap['obj_' . $objectRow['obj_id']])) {
+ $deliveryRow = $detailDeliveryMap['obj_' . $objectRow['obj_id']];
+ }
+ $detailStatus = $this->buildUrgentDetailStatus($deliveryRow, $order);
+ $trackingNumber = $this->resolveDetailTrackingNumber($deliveryRow, $detailStatus['order_status']);
+ $details[] = [
+ 'sub_trade_order_code' => (string)$objectRow['oid'],
+ 'item_id' => (string)$objectRow['shop_goods_id'],
+ 'sku_id' => '',
+ 'quantity' => intval($objectRow['quantity']),
+ 'sub_trade_order_status' => $detailStatus['order_status'],
+ 'status_update_time' => $detailStatus['status_update_time'],
+ 'tracking_number' => $trackingNumber,
+ ];
+ }
+
+ return $details;
+ }
+
+ /**
+ * 选取订单关联的主发货单,优先取最早创建的有效发货单。
+ *
+ * @param array $deliveryRows
+ * @return array
+ */
+ protected function getPrimaryUrgentDelivery($deliveryRows)
+ {
+ $primaryDelivery = [];
+ foreach ((array)$deliveryRows as $deliveryRow) {
+ if (!$primaryDelivery) {
+ $primaryDelivery = $deliveryRow;
+ continue;
+ }
+
+ $primaryCreateTime = intval($primaryDelivery['create_time']);
+ $currentCreateTime = intval($deliveryRow['create_time']);
+ if ($currentCreateTime && (!$primaryCreateTime || $currentCreateTime < $primaryCreateTime)) {
+ $primaryDelivery = $deliveryRow;
+ }
+ }
+
+ return $primaryDelivery;
+ }
+
+ /**
+ * 按发货单和发货回写日志构建订单明细状态。
+ *
+ * 规则:
+ * - 订单取消 → CANCELLED
+ * - 无发货单 → ORDER_CREATED
+ * - 明细状态只认当前明细自身映射到的发货单,不借用同订单其它明细的发货单
+ * - 有发货单且未发货完成 → WAREHOUSE_PROCESSING
+ * - 有发货单且已发货完成时,再用 shipment_log 区分:
+ * - shipment_log 失败 → WAREHOUSE_CONSIGN_FAIL
+ * - shipment_log 成功 → SHIPPED
+ * - 无明确回写结果 → WAREHOUSE_PROCESSING
+ *
+ * @param array $delivery
+ * @param array $order
+ * @return array
+ */
+ protected function buildUrgentDetailStatus($delivery, $order)
+ {
+ $detailStatus = 'ORDER_CREATED';
+ $detailTime = $this->resolveUrgentDetailStatusUpdateTime($delivery, $order);
+
+ if ($order['status'] == 'dead' || $order['process_status'] == 'cancel' || $order['pay_status'] == '5') {
+ $detailStatus = 'CANCELLED';
+ } elseif ($delivery) {
+ if ($delivery['status'] != 'succ' && $delivery['process'] != 'true') {
+ $detailStatus = 'WAREHOUSE_PROCESSING';
+ } else {
+ $shipmentLog = $this->getLatestShipmentLog($order['order_bn'], $delivery['logi_no']);
+ if ($shipmentLog['status'] == 'fail') {
+ $detailStatus = 'WAREHOUSE_CONSIGN_FAIL';
+ $detailTime = $this->formatUrgentTimestamp($shipmentLog['updateTime']) ?: $detailTime;
+ } elseif ($shipmentLog['status'] == 'succ') {
+ $detailStatus = 'SHIPPED';
+ $detailTime = $this->formatUrgentTimestamp($shipmentLog['updateTime']) ?: $detailTime;
+ } else {
+ $detailStatus = 'WAREHOUSE_PROCESSING';
+ }
+ }
+ }
+
+ return [
+ 'order_status' => $detailStatus,
+ 'status_update_time' => $detailTime,
+ ];
+ }
+
+ /**
+ * 解析订单明细状态更新时间。
+ *
+ * 若存在发货单则取发货单创建时间,否则取订单创建时间。
+ *
+ * @param array $delivery
+ * @param array $order
+ * @return string
+ */
+ protected function resolveUrgentDetailStatusUpdateTime($delivery, $order)
+ {
+ $timestamp = $delivery['create_time'] ?: $order['createtime'];
+ return $this->formatUrgentTimestamp($timestamp);
+ }
+
+ /**
+ * 按子交易单号聚合明细,同一子单取优先级最高的状态。
+ *
+ * @param array $details
+ * @return array
+ */
+ protected function aggregateDetailsBySubTradeOrder($details)
+ {
+ $priorityMap = [
+ 'WAREHOUSE_CONSIGN_FAIL' => 5,
+ 'SHIPPED' => 4,
+ 'CANCELLED' => 3,
+ 'WAREHOUSE_PROCESSING' => 2,
+ 'ORDER_CREATED' => 1,
+ ];
+
+ $grouped = [];
+ foreach ((array)$details as $detail) {
+ $oid = (string)$detail['sub_trade_order_code'];
+ if ($oid === '') {
+ continue;
+ }
+ if (!isset($grouped[$oid])) {
+ $grouped[$oid] = $detail;
+ continue;
+ }
+
+ $currentPriority = $priorityMap[$grouped[$oid]['sub_trade_order_status']] ?? 0;
+ $newPriority = $priorityMap[$detail['sub_trade_order_status']] ?? 0;
+ if ($newPriority > $currentPriority) {
+ $grouped[$oid] = $detail;
+ }
+ }
+
+ return array_values($grouped);
+ }
+
+ /**
+ * 解析子单运单号:SHIPPED 时取映射发货单 delivery.logi_no,主推与入站响应共用。
+ *
+ * @param array $deliveryRow
+ * @param string $detailStatus
+ * @return string
+ */
+ protected function resolveDetailTrackingNumber($deliveryRow, $detailStatus)
+ {
+ if ($detailStatus !== 'SHIPPED' || empty($deliveryRow['logi_no'])) {
+ return '';
+ }
+
+ return (string)$deliveryRow['logi_no'];
+ }
+
+ /**
+ * 从已发货子单中选取主单运单号:优先最早 status_update_time,时间相同按子单号升序。
+ * 主单 tracking_number 与 order_details[].tracking_number 均来自 delivery.logi_no。
+ *
+ * @param array $subOrders
+ * @return string
+ */
+ protected function resolveMainTrackingFromShippedSubOrders($subOrders)
+ {
+ $shippedSubs = [];
+ foreach ((array)$subOrders as $subOrder) {
+ if ($subOrder['sub_trade_order_status'] !== 'SHIPPED') {
+ continue;
+ }
+ if (empty($subOrder['tracking_number'])) {
+ continue;
+ }
+ $shippedSubs[] = $subOrder;
+ }
+
+ if (!$shippedSubs) {
+ return '';
+ }
+
+ usort($shippedSubs, function ($left, $right) {
+ $timeCompare = strcmp((string)$left['status_update_time'], (string)$right['status_update_time']);
+ if ($timeCompare !== 0) {
+ return $timeCompare;
+ }
+
+ return strcmp((string)$left['sub_trade_order_code'], (string)$right['sub_trade_order_code']);
+ });
+
+ return (string)$shippedSubs[0]['tracking_number'];
+ }
+
+ /**
+ * 根据子单状态聚合主结构状态与时间。
+ *
+ * 规则:
+ * - 任一子单 WAREHOUSE_CONSIGN_FAIL → 主单异常态,不返回运单号
+ * - 否则按优先级 SHIPPED > CANCELLED > WAREHOUSE_PROCESSING > ORDER_CREATED
+ * - 主单 SHIPPED 时,运单号取已发货子单对应发货单 logi_no;多个 SHIPPED 时取最早时间,时间相同按子单号升序
+ * - 主结构 status_update_time 取命中状态对应子单时间
+ *
+ * @param array $order
+ * @param array $details
+ * @param array $delivery
+ * @return array
+ */
+ protected function buildUrgentMainStatus($order, $details, $delivery = [])
+ {
+ $defaultStatus = 'ORDER_CREATED';
+ $defaultTime = $this->resolveUrgentStatusUpdateTime($order, $delivery);
+
+ if (!$details) {
+ return [
+ 'orderStatus' => $defaultStatus,
+ 'status_update_time' => $defaultTime,
+ 'tracking_number' => '',
+ 'exception_reason' => '',
+ ];
+ }
+
+ $subOrders = $this->aggregateDetailsBySubTradeOrder($details);
+
+ $failSubOrder = null;
+ foreach ($subOrders as $subOrder) {
+ if ($subOrder['sub_trade_order_status'] !== 'WAREHOUSE_CONSIGN_FAIL') {
+ continue;
+ }
+ if (!$failSubOrder || strcmp((string)$subOrder['status_update_time'], (string)$failSubOrder['status_update_time']) < 0) {
+ $failSubOrder = $subOrder;
+ }
+ }
+ if ($failSubOrder) {
+ return [
+ 'orderStatus' => 'WAREHOUSE_CONSIGN_FAIL',
+ 'status_update_time' => $failSubOrder['status_update_time'],
+ 'tracking_number' => '',
+ 'exception_reason' => '发货状态回写平台失败',
+ ];
+ }
+
+ $priorityMap = [
+ 'SHIPPED' => 4,
+ 'CANCELLED' => 3,
+ 'WAREHOUSE_PROCESSING' => 2,
+ 'ORDER_CREATED' => 1,
+ ];
+
+ $bestDetail = [
+ 'sub_trade_order_status' => $defaultStatus,
+ 'status_update_time' => $defaultTime,
+ ];
+
+ foreach ($subOrders as $subOrder) {
+ $detailStatus = $subOrder['sub_trade_order_status'];
+ $detailPriority = $priorityMap[$detailStatus] ?? 0;
+ $bestPriority = $priorityMap[$bestDetail['sub_trade_order_status']] ?? 0;
+ if ($detailPriority > $bestPriority) {
+ $bestDetail = $subOrder;
+ }
+ }
+
+ $trackingNo = '';
+ if ($bestDetail['sub_trade_order_status'] === 'SHIPPED') {
+ $trackingNo = $this->resolveMainTrackingFromShippedSubOrders($subOrders);
+ }
+
+ return [
+ 'orderStatus' => $bestDetail['sub_trade_order_status'],
+ 'status_update_time' => $bestDetail['status_update_time'],
+ 'tracking_number' => $trackingNo,
+ 'exception_reason' => '',
+ ];
+ }
+
+ /**
+ * 读取当前订单+运单号对应的最新发货回写日志。
+ *
+ * @param string $orderBn
+ * @param string $logiNo
+ * @return array
+ */
+ protected function getLatestShipmentLog($orderBn, $logiNo)
+ {
+ if (!$orderBn || !$logiNo) {
+ return [];
+ }
+
+ $rows = app::get('ome')->model('shipment_log')->getList(
+ 'status,updateTime,deliveryCode',
+ ['orderBn' => $orderBn, 'deliveryCode' => $logiNo],
+ 0,
+ 1,
+ 'updateTime DESC, log_id DESC'
+ );
+
+ return $rows ? $rows[0] : [];
+ }
+
+ /**
+ * 统一格式化时间戳。
+ *
+ * @param mixed $timestamp
+ * @return string
+ */
+ protected function formatUrgentTimestamp($timestamp)
+ {
+ if (!$timestamp) {
+ return date('Y-m-d H:i:s');
+ }
+ if (is_numeric($timestamp)) {
+ return date('Y-m-d H:i:s', intval($timestamp));
+ }
+
+ return (string)$timestamp;
+ }
+}
diff --git a/app/ome/lib/receipt/reship.php b/app/ome/lib/receipt/reship.php
index 46bf8e67..918be2b6 100644
--- a/app/ome/lib/receipt/reship.php
+++ b/app/ome/lib/receipt/reship.php
@@ -86,14 +86,22 @@ class ome_receipt_reship
if (!empty($reship_item)) {
$product_ids = array_column($reship_item, 'product_id');
$basicMaterialObj = app::get('material')->model('basic_material');
- $basic_materials = $basicMaterialObj->getList('bm_id,type', array('bm_id' => $product_ids));
+ $basic_materials = $basicMaterialObj->getList('bm_id,type,is_ctrl_store', array('bm_id' => $product_ids));
+ $basicMaterialList = array_column($basic_materials, null, 'bm_id');
+
$basic_materials = array_column($basic_materials, 'type', 'bm_id');
$filtered_reship_item = array();
foreach ($reship_item as $item) {
$bm_id = $item['product_id'];
+
+ // 过滤掉基础物料属性为:虚拟类型 + 不管控库存(type=5 && is_ctrl_store=2)
if (isset($basic_materials[$bm_id]) && $basic_materials[$bm_id] == 5) {
- continue;
+ // 只过滤不管控库存的虚拟类型基础物料
+ if(isset($basicMaterialList[$bm_id]) && $basicMaterialList[$bm_id]['is_ctrl_store'] == 2){
+ continue;
+ }
}
+
$filtered_reship_item[] = $item;
}
$reship_item = $filtered_reship_item;
@@ -101,6 +109,7 @@ class ome_receipt_reship
if (empty($reship_item)) {
return array();
}
+
// 外部订单
$dextMdl = app::get('console')->model('delivery_extension');
$delivery_ext = $dextMdl->dump(array('delivery_bn' => $delivery['delivery_bn']), 'original_delivery_bn');
diff --git a/app/ome/lib/sales/price.php b/app/ome/lib/sales/price.php
index dd402e94..de08cb4e 100644
--- a/app/ome/lib/sales/price.php
+++ b/app/ome/lib/sales/price.php
@@ -59,12 +59,6 @@ class ome_sales_price{
return $order;
}
- /**
- * calculate
- * @param mixed $order_original_data 数据
- * @param mixed $sales_data 数据
- * @return mixed 返回值
- */
public function calculate($order_original_data,&$sales_data){
if(!$this->_check($order_original_data, $sales_data)){
@@ -121,6 +115,8 @@ class ome_sales_price{
$all_sale_price += $sale_item['price']*$sale_item['nums'];
$all_pmt_price += $sale_item['pmt_price'];
}
+
+ $all_pmt_price = sprintf('%.2f', $all_pmt_price);
$all_sale_price = sprintf('%.2f', $all_sale_price);
$old_discount = sprintf('%.2f', $sales_data['discount']);
@@ -223,13 +219,6 @@ class ome_sales_price{
$sales_data['actually_amount'] += $sales_data['service_price'];
}
- /**
- * 获取ItemProductSalePrice
- * @param mixed $saleData 数据
- * @param mixed $arrOrder arrOrder
- * @param mixed $productGoods productGoods
- * @return mixed 返回结果
- */
public function getItemProductSalePrice($saleData, $arrOrder, $productGoods) {
$itemSalePrice = array();
foreach ($saleData as $orderId => $val) {
diff --git a/app/ome/lib/service/aftersale.php b/app/ome/lib/service/aftersale.php
index 97e8042d..492c248e 100644
--- a/app/ome/lib/service/aftersale.php
+++ b/app/ome/lib/service/aftersale.php
@@ -106,7 +106,7 @@ class ome_service_aftersale{
if ($returninfo['source'] == 'matrix' && in_array($returninfo['shop_type'],array('bbc','ecos.b2c','ecos.b2b2c.stdsrc','360buy','meituan4medicine'))){
$returninfo['memo'] = $memo;
- }elseif($returninfo['source'] == 'matrix' && in_array($returninfo['shop_type'], array('luban'))){
+ }elseif($returninfo['source'] == 'matrix' && in_array($returninfo['shop_type'], array('luban','jd'))){
//使用售后申请单上的内容
$returninfo['memo'] = $memo;
}
@@ -379,7 +379,7 @@ class ome_service_aftersale{
*/
public function returngoods_confirm($return_id){
$returnModel = app::get('ome')->model('return_product');
- $returninfo = $returnModel->db_dump(array('return_id'=>$return_id,'source'=>'matrix'),'return_bn,return_id,shop_id,kinds');
+ $returninfo = $returnModel->db_dump(array('return_id'=>$return_id,'source'=>'matrix'),'return_bn,return_id,shop_id,kinds,platform_order_bn,order_id');
if($returninfo){
$rs = kernel::single('erpapi_router_request')->set('shop', $returninfo['shop_id'])->aftersale_returnGoodsSign($returninfo);
$rs = kernel::single('erpapi_router_request')->set('shop', $returninfo['shop_id'])->aftersale_returnGoodsConfirm($returninfo);
diff --git a/app/ome/model/delivery.php b/app/ome/model/delivery.php
index bbaf82ad..feb1e82d 100644
--- a/app/ome/model/delivery.php
+++ b/app/ome/model/delivery.php
@@ -2,6 +2,7 @@
class ome_mdl_delivery extends dbeav_model
{
+ const URGENT_LABEL_CODE = 'SOMS_URGENT_SHIP';
//public $filter_use_like = true;
public $has_many = array(
'delivery_items' => 'delivery_items',
@@ -38,16 +39,24 @@ class ome_mdl_delivery extends dbeav_model
parent::__construct($app);
}
+ /**
+ * 扩展发货单 Finder 过滤条件,支持加急标签相关筛选与自定义 SQL 条件。
+ *
+ * @param array $filter
+ * @param string|null $tableAlias
+ * @param array|null $baseWhere
+ * @return string
+ */
public function _filter($filter, $tableAlias = null, $baseWhere = null)
{
$tPre = ($tableAlias ? $tableAlias : '`' . $this->table_name(true) . '`') . '.';
$tmpBaseWhere = kernel::single('ome_filter_encrypt')->encrypt($filter, $this->__encrypt_cols, $tPre, 'delivery');
$baseWhere = $baseWhere ? array_merge((array)$baseWhere, (array)$tmpBaseWhere) : (array)$tmpBaseWhere;
-
+
//setting
$deliveryIds = array();
$where = '';
-
+
//filter
if (isset($filter['extend_delivery_id'])) {
//delivery_id
@@ -56,17 +65,17 @@ class ome_mdl_delivery extends dbeav_model
{
$tempDlyIds[$extend_delivery_id] = $extend_delivery_id;
}
-
+
//intersection
if(empty($deliveryIds)){
$deliveryIds = $tempDlyIds;
}else{
$deliveryIds = array_intersect($deliveryIds, $tempDlyIds);
}
-
+
unset($filter['extend_delivery_id']);
}
-
+
if (isset($filter['member_uname'])) {
$memberObj = $this->app->model("members");
$rows = $memberObj->getList('member_id', array('uname|has' => $filter['member_uname']));
@@ -94,23 +103,23 @@ class ome_mdl_delivery extends dbeav_model
$deliOrderObj = $this->app->model("delivery_order");
$rows = $deliOrderObj->getList('delivery_id', array('order_id' => $orderId));
-
+
//delivery_id
$tempDlyIds = array(0);
foreach($rows as $row)
{
$temp_dly_id = $row['delivery_id'];
-
+
$tempDlyIds[$temp_dly_id] = $temp_dly_id;
}
-
+
//intersection
if(empty($deliveryIds)){
$deliveryIds = $tempDlyIds;
}else{
$deliveryIds = array_intersect($deliveryIds, $tempDlyIds);
}
-
+
unset($filter['order_bn']);
}
@@ -118,30 +127,30 @@ class ome_mdl_delivery extends dbeav_model
if (isset($filter['material_bn'])){
if(strpos($filter['material_bn'], "\n") !== false){
$material_bns = array_unique(array_map('trim', array_filter(explode("\n", $filter['material_bn']))));
-
+
$filter['material_bn'] = $material_bns;
}
//search_delivery_items
$itemsObj = app::get('ome')->model("delivery_items");
$rows = $itemsObj->getDeliveryIdByPbn($filter);
-
+
//delivery_id
$tempDlyIds = array(0);
foreach($rows as $row)
{
$temp_dly_id = $row['delivery_id'];
-
+
$tempDlyIds[$temp_dly_id] = $temp_dly_id;
}
-
+
//intersection
if(empty($deliveryIds)){
$deliveryIds = $tempDlyIds;
}else{
$deliveryIds = array_intersect($deliveryIds, $tempDlyIds);
}
-
+
unset($filter['material_bn']);
}
@@ -156,23 +165,23 @@ class ome_mdl_delivery extends dbeav_model
//search_delivery_items
$itemsObj = $this->app->model("delivery_items");
$rows = $itemsObj->getDeliveryIdByPbarcode($filter);
-
+
//delivery_id
$tempDlyIds = array(0);
foreach($rows as $row)
{
$temp_dly_id = $row['delivery_id'];
-
+
$tempDlyIds[$temp_dly_id] = $temp_dly_id;
}
-
+
//intersection
if(empty($deliveryIds)){
$deliveryIds = $tempDlyIds;
}else{
$deliveryIds = array_intersect($deliveryIds, $tempDlyIds);
}
-
+
//unset
unset($filter['product_barcode']);
}
@@ -180,35 +189,61 @@ class ome_mdl_delivery extends dbeav_model
if (isset($filter['logi_no_ext'])) {
$logObj = $this->app->model("delivery_log");
$rows = $logObj->getDeliveryIdByLogiNO($filter['logi_no_ext']);
-
+
//delivery_id
$tempDlyIds = array(0);
foreach($rows as $row)
{
$temp_dly_id = $row['delivery_id'];
-
+
$tempDlyIds[$temp_dly_id] = $temp_dly_id;
}
-
+
//intersection
if(empty($deliveryIds)){
$deliveryIds = $tempDlyIds;
}else{
$deliveryIds = array_intersect($deliveryIds, $tempDlyIds);
}
-
+
unset($filter['logi_no_ext']);
}
-
+
if (isset($filter['addonSQL'])) {
$where .= ' AND ' . $filter['addonSQL'];
unset($filter['addonSQL']);
}
-
+ if (!empty($filter['delivery_label_code'])) {
+ $where .= ' AND EXISTS (
+ SELECT 1 FROM sdb_ome_bill_label bl
+ WHERE bl.bill_id = '.$tPre.'delivery_id
+ AND bl.bill_type = "delivery"
+ AND bl.label_code = "'.addslashes($filter['delivery_label_code']).'"
+ )';
+ unset($filter['delivery_label_code']);
+ }
+ if (isset($filter['urgent_delivery'])) {
+ if ($filter['urgent_delivery'] === 'true' || $filter['urgent_delivery'] === true || $filter['urgent_delivery'] == 1) {
+ $where .= ' AND EXISTS (
+ SELECT 1 FROM sdb_ome_bill_label bl
+ WHERE bl.bill_id = '.$tPre.'delivery_id
+ AND bl.bill_type = "delivery"
+ AND bl.label_code = "'.self::URGENT_LABEL_CODE.'"
+ )';
+ } else {
+ $where .= ' AND NOT EXISTS (
+ SELECT 1 FROM sdb_ome_bill_label bl
+ WHERE bl.bill_id = '.$tPre.'delivery_id
+ AND bl.bill_type = "delivery"
+ AND bl.label_code = "'.self::URGENT_LABEL_CODE.'"
+ )';
+ }
+ unset($filter['urgent_delivery']);
+ }
if (isset($filter['delivery_ident'])) {
//delivery_id
$tempDlyIds = array(0);
-
+
$arr_delivery_ident = explode('_', $filter['delivery_ident']);
$mdl_queue = app::get('ome')->model("print_queue");
if (count($arr_delivery_ident) == 2) {
@@ -236,37 +271,37 @@ class ome_mdl_delivery extends dbeav_model
}
}
}
-
+
//intersection
if(empty($deliveryIds)){
$deliveryIds = $tempDlyIds;
}else{
$deliveryIds = array_intersect($deliveryIds, $tempDlyIds);
}
-
+
unset($filter['delivery_ident']);
}
-
+
if (isset($filter['ship_tel_mobile'])) {
$where .= ' AND (ship_tel=\'' . $filter['ship_tel_mobile'] . '\' or ship_mobile=\'' . $filter['ship_tel_mobile'] . '\')';
unset($filter['ship_tel_mobile']);
}
-
+
if ($filter['todo'] == 1) {
$where .= " AND ({$tPre}stock_status='false' or {$tPre}expre_status='false' or {$tPre}deliv_status='false')";
unset($filter['todo']);
}
-
+
if ($filter['todo'] == 2) {
$where .= " AND ({$tPre}stock_status='false' or {$tPre}expre_status='false')";
unset($filter['todo']);
}
-
+
if ($filter['todo'] == 3) {
$where .= " AND ({$tPre}expre_status='false' or {$tPre}deliv_status='false')";
unset($filter['todo']);
}
-
+
if ($filter['todo'] == 4) {
$where .= " AND {$tPre}expre_status='false'";
unset($filter['todo']);
@@ -323,17 +358,17 @@ class ome_mdl_delivery extends dbeav_model
foreach ($_rows as $_orders)
{
$temp_dly_id = $_orders['delivery_id'];
-
+
$tempDlyIds[$temp_dly_id] = $temp_dly_id;
}
-
+
//intersection
if(empty($deliveryIds)){
$deliveryIds = $tempDlyIds;
}else{
$deliveryIds = array_intersect($deliveryIds, $tempDlyIds);
}
-
+
unset($filter['mark_text']);
}
}
@@ -348,17 +383,17 @@ class ome_mdl_delivery extends dbeav_model
foreach ($_rows as $_orders)
{
$temp_dly_id = $_orders['delivery_id'];
-
+
$tempDlyIds[$temp_dly_id] = $temp_dly_id;
}
-
+
//intersection
if(empty($deliveryIds)){
$deliveryIds = $tempDlyIds;
}else{
$deliveryIds = array_intersect($deliveryIds, $tempDlyIds);
}
-
+
unset($filter['custom_mark']);
}
}
@@ -367,7 +402,7 @@ class ome_mdl_delivery extends dbeav_model
if($deliveryIds){
$where .= " AND delivery_id IN (". implode(',', $deliveryIds) .")";
}
-
+
return parent::_filter($filter, $tableAlias, $baseWhere) . $where;
}
@@ -622,10 +657,10 @@ class ome_mdl_delivery extends dbeav_model
}else{
$ids = array($parent_id);
}
-
+
return $ids;
}
-
+
foreach ($rows as $item) {
$data[] = $item['delivery_id'];
}
@@ -864,40 +899,40 @@ class ome_mdl_delivery extends dbeav_model
if($dly['delivery_time']){
$delivery_time = $delivery_time ? min($delivery_time, $dly['delivery_time']) : $dly['delivery_time'];
}
-
+
//承诺最晚送达时间(取最早时间)
if($dly['promised_sign_time']){
$promised_sign_time = $promised_sign_time ? min($promised_sign_time, $dly['promised_sign_time']) : $dly['promised_sign_time'];
}
-
+
//计划发货时间(取最早时间)
if($dly['promised_collect_time']){
$promised_collect_time = $promised_collect_time ? min($promised_collect_time, $dly['promised_collect_time']) : $dly['promised_collect_time'];
}
-
+
//计划发货时间(取最早时间)
if($dly['promise_outbound_time']){
$promise_outbound_time = $promise_outbound_time ? min($promise_outbound_time, $dly['promise_outbound_time']) : $dly['promise_outbound_time'];
}
-
+
//计划发货时间(取最早时间)
if($dly['plan_sign_time']){
$plan_sign_time = $plan_sign_time ? min($plan_sign_time, $dly['plan_sign_time']) : $dly['plan_sign_time'];
}
-
+
//物流服务标签(取合集)
if($dly['promise_service']){
$promiseServiceList = array_merge($promiseServiceList, explode(',', $dly['promise_service']));
$promiseServiceList = array_unique($promiseServiceList);
}
-
+
//物流升级服务
if($dly['cpup_service']){
$cpup_service = array_merge($cpup_service, explode(',', $dly['cpup_service']));
$cpup_service = array_unique($cpup_service);
}
}
-
+
}
#获取发货单累计重量
@@ -968,12 +1003,12 @@ class ome_mdl_delivery extends dbeav_model
if ($r_time) {
$new_dly['ship_time'] = $r_time;
}
-
+
//未发货之前,不能赋值,否则客户导出时有异议
// if ($delivery_time){
// $new_dly['delivery_time'] = $delivery_time;
// }
-
+
if ($promised_collect_time){
$new_dly['promised_collect_time'] = $promised_collect_time;
}
@@ -985,22 +1020,22 @@ class ome_mdl_delivery extends dbeav_model
if ($order_createtime) {
$new_dly['order_createtime'] = $order_createtime;
}
-
+
//承诺最晚出库时间
if($promise_outbound_time){
$new_dly['promise_outbound_time'] = $promise_outbound_time;
}
-
+
//承诺计划送达时间
if($plan_sign_time){
$new_dly['plan_sign_time'] = $plan_sign_time;
}
-
+
//物流服务标签
if($promiseServiceList){
$new_dly['promise_service'] = implode(',', $promiseServiceList);
}
-
+
//save
if ($this->save($new_dly)) {
//创建大发货单
@@ -1327,12 +1362,12 @@ class ome_mdl_delivery extends dbeav_model
} else {
$ids[] = $dly_ids;
}
-
+
$memo_log = '';
if ($memo) {
$memo_log .= ',备注:' . $memo;
}
-
+
$data['memo'] = $memo;
$data['status'] = 'back';
$data['logi_no'] = null;
@@ -1377,7 +1412,7 @@ class ome_mdl_delivery extends dbeav_model
}
$opObj->write_log('delivery_back@ome', $item, '发货单撤销成功' . $memo_log);
-
+
// 发货单取消成功通知
$this->sendDeliveryCancelSuccessNotify($deliveryInfo, $memo);
@@ -2015,7 +2050,7 @@ class ome_mdl_delivery extends dbeav_model
}
return ($arr1['product_id'] < $arr2['product_id']) ? -1 : 1;
}
-
+
/**
* 新建发货单
*
@@ -2045,7 +2080,7 @@ class ome_mdl_delivery extends dbeav_model
$deliveryEventStartTime = microtime(true);
kernel::single('ome_event_trigger_shop_delivery')->delivery_add($data['delivery_id']);
$deliveryEventTime = microtime(true) - $deliveryEventStartTime;
-
+
// 记录发货单事件触发性能数据
ome_api_log::add_message('event', 'delivery_add', $deliveryEventTime, array(
'delivery_id' => $data['delivery_id']
@@ -2075,7 +2110,7 @@ class ome_mdl_delivery extends dbeav_model
$objIdArr = array_column($order_items, 'obj_id');
$objectsList = $orderObjMdl->getList('obj_id,goods_id', ['order_id'=>$order_id, 'obj_id'=>$objIdArr]);
$objectsList = array_column($objectsList, null, 'obj_id');
-
+
foreach ($delivery['delivery_items'] as $di => $dv) {
$sm_id = 0;
foreach ($order_items as $ov) {
@@ -2127,7 +2162,7 @@ class ome_mdl_delivery extends dbeav_model
}elseif($order['platform_order_bn']){
$data['platform_order_bn'] = $order['platform_order_bn'];
}
-
+
$logi_name = "";
if ($is_diff_order) {
//补差价订单直接生成已发货的发货单 不涉及库存
@@ -2141,11 +2176,11 @@ class ome_mdl_delivery extends dbeav_model
if ($delivery['type']) {
$data['type'] = $delivery['type'];
}
-
+
//计算预计物流费用
// 记录运费和重量计算开始时间
$freightStartTime = microtime(true);
-
+
$weight = 0;
if (isset($delivery['weight'])) {
$weight = $delivery['weight'];
@@ -2168,7 +2203,7 @@ class ome_mdl_delivery extends dbeav_model
$price = $this->getDeliveryFreight($area_id, $delivery['logi_id'], $weight);
$dly_corp = $oDly_corp->dump($delivery['logi_id']);
$logi_name = $dly_corp['name'];
-
+
// 计算保价费用
$protect = $dly_corp['protect'];
if ($protect == 'true') {
@@ -2177,10 +2212,10 @@ class ome_mdl_delivery extends dbeav_model
$cost_protect = max($protect_price, $dly_corp['minprice']);
}
}
-
+
// 计算运费和重量计算总耗时
$freightTime = microtime(true) - $freightStartTime;
-
+
// 记录运费和重量计算性能数据
ome_api_log::add_message('freight', 'freight_calculation', $freightTime, array(
'delivery_id' => $data['delivery_id'] ?? '',
@@ -2189,7 +2224,7 @@ class ome_mdl_delivery extends dbeav_model
'weight' => $weight,
'freight_price' => $price
));
-
+
//[同城配]配送方式
if($dly_corp['corp_model'] == 'instatnt'){
//同城配送
@@ -2198,7 +2233,7 @@ class ome_mdl_delivery extends dbeav_model
//商家配送
$data['delivery'] = 'seller';
}
-
+
//order has logi_info:aikucun
if ($delivery['delivery_waybillCode']) {
$data['logi_no'] = $delivery['delivery_waybillCode'];
@@ -2217,15 +2252,15 @@ class ome_mdl_delivery extends dbeav_model
$data['member_id'] = $delivery['member_id'] ? $delivery['member_id'] : $order['member_id'];
$data['shop_id'] = $order['shop_id'];
$data['shop_type'] = $order['shop_type'];
-
+
$data['delivery_items'] = $delivery['delivery_items'];
$data['consignee'] = $ship_info;
-
+
//权限相关
$data['org_id'] = $order['org_id']; //运营组织
$data['betc_id'] = $order['betc_id']; //贸易公司ID
$data['cos_id'] = $order['cos_id']; //组织架构ID
-
+
//支持四、五级地区
$temp_area = explode('/', $area_chs);
$data['consignee']['province'] = $temp_area[0];
@@ -2244,7 +2279,7 @@ class ome_mdl_delivery extends dbeav_model
if ($order['order_type'] == 'jisuxianhuo') {
$data['bool_type'] = $data['bool_type'] | ome_delivery_bool_type::__JISU_CODE;
}
-
+
if ($order['order_type'] == 'platform') {
$data['original_delivery_bn'] = $delivery_bn;
$data['bool_type'] = ($data['bool_type'] ? $data['bool_type'] : 0) | ome_delivery_bool_type::__PLATFORM_CODE;
@@ -2254,13 +2289,13 @@ class ome_mdl_delivery extends dbeav_model
$data['bool_type'] = ($data['bool_type'] ? $data['bool_type'] : 0) | ome_delivery_bool_type::__SHSM_CODE;
}
}
-
+
// format
$bns = array();
$totalNum = 0;
foreach ($data['delivery_items'] as $dlyItemKey => $v) {
$product_id = $v['product_id'];
-
+
$totalNum += $v['number'];
$bns[$v['product_id']] = $v['bn'];
}
@@ -2279,17 +2314,17 @@ class ome_mdl_delivery extends dbeav_model
if (kernel::single('ome_order_bool_type')->isCPUP($order['order_bool_type'])) {
$data['bool_type'] = $data['bool_type'] | ome_delivery_bool_type::__CPUP_CODE;
-
+
//未发货之前,不能赋值,否则客户导出时有异议
//$data['delivery_time'] = $orderExtend['latest_delivery_time'];
-
+
$data['cpup_service'] = $orderExtend['cpup_service'];
$data['promise_service'] = $orderExtend['promise_service'];
$data['promised_collect_time'] = $orderExtend['promised_collect_time'];
$data['promised_sign_time'] = $orderExtend['promised_sign_time'];
$data['cpup_addon'] = serialize($orderExtend);
}
-
+
//[翱象]相关信息
if(in_array($order['shop_type'], array('taobao', 'tmall')) && $order['order_bool_type'] && $orderExtend){
//是否翱象订单
@@ -2298,25 +2333,25 @@ class ome_mdl_delivery extends dbeav_model
if($isAoxiang){
//翱象发货单标识
$data['bool_type'] = $data['bool_type'] | ome_delivery_bool_type::__AOXIANG_CODE;
-
+
//物流升级服务
$data['cpup_service'] = $orderExtend['cpup_service'];
-
+
//最晚发货时间
//$data['delivery_time'] = $orderExtend['latest_delivery_time'];
-
+
//承诺最晚送达时间
$data['promised_sign_time'] = $orderExtend['promised_sign_time'];
-
+
//承诺最晚揽收时间
$data['promised_collect_time'] = $orderExtend['promised_collect_time'];
-
+
//承诺最晚出库时间
$data['promise_outbound_time'] = $orderExtend['latest_delivery_time'];
-
+
//承诺计划送达时间
$data['plan_sign_time'] = $orderExtend['plan_sign_time'];
-
+
//物流服务标签(多个订单合并取消合集)
$data['promise_service'] = $orderExtend['promise_service'];
}
@@ -2327,12 +2362,12 @@ class ome_mdl_delivery extends dbeav_model
//分销订单
$data['platform_order_bn'] = $order['platform_order_bn'];
}
-
+
//save
$saveStartTime = microtime(true);
$result = $this->save($data);
$saveTime = microtime(true) - $saveStartTime;
-
+
// 记录发货单保存性能数据
ome_api_log::add_message('database', 'delivery_save', $saveTime, array(
'delivery_id' => $data['delivery_id'] ?? '',
@@ -2346,10 +2381,10 @@ class ome_mdl_delivery extends dbeav_model
if ($delivery['type'] != 'reject') {
$err_msg = '';
-
+
// product_id
$productIds = array_column($delivery['delivery_items'], 'product_id');
-
+
// 获取指定不需要管控库存的基础物料
$notCtrlStoreBmList = kernel::single('material_basic_material')->getNotCtrlStoreProducts($productIds);
if($notCtrlStoreBmList){
@@ -2357,7 +2392,7 @@ class ome_mdl_delivery extends dbeav_model
foreach ($delivery['delivery_items'] as $dlyItemKey => $dlyItemVal)
{
$product_id = $dlyItemVal['product_id'];
-
+
// 是否管控库存
if(isset($notCtrlStoreBmList[$product_id]) && $notCtrlStoreBmList[$product_id]){
$delivery['delivery_items'][$dlyItemKey]['is_product_ctrl_store'] = false;
@@ -2366,7 +2401,7 @@ class ome_mdl_delivery extends dbeav_model
}
}
}
-
+
//库存管控
$storeManageLib = kernel::single('ome_store_manage');
$storeManageLib->loadBranch(array('branch_id' => $delivery['branch_id']));
@@ -2375,19 +2410,19 @@ class ome_mdl_delivery extends dbeav_model
$params['params'] = array_merge($delivery, array('order_id' => $order_id, 'shop_id' => $order['shop_id'], 'delivery_id' => $data['delivery_id'], 'order_type' => $order['order_type']));
$params['node_type'] = 'addDly';
$shop = app::get('ome')->model('shop')->db_dump(['shop_id'=>$order['shop_id']], 'delivery_mode');
-
+
// 记录库存冻结开始时间
$inventoryFreezeStartTime = microtime(true);
-
+
if($shop['delivery_mode'] == 'jingxiao') {
$processResult = true; //经销发货单不产生冻结
} else {
$processResult = $storeManageLib->processBranchStore($params, $err_msg);
}
-
+
// 计算库存冻结耗时
$inventoryFreezeTime = microtime(true) - $inventoryFreezeStartTime;
-
+
// 记录库存冻结操作
ome_api_log::add_message('inventory', 'inventory_freeze', $inventoryFreezeTime, array(
'delivery_id' => $data['delivery_id'],
@@ -2402,7 +2437,7 @@ class ome_mdl_delivery extends dbeav_model
// 记录拆单处理开始时间
$splitProcessStartTime = microtime(true);
-
+
if (!kernel::single('ome_order_object_splitnum')->addDeliverySplitNum($order_items)) {
$this->db->rollBack();
return array('rsp' => 'fail', 'msg' => '明细已经生成发货单');
@@ -2414,10 +2449,10 @@ class ome_mdl_delivery extends dbeav_model
//有优惠明细记录,实付进行重算
$order_items = $this->_regroupDeliveryItemDetailData($order_id,$order_items);
-
+
// 计算拆单处理耗时
$splitProcessTime = microtime(true) - $splitProcessStartTime;
-
+
// 记录优惠明细重算性能数据
ome_api_log::add_message('discount', 'discount_recalculation', $splitProcessTime, array(
'delivery_id' => $data['delivery_id'] ?? '',
@@ -2441,10 +2476,17 @@ class ome_mdl_delivery extends dbeav_model
//更新订单相应状态
$this->updateOrderLogi($data['delivery_id'], $data);
+ //订单标签插入到发货单上
+ if (in_array(strtolower($order['shop_type']),['vop','luban','taobao'])) {
+ kernel::single('ome_bill_label')->transferLabel('omeorders_to_omedelivery', [
+ 'order_id' => $order_id,
+ 'ome_delivery_id' => $data['delivery_id'],
+ ]);
+ }
// 记录标签处理开始时间
$labelProcessStartTime = microtime(true);
-
+
// jitx 检测订单是否有标签
if (in_array(strtolower($order['shop_type']),['vop','luban'])) {
kernel::single('ome_bill_label')->transferLabel('omeorders_to_omedelivery', [
@@ -2452,22 +2494,22 @@ class ome_mdl_delivery extends dbeav_model
'ome_delivery_id' => $data['delivery_id'],
]);
}
-
+
// 标签扩展信息(Json格式)
$bill_extend_info = '';
if($extendInfo){
$bill_extend_info = is_array($extendInfo) ? json_encode($extendInfo, JSON_UNESCAPED_UNICODE) : $extendInfo;
}
-
+
//标签写入发货单
kernel::single('ome_bill_label')->orderToDeliveryLabel($order_id, $data['delivery_id'], 'ome_delivery', $bill_extend_info);
-
+
//打上标
kernel::single('ome_bill_label_delivery')->ToDeliveryPresaleLabel($order, $data['delivery_id']);
-
+
// 计算标签处理耗时
$labelProcessTime = microtime(true) - $labelProcessStartTime;
-
+
// 记录标签处理性能数据
ome_api_log::add_message('label', 'label_process', $labelProcessTime, array(
'delivery_id' => $data['delivery_id'] ?? '',
@@ -2579,7 +2621,7 @@ class ome_mdl_delivery extends dbeav_model
// 客户实付
$actually_amount = (isset($orderItemList[$item_id]['actually_amount']) ? $orderItemList[$item_id]['actually_amount'] : 0);
-
+
//PKG捆绑商品
if($item['item_type'] == 'pkg'){
//平台支付明细
@@ -2713,7 +2755,7 @@ class ome_mdl_delivery extends dbeav_model
// 客户实付
$order_items[$key]['actually_amount'] = $actually_amount;
-
+
//SKU商品优惠
$diff_promotion_amount = $total_promotion_amount - $dly_total_promotion_amount;
$diff_promotion_amount = ($diff_promotion_amount <= 0 ? $total_promotion_amount : $diff_promotion_amount);
@@ -2883,7 +2925,11 @@ class ome_mdl_delivery extends dbeav_model
}
/**
- * 淘宝全链路 已验货
+ * 发货单验货后触发淘宝全链路消息,并补投加急发货状态回告任务。
+ *
+ * @param int $delivery_id
+ * @param array $statusArr
+ * @return void
*/
public function sendMessageProduce($delivery_id, $statusArr)
{
@@ -2897,6 +2943,16 @@ class ome_mdl_delivery extends dbeav_model
}
kernel::single('ome_event_trigger_shop_order')->order_message_produce($orderIds, $statusArr);
+ if ($orderIds) {
+ foreach (array_values(array_unique(array_map('intval', $orderIds))) as $orderId) {
+ app::get('ome')->model('misc_task')->saveMiscTask([
+ 'obj_id' => $orderId,
+ 'obj_type' => 'urgent_logistics_dly',
+ 'exec_time' => time(),
+ 'addon' => json_encode(['scene' => 'delivery_status'], JSON_UNESCAPED_UNICODE),
+ ]);
+ }
+ }
}
/**
* 发送CRM赠品日志
@@ -3409,7 +3465,16 @@ class ome_mdl_delivery extends dbeav_model
// return $data;
// }
- //从载方法 以解决 发货中未录入快递单号不能过滤的bug
+ /**
+ * 重载带物流单号的列表查询,并在启用时让加急发货单优先排序。
+ *
+ * @param string $cols
+ * @param array $filter
+ * @param int $offset
+ * @param int $limit
+ * @param string|array|null $orderType
+ * @return array
+ */
public function getlist_logi_no($cols = '*', $filter = array(), $offset = 0, $limit = -1, $orderType = null)
{
if (!$cols) {
@@ -3421,7 +3486,7 @@ class ome_mdl_delivery extends dbeav_model
if ($this->use_meta) {
$meta_info = $this->prepare_select($cols);
}
- $orderType = $orderType ? $orderType : $this->defaultOrder;
+ $orderType = $orderType ? $orderType : $this->getUrgentPriorityOrder($this->defaultOrder, $filter);
if ($filter['logi_no'] == 'NULL') {
unset($filter['logi_no']);
@@ -3609,7 +3674,11 @@ class ome_mdl_delivery extends dbeav_model
}
/**
- * 重载 save 方法,发现有打印状态的更新及 logi_no 的更新,就回传至对应订单
+ * 重载 save 方法:同步订单物流信息,并把订单加急标签继承到发货单。
+ *
+ * @param array $data
+ * @param bool|null $mustUpdate
+ * @return bool
*/
public function save(&$data, $mustUpdate = null)
{
@@ -3619,11 +3688,93 @@ class ome_mdl_delivery extends dbeav_model
if ($data['delivery_id'] > 0) {
$this->updateOrderLogi($data['delivery_id'], $data);
+ $this->inheritUrgentLabelFromOrders($data['delivery_id']);
}
return $result;
}
+ /**
+ * 在加急优先配置开启时,构造发货单列表的加急优先排序 SQL。
+ *
+ * @param string|array $orderType
+ * @param array $filter
+ * @return string|array
+ */
+ protected function getUrgentPriorityOrder($orderType, $filter = [])
+ {
+ if (!$this->isUrgentPriorityEnabledByFilter($filter)) {
+ return $orderType;
+ }
+ $orderSql = is_array($orderType) ? implode( ' ', $orderType) : $orderType;
+ $prefix = "CASE WHEN EXISTS (
+ SELECT 1 FROM sdb_ome_bill_label bl
+ WHERE bl.bill_id = ".$this->table_name(true).".delivery_id
+ AND bl.bill_type = 'delivery'
+ AND bl.label_code = '".self::URGENT_LABEL_CODE."'
+ ) THEN 0 ELSE 1 END ASC";
+ return $prefix . ($orderSql ? ',' . $orderSql : '');
+ }
+
+ /**
+ * 判断当前查询上下文是否开启加急单优先排序。
+ *
+ * @param array $filter
+ * @return bool
+ */
+ protected function isUrgentPriorityEnabledByFilter($filter = [])
+ {
+ $shopId = null;
+ $branchId = null;
+ if (!empty($filter['shop_id']) && !is_array($filter['shop_id'])) {
+ $shopId = $filter['shop_id'];
+ }
+ if (!empty($filter['branch_id']) && !is_array($filter['branch_id'])) {
+ $branchId = $filter['branch_id'];
+ } elseif (!empty($filter['ext_branch_id']) && is_array($filter['ext_branch_id']) && count($filter['ext_branch_id']) == 1) {
+ $branchId = current($filter['ext_branch_id']);
+ }
+
+ $shopConf = $shopId ? app::get('ome')->getConf('ome.urgent_delivery.prioritize_wave.shop.' . $shopId) : null;
+ if ($shopConf !== null && $shopConf !== '') {
+ return $shopConf !== 'off';
+ }
+ $branchConf = $branchId ? app::get('ome')->getConf('ome.urgent_delivery.prioritize_wave.branch.' . $branchId) : null;
+ if ($branchConf !== null && $branchConf !== '') {
+ return $branchConf !== 'off';
+ }
+ $globalConf = app::get('ome')->getConf('ome.urgent_delivery.prioritize_wave');
+ return $globalConf === null || $globalConf === '' || $globalConf === 'on';
+ }
+
+ /**
+ * 在发货单保存后,把关联订单上的加急标签补写到发货单标签表。
+ *
+ * @param int $deliveryId
+ * @return bool
+ */
+ public function inheritUrgentLabelFromOrders($deliveryId)
+ {
+ if (!$deliveryId) {
+ return false;
+ }
+ $labelLib = kernel::single('ome_bill_label');
+ if ($labelLib->existLabel($deliveryId, self::URGENT_LABEL_CODE, 'delivery')) {
+ return true;
+ }
+ $orderRows = app::get('ome')->model('delivery_order')->getList('order_id', ['delivery_id' => $deliveryId]);
+ if (!$orderRows) {
+ return false;
+ }
+ foreach ($orderRows as $row) {
+ if ($labelLib->existLabel($row['order_id'], self::URGENT_LABEL_CODE)) {
+ $err = '';
+ return $labelLib->markBillLabel($deliveryId, '', self::URGENT_LABEL_CODE, 'delivery', $err);
+ }
+ }
+ return false;
+ }
+
/**
* 更新发货单对应的订单发货物流信息
*
@@ -4451,6 +4602,7 @@ class ome_mdl_delivery extends dbeav_model
public function extra_cols()
{
return array(
+ 'column_delivery_label' => array('label' => '发货单标记', 'width' => '220', 'func_suffix' => 'delivery_label'),
'column_custom_mark' => array('label' => '买家留言', 'width' => '180', 'func_suffix' => 'custom_mark'),
'column_mark_text' => array('label' => '客服备注', 'width' => '180', 'func_suffix' => 'mark_text'),
'column_tax_no' => array('label' => '发票号', 'width' => '180', 'func_suffix' => 'tax_no'),
@@ -4490,6 +4642,31 @@ class ome_mdl_delivery extends dbeav_model
return kernel::single('ome_extracolumn_delivery_ident')->process($rows);
}
+ /**
+ * 渲染发货单列表的标签列,包含加急发货标签展示。
+ *
+ * @param array $rows
+ * @return array
+ */
+ public function extra_delivery_label($rows)
+ {
+ $deliveryIds = array_column((array)$rows, 'delivery_id');
+ if (!$deliveryIds) {
+ return array();
+ }
+ $labelRows = app::get('ome')->model('bill_label')->getBIllLabelList($deliveryIds, 'delivery');
+ $result = array();
+ foreach ((array)$labelRows as $label) {
+ $result[$label['bill_id']] .= sprintf(
+ "
%s",
+ $label['label_name'],
+ $label['label_color'],
+ $label['label_name']
+ );
+ }
+ return $result;
+ }
+
public function getDlyId($logi_nos = false)
{
$all_logi_no = array();
@@ -4586,7 +4763,7 @@ class ome_mdl_delivery extends dbeav_model
return $delivery_nums['nums'];
}
-
+
/**
* 获取订单下所有发货单
* @param $order_id
diff --git a/app/ome/model/delivery/order.php b/app/ome/model/delivery/order.php
index c8c486ef..7faf4296 100644
--- a/app/ome/model/delivery/order.php
+++ b/app/ome/model/delivery/order.php
@@ -17,6 +17,15 @@
class ome_mdl_delivery_order extends dbeav_model{
+ public function save(&$data, $mustUpdate = null)
+ {
+ $result = parent::save($data, $mustUpdate);
+ if ($result && !empty($data['delivery_id'])) {
+ app::get('ome')->model('delivery')->inheritUrgentLabelFromOrders($data['delivery_id']);
+ }
+ return $result;
+ }
+
function insertParentOrderByItems($parent_id, $items){
if (!is_array($items)) return false;
@@ -70,4 +79,4 @@ class ome_mdl_delivery_order extends dbeav_model{
return $this->db->select($sql);
}
}
-?>
\ No newline at end of file
+?>
diff --git a/app/ome/model/misc/task.php b/app/ome/model/misc/task.php
index bd5d7e03..29e7a0f2 100644
--- a/app/ome/model/misc/task.php
+++ b/app/ome/model/misc/task.php
@@ -53,6 +53,21 @@ class ome_mdl_misc_task extends dbeav_model
'class' => 'ome_order_refund',
'method' => 'reundCancelOrder',
),
+ 'urgent_logistics_notify' => array(
+ 'text' => '淘宝加急发货状态回告',
+ 'class' => 'ome_event_trigger_shop_order',
+ 'method' => 'urgent_logistics_report',
+ ),
+ 'urgent_logistics_dly' => array(
+ 'text' => '淘宝加急发货状态回告',
+ 'class' => 'ome_event_trigger_shop_order',
+ 'method' => 'urgent_logistics_report',
+ ),
+ 'urgent_logistics_csg' => array(
+ 'text' => '淘宝加急发货状态回告',
+ 'class' => 'ome_event_trigger_shop_order',
+ 'method' => 'urgent_logistics_report',
+ ),
);
/**
diff --git a/app/ome/model/order/items.php b/app/ome/model/order/items.php
index 2118a859..9b608506 100644
--- a/app/ome/model/order/items.php
+++ b/app/ome/model/order/items.php
@@ -627,6 +627,37 @@ class ome_mdl_order_items extends dbeav_model
$new_order_item[$i] = array_merge($new_order_item[$i], $order_item[$i]);
}
+
+ // 微信视频号发货回写依赖平台商品ID和SKU ID。批量替换商品时保留旧平台明细字段,
+ // 避免新商品的 shop_goods_id/shop_product_id 变为 0 导致回写失败。
+ if ($order['shop_type'] == 'wxshipin' && $obj_type != 'gift') {
+ $old_order_items = array_values((array)$objectInfo['order_items']);
+ $can_inherit_platform_fields = $objectInfo['shop_goods_id'] && $objectInfo['shop_goods_id'] != '0' && count($old_order_items) == count($new_order_item);
+
+ // 先完整校验旧明细平台字段和数量结构,避免只继承一部分 item。
+ if ($can_inherit_platform_fields) {
+ foreach ($new_order_item as $i => $new_item) {
+ $old_item = $old_order_items[$i];
+ if (!$old_item['shop_goods_id'] || $old_item['shop_goods_id'] == '0'
+ || !$old_item['shop_product_id'] || $old_item['shop_product_id'] == '0') {
+ $can_inherit_platform_fields = false;
+ break;
+ }
+ }
+ }
+
+ // 所有 item 都校验通过后,再统一继承 object 和 item 的平台字段。
+ if ($can_inherit_platform_fields) {
+ $new_order_object['shop_goods_id'] = $objectInfo['shop_goods_id'];
+ // 旧/新 item 数量一致时,按明细生成顺序继承平台商品ID和SKU ID。
+ foreach ($new_order_item as $i => &$new_item) {
+ $old_item = $old_order_items[$i];
+ $new_item['shop_goods_id'] = $old_item['shop_goods_id'];
+ $new_item['shop_product_id'] = $old_item['shop_product_id'];
+ }
+ unset($new_item);
+ }
+ }
//删除被替换的订单明细
$delete_order_items = array();
@@ -768,6 +799,10 @@ class ome_mdl_order_items extends dbeav_model
//修改明细打标
$boolExtendStatus = ome_order_bool_extendstatus::__GOODS_PRICE;
app::get('ome')->model('order_extend')->updateBoolExtendStatus($order_id, $boolExtendStatus);
+
+ // 批量编辑物料替换打标
+ $labelErr = '';
+ kernel::single('ome_bill_label')->markBillLabel($order_id, '', 'SOMS_MATERIAL_REPLACE', 'order', $labelErr, 0);
return true;
}
diff --git a/app/ome/model/order/retrial.php b/app/ome/model/order/retrial.php
index b2af0242..8e6777d0 100644
--- a/app/ome/model/order/retrial.php
+++ b/app/ome/model/order/retrial.php
@@ -170,10 +170,15 @@ class ome_mdl_order_retrial extends dbeav_model
{
$where = ' WHERE '.$where;
}
-
- $sql = "SELECT count(*) as num FROM ". DB_PREFIX ."ome_order_retrial as a
+
+ $needJoin = (strpos($where, 'b.') !== false);
+ if ($needJoin) {
+ $sql = "SELECT count(*) as num FROM ". DB_PREFIX ."ome_order_retrial as a
LEFT JOIN ". DB_PREFIX ."ome_orders as b ON a.order_id=b.order_id
". $where;
+ } else {
+ $sql = "SELECT count(*) as num FROM ". DB_PREFIX ."ome_order_retrial as a ". $where;
+ }
$row = $this->db->select($sql);
return $row[0]['num'];
diff --git a/app/ome/model/orders.php b/app/ome/model/orders.php
index 1d6fbdc9..609789aa 100644
--- a/app/ome/model/orders.php
+++ b/app/ome/model/orders.php
@@ -81,9 +81,9 @@ class ome_mdl_orders extends dbeav_model{
/**
* 须加密字段
- *
+ *
* @var string
- * */
+ **/
private $__encrypt_cols = array(
'ship_name' => 'simple',
'ship_tel' => 'phone',
@@ -487,6 +487,16 @@ class ome_mdl_orders extends dbeav_model{
$where .= ' AND order_id IN ('. $sql .')';
}
+ if (!empty($filter['order_label_code'])) {
+ $where .= ' AND EXISTS (
+ SELECT 1 FROM sdb_ome_bill_label bl
+ WHERE bl.bill_id = sdb_ome_orders.order_id
+ AND bl.label_code = "'.addslashes($filter['order_label_code']).'"
+ AND bl.bill_type = "order"
+ )';
+ unset($filter['order_label_code']);
+ }
+
// 最晚发货时间
if($filter['latest_delivery_time']){
@@ -548,12 +558,12 @@ class ome_mdl_orders extends dbeav_model{
}
/**
- * 快速查询订单主表信息
- * @access public
- * @param mixed $filter 过滤条件,也可以直接是订单主键ID,如:$order_id
- * @param String $cols 字段名
- * @return Array 订单信息
- */
+ * 快速查询订单主表信息
+ * @access public
+ * @param mixed $filter 过滤条件,也可以直接是订单主键ID,如:$order_id
+ * @param String $cols 字段名
+ * @return Array 订单信息
+ */
function getRow($filter,$cols='*'){
if (empty($filter)) return array();
@@ -579,11 +589,11 @@ class ome_mdl_orders extends dbeav_model{
}
/**
- * 获取订单商品明细
- * @access public
- * @param Number $order_id 订单ID
- * @return Array 订单商品明细
- */
+ * 获取订单商品明细
+ * @access public
+ * @param Number $order_id 订单ID
+ * @return Array 订单商品明细
+ */
function order_objects($order_id){
if (empty($order_id)) return array();
@@ -640,13 +650,6 @@ class ome_mdl_orders extends dbeav_model{
}
}
- /**
- * modifier_shop_id
- * @param mixed $shop_id ID
- * @param mixed $list list
- * @param mixed $row row
- * @return mixed 返回值
- */
public function modifier_shop_id($shop_id,$list,$row){
static $shopList;
@@ -661,13 +664,6 @@ class ome_mdl_orders extends dbeav_model{
return $shopList[$shop_id];
}
- /**
- * modifier_org_id
- * @param mixed $org_id ID
- * @param mixed $list list
- * @param mixed $row row
- * @return mixed 返回值
- */
public function modifier_org_id($org_id,$list,$row){
static $orgList;
@@ -1518,7 +1514,7 @@ class ome_mdl_orders extends dbeav_model{
/**
* 确认组
- *
+ *
* @param Integer $row 组ID
* @return void
*/
@@ -1541,7 +1537,7 @@ class ome_mdl_orders extends dbeav_model{
/**
* 获取用户名
- *
+ *
* @param Integer $gid
* @return String;
*/
@@ -1566,7 +1562,7 @@ class ome_mdl_orders extends dbeav_model{
/**
* 获取组名
- *
+ *
* @param Integer $gid
* @return String;
*/
@@ -1592,7 +1588,7 @@ class ome_mdl_orders extends dbeav_model{
/**
* 确认人
- *
+ *
* @param Integer $row 确认人ID
* @return void
*/
@@ -1769,9 +1765,9 @@ class ome_mdl_orders extends dbeav_model{
/**
* 获得总数量
- *
+ *
* @param string $where
- *
+ *
* @return array()
*/
function get_all($where){
@@ -1805,9 +1801,9 @@ class ome_mdl_orders extends dbeav_model{
/**
* 获得确认组订单数量
- *
+ *
* @param string $where
- *
+ *
* @return array
*/
function get_group($where){
@@ -1847,10 +1843,10 @@ class ome_mdl_orders extends dbeav_model{
/**
* 获得已分派但未确认时间超过设定时间的订单数量
- *
+ *
* @param string $where
* @param string $type
- *
+ *
* @return number
*/
function get_operator($where){
@@ -1954,10 +1950,10 @@ class ome_mdl_orders extends dbeav_model{
/**
* 更新订单状态
- *
+ *
* @param bigint $order_id
* @param string $status
- *
+ *
* @return boolean
*/
function set_status($order_id, $status){
@@ -2595,7 +2591,6 @@ class ome_mdl_orders extends dbeav_model{
/*
* 快速查找订单信息
*/
-
public function getOrders($name=null)
{
$sql = " SELECT order_id,order_bn FROM `sdb_ome_orders`
@@ -2663,8 +2658,8 @@ class ome_mdl_orders extends dbeav_model{
return false;
}
- //brush特殊订单、补发订单,不需要后续功能
- if(in_array($sdf['shop_type'], array('brsh', 'bufa'))){
+ // brush特殊订单、补发订单,不需要后续功能
+ if(in_array($sdf['order_type'], array('brsh', 'bufa'))){
return true;
}
@@ -2754,15 +2749,15 @@ class ome_mdl_orders extends dbeav_model{
}
/**
- * 取消订单
- * @access public
- * @param Number $order_id 订单ID
- * @param String $memo 取消备注
- * @param Bool $is_request 是否询问请求
- * @param string $mode 请求类型:sync同步 async异步
- * @param Bool $must_log 订单收订叫回失败记录日志
- * @return Array
- */
+ * 取消订单
+ * @access public
+ * @param Number $order_id 订单ID
+ * @param String $memo 取消备注
+ * @param Bool $is_request 是否询问请求
+ * @param string $mode 请求类型:sync同步 async异步
+ * @param Bool $must_log 订单收订叫回失败记录日志
+ * @return Array
+ */
function cancel($order_id,$memo,$is_request=true,$mode='sync', $must_log = false){
$operLogMdl = $this->app->model('operation_log');
@@ -3038,11 +3033,11 @@ class ome_mdl_orders extends dbeav_model{
/**
* 统计导出数据
- *
+ *
* @param Array $filter 过滤条件
* @return void
* @author
- * */
+ **/
public function fcount_csv($filter)
{
$count = $this->count($filter);
@@ -3292,7 +3287,7 @@ class ome_mdl_orders extends dbeav_model{
/**
* [第三步]最终,导入数据保存
- *
+ *
* @return void
*/
function finish_import_csv(){
@@ -3605,7 +3600,7 @@ class ome_mdl_orders extends dbeav_model{
/**
* [第一步]整理导入的数据
- *
+ *
* @param $row
* @param $title
* @param $tmpl
@@ -3770,7 +3765,7 @@ class ome_mdl_orders extends dbeav_model{
/**
* [第二步]检查导入的订单商品明细
- *
+ *
* @param $data
* @param $mark
* @param $tmpl
@@ -4051,12 +4046,7 @@ class ome_mdl_orders extends dbeav_model{
//不能进行订单编辑的状态判断
- /**
- * not_allow_edit
- * @param mixed $order_id ID
- * @return mixed 返回值
- */
- public function not_allow_edit($order_id){
+ public function not_allow_edit($order_id){
$order = $this->dump($order_id);
//已取消的订单不允许编辑
if($order['process_status'] == 'cancel'){
@@ -4133,11 +4123,11 @@ class ome_mdl_orders extends dbeav_model{
}
- /**
- * 统计订单商品重量
- * @param order_id
- * @return void
- */
+ /**
+ * 统计订单商品重量
+ * @param order_id
+ * @return void
+ */
function getOrderWeight($order_id,$type='',$additional=''){
$orderObj = $this->app->model('orders');
$basicMaterialExtObj = app::get('material')->model('basic_material_ext');
@@ -4198,9 +4188,9 @@ class ome_mdl_orders extends dbeav_model{
}
/**
- * 异常订单过滤条件
- *
- */
+ * 异常订单过滤条件
+ *
+ */
function _abnormalFilter($filter,$tableAlias=null,$baseWhere=null){
$table_name = $this->table_name(true);
@@ -4794,13 +4784,6 @@ class ome_mdl_orders extends dbeav_model{
return trim(str_replace(array("\t","\r","\n"),array("","",""),$str));
}
- /**
- * modifier_ship_name
- * @param mixed $ship_name ship_name
- * @param mixed $list list
- * @param mixed $row row
- * @return mixed 返回值
- */
public function modifier_ship_name($ship_name,$list,$row)
{
if ($this->is_export_data) {
@@ -4829,13 +4812,6 @@ HTML;
return $ship_name?$return:$ship_name;
}
- /**
- * modifier_ship_tel
- * @param mixed $tel tel
- * @param mixed $list list
- * @param mixed $row row
- * @return mixed 返回值
- */
public function modifier_ship_tel($tel,$list,$row)
{
if ($this->is_export_data) {
@@ -4863,13 +4839,6 @@ HTML;
return $tel?$return:$tel;
}
- /**
- * modifier_ship_mobile
- * @param mixed $mobile mobile
- * @param mixed $list list
- * @param mixed $row row
- * @return mixed 返回值
- */
public function modifier_ship_mobile($mobile,$list,$row)
{
if ($this->is_export_data) {
@@ -4898,13 +4867,6 @@ HTML;
return $mobile?$return:$mobile;
}
- /**
- * modifier_ship_addr
- * @param mixed $ship_addr ship_addr
- * @param mixed $list list
- * @param mixed $row row
- * @return mixed 返回值
- */
public function modifier_ship_addr($ship_addr,$list,$row)
{
if ($this->is_export_data) {
@@ -4935,7 +4897,7 @@ HTML;
/**
* 增加旺旺联系方式
- *
+ *
* @param integre $row 用户ID
* @return String
*/
@@ -5007,11 +4969,6 @@ HTML;
return $order_list[$row['order_id']]['uname'];
}
- /**
- * insert
- * @param mixed $data 数据
- * @return mixed 返回值
- */
public function insert(&$data)
{
foreach ($this->__encrypt_cols as $field => $type) {
@@ -5075,11 +5032,6 @@ HTML;
}
}
- /**
- * 获取Area
- * @param mixed $where where
- * @return mixed 返回结果
- */
public function getArea($where) {
$sql = 'SELECT order_id from sdb_ome_orders WHERE '.$where;
return array_column($this->db->select($sql),'order_id');
@@ -5221,11 +5173,6 @@ HTML;
return $data;
}
- /**
- * 获取CustomExportTitle
- * @param mixed $main_title main_title
- * @return mixed 返回结果
- */
public function getCustomExportTitle($main_title)
{
$main_title = array_keys($main_title);
@@ -5234,10 +5181,6 @@ HTML;
return mb_convert_encoding(implode(',', $title), 'GBK', 'UTF-8'); }
- /**
- * orderItemsExportTitle
- * @return mixed 返回值
- */
public function orderItemsExportTitle()
{
$items_title = array(
diff --git a/app/ome/view/admin/order/fail/batchsave.html b/app/ome/view/admin/order/fail/batchsave.html
index cad49714..a4d843b7 100644
--- a/app/ome/view/admin/order/fail/batchsave.html
+++ b/app/ome/view/admin/order/fail/batchsave.html
@@ -1,3 +1,6 @@
-
\ No newline at end of file
+
+<{if $batch_exclude_notice}>
+
<{$batch_exclude_notice}>
+<{/if}>
\ No newline at end of file
diff --git a/app/ome/view/admin/order/order_edit.html b/app/ome/view/admin/order/order_edit.html
index f5e4514d..c93778cc 100644
--- a/app/ome/view/admin/order/order_edit.html
+++ b/app/ome/view/admin/order/order_edit.html
@@ -1,18 +1,3 @@
-
<{capture name="header"}>
<{css app="ome" src="ome.css"}>
<{script src="coms/autocompleter.js" app='desktop' }>
@@ -299,6 +284,7 @@ validatorMap.set('telephone', ['<{t}>固定电话不正确<{/t}>', function(elem
return v == null || v == '' || /^(\(0\d{2,3}\)|0\d{2,3}-)?[2-9]\d{5,7}(\(\d{2,5}\)|-\d{2,5})?$/.test(v);
}]);
+var orderEditAmountInited = false;
total();
function total(){
@@ -325,6 +311,7 @@ function total(){
}
ome_edit_total_amount(total,sale_amount);
+ orderEditAmountInited = true;
}
function ome_edit_total_amount(total,sale_amount)
@@ -451,19 +438,16 @@ function ome_edit_total_amount(total,sale_amount)
}
});
- // 如果有oid限制,仅同步订单优惠金额
- if (hasOidLimit) {
+ // 用户编辑后同步订单优惠金额;初次加载保持数据库原值,避免产生虚假差额
+ if (hasOidLimit && orderEditAmountInited) {
pmt_order = totalPartMjzDiscount.toFixed(2);
- // 更新输入框的值
$('pmt_order').set('value', pmt_order);
}
-
- //计算当前总金额(订单总金额 = sale_amount实际销售总金额 + cost_tax税金 + cost_protect保价费用 + cost_payment支付手续费 + service_price服务订单费用 - )
+
+ // 计算订单总金额,结果保留2位小数(与数据库一致)
total_amount = parseFloat(sale_amount) + parseFloat(cost_tax) + parseFloat(cost_protect) + parseFloat(cost_payment) + service_price;
-
- //total_amount + pmt_order订单优惠金额 + discount订单折扣 + cost_freight配送费用 - total_pmt_goods商品优惠金额
total_amount = total_amount - parseFloat(pmt_order) + parseFloat(discount) + parseFloat(cost_freight);
- total_amount = total_amount.toFixed(3);
+ total_amount = (Math.round(total_amount * 100) / 100).toFixed(2);
$('cost_amount_show').set('text', '¥'+parseFloat(cost_item).toFixed(3));
$('total_amount_show').set('text', '¥'+total_amount);
diff --git a/app/ome/view/admin/order/order_edit_split.html b/app/ome/view/admin/order/order_edit_split.html
index 5b28df52..38695d4f 100644
--- a/app/ome/view/admin/order/order_edit_split.html
+++ b/app/ome/view/admin/order/order_edit_split.html
@@ -1,19 +1,3 @@
-
-
<{capture name="header"}>
<{css app="ome" src="ome.css"}>
<{script src="coms/autocompleter.js" app='desktop' }>
@@ -308,6 +292,7 @@ validatorMap.set('telephone', ['<{t}>固定电话不正确<{/t}>', function(elem
return v == null || v == '' || /^(\(0\d{2,3}\)|0\d{2,3}-)?[2-9]\d{5,7}(\(\d{2,5}\)|-\d{2,5})?$/.test(v);
}]);
+var orderEditAmountInited = false;
total();
function total(){
@@ -334,6 +319,7 @@ function total(){
}
ome_edit_total_amount(total,sale_amount);
+ orderEditAmountInited = true;
}
@@ -461,19 +447,16 @@ function ome_edit_total_amount(total,sale_amount)
}
});
- // 如果有oid限制,仅同步订单优惠金额
- if (hasOidLimit) {
+ // 用户编辑后同步订单优惠金额;初次加载保持数据库原值,避免产生虚假差额
+ if (hasOidLimit && orderEditAmountInited) {
pmt_order = totalPartMjzDiscount.toFixed(2);
- // 更新输入框的值
$('pmt_order').set('value', pmt_order);
}
- //计算当前总金额(订单总金额 = sale_amount实际销售总金额 + cost_tax税金 + cost_protect保价费用 + cost_payment支付手续费 + service_price服务订单费用)
+ // 计算订单总金额,结果保留2位小数(与数据库一致)
total_amount = parseFloat(sale_amount) + parseFloat(cost_tax) + parseFloat(cost_protect) + parseFloat(cost_payment) + service_price;
-
- //total_amount + pmt_order订单优惠金额 + discount订单折扣 + cost_freight配送费用 - total_pmt_goods商品优惠金额
total_amount = total_amount - parseFloat(pmt_order) + parseFloat(discount) + parseFloat(cost_freight);
- total_amount = total_amount.toFixed(3);
+ total_amount = (Math.round(total_amount * 100) / 100).toFixed(2);
$('cost_amount_show').set('text', '¥'+parseFloat(cost_item).toFixed(3));
$('total_amount_show').set('text', '¥'+total_amount);
diff --git a/app/ome/view/admin/return_product/rchange/do_cancel.html b/app/ome/view/admin/return_product/rchange/do_cancel.html
index 3b2b122b..998ea4d2 100644
--- a/app/ome/view/admin/return_product/rchange/do_cancel.html
+++ b/app/ome/view/admin/return_product/rchange/do_cancel.html
@@ -1,19 +1,3 @@
-
-
@@ -26,7 +10,7 @@
<{if $reship.shop_type == 'taobao' || $reship.shop_type == 'tmall' || $reship.shop_type == 'luban'}>
- | * 上传凭证: |
+ 上传凭证: |
<{input type="sfile" name="refuse_proof" f_type="public" }>
|
diff --git a/app/omeauto/lib/auto/group/item.php b/app/omeauto/lib/auto/group/item.php
index 7574e04c..0c24b2bf 100644
--- a/app/omeauto/lib/auto/group/item.php
+++ b/app/omeauto/lib/auto/group/item.php
@@ -1,19 +1,4 @@
db->exec("UPDATE sdb_ome_delivery SET logi_no='" . $waybillCode . "' WHERE delivery_id=" . $newdly_id);
}
+ ome_delivery_notice::create($newdly_id);
} else {
//发货单通知单推送仓库
foreach ($ids as $newdly_id) {
@@ -1104,7 +1090,7 @@ class omeauto_auto_group_item
));
}
$wmsStart = microtime(true);
- ome_delivery_notice::create($newdly_id);
+
$wmsTime = microtime(true) - $wmsStart;
// 记录WMS通知性能数据
@@ -1114,6 +1100,7 @@ class omeauto_auto_group_item
if ($waybillCode) {
$deliveryObj->db->exec("UPDATE sdb_ome_delivery SET logi_no='" . $waybillCode . "' WHERE delivery_id=" . $newdly_id);
}
+ ome_delivery_notice::create($newdly_id);
}
}
// todo maxiaochen 得物品牌直发 请求接单接口,如果检测到有取消的发货单,则先调用发货仓修改接口
diff --git a/app/omevirtualwms/controller/admin/wms.php b/app/omevirtualwms/controller/admin/wms.php
index 54d7596d..e59fc79e 100644
--- a/app/omevirtualwms/controller/admin/wms.php
+++ b/app/omevirtualwms/controller/admin/wms.php
@@ -1,19 +1,4 @@
append_missing_items($aftersale_items, array(
+ 'reshipitemData' => $reshipitemData,
+ 'branch_id' => $branch_id,
+ 'iostockInfos' => $iostockInfos,
+ ));
+ }
+ }
+ }
+
unset($reshipitemData);
//获取退货关联的订单明细
@@ -468,12 +462,6 @@ class sales_aftersale_type_change
return $data;
}
- /**
- * 获取OrderObj
- * @param mixed $order_id ID
- * @param mixed $is_archive is_archive
- * @return mixed 返回结果
- */
public function getOrderObj($order_id,$is_archive){
if ($is_archive) {
@@ -495,11 +483,6 @@ class sales_aftersale_type_change
return $objs;
}
- /**
- * 获取SaleAmount
- * @param mixed $order_id ID
- * @return mixed 返回结果
- */
public function getSaleAmount($order_id){
$db = kernel::database();
$items = $db->select("SELECT sales_material_bn,bn,sales_amount,nums FROM sdb_ome_sales_items AS I LEFT JOIN sdb_ome_sales as S ON I.sale_id=S.sale_id WHERE S.order_id=".$order_id." AND I.product_id>0");
diff --git a/app/siso/lib/receipt/sales/abstract.php b/app/siso/lib/receipt/sales/abstract.php
index 94571f9d..7db12efa 100644
--- a/app/siso/lib/receipt/sales/abstract.php
+++ b/app/siso/lib/receipt/sales/abstract.php
@@ -14,7 +14,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
class siso_receipt_sales_abstract
{
/**
@@ -55,6 +54,18 @@ class siso_receipt_sales_abstract
continue; //部分拆分OR部分发货时,跳过生成销售单
}
}
+
+ // 事务内二次检查,防止并发重复生成销售单
+ $order_id = intval($sale['order_id']);
+ $salesObj->db->select(
+ "SELECT order_id FROM sdb_ome_orders WHERE order_id={$order_id} FOR UPDATE"
+ );
+ $exists = $salesObj->db->select(
+ "SELECT sale_id FROM sdb_ome_sales WHERE order_id={$order_id}"
+ );
+ if ($exists) {
+ continue;
+ }
if(!$this->check_required($sale,$msg)){
//事务回滚
@@ -497,4 +508,4 @@ class siso_receipt_sales_abstract
*/
}
-}
\ No newline at end of file
+}
diff --git a/app/wms/model/delivery.php b/app/wms/model/delivery.php
index d9e75b2d..7f8c3be1 100644
--- a/app/wms/model/delivery.php
+++ b/app/wms/model/delivery.php
@@ -15,6 +15,7 @@
* limitations under the License.
*/
class wms_mdl_delivery extends dbeav_model{
+ const URGENT_LABEL_CODE = 'SOMS_URGENT_SHIP';
public $filter_use_like = true;
var $has_many = array(
'delivery_items' => 'delivery_items',
@@ -53,6 +54,7 @@ class wms_mdl_delivery extends dbeav_model{
public function _filter($filter,$tableAlias=null,$baseWhere=null){
$baseWhere = (array) $baseWhere;
$tPre = ($tableAlias?$tableAlias:'`'.$this->table_name(true).'`').'.';
+ $where = '';
///////////////////////////
// 加密处理逻辑 2017/5/5 by cp //
///////////////////////////
@@ -200,6 +202,33 @@ class wms_mdl_delivery extends dbeav_model{
$where .= ' AND '.$filter['addonSQL'];
unset($filter['addonSQL']);
}
+ if (!empty($filter['delivery_label_code'])) {
+ $where .= ' AND EXISTS (
+ SELECT 1 FROM sdb_ome_bill_label bl
+ WHERE bl.bill_id = '.$tPre.'delivery_id
+ AND bl.bill_type = "delivery"
+ AND bl.label_code = "'.addslashes($filter['delivery_label_code']).'"
+ )';
+ unset($filter['delivery_label_code']);
+ }
+ if (isset($filter['urgent_delivery'])) {
+ if ($filter['urgent_delivery'] === 'true' || $filter['urgent_delivery'] === true || $filter['urgent_delivery'] == 1) {
+ $where .= ' AND EXISTS (
+ SELECT 1 FROM sdb_ome_bill_label bl
+ WHERE bl.bill_id = '.$tPre.'delivery_id
+ AND bl.bill_type = "delivery"
+ AND bl.label_code = "'.self::URGENT_LABEL_CODE.'"
+ )';
+ } else {
+ $where .= ' AND NOT EXISTS (
+ SELECT 1 FROM sdb_ome_bill_label bl
+ WHERE bl.bill_id = '.$tPre.'delivery_id
+ AND bl.bill_type = "delivery"
+ AND bl.label_code = "'.self::URGENT_LABEL_CODE.'"
+ )';
+ }
+ unset($filter['urgent_delivery']);
+ }
if (isset($filter['shop_id_in'])) {
$where .= ' AND ' . $tPre . 'shop_id in("'.implode('","', $filter['shop_id_in']).'")';
unset($filter['shop_id_in']);
@@ -1433,6 +1462,7 @@ class wms_mdl_delivery extends dbeav_model{
*/
function extra_cols(){
return array(
+ 'column_delivery_label' => array('label'=>'发货单标记','width'=>'220','func_suffix'=>'delivery_label'),
'column_custom_mark' => array('label'=>'买家留言','width'=>'180','func_suffix'=>'custom_mark'),
'column_mark_text' => array('label'=>'客服备注','width'=>'180','func_suffix'=>'mark_text'),
'column_tax_no' => array('label'=>'发票号','width'=>'180','func_suffix'=>'tax_no'),
@@ -1468,6 +1498,24 @@ class wms_mdl_delivery extends dbeav_model{
return kernel::single('wms_extracolumn_delivery_ident')->process($rows);
}
+ function extra_delivery_label($rows){
+ $deliveryIds = array_column((array)$rows, 'delivery_id');
+ if (!$deliveryIds) {
+ return array();
+ }
+ $labelRows = app::get('ome')->model('bill_label')->getBIllLabelList($deliveryIds, 'delivery');
+ $result = array();
+ foreach ((array)$labelRows as $label) {
+ $result[$label['bill_id']] .= sprintf(
+ "%s",
+ $label['label_name'],
+ $label['label_color'],
+ $label['label_name']
+ );
+ }
+ return $result;
+ }
+
//定义导出明细内容的相关字段
public function get_exp_detail_schema(){
$schema = array (
diff --git a/assets/static/logo-5ckfAmJf.png b/assets/static/logo-5ckfAmJf.png
index aca2cd35..b572a180 100644
Binary files a/assets/static/logo-5ckfAmJf.png and b/assets/static/logo-5ckfAmJf.png differ
diff --git a/config/deploy.xml b/config/deploy.xml
index 6315318d..888d2ed0 100644
--- a/config/deploy.xml
+++ b/config/deploy.xml
@@ -1,5 +1,5 @@
- 8.3.4.20260508
+ 8.4.0.20260707
ONEX OMS
taog