| | |
| | | /** |
| | | * 出厂日期 |
| | | */ |
| | | @Excel(name = "出厂日期", width = 25, format = "yyyy/MM/dd", orderNum = "26") |
| | | @Excel(name = "出厂日期", width = 25, orderNum = "26") |
| | | @ApiModelProperty(value = "出厂日期") |
| | | @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | private transient String leaveFactory; |
| | | |
| | | /** |
| | | * 出厂日期 |
| | | */ |
| | | @ApiModelProperty(value = "出厂日期") |
| | | @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | |
| | | |
| | | /**下次三保日期*/ |
| | | @TableField(exist = false) |
| | | @Excel(name = "下次三保日期", width = 15, format = "yyyy/MM/dd", orderNum = "43") |
| | | @Excel(name = "三保日期", width = 15, format = "yyyy/MM/dd", orderNum = "43") |
| | | @ApiModelProperty(value = "下次三保日期") |
| | | @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | |
| | | private java.util.Date latestTechnologyCheck; |
| | | /**技术状态下次鉴定日期*/ |
| | | @TableField(exist = false) |
| | | @Excel(name = "技术状态下次鉴定日期", width = 15, format = "yyyy/MM/dd", orderNum = "46") |
| | | @Excel(name = "技术状态鉴定日期", width = 15, format = "yyyy/MM/dd", orderNum = "46") |
| | | @ApiModelProperty(value = "技术状态下次鉴定日期") |
| | | @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | import org.springframework.web.multipart.MultipartHttpServletRequest; |
| | | import org.springframework.web.servlet.ModelAndView; |
| | | |
| | | import org.apache.commons.lang3.time.DateUtils; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.io.IOException; |
| | | import java.util.ArrayList; |
| | | import java.util.Arrays; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.text.ParseException; |
| | | import java.util.*; |
| | | import java.util.function.Consumer; |
| | | import java.util.stream.Collectors; |
| | | import java.time.LocalDate; |
| | | import java.time.ZoneId; |
| | | |
| | | /** |
| | | * @Description: 设备台账 |
| | |
| | | }else { |
| | | eamEquipment.setRepairDepartOrgCode(eamBaseRepairDepart.getOrgCode()); |
| | | } |
| | | // 字段校验与填充 |
| | | if (StringUtils.isNotBlank(eamEquipment.getLeaveFactory())) { |
| | | String leaveFactoryStr = eamEquipment.getLeaveFactory(); |
| | | try { |
| | | // 定义支持解析的日期格式 |
| | | String[] parsePatterns = { |
| | | "yyyy/MM/dd", "yyyy-MM-dd", "yyyyMMdd" |
| | | }; |
| | | // 格式1: 包含分隔符的日期格式 (如2025/07/30, 2025-07-30等) |
| | | if (leaveFactoryStr.contains("/") || leaveFactoryStr.contains("-") || |
| | | (leaveFactoryStr.length() == 8 && leaveFactoryStr.matches("\\d{8}"))) { |
| | | |
| | | // 使用指定的格式数组解析日期 |
| | | Date leaveFactoryDate = DateUtils.parseDate(leaveFactoryStr, parsePatterns); |
| | | eamEquipment.setLeaveFactoryDate(leaveFactoryDate); |
| | | } else { |
| | | log.warn("离开工厂日期格式无效: {}", leaveFactoryStr); |
| | | } |
| | | } catch (ParseException e) { |
| | | log.error("日期解析失败: {}", leaveFactoryStr, e); |
| | | } |
| | | } |
| | | // 计算三保日期 |
| | | if (eamEquipment.getNextThirdMaintenance() != null && |
| | | eamEquipment.getThirdMaintenancePeriod() != null) { |
| | | |
| | | calculateMaintenanceDates( |
| | | eamEquipment.getNextThirdMaintenance(), |
| | | eamEquipment.getThirdMaintenancePeriod(), |
| | | newDate -> eamEquipment.setNextThirdMaintenance(newDate), |
| | | latestDate -> eamEquipment.setLatestThirdMaintenance(latestDate) |
| | | ); |
| | | } |
| | | |
| | | // 计算技术状态鉴定日期 |
| | | if (eamEquipment.getNextTechnologyCheck() != null && |
| | | eamEquipment.getTechnologyCheckPeriod() != null) { |
| | | |
| | | calculateMaintenanceDates( |
| | | eamEquipment.getNextTechnologyCheck(), |
| | | eamEquipment.getTechnologyCheckPeriod(), |
| | | newDate -> eamEquipment.setNextTechnologyCheck(newDate), |
| | | latestDate -> eamEquipment.setLatestTechnologyCheck(latestDate) |
| | | ); |
| | | } |
| | | EamEquipment equipment = eamEquipmentService.saveEquipment(eamEquipment); |
| | | if (equipment == null) { |
| | | //保存失败,跳过本次循环 |
| | |
| | | } |
| | | } |
| | | |
| | | // 日期计算工具方法 |
| | | private void calculateMaintenanceDates(Date nextDate, Integer periodYears, |
| | | Consumer<Date> setNextMaintenance, |
| | | Consumer<Date> setLatestMaintenance) { |
| | | if (nextDate == null || periodYears == null || periodYears <= 0) { |
| | | return; |
| | | } |
| | | |
| | | // 转换为Java 8日期类型 |
| | | LocalDate nextLocal = nextDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); |
| | | LocalDate today = LocalDate.now(); |
| | | |
| | | // 确保有效的计算周期 |
| | | int period = Math.max(1, periodYears); // 防止传入0或负值 |
| | | |
| | | if (nextLocal.isAfter(today)) { |
| | | // 未过期:计算最近维护日期 |
| | | setLatestMaintenance.accept( |
| | | Date.from(nextLocal.minusYears(period).atStartOfDay() |
| | | .atZone(ZoneId.systemDefault()).toInstant()) |
| | | ); |
| | | } else { |
| | | // 已过期:计算新的下次维护日期 |
| | | while (!nextLocal.isAfter(today)) { |
| | | nextLocal = nextLocal.plusYears(period); |
| | | } |
| | | |
| | | // 设置新日期 |
| | | setNextMaintenance.accept( |
| | | Date.from(nextLocal.atStartOfDay() |
| | | .atZone(ZoneId.systemDefault()).toInstant()) |
| | | ); |
| | | |
| | | // 计算最近维护日期 |
| | | setLatestMaintenance.accept( |
| | | Date.from(nextLocal.minusYears(period).atStartOfDay() |
| | | .atZone(ZoneId.systemDefault()).toInstant()) |
| | | ); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { |
| | | MultipartFile file = entity.getValue(); |
| | | String fileName = file.getOriginalFilename(); |
| | | Result<?> importResult=eamMaintenanceStandardService.importPointInspectionExcel(file); |
| | | Result<?> importResult=eamMaintenanceStandardService.importPointInspectionExcel(file,null); |
| | | if (importResult.isSuccess()) { |
| | | successCount++; |
| | | } else { |
| | |
| | | for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { |
| | | MultipartFile file = entity.getValue(); |
| | | String fileName = file.getOriginalFilename(); |
| | | Result<?> importResult=eamMaintenanceStandardService.importMaintenanceStandard(file, "SECOND"); |
| | | Result<?> importResult=eamMaintenanceStandardService.importMaintenanceStandard(file, "SECOND",null); |
| | | if (importResult.isSuccess()) { |
| | | successCount++; |
| | | } else { |
| | |
| | | for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { |
| | | MultipartFile file = entity.getValue(); |
| | | String fileName = file.getOriginalFilename(); |
| | | Result<?> importResult= eamMaintenanceStandardService.importMaintenanceStandard(file, "THIRD"); |
| | | Result<?> importResult= eamMaintenanceStandardService.importMaintenanceStandard(file, "THIRD",null); |
| | | if (importResult.isSuccess()) { |
| | | successCount++; |
| | | } else { |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 升版导入 |
| | | * @param id,file |
| | | * @return |
| | | */ |
| | | @ApiOperation(value = "升版导入", notes = "升版导入") |
| | | @PostMapping(value = "/importUpgrade") |
| | | public Result<?> importUpgrade(String id,MultipartFile file) { |
| | | EamMaintenanceStandard eamMaintenanceStandard=eamMaintenanceStandardService.getById(id); |
| | | if (eamMaintenanceStandard==null) { |
| | | return Result.error("请选择需要升版的保养标准"); |
| | | }else { |
| | | switch (eamMaintenanceStandard.getMaintenanceCategory()){ |
| | | case "POINT_INSPECTION": |
| | | //点检升版导入 |
| | | return eamMaintenanceStandardService.importPointInspectionExcel(file,id); |
| | | case "SECOND_MAINTENANCE": |
| | | //二保升版导入 |
| | | return eamMaintenanceStandardService.importMaintenanceStandard(file, "SECOND",id); |
| | | case "THIRD_MAINTENANCE": |
| | | //三保升版导入 |
| | | return eamMaintenanceStandardService.importMaintenanceStandard(file, "THIRD",id); |
| | | default: |
| | | break; |
| | | } |
| | | } |
| | | return Result.error("升版导入失败"); |
| | | } |
| | | |
| | | private Result<?> getResult(Map<String, String> results, int fileCount, int successCount, int failureCount) { |
| | | List<String> response = new ArrayList<>(); |
| | | response.add("总文件数:" + fileCount); |
| | |
| | | /** |
| | | * 点检表导入入口 |
| | | */ |
| | | Result<?> importPointInspectionExcel(MultipartFile file); |
| | | Result<?> importPointInspectionExcel(MultipartFile file,String id); |
| | | |
| | | |
| | | Result<?> importMaintenanceStandard(MultipartFile file, String type); |
| | | Result<?> importMaintenanceStandard(MultipartFile file, String type,String id); |
| | | |
| | | /** |
| | | * 查询保养类型下正常的保养标准 |
| | |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Result<?> importPointInspectionExcel(MultipartFile file) { |
| | | public Result<?> importPointInspectionExcel(MultipartFile file,String id) { |
| | | EamMaintenanceStandard eamMaintenanceStandardOld=new EamMaintenanceStandard(); |
| | | if (StrUtil.isNotEmpty(id)){ |
| | | eamMaintenanceStandardOld=eamMaintenanceStandardMapper.selectById(id); |
| | | } |
| | | try (Workbook workbook = WorkbookFactory.create(file.getInputStream())) { |
| | | Sheet sheet = workbook.getSheetAt(0); |
| | | |
| | |
| | | |
| | | eamMaintenanceStandard.setStandardName(name); |
| | | |
| | | // 检查重复 |
| | | EamMaintenanceStandard exist = checkDuplicate(eamMaintenanceStandard.getEquipmentId(), |
| | | eamMaintenanceStandard.getMaintenanceCategory(), MaintenanceStandardStatusEnum.ABOLISH.name()); |
| | | if (exist != null) { |
| | | return Result.error(name + ": 设备标准已存在,不能重复添加"); |
| | | // 检查重复,只导入校验,升版不校验 |
| | | if (StrUtil.isEmpty(id)){ |
| | | EamMaintenanceStandard exist = checkDuplicate(eamMaintenanceStandard.getEquipmentId(), |
| | | eamMaintenanceStandard.getMaintenanceCategory(), MaintenanceStandardStatusEnum.ABOLISH.name()); |
| | | if (exist != null) { |
| | | return Result.error(name + ": 设备标准已存在,不能重复添加"); |
| | | } |
| | | } |
| | | if (eamMaintenanceStandardOld.getEquipmentId().equals(eamMaintenanceStandard.getEquipmentId()) |
| | | &&eamMaintenanceStandardOld.getMaintenanceCategory().equals(eamMaintenanceStandard.getMaintenanceCategory())) { |
| | | //升版操作,作废原有 |
| | | eamMaintenanceStandardOld.setStandardStatus(MaintenanceStandardStatusEnum.ABOLISH.name()); |
| | | eamMaintenanceStandardMapper.updateById(eamMaintenanceStandard); |
| | | //版本递增获取数字 |
| | | Pattern pattern = Pattern.compile("(\\d+)(?:\\.\\d+)*$"); |
| | | Matcher matcher = pattern.matcher(eamMaintenanceStandardOld.getStandardVersion()); |
| | | if (matcher.find()) { |
| | | try { |
| | | int mainVersion = Integer.parseInt(matcher.group(1)); |
| | | eamMaintenanceStandard.setStandardVersion("v" + (mainVersion + 1)); |
| | | } catch (NumberFormatException ignored) { |
| | | } |
| | | } |
| | | } |
| | | eamMaintenanceStandard.setInitialDate(new Date()); |
| | | eamMaintenanceStandardMapper.insert(eamMaintenanceStandard); |
| | | eamMaintenanceStandardMapper.insert(eamMaintenanceStandardOld); |
| | | |
| | | Map<Integer, String> rowErrors = new HashMap<>(); |
| | | |
| | |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public Result<?> importMaintenanceStandard(MultipartFile file, String type) { |
| | | public Result<?> importMaintenanceStandard(MultipartFile file, String type,String id) { |
| | | String fileName = file.getOriginalFilename(); |
| | | |
| | | try (XWPFDocument doc = new XWPFDocument(file.getInputStream())) { |
| | |
| | | return Result.error(fileName + ": 设备信息提取失败"); |
| | | } |
| | | |
| | | EamMaintenanceStandard eamMaintenanceStandardOld=new EamMaintenanceStandard(); |
| | | if (StrUtil.isNotEmpty(id)){ |
| | | eamMaintenanceStandardOld=eamMaintenanceStandardMapper.selectById(id); |
| | | } |
| | | |
| | | // 配置类型相关参数 |
| | | configureStandard(standard, type, file); |
| | | EamMaintenanceStandard exist = checkDuplicate(standard.getEquipmentId(), standard.getMaintenanceCategory(), MaintenanceStandardStatusEnum.ABOLISH.name()); |
| | | if (exist != null) { |
| | | return Result.error(fileName + ": 设备标准已存在,不能重复添加"); |
| | | if (StrUtil.isEmpty(id)){ |
| | | EamMaintenanceStandard exist = checkDuplicate(standard.getEquipmentId(), standard.getMaintenanceCategory(), MaintenanceStandardStatusEnum.ABOLISH.name()); |
| | | if (exist != null) { |
| | | return Result.error(fileName + ": 设备标准已存在,不能重复添加"); |
| | | } |
| | | } |
| | | |
| | | if (eamMaintenanceStandardOld.getEquipmentId().equals(standard.getEquipmentId()) |
| | | &&eamMaintenanceStandardOld.getMaintenanceCategory().equals(standard.getMaintenanceCategory())) { |
| | | //升版操作,作废原有 |
| | | eamMaintenanceStandardOld.setStandardStatus(MaintenanceStandardStatusEnum.ABOLISH.name()); |
| | | eamMaintenanceStandardMapper.updateById(eamMaintenanceStandardOld); |
| | | //版本递增获取数字 |
| | | Pattern pattern = Pattern.compile("(\\d+)(?:\\.\\d+)*$"); |
| | | Matcher matcher = pattern.matcher(eamMaintenanceStandardOld.getStandardVersion()); |
| | | if (matcher.find()) { |
| | | try { |
| | | int mainVersion = Integer.parseInt(matcher.group(1)); |
| | | standard.setStandardVersion("v" + (mainVersion + 1)); |
| | | } catch (NumberFormatException ignored) { |
| | | } |
| | | } |
| | | } |
| | | standard.setStandardName(documentTitle); |
| | | eamMaintenanceStandardMapper.insert(standard); |