站长信息
jeffery.xu
jeffery.xu

软件工程师

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

811495111@qq.com
18521510875
筛选

个人笔记

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

雅培CRDx财务部Q3CR
工作笔记

医院编号管理功能调整

  1. 新增医院总院字段,在新增及修改操作时,业务人员可借助放大镜工具从 DMS 系统医院主数据中选择相关数据,同时支持数据的查询与导出。
  1. 将医院级别字段修改为放大镜形式,并设定为必填项,其数据来源变更为医院等级主数据,且支持查询导出功能。
  1. 增设医院英文名字段,支持手工维护,同时具备查询导出功能。
  1. 修改数据同步功能。点击“数据同步”时,需将当前医院信息同步至SOI系统 “终端信息管理→医院信息维护→医院信息维护” 中。在同步过程中,要增加判断逻辑,仅当 DMS 系统中不存在医院编号时才执行同步操作,若已存在则给出相应提示。此外,同步还需将新增英文名、级别、总院等字段同步至“终端信息管理→医院信息维护→医院信息维护”。
  1. 在“终端信息管理→医院信息维护→医院信息维护”功能中,添加英文名、级别、总院以展示相关数据。
  1. 数据同步时,若在医院编号管理功能里数据未填写总院信息,则默认该医院的总院为其自身,保存时,其外键为SOI_CustomerInfo 表的主键。

经销商与医院关系管理功能调整

  1. 当系统手动停用关联关系时,将停用时间默认值从当前时间 +60 天调整为当前时间。
  1. 调整系统自动停用关联关系的逻辑,把停用时间默认值从当前时间 +60 天改为当前时间。同时,需对仪器签约导入、开票信息导入等功能及相关存储过程进行检查,去除自动创建经销商客户关系的额外代码逻辑,仅保留依据当前导入数据创建经销商与医院关系的相关代码。另外,对于停用关系的代码,将停用时间统一设定为当前时间,不再额外增加 60 天。

去除 DMS 系统自动创建经销商医院客户关系功能

  1. 经销商信息管理模块中的新增修改一、二级经销商关系功能。
  1. 经销商客户关系管理模块中的新增修改经销商医院关系功能。
  1. 机器信息管理模块中的上传仪器签约指标功能。
  1. 年中经销商签约导入功能。

退款审批逻辑调整

退款审批通过后,系统依据已开票退款生成退款预提信息,依据待开票情况生成负数开票明细信息。
新增逻辑:
生成的预提数据或开票数据需与当前退款申请单及退款单中的退款原因及退款备注建立 Mapping 关系,并进行系统存储,同时需新增相应的关系表。

报表功能调整

SOI 相关报表(退款明细报表、开票明细报表、预提明细报表、预提汇总报表)

  1. 在上述三个报表功能的列表页面,新增退款原因字段,支持查询及导出操作。
  1. 在导出数据时,新增退款备注字段的导出功能。
  1. 修复预提导入的数据在预提汇总功能中点击查看按钮时出现的报错问题,确保操作正常无报错。
  1. 创建数据导入功能,具体包括仪开票明细,预提明细增加 VAT 发票信息导入。根据BPCS订单号导入VAT发票号。

DMS 相关报表(开票明细报表、预提明细报表)

  1. 在两个报表功能的列表页面,新增退款原因字段,支持查询及导出。
  1. 在导出数据时,新增退款备注字段的导出功能。
  1. 修改开票明细报表,将原来的预提时间改为BPCS返回时间,修改查询条件和导出。

新增医院 VS 仪器关系报表

新增医院仪器关系报表功能
报表字段: Region、经销商 BPCS 代码、经销商 DMS 代码、经销商名称、BPCS Account、一级经销商代码、一级经销商名称、医院编码、医院名称、仪器编码、仪器名称、近三个月是否有销售、当前年是否有开票、经销商客户关系状态、经销商客户关系停用时间等,同时支持数据的查询与导出。
 
软件支持时间
工作笔记
软件 版本 支持结束时间
Windows server 2022 2026 年 10 月
IIS 10 2029 年 1 月 9 日(基于 Windows Server 2019 上的 IIS 10,若部署在其他系统可能有所不同)
Android 10 2023 36
Java Jdk 1.8.0-71 2030 年 12 月
.net framework 4.8 仍受支持,无结束时间
Newtonsoft.Json 9.0.1 无明确的整体支持结束时间,有新版本
Log4net 2.0.8 无明确的整体支持结束时间,有新版本
Sql server sql server 2022 2032 年 10 月 11 日(主流支持结束于 2027 年 10 月 11 日,扩展支持结束于 2032 年 10 月 11 日)

 

microsoft.web.ui.controls 的 treeview 控件绑定问题
工作笔记

周五遇到一个问题,treeview控件绑定菜单数据,当菜单节点过少的时候,报错了。仔细查找了好久,找不到原因。只知道databind()就报错了。查看了报错日志,发现有Page.url报错,甚是奇怪。最后反编译了dll,找到了问题。问题在于下面这个方法:

控件的 ReadXmlSrc 先把 TreeNodeSrc 当作 URI 去读取(GetXmlReaderFromUri);只有当该 URI 读取抛异常时才回退到把字符串当 XML(GetXmlReaderFromString)。
当节点较少时,编码后的相对 URI 比较短,请求成功返回了内容(或服务器对短 URL 做了特殊处理),解析器就直接在那个输入流上解析并在 DTD/属性处报错 —— 因为那不是一个纯净的 XML 输入(被当作 URL 处理后产生了问题)。
当节点很多时,编码后的 URL 变得更长或触发服务器拒绝/超时等错误,导致 GetXmlReaderFromUri 抛出异常,代码走到 catch 分支再用字符串解析,这样就不会触发 URI 路径上的那类错误,所以看起来“节点多反而不报错”。微软的控件真是一言难尽

IIFE
工作笔记

(function () { … })() 是 JavaScript 中常见的一种模式,称为 IIFE(Immediately‑Invoked Function Expression,立即执行函数表达式)。下面分点解释并给出示例。
1.    目的(为什么用)
•    建立独立作用域:函数内部的变量不会污染全局命名空间。
•    封装私有变量/方法:可以把实现细节隐藏,只暴露需要的接口。
•    立即执行初始化逻辑(模块初始化、事件绑定等)。
•    可安全传入全局对象(如 window、jQuery)作局部引用,性能与兼容性更好。

Edge下打开IE的开发工具
工作笔记

%systemroot%\system32\f12\IEChooser.exe

修改线下订单退单记录罐码
工作笔记
private dynamic ReturnScanOrderSubmit(WebParameterContext webContext)
{
    var response = new ServerContext<dynamic>() { ResponseMessage = new ResponseMessage() { Success = true } };
    ActionReturnResponseMessage = () =>
    {
        TransactionResult<dynamic> transactionResult = new TransactionResult<dynamic>();
        response = VerifyReturnScanData(webContext);
        if (response.ResponseMessage.Success == false)
        {
            return response;
        }
        try
        {
            var result = Dalserver.Base.BatchExecuteForTransaction(() =>
            {
                try
                {

                    LogUtil.DoLog("ReturnOrderSubmit-webContext", JSON.ToJSON(webContext));
                    // 获取请求体中的数据
                    string tank_codes = string.Join(",", webContext.RequestBody.tank_codes.ToArray());
                    string StoreID = webContext?.StoreID.ToString();

                    dynamic Datas = DynamicExtension.EmptyDynamic;

                    Datas = Dalserver.DA.Query("CT_GetOffIDData", new { codes = tank_codes, FK_StoreID = StoreID });
                    if (Datas != null && Datas is IEnumerable<dynamic> list && ((IEnumerable<dynamic>)Datas).ToList().Count > 0)
                    {
                        var returnData = new List<dynamic>();
                        returnData = ((IEnumerable<dynamic>)Datas).ToList();

                        var idList = returnData
                            .Select(x => x.ID)
                            .ToList();

                        foreach (var id in idList)
                        {
                            dynamic updatequery = DynamicExtension.EmptyDynamic;
                            updatequery.ID = id;
                            dynamic updateObj = DynamicExtension.EmptyDynamic;
                            updateObj.Status = 2;
                            Dalserver.Base.DataLogicFactory(new SqlDynamicContext("TBProductTankCode", OperationType.EDITE, updatequery, updateObj));
                        }

                        var orderList = returnData
                            .GroupBy(x => x.OrderID)
                            .Select(g => new
                            {
                                OrderID = g.Key,
                            })
                            .ToList();
                        // 为每个OrderID创建一个单独的ProductReturnCreate
                        Dictionary<string, dynamic> orderReturnMap = new Dictionary<string, dynamic>();

                        foreach (var order in orderList)
                        {
                            string orderNumber = GetOrderNumberByID(order.OrderID?.ToString()); // 假设有这个方法获取订单号
                            dynamic returnID = ProductReturnCreate(webContext.Account.Id.ToString(), 0, webContext.StoreID?.ToString(), orderNumber);
                            orderReturnMap.Add(order.OrderID?.ToString(), returnID);
                        }
                        var detailList = returnData
                            .GroupBy(x => new { DetailID = x.DetailID, OrderID = x.OrderID })
                            .Select(g => new
                            {
                                DetailID = g.Key.DetailID,
                                ProductCount = g.Count(),
                                ProductID = g.First().ProductID,
                                OrderID = g.First().OrderID,
                                OnlinePrice = Convert.ToDecimal(g.First().OnlinePrice),
                                TankCodes = g.Select(x => x.TankCode).Where(tc => !string.IsNullOrEmpty(tc)).Distinct().ToList()
                            })
                            .ToList();


                        foreach (var detail in detailList)
                        {
                            UpdateProductOrderDetail(detail.DetailID, detail.ProductCount);
                            dynamic returnID = orderReturnMap[detail.OrderID?.ToString()];
                            CreateReturnDetail(detail, returnID, webContext.Account.Id.ToString(), 1);
                        }

                        foreach (var order in orderList)
                        {
                            UpdateMainProductOrder(order.OrderID);
                        }

                        foreach (var returnID in orderReturnMap.Values)
                        {
                            UpdateMainReturnProductOrder(returnID);
                        }

                        var ProductList = returnData
                            .GroupBy(x => x.ProductID)
                            .Select(g => new
                            {
                                ProductID = g.Key,
                                TankCodes = g.Select(x => x.TankCode).Where(tc => !string.IsNullOrEmpty(tc)).Distinct().ToList(),
                                TankCodeCount = g.Select(x => x.TankCode).Where(tc => !string.IsNullOrEmpty(tc)).Distinct().ToList().Count
                            })
                            .ToList();
                        foreach (var detail in ProductList)
                        {
                            string Message = ReturnStock(detail.ProductID?.ToString(), webContext.StoreID, (int)detail.TankCodeCount, detail.TankCodes);
                            if (!string.IsNullOrEmpty(Message))
                            {
                                response.ResponseMessage.ErrorMessage = Message;
                                response.ResponseMessage.ErrorCode = 500;
                                response.ResponseMessage.Success = false;
                                response.Status = DynamicExtension.EmptyDynamic;
                                return false;
                            }
                        }
                        response.ResponseMessage.ErrorMessage = "退单成功!";
                        response.ResponseMessage.ErrorCode = 200;
                        response.Status = string.Join(",", orderReturnMap.Values);
                    }
                    else
                    {
                        response.ResponseMessage.ErrorMessage = "未查询到订单!";
                        response.ResponseMessage.ErrorCode = 500;
                        response.ResponseMessage.Success = false;
                        response.Status = DynamicExtension.EmptyDynamic;
                        return false;
                    }

                    return true;
                }
                catch (Exception e)
                {
                    LogUtil.LogExceptionInfo("ReturnOrderSubmit-接口异常", e);
                    response.ResponseMessage.Success = false;
                    response.ResponseMessage.ErrorMessage = e.Message;
                    response.ResponseMessage.ErrorCode = 500;
                    return false;
                }
            }, transactionResult);



            return response;
        }
        catch (Exception ex)
        {
            LogUtil.LogExceptionInfo("ReturnOrderSubmit-接口异常", ex);
            response.ResponseMessage.Success = false;
            response.ResponseMessage.ErrorCode = 500;
            response.ResponseMessage.ErrorMessage = "程序异常!" + ex.Message;
            return response;
        }

    };
    return webContext;
}
private dynamic CreateReturnDetail(dynamic detail, dynamic returnID, dynamic AccountID, int ReturnType)
{
    ServerContext<dynamic> data = new ServerContext<dynamic>();
    dynamic factory = DynamicExtension.EmptyDynamic;
    factory.FK_TBProduct_ID = detail.ProductID?.ToString();
    factory.ProductCode = GetProductCodeByID(detail.ProductID?.ToString());
    factory.ProductName = GetProductNameByID(detail.ProductID?.ToString());
    factory.QuantityNum = detail.ProductCount; // 总数量
    factory.QuantityMoney = (decimal)detail.OnlinePrice * (int)detail.ProductCount;
    factory.FK_TBProductReturn_ID = returnID;
    factory.FK_TBProductOrder_ID = detail.OrderID?.ToString(); // 订单来源(固定线下)
    factory.FK_TBProductOrderDetail_ID = detail.DetailID?.ToString(); // 订单来源(固定线下)
    factory.FK_SystemUser_Create_ID = AccountID;    // 创建人ID
    factory.FK_SystemUser_Modify_ID = AccountID;    // 修改人ID
    factory.IsValid = 1;
    factory.CreateTime = DateTime.Now;
    factory.ModifyTime = DateTime.Now;
    SqlDynamicContext sql = new SqlDynamicContext("TBProductReturnDetail", OperationType.ADD, factory: factory);
    data = Dalserver.Base.DataLogicFactory(sql);//新增
    var detailID = data.Status?.ToString();
    if (ReturnType == 1)
    {
        foreach (var tankCode in detail.TankCodes)
        {
            if (!string.IsNullOrEmpty(tankCode?.ToString()))
            {
                CreateReturnTankCode(tankCode, returnID?.ToString(), detail.ProductID?.ToString(), AccountID, detailID);
            }
        }
    }
    return data.Status;


}
记录一个BUG
工作笔记

<Column isVirtualField="false" field="a_ExpectedInstallationTime" fkField="" title="预计装机时间" titleTooltip="预计装机时间" funcValue="CONVERT(varchar(100), a.ExpectedInstallationTime, 23)" align="left" sortable="false" order="" formatter="" level="2" visible="true" gridPickerShow="true" notExport="false" notImport="false" isBold="false" fontSize="0" /> funcValue里的值写错了,需要牢记

APOC修复客户关联关系BUG,修复发票导入空行BUG
工作笔记
if (this.gpCustomer.SelectedValue.ToString() != string.Empty && this.gpSD.SelectedValue.ToString() != string.Empty && this.gpCustomer.SelectedValue.ToString() != "-1" && this.gpSD.SelectedValue.ToString() != "-1")
{
    if (((Enums.PageStatus)Session["Session_PageStatus"]) == SOI.Enums.PageStatus.Create || ((Enums.PageStatus)Session["Session_PageStatus"]) == SOI.Enums.PageStatus.Edit)
    {
        //if ((Enums.PageStatus)Session["Session_PageStatus"] == SOI.Enums.PageStatus.Create)

        Wicresoft.Session.Session session = new Wicresoft.Session.Session();
        string sql = @"select count(*) from SOI_DealerCustomer where  isvalid=1 and FK_CustomerInfo=" + gpCustomer.SelectedValue + "and FK_Dealer=" + gpSD.SelectedValue + " and customerkind='客户'" + ((Enums.PageStatus)Session["Session_PageStatus"] == SOI.Enums.PageStatus.Create ? "" : (" AND PKID!= " + this.PKID));
        int i = Convert.ToInt32(session.SqlHelper.ExecuteScalar(sql, CommandType.Text));
        if (i > 0)
        {
            valiateSDDName.ErrorMessage = "经销商与医院已做过关联";
            args.IsValid = false;
        }
    }
}