xiangpei
2025-02-17 4cd71c0be46a461432989ae7c5d6d56d9e7bbbed
查询待办任务时,判断是否挂起状态。增加一个临时导入项目的接口
7个文件已修改
2个文件已添加
214 ■■■■■ 已修改文件
business/src/main/java/com/ycl/controller/ProjectInfoController.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/domain/excel/ProjectTempImport.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/listener/excel/CurrencyDataListener.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/common/constant/ProcessConstants.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/domain/vo/FormDetailVO.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/service/common/TaskCommonService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
system/src/main/java/com/ycl/system/mapper/SysDeptMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
system/src/main/resources/mapper/system/SysDeptMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/controller/ProjectInfoController.java
@@ -1,18 +1,25 @@
package com.ycl.controller;
import com.alibaba.excel.EasyExcel;
import com.ycl.common.base.Result;
import com.ycl.common.exception.base.BaseException;
import com.ycl.common.group.Add;
import com.ycl.common.group.Update;
import com.ycl.common.utils.ProjectCodeGenerator;
import com.ycl.common.utils.bean.BeanUtils;
import com.ycl.common.utils.excel.OutputExcelUtils;
import com.ycl.domain.entity.ProjectInfo;
import com.ycl.domain.excel.ProjectExcelTemplate;
import com.ycl.domain.excel.ProjectTempImport;
import com.ycl.domain.form.DocumentInfoForm;
import com.ycl.domain.form.ProjectForm;
import com.ycl.domain.form.ProjectInfoForm;
import com.ycl.domain.query.ProjectExportQuery;
import com.ycl.domain.query.ProjectInfoQuery;
import com.ycl.listener.excel.CurrencyDataListener;
import com.ycl.service.ProjectInfoService;
import com.ycl.system.mapper.SysDeptMapper;
import com.ycl.system.service.ISysDeptService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
@@ -23,8 +30,10 @@
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotEmpty;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
/**
 * 项目管理基础信息表 前端控制器
@@ -40,6 +49,28 @@
public class ProjectInfoController {
    private final ProjectInfoService projectInfoService;
    private final SysDeptMapper deptMapper;
    @PostMapping("/import/temp")
    @ApiOperation(value = "临时导入", notes = "临时导入")
//    @PreAuthorize("hasAuthority('projectInfo:add')")
    public Result importTemp(@RequestPart("file") MultipartFile file) throws IOException {
        Consumer<List<ProjectTempImport>> consumer = (data) -> {
            for (ProjectTempImport project : data) {
                ProjectInfo projectInfo = new ProjectInfo();
                BeanUtils.copyProperties(project, projectInfo);
                projectInfo.setYearInvestAmount(project.getTzje());
                // 处理业主单位、主管部门id
                Long yzId = deptMapper.selectByName(project.getProjectOwnerUnit());
                projectInfo.setProjectOwnerUnit(yzId);
                Long zgId = deptMapper.selectByName(project.getCompetentDepartment());
                projectInfo.setCompetentDepartment(zgId + "");
                projectInfoService.save(projectInfo);
            }
        };
        EasyExcel.read(file.getInputStream(), ProjectTempImport.class, new CurrencyDataListener(consumer)).headRowNumber(1).doReadAll();
        return Result.ok();
    }
    @PostMapping
    @ApiOperation(value = "添加", notes = "添加")
business/src/main/java/com/ycl/domain/excel/ProjectTempImport.java
New file
@@ -0,0 +1,47 @@
package com.ycl.domain.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * 项目临时导入模板
 *
 * @author:xp
 * @date:2025/2/17 11:24
 */
@Data
public class ProjectTempImport {
    @ExcelProperty(value = "项目名称")
    private String projectName;
    @ExcelProperty(value = "项目类型")
    private String projectType;
    @ExcelProperty(value = "建设内容")
    private String content;
    @ExcelProperty(value = "业主单位")
    private String projectOwnerUnit;
    @ExcelProperty(value = "主管部门")
    private String competentDepartment;
    @ExcelProperty(value = "计划开工时间")
    private Date planStartTime;
    @ExcelProperty(value = "计划竣工时间")
    private Date planCompleteTime;
    @ExcelProperty("年度投资金额")
    private BigDecimal tzje;
    @ExcelProperty("行业主管部门")
    private String hyzgbm;
    @ExcelProperty(value = "行政区划")
    private String area;
}
business/src/main/java/com/ycl/listener/excel/CurrencyDataListener.java
New file
@@ -0,0 +1,105 @@
package com.ycl.listener.excel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.read.listener.ReadListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
/**
 * easyExcel 多表通用读取监听器
 *
 * @author xp
 */
public class CurrencyDataListener<T> implements ReadListener<T> {
    private Consumer consumer;
    /**
     * 每隔100条存储数据库,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 100;
    /**
     * 缓存的数据
     */
    private List<T> cachedDataList = new ArrayList<>(BATCH_COUNT);
    private final static Logger log = LoggerFactory.getLogger(CurrencyDataListener.class);
    public CurrencyDataListener(Consumer<List<T>> consumer) {
        this.consumer = consumer;
    }
    /**
     * 读取出现异常处理
     *
     * @param e
     * @param analysisContext
     * @throws Exception
     */
    @Override
    public void onException(Exception e, AnalysisContext analysisContext) throws Exception {
    }
    /**
     * 处理表头
     *  @param map
     * @param analysisContext
     */
    @Override
    public void invokeHead(Map<Integer, ReadCellData<?>> map, AnalysisContext analysisContext) {
    }
    /**
     * 读取数据,每一条数据解析都会来调用
     *
     * @param data
     * @param analysisContext
     */
    @Override
    public void invoke(T data, AnalysisContext analysisContext) {
        cachedDataList.add(data);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (cachedDataList.size() >= BATCH_COUNT) {
            try {
                // 必须要捕获异常,否则列表不会清空
                saveData();
            } catch (Exception e) {
                e.printStackTrace();
            }
            // 存储完成清理 list
            cachedDataList = new ArrayList<>(BATCH_COUNT);
        }
    }
    /**
     * 读取完成
     *
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        saveData();
        log.info("所有数据解析完成!");
    }
    @Override
    public boolean hasNext(AnalysisContext analysisContext) {
        return true;
    }
    private void saveData() {
        log.info("{}条数据,开始存储数据库!", cachedDataList.size());
        consumer.accept(cachedDataList);
        log.info("存储数据库成功!");
    }
}
business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
@@ -15,6 +15,7 @@
import com.ycl.common.core.domain.entity.SysUser;
import com.ycl.common.enums.FlowComment;
import com.ycl.common.enums.business.ProcessLogEventTypeEnum;
import com.ycl.common.enums.business.TaskStatusEnum;
import com.ycl.common.exception.CustomException;
import com.ycl.common.utils.SecurityUtils;
import com.ycl.domain.dto.FlowCommentDto;
@@ -1254,6 +1255,14 @@
            parameters = taskService.getVariables(taskId);
        }
        List<FormDetailVO> beforeNodes = this.getBeforeNodeForm(parameters, task.getFormKey(), task.getName(), task.getProcessDefinitionId(), task.getTaskDefinitionKey(), Boolean.FALSE);
        // 判断当前任务是否被挂起中
        beforeNodes.stream().forEach(node -> {
            if (node.getCurrent()) {
                if (processLogService.taskIsHangup(taskId, task.getProcessInstanceId())) {
                    node.setTaskStatus(TaskStatusEnum.HANGUP);
                }
            }
        });
        return AjaxResult.success(beforeNodes);
    }
flowable/src/main/java/com/ycl/common/constant/ProcessConstants.java
@@ -104,6 +104,8 @@
    public static final String EXTENSION_PROPERTY_CAN_WAIT_TEXT = "是否允许容缺";
    public static final String EXTENSION_PROPERTY_CAN_HANGUP_TEXT = "是否允许挂起";
    public static final String EXTENSION_PROPERTY_VALUE = "是";
flowable/src/main/java/com/ycl/domain/vo/FormDetailVO.java
@@ -1,6 +1,7 @@
package com.ycl.domain.vo;
import com.alibaba.fastjson2.JSONObject;
import com.ycl.common.enums.business.TaskStatusEnum;
import lombok.Data;
import java.util.Map;
@@ -34,6 +35,17 @@
    private boolean canWait;
    /**
     * 是否允许挂起
     *
     */
    private boolean canHangup;
    /**
     * 任务的状态:挂起、容缺
     */
    private TaskStatusEnum taskStatus;
    /**
     * 前置节点定义id
     *
     */
flowable/src/main/java/com/ycl/service/common/TaskCommonService.java
@@ -105,6 +105,8 @@
        }
        formDetailVO.setCanJump(this.checkHasExeProperty(currentElement.getExtensionElements().get("properties"), ProcessConstants.EXTENSION_PROPERTY_CAN_JUMP_TEXT));
        formDetailVO.setCanWait(this.checkHasExeProperty(currentElement.getExtensionElements().get("properties"), ProcessConstants.EXTENSION_PROPERTY_CAN_WAIT_TEXT));
        formDetailVO.setCanHangup(this.checkHasExeProperty(currentElement.getExtensionElements().get("properties"), ProcessConstants.EXTENSION_PROPERTY_CAN_HANGUP_TEXT));
        defKeys.add(formDetailVO);
        this.beforeNodeInfo(currentElement, defKeys);
system/src/main/java/com/ycl/system/mapper/SysDeptMapper.java
@@ -120,4 +120,6 @@
    String selectAncestors(Long userId);
    Long selectByName(@Param("name") String projectOwnerUnit);
}
system/src/main/resources/mapper/system/SysDeptMapper.xml
@@ -100,6 +100,10 @@
        where SU.user_id = #{userId}
    </select>
    <select id="selectByName" parameterType="string" resultType="long">
        SELECT dept_id FROM sys_dept WHERE dept_name = #{name} and del_flag = '0' limit 1
    </select>
    <insert id="insertDept" parameterType="SysDept">
         insert into sys_dept(
             <if test="deptId != null and deptId != 0">dept_id,</if>