站长信息
jeffery.xu
jeffery.xu

软件工程师

欢迎访问我的个人笔记网站!我是一名热爱技术的开发者,专注于Web开发和技术分享。

811495111@qq.com
18521510875
筛选

个人笔记

Gore修改内容
工作笔记
1 植入报告导出
Implant Report Export
上次CR的一个需求变更:病历号导出的excel表格里面显示完整还是显示****1234按照当前用户系统界面上展示的结果来
A requirement change from last CR: The excel table for exporting the medical record number shows complete or ****1234 according to the results displayed on the current user system interface
2 GSP报表
GSP Reports
QA提出把所有GSP报表字段描述里的“有效期”改成“失效日期”。GSP报表包括:验收管理、入库记录、贮存管理、检查管理、销售管理、出库管理、复核管理、售后退回管理、报损管理。同时E-Order下的经销商发货报表的有效期也同步改成失效日期
QA proposed to change "expiry date" to "expiration date" in all GSP report field descriptions. GSP reports include: Acceptance management, inbound records, storage management, inspection management, sales management, outbound management, review management, post-sale return management, and loss reporting management. At the same time, the validity period of the dealer shipping report under E-Order is also changed to expiration date
3 供货企业资质预警功能
Supplier qualification warning function
1.增加供货企业资质预警:当供货企业资质证书的自然有效期至跟当前时间比分别是30天和1天的时候,会发送邮件提醒RA和 QA;
2. 生产企业资质预警暂不关闭
1 Add supply enterprise qualification warning: When the natural validity period of the supply enterprise qualification certificate is 30 days and 1 day respectively from the current time, an email will be sent to alert RA and QA;
2 The production enterprise qualification warning will not be turned off for the time being
4 暂存订单折扣金额锁定
The discount amount of the temporarily stored orders is locked
1.新增暂存订单折扣金额锁定表,暂存采购单时记录有补偿金额抵扣的订单信息。删除暂存订单时,解锁之前锁定的补偿金额。
2.已有锁定补偿金额的暂存订单,不允许新增、修改、删除订购的产品信息。只能整单做删除。
3.在新增订单或编辑无锁定补偿金额的暂存订单时,系统在计算当前订单的补偿金额需要先去除
1中其它订单锁定的补偿金额
4.包括总部采购订单录入和经销商采购订单录入功能同步修改
1. Add a table for locking discount amounts for temporary orders, which records the information of orders with compensation amount deductions when temporarily storing purchase orders. When deleting a temporary order, unlock the previously locked compensation amount.
2 For a temporary order with a locked compensation amount, it is not allowed to add, modify, or delete the ordered product information. Only the entire order can be deleted.
3. When adding a new order or editing a temporary order without a locked compensation amount, the system needs to remove the compensation amount locked in other orders in 1 before calculating the compensation amount for the current order
4. Including the simultaneous modification of headquarters purchase order entry and dealer purchase order entry functions
5 总部用户邮件提醒的链接调整
Link adjustment for email alerts from headquarters users
因戈尔内部员工登录方式从pingone换成了Entra,登录方式有所不一样,所以需要把总部用户系统接受到的通知所有邮件里面的链接换成https://myapplications.microsoft.com
For gore staff login mode changed from pingone Entra, login way is different, so need to accept headquarters user system to inform all the inside of the email link for https://myapplications.microsoft.com
6 发送订单给仓库
Send the order to the warehouse
1. 创建一个邮件组:HTDK Order,用于发送订单信息给仓库(维护方式与现在一样,该功能不需要开发,只需要在现在的【邮件组管理】菜单去维护即可)
2. 我们在订单审批界面增加一个勾选框,勾选框的内容是【发邮件给仓库】,默认是不勾选的。Melody在审批订单的时候根据实际情况勾选该勾选框   
3. 基于第2点增加判断,如该笔订单的【发邮件给仓库】勾选了且CS点击了审批通过,在审批通过完成后同步推送邮件给HTDK。如【发邮件给仓库】勾选了但是操作的是审批拒绝或者返回,则不发送邮件。
4. 订单审批界面增加【CS填写给仓库的备注】字段,
不管是否勾选了【发邮件给仓库】均为非必填,Melody在审批订单时根据实际情况填写该内容
5.考虑到以上功能是三个业务线共用且目前只for B277的订单,所以【发邮件给仓库】的勾选框和【CS填写给仓库的备注】均为非必填项,CS审批的时候根据实际情况操作
1 Create a mail group: HTDK Order for sending order information to the warehouse (the maintenance method is the same as it is now. This feature does not need to be developed and can be maintained in the current [Mail Group Management] menu)
2. We add a checkbox to the order approval interface, with the content of the checkbox being [Email to the Warehouse], which is unchecked by default. Melody will check the box when approving orders based on the actual situation
3 Add a judgment based on point 2, such as the [Email to Warehouse] option for this order is checked and CS clicks approval, then send an email to HTDK simultaneously after approval is completed. If [Email to Warehouse] is checked but the operation is a rejection or return of approval, no email will be sent.
4 Add a [CS Note to warehouse] field to the order approval interface, which is not required regardless of whether [Email to Warehouse] is checked or not, Melody fills in this content based on the actual situation when approving the order
5. Considering that the above functions are shared by the three business lines and currently only for B277 orders, the checkbox for "Email to Warehouse" and the "CS Notes to Warehouse" are both non-required fields, and CS will operate according to the actual situation during the approval process
7 人工返利附件下载
Download of the manual rebate attachment
经销商下载人工返利附件报错
Dealers have reported an error when downloading the manual rebate attachment
8 补偿类型选项框查询功能
Compensation type option box query function
完善一下补偿申请录入界面(总部+经销商)和人工返利的补偿类型选项框的查询功能(即在选项界面的上方增加补偿代码、补偿名称的查询条件)
Refine the query functionality of the compensation type option box for compensation claims (headquarters + dealer) and manual rebates (i.e. add a query area above the option interface)
9 经销商系统 经销商系统所有查询功能如有可以用【经销商名称】查询的,把【经销商名称】查询提交去掉
10 退货报表打印功能 退货报表打印功能把打印报表的仓库地址和联系人删掉,包括B185跟B277的

 

减肥计划
生活经验

作息(雷打不动)

 
  • 6:20 起床 → 喝一杯温水
  • 6:50 送老婆地铁站
  • 7:20 回小区快走 10 分钟
  • 7:38 公交
  • 9:00–18:00 上班(多喝水、少久坐)
  • 19:10–19:20 到家
  • 19:20–19:40 吃晚餐
  • 19:40–20:20 运动(40 分钟)
  • 23:00 睡觉
 

 

运动(前 2 周就照这个来)

 
  • 周一:快走 4 分钟 + 慢跑 2 分钟 ×7 组(40 分钟)
  • 周二:快走 30 分钟
  • 周三:同周一
  • 周四:休息 / 拉伸
  • 周五:同周一
  • 周六:同周一
  • 周日:休息
 
强度:能说话、不喘、不疼就是最适合你的。
 

 

吃(直接照买照吃)

 

早餐(二选一)

 
  • 鸡蛋 2 个 + 纯牛奶 / 无糖豆浆
  • 无糖燕麦 + 鸡蛋 2 个
 

午餐

 
  • 主食:半碗饭
  • 蛋白:瘦肉 / 鱼 / 鸡胸 / 牛肉 / 豆腐
  • 蔬菜:两大份
 

晚餐(不吃主食

 
  • 蔬菜 + 鸡蛋 / 豆腐 / 瘦肉 / 鱼
  • 不喝汤、不喝粥、不吃甜
 

绝对不碰

 
酒、海鲜、内脏、火锅浓汤、奶茶饮料、油炸夜宵
 

 

你只要记住 3 句话

 
  1. 晚上 19:40 出门运动
  2. 晚餐 不吃主食
  3. 每天 喝够 2.5~3L 水
医院销售代表更新
工作笔记

今天更新医院销售代表

经销商授权申请审批流程优化需求
工作笔记

经销商授权申请审批流程优化需求,见如下详细说明。

2.1 经销商申请授权单时,下拉框选择的客户区域由现在的东南西北四项,在增加一个CL区域选项。

2.2 CE审批时,客户区域下拉框选择项也增加一个CL区域。允许CE做客户区域的内容修改。默认根据经销商提交订单的区域进行内容显示。审批条件修改,单据中的经销商所属类型+客户区域与CE审批人员负责的经销商类型+授权区域相同,才展示带CE审批的数据允许CE审批。

2.3 CMD审批调整,客户区域下拉框选择项也增加一个CL区域,默认根据经销商提交订单的区域进行内容显示。不允许修改。审批条件修改,单据中的经销商所属类型+客户区域与CMD审批人员负责的经销商类型+授权区域相同,才展示对应待审批数据允许CMD人员审批。

2.4 RMD审批调整,客户区域下拉框选择项也增加一个CL区域,默认根据经销商提交订单的区域进行内容显示。不允许修改。审批条件修改,单据中的经销商所属类型+客户区域与RMD审批人员负责的经销商类型+授权区域相同,才展示对应待审批数据允许RMD人员审批。

2.5 总裁办审批调整,客户区域下拉框选择项也增加一个CL区域,默认根据经销商提交订单的区域进行内容显示。不允许修改。审批条件修改,单据中的经销商所属类型+客户区域与总裁办审批人员负责的经销商类型+授权区域相同,才展示对应待审批数据允许总裁办人员审批。

PS

审批流的那个审批状态  CE待审批、CERutrn 等把CXE换成ComEx

把总裁办审批更改成全国渠道审批

经销商基准价功能修改
工作笔记

一:DMS根据BPCS推送的价格数据做经销商基准价的增补,
  1)根据BPCS推送的经销商+产品+价格数据,如果经销商在基准价功能存在,产品在基准价功能不存在的,需要把此价格数据新增到经销商基准价功能(时间都是当前年份的1月1号到12月31号)。
  2)第一步新增好数据后,把新增数据的经销商+产品+价格数据拿出来,在循环增加数据,从2024年开始截止到当前时间的上一年,每年一条记录。
二:货号升级功能调整
  1)系统需要选择新货号、老货号、年份(年份从2024年开始,到当前年),同时要根据老货号,老货号有的年份才有年份,数据选择完成点击数据同步按钮,系统判断,如果新货号+年份在经销商基准价功能无数据,系统自动按照老货号+年份查询出所有记录复制一份给到新货号。
  2)如果选择的新货号+年份在经销商基准价中已存在数据,系统则按照老货号+经销商+年份更新新货号的价格。
三:功能List列表显示、查询、导出功能增加【创建时间】、【年份】字段、年份取值如下:a. 手工上传:取上传字段。b. BPCS 推送:取生效日的“年份”
四:手工上传数据逻辑调整。保证相同经销商,相同货号,相同年份只有一条记录。如果本次上传的数据经销商+产品+年份在当前功能已存在相同数据,系统直接做价格更新。

DDI功能修改等
工作笔记

1.APOC DMS系统的那个DDI匹配后数据报告功能,需要调整一下。在关联产品匹配表的时候,需要用产品代码、名称、规格、单位、经销商相等做条件

首页需要添加版本号
工作笔记

ADD 改成2.1

APOC 新加 1.0

根据日期撤销TFS签出
工作笔记

param(
    [datetime] $TargetDate = ([datetime]"2025-09-15"),
    [switch] $DoIt = $false,
    [string] $TfExePath = "tf",
    [string] $Root = ".",
    [string[]] $ExcludeExtensions = @(".csproj")  # 可传入多个,例如: -ExcludeExtensions ".csproj",".vbproj"
)

$target = $TargetDate.Date
Write-Host "Root: $Root"
Write-Host "TargetDate: $target"
Write-Host "Dry-run: $(-not $DoIt)"
Write-Host "TfExePath: $TfExePath"
Write-Host "Exclude extensions: $($ExcludeExtensions -join ', ')"
Write-Host ""

try {
    $items = Get-ChildItem -Path $Root -Recurse -File -ErrorAction Stop
} catch {
    Write-Error "Scan failed: $_"
    exit 1
}

# 过滤:按 LastWriteTime 且排除指定扩展(不区分大小写)
$excludeSet = $ExcludeExtensions | ForEach-Object { $_.ToLowerInvariant() }
$matched = $items |
    Where-Object {
        ($_.LastWriteTime.Date -eq $target) -and
        (-not ($excludeSet -contains ($_.Extension.ToLowerInvariant())))
    } |
    Select-Object -ExpandProperty FullName

if (-not $matched -or $matched.Count -eq 0) {
    Write-Host "No files found with LastWriteTime = $target (after excluding extensions)." -ForegroundColor Yellow
    exit 0
}

Write-Host "Found $($matched.Count) files. Sample:" -ForegroundColor Green
$matched | Select-Object -First 20 | ForEach-Object { Write-Host $_ }

if (-not $DoIt) {
    Write-Host ""
    Write-Host "Dry-run mode. To execute undo, re-run with -DoIt." -ForegroundColor Yellow
    Write-Host "Example (dry-run):"
    Write-Host "  powershell -ExecutionPolicy Bypass -File .\scripts\undo-by-lastwritetime.ps1 -TargetDate 2025-09-15 -Root .."
    Write-Host "Example (execute):"
    Write-Host "  powershell -ExecutionPolicy Bypass -File .\scripts\undo-by-lastwritetime.ps1 -TargetDate 2025-09-15 -Root .. -DoIt"
    Write-Host "如果要排除更多扩展: -ExcludeExtensions \".csproj\",\".vbproj\""
    exit 0
}

# 验证 tf.exe 可用
try {
    Get-Command $TfExePath -ErrorAction Stop | Out-Null
} catch {
    Write-Error "tf.exe not found. Run in Developer Command Prompt for VS or provide -TfExePath."
    exit 1
}

$counts = @{Undone = 0; NoPending = 0; Failed = 0}

foreach ($f in $matched) {
    Write-Host "Undoing: $f" -NoNewline
    try {
        $out = & $TfExePath undo "$f" /noprompt 2>&1
        if ($LASTEXITCODE -eq 0 -and ($out -match "Undo" -or $out -match "undo successful" -or $out -match "Undoed")) {
            Write-Host " -> Undone" -ForegroundColor Green
            $counts.Undone++
        } elseif ($out -match "No pending changes" -or $out -match "no pending changes" -or $out -match "No changes found") {
            Write-Host " -> No pending changes" -ForegroundColor Yellow
            $counts.NoPending++
        } else {
            Write-Host " -> Result: $out" -ForegroundColor Cyan
            $counts.Failed++
        }
    } catch {
        Write-Host " -> Failed: $_" -ForegroundColor Red
        $counts.Failed++
    }
}

Write-Host ""
Write-Host ("Summary: Undone: {0}`nNoPending: {1}`nFailed: {2}" -f $counts.Undone, $counts.NoPending, $counts.Failed)

SOI客户经销商关联提示调整
工作笔记

需调整经销商报错提示

平台商核算单价导入导入sql
工作笔记

USE [SOI_ADD]
GO
/****** Object:  StoredProcedure [dbo].[SP_BI_WSDealerPriceImport]    Script Date: 2025/12/18 11:14:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[SP_BI_WSDealerPriceImport]
(
    @userid int,
    @TempTable NVARCHAR(100)
)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @rows INT, @temp NVARCHAR(4000), @rows1 INT;
    DECLARE @t TABLE (x INT PRIMARY KEY, y NVARCHAR(1000) COLLATE Chinese_PRC_CI_AS);
    DECLARE @totalnum INT;
    DECLARE @count INT;

    CREATE TABLE #DataTemp
    (
        [PKID] int IDENTITY(1,1) NOT NULL,
        [省份] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL,
        [产品编码] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL,
        [产品名称] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL,
        [单价]  nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL,
        [生效日期]  nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL,
        [截止日期] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL,
        [FK_Province] int,
        [FK_Product] int
    );

    DECLARE @sql nvarchar(4000);
    SET @sql = 'insert #DataTemp select ltrim(rtrim([省份])),ltrim(rtrim([产品编码])),ltrim(rtrim([产品名称])),[单价],[生效日期],[截止日期],0,0 from ' + @TempTable;
    EXEC(@sql);

    SET @temp = '';

    -- 基本校验
    SELECT @rows = COUNT(*) FROM #DataTemp;
    IF (@rows = 0)
    BEGIN
        INSERT INTO @t VALUES (1, N'临时表中没有数据,请确认Excel文档格式正确!');
        SELECT x,y FROM @t;
        RETURN;
    END

    SELECT @rows = COUNT(*) FROM #DataTemp WHERE [省份] IS NULL OR [省份] = '';
    IF (@rows > 0)
    BEGIN
        INSERT INTO @t VALUES (1, N'省份不能为空');
        SELECT x,y FROM @t;
        RETURN;
    END

    SELECT @rows = COUNT(*) FROM #DataTemp WHERE [产品编码] IS NULL OR [产品编码] = '';
    IF (@rows > 0)
    BEGIN
        INSERT INTO @t VALUES (1, N'产品编码不能为空');
        SELECT x,y FROM @t;
        RETURN;
    END

    SELECT @rows = COUNT(*) FROM #DataTemp WHERE [单价] IS NULL OR [单价] = '';
    IF (@rows > 0)
    BEGIN
        INSERT INTO @t VALUES (1, N'单价不能为空');
        SELECT x,y FROM @t;
        RETURN;
    END

    SELECT @rows = COUNT(*) FROM #DataTemp WHERE [生效日期] IS NULL OR [生效日期] = '';
    IF (@rows > 0)
    BEGIN
        INSERT INTO @t VALUES (1, N'生效日期不能为空');
        SELECT x,y FROM @t;
        RETURN;
    END

    SELECT @rows = COUNT(*) FROM #DataTemp WHERE [截止日期] IS NULL OR [截止日期] = '';
    IF (@rows > 0)
    BEGIN
        INSERT INTO @t VALUES (1, N'截止日期不能为空');
        SELECT x,y FROM @t;
        RETURN;
    END

    -- 产品映射
    UPDATE #DataTemp SET FK_Product = (
        SELECT TOP 1 PKID FROM UT_Product WHERE JDECode = #DataTemp.[产品编码] AND IsValid = 1 AND FK_Origin = 3
    );

    DECLARE @problemProductNum INT;
    SELECT @problemProductNum = COUNT(*) FROM #DataTemp WHERE FK_Product IS NULL OR FK_Product = 0;
    IF (@problemProductNum > 0)
    BEGIN
        INSERT INTO @t VALUES (1, N'产品在系统中不存在');
        SELECT x,y FROM @t;
        RETURN;
    END

    -- 单价 numeric 校验(保留原有 ISNUMERIC 校验)
    DECLARE @problemPriceNum INT;
    SELECT @problemPriceNum = COUNT(*) FROM #DataTemp WHERE ISNUMERIC([单价]) = 0;
    IF (@problemPriceNum > 0)
    BEGIN
        INSERT INTO @t VALUES (1, N'单价必须为数字');
        SELECT x,y FROM @t;
        RETURN;
    END

    -- 日期格式校验 (使用 IsDate)
    DECLARE @problemStartNum INT;
    SELECT @problemStartNum = COUNT(*) FROM #DataTemp WHERE IsDate([生效日期]) = 0;
    IF (@problemStartNum > 0)
    BEGIN
        INSERT INTO @t VALUES (1, N'生效日期不正确');
        SELECT x,y FROM @t;
        RETURN;
    END

    DECLARE @problemEndNum INT;
    SELECT @problemEndNum = COUNT(*) FROM #DataTemp WHERE IsDate([截止日期]) = 0;
    IF (@problemEndNum > 0)
    BEGIN
        INSERT INTO @t VALUES (1, N'截止日期不正确');
        SELECT x,y FROM @t;
        RETURN;
    END

    DECLARE @problemEffectNum INT;
    SELECT @problemEffectNum = COUNT(*) FROM #DataTemp WHERE CAST([截止日期] AS date) <= CAST([生效日期] AS date);
    IF (@problemEffectNum > 0)
    BEGIN
        INSERT INTO @t VALUES (1, N'生效日期必须小于截止日期');
        SELECT x,y FROM @t;
        RETURN;
    END

    -- 省份映射
    UPDATE #DataTemp SET FK_Province = (
        SELECT TOP(1) PKID FROM SOI_SmallRegion WHERE SmallRegionName = #DataTemp.[省份] AND IsValid = 1
    );

    -- 返回具体省份名
DECLARE @problemDealerNum INT;
SELECT @problemDealerNum = COUNT(*) FROM #DataTemp WHERE (FK_Province IS NULL OR FK_Province = 0);

IF (@problemDealerNum > 0)
BEGIN
    DECLARE @badProvinces NVARCHAR(MAX);

    SELECT @badProvinces = STUFF(
        (
            SELECT DISTINCT ',' + ISNULL([省份], N'(空)')
            FROM #DataTemp
            WHERE FK_Province IS NULL OR FK_Province = 0
            FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)')
    ,1,1,'');

    INSERT INTO @t VALUES (1, N'以下省份在系统中不存在:' + @badProvinces);
    SELECT x,y FROM @t;
    RETURN;
END

    -- 关键校验:若存在任意一条导入记录,其时间区间完全包含了系统中某条历史记录,则拒绝整个导入
    IF EXISTS (
        SELECT 1
        FROM #DataTemp dt
        JOIN BI_WSDealerPrice b ON b.IsValid = 1 AND b.[ProvinceName] = dt.省份 AND b.FK_Product = dt.FK_Product
        WHERE b.StartTime >= CAST(dt.[生效日期] AS date)
          AND b.EndTime <= CAST(dt.[截止日期] AS date)
          AND NOT (b.StartTime = CAST(dt.[生效日期] AS date) AND b.EndTime = CAST(dt.[截止日期] AS date))
    )
    BEGIN
        INSERT INTO @t VALUES (1, N'导入失败:存在历史记录完全包含在某条导入记录的时间区间内,系统不允许导入。请检查导入数据或历史数据。');
        SELECT x,y FROM @t;
        RETURN;
    END

    -- 开始事务并调整交叉的历史记录,然后 MERGE 导入
    BEGIN TRY
        BEGIN TRANSACTION;

        -- 左侧相交:历史 b.Start < S.Start and b.End between S.Start and S.End => b.End = S.Start -1
        UPDATE b
        SET b.EndTime = DATEADD(day, -1, CAST(dt.[生效日期] AS date))
        FROM BI_WSDealerPrice b
        JOIN #DataTemp dt ON b.[ProvinceName] = dt.省份 AND b.FK_Product = dt.FK_Product
        WHERE b.IsValid = 1
          AND b.StartTime < CAST(dt.[生效日期] AS date)
          AND b.EndTime >= CAST(dt.[生效日期] AS date)
          AND b.EndTime <= CAST(dt.[截止日期] AS date);

        -- 右侧相交:b.Start between S.Start and S.End and b.End > S.End => b.Start = S.End + 1
        UPDATE b
        SET b.StartTime = DATEADD(day, 1, CAST(dt.[截止日期] AS date))
        FROM BI_WSDealerPrice b
        JOIN #DataTemp dt ON b.[ProvinceName] = dt.省份 AND b.FK_Product = dt.FK_Product
        WHERE b.IsValid = 1
          AND b.StartTime >= CAST(dt.[生效日期] AS date)
          AND b.StartTime <= CAST(dt.[截止日期] AS date)
          AND b.EndTime > CAST(dt.[截止日期] AS date);

        -- 跨越导入区间(拆分右段)
        INSERT INTO BI_WSDealerPrice (
            [WS_DealerType],[WS_DealerCode],[WS_DealerName],[FK_BPCSDealer],
            [FK_SDDealer],[ProductCode],[ProductName],[FK_Product],
            [Price],[StartTime],[EndTime],[CreateTime],[FK_CreateUser],[ModifyTime],
            [FK_ModifyUser],[IsValid],[Memo],[ProvinceName]
        )
        SELECT
            b.WS_DealerType, b.WS_DealerCode, b.WS_DealerName, b.FK_BPCSDealer,
            b.FK_SDDealer, b.ProductCode, b.ProductName, b.FK_Product,
            b.Price, DATEADD(day, 1, CAST(dt.[截止日期] AS date)) AS StartTime, b.EndTime,
            GETDATE(), b.FK_CreateUser, GETDATE(), @userid, 1, b.Memo,b.[ProvinceName]
        FROM BI_WSDealerPrice b
        JOIN #DataTemp dt ON b.[ProvinceName] = dt.省份 AND b.FK_Product = dt.FK_Product
        WHERE b.IsValid = 1
          AND b.StartTime < CAST(dt.[生效日期] AS date)
          AND b.EndTime > CAST(dt.[截止日期] AS date);

        -- 左段更新 EndTime = S.Start -1
        UPDATE b
        SET b.EndTime = DATEADD(day, -1, CAST(dt.[生效日期] AS date))
        FROM BI_WSDealerPrice b
        JOIN #DataTemp dt ON b.[ProvinceName] = dt.省份 AND b.FK_Product = dt.FK_Product
        WHERE b.IsValid = 1
          AND b.StartTime < CAST(dt.[生效日期] AS date)
          AND b.EndTime > CAST(dt.[截止日期] AS date);

        -- MERGE 导入(明确列出 SOURCE 字段并使用 CAST 进行转换)
        MERGE INTO BI_WSDealerPrice AS TARGET
        USING (
            SELECT
                省份,
                FK_Product,
                [产品编码] AS ProductCode,
                [产品名称] AS ProductName,
                CAST([单价] AS decimal(18,4)) AS Price,
                CAST([生效日期] AS date) AS StartTime,
                CAST([截止日期] AS date) AS EndTime
            FROM #DataTemp
        ) AS SOURCE
        ON (TARGET.ProvinceName = SOURCE.省份
            AND TARGET.FK_Product = SOURCE.FK_Product
            AND TARGET.StartTime = SOURCE.StartTime
            AND TARGET.EndTime = SOURCE.EndTime)
        WHEN MATCHED THEN
            UPDATE SET
                TARGET.Price = SOURCE.Price,
                TARGET.CreateTime = GETDATE(),
                TARGET.FK_CreateUser = @userid,
                TARGET.ModifyTime = GETDATE(),
                TARGET.FK_ModifyUser = @userid,
                TARGET.IsValid = 1,
                TARGET.Memo = '导入'
        WHEN NOT MATCHED BY TARGET THEN
        INSERT (
            [WS_DealerType],[WS_DealerCode],[WS_DealerName],[FK_BPCSDealer],
            [FK_SDDealer],[ProductCode],[ProductName],[FK_Product],
            [Price],[StartTime],[EndTime],[CreateTime],[FK_CreateUser],[ModifyTime],
            [FK_ModifyUser],[IsValid],[Memo],[ProvinceName]
        )
        VALUES (
            NULL, NULL, NULL, NULL,
            NULL, SOURCE.ProductCode, SOURCE.ProductName, SOURCE.FK_Product,
            SOURCE.Price, SOURCE.StartTime, SOURCE.EndTime, GETDATE(), @userid, GETDATE(), @userid, 1, '导入', SOURCE.省份
        );

        COMMIT TRANSACTION;

        INSERT INTO @t VALUES (0, N'导入成功!');
        SELECT x,y FROM @t;
        RETURN;
    END TRY
    BEGIN CATCH
        DECLARE @ErrNum INT = ERROR_NUMBER();
        DECLARE @ErrSeverity INT = ERROR_SEVERITY();
        DECLARE @ErrState INT = ERROR_STATE();
        DECLARE @ErrProc NVARCHAR(128) = ISNULL(ERROR_PROCEDURE(), N'(NULL)');
        DECLARE @ErrLine INT = ERROR_LINE();
        DECLARE @ErrMsg NVARCHAR(4000) = ERROR_MESSAGE();
        DECLARE @FullMsg NVARCHAR(1000) = N'导入失败,发生异常: 错误号=' + CAST(@ErrNum AS NVARCHAR(20))
            + N', 严重性=' + CAST(@ErrSeverity AS NVARCHAR(10))
            + N', 状态=' + CAST(@ErrState AS NVARCHAR(10))
            + N', 存储过程=' + @ErrProc
            + N', 行=' + CAST(@ErrLine AS NVARCHAR(10))
            + N', 消息=' + LEFT(@ErrMsg, 900); -- 截断以适应 NVARCHAR(1000)

        IF XACT_STATE() <> 0
        BEGIN
            ROLLBACK TRANSACTION;
        END

        INSERT INTO @t VALUES (1, @FullMsg);
        SELECT x,y FROM @t;
        RETURN;
    END CATCH
END