设备二保定时服务开发,填充车间二保计划数据,三不放过批量导出接口
已添加1个文件
已修改19个文件
562 ■■■■■ 文件已修改
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamEquipment.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamEquipmentExtend.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamFactorySecondMaintPlan.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamFactorySecondMaintPlanMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamReportThreeNoSpareMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamFactorySecondMaintPlanMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamReportThreeNoSpareMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamFactorySecondMaintPlanService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamReportThreeNoSpareService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamFactorySecondMaintPlanServiceImpl.java 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamReportThreeNoSpareServiceImpl.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamHomeController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamReportThreeNoSpareController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/xml/EamSecondMaintenanceOrderMapper.xml 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamSecondMaintenanceRequest.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamSecondMaintenanceOrderService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamSecondMaintenanceOrderAsyncService.java 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamSecondMaintenanceOrderServiceImpl.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IBaseFactoryService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/BaseFactoryServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamEquipment.java
@@ -469,6 +469,10 @@
    @ApiModelProperty(value = "三保生成标记 1 å·²ç”Ÿæˆ 0 æœªç”Ÿæˆ")
    @TableField(exist = false)
    private String thirdMaintenanceGenerateFlag;
    /** äºŒä¿ç”Ÿæˆæ ‡è®° 1 å·²ç”Ÿæˆ 0 æœªç”Ÿæˆ */
    @ApiModelProperty(value = "二保生成标记 1 å·²ç”Ÿæˆ 0 æœªç”Ÿæˆ")
    @TableField(exist = false)
    private String secondMaintenanceGenerateFlag;
    /**
     * ä¿å…»è§„范名称
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamEquipmentExtend.java
@@ -97,4 +97,7 @@
    /** ä¸‰ä¿ç”Ÿæˆæ ‡è®° 1 å·²ç”Ÿæˆ 0 æœªç”Ÿæˆ */
    @ApiModelProperty(value = "三保生成标记 1 å·²ç”Ÿæˆ 0 æœªç”Ÿæˆ")
    private String thirdMaintenanceGenerateFlag;
    /** äºŒä¿ç”Ÿæˆæ ‡è®° 1 å·²ç”Ÿæˆ 0 æœªç”Ÿæˆ */
    @ApiModelProperty(value = "二保生成标记 1 å·²ç”Ÿæˆ 0 æœªç”Ÿæˆ")
    private String secondMaintenanceGenerateFlag;
}
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamFactorySecondMaintPlan.java
@@ -49,7 +49,7 @@
    /**删除标记*/
    @Excel(name = "删除标记", width = 15)
    @ApiModelProperty(value = "删除标记")
    private Integer delFlag;
    private Integer delFlag=0;
    /**工厂ID*/
    @Excel(name = "工厂ID", width = 15)
    @ApiModelProperty(value = "工厂ID")
@@ -65,5 +65,5 @@
    /**数量*/
    @Excel(name = "数量", width = 15)
    @ApiModelProperty(value = "数量")
    private String quantity;
    private Integer quantity;
}
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamFactorySecondMaintPlanMapper.java
@@ -14,4 +14,10 @@
 */
public interface EamFactorySecondMaintPlanMapper extends BaseMapper<EamFactorySecondMaintPlan> {
    /**
     * è®¾å¤‡ç®¡ç†é¦–页-车间二保计划列表
     * @return
     */
    List<EamFactorySecondMaintPlan> queryAllList();
}
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamReportThreeNoSpareMapper.java
@@ -6,6 +6,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.eam.dto.EamReportThreeNoSpareDto;
import org.jeecg.modules.eam.entity.EamReportThreeNoSpare;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.jeecg.modules.eam.request.EamReportThreeNoSpareQuery;
@@ -19,4 +20,11 @@
public interface EamReportThreeNoSpareMapper extends BaseMapper<EamReportThreeNoSpare> {
    IPage<EamReportThreeNoSpareQuery> queryPageList(IPage<EamReportThreeNoSpareQuery> page, @Param(Constants.WRAPPER) QueryWrapper<EamReportThreeNoSpareQuery> EamReportThreeNoSpareQuery);
    /**
     * â€œä¸‰ä¸æ”¾è¿‡çš„原则”分析表列表
     * @param eamReportThreeNoSpareDto
     * @return
     */
    List<EamReportThreeNoSpareDto> queryList(@Param(Constants.WRAPPER) QueryWrapper<EamReportThreeNoSpareDto> eamReportThreeNoSpareDto);
}
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamFactorySecondMaintPlanMapper.xml
@@ -2,4 +2,13 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.eam.mapper.EamFactorySecondMaintPlanMapper">
    <select id="queryAllList" resultType="org.jeecg.modules.eam.entity.EamFactorySecondMaintPlan">
        SELECT efsmp.*
        FROM eam_factory_second_maint_plan efsmp
                 LEFT JOIN eam_base_factory ebf ON efsmp.factory_id = ebf.id
        WHERE efsmp.del_flag = 0
        ORDER BY CAST(SUBSTRING(efsmp.month_plan, 1, 4) AS INT),
                 CAST(SUBSTRING(efsmp.month_plan, 6, 2) AS INT),
                 ebf.org_code;
    </select>
</mapper>
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamReportThreeNoSpareMapper.xml
@@ -21,4 +21,23 @@
                                AND e.del_flag = 0
            ${ew.customSqlSegment}
    </select>
    <select id="queryList" resultType="org.jeecg.modules.eam.dto.EamReportThreeNoSpareDto">
        SELECT
            ertns.*,
            e.equipment_code,
            e.equipment_name,
            e.equipment_model,
            e.installation_position,
            erar.accident_phenomenon,
            erar.measure,
            erar.causing_results
        FROM eam_report_three_no_spare ertns
                 LEFT JOIN eam_report_accidents_register erar
                           ON ertns.report_id = erar.report_id
                               AND erar.del_flag = 0
                 INNER JOIN eam_equipment e
                            ON erar.equipment_id = e.id
                                AND e.del_flag = 0
            ${ew.customSqlSegment}
    </select>
</mapper>
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamFactorySecondMaintPlanService.java
@@ -3,6 +3,8 @@
import org.jeecg.modules.eam.entity.EamFactorySecondMaintPlan;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
 * @Description: â€œé¦–页车间二保计划
 * @Author: jeecg-boot
@@ -11,4 +13,26 @@
 */
public interface IEamFactorySecondMaintPlanService extends IService<EamFactorySecondMaintPlan> {
    /**
     * è®¾å¤‡ç®¡ç†é¦–页-车间二保计划列表
     * @return
     */
    public List<EamFactorySecondMaintPlan> queryAllList();
    /**
     * æ–°å¢žé¦–页车间二保计划
     * @param equipmentId
     * @param monthPlan
     * @return
     */
    public EamFactorySecondMaintPlan add(String equipmentId, String monthPlan);
    /**
     * æ—¥æœŸå˜åŒ–
     * @param equipmentId
     * @param oldMonthPlan
     * @param newMonthPlan
     * @return
     */
    public boolean dateChange(String equipmentId, String oldMonthPlan, String newMonthPlan);
}
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamReportThreeNoSpareService.java
@@ -9,6 +9,8 @@
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.eam.request.EamReportThreeNoSpareQuery;
import java.util.List;
/**
 * @Description: â€œä¸‰ä¸æ”¾è¿‡çš„原则”分析表
 * @Author: jeecg-boot
@@ -38,4 +40,10 @@
     */
    Result<?> audit(EamReportThreeNoSpareDto eamReportThreeNoSpareDto);
    /**
     * â€œä¸‰ä¸æ”¾è¿‡çš„原则”分析表打印
     * @param ids
     * @return
     */
    List<EamReportThreeNoSpareDto> print(String ids);
}
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamFactorySecondMaintPlanServiceImpl.java
@@ -1,19 +1,192 @@
package org.jeecg.modules.eam.service.impl;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.jeecg.modules.eam.entity.EamEquipment;
import org.jeecg.modules.eam.entity.EamFactorySecondMaintPlan;
import org.jeecg.modules.eam.mapper.EamFactorySecondMaintPlanMapper;
import org.jeecg.modules.eam.service.IEamEquipmentService;
import org.jeecg.modules.eam.service.IEamFactorySecondMaintPlanService;
import org.jeecg.modules.system.entity.BaseFactory;
import org.jeecg.modules.system.service.IBaseFactoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
 * @Description: â€œé¦–页车间二保计划
 * @Author: jeecg-boot
 * &#064;Author:  jeecg-boot
 * @Date:   2025-08-22
 * @Version: V1.0
 */
@Service
public class EamFactorySecondMaintPlanServiceImpl extends ServiceImpl<EamFactorySecondMaintPlanMapper, EamFactorySecondMaintPlan> implements IEamFactorySecondMaintPlanService {
    @Autowired
    private IBaseFactoryService baseFactoryService;
    @Autowired
    private IEamEquipmentService eamEquipmentService;
    /**
     * è®¾å¤‡ç®¡ç†é¦–页-车间二保计划列表
     * @return
     */
    @Override
    public List<EamFactorySecondMaintPlan> queryAllList(){
        return this.baseMapper.queryAllList();
    }
    /**
     * æ–°å¢žé¦–页车间二保计划
     * @param equipmentId
     * @param monthPlan
     * @return
     */
    @Override
    public EamFactorySecondMaintPlan add(String equipmentId, String monthPlan) {
        EamEquipment equipment=eamEquipmentService.getById(equipmentId);
        if (equipment==null) {
            return null;
        }
        String factoryId = baseFactoryService.queryByCode(equipment.getFactoryOrgCode().substring(0,6)).getId();
        // å°è¯•直接更新(原子操作)
        LambdaUpdateWrapper<EamFactorySecondMaintPlan> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(EamFactorySecondMaintPlan::getFactoryId, factoryId)
                .eq(EamFactorySecondMaintPlan::getMonthPlan, monthPlan)
                .setSql("quantity = quantity + 1"); // åŽŸå­å¢žåŠ 
        int updated = this.baseMapper.update(null, updateWrapper);
        if (updated > 0) {
            // æ›´æ–°æˆåŠŸï¼Œè¿”å›žæ›´æ–°åŽçš„è®°å½•
            return this.getOne(Wrappers.<EamFactorySecondMaintPlan>lambdaQuery()
                    .eq(EamFactorySecondMaintPlan::getFactoryId, factoryId)
                    .eq(EamFactorySecondMaintPlan::getMonthPlan, monthPlan));
        } else {
            // æ— è®°å½•存在,创建新记录
            return createNewPlan(factoryId, monthPlan);
        }
    }
    private EamFactorySecondMaintPlan createNewPlan(String factoryId, String monthPlan) {
        EamFactorySecondMaintPlan newPlan = new EamFactorySecondMaintPlan();
        newPlan.setFactoryId(factoryId);
        newPlan.setMonthPlan(monthPlan);
        newPlan.setQuantity(1);
        // è®¾ç½®å·¥åŽ‚åç§°ï¼ˆä¼˜åŒ–å¤„ç†ï¼‰
        BaseFactory baseFactory = baseFactoryService.getById(factoryId);
        if (baseFactory != null) {
            String orgCode = baseFactory.getOrgCode();
            // ä½¿ç”¨æ•´ä¸ªorgCode(如果长度不足6)
            String nameOrgCode = orgCode.length() >= 6 ? orgCode.substring(0, 6) : orgCode;
            newPlan.setFactoryName(baseFactoryService.factoryDataNameByOrgCode(nameOrgCode));
        }
        // å¤„理并发创建冲突
        try {
            this.save(newPlan);
            return newPlan;
        } catch (DuplicateKeyException e) {
            // å…¶ä»–线程已创建,转为更新
            return add(factoryId, monthPlan);
        }
    }
    /**
     * æ—¥æœŸå˜åŒ–
     * @param equipmentId è®¾å¤‡ID
     * @param oldMonthPlan æ—§æœˆä»½è®¡åˆ’(格式如yyyy-MM)
     * @param newMonthPlan æ–°æœˆä»½è®¡åˆ’(格式如yyyy-MM)
     * @return æ˜¯å¦æˆåŠŸå˜æ›´
    */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean dateChange(String equipmentId, String oldMonthPlan, String newMonthPlan) {
        // 1. èŽ·å–è®¾å¤‡ä¿¡æ¯
        EamEquipment equipment = eamEquipmentService.getById(equipmentId);
        if (equipment == null) {
            return false;
        }
        // 2. èŽ·å–å·¥åŽ‚ID
        String factoryOrgCodePrefix = equipment.getFactoryOrgCode().substring(0, 6);
        BaseFactory factory = baseFactoryService.queryByCode(factoryOrgCodePrefix);
        if (factory == null) {
            return false;
        }
        String factoryId = factory.getId();
        // 3. å¦‚果月份未变化直接返回成功
        if (oldMonthPlan.equals(newMonthPlan)) {
            return true;
        }
        try {
            // 4. å‡å°‘旧月份计划数量(原子操作)
            boolean oldDecreased = decreasePlanQuantity(factoryId, oldMonthPlan);
            if (!oldDecreased) {
                throw new RuntimeException("减少旧月份计划数量失败,可能记录不存在或数量为0");
            }
            // 5. å¢žåŠ æ–°æœˆä»½è®¡åˆ’æ•°é‡
            increasePlanQuantity(factoryId, newMonthPlan);
            return true;
        } catch (Exception e) {
            // äº‹åŠ¡å›žæ»š
            throw new RuntimeException("日期变更失败: " + e.getMessage(), e);
        }
    }
    /**
     * å‡å°‘计划数量,如果减少后数量为0则删除记录
     */
    private boolean decreasePlanQuantity(String factoryId, String monthPlan) {
        // å…ˆå‡å°‘数量
        LambdaUpdateWrapper<EamFactorySecondMaintPlan> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(EamFactorySecondMaintPlan::getFactoryId, factoryId)
                .eq(EamFactorySecondMaintPlan::getMonthPlan, monthPlan)
                .gt(EamFactorySecondMaintPlan::getQuantity, 0) // ç¡®ä¿æ•°é‡å¤§äºŽ0
                .setSql("quantity = quantity - 1");
        int updated = baseMapper.update(null, updateWrapper);
        if (updated > 0) {
            // æ£€æŸ¥æ›´æ–°åŽçš„æ•°é‡æ˜¯å¦ä¸º0,如果是则删除记录
            EamFactorySecondMaintPlan updatedPlan = baseMapper.selectOne(
                    Wrappers.<EamFactorySecondMaintPlan>lambdaQuery()
                            .eq(EamFactorySecondMaintPlan::getFactoryId, factoryId)
                            .eq(EamFactorySecondMaintPlan::getMonthPlan, monthPlan)
            );
            if (updatedPlan != null && updatedPlan.getQuantity() == 0) {
                baseMapper.deleteById(updatedPlan.getId());
            }
            return true;
        }
        return false;
    }
    /**
     * å¢žåŠ è®¡åˆ’æ•°é‡
     */
    private void increasePlanQuantity(String factoryId, String monthPlan) {
        // ç›´æŽ¥æ›´æ–°
        LambdaUpdateWrapper<EamFactorySecondMaintPlan> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(EamFactorySecondMaintPlan::getFactoryId, factoryId)
                .eq(EamFactorySecondMaintPlan::getMonthPlan, monthPlan)
                .setSql("quantity = quantity + 1");
        if (baseMapper.update(null, updateWrapper) == 0) {
            // æ›´æ–°å¤±è´¥è¯´æ˜Žè®°å½•不存在,创建新记录
            createNewPlan(factoryId, monthPlan);
        }
    }
}
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamReportThreeNoSpareServiceImpl.java
@@ -18,7 +18,9 @@
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.eam.constant.BusinessCodeConst;
import org.jeecg.modules.eam.constant.EamReportAccidentsRegisterEnum;
import org.jeecg.modules.eam.constant.EamReportThreeNoSpareEnum;
import org.jeecg.modules.eam.dto.EamReportThreeNoSpareDto;
import org.jeecg.modules.eam.dto.EamReportThreeNoSpareDto;
import org.jeecg.modules.eam.entity.EamEquipment;
import org.jeecg.modules.eam.entity.EamReportThreeNoSpare;
@@ -266,6 +268,47 @@
        return Result.ok("审批成功");
    }
    /**
     * â€œä¸‰ä¸æ”¾è¿‡çš„原则”分析表打印
     * @param ids
     * @return
     */
    @Override
    public List<EamReportThreeNoSpareDto> print(String ids){
        QueryWrapper<EamReportThreeNoSpareDto> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("ertns.del_flag",CommonConstant.DEL_FLAG_0.toString());
        queryWrapper.eq("ertns.submit_status", EamReportThreeNoSpareEnum.REPAIR_COMPLETED.name());
        //用户数据权限
        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        if (sysUser == null) {
            return new ArrayList<>();
        }
        if (StringUtils.isNotBlank(sysUser.getEamEquipmentIds())) {
            //选择了设备,根据设备id过滤设备
            List<String> equipArr = Arrays.asList(sysUser.getEamEquipmentIds().split(","));
            queryWrapper.in("e.equipment_code", equipArr);
        } else {
            //没有选择设备,根据中心过滤设备
            List<BaseFactoryUser> baseFactoryUserList=baseFactoryUserService.
                    list(new LambdaQueryWrapper<BaseFactoryUser>().eq(BaseFactoryUser::getUserId,sysUser.getId()));
            if(!CollectionUtils.isEmpty(baseFactoryUserList)){
                Set<String> factoryIds = baseFactoryUserList.stream().map(BaseFactoryUser::getFactoryId).collect(Collectors.toSet());
                Set<String> factoryCode= baseFactoryService.listByIds(factoryIds).stream().map(BaseFactory::getOrgCode).collect(Collectors.toSet());
                queryWrapper.in("e.factory_org_code", factoryCode);
            } else {
                return new ArrayList<>();
            }
        }
        //查询条件过滤
        if (StrUtil.isNotEmpty(ids)) {
            List<String> idList = Arrays.asList(ids.split(","));
            queryWrapper.in("ertns.id", idList);
        } else {
            queryWrapper.orderByDesc("ertns.create_time");
        }
        return this.baseMapper.queryList(queryWrapper);
    }
    private boolean claimTask(String taskId, LoginUser user) {
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        if (task == null) {
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamHomeController.java
@@ -85,8 +85,7 @@
    @ApiOperation(value = "设备管理首页-二保列表", notes = "设备管理首页-二保列表")
    @GetMapping(value = "/secondmaintenance")
    public Result<?> secondmaintenance() {
        //二级保养
        List<EamFactorySecondMaintPlan> echartsDtoList = iEamFactorySecondMaintPlanService.list();
        List<EamFactorySecondMaintPlan> echartsDtoList = iEamFactorySecondMaintPlanService.queryAllList();
        return Result.ok(echartsDtoList);
    }
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamReportThreeNoSpareController.java
@@ -141,6 +141,17 @@
         return eamReportThreeNoSpareService.audit(eamReportThreeNoSpareDto);
     }
     /**
      * â€œä¸‰ä¸æ”¾è¿‡çš„原则”分析表打印
      * @param ids
      * @return
      */
     @ApiOperation(value = "“三不放过的原则”分析表--打印", notes = "“三不放过的原则”分析表--打印")
     @GetMapping(value = "/batchExport")
     public Result<?> batchExport(String ids){
         return Result.ok(eamReportThreeNoSpareService.print(ids));
     }
    /**
     *   é€šè¿‡id删除
     *
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/xml/EamSecondMaintenanceOrderMapper.xml
@@ -3,14 +3,25 @@
<mapper namespace="org.jeecg.modules.eam.mapper.EamSecondMaintenanceOrderMapper">
    <select id="queryPageList" resultType="org.jeecg.modules.eam.entity.EamSecondMaintenanceOrder">
        select wmo.*, e.equipment_code, e.equipment_name,e.equipment_model,f.process_instance_id as 'procInstId',
               f.process_definition_key,
               f.process_definition_id,
               f.process_instance_id
        from eam_second_maintenance_order wmo
        inner join eam_equipment e
        on wmo.equipment_id = e.id
        left join flow_my_business f on f.data_id=wmo.id
        SELECT
            wmo.*,
            e.equipment_code,
            e.equipment_name,
            e.equipment_model,
            f.process_instance_id AS 'procInstId',
            f.process_definition_key,
            f.process_definition_id,
            f.process_instance_id
        FROM eam_second_maintenance_order wmo
                 INNER JOIN eam_equipment e ON wmo.equipment_id = e.id
                 LEFT JOIN (
            SELECT
                data_id,
                MAX(id) AS max_id -- èŽ·å–æœ€å¤§ID
            FROM flow_my_business
            GROUP BY data_id
        ) latest ON wmo.id = latest.data_id
                 LEFT JOIN flow_my_business f ON f.id = latest.max_id
        ${ew.customSqlSegment}
    </select>
    <select id="queryList" resultType="org.jeecg.modules.eam.dto.EamSecondMaintenanceOrderExport">
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamSecondMaintenanceRequest.java
@@ -55,6 +55,20 @@
    @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
@@ -59,6 +59,7 @@
     */
    EamSecondMaintenanceOrder approval(EamSecondMaintenanceRequest request);
    /**
     * æ‰¹é‡æ‰“印二保工单
     * @param ids
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamSecondMaintenanceOrderAsyncService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,153 @@
package org.jeecg.modules.eam.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.util.DateUtils;
import org.jeecg.modules.eam.constant.BusinessCodeConst;
import org.jeecg.modules.eam.constant.HfTemplateCategoryEnum;
import org.jeecg.modules.eam.constant.SecondMaintenanceStatusEnum;
import org.jeecg.modules.eam.entity.EamBaseHFCode;
import org.jeecg.modules.eam.entity.EamMaintenanceStandardDetail;
import org.jeecg.modules.eam.entity.EamSecondMaintenanceOrder;
import org.jeecg.modules.eam.entity.EamSecondMaintenanceOrderDetail;
import org.jeecg.modules.eam.mapper.EamSecondMaintenanceOrderMapper;
import org.jeecg.modules.eam.service.IEamBaseHFCodeService;
import org.jeecg.modules.eam.service.IEamFactorySecondMaintPlanService;
import org.jeecg.modules.eam.service.IEamMaintenanceStandardDetailService;
import org.jeecg.modules.eam.service.IEamSecondMaintenanceOrderDetailService;
import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@Service
@Slf4j
public class EamSecondMaintenanceOrderAsyncService {
    @Resource
    private EamSecondMaintenanceOrderMapper eamSecondMaintenanceOrderMapper;
    @Autowired
    private IEamSecondMaintenanceOrderDetailService secondMaintenanceOrderDetailService;
    @Autowired
    private IEamMaintenanceStandardDetailService eamMaintenanceStandardDetailService;
    @Autowired
    private IEamBaseHFCodeService hfCodeService;
    @Autowired
    private ISysBusinessCodeRuleService businessCodeRuleService;
    @Autowired
    private IEamFactorySecondMaintPlanService factorySecondMaintPlanService;
    @Async
    public void asyncGenerateNextMaintenanceOrder(String orderId) {
        try {
            log.info("开始异步生成下次工单,原工单ID: {}", orderId);
            generateNextOrder(orderId);
            log.info("异步生成下次工单完成,原工单ID: {}", orderId);
        } catch (Exception e) {
            log.error("异步生成下次工单失败,工单ID: {}", orderId, e);
            // å‘送告警通知或进行重试
        }
    }
    @Transactional(rollbackFor = Exception.class)
    public void generateNextOrder(String orderId) {
        EamSecondMaintenanceOrder entity = eamSecondMaintenanceOrderMapper.selectById(orderId);
        if (entity == null) {
            log.warn("原工单不存在,ID: {}", orderId);
            return;
        }
        if (!entity.getMaintenanceStatus().equals(SecondMaintenanceStatusEnum.COMPLETE.name())) {
            log.warn("原工单状态未完成,不生成下次工单,ID: {}", orderId);
            return;
        }
        // ç”Ÿæˆæ–°çš„工单编号
        String newOrderNum = businessCodeRuleService.generateBusinessCodeSeq(BusinessCodeConst.SECOND_MAINTENANCE_CODE_RULE);
        if (StrUtil.isEmpty(newOrderNum)) {
            throw new JeecgBootException("生成工单编号失败");
        }
        EamSecondMaintenanceOrder nextOrder = new EamSecondMaintenanceOrder();
        nextOrder.setOrderNum(newOrderNum);
        nextOrder.setEquipmentId(entity.getEquipmentId());
        nextOrder.setStandardId(entity.getStandardId());
        nextOrder.setCreationMethod("AUTO");
        // è®¾ç½®ä¿å…»æ—¥æœŸä¸ºåŽŸå·¥å•ä¿å…»æ—¥æœŸåŠ 6个月
        nextOrder.setMaintenanceDate(calculateNextMaintenanceDate(entity.getMaintenanceDate()));
        // è®¾ç½®æŠ€æœ¯çŠ¶æ€é‰´å®šè¡¨HF编码
        EamBaseHFCode eamBaseHFCode = hfCodeService.selectByCategory(HfTemplateCategoryEnum.SECOND_MAINTENANCE.name());
        if (eamBaseHFCode == null) {
            throw new JeecgBootException("未配置技术状态鉴定表的HF编码,添加失败!");
        }
        nextOrder.setHfCode(eamBaseHFCode.getHfCode());
        nextOrder.setRemark(entity.getRemark());
        nextOrder.setMaintenanceStatus(SecondMaintenanceStatusEnum.WAIT_MAINTENANCE.name());
        nextOrder.setCreationMethod(entity.getCreationMethod());
        nextOrder.setDelFlag(CommonConstant.DEL_FLAG_0);
        // æ’入新工单
        eamSecondMaintenanceOrderMapper.insert(nextOrder);
        // å¤åˆ¶å·¥å•明细
        List<EamMaintenanceStandardDetail> standardDetails = eamMaintenanceStandardDetailService.selectByStandardId(entity.getStandardId());
        if (CollectionUtil.isEmpty(standardDetails)) {
            log.warn("原工单的保养规范明细为空,工单ID: {}", orderId);
            return;
        }
        List<EamSecondMaintenanceOrderDetail> orderDetails = standardDetails.stream()
                .map(item -> {
                    EamSecondMaintenanceOrderDetail detail = new EamSecondMaintenanceOrderDetail();
                    BeanUtils.copyProperties(item, detail);
                    detail.setId(null);
                    detail.setOrderId(nextOrder.getId());
                    return detail;
                })
                .collect(Collectors.toList());
        secondMaintenanceOrderDetailService.saveBatch(orderDetails);
        // æ’入首页二保养计划
        // ä½¿ç”¨ SimpleDateFormat ç›´æŽ¥æ ¼å¼åŒ–为“yyyyå¹´MM月”格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyå¹´MM月");
        String formattedDate = sdf.format(nextOrder.getMaintenanceDate());
        factorySecondMaintPlanService.add(nextOrder.getEquipmentId(), formattedDate);
    }
    /**
     * è®¡ç®—六个月后的当月最后一天
     * @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);
    }
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamSecondMaintenanceOrderServiceImpl.java
@@ -9,6 +9,7 @@
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.flowable.engine.TaskService;
@@ -18,6 +19,7 @@
import org.jeecg.common.constant.DataBaseConstant;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.DateUtils;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.eam.aspect.annotation.EquipmentHistoryLog;
import org.jeecg.modules.eam.constant.*;
@@ -50,6 +52,7 @@
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -61,12 +64,12 @@
 * @Version: V1.0
 */
@Service("IEamSecondMaintenanceOrderService")
@Slf4j
public class EamSecondMaintenanceOrderServiceImpl extends ServiceImpl<EamSecondMaintenanceOrderMapper, EamSecondMaintenanceOrder> implements IEamSecondMaintenanceOrderService, FlowCallBackServiceI {
    @Resource
    private EamSecondMaintenanceOrderMapper eamSecondMaintenanceOrderMapper;
    @Autowired
    private IEamSecondMaintenanceOrderDetailService secondMaintenanceOrderDetailService;
    @Autowired
    private FlowCommonService flowCommonService;
    @Autowired
@@ -97,6 +100,10 @@
    private BaseFactoryMapper baseFactoryMapper;
    @Autowired
    private IEamSecondMaintenanceOrderDetailService eamSecondMaintenanceOrderDetailService;
    @Autowired
    private EamSecondMaintenanceOrderAsyncService eamSecondMaintenanceOrderAsyncService;
    @Autowired
    private IEamFactorySecondMaintPlanService factorySecondMaintPlanService;
    @Override
    public IPage<EamSecondMaintenanceOrder> queryPageList(Page<EamSecondMaintenanceOrder> page, EamSecondMaintenanceQuery query) {
@@ -340,6 +347,11 @@
            });
            secondMaintenanceOrderDetailService.saveBatch(requestTableDetailList);
        }
        // æ’入首页二保养计划
        // ä½¿ç”¨ SimpleDateFormat ç›´æŽ¥æ ¼å¼åŒ–为“yyyyå¹´MM月”格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyå¹´MM月");
        String formattedDate = sdf.format(order.getMaintenanceDate());
        factorySecondMaintPlanService.add(order.getEquipmentId(), formattedDate);
        return true;
    }
@@ -357,9 +369,14 @@
        if (!SecondMaintenanceStatusEnum.WAIT_MAINTENANCE.name().equals(entity.getMaintenanceStatus())) {
            throw new JeecgBootException("只有待保养状态的数据才可编辑!");
        }
        // ç¼–辑首页二保养计划
        // ä½¿ç”¨ SimpleDateFormat ç›´æŽ¥æ ¼å¼åŒ–为“yyyyå¹´MM月”格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyå¹´MM月");
        String oldFormattedDate = sdf.format(entity.getMaintenanceDate());
        String newFormattedDate = sdf.format(request.getMaintenanceDate());
        factorySecondMaintPlanService.dateChange(entity.getEquipmentId(), oldFormattedDate,newFormattedDate);
        entity.setMaintenanceDate(request.getMaintenanceDate());
        entity.setRemark(request.getRemark());
        eamSecondMaintenanceOrderMapper.updateById(entity);
        //判断是否存在保养人 å¦‚果存在则启动流程
        if (StringUtils.isNotBlank(entity.getOperator())) {
@@ -389,7 +406,6 @@
                eamEquipmentExtendService.updateEquipmentMaintenanceStatus(entity.getEquipmentId(), EquipmentMaintenanceStatus.UNDER_SECOND_MAINTENANCE.name());
                return result.isSuccess();
            }
        }
        return true;
    }
@@ -665,6 +681,15 @@
        }
        //保存工单
        eamSecondMaintenanceOrderMapper.updateById(entity);
        //异步生成下次二保工单
        if (SecondMaintenanceStatusEnum.COMPLETE.name().equals(entity.getMaintenanceStatus())) {
            try {
                eamSecondMaintenanceOrderAsyncService.asyncGenerateNextMaintenanceOrder(entity.getId());
            } catch (Exception e) {
                log.error("触发异步生成下次工单失败,工单ID: {}", entity.getId(), e);
            }
        }
        return entity;
    }
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/IBaseFactoryService.java
@@ -16,6 +16,13 @@
public interface IBaseFactoryService extends IService<BaseFactory> {
    /**
     * é€šè¿‡code查询对应中心
     * @param code
     * @return
     */
    BaseFactory queryByCode(String code);
    /**
     * æŸ¥è¯¢æ‰€æœ‰äº§çº¿ä¿¡æ¯ï¼Œå¹¶åˆ†èŠ‚ç‚¹è¿›è¡Œæ˜¾ç¤º
     */
    List<EamBaseFactoryTreeModel> queryTreeList();
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/BaseFactoryServiceImpl.java
@@ -49,6 +49,18 @@
    private BaseFactoryUserMapper BaseFactoryUserMapper;
    /**
     * é€šè¿‡code查询对应中心
     * @param code
     * @return
     */
    @Override
    public BaseFactory queryByCode(String code){
        LambdaQueryWrapper<BaseFactory> query = new LambdaQueryWrapper<BaseFactory>();
        query.eq(BaseFactory::getOrgCode, code);
        return this.baseMapper.selectOne(query);
    }
    /**
     * queryTreeList å¯¹åº” queryTreeList æŸ¥è¯¢æ‰€æœ‰çš„设备车间管理数据,以树结构形式响应给前端
     */
    @Override