cuikaidong
2025-05-21 21e7895dbb17557f8b82204883c72c6070242c82
借出归还-审批流程修改
已添加1个文件
已修改4个文件
361 ■■■■ 文件已修改
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/EquipmentLeanOutStatusEnum.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentLeanOutController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamEquipmentLeanOutRequest.java 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentLeanOutService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentLeanOutServiceImpl.java 169 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/EquipmentLeanOutStatusEnum.java
@@ -7,4 +7,13 @@
    WAIT_CONFIRM, //待确认
    COMPLETE, //已完成
    ;
    public static EquipmentLeanOutStatusEnum getInstance(String code) {
        EquipmentLeanOutStatusEnum[] values = EquipmentLeanOutStatusEnum.values();
        for (EquipmentLeanOutStatusEnum value : values) {
            if (value.name().equals(code)) {
                return value;
            }
        }
        return null;
    }
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentLeanOutController.java
@@ -18,6 +18,7 @@
import org.jeecg.modules.eam.constant.EquipmentLeanOutStatusEnum;
import org.jeecg.modules.eam.entity.EamEquipmentLeanOut;
import org.jeecg.modules.eam.request.EamEquipmentLeanOutQuery;
import org.jeecg.modules.eam.request.EamEquipmentLeanOutRequest;
import org.jeecg.modules.eam.service.IEamEquipmentLeanOutService;
import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -201,7 +202,7 @@
    @AutoLog(value = "设备借出归还-审批流")
    @ApiOperation(value = "设备借出归还-审批流", notes = "设备借出归还-审批流")
    @RequestMapping(value = "/approval", method = {RequestMethod.PUT, RequestMethod.POST})
    public Result<?> approval(@RequestBody EamEquipmentLeanOut request) {
    public Result<?> approval(@RequestBody EamEquipmentLeanOutRequest request) {
        if (request == null) {
            return Result.error("添加的对象不能为空!");
        }
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamEquipmentLeanOutRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,177 @@
package org.jeecg.modules.eam.request;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
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.modules.flowable.domain.vo.FlowTaskVo;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
 * @Description: è®¾å¤‡å€Ÿå‡ºå½’还
 * @Author: jeecg-boot
 * @Date: 2025-05-21
 * @Version: V1.0
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class EamEquipmentLeanOutRequest extends FlowTaskVo implements Serializable {
    /**
     * ä¸»é”®
     */
    @TableId(type = IdType.ASSIGN_ID)
    @ApiModelProperty(value = "主键")
    private String id;
    /**
     * åˆ›å»ºäºº
     */
    @ApiModelProperty(value = "创建人")
    private String createBy;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @ApiModelProperty(value = "创建时间")
    private Date createTime;
    /**
     * æ›´æ–°äºº
     */
    @ApiModelProperty(value = "更新人")
    private String updateBy;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @ApiModelProperty(value = "更新时间")
    private Date updateTime;
    /**
     * åˆ é™¤æ ‡è®°
     */
    @ApiModelProperty(value = "删除标记")
    private Integer delFlag;
    /**
     * è®¾å¤‡ID
     */
    @ApiModelProperty(value = "设备ID")
    private String equipmentId;
    /**
     * å•据号
     */
    @Excel(name = "单据号", width = 15)
    @ApiModelProperty(value = "单据号")
    private String code;
    /**
     * å€Ÿå…¥éƒ¨é—¨
     */
    @Excel(name = "借入部门", width = 15, dictTable = "mdc_production", dicText = "production_name", dicCode = "id")
    @ApiModelProperty(value = "借入部门")
    @Dict(dicCode = "mdc_production, production_name, id")
    private String leanDepartId;
    /**
     * å€Ÿå…¥è´£ä»»äºº
     */
    @Excel(name = "借入责任人", width = 15)
    @ApiModelProperty(value = "借入责任人")
    @Dict(dicCode = "sys_user, realname, username")
    private String leanPerson;
    /**
     * å€Ÿç”¨åŽŸå› 
     */
    @ApiModelProperty(value = "借用原因")
    private String leanReason;
    /**
     * å®¡æ‰¹ç±»åž‹
     */
    @ApiModelProperty(value = "审批类型")
    @Dict(dicCode = "approved_rejected")
    private String approvalDealType;
    /**
     * å€Ÿå‡ºçŠ¶æ€
     */
    @Excel(name = "借出状态", width = 15)
    @ApiModelProperty(value = "借出状态")
    @Dict(dicCode = "equipment_lean_out_status")
    private String leanStatus;
    /**
     * å€Ÿå‡ºå¼€å§‹æ—¶é—´
     */
    @ApiModelProperty(value = "借出时间")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date leanStartTime;
    /**
     * å€Ÿå‡ºå½’还时间
     */
    @ApiModelProperty(value = "归还时间")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date leanEndTime;
    /**
     * å®¡æ ¸äºº
     */
    @Excel(name = "审核人", width = 15)
    @ApiModelProperty(value = "审核人")
    @Dict(dicCode = "sys_user, realname, username")
    private String approvalUser;
    /**
     * å®¡æ ¸æ„è§
     */
    @Excel(name = "审核意见", width = 15)
    @ApiModelProperty(value = "审核意见")
    private String approvalComment;
    /**
     * å®¡æ ¸æ—¶é—´
     */
    @ApiModelProperty(value = "审核时间")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date approvalTime;
    /**
     * ç¡®è®¤äºº
     */
    @Excel(name = "确认人", width = 15)
    @ApiModelProperty(value = "确认人")
    @Dict(dicCode = "sys_user, realname, username")
    private String confirmUser;
    /**
     * ç¡®è®¤æ„è§
     */
    @Excel(name = "确认意见", width = 15)
    @ApiModelProperty(value = "确认意见")
    private String confirmComment;
    /**
     * ç¡®è®¤æ—¶é—´
     */
    @ApiModelProperty(value = "确认时间")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date confirmTime;
    /**
     * å¤‡æ³¨
     */
    @Excel(name = "备注", width = 15)
    @ApiModelProperty(value = "备注")
    private String remark;
    /**
     * å¤‡æ³¨
     */
    @Excel(name = "归还备注", width = 15)
    @ApiModelProperty(value = "归还备注")
    private String returnComment;
    //列表展示
    @TableField(exist = false)
    private String equipmentCode;
    @TableField(exist = false)
    private String equipmentName;
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentLeanOutService.java
@@ -5,6 +5,7 @@
import org.jeecg.modules.eam.entity.EamEquipmentLeanOut;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.eam.request.EamEquipmentLeanOutQuery;
import org.jeecg.modules.eam.request.EamEquipmentLeanOutRequest;
/**
 * @Description: è®¾å¤‡å€Ÿå‡ºå½’还
@@ -50,5 +51,5 @@
     * @param request
     * @return
     */
    EamEquipmentLeanOut approval(EamEquipmentLeanOut request);
    EamEquipmentLeanOut approval(EamEquipmentLeanOutRequest request);
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentLeanOutServiceImpl.java
@@ -1,6 +1,7 @@
package org.jeecg.modules.eam.service.impl;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -15,12 +16,12 @@
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.eam.constant.AssetStatusEnum;
import org.jeecg.modules.eam.constant.EquipmentLeanOutStatusEnum;
import org.jeecg.modules.eam.constant.*;
import org.jeecg.modules.eam.entity.EamEquipment;
import org.jeecg.modules.eam.entity.EamEquipmentLeanOut;
import org.jeecg.modules.eam.mapper.EamEquipmentLeanOutMapper;
import org.jeecg.modules.eam.request.EamEquipmentLeanOutQuery;
import org.jeecg.modules.eam.request.EamEquipmentLeanOutRequest;
import org.jeecg.modules.eam.service.IEamEquipmentLeanOutService;
import org.jeecg.modules.eam.service.IEamEquipmentService;
import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
@@ -229,6 +230,10 @@
        variables.put("NextAssignee", usernames);
        Result result = flowDefinitionService.startProcessInstanceByKey("equipment_lean_out", variables);
        if (result != null) {
            entity.setLeanStartTime(new Date());
            entity.setLeanStatus(EquipmentLeanOutStatusEnum.WAIT_APPROVAL.name());
            //保存工单
            equipmentLeanOutMapper.updateById(entity);
            return result.isSuccess();
        }
        return true;
@@ -236,41 +241,112 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public EamEquipmentLeanOut approval(EamEquipmentLeanOut eamEquipmentLeanOut) {
        try {
            // æ£€æŸ¥è¯·æ±‚参数
            if (!isValidRequest(eamEquipmentLeanOut)) {
                throw new JeecgBootException("非法参数");
            }
            if (EquipmentLeanOutStatusEnum.WAIT_APPROVAL.name().equals(eamEquipmentLeanOut.getLeanStatus())) {
                eamEquipmentLeanOut.setLeanStatus(EquipmentLeanOutStatusEnum.WAIT_RETURN.name());
                // å¾…归还
            } else if (EquipmentLeanOutStatusEnum.WAIT_RETURN.name().equals(eamEquipmentLeanOut.getLeanStatus())) {
                // å¾…确认
                eamEquipmentLeanOut.setLeanStatus(EquipmentLeanOutStatusEnum.WAIT_CONFIRM.name());
            } else if (EquipmentLeanOutStatusEnum.WAIT_CONFIRM.name().equals(eamEquipmentLeanOut.getLeanStatus())) {
                // å·²å®Œæˆ
                eamEquipmentLeanOut.setLeanStatus(EquipmentLeanOutStatusEnum.COMPLETE.name());
    public EamEquipmentLeanOut approval(EamEquipmentLeanOutRequest request) {
        EamEquipmentLeanOut entity = equipmentLeanOutMapper.selectById(request.getId());
        if (entity == null) {
            throw new JeecgBootException("审批的数据已删除,请刷新重试!");
            }
            // èŽ·å–å½“å‰ç™»å½•ç”¨æˆ·
            LoginUser sysUser = getCurrentUser();
            if (sysUser == null || StrUtil.isBlank(sysUser.getId())) {
                throw new JeecgBootException("账号不存在");
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        if (user == null || StrUtil.isBlank(user.getId())) {
            throw new JeecgBootException("未获取到登录用户,请重新登录后再试!");
            }
            // å®¡æ‰¹äºº
            eamEquipmentLeanOut.setApprovalUser(sysUser.getUsername());
            //检查设备
            EamEquipment equipment = eamEquipmentService.getById(eamEquipmentLeanOut.getEquipmentId());
            if (equipment == null) {
                throw new JeecgBootException("设备不存在!");
            }
            eamEquipmentLeanOut.setLeanPerson(sysUser.getUsername());
            this.updateById(eamEquipmentLeanOut);
        request.setApprovalUser(user.getUsername());
            // èŽ·å–æµç¨‹ä¸šåŠ¡è®°å½•
            return eamEquipmentLeanOut;
        } catch (Exception e) {
            throw new JeecgBootException("操作失败:" + e.getMessage());
        FlowMyBusiness flowMyBusiness = flowMyBusinessService.getFlowMyBusiness(request.getInstanceId());
        if (flowMyBusiness == null) {
            throw new JeecgBootException("流程实例不存在,请刷新后重试!");
        }
        boolean userAuthorized = isUserAuthorized(flowMyBusiness, user);
        if (!userAuthorized) {
            throw new JeecgBootException("用户无权操作此任务,请刷新后重试!");
        }
        // è®¤é¢†ä»»åŠ¡
        if (!claimTask(flowMyBusiness.getTaskId(), user)) {
            throw new JeecgBootException("任务不存在、已完成或已被他人认领!");
        }
        EamEquipment equipment = eamEquipmentService.getById(entity.getEquipmentId());
        if (equipment == null) {
            throw new JeecgBootException("设备不存在,请检查!");
        }
        EquipmentLeanOutStatusEnum status = EquipmentLeanOutStatusEnum.getInstance(entity.getLeanStatus());
        if (status == null) {
            return null;
        }
        //流程变量
        Map<String, Object> values = new HashMap<>();
        switch (status) {
            // å®¡æ‰¹
            case WAIT_APPROVAL:
                //执行完成
                values.put("dataId", entity.getId());
                values.put("organization", request.getApprovalComment());
                values.put("comment", request.getApprovalComment());
                values.put("approvalDealType", request.getApprovalDealType());
                request.setComment(request.getApprovalComment());
                entity.setApprovalUser(user.getUsername());// å®¡æ ¸äºº
                entity.setApprovalComment(request.getApprovalComment());// å®¡æ ¸æ„è§
                entity.setApprovalTime(new Date());// å®¡æ ¸æ—¶é—´
                entity.setApprovalDealType(request.getApprovalDealType()); // å®¡æ‰¹ç±»åž‹
                // éªŒè¯é€šè¿‡è¿˜æ˜¯é©³å›ž
                if (request.getApprovalDealType().equals("1")) {
                    //设置entity
                    entity.setLeanStatus(EquipmentLeanOutStatusEnum.WAIT_RETURN.name());
                    List<String> userApprovalList = new ArrayList<>(Collections.singletonList(entity.getLeanPerson()));
                    values.put("NextAssignee", userApprovalList);
                } else {
                    //设置entity
                    entity.setLeanStatus(EquipmentLeanOutStatusEnum.COMPLETE.name());
                }
                break;
            // å½’还
            case WAIT_RETURN:
                if (StringUtils.isBlank(equipment.getEquipmentManager())) {
                    throw new JeecgBootException("设备未分配设备管理员,无法进入下级审批!");
                }
                List<String> userApprovalList = new ArrayList<>(Collections.singletonList(entity.getLeanPerson()));
                userApprovalList.add(equipment.getEquipmentManager());
                values.put("dataId", entity.getId());
                values.put("organization", request.getReturnComment());
                values.put("comment", request.getReturnComment());
                values.put("NextAssignee", userApprovalList);
                request.setComment(request.getReturnComment());
                entity.setLeanEndTime(new Date()); //归还时间
                //设置entity
                entity.setLeanStatus(EquipmentLeanOutStatusEnum.WAIT_CONFIRM.name());
                entity.setApprovalUser(user.getUsername());// å®¡æ ¸äºº
                entity.setLeanEndTime(new Date());// å½’还时间
                entity.setReturnComment(request.getReturnComment());// å½’还备注
                break;
            // å½’还确认
            case WAIT_CONFIRM:
                values.put("dataId", entity.getId());
                values.put("organization", request.getConfirmComment());
                values.put("comment", request.getConfirmComment());
                request.setComment(request.getConfirmComment());
                //设置entity
                entity.setLeanStatus(EquipmentLeanOutStatusEnum.COMPLETE.name());
                entity.setConfirmUser(user.getUsername());
                entity.setConfirmComment(request.getConfirmComment());
                entity.setConfirmTime(new Date());
                // ä¿®æ”¹è®¾å¤‡çŠ¶æ€
                equipment.setAssetStatus(AssetStatusEnum.NORMAL.name());
                eamEquipmentService.updateById(equipment);
                break;
        }
        request.setValues(values);
        // å®Œæˆæµç¨‹ä»»åŠ¡
        Result result = flowTaskService.complete(request);
        if (!result.isSuccess()) {
            throw new JeecgBootException("审批失败,请刷新查看!");
        }
        //保存工单
        equipmentLeanOutMapper.updateById(entity);
        return entity;
    }
@@ -281,17 +357,28 @@
        business.getActStatus();
    }
    private boolean isValidRequest(EamEquipmentLeanOut request) {
        return StrUtil.isNotBlank(request.getCode()) && StrUtil.isNotBlank(request.getEquipmentId());
    private boolean claimTask(String taskId, LoginUser user) {
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        if (task == null) {
            return false;
        }
        if (task.getAssignee() != null && !task.getAssignee().equals(user.getUsername())) {
            return false;
        }
        taskService.claim(taskId, user.getUsername());
        return true;
    }
    private LoginUser getCurrentUser() {
        try {
            return (LoginUser) SecurityUtils.getSubject().getPrincipal();
        } catch (Exception e) {
            return null;
        }
    /**
     * åˆ¤æ–­ç”¨æˆ·æ˜¯å¦æ‹¥æœ‰æ­¤æƒé™
     *
     * @param flowMyBusiness
     * @param user
     * @return
     */
    private boolean isUserAuthorized(FlowMyBusiness flowMyBusiness, LoginUser user) {
        List<String> todoUsers = JSON.parseArray(flowMyBusiness.getTodoUsers(), String.class);
        return todoUsers != null && todoUsers.contains(user.getUsername());
    }
    @Override