business/src/main/java/com/ycl/controller/ProjectInfoController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
business/src/main/java/com/ycl/domain/excel/ProjectTempImport.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
business/src/main/java/com/ycl/listener/excel/CurrencyDataListener.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
flowable/src/main/java/com/ycl/common/constant/ProcessConstants.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
flowable/src/main/java/com/ycl/domain/vo/FormDetailVO.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
flowable/src/main/java/com/ycl/service/common/TaskCommonService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
system/src/main/java/com/ycl/system/mapper/SysDeptMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
system/src/main/resources/mapper/system/SysDeptMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | 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>