lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamSecondMaintenanceOrderDetail.java
@@ -69,4 +69,14 @@ /** å¼å¸¸æè¿° */ @ApiModelProperty(name = "å¼å¸¸æè¿°",notes = "") private String exceptionDescription; public EamSecondMaintenanceOrderDetail() { } public EamSecondMaintenanceOrderDetail(EamMaintenanceStandardDetail detail) { this.itemCode = detail.getItemCode(); this.itemCategory = detail.getItemCategory(); this.itemName = detail.getItemName(); } } lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamEquipmentMapper.java
@@ -62,6 +62,11 @@ List<EamEquipment> selectThreeMaintenanceEquipmentList(@Param(Constants.WRAPPER) Wrapper<EamEquipment> queryWrapper); /** * è·åå¯çæäºä¿å·¥åç设å¤å表 */ List<EamEquipment> selectSecondMaintenanceEquipmentList(@Param(Constants.WRAPPER) Wrapper<EamEquipment> queryWrapper); /** * 设å¤ç®¡çé¦é¡µ * @param ids * @return lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamEquipmentMapper.xml
@@ -77,6 +77,23 @@ on e.id = ext.id ${ew.customSqlSegment} </select> <select id="selectSecondMaintenanceEquipmentList" resultType="org.jeecg.modules.eam.entity.EamEquipment"> select e.*, ext.latest_second_maintenance, ext.next_second_maintenance, ext.technology_status, ext.third_maintenance_period, ext.technology_check_period, ext.latest_technology_check, ext.next_technology_check, ext.technology_generate_flag from eam_equipment e left join eam_equipment_extend ext on e.id = ext.id ${ew.customSqlSegment} </select> <select id="echartsList" resultType="org.jeecg.modules.eam.dto.EchartsDto"> WITH TotalCount AS ( SELECT COUNT(a.id) AS total_count lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentExtendService.java
@@ -47,4 +47,13 @@ * @return */ boolean updateThirdMaintenanceParam(String equipmentId, String status, Date evaluationDate, String thirdMaintenanceGenerateFlag); /** * æ´æ°è®¾å¤äºä¿åä¿å »æ¥æ * @param equipmentId 设å¤ID * @param status ä¿å »ç¶æ * @param secondMaintenanceGenerateFlag äºä¿å·¥åçææ è¯ * @return */ boolean updateSecondMaintenanceParam(String equipmentId, String status, String secondMaintenanceGenerateFlag); } lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentService.java
@@ -88,6 +88,11 @@ List<EamEquipment> selectThreeMaintenanceEquipmentList(); /** * è·åå¯çæäºä¿å·¥åç设å¤å表 */ List<EamEquipment> selectSecondMaintenanceEquipmentList(); /** * 设å¤ç®¡çé¦é¡µ-ææ¯ç¶æ * @return */ lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentExtendServiceImpl.java
@@ -13,6 +13,8 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.time.LocalDate; import java.time.temporal.TemporalAdjusters; import java.util.Date; /** @@ -98,4 +100,28 @@ } return this.getBaseMapper().updateById(entity) > 0; } @Override @Transactional(rollbackFor = Exception.class) public boolean updateSecondMaintenanceParam(String equipmentId, String status,String secondMaintenanceGenerateFlag){ if (StringUtils.isBlank(status) && StringUtils.isBlank(secondMaintenanceGenerateFlag)) { return false; } EamEquipmentExtend entity = this.getBaseMapper().selectById(equipmentId); UpdateWrapper<EamEquipmentExtend> updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("id", equipmentId); if (StringUtils.isNotBlank(status)) { entity.setMaintenanceStatus(status); } //äºä¿é»è®¤çæå 个æå // 转æ¢ä¸ºLocalDateå¤çæ¥æ LocalDate localDate = DateUtils.dateToLocalDate(entity.getLatestSecondMaintenance()); // 计ç®å 个æåçæ¥æ LocalDate sixMonthsLater = localDate.plusMonths(6); // è°æ´å°å½æçæåä¸å¤© LocalDate lastDayOfMonth = sixMonthsLater.with(TemporalAdjusters.lastDayOfMonth()); entity.setNextSecondMaintenance(DateUtils.localDateToDate(lastDayOfMonth)); return this.getBaseMapper().updateById(entity) > 0; } } lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentServiceImpl.java
@@ -449,6 +449,18 @@ } /** * è·åå¯çæäºä¿å·¥åç设å¤å表 */ @Override public List<EamEquipment> selectSecondMaintenanceEquipmentList(){ QueryWrapper<EamEquipment> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("e.del_flag", CommonConstant.DEL_FLAG_0); queryWrapper.ne("ext.maintenance_status", MaintenanceStatusEnum.PROHIBITED.name()); queryWrapper.isNotNull("ext.next_second_maintenance"); return this.getBaseMapper().selectSecondMaintenanceEquipmentList(queryWrapper); } /** * 设å¤ç®¡çé¦é¡µ-ææ¯ç¶æ * @return */ lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamSecondMaintenanceOrderController.java
@@ -28,6 +28,7 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.text.ParseException; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; @@ -514,7 +515,7 @@ */ @ApiOperation(value = "äºä¿å·¥å-æ§è¡æä½", notes = "äºä¿å·¥å-æ§è¡æä½") @PutMapping(value = "/approval") public Result<?> approval(@RequestBody EamSecondMaintenanceRequest request) { public Result<?> approval(@RequestBody EamSecondMaintenanceRequest request) throws ParseException { if (request == null) { return Result.error("审æ¹ç对象ä¸è½ä¸ºç©ºï¼"); } lxzn-module-eam/src/main/java/org/jeecg/modules/eam/job/SecondMaintenanceOrderGenerateJob.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,185 @@ package org.jeecg.modules.eam.job; import cn.hutool.core.collection.CollectionUtil; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.util.DateUtils; import org.jeecg.modules.eam.constant.BusinessCodeConst; import org.jeecg.modules.eam.constant.MaintenanceCategoryEnum; import org.jeecg.modules.eam.constant.OrderCreationMethodEnum; import org.jeecg.modules.eam.entity.EamEquipment; import org.jeecg.modules.eam.entity.EamMaintenanceStandard; import org.jeecg.modules.eam.entity.EamMaintenanceStandardDetail; import org.jeecg.modules.eam.entity.EamSecondMaintenanceOrderDetail; import org.jeecg.modules.eam.request.EamSecondMaintenanceRequest; import org.jeecg.modules.eam.service.*; import org.jeecg.modules.quartz.entity.QuartzJob; import org.jeecg.modules.quartz.entity.SysQuartzLog; import org.jeecg.modules.quartz.service.IQuartzJobService; import org.jeecg.modules.quartz.service.ISysQuartzLogService; import org.jeecg.modules.system.service.ISysBusinessCodeRuleService; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; /** * @Author: Lyh * @CreateTime: 2025-09-01 * @Description: äºä¿å·¥åçæ */ @Component @Slf4j public class SecondMaintenanceOrderGenerateJob implements Job { @Autowired private IEamEquipmentService equipmentService; @Autowired private IEamSecondMaintenanceOrderService eamSecondMaintenanceOrderService; @Autowired private IEamMaintenanceStandardService eamMaintenanceStandardService; @Autowired private IEamMaintenanceStandardDetailService eamMaintenanceStandardDetailService; @Autowired private ISysBusinessCodeRuleService businessCodeRuleService; @Autowired private ISysQuartzLogService sysQuartzLogService; @Autowired private IQuartzJobService quartzJobService; @Autowired private IEamEquipmentExtendService equipmentExtendService; @Override @Transactional(rollbackFor = Exception.class) public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { // 任塿¥å¿åå§å SysQuartzLog quartzLog = new SysQuartzLog(); quartzLog.setCreateTime(new Date()); List<QuartzJob> byJobClassName = quartzJobService.findByJobClassName(this.getClass().getName()); if (byJobClassName != null && !byJobClassName.isEmpty()) { quartzLog.setJobId(byJobClassName.get(0).getId()); } long startTime = System.currentTimeMillis(); // è·åéè¦äºä¿ç设å¤å表 List<EamEquipment> equipmentList = equipmentService.selectSecondMaintenanceEquipmentList(); if (CollectionUtil.isEmpty(equipmentList)) { log.warn("没æéè¦çæäºä¿å·¥åç设å¤ï¼æ¥æï¼{}", DateUtils.date2Str(DateUtils.date_sdf.get())); quartzLog.setIsSuccess(-1); quartzLog.setExceptionDetail("没æéè¦çæäºä¿å·¥åç设å¤"); saveQuartzLog(quartzLog, startTime); return; } AtomicInteger successCount = new AtomicInteger(0); AtomicInteger failCount = new AtomicInteger(0); StringBuilder sb = new StringBuilder(); // éå设å¤çæå·¥å for (EamEquipment equipment : equipmentList) { generateSecondMaintenanceOrder( equipment, successCount, failCount, sb ); } // ä¿å任塿¥å¿ quartzLog.setIsSuccess(failCount.get() > 0 ? -1 : 0); sb.insert(0, "äºä¿å·¥åçæç»æï¼"); sb.append("\næåï¼").append(successCount.get()).append("ï¼å¤±è´¥ï¼").append(failCount.get()); quartzLog.setExceptionDetail(sb.toString()); saveQuartzLog(quartzLog, startTime); } private void saveQuartzLog(SysQuartzLog quartzLog, long startTime) { long endTime = System.currentTimeMillis(); quartzLog.setExecutionTime(Integer.parseInt(String.valueOf(endTime - startTime))); sysQuartzLogService.save(quartzLog); } private void generateSecondMaintenanceOrder(EamEquipment equipment, AtomicInteger successCount, AtomicInteger failCount, StringBuilder sb) { Date nextMaintenanceDate=equipment.getNextSecondMaintenance(); //æ£æ¥æ¯å¦æ»¡è¶³çææ¡ä»¶ï¼æåä¸å¤©çæ Calendar cal = Calendar.getInstance(); cal.setTime(nextMaintenanceDate); cal.add(Calendar.DAY_OF_MONTH, -1); Date targetDate = cal.getTime(); // è·åå½åæ¥æï¼ä¸å«æ¶é´é¨åï¼ Calendar today = Calendar.getInstance(); today.set(Calendar.HOUR_OF_DAY, 0); today.set(Calendar.MINUTE, 0); today.set(Calendar.SECOND, 0); today.set(Calendar.MILLISECOND, 0); // æ¯è¾æ¥ææ¯å¦å¹é if (targetDate.equals(today.getTime())) { // çæäºä¿å·¥å EamMaintenanceStandard standard = eamMaintenanceStandardService.queryByEquipmentIdAndCategory( equipment.getId(), MaintenanceCategoryEnum.SECOND_MAINTENANCE.name() ); if (standard == null) { handleFailure(equipment, "æªé ç½®äºçº§ä¿å »è§è", failCount, sb); return; } // è·åè§èæç» List<EamMaintenanceStandardDetail> details = eamMaintenanceStandardDetailService.selectByStandardId(standard.getId()); if (CollectionUtil.isEmpty(details)) { handleFailure(equipment, "æªé ç½®äºçº§ä¿å »è§èæç»", failCount, sb); return; } // æå»ºå·¥åè¯·æ± EamSecondMaintenanceRequest request = new EamSecondMaintenanceRequest(); request.setOrderNum(businessCodeRuleService.generateBusinessCodeSeq(BusinessCodeConst.SECOND_MAINTENANCE_CODE_RULE)); request.setEquipmentId(equipment.getId()); request.setStandardId(standard.getId()); request.setMaintenanceDate(nextMaintenanceDate); request.setCreationMethod(OrderCreationMethodEnum.AUTO.name()); // 转æ¢è§èæç» List<EamSecondMaintenanceOrderDetail> orderDetails = details.stream() .map(EamSecondMaintenanceOrderDetail::new) .collect(Collectors.toList()); request.setTableDetailList(orderDetails); try { // å建工å eamSecondMaintenanceOrderService.addMaintenance(request); // æ´æ°è®¾å¤ç¶æ equipmentExtendService.updateSecondMaintenanceParam( equipment.getId(), null, CommonConstant.STATUS_1 ); successCount.incrementAndGet(); log.info("è®¾å¤ {} äºä¿å·¥åçææå", equipment.getEquipmentCode()); } catch (Exception e) { handleFailure(equipment, "çæå¤±è´¥: " + e.getMessage(), failCount, sb); log.error("è®¾å¤ {} äºä¿å·¥åçæå¼å¸¸", equipment.getEquipmentCode(), e); } } } private void handleFailure(EamEquipment equipment, String reason, AtomicInteger failCount, StringBuilder sb) { failCount.incrementAndGet(); sb.append("\nè®¾å¤ ") .append(equipment.getEquipmentCode()) .append("ï¼") .append(reason); log.warn("è®¾å¤ {} äºä¿å·¥åçæå¤±è´¥ï¼{}", equipment.getEquipmentCode(), reason); } } lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamSecondMaintenanceRequest.java
@@ -55,20 +55,6 @@ @DateTimeFormat(pattern = "yyyy-MM-dd") private Date maintenanceDate; /** * éå®å·¥åæ¥æ */ @ApiModelProperty(value = "éå®å·¥åæ¥æ;æå55天éå®å·¥å") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private Date freezeOrderDate; /** * å·¥åè¿ææ¥æ */ @ApiModelProperty(value = "å·¥åè¿ææ¥æ;å°ææªåç´æ¥è¿æ") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private Date orderExpirationDate; /** * å®é å¼å§æ¶é´ */ @ApiModelProperty(value = "å®é å¼å§æ¶é´") lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamSecondMaintenanceOrderService.java
@@ -9,6 +9,7 @@ import org.jeecg.modules.eam.request.EamSecondMaintenanceRequest; import org.jeecg.modules.eam.vo.EamEquipmentTree; import java.text.ParseException; import java.util.List; /** @@ -57,7 +58,7 @@ * @param request * @return */ EamSecondMaintenanceOrder approval(EamSecondMaintenanceRequest request); EamSecondMaintenanceOrder approval(EamSecondMaintenanceRequest request) throws ParseException; /** lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamSecondMaintenanceOrderAsyncService.java
ÎļþÒÑɾ³ý lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamSecondMaintenanceOrderServiceImpl.java
@@ -52,7 +52,10 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.temporal.TemporalAdjusters; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -100,8 +103,6 @@ private BaseFactoryMapper baseFactoryMapper; @Autowired private IEamSecondMaintenanceOrderDetailService eamSecondMaintenanceOrderDetailService; @Autowired private EamSecondMaintenanceOrderAsyncService eamSecondMaintenanceOrderAsyncService; @Autowired private IEamFactorySecondMaintPlanService factorySecondMaintPlanService; @@ -349,9 +350,9 @@ } // æå ¥é¦é¡µäºä¿å »è®¡å // ä½¿ç¨ SimpleDateFormat ç´æ¥æ ¼å¼å为âyyyyå¹´MMæâæ ¼å¼ SimpleDateFormat sdf = new SimpleDateFormat("yyyyå¹´MMæ"); String formattedDate = sdf.format(order.getMaintenanceDate()); factorySecondMaintPlanService.add(order.getEquipmentId(), formattedDate); // SimpleDateFormat sdf = new SimpleDateFormat("yyyyå¹´MMæ"); // String formattedDate = sdf.format(order.getMaintenanceDate()); // factorySecondMaintPlanService.add(order.getEquipmentId(), formattedDate); return true; } @@ -486,7 +487,7 @@ @Override @Transactional(rollbackFor = Exception.class) @EquipmentHistoryLog(operationTag = EquipmentOperationTagEnum.SECOND_MAINTENANCE, businessTable = "eam_second_maintenance_order") public EamSecondMaintenanceOrder approval(EamSecondMaintenanceRequest request) { public EamSecondMaintenanceOrder approval(EamSecondMaintenanceRequest request) throws ParseException { EamSecondMaintenanceOrder entity = eamSecondMaintenanceOrderMapper.selectById(request.getId()); if (entity == null) { throw new JeecgBootException("审æ¹çæ°æ®å·²å é¤ï¼è¯·å·æ°éè¯ï¼"); @@ -683,17 +684,32 @@ eamSecondMaintenanceOrderMapper.updateById(entity); //弿¥çæä¸æ¬¡äºä¿å·¥å if (SecondMaintenanceStatusEnum.COMPLETE.name().equals(entity.getMaintenanceStatus())) { try { eamSecondMaintenanceOrderAsyncService.asyncGenerateNextMaintenanceOrder(entity.getId()); } catch (Exception e) { log.error("触å弿¥çæä¸æ¬¡å·¥å失败ï¼å·¥åID: {}", entity.getId(), e); } //å¡«å 计ç®ä¸æ¬¡äºä¿æ¥æ EamEquipmentExtend eamEquipmentExtend=eamEquipmentExtendService.getById(entity.getEquipmentId()); eamEquipmentExtend.setLatestSecondMaintenance(entity.getMaintenanceDate()); eamEquipmentExtend.setNextSecondMaintenance(calculateNextMaintenanceDate(entity.getMaintenanceDate())); eamEquipmentExtendService.updateById(eamEquipmentExtend); } return entity; } /** * 计ç®å 个æåç彿æåä¸å¤© * @param currentDate å½å工忥æ * @return å 个æåç彿æåä¸å¤© */ private Date calculateNextMaintenanceDate(Date currentDate) { // 转æ¢ä¸ºLocalDateå¤çæ¥æ LocalDate localDate = DateUtils.dateToLocalDate(currentDate); // 计ç®å 个æåçæ¥æ LocalDate sixMonthsLater = localDate.plusMonths(6); // è°æ´å°å½æçæåä¸å¤© LocalDate lastDayOfMonth = sixMonthsLater.with(TemporalAdjusters.lastDayOfMonth()); // 转æ¢åDateç±»å return DateUtils.localDateToDate(lastDayOfMonth); } /** * æ¹éæå°äºä¿å·¥å * @param ids * @return