tuqin
2026-10-21 fd5ff7ce41f402720c79546617842bbf679e576e
fix(销售台账/产品维护): 图号与销售合同号长度校验、导入提示优化

回归测试发现:图号超过 255 字符、销售合同号超过 50 字符时,后端直接抛
MyBatis DataTruncation,前端弹出的是 “### Error updating database ...” 一大段 SQL 原文。

- 产品型号新增/编辑:图号超过 255 字符 -> “图号长度不能超过255个字符”
- 产品导入:图号超长定位到具体工作簿与行号
- 销售台账新增/编辑:合同号超过 50 字符 -> “销售合同号长度不能超过50个字符”
- 销售台账导入:单号超长 -> “销售单号【xxx】长度不能超过50个字符”
- 台账导入“录入人”匹配不到用户时,提示补充“请填写系统用户的昵称(不是登录账号)”
已修改2个文件
14 ■■■■■ 文件已修改
src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
@@ -66,6 +66,9 @@
        if (StringUtils.isEmpty(drawingNo)) {
            throw new ServiceException("图号不能为空");
        }
        if (drawingNo.length() > 255) {
            throw new ServiceException("图号长度不能超过255个字符");
        }
        checkModelAndProductCodeUnique(model, productCode, productModelDto.getId());
        checkDrawingNoUnique(drawingNo, productModelDto.getId());
@@ -227,6 +230,9 @@
                // 图号:导入时可选,填写则校验唯一
                String drawingNo = trimToNull(row.getDrawingNo());
                if (drawingNo != null) {
                    if (drawingNo.length() > 255) {
                        throw new ServiceException("工作簿【" + sheetName + "】第 " + resolveRowNum(row, i) + " 行:图号长度不能超过255个字符");
                    }
                    checkDrawingNoUnique(drawingNo, null);
                }
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -370,6 +370,9 @@
                if (StringUtils.isEmpty(contractNo)) {
                    continue;
                }
                if (contractNo.length() > 50) {
                    return AjaxResult.error("销售单号【" + contractNo + "】长度不能超过50个字符");
                }
                if (!importContractNos.add(contractNo)) {
                    duplicateContractNos.add(contractNo);
                }
@@ -411,7 +414,7 @@
                        .map(SysUser::getUserId)
                        .orElse(null);
                if (aLong == null)
                    throw new RuntimeException("录入人:" + salesLedger.getEntryPerson() + ",无对应用户!");
                    throw new RuntimeException("录入人:" + salesLedger.getEntryPerson() + ",无对应用户!请填写系统用户的昵称(不是登录账号)");
                salesLedger.setEntryPerson(aLong.toString());
                // 销售产品数据绑定,通过销售单号获取对应销售产品数据
                List<SalesLedgerProductImportDto> salesLedgerProductImportDtos = salesLedgerProductImportDtoList.stream()
@@ -616,6 +619,9 @@
        // 3. 销售合同号唯一校验(支持字母、数字及特殊字符,不做字符集限制)
        String contractNo = StringUtils.trim(salesLedger.getSalesContractNo());
        if (StringUtils.isNotEmpty(contractNo)) {
            if (contractNo.length() > 50) {
                throw new BaseException("销售合同号长度不能超过50个字符");
            }
            checkSalesContractNoUnique(contractNo, salesLedger.getId());
            salesLedger.setSalesContractNo(contractNo);
        }