添加审签逻辑,移动flow通用代码,添加根据角色查询用户,新增时间工具类,修改指派设备bug
已重命名11个文件
已添加16个文件
已修改26个文件
已删除6个文件
2078 ■■■■ 文件已修改
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/entity/DocInfo.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/entity/ProductMix.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/DocInfoMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/DocRelativeMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/PermissionStreamNewMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/request/DocInfoQueryRequest.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/request/DocInfoUploadRequest.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProductPermissionServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/controller/DispatchFileController.java 192 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/entity/AssignFileStream.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/entity/DispatchFile.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/entity/WorkTaskDataVo.java 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/mapper/DispatchFileMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/mapper/IHisWorkTaskMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/mapper/xml/DispatchFileMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/mapper/xml/HisWorkTaskMapper.xml 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IDispatchFileService.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IHisWorkTaskService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/AssignFileStreamServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/DispatchFileServiceImpl.java 359 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/HisWorkTaskServiceImpl.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/WorkTaskServiceImplVo.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/vo/AssignFlowTaskVo.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/vo/DispatchFileFlowTaskVo.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/dto/FlowMyBusinessDto.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/entity/FlowMyBusiness.java 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/mapper/xml/FlowMyBusinessMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/service/impl/FlowMyBusinessServiceImpl.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/controller/AssignStreamFlowController.java 63 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/FlowHistoricalVo.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/FlowMy.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/FlowTaskVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/HisWorkTask.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/WorkTaskData.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/WorkTaskDataVo.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/IHisWorkTaskMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/IWorkTaskMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/IWorkTaskVoMapper.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/HisWorkTaskMapper.xml 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/WorkTaskMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/WorkTaskVoMapper.xml 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/IHisWorkTaskService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/IWorkTaskService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/IWorkTaskServiceVo.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowDefinitionServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowInstanceServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/HisWorkTaskServiceImpl.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/WorkTaskServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/WorkTaskServiceImplVo.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/util/TimeUtil.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserRoleMapper.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserRoleService.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserRoleServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/entity/DocInfo.java
@@ -18,7 +18,6 @@
public class DocInfo {
    @TableId(value = "doc_id")
    private String docId;
    @TableField(value = "doc_name")
    private String docName;
    @TableField(value = "doc_alias")
@@ -30,6 +29,9 @@
    @TableField(value = "doc_status")
    @Dict(dicCode = "dnc_product_status")
    private Integer docStatus;
    @TableField(value = "doc_dispatch_status")
    @Dict(dicCode = "nc_doc_dispatch_status")
    private Integer docDispatchStatus;
    @TableField(value = "publish_file_id")
    private String publishFileId;
    @TableField(value = "publish_version")
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/entity/ProductMix.java
@@ -28,7 +28,7 @@
    @TableField(value = "parent_id")
    private Long parentId;
    // åç§°
    @TableField(value = "name")
    @TableField(value = "tree_name")
    private String name;
    // code
    @TableField(value = "tree_code")
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/DocInfoMapper.xml
@@ -12,6 +12,7 @@
        ,r.attribution_type
        ,r.attribution_id
        ,u.doc_status
        ,u.doc_dispatch_status
        ,u.publish_file_id
        ,u.publish_version
        ,u.description
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/DocRelativeMapper.xml
@@ -25,7 +25,7 @@
       WHERE
        nr.doc_id = #{docId}
         AND nr.delete_flag = 0
         AND nr.attribution_type = 4
         AND nr.attribution_type = 7
         AND nr.attribution_id = d.id
      );
    </select>
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/mapper/xml/PermissionStreamNewMapper.xml
@@ -5,7 +5,7 @@
        SELECT DISTINCT
            mix.id,
            mix.tree_code 'code',
                mix.name,
                mix.tree_name 'name',
            mix.parent_id,
            mix.tree_type AS 'type',
                mix.extend,
@@ -30,21 +30,18 @@
        order by mix.tree_type, mix.create_time asc
    </select>
    <select id="loadProductMixAll" resultType="org.jeecg.modules.dnc.entity.ProductMix">
        SELECT DISTINCT
        mix.id,
        SELECT DISTINCT mix.id,
        mix.tree_code 'code',
        mix.name,
                        mix.tree_name    'name',
        mix.parent_id,
        mix.tree_type AS 'type',
        mix.extend,
        mix.create_time
        FROM
        nc_product_mix mix -- è¿žæŽ¥æƒé™è¡¨ï¼Œç­›é€‰éƒ¨é—¨ç›¸å…³è®°å½•
        FROM nc_product_mix mix -- è¿žæŽ¥æƒé™è¡¨ï¼Œç­›é€‰éƒ¨é—¨ç›¸å…³è®°å½•
        LEFT JOIN nc_permission_stream_new nps_user ON mix.id = nps_user.business_id
        AND nps_user.user_id = #{userId}
        AND nps_user.delete_flag = '0'
        WHERE
         nps_user.business_id IS NOT NULL
        WHERE nps_user.business_id IS NOT NULL
        order by mix.tree_type, mix.create_time asc
    </select>
</mapper>
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/request/DocInfoQueryRequest.java
@@ -1,16 +1,16 @@
package org.jeecg.modules.dnc.request;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.jeecg.common.aspect.annotation.Dict;
@Data
@NoArgsConstructor
@ApiModel(value = "文档查询参数", description = "文档查询参数")
public class DocInfoQueryRequest {
    @ApiModelProperty(value = "文档id")
    private String docId;
    @ApiModelProperty(value = "绑定类型 1 äº§å“ 2 éƒ¨ä»¶ 3 é›¶ä»¶ 4 è®¾å¤‡ 5 å·¥åº", example = "1", required = true)
    private Integer attributionType;
    @ApiModelProperty(value = "绑定类型对应的id 1 äº§å“id 2 éƒ¨ä»¶id 3 é›¶ä»¶id 4 è®¾å¤‡id 5 å·¥åºid", example = "234324234",  required = true)
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/request/DocInfoUploadRequest.java
@@ -9,4 +9,6 @@
    private String attributionId;
    private Integer attributionType;
    private String docClassCode;
    /**是否进入审签流程*/
    private Boolean isApprove = true;
}
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java
@@ -1,7 +1,6 @@
package org.jeecg.modules.dnc.service.impl;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
@@ -13,21 +12,19 @@
import org.jeecg.common.api.vo.FileUploadResult;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.dnc.entity.*;
import org.jeecg.modules.dnc.exception.ExceptionCast;
import org.jeecg.modules.dnc.mapper.DocInfoMapper;
import org.jeecg.modules.dnc.request.DocInfoQueryRequest;
import org.jeecg.modules.dnc.request.DocInfoUploadRequest;
import org.jeecg.modules.dnc.response.*;
import org.jeecg.modules.dnc.service.*;
import org.jeecg.modules.dnc.utils.CamelToSnakeRegex;
import org.jeecg.modules.dnc.utils.ValidateUtil;
import org.jeecg.modules.dnc.request.DocInfoQueryRequest;
import org.jeecg.modules.dnc.request.DocInfoUploadRequest;
import org.jeecg.modules.dnc.utils.file.FileUtilS;
import org.jeecg.modules.dnc.entity.*;
import org.jeecg.modules.dnc.response.*;
import org.jeecg.modules.dncFlow.entity.DispatchFile;
import org.jeecg.modules.dncFlow.service.IDispatchFileService;
import org.jeecg.modules.mdc.entity.MdcEquipment;
import org.jeecg.modules.system.service.ISysDictService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
@@ -59,7 +56,8 @@
    private IDeviceInfoService deviceInfoService;
    @Autowired
    private IDeviceGroupService deviceGroupService;
    @Autowired
    private IDispatchFileService dispatchFileService;
    /*备份处理*/
    @Override
@@ -137,11 +135,22 @@
                }
            }
        }
        boolean saveBool = super.save(docInfo);
        if (uploadRequest.getIsApprove()&&saveBool){
            //触发审签
            DispatchFile dispatchFile = new DispatchFile();
            dispatchFile.setDocId(docInfo.getDocId());
            dispatchFile.setFileId(docFile.getFileId());
            dispatchFile.setAttributionId(uploadRequest.getAttributionId());
            dispatchFile.setAttributionType(String.valueOf(uploadRequest.getAttributionType()));
            dispatchFile.setDocClassCode(uploadRequest.getDocClassCode());
            dispatchFileService.saveDispatchFile(dispatchFile);
        }
        return saveBool;
    }
    @Override
    @Transactional(rollbackFor = {Exception.class})
@@ -161,7 +170,7 @@
        }
        String  recF =  pathFile.substring(0,recNum);//将返回def}ab
        Integer equipmentId = recF.lastIndexOf("\\");
        String deviceNo = recF.substring(equipmentId+1,recF.length());
        String deviceNo = recF.substring(equipmentId+1);
        if (StringUtils.isEmpty(deviceNo)) {
            return false;
        }
@@ -528,10 +537,12 @@
        }
        queryWrapper.ge(StrUtil.isNotEmpty(docQuery.getStartTime()),"u.create_time",docQuery.getStartTime()+" 00:00:00");
        queryWrapper.le(StrUtil.isNotEmpty(docQuery.getEndTime()),"u.create_time",docQuery.getEndTime()+" 23:59:59");
        if (StrUtil.isNotEmpty(docQuery.getColumn())){
        if (("desc").equals(docQuery.getOrder())){
            queryWrapper.orderByDesc("u."+ CamelToSnakeRegex.camelToSnake(docQuery.getColumn()));
        }else {
            queryWrapper.orderByAsc("u."+CamelToSnakeRegex.camelToSnake(docQuery.getColumn()));
            }
        }
    }
@@ -659,10 +670,7 @@
    @Transactional(rollbackFor = {Exception.class})
    public boolean deleteByDocAttr(Integer attrType, String attrId) {
        int i = super.getBaseMapper().deleteByDocAttr(attrType, attrId);
        if(i >= 0) {
            return true;
        }
        return false;
        return i >= 0;
    }
    @Override
@@ -789,6 +797,7 @@
        }
        QueryWrapper<DocInfo> queryWrapper = Wrappers.query();
        queryWrapper.eq(StrUtil.isNotEmpty(docQuery.getDocId()),"u.doc_id",docQuery.getDocId());
        queryWrapper.eq("r.attribution_type", docQuery.getAttributionType()).eq("r.attribution_id", docQuery.getAttributionId())
                .eq("r.classification_id", docClassification.getClassificationId());
        if (StringUtils.isNotEmpty(docQuery.getDocName())) {
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProcessStreamServiceImpl.java
@@ -161,7 +161,7 @@
        stream.setComponentId(null);
        stream.setPartsId(null);
        stream.setProcessName(stream.getProcessName().toUpperCase());
        stream.setProcessCode(null);
        stream.setProcessCode(stream.getProcessCode().toUpperCase());
        boolean b = super.updateById(stream);
        //同步修改结构树
        ProductMix productMix = productMixService.getById(Long.parseLong(id));
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/ProductPermissionServiceImpl.java
@@ -10,7 +10,6 @@
import org.jeecg.modules.dnc.service.*;
import org.jeecg.modules.dnc.ucenter.UserDepartExt;
import org.jeecg.modules.dnc.utils.ValidateUtil;
import org.jeecg.modules.system.entity.DncDevicePermission;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -133,6 +132,7 @@
            case "4":
                //工艺规程版本号
                processSpecVersionPermissionService.save(new ProcessSpecVersionPermission(id, userId));
                break;
            case "5":
                // å·¥åºæƒé™
                processStreamPermissionService.save(new ProcessionPermission(id, userId));
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/controller/DispatchFileController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,192 @@
package org.jeecg.modules.dncFlow.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.modules.dncFlow.entity.DispatchFile;
import org.jeecg.modules.dncFlow.service.IDispatchFileService;
import org.jeecg.modules.dncFlow.vo.DispatchFileFlowTaskVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
 /**
 * @Description: nc程序与电子图版签派
 * @Author: jeecg-boot
 * @Date:   2025-03-19
 * @Version: V1.0
 */
@Api(tags="nc程序与电子图版签派")
@RestController
@RequestMapping("/dncFlow/dispatchFile")
@Slf4j
public class DispatchFileController extends JeecgController<DispatchFile, IDispatchFileService> {
    @Autowired
    private IDispatchFileService dispatchFileService;
    /**
     * åˆ†é¡µåˆ—表查询
     *
     * @param dispatchFile
     * @param pageNo
     * @param pageSize
     * @param req
     * @return
     */
    //@AutoLog(value = "nc程序与电子图版签派-分页列表查询")
    @ApiOperation(value="nc程序与电子图版签派-分页列表查询", notes="nc程序与电子图版签派-分页列表查询")
    @GetMapping(value = "/list")
    public Result<IPage<DispatchFile>> queryPageList(DispatchFile dispatchFile,
                                   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
                                   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
                                   HttpServletRequest req) {
        QueryWrapper<DispatchFile> queryWrapper = QueryGenerator.initQueryWrapper(dispatchFile, req.getParameterMap());
        Page<DispatchFile> page = new Page<DispatchFile>(pageNo, pageSize);
        IPage<DispatchFile> pageList = dispatchFileService.page(page, queryWrapper);
        return Result.OK(pageList);
    }
     /**
      * é‡æ–°å¯åЍ
      * @param id
      * @return
      */
     @AutoLog(value = "nc程序与电子图版签派-重新启动")
     @ApiOperation(value="nc程序与电子图版签派-重新启动", notes="nc程序与电子图版签派-重新启动")
     @GetMapping(value = "/saveDispatchFile")
     public Result<?> saveDispatchFile(String id){
         return dispatchFileService.reStartDispatchFile(id);
     }
     /**
      * å®¡æ‰¹æ“ä½œ
      * @param dispatchFileFlowTaskVo
      * @return
      */
     @AutoLog(value = "nc程序与电子图版签派-审批操作")
     @ApiOperation(value="nc程序与电子图版签派-审批操作", notes="nc程序与电子图版签派-审批操作")
     @GetMapping(value = "/approval")
     public Result<?> approval(DispatchFileFlowTaskVo dispatchFileFlowTaskVo){
         return dispatchFileService.auditDispatchFile(dispatchFileFlowTaskVo);
     }
    /**
     *   æ·»åŠ 
     *
     * @param dispatchFile
     * @return
     */
    @AutoLog(value = "nc程序与电子图版签派-添加")
    @ApiOperation(value="nc程序与电子图版签派-添加", notes="nc程序与电子图版签派-添加")
    //@RequiresPermissions("org.jeecg.modules:nc_dispatch_file:add")
    @PostMapping(value = "/add")
    public Result<String> add(@RequestBody DispatchFile dispatchFile) {
        dispatchFileService.save(dispatchFile);
        return Result.OK("添加成功!");
    }
    /**
     *  ç¼–辑
     *
     * @param dispatchFile
     * @return
     */
    @AutoLog(value = "nc程序与电子图版签派-编辑")
    @ApiOperation(value="nc程序与电子图版签派-编辑", notes="nc程序与电子图版签派-编辑")
    //@RequiresPermissions("org.jeecg.modules:nc_dispatch_file:edit")
    @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
    public Result<String> edit(@RequestBody DispatchFile dispatchFile) {
        dispatchFileService.updateById(dispatchFile);
        return Result.OK("编辑成功!");
    }
    /**
     *   é€šè¿‡id删除
     *
     * @param id
     * @return
     */
    @AutoLog(value = "nc程序与电子图版签派-通过id删除")
    @ApiOperation(value="nc程序与电子图版签派-通过id删除", notes="nc程序与电子图版签派-通过id删除")
    //@RequiresPermissions("org.jeecg.modules:nc_dispatch_file:delete")
    @DeleteMapping(value = "/delete")
    public Result<String> delete(@RequestParam(name="id",required=true) String id) {
        dispatchFileService.removeById(id);
        return Result.OK("删除成功!");
    }
    /**
     *  æ‰¹é‡åˆ é™¤
     *
     * @param ids
     * @return
     */
    @AutoLog(value = "nc程序与电子图版签派-批量删除")
    @ApiOperation(value="nc程序与电子图版签派-批量删除", notes="nc程序与电子图版签派-批量删除")
    //@RequiresPermissions("org.jeecg.modules:nc_dispatch_file:deleteBatch")
    @DeleteMapping(value = "/deleteBatch")
    public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
        this.dispatchFileService.removeByIds(Arrays.asList(ids.split(",")));
        return Result.OK("批量删除成功!");
    }
    /**
     * é€šè¿‡id查询
     *
     * @param id
     * @return
     */
    //@AutoLog(value = "nc程序与电子图版签派-通过id查询")
    @ApiOperation(value="nc程序与电子图版签派-通过id查询", notes="nc程序与电子图版签派-通过id查询")
    @GetMapping(value = "/queryById")
    public Result<DispatchFile> queryById(@RequestParam(name="id",required=true) String id) {
        DispatchFile dispatchFile = dispatchFileService.getById(id);
        if(dispatchFile==null) {
            return Result.error("未找到对应数据");
        }
        return Result.OK(dispatchFile);
    }
     @GetMapping(value = "/selectVoById")
     public Result<?> selectVoById(@RequestParam(name="id") String id){
         return dispatchFileService.queryDispatchFile(id);
     }
    /**
    * å¯¼å‡ºexcel
    *
    * @param request
    * @param dispatchFile
    */
    //@RequiresPermissions("org.jeecg.modules:nc_dispatch_file:exportXls")
    @RequestMapping(value = "/exportXls")
    public ModelAndView exportXls(HttpServletRequest request, DispatchFile dispatchFile) {
        return super.exportXls(request, dispatchFile, DispatchFile.class, "nc程序与电子图版签派");
    }
    /**
      * é€šè¿‡excel导入数据
    *
    * @param request
    * @param response
    * @return
    */
    //@RequiresPermissions("nc_dispatch_file:importExcel")
    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
        return super.importExcel(request, response, DispatchFile.class);
    }
}
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/entity/AssignFileStream.java
@@ -23,6 +23,9 @@
    private String componentId;
    @TableField(value = "parts_id")
    private String partsId;
    //工艺规程id
    @TableField(value = "psv_id")
    private String psvId;
    @TableField(value = "process_id")
    private String processId;
    @TableField(value = "step_id")
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/entity/DispatchFile.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,112 @@
package org.jeecg.modules.dncFlow.entity;
import com.baomidou.mybatisplus.annotation.IdType;
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.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
 * @Description: nc程序与电子图版签派
 * @Author: jeecg-boot
 * @Date:   2025-03-19
 * @Version: V1.0
 */
@Data
@TableName("nc_dispatch_file")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="nc_dispatch_file对象", description="nc程序与电子图版签派")
public class  DispatchFile implements Serializable {
    private static final long serialVersionUID = 1L;
    /**主键*/
    @TableId(type = IdType.ASSIGN_ID)
    @ApiModelProperty(value = "主键")
    private String id;
    /**产品id*/
    @Excel(name = "产品id", width = 15)
    @ApiModelProperty(value = "产品id")
    private String productId;
    /**部件id*/
    @Excel(name = "部件id", width = 15)
    @ApiModelProperty(value = "部件id")
    private String componentId;
    /**零件id*/
    @Excel(name = "零件id", width = 15)
    @ApiModelProperty(value = "零件id")
    private String partsId;
    /**工艺规程id*/
    @Excel(name = "工艺规程id", width = 15)
    @ApiModelProperty(value = "工艺规程id")
    private String psvId;
    /**工序id*/
    @Excel(name = "工序id", width = 15)
    @ApiModelProperty(value = "工序id")
    private String processId;
    /**工步id*/
    @Excel(name = "工步id", width = 15)
    @ApiModelProperty(value = "工步id")
    private String stepId;
    /**所属ID*/
    @Excel(name = "所属ID", width = 15)
    @ApiModelProperty(value = "所属ID")
    private String attributionId;
    /**所属type*/
    @Excel(name = "所属type", width = 15)
    @ApiModelProperty(value = "所属type")
    private String attributionType;
    /**文件类型*/
    @Excel(name = "文件类型", width = 15)
    @ApiModelProperty(value = "文件类型")
    private String docClassCode;
    /**设备类id*/
    @Excel(name = "设备类id", width = 15)
    @ApiModelProperty(value = "设备类id")
    private String deviceTypeId;
    /**文档id*/
    @Excel(name = "文档id", width = 15)
    @ApiModelProperty(value = "文档id")
    private String docId;
    /**文件表id*/
    @Excel(name = "文件表id", width = 15)
    @ApiModelProperty(value = "文件表id")
    private String fileId;
    /**当前节点*/
    @Excel(name = "当前节点", width = 15)
    @ApiModelProperty(value = "当前节点")
    private String currentNode;
    /**节点状态*/
    @Excel(name = "节点状态", width = 15)
    @ApiModelProperty(value = "节点状态")
    private String nodeState;
    /**创建人*/
    @ApiModelProperty(value = "创建人")
    private String createBy;
    /**创建日期*/
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "创建日期")
    private Date createTime;
    /**更新人*/
    @ApiModelProperty(value = "更新人")
    private String updateBy;
    /**更新日期*/
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "更新日期")
    private Date updateTime;
    /**申请理由*/
    @ApiModelProperty(value = "申请理由")
    private transient String organization;
}
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/entity/WorkTaskDataVo.java
ÎļþÒÑɾ³ý
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/mapper/DispatchFileMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package org.jeecg.modules.dncFlow.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.jeecg.modules.dncFlow.entity.DispatchFile;
/**
 * @Description: nc程序与电子图版签派
 * @Author: jeecg-boot
 * @Date:   2025-03-19
 * @Version: V1.0
 */
public interface DispatchFileMapper extends BaseMapper<DispatchFile> {
}
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/mapper/IHisWorkTaskMapper.java
ÎļþÒÑɾ³ý
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/mapper/xml/DispatchFileMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.dncFlow.mapper.DispatchFileMapper">
</mapper>
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/mapper/xml/HisWorkTaskMapper.xml
ÎļþÒÑɾ³ý
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IDispatchFileService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package org.jeecg.modules.dncFlow.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.dncFlow.entity.DispatchFile;
import org.jeecg.modules.dncFlow.vo.DispatchFileFlowTaskVo;
/**
 * @Description: nc程序与电子图版签派
 * @Author: jeecg-boot
 * @Date:   2025-03-19
 * @Version: V1.0
 */
public interface IDispatchFileService extends IService<DispatchFile> {
    /**
     * æµç¨‹å¯åЍ,保存对应的数据
     * @param dispatchFile
     * @return
     */
    Result<?> saveDispatchFile(DispatchFile dispatchFile);
    /**
     * é‡æ–°å¯åЍ
     * @param id
     */
    Result<?> reStartDispatchFile(String id);
    /**
     * å®¡æ‰¹æ“ä½œ
     * @param dispatchFileFlowTaskVo
     * @return
     */
    Result<?> auditDispatchFile(DispatchFileFlowTaskVo dispatchFileFlowTaskVo);
    /**
     * æŸ¥è¯¢å®¡ç­¾åŸºæœ¬ä¿¡æ¯
     * @param id
     */
    Result<?> queryDispatchFile(String id);
}
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IHisWorkTaskService.java
ÎļþÒÑɾ³ý
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/AssignFileStreamServiceImpl.java
@@ -289,6 +289,10 @@
        //flowable处理
        FlowTaskVo flowTaskVo = new FlowTaskVo();
        BeanUtils.copyProperties(assignFlowTaskVo, flowTaskVo);
        Map<String, Object> values=new HashMap<>();
        values.put("dataId", assignFlowTaskVo.getDataId());
        flowTaskVo.setTaskId(assignFlowTaskVo.getTaskId());
        flowTaskVo.setValues(values);
        flowTaskService.complete(flowTaskVo);
        //更新对象封装
        AssignFileStream up = new AssignFileStream();
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/DispatchFileServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,359 @@
package org.jeecg.modules.dncFlow.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists;
import org.apache.shiro.SecurityUtils;
import org.flowable.engine.TaskService;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.dnc.entity.*;
import org.jeecg.modules.dnc.exception.ExceptionCast;
import org.jeecg.modules.dnc.mapper.DocInfoMapper;
import org.jeecg.modules.dnc.request.DocInfoQueryRequest;
import org.jeecg.modules.dnc.response.ActivitiCode;
import org.jeecg.modules.dnc.response.CommonCode;
import org.jeecg.modules.dnc.response.UcenterCode;
import org.jeecg.modules.dnc.service.*;
import org.jeecg.modules.dnc.utils.ValidateUtil;
import org.jeecg.modules.dncFlow.entity.DispatchFile;
import org.jeecg.modules.dncFlow.mapper.DispatchFileMapper;
import org.jeecg.modules.dncFlow.service.IDispatchFileService;
import org.jeecg.modules.dncFlow.vo.DispatchFileFlowTaskVo;
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;
import org.jeecg.modules.flowable.apithird.service.FlowCommonService;
import org.jeecg.modules.flowable.service.IFlowDefinitionService;
import org.jeecg.modules.flowable.service.IFlowTaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * @Description: nc程序与电子图版签派
 * @Author: jeecg-boot
 * @Date:   2025-03-19
 * @Version: V1.0
 */
@Service("IDispatchFileService")
public class DispatchFileServiceImpl extends ServiceImpl<DispatchFileMapper, DispatchFile> implements IDispatchFileService, FlowCallBackServiceI {
    @Autowired
    @Lazy
    private IDocInfoService docInfoService;
    @Autowired
    private IProcessStreamService processStreamService;
    @Autowired
    private IWorkStepService workStepService;
    @Autowired
    private IPermissionStreamNewService permissionStreamNewService;
    @Resource
    private FlowCommonService flowCommonService;
    @Resource
    private IFlowDefinitionService flowDefinitionService;
    @Autowired
    private IFlowTaskService flowTaskService;
    @Autowired
    private IDeviceTypeService deviceTypeService;
    @Autowired
    private TaskService taskService;
    @Autowired
    private IFlowMyBusinessService flowMyBusinessService;
    @Autowired
    private DocInfoMapper docInfoMapper;
    /**
     * æµç¨‹å¯åЍ,保存对应的数据
     * @param dispatchFile
     * @return
     */
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public Result<?> saveDispatchFile(DispatchFile dispatchFile){
        //校验参数
        checkParam(dispatchFile);
        //获取文件信息
        DocInfo docInfo = docInfoService.getById(dispatchFile.getDocId());
        PermissionStreamNew permissionStreams = getPermissionStreams(dispatchFile);
        if (permissionStreams==null){
            return Result.error("用户没有权限");
        }
        dispatchFile.setAttributionType(dispatchFile.getAttributionType());
        dispatchFile.setAttributionId(dispatchFile.getAttributionId());
        dispatchFile.setDocClassCode(dispatchFile.getDocClassCode());
        super.save(dispatchFile);
        System.out.println("NC程序和电子样板审签流程:" + dispatchFile.getDocId());
        flowCommonService.initActBusiness(docInfo.getDocName()+"."+docInfo.getDocSuffix()+"文件进行审签",
                dispatchFile.getId(), "IDispatchFileService", "nc_dispatch_file", null);
        Map<String, Object> variables = new HashMap<>();
        variables.put("dataId", dispatchFile.getId());
        variables.put("organization", "导入文档默认启动流程");
        variables.put("proofreading",true);
        Result result= flowDefinitionService.startProcessInstanceByKey("nc_dispatch_file", variables);
        if (!result.isSuccess()) {
            super.removeById(dispatchFile.getId());
        }else {
            docInfo.setDocDispatchStatus(1);
            docInfoService.updateById(docInfo);
        }
        return result;
    }
    /**
     * é‡æ–°å¯åЍ
     * @param id
     */
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public Result<?> reStartDispatchFile(String id){
        DispatchFile dispatchFile = this.getById(id);
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        if (!dispatchFile.getCreateBy().equals(user.getUsername())){
            return Result.error("您没有权限重新启动");
        }
        FlowMyBusiness flowMyBusiness=flowMyBusinessService.list(new QueryWrapper<FlowMyBusiness>()
                .eq("data_id",dispatchFile.getId())).get(0);
        String processInstanceId = flowMyBusiness.getProcessInstanceId();
        Map<String, Object> variables = new HashMap<>();
        variables.put("dataId", dispatchFile.getId());
        variables.put("organization", "重新启动");
        String TaskId=taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult().getId();
        taskService.complete(TaskId, variables);
        return Result.ok("重新启动成功");
    }
    /**
     * å®¡æ‰¹æ“ä½œ
     * @param dispatchFileFlowTaskVo
     * @return
     */
    @Override
    public Result<?> auditDispatchFile(DispatchFileFlowTaskVo dispatchFileFlowTaskVo) {
        try {
            // å‚数校验
            if (!ValidateUtil.validateString(dispatchFileFlowTaskVo.getTaskId()) || !ValidateUtil.validateString(dispatchFileFlowTaskVo.getDataId())) {
                return Result.error(CommonCode.INVALID_PARAM.toString());
            }
            LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
            String userId = user.getId();
            dispatchFileFlowTaskVo.setAssignee(user.getUsername());
            if (!ValidateUtil.validateString(userId)) {
                return Result.error(UcenterCode.UCENTER_ACCOUNT_NOT_EXIST.toString());
            }
            // æ•°æ®æŸ¥è¯¢
            DispatchFile dispatchFile = this.getById(dispatchFileFlowTaskVo.getDataId());
            if (dispatchFile == null) {
                return Result.error(CommonCode.INVALID_PARAM.toString());
            }
            DocInfo docInfo = docInfoService.getById(dispatchFile.getDocId());
            if (docInfo == null) {
                return Result.error(ActivitiCode.ACT_DOC_ERROR.toString());
            }
            // è®¾ç½®æµç¨‹å˜é‡
            Map<String, Object> values = setProcessVariables(dispatchFile, userId, dispatchFileFlowTaskVo);
            dispatchFileFlowTaskVo.setValues(values);
            // å®Œæˆæµç¨‹ä»»åŠ¡
            Result result = flowTaskService.complete(dispatchFileFlowTaskVo);
            if (result.isSuccess()) {
                // æ›´æ–°çŠ¶æ€
                updateStatus(dispatchFile, docInfo, dispatchFileFlowTaskVo);
                docInfoService.updateById(docInfo);
                this.updateById(dispatchFile);
            } else {
                return result;
            }
            return Result.OK("操作成功");
        } catch (Exception e) {
            return Result.error("操作失败:" + e.getMessage());
        }
    }
    /**
     * æŸ¥è¯¢å®¡ç­¾åŸºæœ¬ä¿¡æ¯
     * @param id
     */
    public Result<?> queryDispatchFile(String id){
        DispatchFile dispatchFile=this.getById(id);
        if (dispatchFile==null){
            return Result.error("审签基本信息不存在");
        }
        DocInfoQueryRequest docInfoQueryRequest=new DocInfoQueryRequest();
        docInfoQueryRequest.setDocId(dispatchFile.getDocId());
        docInfoQueryRequest.setAttributionId(dispatchFile.getAttributionId());
        docInfoQueryRequest.setAttributionType(Integer.valueOf(dispatchFile.getAttributionType()));
        docInfoQueryRequest.setDocClassCode(dispatchFile.getDocClassCode());
        List<DocInfo> docInfoList = docInfoService.findList(docInfoQueryRequest);
        return Result.OK(docInfoList);
    }
    private Map<String, Object> setProcessVariables(DispatchFile dispatchFile, String userId, DispatchFileFlowTaskVo dispatchFileFlowTaskVo) {
        Map<String, Object> values = new HashMap<>();
        values.put("dataId", dispatchFile.getId());
        values.put("organization", dispatchFile.getOrganization());
        values.put("assignee", userId);
        values.put("comment", dispatchFileFlowTaskVo.getComment());
        if (StrUtil.isNotBlank(dispatchFileFlowTaskVo.getProofreadStatus())) {
            values.put("proofreadStatus", dispatchFileFlowTaskVo.getProofreadStatus());
        }
        if (dispatchFileFlowTaskVo.getRatify() != null) {
            values.put("ratify", dispatchFileFlowTaskVo.getRatify());
        }
        if (dispatchFileFlowTaskVo.getCut() != null) {
            values.put("cut", dispatchFileFlowTaskVo.getCut());
        }
        if (dispatchFileFlowTaskVo.getStereotype() != null) {
            values.put("stereotype", dispatchFileFlowTaskVo.getStereotype());
        }
        return values;
    }
    private void updateStatus(DispatchFile dispatchFile, DocInfo docInfo, DispatchFileFlowTaskVo dispatchFileFlowTaskVo) {
        if (StrUtil.isNotBlank(dispatchFileFlowTaskVo.getProofreadStatus())) {
            switch (dispatchFileFlowTaskVo.getProofreadStatus()) {
                case "1":
                    // ç›´æŽ¥å®šåž‹
                    dispatchFile.setCurrentNode("5");
                    docInfo.setDocDispatchStatus(5);
                    break;
                case "2":
                    // æ ¡å¯¹é€šè¿‡
                    dispatchFile.setCurrentNode("2");
                    docInfo.setDocDispatchStatus(2);
                    break;
                default:
                    // æ ¡å¯¹ä¸é€šè¿‡
                    dispatchFile.setCurrentNode("1");
                    docInfo.setDocDispatchStatus(1);
                    break;
            }
        }
        if (dispatchFileFlowTaskVo.getRatify() != null && dispatchFileFlowTaskVo.getRatify()) {
            dispatchFile.setCurrentNode("3");
            docInfo.setDocDispatchStatus(3);
        }
        if (dispatchFileFlowTaskVo.getCut() != null && dispatchFileFlowTaskVo.getCut()) {
            dispatchFile.setCurrentNode("4");
            docInfo.setDocDispatchStatus(4);
        }
        if (dispatchFileFlowTaskVo.getStereotype() != null && dispatchFileFlowTaskVo.getStereotype()) {
            dispatchFile.setCurrentNode("5");
            docInfo.setDocDispatchStatus(5);
        }
    }
    //传参验证
    public boolean checkParam(DispatchFile dispatchFile) {
        if (dispatchFile == null) {
            ExceptionCast.cast(CommonCode.INVALID_PARAM);
        }
        if (!ValidateUtil.validateString(dispatchFile.getAttributionId()) || !ValidateUtil.validateString(dispatchFile.getDocId())
                || !ValidateUtil.validateString(dispatchFile.getFileId()) || !ValidateUtil.validateString(dispatchFile.getAttributionType())) {
            ExceptionCast.cast(CommonCode.INVALID_PARAM);
        }
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        String userId = user.getId();
        if (!ValidateUtil.validateString(userId)) {
            ExceptionCast.cast(UcenterCode.UCENTER_ACCOUNT_NOT_EXIST);
        }
        return true;
    }
    //获取文件信息
    private DocInfo getDocInfo(DispatchFile dispatchFile) {
        DocInfo docInfo = docInfoService.getByDocAttrAndDocId(dispatchFile.getDocId(),
                Integer.parseInt(dispatchFile.getAttributionType()), dispatchFile.getAttributionId());
        if (docInfo == null || docInfo.getDocStatus() == 3) {
            ExceptionCast.cast(ActivitiCode.ACT_DOC_ERROR);
        }
        return docInfo;
    }
    private PermissionStreamNew getPermissionStreams(DispatchFile dispatchFile) {
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        DeviceType deviceType = deviceTypeService.getById(dispatchFile.getAttributionId());
        String attributionId = deviceType != null ? deviceType.getAttributionId() : dispatchFile.getAttributionId();
        PermissionStreamNew permissionStreams;
        if (dispatchFile.getAttributionType().equals("5")) {
            // å·¥åº
            permissionStreams = handleProcess(dispatchFile, attributionId, user);
        } else {
            // å·¥æ­¥
            permissionStreams = handleWorkStep(dispatchFile, attributionId, user);
        }
        if (permissionStreams == null) {
            ExceptionCast.cast(ActivitiCode.ACT_NODE_DEPART_NONE);
        }
        return permissionStreams;
    }
    private PermissionStreamNew handleProcess(DispatchFile dispatchFile, String attributionId, LoginUser user) {
        ProcessStream processStream = processStreamService.getById(attributionId);
        if (processStream == null) {
            ExceptionCast.cast(CommonCode.INVALID_PARAM);
        }
        dispatchFile.setProductId(processStream.getProductId());
        dispatchFile.setComponentId(processStream.getComponentId());
        dispatchFile.setPartsId(processStream.getPartsId());
        dispatchFile.setPsvId(processStream.getPsvId());
        dispatchFile.setProcessId(processStream.getProcessId());
        if (deviceTypeService.getById(dispatchFile.getAttributionId()) != null) {
            dispatchFile.setDeviceTypeId(deviceTypeService.getById(dispatchFile.getAttributionId()).getId());
        }
        return permissionStreamNewService.loadPermissionStreamNewByBusinessIdAndUserId(processStream.getProcessId(), user.getId(), "5");
    }
    private PermissionStreamNew handleWorkStep(DispatchFile dispatchFile, String attributionId, LoginUser user) {
        WorkStep workStep = workStepService.getById(attributionId);
        if (workStep == null) {
            ExceptionCast.cast(CommonCode.INVALID_PARAM);
        }
        dispatchFile.setProductId(workStep.getProductId());
        dispatchFile.setComponentId(workStep.getComponentId());
        dispatchFile.setPartsId(workStep.getPartsId());
        dispatchFile.setPsvId(workStep.getPsvId());
        dispatchFile.setProcessId(workStep.getProcessId());
        dispatchFile.setStepId(workStep.getId());
        if (deviceTypeService.getById(dispatchFile.getAttributionId()) != null) {
            dispatchFile.setDeviceTypeId(deviceTypeService.getById(dispatchFile.getAttributionId()).getId());
        }
        return permissionStreamNewService.loadPermissionStreamNewByBusinessIdAndUserId(workStep.getId(), user.getId(), "6");
    }
    @Override
    public void afterFlowHandle(FlowMyBusiness business) {
        business.getTaskNameId();//接下来审批的节点
        business.getValues();//前端传进来的参数
        business.getActStatus();
    }
    @Override
    public Object getBusinessDataById(String dataId) {
        return this.getById(dataId);
    }
    @Override
    public Map<String, Object> flowValuesOfTask(String taskNameId, Map<String, Object> values) {
        return null;
    }
    @Override
    public List<String> flowCandidateUsernamesOfTask(String taskNameId, Map<String, Object> values) {
        String dataId = values.get("dataId").toString();
        FlowMyBusiness flowMyBusiness=flowMyBusinessService.list(new QueryWrapper<FlowMyBusiness>().eq("data_id",dataId)).get(0);
        return Lists.newArrayList(flowMyBusiness.getCreateBy());
    }
}
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/HisWorkTaskServiceImpl.java
ÎļþÒÑɾ³ý
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/WorkTaskServiceImplVo.java
ÎļþÒÑɾ³ý
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/vo/AssignFlowTaskVo.java
@@ -1,47 +1,16 @@
package org.jeecg.modules.dncFlow.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
import java.util.Map;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import org.jeecg.modules.flowable.domain.vo.FlowTaskVo;
/**
 * <p>流程任务<p>
 *
 */
@Data
@ApiModel("工作流任务相关--请求参数")
public class AssignFlowTaskVo {
    @ApiModelProperty("数据Id")
    private String dataId;
    @ApiModelProperty("任务Id")
    private String taskId;
    @ApiModelProperty("用户Id")
    private String userId;
    @ApiModelProperty("任务意见")
    private String comment;
    @ApiModelProperty("流程实例Id")
    private String instanceId;
    @ApiModelProperty("节点")
    private String targetKey;
    @ApiModelProperty("流程变量信息")
    private Map<String, Object> values;
    @ApiModelProperty("审批人")
    private String assignee;
    @ApiModelProperty("候选人")
    private List<String> candidateUsers;
    @ApiModelProperty("审批组")
    private List<String> candidateGroups;
@ApiModel("指派设备工作流任务相关--请求参数")
public class AssignFlowTaskVo extends FlowTaskVo {
    private String xiugaiId;
lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/vo/DispatchFileFlowTaskVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package org.jeecg.modules.dncFlow.vo;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import org.jeecg.modules.flowable.domain.vo.FlowTaskVo;
@Data
@ApiModel("NC签派工作流任务相关--请求参数")
public class DispatchFileFlowTaskVo extends FlowTaskVo {
    /**校对类型
     * 1:直接定型
     * 2:校对通过
     * 3:校对不通过
     */
    private String proofreadStatus;
    /**
     * æ‰¹å‡†ç±»åž‹
     * true:批准通过
     * false:批准不通过
     */
    private Boolean ratify ;
    /**
     * è¯•切类型
     * true:试切通过
     * false:试切不通过
     */
    private Boolean cut;
    /**
     * å®šåž‹ç±»åž‹
     * true:定型通过
     * false:定型不通过
     */
    private Boolean stereotype;
}
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/dto/FlowMyBusinessDto.java
@@ -128,11 +128,24 @@
    private transient String flowName;
    /**流程开始时间*/
    private transient String startTime;
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private transient Date startTime;
    /**流程结束时间*/
    private transient String endTime;
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private transient Date endTime;
    /**当前用户*/
    private transient String currentUser;
    @ApiModelProperty(value = "前驱节点")
    private transient String preNode;
    /**处理时长(分钟)*/
    @TableField(exist = false)
    @ApiModelProperty(value = "处理时长(分钟)")
    private transient String duration;
}
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/entity/FlowMyBusiness.java
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/mapper/xml/FlowMyBusinessMapper.xml
@@ -3,16 +3,23 @@
<mapper namespace="org.jeecg.modules.flowable.apithird.business.mapper.FlowMyBusinessMapper">
    <select id="PageList" resultType="org.jeecg.modules.flowable.apithird.business.dto.FlowMyBusinessDto">
        SELECT
            flow_my_business.*,
            ACT_HI_PROCINST.START_TIME_ as start_time,
            ACT_HI_PROCINST.END_TIME_ as end_time,
            ACT_RE_PROCDEF.NAME_ as flowName,
            ACT_RE_PROCDEF.CATEGORY_ as category
        flow_my_business.id,
        flow_my_business.title,
        flow_my_business.proposer,
        flow_my_business.task_name,
        flow_my_business.task_id,
        ACT_RU_TASK.ASSIGNEE_ as todoUsers,
        flow_my_business.done_Users,
        ACT_HI_PROCINST.START_TIME_ AS start_time,
        ACT_HI_PROCINST.END_TIME_ AS end_time,
        ACT_RE_PROCDEF.NAME_ AS flowName,
        ACT_RE_PROCDEF.CATEGORY_ AS category
        FROM
            flow_my_business
                LEFT JOIN ACT_HI_PROCINST ON flow_my_business.process_instance_id = ACT_HI_PROCINST.ID_
                LEFT JOIN ACT_RE_PROCDEF ON flow_my_business.process_definition_id = ACT_RE_PROCDEF.ID_
        where
        left join ACT_RU_TASK on flow_my_business.task_id = ACT_RU_TASK.ID_
        WHERE
            1 = 1
        <if test="flowMyBusinessDto.category != null and flowMyBusinessDto.category != ''">
            and ACT_RE_PROCDEF.CATEGORY_ = #{flowMyBusinessDto.category}
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/apithird/business/service/impl/FlowMyBusinessServiceImpl.java
@@ -4,13 +4,21 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.flowable.engine.HistoryService;
import org.flowable.engine.history.HistoricActivityInstance;
import org.jeecg.modules.flowable.apithird.business.dto.FlowMyBusinessDto;
import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
import org.jeecg.modules.flowable.apithird.business.mapper.FlowMyBusinessMapper;
import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService;
import org.jeecg.modules.flowable.domain.dto.FlowTaskDto;
import org.jeecg.modules.flowable.util.TimeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
/**
 * @Description: æµç¨‹ä¸šåŠ¡æ‰©å±•è¡¨
@@ -23,6 +31,34 @@
    @Autowired
    private FlowMyBusinessMapper flowMyBusinessMapper;
    @Autowired
    private HistoryService historyService;
    public HistoricActivityInstance getPreviousNode(String taskId) {
        // èŽ·å–å½“å‰ä»»åŠ¡çš„æ‰§è¡Œå®žä¾‹ ID
        String executionId = historyService.createHistoricTaskInstanceQuery()
                .taskId(taskId)
                .singleResult()
                .getExecutionId();
        // æŸ¥è¯¢åŽ†å²æ´»åŠ¨å®žä¾‹
        List<HistoricActivityInstance> historicActivityInstances = historyService.createHistoricActivityInstanceQuery()
                .executionId(executionId)
                .activityType("userTask")
                .finished()
                .orderByHistoricActivityInstanceEndTime()
                .desc()
                .list();
        // å–第一个结果,即上一级节点
        if (!historicActivityInstances.isEmpty()) {
            return historicActivityInstances.get(0);
        }
        return null;
    }
    @Transactional(isolation = Isolation.READ_COMMITTED)    // é™ä½Žéš”离级别
    public FlowMyBusiness getByDataId(String dataId) {
        LambdaQueryWrapper<FlowMyBusiness> flowMyBusinessLambdaQueryWrapper = new LambdaQueryWrapper<>();
        flowMyBusinessLambdaQueryWrapper.eq(FlowMyBusiness::getDataId,dataId)
@@ -58,6 +94,32 @@
     * @return
     */
    public IPage<FlowMyBusinessDto> getPageList(Page page, FlowMyBusinessDto flowMyBusinessDto){
        return flowMyBusinessMapper.PageList(page,flowMyBusinessDto);
        IPage<FlowMyBusinessDto> flowMyBusinessDtoIPage =flowMyBusinessMapper.PageList(page,flowMyBusinessDto);
        flowMyBusinessDtoIPage.getRecords().forEach(item -> {
            if (!("").equals(item.getTaskId())&&item.getTaskId()!=null){
                HistoricActivityInstance historicActivityInstance = getPreviousNode(item.getTaskId());
                if (historicActivityInstance != null){
                    item.setPreNode(historicActivityInstance.getActivityName());
                }
            }
                if (item.getDoneUsers() == null){
                    item.setDoneUsers("");
                }else {
                    //去除[]
                    item.setDoneUsers(item.getDoneUsers().replaceAll("\\[", "").replaceAll("\\]", ""));
                    item.setDoneUsers(item.getDoneUsers().replaceAll("\"", ""));
                }
                //计算处理时长
                Date kssj=item.getStartTime();
                Date jssj;
                if (item.getEndTime() != null){
                    jssj=item.getEndTime();
                }else {
                    jssj=new Date();
                }
                item.setDuration(TimeUtil.howLong(kssj, jssj,2));
        });
        return flowMyBusinessDtoIPage;
    }
}
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/controller/AssignStreamFlowController.java
ÎļþÃû´Ó lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/controller/AssignFileStreamFlowController.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package org.jeecg.modules.dncFlow.controller;
package org.jeecg.modules.flowable.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -7,22 +7,22 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.engine.*;
import org.flowable.engine.HistoryService;
import org.flowable.engine.ProcessEngine;
import org.flowable.engine.ProcessEngineConfiguration;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.image.ProcessDiagramGenerator;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.dncFlow.entity.WorkTaskData;
import org.jeecg.modules.dncFlow.entity.WorkTaskDataVo;
import org.jeecg.modules.dncFlow.service.IAssignFileStreamService;
import org.jeecg.modules.dncFlow.service.IHisWorkTaskService;
import org.jeecg.modules.dncFlow.service.IWorkTaskService;
import org.jeecg.modules.dncFlow.service.IWorkTaskServiceVo;
import org.jeecg.modules.dncFlow.vo.FlowMy;
import org.jeecg.modules.flowable.apithird.business.dto.FlowMyBusinessDto;
import org.jeecg.modules.flowable.apithird.business.service.impl.FlowMyBusinessServiceImpl;
import org.jeecg.modules.flowable.domain.dto.FlowTaskDto;
import org.jeecg.modules.flowable.domain.vo.FlowMy;
import org.jeecg.modules.flowable.domain.vo.WorkTaskDataVo;
import org.jeecg.modules.flowable.service.IFlowTaskService;
import org.jeecg.modules.flowable.service.IHisWorkTaskService;
import org.jeecg.modules.flowable.service.IWorkTaskServiceVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -38,13 +38,11 @@
import java.util.List;
@RestController
@RequestMapping("/nc/assign/flow")
@RequestMapping("assign/flow")
@Slf4j
public class AssignFileStreamFlowController {
public class AssignStreamFlowController {
    @Autowired
    FlowMyBusinessServiceImpl flowMyBusinessService;
    @Autowired
    IWorkTaskService workTaskService;
    @Autowired
    IFlowTaskService flowTaskService;
    @Autowired
@@ -52,16 +50,13 @@
    @Autowired
    IHisWorkTaskService hisWorkTaskService;
    @Autowired
    private TaskService taskService;
    @Autowired
    private RepositoryService repositoryService;
    @Autowired
    private HistoryService historyService;
    @Autowired
    private ProcessEngine processEngine;
    @Autowired
    private IAssignFileStreamService assignFileStreamService;
    @ApiOperation(value = "获取总台账", response = FlowTaskDto.class)
    @GetMapping(value = "/list")
    public Result<IPage<FlowMyBusinessDto>> queryPageList(FlowMyBusinessDto flowMyBusinessDto,
                                                       @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@@ -69,37 +64,9 @@
                                                       HttpServletRequest req) {
        Page page = new Page(pageNo, pageSize);
        IPage<FlowMyBusinessDto> pageList = flowMyBusinessService.getPageList(page, flowMyBusinessDto);
        pageList.getRecords().forEach(item -> {
            if (item.getTodoUsers() == null){
                item.setTodoUsers("");
            }else{
                //去除[]
                item.setTodoUsers(item.getTodoUsers().replaceAll("\\[", "").replaceAll("\\]", ""));
                item.setTodoUsers(item.getTodoUsers().replaceAll("\"", ""));
            }
            if (item.getDoneUsers() == null){
                item.setDoneUsers("");
            }else {
                //去除[]
                item.setDoneUsers(item.getDoneUsers().replaceAll("\\[", "").replaceAll("\\]", ""));
                item.setDoneUsers(item.getDoneUsers().replaceAll("\"", ""));
            }
        });
        return Result.OK(pageList);
    }
    /*
    * èŽ·å–æ‰€æœ‰ä»»åŠ¡åˆ—è¡¨
    * */
    @GetMapping(value = "/workTasklist")
    public Result<IPage<WorkTaskData>> queryTaskPageList(WorkTaskData workTaskData,
                                                         @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
                                                         @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
                                                         HttpServletRequest req) {
        List<WorkTaskData> list = workTaskService.queryAllworkTask();
        IPage<WorkTaskData> pageList = new Page<>(pageNo, pageSize, list.size());
        pageList.setRecords(list);
        return Result.OK(pageList);
    }
    @ApiOperation(value = "获取待办列表", response = FlowTaskDto.class)
    @GetMapping(value = "/todoList")
    public Result todoList(@ApiParam(value = "当前页码", required = true) @RequestParam (name="pageNum", defaultValue="1") Integer pageNum,
@@ -127,8 +94,8 @@
    @ApiOperation(value = "获取工作流历史任务", response = FlowTaskDto.class)
    @GetMapping(value = "/queryHisTaskList")
    public Result<?> queryHisTaskList(@RequestParam(name = "drapprovedataId") String drapprovedataId) {
        return Result.OK(hisWorkTaskService.queryHisTaskList(drapprovedataId));
    public Result<?> queryHisTaskList(@RequestParam(name = "procInstId") String procInstId) {
        return Result.OK(hisWorkTaskService.queryHisTaskByProcInstId(procInstId));
    }
    @ApiOperation(value = "审批任务-查看流程图")
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/FlowHistoricalVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package org.jeecg.modules.flowable.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
 * å·¥ä½œæµåŽ†å²è®°å½•ï¼ˆé€šç”¨ï¼‰
 *
 */
@Data
@ApiModel("工作流--工作流历史记录(通用)")
public class FlowHistoricalVo {
    /**
     * æµç¨‹å®žä¾‹ID
     */
    private String procInstId;
    /**
     * ä¸šåС键
     */
    private String businessKey;
    /**
     * æµç¨‹å¼€å§‹æ—¶é—´
     */
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date startTime;
    /**
     * æµç¨‹ç»“束时间
     */
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date endTime;
    /**
     * èŠ‚ç‚¹åç§°
     */
    private String actName;
    /**
     * èŠ‚ç‚¹ç±»åž‹
     */
    private String actType;
    /**
     * èŠ‚ç‚¹å¼€å§‹æ—¶é—´
     */
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date actStartTime;
    /**
     * èŠ‚ç‚¹ç»“æŸæ—¶é—´
     */
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date actEndTime;
    /**
     * ä»»åŠ¡åç§°
     */
    private String taskName;
    /**
     * å¤„理人
     */
    private String assignee;
    /**
     * ä»»åŠ¡è€—æ—¶
     */
    private String duration;
    /**
     * ä»»åŠ¡æè¿°
     */
    private String description;
}
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/FlowMy.java
ÎļþÃû´Ó lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/vo/FlowMy.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package org.jeecg.modules.dncFlow.vo;
package org.jeecg.modules.flowable.domain.vo;
import io.swagger.annotations.ApiModel;
import lombok.Data;
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/FlowTaskVo.java
@@ -44,7 +44,4 @@
    @ApiModelProperty("审批组")
    private List<String> candidateGroups;
    private String xiugaiId;
    private Integer status;
}
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/HisWorkTask.java
ÎļþÃû´Ó lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/entity/HisWorkTask.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package org.jeecg.modules.dncFlow.entity;
package org.jeecg.modules.flowable.domain.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/WorkTaskData.java
ÎļþÃû´Ó lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/entity/WorkTaskData.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package org.jeecg.modules.dncFlow.entity;
package org.jeecg.modules.flowable.domain.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/domain/vo/WorkTaskDataVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
package org.jeecg.modules.flowable.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.jeecg.common.aspect.annotation.Dict;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
import java.util.Map;
/**
 * @Description:工作流任务数据
 */
@Data
@ApiModel(value="act_ru_task", description="我的待办")
public class WorkTaskDataVo implements Serializable {
    /**主键*/
//    @TableField("id_")
    private String id;
    /**版本号,用于乐观锁控制并发更新*/
//    @TableField("rev_")
    private int rev;
    /**执行实例ID,与执行实例表中的ID字段关联*/
//    @TableField("execution_id_")
    private String executionId;
    /**流程实例ID,与流程实例表中的ID字段关联*/
//    @TableField("proc_inst_id_")
    private String procInstId;
    /**流程定义ID,与流程定义表中的ID字段关联*/
//    @TableField("proc_def_id_")
    private String procDefId;
    /**任务名称*/
//    @TableField("name_")
    private String name;
    /**任务定义Key,与流程定义表中的KEY字段关联*/
//    @TableField("task_def_key_")
    private String taskDefKey;
    /**任务的办理人,即实际执行任务的用户*/
//    @TableField("assignee_")
    @Dict(dictTable = "sys_user", dicCode = "username", dicText = "realname")
    private String assignee;
    /**任务的优先级*/
//    @TableField("priority_")
    private int priority;
    /**    ä»»åŠ¡åˆ›å»ºæ—¶é—´*/
//    @TableField("create_time_")
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    /**        ä»»åŠ¡çš„æš‚åœçŠ¶æ€ï¼Œç”¨äºŽæŽ§åˆ¶ä»»åŠ¡çš„æš‚åœå’Œæ¢å¤*/
//    @TableField("suspension_state_")
    private int suspensionState;
    /**    æµç¨‹å˜é‡*/
    private Map<String,Object> variables;
//    @TableField("act_status")
    @ApiModelProperty(value = "流程状态说明,有:启动  æ’¤å›ž  é©³å›ž  å®¡æ‰¹ä¸­  å®¡æ‰¹é€šè¿‡  å®¡æ‰¹å¼‚常")
    private String actStatus;
//    @TableField("title")
    @ApiModelProperty(value = "流程业务简要描述")
    private String title;
//    @TableField("data_id")
    @ApiModelProperty(value = "业务表id,理论唯一")
    private String dataId;
    @ApiModelProperty(value = "前驱节点")
    private String preNode;
    @ApiModelProperty(value = "流程名称")
    private transient String flowName;
    @ApiModelProperty(value = "流程类型")
    @Dict(dicCode = "flow_type")
    private transient String category;
    /**流程定义key ä¸€ä¸ªkey会有多个版本的id*/
    @Excel(name = "流程定义key ä¸€ä¸ªkey会有多个版本的id", width = 15)
    @ApiModelProperty(value = "流程定义key ä¸€ä¸ªkey会有多个版本的id")
    private String processDefinitionKey;
    /**流程定义id ä¸€ä¸ªæµç¨‹å®šä¹‰å”¯ä¸€*/
    @Excel(name = "流程定义id ä¸€ä¸ªæµç¨‹å®šä¹‰å”¯ä¸€", width = 15)
    @ApiModelProperty(value = "流程定义id ä¸€ä¸ªæµç¨‹å®šä¹‰å”¯ä¸€")
    private String processDefinitionId;
    /**流程业务实例id ä¸€ä¸ªæµç¨‹ä¸šåŠ¡å”¯ä¸€ï¼Œæœ¬è¡¨ä¸­ä¹Ÿå”¯ä¸€*/
    @Excel(name = "流程业务实例id ä¸€ä¸ªæµç¨‹ä¸šåŠ¡å”¯ä¸€ï¼Œæœ¬è¡¨ä¸­ä¹Ÿå”¯ä¸€", width = 15)
    @ApiModelProperty(value = "流程业务实例id ä¸€ä¸ªæµç¨‹ä¸šåŠ¡å”¯ä¸€ï¼Œæœ¬è¡¨ä¸­ä¹Ÿå”¯ä¸€")
    private String processInstanceId;
}
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/IHisWorkTaskMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package org.jeecg.modules.flowable.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.flowable.domain.vo.FlowHistoricalVo;
import org.jeecg.modules.flowable.domain.vo.HisWorkTask;
import java.util.List;
public interface IHisWorkTaskMapper extends BaseMapper<HisWorkTask> {
    List<HisWorkTask> queryHisTaskList(@Param("drapprovedataId") String drapprovedataId);
    /**
     * é€šè¿‡æµç¨‹å®žä¾‹id查询历史任务、
     * @param procInstId
     * @return
     */
    List<FlowHistoricalVo> queryHisTaskByProcInstId(@Param("procInstId") String procInstId);
}
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/IWorkTaskMapper.java
ÎļþÃû´Ó lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/mapper/IWorkTaskMapper.java ÐÞ¸Ä
@@ -1,7 +1,7 @@
package org.jeecg.modules.dncFlow.mapper;
package org.jeecg.modules.flowable.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.jeecg.modules.dncFlow.entity.WorkTaskData;
import org.jeecg.modules.flowable.domain.vo.WorkTaskData;
import java.util.List;
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/IWorkTaskVoMapper.java
ÎļþÃû´Ó lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/mapper/IWorkTaskVoMapper.java ÐÞ¸Ä
@@ -1,15 +1,14 @@
package org.jeecg.modules.dncFlow.mapper;
package org.jeecg.modules.flowable.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.dncFlow.entity.WorkTaskDataVo;
import org.jeecg.modules.dncFlow.vo.FlowMy;
import java.util.List;
import org.jeecg.modules.flowable.domain.vo.FlowMy;
import org.jeecg.modules.flowable.domain.vo.WorkTaskDataVo;
public interface IWorkTaskVoMapper extends BaseMapper<WorkTaskDataVo> {
    IPage<WorkTaskDataVo> taskBySelf(@Param("flowMy") FlowMy flowMy, @Param("page") Page page);
    List<WorkTaskDataVo> allList(@Param("userId") String userId);
}
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/HisWorkTaskMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.flowable.mapper.IHisWorkTaskMapper">
    <select id="queryHisTaskList" resultType="org.jeecg.modules.flowable.domain.vo.HisWorkTask">
        SELECT
            fb.id AS id,
            aht.NAME_ AS name,
            aht.DESCRIPTION_ AS cause,
            su.realname AS assignee,
            aht.START_TIME_ AS startTime,
            aht.END_TIME_ AS endTime,
            assign.status as status
        FROM
            flow_my_business fb,
            act_hi_taskinst aht,
            NC_ASSIGN_FILE_STREAM assign,
            sys_user su
        WHERE
            fb.data_id= #{drapprovedataId}
          AND fb.process_instance_id= aht.PROC_INST_ID_
          AND su.username= aht.ASSIGNEE_
          AND fb.data_id= assign.STREAM_ID
        ORDER BY
            aht.START_TIME_ ASC
    </select>
    <select id="queryHisTaskByProcInstId" resultType="org.jeecg.modules.flowable.domain.vo.FlowHistoricalVo">
        SELECT
            p.PROC_INST_ID_ AS procInstId,
            p.BUSINESS_KEY_ AS businessKey,
            p.START_TIME_ AS startTime,
            p.END_TIME_ AS endTime,
            a.ACT_NAME_ AS actName,
            a.ACT_TYPE_ AS actType,
            a.START_TIME_ AS actStartTime,
            a.END_TIME_ AS actEndTime,
            c.NAME_ AS taskName,
            c.ASSIGNEE_ AS assignee,
            CASE
                WHEN c.DURATION_ IS NOT NULL THEN
                    CASE
                        WHEN FLOOR(c.DURATION_ / 1000.0) = 0 THEN NULL
                        ELSE FLOOR(c.DURATION_ / 1000.0)
                        END
                ELSE NULL
                END AS duration,
            c.DESCRIPTION_ AS description
        FROM
            act_hi_procinst p
                LEFT JOIN act_hi_actinst a ON p.PROC_INST_ID_ = a.PROC_INST_ID_
                LEFT JOIN ACT_HI_TASKINST c ON a.TASK_ID_ = c.ID_
        WHERE
            p.PROC_INST_ID_ = #{procInstId}
          AND a.ACT_NAME_ IS NOT NULL
        ORDER BY
            COALESCE(a.END_TIME_, '9999-12-31') ASC;
    </select>
</mapper>
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/WorkTaskMapper.xml
ÎļþÃû´Ó lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/mapper/xml/WorkTaskMapper.xml ÐÞ¸Ä
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.dncFlow.mapper.IWorkTaskMapper">
    <select id="queryAllworkTask" resultType="org.jeecg.modules.dncFlow.entity.WorkTaskData">
<mapper namespace="org.jeecg.modules.flowable.mapper.IWorkTaskMapper">
    <select id="queryAllworkTask" resultType="org.jeecg.modules.flowable.domain.vo.WorkTaskData">
        select id_,rev_,execution_id_,proc_inst_id_,proc_def_id_,name_,task_def_key_,assignee_,priority_,create_time_,suspension_state_,task_def_id_,scope_id_,sub_scope_id_,scope_type_,scope_definition_id_,propagated_stage_inst_id_,parent_task_id_,description_,owner_,delegation_,due_date_,category_,form_key_,claim_time_,is_count_enabled_,var_count_,id_link_count_,sub_task_count_
        from act_ru_task ORDER BY create_time_ DESC
    </select>
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/mapper/xml/WorkTaskVoMapper.xml
ÎļþÃû´Ó lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/mapper/xml/WorkTaskVoMapper.xml ÐÞ¸Ä
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.dncFlow.mapper.IWorkTaskVoMapper">
    <select id="taskBySelf" resultType="org.jeecg.modules.dncFlow.entity.WorkTaskDataVo">
<mapper namespace="org.jeecg.modules.flowable.mapper.IWorkTaskVoMapper">
    <select id="taskBySelf" resultType="org.jeecg.modules.flowable.domain.vo.WorkTaskDataVo">
        SELECT
            atask.id_ AS id,
            atask.rev_ AS rev,
@@ -10,7 +10,6 @@
            atask.proc_def_id_ AS procDefId,
            atask.name_ AS name,
            atask.task_def_key_ as taskDefKey,
            su.realname as assignee,
            atask.priority_ AS priority,
            atask.create_time_ AS createTime,
            atask.suspension_state_ AS suspensionState,
@@ -23,15 +22,11 @@
            pro.name_ as flowName,
            pro.CATEGORY_ as category
        FROM
            act_ru_task AS atask,
            flow_my_business AS fmb,
            ACT_RE_PROCDEF AS pro,
            sys_user AS su
            act_ru_task AS atask
            LEFT JOIN flow_my_business fmb on atask.id_ = fmb.task_id
            LEFT JOIN ACT_RE_PROCDEF pro on atask.PROC_DEF_ID_ = pro.id_
        WHERE
            atask.assignee_ = #{flowMy.username}
          AND atask.id_ = fmb.task_id
          AND atask.PROC_DEF_ID_ = pro.id_
          AND atask.assignee_ = su.username
          <if test="flowMy.flowName!= null and flowMy.flowName!= ''">
              AND pro.name_ LIKE CONCAT('%',#{flowMy.flowName},'%')
          </if>
@@ -49,8 +44,5 @@
          </if>
        ORDER BY
            create_time_ DESC
    </select>
    <select id="allList" parameterType="String" resultType="org.jeecg.modules.dncFlow.entity.WorkTaskDataVo">
        select * from act_ru_task
    </select>
</mapper>
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/IHisWorkTaskService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package org.jeecg.modules.flowable.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.flowable.domain.vo.FlowHistoricalVo;
import org.jeecg.modules.flowable.domain.vo.HisWorkTask;
import java.util.List;
public interface IHisWorkTaskService extends IService<HisWorkTask> {
    List<HisWorkTask> queryHisTaskList(String drapprovedataId);
    /**
     * é€šè¿‡æµç¨‹å®žä¾‹id查询历史任务、
     * @param procInstId
     * @return
     */
    List<FlowHistoricalVo> queryHisTaskByProcInstId(@Param("procInstId") String procInstId);
}
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/IWorkTaskService.java
ÎļþÃû´Ó lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IWorkTaskService.java ÐÞ¸Ä
@@ -1,7 +1,7 @@
package org.jeecg.modules.dncFlow.service;
package org.jeecg.modules.flowable.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.dncFlow.entity.WorkTaskData;
import org.jeecg.modules.flowable.domain.vo.WorkTaskData;
import java.util.List;
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/IWorkTaskServiceVo.java
ÎļþÃû´Ó lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/IWorkTaskServiceVo.java ÐÞ¸Ä
@@ -1,10 +1,10 @@
package org.jeecg.modules.dncFlow.service;
package org.jeecg.modules.flowable.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.dncFlow.entity.WorkTaskDataVo;
import org.jeecg.modules.dncFlow.vo.FlowMy;
import org.jeecg.modules.flowable.domain.vo.FlowMy;
import org.jeecg.modules.flowable.domain.vo.WorkTaskDataVo;
public interface IWorkTaskServiceVo extends IService<WorkTaskDataVo> {
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowDefinitionServiceImpl.java
@@ -24,7 +24,6 @@
import org.jeecg.modules.flowable.apithird.business.service.impl.FlowMyBusinessServiceImpl;
import org.jeecg.modules.flowable.apithird.common.constant.ProcessConstants;
import org.jeecg.modules.flowable.apithird.common.enums.FlowComment;
import org.jeecg.modules.flowable.apithird.entity.ActStatus;
import org.jeecg.modules.flowable.apithird.entity.SysUser;
import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI;
import org.jeecg.modules.flowable.apithird.service.IFlowThirdService;
@@ -237,6 +236,7 @@
     * @return
     */
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public Result<?> startProcessInstanceByKey(String procDefKey, Map<String, Object> variables) {
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                .processDefinitionKey(procDefKey)
@@ -269,15 +269,10 @@
            ProcessInstance processInstance = runtimeService.startProcessInstanceById(procDefId, variables);
            // ç»™ç¬¬ä¸€æ­¥ç”³è¯·äººèŠ‚ç‚¹è®¾ç½®ä»»åŠ¡æ‰§è¡Œäººå’Œæ„è§
            Task task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).active().singleResult();
            if (!sysUser.getUsername().equals(task.getAssignee())){
                return Result.error("当前用户不是流程发起人");
            }
            if (Objects.nonNull(task)) {
                taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.NORMAL.getType(), sysUser.getRealname() + "发起流程申请");
                taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.NORMAL.getType(), variables.get("organization").toString());
                taskService.setAssignee(task.getId(), sysUser.getUsername());
                task.setDescription(variables.get("organization").toString());
                // æ›´æ–°ä»»åŠ¡
                taskService.saveTask(task);
                //taskService.complete(task.getId(), variables);
            }
            //设置所有申请人
@@ -334,7 +329,7 @@
            business.setProcessDefinitionId(procDefId)
                    .setProcessInstanceId(processInstance.getProcessInstanceId())
                    .setActStatus(ActStatus.start)
////                    .setActStatus(ActStatus.start)
                    .setProposer(sysUser.getUsername())
                    .setTaskId(task2.getId())
                    .setTaskName(nextTask.getName())
@@ -347,7 +342,7 @@
        //    **没有下一个节点,流程已经结束了
            business.setProcessDefinitionId(procDefId)
                    .setProcessInstanceId(processInstance.getProcessInstanceId())
                    .setActStatus(ActStatus.pass)
//                    .setActStatus(ActStatus.pass)
                    .setProposer(sysUser.getUsername())
                    .setDoneUsers(doneUserList.toJSONString())
            ;
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowInstanceServiceImpl.java
@@ -1,6 +1,5 @@
package org.jeecg.modules.flowable.service.impl;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
@@ -17,11 +16,10 @@
import org.jeecg.common.util.SpringContextUtils;
import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
import org.jeecg.modules.flowable.apithird.business.service.impl.FlowMyBusinessServiceImpl;
import org.jeecg.modules.flowable.apithird.entity.ActStatus;
import org.jeecg.modules.flowable.apithird.common.exception.CustomException;
import org.jeecg.modules.flowable.apithird.entity.SysUser;
import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI;
import org.jeecg.modules.flowable.apithird.service.IFlowThirdService;
import org.jeecg.modules.flowable.apithird.common.exception.CustomException;
import org.jeecg.modules.flowable.domain.vo.FlowTaskVo;
import org.jeecg.modules.flowable.factory.FlowServiceFactory;
import org.jeecg.modules.flowable.service.IFlowInstanceService;
@@ -122,7 +120,7 @@
            doneUserList.add(sysUser.getUsername());
        }
            business
                    .setActStatus(ActStatus.recall)
//                    .setActStatus(ActStatus.recall)
                    .setTaskId("")
                    .setTaskName("已撤回")
                    .setPriority("")
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/FlowTaskServiceImpl.java
@@ -42,7 +42,6 @@
import org.jeecg.modules.flowable.apithird.common.constant.ProcessConstants;
import org.jeecg.modules.flowable.apithird.common.enums.FlowComment;
import org.jeecg.modules.flowable.apithird.common.exception.CustomException;
import org.jeecg.modules.flowable.apithird.entity.ActStatus;
import org.jeecg.modules.flowable.apithird.entity.SysUser;
import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI;
import org.jeecg.modules.flowable.apithird.service.IFlowThirdService;
@@ -96,6 +95,10 @@
            taskService.saveTask(task);
        }
        SysUser loginUser = iFlowThirdService.getLoginUser();
        //判断用户是否有权限
        if (!task.getAssignee().equals(loginUser.getUsername())){
            return Result.error("当前用户无权限");
        }
        if (DelegationState.PENDING.equals(task.getDelegationState())) {
            taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.DELEGATE.getType(), taskVo.getComment());
            //taskService.resolveTask(taskVo.getTaskId(), taskVo.getValues());
@@ -103,7 +106,6 @@
            System.out.println("taskVo.getTaskId()--->taskVo.getInstanceId()--->FlowComment.NORMAL.getType()--->taskVo.getComment()"+taskVo.getTaskId() + "---" + taskVo.getInstanceId() + "---" + FlowComment.NORMAL.getType() + "---"+taskVo.getComment() );
            taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.NORMAL.getType(), taskVo.getComment());
            taskService.setAssignee(taskVo.getTaskId(), loginUser.getUsername());
            //taskService.complete(taskVo.getTaskId(), taskVo.getValues());
        }
        /*======================审批结束  å›žè°ƒä»¥åŠå…³é”®æ•°æ®ä¿å­˜======================*/
        //业务数据id
@@ -157,8 +159,8 @@
        if (task2!=null && task.getTaskDefinitionKey().equals(task2.getTaskDefinitionKey())){
        //    * å½“前节点是会签节点,没有走完
            business.setActStatus(ActStatus.doing)
                    .setTaskId(task2.getId())
            business.setTaskId(task2.getId())
//                    .setActStatus(ActStatus.doing)
                    .setDoneUsers(doneUserList.toJSONString())
            ;
            String todoUsersStr = business.getTodoUsers();
@@ -202,8 +204,9 @@
                    //    å‰ç«¯ä¼ å…¥å€™é€‰äºº
                    collect_username = candidateUsers;
                }
                business.setActStatus(ActStatus.doing)
                business
                        .setTaskId(task2.getId())
//                        .setActStatus(ActStatus.doing)
                        .setTaskNameId(nextTask.getId())
                        .setTaskName(nextTask.getName())
                        .setPriority(nextTask.getPriority())
@@ -234,7 +237,7 @@
            } else {
                //    **没有下一个节点,流程已经结束了
                business.setActStatus(ActStatus.pass)
                business
                        .setDoneUsers(doneUserList.toJSONString())
                        .setTodoUsers("")
                        .setTaskId("")
@@ -250,11 +253,13 @@
        if (flowCallBackService!=null)flowCallBackService.afterFlowHandle(business);
        return Result.OK();
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result completeByDateId(FlowTaskVo flowTaskVo){
        return this.complete(flowTaskVo);
    }
    @Override
    public void taskRejectByDataId(FlowTaskVo flowTaskVo){
        FlowMyBusiness business = flowMyBusinessService.getByDataId(flowTaskVo.getDataId());
@@ -409,8 +414,9 @@
            if (!doneUserList.contains(loginUser.getUsername())){
                doneUserList.add(loginUser.getUsername());
            }
            business.setActStatus(ActStatus.reject)
            business
                    .setTaskId(task2.getId())
//                    .setActStatus(ActStatus.reject)
                    .setTaskNameId(task2.getTaskDefinitionKey())
                    .setTaskName(task2.getName())
                    .setDoneUsers(doneUserList.toJSONString())
@@ -588,8 +594,9 @@
                //**跳转到目标节点
            List<Task> task2List = taskService.createTaskQuery().processInstanceId(business.getProcessInstanceId()).active().list();
            Task targetTask = task2List.get(0);
                business.setActStatus(ActStatus.reject)
                business
                        .setTaskId(targetTask.getId())
//                        .setActStatus(ActStatus.reject)
                        .setTaskNameId(targetTask.getTaskDefinitionKey())
                        .setTaskName(targetTask.getName())
                        .setPriority(targetTask.getPriority()+"")
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/HisWorkTaskServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package org.jeecg.modules.flowable.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.flowable.domain.vo.FlowHistoricalVo;
import org.jeecg.modules.flowable.domain.vo.HisWorkTask;
import org.jeecg.modules.flowable.mapper.IHisWorkTaskMapper;
import org.jeecg.modules.flowable.service.IHisWorkTaskService;
import org.jeecg.modules.flowable.util.TimeUtil;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class HisWorkTaskServiceImpl extends ServiceImpl<IHisWorkTaskMapper,HisWorkTask> implements IHisWorkTaskService {
    @Override
    public List<HisWorkTask> queryHisTaskList(String drapprovedataId) {
        return baseMapper.queryHisTaskList(drapprovedataId);
    }
    /**
     * é€šè¿‡æµç¨‹å®žä¾‹id查询历史任务、
     * @param procInstId
     * @return
     */
    @Override
    public List<FlowHistoricalVo> queryHisTaskByProcInstId(@Param("procInstId") String procInstId){
        List<FlowHistoricalVo> flowHistoricalVoList=baseMapper.queryHisTaskByProcInstId(procInstId);
        flowHistoricalVoList.forEach(flowHistoricalVo->{
            //计算时间
            if (StrUtil.isNotEmpty(flowHistoricalVo.getDuration())){
                flowHistoricalVo.setDuration(TimeUtil.howLongByMillis(Long.parseLong(flowHistoricalVo.getDuration()),2));
            }
        });
        return flowHistoricalVoList;
    }
}
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/WorkTaskServiceImpl.java
ÎļþÃû´Ó lxzn-module-dnc/src/main/java/org/jeecg/modules/dncFlow/service/impl/WorkTaskServiceImpl.java ÐÞ¸Ä
@@ -1,9 +1,9 @@
package org.jeecg.modules.dncFlow.service.impl;
package org.jeecg.modules.flowable.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.modules.dncFlow.entity.WorkTaskData;
import org.jeecg.modules.dncFlow.mapper.IWorkTaskMapper;
import org.jeecg.modules.dncFlow.service.IWorkTaskService;
import org.jeecg.modules.flowable.domain.vo.WorkTaskData;
import org.jeecg.modules.flowable.mapper.IWorkTaskMapper;
import org.jeecg.modules.flowable.service.IWorkTaskService;
import org.springframework.stereotype.Service;
import java.util.List;
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/service/impl/WorkTaskServiceImplVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package org.jeecg.modules.flowable.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.flowable.engine.history.HistoricActivityInstance;
import org.jeecg.modules.flowable.apithird.business.service.impl.FlowMyBusinessServiceImpl;
import org.jeecg.modules.flowable.domain.vo.FlowMy;
import org.jeecg.modules.flowable.domain.vo.WorkTaskDataVo;
import org.jeecg.modules.flowable.mapper.IWorkTaskVoMapper;
import org.jeecg.modules.flowable.service.IWorkTaskServiceVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class WorkTaskServiceImplVo extends ServiceImpl<IWorkTaskVoMapper, WorkTaskDataVo> implements IWorkTaskServiceVo {
    @Autowired
    FlowMyBusinessServiceImpl flowMyBusinessService;
    @Override
    public IPage<WorkTaskDataVo> toTaskBySelf(FlowMy flowMy, Page page) {
        IPage<WorkTaskDataVo> workTaskDataVoIPage=baseMapper.taskBySelf(flowMy,page);
        workTaskDataVoIPage.getRecords().forEach(workTaskDataVo -> {
            HistoricActivityInstance historicActivityInstance=flowMyBusinessService.getPreviousNode(workTaskDataVo.getId());
            if (historicActivityInstance != null){
                workTaskDataVo.setPreNode(historicActivityInstance.getActivityName());
                workTaskDataVo.setAssignee(historicActivityInstance.getAssignee());
            }
        });
        return workTaskDataVoIPage;
    }
}
lxzn-module-flowable/src/main/java/org/jeecg/modules/flowable/util/TimeUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
package org.jeecg.modules.flowable.util;
import java.util.Date;
/**
 * æè¿°ï¼šæ—¶é—´å·¥å…·ç±»
 *
 * @Date 2023/10/11
 */
public class TimeUtil {
    /**一天*/
    public static final long day    = 1000 * 60 * 60 * 24;
    /**一小时*/
    public static final long hour   = 1000 * 60 * 60;
    /**一分钟*/
    public static final long minute = 1000 * 60;
    /**一秒*/
    public static final long second = 1000;
    /**
     * è®¡ç®—两个时间差,以时分秒的方式展现。
     * @param start
     * @param end
     * @param type 1保留毫秒 2保留秒 3保留分钟 4保留小时 5保留天
     * @return
     */
    public static String howLong(Date start, Date end, int type){
        if(start == null || end == null)
            return "";
        return howLong(start.getTime(), end.getTime(), type);
    }
    /**
     * è®¡ç®—两个时间差,以时分秒的方式展现。
     * @param start
     * @param end
     * @return
     */
    public static String howLong(Date start, Date end){
        if(start == null || end == null)
            return "";
        return howLong(start.getTime(), end.getTime(), 1);
    }
    /**
     * è®¡ç®—给定时间距离现在的时间差,以时分秒的方式展现。
     * @param startTime
     * @return
     */
    public static String howLong(long startTime){
        return howLong(startTime, System.currentTimeMillis(),1);
    }
    /**
     * è®¡ç®—耗时时长
     * @param startTime èµ·ç‚¹æ—¶é—´ï¼Œæ¯«ç§’æ•°
     * @return
     */
    public static String howLong(long startTime, long endTime ,int type) {
        long millis = endTime - startTime;
        return howLongByMillis(millis, type);
    }
    /**
     * è®¡ç®—耗时时长
     * @param millis
     * @param type
     * @return
     */
    public static String howLongByMillis(long millis, int type) {
        if(millis <= 0) return "小于1秒";
        if(type > 5) return "格式错误";
        StringBuilder sb = new StringBuilder();
        //天
        if(millis >= day && type <=5){
            long days = millis / day;
            sb.append(days).append("天");
            millis -= days * day;
        }
        // å°æ—¶è®¡
        if(millis >= hour && type <=4){
            long hours = millis / hour;
            sb.append(hours).append("小时");
            millis -= hours * hour;
        }
        if(millis >= minute && type <=3){
            long minutes = millis / minute;
            sb.append(minutes).append("分钟");
            millis -= minutes * minute;
        }
        if(millis >= second && type <=2){
            long seconds = millis / second;
            sb.append(seconds).append("秒");
            millis -= seconds * second;
        }
        if(millis > 0 && type <=1){
            sb.append(millis).append("毫秒");
        }
        return sb.toString();
    }
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java
@@ -169,6 +169,68 @@
        return result;
    }
    /**
     * èŽ·å–ç”¨æˆ·åˆ—è¡¨æ•°æ®
     * @param user
     * @param req
     * @return
     */
    @RequestMapping(value = "/listAll", method = RequestMethod.GET)
    public Result<List<SysUser>> listAll(SysUser user,HttpServletRequest req) {
        Result<List<SysUser>> result = new Result<List<SysUser>>();
        QueryWrapper<SysUser> queryWrapper = QueryGenerator.initQueryWrapper(user, req.getParameterMap());
        //update-begin-Author:wangshuai--Date:20211119--for:【vue3】通过部门id查询用户,通过code查询id
        //部门ID
        String departId = req.getParameter("departId");
        if(oConvertUtils.isNotEmpty(departId)){
            LambdaQueryWrapper<SysUserDepart> query = new LambdaQueryWrapper<>();
            query.eq(SysUserDepart::getDepId,departId);
            List<SysUserDepart> list = sysUserDepartService.list(query);
            List<String> userIds = list.stream().map(SysUserDepart::getUserId).collect(Collectors.toList());
            //update-begin---author:wangshuai ---date:20220322  for:[issues/I4XTYB]查询用户时,当部门id ä¸‹æ²¡æœ‰åˆ†é…ç”¨æˆ·æ—¶æŽ¥å£æŠ¥é”™------------
            if(oConvertUtils.listIsNotEmpty(userIds)){
                queryWrapper.in("id",userIds);
            }else{
                return Result.OK();
            }
            //update-end---author:wangshuai ---date:20220322  for:[issues/I4XTYB]查询用户时,当部门id ä¸‹æ²¡æœ‰åˆ†é…ç”¨æˆ·æ—¶æŽ¥å£æŠ¥é”™------------
        }
        //用户ID
        String code = req.getParameter("code");
        if(oConvertUtils.isNotEmpty(code)){
            queryWrapper.in("id",Arrays.asList(code.split(",")));
        }
        //update-end-Author:wangshuai--Date:20211119--for:【vue3】通过部门id查询用户,通过code查询id
        //update-begin-author:taoyan--date:20220104--for: JTC-372 ã€ç”¨æˆ·å†»ç»“问题】 online授权、用户组件,选择用户都能看到被冻结的用户
        String status = req.getParameter("status");
        if(oConvertUtils.isNotEmpty(status)){
            queryWrapper.eq("status", Integer.parseInt(status));
        }
        //update-end-author:taoyan--date:20220104--for: JTC-372 ã€ç”¨æˆ·å†»ç»“问题】 online授权、用户组件,选择用户都能看到被冻结的用户
        //TODO å¤–部模拟登陆临时账号,列表不显示
        queryWrapper.ne("username","_reserve_user_external");
        List<SysUser> list = sysUserService.list(queryWrapper);
        //批量查询用户的所属部门
        //step.1 å…ˆæ‹¿åˆ°å…¨éƒ¨çš„ useids
        //step.2 é€šè¿‡ useids,一次性查询用户的所属部门名字
        List<String> userIds = list.stream().map(SysUser::getId).collect(Collectors.toList());
        Map<String, String> useProNames = sysUserService.getProNamesByUserIds(userIds);
        if(userIds!=null && userIds.size()>0){
            Map<String,String>  useDepNames = sysUserService.getDepNamesByUserIds(userIds);
            list.forEach(item->{
                item.setOrgCodeTxt(useDepNames.get(item.getId()));
                item.setProductionName(useProNames.get(item.getId()));
            });
        }
        result.setSuccess(true);
        result.setResult(list);
        log.info(list.toString());
        return result;
    }
    //@RequiresRoles({"admin"})
    //Permissions("system:user:add")
    @RequestMapping(value = "/add", method = RequestMethod.POST)
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java
@@ -1,10 +1,12 @@
package org.jeecg.modules.system.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.entity.SysUserRole;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
/**
 * <p>
@@ -32,4 +34,11 @@
    @Select("select id from sys_role where id in (select role_id from sys_user_role where user_id = (select id from sys_user where username=#{username}))")
    List<String> getRoleIdByUserName(@Param("username") String username);
    /**
     * æ ¹æ®è§’色查询用户
     * @param roleList role_code集合
     * */
    List<SysUser> getUsersByRoles(@Param("roleList") List<String> roleList);
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserRoleMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.system.mapper.SysUserRoleMapper">
    <select id="getUsersByRoles" resultType="org.jeecg.modules.system.entity.SysUser">
        select t.* from sys_user t where t.del_flag = 0
        and t.id in (
        select t1.user_id from sys_user_role t1
        left join sys_role t2 on t1.role_id = t2.id
        <if test="roleList!=null  and roleList.size()>0">
            and t2.role_code in
            <foreach collection="roleList" index="index" item="roleCode" open="(" separator="," close=")">
                #{roleCode}
            </foreach>
        </if>
        where t2.id is not null
        )
    </select>
</mapper>
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserRoleService.java
@@ -1,10 +1,10 @@
package org.jeecg.modules.system.service;
import java.util.Map;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.entity.SysUserRole;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
 * <p>
@@ -15,4 +15,11 @@
 * @since 2018-12-21
 */
public interface ISysUserRoleService extends IService<SysUserRole> {
    /**
     * æ ¹æ®è§’色查询用户
     * @param roleList è§’色编码集合
     * */
    List<SysUser> queryUsersByRoles(List<String> roleList);
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/MdcProductionServiceImpl.java
@@ -9,9 +9,11 @@
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.constant.FillRuleConstant;
import org.jeecg.common.system.vo.DictModel;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.FillRuleUtil;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.system.entity.*;
@@ -79,12 +81,25 @@
    @Override
    public List<MdcProductionTreeModel> queryTreeListByConfig(){
        SysParams sysParams = sysParamsService.getSysPramBySettingKey("dnc_production");
        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        LambdaQueryWrapper<MdcProduction> query = new LambdaQueryWrapper<MdcProduction>();
        if (sysParams == null) {
            return null;
        }else {
            List<String> productionIds = new ArrayList<>();
            if (!("admin").equals(loginUser.getUsername())) {
                //不是超级管理员,获取用户拥有的产线
                if (loginUser.getProductionIds() != null) {
                    if (loginUser.getProductionIds().contains(",")) {
                        productionIds = Arrays.asList(loginUser.getProductionIds().split(","));
                    } else {
                        productionIds = Collections.singletonList(loginUser.getProductionIds());
                    }
                }
            }
            if (("0").equals(sysParams.getSettingValue())){
                query.eq(MdcProduction::getOrgType,"2");
                query.in(!productionIds.isEmpty(), MdcProduction::getId, productionIds);
                query.eq(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_0.toString());
                query.orderByAsc(MdcProduction::getProductionOrder);
                List<MdcProduction> list = this.list(query);
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserRoleServiceImpl.java
@@ -1,20 +1,14 @@
package org.jeecg.modules.system.service.impl;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import org.jeecg.modules.system.entity.SysRole;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.entity.SysUserRole;
import org.jeecg.modules.system.mapper.SysUserRoleMapper;
import org.jeecg.modules.system.service.ISysRoleService;
import org.jeecg.modules.system.service.ISysUserRoleService;
import org.jeecg.modules.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.List;
/**
 * <p>
@@ -27,4 +21,16 @@
@Service
public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUserRole> implements ISysUserRoleService {
    @Autowired
    private SysUserRoleMapper sysUserRoleMapper;
    /**
     * æ ¹æ®è§’色查询用户
     * @param roleList è§’色编码集合
     * */
    @Override
    public List<SysUser> queryUsersByRoles(List<String> roleList) {
        return sysUserRoleMapper.getUsersByRoles(roleList);
    }
}