121 lines
6.5 KiB
SQL
121 lines
6.5 KiB
SQL
-- 订单购物车商品来源快照。
|
|
-- 父购物车保存统一来源类型,商品行保存进入对应详情页所需的真实业务 ID。
|
|
-- 历史数据仅回填能够唯一确定来源和详情 ID 的记录,缺失或歧义数据保持 NULL,禁止猜测商品表。
|
|
|
|
ALTER TABLE `pjcloudx_hardware`.`hard_parent_car`
|
|
ADD COLUMN `product_source` varchar(32) DEFAULT NULL
|
|
COMMENT '商品来源类型:CANTEEN_DAILY_MENU每日菜谱、CANTEEN_ONLINE_SPU食堂在线商品、CANTEEN_SPU食堂基础菜品、MALL_PRODUCT共富商城商品' AFTER `hard_type`;
|
|
|
|
ALTER TABLE `pjcloudx_hardware`.`hard_car`
|
|
ADD COLUMN `source_product_id` bigint(20) DEFAULT NULL
|
|
COMMENT '商品来源详情ID:每日菜谱为canteen_daily_menu.id,食堂在线/基础菜品同product_id,共富商城为商品SPU ID' AFTER `product_id`;
|
|
|
|
-- 每日菜谱使用服务端写入的 cartScene 识别,包含尚未下单的有效草稿。
|
|
UPDATE `pjcloudx_hardware`.`hard_parent_car`
|
|
SET `product_source` = 'CANTEEN_DAILY_MENU'
|
|
WHERE `product_source` IS NULL
|
|
AND JSON_VALID(`take_out_setting_json`) = 1
|
|
AND BINARY JSON_UNQUOTE(JSON_EXTRACT(`take_out_setting_json`, '$.cartScene')) = BINARY 'DAILY_MENU';
|
|
|
|
-- SELF_APP 当前购物车创建分支固定对应共富商城,包含尚未下单的有效草稿。
|
|
UPDATE `pjcloudx_hardware`.`hard_parent_car`
|
|
SET `product_source` = 'MALL_PRODUCT'
|
|
WHERE `product_source` IS NULL
|
|
AND `hard_type` = '8';
|
|
|
|
-- 已下单的食堂购物车按订单类型补齐来源;外卖与线上预约都使用 canteen_online_spu。
|
|
UPDATE `pjcloudx_hardware`.`hard_parent_car` parent_car
|
|
JOIN (
|
|
SELECT DISTINCT `parent_car_id`
|
|
FROM `pjcloudx_hardware`.`hard_order`
|
|
WHERE COALESCE(`del_flag`, '0') = '0'
|
|
AND `sys_type` = '2'
|
|
AND `order_type` IN ('2', '10')
|
|
AND `parent_car_id` IS NOT NULL
|
|
) online_order ON online_order.`parent_car_id` = parent_car.`id`
|
|
SET parent_car.`product_source` = 'CANTEEN_ONLINE_SPU'
|
|
WHERE parent_car.`product_source` IS NULL;
|
|
|
|
UPDATE `pjcloudx_hardware`.`hard_parent_car` parent_car
|
|
JOIN (
|
|
SELECT DISTINCT `parent_car_id`
|
|
FROM `pjcloudx_hardware`.`hard_order`
|
|
WHERE COALESCE(`del_flag`, '0') = '0'
|
|
AND `sys_type` = '2'
|
|
AND `order_type` = '1'
|
|
AND `parent_car_id` IS NOT NULL
|
|
) canteen_order ON canteen_order.`parent_car_id` = parent_car.`id`
|
|
SET parent_car.`product_source` = 'CANTEEN_SPU'
|
|
WHERE parent_car.`product_source` IS NULL;
|
|
|
|
-- 旧 App 普通食堂草稿接口固定按线上预约商品创建;每日菜谱草稿已在前面的 cartScene 分支排除。
|
|
UPDATE `pjcloudx_hardware`.`hard_parent_car`
|
|
SET `product_source` = 'CANTEEN_ONLINE_SPU'
|
|
WHERE `product_source` IS NULL
|
|
AND `hard_type` = '2'
|
|
AND `order_status` = '1';
|
|
|
|
-- 食堂在线商品和基础菜品的详情 ID 与购物车 product_id 相同,可直接安全回填。
|
|
UPDATE `pjcloudx_hardware`.`hard_car` car
|
|
JOIN `pjcloudx_hardware`.`hard_parent_car` parent_car ON parent_car.`id` = car.`parent_car_id`
|
|
SET car.`source_product_id` = car.`product_id`
|
|
WHERE car.`source_product_id` IS NULL
|
|
AND parent_car.`product_source` IN ('CANTEEN_ONLINE_SPU', 'CANTEEN_SPU');
|
|
|
|
-- 共富商城购物车 product_id 为 SKU ID;只回填仍能唯一关联到有效 SKU 的商品 SPU ID。
|
|
UPDATE `pjcloudx_hardware`.`hard_car` car
|
|
JOIN `pjcloudx_hardware`.`hard_parent_car` parent_car ON parent_car.`id` = car.`parent_car_id`
|
|
JOIN `pjcloudx_supermarket`.`mall_product_sku` sku
|
|
ON sku.`id` = car.`product_id`
|
|
AND COALESCE(sku.`del_flag`, '0') = '0'
|
|
AND (sku.`tenant_id` = car.`tenant_id` OR sku.`tenant_id` IS NULL OR car.`tenant_id` IS NULL)
|
|
SET car.`source_product_id` = sku.`product_id`
|
|
WHERE car.`source_product_id` IS NULL
|
|
AND parent_car.`product_source` = 'MALL_PRODUCT';
|
|
|
|
-- 执行每日菜谱回填前先输出无法唯一匹配的历史商品,结果需保留 NULL 供人工核对。
|
|
SELECT car.`id` AS `car_id`,
|
|
car.`parent_car_id`,
|
|
car.`product_id`,
|
|
COUNT(DISTINCT daily_menu.`id`) AS `matched_daily_menu_count`
|
|
FROM `pjcloudx_hardware`.`hard_car` car
|
|
JOIN `pjcloudx_hardware`.`hard_parent_car` parent_car ON parent_car.`id` = car.`parent_car_id`
|
|
JOIN `pjcloudx_hardware`.`hard_order` hard_order
|
|
ON hard_order.`parent_car_id` = parent_car.`id`
|
|
AND COALESCE(hard_order.`del_flag`, '0') = '0'
|
|
LEFT JOIN `pjcloudx_canteen`.`canteen_daily_menu` daily_menu
|
|
ON daily_menu.`spu_id` = car.`product_id`
|
|
AND daily_menu.`merchant_id` = hard_order.`merchant_id`
|
|
AND daily_menu.`start_time` = hard_order.`appt_use_date`
|
|
AND daily_menu.`hour_type` = CAST(hard_order.`hour_type` AS SIGNED)
|
|
AND COALESCE(daily_menu.`del_flag`, '0') = '0'
|
|
AND (daily_menu.`tenant_id` = hard_order.`tenant_id` OR daily_menu.`tenant_id` IS NULL OR hard_order.`tenant_id` IS NULL)
|
|
WHERE parent_car.`product_source` = 'CANTEEN_DAILY_MENU'
|
|
AND car.`source_product_id` IS NULL
|
|
GROUP BY car.`id`, car.`parent_car_id`, car.`product_id`
|
|
HAVING COUNT(DISTINCT daily_menu.`id`) <> 1;
|
|
|
|
-- 每日菜谱只回填商户、用餐日期、餐段、SPU 和租户共同确定的唯一菜谱记录。
|
|
UPDATE `pjcloudx_hardware`.`hard_car` car
|
|
JOIN (
|
|
SELECT source_car.`id` AS `car_id`, MIN(daily_menu.`id`) AS `daily_menu_id`
|
|
FROM `pjcloudx_hardware`.`hard_car` source_car
|
|
JOIN `pjcloudx_hardware`.`hard_parent_car` parent_car ON parent_car.`id` = source_car.`parent_car_id`
|
|
JOIN `pjcloudx_hardware`.`hard_order` hard_order
|
|
ON hard_order.`parent_car_id` = parent_car.`id`
|
|
AND COALESCE(hard_order.`del_flag`, '0') = '0'
|
|
JOIN `pjcloudx_canteen`.`canteen_daily_menu` daily_menu
|
|
ON daily_menu.`spu_id` = source_car.`product_id`
|
|
AND daily_menu.`merchant_id` = hard_order.`merchant_id`
|
|
AND daily_menu.`start_time` = hard_order.`appt_use_date`
|
|
AND daily_menu.`hour_type` = CAST(hard_order.`hour_type` AS SIGNED)
|
|
AND COALESCE(daily_menu.`del_flag`, '0') = '0'
|
|
AND (daily_menu.`tenant_id` = hard_order.`tenant_id` OR daily_menu.`tenant_id` IS NULL OR hard_order.`tenant_id` IS NULL)
|
|
WHERE parent_car.`product_source` = 'CANTEEN_DAILY_MENU'
|
|
AND source_car.`source_product_id` IS NULL
|
|
GROUP BY source_car.`id`
|
|
HAVING COUNT(DISTINCT daily_menu.`id`) = 1
|
|
) matched_daily_menu ON matched_daily_menu.`car_id` = car.`id`
|
|
SET car.`source_product_id` = matched_daily_menu.`daily_menu_id`
|
|
WHERE car.`source_product_id` IS NULL;
|