zhuang 1 месяц назад
Родитель
Сommit
299f380a04
16 измененных файлов с 837 добавлено и 9 удалено
  1. 16 0
      business-common/src/main/java/com/rongwei/bscommon/sys/dao/ZhcxAreaDao.java
  2. 16 0
      business-common/src/main/java/com/rongwei/bscommon/sys/dao/ZhcxPersistentBaseInfoDao.java
  3. 16 0
      business-common/src/main/java/com/rongwei/bscommon/sys/dao/ZhcxSubcontractorManageDao.java
  4. 16 0
      business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxAreaService.java
  5. 16 0
      business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxPersistentBaseInfoService.java
  6. 3 0
      business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxPersistentManageService.java
  7. 16 0
      business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxSubcontractorManageService.java
  8. 20 0
      business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxSubcontractorManageServiceImpl.java
  9. 20 0
      business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxAreaServiceImpl.java
  10. 20 0
      business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxPersistentBaseInfoServiceImpl.java
  11. 376 4
      business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxPersistentManageServiceImpl.java
  12. 89 0
      business-entity/src/main/java/com/rongwei/bsentity/domain/ZhcxAreaDo.java
  13. 1 1
      business-entity/src/main/java/com/rongwei/bsentity/domain/ZhcxPersistentBaseInfoDo.java
  14. 10 0
      business-entity/src/main/java/com/rongwei/bsentity/domain/ZhcxPersistentManageDo.java
  15. 180 0
      business-entity/src/main/java/com/rongwei/bsentity/domain/ZhcxSubcontractorManageDo.java
  16. 22 4
      business-server/src/main/java/com/rongwei/bsserver/controller/ZhcxPersistentController.java

+ 16 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/dao/ZhcxAreaDao.java

@@ -0,0 +1,16 @@
+package com.rongwei.bscommon.sys.dao;
+
+import com.rongwei.bsentity.domain.ZhcxAreaDo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author dlc
+ * @since 2025-08-12
+ */
+public interface ZhcxAreaDao extends BaseMapper<ZhcxAreaDo> {
+
+}

+ 16 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/dao/ZhcxPersistentBaseInfoDao.java

@@ -0,0 +1,16 @@
+package com.rongwei.bscommon.sys.dao;
+
+import com.rongwei.bsentity.domain.ZhcxPersistentBaseInfoDo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 质量奖惩条例库子表(顽症条例库) Mapper 接口
+ * </p>
+ *
+ * @author dlc
+ * @since 2025-08-12
+ */
+public interface ZhcxPersistentBaseInfoDao extends BaseMapper<ZhcxPersistentBaseInfoDo> {
+
+}

+ 16 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/dao/ZhcxSubcontractorManageDao.java

@@ -0,0 +1,16 @@
+package com.rongwei.bscommon.sys.dao;
+
+import com.rongwei.bsentity.domain.ZhcxSubcontractorManageDo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 分包商管理 Mapper 接口
+ * </p>
+ *
+ * @author dlc
+ * @since 2025-08-12
+ */
+public interface ZhcxSubcontractorManageDao extends BaseMapper<ZhcxSubcontractorManageDo> {
+
+}

+ 16 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxAreaService.java

@@ -0,0 +1,16 @@
+package com.rongwei.bscommon.sys.service;
+
+import com.rongwei.bsentity.domain.ZhcxAreaDo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author dlc
+ * @since 2025-08-12
+ */
+public interface ZhcxAreaService extends IService<ZhcxAreaDo> {
+
+}

+ 16 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxPersistentBaseInfoService.java

@@ -0,0 +1,16 @@
+package com.rongwei.bscommon.sys.service;
+
+import com.rongwei.bsentity.domain.ZhcxPersistentBaseInfoDo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 质量奖惩条例库子表(顽症条例库) 服务类
+ * </p>
+ *
+ * @author dlc
+ * @since 2025-08-12
+ */
+public interface ZhcxPersistentBaseInfoService extends IService<ZhcxPersistentBaseInfoDo> {
+
+}

+ 3 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxPersistentManageService.java

@@ -1,9 +1,11 @@
 package com.rongwei.bscommon.sys.service;
 
+import com.aspose.cells.Workbook;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.rongwei.bsentity.domain.ZhcxPersistentManageDo;
 import com.rongwei.bsentity.dto.ZhcxPersistentReportDto;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 import java.util.Map;
@@ -24,4 +26,5 @@ public interface ZhcxPersistentManageService extends IService<ZhcxPersistentMana
 
     void issueExcelExport(Map<String, Object> map, HttpServletResponse response);
 
+    StringBuilder excelImport(Workbook book, HttpServletRequest request);
 }

+ 16 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxSubcontractorManageService.java

@@ -0,0 +1,16 @@
+package com.rongwei.bscommon.sys.service;
+
+import com.rongwei.bsentity.domain.ZhcxSubcontractorManageDo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 分包商管理 服务类
+ * </p>
+ *
+ * @author dlc
+ * @since 2025-08-12
+ */
+public interface ZhcxSubcontractorManageService extends IService<ZhcxSubcontractorManageDo> {
+
+}

+ 20 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxSubcontractorManageServiceImpl.java

@@ -0,0 +1,20 @@
+package com.rongwei.bscommon.sys.service.impl;
+
+import com.rongwei.bsentity.domain.ZhcxSubcontractorManageDo;
+import com.rongwei.bscommon.sys.dao.ZhcxSubcontractorManageDao;
+import com.rongwei.bscommon.sys.service.ZhcxSubcontractorManageService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 分包商管理 服务实现类
+ * </p>
+ *
+ * @author dlc
+ * @since 2025-08-12
+ */
+@Service
+public class ZhcxSubcontractorManageServiceImpl extends ServiceImpl<ZhcxSubcontractorManageDao, ZhcxSubcontractorManageDo> implements ZhcxSubcontractorManageService {
+
+}

+ 20 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxAreaServiceImpl.java

@@ -0,0 +1,20 @@
+package com.rongwei.bscommon.sys.service.impl;
+
+import com.rongwei.bsentity.domain.ZhcxAreaDo;
+import com.rongwei.bscommon.sys.dao.ZhcxAreaDao;
+import com.rongwei.bscommon.sys.service.ZhcxAreaService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author dlc
+ * @since 2025-08-12
+ */
+@Service
+public class ZhcxAreaServiceImpl extends ServiceImpl<ZhcxAreaDao, ZhcxAreaDo> implements ZhcxAreaService {
+
+}

+ 20 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxPersistentBaseInfoServiceImpl.java

@@ -0,0 +1,20 @@
+package com.rongwei.bscommon.sys.service.impl;
+
+import com.rongwei.bsentity.domain.ZhcxPersistentBaseInfoDo;
+import com.rongwei.bscommon.sys.dao.ZhcxPersistentBaseInfoDao;
+import com.rongwei.bscommon.sys.service.ZhcxPersistentBaseInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 质量奖惩条例库子表(顽症条例库) 服务实现类
+ * </p>
+ *
+ * @author dlc
+ * @since 2025-08-12
+ */
+@Service
+public class ZhcxPersistentBaseInfoServiceImpl extends ServiceImpl<ZhcxPersistentBaseInfoDao, ZhcxPersistentBaseInfoDo> implements ZhcxPersistentBaseInfoService {
+
+}

+ 376 - 4
business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxPersistentManageServiceImpl.java

@@ -15,15 +15,22 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.rongwei.bscommon.sys.dao.ZhcxPersistentManageDao;
-import com.rongwei.bscommon.sys.service.ZhcxDeptPeopleCountService;
-import com.rongwei.bscommon.sys.service.ZhcxPersistentManageService;
+import com.rongwei.bscommon.sys.service.*;
+import com.rongwei.bscommon.sys.utils.ZhcxCommon;
 import com.rongwei.bsentity.domain.*;
 import com.rongwei.bsentity.dto.PersistentDeptDto;
 import com.rongwei.bsentity.dto.ZhcxPersistentManageDto;
 import com.rongwei.bsentity.dto.ZhcxPersistentReportDto;
 import com.rongwei.bsentity.vo.*;
+import com.rongwei.commonservice.serial.service.SysSerialNumberService;
+import com.rongwei.rwadmincommon.system.domain.SysDictDo;
 import com.rongwei.rwadmincommon.system.domain.SysOrganizationDo;
+import com.rongwei.rwadmincommon.system.domain.SysUserDo;
+import com.rongwei.rwadmincommon.system.service.SysDictService;
 import com.rongwei.rwadmincommon.system.service.SysOrganizationService;
+import com.rongwei.rwadmincommon.system.service.SysUserService;
+import com.rongwei.rwadmincommon.system.vo.SysOrganizationVo;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import com.rongwei.rwcommon.base.R;
 import com.rongwei.rwcommon.base.exception.CustomException;
 import com.rongwei.rwcommon.utils.SecurityUtil;
@@ -35,6 +42,7 @@ import com.rongwei.rwcommoncomponent.excel.utils.WordHelpUtils;
 import com.rongwei.rwcommoncomponent.excel.vo.FormData;
 import com.rongwei.rwcommoncomponent.file.service.SysFileItemService;
 import com.rongwei.rwcommonentity.commonservers.domain.SysFileItemDo;
+import com.rongwei.rwcommonentity.commonservers.vo.SysSerialVo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -43,17 +51,22 @@ import org.springframework.http.*;
 import org.springframework.stereotype.Service;
 import org.springframework.web.client.RestTemplate;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.InputStream;
 import java.lang.reflect.Field;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
 import java.time.temporal.WeekFields;
 import java.util.List;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -67,6 +80,8 @@ public class ZhcxPersistentManageServiceImpl extends ServiceImpl<ZhcxPersistentM
     @Autowired
     private ZhcxPersistentManageDao zhcxPersistentManageDao;
     @Autowired
+    private ZhcxPersistentManageService service;
+    @Autowired
     private SysFileItemService sysFileItemService;
     @Autowired
     private SysOrganizationService sysOrganizationService;
@@ -74,6 +89,24 @@ public class ZhcxPersistentManageServiceImpl extends ServiceImpl<ZhcxPersistentM
     private ZhcxDeptPeopleCountService zhcxDeptPeopleCountService;
     @Autowired
     private ExcelUtils excelUtils;
+    @Autowired
+    private SysDictService sysDictService;
+    @Autowired
+    private ZhcxCommon zhcxCommon;
+    @Autowired
+    private SysUserService userService;
+    @Autowired
+    private ZhcxQualityAwardService qualityAwardService;
+    @Autowired
+    private ZhcxPersistentBaseInfoService persistentBaseInfoService;
+    @Autowired
+    private ZhcxSubcontractorManageService subcontractorManageService;
+    @Autowired
+    private ZhcxAreaService zhcxAreaService;
+    @Autowired
+    private ZhcxProjectManageService projectManageService;
+    @Autowired
+    private SysSerialNumberService sysSerialNumberService;
 
     @Value("${wz-provider.syncWzDataUrl}")
     private String syncWzDataUrl;
@@ -90,6 +123,17 @@ public class ZhcxPersistentManageServiceImpl extends ServiceImpl<ZhcxPersistentM
         defaultSortMap.put("重装项目部", 6);
         defaultSortMap.put("供应链管理部", 7);
     }
+    private static final List<SimpleDateFormat> SIMPLE_DATE_FORMATS_LIST = new ArrayList<SimpleDateFormat>() {{
+        add(new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH));
+        add(new SimpleDateFormat("yyyy/MM/dd", Locale.ENGLISH));
+        add(new SimpleDateFormat("yyyy年MM月dd日", Locale.ENGLISH));
+        add(new SimpleDateFormat("yyyy.MM.dd", Locale.ENGLISH));
+        add(new SimpleDateFormat("yyyy年MM月", Locale.ENGLISH));
+        add(new SimpleDateFormat("yyyy/MM", Locale.ENGLISH));
+        add(new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH));
+        add(new SimpleDateFormat("yyyyMM", Locale.ENGLISH));
+        add(new SimpleDateFormat("yyyy-MM", Locale.ENGLISH));
+    }};
 
     @Override
     public void wordExport(Map<String, Object> map, HttpServletResponse response) {
@@ -626,7 +670,7 @@ public class ZhcxPersistentManageServiceImpl extends ServiceImpl<ZhcxPersistentM
             throw  new CustomException("导出报错,请联系管理员");
         }
         String type = (String) typeObj;
-        int maxRow = 31;
+        //int maxRow = 31;
         SysFileItemDo fileItemDo = null;
         if ("油漆".equals(type)) {
             //map.put("fill","油漆保护专项");
@@ -634,7 +678,7 @@ public class ZhcxPersistentManageServiceImpl extends ServiceImpl<ZhcxPersistentM
         }else if("焊接".equals(type)){
             //map.put("fill","焊接通病治理");
             fileItemDo = sysFileItemService.getById("c34b09e16d1c48c6a40f92d19f7a2397");
-            maxRow = 26;
+            //maxRow = 26;
         }
         List<Map<String, Object>> result = zhcxPersistentManageDao.listGroupData(map);
         Map<String, Map<String, Integer>> pivotData = new LinkedHashMap<>();
@@ -658,6 +702,7 @@ public class ZhcxPersistentManageServiceImpl extends ServiceImpl<ZhcxPersistentM
             Workbook wb = ExcelHelpUtils.getWorkbook(fileItemDo.getFullpath());
             Worksheet sheet = wb.getWorksheets().get(0);
             Cells cells = sheet.getCells();
+            int maxRow = cells.getMaxDataRow();
             // 读取公司列映射(第 2 行)
             Map<String, Integer> companyColMap = new HashMap<>();
             int maxCol = 9;
@@ -672,6 +717,9 @@ public class ZhcxPersistentManageServiceImpl extends ServiceImpl<ZhcxPersistentM
             Map<String, Integer> typeRowMap = new HashMap<>();
             for (int row = 2; row <= maxRow; row++) {
                 String issueType = cells.get(row, 0).getStringValue().trim();
+                if(!issueType.isEmpty() && issueType.contains("小计")){
+                    break;
+                }
                 if (!issueType.isEmpty()) {
                     typeRowMap.put(issueType, row);
                 }
@@ -704,6 +752,330 @@ public class ZhcxPersistentManageServiceImpl extends ServiceImpl<ZhcxPersistentM
         }
     }
 
+    @Override
+    public StringBuilder excelImport(Workbook book, HttpServletRequest request) {
+        StringBuilder errmsg = new StringBuilder();
+        try {
+            Map<String, ZhcxProjectManageDo> prjMap = new HashMap<>(4);
+            Worksheet worksheet = book.getWorksheets().get(0);
+            Cells cells = worksheet.getCells();
+            List<String> dictTypeList = Arrays.asList("persistent_fill", "persistent_type", "persistent_rectify_clu","persistent_process");
+            Map<String, List<SysDictDo>> dictTypeAndListMap = sysDictService.getDictsByTypes(dictTypeList);
+            List<SysDictDo> fillList = dictTypeAndListMap.get("persistent_fill");
+            List<SysDictDo> typeList = dictTypeAndListMap.get("persistent_type");
+            List<SysDictDo> rectifyCluList = dictTypeAndListMap.get("persistent_rectify_clu");
+            List<SysDictDo> processList = dictTypeAndListMap.get("persistent_process");
+            SysUserVo currentUser = zhcxCommon.getCurrentUser();
+            List<SysOrganizationVo> organizationDoList = currentUser.getOrganizationDoList();
+            LambdaQueryWrapper<SysUserDo> userWrapper = Wrappers.<SysUserDo>lambdaQuery()
+                    .eq(SysUserDo::getTenantid, currentUser.getTenantid())
+                    .eq(SysUserDo::getDeleted, "0");
+            List<SysUserDo> userList = userService.list(userWrapper);
+            Map<String, SysUserDo> userMap = userList.stream()
+                    .filter(vo -> vo.getName() != null)
+                    .collect(Collectors.toMap(
+                            SysUserDo::getName,
+                            Function.identity(),
+                            (v1, v2) -> v1
+                    ));
+            LambdaQueryWrapper<ZhcxQualityAwardBaseInfoDo> awardBaseWrapper = Wrappers.<ZhcxQualityAwardBaseInfoDo>lambdaQuery()
+                    .eq(ZhcxQualityAwardBaseInfoDo::getStatus, "有效")
+                    .eq(ZhcxQualityAwardBaseInfoDo::getTenantid, currentUser.getTenantid())
+                    .eq(ZhcxQualityAwardBaseInfoDo::getDeleted, "0");
+            List<ZhcxQualityAwardBaseInfoDo> awardList = qualityAwardService.list(awardBaseWrapper);
+            List<String> awardIdList = awardList.stream()
+                    .map(ZhcxQualityAwardBaseInfoDo::getId)
+                    .collect(Collectors.toList());
+            LambdaQueryWrapper<ZhcxPersistentBaseInfoDo> awardDetailWrapper = Wrappers.<ZhcxPersistentBaseInfoDo>lambdaQuery()
+                    .in(ZhcxPersistentBaseInfoDo::getPid, awardIdList)
+                    .eq(ZhcxPersistentBaseInfoDo::getStatus, "有效")
+                    .eq(ZhcxPersistentBaseInfoDo::getDeleted, "0");
+            List<ZhcxPersistentBaseInfoDo> awardDetailList = persistentBaseInfoService.list(awardDetailWrapper);
+            LambdaQueryWrapper<ZhcxAreaDo> areaWrapper = Wrappers.<ZhcxAreaDo>lambdaQuery()
+                    .eq(ZhcxAreaDo::getTenantid, currentUser.getTenantid())
+                    .eq(ZhcxAreaDo::getDeleted, "0");
+            int weekNumber = this.getWeekNumber(LocalDate.now());
+            List<ZhcxAreaDo> areaList = zhcxAreaService.list(areaWrapper);
+            List<ZhcxPersistentManageDo> list = new ArrayList<>();
+            ZhcxPersistentManageDo zhcxPersistentManageDo;
+            for (int i = 0; i <= cells.getMaxDataRow(); i++) {
+                if (i < 1) {
+                    continue;
+                }
+                String fillStr = cells.get(i, 0).getStringValue();
+                String issueStr = cells.get(i, 1).getStringValue();
+                String processStr = cells.get(i, 2).getStringValue();
+                String checkerStr = cells.get(i, 3).getStringValue();
+                String typeStr = cells.get(i, 4).getStringValue();
+                String contentStr = cells.get(i, 5).getStringValue();
+                String awardStr = cells.get(i, 6).getStringValue();
+                String numStr = cells.get(i, 7).getStringValue();
+                String firstOrgName = cells.get(i, 8).getStringValue();
+                String secondOrgName = cells.get(i, 9).getStringValue();
+                String subcontractStr = cells.get(i, 10).getStringValue();
+                String checkDateStr = cells.get(i, 11).getStringValue();
+                String checkAddressStr = cells.get(i, 12).getStringValue();
+                String rectifyStatusStr = cells.get(i, 13).getStringValue();
+                String remarkStr = cells.get(i, 14).getStringValue();
+                String amountStr = cells.get(i, 15).getStringValue();
+                String projectCodeStr = cells.get(i, 16).getStringValue();
+                if(StringUtils.isBlank(fillStr) || StringUtils.isBlank(typeStr)
+                        || StringUtils.isBlank(contentStr) || StringUtils.isBlank(awardStr)
+                        || StringUtils.isBlank(numStr) || StringUtils.isBlank(firstOrgName)
+                        || StringUtils.isBlank(secondOrgName) || StringUtils.isBlank(checkDateStr)
+                        || StringUtils.isBlank(checkAddressStr) || StringUtils.isBlank(rectifyStatusStr)
+                        || StringUtils.isBlank(amountStr) || StringUtils.isBlank(projectCodeStr)
+                        || StringUtils.isBlank(checkerStr)){
+                    errmsg.append("第").append(i+1).append("行有必填项未填写;<br>");
+                    continue;
+                }
+                zhcxPersistentManageDo = new ZhcxPersistentManageDo();
+                zhcxPersistentManageDo.setId(SecurityUtil.getUUID());
+                zhcxPersistentManageDo.setContent(contentStr);
+                zhcxPersistentManageDo.setPeriod("第"+weekNumber+"期");
+                SysOrganizationVo sysOrganizationVo = organizationDoList.stream().filter(item -> "10".equals(item.getOrgtype())).findFirst()
+                        .orElse(null);
+                if (sysOrganizationVo != null) {
+                    zhcxPersistentManageDo.setBelongorgid(contentStr);
+                    zhcxPersistentManageDo.setBelongorgname(contentStr);
+                }else{
+                    errmsg.append("当前登录人没有检查部门");
+                    continue;
+                }
+                //SysDictDo parent = parentNameMap.get(fillStr);
+                SysDictDo fillDict = fillList.stream()
+                        .filter(item -> fillStr.equals(item.getName())).findFirst()
+                        .orElse(null);
+                if (fillDict == null) {
+                    errmsg.append("第").append(i+1).append("行报告类型在系统中不存在;<br>");
+                    continue;
+                }else{
+                    zhcxPersistentManageDo.setFill(fillStr);
+                }
+                if(StringUtils.isBlank(issueStr)){
+                    if ("构件油漆保护".equals(fillStr) || "焊接通病治理".equals(fillStr)) {
+                        errmsg.append("第").append(i+1).append("行问题类型必填;<br>");
+                    }
+                }
+                if(StringUtils.isNotBlank(issueStr) && fillDict != null){
+                    //SysDictDo child = pidNameMap.get(parent.getId() + "#" + issueStr);
+                    SysDictDo issueDict = fillList.stream()
+                            .filter(item -> issueStr.equals(item.getName()) && fillDict.getId().equals(item.getPid())).findFirst()
+                            .orElse(null);
+                    if (issueDict == null) {
+                        errmsg.append("第").append(i+1).append("行问题类型不属于该报告类型;<br>");
+                    }else{
+                        zhcxPersistentManageDo.setIssuetype(issueStr);
+                    }
+                }
+                if(StringUtils.isBlank(processStr)){
+                    if ("焊接通病治理".equals(fillStr)) {
+                        errmsg.append("第").append(i+1).append("行问题发生工序必填;<br>");
+                    }
+                }
+                if(StringUtils.isNotBlank(processStr) ){
+                    SysDictDo processDict = processList.stream()
+                            .filter(item -> processStr.equals(item.getName())).findFirst()
+                            .orElse(null);
+                    if (processDict == null) {
+                        errmsg.append("第").append(i+1).append("行问题发生工序不存在系统;<br>");
+                    }else{
+                        zhcxPersistentManageDo.setProcess(processStr);
+                    }
+                }
+                if(StringUtils.isNotBlank(checkerStr)){
+                    SysUserDo sysUserDo = userMap.get(checkerStr);
+                    if (sysUserDo == null) {
+                        errmsg.append("第").append(i+1).append("行检查人不存在系统;<br>");
+                    }else{
+                        zhcxPersistentManageDo.setCheckuserid(sysUserDo.getId());
+                        zhcxPersistentManageDo.setCheckusername(sysUserDo.getName());
+                    }
+                }
+                boolean result = typeList.stream().anyMatch(item -> typeStr.equals(item.getName()));
+                if(!result){
+                    errmsg.append("第").append(i+1).append("行类型不存在系统;<br>");
+                }else{
+                    zhcxPersistentManageDo.setType(typeStr);
+                }
+                ZhcxQualityAwardBaseInfoDo zhcxQualityAwardBaseInfoDo = awardList.stream()
+                        .filter(item -> awardStr.equals(item.getAwardname())).findFirst()
+                        .orElse(null);
+                if(zhcxQualityAwardBaseInfoDo == null){
+                    errmsg.append("第").append(i+1).append("行奖惩依据不存在系统;<br>");
+                }else{
+                    zhcxPersistentManageDo.setQualityawardid(zhcxQualityAwardBaseInfoDo.getId());
+                    zhcxPersistentManageDo.setQualityawardname(zhcxQualityAwardBaseInfoDo.getAwardname());
+                    ZhcxPersistentBaseInfoDo zhcxPersistentBaseInfoDo = awardDetailList.stream()
+                            .filter(item -> numStr.equals(item.getNumber()) && item.getPid().equals(zhcxQualityAwardBaseInfoDo.getId())).findFirst()
+                            .orElse(null);
+                    if(zhcxPersistentBaseInfoDo == null){
+                        errmsg.append("第").append(i+1).append("行依据编号不存在系统;<br>");
+                    }else{
+                        zhcxPersistentManageDo.setBaseinfoid(zhcxPersistentBaseInfoDo.getId());
+                        zhcxPersistentManageDo.setBaseinfonum(zhcxPersistentBaseInfoDo.getNumber());
+                        zhcxPersistentManageDo.setReferamount(zhcxPersistentBaseInfoDo.getAmount());
+                    }
+                }
+
+
+                LambdaQueryWrapper<SysOrganizationDo> firstOrgWrapper = Wrappers.<SysOrganizationDo>lambdaQuery()
+                        .and(wrapper -> wrapper
+                                .eq(SysOrganizationDo::getShortname, firstOrgName)
+                                .or()
+                                .eq(SysOrganizationDo::getFullname, firstOrgName)
+                        )
+                        .like(SysOrganizationDo::getFullpid,currentUser.getTenantid())
+                        .eq(SysOrganizationDo::getDeleted, "0");
+                SysOrganizationDo one = sysOrganizationService.getOne(firstOrgWrapper);
+                if(one == null){
+                    errmsg.append("第").append(i+1).append("行一级部门不存在系统;<br>");
+                }else{
+                    zhcxPersistentManageDo.setFirstorgid(one.getId());
+                    zhcxPersistentManageDo.setFirstorgname(one.getFullname());
+                }
+                if (one != null) {
+                    LambdaQueryWrapper<SysOrganizationDo> secondOrgWrapper = Wrappers.<SysOrganizationDo>lambdaQuery()
+                            .and(wrapper -> wrapper
+                                    .eq(SysOrganizationDo::getShortname, secondOrgName)
+                                    .or()
+                                    .eq(SysOrganizationDo::getFullname, secondOrgName)
+                            )
+                            .eq(SysOrganizationDo::getPid, one.getId())
+                            .eq(SysOrganizationDo::getDeleted, "0");
+                    SysOrganizationDo two = sysOrganizationService.getOne(secondOrgWrapper);
+                    if(two == null){
+                        errmsg.append("第").append(i+1).append("行二级部门不存在系统;<br>");
+                    }else{
+                        zhcxPersistentManageDo.setSecondorgid(two.getId());
+                        zhcxPersistentManageDo.setSecondorgname(two.getFullname());
+                    }
+                }
+                if (StringUtils.isNotBlank(subcontractStr)) {
+                    LambdaQueryWrapper<ZhcxSubcontractorManageDo> subcontractWrapper = Wrappers.<ZhcxSubcontractorManageDo>lambdaQuery()
+                            .eq(ZhcxSubcontractorManageDo::getCompanyAbbreviation, subcontractStr)
+                            .eq(ZhcxSubcontractorManageDo::getTenantid, currentUser.getTenantid())
+                            .eq(ZhcxSubcontractorManageDo::getDeleted, "0");
+                    ZhcxSubcontractorManageDo subcontractorManageDo = subcontractorManageService.getOne(subcontractWrapper);
+                    if(subcontractorManageDo == null){
+                        errmsg.append("第").append(i+1).append("行分包商简称不存在系统;<br>");
+                    }else{
+                        zhcxPersistentManageDo.setSubcontractcode(subcontractorManageDo.getTotalFileNo());
+                        zhcxPersistentManageDo.setSubcontractename(subcontractorManageDo.getCompanyAbbreviation());
+                        zhcxPersistentManageDo.setSubcontractname(subcontractorManageDo.getCompanyName());
+                    }
+                }
+                if(StringUtils.isNotBlank(checkAddressStr)){
+                    ZhcxAreaDo zhcxAreaDo = areaList.stream().
+                            filter(item -> checkAddressStr.equals(item.getChecklocation())).findFirst()
+                            .orElse(null);
+                    if (zhcxAreaDo == null) {
+                        errmsg.append("第").append(i+1).append("行检查区域不存在系统;<br>");
+                    }else{
+                        zhcxPersistentManageDo.setCheckaddress(checkAddressStr);
+                    }
+                }
+                if(StringUtils.isNotBlank(rectifyStatusStr)){
+                    SysDictDo rectifyCluResult = rectifyCluList.stream().filter(item -> rectifyStatusStr.equals(item.getName())).findFirst()
+                            .orElse(null);
+                    if (rectifyCluResult == null) {
+                        errmsg.append("第").append(i+1).append("行整改情况不存在系统;<br>");
+                    }else{
+                        zhcxPersistentManageDo.setRectifystatus(rectifyStatusStr);
+                    }
+                }
+                if(StringUtils.isNotBlank(projectCodeStr)){
+                    LambdaQueryWrapper<ZhcxProjectManageDo> projectWrapper = Wrappers.<ZhcxProjectManageDo>lambdaQuery()
+                            .eq(ZhcxProjectManageDo::getProjectCode, projectCodeStr)
+                            .eq(ZhcxProjectManageDo::getTenantid, currentUser.getTenantid())
+                            .eq(ZhcxProjectManageDo::getDeleted, "0");
+                    ZhcxProjectManageDo projectManageDo = projectManageService.getOne(projectWrapper);
+                    if(projectManageDo == null){
+                        errmsg.append("第").append(i+1).append("行项目工号不存在系统;<br>");
+                    }else{
+                        zhcxPersistentManageDo.setProjectcode(projectCodeStr);
+                        zhcxPersistentManageDo.setProjectename(projectManageDo.getProjectEname());
+                        zhcxPersistentManageDo.setProjectid(projectManageDo.getId());
+                    }
+                }
+                if (checkDateStr != null && !checkDateStr.isEmpty()) {
+                    Date date = parseDate(checkDateStr, null);
+                    if(date == null){
+                        errmsg.append("第").append(i+1).append("行年月应为“YYYY-MM”格式!<br>");
+                    }else{
+                        zhcxPersistentManageDo.setCheckdate(date);
+                    }
+                }
+                if(amountStr != null && !amountStr.isEmpty()){
+                    BigDecimal amount = new BigDecimal(amountStr.trim());
+                    zhcxPersistentManageDo.setAmount(amount);
+                }
+                zhcxPersistentManageDo.setRemark(remarkStr);
+                zhcxPersistentManageDo.setTenantid(currentUser.getTenantid());
+                if (errmsg.length() > 0) {
+                    return errmsg;
+                }
+                list.add(zhcxPersistentManageDo);
+
+            }
+            if (list.size() > 0) {
+                SysSerialVo sysSerialVo = new SysSerialVo();
+                sysSerialVo.setIfautomaticreset("y");
+                sysSerialVo.setModulecode("ZHCX_PERSISTENT_MANAGE_CODE");
+                sysSerialVo.setResetrule("date:yyyyMM");
+                sysSerialVo.setRuleTemplateStr("WZ-@{date:yyyyMM}-@{serialNumber:#000}");
+
+                list.forEach(ev->{
+                    String code = sysSerialNumberService.getCodeByTemplate(sysSerialVo);
+                    ev.setCode(code);
+                });
+                service.saveBatch(list);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return errmsg;
+    }
+
+    private int getWeekNumber(LocalDate date) {
+        // 把日期转成 UTC 逻辑中的 Date(按日处理即可,不需要时区影响)
+        LocalDate d = date;
+
+        // 获取是周几(0 表示周日)
+        int dayNum = d.getDayOfWeek().getValue() % 7; // Java 周日是 7,所以这里取 % 7,得到 0-6
+
+        // 找到本周的周日
+        d = d.minusDays(dayNum);
+
+        // 当年的第一天
+        LocalDate yearStart = LocalDate.of(d.getYear(), 1, 1);
+
+        // 计算天数差
+        long daysDifference = ChronoUnit.DAYS.between(yearStart, d);
+
+        // 如果跨年,属于下一年的第一周
+        if (d.getYear() < date.getYear()) {
+            return 1;
+        }
+
+        // 计算周数
+        return (int) Math.ceil((daysDifference + 1) / 7.0);
+    }
+    private Date parseDate(String stringValue, Date date) {
+        for (SimpleDateFormat simpleDateFormat : SIMPLE_DATE_FORMATS_LIST) {
+            try {
+                date = simpleDateFormat.parse(stringValue);
+                break;
+            } catch (ParseException e) {
+                //log.error("格式化时间失败", e);
+            }
+        }
+        if (date == null) {
+            log.error("格式化时间失败:{}"+stringValue);
+        }
+        return date;
+    }
+
     private void buildHeader(Cells cells) {
         cells.merge(0, 0, 2, 1);
         cells.get(0, 0).setValue("月份");

+ 89 - 0
business-entity/src/main/java/com/rongwei/bsentity/domain/ZhcxAreaDo.java

@@ -0,0 +1,89 @@
+package com.rongwei.bsentity.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.rongwei.rwcommon.base.BaseDo;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author dlc
+ * @since 2025-08-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("ZHCX_AREA")
+public class ZhcxAreaDo extends BaseDo {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 主键
+     */
+    @TableField("ID")
+    private String id;
+    /**
+     * 租户id
+     */
+    @TableField("TENANTID")
+    private String tenantid;
+    /**
+     * 扩展json格式配置
+     */
+    @TableField("ROPTION")
+    private String roption;
+    /**
+     * 父id
+     */
+    @TableField("PID")
+    private String pid;
+    /**
+     * 区域
+     */
+    @TableField("AREANAME")
+    private String areaname;
+    /**
+     * 场地编号
+     */
+    @TableField("AREACODE")
+    private String areacode;
+    /**
+     * 车间
+     */
+    @TableField("DEPTMENT")
+    private String deptment;
+    /**
+     * 检查地点
+     */
+    @TableField("CHECKLOCATION")
+    private String checklocation;
+    /**
+     * 坐标X
+     */
+    @TableField("POSX")
+    private Double posx;
+    /**
+     * 坐标Y
+     */
+    @TableField("POSY")
+    private Double posy;
+    /**
+     * 常用地名
+     */
+    @TableField("NORMALLOCATION")
+    private String normallocation;
+    /**
+     * 地点英文
+     */
+    @TableField("PLACE")
+    private String place;
+
+
+}

+ 1 - 1
business-entity/src/main/java/com/rongwei/bsentity/domain/ZhcxPersistentBaseInfoDo.java

@@ -77,7 +77,7 @@ public class ZhcxPersistentBaseInfoDo extends BaseDo {
      * 序号
      */
     @TableField("NUMBER")
-    private Integer number;
+    private String number;
     /**
      * 父id
      */

+ 10 - 0
business-entity/src/main/java/com/rongwei/bsentity/domain/ZhcxPersistentManageDo.java

@@ -258,4 +258,14 @@ public class ZhcxPersistentManageDo extends BaseDo {
      */
     @TableField("SYNCSTATE")
     private String syncstate;
+    /**
+     * 问题类型
+     */
+    @TableField("ISSUETYPE")
+    private String issuetype;
+    /**
+     * 问题发生工序
+     */
+    @TableField("PROCESS")
+    private String process;
 }

+ 180 - 0
business-entity/src/main/java/com/rongwei/bsentity/domain/ZhcxSubcontractorManageDo.java

@@ -0,0 +1,180 @@
+package com.rongwei.bsentity.domain;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.rongwei.rwcommon.base.BaseDo;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 分包商管理
+ * </p>
+ *
+ * @author dlc
+ * @since 2025-08-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("ZHCX_SUBCONTRACTOR_MANAGE")
+public class ZhcxSubcontractorManageDo extends BaseDo {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 主键
+     */
+    @TableField("ID")
+    private String id;
+    /**
+     * 租户id
+     */
+    @TableField("TENANTID")
+    private String tenantid;
+    /**
+     * 扩展json格式配置
+     */
+    @TableField("ROPTION")
+    private String roption;
+    /**
+     * 总档案号
+     */
+    @TableField("TOTAL_FILE_NO")
+    private String totalFileNo;
+    /**
+     * 公司名称
+     */
+    @TableField("COMPANY_NAME")
+    private String companyName;
+    /**
+     * 简称
+     */
+    @TableField("COMPANY_ABBREVIATION")
+    private String companyAbbreviation;
+    /**
+     * 缩写
+     */
+    @TableField("COMPANY_SHORT_NAME")
+    private String companyShortName;
+    /**
+     * 分包商类型
+     */
+    @TableField("TYPE")
+    private String type;
+    /**
+     * 统一社会信用代码
+     */
+    @TableField("USCI")
+    private String usci;
+    /**
+     * 注册资金(万元)
+     */
+    @TableField("REGO")
+    private BigDecimal rego;
+    /**
+     * 开始合作年份
+     */
+    @TableField("START_YEAR")
+    private Date startYear;
+    /**
+     * 法人代表
+     */
+    @TableField("LAR")
+    private String lar;
+    /**
+     * 法人工号
+     */
+    @TableField("LAR_CODE")
+    private String larCode;
+    /**
+     * 法人代表联系方式
+     */
+    @TableField("LAR_PHONE")
+    private String larPhone;
+    /**
+     * 在册人数
+     */
+    @TableField("PERSON_NUM")
+    private Integer personNum;
+    /**
+     * 委托负责人
+     */
+    @TableField("PER_PROCURATIONEM")
+    private String perProcurationem;
+    /**
+     * 委托负责人代表联系方式
+     */
+    @TableField("PER_PROCURATIONEM_PHONE")
+    private String perProcurationemPhone;
+    /**
+     * 生产地址
+     */
+    @TableField("PRODUCT_ADDRESS")
+    private String productAddress;
+    /**
+     * 详细地址
+     */
+    @TableField("DETAIL_ADDRESS")
+    private String detailAddress;
+    /**
+     * 车间面积(㎡)
+     */
+    @TableField("WORKSHOP_AREA")
+    private BigDecimal workshopArea;
+    /**
+     * 场外面积(㎡)
+     */
+    @TableField("OFF_SITE_AREA")
+    private BigDecimal offSiteArea;
+    /**
+     * 预估富余产能(吨/月)
+     */
+    @TableField("EXCESS_CAPACITY")
+    private BigDecimal excessCapacity;
+    /**
+     * 可支配产能(吨/月)
+     */
+    @TableField("DISPOSABLE_CAPACITY")
+    private BigDecimal disposableCapacity;
+    /**
+     * 引进方式
+     */
+    @TableField("INTRODUCTION_METHOD")
+    private String introductionMethod;
+    /**
+     * 引进时间
+     */
+    @TableField("INTRODUCTION_TIME")
+    private Date introductionTime;
+    /**
+     * 合作年限
+     */
+    @TableField("COOPERATE_LIFE")
+    private String cooperateLife;
+    /**
+     * 施工性质
+     */
+    @TableField("CONSTRUCTION_NATURE")
+    private String constructionNature;
+    /**
+     * 主营业务
+     */
+    @TableField("MAIN_BUSINESS")
+    private String mainBusiness;
+    /**
+     * 备注
+     */
+    @TableField("NOTES")
+    private String notes;
+    /**
+     * 公司英文名称
+     */
+    @TableField("COMPANY_NAME_EN")
+    private String companyNameEn;
+
+
+}

+ 22 - 4
business-server/src/main/java/com/rongwei/bsserver/controller/ZhcxPersistentController.java

@@ -1,16 +1,16 @@
 package com.rongwei.bsserver.controller;
 
+import com.aspose.cells.Workbook;
 import com.rongwei.bscommon.sys.service.ZhcxPersistentManageService;
 import com.rongwei.bsentity.dto.ZhcxPersistentReportDto;
 import com.rongwei.rwcommon.base.R;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 import java.util.Map;
@@ -88,4 +88,22 @@ public class ZhcxPersistentController {
         zhcxPersistentManageService.issueExcelExport(map,response);
     }
 
+    @PostMapping("/excelImport")
+    @ResponseBody
+    public R detailExcelImport(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
+        Workbook book = null;
+        try {
+            book = new Workbook(file.getInputStream());
+            StringBuilder errmsg = zhcxPersistentManageService.excelImport(book, request);
+            if (errmsg.toString().isEmpty()){
+                return R.ok("操作成功");
+            }else {
+                return R.error(errmsg.toString());
+            }
+        } catch (Exception e) {
+            return R.saveError();
+        }
+    }
+
+
 }