| | |
| | | */ |
| | | package org.sxkj.fw.device.service.impl; |
| | | |
| | | import org.sxkj.fw.device.dto.FwDeviceMaintainRecordDTO; |
| | | import org.sxkj.fw.device.entity.FwDeviceMaintainRecordEntity; |
| | | import org.sxkj.fw.device.vo.FwDeviceMaintainRecordVO; |
| | | import org.sxkj.fw.device.excel.FwDeviceMaintainRecordExcel; |
| | | import org.sxkj.fw.device.mapper.FwDeviceMaintainRecordMapper; |
| | | import org.sxkj.fw.device.service.IFwDeviceMaintainRecordService; |
| | | import org.springframework.stereotype.Service; |
| | | import com.baomidou.mybatisplus.core.conditions.Wrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springblade.core.mp.base.BaseServiceImpl; |
| | | import org.springframework.stereotype.Service; |
| | | import org.sxkj.common.utils.DateUtils; |
| | | import org.sxkj.fw.device.dto.FwDeviceMaintainRecordDTO; |
| | | import org.sxkj.fw.device.entity.FwDeviceMaintainPlanEntity; |
| | | import org.sxkj.fw.device.entity.FwDeviceMaintainRecordEntity; |
| | | import org.sxkj.fw.device.excel.FwDeviceMaintainRecordExcel; |
| | | import org.sxkj.fw.device.mapper.FwDeviceMaintainRecordMapper; |
| | | import org.sxkj.fw.device.service.IFwDeviceMaintainPlanService; |
| | | import org.sxkj.fw.device.service.IFwDeviceMaintainRecordService; |
| | | import org.sxkj.fw.device.vo.FwDeviceMaintainRecordVO; |
| | | |
| | | import java.time.DayOfWeek; |
| | | import java.time.LocalDateTime; |
| | | import java.time.ZoneId; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | * @since 2026-01-08 |
| | | */ |
| | | @Service |
| | | @AllArgsConstructor |
| | | public class FwDeviceMaintainRecordServiceImpl extends BaseServiceImpl<FwDeviceMaintainRecordMapper, FwDeviceMaintainRecordEntity> implements IFwDeviceMaintainRecordService { |
| | | |
| | | private final IFwDeviceMaintainPlanService fwDeviceMaintainPlanService; |
| | | |
| | | @Override |
| | | public FwDeviceMaintainRecordVO selectLastOne(Long planId) { |
| | | return baseMapper.selectLastOne(planId); |
| | | } |
| | | |
| | | @Override |
| | | public IPage<FwDeviceMaintainRecordVO> selectFwDeviceMaintainRecordPage(IPage<FwDeviceMaintainRecordVO> page, FwDeviceMaintainRecordDTO fwDeviceMaintainRecord) { |
| | | return page.setRecords(baseMapper.selectFwDeviceMaintainRecordPage(page, fwDeviceMaintainRecord)); |
| | | } |
| | | |
| | | @Override |
| | | public boolean saveOrUpdate(FwDeviceMaintainRecordEntity entity) { |
| | | // 维护时间 |
| | | Date maintainTime = entity.getMaintainTime(); |
| | | |
| | | // 查询计划的规则 |
| | | FwDeviceMaintainPlanEntity fwDeviceMaintainPlan = fwDeviceMaintainPlanService.getById(entity.getPlanId()); |
| | | if (null == fwDeviceMaintainPlan) { |
| | | return false; |
| | | } |
| | | |
| | | // 验证维护时间是否符合计划周期 |
| | | boolean isInCycle = validateMaintainTimeInCycle(maintainTime, fwDeviceMaintainPlan); |
| | | |
| | | // 在当前周期内修改计划维修状态 |
| | | if (isInCycle) { |
| | | updatePlanMaintainStatus(fwDeviceMaintainPlan, maintainTime); |
| | | } |
| | | |
| | | return super.saveOrUpdate(entity); |
| | | } |
| | | |
| | | @Override |
| | | public List<FwDeviceMaintainRecordExcel> exportFwDeviceMaintainRecord(Wrapper<FwDeviceMaintainRecordEntity> queryWrapper) { |
| | | List<FwDeviceMaintainRecordExcel> fwDeviceMaintainRecordList = baseMapper.exportFwDeviceMaintainRecord(queryWrapper); |
| | | //fwDeviceMaintainRecordList.forEach(fwDeviceMaintainRecord -> { |
| | | // fwDeviceMaintainRecord.setTypeName(DictCache.getValue(DictEnum.YES_NO, FwDeviceMaintainRecord.getType())); |
| | | //}); |
| | | return fwDeviceMaintainRecordList; |
| | | } |
| | | |
| | | // region 维修计划状态更新相关 |
| | | |
| | | /** |
| | | * 验证维护时间是否在计划周期内 |
| | | */ |
| | | private boolean validateMaintainTimeInCycle(Date maintainTime, FwDeviceMaintainPlanEntity plan) { |
| | | String planCycleType = plan.getPlanCycleType(); |
| | | List<String> planCycleValue = plan.getPlanCycleValue(); |
| | | |
| | | for (String ruleValue : planCycleValue) { |
| | | boolean isValid = false; |
| | | |
| | | switch (planCycleType) { |
| | | case "1": // 年度规则 |
| | | isValid = validateAnnualCycle(maintainTime, ruleValue); |
| | | break; |
| | | case "2": // 月度规则 |
| | | isValid = validateMonthlyCycle(maintainTime, ruleValue); |
| | | break; |
| | | case "3": // 周度规则 |
| | | isValid = validateWeeklyCycle(maintainTime, ruleValue); |
| | | break; |
| | | } |
| | | |
| | | if (isValid) { |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * 验证年度周期 |
| | | */ |
| | | private boolean validateAnnualCycle(Date maintainTime, String ruleValue) { |
| | | String[] parts = ruleValue.split("月"); |
| | | int ruleMonth = Integer.parseInt(parts[0]); |
| | | int ruleDay = Integer.parseInt(parts[1].replace("号", "")); |
| | | |
| | | LocalDateTime[] cycleBounds = DateUtils.calculateAnnualCycle(new Date(), ruleMonth, ruleDay); |
| | | return DateUtils.isMaintainTimeInCycle(maintainTime, cycleBounds[0], cycleBounds[1]); |
| | | } |
| | | |
| | | /** |
| | | * 验证月度周期 |
| | | */ |
| | | private boolean validateMonthlyCycle(Date maintainTime, String ruleValue) { |
| | | int ruleDay = Integer.parseInt(ruleValue.replace("号", "")); |
| | | |
| | | LocalDateTime[] cycleBounds = DateUtils.calculateMonthlyCycle(new Date(), ruleDay); |
| | | return DateUtils.isMaintainTimeInCycle(maintainTime, cycleBounds[0], cycleBounds[1]); |
| | | } |
| | | |
| | | /** |
| | | * 验证周度周期 |
| | | */ |
| | | private boolean validateWeeklyCycle(Date maintainTime, String ruleValue) { |
| | | int ruleDayOfWeek = DateUtils.getDayOfWeekNumber(ruleValue); |
| | | |
| | | LocalDateTime[] cycleBounds = DateUtils.calculateWeeklyCycle(new Date(), ruleDayOfWeek); |
| | | // String dateStart = cycleBounds[0].atZone(ZoneId.of("Asia/Shanghai")).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); |
| | | // String dateEnd = cycleBounds[1].atZone(ZoneId.of("Asia/Shanghai")).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); |
| | | // String dateMaintain = maintainTime.toInstant().atZone(ZoneId.of("Asia/Shanghai")).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); |
| | | // |
| | | // log.debug("维护时间: " + dateMaintain + ", 周期开始: " + dateStart + ", 周期结束: " + dateEnd); |
| | | return DateUtils.isMaintainTimeInCycle(maintainTime, cycleBounds[0], cycleBounds[1]); |
| | | } |
| | | |
| | | /** |
| | | * 更新计划维护状态 |
| | | */ |
| | | private void updatePlanMaintainStatus(FwDeviceMaintainPlanEntity plan, Date maintainTime) { |
| | | FwDeviceMaintainPlanEntity updateEntity = new FwDeviceMaintainPlanEntity(); |
| | | updateEntity.setId(plan.getId()); |
| | | updateEntity.setMaintainStatus(1); // 维护状态 |
| | | updateEntity.setLastMaintainTime(maintainTime); // 最后一次维护时间 |
| | | fwDeviceMaintainPlanService.updateById(updateEntity); |
| | | } |
| | | |
| | | // endregion 维修计划状态更新相关 |
| | | |
| | | } |