kyy
2025-10-25 379c6a99e950e644647fcdb21afb5c5d31638e33
1、条码拆分优化
已修改3个文件
195 ■■■■■ 文件已修改
Controllers/Warehouse/MesBarCFController.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Warehouse/MesInvItemInCDetailsManager.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/base/MesPrintMangeer.cs 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/Warehouse/MesBarCFController.cs
@@ -56,7 +56,8 @@
            resultInfos.tbBillList = new ExpandoObject();
            resultInfos.tbBillList.printInfo = _mCf.getPrintInfo(unity);
            var scanResult = m.BarCF(unity);
            resultInfos.tbBillList.cfBarInfo = _mCf.getCfInfo(scanResult);
            //resultInfos.tbBillList.cfBarInfo = _mCf.getCfInfo(scanResult);
            resultInfos.tbBillList.cfBarInfo = _mCf.getCfInfo(scanResult, unity);
            return new ResponseResult
            {
                status = 0,
@@ -108,7 +109,8 @@
            resultInfos.tbBillList = new ExpandoObject();
            resultInfos.tbBillList.printInfo = _mCf.getPrintInfo(unity);
            var scanResult = m.BarCfBefore(unity);
            resultInfos.tbBillList.cfBarInfo = _mCf.getCfBeforeInfo(scanResult);
            //resultInfos.tbBillList.cfBarInfo = _mCf.getCfBeforeInfo(scanResult);
            resultInfos.tbBillList.cfBarInfo = _mCf.getCfBeforeInfo(scanResult, unity);
            return new ResponseResult
            {
                status = 0,
service/Warehouse/MesInvItemInCDetailsManager.cs
@@ -135,6 +135,8 @@
        }
    }
   
    
    
    //public ItemInBaseModel SaveBarCodes(WarehouseQuery entity)
service/base/MesPrintMangeer.cs
@@ -21,9 +21,9 @@
            var sqlParams = new List<SugarParameter> { new("@userAccount", query.userName) };
            var sql1 = @"SELECT TOP 1 ip,port fROM print_info A
         left join SYS_USER_BIND B on A.guid = B.aboutGuid
         left join SYS_USER C ON C.GUID = B.userGuid
WHERE C.ACCOUNT = @userAccount AND B.fType = '打印机'";
                           left join SYS_USER_BIND B on A.guid = B.aboutGuid
                           left join SYS_USER C ON C.GUID = B.userGuid
                          WHERE C.ACCOUNT = @userAccount AND B.fType = '打印机'";
            var printInfo = Db.Ado.SqlQuery<dynamic>(sql1, sqlParams);
@@ -107,8 +107,185 @@
            return mergedData;
        }
        /*-------------------------------2025-10-25 重写拆分条码返回信息新增打印人信息返回----------------------------------*/
}
        public dynamic getCfInfo(dynamic query, dynamic unity) // 使用具体类型替代dynamic
        {
            // 参数校验
            if (string.IsNullOrEmpty(query?.cfBarcode))
                throw new ArgumentException("拆分条码不能为空");
            if (string.IsNullOrEmpty(query?.barcode))
                throw new ArgumentException("原始条码不能为空");
            var printUser = GetPrinterUserNameByAccount(unity.userName.Trim());
            // 使用强类型参数
            var sqlParams = new List<SugarParameter> {
                new("@cfBar", query.cfBarcode.Trim()),
                new("@oldBar", query.barcode.Trim()),
                new("@printBy", printUser)
            };
            // 3. 执行SQL查询(通过UNION ALL合并原始条码与拆分后条码的信息)
            var sql = @"SELECT TOP 1
                    C.ITEM_NO,
                    C.item_name,
                    C.item_model,
                    @printBy AS printBy,
                    B.OLDQTY AS QUANTITY,
                    B.CREATE_DATE,
                    '拆分条码' AS barType,
                    B.ITEM_BARCODE,
                    u.fname AS unit,
                    GETDATE() AS print_date
                FROM MES_INV_ITEM_BARCODES B
                LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID
                LEFT JOIN MES_UNIT u ON u.id = C.storeunit
               WHERE B.ITEM_BARCODE = @cfBar
                UNION ALL
                SELECT TOP 1
                    C.ITEM_NO,
                    C.item_name,
                    C.item_model,
                    @printBy AS printBy,
                    B.QUANTITY AS QUANTITY,
                    B.CREATE_DATE,
                    '原始条码' AS barType,
                    B.ITEM_BARCODE,
                    u.fname AS unit,
                    GETDATE() AS print_date
                FROM MES_INV_ITEM_BARCODES B
                LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID
                LEFT JOIN MES_UNIT u ON u.id = C.storeunit
                WHERE B.ITEM_BARCODE = @oldBar";
            var mergedData = Db.Ado.SqlQuery<dynamic>(sql, sqlParams);
            if (mergedData.Count < 2) throw new Exception("条码信息存在异常,请联系管理员!");
            return mergedData;
        }
        /// <summary>
        /// 获取入库前拆分的条码信息(含原始条码与拆分后条码的物料、打印相关数据)
        /// </summary>
        /// <param name="query">拆分结果对象(需包含原始条码barcode、拆分后条码cfBarcode)</param>
        /// <param name="unity">查询参数对象(需包含打印人userName)</param>
        /// <returns>合并后的条码信息列表(原始条码+拆分后条码,共2条数据)</returns>
        /// <exception cref="ArgumentException">参数为空时抛出</exception>
        /// <exception cref="Exception">条码信息异常时抛出</exception>
        public dynamic getCfBeforeInfo(dynamic query, dynamic unity) // 注:建议后续替换为具体实体类型(如BarSplitResult、WarehouseQuery)
        {
            // 1. 参数合法性校验(确保核心条码和打印人信息不为空)
            if (string.IsNullOrEmpty(query?.cfBarcode?.Trim()))
                throw new ArgumentException("拆分后条码不能为空");
            if (string.IsNullOrEmpty(query?.barcode?.Trim()))
                throw new ArgumentException("原始条码不能为空");
            if (string.IsNullOrEmpty(unity?.userName?.Trim()))
                throw new ArgumentException("打印人(userName)不能为空");
             var printUser = GetPrinterUserNameByAccount(unity.userName.Trim());
            // 2. 构建SQL参数(避免SQL注入,统一处理参数空格)
            var sqlParams = new List<SugarParameter>
            {
            new("@cfBar", query.cfBarcode.Trim()),    // 拆分后的新条码
            new("@oldBar", query.barcode.Trim()),    // 拆分前的原始条码
            new("@printBy", printUser)   // 执行打印操作的用户
           };
            // 3. 执行SQL查询(通过UNION ALL合并原始条码与拆分后条码的信息)
            var sql = @"SELECT TOP 1
                    C.ITEM_NO,
                    C.item_name,
                    C.item_model,
                    @printBy AS printBy,
                    B.OLDQTY AS QUANTITY,
                    B.CREATE_DATE,
                    '拆分条码' AS barType,
                    B.ITEM_BARCODE,
                    u.fname AS unit,
                    GETDATE() AS print_date
                FROM MES_INV_ITEM_BARCODES B
                LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID
                LEFT JOIN MES_UNIT u ON u.id = C.storeunit
               WHERE B.ITEM_BARCODE = @cfBar
                UNION ALL
                SELECT TOP 1
                    C.ITEM_NO,
                    C.item_name,
                    C.item_model,
                    @printBy AS printBy,
                    B.QUANTITY AS QUANTITY,
                    B.CREATE_DATE,
                    '原始条码' AS barType,
                    B.ITEM_BARCODE,
                    u.fname AS unit,
                    GETDATE() AS print_date
                FROM MES_INV_ITEM_BARCODES B
                LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID
                LEFT JOIN MES_UNIT u ON u.id = C.storeunit
                WHERE B.ITEM_BARCODE = @oldBar";
            // 4. 执行查询并处理结果
            var mergedData = Db.Ado.SqlQuery<dynamic>(sql, sqlParams);
            // 校验结果:需同时获取到原始条码和拆分后条码的信息(共2条数据)
            if (mergedData?.Count != 2)
                throw new Exception("条码信息存在异常(未查询到完整的原始/拆分条码数据),请联系管理员!");
            return mergedData;
        }
        /// <summary>
        /// 公共方法:根据用户账号查询对应的打印机用户名
        /// </summary>
        /// <param name="userAccount">用户账号(即原unity.userName)</param>
        /// <param name="userPrinterMainTable">用户-打印机关联表名(默认值可根据实际表名配置)</param>
        /// <returns>匹配的打印机用户名</returns>
        /// <exception cref="ArgumentException">入参为空时抛出</exception>
        /// <exception cref="Exception">未查询到数据或结果为空时抛出</exception>
        public string GetPrinterUserNameByAccount(string userAccount)
        {
            // 1. 入参校验
            if (string.IsNullOrEmpty(userAccount?.Trim()))
                throw new ArgumentException("查询打印机用户的入参【userAccount】不能为空");
            // 2. 构建参数化查询(防SQL注入)
            var userParams = new List<SugarParameter>
    {
        new("@userAccount", userAccount.Trim())
    };
            // 3. 动态表名的SQL(适配不同表名场景)
            var userSql = @"SELECT C.USER_NAME FROM SYS_USER C WHERE C.ACCOUNT = @userAccount ";
            // 4. 执行查询
            var printUsers = Db.Ado.SqlQuery<dynamic>(userSql, userParams);
            if (printUsers == null || printUsers.Count == 0)
                throw new Exception($"未查询到账号【{userAccount}】对应的打印机用户信息");
            // 5. 提取并校验结果(取第一个匹配值,可根据业务调整为多值处理)
            var printUser = printUsers.First()?.USER_NAME?.Trim();
            if (string.IsNullOrEmpty(printUser))
                throw new Exception($"账号【{userAccount}】查询到的打印机用户名为空");
            return printUser;
        }
    }
}