二保结构树代码 维修工单添加 领取按钮 领取后 生成维修开始时间  提交后 生成维修结束时间 计算 维修时长  故障时长  添加导出
已添加1个文件
已修改14个文件
586 ■■■■■ 文件已修改
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/EamRepairOrderExport.java 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamEquipment.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamRepairOrder.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamRepairOrderMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamRepairOrderMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamRepairOrderService.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamRepairOrderServiceImpl.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/vo/EamEquipmentTree.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamRepairOrderController.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamSecondMaintenanceOrderController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/EamMaintenanceStandardMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/EamSecondMaintenanceOrderMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/xml/EamMaintenanceStandardMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamSecondMaintenanceOrderService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamSecondMaintenanceOrderServiceImpl.java 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/dto/EamRepairOrderExport.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,188 @@
package org.jeecg.modules.eam.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecg.common.aspect.annotation.Dict;
import org.jeecg.common.system.base.entity.JeecgEntity;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
 * @Description: ç»´ä¿®å·¥å•
 * @Author: Lius
 * @Date: 2025-04-03
 */
@Data
@TableName("eam_repair_order")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value = "eam_repair_order对象", description = "维修工单导出")
public class EamRepairOrderExport {
    /**主键*/
    @TableId(type = IdType.ASSIGN_ID)
    @ApiModelProperty(value = "主键")
    private String id;
    /** æŠ¥ä¿®ID*/
    @ApiModelProperty(value = "报修ID")
    private String reportId;
    /**设备名称*/
    @ApiModelProperty(value = "设备ID")
    @Dict(dictTable = "eam_equipment", dicCode = "id", dicText = "equipment_name")
    private String equipmentId;
    /**
     * è®¾å¤‡ç¼–码
     */
    @Excel(name = "统一编码", width = 15)
    @TableField(exist = false)
    @ApiModelProperty(value = "统一编码")
    private String equipmentCode;
    /**
     * è®¾å¤‡åç§°
     */
    @Excel(name = "设备名称", width = 15)
    @TableField(exist = false)
    @ApiModelProperty(value = "设备名称")
    private String equipmentName;
    /**
     * è®¾å¤‡åž‹å·
     */
    @Excel(name = "设备型号", width = 15)
    @TableField(exist = false)
    @ApiModelProperty(value = "设备型号")
    private String equipmentModel;
    /**维修状态*/
    @Excel(name = "维修状态", width = 15,dicCode = "repair_status")
    @ApiModelProperty(name = "维修状态",notes = "待维修、维修中、待确认、维修完成")
    @Dict(dicCode = "repair_status")
    private String repairStatus;
    /**领取状态*/
    @Excel(name = "领取状态", width = 15,dicCode = "claim_status")
    @ApiModelProperty(name = "领取状态",notes = "未领取、已领取")
    @Dict(dicCode = "claim_status")
    private String claimStatus;
    /**
     * å·¥å•编号
     */
    @Excel(name = "工单编号", width = 15)
    @ApiModelProperty(value = "工单编号")
    private String repairCode;
    /**故障类型*/
    @Excel(name = "故障类型", width = 15,dicCode = "fault_type")
    @ApiModelProperty(value = "故障类型")
    @Dict(dicCode = "fault_type")
    private String faultType;
    /**报修人*/
    @Excel(name = "报修人", width = 15,dictTable = "sys_user", dicCode = "username", dicText = "realname")
    @ApiModelProperty(value = "报修人")
    @Dict(dictTable = "sys_user", dicCode = "username", dicText = "realname")
    private String reportPerson;
    /** ç»´ä¿®å¼€å§‹æ—¶é—´ */
    @Excel(name = "维修开始时间", width = 15,format = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(name = "维修开始时间",notes = "")
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date actualStartTime;
    /** ç»´ä¿®ç»“束时间 */
    @Excel(name = "维修结束时间", width = 15,format = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(name = "维修结束时间",notes = "")
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date actualEndTime;
    /** ç»´ä¿®æ—¶é•¿*/
    @Excel(name = "维修时长", width = 15)
    @ApiModelProperty(name = "维修时长",notes = "")
    private String repairDuration;
    /**故障时长*/
    @Excel(name = "故障时长", width = 15)
    @ApiModelProperty(name = "故障时长",notes = "")
    private String faultDuration;
    /** ç»´ä¿®ç¡®è®¤ */
    @Excel(name = "维修确认", width = 15,dictTable = "sys_user", dicCode = "username", dicText = "realname")
    @ApiModelProperty(name = "维修确认",notes = "")
    @Dict(dictTable = "sys_user", dicCode = "username", dicText = "realname")
    private String repairConfirm;
    /** ç»´ä¿®ç¡®è®¤æ„è§ */
    @Excel(name = "维修确认意见", width = 15)
    @ApiModelProperty(name = "维修确认意见",notes = "")
    private String repairConfirmComment;
    /** ç»´ä¿®ç¡®è®¤æ—¶é—´ */
    @Excel(name = "维修确认时间", width = 15,format = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(name = "维修确认时间",notes = "")
    private Date repairConfirmTime;
    /**故障现象*/
    @Excel(name = "故障现象", width = 15)
    @ApiModelProperty(value = "故障现象")
    private String faultPhenomenon;
    /** æ•…障原因 */
    @Excel(name = "故障原因", width = 15)
    @ApiModelProperty(name = "故障原因",notes = "")
    private String faultReason;
    /** æ•…障分析 */
    @Excel(name = "故障分析", width = 15)
    @ApiModelProperty(name = "故障分析",notes = "")
    private String faultAnalysis;
    /** æŽ’故过程 */
    @Excel(name = "排故过程", width = 15)
    @ApiModelProperty(name = "排故过程",notes = "")
    private String faultProcess;
    /** é¢„防措施 */
    @Excel(name = "预防措施", width = 15)
    @ApiModelProperty(name = "预防措施",notes = "")
    private String faultPrevent;
    /** æ“ä½œå·¥ */
    @Excel(name = "操作工", width = 15,dictTable = "sys_user", dicCode = "username", dicText = "realname")
    @ApiModelProperty(name = "操作工",notes = "")
    @Dict(dictTable = "sys_user", dicCode = "username", dicText = "realname")
    private String confirmer;
    /** æ“ä½œå·¥ç¡®è®¤ç»“æžœ*/
    @Excel(name = "操作工确认结果", width = 15)
    @ApiModelProperty(name = "操作工确认结果",notes = "")
    private String confirmResult;
    /** æ“ä½œå·¥ç¡®è®¤æ„è§ */
    @Excel(name = "操作工确认意见", width = 15)
    @ApiModelProperty(name = "操作工确认意见",notes = "")
    private String confirmComment;
    /** æ“ä½œå·¥ç¡®è®¤æ—¶é—´*/
    @Excel(name = "操作工确认时间", width = 15,format = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "操作工确认时间")
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date confirmTime;
    @TableField(exist = false)
    private String installationPosition;
}
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamEquipment.java
@@ -470,6 +470,18 @@
    @TableField(exist = false)
    private String thirdMaintenanceGenerateFlag;
    /**
     * ä¿å…»è§„范名称
     */
    @TableField(exist = false)
    private String maintenanceStandardName;
    /**
     * ä¿å…»è§„范Id
     */
    @TableField(exist = false)
    private String maintenanceStandardId;
    public void setFactoryOrgCode(String factoryOrgCode){
        this.factoryOrgCode = factoryOrgCode;
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/entity/EamRepairOrder.java
@@ -76,6 +76,10 @@
    @ApiModelProperty(name = "维修状态",notes = "待维修、维修中、待确认、维修完成")
    @Dict(dicCode = "repair_status")
    private String repairStatus;
    /**领取状态*/
    @ApiModelProperty(name = "领取状态",notes = "未领取、已领取")
    @Dict(dicCode = "claim_status")
    private String claimStatus;
    /**故障类型*/
    @Excel(name = "故障类型", width = 15)
    @ApiModelProperty(value = "故障类型")
@@ -100,6 +104,12 @@
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date actualEndTime;
    /** ç»´ä¿®æ—¶é•¿*/
    @ApiModelProperty(name = "维修时长",notes = "")
    private String repairDuration;
    /**故障时长*/
    @ApiModelProperty(name = "故障时长",notes = "")
    private String faultDuration;
    /** ç»´ä¿®ç¡®è®¤ */
    @ApiModelProperty(name = "维修确认",notes = "")
    @Dict(dictTable = "sys_user", dicCode = "username", dicText = "realname")
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/EamRepairOrderMapper.java
@@ -5,6 +5,7 @@
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.eam.dto.EamRepairOrderExport;
import org.jeecg.modules.eam.entity.EamRepairOrder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.jeecg.modules.eam.request.EamRepairOrderQuery;
@@ -36,4 +37,11 @@
     * @return
     */
    IPage<EamRepairOrder> queryPageList(Page<EamRepairOrder> page, @Param(Constants.WRAPPER) QueryWrapper<EamRepairOrder> queryWrapper);
    /**
     * å¯¼å‡ºåˆ—表查询
     * @param queryWrapper
     * @return
     */
    List<EamRepairOrderExport> queryExportList(@Param(Constants.WRAPPER) QueryWrapper<EamRepairOrderExport> queryWrapper);
}
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/mapper/xml/EamRepairOrderMapper.xml
@@ -52,4 +52,11 @@
        on wmo.equipment_id = e.id
        ${ew.customSqlSegment}
    </select>
    <select id="queryExportList" resultType="org.jeecg.modules.eam.dto.EamRepairOrderExport">
        select wmo.*, e.equipment_code, e.equipment_name,e.equipment_model, e.installation_position
        from eam_repair_order wmo
                 inner join eam_equipment e
                            on wmo.equipment_id = e.id
            ${ew.customSqlSegment}
    </select>
</mapper>
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamRepairOrderService.java
@@ -4,12 +4,11 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import liquibase.pro.packaged.S;
import org.jeecg.modules.eam.dto.EamRepairOrderDto;
import org.jeecg.modules.eam.dto.EamRepairOrderExport;
import org.jeecg.modules.eam.entity.EamEquipment;
import org.jeecg.modules.eam.entity.EamRepairOrder;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.eam.request.EamRepairOrderQuery;
import org.jeecg.modules.eam.request.EamRepairOrderRequest;
import org.jeecg.modules.eam.request.EamRepairOrderResponse;
import org.jeecg.modules.eam.request.EamReportRepairQuery;
import org.jeecg.modules.eam.request.*;
import java.util.List;
@@ -54,4 +53,12 @@
    EamRepairOrder perform(EamRepairOrderRequest request);
    EamRepairOrderResponse findById(String id);
    /**
     * ç»´ä¿®å·¥å•导出
     * @param eamRepairOrderQuery
     * @return
     */
    List<EamRepairOrderExport> exportList(EamRepairOrderQuery eamRepairOrderQuery);
}
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamRepairOrderServiceImpl.java
@@ -19,6 +19,7 @@
import org.jeecg.modules.eam.aspect.annotation.EquipmentHistoryLog;
import org.jeecg.modules.eam.constant.*;
import org.jeecg.modules.eam.dto.EamRepairOrderDto;
import org.jeecg.modules.eam.dto.EamRepairOrderExport;
import org.jeecg.modules.eam.entity.EamEquipment;
import org.jeecg.modules.eam.entity.EamRepairOrder;
import org.jeecg.modules.eam.entity.EamRepairPerson;
@@ -36,6 +37,7 @@
import org.jeecg.modules.flowable.apithird.service.FlowCommonService;
import org.jeecg.modules.flowable.service.IFlowDefinitionService;
import org.jeecg.modules.flowable.service.IFlowTaskService;
import org.jeecg.modules.flowable.util.TimeUtil;
import org.jeecg.modules.system.entity.BaseFactory;
import org.jeecg.modules.system.entity.BaseFactoryUser;
import org.jeecg.modules.system.service.IBaseFactoryService;
@@ -205,6 +207,18 @@
        }
        BeanUtils.copyProperties(eamRepairOrderDto,eamRepairOrder);
        eamRepairOrder.setRepairStatus(EamRepairOrderRepairStatusEnum.UNDER_MAINTENANCE.name());
        eamRepairOrder.setActualEndTime(new Date());
        //计算维修时间与故障时间
        Date startTime;
        Date endTime;
        //维修结束时间-维修开始时间=维修时长
        startTime=eamRepairOrder.getActualStartTime();
        endTime=eamRepairOrder.getActualEndTime();
        eamRepairOrder.setRepairDuration(TimeUtil.howLong(startTime,endTime,2));
        //维修结束时间-故障报修时间=故障时长
        startTime=eamRepairOrder.getCreateTime();
        endTime=eamRepairOrder.getActualEndTime();
        eamRepairOrder.setFaultDuration(TimeUtil.howLong(startTime,endTime,2));
        this.updateById(eamRepairOrder);
        EamReportRepair eamReportRepair=eamReportRepairService.getById(eamRepairOrder.getReportId());
        if (eamReportRepair==null){
@@ -237,12 +251,6 @@
        }
        if (StrUtil.isEmpty(eamRepairOrder.getRepairCode())) {
            throw new RuntimeException("工单编号为空");
        }
        if (eamRepairOrder.getActualStartTime()==null){
            throw new RuntimeException("维修开始时间为空");
        }
        if (eamRepairOrder.getActualEndTime()==null){
            throw new RuntimeException("维修结束时间为空");
        }
        if (StrUtil.isEmpty(eamRepairOrder.getFaultReason())){
            throw new RuntimeException("故障原因为空");
@@ -371,6 +379,74 @@
        return eamRepairOrderResponse;
    }
    /**
     * ç»´ä¿®å·¥å•导出
     * @param eamRepairOrderQuery
     * @return
     */
    @Override
    public List<EamRepairOrderExport> exportList(EamRepairOrderQuery eamRepairOrderQuery){
        QueryWrapper<EamRepairOrderExport> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("wmo.del_flag", CommonConstant.DEL_FLAG_0);
        //用户数据权限
        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 (eamRepairOrderQuery != null) {
            if (StringUtils.isNotBlank(eamRepairOrderQuery.getEquipmentId())) {
                queryWrapper.eq("wmo.equipment_id", eamRepairOrderQuery.getEquipmentId());
            }
            if (StringUtils.isNotBlank(eamRepairOrderQuery.getEquipmentCode())) {
                queryWrapper.like("e.equipment_code", eamRepairOrderQuery.getEquipmentCode());
            }
            if (StringUtils.isNotBlank(eamRepairOrderQuery.getEquipmentName())) {
                queryWrapper.like("e.equipment_name", eamRepairOrderQuery.getEquipmentName());
            }
            if (StringUtils.isNotBlank(eamRepairOrderQuery.getRepairStatus())) {
                queryWrapper.eq("wmo.repair_status", eamRepairOrderQuery.getRepairStatus());
            }
            if (StringUtils.isNotBlank(eamRepairOrderQuery.getRepairCode())) {
                queryWrapper.like("wmo.repair_code", eamRepairOrderQuery.getRepairCode());
            }
            //排序
            if (StringUtils.isNotBlank(eamRepairOrderQuery.getColumn()) && StringUtils.isNotBlank(eamRepairOrderQuery.getOrder())) {
                String column = eamRepairOrderQuery.getColumn();
                if (column.endsWith(CommonConstant.DICT_TEXT_SUFFIX)) {
                    column = column.substring(0, column.lastIndexOf(CommonConstant.DICT_TEXT_SUFFIX));
                }
                if (DataBaseConstant.SQL_ASC.equalsIgnoreCase(eamRepairOrderQuery.getOrder())) {
                    queryWrapper.orderByAsc("wmo." + oConvertUtils.camelToUnderline(column));
                } else {
                    queryWrapper.orderByDesc("wmo." + oConvertUtils.camelToUnderline(column));
                }
            } else {
                queryWrapper.orderByDesc("wmo.create_time");
            }
        } else {
            queryWrapper.orderByDesc("wmo.create_time");
        }
        return this.baseMapper.queryExportList(queryWrapper);
    }
    private boolean claimTask(String taskId, LoginUser user) {
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        if (task == null) {
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/vo/EamEquipmentTree.java
@@ -72,6 +72,15 @@
     */
    private String orgType;
    /**
     * ä¿å…»è§„范名称
     */
    private String maintenanceStandardName;
    /**
     * ä¿å…»è§„范Id
     */
    private String maintenanceStandardId;
    private List<EamEquipmentTree> children = new ArrayList<>();
@@ -87,6 +96,8 @@
        this.title = mdcEquipment.getEquipmentCode() + "/" + mdcEquipment.getEquipmentName();
        this.equipmentId = mdcEquipment.getEquipmentCode();
        this.equipmentName = mdcEquipment.getEquipmentName();
        this.maintenanceStandardId=mdcEquipment.getMaintenanceStandardId();
        this.maintenanceStandardName=mdcEquipment.getMaintenanceStandardName();
        this.isLeaf = true;
        return this;
    }
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamRepairOrderController.java
@@ -15,6 +15,7 @@
import org.jeecg.common.util.TranslateDictTextUtils;
import org.jeecg.modules.eam.constant.BusinessCodeConst;
import org.jeecg.modules.eam.dto.EamRepairOrderDto;
import org.jeecg.modules.eam.dto.EamRepairOrderExport;
import org.jeecg.modules.eam.entity.EamRepairOrder;
import org.jeecg.modules.eam.request.EamRepairOrderQuery;
import org.jeecg.modules.eam.request.EamRepairOrderRequest;
@@ -27,10 +28,16 @@
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.service.ISysUserService;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import java.util.Date;
import java.util.List;
/**
 * @Description: ç»´ä¿®å·¥å•
@@ -75,7 +82,33 @@
    /**
     * é¢†å–
     *
     * @param id
     * @return
     */
    @AutoLog(value = "维修工单-领取")
    @ApiOperation(value = "维修工单-领取", notes = "维修工单-领取")
    @GetMapping(value = "/claim")
    public Result<?> claim(String id) {
        // æ ¡éªŒé¢†å–权限
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        if (!BusinessCodeConst.PCR0002.equals(user.getPost())) {
            return Result.error("领取失败,没有领取权限!,需维修工领取");
        }
        EamRepairOrder eamRepairOrder=eamRepairOrderService.getById(id);
        if (eamRepairOrder==null) {
            return Result.error("维修工单不存在");
        }else {
            if ("1".equals(eamRepairOrder.getClaimStatus())) {
                return Result.error("该维修工单已被领取");
            }
        }
        eamRepairOrder.setClaimStatus("1");
        eamRepairOrder.setActualStartTime(new Date());
        eamRepairOrderService.updateById(eamRepairOrder);
        return Result.OK("领取成功");
    }
    /**
     * æäº¤
     * @param id
     * @return
     */
@@ -184,11 +217,18 @@
     * å¯¼å‡ºexcel
     *
     * @param request
     * @param eamRepairOrder
     * @param eamRepairOrderQuery
     */
    @RequestMapping(value = "/exportXls")
    public ModelAndView exportXls(HttpServletRequest request, EamRepairOrder eamRepairOrder) {
        return super.exportXls(request, eamRepairOrder, EamRepairOrder.class, "维修工单");
    public ModelAndView exportXls(HttpServletRequest request, EamRepairOrderQuery eamRepairOrderQuery) {
        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        List<EamRepairOrderExport> eamRepairOrderExports=eamRepairOrderService.exportList(eamRepairOrderQuery);
        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
        mv.addObject(NormalExcelConstants.FILE_NAME, "维修工单台账"); //此处设置的filename无效 ,前端会重更新设置一下
        mv.addObject(NormalExcelConstants.CLASS, EamRepairOrderExport.class);
        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("维修工单台账" + "报表", "导出人:" + sysUser.getRealname(), "维修工单台账"));
        mv.addObject(NormalExcelConstants.DATA_LIST, eamRepairOrderExports);
        return mv;
    }
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamSecondMaintenanceOrderController.java
@@ -21,6 +21,7 @@
import org.jeecg.modules.eam.request.EamSecondMaintenanceRequest;
import org.jeecg.modules.eam.request.EamWeekMaintenanceRequest;
import org.jeecg.modules.eam.service.IEamSecondMaintenanceOrderService;
import org.jeecg.modules.eam.vo.EamEquipmentTree;
import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
@@ -70,6 +71,24 @@
    }
    /**
     * äºŒä¿æ‰¹é‡æ ‘结构
     *
     */
    @ApiOperation(value = "设备二级保养-二保批量树结构", notes = "设备二级保养-二保批量树结构")
    @GetMapping(value = "/BatchTreeStructure")
    public Result<List<EamEquipmentTree>> BatchTreeStructure() {
        Result<List<EamEquipmentTree>> result = new Result<>();
        try {
            List<EamEquipmentTree> mdcEquipmentTreeList =eamSecondMaintenanceOrderService.getTree();
            result.setSuccess(true);
            result.setResult(mdcEquipmentTreeList);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return result;
    }
    /**
     * æ·»åŠ 
     *
     * @param request
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/EamMaintenanceStandardMapper.java
@@ -5,6 +5,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.entity.EamEquipment;
import org.jeecg.modules.eam.entity.EamMaintenanceStandard;
import java.util.List;
@@ -24,4 +25,9 @@
     * @return
     */
    IPage<EamMaintenanceStandard> queryPageList(IPage<EamMaintenanceStandard> page, @Param(Constants.WRAPPER) Wrapper<EamMaintenanceStandard> queryWrapper);
    /**
     * åˆ—表查询
     */
    List<EamEquipment> queryList(@Param(Constants.WRAPPER) Wrapper<EamMaintenanceStandard> queryWrapper);
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/EamSecondMaintenanceOrderMapper.java
@@ -6,8 +6,12 @@
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.eam.entity.EamEquipment;
import org.jeecg.modules.eam.entity.EamMaintenanceStandard;
import org.jeecg.modules.eam.entity.EamSecondMaintenanceOrder;
import java.util.List;
/**
 * @Description: è®¾å¤‡äºŒçº§ä¿å…»
 * @Author: jeecg-boot
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/mapper/xml/EamMaintenanceStandardMapper.xml
@@ -11,4 +11,14 @@
            on f.data_id=ems.id
            ${ew.customSqlSegment}
    </select>
    <select id="queryList" resultType="org.jeecg.modules.eam.entity.EamEquipment">
        SELECT
            e.*,
            ems.id as 'maintenanceStandardId',
            ems.standard_name as 'maintenanceStandardName'
        FROM
            eam_equipment e
                INNER JOIN eam_maintenance_standard ems ON ems.equipment_id = e.id
            ${ew.customSqlSegment}
    </select>
</mapper>
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamSecondMaintenanceOrderService.java
@@ -6,6 +6,9 @@
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.eam.request.EamSecondMaintenanceQuery;
import org.jeecg.modules.eam.request.EamSecondMaintenanceRequest;
import org.jeecg.modules.eam.vo.EamEquipmentTree;
import java.util.List;
/**
 * @Description: è®¾å¤‡äºŒçº§ä¿å…»
@@ -24,6 +27,10 @@
    IPage<EamSecondMaintenanceOrder> queryPageList(Page<EamSecondMaintenanceOrder> page, EamSecondMaintenanceQuery query);
    /**
     * æ‰¹é‡æ–°å¢žæ ‘结构
     */
    List<EamEquipmentTree> getTree();
    /**
     * æ·»åŠ 
     * @param request
     * @return
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamSecondMaintenanceOrderServiceImpl.java
@@ -9,11 +9,11 @@
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import liquibase.pro.packaged.Q;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.flowable.engine.TaskService;
import org.flowable.task.api.Task;
import org.jeecg.common.api.vo.FileUploadResult;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.constant.DataBaseConstant;
@@ -23,10 +23,14 @@
import org.jeecg.modules.eam.aspect.annotation.EquipmentHistoryLog;
import org.jeecg.modules.eam.constant.*;
import org.jeecg.modules.eam.entity.*;
import org.jeecg.modules.eam.mapper.EamEquipmentMapper;
import org.jeecg.modules.eam.mapper.EamMaintenanceStandardMapper;
import org.jeecg.modules.eam.mapper.EamSecondMaintenanceOrderMapper;
import org.jeecg.modules.eam.request.EamSecondMaintenanceQuery;
import org.jeecg.modules.eam.request.EamSecondMaintenanceRequest;
import org.jeecg.modules.eam.service.*;
import org.jeecg.modules.eam.tree.FindsEquipmentEamCenterUtil;
import org.jeecg.modules.eam.vo.EamEquipmentTree;
import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService;
import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI;
@@ -35,6 +39,7 @@
import org.jeecg.modules.flowable.service.IFlowTaskService;
import org.jeecg.modules.system.entity.BaseFactory;
import org.jeecg.modules.system.entity.BaseFactoryUser;
import org.jeecg.modules.system.mapper.BaseFactoryMapper;
import org.jeecg.modules.system.service.IBaseFactoryService;
import org.jeecg.modules.system.service.IBaseFactoryUserService;
import org.jeecg.modules.system.service.ISysUserService;
@@ -46,6 +51,7 @@
import javax.annotation.Resource;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@@ -85,10 +91,15 @@
    private IEamBaseHFCodeService hfCodeService;
    @Autowired
    private IEamMaintenanceStandardDetailService eamMaintenanceStandardDetailService;
    @Autowired
    private EamMaintenanceStandardMapper eamMaintenanceStandardMapper;
    @Resource
    private BaseFactoryMapper baseFactoryMapper;
    @Override
    public IPage<EamSecondMaintenanceOrder> queryPageList(Page<EamSecondMaintenanceOrder> page, EamSecondMaintenanceQuery query) {
        QueryWrapper<EamSecondMaintenanceOrder> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("wmo.del_flag",CommonConstant.DEL_FLAG_0.toString());
        //用户数据权限
        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        if (sysUser == null) {
@@ -148,6 +159,146 @@
        return eamSecondMaintenanceOrderMapper.queryPageList(page, queryWrapper);
    }
    /**
     * æ‰¹é‡æ–°å¢žæ ‘结构
     */
    @Override
    public List<EamEquipmentTree> getTree(){
        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        if (sysUser == null) return Collections.emptyList();
        // æž„建通用查询条件
        QueryWrapper<EamMaintenanceStandard> baseQuery = new QueryWrapper<EamMaintenanceStandard>()
                .eq("ems.maintenance_category", "SECOND_MAINTENANCE")
                .eq("ems.standard_status", MaintenanceStandardStatusEnum.START.name())
                .eq("ems.del_flag", CommonConstant.DEL_FLAG_0.toString());
        // åº”用数据权限过滤
        applyDataPermissionFilter(sysUser, baseQuery);
        // å•次查询设备列表
        List<EamEquipment> equipmentList = eamMaintenanceStandardMapper.queryList(baseQuery);
        if (CollectionUtils.isEmpty(equipmentList)) {
            return Collections.emptyList();
        }
        // èŽ·å–å…³è”çš„å·¥åŽ‚ä»£ç 
        Set<String> factoryOrgCodes = equipmentList.stream()
                .map(EamEquipment::getFactoryOrgCode)
                .collect(Collectors.toSet());
        // å•次查询所有工厂数据(包含完整树结构)
        List<BaseFactory> allFactories = baseFactoryService.list(
                new LambdaQueryWrapper<BaseFactory>()
                        .eq(BaseFactory::getDelFlag, CommonConstant.DEL_FLAG_0.toString())
                        .orderByAsc(BaseFactory::getSorter));
        // æå–权限关联的工厂节点ID(包含所有父节点)
        Set<String> authorizedFactoryIds = extractAuthorizedFactoryIds(
                allFactories, factoryOrgCodes);
        // è¿‡æ»¤å‡ºæœ‰æ•ˆå·¥åŽ‚ç»“æž„
        List<BaseFactory> validFactories = allFactories.stream()
                .filter(f -> authorizedFactoryIds.contains(f.getId()))
                .collect(Collectors.toList());
        // ===构建设备树 ===
        Map<String, List<EamEquipment>> equipmentMap = equipmentList.stream()
                .collect(Collectors.groupingBy(EamEquipment::getFactoryOrgCode));
        // æž„建基础树
        List<EamEquipmentTree> treeList = FindsEquipmentEamCenterUtil.wrapEquipmentBaseFactoryTreeList(validFactories);
        // å¡«å……设备数据
        populateEquipmentNodes(treeList, equipmentMap);
        return treeList;
    }
    // åº”用数据权限条件(共用方法)
    private void applyDataPermissionFilter(LoginUser user, QueryWrapper<EamMaintenanceStandard> query) {
        if (StringUtils.isNotBlank(user.getEamEquipmentIds())) {
            List<String> equipmentIds = Arrays.asList(user.getEamEquipmentIds().split(","));
            query.in("e.equipment_code", equipmentIds);
        } else {
            List<BaseFactoryUser> factoryUsers = baseFactoryUserService.list(
                    new LambdaQueryWrapper<BaseFactoryUser>()
                            .eq(BaseFactoryUser::getUserId, user.getId()));
            if (CollectionUtils.isNotEmpty(factoryUsers)) {
                Set<String> factoryIds = factoryUsers.stream()
                        .map(BaseFactoryUser::getFactoryId)
                        .collect(Collectors.toSet());
                Set<String> factoryCodes = baseFactoryService.listByIds(factoryIds).stream()
                        .map(BaseFactory::getOrgCode)
                        .collect(Collectors.toSet());
                query.in("e.factory_org_code", factoryCodes);
            }
        }
    }
    // æå–授权工厂ID
    private Set<String> extractAuthorizedFactoryIds(List<BaseFactory> allFactories, Set<String> authOrgCodes) {
        Set<String> result = new HashSet<>();
        // æž„建ID->工厂的映射
        Map<String, BaseFactory> factoryMap = allFactories.stream()
                .collect(Collectors.toMap(BaseFactory::getId, Function.identity()));
        // é€†å‘查找父节点链
        for (BaseFactory factory : allFactories) {
            if (authOrgCodes.contains(factory.getOrgCode())) {
                collectParentIds(factoryMap, factory.getId(), result);
            }
        }
        return result;
    }
    // é€’归收集父节点ID
    private void collectParentIds(Map<String, BaseFactory> factoryMap, String currentId, Set<String> idSet) {
        if (StringUtils.isEmpty(currentId) || idSet.contains(currentId)) return;
        idSet.add(currentId);
        BaseFactory factory = factoryMap.get(currentId);
        if (factory != null && StringUtils.isNotBlank(factory.getParentId())) {
            collectParentIds(factoryMap, factory.getParentId(), idSet);
        }
    }
    // å¡«å……设备节点(非递归)
    private void populateEquipmentNodes(List<EamEquipmentTree> treeList,
                                        Map<String, List<EamEquipment>> equipmentMap) {
        for (EamEquipmentTree node : treeList) {
            String orgCode = resolveOrgCodeFromTree(node); // éœ€å®žçŽ°è¯¥é€»è¾‘
            // å…³è”设备数据
            List<EamEquipment> devices = equipmentMap.getOrDefault(orgCode, Collections.emptyList());
            if (!CollectionUtils.isEmpty(devices)) {
                for (EamEquipment device : devices) {
                    EamEquipmentTree deviceNode = new EamEquipmentTree().convert(device);
                    deviceNode.setParentId(node.getKey());
                    deviceNode.setType(2);
                    deviceNode.setLeaf(true);  // æ˜Žç¡®æ ‡è®°ä¸ºå¶å­èŠ‚ç‚¹
                    node.getChildren().add(deviceNode);
                }
                // åªæœ‰å½“存在设备时才标记为非叶子
                node.setLeaf(false);
            }
            // ç»§ç»­å¤„理子节点(工厂层级)
            if (!CollectionUtils.isEmpty(node.getChildren())) {
                populateEquipmentNodes(node.getChildren(), equipmentMap);
            }
        }
    }
    // è§£æžæ–¹æ³•
    private String resolveOrgCodeFromTree(EamEquipmentTree node) {
        BaseFactory factory =baseFactoryMapper.selectById(node.getKey());
        return factory != null ? factory.getOrgCode() : null;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean addMaintenance(EamSecondMaintenanceRequest request) {