Browse Source

修改单导入调整及新建保存序号、排号初始化

DLC 1 day ago
parent
commit
a63182c7c1

+ 6 - 1
qcs-common/src/main/java/com/rongwei/bscommon/sys/dao/QcsMdfFormDao.java

@@ -72,7 +72,7 @@ public interface QcsMdfFormDao extends BaseMapper<QcsMdfFormDo> {
             "\tIFNULL(f.RECTIFYCODE,'') as RECTIFYCODE,IFNULL(f.MANAGEADMINNICKNAME,'') as MANAGEADMINNICKNAME,IFNULL(f.PRODUCENAME,'') as PRODUCENAME,d.SECTIONID,s.SECTIONSN,\n" +
             "\tIFNULL(s.MODIFYBY,'') as MODIFYBY,IFNULL(s.ERRORDESIGNDTDRAWINGNO,'') as ERRORDESIGNDTDRAWINGNO,IFNULL(s.DTDESIGNER,'') as DTDESIGNER,IFNULL(s.DTWHOCOLLATE,'') as DTWHOCOLLATE,\n" +
             "\tIFNULL(s.DTWHOAPPROVE,'') as DTWHOAPPROVE,IFNULL(s.ERRORROUTINE,'') as ERRORROUTINE,IFNULL(s.ERRORAGAIN,'') as ERRORAGAIN,IFNULL(s.ERRORHARD,'') as ERRORHARD,\n" +
-            "\tIFNULL(s.ERRORTABLE,'') as ERRORTABLE,d.ROWID,IFNULL(r.CONTENT,'') as CONTENT,SUBSTRING_INDEX(r.ROWSN, '-', -1)as ROWSN, IFNULL(r.REMARK,'') as REMARK,\n" +
+            "\tIFNULL(s.ERRORTABLE,'') as ERRORTABLE,d.ROWID,IFNULL(r.CONTENT,'') as CONTENT,SUBSTRING_INDEX(r.ROWSN, '-', -1) as ROWSN, IFNULL(r.REMARK,'') as REMARK,\n" +
             "\tIFNULL(r.TASKDESIGNDTDRAWINGNO,'') as TASKDESIGNDTDRAWINGNO,IFNULL(r.MINORDESIGNDTDRAWINGNO,'') as MINORDESIGNDTDRAWINGNO, IFNULL(r.MINORDESIGNDTPARTNAME,'') as MINORDESIGNDTPARTNAME,\n" +
             "\td.ID as DETAILID,d.STATUS,IFNULL(d.DEPTID,'') as DEPTID,IFNULL(f.BASEID,'') as BASEID,IFNULL(f.SHAREDEPTIDS,'') as SHAREDEPTIDS\n" +
             "FROM qcs_mdf_detail d LEFT JOIN qcs_mdf_row r ON d.ROWID=r.ID\n" +
@@ -80,4 +80,9 @@ public interface QcsMdfFormDao extends BaseMapper<QcsMdfFormDo> {
             "LEFT JOIN qcs_mdf_form f ON s.FORMID=f.ID\n" +
             "WHERE d.DELETED='0' and r.DELETED='0' and s.DELETED='0' and f.DELETED='0' order by s.SECTIONSN,SUBSTRING_INDEX(r.ROWSN, '-', -1)")
     List<ImportMdfVo> getMdfForms();
+
+    @Select("select s.FORMID as ID,r.SECTIONID,IFNULL(s.SECTIONSN,'') as SECTIONSN,r.ID as ROWID,SUBSTRING_INDEX(IFNULL(r.ROWSN,''), '-', -1) as ROWSN \n" +
+            "from qcs_mdf_row r left join qcs_mdf_section s on r.SECTIONID=s.ID\n" +
+            "where r.DELETED='0' and s. DELETED='0' and s.FORMID=#{formId}")
+    List<ImportMdfVo> getAllRows(@Param(value = "formId") String formId);
 }

+ 316 - 201
qcs-common/src/main/java/com/rongwei/bscommon/sys/service/impl/QcsMdfFormServiceImpl.java

@@ -70,8 +70,11 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
         String deptId = params.get("deptId");
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
 
-        QcsMdfFormDo qcsMdfFormDo = qcsMdfFormService.getById(formId);
+        //空的序号排号初始化
+        Thread thread = new Thread(() -> setSecRowSn(formId));
+        thread.start(); // 启动线程
 
+        QcsMdfFormDo qcsMdfFormDo = qcsMdfFormService.getById(formId);
         //先更新修改单的合计金额和实际金额
         Map<String, Object> detailMap = qcsMdfFormDao.getAmountSum(formId);
         if (detailMap != null) {
@@ -135,6 +138,69 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
         }
     }
 
+    //空的序号排号初始化
+    private void setSecRowSn(String formId) {
+        List<QcsMdfSectionDo> qcsMdfSectionDoList = new ArrayList<>();
+        List<QcsMdfRowDo> qcsMdfRowDoList = new ArrayList<>();
+        List<ImportMdfVo> qcsMdfRowDos = qcsMdfFormDao.getAllRows(formId);
+        //序号分组 空值在后,有值正序在前
+        Map<ImportMdfVo, List<ImportMdfVo>> secMap = qcsMdfRowDos.stream()
+                .sorted(createReverseComparator("sectionsn"))
+                .collect(Collectors.groupingBy(
+                        m -> new ImportMdfVo(m.getId(), m.getSectionid(), m.getSectionsn()),
+                        LinkedHashMap::new,  // 保持分组顺序
+                        Collectors.toList()
+                ));
+        AtomicReference<Integer> maxSectionSn = new AtomicReference<>(0);
+        secMap.forEach((mvo, slist) -> {
+            if (StringUtils.isNotBlank(mvo.getSectionsn())) {
+                maxSectionSn.getAndSet(Integer.parseInt(mvo.getSectionsn()));
+            } else {
+                maxSectionSn.getAndSet(maxSectionSn.get() + 1);
+            }
+            AtomicReference<Integer> maxRowSn = new AtomicReference<>(0);
+            //排号分组 空值在后,有值正序在前
+            Map<ImportMdfVo, List<ImportMdfVo>> rowMap = slist.stream()
+                    .sorted(createReverseComparator("rowsn"))
+                    .collect(Collectors.groupingBy(
+                            m -> new ImportMdfVo(m.getId(), m.getSectionid(), m.getSectionsn(), m.getRowid(), m.getRowsn()),
+                            LinkedHashMap::new,  // 保持分组顺序
+                            Collectors.toList()
+                    ));
+            rowMap.forEach((rvo, rlist) -> {
+                if (StringUtils.isNotBlank(rvo.getRowsn())) {
+                    maxRowSn.getAndSet(Integer.parseInt(rvo.getRowsn()));
+                } else {
+                    for (int r = 0; r < rlist.size(); r++) {
+                        maxRowSn.getAndSet(maxRowSn.get() + 1);
+                        QcsMdfRowDo qcsMdfRowDo = new QcsMdfRowDo();
+                        qcsMdfRowDo.setId(rlist.get(r).getRowid());
+                        qcsMdfRowDo.setRowsn(maxRowSn.toString());
+                        qcsMdfRowDo.setRowsn(maxSectionSn + "-" + qcsMdfRowDo.getRowsn());
+                        qcsMdfRowDoList.add(qcsMdfRowDo);
+                    }
+                }
+            });
+            QcsMdfSectionDo qcsMdfSectionDo = new QcsMdfSectionDo();
+            qcsMdfSectionDo.setId(mvo.getSectionid());
+            qcsMdfSectionDo.setSectionsn(maxSectionSn.toString());
+            qcsMdfSectionDoList.add(qcsMdfSectionDo);
+        });
+
+        Boolean bool1 = true;
+        Boolean bool2 = true;
+        if (qcsMdfSectionDoList.size() > 0) {
+            bool1 = qcsMdfSectionService.updateBatchById(qcsMdfSectionDoList);
+        }
+        if (qcsMdfRowDoList.size() > 0) {
+            bool2 = qcsMdfRowService.updateBatchById(qcsMdfRowDoList);
+        }
+        if (!bool1 || !bool2) {
+            log.error("空的序号排号初始化失败");
+            throw new CustomException("空的序号排号初始化失败");
+        }
+    }
+
     //集中派发
     @Override
     @Transactional
@@ -273,13 +339,13 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             StringBuilder stringBuilder = new StringBuilder();
             ImportMdfVo importMdfVo = new ImportMdfVo();
 
-            String endCell = row.getCell(0).toString().replaceAll("\\s+", "");
+            String endCell = row.getCell(0) == null ? "" : row.getCell(0).toString().replaceAll("\\s+", "");
             if (endCell.equals("小计")) {
                 break;
             }
 
             //项目工号
-            String procode = row.getCell(2).toString().replaceAll("\\s+", "");
+            String procode = row.getCell(2) == null ? "" : row.getCell(2).toString().replaceAll("\\s+", "");
             List<QcsPartNoDo> codeParts = new ArrayList<>();
             if (StringUtils.isEmpty(procode)) {
                 stringBuilder.append("项目工号必填,");
@@ -300,7 +366,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             }
 
             //产品类型
-            String typename = row.getCell(4).toString().replaceAll("\\s+", "");
+            String typename = row.getCell(4) == null ? "" : row.getCell(4).toString().replaceAll("\\s+", "");
             if (StringUtils.isNotEmpty(typename)) {
                 if (StringUtil.isScience(typename)) {
                     BigDecimal formatProjectCode = new BigDecimal(typename);
@@ -308,10 +374,10 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
                 }
             }
             importMdfVo.setTypename(typename);
-            importMdfVo.setNumbername(row.getCell(5).toString().replaceAll("\\s+", ""));//专业/类别
+            importMdfVo.setNumbername(row.getCell(5) == null ? "" : row.getCell(5).toString().replaceAll("\\s+", ""));//专业/类别
 
             //修改单编号
-            String lossno = row.getCell(6).toString().replaceAll("\\s+", "");
+            String lossno = row.getCell(6) == null ? "" : row.getCell(6).toString().replaceAll("\\s+", "");
             if (StringUtils.isNotEmpty(lossno)) {
                 if (StringUtil.isScience(lossno)) {
                     BigDecimal formatProjectCode = new BigDecimal(lossno);
@@ -323,7 +389,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             }
 
             //修改原因
-            String sourcename = row.getCell(9).toString().replaceAll("\\s+", "");
+            String sourcename = row.getCell(9) == null ? "" : row.getCell(9).toString().replaceAll("\\s+", "");
             if (StringUtils.isNotEmpty(sourcename)) {
                 //有配置责任单位
                 resDutyList = resDutyMap.stream()
@@ -335,7 +401,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             importMdfVo.setSourcename(sourcename);
 
             //整改编号
-            String rectifycode = row.getCell(19).toString().replaceAll("\\s+", "");
+            String rectifycode = row.getCell(19) == null ? "" : row.getCell(19).toString().replaceAll("\\s+", "");
             if (StringUtils.isNotEmpty(rectifycode)) {
                 if (StringUtil.isScience(rectifycode)) {
                     BigDecimal formatProjectCode = new BigDecimal(rectifycode);
@@ -345,7 +411,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             importMdfVo.setRectifycode(rectifycode);
 
             //项目总工
-            String managename = row.getCell(20).toString().replaceAll("\\s+", "");
+            String managename = row.getCell(20) == null ? "" : row.getCell(20).toString().replaceAll("\\s+", "");
             if (StringUtils.isNotEmpty(managename)) {
                 if (StringUtil.isScience(managename)) {
                     BigDecimal formatProjectCode = new BigDecimal(managename);
@@ -361,10 +427,10 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
                 }
             }
             importMdfVo.setManageadminnickname(managename);
-            importMdfVo.setProducename(row.getCell(21).toString().replaceAll("\\s+", ""));//项目生产阶段
+            importMdfVo.setProducename(row.getCell(21) == null ? "" : row.getCell(21).toString().replaceAll("\\s+", ""));//项目生产阶段
 
             //内容序号
-            String sectionsn = row.getCell(7).toString().replaceAll("\\s+", "");
+            String sectionsn = row.getCell(7) == null ? "" : row.getCell(7).toString().replaceAll("\\s+", "");
             if (StringUtils.isNotEmpty(sectionsn)) {
                 if (StringUtil.isScience(sectionsn)) {
                     BigDecimal formatProjectCode = new BigDecimal(sectionsn);
@@ -377,7 +443,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             importMdfVo.setSectionsn(sectionsn);
 
             //修改责任方
-            String modifyby = row.getCell(8).toString().replaceAll("\\s+", "");
+            String modifyby = row.getCell(8) == null ? "" : row.getCell(8).toString().replaceAll("\\s+", "");
             if (StringUtils.isNotEmpty(modifyby)) {
                 List<Map<String, String>> mapList = unitMap.stream()
                         .filter(umap -> {
@@ -391,7 +457,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             importMdfVo.setModifyby(modifyby);
 
             //错误源头图号
-            String partno = row.getCell(22).toString().replaceAll("\\s+", "");
+            String partno = row.getCell(22) == null ? "" : row.getCell(22).toString().replaceAll("\\s+", "");
             if (StringUtils.isNotEmpty(partno)) {
                 if (StringUtil.isScience(partno)) {
                     BigDecimal formatProjectCode = new BigDecimal(partno);
@@ -408,7 +474,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             importMdfVo.setErrordesigndtdrawingno(partno);
 
             //设计人
-            String dtdesigner = row.getCell(24).toString().replaceAll("\\s+", "");
+            String dtdesigner = row.getCell(24) == null ? "" : row.getCell(24).toString().replaceAll("\\s+", "");
             if (StringUtils.isNotEmpty(dtdesigner)) {
                 if (StringUtil.isScience(dtdesigner)) {
                     BigDecimal formatProjectCode = new BigDecimal(dtdesigner);
@@ -426,7 +492,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             importMdfVo.setDtdesigner(dtdesigner);
 
             //校对人
-            String dtwhocollate = row.getCell(25).toString().replaceAll("\\s+", "");
+            String dtwhocollate = row.getCell(25) == null ? "" : row.getCell(25).toString().replaceAll("\\s+", "");
             if (StringUtils.isNotEmpty(dtwhocollate)) {
                 if (StringUtil.isScience(dtwhocollate)) {
                     BigDecimal formatProjectCode = new BigDecimal(dtwhocollate);
@@ -444,7 +510,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             importMdfVo.setDtwhocollate(dtwhocollate);
 
             //审核人
-            String dtwhoapprove = row.getCell(26).toString().replaceAll("\\s+", "");
+            String dtwhoapprove = row.getCell(26) == null ? "" : row.getCell(26).toString().replaceAll("\\s+", "");
             if (StringUtils.isNotEmpty(dtwhoapprove)) {
                 if (StringUtil.isScience(dtwhoapprove)) {
                     BigDecimal formatProjectCode = new BigDecimal(dtwhoapprove);
@@ -461,20 +527,23 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             }
             importMdfVo.setDtwhoapprove(dtwhoapprove);
 
-            importMdfVo.setErrorroutine(row.getCell(27).toString().replaceAll("\\s+", ""));//常规错误
-            importMdfVo.setErroragain(row.getCell(28).toString().replaceAll("\\s+", ""));//二过错误
-            importMdfVo.setErrorhard(row.getCell(29).toString().replaceAll("\\s+", ""));//较难发现错误
+            importMdfVo.setErrorroutine(row.getCell(27) == null ? "" : row.getCell(27).toString().replaceAll("\\s+", ""));//常规错误
+            importMdfVo.setErroragain(row.getCell(28) == null ? "" : row.getCell(28).toString().replaceAll("\\s+", ""));//二过错误
+            importMdfVo.setErrorhard(row.getCell(29) == null ? "" : row.getCell(29).toString().replaceAll("\\s+", ""));//较难发现错误
 
             //校对表错误
-            String errortable = row.getCell(30).toString().replaceAll("\\s+", "");
-            if (errortable.equals("是")) {
-                importMdfVo.setErrortable("1");
-            } else {
-                importMdfVo.setErrortable("0");
+            String errortable = row.getCell(30) == null ? "" : row.getCell(30).toString().replaceAll("\\s+", "");
+            if (StringUtils.isNotEmpty(errortable)) {
+                if (errortable.equals("是")) {
+                    errortable = "1";
+                } else {
+                    errortable = "0";
+                }
             }
+            importMdfVo.setErrortable(errortable);
 
             //修改内容
-            String content = row.getCell(10).toString().replaceAll("\\s+", "");
+            String content = row.getCell(10) == null ? "" : row.getCell(10).toString().replaceAll("\\s+", "");
             if (StringUtils.isNotEmpty(content)) {
                 if (StringUtil.isScience(content)) {
                     BigDecimal formatProjectCode = new BigDecimal(content);
@@ -486,7 +555,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             importMdfVo.setContent(content);
 
             //排号
-            String rowsn = row.getCell(11).toString().replaceAll("\\s+", "");
+            String rowsn = row.getCell(11) == null ? "" : row.getCell(11).toString().replaceAll("\\s+", "");
             if (StringUtils.isNotEmpty(rowsn)) {
                 if (StringUtil.isScience(rowsn)) {
                     BigDecimal formatProjectCode = new BigDecimal(rowsn);
@@ -499,7 +568,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             importMdfVo.setRowsn(rowsn);
 
             //备注
-            String remark = row.getCell(12).toString().replaceAll("\\s+", "");
+            String remark = row.getCell(12) == null ? "" : row.getCell(12).toString().replaceAll("\\s+", "");
             if (StringUtils.isNotEmpty(remark)) {
                 if (StringUtil.isScience(remark)) {
                     BigDecimal formatProjectCode = new BigDecimal(remark);
@@ -509,7 +578,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             importMdfVo.setRemark(remark);
 
             //修改图号(任务单部件)
-            String taskdesign = row.getCell(31).toString().replaceAll("\\s+", "");
+            String taskdesign = row.getCell(31) == null ? "" : row.getCell(31).toString().replaceAll("\\s+", "");
             if (StringUtils.isNotEmpty(taskdesign)) {
                 if (StringUtil.isScience(taskdesign)) {
                     BigDecimal formatProjectCode = new BigDecimal(taskdesign);
@@ -526,7 +595,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             importMdfVo.setTaskdesigndtdrawingno(taskdesign);
 
             //修改图号(次级部件)
-            String xgth = row.getCell(33).toString().replaceAll("\\s+", "");
+            String xgth = row.getCell(33) == null ? "" : row.getCell(33).toString().replaceAll("\\s+", "");
             if (StringUtils.isNotEmpty(xgth)) {
                 if (StringUtil.isScience(xgth)) {
                     BigDecimal formatProjectCode = new BigDecimal(xgth);
@@ -536,7 +605,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             importMdfVo.setMinordesigndtdrawingno(xgth);
 
             //修改图名(次级部件)
-            String xgtm = row.getCell(21).toString().replaceAll("\\s+", "");
+            String xgtm = row.getCell(21) == null ? "" : row.getCell(21).toString().replaceAll("\\s+", "");
             if (StringUtils.isNotEmpty(xgtm)) {
                 if (StringUtil.isScience(xgtm)) {
                     BigDecimal formatProjectCode = new BigDecimal(xgtm);
@@ -546,7 +615,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             importMdfVo.setMinordesigndtpartname(xgtm);
 
             //责任单位
-            String dutydeptname = row.getCell(13).toString().replaceAll("\\s+", "");
+            String dutydeptname = row.getCell(13) == null ? "" : row.getCell(13).toString().replaceAll("\\s+", "");
             if (StringUtils.isNotEmpty(dutydeptname)) {
                 List<Map<String, String>> mapList = unitMap.stream()
                         .filter(umap -> {
@@ -562,7 +631,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             importMdfVo.setDutydeptname(dutydeptname);
 
             //人工
-            String mandayStr = row.getCell(14).toString().replaceAll("\\s+", "");
+            String mandayStr = row.getCell(14) == null ? "" : row.getCell(14).toString().replaceAll("\\s+", "");
             if (mandayStr != null && StringUtils.isNotEmpty(mandayStr)) {
                 String toAmount = convertToTwoDecimalPlaces(mandayStr);
                 if (toAmount.equals("金额要为数字,")) {
@@ -573,7 +642,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             }
 
             //材料
-            String materStr = row.getCell(15).toString().replaceAll("\\s+", "");
+            String materStr = row.getCell(15) == null ? "" : row.getCell(15).toString().replaceAll("\\s+", "");
             if (materStr != null && StringUtils.isNotEmpty(materStr)) {
                 String toAmount = convertToTwoDecimalPlaces(materStr);
                 if (toAmount.equals("金额要为数字,")) {
@@ -584,7 +653,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             }
 
             //设备
-            String equipStr = row.getCell(16).toString().replaceAll("\\s+", "");
+            String equipStr = row.getCell(16) == null ? "" : row.getCell(16).toString().replaceAll("\\s+", "");
             if (equipStr != null && StringUtils.isNotEmpty(equipStr)) {
                 String toAmount = convertToTwoDecimalPlaces(equipStr);
                 if (toAmount.equals("金额要为数字,")) {
@@ -595,7 +664,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
             }
 
             //其他
-            String otherStr = row.getCell(17).toString().replaceAll("\\s+", "");
+            String otherStr = row.getCell(17) == null ? "" : row.getCell(17).toString().replaceAll("\\s+", "");
             if (otherStr != null && StringUtils.isNotEmpty(otherStr)) {
                 String toAmount = convertToTwoDecimalPlaces(otherStr);
                 if (toAmount.equals("金额要为数字,")) {
@@ -630,7 +699,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
                             f -> new ImportMdfVo(f.getTypename(), f.getSourcename(), f.getNumbername(), f.getRectifycode(), f.getManageadminnickname(), f.getProducename())
                     ));
                     if (formListMap.size() > 1) {
-                        allStrBuilder.append("项目工号" + fm.getProjectdlprojid() + ",修改单编号" + fm.getSourcenumbercode() + "有" + formListMap.size() + "行,但主表列数据产品类型、类别、修改原因、整改编号、项目总工、项目生产阶段有不同,请检查<br>");
+                        allStrBuilder.append("项目工号" + fm.getProjectdlprojid() + ",修改单编号" + fm.getSourcenumbercode() + "有" + formListMap.size() + "行,但产品类型、类别、修改原因、整改编号、项目总工、项目生产阶段有不同,请检查<br>");
                     } else {
                         //主表数据
                         ImportMdfVo mdfVo = qcsMdfFormDos.stream().filter(mv -> fm.getProjectdlprojid().equals(mv.getProjectdlprojid()) && fm.getSourcenumbercode().equals(mv.getSourcenumbercode())).findAny().orElse(null);
@@ -671,199 +740,222 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
 
                         if (StringUtils.isBlank(allStrBuilder.toString())) {
                             AtomicReference<Integer> maxSectionSn = new AtomicReference<>(0);
-                            //序号分组
-                            Map<ImportMdfVo, List<ImportMdfVo>> mdfVoListMap = flist.stream().collect(Collectors.groupingBy(
-                                    p -> new ImportMdfVo(p.getSectionsn(), p.getModifyby(), p.getErrordesigndtdrawingno(), p.getDtdesigner(), p.getDtwhocollate(), p.getDtwhoapprove(), p.getErrorroutine(), p.getErroragain(), p.getErrorhard(), p.getErrortable())
-                            ));
-                            String finalFormid = formid;
-                            String finalFormid1 = formid;
-                            mdfVoListMap.forEach((mvo, slist) -> {
-//                                for (int s = 0; s < slist.size(); s++) {
-                                List<ImportMdfVo> secVos;
-                                String sectionid = "";
-                                if (StringUtils.isBlank(mvo.getSectionsn())) {
-                                    sectionid = SecurityUtil.getUUID();
-                                    secVos = qcsMdfFormDos.stream().filter(sv -> fm.getProjectdlprojid().equals(sv.getProjectdlprojid()) && fm.getSourcenumbercode().equals(sv.getSourcenumbercode())).collect(Collectors.toList());
-                                    if (secVos.size() == 0) {
-                                        maxSectionSn.getAndSet(maxSectionSn.get() + 1);
-                                    } else {
-                                        maxSectionSn.getAndSet(Integer.parseInt(secVos.get(secVos.size() - 1).getSectionsn()) + 1);
+                            //按照内容序号分组
+                            Map<String, List<ImportMdfVo>> snoListMap = flist.stream().collect(Collectors.groupingBy(ImportMdfVo::getSectionsn));
+                            snoListMap.forEach((sno, slm) -> {
+                                if (StringUtils.isNotBlank(sno)) {
+                                    Map<ImportMdfVo, List<ImportMdfVo>> difSmap = slm.stream().collect(Collectors.groupingBy(
+                                            p -> new ImportMdfVo(p.getModifyby(), p.getErrordesigndtdrawingno(), p.getDtdesigner(), p.getDtwhocollate(), p.getDtwhoapprove(), p.getErrorroutine(), p.getErroragain(), p.getErrorhard(), p.getErrortable())
+                                    ));
+                                    if (difSmap.size() > 1) {
+                                        allStrBuilder.append("项目工号" + fm.getProjectdlprojid() + ",修改单编号" + fm.getSourcenumbercode() + ",内容序号" + sno + "有" + slm.size() + "行,但修改责任方、错误源头图号、设计人、校对人、审核人、常规错误、二过错误、较难发现错误、校对表错误有不同,请检查<br>");
                                     }
-                                } else {
-                                    secVos = qcsMdfFormDos.stream().filter(sv -> fm.getProjectdlprojid().equals(sv.getProjectdlprojid()) && fm.getSourcenumbercode().equals(sv.getSourcenumbercode()) && mvo.getSectionsn().equals(sv.getSectionsn())).collect(Collectors.toList());
-                                    if (secVos.size() == 0) {
-                                        sectionid = SecurityUtil.getUUID();
-                                        maxSectionSn.getAndSet(Integer.parseInt(mvo.getSectionsn()));
-                                    } else {
-                                        ImportMdfVo secVo = secVos.get(0);
-                                        StringBuilder sb = new StringBuilder();
-                                        if (!mvo.getModifyby().equals(secVo.getModifyby())) {
-                                            sb.append("修改责任方" + mvo.getModifyby() + "与系统修改责任方" + secVo.getModifyby() + "不同,");
-                                        }
-                                        if (!mvo.getErrordesigndtdrawingno().equals(secVo.getErrordesigndtdrawingno())) {
-                                            sb.append("错误源头图号" + mvo.getErrordesigndtdrawingno() + "与系统错误源头图号" + secVo.getErrordesigndtdrawingno() + "不同,");
-                                        }
-                                        if (!mvo.getDtdesigner().equals(secVo.getDtdesigner())) {
-                                            sb.append("设计人" + mvo.getDtdesigner() + "与系统设计人" + secVo.getDtdesigner() + "不同,");
-                                        }
-                                        if (!mvo.getDtwhocollate().equals(secVo.getDtwhocollate())) {
-                                            sb.append("校对人" + mvo.getDtwhocollate() + "与系统校对人" + secVo.getDtwhocollate() + "不同,");
-                                        }
-                                        if (!mvo.getDtwhoapprove().equals(secVo.getDtwhoapprove())) {
-                                            sb.append("审核人" + mvo.getDtwhoapprove() + "与系统审核人" + secVo.getDtwhoapprove() + "不同,");
-                                        }
-                                        if (!mvo.getErrorroutine().equals(secVo.getErrorroutine())) {
-                                            sb.append("常规错误" + mvo.getErrorroutine() + "与系统常规错误" + secVo.getErrorroutine() + "不同,");
-                                        }
-                                        if (!mvo.getErroragain().equals(secVo.getErroragain())) {
-                                            sb.append("二过错误" + mvo.getErroragain() + "与系统二过错误" + secVo.getErroragain() + "不同,");
-                                        }
-                                        if (!mvo.getErrorhard().equals(secVo.getErrorhard())) {
-                                            sb.append("较难发现错误" + mvo.getErrorhard() + "与系统较难发现错误" + secVo.getErrorhard() + "不同,");
-                                        }
-                                        if (!mvo.getErrortable().equals(secVo.getErrortable())) {
-                                            sb.append("校对表错误" + mvo.getErrortable() + "与系统校对表错误" + secVo.getErrortable() + "不同,");
-                                        }
+                                }
+                            });
 
-                                        if (StringUtils.isNotBlank(sb.toString())) {
-                                            allStrBuilder.append("项目工号" + fm.getProjectdlprojid() + ",修改单编号" + fm.getSourcenumbercode() + ",内容序号" + mvo.getSectionsn() + "已存在,但导入的数据" + sb.toString() + "请检查<br>");
+                            if (StringUtils.isBlank(allStrBuilder.toString())) {
+                                //序号分组 空值在后,有值正序在前
+                                Map<ImportMdfVo, List<ImportMdfVo>> mdfVoListMap = flist.stream()
+                                        .sorted(createReverseComparator("sectionsn"))
+                                        .collect(Collectors.groupingBy(
+                                                p -> new ImportMdfVo(p.getSectionsn(), p.getModifyby(), p.getErrordesigndtdrawingno(), p.getDtdesigner(), p.getDtwhocollate(), p.getDtwhoapprove(), p.getErrorroutine(), p.getErroragain(), p.getErrorhard(), p.getErrortable()),
+                                                LinkedHashMap::new,  // 保持分组顺序
+                                                Collectors.toList()
+                                        ));
+                                String finalFormid = formid;
+                                String finalFormid1 = formid;
+                                mdfVoListMap.forEach((mvo, slist) -> {
+//                                for (int s = 0; s < slist.size(); s++) {
+                                    List<ImportMdfVo> secVos;
+                                    String sectionid = "";
+                                    if (StringUtils.isBlank(mvo.getSectionsn())) {
+                                        sectionid = SecurityUtil.getUUID();
+                                        secVos = qcsMdfFormDos.stream().filter(sv -> fm.getProjectdlprojid().equals(sv.getProjectdlprojid()) && fm.getSourcenumbercode().equals(sv.getSourcenumbercode())).collect(Collectors.toList());
+                                        if (secVos.size() == 0 || maxSectionSn.get() != 0) {
+                                            maxSectionSn.getAndSet(maxSectionSn.get() + 1);
                                         } else {
-                                            sectionid = secVo.getSectionid();
+                                            maxSectionSn.getAndSet(Integer.parseInt(secVos.get(secVos.size() - 1).getSectionsn()) + 1);
+                                        }
+                                    } else {
+                                        secVos = qcsMdfFormDos.stream().filter(sv -> fm.getProjectdlprojid().equals(sv.getProjectdlprojid()) && fm.getSourcenumbercode().equals(sv.getSourcenumbercode()) && mvo.getSectionsn().equals(sv.getSectionsn())).collect(Collectors.toList());
+                                        if (secVos.size() == 0) {
+                                            sectionid = SecurityUtil.getUUID();
                                             maxSectionSn.getAndSet(Integer.parseInt(mvo.getSectionsn()));
+                                        } else {
+                                            ImportMdfVo secVo = secVos.get(0);
+                                            StringBuilder sb = new StringBuilder();
+                                            if (!mvo.getModifyby().equals(secVo.getModifyby())) {
+                                                sb.append("修改责任方" + mvo.getModifyby() + "与系统修改责任方" + secVo.getModifyby() + "不同,");
+                                            }
+                                            if (!mvo.getErrordesigndtdrawingno().equals(secVo.getErrordesigndtdrawingno())) {
+                                                sb.append("错误源头图号" + mvo.getErrordesigndtdrawingno() + "与系统错误源头图号" + secVo.getErrordesigndtdrawingno() + "不同,");
+                                            }
+                                            if (!mvo.getDtdesigner().equals(secVo.getDtdesigner())) {
+                                                sb.append("设计人" + mvo.getDtdesigner() + "与系统设计人" + secVo.getDtdesigner() + "不同,");
+                                            }
+                                            if (!mvo.getDtwhocollate().equals(secVo.getDtwhocollate())) {
+                                                sb.append("校对人" + mvo.getDtwhocollate() + "与系统校对人" + secVo.getDtwhocollate() + "不同,");
+                                            }
+                                            if (!mvo.getDtwhoapprove().equals(secVo.getDtwhoapprove())) {
+                                                sb.append("审核人" + mvo.getDtwhoapprove() + "与系统审核人" + secVo.getDtwhoapprove() + "不同,");
+                                            }
+                                            if (!mvo.getErrorroutine().equals(secVo.getErrorroutine())) {
+                                                sb.append("常规错误" + mvo.getErrorroutine() + "与系统常规错误" + secVo.getErrorroutine() + "不同,");
+                                            }
+                                            if (!mvo.getErroragain().equals(secVo.getErroragain())) {
+                                                sb.append("二过错误" + mvo.getErroragain() + "与系统二过错误" + secVo.getErroragain() + "不同,");
+                                            }
+                                            if (!mvo.getErrorhard().equals(secVo.getErrorhard())) {
+                                                sb.append("较难发现错误" + mvo.getErrorhard() + "与系统较难发现错误" + secVo.getErrorhard() + "不同,");
+                                            }
+                                            if (!mvo.getErrortable().equals(secVo.getErrortable())) {
+                                                sb.append("校对表错误" + mvo.getErrortable() + "与系统校对表错误" + secVo.getErrortable() + "不同,");
+                                            }
+
+                                            if (StringUtils.isNotBlank(sb.toString())) {
+                                                allStrBuilder.append("项目工号" + fm.getProjectdlprojid() + ",修改单编号" + fm.getSourcenumbercode() + ",内容序号" + mvo.getSectionsn() + "已存在,但导入的数据" + sb.toString() + "请检查<br>");
+                                            } else {
+                                                sectionid = secVo.getSectionid();
+                                                maxSectionSn.getAndSet(Integer.parseInt(mvo.getSectionsn()));
+                                            }
                                         }
                                     }
-                                }
-                                slist.get(0).setSectionsn(maxSectionSn.toString());
+                                    slist.get(0).setSectionsn(maxSectionSn.toString());
+
+                                    //按照排号分组
+                                    Map<String, List<ImportMdfVo>> rnoListMap = slist.stream().collect(Collectors.groupingBy(ImportMdfVo::getRowsn));
+                                    rnoListMap.forEach((rno, rlm) -> {
+                                        if (StringUtils.isNotBlank(rno)) {
+                                            Map<ImportMdfVo, List<ImportMdfVo>> difRMap = rlm.stream().collect(Collectors.groupingBy(
+                                                    m -> new ImportMdfVo(m.getContent(), m.getTaskdesigndtdrawingno(), m.getMinordesigndtdrawingno(), m.getMinordesigndtpartname())
+                                            ));
+                                            if (difRMap.size() > 1) {
+                                                allStrBuilder.append("项目工号" + fm.getProjectdlprojid() + ",修改单编号" + fm.getSourcenumbercode() + ",排号" + rno + "有" + rlm.size() + "行,但修改内容、修改图号(任务单部件)、修改图号(次级部件)、修改图名(次级部件)有不同,请检查<br>");
+                                            }
+                                        }
+                                    });
 
-                                if (StringUtils.isBlank(allStrBuilder.toString())) {
-                                    AtomicReference<Integer> maxRowSn = new AtomicReference<>(0);
-                                    //修改图号(任务单部件)分组
-                                    Map<ImportMdfVo, List<ImportMdfVo>> rowListMap = slist.stream().collect(Collectors.groupingBy(
-                                            m -> new ImportMdfVo(m.getContent(), m.getRowsn(), m.getRemark(), mvo.getTaskdesigndtdrawingno(), m.getMinordesigndtdrawingno(), m.getMinordesigndtpartname(), m.getDutydeptname(), m.getManday(), m.getMater(), m.getEquip(), m.getOther())
-                                    ));
-                                    String finalSectionid = sectionid;
-                                    rowListMap.forEach((rvo, rlist) -> {
-                                        for (int r = 0; r < rlist.size(); r++) {
-                                            String rowid = "";
-                                            String detailid = SecurityUtil.getUUID();
-                                            List<ImportMdfVo> secRowVos = qcsMdfFormDos.stream().filter(rv -> fm.getProjectdlprojid().equals(rv.getProjectdlprojid()) && fm.getSourcenumbercode().equals(rv.getSourcenumbercode()) && slist.get(0).getSectionsn().equals(rv.getSectionsn())).collect(Collectors.toList());
-                                            List<ImportMdfVo> rowVos;
-                                            if (StringUtils.isBlank(rlist.get(r).getRowsn())) {
-                                                rowid = SecurityUtil.getUUID();
-                                                if (secRowVos.size() == 0) {
-                                                    maxRowSn.getAndSet(maxRowSn.get() + 1);
-                                                } else {
-                                                    maxRowSn.getAndSet(Integer.parseInt(secRowVos.get(secRowVos.size() - 1).getRowsn()) + 1);
-                                                }
-                                            } else {
-                                                int finalR = r;
-                                                rowVos = qcsMdfFormDos.stream().filter(rv -> fm.getProjectdlprojid().equals(rv.getProjectdlprojid()) && fm.getSourcenumbercode().equals(rv.getSourcenumbercode()) && slist.get(0).getSectionsn().equals(rv.getSectionsn()) && rlist.get(finalR).getRowsn().equals(rv.getRowsn())).collect(Collectors.toList());
-                                                if (rowVos.size() == 0) {
+                                    if (StringUtils.isBlank(allStrBuilder.toString())) {
+                                        AtomicReference<Integer> maxRowSn = new AtomicReference<>(0);
+                                        //排号分组 空值在后,有值正序在前
+                                        Map<ImportMdfVo, List<ImportMdfVo>> rowListMap = slist.stream()
+                                                .sorted(createReverseComparator("rowsn"))
+                                                .collect(Collectors.groupingBy(
+                                                        m -> new ImportMdfVo(m.getContent(), m.getRowsn(), m.getTaskdesigndtdrawingno(), m.getMinordesigndtdrawingno(), m.getMinordesigndtpartname(), m.getDutydeptname(), m.getManday(), m.getMater(), m.getEquip(), m.getOther()),
+                                                        LinkedHashMap::new,  // 保持分组顺序
+                                                        Collectors.toList()
+                                                ));
+                                        String finalSectionid = sectionid;
+                                        rowListMap.forEach((rvo, rlist) -> {
+                                            for (int r = 0; r < rlist.size(); r++) {
+                                                String rowid = "";
+                                                String detailid = SecurityUtil.getUUID();
+                                                List<ImportMdfVo> secRowVos = qcsMdfFormDos.stream().filter(rv -> fm.getProjectdlprojid().equals(rv.getProjectdlprojid()) && fm.getSourcenumbercode().equals(rv.getSourcenumbercode()) && slist.get(0).getSectionsn().equals(rv.getSectionsn())).collect(Collectors.toList());
+                                                if (StringUtils.isBlank(rvo.getRowsn())) {
                                                     rowid = SecurityUtil.getUUID();
-                                                    if (secRowVos.size() == 0) {
+                                                    if (secRowVos.size() == 0 || maxRowSn.get() != 0) {
                                                         maxRowSn.getAndSet(maxRowSn.get() + 1);
                                                     } else {
                                                         maxRowSn.getAndSet(Integer.parseInt(secRowVos.get(secRowVos.size() - 1).getRowsn()) + 1);
                                                     }
                                                 } else {
-                                                    ImportMdfVo rowVo = qcsMdfFormDos.stream().filter(rv -> fm.getProjectdlprojid().equals(rv.getProjectdlprojid()) && fm.getSourcenumbercode().equals(rv.getSourcenumbercode()) && slist.get(0).getSectionsn().equals(rv.getSectionsn()) && rlist.get(finalR).getRowsn().equals(rv.getRowsn()) && unitId.equals(rv.getDeptid())).findAny().orElse(null);
+                                                    int finalR = r;
+                                                    ImportMdfVo rowVo = qcsMdfFormDos.stream().filter(rv -> fm.getProjectdlprojid().equals(rv.getProjectdlprojid()) && fm.getSourcenumbercode().equals(rv.getSourcenumbercode()) && slist.get(0).getSectionsn().equals(rv.getSectionsn()) && rvo.getRowsn().equals(rv.getRowsn()) && rlist.get(finalR).getRemark().equals(rv.getRemark())).findAny().orElse(null);
                                                     if (rowVo == null) {
                                                         rowid = SecurityUtil.getUUID();
-                                                        if (secRowVos.size() == 0) {
-                                                            maxRowSn.getAndSet(maxRowSn.get() + 1);
-                                                        } else {
-                                                            maxRowSn.getAndSet(Integer.parseInt(secRowVos.get(secRowVos.size() - 1).getRowsn()) + 1);
-                                                        }
+                                                        maxRowSn.getAndSet(Integer.parseInt(rvo.getRowsn()));
                                                     } else {
-                                                        if (!rlist.get(r).getRemark().equals(rowVo.getRemark())) {
-                                                            rowid = SecurityUtil.getUUID();
-                                                            if (secRowVos.size() == 0) {
-                                                                maxRowSn.getAndSet(maxRowSn.get() + 1);
-                                                            } else {
-                                                                maxRowSn.getAndSet(Integer.parseInt(secRowVos.get(secRowVos.size() - 1).getRowsn()) + 1);
-                                                            }
+//                                                        if (!rlist.get(r).getRemark().equals(rowVo.getRemark())) {
+//                                                            rowid = SecurityUtil.getUUID();
+//                                                            maxRowSn.getAndSet(Integer.parseInt(rvo.getRowsn()) + 1);
+//                                                        } else {
+                                                        if (rowVo.getStatus().equals("已提交") && rowVo.getDeptid().equals(unitId)) {
+                                                            allStrBuilder.append("项目工号" + fm.getProjectdlprojid() + ",修改单编号" + fm.getSourcenumbercode() + ",内容序号" + mvo.getSectionsn() + ",排号" + rvo.getRowsn() + "数据已提交,请检查<br>");
                                                         } else {
-                                                            if (rowVo.getStatus().equals("已提交")) {
-                                                                allStrBuilder.append("项目工号" + fm.getProjectdlprojid() + ",修改单编号" + fm.getSourcenumbercode() + ",内容序号" + mvo.getSectionsn() + ",排号" + rlist.get(r).getRowsn() + "数据已提交,请检查<br>");
-                                                            } else {
-                                                                StringBuilder sb = new StringBuilder();
-                                                                if (!rlist.get(r).getContent().equals(rowVo.getContent())) {
-                                                                    sb.append("修改内容" + rlist.get(r).getContent() + "与系统修改内容" + rowVo.getContent() + "不同,");
-                                                                }
-                                                                if (!rlist.get(r).getTaskdesigndtdrawingno().equals(rowVo.getTaskdesigndtdrawingno())) {
-                                                                    sb.append("修改图号(任务单部件)" + rlist.get(r).getTaskdesigndtdrawingno() + "与系统修改图号(任务单部件)" + rowVo.getTaskdesigndtdrawingno() + "不同,");
-                                                                }
-                                                                if (!rlist.get(r).getMinordesigndtdrawingno().equals(rowVo.getMinordesigndtdrawingno())) {
-                                                                    sb.append("修改图号(次级部件)" + rlist.get(r).getMinordesigndtdrawingno() + "与系统修改图号(次级部件)" + rowVo.getMinordesigndtdrawingno() + "不同,");
-                                                                }
-                                                                if (!rlist.get(r).getMinordesigndtpartname().equals(rowVo.getMinordesigndtpartname())) {
-                                                                    sb.append("修改图名(次级部件)" + rlist.get(r).getMinordesigndtpartname() + "与系统修改图名(次级部件)" + rowVo.getMinordesigndtpartname() + "不同,");
-                                                                }
+                                                            StringBuilder sb = new StringBuilder();
+                                                            if (!rvo.getContent().equals(rowVo.getContent())) {
+                                                                sb.append("修改内容" + rvo.getContent() + "与系统修改内容" + rowVo.getContent() + "不同,");
+                                                            }
+                                                            if (!rvo.getTaskdesigndtdrawingno().equals(rowVo.getTaskdesigndtdrawingno())) {
+                                                                sb.append("修改图号(任务单部件)" + rvo.getTaskdesigndtdrawingno() + "与系统修改图号(任务单部件)" + rowVo.getTaskdesigndtdrawingno() + "不同,");
+                                                            }
+                                                            if (!rvo.getMinordesigndtdrawingno().equals(rowVo.getMinordesigndtdrawingno())) {
+                                                                sb.append("修改图号(次级部件)" + rvo.getMinordesigndtdrawingno() + "与系统修改图号(次级部件)" + rowVo.getMinordesigndtdrawingno() + "不同,");
+                                                            }
+                                                            if (!rvo.getMinordesigndtpartname().equals(rowVo.getMinordesigndtpartname())) {
+                                                                sb.append("修改图名(次级部件)" + rvo.getMinordesigndtpartname() + "与系统修改图名(次级部件)" + rowVo.getMinordesigndtpartname() + "不同,");
+                                                            }
 
-                                                                if (StringUtils.isNotBlank(sb.toString())) {
-                                                                    allStrBuilder.append("项目工号" + fm.getProjectdlprojid() + ",修改单编号" + fm.getSourcenumbercode() + ",内容序号" + mvo.getSectionsn() + ",排号" + rlist.get(r).getRowsn() + "已存在,但导入的数据" + sb.toString() + "请检查<br>");
-                                                                } else {
-                                                                    rowid = rowVo.getRowid();
+                                                            if (StringUtils.isNotBlank(sb.toString())) {
+                                                                allStrBuilder.append("项目工号" + fm.getProjectdlprojid() + ",修改单编号" + fm.getSourcenumbercode() + ",内容序号" + mvo.getSectionsn() + ",排号" + rvo.getRowsn() + "已存在,但导入的数据" + sb.toString() + "请检查<br>");
+                                                            } else {
+                                                                rowid = rowVo.getRowid();
+                                                                if (rowVo.getDeptid().equals(unitId)) {
                                                                     detailid = rowVo.getDetailid();
-                                                                    maxRowSn.getAndSet(Integer.parseInt(rlist.get(r).getRowsn()));
                                                                 }
+                                                                maxRowSn.getAndSet(Integer.parseInt(rvo.getRowsn()));
                                                             }
                                                         }
+//                                                        }
                                                     }
                                                 }
-                                            }
-                                            rlist.get(r).setRowsn(maxRowSn.toString());
-
-                                            if (StringUtils.isBlank(allStrBuilder.toString())) {
-                                                QcsMdfRowDo qcsMdfRowDo = BeanUtil.toBean(rlist.get(r), QcsMdfRowDo.class);
-                                                qcsMdfRowDo.setId(rowid);
-                                                qcsMdfRowDo.setRowsn(slist.get(0).getSectionsn() + "-" + qcsMdfRowDo.getRowsn());
-                                                qcsMdfRowDo.setFormid(finalFormid);
-                                                qcsMdfRowDo.setSectionid(finalSectionid);
-                                                qcsMdfRowDo.setRoption(ropJson);
-                                                qcsMdfRowDoList.add(qcsMdfRowDo);
-
-                                                QcsMdfDetailDo qcsMdfDetailDo = BeanUtil.toBean(rlist.get(r), QcsMdfDetailDo.class);
-                                                qcsMdfDetailDo.setId(detailid);
-                                                qcsMdfDetailDo.setRowid(rowid);
-                                                qcsMdfDetailDo.setFormid(finalFormid);
-                                                qcsMdfDetailDo.setSectionid(finalSectionid);
-                                                qcsMdfDetailDo.setRoption(ropJson);
-                                                qcsMdfDetailDo.setDeptid(unitId);
-                                                qcsMdfDetailDo.setDeptname(finalDeptName);
-                                                qcsMdfDetailDo.setMdfreason(flist.get(0).getSourcename());
-                                                if (rlist.get(r).getProducename().equals("未下料")) {
-                                                    qcsMdfDetailDo.setManday(null);
-                                                    qcsMdfDetailDo.setMater(null);
-                                                    qcsMdfDetailDo.setEquip(null);
-                                                    qcsMdfDetailDo.setOther(null);
-                                                } else {
-                                                    BigDecimal total = sumTotal(qcsMdfDetailDo);
-                                                    qcsMdfDetailDo.setTotalamount(total);
-                                                    qcsMdfDetailDo.setActamount(total);
-                                                }
-                                                if (finalResDutyList.size() > 0) {
-                                                    qcsMdfDetailDo.setDutydeptid(finalResDutyList.get(0).get("DUTYDEPTID"));
-                                                    qcsMdfDetailDo.setDutydeptname(finalResDutyList.get(0).get("DUTYDEPTNAME"));
-                                                } else if (flist.get(0).getSourcename() != null && flist.get(0).getSourcename().equals("基地要求")) {
-                                                    qcsMdfDetailDo.setDutydeptid(unitId);
-                                                    qcsMdfDetailDo.setDutydeptname(finalDeptName);
+                                                rlist.get(r).setRowsn(maxRowSn.toString());
+
+                                                if (StringUtils.isBlank(allStrBuilder.toString())) {
+                                                    QcsMdfRowDo qcsMdfRowDo = BeanUtil.toBean(rlist.get(r), QcsMdfRowDo.class);
+                                                    qcsMdfRowDo.setId(rowid);
+                                                    qcsMdfRowDo.setRowsn(slist.get(0).getSectionsn() + "-" + qcsMdfRowDo.getRowsn());
+                                                    qcsMdfRowDo.setFormid(finalFormid);
+                                                    qcsMdfRowDo.setSectionid(finalSectionid);
+                                                    qcsMdfRowDo.setRoption(ropJson);
+                                                    qcsMdfRowDoList.add(qcsMdfRowDo);
+
+                                                    QcsMdfDetailDo qcsMdfDetailDo = BeanUtil.toBean(rlist.get(r), QcsMdfDetailDo.class);
+                                                    qcsMdfDetailDo.setId(detailid);
+                                                    qcsMdfDetailDo.setRowid(rowid);
+                                                    qcsMdfDetailDo.setFormid(finalFormid);
+                                                    qcsMdfDetailDo.setSectionid(finalSectionid);
+                                                    qcsMdfDetailDo.setRoption(ropJson);
+                                                    qcsMdfDetailDo.setDeptid(unitId);
+                                                    qcsMdfDetailDo.setDeptname(finalDeptName);
+                                                    qcsMdfDetailDo.setMdfreason(flist.get(0).getSourcename());
+                                                    if (rlist.get(r).getProducename().equals("未下料")) {
+                                                        qcsMdfDetailDo.setManday(null);
+                                                        qcsMdfDetailDo.setMater(null);
+                                                        qcsMdfDetailDo.setEquip(null);
+                                                        qcsMdfDetailDo.setOther(null);
+                                                    } else {
+                                                        qcsMdfDetailDo.setManday(qcsMdfDetailDo.getManday() == null ? new BigDecimal(0) : qcsMdfDetailDo.getManday());
+                                                        qcsMdfDetailDo.setMater(qcsMdfDetailDo.getMater() == null ? new BigDecimal(0) : qcsMdfDetailDo.getMater());
+                                                        qcsMdfDetailDo.setEquip(qcsMdfDetailDo.getEquip() == null ? new BigDecimal(0) : qcsMdfDetailDo.getEquip());
+                                                        qcsMdfDetailDo.setOther(qcsMdfDetailDo.getOther() == null ? new BigDecimal(0) : qcsMdfDetailDo.getOther());
+                                                        BigDecimal total = sumTotal(qcsMdfDetailDo);
+                                                        qcsMdfDetailDo.setTotalamount(total);
+                                                        qcsMdfDetailDo.setActamount(total);
+                                                    }
+                                                    if (finalResDutyList.size() > 0) {
+                                                        qcsMdfDetailDo.setDutydeptid(finalResDutyList.get(0).get("DUTYDEPTID"));
+                                                        qcsMdfDetailDo.setDutydeptname(finalResDutyList.get(0).get("DUTYDEPTNAME"));
+                                                    } else if (flist.get(0).getSourcename() != null && flist.get(0).getSourcename().equals("基地要求")) {
+                                                        qcsMdfDetailDo.setDutydeptid(unitId);
+                                                        qcsMdfDetailDo.setDutydeptname(finalDeptName);
+                                                    }
+                                                    qcsMdfDetailDoList.add(qcsMdfDetailDo);
                                                 }
-                                                qcsMdfDetailDoList.add(qcsMdfDetailDo);
                                             }
-                                        }
-                                    });
-                                }
+                                        });
+                                    }
 
-                                if (StringUtils.isBlank(allStrBuilder.toString())) {
-                                    QcsMdfSectionDo qcsMdfSectionDo = BeanUtil.toBean(slist.get(0), QcsMdfSectionDo.class);
-                                    qcsMdfSectionDo.setId(sectionid);
-                                    qcsMdfSectionDo.setFormid(finalFormid1);
-                                    qcsMdfSectionDo.setRoption(ropJson);
-                                    qcsMdfSectionDoList.add(qcsMdfSectionDo);
-                                }
+                                    if (StringUtils.isBlank(allStrBuilder.toString())) {
+                                        QcsMdfSectionDo qcsMdfSectionDo = BeanUtil.toBean(slist.get(0), QcsMdfSectionDo.class);
+                                        qcsMdfSectionDo.setId(sectionid);
+                                        qcsMdfSectionDo.setFormid(finalFormid1);
+                                        qcsMdfSectionDo.setRoption(ropJson);
+                                        qcsMdfSectionDoList.add(qcsMdfSectionDo);
+                                    }
 //                                }
-                            });
+                                });
+                            }
                             if (StringUtils.isBlank(allStrBuilder.toString())) {
                                 QcsMdfFormDo qcsMdfFormDo = BeanUtil.toBean(flist.get(0), QcsMdfFormDo.class);
                                 qcsMdfFormDo.setId(formid);
@@ -893,6 +985,7 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
                 return R.error("没有要导入的数据,请确认");
             }
         }
+//        return R.ok();
 
         if (StringUtils.isNotBlank(allStrBuilder.toString())) {
             return R.error(allStrBuilder.toString());
@@ -917,6 +1010,28 @@ public class QcsMdfFormServiceImpl extends ServiceImpl<QcsMdfFormDao, QcsMdfForm
         }
     }
 
+    private Comparator<ImportMdfVo> createReverseComparator(String sortField) {
+        return (p1, p2) -> {
+            try {
+                java.lang.reflect.Field f = ImportMdfVo.class.getDeclaredField(sortField);
+                f.setAccessible(true);
+                Comparable val1 = (Comparable) f.get(p1);
+                Comparable val2 = (Comparable) f.get(p2);
+
+                // 两个都为null,视为相等
+                if (val1 == "" && val2 == "") return 0;
+                // 只有val1为null,val2排前面
+                if (val1 == "") return 1;
+                // 只有val2为null,val1排前面
+                if (val2 == "") return -1;
+                // 两个都不为null,按正序排列
+                return val1.compareTo(val2);
+            } catch (Exception e) {
+                throw new RuntimeException("分组排序失败", e);
+            }
+        };
+    }
+
     //正整数
     public static boolean isPositiveInteger(String str) {
         return str != null && str.matches("\\d+") && !str.startsWith("0");

+ 36 - 2
qcs-entity/src/main/java/com/rongwei/bsentity/vo/ImportMdfVo.java

@@ -82,11 +82,31 @@ public class ImportMdfVo {
         this.errortable = errortable;
     }
 
+    //序号分组
+    public ImportMdfVo(String modifyby, String errordesigndtdrawingno, String dtdesigner, String dtwhocollate, String dtwhoapprove, String errorroutine, String erroragain, String errorhard, String errortable) {
+        this.modifyby = modifyby;
+        this.errordesigndtdrawingno = errordesigndtdrawingno;
+        this.dtdesigner = dtdesigner;
+        this.dtwhocollate = dtwhocollate;
+        this.dtwhoapprove = dtwhoapprove;
+        this.errorroutine = errorroutine;
+        this.erroragain = erroragain;
+        this.errorhard = errorhard;
+        this.errortable = errortable;
+    }
+
     //排号分组
-    public ImportMdfVo(String content, String rowsn, String remark, String taskdesigndtdrawingno, String minordesigndtdrawingno, String minordesigndtpartname, String dutydeptname, BigDecimal manday, BigDecimal mater, BigDecimal equip, BigDecimal other) {
+    public ImportMdfVo(String content, String taskdesigndtdrawingno, String minordesigndtdrawingno, String minordesigndtpartname) {
+        this.content = content;
+        this.taskdesigndtdrawingno = taskdesigndtdrawingno;
+        this.minordesigndtdrawingno = minordesigndtdrawingno;
+        this.minordesigndtpartname = minordesigndtpartname;
+    }
+
+    //排号明细分组
+    public ImportMdfVo(String content, String rowsn, String taskdesigndtdrawingno, String minordesigndtdrawingno, String minordesigndtpartname, String dutydeptname, BigDecimal manday, BigDecimal mater, BigDecimal equip, BigDecimal other) {
         this.content = content;
         this.rowsn = rowsn;
-        this.remark = remark;
         this.taskdesigndtdrawingno = taskdesigndtdrawingno;
         this.minordesigndtdrawingno = minordesigndtdrawingno;
         this.minordesigndtpartname = minordesigndtpartname;
@@ -102,4 +122,18 @@ public class ImportMdfVo {
         this.projectdlprojid = projectdlprojid;
         this.sourcenumbercode = sourcenumbercode;
     }
+
+    public ImportMdfVo(String id, String sectionid, String sectionsn) {
+        this.id = id;
+        this.sectionid = sectionid;
+        this.sectionsn = sectionsn;
+    }
+
+    public ImportMdfVo(String id, String sectionid, String sectionsn, String rowid, String rowsn) {
+        this.id = id;
+        this.sectionid = sectionid;
+        this.sectionsn = sectionsn;
+        this.rowid = rowid;
+        this.rowsn = rowsn;
+    }
 }