forked from ZhanLi/ScientificSystem
Compare commits
3 Commits
Author | SHA1 | Date |
---|---|---|
jzq | 1130a25608 | |
UP管理员 | ace2b71073 | |
UP管理员 | e1b7b58210 |
8
pom.xml
8
pom.xml
|
@ -352,6 +352,13 @@
|
|||
<version>${ruoyi-flowable-plus.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- scientific模块 -->
|
||||
<dependency>
|
||||
<groupId>com.ruoyi</groupId>
|
||||
<artifactId>scientific</artifactId>
|
||||
<version>${ruoyi-flowable-plus.version}</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
|
@ -367,6 +374,7 @@
|
|||
<module>ruoyi-oss</module>
|
||||
<module>ruoyi-sms</module>
|
||||
<module>ruoyi-system</module>
|
||||
<module>scientific</module>
|
||||
</modules>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
|
|
|
@ -78,6 +78,12 @@
|
|||
<artifactId>ruoyi-demo</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- scientific模块 -->
|
||||
<dependency>
|
||||
<groupId>com.ruoyi</groupId>
|
||||
<artifactId>scientific</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- flowable模块-->
|
||||
<dependency>
|
||||
<groupId>com.ruoyi</groupId>
|
||||
|
|
|
@ -72,8 +72,13 @@ public class WfProcessController extends BaseController {
|
|||
public TableDataInfo<WfTaskVo> handbookList(ProcessQuery processQuery, PageQuery pageQuery) {
|
||||
return processService.selectPageHandbookList(processQuery, pageQuery);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 获得我发起的流程的详细信息的列表, pageQuery中可以指定标题名和负责人名字字段,如果能够匹配则
|
||||
* 返回这些信息,如果无法匹配返回为空。
|
||||
* @author zhanli
|
||||
* @since 2024-07-22
|
||||
*/
|
||||
@SaCheckPermission("workflow:process:ownList")
|
||||
@GetMapping(value = "/ownInfoList")
|
||||
public TableDataInfo<WfTaskInfoVo> ownProcessInfoList(ProcessQuery processQuery, PageQuery pageQuery) {
|
||||
|
@ -204,7 +209,7 @@ public class WfProcessController extends BaseController {
|
|||
*
|
||||
* @param definitionId 流程定义id
|
||||
* @param deployId 流程部署id
|
||||
* @param procInsId 这个参数可选
|
||||
* @param procInsId 这个参数可选, 如果流程的实例Id存在,那么就会把数值变量信息也返回
|
||||
*/
|
||||
@SaCheckPermission("workflow:process:start")
|
||||
@GetMapping("/getProcessForm")
|
||||
|
@ -215,7 +220,7 @@ public class WfProcessController extends BaseController {
|
|||
}
|
||||
|
||||
/**
|
||||
* 根据流程定义id启动流程实例
|
||||
* 根据流程定义id启动流程实例, 实际上启动流程只需要流程的定义Id和传递的参数就行
|
||||
*
|
||||
* @param processDefId 流程定义id
|
||||
* @param variables 变量集合,json对象
|
||||
|
@ -227,6 +232,13 @@ public class WfProcessController extends BaseController {
|
|||
return R.ok("流程启动成功");
|
||||
}
|
||||
|
||||
@SaCheckPermission("workflow:process:start")
|
||||
@PostMapping("/startId/{processDefId}")
|
||||
public R<Void> start_(@PathVariable(value = "processDefId") String processDefId, @RequestBody Map<String, Object> variables) {
|
||||
String processInstanceId = processService.startProcessByDefId_(processDefId, variables);
|
||||
return R.ok(processInstanceId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除流程实例
|
||||
*
|
||||
|
@ -237,6 +249,13 @@ public class WfProcessController extends BaseController {
|
|||
processService.deleteProcessByIds(instanceIds);
|
||||
return R.ok();
|
||||
}
|
||||
@SaCheckPermission("workflow:process:start")
|
||||
@PostMapping("/updateHistory/{processInsId}")
|
||||
public R<Void> updateHistory(@PathVariable(value = "processInsId") String processInsId, @RequestBody Map<String, Object> variables) {
|
||||
// 删除的时候先要获取流程的实体Id
|
||||
processService.editProcessByIds(processInsId, variables);
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取xml文件
|
||||
|
@ -257,7 +276,11 @@ public class WfProcessController extends BaseController {
|
|||
public R detail(String procInsId, String taskId) {
|
||||
return R.ok(processService.queryProcessDetail(procInsId, taskId));
|
||||
}
|
||||
|
||||
/**
|
||||
* zqjia: 批量查询流程实例详情
|
||||
*
|
||||
* @param procInsIds 流程实例ID列表
|
||||
*/
|
||||
@PostMapping("/details")
|
||||
public TableDataInfo<WfDetailVo> details(@RequestBody List<String> procInsIds) {
|
||||
List<WfDetailVo> processDetails = new ArrayList<>();
|
||||
|
|
|
@ -49,7 +49,7 @@ spring:
|
|||
driverClassName: com.mysql.cj.jdbc.Driver
|
||||
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
|
||||
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
|
||||
url: jdbc:mysql://localhost:3306/ry-flowable-plus?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true
|
||||
url: jdbc:mysql://192.168.31.120:3306/ry-flowable-plus?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true
|
||||
username: root
|
||||
password: jyzbyj306
|
||||
# 从库数据源
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
</encoder>
|
||||
</appender>
|
||||
|
||||
|
||||
<!-- 控制台输出 -->
|
||||
<appender name="file_console" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>${log.path}/sys-console.log</file>
|
||||
|
|
|
@ -16,12 +16,19 @@ import javax.annotation.Resource;
|
|||
@Getter
|
||||
public class FlowServiceFactory {
|
||||
|
||||
/**
|
||||
* 提供了管理与控制部署(deployments)与流程定义(process definitions)的操作
|
||||
*/
|
||||
@Resource
|
||||
protected RepositoryService repositoryService;
|
||||
|
||||
@Resource
|
||||
protected RuntimeService runtimeService;
|
||||
|
||||
/**
|
||||
* 用于管理(创建,更新,删除,查询……)组与用户,Flowable实际上在运行时并不做任
|
||||
* 何用户检查。例如任务可以分派给任何用户,而引擎并不会验证系统中是否存在该用户
|
||||
*/
|
||||
@Resource
|
||||
protected IdentityService identityService;
|
||||
|
||||
|
@ -30,10 +37,20 @@ public class FlowServiceFactory {
|
|||
|
||||
@Resource
|
||||
protected FormService formService;
|
||||
|
||||
/**
|
||||
* 暴露Flowable引擎收集的所有历史数据。当执行流程时,引擎会保存许多数据(可配置),
|
||||
* 例如流程实例启动时间、谁在执行哪个任务、完成任务花费的事件、每个流程实例的执行路
|
||||
* 径,等等。这个服务主要提供查询这些数据的能力。
|
||||
*/
|
||||
@Resource
|
||||
protected HistoryService historyService;
|
||||
|
||||
/**
|
||||
* 暴露通常在用Flowable编写用户应用时不需要使用。它可以读取数据库表与表原始数据的信
|
||||
* 息,也提供了对作业(job)的查询与管理操作。Flowable中很多地方都使用作业,例如定时
|
||||
* 器(timer),异步操作(asynchronous continuation),延时暂停/激活(delayed
|
||||
* suspension/activation)等等
|
||||
*/
|
||||
@Resource
|
||||
protected ManagementService managementService;
|
||||
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
package com.ruoyi.flowable.listener;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.flowable.engine.delegate.ExecutionListener;
|
||||
|
||||
public class TestTaskListener implements ExecutionListener {
|
||||
/**
|
||||
* 注入字段(名称与流程设计时字段名称一致)
|
||||
*/
|
||||
// private FixedValue field;
|
||||
@Override
|
||||
public void notify(DelegateExecution execution) {
|
||||
System.out.println("执行任务监听器...");
|
||||
}
|
||||
}
|
|
@ -1,49 +0,0 @@
|
|||
package com.ruoyi.project.service;
|
||||
|
||||
import com.ruoyi.project.domain.ProjectApplication;
|
||||
import com.ruoyi.project.domain.vo.ProjectApplicationVo;
|
||||
import com.ruoyi.project.domain.bo.ProjectApplicationBo;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
import com.ruoyi.common.core.domain.PageQuery;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 项目申报Service接口
|
||||
*
|
||||
* @author ruoyi
|
||||
* @date 2024-06-14
|
||||
*/
|
||||
public interface IProjectApplicationService {
|
||||
|
||||
/**
|
||||
* 查询项目申报
|
||||
*/
|
||||
ProjectApplicationVo queryById(Long projectId);
|
||||
|
||||
/**
|
||||
* 查询项目申报列表
|
||||
*/
|
||||
TableDataInfo<ProjectApplicationVo> queryPageList(ProjectApplicationBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询项目申报列表
|
||||
*/
|
||||
List<ProjectApplicationVo> queryList(ProjectApplicationBo bo);
|
||||
|
||||
/**
|
||||
* 新增项目申报
|
||||
*/
|
||||
Boolean insertByBo(ProjectApplicationBo bo);
|
||||
|
||||
/**
|
||||
* 修改项目申报
|
||||
*/
|
||||
Boolean updateByBo(ProjectApplicationBo bo);
|
||||
|
||||
/**
|
||||
* 校验并批量删除项目申报信息
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
}
|
|
@ -1,115 +0,0 @@
|
|||
package com.ruoyi.project.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
import com.ruoyi.common.core.domain.PageQuery;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.ruoyi.project.domain.bo.ProjectApplicationBo;
|
||||
import com.ruoyi.project.domain.vo.ProjectApplicationVo;
|
||||
import com.ruoyi.project.domain.ProjectApplication;
|
||||
import com.ruoyi.project.mapper.ProjectApplicationMapper;
|
||||
import com.ruoyi.project.service.IProjectApplicationService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* 项目申报Service业务层处理
|
||||
*
|
||||
* @author ruoyi
|
||||
* @date 2024-06-14
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class ProjectApplicationServiceImpl implements IProjectApplicationService {
|
||||
|
||||
private final ProjectApplicationMapper baseMapper;
|
||||
|
||||
/**
|
||||
* 查询项目申报
|
||||
*/
|
||||
@Override
|
||||
public ProjectApplicationVo queryById(Long projectId){
|
||||
return baseMapper.selectVoById(projectId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询项目申报列表
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<ProjectApplicationVo> queryPageList(ProjectApplicationBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<ProjectApplication> lqw = buildQueryWrapper(bo);
|
||||
Page<ProjectApplicationVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询项目申报列表
|
||||
*/
|
||||
@Override
|
||||
public List<ProjectApplicationVo> queryList(ProjectApplicationBo bo) {
|
||||
LambdaQueryWrapper<ProjectApplication> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<ProjectApplication> buildQueryWrapper(ProjectApplicationBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<ProjectApplication> lqw = Wrappers.lambdaQuery();
|
||||
lqw.like(StringUtils.isNotBlank(bo.getProjectName()), ProjectApplication::getProjectName, bo.getProjectName());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getProjectStatus()), ProjectApplication::getProjectStatus, bo.getProjectStatus());
|
||||
lqw.eq(bo.getProjectAppStTime() != null, ProjectApplication::getProjectAppStTime, bo.getProjectAppStTime());
|
||||
lqw.eq(bo.getProjectAppEndTime() != null, ProjectApplication::getProjectAppEndTime, bo.getProjectAppEndTime());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getProjectLeader()), ProjectApplication::getProjectLeader, bo.getProjectLeader());
|
||||
lqw.eq(bo.getProjectBudget() != null, ProjectApplication::getProjectBudget, bo.getProjectBudget());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getProjectLeaderPhone()), ProjectApplication::getProjectLeaderPhone, bo.getProjectLeaderPhone());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增项目申报
|
||||
*/
|
||||
@Override
|
||||
public Boolean insertByBo(ProjectApplicationBo bo) {
|
||||
ProjectApplication add = BeanUtil.toBean(bo, ProjectApplication.class);
|
||||
validEntityBeforeSave(add);
|
||||
boolean flag = baseMapper.insert(add) > 0;
|
||||
if (flag) {
|
||||
bo.setProjectId(add.getProjectId());
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改项目申报
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateByBo(ProjectApplicationBo bo) {
|
||||
ProjectApplication update = BeanUtil.toBean(bo, ProjectApplication.class);
|
||||
validEntityBeforeSave(update);
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(ProjectApplication entity){
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除项目申报
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteBatchIds(ids) > 0;
|
||||
}
|
||||
}
|
|
@ -123,4 +123,8 @@ public interface IWfProcessService {
|
|||
|
||||
|
||||
TableDataInfo<WfTaskInfoVo> selectPageOwnProcessInfoList(ProcessQuery processQuery, PageQuery pageQuery);
|
||||
|
||||
String startProcessByDefId_(String processDefId, Map<String, Object> variables);
|
||||
|
||||
void editProcessByIds(String procInsId, Map<String, Object> variables);
|
||||
}
|
||||
|
|
|
@ -42,10 +42,16 @@ import lombok.RequiredArgsConstructor;
|
|||
import org.flowable.bpmn.constants.BpmnXMLConstants;
|
||||
import org.flowable.bpmn.model.Process;
|
||||
import org.flowable.bpmn.model.*;
|
||||
import org.flowable.common.engine.impl.interceptor.Command;
|
||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||
import org.flowable.engine.ProcessEngine;
|
||||
import org.flowable.engine.ProcessEngineConfiguration;
|
||||
import org.flowable.engine.history.HistoricActivityInstance;
|
||||
import org.flowable.engine.history.HistoricActivityInstanceQuery;
|
||||
import org.flowable.engine.history.HistoricProcessInstance;
|
||||
import org.flowable.engine.history.HistoricProcessInstanceQuery;
|
||||
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
|
||||
import org.flowable.engine.impl.persistence.entity.HistoricProcessInstanceEntity;
|
||||
import org.flowable.engine.repository.Deployment;
|
||||
import org.flowable.engine.repository.ProcessDefinition;
|
||||
import org.flowable.engine.repository.ProcessDefinitionQuery;
|
||||
|
@ -199,6 +205,7 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce
|
|||
taskVo.setFinishTime(hisIns.getEndTime());
|
||||
taskVo.setProcInsId(hisIns.getId());
|
||||
|
||||
|
||||
// 计算耗时
|
||||
if (Objects.nonNull(hisIns.getEndTime())) {
|
||||
taskVo.setDuration(DateUtils.getDatePoor(hisIns.getEndTime(), hisIns.getStartTime()));
|
||||
|
@ -664,6 +671,18 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce
|
|||
}
|
||||
}
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public String startProcessByDefId_(String procDefId, Map<String, Object> variables) {
|
||||
try {
|
||||
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
|
||||
.processDefinitionId(procDefId).singleResult();
|
||||
return startProcess_(processDefinition, variables);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
throw new ServiceException("流程启动错误");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过DefinitionKey启动流程
|
||||
* @param procDefKey 流程定义Key
|
||||
|
@ -696,6 +715,82 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce
|
|||
historyService.bulkDeleteHistoricProcessInstances(ids);
|
||||
}
|
||||
|
||||
public void editProcessByIds(String procInsId, Map<String, Object> variables) {
|
||||
// 更改前先获得历史信息
|
||||
HistoricProcessInstance historicProcIns = historyService.createHistoricProcessInstanceQuery()
|
||||
.processInstanceId(procInsId)
|
||||
.includeProcessVariables()
|
||||
.singleResult();
|
||||
|
||||
// ---------------------------------- 新建流程 ------------------------------------- //
|
||||
// 从历史实体中获取流程定义
|
||||
String procDefId = historicProcIns.getProcessDefinitionId();
|
||||
ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery()
|
||||
.processDefinitionId(procDefId).singleResult();
|
||||
|
||||
// 检查流程定义是否正常
|
||||
if (ObjectUtil.isNotNull(procDef) && procDef.isSuspended()) {
|
||||
throw new ServiceException("流程已被挂起,请先激活流程");
|
||||
}
|
||||
|
||||
// 设置流程发起人Id到流程中
|
||||
String userIdStr = TaskUtils.getUserId();
|
||||
identityService.setAuthenticatedUserId(userIdStr);
|
||||
variables.put(BpmnXMLConstants.ATTRIBUTE_EVENT_START_INITIATOR, userIdStr);
|
||||
|
||||
// 设置流程状态为完成
|
||||
variables.put(ProcessConstants.PROCESS_STATUS_KEY, ProcessStatus.COMPLETED.getStatus());
|
||||
// 根据流程的定义发起流程实例
|
||||
ProcessInstance processInstance = runtimeService.startProcessInstanceById(procDef.getId(), variables);
|
||||
// 第一个用户任务为发起人,则自动完成任务
|
||||
wfTaskService.startFirstTask(processInstance, variables);
|
||||
|
||||
|
||||
// 直接修改数据库的方法
|
||||
// processEngine.getProcessEngineConfiguration().getDataSource();
|
||||
// // 获取数据库连接
|
||||
// DataSource dataSource = processEngineConfiguration.getDataSource();
|
||||
// try (Connection connection = dataSource.getConnection();
|
||||
// Statement statement = connection.createStatement()) {
|
||||
//
|
||||
// // 更新历史流程实例的名称
|
||||
// String sql = "UPDATE ACT_HI_PROCINST SET NAME_ = 'newName' WHERE ID_ = 'processInstanceId'";
|
||||
// statement.executeUpdate(sql);
|
||||
//
|
||||
// } catch (SQLException e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
|
||||
// HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
|
||||
// .processInstanceId("processInstanceId")
|
||||
// .singleResult();
|
||||
// ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration
|
||||
// .createProcessEngineConfigurationFromResourceDefault();
|
||||
// // 将查询结果转换为实体类,以便进行修改
|
||||
// if (historicProcessInstance instanceof HistoricProcessInstanceEntity) {
|
||||
// HistoricProcessInstanceEntity processInstanceEntity = (HistoricProcessInstanceEntity) historicProcessInstance;
|
||||
//
|
||||
// // 修改流程实例名称
|
||||
// processInstanceEntity.setName("newProcessName");
|
||||
//
|
||||
// // 保存修改
|
||||
// processEngineConfiguration.getCommandExecutor().execute(new Command<Void>() {
|
||||
// @Override
|
||||
// public Void execute(CommandContext commandContext) {
|
||||
//
|
||||
// return null;
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
|
||||
|
||||
// -------------------------------- 删除历史流程 ---------------------------------- //
|
||||
// 历史流程实例不能编辑只能删除,因此编辑=删除+新建
|
||||
historyService.deleteHistoricProcessInstance(procInsId);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 读取xml文件
|
||||
* @param processDefId 流程定义ID
|
||||
|
@ -777,6 +872,23 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce
|
|||
wfTaskService.startFirstTask(processInstance, variables);
|
||||
}
|
||||
|
||||
private String startProcess_(ProcessDefinition procDef, Map<String, Object> variables) {
|
||||
if (ObjectUtil.isNotNull(procDef) && procDef.isSuspended()) {
|
||||
throw new ServiceException("流程已被挂起,请先激活流程");
|
||||
}
|
||||
// 设置流程发起人Id到流程中
|
||||
String userIdStr = TaskUtils.getUserId();
|
||||
identityService.setAuthenticatedUserId(userIdStr);
|
||||
variables.put(BpmnXMLConstants.ATTRIBUTE_EVENT_START_INITIATOR, userIdStr);
|
||||
// 设置流程状态为进行中
|
||||
variables.put(ProcessConstants.PROCESS_STATUS_KEY, ProcessStatus.RUNNING.getStatus());
|
||||
// 发起流程实例
|
||||
ProcessInstance processInstance = runtimeService.startProcessInstanceById(procDef.getId(), variables);
|
||||
// 第一个用户任务为发起人,则自动完成任务
|
||||
wfTaskService.startFirstTask(processInstance, variables);
|
||||
return processInstance.getProcessInstanceId();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取流程变量
|
||||
|
@ -881,6 +993,7 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce
|
|||
@Deprecated
|
||||
private void buildStartFormData(HistoricProcessInstance historicProcIns, Process process, String deployId, List<FormConf> procFormList) {
|
||||
procFormList = procFormList == null ? new ArrayList<>() : procFormList;
|
||||
|
||||
HistoricActivityInstance startInstance = historyService.createHistoricActivityInstanceQuery()
|
||||
.processInstanceId(historicProcIns.getId())
|
||||
.activityId(historicProcIns.getStartActivityId())
|
||||
|
@ -1109,16 +1222,37 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce
|
|||
WfDetailVo detailVo = queryProcessDetail(task.getProcInsId(), "");
|
||||
// 获取表单列表
|
||||
List<FormConf> processFormList = detailVo.getProcessFormList();
|
||||
// 获取项目名字
|
||||
|
||||
// 这里获得是流程信息的Title名字, 但是不同的流程可能的Title的字段名可能不一样,可能是一个数组
|
||||
// 并按照逗号进行分隔
|
||||
// @author zhanli 2024/07/31
|
||||
if(pageQuery.getDetailTitleName() != null){
|
||||
String res = getFormData(processFormList, pageQuery.getDetailTitleName(), pageQuery);
|
||||
taskVo.setProcessTitle(res);
|
||||
// getDetailTitleName可能是一个数组,先进行分割
|
||||
String[] queryTitleList = pageQuery.getDetailTitleName().split(",");
|
||||
// 遍历结果数组, 依次请求流程的中字段的关键信息,如果查询不为空就返回
|
||||
for (String queryTitle : queryTitleList) {
|
||||
String res = getFormData(processFormList, queryTitle, pageQuery);
|
||||
if(!res.equals("")){
|
||||
taskVo.setProcessTitle(res);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 获取项目负责人名字
|
||||
if(pageQuery.getDetailDirectorName() != null){
|
||||
String director = getFormData(processFormList, pageQuery.getDetailDirectorName(), pageQuery);
|
||||
taskVo.setDirector(director);
|
||||
String[] queryTitleList = pageQuery.getDetailDirectorName().split(",");
|
||||
// 遍历结果数组, 依次请求流程的中字段的关键信息,如果查询不为空就返回
|
||||
for (String queryTitle : queryTitleList) {
|
||||
String res = getFormData(processFormList, queryTitle, pageQuery);
|
||||
if(!res.equals("")){
|
||||
taskVo.setDirector(res);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
targetList.add(taskVo);
|
||||
}
|
||||
|
||||
|
@ -1159,4 +1293,6 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce
|
|||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -84,9 +84,17 @@ public class WfTaskServiceImpl extends FlowServiceFactory implements IWfTaskServ
|
|||
// 获取模型信息
|
||||
String localScopeValue = ModelUtils.getUserTaskAttributeValue(bpmnModel, task.getTaskDefinitionKey(), ProcessConstants.PROCESS_FORM_LOCAL_SCOPE);
|
||||
boolean localScope = Convert.toBool(localScopeValue, false);
|
||||
taskService.complete(taskBo.getTaskId(), taskBo.getVariables(), localScope);
|
||||
Map<String, Object> mapTmp = taskBo.getVariables();
|
||||
mapTmp.put("review", "1");
|
||||
if (!StringUtils.isNotBlank(taskBo.getNextUserIds())) {
|
||||
taskService.complete(taskBo.getTaskId(), mapTmp, localScope);
|
||||
}
|
||||
} else {
|
||||
taskService.complete(taskBo.getTaskId());
|
||||
Map<String, Object> mapTmp = new HashMap<>();
|
||||
mapTmp.put("review", "1");
|
||||
if (!StringUtils.isNotBlank(taskBo.getNextUserIds())) {
|
||||
taskService.complete(taskBo.getTaskId(), mapTmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
// 设置任务节点名称
|
||||
|
@ -330,6 +338,7 @@ public class WfTaskServiceImpl extends FlowServiceFactory implements IWfTaskServ
|
|||
taskService.setOwner(bo.getTaskId(), TaskUtils.getUserId());
|
||||
// 执行委派
|
||||
taskService.delegateTask(bo.getTaskId(), bo.getUserId());
|
||||
|
||||
// 设置任务节点名称
|
||||
bo.setTaskName(task.getName());
|
||||
// 处理抄送用户
|
||||
|
|
|
@ -1,19 +0,0 @@
|
|||
<?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="com.ruoyi.project.mapper.ProjectApplicationMapper">
|
||||
|
||||
<resultMap type="com.ruoyi.project.domain.ProjectApplication" id="ProjectApplicationResult">
|
||||
<result property="projectId" column="project_id"/>
|
||||
<result property="projectName" column="project_name"/>
|
||||
<result property="projectStatus" column="project_status"/>
|
||||
<result property="projectAppStTime" column="project_app_st_time"/>
|
||||
<result property="projectAppEndTime" column="project_app_end_time"/>
|
||||
<result property="projectLeader" column="project_leader"/>
|
||||
<result property="projectBudget" column="project_budget"/>
|
||||
<result property="projectLeaderPhone" column="project_leader_phone"/>
|
||||
</resultMap>
|
||||
|
||||
|
||||
</mapper>
|
|
@ -0,0 +1,60 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
// 查询项目申报列表
|
||||
export function listApplication(query) {
|
||||
return request({
|
||||
url: '/scientific/application/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询项目申报详细
|
||||
export function getApplication(projectId) {
|
||||
return request({
|
||||
url: '/scientific/application/' + projectId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增项目申报
|
||||
export function addApplication(data) {
|
||||
return request({
|
||||
url: '/scientific/application',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改项目申报
|
||||
export function updateApplication(data) {
|
||||
return request({
|
||||
url: '/scientific/application',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除项目申报
|
||||
export function delApplication(projectId) {
|
||||
return request({
|
||||
url: '/scientific/application/' + projectId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 删除项目申报
|
||||
export function confirmFundsReceived(data) {
|
||||
return request({
|
||||
url: '/scientific/application/confirmFunds/',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
// 查询已申报项目
|
||||
export function listDeclaredApplications() {
|
||||
return request({
|
||||
url: '/scientific/application/declared',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
// 查询department列表
|
||||
export function listDepartment(query) {
|
||||
return request({
|
||||
url: '/scientific/department/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询department详细
|
||||
export function getDepartment(departmentId) {
|
||||
return request({
|
||||
url: '/scientific/department/' + departmentId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增department
|
||||
export function addDepartment(data) {
|
||||
return request({
|
||||
url: '/scientific/department',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改department
|
||||
export function updateDepartment(data) {
|
||||
return request({
|
||||
url: '/scientific/department',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除department
|
||||
export function delDepartment(departmentId) {
|
||||
return request({
|
||||
url: '/scientific/department/' + departmentId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
// 查询项目申报指南列表
|
||||
export function listHandbook(query) {
|
||||
return request({
|
||||
url: '/scientific/handbook/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询项目申报指南详细
|
||||
export function getHandbook(handbookId) {
|
||||
return request({
|
||||
url: '/scientific/handbook/' + handbookId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增项目申报指南
|
||||
export function addHandbook(data) {
|
||||
return request({
|
||||
url: '/scientific/handbook',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改项目申报指南
|
||||
export function updateHandbook(data) {
|
||||
return request({
|
||||
url: '/scientific/handbook',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除项目申报指南
|
||||
export function delHandbook(handbookId) {
|
||||
return request({
|
||||
url: '/scientific/handbook/' + handbookId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
// 查询科研管理列表
|
||||
export function listProject(query) {
|
||||
return request({
|
||||
url: '/scientific/project/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询科研管理详细
|
||||
export function getProject(id) {
|
||||
return request({
|
||||
url: '/scientific/project/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增科研管理
|
||||
export function addProject(data) {
|
||||
return request({
|
||||
url: '/scientific/project',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改科研管理
|
||||
export function updateProject(data) {
|
||||
return request({
|
||||
url: '/scientific/project',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除科研管理
|
||||
export function delProject(id) {
|
||||
return request({
|
||||
url: '/scientific/project/' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
// 查询项目申报v2列表
|
||||
export function listPlan(query) {
|
||||
return request({
|
||||
url: '/scientific/plan/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询项目申报v2详细
|
||||
export function getPlan(handbookId) {
|
||||
return request({
|
||||
url: '/scientific/plan/' + handbookId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增项目申报v2
|
||||
export function addPlan(data) {
|
||||
return request({
|
||||
url: '/scientific/plan',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改项目申报v2
|
||||
export function updatePlan(data) {
|
||||
return request({
|
||||
url: '/scientific/plan',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除项目申报计划
|
||||
export function delPlan(planId) {
|
||||
return request({
|
||||
url: '/scientific/plan/' + planId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 封装寻找最新 表单 的函数,返回 Promise
|
||||
export function findLatestDeploymentTimeIndex(response) {
|
||||
return new Promise((resolve, reject) => {
|
||||
let latestIndex = 0;
|
||||
let latestTime = new Date(response.rows[0].deploymentTime);
|
||||
|
||||
response.rows.forEach((row, index) => {
|
||||
const currentTime = new Date(row.deploymentTime);
|
||||
|
||||
if (currentTime > latestTime) {
|
||||
latestTime = currentTime;
|
||||
latestIndex = index;
|
||||
}
|
||||
});
|
||||
|
||||
// 返回最新的索引
|
||||
resolve(latestIndex);
|
||||
});
|
||||
}
|
|
@ -27,6 +27,22 @@ export function startProcess(processDefId, data) {
|
|||
})
|
||||
}
|
||||
|
||||
export function startProcess_(processDefId, data) {
|
||||
return request({
|
||||
url: '/workflow/process/startId/' + processDefId,
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
export function updateProcess(processInsId, data) {
|
||||
return request({
|
||||
url: '/workflow/process/updateHistory/' + processInsId,
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除流程实例
|
||||
export function delProcess(ids) {
|
||||
return request({
|
||||
|
|
|
@ -187,14 +187,200 @@ export const dynamicRoutes = [
|
|||
name: 'WorkStart',
|
||||
meta: { title: '发起流程', icon: '' }
|
||||
},
|
||||
// logzhan:这里注册项目信息更新模块
|
||||
{
|
||||
path: 'update/:deployId([\\w|\\-]+)',
|
||||
component: () => import('@/views/workflow/work/update'),
|
||||
name: 'WorkUpdate',
|
||||
meta: { title: '更新信息', icon: '' }
|
||||
},
|
||||
{
|
||||
path: 'detail/:procInsId([\\w|\\-]+)',
|
||||
component: () => import('@/views/workflow/work/detail'),
|
||||
name: 'WorkDetail',
|
||||
meta: { title: '流程详情', activeMenu: '/work/own' }
|
||||
},
|
||||
// logzhan:这里用于项目的信息变更如预算追加、更换负责人等等
|
||||
{
|
||||
path: 'proj_update/:deployId([\\w|\\-]+)',
|
||||
component: () => import('@/views/workflow/work/proj_update'),
|
||||
name: 'ProjectInfoUpdate',
|
||||
meta: { title: '项目信息变更', icon: ''}
|
||||
},
|
||||
// logzhan:这里用于项目的申报
|
||||
{
|
||||
path: 'declare_details/:deployId([\\w|\\-]+)',
|
||||
component: () => import('@/views/workflow/work/declare_details'),
|
||||
name: 'ProjecDeclareInfo',
|
||||
meta: { title: '项目信息申报', icon: ''}
|
||||
},
|
||||
{
|
||||
path: 'proj_app/:deployId([\\w|\\-]+)',
|
||||
component: () => import('@/views/workflow/work/proj_app'),
|
||||
name: 'ProjectInfoApp',
|
||||
meta: { title: '项目立项', icon: ''}
|
||||
}
|
||||
]
|
||||
},
|
||||
// zqjia:用三级路由会出问题,就通过这种形式区分不同模块吧
|
||||
// 申报计划路由
|
||||
{
|
||||
path: '/scientific/project_application_plan',
|
||||
component: Layout,
|
||||
hidden: true,
|
||||
permissions: ['scientific:plan'],
|
||||
children: [
|
||||
// zqjia:这个路由是菜单管理里的起作用
|
||||
// {
|
||||
// path: 'list',
|
||||
// component: () => import('@/views/scientific/project_application_plan/index'),
|
||||
// name: 'planList',
|
||||
// meta: { title: '项目申报计划', icon: '' }
|
||||
// },
|
||||
{
|
||||
path: 'detail/:planProcId([\\w|\\-]+)',
|
||||
component: () => import('@/views/scientific/project_application_plan/detail'),
|
||||
name: 'planDetail',
|
||||
meta: { title: '申报计划详情' }
|
||||
},
|
||||
{
|
||||
path: 'planApply',
|
||||
component: () => import('@/views/scientific/project_application_plan/planApply'),
|
||||
name: 'planApply',
|
||||
meta: { title: '项目申报', icon: '' }
|
||||
},
|
||||
]
|
||||
},
|
||||
// 项目路由
|
||||
{
|
||||
path: '/scientific/project',
|
||||
component: Layout,
|
||||
hidden: true,
|
||||
permissions: ['scientific:project'],
|
||||
children: [
|
||||
// zqjia:这个路由是菜单管理里的起作用
|
||||
// {
|
||||
// path: 'list',
|
||||
// component: () => import('@/views/scientific/project/index'),
|
||||
// name: 'projectList',
|
||||
// meta: { title: '项目', icon: '' }
|
||||
// },
|
||||
// zqjia:项目详情还没写
|
||||
{
|
||||
path: 'detail/:planProcId([\\w|\\-]+)',
|
||||
component: () => import('@/views/scientific/project_application_plan/detail'),
|
||||
name: 'planDetail',
|
||||
meta: { title: '申报计划详情' }
|
||||
},
|
||||
{
|
||||
path: 'planProjectQuery/:planId([\\w|\\-]+)',
|
||||
// permissions: ['scientific:application:list'],
|
||||
component: () => import('@/views/scientific/project/index'),
|
||||
name: 'planProjectQuery',
|
||||
meta: { title: '已申报项目' }
|
||||
},
|
||||
{
|
||||
path: 'projectApply',
|
||||
component: () => import('@/views/scientific/project/projectApply'),
|
||||
name: 'ProjectApply',
|
||||
meta: { title: '项目申报', icon: '' }
|
||||
},
|
||||
]
|
||||
},
|
||||
// 指南路由
|
||||
{
|
||||
path: '/scientific/handbook',
|
||||
component: Layout,
|
||||
hidden: true,
|
||||
permissions: ['scientific:handbook'],
|
||||
children: [
|
||||
// zqjia:这个路由是菜单管理里的起作用
|
||||
// {
|
||||
// path: 'list',
|
||||
// component: () => import('@/views/scientific/project/index'),
|
||||
// name: 'projectList',
|
||||
// meta: { title: '项目', icon: '' }
|
||||
// },
|
||||
// zqjia:项目详情还没写
|
||||
{
|
||||
path: 'detail/:planProcId([\\w|\\-]+)',
|
||||
component: () => import('@/views/scientific/handbook/detail'),
|
||||
name: 'handbookDetail',
|
||||
meta: { title: '申报计划详情' }
|
||||
},
|
||||
// {
|
||||
// path: 'planProjectQuery/:planId([\\w|\\-]+)',
|
||||
// // permissions: ['scientific:application:list'],
|
||||
// component: () => import('@/views/scientific/project/index'),
|
||||
// name: 'planProjectQuery',
|
||||
// meta: { title: '已申报项目' }
|
||||
// },
|
||||
// {
|
||||
// path: 'projectApply/:deployId([\\w|\\-]+)',
|
||||
// component: () => import('@/views/scientific/project/projectApply.vue'),
|
||||
// name: 'ProjectApply',
|
||||
// meta: { title: '项目申报', icon: '' }
|
||||
// },
|
||||
]
|
||||
},
|
||||
// // 申报路由
|
||||
// {
|
||||
// path: '/project/application',
|
||||
// component: Layout,
|
||||
// hidden: true,
|
||||
// //permissions: ['scientific:handbook'],
|
||||
// children: [
|
||||
// // zqjia:这个路由是菜单管理里的起作用
|
||||
// // {
|
||||
// // path: 'list',
|
||||
// // component: () => import('@/views/scientific/project/index'),
|
||||
// // name: 'projectList',
|
||||
// // meta: { title: '项目', icon: '' }
|
||||
// // },
|
||||
// // zqjia:项目详情还没写
|
||||
// {
|
||||
// path: 'detail/:planProcId([\\w|\\-]+)',
|
||||
// component: () => import('@/views/scientific/handbook/detail'),
|
||||
// name: 'handbookDetail',
|
||||
// meta: { title: '申报计划详情' }
|
||||
// },
|
||||
// ]
|
||||
// },
|
||||
|
||||
// 合作单位路由
|
||||
{
|
||||
path: '/scientific/department',
|
||||
component: Layout,
|
||||
hidden: true,
|
||||
permissions: ['scientific:department'],
|
||||
children: [
|
||||
{
|
||||
path: 'list',
|
||||
component: () => import('@/views/scientific/department/index'),
|
||||
name: 'departmentList',
|
||||
meta: { title: '合作单位列表', icon: '' }
|
||||
},
|
||||
{
|
||||
path: 'detail/:departmentProcId([\\w|\\-]+)',
|
||||
component: () => import('@/views/scientific/department/detail'),
|
||||
name: 'departmentDetail',
|
||||
meta: { title: '合作单位详情' }
|
||||
},
|
||||
// {
|
||||
// path: 'planProjectQuery/:planId([\\w|\\-]+)',
|
||||
// // permissions: ['scientific:application:list'],
|
||||
// component: () => import('@/views/scientific/project/index'),
|
||||
// name: 'planProjectQuery',
|
||||
// meta: { title: '已申报项目' }
|
||||
// },
|
||||
{
|
||||
path: 'departmentApply',
|
||||
component: () => import('@/views/scientific/department/departmentApply'),
|
||||
name: 'departmentApply',
|
||||
meta: { title: '合作单位录入', icon: '' }
|
||||
},
|
||||
]
|
||||
},
|
||||
]
|
||||
|
||||
// 防止连续点击多次路由报错
|
||||
|
|
|
@ -0,0 +1,546 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form-item label="项目名称" prop="projectName">
|
||||
<el-input
|
||||
v-model="queryParams.projectName"
|
||||
placeholder="请输入项目名称"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="projectStatus">
|
||||
<el-input
|
||||
v-model="queryParams.projectStatus"
|
||||
placeholder="请输入状态"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="申报开始日期" prop="projectAppStTime" label-width="140px">
|
||||
<el-date-picker clearable
|
||||
v-model="queryParams.projectAppStTime"
|
||||
type="date"
|
||||
value-format="yyyy-MM-dd"
|
||||
placeholder="请选择申报开始日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="申报结束日期" prop="projectAppEndTime" label-width="140px">
|
||||
<el-date-picker clearable
|
||||
v-model="queryParams.projectAppEndTime"
|
||||
type="date"
|
||||
value-format="yyyy-MM-dd"
|
||||
placeholder="请选择申报结束日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目负责人" prop="projectLeader" label-width="140px">
|
||||
<el-input
|
||||
v-model="queryParams.projectLeader"
|
||||
placeholder="请输入项目负责人"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="项目预算(万)" prop="projectBudget" label-width="100px">
|
||||
<el-input
|
||||
v-model="queryParams.projectBudget"
|
||||
placeholder="请输入项目预算(万)"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目负责人联系电话" prop="projectLeaderPhone" label-width="140px">
|
||||
<el-input
|
||||
v-model="queryParams.projectLeaderPhone"
|
||||
placeholder="请输入联系电话"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="primary"
|
||||
plain
|
||||
icon="el-icon-plus"
|
||||
size="mini"
|
||||
@click="handleAdd"
|
||||
v-hasPermi="['scientific:application:add']"
|
||||
>项目填写</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="success"
|
||||
plain
|
||||
icon="el-icon-edit"
|
||||
size="mini"
|
||||
:disabled="single"
|
||||
@click="handleUpdate"
|
||||
v-hasPermi="['scientific:application:edit']"
|
||||
>修改</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="danger"
|
||||
plain
|
||||
icon="el-icon-delete"
|
||||
size="mini"
|
||||
:disabled="multiple"
|
||||
@click="handleDelete"
|
||||
v-hasPermi="['scientific:application:remove']"
|
||||
>删除</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="warning"
|
||||
plain
|
||||
icon="el-icon-download"
|
||||
size="mini"
|
||||
@click="handleExport"
|
||||
v-hasPermi="['scientific:application:export']"
|
||||
>导出</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="applicationList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="序号" type="index" width="50"></el-table-column>
|
||||
<!-- <el-table-column label="项目ID" align="center" prop="projectId" v-if="true" width="180"/> -->
|
||||
<el-table-column label="项目名称" align="center" :min-width="280">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium">{{ scope.row.projectName }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="项目负责人" align="center" prop="projectLeader" width="100"/>
|
||||
<el-table-column label="申报状态" align="center" width="100px" :min-width="100">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium" :type="getTagType(scope.row.projectDeclareStatus)">
|
||||
{{ formatProjectDeclareStatus(scope.row.projectDeclareStatus) }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="申报开始日期" align="center" prop="projectAppStTime" :min-width="140" width="140">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.projectAppStTime, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="申报结束日期" align="center" prop="projectAppEndTime" width="140">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.projectAppEndTime, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="项目预算(万)" align="center" prop="projectBudget" :min-width="180" width="180"/>
|
||||
<el-table-column label="负责人电话" align="center" prop="projectLeaderPhone" :min-width="150" width="150"/>
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" :min-width="240">
|
||||
<template slot-scope="scope" >
|
||||
<el-button
|
||||
size="mini"
|
||||
type="primary"
|
||||
icon="el-icon-top"
|
||||
@click="declareProject(scope.row)"
|
||||
v-hasPermi="['project:application:remove']"
|
||||
style="width: 80px"
|
||||
>提交申报</el-button>
|
||||
<el-button
|
||||
size="mini"
|
||||
type="success"
|
||||
icon="el-icon-edit"
|
||||
@click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['scientific:application:edit']"
|
||||
style="width: 80px"
|
||||
>信息修改</el-button>
|
||||
<el-button
|
||||
type="danger"
|
||||
icon="el-icon-delete"
|
||||
@click="handleDelete(scope.row)"
|
||||
size="mini"
|
||||
style="width: 80px"
|
||||
v-hasPermi="['scientific:application:remove']"
|
||||
>删除申报</el-button>
|
||||
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination
|
||||
v-show="total>0"
|
||||
:total="total"
|
||||
:page.sync="queryParams.pageNum"
|
||||
:limit.sync="queryParams.pageSize"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<!-- 添加或修改项目申报对话框, 采用open字段控制是否 -->
|
||||
<!-- 这是提交或者详细信息的表单显示框 -->
|
||||
<!-- 这个表单的名字为form:
|
||||
在form.projectName这种方式配置参数 -->
|
||||
<el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="150px" >
|
||||
<el-form-item label="项目名称" prop="projectName" >
|
||||
<el-input v-model="form.projectName" placeholder="请输入项目名称" :style="{ width: '400px' }"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目负责人" prop="projectLeader">
|
||||
<el-input v-model="form.projectLeader" placeholder="请输入项目负责人" :style="{ width: '100px'}"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="projectStatus" >
|
||||
<el-input v-model="form.projectStatus" placeholder="请输入状态" :style="{ width: '50px' }"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="申报开始日期" prop="projectAppStTime" >
|
||||
<el-date-picker clearable
|
||||
v-model="form.projectAppStTime"
|
||||
type="datetime"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
placeholder="请选择申报开始日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="申报结束日期" prop="projectAppEndTime">
|
||||
<el-date-picker clearable
|
||||
v-model="form.projectAppEndTime"
|
||||
type="datetime"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
placeholder="请选择申报结束日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目预算(万)" prop="projectBudget">
|
||||
<el-input v-model="form.projectBudget" placeholder="请输入项目预算(万)" :style="{ width: '100px'}"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目负责人电话" prop="projectLeaderPhone">
|
||||
<el-input v-model="form.projectLeaderPhone" placeholder="请输入项目负责人联系电话" :style="{ width: '140px'}" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listApplication, getApplication, delApplication, addApplication, updateApplication } from "@/api/scientific/application";
|
||||
import { listProcess} from "@/api/workflow/process";
|
||||
export default {
|
||||
name: "Application",
|
||||
data() {
|
||||
return {
|
||||
// 按钮loading
|
||||
buttonLoading: false,
|
||||
// 遮罩层
|
||||
loading: true,
|
||||
// 选中数组
|
||||
ids: [],
|
||||
// 非单个禁用
|
||||
single: true,
|
||||
// 非多个禁用
|
||||
multiple: true,
|
||||
// 显示搜索条件
|
||||
showSearch: true,
|
||||
// 总条数
|
||||
total: 0,
|
||||
// 项目申报表格数据
|
||||
applicationList: [],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
projectName: undefined,
|
||||
projectStatus: undefined,
|
||||
projectAppProcId: undefined,
|
||||
projectAppStaus: undefined,
|
||||
projectAppStTime: undefined,
|
||||
projectAppEndTime: undefined,
|
||||
projectLeader: undefined,
|
||||
projectBudget: undefined,
|
||||
projectLeaderPhone: undefined,
|
||||
},
|
||||
queryProcParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
processKey: undefined,
|
||||
processName: "项目预算追加表",
|
||||
category: "001"
|
||||
},
|
||||
queryDeclareProcParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
processKey: undefined,
|
||||
processName: "项目申报审核",
|
||||
category: "002"
|
||||
},
|
||||
// 表单参数
|
||||
form: {},
|
||||
// 表单校验
|
||||
rules: {
|
||||
projectId: [
|
||||
{ required: true, message: "项目ID不能为空", trigger: "blur" }
|
||||
],
|
||||
projectName: [
|
||||
{ required: true, message: "项目名称不能为空", trigger: "blur" }
|
||||
],
|
||||
projectStatus: [
|
||||
{ required: true, message: "状态不能为空", trigger: "blur" }
|
||||
],
|
||||
projectAppStTime: [
|
||||
{ required: true, message: "申报开始日期不能为空", trigger: "blur" }
|
||||
],
|
||||
projectAppEndTime: [
|
||||
{ required: true, message: "申报结束日期不能为空", trigger: "blur" }
|
||||
],
|
||||
projectLeader: [
|
||||
{ required: true, message: "项目负责人不能为空", trigger: "blur" }
|
||||
],
|
||||
projectBudget: [
|
||||
{ required: true, message: "项目预算(万)不能为空", trigger: "blur" }
|
||||
],
|
||||
projectLeaderPhone: [
|
||||
{ required: true, message: "项目负责人联系电话不能为空", trigger: "blur" }
|
||||
],
|
||||
}
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getList();
|
||||
},
|
||||
// logzhan : 当我们跳转到其他路由页面,例如预算变更的时候,再次回来时
|
||||
// 需要用这个函数刷新列表,否则列表将处于刷新状态不显示信息
|
||||
beforeRouteEnter(to, from, next) {
|
||||
next(vm => {
|
||||
vm.getList()
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
/** 查询项目申报列表 */
|
||||
getList() {
|
||||
this.loading = true;
|
||||
listApplication(this.queryParams).then(response => {
|
||||
this.applicationList = response.rows;
|
||||
this.total = response.total;
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
// 取消按钮
|
||||
cancel() {
|
||||
this.open = false;
|
||||
this.reset();
|
||||
},
|
||||
// 表单重置
|
||||
reset() {
|
||||
this.form = {
|
||||
projectId: undefined,
|
||||
projectName: undefined,
|
||||
projectStatus: undefined,
|
||||
projectAppProcId: undefined,
|
||||
projectAppStaus: undefined,
|
||||
projectAppStTime: undefined,
|
||||
projectAppEndTime: undefined,
|
||||
projectLeader: undefined,
|
||||
projectBudget: undefined,
|
||||
projectLeaderPhone: undefined
|
||||
};
|
||||
this.resetForm("form");
|
||||
},
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
this.queryParams.pageNum = 1;
|
||||
this.getList();
|
||||
},
|
||||
/** 重置按钮操作 */
|
||||
resetQuery() {
|
||||
this.resetForm("queryForm");
|
||||
this.handleQuery();
|
||||
},
|
||||
// 多选框选中数据
|
||||
handleSelectionChange(selection) {
|
||||
this.ids = selection.map(item => item.projectId)
|
||||
this.single = selection.length!==1
|
||||
this.multiple = !selection.length
|
||||
},
|
||||
/** 新增按钮操作 */
|
||||
handleAdd() {
|
||||
this.reset();
|
||||
this.open = true;
|
||||
this.title = "添加项目申报";
|
||||
},
|
||||
/** 修改按钮操作 */
|
||||
handleUpdate(row) {
|
||||
this.loading = true;
|
||||
this.reset();
|
||||
const projectId = row.projectId || this.ids
|
||||
getApplication(projectId).then(response => {
|
||||
this.loading = false;
|
||||
this.form = response.data;
|
||||
this.open = true;
|
||||
this.title = "修改项目申报";
|
||||
console.log(this.form)
|
||||
});
|
||||
},
|
||||
/**
|
||||
* 根据填写的项目信息进行申报
|
||||
*/
|
||||
declareProject(row){
|
||||
// 获取申报项目的Id
|
||||
const upProjectId = row.projectId || this.ids
|
||||
|
||||
// 查询项目申报流程
|
||||
listProcess(this.queryDeclareProcParams).then(response => {
|
||||
this.processParams = response.rows[0];
|
||||
this.deploymentId = this.processParams.deploymentId;
|
||||
this.definitionId = this.processParams.definitionId;
|
||||
// 流程名称暂时没有太大作用
|
||||
// this.processName = this.processParams.processName;
|
||||
this.$router.push({
|
||||
path: `/workflow/process/declare_details/${this.deploymentId}?definitionId=${this.definitionId}`,
|
||||
query: {
|
||||
projectId: upProjectId
|
||||
}
|
||||
});
|
||||
})
|
||||
},
|
||||
/** 修改按钮操作 */
|
||||
handleUpdateBudget(row) {
|
||||
this.loading = true;
|
||||
this.reset();
|
||||
const upProjectId = row.projectId || this.ids
|
||||
|
||||
// 查询项目经费追加流程
|
||||
listProcess(this.queryProcParams).then(response => {
|
||||
this.processParams = response.rows[0];
|
||||
this.deploymentId = this.processParams.deploymentId;
|
||||
this.definitionId = this.processParams.definitionId;
|
||||
// 流程名称暂时没有太大作用
|
||||
// this.processName = this.processParams.processName;
|
||||
this.$router.push({
|
||||
path: `/workflow/process/proj_update/${this.deploymentId}?definitionId=${this.definitionId}`,
|
||||
query: {
|
||||
projectId: upProjectId
|
||||
}
|
||||
});
|
||||
})
|
||||
},
|
||||
|
||||
/** 提交按钮 */
|
||||
submitForm() {
|
||||
// $refs["form"].validate(valid => 验证表单是否有效
|
||||
this.$refs["form"].validate(valid => {
|
||||
if (valid) {
|
||||
this.buttonLoading = true;
|
||||
// 判断是修改还是新增
|
||||
if (this.form.projectId != null) {
|
||||
console.log(this.form)
|
||||
updateApplication(this.form).then(response => {
|
||||
this.$modal.msgSuccess("修改成功");
|
||||
this.open = false;
|
||||
// 提交成功后刷新列表
|
||||
this.getList();
|
||||
}).finally(() => {
|
||||
this.buttonLoading = false;
|
||||
});
|
||||
} else {
|
||||
|
||||
addApplication(this.form).then(response => {
|
||||
this.$modal.msgSuccess("新增成功");
|
||||
this.open = false;
|
||||
this.getList();
|
||||
}).finally(() => {
|
||||
this.buttonLoading = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
/** 删除按钮操作 */
|
||||
handleDelete(row) {
|
||||
const projectIds = row.projectId || this.ids;
|
||||
this.$modal.confirm('是否确认删除项目申报编号为"' + projectIds + '"的数据项?').then(() => {
|
||||
this.loading = true;
|
||||
return delApplication(projectIds);
|
||||
}).then(() => {
|
||||
this.loading = false;
|
||||
this.getList();
|
||||
this.$modal.msgSuccess("删除成功");
|
||||
}).catch(() => {
|
||||
}).finally(() => {
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
/** 导出按钮操作 */
|
||||
handleExport() {
|
||||
this.download('scientific/application/export', {
|
||||
...this.queryParams
|
||||
}, `application_${new Date().getTime()}.xlsx`)
|
||||
},
|
||||
/**
|
||||
* 把项目状态的code转换未文字: 0 : 未立项 1: 审核中 2: 已立项
|
||||
* @param {number|string} cellValue - 原始数值
|
||||
* @returns {string} 转换后的字符串
|
||||
* @author zhanli
|
||||
*/
|
||||
formatProjectAppStatus(cellValue) {
|
||||
switch (cellValue) {
|
||||
case '0':
|
||||
return "未立项";
|
||||
case '1':
|
||||
return "审核中";
|
||||
case '2':
|
||||
return "已立项";
|
||||
default:
|
||||
return "未知状态";
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 把项目状态的申报code转换为文字: 0 : 未申报 1: 审核中 2: 已申报
|
||||
* @param {number|string} cellValue - 原始数值
|
||||
* @returns {string} 转换后的字符串
|
||||
* @author zhanli
|
||||
*/
|
||||
formatProjectDeclareStatus(cellValue) {
|
||||
switch (cellValue) {
|
||||
case '0':
|
||||
return "未审核";
|
||||
case '1':
|
||||
return "审核中";
|
||||
case '2':
|
||||
return "审核失败";
|
||||
case '3':
|
||||
return "审核通过";
|
||||
default:
|
||||
return "未知状态";
|
||||
}
|
||||
},
|
||||
getTagType(status) {
|
||||
switch (status) {
|
||||
case '2':
|
||||
// 显示绿色 审核通过绿色
|
||||
return 'success';
|
||||
case '1':
|
||||
// 审核中 显示黄色
|
||||
return 'warning';
|
||||
case '0':
|
||||
// 未申报, 灰色
|
||||
return 'primary';
|
||||
case '4':
|
||||
// 其他状态 灰色
|
||||
return 'info';
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
|
@ -73,8 +73,8 @@
|
|||
icon="el-icon-plus"
|
||||
size="mini"
|
||||
@click="handleAdd"
|
||||
v-hasPermi="['project:application:add']"
|
||||
>新增</el-button>
|
||||
v-hasPermi="['scientific:application:add']"
|
||||
>项目填写</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
|
@ -84,7 +84,7 @@
|
|||
size="mini"
|
||||
:disabled="single"
|
||||
@click="handleUpdate"
|
||||
v-hasPermi="['project:application:edit']"
|
||||
v-hasPermi="['scientific:application:edit']"
|
||||
>修改</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
|
@ -95,7 +95,7 @@
|
|||
size="mini"
|
||||
:disabled="multiple"
|
||||
@click="handleDelete"
|
||||
v-hasPermi="['project:application:remove']"
|
||||
v-hasPermi="['scientific:application:remove']"
|
||||
>删除</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
|
@ -105,7 +105,7 @@
|
|||
icon="el-icon-download"
|
||||
size="mini"
|
||||
@click="handleExport"
|
||||
v-hasPermi="['project:application:export']"
|
||||
v-hasPermi="['scientific:application:export']"
|
||||
>导出</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
|
@ -113,9 +113,22 @@
|
|||
|
||||
<el-table v-loading="loading" :data="applicationList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="项目ID" align="center" prop="projectId" v-if="true" width="180"/>
|
||||
<el-table-column label="项目名称" align="center" prop="projectName" :min-width="280"/>
|
||||
<el-table-column label="状态" align="center" prop="projectStatus" width="60"/>
|
||||
<el-table-column label="序号" type="index" width="50"></el-table-column>
|
||||
<!-- <el-table-column label="项目ID" align="center" prop="projectId" v-if="true" width="180"/> -->
|
||||
<el-table-column label="项目名称" align="center" :min-width="280">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium">{{ scope.row.projectName }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="项目负责人" align="center" prop="projectLeader" width="100"/>
|
||||
|
||||
<el-table-column label="立项状态" align="center" width="100px" :min-width="100">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium">{{ formatProjectAppStatus(scope.row.projectAppStaus) }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="申报开始日期" align="center" prop="projectAppStTime" :min-width="140" width="140">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.projectAppStTime, '{y}-{m}-{d}') }}</span>
|
||||
|
@ -126,33 +139,25 @@
|
|||
<span>{{ parseTime(scope.row.projectAppEndTime, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="项目负责人" align="center" prop="projectLeader" width="100"/>
|
||||
|
||||
<el-table-column label="项目预算(万)" align="center" prop="projectBudget" :min-width="180" width="180"/>
|
||||
<el-table-column label="项目负责人联系电话" align="center" prop="projectLeaderPhone" :min-width="220" width="220"/>
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" :min-width="180" width="180">
|
||||
<el-table-column label="负责人电话" align="center" prop="projectLeaderPhone" :min-width="150" width="150"/>
|
||||
<el-table-column label="操作" align="center" :min-width="280" width="280">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-edit"
|
||||
@click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['project:application:edit']"
|
||||
>修改</el-button>
|
||||
<el-button
|
||||
@click="handleUpdateBudget(scope.row)"
|
||||
v-hasPermi="['scientific:application:edit']"
|
||||
>预算追加</el-button>
|
||||
<!-- <el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-delete"
|
||||
@click="handleDelete(scope.row)"
|
||||
v-hasPermi="['project:application:remove']"
|
||||
>删除</el-button>
|
||||
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-video-play"
|
||||
@click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['project:application:remove']"
|
||||
>申报</el-button>
|
||||
v-hasPermi="['scientific:application:remove']"
|
||||
>删除</el-button> -->
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
@ -165,12 +170,18 @@
|
|||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<!-- 添加或修改项目申报对话框 -->
|
||||
<!-- 添加或修改项目申报对话框, 采用open字段控制是否 -->
|
||||
<!-- 这是提交或者详细信息的表单显示框 -->
|
||||
<!-- 这个表单的名字为form:
|
||||
在form.projectName这种方式配置参数 -->
|
||||
<el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="150px" >
|
||||
<el-form-item label="项目名称" prop="projectName" >
|
||||
<el-input v-model="form.projectName" placeholder="请输入项目名称" :style="{ width: '400px' }"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目负责人" prop="projectLeader">
|
||||
<el-input v-model="form.projectLeader" placeholder="请输入项目负责人" :style="{ width: '100px'}"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="projectStatus" >
|
||||
<el-input v-model="form.projectStatus" placeholder="请输入状态" :style="{ width: '50px' }"/>
|
||||
</el-form-item>
|
||||
|
@ -190,9 +201,6 @@
|
|||
placeholder="请选择申报结束日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目负责人" prop="projectLeader">
|
||||
<el-input v-model="form.projectLeader" placeholder="请输入项目负责人" :style="{ width: '100px'}"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目预算(万)" prop="projectBudget">
|
||||
<el-input v-model="form.projectBudget" placeholder="请输入项目预算(万)" :style="{ width: '100px'}"/>
|
||||
</el-form-item>
|
||||
|
@ -209,8 +217,8 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import { listApplication, getApplication, delApplication, addApplication, updateApplication } from "@/api/project/application";
|
||||
|
||||
import { listApplication, getApplication, delApplication, addApplication, updateApplication } from "@/api/scientific/application";
|
||||
import { listProcess} from "@/api/workflow/process";
|
||||
export default {
|
||||
name: "Application",
|
||||
data() {
|
||||
|
@ -241,11 +249,20 @@ export default {
|
|||
pageSize: 10,
|
||||
projectName: undefined,
|
||||
projectStatus: undefined,
|
||||
projectAppProcId: undefined,
|
||||
projectAppStaus: undefined,
|
||||
projectAppStTime: undefined,
|
||||
projectAppEndTime: undefined,
|
||||
projectLeader: undefined,
|
||||
projectBudget: undefined,
|
||||
projectLeaderPhone: undefined
|
||||
projectLeaderPhone: undefined,
|
||||
},
|
||||
queryProcParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
processKey: undefined,
|
||||
processName: "项目预算追加表",
|
||||
category: "001"
|
||||
},
|
||||
// 表单参数
|
||||
form: {},
|
||||
|
@ -274,19 +291,26 @@ export default {
|
|||
],
|
||||
projectLeaderPhone: [
|
||||
{ required: true, message: "项目负责人联系电话不能为空", trigger: "blur" }
|
||||
]
|
||||
],
|
||||
}
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getList();
|
||||
},
|
||||
// logzhan : 当我们跳转到其他路由页面,例如预算变更的时候,再次回来时
|
||||
// 需要用这个函数刷新列表,否则列表将处于刷新状态不显示信息
|
||||
beforeRouteEnter(to, from, next) {
|
||||
next(vm => {
|
||||
vm.getList()
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
/** 查询项目申报列表 */
|
||||
getList() {
|
||||
this.loading = true;
|
||||
listApplication(this.queryParams).then(response => {
|
||||
this.applicationList = response.rows;
|
||||
this.applicationList = response.rows.filter(item => item.projectAppStaus === '3')
|
||||
this.total = response.total;
|
||||
this.loading = false;
|
||||
});
|
||||
|
@ -302,6 +326,8 @@ export default {
|
|||
projectId: undefined,
|
||||
projectName: undefined,
|
||||
projectStatus: undefined,
|
||||
projectAppProcId: undefined,
|
||||
projectAppStaus: undefined,
|
||||
projectAppStTime: undefined,
|
||||
projectAppEndTime: undefined,
|
||||
projectLeader: undefined,
|
||||
|
@ -342,22 +368,64 @@ export default {
|
|||
this.form = response.data;
|
||||
this.open = true;
|
||||
this.title = "修改项目申报";
|
||||
console.log(this.form)
|
||||
});
|
||||
},
|
||||
/**
|
||||
* 根据填写的项目信息进行申报
|
||||
*/
|
||||
declareProject(row){
|
||||
|
||||
},
|
||||
/** 修改按钮操作 */
|
||||
handleUpdateBudget(row) {
|
||||
this.loading = true;
|
||||
this.reset();
|
||||
const upProjectId = row.projectId || this.ids
|
||||
|
||||
// 注释参考代码:用于后续代码修改的参考
|
||||
// getApplication(projectId).then(response => {
|
||||
// this.loading = false;
|
||||
// this.form = response.data;
|
||||
// this.open = true;
|
||||
// this.title = "修改项目申报";
|
||||
// });
|
||||
|
||||
// 查询项目经费追加流程
|
||||
listProcess(this.queryProcParams).then(response => {
|
||||
this.processParams = response.rows[0];
|
||||
this.deploymentId = this.processParams.deploymentId;
|
||||
this.definitionId = this.processParams.definitionId;
|
||||
// 流程名称暂时没有太大作用
|
||||
// this.processName = this.processParams.processName;
|
||||
this.$router.push({
|
||||
path: `/workflow/process/proj_update/${this.deploymentId}?definitionId=${this.definitionId}`,
|
||||
query: {
|
||||
projectId: upProjectId
|
||||
}
|
||||
});
|
||||
})
|
||||
},
|
||||
|
||||
/** 提交按钮 */
|
||||
submitForm() {
|
||||
// $refs["form"].validate(valid => 验证表单是否有效
|
||||
this.$refs["form"].validate(valid => {
|
||||
if (valid) {
|
||||
this.buttonLoading = true;
|
||||
// 判断是修改还是新增
|
||||
if (this.form.projectId != null) {
|
||||
console.log(this.form)
|
||||
updateApplication(this.form).then(response => {
|
||||
this.$modal.msgSuccess("修改成功");
|
||||
this.open = false;
|
||||
// 提交成功后刷新列表
|
||||
this.getList();
|
||||
}).finally(() => {
|
||||
this.buttonLoading = false;
|
||||
});
|
||||
} else {
|
||||
|
||||
addApplication(this.form).then(response => {
|
||||
this.$modal.msgSuccess("新增成功");
|
||||
this.open = false;
|
||||
|
@ -386,9 +454,49 @@ export default {
|
|||
},
|
||||
/** 导出按钮操作 */
|
||||
handleExport() {
|
||||
this.download('project/application/export', {
|
||||
this.download('scientific/application/export', {
|
||||
...this.queryParams
|
||||
}, `application_${new Date().getTime()}.xlsx`)
|
||||
},
|
||||
/**
|
||||
* 把项目状态的code转换未文字: 0 : 未立项 1: 审核中 2: 已立项
|
||||
* @param {number|string} cellValue - 原始数值
|
||||
* @returns {string} 转换后的字符串
|
||||
* @author zhanli
|
||||
*/
|
||||
formatProjectDeclareStatus(cellValue) {
|
||||
switch (cellValue) {
|
||||
case '0':
|
||||
return "草稿";
|
||||
case '1':
|
||||
return "未申报";
|
||||
case '2':
|
||||
return "申报中";
|
||||
case '3':
|
||||
return "已申报";
|
||||
default:
|
||||
return "未知状态";
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 把项目状态的申报code转换为文字: 0 : 未申报 1: 审核中 2: 已申报
|
||||
* @param {number|string} cellValue - 原始数值
|
||||
* @returns {string} 转换后的字符串
|
||||
* @author zhanli
|
||||
*/
|
||||
formatProjectAppStatus(cellValue) {
|
||||
switch (cellValue) {
|
||||
case '0':
|
||||
return "草稿";
|
||||
case '1':
|
||||
return "未立项";
|
||||
case '2':
|
||||
return "立项中";
|
||||
case '3':
|
||||
return "已立项";
|
||||
default:
|
||||
return "未知状态";
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -0,0 +1,151 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-card class="box-card">
|
||||
<div slot="header" class="clearfix">
|
||||
<span>合作单位录入</span>
|
||||
</div>
|
||||
|
||||
<el-col :span="18" :offset="3">
|
||||
<div class="form-conf" v-if="formOpen">
|
||||
<parser :key="new Date().getTime()" :form-conf="formData" @submit="submit" ref="parser" @getData="getData"/>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listProcess, startProcess_ } from '@/api/workflow/process'
|
||||
import { listAllCategory } from '@/api/workflow/category'
|
||||
import { getProcessForm, startProcess } from '@/api/workflow/process'
|
||||
import Parser from '@/utils/generator/parser'
|
||||
import {findLatestDeploymentTimeIndex } from '@/api/scientific/project_application_plan'
|
||||
import { addHandbook } from '@/api/scientific/handbook'
|
||||
import {addDepartment} from "@/api/scientific/department";
|
||||
|
||||
export default {
|
||||
name: 'departmentApply',
|
||||
components: {
|
||||
Parser
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
definitionId: null,
|
||||
deployId: null,
|
||||
procInsId: null,
|
||||
formOpen: false,
|
||||
formData: {},
|
||||
|
||||
processName: '',
|
||||
categoryOptions: [],
|
||||
// 流程定义表格数据
|
||||
processParams: null,
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
processKey: undefined,
|
||||
processName: "",
|
||||
category: "008"
|
||||
},
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.initData();
|
||||
},
|
||||
methods: {
|
||||
initData() {
|
||||
/** 查询流程定义列表 */
|
||||
listProcess(this.queryParams).then(response => {
|
||||
findLatestDeploymentTimeIndex(response).then((latestIndex) => {
|
||||
this.processParams = response.rows[latestIndex];
|
||||
this.processName = this.processParams.processName;
|
||||
this.definitionId = this.processParams.definitionId;
|
||||
getProcessForm({
|
||||
definitionId: this.processParams.definitionId,
|
||||
deployId: this.processParams.deploymentId,
|
||||
procInsId: undefined
|
||||
}).then(res => {
|
||||
if (res.data) {
|
||||
this.formData = res.data;
|
||||
this.formOpen = true;
|
||||
}
|
||||
})
|
||||
});
|
||||
})
|
||||
},
|
||||
|
||||
/** 接收子组件传的值 */
|
||||
getData(data) {
|
||||
if (data) {
|
||||
const variables = [];
|
||||
data.fields.forEach(item => {
|
||||
let variableData = {};
|
||||
variableData.label = item.__config__.label
|
||||
// 表单值为多个选项时
|
||||
if (item.__config__.defaultValue instanceof Array) {
|
||||
const array = [];
|
||||
item.__config__.defaultValue.forEach(val => {
|
||||
array.push(val)
|
||||
})
|
||||
variableData.val = array;
|
||||
} else {
|
||||
variableData.val = item.__config__.defaultValue
|
||||
}
|
||||
variables.push(variableData)
|
||||
})
|
||||
this.variables = variables;
|
||||
}
|
||||
},
|
||||
submit(data) {
|
||||
if (data && this.definitionId) {
|
||||
console.log(data.valData)
|
||||
// 启动流程并将表单数据加入流程变量
|
||||
startProcess_(this.definitionId, JSON.stringify(data.valData)).then(res => {
|
||||
if (res.code !== 200) {
|
||||
this.$modal.msgError("操作失败");
|
||||
return;
|
||||
}
|
||||
let departmentData = data.valData;
|
||||
departmentData.departmentProcId = res.msg;
|
||||
// zqjia:默认刚录入指南时状态为审核中,但后端会改为未审核
|
||||
departmentData.departmentStatus = 1;
|
||||
|
||||
// zqjia:解析handbookFile,不然无法存到数据库中
|
||||
const files = departmentData.departmentFile;
|
||||
|
||||
if (files !== null && files !== undefined) {
|
||||
let formatedFiles = {};
|
||||
files.forEach(file => {
|
||||
if(file.response.code === 200 && file.ossId) {
|
||||
formatedFiles[file.name] = file.ossId;
|
||||
}
|
||||
})
|
||||
departmentData.departmentFile = JSON.stringify(formatedFiles);
|
||||
}
|
||||
|
||||
addDepartment(JSON.stringify(departmentData)).then(resp => {
|
||||
if (res.code !== 200) {
|
||||
this.$modal.msgError("操作失败");
|
||||
return;
|
||||
}
|
||||
this.$modal.msgSuccess(resp.msg);
|
||||
this.$tab.closeOpenPage({
|
||||
path: '/scientific/department/list'
|
||||
})
|
||||
});
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.form-conf {
|
||||
margin: 15px auto;
|
||||
width: 80%;
|
||||
padding: 15px;
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,476 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-tabs tab-position="top" :value="processed === true ? 'approval' : 'form'">
|
||||
|
||||
|
||||
<el-tab-pane label="表单信息" name="form">
|
||||
<div v-if="formOpen">
|
||||
<el-card class="box-card" shadow="never" v-for="(formInfo, index) in processFormList" :key="index">
|
||||
<div slot="header" class="clearfix">
|
||||
<!-- <span>{{ formInfo.title }}</span>-->
|
||||
<span> 合作单位详情 </span>
|
||||
</div>
|
||||
|
||||
<!--流程处理表单模块-->
|
||||
<el-col :span="20" :offset="2">
|
||||
<parser :form-conf="formInfo"/>
|
||||
</el-col>
|
||||
</el-card>
|
||||
</div>
|
||||
</el-tab-pane >
|
||||
|
||||
</el-tabs>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { detailProcess } from '@/api/workflow/process'
|
||||
import Parser from '@/utils/generator/parser'
|
||||
import { complete, delegate, transfer, rejectTask, returnList, returnTask } from '@/api/workflow/task'
|
||||
import { selectUser, deptTreeSelect } from '@/api/system/user'
|
||||
import ProcessViewer from '@/components/ProcessViewer'
|
||||
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
|
||||
import Treeselect from '@riophae/vue-treeselect'
|
||||
|
||||
export default {
|
||||
name: "WorkDetail",
|
||||
components: {
|
||||
ProcessViewer,
|
||||
Parser,
|
||||
Treeselect
|
||||
},
|
||||
props: {},
|
||||
computed: {
|
||||
commentType() {
|
||||
return val => {
|
||||
switch (val) {
|
||||
case '1': return '通过'
|
||||
case '2': return '退回'
|
||||
case '3': return '驳回'
|
||||
case '4': return '委派'
|
||||
case '5': return '转办'
|
||||
case '6': return '终止'
|
||||
case '7': return '撤回'
|
||||
}
|
||||
}
|
||||
},
|
||||
approveTypeTag() {
|
||||
return val => {
|
||||
switch (val) {
|
||||
case '1': return 'success'
|
||||
case '2': return 'warning'
|
||||
case '3': return 'danger'
|
||||
case '4': return 'primary'
|
||||
case '5': return 'success'
|
||||
case '6': return 'danger'
|
||||
case '7': return 'info'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
height: document.documentElement.clientHeight - 205 + 'px;',
|
||||
// 模型xml数据
|
||||
loadIndex: 0,
|
||||
xmlData: undefined,
|
||||
finishedInfo: {
|
||||
finishedSequenceFlowSet: [],
|
||||
finishedTaskSet: [],
|
||||
unfinishedTaskSet: [],
|
||||
rejectedTaskSet: []
|
||||
},
|
||||
historyProcNodeList: [],
|
||||
// 部门名称
|
||||
deptName: undefined,
|
||||
// 部门树选项
|
||||
deptOptions: undefined,
|
||||
userLoading: false,
|
||||
// 用户表格数据
|
||||
userList: null,
|
||||
deptProps: {
|
||||
children: "children",
|
||||
label: "label"
|
||||
},
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
deptId: undefined
|
||||
},
|
||||
total: 0,
|
||||
// 遮罩层
|
||||
loading: true,
|
||||
taskForm:{
|
||||
comment:"", // 意见内容
|
||||
procInsId: "", // 流程实例编号
|
||||
taskId: "" ,// 流程任务编号
|
||||
copyUserIds: "", // 抄送人Id
|
||||
vars: "",
|
||||
targetKey:""
|
||||
},
|
||||
rules: {
|
||||
comment: [{ required: true, message: '请输入审批意见', trigger: 'blur' }],
|
||||
},
|
||||
currentUserId: null,
|
||||
variables: [], // 流程变量数据
|
||||
taskFormOpen: false,
|
||||
taskFormData: {}, // 流程变量数据
|
||||
processFormList: [], // 流程变量数据
|
||||
formOpen: false, // 是否加载流程变量数据
|
||||
returnTaskList: [], // 回退列表数据
|
||||
processed: false,
|
||||
returnTitle: null,
|
||||
returnOpen: false,
|
||||
rejectOpen: false,
|
||||
rejectTitle: null,
|
||||
userData: {
|
||||
title: '',
|
||||
type: '',
|
||||
open: false,
|
||||
},
|
||||
copyUser: [],
|
||||
nextUser: [],
|
||||
userMultipleSelection: [],
|
||||
userDialogTitle: '',
|
||||
userOpen: false
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.initData();
|
||||
},
|
||||
methods: {
|
||||
initData() {
|
||||
this.taskForm.procInsId = this.$route.params && this.$route.params.departmentProcId;
|
||||
this.taskForm.taskId = this.$route.query && this.$route.query.taskId;
|
||||
this.processed = this.$route.query && eval(this.$route.query.processed || false);
|
||||
|
||||
// 流程任务重获取变量表单
|
||||
this.getProcessDetails(this.taskForm.procInsId, this.taskForm.taskId);
|
||||
this.loadIndex = this.taskForm.procInsId;
|
||||
},
|
||||
/** 查询部门下拉树结构 */
|
||||
getTreeSelect() {
|
||||
deptTreeSelect().then(response => {
|
||||
this.deptOptions = response.data;
|
||||
});
|
||||
},
|
||||
/** 查询用户列表 */
|
||||
getList() {
|
||||
this.userLoading = true;
|
||||
selectUser(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
|
||||
this.userList = response.rows;
|
||||
this.total = response.total;
|
||||
this.toggleSelection(this.userMultipleSelection);
|
||||
this.userLoading = false;
|
||||
});
|
||||
},
|
||||
// 筛选节点
|
||||
filterNode(value, data) {
|
||||
if (!value) return true;
|
||||
return data.label.indexOf(value) !== -1;
|
||||
},
|
||||
// 节点单击事件
|
||||
handleNodeClick(data) {
|
||||
this.queryParams.deptId = data.id;
|
||||
this.getList();
|
||||
},
|
||||
setIcon(val) {
|
||||
if (val) {
|
||||
return "el-icon-check";
|
||||
} else {
|
||||
return "el-icon-time";
|
||||
}
|
||||
},
|
||||
setColor(val) {
|
||||
if (val) {
|
||||
return "#2bc418";
|
||||
} else {
|
||||
return "#b3bdbb";
|
||||
}
|
||||
},
|
||||
// 多选框选中数据
|
||||
handleSelectionChange(selection) {
|
||||
this.userMultipleSelection = selection
|
||||
},
|
||||
toggleSelection(selection) {
|
||||
if (selection && selection.length > 0) {
|
||||
this.$nextTick(()=> {
|
||||
selection.forEach(item => {
|
||||
let row = this.userList.find(k => k.userId === item.userId);
|
||||
this.$refs.userTable.toggleRowSelection(row);
|
||||
})
|
||||
})
|
||||
} else {
|
||||
this.$nextTick(() => {
|
||||
this.$refs.userTable.clearSelection();
|
||||
});
|
||||
}
|
||||
},
|
||||
// 关闭标签
|
||||
handleClose(type, tag) {
|
||||
let userObj = this.userMultipleSelection.find(item => item.userId === tag.id);
|
||||
this.userMultipleSelection.splice(this.userMultipleSelection.indexOf(userObj), 1);
|
||||
if (type === 'copy') {
|
||||
this.copyUser = this.userMultipleSelection;
|
||||
// 设置抄送人ID
|
||||
if (this.copyUser && this.copyUser.length > 0) {
|
||||
const val = this.copyUser.map(item => item.id);
|
||||
this.taskForm.copyUserIds = val instanceof Array ? val.join(',') : val;
|
||||
} else {
|
||||
this.taskForm.copyUserIds = '';
|
||||
}
|
||||
} else if (type === 'next') {
|
||||
this.nextUser = this.userMultipleSelection;
|
||||
// 设置抄送人ID
|
||||
if (this.nextUser && this.nextUser.length > 0) {
|
||||
const val = this.nextUser.map(item => item.id);
|
||||
this.taskForm.nextUserIds = val instanceof Array ? val.join(',') : val;
|
||||
} else {
|
||||
this.taskForm.nextUserIds = '';
|
||||
}
|
||||
}
|
||||
},
|
||||
/** 流程变量赋值 */
|
||||
handleCheckChange(val) {
|
||||
if (val instanceof Array) {
|
||||
this.taskForm.values = {
|
||||
"approval": val.join(',')
|
||||
}
|
||||
} else {
|
||||
this.taskForm.values = {
|
||||
"approval": val
|
||||
}
|
||||
}
|
||||
},
|
||||
getProcessDetails(procInsId, taskId) {
|
||||
const params = {procInsId: procInsId, taskId: taskId}
|
||||
detailProcess(params).then(res => {
|
||||
const data = res.data;
|
||||
this.xmlData = data.bpmnXml;
|
||||
this.processFormList = data.processFormList;
|
||||
this.taskFormOpen = data.existTaskForm;
|
||||
if (this.taskFormOpen) {
|
||||
this.taskFormData = data.taskFormData;
|
||||
}
|
||||
this.historyProcNodeList = data.historyProcNodeList;
|
||||
this.finishedInfo = data.flowViewer;
|
||||
this.formOpen = true;
|
||||
})
|
||||
},
|
||||
onSelectCopyUsers() {
|
||||
this.userMultipleSelection = this.copyUser;
|
||||
this.onSelectUsers('添加抄送人', 'copy')
|
||||
},
|
||||
onSelectNextUsers() {
|
||||
this.userMultipleSelection = this.nextUser;
|
||||
this.onSelectUsers('指定审批人', 'next')
|
||||
},
|
||||
onSelectUsers(title, type) {
|
||||
this.userData.title = title;
|
||||
this.userData.type = type;
|
||||
this.getTreeSelect();
|
||||
this.getList()
|
||||
this.userData.open = true;
|
||||
},
|
||||
/** 通过任务 */
|
||||
handleComplete() {
|
||||
// 校验表单
|
||||
const taskFormRef = this.$refs.taskFormParser;
|
||||
const isExistTaskForm = taskFormRef !== undefined;
|
||||
// 若无任务表单,则 taskFormPromise 为 true,即不需要校验
|
||||
const taskFormPromise = !isExistTaskForm ? true : new Promise((resolve, reject) => {
|
||||
taskFormRef.$refs[taskFormRef.formConfCopy.formRef].validate(valid => {
|
||||
valid ? resolve() : reject()
|
||||
})
|
||||
});
|
||||
const approvalPromise = new Promise((resolve, reject) => {
|
||||
this.$refs['taskForm'].validate(valid => {
|
||||
valid ? resolve() : reject()
|
||||
})
|
||||
});
|
||||
Promise.all([taskFormPromise, approvalPromise]).then(() => {
|
||||
if (isExistTaskForm) {
|
||||
this.taskForm.variables = taskFormRef[taskFormRef.formConfCopy.formModel]
|
||||
}
|
||||
complete(this.taskForm).then(response => {
|
||||
this.$modal.msgSuccess(response.msg);
|
||||
this.goBack();
|
||||
});
|
||||
})
|
||||
},
|
||||
/** 委派任务 */
|
||||
handleDelegate() {
|
||||
this.$refs["taskForm"].validate(valid => {
|
||||
if (valid) {
|
||||
this.userData.type = 'delegate';
|
||||
this.userData.title = '委派任务'
|
||||
this.userData.open = true;
|
||||
this.getTreeSelect();
|
||||
}
|
||||
})
|
||||
},
|
||||
/** 转办任务 */
|
||||
handleTransfer(){
|
||||
this.$refs["taskForm"].validate(valid => {
|
||||
if (valid) {
|
||||
this.userData.type = 'transfer';
|
||||
this.userData.title = '转办任务';
|
||||
this.userData.open = true;
|
||||
this.getTreeSelect();
|
||||
}
|
||||
})
|
||||
},
|
||||
/** 拒绝任务 */
|
||||
handleReject() {
|
||||
this.$refs["taskForm"].validate(valid => {
|
||||
if (valid) {
|
||||
const _this = this;
|
||||
this.$modal.confirm('拒绝审批单流程会终止,是否继续?').then(function() {
|
||||
return rejectTask(_this.taskForm);
|
||||
}).then(res => {
|
||||
this.$modal.msgSuccess(res.msg);
|
||||
this.goBack();
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
changeCurrentUser(val) {
|
||||
this.currentUserId = val.userId
|
||||
},
|
||||
/** 返回页面 */
|
||||
goBack() {
|
||||
// 关闭当前标签页并返回上个页面
|
||||
this.$tab.closePage(this.$route)
|
||||
this.$router.back()
|
||||
},
|
||||
/** 接收子组件传的值 */
|
||||
getData(data) {
|
||||
if (data) {
|
||||
const variables = [];
|
||||
data.fields.forEach(item => {
|
||||
let variableData = {};
|
||||
variableData.label = item.__config__.label
|
||||
// 表单值为多个选项时
|
||||
if (item.__config__.defaultValue instanceof Array) {
|
||||
const array = [];
|
||||
item.__config__.defaultValue.forEach(val => {
|
||||
array.push(val)
|
||||
})
|
||||
variableData.val = array;
|
||||
} else {
|
||||
variableData.val = item.__config__.defaultValue
|
||||
}
|
||||
variables.push(variableData)
|
||||
})
|
||||
this.variables = variables;
|
||||
}
|
||||
},
|
||||
submitUserData() {
|
||||
let type = this.userData.type;
|
||||
if (type === 'copy' || type === 'next') {
|
||||
if (!this.userMultipleSelection || this.userMultipleSelection.length <= 0) {
|
||||
this.$modal.msgError("请选择用户");
|
||||
return false;
|
||||
}
|
||||
let userIds = this.userMultipleSelection.map(k => k.userId);
|
||||
if (type === 'copy') {
|
||||
// 设置抄送人ID信息
|
||||
this.copyUser = this.userMultipleSelection;
|
||||
this.taskForm.copyUserIds = userIds instanceof Array ? userIds.join(',') : userIds;
|
||||
} else if (type === 'next') {
|
||||
// 设置下一级审批人ID信息
|
||||
this.nextUser = this.userMultipleSelection;
|
||||
this.taskForm.nextUserIds = userIds instanceof Array ? userIds.join(',') : userIds;
|
||||
}
|
||||
this.userData.open = false;
|
||||
} else {
|
||||
if (!this.taskForm.comment) {
|
||||
this.$modal.msgError("请输入审批意见");
|
||||
return false;
|
||||
}
|
||||
if (!this.currentUserId) {
|
||||
this.$modal.msgError("请选择用户");
|
||||
return false;
|
||||
}
|
||||
this.taskForm.userId = this.currentUserId;
|
||||
if (type === 'delegate') {
|
||||
delegate(this.taskForm).then(res => {
|
||||
this.$modal.msgSuccess(res.msg);
|
||||
this.goBack();
|
||||
});
|
||||
}
|
||||
if (type === 'transfer') {
|
||||
transfer(this.taskForm).then(res => {
|
||||
this.$modal.msgSuccess(res.msg);
|
||||
this.goBack();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
/** 可退回任务列表 */
|
||||
handleReturn() {
|
||||
this.$refs['taskForm'].validate(valid => {
|
||||
if (valid) {
|
||||
this.returnTitle = "退回流程";
|
||||
returnList(this.taskForm).then(res => {
|
||||
this.returnTaskList = res.data;
|
||||
this.taskForm.values = null;
|
||||
this.returnOpen = true;
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
},
|
||||
/** 提交退回任务 */
|
||||
submitReturn() {
|
||||
this.$refs["taskForm"].validate(valid => {
|
||||
if (valid) {
|
||||
if (!this.taskForm.targetKey) {
|
||||
this.$modal.msgError("请选择退回节点!");
|
||||
}
|
||||
returnTask(this.taskForm).then(res => {
|
||||
this.$modal.msgSuccess(res.msg);
|
||||
this.goBack()
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.clearfix:before,
|
||||
.clearfix:after {
|
||||
display: table;
|
||||
content: "";
|
||||
}
|
||||
.clearfix:after {
|
||||
clear: both
|
||||
}
|
||||
|
||||
.box-card {
|
||||
width: 100%;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.el-tag + .el-tag {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.el-row {
|
||||
margin-bottom: 20px;
|
||||
&:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
.el-col {
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.button-new-tag {
|
||||
margin-left: 10px;
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,377 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||
|
||||
<el-form-item label="单位名称" prop="departmentName">
|
||||
<el-input
|
||||
v-model="queryParams.departmentName"
|
||||
placeholder="请输入单位名称"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="单位性质" prop="departmentCategory">
|
||||
<el-input
|
||||
v-model="queryParams.departmentCategory"
|
||||
placeholder="请输入单位性质"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="联系人" prop="departmentPerson">
|
||||
<el-input
|
||||
v-model="queryParams.departmentPerson"
|
||||
placeholder="请输入单位联系人姓名"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="primary"
|
||||
plain
|
||||
icon="el-icon-plus"
|
||||
size="mini"
|
||||
@click="handleAdd"
|
||||
v-hasPermi="['scientific:department:add']"
|
||||
>新增</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="success"
|
||||
plain
|
||||
icon="el-icon-edit"
|
||||
size="mini"
|
||||
:disabled="single"
|
||||
@click="handleUpdate"
|
||||
v-hasPermi="['scientific:department:edit']"
|
||||
>修改</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="danger"
|
||||
plain
|
||||
icon="el-icon-delete"
|
||||
size="mini"
|
||||
:disabled="multiple"
|
||||
@click="handleDelete"
|
||||
v-hasPermi="['scientific:department:remove']"
|
||||
>删除</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="warning"
|
||||
plain
|
||||
icon="el-icon-download"
|
||||
size="mini"
|
||||
@click="handleExport"
|
||||
v-hasPermi="['scientific:department:export']"
|
||||
>导出</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="departmentList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
|
||||
<el-table-column label="单位名称" align="center" prop="departmentName" />
|
||||
<el-table-column label="单位地址" align="center" prop="departmentAddress" />
|
||||
<el-table-column label="单位性质" align="center" prop="departmentCategory" :formatter="formatDepartmentCategory"/>
|
||||
<el-table-column label="单位联系人姓名" align="center" prop="departmentPerson" />
|
||||
<el-table-column label="单位联系人电话" align="center" prop="departmentPhone" />
|
||||
<el-table-column label="单位联系人邮件" align="center" prop="departmentEmail" />
|
||||
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-edit"
|
||||
@click="handleDepartmentDetail(scope.row)"
|
||||
v-hasPermi="['scientific:department:list']"
|
||||
>详情</el-button>
|
||||
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-delete"
|
||||
@click="handleDelete(scope.row)"
|
||||
v-hasPermi="['scientific:department:remove']"
|
||||
>删除</el-button>
|
||||
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination
|
||||
v-show="total>0"
|
||||
:total="total"
|
||||
:page.sync="queryParams.pageNum"
|
||||
:limit.sync="queryParams.pageSize"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<!-- 添加或修改department对话框 -->
|
||||
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
|
||||
<el-form-item label="单位名称" prop="departmentName">
|
||||
<el-input v-model="form.departmentName" placeholder="请输入单位名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="单位地址" prop="departmentAddress">
|
||||
<el-input v-model="form.departmentAddress" placeholder="请输入单位地址" />
|
||||
</el-form-item>
|
||||
<el-form-item label="单位性质,1企业,2科研机构,3高校" prop="departmentCategory">
|
||||
<el-input v-model="form.departmentCategory" placeholder="请输入单位性质,1企业,2科研机构,3高校" />
|
||||
</el-form-item>
|
||||
<el-form-item label="单位联系人姓名" prop="departmentPerson">
|
||||
<el-input v-model="form.departmentPerson" placeholder="请输入单位联系人姓名" />
|
||||
</el-form-item>
|
||||
<el-form-item label="单位联系人电话" prop="departmentPhone">
|
||||
<el-input v-model="form.departmentPhone" placeholder="请输入单位联系人电话" />
|
||||
</el-form-item>
|
||||
<el-form-item label="单位联系人邮件" prop="departmentEmail">
|
||||
<el-input v-model="form.departmentEmail" placeholder="请输入单位联系人邮件" />
|
||||
</el-form-item>
|
||||
<el-form-item label="相关文件" prop="departmentFile">
|
||||
<file-upload v-model="form.departmentFile"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="其他备注信息" prop="departmentNote">
|
||||
<el-input v-model="form.departmentNote" placeholder="请输入其他备注信息" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listDepartment, getDepartment, delDepartment, addDepartment, updateDepartment } from "@/api/scientific/department";
|
||||
|
||||
export default {
|
||||
name: "Department",
|
||||
data() {
|
||||
return {
|
||||
// 按钮loading
|
||||
buttonLoading: false,
|
||||
// 遮罩层
|
||||
loading: true,
|
||||
// 选中数组
|
||||
ids: [],
|
||||
// 非单个禁用
|
||||
single: true,
|
||||
// 非多个禁用
|
||||
multiple: true,
|
||||
// 显示搜索条件
|
||||
showSearch: true,
|
||||
// 总条数
|
||||
total: 0,
|
||||
// department表格数据
|
||||
departmentList: [],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
departmentId: undefined,
|
||||
departmentName: undefined,
|
||||
departmentAddress: undefined,
|
||||
departmentCategory: undefined,
|
||||
departmentPerson: undefined,
|
||||
departmentPhone: undefined,
|
||||
departmentEmail: undefined,
|
||||
departmentFile: undefined,
|
||||
departmentNote: undefined,
|
||||
departmentStatus: '3',
|
||||
},
|
||||
// 表单参数
|
||||
form: {},
|
||||
// 表单校验
|
||||
rules: {
|
||||
departmentId: [
|
||||
{ required: true, message: "单位ID不能为空", trigger: "blur" }
|
||||
],
|
||||
departmentName: [
|
||||
{ required: true, message: "单位名称不能为空", trigger: "blur" }
|
||||
],
|
||||
departmentAddress: [
|
||||
{ required: true, message: "单位地址不能为空", trigger: "blur" }
|
||||
],
|
||||
departmentCategory: [
|
||||
{ required: true, message: "单位性质,1企业,2科研机构,3高校不能为空", trigger: "blur" }
|
||||
],
|
||||
departmentPerson: [
|
||||
{ required: true, message: "单位联系人姓名不能为空", trigger: "blur" }
|
||||
],
|
||||
departmentPhone: [
|
||||
{ required: true, message: "单位联系人电话不能为空", trigger: "blur" }
|
||||
],
|
||||
departmentEmail: [
|
||||
{ required: true, message: "单位联系人邮件不能为空", trigger: "blur" }
|
||||
],
|
||||
departmentFile: [
|
||||
{ required: true, message: "相关文件不能为空", trigger: "blur" }
|
||||
],
|
||||
departmentNote: [
|
||||
{ required: true, message: "其他备注信息不能为空", trigger: "blur" }
|
||||
],
|
||||
}
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getList();
|
||||
},
|
||||
methods: {
|
||||
/** 查询department列表 */
|
||||
getList() {
|
||||
this.loading = true;
|
||||
listDepartment(this.queryParams).then(response => {
|
||||
this.departmentList = response.rows;
|
||||
this.total = response.total;
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
// 取消按钮
|
||||
cancel() {
|
||||
this.open = false;
|
||||
this.reset();
|
||||
},
|
||||
// 表单重置
|
||||
reset() {
|
||||
this.form = {
|
||||
departmentId: undefined,
|
||||
departmentName: undefined,
|
||||
departmentAddress: undefined,
|
||||
departmentCategory: undefined,
|
||||
departmentPerson: undefined,
|
||||
departmentPhone: undefined,
|
||||
departmentEmail: undefined,
|
||||
departmentFile: undefined,
|
||||
departmentNote: undefined,
|
||||
createBy: undefined,
|
||||
createTime: undefined,
|
||||
updateBy: undefined,
|
||||
updateTime: undefined
|
||||
};
|
||||
this.resetForm("form");
|
||||
},
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
this.queryParams.pageNum = 1;
|
||||
this.getList();
|
||||
},
|
||||
/** 重置按钮操作 */
|
||||
resetQuery() {
|
||||
this.resetForm("queryForm");
|
||||
this.handleQuery();
|
||||
},
|
||||
// 多选框选中数据
|
||||
handleSelectionChange(selection) {
|
||||
this.ids = selection.map(item => item.departmentId)
|
||||
this.single = selection.length!==1
|
||||
this.multiple = !selection.length
|
||||
},
|
||||
/** 新增按钮操作 */
|
||||
handleAdd() {
|
||||
this.reset();
|
||||
this.open = true;
|
||||
this.title = "添加department";
|
||||
},
|
||||
/** 修改按钮操作 */
|
||||
handleUpdate(row) {
|
||||
this.loading = true;
|
||||
this.reset();
|
||||
const departmentId = row.departmentId || this.ids
|
||||
getDepartment(departmentId).then(response => {
|
||||
this.loading = false;
|
||||
this.form = response.data;
|
||||
this.open = true;
|
||||
this.title = "修改department";
|
||||
});
|
||||
},
|
||||
/** 提交按钮 */
|
||||
submitForm() {
|
||||
this.$refs["form"].validate(valid => {
|
||||
if (valid) {
|
||||
this.buttonLoading = true;
|
||||
if (this.form.departmentId != null) {
|
||||
updateDepartment(this.form).then(response => {
|
||||
this.$modal.msgSuccess("修改成功");
|
||||
this.open = false;
|
||||
this.getList();
|
||||
}).finally(() => {
|
||||
this.buttonLoading = false;
|
||||
});
|
||||
} else {
|
||||
addDepartment(this.form).then(response => {
|
||||
this.$modal.msgSuccess("新增成功");
|
||||
this.open = false;
|
||||
this.getList();
|
||||
}).finally(() => {
|
||||
this.buttonLoading = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
/** 删除按钮操作 */
|
||||
handleDelete(row) {
|
||||
const departmentIds = row.departmentId || this.ids;
|
||||
this.$modal.confirm('是否确认删除department编号为"' + departmentIds + '"的数据项?').then(() => {
|
||||
this.loading = true;
|
||||
return delDepartment(departmentIds);
|
||||
}).then(() => {
|
||||
this.loading = false;
|
||||
this.getList();
|
||||
this.$modal.msgSuccess("删除成功");
|
||||
}).catch(() => {
|
||||
}).finally(() => {
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
/** 导出按钮操作 */
|
||||
handleExport() {
|
||||
this.download('scientific/department/export', {
|
||||
...this.queryParams
|
||||
}, `department_${new Date().getTime()}.xlsx`)
|
||||
},
|
||||
|
||||
|
||||
formatDepartmentCategory(row, column, cellValue) {
|
||||
switch (cellValue) {
|
||||
case '1':
|
||||
return '企业';
|
||||
case '2':
|
||||
return '科研机构';
|
||||
case '3':
|
||||
return '高校';
|
||||
default:
|
||||
return '未知';
|
||||
}
|
||||
},
|
||||
handleDepartmentDetail(row) {
|
||||
console.log(row);
|
||||
this.$router.push({
|
||||
path: '/scientific/department/detail/' + row.departmentProcId,
|
||||
query: {
|
||||
processed: false,
|
||||
}
|
||||
})
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
|
@ -0,0 +1,516 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form-item label="项目名称" prop="projectName">
|
||||
<el-input
|
||||
v-model="queryParams.projectName"
|
||||
placeholder="请输入项目名称"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="projectStatus">
|
||||
<el-input
|
||||
v-model="queryParams.projectStatus"
|
||||
placeholder="请输入状态"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="申报开始日期" prop="projectAppStTime" label-width="140px">
|
||||
<el-date-picker clearable
|
||||
v-model="queryParams.projectAppStTime"
|
||||
type="date"
|
||||
value-format="yyyy-MM-dd"
|
||||
placeholder="请选择申报开始日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="申报结束日期" prop="projectAppEndTime" label-width="140px">
|
||||
<el-date-picker clearable
|
||||
v-model="queryParams.projectAppEndTime"
|
||||
type="date"
|
||||
value-format="yyyy-MM-dd"
|
||||
placeholder="请选择申报结束日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目负责人" prop="projectLeader" label-width="140px">
|
||||
<el-input
|
||||
v-model="queryParams.projectLeader"
|
||||
placeholder="请输入项目负责人"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="项目预算(万)" prop="projectBudget" label-width="100px">
|
||||
<el-input
|
||||
v-model="queryParams.projectBudget"
|
||||
placeholder="请输入项目预算(万)"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目负责人联系电话" prop="projectLeaderPhone" label-width="140px">
|
||||
<el-input
|
||||
v-model="queryParams.projectLeaderPhone"
|
||||
placeholder="请输入联系电话"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="warning"
|
||||
plain
|
||||
icon="el-icon-download"
|
||||
size="mini"
|
||||
@click="handleExport"
|
||||
v-hasPermi="['scientific:application:export']"
|
||||
>Excel导出</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="applicationList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="序号" type="index" width="50"></el-table-column>
|
||||
<!-- <el-table-column label="项目ID" align="center" prop="projectId" v-if="true" width="180"/> -->
|
||||
<el-table-column label="项目名称" align="center" :min-width="280">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium">{{ scope.row.projectName }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="项目负责人" align="center" prop="projectLeader" width="100"/>
|
||||
<el-table-column label="申报状态" align="center" width="100px" :min-width="100">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium" :type="getTagType(scope.row.projectDeclareStatus)">
|
||||
{{ formatProjectDeclareStatus(scope.row.projectDeclareStatus) }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="申报开始日期" align="center" prop="projectAppStTime" :min-width="140" width="140">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.projectAppStTime, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="申报结束日期" align="center" prop="projectAppEndTime" width="140">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.projectAppEndTime, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="到账情况" align="center" width="100px" :min-width="100">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium" :type="getFundsTagType(scope.row.projectFundsReceived)">
|
||||
{{ formatProjectFundsRecvStatus(scope.row.projectFundsReceived) }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="到账备注" align="center" prop="projectFundsRemark" :min-width="180" width="180"/>
|
||||
<el-table-column label="负责人电话" align="center" prop="projectLeaderPhone" :min-width="150" width="150"/>
|
||||
<el-table-column label="操作" align="center" :min-width="280" width="280">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-top"
|
||||
@click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['project:application:remove']"
|
||||
>到账确认</el-button>
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-edit"
|
||||
@click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['scientific:application:edit']"
|
||||
>信息修改</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination
|
||||
v-show="total>0"
|
||||
:total="total"
|
||||
:page.sync="queryParams.pageNum"
|
||||
:limit.sync="queryParams.pageSize"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<!-- 添加或修改项目申报对话框, 采用open字段控制是否 -->
|
||||
<!-- 这是提交或者详细信息的表单显示框 -->
|
||||
<!-- 这个表单的名字为form:
|
||||
在form.projectName这种方式配置参数 -->
|
||||
<el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="150px" >
|
||||
<el-form-item label="项目名称" prop="projectName" >
|
||||
<el-input v-model="form.projectName" placeholder="请输入项目名称" :style="{ width: '400px' }"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目负责人" prop="projectLeader">
|
||||
<el-input v-model="form.projectLeader" placeholder="请输入项目负责人" :style="{ width: '100px'}"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目预算(万)" prop="projectBudget">
|
||||
<el-input v-model="form.projectBudget" placeholder="请输入项目预算(万)" :style="{ width: '100px'}"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目负责人电话" prop="projectLeaderPhone">
|
||||
<el-input v-model="form.projectLeaderPhone" placeholder="请输入项目负责人联系电话" :style="{ width: '140px'} " />
|
||||
</el-form-item>
|
||||
<el-form-item label="到账情况" prop="projectFundsReceived">
|
||||
<el-select
|
||||
v-model="form.projectFundsReceived"
|
||||
placeholder="请选择"
|
||||
:style="{ width: '100px' }"
|
||||
:disabled="isProjectFundsReceivedDisabled"
|
||||
>
|
||||
<el-option label="到账" value="1"></el-option>
|
||||
<el-option label="未到账" value="0"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="到账备注" prop="projectFundsRemark">
|
||||
<el-input v-model="form.projectFundsRemark" placeholder="输入到账状态说明" :style="{ width: '140px'} " />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listApplication, getApplication, delApplication, addApplication, confirmFundsReceived } from "@/api/scientific/application";
|
||||
import { listProcess} from "@/api/workflow/process";
|
||||
export default {
|
||||
name: "Application",
|
||||
data() {
|
||||
return {
|
||||
// 按钮loading
|
||||
buttonLoading: false,
|
||||
// 遮罩层
|
||||
loading: true,
|
||||
// 选中数组
|
||||
ids: [],
|
||||
// 非单个禁用
|
||||
single: true,
|
||||
// 非多个禁用
|
||||
multiple: true,
|
||||
// 显示搜索条件
|
||||
showSearch: true,
|
||||
// 总条数
|
||||
total: 0,
|
||||
// 项目申报表格数据
|
||||
applicationList: [],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
projectName: undefined,
|
||||
projectStatus: undefined,
|
||||
projectAppProcId: undefined,
|
||||
projectAppStaus: undefined,
|
||||
projectAppStTime: undefined,
|
||||
projectAppEndTime: undefined,
|
||||
projectLeader: undefined,
|
||||
projectBudget: undefined,
|
||||
projectLeaderPhone: undefined,
|
||||
},
|
||||
queryProcParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
processKey: undefined,
|
||||
processName: "项目预算追加表",
|
||||
category: "001"
|
||||
},
|
||||
fundsForm: {
|
||||
projectId:undefined,
|
||||
projectFundsReceived:undefined,
|
||||
projectFundsRemark:undefined,
|
||||
},
|
||||
// 表单参数
|
||||
form: {},
|
||||
// 表单校验
|
||||
rules: {
|
||||
projectId: [
|
||||
{ required: true, message: "项目ID不能为空", trigger: "blur" }
|
||||
],
|
||||
projectName: [
|
||||
{ required: true, message: "项目名称不能为空", trigger: "blur" }
|
||||
],
|
||||
projectStatus: [
|
||||
{ required: true, message: "状态不能为空", trigger: "blur" }
|
||||
],
|
||||
projectAppStTime: [
|
||||
{ required: true, message: "申报开始日期不能为空", trigger: "blur" }
|
||||
],
|
||||
projectAppEndTime: [
|
||||
{ required: true, message: "申报结束日期不能为空", trigger: "blur" }
|
||||
],
|
||||
projectLeader: [
|
||||
{ required: true, message: "项目负责人不能为空", trigger: "blur" }
|
||||
],
|
||||
projectBudget: [
|
||||
{ required: true, message: "项目预算(万)不能为空", trigger: "blur" }
|
||||
],
|
||||
projectLeaderPhone: [
|
||||
{ required: true, message: "项目负责人联系电话不能为空", trigger: "blur" }
|
||||
],
|
||||
}
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getList();
|
||||
},
|
||||
// logzhan : 当我们跳转到其他路由页面,例如预算变更的时候,再次回来时
|
||||
// 需要用这个函数刷新列表,否则列表将处于刷新状态不显示信息
|
||||
beforeRouteEnter(to, from, next) {
|
||||
next(vm => {
|
||||
vm.getList()
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
/** 查询项目申报列表 */
|
||||
getList() {
|
||||
this.loading = true;
|
||||
listApplication(this.queryParams).then(response => {
|
||||
this.applicationList = response.rows;
|
||||
this.total = response.total;
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
// 取消按钮
|
||||
cancel() {
|
||||
this.open = false;
|
||||
this.reset();
|
||||
},
|
||||
// 表单重置
|
||||
reset() {
|
||||
this.form = {
|
||||
projectId: undefined,
|
||||
projectName: undefined,
|
||||
projectStatus: undefined,
|
||||
projectAppProcId: undefined,
|
||||
projectAppStaus: undefined,
|
||||
projectAppStTime: undefined,
|
||||
projectAppEndTime: undefined,
|
||||
projectLeader: undefined,
|
||||
projectBudget: undefined,
|
||||
projectLeaderPhone: undefined,
|
||||
projectFundsReceived: undefined,
|
||||
projectFundsRemark:undefined
|
||||
};
|
||||
this.fundsForm = {
|
||||
projectId: undefined,
|
||||
projectFundsReceived: undefined,
|
||||
projectFundsRemark:undefined
|
||||
};
|
||||
this.resetForm("form");
|
||||
},
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
this.queryParams.pageNum = 1;
|
||||
this.getList();
|
||||
},
|
||||
/** 重置按钮操作 */
|
||||
resetQuery() {
|
||||
this.resetForm("queryForm");
|
||||
this.handleQuery();
|
||||
},
|
||||
// 多选框选中数据
|
||||
handleSelectionChange(selection) {
|
||||
this.ids = selection.map(item => item.projectId)
|
||||
this.single = selection.length!==1
|
||||
this.multiple = !selection.length
|
||||
},
|
||||
/** 新增按钮操作 */
|
||||
handleAdd() {
|
||||
this.reset();
|
||||
this.open = true;
|
||||
this.title = "添加项目申报";
|
||||
},
|
||||
/** 修改按钮操作 */
|
||||
handleUpdate(row) {
|
||||
this.loading = true;
|
||||
this.reset();
|
||||
const projectId = row.projectId || this.ids
|
||||
getApplication(projectId).then(response => {
|
||||
this.loading = false;
|
||||
this.form = response.data;
|
||||
this.open = true;
|
||||
this.title = "修改项目申报";
|
||||
console.log(this.form)
|
||||
});
|
||||
},
|
||||
/**
|
||||
* 根据填写的项目信息进行申报
|
||||
*/
|
||||
declareProject(row){
|
||||
|
||||
},
|
||||
/** 修改按钮操作 */
|
||||
handleUpdateBudget(row) {
|
||||
this.loading = true;
|
||||
this.reset();
|
||||
const upProjectId = row.projectId || this.ids
|
||||
|
||||
// 查询项目经费追加流程
|
||||
listProcess(this.queryProcParams).then(response => {
|
||||
this.processParams = response.rows[0];
|
||||
this.deploymentId = this.processParams.deploymentId;
|
||||
this.definitionId = this.processParams.definitionId;
|
||||
// 流程名称暂时没有太大作用
|
||||
// this.processName = this.processParams.processName;
|
||||
this.$router.push({
|
||||
path: `/workflow/process/proj_update/${this.deploymentId}?definitionId=${this.definitionId}`,
|
||||
query: {
|
||||
projectId: upProjectId
|
||||
}
|
||||
});
|
||||
})
|
||||
},
|
||||
|
||||
/** 提交按钮 */
|
||||
submitForm() {
|
||||
// $refs["form"].validate(valid => 验证表单是否有效
|
||||
this.$refs["form"].validate(valid => {
|
||||
if (valid) {
|
||||
this.buttonLoading = true;
|
||||
// 判断是修改还是新增
|
||||
if (this.form.projectId != null) {
|
||||
console.log(this.form)
|
||||
this.fundsForm.projectId = this.form.projectId;
|
||||
this.fundsForm.projectFundsReceived = this.form.projectFundsReceived;
|
||||
this.fundsForm.projectFundsRemark = this.form.projectFundsRemark;
|
||||
confirmFundsReceived(this.fundsForm).then(response => {
|
||||
this.$modal.msgSuccess("修改成功");
|
||||
this.open = false;
|
||||
// 提交成功后刷新列表
|
||||
this.getList();
|
||||
}).finally(() => {
|
||||
this.buttonLoading = false;
|
||||
});
|
||||
} else {
|
||||
addApplication(this.form).then(response => {
|
||||
this.$modal.msgSuccess("新增成功");
|
||||
this.open = false;
|
||||
this.getList();
|
||||
}).finally(() => {
|
||||
this.buttonLoading = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
/** 删除按钮操作 */
|
||||
handleDelete(row) {
|
||||
const projectIds = row.projectId || this.ids;
|
||||
this.$modal.confirm('是否确认删除项目申报编号为"' + projectIds + '"的数据项?').then(() => {
|
||||
this.loading = true;
|
||||
return delApplication(projectIds);
|
||||
}).then(() => {
|
||||
this.loading = false;
|
||||
this.getList();
|
||||
this.$modal.msgSuccess("删除成功");
|
||||
}).catch(() => {
|
||||
}).finally(() => {
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
/** 导出按钮操作 */
|
||||
handleExport() {
|
||||
this.download('scientific/application/export', {
|
||||
...this.queryParams
|
||||
}, `application_${new Date().getTime()}.xlsx`)
|
||||
},
|
||||
/**
|
||||
* 把项目状态的code转换未文字: 0 : 未立项 1: 审核中 2: 已立项
|
||||
* @param {number|string} cellValue - 原始数值
|
||||
* @returns {string} 转换后的字符串
|
||||
* @author zhanli
|
||||
*/
|
||||
formatProjectAppStatus(cellValue) {
|
||||
switch (cellValue) {
|
||||
case '0':
|
||||
return "未立项";
|
||||
case '1':
|
||||
return "审核中";
|
||||
case '2':
|
||||
return "已立项";
|
||||
default:
|
||||
return "未知状态";
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 把项目状态的申报code转换为文字: 0 : 未申报 1: 审核中 2: 已申报
|
||||
* @param {number|string} cellValue - 原始数值
|
||||
* @returns {string} 转换后的字符串
|
||||
* @author zhanli
|
||||
*/
|
||||
formatProjectDeclareStatus(cellValue) {
|
||||
switch (cellValue) {
|
||||
case '0':
|
||||
return "草稿";
|
||||
case '1':
|
||||
return "审核中";
|
||||
case '2':
|
||||
return "申报通过";
|
||||
default:
|
||||
return "未知状态";
|
||||
}
|
||||
},
|
||||
getTagType(status) {
|
||||
switch (status) {
|
||||
case '2':
|
||||
// 显示绿色 审核通过绿色
|
||||
return 'success';
|
||||
case '1':
|
||||
// 审核中 显示黄色
|
||||
return 'warning';
|
||||
case '0':
|
||||
// 未申报, 灰色
|
||||
return 'primary';
|
||||
case '4':
|
||||
// 其他状态 灰色
|
||||
return 'info';
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
},
|
||||
formatProjectFundsRecvStatus(cellValue) {
|
||||
switch (cellValue) {
|
||||
case '0':
|
||||
return "未到账";
|
||||
case '1':
|
||||
return "已到账";
|
||||
default:
|
||||
return "异常";
|
||||
}
|
||||
},
|
||||
getFundsTagType(status) {
|
||||
switch (status) {
|
||||
case '1':
|
||||
// 审核中 显示黄色
|
||||
return 'success';
|
||||
case '0':
|
||||
// 未申报, 灰色
|
||||
return 'primary';
|
||||
default:
|
||||
return 'info';
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
|
@ -0,0 +1,476 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-tabs tab-position="top" :value="processed === true ? 'approval' : 'form'">
|
||||
|
||||
|
||||
<el-tab-pane label="表单信息" name="form">
|
||||
<div v-if="formOpen">
|
||||
<el-card class="box-card" shadow="never" v-for="(formInfo, index) in processFormList" :key="index">
|
||||
<div slot="header" class="clearfix">
|
||||
<!-- <span>{{ formInfo.title }}</span>-->
|
||||
<span> 指南详情 </span>
|
||||
</div>
|
||||
|
||||
<!--流程处理表单模块-->
|
||||
<el-col :span="20" :offset="2">
|
||||
<parser :form-conf="formInfo"/>
|
||||
</el-col>
|
||||
</el-card>
|
||||
</div>
|
||||
</el-tab-pane >
|
||||
|
||||
</el-tabs>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { detailProcess } from '@/api/workflow/process'
|
||||
import Parser from '@/utils/generator/parser'
|
||||
import { complete, delegate, transfer, rejectTask, returnList, returnTask } from '@/api/workflow/task'
|
||||
import { selectUser, deptTreeSelect } from '@/api/system/user'
|
||||
import ProcessViewer from '@/components/ProcessViewer'
|
||||
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
|
||||
import Treeselect from '@riophae/vue-treeselect'
|
||||
|
||||
export default {
|
||||
name: "WorkDetail",
|
||||
components: {
|
||||
ProcessViewer,
|
||||
Parser,
|
||||
Treeselect
|
||||
},
|
||||
props: {},
|
||||
computed: {
|
||||
commentType() {
|
||||
return val => {
|
||||
switch (val) {
|
||||
case '1': return '通过'
|
||||
case '2': return '退回'
|
||||
case '3': return '驳回'
|
||||
case '4': return '委派'
|
||||
case '5': return '转办'
|
||||
case '6': return '终止'
|
||||
case '7': return '撤回'
|
||||
}
|
||||
}
|
||||
},
|
||||
approveTypeTag() {
|
||||
return val => {
|
||||
switch (val) {
|
||||
case '1': return 'success'
|
||||
case '2': return 'warning'
|
||||
case '3': return 'danger'
|
||||
case '4': return 'primary'
|
||||
case '5': return 'success'
|
||||
case '6': return 'danger'
|
||||
case '7': return 'info'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
height: document.documentElement.clientHeight - 205 + 'px;',
|
||||
// 模型xml数据
|
||||
loadIndex: 0,
|
||||
xmlData: undefined,
|
||||
finishedInfo: {
|
||||
finishedSequenceFlowSet: [],
|
||||
finishedTaskSet: [],
|
||||
unfinishedTaskSet: [],
|
||||
rejectedTaskSet: []
|
||||
},
|
||||
historyProcNodeList: [],
|
||||
// 部门名称
|
||||
deptName: undefined,
|
||||
// 部门树选项
|
||||
deptOptions: undefined,
|
||||
userLoading: false,
|
||||
// 用户表格数据
|
||||
userList: null,
|
||||
deptProps: {
|
||||
children: "children",
|
||||
label: "label"
|
||||
},
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
deptId: undefined
|
||||
},
|
||||
total: 0,
|
||||
// 遮罩层
|
||||
loading: true,
|
||||
taskForm:{
|
||||
comment:"", // 意见内容
|
||||
procInsId: "", // 流程实例编号
|
||||
taskId: "" ,// 流程任务编号
|
||||
copyUserIds: "", // 抄送人Id
|
||||
vars: "",
|
||||
targetKey:""
|
||||
},
|
||||
rules: {
|
||||
comment: [{ required: true, message: '请输入审批意见', trigger: 'blur' }],
|
||||
},
|
||||
currentUserId: null,
|
||||
variables: [], // 流程变量数据
|
||||
taskFormOpen: false,
|
||||
taskFormData: {}, // 流程变量数据
|
||||
processFormList: [], // 流程变量数据
|
||||
formOpen: false, // 是否加载流程变量数据
|
||||
returnTaskList: [], // 回退列表数据
|
||||
processed: false,
|
||||
returnTitle: null,
|
||||
returnOpen: false,
|
||||
rejectOpen: false,
|
||||
rejectTitle: null,
|
||||
userData: {
|
||||
title: '',
|
||||
type: '',
|
||||
open: false,
|
||||
},
|
||||
copyUser: [],
|
||||
nextUser: [],
|
||||
userMultipleSelection: [],
|
||||
userDialogTitle: '',
|
||||
userOpen: false
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.initData();
|
||||
},
|
||||
methods: {
|
||||
initData() {
|
||||
this.taskForm.procInsId = this.$route.params && this.$route.params.planProcId;
|
||||
this.taskForm.taskId = this.$route.query && this.$route.query.taskId;
|
||||
this.processed = this.$route.query && eval(this.$route.query.processed || false);
|
||||
|
||||
// 流程任务重获取变量表单
|
||||
this.getProcessDetails(this.taskForm.procInsId, this.taskForm.taskId);
|
||||
this.loadIndex = this.taskForm.procInsId;
|
||||
},
|
||||
/** 查询部门下拉树结构 */
|
||||
getTreeSelect() {
|
||||
deptTreeSelect().then(response => {
|
||||
this.deptOptions = response.data;
|
||||
});
|
||||
},
|
||||
/** 查询用户列表 */
|
||||
getList() {
|
||||
this.userLoading = true;
|
||||
selectUser(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
|
||||
this.userList = response.rows;
|
||||
this.total = response.total;
|
||||
this.toggleSelection(this.userMultipleSelection);
|
||||
this.userLoading = false;
|
||||
});
|
||||
},
|
||||
// 筛选节点
|
||||
filterNode(value, data) {
|
||||
if (!value) return true;
|
||||
return data.label.indexOf(value) !== -1;
|
||||
},
|
||||
// 节点单击事件
|
||||
handleNodeClick(data) {
|
||||
this.queryParams.deptId = data.id;
|
||||
this.getList();
|
||||
},
|
||||
setIcon(val) {
|
||||
if (val) {
|
||||
return "el-icon-check";
|
||||
} else {
|
||||
return "el-icon-time";
|
||||
}
|
||||
},
|
||||
setColor(val) {
|
||||
if (val) {
|
||||
return "#2bc418";
|
||||
} else {
|
||||
return "#b3bdbb";
|
||||
}
|
||||
},
|
||||
// 多选框选中数据
|
||||
handleSelectionChange(selection) {
|
||||
this.userMultipleSelection = selection
|
||||
},
|
||||
toggleSelection(selection) {
|
||||
if (selection && selection.length > 0) {
|
||||
this.$nextTick(()=> {
|
||||
selection.forEach(item => {
|
||||
let row = this.userList.find(k => k.userId === item.userId);
|
||||
this.$refs.userTable.toggleRowSelection(row);
|
||||
})
|
||||
})
|
||||
} else {
|
||||
this.$nextTick(() => {
|
||||
this.$refs.userTable.clearSelection();
|
||||
});
|
||||
}
|
||||
},
|
||||
// 关闭标签
|
||||
handleClose(type, tag) {
|
||||
let userObj = this.userMultipleSelection.find(item => item.userId === tag.id);
|
||||
this.userMultipleSelection.splice(this.userMultipleSelection.indexOf(userObj), 1);
|
||||
if (type === 'copy') {
|
||||
this.copyUser = this.userMultipleSelection;
|
||||
// 设置抄送人ID
|
||||
if (this.copyUser && this.copyUser.length > 0) {
|
||||
const val = this.copyUser.map(item => item.id);
|
||||
this.taskForm.copyUserIds = val instanceof Array ? val.join(',') : val;
|
||||
} else {
|
||||
this.taskForm.copyUserIds = '';
|
||||
}
|
||||
} else if (type === 'next') {
|
||||
this.nextUser = this.userMultipleSelection;
|
||||
// 设置抄送人ID
|
||||
if (this.nextUser && this.nextUser.length > 0) {
|
||||
const val = this.nextUser.map(item => item.id);
|
||||
this.taskForm.nextUserIds = val instanceof Array ? val.join(',') : val;
|
||||
} else {
|
||||
this.taskForm.nextUserIds = '';
|
||||
}
|
||||
}
|
||||
},
|
||||
/** 流程变量赋值 */
|
||||
handleCheckChange(val) {
|
||||
if (val instanceof Array) {
|
||||
this.taskForm.values = {
|
||||
"approval": val.join(',')
|
||||
}
|
||||
} else {
|
||||
this.taskForm.values = {
|
||||
"approval": val
|
||||
}
|
||||
}
|
||||
},
|
||||
getProcessDetails(procInsId, taskId) {
|
||||
const params = {procInsId: procInsId, taskId: taskId}
|
||||
detailProcess(params).then(res => {
|
||||
const data = res.data;
|
||||
this.xmlData = data.bpmnXml;
|
||||
this.processFormList = data.processFormList;
|
||||
this.taskFormOpen = data.existTaskForm;
|
||||
if (this.taskFormOpen) {
|
||||
this.taskFormData = data.taskFormData;
|
||||
}
|
||||
this.historyProcNodeList = data.historyProcNodeList;
|
||||
this.finishedInfo = data.flowViewer;
|
||||
this.formOpen = true;
|
||||
})
|
||||
},
|
||||
onSelectCopyUsers() {
|
||||
this.userMultipleSelection = this.copyUser;
|
||||
this.onSelectUsers('添加抄送人', 'copy')
|
||||
},
|
||||
onSelectNextUsers() {
|
||||
this.userMultipleSelection = this.nextUser;
|
||||
this.onSelectUsers('指定审批人', 'next')
|
||||
},
|
||||
onSelectUsers(title, type) {
|
||||
this.userData.title = title;
|
||||
this.userData.type = type;
|
||||
this.getTreeSelect();
|
||||
this.getList()
|
||||
this.userData.open = true;
|
||||
},
|
||||
/** 通过任务 */
|
||||
handleComplete() {
|
||||
// 校验表单
|
||||
const taskFormRef = this.$refs.taskFormParser;
|
||||
const isExistTaskForm = taskFormRef !== undefined;
|
||||
// 若无任务表单,则 taskFormPromise 为 true,即不需要校验
|
||||
const taskFormPromise = !isExistTaskForm ? true : new Promise((resolve, reject) => {
|
||||
taskFormRef.$refs[taskFormRef.formConfCopy.formRef].validate(valid => {
|
||||
valid ? resolve() : reject()
|
||||
})
|
||||
});
|
||||
const approvalPromise = new Promise((resolve, reject) => {
|
||||
this.$refs['taskForm'].validate(valid => {
|
||||
valid ? resolve() : reject()
|
||||
})
|
||||
});
|
||||
Promise.all([taskFormPromise, approvalPromise]).then(() => {
|
||||
if (isExistTaskForm) {
|
||||
this.taskForm.variables = taskFormRef[taskFormRef.formConfCopy.formModel]
|
||||
}
|
||||
complete(this.taskForm).then(response => {
|
||||
this.$modal.msgSuccess(response.msg);
|
||||
this.goBack();
|
||||
});
|
||||
})
|
||||
},
|
||||
/** 委派任务 */
|
||||
handleDelegate() {
|
||||
this.$refs["taskForm"].validate(valid => {
|
||||
if (valid) {
|
||||
this.userData.type = 'delegate';
|
||||
this.userData.title = '委派任务'
|
||||
this.userData.open = true;
|
||||
this.getTreeSelect();
|
||||
}
|
||||
})
|
||||
},
|
||||
/** 转办任务 */
|
||||
handleTransfer(){
|
||||
this.$refs["taskForm"].validate(valid => {
|
||||
if (valid) {
|
||||
this.userData.type = 'transfer';
|
||||
this.userData.title = '转办任务';
|
||||
this.userData.open = true;
|
||||
this.getTreeSelect();
|
||||
}
|
||||
})
|
||||
},
|
||||
/** 拒绝任务 */
|
||||
handleReject() {
|
||||
this.$refs["taskForm"].validate(valid => {
|
||||
if (valid) {
|
||||
const _this = this;
|
||||
this.$modal.confirm('拒绝审批单流程会终止,是否继续?').then(function() {
|
||||
return rejectTask(_this.taskForm);
|
||||
}).then(res => {
|
||||
this.$modal.msgSuccess(res.msg);
|
||||
this.goBack();
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
changeCurrentUser(val) {
|
||||
this.currentUserId = val.userId
|
||||
},
|
||||
/** 返回页面 */
|
||||
goBack() {
|
||||
// 关闭当前标签页并返回上个页面
|
||||
this.$tab.closePage(this.$route)
|
||||
this.$router.back()
|
||||
},
|
||||
/** 接收子组件传的值 */
|
||||
getData(data) {
|
||||
if (data) {
|
||||
const variables = [];
|
||||
data.fields.forEach(item => {
|
||||
let variableData = {};
|
||||
variableData.label = item.__config__.label
|
||||
// 表单值为多个选项时
|
||||
if (item.__config__.defaultValue instanceof Array) {
|
||||
const array = [];
|
||||
item.__config__.defaultValue.forEach(val => {
|
||||
array.push(val)
|
||||
})
|
||||
variableData.val = array;
|
||||
} else {
|
||||
variableData.val = item.__config__.defaultValue
|
||||
}
|
||||
variables.push(variableData)
|
||||
})
|
||||
this.variables = variables;
|
||||
}
|
||||
},
|
||||
submitUserData() {
|
||||
let type = this.userData.type;
|
||||
if (type === 'copy' || type === 'next') {
|
||||
if (!this.userMultipleSelection || this.userMultipleSelection.length <= 0) {
|
||||
this.$modal.msgError("请选择用户");
|
||||
return false;
|
||||
}
|
||||
let userIds = this.userMultipleSelection.map(k => k.userId);
|
||||
if (type === 'copy') {
|
||||
// 设置抄送人ID信息
|
||||
this.copyUser = this.userMultipleSelection;
|
||||
this.taskForm.copyUserIds = userIds instanceof Array ? userIds.join(',') : userIds;
|
||||
} else if (type === 'next') {
|
||||
// 设置下一级审批人ID信息
|
||||
this.nextUser = this.userMultipleSelection;
|
||||
this.taskForm.nextUserIds = userIds instanceof Array ? userIds.join(',') : userIds;
|
||||
}
|
||||
this.userData.open = false;
|
||||
} else {
|
||||
if (!this.taskForm.comment) {
|
||||
this.$modal.msgError("请输入审批意见");
|
||||
return false;
|
||||
}
|
||||
if (!this.currentUserId) {
|
||||
this.$modal.msgError("请选择用户");
|
||||
return false;
|
||||
}
|
||||
this.taskForm.userId = this.currentUserId;
|
||||
if (type === 'delegate') {
|
||||
delegate(this.taskForm).then(res => {
|
||||
this.$modal.msgSuccess(res.msg);
|
||||
this.goBack();
|
||||
});
|
||||
}
|
||||
if (type === 'transfer') {
|
||||
transfer(this.taskForm).then(res => {
|
||||
this.$modal.msgSuccess(res.msg);
|
||||
this.goBack();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
/** 可退回任务列表 */
|
||||
handleReturn() {
|
||||
this.$refs['taskForm'].validate(valid => {
|
||||
if (valid) {
|
||||
this.returnTitle = "退回流程";
|
||||
returnList(this.taskForm).then(res => {
|
||||
this.returnTaskList = res.data;
|
||||
this.taskForm.values = null;
|
||||
this.returnOpen = true;
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
},
|
||||
/** 提交退回任务 */
|
||||
submitReturn() {
|
||||
this.$refs["taskForm"].validate(valid => {
|
||||
if (valid) {
|
||||
if (!this.taskForm.targetKey) {
|
||||
this.$modal.msgError("请选择退回节点!");
|
||||
}
|
||||
returnTask(this.taskForm).then(res => {
|
||||
this.$modal.msgSuccess(res.msg);
|
||||
this.goBack()
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.clearfix:before,
|
||||
.clearfix:after {
|
||||
display: table;
|
||||
content: "";
|
||||
}
|
||||
.clearfix:after {
|
||||
clear: both
|
||||
}
|
||||
|
||||
.box-card {
|
||||
width: 100%;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.el-tag + .el-tag {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.el-row {
|
||||
margin-bottom: 20px;
|
||||
&:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
.el-col {
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.button-new-tag {
|
||||
margin-left: 10px;
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,164 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-card class="box-card">
|
||||
<div slot="header" class="clearfix">
|
||||
<span>{{ processName }}</span>
|
||||
</div>
|
||||
|
||||
<el-col :span="18" :offset="3">
|
||||
<div class="form-conf" v-if="formOpen">
|
||||
<parser :key="new Date().getTime()" :form-conf="formData" @submit="submit" ref="parser" @getData="getData"/>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listProcess, startProcess_ } from '@/api/workflow/process'
|
||||
import { listAllCategory } from '@/api/workflow/category'
|
||||
import { getProcessForm, startProcess } from '@/api/workflow/process'
|
||||
import Parser from '@/utils/generator/parser'
|
||||
import {findLatestDeploymentTimeIndex } from '@/api/scientific/project_application_plan'
|
||||
import { addHandbook } from '@/api/scientific/handbook'
|
||||
|
||||
export default {
|
||||
name: 'handbookApply',
|
||||
components: {
|
||||
Parser
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
definitionId: null,
|
||||
deployId: null,
|
||||
procInsId: null,
|
||||
formOpen: false,
|
||||
formData: {},
|
||||
|
||||
processName: '',
|
||||
categoryOptions: [],
|
||||
// 流程定义表格数据
|
||||
processParams: null,
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
processKey: undefined,
|
||||
processName: "",
|
||||
category: "010"
|
||||
},
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.initData();
|
||||
},
|
||||
methods: {
|
||||
initData() {
|
||||
/** 查询流程定义列表 */
|
||||
listProcess(this.queryParams).then(response => {
|
||||
findLatestDeploymentTimeIndex(response).then((latestIndex) => {
|
||||
this.processParams = response.rows[latestIndex];
|
||||
this.processName = this.processParams.processName;
|
||||
this.definitionId = this.processParams.definitionId;
|
||||
getProcessForm({
|
||||
definitionId: this.processParams.definitionId,
|
||||
deployId: this.processParams.deploymentId,
|
||||
procInsId: undefined
|
||||
}).then(res => {
|
||||
if (res.data) {
|
||||
this.formData = res.data;
|
||||
this.formOpen = true;
|
||||
}
|
||||
})
|
||||
});
|
||||
})
|
||||
},
|
||||
|
||||
/** 接收子组件传的值 */
|
||||
getData(data) {
|
||||
if (data) {
|
||||
const variables = [];
|
||||
data.fields.forEach(item => {
|
||||
let variableData = {};
|
||||
variableData.label = item.__config__.label
|
||||
// 表单值为多个选项时
|
||||
if (item.__config__.defaultValue instanceof Array) {
|
||||
const array = [];
|
||||
item.__config__.defaultValue.forEach(val => {
|
||||
array.push(val)
|
||||
})
|
||||
variableData.val = array;
|
||||
} else {
|
||||
variableData.val = item.__config__.defaultValue
|
||||
}
|
||||
variables.push(variableData)
|
||||
})
|
||||
this.variables = variables;
|
||||
}
|
||||
},
|
||||
submit(data) {
|
||||
if (data && this.definitionId) {
|
||||
console.log(data.valData)
|
||||
// 启动流程并将表单数据加入流程变量
|
||||
startProcess_(this.definitionId, JSON.stringify(data.valData)).then(res => {
|
||||
if (res.code !== 200) {
|
||||
this.$modal.msgError("操作失败");
|
||||
return;
|
||||
}
|
||||
let handbookData = data.valData;
|
||||
handbookData.handbookProcId = res.msg;
|
||||
// zqjia:默认刚录入指南时状态为审核中,但后端会改为未审核
|
||||
handbookData.handbookStatus = 1;
|
||||
// zqjia:现在表单里的日期选择没有精确到小时,所以需要处理日期格式,后续要去掉
|
||||
const date = new Date(handbookData.handbookDate);
|
||||
handbookData.handbookDate = this.formatDateTime(date);
|
||||
|
||||
// zqjia:解析handbookFile,不然无法存到数据库中
|
||||
const files = handbookData.handbookFile;
|
||||
if (files !== null) {
|
||||
let formatedFiles = {};
|
||||
files.forEach(file => {
|
||||
if(file.response.code === 200 && file.ossId) {
|
||||
formatedFiles[file.name] = file.ossId;
|
||||
}
|
||||
})
|
||||
handbookData.handbookFile = JSON.stringify(formatedFiles);
|
||||
}
|
||||
|
||||
addHandbook(JSON.stringify(handbookData)).then(resp => {
|
||||
if (res.code !== 200) {
|
||||
this.$modal.msgError("操作失败");
|
||||
return;
|
||||
}
|
||||
this.$modal.msgSuccess(resp.msg);
|
||||
this.$tab.closeOpenPage({
|
||||
// zqjia:这个路径由菜单管理里设置的路由决定
|
||||
path: '/scientific/handbook/list'
|
||||
})
|
||||
});
|
||||
})
|
||||
}
|
||||
},
|
||||
formatDateTime(date) {
|
||||
const padZero = (num) => (num < 10 ? '0' + num : num);
|
||||
|
||||
const year = date.getFullYear();
|
||||
const month = padZero(date.getMonth() + 1); // getMonth() 返回值的范围是 0-11,所以需要加 1
|
||||
const day = padZero(date.getDate());
|
||||
const hours = padZero(date.getHours());
|
||||
const minutes = padZero(date.getMinutes());
|
||||
const seconds = padZero(date.getSeconds());
|
||||
|
||||
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.form-conf {
|
||||
margin: 15px auto;
|
||||
width: 80%;
|
||||
padding: 15px;
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,462 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form-item label="指南名称" prop="handbookName">
|
||||
<el-input
|
||||
v-model="queryParams.handbookName"
|
||||
placeholder="请输入指南名称"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="指南分类" prop="handbookCategory">
|
||||
<el-input
|
||||
v-model="queryParams.handbookCategory"
|
||||
placeholder="请输入指南分类"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="指南级别" prop="handbookLevel">
|
||||
<el-input
|
||||
v-model="queryParams.handbookLevel"
|
||||
placeholder="请输入指南级别"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="发布时间" prop="handbookDate">
|
||||
<el-date-picker clearable
|
||||
v-model="queryParams.handbookDate"
|
||||
type="date"
|
||||
value-format="yyyy-MM-dd"
|
||||
placeholder="请选择发布时间">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="primary"
|
||||
plain
|
||||
icon="el-icon-plus"
|
||||
size="mini"
|
||||
@click="handleAdd"
|
||||
v-hasPermi="['scientific:project_application_plan:add']"
|
||||
>新增</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="success"
|
||||
plain
|
||||
icon="el-icon-edit"
|
||||
size="mini"
|
||||
:disabled="single"
|
||||
@click="handleUpdate"
|
||||
v-hasPermi="['scientific:project_application_plan:edit']"
|
||||
>修改</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="danger"
|
||||
plain
|
||||
icon="el-icon-delete"
|
||||
size="mini"
|
||||
:disabled="multiple"
|
||||
@click="handleDelete"
|
||||
v-hasPermi="['scientific:project_application_plan:remove']"
|
||||
>删除</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="warning"
|
||||
plain
|
||||
icon="el-icon-download"
|
||||
size="mini"
|
||||
@click="handleExport"
|
||||
v-hasPermi="['scientific:project_application_plan:export']"
|
||||
>导出</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="handbookList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="序号" type="index" width="50"></el-table-column>
|
||||
<el-table-column label="指南名称" align="center" :min-width="150">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium" :type="info">
|
||||
{{ scope.row.handbookName }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="发布人" prop="directorName" width="80"></el-table-column>
|
||||
<el-table-column label="指南分类" align="center" :min-width="150">
|
||||
<template slot-scope="scope">
|
||||
{{ formatHandbookType(scope.row.handbookLevel) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="指南级别" align="center" :min-width="100">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium" :type="getTagLevelType(scope.row.handbookLevel)">
|
||||
{{ formatHandbookLevel(scope.row.handbookLevel) }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="发布时间" align="center" prop="handbookDate" width="180">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.handbookDate, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<!-- <el-table-column label="指南文件" align="center" prop="handbookFile" />-->
|
||||
<!-- <el-table-column label="指南录入流程状态" align="center" prop="handbookStatus" />-->
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
<!-- <el-button-->
|
||||
<!-- size="mini"-->
|
||||
<!-- type="text"-->
|
||||
<!-- icon="el-icon-edit"-->
|
||||
<!-- @click="handleUpdate(scope.row)"-->
|
||||
<!-- v-hasPermi="['scientific:project_application_plan:edit']"-->
|
||||
<!-- >修改</el-button>-->
|
||||
<!-- <el-button-->
|
||||
<!-- size="mini"-->
|
||||
<!-- type="text"-->
|
||||
<!-- icon="el-icon-delete"-->
|
||||
<!-- @click="handleDelete(scope.row)"-->
|
||||
<!-- v-hasPermi="['scientific:project_application_plan:remove']"-->
|
||||
<!-- >删除</el-button>-->
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-edit"
|
||||
@click="handleHandbookDetail(scope.row)"
|
||||
v-hasPermi="['scientific:project_application_plan:edit']"
|
||||
>详情</el-button>
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-top"
|
||||
@click="handlePlanApply(scope.row)"
|
||||
v-hasPermi="['scientific:project_application_plan:remove']"
|
||||
>发布计划</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination
|
||||
v-show="total>0"
|
||||
:total="total"
|
||||
:page.sync="queryParams.pageNum"
|
||||
:limit.sync="queryParams.pageSize"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<!-- 添加或修改项目申报指南对话框 -->
|
||||
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
|
||||
<el-form-item label="指南名称" prop="handbookName">
|
||||
<el-input v-model="form.handbookName" placeholder="请输入指南名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="指南分类" prop="handbookCategory">
|
||||
<el-input v-model="form.handbookCategory" placeholder="请输入指南分类" />
|
||||
</el-form-item>
|
||||
<el-form-item label="指南级别(4院级 3市级 2省级 1国家级)" prop="handbookLevel">
|
||||
<el-input v-model="form.handbookLevel" placeholder="请输入指南级别(4院级 3市级 2省级 1国家级)" />
|
||||
</el-form-item>
|
||||
<el-form-item label="发布时间" prop="handbookDate">
|
||||
<el-date-picker clearable
|
||||
v-model="form.handbookDate"
|
||||
type="datetime"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
placeholder="请选择发布时间">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="备注" prop="handbookNote">
|
||||
<el-input v-model="form.handbookNote" type="textarea" placeholder="请输入内容" />
|
||||
</el-form-item>
|
||||
<el-form-item label="指南文件" prop="handbookFile">
|
||||
<file-upload v-model="form.handbookFile"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="指南录入流程实例Id" prop="handbookProcId">
|
||||
<el-input v-model="form.handbookProcId" placeholder="请输入指南录入流程实例Id" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listHandbook, getHandbook, delHandbook, addHandbook, updateHandbook } from "@/api/scientific/handbook";
|
||||
import planApply from '@/views/scientific/project_application_plan/planApply.vue'
|
||||
import { listProcess } from '@/api/workflow/process'
|
||||
|
||||
export default {
|
||||
name: "Handbook",
|
||||
computed: {
|
||||
planApply() {
|
||||
return planApply
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
// 按钮loading
|
||||
buttonLoading: false,
|
||||
// 遮罩层
|
||||
loading: true,
|
||||
// 选中数组
|
||||
ids: [],
|
||||
// 非单个禁用
|
||||
single: true,
|
||||
// 非多个禁用
|
||||
multiple: true,
|
||||
// 显示搜索条件
|
||||
showSearch: true,
|
||||
// 总条数
|
||||
total: 0,
|
||||
// 项目申报指南表格数据
|
||||
handbookList: [],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
handbookId: undefined,
|
||||
handbookName: undefined,
|
||||
handbookCategory: undefined,
|
||||
handbookLevel: undefined,
|
||||
handbookDate: undefined,
|
||||
handbookNote: undefined,
|
||||
handbookFile: undefined,
|
||||
handbookProcId: undefined,
|
||||
handbookStatus: 3,
|
||||
},
|
||||
// 表单参数
|
||||
form: {},
|
||||
// 表单校验
|
||||
rules: {
|
||||
handbookId: [
|
||||
{ required: true, message: "项目ID不能为空", trigger: "blur" }
|
||||
],
|
||||
handbookName: [
|
||||
{ required: true, message: "指南名称不能为空", trigger: "blur" }
|
||||
],
|
||||
handbookCategory: [
|
||||
{ required: true, message: "指南分类不能为空", trigger: "blur" }
|
||||
],
|
||||
handbookLevel: [
|
||||
{ required: true, message: "指南级别(4院级 3市级 2省级 1国家级)不能为空", trigger: "blur" }
|
||||
],
|
||||
handbookDate: [
|
||||
{ required: true, message: "发布时间不能为空", trigger: "blur" }
|
||||
],
|
||||
handbookNote: [
|
||||
{ required: true, message: "备注不能为空", trigger: "blur" }
|
||||
],
|
||||
handbookFile: [
|
||||
{ required: true, message: "指南文件不能为空", trigger: "blur" }
|
||||
],
|
||||
handbookProcId: [
|
||||
{ required: true, message: "指南录入流程实例Id不能为空", trigger: "blur" }
|
||||
],
|
||||
handbookStatus: [
|
||||
{ required: true, message: "指南录入流程状态(0未发起审核 1审核中 2审核失败 3审核通过)不能为空", trigger: "change" }
|
||||
],
|
||||
}
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getList();
|
||||
},
|
||||
methods: {
|
||||
/** 查询项目申报指南列表 */
|
||||
getList() {
|
||||
this.loading = true;
|
||||
listHandbook(this.queryParams).then(response => {
|
||||
this.handbookList = response.rows;
|
||||
this.total = response.total;
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
// 取消按钮
|
||||
cancel() {
|
||||
this.open = false;
|
||||
this.reset();
|
||||
},
|
||||
// 表单重置
|
||||
reset() {
|
||||
this.form = {
|
||||
handbookId: undefined,
|
||||
handbookName: undefined,
|
||||
handbookCategory: undefined,
|
||||
handbookLevel: undefined,
|
||||
handbookDate: undefined,
|
||||
handbookNote: undefined,
|
||||
handbookFile: undefined,
|
||||
handbookProcId: undefined,
|
||||
handbookStatus: undefined,
|
||||
createBy: undefined,
|
||||
createTime: undefined,
|
||||
updateBy: undefined,
|
||||
updateTime: undefined
|
||||
};
|
||||
this.resetForm("form");
|
||||
},
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
this.queryParams.pageNum = 1;
|
||||
this.getList();
|
||||
},
|
||||
/** 重置按钮操作 */
|
||||
resetQuery() {
|
||||
this.resetForm("queryForm");
|
||||
this.handleQuery();
|
||||
},
|
||||
// 多选框选中数据
|
||||
handleSelectionChange(selection) {
|
||||
this.ids = selection.map(item => item.handbookId)
|
||||
this.single = selection.length!==1
|
||||
this.multiple = !selection.length
|
||||
},
|
||||
/** 新增按钮操作 */
|
||||
handleAdd() {
|
||||
this.reset();
|
||||
this.open = true;
|
||||
this.title = "添加项目申报指南";
|
||||
},
|
||||
/** 修改按钮操作 */
|
||||
handleUpdate(row) {
|
||||
this.loading = true;
|
||||
this.reset();
|
||||
const handbookId = row.handbookId || this.ids
|
||||
getHandbook(handbookId).then(response => {
|
||||
this.loading = false;
|
||||
this.form = response.data;
|
||||
this.open = true;
|
||||
this.title = "修改项目申报指南";
|
||||
});
|
||||
},
|
||||
/** 提交按钮 */
|
||||
submitForm() {
|
||||
this.$refs["form"].validate(valid => {
|
||||
if (valid) {
|
||||
this.buttonLoading = true;
|
||||
if (this.form.handbookId != null) {
|
||||
updateHandbook(this.form).then(response => {
|
||||
this.$modal.msgSuccess("修改成功");
|
||||
this.open = false;
|
||||
this.getList();
|
||||
}).finally(() => {
|
||||
this.buttonLoading = false;
|
||||
});
|
||||
} else {
|
||||
addHandbook(this.form).then(response => {
|
||||
this.$modal.msgSuccess("新增成功");
|
||||
this.open = false;
|
||||
this.getList();
|
||||
}).finally(() => {
|
||||
this.buttonLoading = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
/** 删除按钮操作 */
|
||||
handleDelete(row) {
|
||||
const handbookIds = row.handbookId || this.ids;
|
||||
this.$modal.confirm('是否确认删除项目申报指南编号为"' + handbookIds + '"的数据项?').then(() => {
|
||||
this.loading = true;
|
||||
return delHandbook(handbookIds);
|
||||
}).then(() => {
|
||||
this.loading = false;
|
||||
this.getList();
|
||||
this.$modal.msgSuccess("删除成功");
|
||||
}).catch(() => {
|
||||
}).finally(() => {
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
/** 导出按钮操作 */
|
||||
handleExport() {
|
||||
this.download('scientific/project_application_plan/export', {
|
||||
...this.queryParams
|
||||
}, `handbook_${new Date().getTime()}.xlsx`)
|
||||
},
|
||||
handleHandbookDetail(row) {
|
||||
this.$router.push({
|
||||
path: '/scientific/handbook/detail/' + row.handbookProcId,
|
||||
query: {
|
||||
processed: false,
|
||||
}
|
||||
})
|
||||
},
|
||||
handlePlanApply(row) {
|
||||
// 跳转到申报计划录入
|
||||
this.$router.push({
|
||||
name: 'planApply',
|
||||
params: {
|
||||
handbook: row
|
||||
}
|
||||
})
|
||||
},
|
||||
formatHandbookLevel(cellValue) {
|
||||
switch (cellValue) {
|
||||
case '1':
|
||||
return "国家级";
|
||||
case '2':
|
||||
return "省级";
|
||||
case '3':
|
||||
return "市级";
|
||||
case '4':
|
||||
return "院级";
|
||||
default:
|
||||
return "未知";
|
||||
}
|
||||
},
|
||||
getTagLevelType(status) {
|
||||
switch (status) {
|
||||
case '2':
|
||||
// 省级 蓝色
|
||||
return 'primary';
|
||||
case '3':
|
||||
// 市级 显示绿色
|
||||
return 'success';
|
||||
case '4':
|
||||
// 院级, 灰色
|
||||
return 'info';
|
||||
case '1':
|
||||
// 国家级 红色
|
||||
return 'danger';
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
},
|
||||
formatHandbookType(cellValue) {
|
||||
switch (cellValue) {
|
||||
case '1':
|
||||
return "科技计划";
|
||||
case '2':
|
||||
return "研发计划";
|
||||
default:
|
||||
return "未知";
|
||||
}
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
|
@ -0,0 +1,308 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form-item label="项目名称" prop="name">
|
||||
<el-input
|
||||
v-model="queryParams.name"
|
||||
placeholder="请输入项目名称"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目创建时间" prop="createTime">
|
||||
<el-date-picker clearable
|
||||
v-model="queryParams.createTime"
|
||||
type="date"
|
||||
value-format="yyyy-MM-dd"
|
||||
placeholder="请选择项目创建时间">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="primary"
|
||||
plain
|
||||
icon="el-icon-plus"
|
||||
size="mini"
|
||||
@click="handleAdd"
|
||||
v-hasPermi="['scientific:project:add']"
|
||||
>新增</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="success"
|
||||
plain
|
||||
icon="el-icon-edit"
|
||||
size="mini"
|
||||
:disabled="single"
|
||||
@click="handleUpdate"
|
||||
v-hasPermi="['scientific:project:edit']"
|
||||
>修改</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="danger"
|
||||
plain
|
||||
icon="el-icon-delete"
|
||||
size="mini"
|
||||
:disabled="multiple"
|
||||
@click="handleDelete"
|
||||
v-hasPermi="['scientific:project:remove']"
|
||||
>删除</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="warning"
|
||||
plain
|
||||
icon="el-icon-download"
|
||||
size="mini"
|
||||
@click="handleExport"
|
||||
v-hasPermi="['scientific:project:export']"
|
||||
>导出</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="projectList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="项目名称" align="center" prop="name" />
|
||||
<el-table-column label="项目创建时间" align="center" prop="createTime" width="180">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-edit"
|
||||
@click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['scientific:project:edit']"
|
||||
>修改</el-button>
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-delete"
|
||||
@click="handleDelete(scope.row)"
|
||||
v-hasPermi="['scientific:project:remove']"
|
||||
>删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination
|
||||
v-show="total>0"
|
||||
:total="total"
|
||||
:page.sync="queryParams.pageNum"
|
||||
:limit.sync="queryParams.pageSize"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<!-- 添加或修改科研管理对话框 -->
|
||||
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
|
||||
<el-form-item label="项目名称" prop="name">
|
||||
<el-input v-model="form.name" placeholder="请输入项目名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="项目类别" prop="category">
|
||||
<el-input v-model="form.category" placeholder="请输入项目类别" />
|
||||
</el-form-item>
|
||||
<el-form-item label="项目创建时间" prop="createTime">
|
||||
<el-date-picker clearable
|
||||
v-model="form.createTime"
|
||||
type="datetime"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
placeholder="请选择项目创建时间">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listProject, getProject, delProject, addProject, updateProject } from "@/api/scientific/project";
|
||||
|
||||
export default {
|
||||
name: "Project",
|
||||
data() {
|
||||
return {
|
||||
// 按钮loading
|
||||
buttonLoading: false,
|
||||
// 遮罩层
|
||||
loading: true,
|
||||
// 选中数组
|
||||
ids: [],
|
||||
// 非单个禁用
|
||||
single: true,
|
||||
// 非多个禁用
|
||||
multiple: true,
|
||||
// 显示搜索条件
|
||||
showSearch: true,
|
||||
// 总条数
|
||||
total: 0,
|
||||
// 科研管理表格数据
|
||||
projectList: [],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
projectId: undefined,
|
||||
handbookId: undefined,
|
||||
category: undefined,
|
||||
name: undefined,
|
||||
createTime: undefined
|
||||
},
|
||||
// 表单参数
|
||||
form: {},
|
||||
// 表单校验
|
||||
rules: {
|
||||
id: [
|
||||
{ required: true, message: "不能为空", trigger: "blur" }
|
||||
],
|
||||
projectId: [
|
||||
{ required: true, message: "项目id不能为空", trigger: "blur" }
|
||||
],
|
||||
handbookId: [
|
||||
{ required: true, message: "指南id不能为空", trigger: "blur" }
|
||||
],
|
||||
category: [
|
||||
{ required: true, message: "项目类别不能为空", trigger: "blur" }
|
||||
],
|
||||
name: [
|
||||
{ required: true, message: "项目名称不能为空", trigger: "blur" }
|
||||
],
|
||||
},
|
||||
handbookName: undefined,
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getList();
|
||||
},
|
||||
methods: {
|
||||
/** 查询科研管理列表 */
|
||||
getList() {
|
||||
this.loading = true;
|
||||
this.queryParams.handbookId = this.$route.query && this.$route.query.handbookId;
|
||||
this.handbookName = this.$route.query && this.$route.query.handbookname;
|
||||
|
||||
listProject(this.queryParams).then(response => {
|
||||
this.projectList = response.rows;
|
||||
this.total = response.total;
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
// 取消按钮
|
||||
cancel() {
|
||||
this.open = false;
|
||||
this.reset();
|
||||
},
|
||||
// 表单重置
|
||||
reset() {
|
||||
this.form = {
|
||||
id: undefined,
|
||||
projectId: undefined,
|
||||
handbookId: undefined,
|
||||
category: undefined,
|
||||
name: undefined,
|
||||
createTime: undefined
|
||||
};
|
||||
this.resetForm("form");
|
||||
},
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
this.queryParams.pageNum = 1;
|
||||
this.getList();
|
||||
},
|
||||
/** 重置按钮操作 */
|
||||
resetQuery() {
|
||||
this.resetForm("queryForm");
|
||||
this.handleQuery();
|
||||
},
|
||||
// 多选框选中数据
|
||||
handleSelectionChange(selection) {
|
||||
this.ids = selection.map(item => item.id)
|
||||
this.single = selection.length!==1
|
||||
this.multiple = !selection.length
|
||||
},
|
||||
/** 新增按钮操作 */
|
||||
handleAdd() {
|
||||
this.reset();
|
||||
this.open = true;
|
||||
this.title = "添加科研管理";
|
||||
},
|
||||
/** 修改按钮操作 */
|
||||
handleUpdate(row) {
|
||||
this.loading = true;
|
||||
this.reset();
|
||||
const id = row.id || this.ids
|
||||
getProject(id).then(response => {
|
||||
this.loading = false;
|
||||
this.form = response.data;
|
||||
this.open = true;
|
||||
this.title = "修改科研管理";
|
||||
});
|
||||
},
|
||||
/** 提交按钮 */
|
||||
submitForm() {
|
||||
this.$refs["form"].validate(valid => {
|
||||
if (valid) {
|
||||
this.buttonLoading = true;
|
||||
if (this.form.id != null) {
|
||||
updateProject(this.form).then(response => {
|
||||
this.$modal.msgSuccess("修改成功");
|
||||
this.open = false;
|
||||
this.getList();
|
||||
}).finally(() => {
|
||||
this.buttonLoading = false;
|
||||
});
|
||||
} else {
|
||||
addProject(this.form).then(response => {
|
||||
this.$modal.msgSuccess("新增成功");
|
||||
this.open = false;
|
||||
this.getList();
|
||||
}).finally(() => {
|
||||
this.buttonLoading = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
/** 删除按钮操作 */
|
||||
handleDelete(row) {
|
||||
const ids = row.id || this.ids;
|
||||
this.$modal.confirm('是否确认删除科研管理编号为"' + ids + '"的数据项?').then(() => {
|
||||
this.loading = true;
|
||||
return delProject(ids);
|
||||
}).then(() => {
|
||||
this.loading = false;
|
||||
this.getList();
|
||||
this.$modal.msgSuccess("删除成功");
|
||||
}).catch(() => {
|
||||
}).finally(() => {
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
/** 导出按钮操作 */
|
||||
handleExport() {
|
||||
this.download('scientific/project/export', {
|
||||
...this.queryParams
|
||||
}, `project_${new Date().getTime()}.xlsx`)
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
|
@ -1,117 +0,0 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-card class="box-card">
|
||||
<div slot="header" class="clearfix">
|
||||
<span>{{ processName }}</span>
|
||||
</div>
|
||||
|
||||
<el-col :span="18" :offset="3">
|
||||
<div class="form-conf" v-if="formOpen">
|
||||
<parser :key="new Date().getTime()" :form-conf="formData" @submit="submit" ref="parser" @getData="getData"/>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listProcess} from "@/api/workflow/process";
|
||||
import { listAllCategory } from '@/api/workflow/category'
|
||||
import { getProcessForm, startProcess } from '@/api/workflow/process'
|
||||
import Parser from '@/utils/generator/parser'
|
||||
|
||||
export default {
|
||||
name: 'handbookApply',
|
||||
components: {
|
||||
Parser
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
definitionId: null,
|
||||
deployId: null,
|
||||
procInsId: null,
|
||||
formOpen: false,
|
||||
formData: {},
|
||||
|
||||
processName: '',
|
||||
categoryOptions: [],
|
||||
// 流程定义表格数据
|
||||
processParams: null,
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
processKey: undefined,
|
||||
processName: "项目指南录入",
|
||||
category: "007"
|
||||
},
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.initData();
|
||||
},
|
||||
methods: {
|
||||
initData() {
|
||||
/** 查询流程定义列表 */
|
||||
listProcess(this.queryParams).then(response => {
|
||||
this.processParams = response.rows[0];
|
||||
this.processName = this.processParams.processName;
|
||||
this.definitionId = this.processParams.definitionId;
|
||||
|
||||
getProcessForm({
|
||||
definitionId: this.processParams.definitionId,
|
||||
deployId: this.processParams.deploymentId,
|
||||
procInsId: undefined
|
||||
}).then(res => {
|
||||
if (res.data) {
|
||||
this.formData = res.data;
|
||||
this.formOpen = true
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
/** 接收子组件传的值 */
|
||||
getData(data) {
|
||||
if (data) {
|
||||
const variables = [];
|
||||
data.fields.forEach(item => {
|
||||
let variableData = {};
|
||||
variableData.label = item.__config__.label
|
||||
// 表单值为多个选项时
|
||||
if (item.__config__.defaultValue instanceof Array) {
|
||||
const array = [];
|
||||
item.__config__.defaultValue.forEach(val => {
|
||||
array.push(val)
|
||||
})
|
||||
variableData.val = array;
|
||||
} else {
|
||||
variableData.val = item.__config__.defaultValue
|
||||
}
|
||||
variables.push(variableData)
|
||||
})
|
||||
this.variables = variables;
|
||||
}
|
||||
},
|
||||
submit(data) {
|
||||
if (data && this.definitionId) {
|
||||
// 启动流程并将表单数据加入流程变量
|
||||
startProcess(this.definitionId, JSON.stringify(data.valData)).then(res => {
|
||||
this.$modal.msgSuccess(res.msg);
|
||||
this.$tab.closeOpenPage({
|
||||
path: '/work/own'
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.form-conf {
|
||||
margin: 15px auto;
|
||||
width: 80%;
|
||||
padding: 15px;
|
||||
}
|
||||
</style>
|
|
@ -68,135 +68,62 @@
|
|||
@click="handleExport"
|
||||
>导出</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<!-- <el-table v-loading="loading" :data="handbookList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="流程编号" align="center" prop="procInsId" :show-overflow-tooltip="true"/>
|
||||
<el-table-column label="指南名称" align="center" prop="procDefName" :show-overflow-tooltip="true"/>
|
||||
<el-table-column label="流程类别" align="center" prop="category" :formatter="categoryFormat" />
|
||||
<el-table-column label="流程版本" align="center" width="80px">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium" >v{{ scope.row.procDefVersion }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="当前节点" align="center" prop="taskName"/>
|
||||
<el-table-column label="提交时间" align="center" prop="createTime" width="180"/>
|
||||
<el-table-column label="流程状态" align="center" width="100">
|
||||
<template slot-scope="scope">
|
||||
<dict-tag :options="dict.type.wf_process_status" :value="scope.row.processStatus"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="耗时" align="center" prop="duration" width="180"/>
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-tickets"
|
||||
@click="handleFlowRecord(scope.row)"
|
||||
v-hasPermi="['workflow:process:query']"
|
||||
>详情</el-button>
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-delete"
|
||||
@click="handleDelete(scope.row)"
|
||||
v-if="scope.row.finishTime"
|
||||
v-hasPermi="['workflow:process:remove']"
|
||||
>删除</el-button>
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-circle-close"
|
||||
@click="handleStop(scope.row)"
|
||||
v-hasPermi="['workflow:process:cancel']"
|
||||
>取消</el-button>
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-refresh-right"
|
||||
v-hasPermi="['workflow:process:start']"
|
||||
@click="handleAgain(scope.row)"
|
||||
>重新发起</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table> -->
|
||||
|
||||
<el-table v-loading="loading" :data="showList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="序号" type="index" width="50"></el-table-column>
|
||||
<!-- <el-table-column label="指南名称" align="center">
|
||||
<el-table-column label="申报信息名称" align="center" width="280px" :min-width="280">
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row[0] }}
|
||||
</template>
|
||||
</el-table-column> -->
|
||||
|
||||
<el-table-column label="指南名称" align="center" width="180px" :min-width="180">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium">{{ scope.row[0] }}</el-tag>
|
||||
<el-tag size="medium">{{ scope.row.projectName }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="发布人" align="center" prop="directorName" />
|
||||
<el-table-column label="指南类别" align="center">
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row[1] }}
|
||||
{{ scope.row.handbookclass }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="指南级别" align="center">
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row[2] }}
|
||||
{{ scope.row.handbooklevel }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="截至日期" align="center">
|
||||
<el-table-column label="申报结束日期" align="center">
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row[3] }}
|
||||
{{ scope.row.handbookdate }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="指南文件" align="center">
|
||||
<template slot-scope="scope">
|
||||
<el-button class="file" @click="handbookDownload(scope.row[5])" style="color: #1890ff;">
|
||||
<i class="el-icon-download"></i> {{ scope.row[4] }}
|
||||
</el-button>
|
||||
<el-button class="file"
|
||||
type="text"
|
||||
icon="el-icon-download"
|
||||
@click="handbookDownload(scope.row.handbookfile)"
|
||||
>下载</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<el-table-column label="项目申报" align="center">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
<el-button class="file"
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-tickets"
|
||||
@click="handleFlowDetails(scope.row[5])"
|
||||
v-hasPermi="['workflow:process:query']"
|
||||
>详情</el-button>
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-delete"
|
||||
@click="handleDelete(scope.row)"
|
||||
v-if="scope.row.finishTime"
|
||||
v-hasPermi="['workflow:process:remove']"
|
||||
>删除</el-button>
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-circle-close"
|
||||
@click="handleStop(scope.row)"
|
||||
v-hasPermi="['workflow:process:cancel']"
|
||||
>取消</el-button>
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-refresh-right"
|
||||
v-hasPermi="['workflow:process:start']"
|
||||
@click="handleAgain(scope.row)"
|
||||
>重新发起</el-button>
|
||||
icon="el-icon-top"
|
||||
@click="projectApply(scope.row)"
|
||||
>进入申报</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="操作" align="center">
|
||||
<template slot-scope="scope">
|
||||
<el-button class="file"
|
||||
type="text"
|
||||
icon="el-icon-folder-checked"
|
||||
@click="listProject(scope.row)"
|
||||
>已申报项目</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination
|
||||
|
@ -211,14 +138,20 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import {stopProcess, delProcess, listHandbook, detailProcess} from '@/api/workflow/process';
|
||||
import {
|
||||
stopProcess,
|
||||
delProcess,
|
||||
listHandbook,
|
||||
detailProcesses,
|
||||
listProcess
|
||||
} from '@/api/workflow/process';
|
||||
import { listAllCategory } from '@/api/workflow/category';
|
||||
import Parser from '@/utils/generator/parser'
|
||||
import {getToken} from "@/utils/auth";
|
||||
// import {deepClone} from "@/utils";
|
||||
import {listProject} from "@/api/scientific/project";
|
||||
|
||||
export default {
|
||||
name: "Own",
|
||||
name: "handbookQuery",
|
||||
dicts: ['wf_process_status'],
|
||||
components: {
|
||||
Parser,
|
||||
|
@ -240,8 +173,6 @@ export default {
|
|||
total: 0,
|
||||
categoryOptions: [],
|
||||
processTotal:0,
|
||||
// 我发起的流程列表数据
|
||||
handbookList: [],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
// 是否显示弹出层
|
||||
|
@ -264,73 +195,100 @@ export default {
|
|||
rules: {
|
||||
},
|
||||
|
||||
processFormList: [], // 流程变量数据
|
||||
// 从后端查询的原始列表数据
|
||||
handbookList: [],
|
||||
// 解析用于显示的数据
|
||||
showList: [],
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getCategoryList();
|
||||
},
|
||||
beforeRouteEnter(to, from, next) {
|
||||
next(vm => {
|
||||
vm.getList()
|
||||
})
|
||||
|
||||
async created() {
|
||||
await this.getList();
|
||||
await this.getProcessDetails();
|
||||
},
|
||||
|
||||
methods: {
|
||||
// 文件下载
|
||||
handbookDownload(ossId) {
|
||||
this.$download.oss(ossId)
|
||||
handbookDownload(handbookfile) {
|
||||
handbookfile.forEach( file => {
|
||||
if(file.response.code === 200 && file.ossId) {
|
||||
this.$download.oss(file.ossId);
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
projectApply(row) {
|
||||
let queryParams = {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
processKey: undefined,
|
||||
processName: "项目申报",
|
||||
category: "002"
|
||||
};
|
||||
// 跳转到项目申报
|
||||
listProcess(queryParams).then(response => {
|
||||
const apply = response.rows[0];
|
||||
if(apply) {
|
||||
this.$router.push({
|
||||
path: '/scientific/projectApply/' + apply.deploymentId,
|
||||
query: {
|
||||
definitionId: apply.definitionId,
|
||||
processName: row.handbookname,
|
||||
handbookId: row.procInsId,
|
||||
}
|
||||
})
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
listProject(row) {
|
||||
if(row.procInsId) {
|
||||
this.$router.push({
|
||||
path: '/scientific/handbookProjectQuery/' + row.procInsId,
|
||||
query: {
|
||||
processName: row.handbookname,
|
||||
handbookId: row.procInsId,
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
/** 查询流程定义列表 */
|
||||
getList() {
|
||||
// zqjia:这个解析要模仿parser.js重写
|
||||
return new Promise((resolve,reject)=>{
|
||||
this.showList = [];
|
||||
this.loading = true;
|
||||
// 先列出所有的指南流程
|
||||
listHandbook(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
|
||||
this.handbookList = response.rows;
|
||||
this.total = response.total;
|
||||
this.loading = false;
|
||||
resolve();
|
||||
});
|
||||
})
|
||||
},
|
||||
|
||||
// 流程任务重获取变量表单
|
||||
getProcessDetails(procInsId, taskId) {
|
||||
const params = {procInsId: procInsId, taskId: taskId}
|
||||
detailProcess(params).then(res => {
|
||||
const data = res.data;
|
||||
const formList = data.processFormList;
|
||||
formList.forEach(form => {
|
||||
var dataShow = [];
|
||||
const fields = form.fields;
|
||||
|
||||
// zqjia:fields对应的是提交表单的各项数据,不同的序号对应不同的类型,分开处理
|
||||
for (var i = 0; i < fields.length; i++) {
|
||||
const tmp = fields[i];
|
||||
const slot = tmp.__slot__;
|
||||
const config = tmp.__config__;
|
||||
if (i === 4 && config.defaultValue) {
|
||||
tmp['file-list'] = config.defaultValue;
|
||||
tmp['headers'] = {
|
||||
Authorization: "Bearer " + getToken(),
|
||||
}
|
||||
|
||||
// tmp['on-success'] = (res, file, fileList) => {
|
||||
// if (res.code === 200 && fileList) {
|
||||
// config.defaultValue = fileList;
|
||||
// fileList.forEach(val =>{
|
||||
// val.url = val.response.data.url;
|
||||
// val.ossId = val.response.data.ossId;
|
||||
// })
|
||||
// }
|
||||
// };
|
||||
|
||||
// zqjia:点击文件列表中文件的ossId,现在假设只有一个文件
|
||||
dataShow.push(config.defaultValue[0].name);
|
||||
dataShow.push(config.defaultValue[0].ossId);
|
||||
dataShow.push(procInsId);
|
||||
}
|
||||
else {
|
||||
if (slot !== undefined && slot.options !== undefined) {
|
||||
dataShow.push(slot.options[config.defaultValue - 1].label);
|
||||
}
|
||||
else {
|
||||
dataShow.push(config.defaultValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
this.showList.push(dataShow);
|
||||
});
|
||||
// zqjia:存储了原始表单数据,暂时未用到
|
||||
this.processFormList.push(data.processFormList);
|
||||
getProcessDetails() {
|
||||
return new Promise((resolve, reject)=>{
|
||||
let pId = [];
|
||||
let tId = [];
|
||||
this.handbookList.forEach(handbook => {
|
||||
pId.push(handbook.procInsId);
|
||||
tId.push(undefined);
|
||||
})
|
||||
const params = {procInsIds: pId};
|
||||
detailProcesses(pId).then(res => {
|
||||
res.rows.forEach(row => {
|
||||
let processForm = row.processFormList[0];
|
||||
let formData = [];
|
||||
// 从原始表单中筛选解析的数据显示
|
||||
this.parseFormData(processForm.fields, formData);
|
||||
formData["procInsId"] = row.procInsId;
|
||||
this.showList.push(formData);
|
||||
})
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
|
@ -338,19 +296,42 @@ export default {
|
|||
getCategoryList() {
|
||||
listAllCategory().then(response => this.categoryOptions = response.data)
|
||||
},
|
||||
/** 查询流程定义列表 */
|
||||
getList() {
|
||||
this.loading = true;
|
||||
listHandbook(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
|
||||
this.handbookList = response.rows;
|
||||
this.total = response.total;
|
||||
this.loading = false;
|
||||
this.handbookList.forEach(handbook => {
|
||||
this.getProcessDetails(handbook.procInsId, undefined);
|
||||
});
|
||||
});
|
||||
// console.log(this.showList);
|
||||
console.log(this.processFormList);
|
||||
/**
|
||||
* 从原始的流程表单中解析字段数据
|
||||
* @author zqjia
|
||||
*/
|
||||
parseFormData(componentList, formData) {
|
||||
componentList.forEach(cur => {
|
||||
this.buildOptionMethod(cur)
|
||||
const config = cur.__config__;
|
||||
if (cur.__vModel__) {
|
||||
if(cur.__slot__ && 'options' in cur.__slot__) {
|
||||
formData[cur.__vModel__] = cur.__slot__.options[config.defaultValue-1].label;
|
||||
}
|
||||
else {
|
||||
formData[cur.__vModel__] = config.defaultValue;
|
||||
}
|
||||
}
|
||||
if (config.children) {
|
||||
this.parseFormData(config.children, formData);
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
// 特殊处理的 Option
|
||||
buildOptionMethod(scheme) {
|
||||
const config = scheme.__config__;
|
||||
if (config && config.tag === 'el-cascader') {
|
||||
if (config.dataType === 'dynamic') {
|
||||
this.$axios({
|
||||
method: config.method,
|
||||
url: config.url
|
||||
}).then(resp => {
|
||||
var { data } = resp
|
||||
scheme[config.dataConsumer] = data[config.dataKey]
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// 取消按钮
|
||||
|
@ -419,14 +400,6 @@ export default {
|
|||
}
|
||||
})
|
||||
},
|
||||
handleFlowDetails(procInsId) {
|
||||
this.$router.push({
|
||||
path: '/workflow/process/detail/' + procInsId,
|
||||
query: {
|
||||
processed: false
|
||||
}
|
||||
})
|
||||
},
|
||||
/** 删除按钮操作 */
|
||||
handleDelete(row) {
|
||||
const ids = row.procInsId || this.ids;
|
||||
|
|
|
@ -0,0 +1,529 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form-item label="项目名称" prop="projectName">
|
||||
<el-input
|
||||
v-model="queryParams.projectName"
|
||||
placeholder="请输入项目名称"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="projectStatus">
|
||||
<el-input
|
||||
v-model="queryParams.projectStatus"
|
||||
placeholder="请输入状态"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="申报开始日期" prop="projectAppStTime" label-width="140px">
|
||||
<el-date-picker clearable
|
||||
v-model="queryParams.projectAppStTime"
|
||||
type="date"
|
||||
value-format="yyyy-MM-dd"
|
||||
placeholder="请选择申报开始日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="申报结束日期" prop="projectAppEndTime" label-width="140px">
|
||||
<el-date-picker clearable
|
||||
v-model="queryParams.projectAppEndTime"
|
||||
type="date"
|
||||
value-format="yyyy-MM-dd"
|
||||
placeholder="请选择申报结束日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目负责人" prop="projectLeader" label-width="140px">
|
||||
<el-input
|
||||
v-model="queryParams.projectLeader"
|
||||
placeholder="请输入项目负责人"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="项目预算(万)" prop="projectBudget" label-width="100px">
|
||||
<el-input
|
||||
v-model="queryParams.projectBudget"
|
||||
placeholder="请输入项目预算(万)"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目负责人联系电话" prop="projectLeaderPhone" label-width="140px">
|
||||
<el-input
|
||||
v-model="queryParams.projectLeaderPhone"
|
||||
placeholder="请输入联系电话"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="primary"
|
||||
plain
|
||||
icon="el-icon-plus"
|
||||
size="mini"
|
||||
@click="handleAdd"
|
||||
v-hasPermi="['scientific:application:add']"
|
||||
>项目填写</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="success"
|
||||
plain
|
||||
icon="el-icon-edit"
|
||||
size="mini"
|
||||
:disabled="single"
|
||||
@click="handleUpdate"
|
||||
v-hasPermi="['scientific:application:edit']"
|
||||
>修改</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="danger"
|
||||
plain
|
||||
icon="el-icon-delete"
|
||||
size="mini"
|
||||
:disabled="multiple"
|
||||
@click="handleDelete"
|
||||
v-hasPermi="['scientific:application:remove']"
|
||||
>删除</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="warning"
|
||||
plain
|
||||
icon="el-icon-download"
|
||||
size="mini"
|
||||
@click="handleExport"
|
||||
v-hasPermi="['scientific:application:export']"
|
||||
>导出</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="applicationList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="序号" type="index" width="50"></el-table-column>
|
||||
<!-- <el-table-column label="项目ID" align="center" prop="projectId" v-if="true" width="180"/> -->
|
||||
<el-table-column label="项目名称" align="center" :min-width="280">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium">{{ scope.row.projectName }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="项目负责人" align="center" prop="projectLeader" width="100"/>
|
||||
<el-table-column label="申报状态" align="center" width="100px" :min-width="100">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium" :type="getTagType(scope.row.projectDeclareStatus)">
|
||||
{{ formatProjectDeclareStatus(scope.row.projectDeclareStatus) }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="申报开始日期" align="center" prop="projectAppStTime" :min-width="140" width="140">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.projectAppStTime, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="申报结束日期" align="center" prop="projectAppEndTime" width="140">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.projectAppEndTime, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="项目预算(万)" align="center" prop="projectBudget" :min-width="180" width="180"/>
|
||||
<el-table-column label="负责人电话" align="center" prop="projectLeaderPhone" :min-width="150" width="150"/>
|
||||
<el-table-column label="操作" align="center" :min-width="280" width="280">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-top"
|
||||
@click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['project:application:remove']"
|
||||
>申报项目</el-button>
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-edit"
|
||||
@click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['scientific:application:edit']"
|
||||
>信息修改</el-button>
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-edit"
|
||||
@click="handleUpdateBudget(scope.row)"
|
||||
v-hasPermi="['scientific:application:edit']"
|
||||
>预算追加</el-button>
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-delete"
|
||||
@click="handleDelete(scope.row)"
|
||||
v-hasPermi="['scientific:application:remove']"
|
||||
>删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination
|
||||
v-show="total>0"
|
||||
:total="total"
|
||||
:page.sync="queryParams.pageNum"
|
||||
:limit.sync="queryParams.pageSize"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<!-- 添加或修改项目申报对话框, 采用open字段控制是否 -->
|
||||
<!-- 这是提交或者详细信息的表单显示框 -->
|
||||
<!-- 这个表单的名字为form:
|
||||
在form.projectName这种方式配置参数 -->
|
||||
<el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="150px" >
|
||||
<el-form-item label="项目名称" prop="projectName" >
|
||||
<el-input v-model="form.projectName" placeholder="请输入项目名称" :style="{ width: '400px' }"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目负责人" prop="projectLeader">
|
||||
<el-input v-model="form.projectLeader" placeholder="请输入项目负责人" :style="{ width: '100px'}"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="projectStatus" >
|
||||
<el-input v-model="form.projectStatus" placeholder="请输入状态" :style="{ width: '50px' }"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="申报开始日期" prop="projectAppStTime" >
|
||||
<el-date-picker clearable
|
||||
v-model="form.projectAppStTime"
|
||||
type="datetime"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
placeholder="请选择申报开始日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="申报结束日期" prop="projectAppEndTime">
|
||||
<el-date-picker clearable
|
||||
v-model="form.projectAppEndTime"
|
||||
type="datetime"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
placeholder="请选择申报结束日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目预算(万)" prop="projectBudget">
|
||||
<el-input v-model="form.projectBudget" placeholder="请输入项目预算(万)" :style="{ width: '100px'}"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目负责人电话" prop="projectLeaderPhone">
|
||||
<el-input v-model="form.projectLeaderPhone" placeholder="请输入项目负责人联系电话" :style="{ width: '140px'}" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listApplication, getApplication, delApplication, addApplication, updateApplication } from "@/api/scientific/application";
|
||||
import { listProcess} from "@/api/workflow/process";
|
||||
export default {
|
||||
name: "Application",
|
||||
data() {
|
||||
return {
|
||||
// 按钮loading
|
||||
buttonLoading: false,
|
||||
// 遮罩层
|
||||
loading: true,
|
||||
// 选中数组
|
||||
ids: [],
|
||||
// 非单个禁用
|
||||
single: true,
|
||||
// 非多个禁用
|
||||
multiple: true,
|
||||
// 显示搜索条件
|
||||
showSearch: true,
|
||||
// 总条数
|
||||
total: 0,
|
||||
// 项目申报表格数据
|
||||
applicationList: [],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
projectName: undefined,
|
||||
projectStatus: undefined,
|
||||
projectAppProcId: undefined,
|
||||
projectAppStaus: undefined,
|
||||
projectAppStTime: undefined,
|
||||
projectAppEndTime: undefined,
|
||||
projectLeader: undefined,
|
||||
projectBudget: undefined,
|
||||
projectLeaderPhone: undefined,
|
||||
},
|
||||
queryProcParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
processKey: undefined,
|
||||
processName: "项目预算追加表",
|
||||
category: "001"
|
||||
},
|
||||
// 表单参数
|
||||
form: {},
|
||||
// 表单校验
|
||||
rules: {
|
||||
projectId: [
|
||||
{ required: true, message: "项目ID不能为空", trigger: "blur" }
|
||||
],
|
||||
projectName: [
|
||||
{ required: true, message: "项目名称不能为空", trigger: "blur" }
|
||||
],
|
||||
projectStatus: [
|
||||
{ required: true, message: "状态不能为空", trigger: "blur" }
|
||||
],
|
||||
projectAppStTime: [
|
||||
{ required: true, message: "申报开始日期不能为空", trigger: "blur" }
|
||||
],
|
||||
projectAppEndTime: [
|
||||
{ required: true, message: "申报结束日期不能为空", trigger: "blur" }
|
||||
],
|
||||
projectLeader: [
|
||||
{ required: true, message: "项目负责人不能为空", trigger: "blur" }
|
||||
],
|
||||
projectBudget: [
|
||||
{ required: true, message: "项目预算(万)不能为空", trigger: "blur" }
|
||||
],
|
||||
projectLeaderPhone: [
|
||||
{ required: true, message: "项目负责人联系电话不能为空", trigger: "blur" }
|
||||
],
|
||||
}
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getList();
|
||||
},
|
||||
// logzhan : 当我们跳转到其他路由页面,例如预算变更的时候,再次回来时
|
||||
// 需要用这个函数刷新列表,否则列表将处于刷新状态不显示信息
|
||||
beforeRouteEnter(to, from, next) {
|
||||
next(vm => {
|
||||
vm.getList()
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
/** 查询项目申报列表 */
|
||||
getList() {
|
||||
this.loading = true;
|
||||
const queryParams = this.$route.params && this.$route.params.queryParams;
|
||||
if (queryParams !== undefined) {
|
||||
this.queryParams = queryParams;
|
||||
}
|
||||
|
||||
listApplication(this.queryParams).then(response => {
|
||||
this.applicationList = response.rows;
|
||||
this.total = response.total;
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
// 取消按钮
|
||||
cancel() {
|
||||
this.open = false;
|
||||
this.reset();
|
||||
},
|
||||
// 表单重置
|
||||
reset() {
|
||||
this.form = {
|
||||
projectId: undefined,
|
||||
projectName: undefined,
|
||||
projectStatus: undefined,
|
||||
projectAppProcId: undefined,
|
||||
projectAppStaus: undefined,
|
||||
projectAppStTime: undefined,
|
||||
projectAppEndTime: undefined,
|
||||
projectLeader: undefined,
|
||||
projectBudget: undefined,
|
||||
projectLeaderPhone: undefined
|
||||
};
|
||||
this.resetForm("form");
|
||||
},
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
this.queryParams.pageNum = 1;
|
||||
this.getList();
|
||||
},
|
||||
/** 重置按钮操作 */
|
||||
resetQuery() {
|
||||
this.resetForm("queryForm");
|
||||
this.handleQuery();
|
||||
},
|
||||
// 多选框选中数据
|
||||
handleSelectionChange(selection) {
|
||||
this.ids = selection.map(item => item.projectId)
|
||||
this.single = selection.length!==1
|
||||
this.multiple = !selection.length
|
||||
},
|
||||
/** 新增按钮操作 */
|
||||
handleAdd() {
|
||||
this.reset();
|
||||
this.open = true;
|
||||
this.title = "添加项目申报";
|
||||
},
|
||||
/** 修改按钮操作 */
|
||||
handleUpdate(row) {
|
||||
this.loading = true;
|
||||
this.reset();
|
||||
const projectId = row.projectId || this.ids
|
||||
getApplication(projectId).then(response => {
|
||||
this.loading = false;
|
||||
this.form = response.data;
|
||||
this.open = true;
|
||||
this.title = "修改项目申报";
|
||||
console.log(this.form)
|
||||
});
|
||||
},
|
||||
/**
|
||||
* 根据填写的项目信息进行申报
|
||||
*/
|
||||
declareProject(row){
|
||||
|
||||
},
|
||||
/** 修改按钮操作 */
|
||||
handleUpdateBudget(row) {
|
||||
this.loading = true;
|
||||
this.reset();
|
||||
const upProjectId = row.projectId || this.ids
|
||||
|
||||
// 查询项目经费追加流程
|
||||
listProcess(this.queryProcParams).then(response => {
|
||||
this.processParams = response.rows[0];
|
||||
this.deploymentId = this.processParams.deploymentId;
|
||||
this.definitionId = this.processParams.definitionId;
|
||||
// 流程名称暂时没有太大作用
|
||||
// this.processName = this.processParams.processName;
|
||||
this.$router.push({
|
||||
path: `/workflow/process/proj_update/${this.deploymentId}?definitionId=${this.definitionId}`,
|
||||
query: {
|
||||
projectId: upProjectId
|
||||
}
|
||||
});
|
||||
})
|
||||
},
|
||||
|
||||
/** 提交按钮 */
|
||||
submitForm() {
|
||||
// $refs["form"].validate(valid => 验证表单是否有效
|
||||
this.$refs["form"].validate(valid => {
|
||||
if (valid) {
|
||||
this.buttonLoading = true;
|
||||
// 判断是修改还是新增
|
||||
if (this.form.projectId != null) {
|
||||
console.log(this.form)
|
||||
updateApplication(this.form).then(response => {
|
||||
this.$modal.msgSuccess("修改成功");
|
||||
this.open = false;
|
||||
// 提交成功后刷新列表
|
||||
this.getList();
|
||||
}).finally(() => {
|
||||
this.buttonLoading = false;
|
||||
});
|
||||
} else {
|
||||
|
||||
addApplication(this.form).then(response => {
|
||||
this.$modal.msgSuccess("新增成功");
|
||||
this.open = false;
|
||||
this.getList();
|
||||
}).finally(() => {
|
||||
this.buttonLoading = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
/** 删除按钮操作 */
|
||||
handleDelete(row) {
|
||||
const projectIds = row.projectId || this.ids;
|
||||
this.$modal.confirm('是否确认删除项目申报编号为"' + projectIds + '"的数据项?').then(() => {
|
||||
this.loading = true;
|
||||
return delApplication(projectIds);
|
||||
}).then(() => {
|
||||
this.loading = false;
|
||||
this.getList();
|
||||
this.$modal.msgSuccess("删除成功");
|
||||
}).catch(() => {
|
||||
}).finally(() => {
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
/** 导出按钮操作 */
|
||||
handleExport() {
|
||||
this.download('scientific/application/export', {
|
||||
...this.queryParams
|
||||
}, `application_${new Date().getTime()}.xlsx`)
|
||||
},
|
||||
/**
|
||||
* 把项目状态的code转换未文字: 0 : 未立项 1: 审核中 2: 已立项
|
||||
* @param {number|string} cellValue - 原始数值
|
||||
* @returns {string} 转换后的字符串
|
||||
* @author zhanli
|
||||
*/
|
||||
formatProjectAppStatus(cellValue) {
|
||||
switch (cellValue) {
|
||||
case '0':
|
||||
return "未立项";
|
||||
case '1':
|
||||
return "审核中";
|
||||
case '2':
|
||||
return "已立项";
|
||||
default:
|
||||
return "未知状态";
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 把项目状态的申报code转换为文字: 0 : 未申报 1: 审核中 2: 已申报
|
||||
* @param {number|string} cellValue - 原始数值
|
||||
* @returns {string} 转换后的字符串
|
||||
* @author zhanli
|
||||
*/
|
||||
formatProjectDeclareStatus(cellValue) {
|
||||
switch (cellValue) {
|
||||
case '0':
|
||||
return "草稿";
|
||||
case '1':
|
||||
return "审核中";
|
||||
case '2':
|
||||
return "申报通过";
|
||||
default:
|
||||
return "未知状态";
|
||||
}
|
||||
},
|
||||
getTagType(status) {
|
||||
switch (status) {
|
||||
case '2':
|
||||
// 显示绿色 审核通过绿色
|
||||
return 'success';
|
||||
case '1':
|
||||
// 审核中 显示黄色
|
||||
return 'warning';
|
||||
case '0':
|
||||
// 未申报, 灰色
|
||||
return 'primary';
|
||||
case '4':
|
||||
// 其他状态 灰色
|
||||
return 'info';
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
|
@ -0,0 +1,163 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-card class="box-card">
|
||||
<div slot="header" class="clearfix">
|
||||
<span>{{ this.plan.planName }}</span>
|
||||
</div>
|
||||
|
||||
<el-col :span="18" :offset="3">
|
||||
<div class="form-conf" v-if="formOpen">
|
||||
<parser :key="new Date().getTime()" :form-conf="formData" @submit="submit" ref="parser" @getData="getData"/>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getProcessForm, listProcess, startProcess_ } from '@/api/workflow/process'
|
||||
import Parser from '@/utils/generator/parser'
|
||||
import { findLatestDeploymentTimeIndex } from '@/api/scientific/project_application_plan'
|
||||
import { addApplication } from '@/api/scientific/application'
|
||||
|
||||
export default {
|
||||
name: 'WorkStart',
|
||||
components: {
|
||||
Parser
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
definitionId: null,
|
||||
deployId: null,
|
||||
|
||||
formOpen: false,
|
||||
formData: {},
|
||||
|
||||
plan: {},
|
||||
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
processKey: undefined,
|
||||
processName: "",
|
||||
category: "002"
|
||||
},
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.initData();
|
||||
},
|
||||
methods: {
|
||||
initData() {
|
||||
this.plan = this.$route.params && this.$route.params.plan;
|
||||
listProcess(this.queryParams).then(response => {
|
||||
findLatestDeploymentTimeIndex(response).then((latestIndex) => {
|
||||
this.processParams = response.rows[latestIndex];
|
||||
this.processName = this.processParams.processName;
|
||||
this.definitionId = this.processParams.definitionId;
|
||||
getProcessForm({
|
||||
definitionId: this.processParams.definitionId,
|
||||
deployId: this.processParams.deploymentId,
|
||||
procInsId: undefined
|
||||
}).then(res => {
|
||||
if (res.data) {
|
||||
this.formData = res.data;
|
||||
this.formOpen = true;
|
||||
}
|
||||
})
|
||||
});
|
||||
})
|
||||
|
||||
// getProcessForm({
|
||||
// definitionId: this.definitionId,
|
||||
// deployId: this.deployId,
|
||||
// procInsId: undefined,
|
||||
// }).then(res => {
|
||||
// if (res.data) {
|
||||
// this.formData = res.data;
|
||||
// this.formOpen = true
|
||||
// }
|
||||
// })
|
||||
},
|
||||
/** 接收子组件传的值 */
|
||||
getData(data) {
|
||||
if (data) {
|
||||
const variables = [];
|
||||
data.fields.forEach(item => {
|
||||
let variableData = {};
|
||||
variableData.label = item.__config__.label
|
||||
// 表单值为多个选项时
|
||||
if (item.__config__.defaultValue instanceof Array) {
|
||||
const array = [];
|
||||
item.__config__.defaultValue.forEach(val => {
|
||||
array.push(val)
|
||||
})
|
||||
variableData.val = array;
|
||||
} else {
|
||||
variableData.val = item.__config__.defaultValue
|
||||
}
|
||||
variables.push(variableData)
|
||||
})
|
||||
this.variables = variables;
|
||||
}
|
||||
},
|
||||
submit(data) {
|
||||
if (data && this.definitionId) {
|
||||
// 启动流程并将表单数据加入流程变量
|
||||
//startProcess_(this.definitionId, JSON.stringify(data.valData)).then(res => {
|
||||
const ori_data = data.valData;
|
||||
// zqjia:项目申报表单确定后这些信息要改
|
||||
let projectData = {};
|
||||
projectData.projectName = ori_data.projectName;
|
||||
projectData.projectStatus = 1;
|
||||
// 这里返回的是流程的Id
|
||||
projectData.projectAppProcId = "";
|
||||
projectData.projectDeclareStatus = 1;
|
||||
projectData.projectAppStTime = this.formatDateTime(new Date());
|
||||
projectData.projectAppEndTime = this.formatDateTime(new Date());
|
||||
projectData.projectLeader = ori_data.directorName;
|
||||
projectData.projectBudget = ori_data.budgetSum;
|
||||
projectData.projectPlanId = this.plan.planId;
|
||||
projectData.projectPlanName = this.plan.planName;
|
||||
projectData.projectLeaderPhone = ori_data.phoneNumber;
|
||||
projectData.projectCategory = this.plan.planLevel;
|
||||
projectData.projectContent = ori_data.projectContent;
|
||||
|
||||
projectData.projectPlanId = this.plan.planId;
|
||||
projectData.projectPlanName = this.plan.planName;
|
||||
|
||||
addApplication(JSON.stringify(projectData)).then(response => {
|
||||
this.$modal.msgSuccess("申报完成");
|
||||
})
|
||||
|
||||
this.$tab.closeOpenPage({
|
||||
path: '/work/own'
|
||||
})
|
||||
//})
|
||||
}
|
||||
},
|
||||
|
||||
formatDateTime(date) {
|
||||
const padZero = (num) => (num < 10 ? '0' + num : num);
|
||||
|
||||
const year = date.getFullYear();
|
||||
const month = padZero(date.getMonth() + 1); // getMonth() 返回值的范围是 0-11,所以需要加 1
|
||||
const day = padZero(date.getDate());
|
||||
const hours = padZero(date.getHours());
|
||||
const minutes = padZero(date.getMinutes());
|
||||
const seconds = padZero(date.getSeconds());
|
||||
|
||||
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.form-conf {
|
||||
margin: 15px auto;
|
||||
width: 80%;
|
||||
padding: 15px;
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,476 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-tabs tab-position="top" :value="processed === true ? 'approval' : 'form'">
|
||||
|
||||
|
||||
<el-tab-pane label="表单信息" name="form">
|
||||
<div v-if="formOpen">
|
||||
<el-card class="box-card" shadow="never" v-for="(formInfo, index) in processFormList" :key="index">
|
||||
<div slot="header" class="clearfix">
|
||||
<!-- <span>{{ formInfo.title }}</span>-->
|
||||
<span> 计划详情 </span>
|
||||
</div>
|
||||
|
||||
<!--流程处理表单模块-->
|
||||
<el-col :span="20" :offset="2">
|
||||
<parser :form-conf="formInfo"/>
|
||||
</el-col>
|
||||
</el-card>
|
||||
</div>
|
||||
</el-tab-pane >
|
||||
|
||||
</el-tabs>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { detailProcess } from '@/api/workflow/process'
|
||||
import Parser from '@/utils/generator/parser'
|
||||
import { complete, delegate, transfer, rejectTask, returnList, returnTask } from '@/api/workflow/task'
|
||||
import { selectUser, deptTreeSelect } from '@/api/system/user'
|
||||
import ProcessViewer from '@/components/ProcessViewer'
|
||||
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
|
||||
import Treeselect from '@riophae/vue-treeselect'
|
||||
|
||||
export default {
|
||||
name: "WorkDetail",
|
||||
components: {
|
||||
ProcessViewer,
|
||||
Parser,
|
||||
Treeselect
|
||||
},
|
||||
props: {},
|
||||
computed: {
|
||||
commentType() {
|
||||
return val => {
|
||||
switch (val) {
|
||||
case '1': return '通过'
|
||||
case '2': return '退回'
|
||||
case '3': return '驳回'
|
||||
case '4': return '委派'
|
||||
case '5': return '转办'
|
||||
case '6': return '终止'
|
||||
case '7': return '撤回'
|
||||
}
|
||||
}
|
||||
},
|
||||
approveTypeTag() {
|
||||
return val => {
|
||||
switch (val) {
|
||||
case '1': return 'success'
|
||||
case '2': return 'warning'
|
||||
case '3': return 'danger'
|
||||
case '4': return 'primary'
|
||||
case '5': return 'success'
|
||||
case '6': return 'danger'
|
||||
case '7': return 'info'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
height: document.documentElement.clientHeight - 205 + 'px;',
|
||||
// 模型xml数据
|
||||
loadIndex: 0,
|
||||
xmlData: undefined,
|
||||
finishedInfo: {
|
||||
finishedSequenceFlowSet: [],
|
||||
finishedTaskSet: [],
|
||||
unfinishedTaskSet: [],
|
||||
rejectedTaskSet: []
|
||||
},
|
||||
historyProcNodeList: [],
|
||||
// 部门名称
|
||||
deptName: undefined,
|
||||
// 部门树选项
|
||||
deptOptions: undefined,
|
||||
userLoading: false,
|
||||
// 用户表格数据
|
||||
userList: null,
|
||||
deptProps: {
|
||||
children: "children",
|
||||
label: "label"
|
||||
},
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
deptId: undefined
|
||||
},
|
||||
total: 0,
|
||||
// 遮罩层
|
||||
loading: true,
|
||||
taskForm:{
|
||||
comment:"", // 意见内容
|
||||
procInsId: "", // 流程实例编号
|
||||
taskId: "" ,// 流程任务编号
|
||||
copyUserIds: "", // 抄送人Id
|
||||
vars: "",
|
||||
targetKey:""
|
||||
},
|
||||
rules: {
|
||||
comment: [{ required: true, message: '请输入审批意见', trigger: 'blur' }],
|
||||
},
|
||||
currentUserId: null,
|
||||
variables: [], // 流程变量数据
|
||||
taskFormOpen: false,
|
||||
taskFormData: {}, // 流程变量数据
|
||||
processFormList: [], // 流程变量数据
|
||||
formOpen: false, // 是否加载流程变量数据
|
||||
returnTaskList: [], // 回退列表数据
|
||||
processed: false,
|
||||
returnTitle: null,
|
||||
returnOpen: false,
|
||||
rejectOpen: false,
|
||||
rejectTitle: null,
|
||||
userData: {
|
||||
title: '',
|
||||
type: '',
|
||||
open: false,
|
||||
},
|
||||
copyUser: [],
|
||||
nextUser: [],
|
||||
userMultipleSelection: [],
|
||||
userDialogTitle: '',
|
||||
userOpen: false
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.initData();
|
||||
},
|
||||
methods: {
|
||||
initData() {
|
||||
this.taskForm.procInsId = this.$route.params && this.$route.params.planProcId;
|
||||
this.taskForm.taskId = this.$route.query && this.$route.query.taskId;
|
||||
this.processed = this.$route.query && eval(this.$route.query.processed || false);
|
||||
|
||||
// 流程任务重获取变量表单
|
||||
this.getProcessDetails(this.taskForm.procInsId, this.taskForm.taskId);
|
||||
this.loadIndex = this.taskForm.procInsId;
|
||||
},
|
||||
/** 查询部门下拉树结构 */
|
||||
getTreeSelect() {
|
||||
deptTreeSelect().then(response => {
|
||||
this.deptOptions = response.data;
|
||||
});
|
||||
},
|
||||
/** 查询用户列表 */
|
||||
getList() {
|
||||
this.userLoading = true;
|
||||
selectUser(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
|
||||
this.userList = response.rows;
|
||||
this.total = response.total;
|
||||
this.toggleSelection(this.userMultipleSelection);
|
||||
this.userLoading = false;
|
||||
});
|
||||
},
|
||||
// 筛选节点
|
||||
filterNode(value, data) {
|
||||
if (!value) return true;
|
||||
return data.label.indexOf(value) !== -1;
|
||||
},
|
||||
// 节点单击事件
|
||||
handleNodeClick(data) {
|
||||
this.queryParams.deptId = data.id;
|
||||
this.getList();
|
||||
},
|
||||
setIcon(val) {
|
||||
if (val) {
|
||||
return "el-icon-check";
|
||||
} else {
|
||||
return "el-icon-time";
|
||||
}
|
||||
},
|
||||
setColor(val) {
|
||||
if (val) {
|
||||
return "#2bc418";
|
||||
} else {
|
||||
return "#b3bdbb";
|
||||
}
|
||||
},
|
||||
// 多选框选中数据
|
||||
handleSelectionChange(selection) {
|
||||
this.userMultipleSelection = selection
|
||||
},
|
||||
toggleSelection(selection) {
|
||||
if (selection && selection.length > 0) {
|
||||
this.$nextTick(()=> {
|
||||
selection.forEach(item => {
|
||||
let row = this.userList.find(k => k.userId === item.userId);
|
||||
this.$refs.userTable.toggleRowSelection(row);
|
||||
})
|
||||
})
|
||||
} else {
|
||||
this.$nextTick(() => {
|
||||
this.$refs.userTable.clearSelection();
|
||||
});
|
||||
}
|
||||
},
|
||||
// 关闭标签
|
||||
handleClose(type, tag) {
|
||||
let userObj = this.userMultipleSelection.find(item => item.userId === tag.id);
|
||||
this.userMultipleSelection.splice(this.userMultipleSelection.indexOf(userObj), 1);
|
||||
if (type === 'copy') {
|
||||
this.copyUser = this.userMultipleSelection;
|
||||
// 设置抄送人ID
|
||||
if (this.copyUser && this.copyUser.length > 0) {
|
||||
const val = this.copyUser.map(item => item.id);
|
||||
this.taskForm.copyUserIds = val instanceof Array ? val.join(',') : val;
|
||||
} else {
|
||||
this.taskForm.copyUserIds = '';
|
||||
}
|
||||
} else if (type === 'next') {
|
||||
this.nextUser = this.userMultipleSelection;
|
||||
// 设置抄送人ID
|
||||
if (this.nextUser && this.nextUser.length > 0) {
|
||||
const val = this.nextUser.map(item => item.id);
|
||||
this.taskForm.nextUserIds = val instanceof Array ? val.join(',') : val;
|
||||
} else {
|
||||
this.taskForm.nextUserIds = '';
|
||||
}
|
||||
}
|
||||
},
|
||||
/** 流程变量赋值 */
|
||||
handleCheckChange(val) {
|
||||
if (val instanceof Array) {
|
||||
this.taskForm.values = {
|
||||
"approval": val.join(',')
|
||||
}
|
||||
} else {
|
||||
this.taskForm.values = {
|
||||
"approval": val
|
||||
}
|
||||
}
|
||||
},
|
||||
getProcessDetails(procInsId, taskId) {
|
||||
const params = {procInsId: procInsId, taskId: taskId}
|
||||
detailProcess(params).then(res => {
|
||||
const data = res.data;
|
||||
this.xmlData = data.bpmnXml;
|
||||
this.processFormList = data.processFormList;
|
||||
this.taskFormOpen = data.existTaskForm;
|
||||
if (this.taskFormOpen) {
|
||||
this.taskFormData = data.taskFormData;
|
||||
}
|
||||
this.historyProcNodeList = data.historyProcNodeList;
|
||||
this.finishedInfo = data.flowViewer;
|
||||
this.formOpen = true;
|
||||
})
|
||||
},
|
||||
onSelectCopyUsers() {
|
||||
this.userMultipleSelection = this.copyUser;
|
||||
this.onSelectUsers('添加抄送人', 'copy')
|
||||
},
|
||||
onSelectNextUsers() {
|
||||
this.userMultipleSelection = this.nextUser;
|
||||
this.onSelectUsers('指定审批人', 'next')
|
||||
},
|
||||
onSelectUsers(title, type) {
|
||||
this.userData.title = title;
|
||||
this.userData.type = type;
|
||||
this.getTreeSelect();
|
||||
this.getList()
|
||||
this.userData.open = true;
|
||||
},
|
||||
/** 通过任务 */
|
||||
handleComplete() {
|
||||
// 校验表单
|
||||
const taskFormRef = this.$refs.taskFormParser;
|
||||
const isExistTaskForm = taskFormRef !== undefined;
|
||||
// 若无任务表单,则 taskFormPromise 为 true,即不需要校验
|
||||
const taskFormPromise = !isExistTaskForm ? true : new Promise((resolve, reject) => {
|
||||
taskFormRef.$refs[taskFormRef.formConfCopy.formRef].validate(valid => {
|
||||
valid ? resolve() : reject()
|
||||
})
|
||||
});
|
||||
const approvalPromise = new Promise((resolve, reject) => {
|
||||
this.$refs['taskForm'].validate(valid => {
|
||||
valid ? resolve() : reject()
|
||||
})
|
||||
});
|
||||
Promise.all([taskFormPromise, approvalPromise]).then(() => {
|
||||
if (isExistTaskForm) {
|
||||
this.taskForm.variables = taskFormRef[taskFormRef.formConfCopy.formModel]
|
||||
}
|
||||
complete(this.taskForm).then(response => {
|
||||
this.$modal.msgSuccess(response.msg);
|
||||
this.goBack();
|
||||
});
|
||||
})
|
||||
},
|
||||
/** 委派任务 */
|
||||
handleDelegate() {
|
||||
this.$refs["taskForm"].validate(valid => {
|
||||
if (valid) {
|
||||
this.userData.type = 'delegate';
|
||||
this.userData.title = '委派任务'
|
||||
this.userData.open = true;
|
||||
this.getTreeSelect();
|
||||
}
|
||||
})
|
||||
},
|
||||
/** 转办任务 */
|
||||
handleTransfer(){
|
||||
this.$refs["taskForm"].validate(valid => {
|
||||
if (valid) {
|
||||
this.userData.type = 'transfer';
|
||||
this.userData.title = '转办任务';
|
||||
this.userData.open = true;
|
||||
this.getTreeSelect();
|
||||
}
|
||||
})
|
||||
},
|
||||
/** 拒绝任务 */
|
||||
handleReject() {
|
||||
this.$refs["taskForm"].validate(valid => {
|
||||
if (valid) {
|
||||
const _this = this;
|
||||
this.$modal.confirm('拒绝审批单流程会终止,是否继续?').then(function() {
|
||||
return rejectTask(_this.taskForm);
|
||||
}).then(res => {
|
||||
this.$modal.msgSuccess(res.msg);
|
||||
this.goBack();
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
changeCurrentUser(val) {
|
||||
this.currentUserId = val.userId
|
||||
},
|
||||
/** 返回页面 */
|
||||
goBack() {
|
||||
// 关闭当前标签页并返回上个页面
|
||||
this.$tab.closePage(this.$route)
|
||||
this.$router.back()
|
||||
},
|
||||
/** 接收子组件传的值 */
|
||||
getData(data) {
|
||||
if (data) {
|
||||
const variables = [];
|
||||
data.fields.forEach(item => {
|
||||
let variableData = {};
|
||||
variableData.label = item.__config__.label
|
||||
// 表单值为多个选项时
|
||||
if (item.__config__.defaultValue instanceof Array) {
|
||||
const array = [];
|
||||
item.__config__.defaultValue.forEach(val => {
|
||||
array.push(val)
|
||||
})
|
||||
variableData.val = array;
|
||||
} else {
|
||||
variableData.val = item.__config__.defaultValue
|
||||
}
|
||||
variables.push(variableData)
|
||||
})
|
||||
this.variables = variables;
|
||||
}
|
||||
},
|
||||
submitUserData() {
|
||||
let type = this.userData.type;
|
||||
if (type === 'copy' || type === 'next') {
|
||||
if (!this.userMultipleSelection || this.userMultipleSelection.length <= 0) {
|
||||
this.$modal.msgError("请选择用户");
|
||||
return false;
|
||||
}
|
||||
let userIds = this.userMultipleSelection.map(k => k.userId);
|
||||
if (type === 'copy') {
|
||||
// 设置抄送人ID信息
|
||||
this.copyUser = this.userMultipleSelection;
|
||||
this.taskForm.copyUserIds = userIds instanceof Array ? userIds.join(',') : userIds;
|
||||
} else if (type === 'next') {
|
||||
// 设置下一级审批人ID信息
|
||||
this.nextUser = this.userMultipleSelection;
|
||||
this.taskForm.nextUserIds = userIds instanceof Array ? userIds.join(',') : userIds;
|
||||
}
|
||||
this.userData.open = false;
|
||||
} else {
|
||||
if (!this.taskForm.comment) {
|
||||
this.$modal.msgError("请输入审批意见");
|
||||
return false;
|
||||
}
|
||||
if (!this.currentUserId) {
|
||||
this.$modal.msgError("请选择用户");
|
||||
return false;
|
||||
}
|
||||
this.taskForm.userId = this.currentUserId;
|
||||
if (type === 'delegate') {
|
||||
delegate(this.taskForm).then(res => {
|
||||
this.$modal.msgSuccess(res.msg);
|
||||
this.goBack();
|
||||
});
|
||||
}
|
||||
if (type === 'transfer') {
|
||||
transfer(this.taskForm).then(res => {
|
||||
this.$modal.msgSuccess(res.msg);
|
||||
this.goBack();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
/** 可退回任务列表 */
|
||||
handleReturn() {
|
||||
this.$refs['taskForm'].validate(valid => {
|
||||
if (valid) {
|
||||
this.returnTitle = "退回流程";
|
||||
returnList(this.taskForm).then(res => {
|
||||
this.returnTaskList = res.data;
|
||||
this.taskForm.values = null;
|
||||
this.returnOpen = true;
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
},
|
||||
/** 提交退回任务 */
|
||||
submitReturn() {
|
||||
this.$refs["taskForm"].validate(valid => {
|
||||
if (valid) {
|
||||
if (!this.taskForm.targetKey) {
|
||||
this.$modal.msgError("请选择退回节点!");
|
||||
}
|
||||
returnTask(this.taskForm).then(res => {
|
||||
this.$modal.msgSuccess(res.msg);
|
||||
this.goBack()
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.clearfix:before,
|
||||
.clearfix:after {
|
||||
display: table;
|
||||
content: "";
|
||||
}
|
||||
.clearfix:after {
|
||||
clear: both
|
||||
}
|
||||
|
||||
.box-card {
|
||||
width: 100%;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.el-tag + .el-tag {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.el-row {
|
||||
margin-bottom: 20px;
|
||||
&:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
.el-col {
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.button-new-tag {
|
||||
margin-left: 10px;
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,492 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form-item label="申报计划名称" prop="planName" label-width="100px" >
|
||||
<el-input
|
||||
v-model="queryParams.planName"
|
||||
placeholder="请输入申报计划名称"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="申报计划级别" prop="planLevel" label-width="100px">
|
||||
<el-input
|
||||
v-model="queryParams.planLevel"
|
||||
placeholder="请输入申报计划级别"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="申报开始日期" prop="projectAppStTime" label-width="100px">
|
||||
<el-date-picker clearable
|
||||
v-model="queryParams.projectAppStTime"
|
||||
type="date"
|
||||
value-format="yyyy-MM-dd"
|
||||
placeholder="请选择申报开始日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="申报结束日期" prop="projectAppEndTime" label-width="100px">
|
||||
<el-date-picker clearable
|
||||
v-model="queryParams.projectAppEndTime"
|
||||
type="date"
|
||||
value-format="yyyy-MM-dd"
|
||||
placeholder="请选择申报结束日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="primary"
|
||||
plain
|
||||
icon="el-icon-plus"
|
||||
size="mini"
|
||||
@click="handleAdd"
|
||||
v-hasPermi="['scientific:plan:add']"
|
||||
>新增</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="success"
|
||||
plain
|
||||
icon="el-icon-edit"
|
||||
size="mini"
|
||||
:disabled="single"
|
||||
@click="handleUpdate"
|
||||
v-hasPermi="['scientific:plan:edit']"
|
||||
>修改</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="danger"
|
||||
plain
|
||||
icon="el-icon-delete"
|
||||
size="mini"
|
||||
:disabled="multiple"
|
||||
@click="handleDelete"
|
||||
v-hasPermi="['scientific:plan:remove']"
|
||||
>删除</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="warning"
|
||||
plain
|
||||
icon="el-icon-download"
|
||||
size="mini"
|
||||
@click="handleExport"
|
||||
v-hasPermi="['scientific:plan:export']"
|
||||
>导出</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="planList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="序号" type="index" width="50"></el-table-column>
|
||||
<el-table-column label="申报计划名称" align="center" prop="planName" :min-width="100"/>
|
||||
<el-table-column label="申报计划级别" align="center" width="100px" :min-width="100">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium" :type="getTagLevelType(scope.row.planLevel)">
|
||||
{{ formatplanLevel(scope.row.planLevel) }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
|
||||
<el-table-column label="申报开始日期" align="center" prop="projectAppStTime" width="180">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.projectAppStTime, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="申报结束日期" align="center" prop="projectAppEndTime" width="180">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.projectAppEndTime, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="已申报项目" align="center" prop="projectAppStTime" width="180">
|
||||
<template slot-scope="scope">
|
||||
<el-button plain
|
||||
size="mini"
|
||||
@click="listProjectInPlan(scope.row.planId)"
|
||||
v-hasPermi="['scientific:plan:list']"
|
||||
>{{ scope.row.nProject }}</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="申报状态" align="center" width="100px" :min-width="100">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium" :type="getTagType(isCurrentDateInRange(scope.row.projectAppStTime, scope.row.projectAppEndTime))">
|
||||
{{ isCurrentDateInRange(scope.row.projectAppStTime, scope.row.projectAppEndTime) }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
type="primary"
|
||||
icon="el-icon-top"
|
||||
size="mini"
|
||||
@click="planDetail(scope.row)"
|
||||
v-hasPermi="['scientific:plan:list']"
|
||||
style="width: 80px"
|
||||
>查看计划</el-button>
|
||||
|
||||
<el-button
|
||||
type="primary"
|
||||
icon="el-icon-top"
|
||||
size="mini"
|
||||
@click="projectApply(scope.row)"
|
||||
:disabled="isCurrentDateInRange(scope.row.projectAppStTime, scope.row.projectAppEndTime) !== '申报中'"
|
||||
v-hasPermi="['scientific:plan:list']"
|
||||
style="width: 80px"
|
||||
>进入申报</el-button>
|
||||
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination
|
||||
v-show="total>0"
|
||||
:total="total"
|
||||
:page.sync="queryParams.pageNum"
|
||||
:limit.sync="queryParams.pageSize"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<!-- 添加或修改项目申报v2对话框 -->
|
||||
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
|
||||
<el-form-item label="申报信息名称" prop="planName">
|
||||
<el-input v-model="form.planName" placeholder="请输入申报信息名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="项目立项流程实例Id" prop="planProcId">
|
||||
<el-input v-model="form.planProcId" placeholder="请输入项目立项流程实例Id" />
|
||||
</el-form-item>
|
||||
<el-form-item label="项目指南级别(0市级 1区级 3省级 4国家级)" prop="planLevel">
|
||||
<el-input v-model="form.planLevel" placeholder="请输入项目指南级别(0市级 1区级 3省级 4国家级)" />
|
||||
</el-form-item>
|
||||
<el-form-item label="申报开始日期" prop="projectAppStTime">
|
||||
<el-date-picker clearable
|
||||
v-model="form.projectAppStTime"
|
||||
type="datetime"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
placeholder="请选择申报开始日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="申报结束日期" prop="projectAppEndTime">
|
||||
<el-date-picker clearable
|
||||
v-model="form.projectAppEndTime"
|
||||
type="datetime"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
placeholder="请选择申报结束日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listPlan, getPlan, delPlan, addPlan, updatePlan } from "@/api/scientific/project_application_plan";
|
||||
import { listProcess } from '@/api/workflow/process'
|
||||
import { listApplication } from '@/api/scientific/application'
|
||||
|
||||
export default {
|
||||
name: "Plan",
|
||||
data() {
|
||||
return {
|
||||
// 按钮loading
|
||||
buttonLoading: false,
|
||||
// 遮罩层
|
||||
loading: true,
|
||||
// 选中数组
|
||||
ids: [],
|
||||
// 非单个禁用
|
||||
single: true,
|
||||
// 非多个禁用
|
||||
multiple: true,
|
||||
// 显示搜索条件
|
||||
showSearch: true,
|
||||
// 总条数
|
||||
total: 0,
|
||||
// 项目申报v2表格数据
|
||||
planList: [],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
planName: undefined,
|
||||
planProcId: undefined,
|
||||
planStatus: "3",
|
||||
planCategory: undefined,
|
||||
planLevel: undefined,
|
||||
},
|
||||
// 表单参数
|
||||
form: {},
|
||||
// 表单校验
|
||||
rules: {
|
||||
planName: [
|
||||
{ required: true, message: "申报信息名称不能为空", trigger: "blur" }
|
||||
],
|
||||
planLevel: [
|
||||
{ required: true, message: "项目指南级别(0市级 1区级 3省级 4国家级)不能为空", trigger: "blur" }
|
||||
],
|
||||
}
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getList();
|
||||
},
|
||||
methods: {
|
||||
/** 查询项目申报v2列表 */
|
||||
getList() {
|
||||
this.loading = true;
|
||||
listPlan(this.queryParams).then(response => {
|
||||
this.planList = response.rows;
|
||||
this.total = response.total;
|
||||
// 使用Promise.all来处理异步操作
|
||||
const promises = this.planList.map(item => {
|
||||
const queryParams = {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
projectPlanId: item.planId,
|
||||
};
|
||||
listApplication(queryParams).then(res => {
|
||||
// zqjia:后续考虑是否保存整个res的信息
|
||||
this.$set(item, "nProject", res.total);
|
||||
});
|
||||
});
|
||||
|
||||
Promise.all(promises).then(() => {
|
||||
// 所有异步操作完成后,更新loading状态
|
||||
this.loading = false;
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// 取消按钮
|
||||
cancel() {
|
||||
this.open = false;
|
||||
this.reset();
|
||||
},
|
||||
// 表单重置
|
||||
reset() {
|
||||
this.form = {
|
||||
planId: undefined,
|
||||
planName: undefined,
|
||||
planProcId: undefined,
|
||||
planStatus: undefined,
|
||||
planCategory: undefined,
|
||||
planLevel: undefined,
|
||||
};
|
||||
this.resetForm("form");
|
||||
},
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
this.queryParams.pageNum = 1;
|
||||
this.getList();
|
||||
},
|
||||
/** 重置按钮操作 */
|
||||
resetQuery() {
|
||||
this.resetForm("queryForm");
|
||||
this.handleQuery();
|
||||
},
|
||||
// 多选框选中数据
|
||||
handleSelectionChange(selection) {
|
||||
this.ids = selection.map(item => item.planId)
|
||||
this.single = selection.length!==1
|
||||
this.multiple = !selection.length
|
||||
},
|
||||
/** 新增按钮操作 */
|
||||
handleAdd() {
|
||||
this.reset();
|
||||
this.open = true;
|
||||
this.title = "添加项目申报v2";
|
||||
},
|
||||
/** 修改按钮操作 */
|
||||
handleUpdate(row) {
|
||||
this.loading = true;
|
||||
this.reset();
|
||||
const planId = row.planId || this.ids
|
||||
getPlan(planId).then(response => {
|
||||
this.loading = false;
|
||||
this.form = response.data;
|
||||
this.open = true;
|
||||
this.title = "修改项目申报v2";
|
||||
});
|
||||
},
|
||||
/** 提交按钮 */
|
||||
submitForm() {
|
||||
this.$refs["form"].validate(valid => {
|
||||
if (valid) {
|
||||
this.buttonLoading = true;
|
||||
if (this.form.planId != null) {
|
||||
updatePlan(this.form).then(response => {
|
||||
this.$modal.msgSuccess("修改成功");
|
||||
this.open = false;
|
||||
this.getList();
|
||||
}).finally(() => {
|
||||
this.buttonLoading = false;
|
||||
});
|
||||
} else {
|
||||
addPlan(this.form).then(response => {
|
||||
this.$modal.msgSuccess("新增成功");
|
||||
this.open = false;
|
||||
this.getList();
|
||||
}).finally(() => {
|
||||
this.buttonLoading = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
/** 删除按钮操作 */
|
||||
handleDelete(row) {
|
||||
const planIds = row.planId || this.ids;
|
||||
this.$modal.confirm('是否确认删除项目申报计划编号为"' + planIds + '"的数据项?').then(() => {
|
||||
this.loading = true;
|
||||
return delPlan(planIds);
|
||||
}).then(() => {
|
||||
this.loading = false;
|
||||
this.getList();
|
||||
this.$modal.msgSuccess("删除成功");
|
||||
}).catch(() => {
|
||||
}).finally(() => {
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
/** 导出按钮操作 */
|
||||
handleExport() {
|
||||
this.download('scientific/plan/export', {
|
||||
...this.queryParams
|
||||
}, `plan_${new Date().getTime()}.xlsx`)
|
||||
},
|
||||
/**
|
||||
* 把项目状态的申报code转换为文字: 0 : 未申报 1: 审核中 2: 已申报
|
||||
* @param {number|string} cellValue - 原始数值
|
||||
* @returns {string} 转换后的字符串
|
||||
* @author zhanli
|
||||
*/
|
||||
|
||||
formatplanLevel(cellValue) {
|
||||
switch (cellValue) {
|
||||
case '1':
|
||||
return "国家级";
|
||||
case '2':
|
||||
return "省级";
|
||||
case '3':
|
||||
return "市级";
|
||||
case '4':
|
||||
return "院级";
|
||||
default:
|
||||
return "未知";
|
||||
}
|
||||
},
|
||||
getTagType(status) {
|
||||
switch (status) {
|
||||
case '已结束':
|
||||
// 显示红色 停止申报
|
||||
return 'danger';
|
||||
case '申报中':
|
||||
// 审核中 显示绿色
|
||||
return 'success';
|
||||
case '未开始':
|
||||
// 未申报, 灰色
|
||||
return 'info';
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
},
|
||||
getTagLevelType(status) {
|
||||
switch (status) {
|
||||
case '2':
|
||||
// 省级 蓝色
|
||||
return 'primary';
|
||||
case '3':
|
||||
// 市级 显示绿色
|
||||
return 'success';
|
||||
case '4':
|
||||
// 院级, 灰色
|
||||
return 'info';
|
||||
case '1':
|
||||
// 国家级 红色
|
||||
return 'danger';
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
},
|
||||
isCurrentDateInRange(startDate, endDate) {
|
||||
// 获取当前时间
|
||||
const currentDate = new Date();
|
||||
|
||||
// 将字符串日期转换为Date对象
|
||||
const start = new Date(startDate);
|
||||
const end = new Date(endDate);
|
||||
|
||||
// 判断当前时间是否在范围内
|
||||
if(currentDate >= start && currentDate <= end) {
|
||||
return "申报中";
|
||||
}
|
||||
else {
|
||||
if(currentDate < start) {
|
||||
return "未开始";
|
||||
}
|
||||
else {
|
||||
return "已结束";
|
||||
}
|
||||
}
|
||||
},
|
||||
projectApply(row) {
|
||||
// 跳转到项目申报
|
||||
this.$router.push({
|
||||
name: 'ProjectApply',
|
||||
params: {
|
||||
plan: row
|
||||
}
|
||||
})
|
||||
},
|
||||
listProjectInPlan(planId) {
|
||||
if (planId === undefined) {
|
||||
planId = 1;
|
||||
}
|
||||
let queryParams = {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
projectPlanId: planId,
|
||||
};
|
||||
this.$router.push({
|
||||
name: 'planProjectQuery',
|
||||
params: {
|
||||
planId: planId,
|
||||
queryParams: queryParams,
|
||||
}
|
||||
})
|
||||
},
|
||||
planDetail(row) {
|
||||
this.$router.push({
|
||||
path: '/scientific/project_application_plan/detail/' + row.planProcId,
|
||||
query: {
|
||||
processed: false,
|
||||
}
|
||||
})
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
|
@ -0,0 +1,175 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-card class="box-card">
|
||||
<div slot="header" class="clearfix">
|
||||
<span>{{ processName }}</span>
|
||||
</div>
|
||||
|
||||
<el-col :span="18" :offset="3">
|
||||
<div class="form-conf" v-if="formOpen">
|
||||
<parser :key="new Date().getTime()" :form-conf="formData" @submit="submit" ref="parser" @getData="getData"/>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listProcess, startProcess_ } from '@/api/workflow/process'
|
||||
import { getProcessForm, startProcess } from '@/api/workflow/process'
|
||||
import Parser from '@/utils/generator/parser'
|
||||
import { addPlan, findLatestDeploymentTimeIndex } from '@/api/scientific/project_application_plan'
|
||||
|
||||
|
||||
export default {
|
||||
name: 'planApply',
|
||||
components: {
|
||||
Parser
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
definitionId: null,
|
||||
deployId: null,
|
||||
procInsId: null,
|
||||
formOpen: false,
|
||||
formData: {},
|
||||
|
||||
processName: '',
|
||||
categoryOptions: [],
|
||||
// 流程定义表格数据
|
||||
processParams: null,
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
processKey: undefined,
|
||||
processName: "",
|
||||
category: "007"
|
||||
},
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.initData();
|
||||
},
|
||||
|
||||
|
||||
methods: {
|
||||
initData() {
|
||||
this.handbook = this.$route.params && this.$route.params.handbook;
|
||||
|
||||
/** 查询流程定义列表 */
|
||||
listProcess(this.queryParams).then(response => {
|
||||
findLatestDeploymentTimeIndex(response).then((latestIndex) => {
|
||||
this.processParams = response.rows[latestIndex];
|
||||
this.processName = this.processParams.processName;
|
||||
this.definitionId = this.processParams.definitionId;
|
||||
getProcessForm({
|
||||
definitionId: this.processParams.definitionId,
|
||||
deployId: this.processParams.deploymentId,
|
||||
procInsId: undefined
|
||||
}).then(res => {
|
||||
if (res.data) {
|
||||
this.formData = res.data;
|
||||
this.formOpen = true;
|
||||
}
|
||||
})
|
||||
});
|
||||
})
|
||||
},
|
||||
|
||||
/** 接收子组件传的值 */
|
||||
getData(data) {
|
||||
if (data) {
|
||||
const variables = [];
|
||||
data.fields.forEach(item => {
|
||||
let variableData = {};
|
||||
variableData.label = item.__config__.label
|
||||
// 表单值为多个选项时
|
||||
if (item.__config__.defaultValue instanceof Array) {
|
||||
const array = [];
|
||||
item.__config__.defaultValue.forEach(val => {
|
||||
array.push(val)
|
||||
})
|
||||
variableData.val = array;
|
||||
} else {
|
||||
variableData.val = item.__config__.defaultValue
|
||||
}
|
||||
variables.push(variableData)
|
||||
})
|
||||
this.variables = variables;
|
||||
}
|
||||
},
|
||||
submit(data) {
|
||||
if (data && this.definitionId) {
|
||||
// 启动流程并将表单数据加入流程变量
|
||||
startProcess_(this.definitionId, JSON.stringify(data.valData)).then(res => {
|
||||
if (res.code !== 200) {
|
||||
this.$modal.msgError("操作失败");
|
||||
return;
|
||||
}
|
||||
let planData = data.valData;
|
||||
planData.planProcId = res.msg;
|
||||
// zqjia:默认刚录入指南时状态为审核中,但后端会改为未审核
|
||||
planData.planStatus = 1;
|
||||
// zqjia:现在表单里的日期选择没有精确到小时,所以需要处理日期格式,后续要去掉
|
||||
const date1 = new Date(planData.projectAppStTime);
|
||||
const date2 = new Date(planData.projectAppEndTime);
|
||||
planData.projectAppStTime = this.formatDateTime(date1);
|
||||
planData.projectAppEndTime = this.formatDateTime(date2);
|
||||
const date3 = new Date(planData.reviewStTime);
|
||||
const date4 = new Date(planData.reviewEndTime);
|
||||
planData.reviewStTime = this.formatDateTime(date3);
|
||||
planData.reviewEndTime = this.formatDateTime(date4);
|
||||
// zqjia:解析planFile,不然无法存到数据库中
|
||||
const files = planData.planFile;
|
||||
if (files !== null) {
|
||||
let formatedFiles = {};
|
||||
files.forEach(file => {
|
||||
if(file.response.code === 200 && file.ossId) {
|
||||
formatedFiles[file.name] = file.ossId;
|
||||
}
|
||||
})
|
||||
planData.planFile = JSON.stringify(formatedFiles);
|
||||
}
|
||||
|
||||
if (this.handbook !== undefined) {
|
||||
planData.handbookId = this.handbook.handbookId
|
||||
}
|
||||
|
||||
addPlan(JSON.stringify(planData)).then(resp => {
|
||||
if (res.code !== 200) {
|
||||
this.$modal.msgError("操作失败");
|
||||
return;
|
||||
}
|
||||
this.$modal.msgSuccess(resp.msg);
|
||||
this.$tab.closeOpenPage({
|
||||
// zqjia:这个路径由菜单管理里设置的路由决定
|
||||
path: '/scientific/project_application_plan/list'
|
||||
})
|
||||
});
|
||||
})
|
||||
}
|
||||
},
|
||||
formatDateTime(date) {
|
||||
const padZero = (num) => (num < 10 ? '0' + num : num);
|
||||
|
||||
const year = date.getFullYear();
|
||||
const month = padZero(date.getMonth() + 1); // getMonth() 返回值的范围是 0-11,所以需要加 1
|
||||
const day = padZero(date.getDate());
|
||||
const hours = padZero(date.getHours());
|
||||
const minutes = padZero(date.getMinutes());
|
||||
const seconds = padZero(date.getSeconds());
|
||||
|
||||
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.form-conf {
|
||||
margin: 15px auto;
|
||||
width: 80%;
|
||||
padding: 15px;
|
||||
}
|
||||
</style>
|
|
@ -140,8 +140,8 @@
|
|||
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="50" align="center" />
|
||||
<el-table-column label="用户系统编号" align="center" key="userId" prop="userId" v-if="columns[0].visible" />
|
||||
<el-table-column label="用户名称" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" />
|
||||
<el-table-column label="用户昵称" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" />
|
||||
<el-table-column label="用户名(登录账号)" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" />
|
||||
<el-table-column label="姓名(昵称)" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" />
|
||||
<el-table-column label="部门" align="center" key="deptName" prop="dept.deptName" v-if="columns[3].visible" :show-overflow-tooltip="true" />
|
||||
<el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" v-if="columns[4].visible" width="120" />
|
||||
<el-table-column label="状态" align="center" key="status" v-if="columns[5].visible">
|
||||
|
|
|
@ -189,8 +189,8 @@ export default {
|
|||
processKey: undefined,
|
||||
processName: undefined,
|
||||
category: undefined,
|
||||
detailTitleName: 'field101',
|
||||
detailDirectorName: 'field102'
|
||||
detailTitleName: 'projectName',
|
||||
detailDirectorName: 'directorName'
|
||||
},
|
||||
// 表单参数
|
||||
form: {},
|
||||
|
@ -272,9 +272,8 @@ export default {
|
|||
},
|
||||
|
||||
handleProcessStart(row) {
|
||||
const deploymentId = 'b1531b69-3eae-11ef-97ad-106fd9c7c7b5'; // 假设 row 中的 deploymentId 是常量
|
||||
const definitionId = 'Process_1720608606342:1:b161c16c-3eae-11ef-97ad-106fd9c7c7b5'; // 假设 row 中的 definitionId 是常量
|
||||
|
||||
const deploymentId = '0ab3017f-428d-11ef-99ce-106fd9c7c7b5'; // 假设 row 中的 deploymentId 是常量
|
||||
const definitionId = 'Process_1720608606342:2:0afd50f2-428d-11ef-99ce-106fd9c7c7b5'; // 假设 row 中的 definitionId 是常量
|
||||
this.$router.push({
|
||||
path: `/workflow/process/start/${deploymentId}?definitionId=${definitionId}`,
|
||||
});
|
||||
|
|
|
@ -0,0 +1,297 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form-item label="项目名称" prop="projectName">
|
||||
<el-input
|
||||
v-model="queryParams.projectName"
|
||||
placeholder="请输入项目名称"
|
||||
clearable
|
||||
size="small"
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="状态" prop="status">
|
||||
<el-input
|
||||
v-model="queryParams.status"
|
||||
placeholder="请输入状态"
|
||||
clearable
|
||||
size="small"
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item> -->
|
||||
<el-form-item label="提交时间">
|
||||
<el-date-picker
|
||||
v-model="dateRange"
|
||||
style="width: 240px"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
type="daterange"
|
||||
range-separator="-"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
:default-time="['00:00:00', '23:59:59']"
|
||||
></el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="danger"
|
||||
plain
|
||||
icon="el-icon-delete"
|
||||
size="mini"
|
||||
:disabled="multiple"
|
||||
@click="handleDelete"
|
||||
>删除</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="warning"
|
||||
plain
|
||||
icon="el-icon-download"
|
||||
size="mini"
|
||||
v-hasPermi="['workflow:process:ownExport']"
|
||||
@click="handleExport"
|
||||
>导出</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="filteredProjectData" stripe style="width: 100%" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="序号" type="index" width="50"></el-table-column>
|
||||
|
||||
<el-table-column label="项目申报名" align="center" :min-width="240">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium">{{ scope.row.projectName }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column prop="projectLeader" label="项目负责人" align="center" width="180"></el-table-column>
|
||||
<el-table-column prop="projectAppStTime" label="申报开始日期" align="center" width="180"></el-table-column>
|
||||
<el-table-column prop="projectAppEndTime" label="申报结束日期" align="center" width="180"></el-table-column>
|
||||
<el-table-column prop="projectBudget" label="项目预算(万)" align="center" width="180"></el-table-column>
|
||||
<el-table-column prop="projectLeaderPhone" label="负责人电话" align="center" width="180"></el-table-column>
|
||||
<el-table-column prop="project_app_status" label="立项状态" align="center" width="180">
|
||||
<template slot-scope="scope">
|
||||
<span :class="statusClass(scope.row.projectAppStaus)">
|
||||
{{ statusText(scope.row.projectAppStaus) }}
|
||||
</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="220">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
icon="el-icon-top"
|
||||
type="primary"
|
||||
@click="handleApplication(scope.row)"
|
||||
size="mini"
|
||||
style="width: 80px"
|
||||
>申请立项</el-button>
|
||||
|
||||
<el-button
|
||||
type="success"
|
||||
icon="el-icon-tickets"
|
||||
@click="handleDetail(scope.row)"
|
||||
size="mini"
|
||||
style="width: 80px"
|
||||
>查看详情</el-button>
|
||||
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination
|
||||
v-show="totalProjects > 0"
|
||||
:total="totalProjects"
|
||||
:page.sync="currentPage"
|
||||
:limit.sync="pageSize"
|
||||
@pagination="filterData"
|
||||
/>
|
||||
|
||||
<el-dialog title="项目详情" :visible.sync="detailDialogVisible">
|
||||
<el-form :model="currentProject" label-width="120px">
|
||||
<el-form-item label="项目名称">
|
||||
<el-input v-model="currentProject.projectName" disabled></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目负责人">
|
||||
<el-input v-model="currentProject.projectLeader" disabled></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="申报开始日期">
|
||||
<el-input v-model="currentProject.projectAppStTime" disabled></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="申报结束日期">
|
||||
<el-input v-model="currentProject.projectAppEndTime" disabled></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目预算(万)">
|
||||
<el-input v-model="currentProject.projectBudget" disabled></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="负责人电话">
|
||||
<el-input v-model="currentProject.projectLeaderPhone" disabled></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { listDeclaredApplications } from "@/api/scientific/application";
|
||||
import { listProcess } from "@/api/workflow/process";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
queryParams: {
|
||||
projectName: '',
|
||||
status: '',
|
||||
startDate: '',
|
||||
endDate: '',
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
processKey: undefined,
|
||||
processName: "项目立项审批",
|
||||
category: "004"
|
||||
},
|
||||
projectData: [],
|
||||
filteredProjectData: [],
|
||||
totalProjects: 0,
|
||||
currentPage: 1,
|
||||
pageSize: 10,
|
||||
detailDialogVisible: false,
|
||||
currentProject: {},
|
||||
loading: false,
|
||||
showSearch: true,
|
||||
dateRange: [],
|
||||
deploymentId: '',
|
||||
definitionId: '',
|
||||
ids: null
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
handleQuery() {
|
||||
this.currentPage = 1;
|
||||
this.filterData();
|
||||
},
|
||||
resetQuery() {
|
||||
this.queryParams = {
|
||||
projectName: '',
|
||||
status: '',
|
||||
startDate: '',
|
||||
endDate: '',
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
};
|
||||
this.dateRange = [];
|
||||
this.filterData();
|
||||
},
|
||||
handlePageChange(page) {
|
||||
this.currentPage = page;
|
||||
this.filterData();
|
||||
},
|
||||
fetchProjectData() {
|
||||
this.loading = true;
|
||||
listDeclaredApplications()
|
||||
.then(response => {
|
||||
console.log('API response:', response);
|
||||
this.projectData = response.data;
|
||||
this.filterData();
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error fetching project data:', error);
|
||||
})
|
||||
.finally(() => {
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
filterData() {
|
||||
let filteredData = this.projectData;
|
||||
|
||||
if (this.queryParams.projectName) {
|
||||
filteredData = filteredData.filter(project =>
|
||||
project.projectName.includes(this.queryParams.projectName.trim())
|
||||
);
|
||||
}
|
||||
|
||||
if (this.queryParams.status) {
|
||||
filteredData = filteredData.filter(project =>
|
||||
project.projectAppStaus === this.queryParams.status.trim()
|
||||
);
|
||||
}
|
||||
|
||||
if (this.dateRange.length) {
|
||||
const [start, end] = this.dateRange;
|
||||
filteredData = filteredData.filter(project => {
|
||||
const projectStartTime = new Date(project.projectAppStTime);
|
||||
return projectStartTime >= new Date(start) && projectStartTime <= new Date(end);
|
||||
});
|
||||
}
|
||||
|
||||
this.totalProjects = filteredData.length;
|
||||
this.filteredProjectData = filteredData.slice(
|
||||
(this.currentPage - 1) * this.pageSize,
|
||||
this.currentPage * this.pageSize
|
||||
);
|
||||
},
|
||||
handleApplication(row) {
|
||||
this.loading = true;
|
||||
this.reset();
|
||||
const upProjectId = row.projectId || this.ids;
|
||||
|
||||
listProcess(this.queryParams).then(response => {
|
||||
this.processParams = response.rows[0];
|
||||
this.deploymentId = this.processParams.deploymentId;
|
||||
this.definitionId = this.processParams.definitionId;
|
||||
|
||||
this.$router.push({
|
||||
path: `/workflow/process/proj_app/${this.deploymentId}?definitionId=${this.definitionId}`,
|
||||
query: {
|
||||
projectId: upProjectId
|
||||
}
|
||||
});
|
||||
}).catch(error => {
|
||||
console.error('Error fetching process data:', error);
|
||||
}).finally(() => {
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
handleDetail(row) {
|
||||
this.currentProject = row;
|
||||
this.detailDialogVisible = true;
|
||||
},
|
||||
reset() {
|
||||
// Any additional reset logic
|
||||
},
|
||||
statusClass(status) {
|
||||
switch (status) {
|
||||
case '0':
|
||||
return 'status-unapproved'; // 未立项
|
||||
case '2':
|
||||
return 'status-under-review'; // 审核中
|
||||
case '3':
|
||||
return 'status-approved'; // 已立项
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
},
|
||||
statusText(status) {
|
||||
switch (status) {
|
||||
case '0':
|
||||
return '未立项';
|
||||
case '2':
|
||||
return '审核中';
|
||||
case '3':
|
||||
return '已立项';
|
||||
default:
|
||||
return '未知状态';
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.fetchProjectData();
|
||||
}
|
||||
};
|
||||
</script>
|
|
@ -0,0 +1,149 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-card class="box-card">
|
||||
<div slot="header" class="clearfix">
|
||||
<!-- 这个地方显示表单的标题 -->
|
||||
<span>{{ processName }}</span>
|
||||
</div>
|
||||
<!-- 这里定义栅格布局组件 -->
|
||||
<el-col :span="18" :offset="3">
|
||||
<div class="form-conf" v-if="formOpen">
|
||||
<!-- parser是一个自定义的组件,:form-conf="formData" 将 formData 对象作为属性传递给 parser 组件 -->
|
||||
<!-- 推测是通过getData获取数据, formData是表单的结构数据 -->
|
||||
<!-- formData是这个组件初始化的时候从后端接口得到的表单外观结构 -->
|
||||
<!-- formData是纯数据,getData是解析formData,这个函数默认是data作为参数 -->
|
||||
<parser :key="new Date().getTime()" :form-conf="formData" @submit="submit" ref="parser" @getData="getData"/>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getProcessForm, startProcess } from '@/api/workflow/process'
|
||||
import Parser from '@/utils/generator/parser'
|
||||
import { getApplication} from "@/api/scientific/application";
|
||||
export default {
|
||||
name: 'WorkStart',
|
||||
components: {
|
||||
Parser
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
definitionId: null,
|
||||
deployId: null,
|
||||
procInsId: null,
|
||||
// 项目信息主表的Id,用于获取项目的各种信息
|
||||
projectId: null,
|
||||
formOpen: false,
|
||||
formData: {},
|
||||
projectData: {},
|
||||
processName: null,
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.initData();
|
||||
},
|
||||
methods: {
|
||||
initData() {
|
||||
// 发起地址请求的时候可以获得这个数据的信息
|
||||
this.deployId = this.$route.params && this.$route.params.deployId;
|
||||
this.definitionId = this.$route.query && this.$route.query.definitionId;
|
||||
this.procInsId = this.$route.query && this.$route.query.procInsId;
|
||||
// 从地址的传递参数获取项目的Id信息
|
||||
this.projectId = this.$route.query && this.$route.query.projectId;
|
||||
// 如果能够从路由获得流程名字就赋值,否则就默认名字
|
||||
if(this.$route.query && this.$route.query.processName) {
|
||||
this.processName = this.$route.query && this.$route.query.processName;
|
||||
}
|
||||
else {
|
||||
this.processName = "更新流程";
|
||||
}
|
||||
console.log(this.projectId)
|
||||
getApplication(this.projectId).then(response => {
|
||||
this.projectData = response.data;
|
||||
this.processName = this.projectData.projectName + "-提交申报信息";
|
||||
});
|
||||
// 获取流程的动态表单
|
||||
getProcessForm({
|
||||
definitionId: this.definitionId,
|
||||
deployId: this.deployId,
|
||||
procInsId: this.procInsId
|
||||
}).then(res => {
|
||||
if (res.data) {
|
||||
// 赋值到表单
|
||||
this.formData = res.data;
|
||||
this.formOpen = true;
|
||||
this.formData.fields.forEach(field => {
|
||||
if (field.__vModel__ === "projectName") {
|
||||
field.__config__.defaultValue = this.projectData.projectName;
|
||||
field.readonly = true;
|
||||
}
|
||||
if (field.__vModel__ === "directorName") {
|
||||
field.__config__.defaultValue = this.projectData.projectLeader;
|
||||
field.readonly = true;
|
||||
}
|
||||
if (field.__vModel__ === "phoneNumber") {
|
||||
field.__config__.defaultValue = this.projectData.projectLeaderPhone;
|
||||
field.readonly = true;
|
||||
}
|
||||
if (field.__vModel__ === "budgetSum") {
|
||||
field.__config__.defaultValue = this.projectData.projectBudget;
|
||||
field.readonly = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
},
|
||||
/** 接收子组件传的值 */
|
||||
getData(data) {
|
||||
if (data) {
|
||||
console.log("get data");
|
||||
const variables = [];
|
||||
data.fields.forEach(item => {
|
||||
let variableData = {};
|
||||
// 直接获得标签信息
|
||||
variableData.label = item.__config__.label
|
||||
// 表单值为多个选项时
|
||||
if (item.__config__.defaultValue instanceof Array) {
|
||||
const array = [];
|
||||
item.__config__.defaultValue.forEach(val => {
|
||||
array.push(val)
|
||||
})
|
||||
variableData.val = array;
|
||||
} else {
|
||||
// 如果是单个信息,直接得到defaultValue
|
||||
variableData.val = item.__config__.defaultValue
|
||||
}
|
||||
variables.push(variableData)
|
||||
})
|
||||
this.variables = variables;
|
||||
}
|
||||
},
|
||||
submit(data) {
|
||||
if (data && this.definitionId) {
|
||||
// 将项目的Id加入到流程表达数据
|
||||
data.valData.projectId = this.projectId;
|
||||
console.log("submit");
|
||||
console.log(data.valData);
|
||||
|
||||
startProcess(this.definitionId, JSON.stringify(data.valData)).then(res => {
|
||||
this.$modal.msgSuccess(res.msg);
|
||||
this.$tab.closeOpenPage({
|
||||
path: '/work/own'
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.form-conf {
|
||||
margin: 15px auto;
|
||||
width: 80%;
|
||||
padding: 15px;
|
||||
}
|
||||
</style>
|
|
@ -1,34 +1,24 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form-item label="流程标识" prop="processKey">
|
||||
<el-form-item label="项目名称" prop="projectName">
|
||||
<el-input
|
||||
v-model="queryParams.processKey"
|
||||
placeholder="请输入流程标识"
|
||||
v-model="queryParams.projectName"
|
||||
placeholder="请输入项目名称"
|
||||
clearable
|
||||
size="small"
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="流程名称" prop="processName">
|
||||
<!-- <el-form-item label="状态" prop="status">
|
||||
<el-input
|
||||
v-model="queryParams.processName"
|
||||
placeholder="请输入流程名称"
|
||||
v-model="queryParams.status"
|
||||
placeholder="请输入状态"
|
||||
clearable
|
||||
size="small"
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="流程分类" prop="category">
|
||||
<el-select v-model="queryParams.category" clearable placeholder="请选择" size="small">
|
||||
<el-option
|
||||
v-for="item in categoryOptions"
|
||||
:key="item.categoryId"
|
||||
:label="item.categoryName"
|
||||
:value="item.code">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form-item> -->
|
||||
<el-form-item label="提交时间">
|
||||
<el-date-picker
|
||||
v-model="dateRange"
|
||||
|
@ -71,239 +61,243 @@
|
|||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="ownProcessList" @selection-change="handleSelectionChange">
|
||||
<el-table v-loading="loading" :data="filteredProjectData" stripe style="width: 100%" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="序号" type="index" width="50"></el-table-column>
|
||||
<el-table-column label="项目申报名" align="center" width="280px" :min-width="280">
|
||||
|
||||
<el-table-column label="项目申报名" align="center" :min-width="240">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium">{{ scope.row.processTitle }}</el-tag>
|
||||
<el-tag size="medium">{{ scope.row.projectName }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="项目负责人" align="center" prop="director" width="140"/>
|
||||
<el-table-column label="计划(基金)中文名称" align="center" width="200px">
|
||||
|
||||
<el-table-column prop="projectLeader" label="项目负责人" align="center" width="180"></el-table-column>
|
||||
<el-table-column prop="projectAppStTime" label="申报开始日期" align="center" width="180"></el-table-column>
|
||||
<el-table-column prop="projectAppEndTime" label="申报结束日期" align="center" width="180"></el-table-column>
|
||||
<el-table-column prop="projectBudget" label="项目预算(万)" align="center" width="180"></el-table-column>
|
||||
<el-table-column prop="projectLeaderPhone" label="负责人电话" align="center" width="180"></el-table-column>
|
||||
<el-table-column prop="project_app_status" label="立项状态" align="center" width="180">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium" >{{ scope.row.procDefName }}</el-tag>
|
||||
<el-tag size="medium" :type="info">
|
||||
<span :class="statusClass(scope.row.projectAppStaus)">
|
||||
{{ statusText(scope.row.projectAppStaus) }}
|
||||
</span>
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="审批类别" align="center" prop="category" :formatter="categoryFormat" width="180"/>
|
||||
<el-table-column label="提交时间" align="center" prop="createTime" :min-width="180"/>
|
||||
<el-table-column label="项目审核状态" align="center" width="100">
|
||||
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="220">
|
||||
<template slot-scope="scope">
|
||||
<dict-tag :options="dict.type.wf_process_status" :value="scope.row.processStatus"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- <el-table-column label="耗时" align="center" prop="duration" width="180"/> -->
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="240">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-tickets"
|
||||
@click="handleFlowRecord(scope.row)"
|
||||
v-hasPermi="['workflow:process:query']"
|
||||
>详情</el-button>
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-delete"
|
||||
@click="handleDelete(scope.row)"
|
||||
v-if="scope.row.finishTime"
|
||||
v-hasPermi="['workflow:process:remove']"
|
||||
>删除</el-button>
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-circle-close"
|
||||
@click="handleStop(scope.row)"
|
||||
v-hasPermi="['workflow:process:cancel']"
|
||||
>取消</el-button>
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
<el-button
|
||||
icon="el-icon-refresh-right"
|
||||
v-hasPermi="['workflow:process:start']"
|
||||
@click="handleAgain(scope.row)"
|
||||
type="primary"
|
||||
@click="handleApplication(scope.row)"
|
||||
size="mini"
|
||||
style="width: 80px"
|
||||
>修改重审</el-button>
|
||||
|
||||
<el-button
|
||||
type="success"
|
||||
icon="el-icon-tickets"
|
||||
@click="handleDetail(scope.row)"
|
||||
size="mini"
|
||||
style="width: 80px"
|
||||
>查看详情</el-button>
|
||||
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination
|
||||
v-show="total>0"
|
||||
:total="total"
|
||||
:page.sync="queryParams.pageNum"
|
||||
:limit.sync="queryParams.pageSize"
|
||||
@pagination="getList"
|
||||
v-show="totalProjects > 0"
|
||||
:total="totalProjects"
|
||||
:page.sync="currentPage"
|
||||
:limit.sync="pageSize"
|
||||
@pagination="filterData"
|
||||
/>
|
||||
|
||||
<el-dialog title="项目详情" :visible.sync="detailDialogVisible">
|
||||
<el-form :model="currentProject" label-width="120px">
|
||||
<el-form-item label="项目名称">
|
||||
<el-input v-model="currentProject.projectName" disabled></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目负责人">
|
||||
<el-input v-model="currentProject.projectLeader" disabled></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="申报开始日期">
|
||||
<el-input v-model="currentProject.projectAppStTime" disabled></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="申报结束日期">
|
||||
<el-input v-model="currentProject.projectAppEndTime" disabled></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目预算(万)">
|
||||
<el-input v-model="currentProject.projectBudget" disabled></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="负责人电话">
|
||||
<el-input v-model="currentProject.projectLeaderPhone" disabled></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listOwnInfoProcess, stopProcess, delProcess } from '@/api/workflow/process';
|
||||
import { listAllCategory } from '@/api/workflow/category';
|
||||
import { listDeclaredApplications } from "@/api/scientific/application";
|
||||
import { listProcess } from "@/api/workflow/process";
|
||||
|
||||
export default {
|
||||
name: "Own",
|
||||
dicts: ['wf_process_status'],
|
||||
components: {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
// 遮罩层
|
||||
loading: true,
|
||||
processLoading: true,
|
||||
// 选中数组
|
||||
ids: [],
|
||||
// 非单个禁用
|
||||
single: true,
|
||||
// 非多个禁用
|
||||
multiple: true,
|
||||
// 显示搜索条件
|
||||
showSearch: true,
|
||||
// 总条数
|
||||
total: 0,
|
||||
categoryOptions: [],
|
||||
processTotal:0,
|
||||
// 我发起的流程列表数据
|
||||
ownProcessList: [],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
src: "",
|
||||
definitionList:[],
|
||||
// 日期范围
|
||||
dateRange: [],
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
projectName: '',
|
||||
status: '',
|
||||
startDate: '',
|
||||
endDate: '',
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
processKey: undefined,
|
||||
processName: undefined,
|
||||
category: undefined,
|
||||
detailTitleName: 'proj_name',
|
||||
detailDirectorName: 'director'
|
||||
},
|
||||
// 表单参数
|
||||
form: {},
|
||||
// 表单校验
|
||||
rules: {
|
||||
processName: "项目立项审批",
|
||||
category: "004"
|
||||
},
|
||||
projectData: [],
|
||||
filteredProjectData: [],
|
||||
totalProjects: 0,
|
||||
currentPage: 1,
|
||||
pageSize: 10,
|
||||
detailDialogVisible: false,
|
||||
currentProject: {},
|
||||
loading: false,
|
||||
showSearch: true,
|
||||
dateRange: [],
|
||||
deploymentId: '',
|
||||
definitionId: '',
|
||||
ids: null
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getCategoryList();
|
||||
},
|
||||
beforeRouteEnter(to, from, next) {
|
||||
next(vm => {
|
||||
vm.getList()
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
/** 查询流程分类列表 */
|
||||
getCategoryList() {
|
||||
listAllCategory().then(response => this.categoryOptions = response.data)
|
||||
handleQuery() {
|
||||
this.currentPage = 1;
|
||||
this.filterData();
|
||||
},
|
||||
/** 查询流程定义列表 */
|
||||
getList() {
|
||||
resetQuery() {
|
||||
this.queryParams = {
|
||||
projectName: '',
|
||||
status: '',
|
||||
startDate: '',
|
||||
endDate: '',
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
};
|
||||
this.dateRange = [];
|
||||
this.filterData();
|
||||
},
|
||||
handlePageChange(page) {
|
||||
this.currentPage = page;
|
||||
this.filterData();
|
||||
},
|
||||
fetchProjectData() {
|
||||
this.loading = true;
|
||||
listOwnInfoProcess(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
|
||||
this.ownProcessList = response.rows.filter(item => item.category === '004');
|
||||
//this.ownProcessList = response.rows;
|
||||
this.total = response.total;
|
||||
listDeclaredApplications()
|
||||
.then(response => {
|
||||
console.log('API response:', response);
|
||||
// response.rows.filter(item => item.category === '002' && item.processStatus === 'completed');
|
||||
this.projectData = response.data.filter(item => item.projectAppStaus === '3')
|
||||
|
||||
let parseData = response.data.filter(item => item.projectAppStaus === '3')
|
||||
console.log(parseData)
|
||||
this.filterData();
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error fetching project data:', error);
|
||||
})
|
||||
.finally(() => {
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
filterData() {
|
||||
let filteredData = this.projectData;
|
||||
|
||||
if (this.queryParams.projectName) {
|
||||
filteredData = filteredData.filter(project =>
|
||||
project.projectName.includes(this.queryParams.projectName.trim())
|
||||
);
|
||||
}
|
||||
|
||||
if (this.queryParams.status) {
|
||||
filteredData = filteredData.filter(project =>
|
||||
project.projectAppStaus === this.queryParams.status.trim()
|
||||
);
|
||||
}
|
||||
|
||||
if (this.dateRange.length) {
|
||||
const [start, end] = this.dateRange;
|
||||
filteredData = filteredData.filter(project => {
|
||||
const projectStartTime = new Date(project.projectAppStTime);
|
||||
return projectStartTime >= new Date(start) && projectStartTime <= new Date(end);
|
||||
});
|
||||
}
|
||||
|
||||
this.totalProjects = filteredData.length;
|
||||
this.filteredProjectData = filteredData.slice(
|
||||
(this.currentPage - 1) * this.pageSize,
|
||||
this.currentPage * this.pageSize
|
||||
);
|
||||
},
|
||||
handleApplication(row) {
|
||||
this.loading = true;
|
||||
this.reset();
|
||||
const upProjectId = row.projectId || this.ids;
|
||||
|
||||
listProcess(this.queryParams).then(response => {
|
||||
this.processParams = response.rows[0];
|
||||
this.deploymentId = this.processParams.deploymentId;
|
||||
this.definitionId = this.processParams.definitionId;
|
||||
|
||||
this.$router.push({
|
||||
path: `/workflow/process/proj_app/${this.deploymentId}?definitionId=${this.definitionId}`,
|
||||
query: {
|
||||
projectId: upProjectId
|
||||
}
|
||||
});
|
||||
}).catch(error => {
|
||||
console.error('Error fetching process data:', error);
|
||||
}).finally(() => {
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
// 取消按钮
|
||||
cancel() {
|
||||
this.open = false;
|
||||
this.reset();
|
||||
handleDetail(row) {
|
||||
this.currentProject = row;
|
||||
this.detailDialogVisible = true;
|
||||
},
|
||||
// 表单重置
|
||||
reset() {
|
||||
this.form = {
|
||||
id: null,
|
||||
name: null,
|
||||
category: null,
|
||||
key: null,
|
||||
tenantId: null,
|
||||
deployTime: null,
|
||||
derivedFrom: null,
|
||||
derivedFromRoot: null,
|
||||
parentDeploymentId: null,
|
||||
engineVersion: null
|
||||
};
|
||||
this.resetForm("form");
|
||||
// Any additional reset logic
|
||||
},
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
this.queryParams.pageNum = 1;
|
||||
this.getList();
|
||||
},
|
||||
/** 重置按钮操作 */
|
||||
resetQuery() {
|
||||
this.dateRange = [];
|
||||
this.resetForm("queryForm");
|
||||
this.handleQuery();
|
||||
},
|
||||
// 多选框选中数据
|
||||
handleSelectionChange(selection) {
|
||||
this.ids = selection.map(item => item.procInsId);
|
||||
this.single = selection.length !== 1;
|
||||
this.multiple = !selection.length;
|
||||
},
|
||||
handleAgain(row) {
|
||||
this.$router.push({
|
||||
path: '/workflow/process/start/' + row.deployId,
|
||||
query: {
|
||||
definitionId: row.procDefId,
|
||||
procInsId: row.procInsId
|
||||
}
|
||||
})
|
||||
console.log(row);
|
||||
},
|
||||
/** 取消流程申请 */
|
||||
handleStop(row){
|
||||
const params = {
|
||||
procInsId: row.procInsId
|
||||
statusClass(status) {
|
||||
switch (status) {
|
||||
case '0':
|
||||
return 'status-unapproved'; // 未立项
|
||||
case '2':
|
||||
return 'status-under-review'; // 审核中
|
||||
case '3':
|
||||
return 'status-approved'; // 已立项
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
stopProcess(params).then( res => {
|
||||
this.$modal.msgSuccess(res.msg);
|
||||
this.getList();
|
||||
});
|
||||
},
|
||||
/** 流程流转记录 */
|
||||
handleFlowRecord(row) {
|
||||
this.$router.push({
|
||||
path: '/workflow/process/detail/' + row.procInsId,
|
||||
query: {
|
||||
processed: false
|
||||
}
|
||||
})
|
||||
},
|
||||
/** 删除按钮操作 */
|
||||
handleDelete(row) {
|
||||
const ids = row.procInsId || this.ids;
|
||||
this.$confirm('是否确认删除流程定义编号为"' + ids + '"的数据项?', "警告", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(function() {
|
||||
return delProcess(ids);
|
||||
}).then(() => {
|
||||
this.getList();
|
||||
this.$modal.msgSuccess("删除成功");
|
||||
})
|
||||
},
|
||||
/** 导出按钮操作 */
|
||||
handleExport() {
|
||||
this.download('workflow/process/ownExport', {
|
||||
...this.queryParams
|
||||
}, `wf_own_process_${new Date().getTime()}.xlsx`)
|
||||
},
|
||||
categoryFormat(row, column) {
|
||||
return this.categoryOptions.find(k => k.code === row.category)?.categoryName ?? '';
|
||||
statusText(status) {
|
||||
switch (status) {
|
||||
case '0':
|
||||
return '未立项';
|
||||
case '2':
|
||||
return '审核中';
|
||||
case '3':
|
||||
return '已立项';
|
||||
default:
|
||||
return '未知状态';
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.fetchProjectData();
|
||||
}
|
||||
};
|
||||
</script>
|
||||
</script>
|
|
@ -74,13 +74,13 @@
|
|||
<el-table v-loading="loading" :data="ownProcessList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="序号" type="index" width="50"></el-table-column>
|
||||
<el-table-column label="项目申报名" align="center" width="280px" :min-width="280">
|
||||
<el-table-column label="项目名称" align="center" width="280px" :min-width="280">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium">{{ scope.row.processTitle }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="项目负责人" align="center" prop="director" width="140"/>
|
||||
<el-table-column label="计划(基金)中文名称" align="center" width="200px">
|
||||
<el-table-column label="审批类型" align="center" width="200px">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium" >{{ scope.row.procDefName }}</el-tag>
|
||||
</template>
|
||||
|
@ -181,8 +181,8 @@ export default {
|
|||
processKey: undefined,
|
||||
processName: undefined,
|
||||
category: undefined,
|
||||
detailTitleName: 'field101',
|
||||
detailDirectorName: 'field102'
|
||||
detailTitleName: 'projectName,handbookName,planName,proj_name',
|
||||
detailDirectorName: 'directorName,createName'
|
||||
},
|
||||
// 表单参数
|
||||
form: {},
|
||||
|
@ -208,7 +208,7 @@ export default {
|
|||
getList() {
|
||||
this.loading = true;
|
||||
listOwnInfoProcess(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
|
||||
this.ownProcessList = response.rows.filter(item => item.category === '002');
|
||||
this.ownProcessList = response.rows;
|
||||
//this.ownProcessList = response.rows;
|
||||
this.total = response.total;
|
||||
this.loading = false;
|
||||
|
|
|
@ -68,39 +68,62 @@
|
|||
@click="handleExport"
|
||||
>导出</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
|
||||
<el-table v-loading="loading" :data="showList" @selection-change="handleSelectionChange">
|
||||
<el-table-column label="指南名称" align="center">
|
||||
<el-table v-loading="loading" :data="ownProcessList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="序号" type="index" width="50"></el-table-column>
|
||||
<el-table-column label="项目申报名" align="center" width="280px" :min-width="280">
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row.handbookname }}
|
||||
<el-tag size="medium">{{ scope.row.processTitle }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="指南类别" align="center">
|
||||
<el-table-column label="项目负责人" align="center" prop="director" width="140"/>
|
||||
<el-table-column label="计划(基金)中文名称" align="center" width="200px">
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row.handbookclass }}
|
||||
<el-tag size="medium" >{{ scope.row.procDefName }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="指南级别" align="center">
|
||||
<el-table-column label="审批类别" align="center" prop="category" :formatter="categoryFormat" width="180"/>
|
||||
<el-table-column label="提交时间" align="center" prop="createTime" :min-width="180"/>
|
||||
<el-table-column label="项目审核状态" align="center" width="100">
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row.handbooklevel }}
|
||||
<dict-tag :options="dict.type.wf_process_status" :value="scope.row.processStatus"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="截至日期" align="center">
|
||||
<!-- <el-table-column label="耗时" align="center" prop="duration" width="180"/> -->
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="240">
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row.handbookdate }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="指南文件" align="center">
|
||||
<template slot-scope="scope">
|
||||
<el-button class="file" @click="handbookDownload(scope.row.handbookfile)">下载</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="项目申报" align="center">
|
||||
<template slot-scope="scope">
|
||||
<el-button class="file" @click="projectApply(scope.row)">项目申报</el-button>
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-tickets"
|
||||
@click="handleFlowRecord(scope.row)"
|
||||
v-hasPermi="['workflow:process:query']"
|
||||
>详情</el-button>
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-delete"
|
||||
@click="handleDelete(scope.row)"
|
||||
v-if="scope.row.finishTime"
|
||||
v-hasPermi="['workflow:process:remove']"
|
||||
>删除</el-button>
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-circle-close"
|
||||
@click="handleStop(scope.row)"
|
||||
v-hasPermi="['workflow:process:cancel']"
|
||||
>取消</el-button>
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-refresh-right"
|
||||
v-hasPermi="['workflow:process:start']"
|
||||
@click="handleAgain(scope.row)"
|
||||
>修改重审</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
@ -117,24 +140,12 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
stopProcess,
|
||||
delProcess,
|
||||
listHandbook,
|
||||
detailProcess,
|
||||
detailProcesses,
|
||||
listProcess
|
||||
} from '@/api/workflow/process';
|
||||
import { listOwnInfoProcess, stopProcess, delProcess } from '@/api/workflow/process';
|
||||
import { listAllCategory } from '@/api/workflow/category';
|
||||
import Parser from '@/utils/generator/parser'
|
||||
import {getToken} from "@/utils/auth";
|
||||
// import {deepClone} from "@/utils";
|
||||
|
||||
export default {
|
||||
name: "handbookQuery",
|
||||
name: "Own",
|
||||
dicts: ['wf_process_status'],
|
||||
components: {
|
||||
Parser,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
@ -153,6 +164,8 @@ export default {
|
|||
total: 0,
|
||||
categoryOptions: [],
|
||||
processTotal:0,
|
||||
// 我发起的流程列表数据
|
||||
ownProcessList: [],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
// 是否显示弹出层
|
||||
|
@ -167,140 +180,40 @@ export default {
|
|||
pageSize: 10,
|
||||
processKey: undefined,
|
||||
processName: undefined,
|
||||
category: "007"
|
||||
category: undefined,
|
||||
detailTitleName: 'projectName',
|
||||
detailDirectorName: 'directorName'
|
||||
},
|
||||
// 表单参数
|
||||
form: {},
|
||||
// 表单校验
|
||||
rules: {
|
||||
},
|
||||
|
||||
// 从后端查询的原始列表数据
|
||||
handbookList: [],
|
||||
// 解析用于显示的数据
|
||||
showList: [],
|
||||
};
|
||||
},
|
||||
|
||||
async created() {
|
||||
await this.getList();
|
||||
await this.getProcessDetails();
|
||||
created() {
|
||||
this.getCategoryList();
|
||||
},
|
||||
beforeRouteEnter(to, from, next) {
|
||||
next(vm => {
|
||||
vm.getList()
|
||||
})
|
||||
},
|
||||
|
||||
methods: {
|
||||
// 文件下载
|
||||
handbookDownload(handbookfile) {
|
||||
handbookfile.forEach( file => {
|
||||
if(file.response.code === 200 && file.ossId) {
|
||||
this.$download.oss(file.ossId);
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
projectApply(row) {
|
||||
let queryParams = {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
processKey: undefined,
|
||||
processName: "项目申报",
|
||||
category: "002"
|
||||
};
|
||||
// 跳转到项目申报
|
||||
listProcess(queryParams).then(response => {
|
||||
const apply = response.rows[0];
|
||||
if(apply) {
|
||||
this.$router.push({
|
||||
path: '/workflow/process/start/' + apply.deploymentId,
|
||||
query: {
|
||||
definitionId: apply.definitionId,
|
||||
processName: apply.processName,
|
||||
}
|
||||
})
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/** 查询流程定义列表 */
|
||||
getList() {
|
||||
// zqjia:这个解析要模仿parser.js重写
|
||||
return new Promise((resolve,reject)=>{
|
||||
this.showList = [];
|
||||
this.loading = true;
|
||||
listHandbook(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
|
||||
this.handbookList = response.rows;
|
||||
this.total = response.total;
|
||||
this.loading = false;
|
||||
resolve();
|
||||
});
|
||||
})
|
||||
},
|
||||
|
||||
// 流程任务重获取变量表单
|
||||
getProcessDetails() {
|
||||
return new Promise((resolve, reject)=>{
|
||||
let pId = [];
|
||||
let tId = [];
|
||||
this.handbookList.forEach(handbook => {
|
||||
pId.push(handbook.procInsId);
|
||||
tId.push(undefined);
|
||||
})
|
||||
const params = {procInsIds: pId};
|
||||
detailProcesses(pId).then(res => {
|
||||
res.rows.forEach(row => {
|
||||
let processForm = row.processFormList[0];
|
||||
let formData = [];
|
||||
this.initFormData(processForm.fields, formData);
|
||||
formData["procDefId"] = row.procInsId;
|
||||
|
||||
this.showList.push(formData);
|
||||
})
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
/** 查询流程分类列表 */
|
||||
getCategoryList() {
|
||||
listAllCategory().then(response => this.categoryOptions = response.data)
|
||||
},
|
||||
|
||||
|
||||
initFormData(componentList, formData) {
|
||||
componentList.forEach(cur => {
|
||||
this.buildOptionMethod(cur)
|
||||
const config = cur.__config__;
|
||||
if (cur.__vModel__) {
|
||||
if(cur.__slot__ && 'options' in cur.__slot__) {
|
||||
formData[cur.__vModel__] = cur.__slot__.options[config.defaultValue-1].label;
|
||||
}
|
||||
else {
|
||||
formData[cur.__vModel__] = config.defaultValue;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (config.children) {
|
||||
this.initFormData(config.children, formData);
|
||||
}
|
||||
})
|
||||
|
||||
/** 查询流程定义列表 */
|
||||
getList() {
|
||||
this.loading = true;
|
||||
listOwnInfoProcess(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
|
||||
this.ownProcessList = response.rows.filter(item => item.category === '002');
|
||||
//this.ownProcessList = response.rows;
|
||||
this.total = response.total;
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
|
||||
// 特殊处理的 Option
|
||||
buildOptionMethod(scheme) {
|
||||
const config = scheme.__config__;
|
||||
if (config && config.tag === 'el-cascader') {
|
||||
if (config.dataType === 'dynamic') {
|
||||
this.$axios({
|
||||
method: config.method,
|
||||
url: config.url
|
||||
}).then(resp => {
|
||||
var { data } = resp
|
||||
scheme[config.dataConsumer] = data[config.dataKey]
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// 取消按钮
|
||||
cancel() {
|
||||
this.open = false;
|
||||
|
@ -347,6 +260,7 @@ export default {
|
|||
procInsId: row.procInsId
|
||||
}
|
||||
})
|
||||
console.log(row);
|
||||
},
|
||||
/** 取消流程申请 */
|
||||
handleStop(row){
|
||||
|
@ -393,20 +307,3 @@ export default {
|
|||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.file {
|
||||
border: none;
|
||||
background: none;
|
||||
/* 取消其他默认样式 */
|
||||
box-shadow: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.file:hover {
|
||||
background: none; /* 去掉鼠标悬停时的背景 */
|
||||
/* 如果需要,可以添加其他hover效果 */
|
||||
}
|
||||
</style>
|
||||
|
|
@ -1,318 +1,145 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form-item label="流程标识" prop="processKey">
|
||||
<el-input
|
||||
v-model="queryParams.processKey"
|
||||
placeholder="请输入流程标识"
|
||||
clearable
|
||||
size="small"
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="流程名称" prop="processName">
|
||||
<el-input
|
||||
v-model="queryParams.processName"
|
||||
placeholder="请输入流程名称"
|
||||
clearable
|
||||
size="small"
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="流程分类" prop="category">
|
||||
<el-select v-model="queryParams.category" clearable placeholder="请选择" size="small">
|
||||
<el-option
|
||||
v-for="item in categoryOptions"
|
||||
:key="item.categoryId"
|
||||
:label="item.categoryName"
|
||||
:value="item.code">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="提交时间">
|
||||
<el-date-picker
|
||||
v-model="dateRange"
|
||||
style="width: 240px"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
type="daterange"
|
||||
range-separator="-"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
:default-time="['00:00:00', '23:59:59']"
|
||||
></el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="danger"
|
||||
plain
|
||||
icon="el-icon-delete"
|
||||
size="mini"
|
||||
:disabled="multiple"
|
||||
@click="handleDelete"
|
||||
>删除</el-button>
|
||||
<el-card class="box-card">
|
||||
<div slot="header" class="clearfix">
|
||||
<!-- 这个地方显示表单的标题 -->
|
||||
<span>{{ processName }}</span>
|
||||
</div>
|
||||
<!-- 这里定义栅格布局组件 -->
|
||||
<el-col :span="18" :offset="3">
|
||||
<div class="form-conf" v-if="formOpen">
|
||||
<!-- parser是一个自定义的组件,:form-conf="formData" 将 formData 对象作为属性传递给 parser 组件 -->
|
||||
<!-- 推测是通过getData获取数据, formData是表单的结构数据 -->
|
||||
<!-- formData是这个组件初始化的时候从后端接口得到的表单外观结构 -->
|
||||
<!-- formData是纯数据,getData是解析formData,这个函数默认是data作为参数 -->
|
||||
<parser :key="new Date().getTime()" :form-conf="formData" @submit="submit" ref="parser" @getData="getData"/>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="warning"
|
||||
plain
|
||||
icon="el-icon-download"
|
||||
size="mini"
|
||||
v-hasPermi="['workflow:process:ownExport']"
|
||||
@click="handleExport"
|
||||
>导出</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="ownProcessList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="序号" type="index" width="50"/>
|
||||
<el-table-column label="项目计划名" align="center" :min-width="260" width="auto">
|
||||
<template slot-scope="scope">
|
||||
<el-tag size="medium" >{{ scope.row.processTitle }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="审核类型" align="center" prop="procDefName" :min-width="140" width="auto"/>
|
||||
|
||||
<el-table-column label="审批类别" align="center" prop="category" :formatter="categoryFormat" width="140"/>
|
||||
<el-table-column label="提交时间" align="center" prop="createTime" width="180"/>
|
||||
<el-table-column label="项目审核状态" align="center" width="100">
|
||||
<template slot-scope="scope">
|
||||
<dict-tag :options="dict.type.wf_process_status" :value="scope.row.processStatus"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="耗时" align="center" prop="duration" width="160"/>
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="280">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-top"
|
||||
@click="handleProcessStart(scope.row)"
|
||||
v-hasPermi="['workflow:process:query']"
|
||||
>项目申报</el-button>
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-tickets"
|
||||
@click="handleFlowRecord(scope.row)"
|
||||
v-hasPermi="['workflow:process:query']"
|
||||
>详情</el-button>
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-circle-close"
|
||||
@click="handleStop(scope.row)"
|
||||
v-hasPermi="['workflow:process:cancel']"
|
||||
>取消</el-button>
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-refresh-right"
|
||||
v-hasPermi="['workflow:process:start']"
|
||||
@click="handleAgain(scope.row)"
|
||||
>修改重审</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination
|
||||
v-show="total>0"
|
||||
:total="total"
|
||||
:page.sync="queryParams.pageNum"
|
||||
:limit.sync="queryParams.pageSize"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listOwnInfoProcess, stopProcess, delProcess } from '@/api/workflow/process';
|
||||
import { listAllCategory } from '@/api/workflow/category';
|
||||
import { getProcessForm, startProcess } from '@/api/workflow/process'
|
||||
import Parser from '@/utils/generator/parser'
|
||||
import { getApplication} from "@/api/scientific/application";
|
||||
export default {
|
||||
name: "Own",
|
||||
dicts: ['wf_process_status'],
|
||||
name: 'WorkStart',
|
||||
components: {
|
||||
Parser
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
// 遮罩层
|
||||
loading: true,
|
||||
processLoading: true,
|
||||
// 选中数组
|
||||
ids: [],
|
||||
// 非单个禁用
|
||||
single: true,
|
||||
// 非多个禁用
|
||||
multiple: true,
|
||||
// 显示搜索条件
|
||||
showSearch: true,
|
||||
// 总条数
|
||||
total: 0,
|
||||
categoryOptions: [],
|
||||
processTotal:0,
|
||||
// 我发起的流程列表数据
|
||||
ownProcessList: [],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
src: "",
|
||||
definitionList:[],
|
||||
// 日期范围
|
||||
dateRange: [],
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
processKey: undefined,
|
||||
processName: undefined,
|
||||
// 目录的筛选是通过目录code实现的
|
||||
// category: "006"
|
||||
category: undefined,
|
||||
detailTitleName: 'proj_plan_title',
|
||||
detailDirectorName: undefined
|
||||
},
|
||||
// 表单参数
|
||||
form: {},
|
||||
// 表单校验
|
||||
rules: {
|
||||
},
|
||||
};
|
||||
definitionId: null,
|
||||
deployId: null,
|
||||
procInsId: null,
|
||||
// 项目信息主表的Id,用于获取项目的各种信息
|
||||
projectId: null,
|
||||
formOpen: false,
|
||||
formData: {},
|
||||
projectData: {},
|
||||
processName: null,
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getCategoryList();
|
||||
},
|
||||
beforeRouteEnter(to, from, next) {
|
||||
next(vm => {
|
||||
vm.getList()
|
||||
})
|
||||
this.initData();
|
||||
},
|
||||
methods: {
|
||||
/** 查询流程分类列表 */
|
||||
getCategoryList() {
|
||||
listAllCategory().then(response => this.categoryOptions = response.data)
|
||||
},
|
||||
/** 查询流程定义列表 */
|
||||
getList() {
|
||||
this.loading = true;
|
||||
listOwnInfoProcess(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
|
||||
this.ownProcessList = response.rows.filter(item => item.category === '006');
|
||||
//this.ownProcessList = response.rows;
|
||||
this.total = response.total;
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
// 取消按钮
|
||||
cancel() {
|
||||
this.open = false;
|
||||
this.reset();
|
||||
},
|
||||
// 表单重置
|
||||
reset() {
|
||||
this.form = {
|
||||
id: null,
|
||||
name: null,
|
||||
category: null,
|
||||
key: null,
|
||||
tenantId: null,
|
||||
deployTime: null,
|
||||
derivedFrom: null,
|
||||
derivedFromRoot: null,
|
||||
parentDeploymentId: null,
|
||||
engineVersion: null
|
||||
};
|
||||
this.resetForm("form");
|
||||
},
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
this.queryParams.pageNum = 1;
|
||||
this.getList();
|
||||
},
|
||||
/** 重置按钮操作 */
|
||||
resetQuery() {
|
||||
this.dateRange = [];
|
||||
this.resetForm("queryForm");
|
||||
this.handleQuery();
|
||||
},
|
||||
// 多选框选中数据
|
||||
handleSelectionChange(selection) {
|
||||
this.ids = selection.map(item => item.procInsId);
|
||||
this.single = selection.length !== 1;
|
||||
this.multiple = !selection.length;
|
||||
},
|
||||
handleAgain(row) {
|
||||
this.$router.push({
|
||||
path: '/workflow/process/start/' + row.deployId,
|
||||
query: {
|
||||
definitionId: row.procDefId,
|
||||
procInsId: row.procInsId
|
||||
}
|
||||
})
|
||||
console.log(row);
|
||||
},
|
||||
/** 取消流程申请 */
|
||||
handleStop(row){
|
||||
const params = {
|
||||
procInsId: row.procInsId
|
||||
initData() {
|
||||
// 发起地址请求的时候可以获得这个数据的信息
|
||||
this.deployId = this.$route.params && this.$route.params.deployId;
|
||||
this.definitionId = this.$route.query && this.$route.query.definitionId;
|
||||
this.procInsId = this.$route.query && this.$route.query.procInsId;
|
||||
// 从地址的传递参数获取项目的Id信息
|
||||
this.projectId = this.$route.query && this.$route.query.projectId;
|
||||
// 如果能够从路由获得流程名字就赋值,否则就默认名字
|
||||
if(this.$route.query && this.$route.query.processName) {
|
||||
this.processName = this.$route.query && this.$route.query.processName;
|
||||
}
|
||||
stopProcess(params).then( res => {
|
||||
this.$modal.msgSuccess(res.msg);
|
||||
this.getList();
|
||||
else {
|
||||
this.processName = "更新流程";
|
||||
}
|
||||
console.log(this.projectId)
|
||||
getApplication(this.projectId).then(response => {
|
||||
this.projectData = response.data;
|
||||
this.processName = this.projectData.projectName + "-项目立项";
|
||||
});
|
||||
},
|
||||
/** 流程流转记录 */
|
||||
// 这个地方相当于导航到了其他的页面获取详细信息
|
||||
handleFlowRecord(row) {
|
||||
this.$router.push({
|
||||
path: '/workflow/process/detail/' + row.procInsId,
|
||||
query: {
|
||||
processed: false
|
||||
// 获取流程的动态表单
|
||||
getProcessForm({
|
||||
definitionId: this.definitionId,
|
||||
deployId: this.deployId,
|
||||
procInsId: this.procInsId
|
||||
}).then(res => {
|
||||
if (res.data) {
|
||||
// 赋值到表单
|
||||
this.formData = res.data;
|
||||
this.formOpen = true;
|
||||
this.formData.fields.forEach(field => {
|
||||
if (field.__vModel__ === "projectName") {
|
||||
field.__config__.defaultValue = this.projectData.projectName;
|
||||
field.readonly = true;
|
||||
}
|
||||
if (field.__vModel__ === "oldBudget") {
|
||||
field.__config__.defaultValue = this.projectData.projectBudget + "万";
|
||||
field.readonly = true;
|
||||
}
|
||||
if (field.__vModel__ === "directorName") {
|
||||
field.__config__.defaultValue = this.projectData.projectLeader;
|
||||
field.readonly = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
},
|
||||
handleProcessStart(row) {
|
||||
const deploymentId = '7d553e9a-3e02-11ef-a576-106fd9c7c7b5'; // 假设 row 中的 deploymentId 是常量
|
||||
const definitionId = 'Process_1720536463039:1:7d67b52d-3e02-11ef-a576-106fd9c7c7b5'; // 假设 row 中的 definitionId 是常量
|
||||
|
||||
this.$router.push({
|
||||
path: `/workflow/process/start/${deploymentId}?definitionId=${definitionId}`,
|
||||
});
|
||||
},
|
||||
|
||||
/** 删除按钮操作 */
|
||||
handleDelete(row) {
|
||||
const ids = row.procInsId || this.ids;
|
||||
this.$confirm('是否确认删除流程定义编号为"' + ids + '"的数据项?', "警告", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(function() {
|
||||
return delProcess(ids);
|
||||
}).then(() => {
|
||||
this.getList();
|
||||
this.$modal.msgSuccess("删除成功");
|
||||
})
|
||||
/** 接收子组件传的值 */
|
||||
getData(data) {
|
||||
if (data) {
|
||||
console.log("get data");
|
||||
const variables = [];
|
||||
data.fields.forEach(item => {
|
||||
let variableData = {};
|
||||
// 直接获得标签信息
|
||||
variableData.label = item.__config__.label
|
||||
// 表单值为多个选项时
|
||||
if (item.__config__.defaultValue instanceof Array) {
|
||||
const array = [];
|
||||
item.__config__.defaultValue.forEach(val => {
|
||||
array.push(val)
|
||||
})
|
||||
variableData.val = array;
|
||||
} else {
|
||||
// 如果是单个信息,直接得到defaultValue
|
||||
variableData.val = item.__config__.defaultValue
|
||||
}
|
||||
variables.push(variableData)
|
||||
})
|
||||
this.variables = variables;
|
||||
}
|
||||
},
|
||||
/** 导出按钮操作 */
|
||||
handleExport() {
|
||||
this.download('workflow/process/ownExport', {
|
||||
...this.queryParams
|
||||
}, `wf_own_process_${new Date().getTime()}.xlsx`)
|
||||
},
|
||||
|
||||
// 因为流程信息返回的cateory是编码类型001这样,所以需要转换为其实际对应的含义
|
||||
categoryFormat(row, column) {
|
||||
return this.categoryOptions.find(k => k.code === row.category)?.categoryName ?? '';
|
||||
submit(data) {
|
||||
if (data && this.definitionId) {
|
||||
// 启动流程并将表单数据加入流程变量
|
||||
data.valData.projectId = this.projectId;
|
||||
console.log("submit");
|
||||
console.log(data.valData);
|
||||
|
||||
startProcess(this.definitionId, JSON.stringify(data.valData)).then(res => {
|
||||
this.$modal.msgSuccess(res.msg);
|
||||
this.$tab.closeOpenPage({
|
||||
path: '/work/own'
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.form-conf {
|
||||
margin: 15px auto;
|
||||
width: 80%;
|
||||
padding: 15px;
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -0,0 +1,145 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-card class="box-card">
|
||||
<div slot="header" class="clearfix">
|
||||
<!-- 这个地方显示表单的标题 -->
|
||||
<span>{{ processName }}</span>
|
||||
</div>
|
||||
<!-- 这里定义栅格布局组件 -->
|
||||
<el-col :span="18" :offset="3">
|
||||
<div class="form-conf" v-if="formOpen">
|
||||
<!-- parser是一个自定义的组件,:form-conf="formData" 将 formData 对象作为属性传递给 parser 组件 -->
|
||||
<!-- 推测是通过getData获取数据, formData是表单的结构数据 -->
|
||||
<!-- formData是这个组件初始化的时候从后端接口得到的表单外观结构 -->
|
||||
<!-- formData是纯数据,getData是解析formData,这个函数默认是data作为参数 -->
|
||||
<parser :key="new Date().getTime()" :form-conf="formData" @submit="submit" ref="parser" @getData="getData"/>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getProcessForm, startProcess } from '@/api/workflow/process'
|
||||
import Parser from '@/utils/generator/parser'
|
||||
import { getApplication} from "@/api/scientific/application";
|
||||
export default {
|
||||
name: 'WorkStart',
|
||||
components: {
|
||||
Parser
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
definitionId: null,
|
||||
deployId: null,
|
||||
procInsId: null,
|
||||
// 项目信息主表的Id,用于获取项目的各种信息
|
||||
projectId: null,
|
||||
formOpen: false,
|
||||
formData: {},
|
||||
projectData: {},
|
||||
processName: null,
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.initData();
|
||||
},
|
||||
methods: {
|
||||
initData() {
|
||||
// 发起地址请求的时候可以获得这个数据的信息
|
||||
this.deployId = this.$route.params && this.$route.params.deployId;
|
||||
this.definitionId = this.$route.query && this.$route.query.definitionId;
|
||||
this.procInsId = this.$route.query && this.$route.query.procInsId;
|
||||
// 从地址的传递参数获取项目的Id信息
|
||||
this.projectId = this.$route.query && this.$route.query.projectId;
|
||||
// 如果能够从路由获得流程名字就赋值,否则就默认名字
|
||||
if(this.$route.query && this.$route.query.processName) {
|
||||
this.processName = this.$route.query && this.$route.query.processName;
|
||||
}
|
||||
else {
|
||||
this.processName = "更新流程";
|
||||
}
|
||||
console.log(this.projectId)
|
||||
getApplication(this.projectId).then(response => {
|
||||
this.projectData = response.data;
|
||||
this.processName = this.projectData.projectName + "-修改项目申报";
|
||||
});
|
||||
// 获取流程的动态表单
|
||||
getProcessForm({
|
||||
definitionId: this.definitionId,
|
||||
deployId: this.deployId,
|
||||
procInsId: this.procInsId
|
||||
}).then(res => {
|
||||
if (res.data) {
|
||||
// 赋值到表单
|
||||
this.formData = res.data;
|
||||
this.formOpen = true;
|
||||
this.formData.fields.forEach(field => {
|
||||
if (field.__vModel__ === "projectName") {
|
||||
field.__config__.defaultValue = this.projectData.projectName;
|
||||
field.readonly = true;
|
||||
}
|
||||
if (field.__vModel__ === "oldBudget") {
|
||||
field.__config__.defaultValue = this.projectData.projectBudget + "万";
|
||||
field.readonly = true;
|
||||
}
|
||||
if (field.__vModel__ === "directorName") {
|
||||
field.__config__.defaultValue = this.projectData.projectLeader;
|
||||
field.readonly = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
},
|
||||
/** 接收子组件传的值 */
|
||||
getData(data) {
|
||||
if (data) {
|
||||
console.log("get data");
|
||||
const variables = [];
|
||||
data.fields.forEach(item => {
|
||||
let variableData = {};
|
||||
// 直接获得标签信息
|
||||
variableData.label = item.__config__.label
|
||||
// 表单值为多个选项时
|
||||
if (item.__config__.defaultValue instanceof Array) {
|
||||
const array = [];
|
||||
item.__config__.defaultValue.forEach(val => {
|
||||
array.push(val)
|
||||
})
|
||||
variableData.val = array;
|
||||
} else {
|
||||
// 如果是单个信息,直接得到defaultValue
|
||||
variableData.val = item.__config__.defaultValue
|
||||
}
|
||||
variables.push(variableData)
|
||||
})
|
||||
this.variables = variables;
|
||||
}
|
||||
},
|
||||
submit(data) {
|
||||
if (data && this.definitionId) {
|
||||
// 启动流程并将表单数据加入流程变量
|
||||
data.valData.projectId = this.projectId;
|
||||
console.log("submit");
|
||||
console.log(data.valData);
|
||||
|
||||
startProcess(this.definitionId, JSON.stringify(data.valData)).then(res => {
|
||||
this.$modal.msgSuccess(res.msg);
|
||||
this.$tab.closeOpenPage({
|
||||
path: '/work/own'
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.form-conf {
|
||||
margin: 15px auto;
|
||||
width: 80%;
|
||||
padding: 15px;
|
||||
}
|
||||
</style>
|
|
@ -42,7 +42,12 @@ export default {
|
|||
this.deployId = this.$route.params && this.$route.params.deployId;
|
||||
this.definitionId = this.$route.query && this.$route.query.definitionId;
|
||||
this.procInsId = this.$route.query && this.$route.query.procInsId;
|
||||
this.processName = this.$route.query && this.$route.query.processName;
|
||||
if(this.$route.query && this.$route.query.processName) {
|
||||
this.processName = this.$route.query && this.$route.query.processName;
|
||||
}
|
||||
else {
|
||||
this.processName = "发起流程";
|
||||
}
|
||||
|
||||
getProcessForm({
|
||||
definitionId: this.definitionId,
|
||||
|
|
|
@ -2,11 +2,16 @@
|
|||
<div class="app-container">
|
||||
<el-card class="box-card">
|
||||
<div slot="header" class="clearfix">
|
||||
<span>{{ processName }}</span>
|
||||
<!-- 这个地方显示表单的标题 -->
|
||||
<span>{{ "processName" }}</span>
|
||||
</div>
|
||||
|
||||
<!-- 这里定义栅格布局组件 -->
|
||||
<el-col :span="18" :offset="3">
|
||||
<div class="form-conf" v-if="formOpen">
|
||||
<!-- parser是一个自定义的组件,:form-conf="formData" 将 formData 对象作为属性传递给 parser 组件 -->
|
||||
<!-- 推测是通过getData获取数据, formData是表单的结构数据 -->
|
||||
<!-- formData是这个组件初始化的时候从后端接口得到的表单外观结构 -->
|
||||
<!-- formData是纯数据,getData是解析formData,这个函数默认是data作为参数 -->
|
||||
<parser :key="new Date().getTime()" :form-conf="formData" @submit="submit" ref="parser" @getData="getData"/>
|
||||
</div>
|
||||
</el-col>
|
||||
|
@ -15,9 +20,7 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import { listProcess} from "@/api/workflow/process";
|
||||
import { listAllCategory } from '@/api/workflow/category'
|
||||
import { getProcessForm, startProcess } from '@/api/workflow/process'
|
||||
import { getProcessForm, updateProcess } from '@/api/workflow/process'
|
||||
import Parser from '@/utils/generator/parser'
|
||||
|
||||
export default {
|
||||
|
@ -32,19 +35,7 @@ export default {
|
|||
procInsId: null,
|
||||
formOpen: false,
|
||||
formData: {},
|
||||
|
||||
processName: '',
|
||||
categoryOptions: [],
|
||||
// 流程定义表格数据
|
||||
processParams: null,
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
processKey: undefined,
|
||||
processName: "项目指南录入",
|
||||
category: "007"
|
||||
},
|
||||
processName: null,
|
||||
}
|
||||
},
|
||||
created() {
|
||||
|
@ -52,31 +43,39 @@ export default {
|
|||
},
|
||||
methods: {
|
||||
initData() {
|
||||
/** 查询流程定义列表 */
|
||||
listProcess(this.queryParams).then(response => {
|
||||
this.processParams = response.rows[0];
|
||||
this.processName = this.processParams.processName;
|
||||
this.definitionId = this.processParams.definitionId;
|
||||
// 发起地址请求的时候可以获得这个数据的信息
|
||||
this.deployId = this.$route.params && this.$route.params.deployId;
|
||||
this.definitionId = this.$route.query && this.$route.query.definitionId;
|
||||
this.procInsId = this.$route.query && this.$route.query.procInsId;
|
||||
|
||||
getProcessForm({
|
||||
definitionId: this.processParams.definitionId,
|
||||
deployId: this.processParams.deploymentId,
|
||||
procInsId: undefined
|
||||
}).then(res => {
|
||||
if (res.data) {
|
||||
this.formData = res.data;
|
||||
this.formOpen = true
|
||||
}
|
||||
})
|
||||
// 如果能够从路由获得流程名字就赋值,否则就默认名字
|
||||
if(this.$route.query && this.$route.query.processName) {
|
||||
this.processName = this.$route.query && this.$route.query.processName;
|
||||
}
|
||||
else {
|
||||
this.processName = "更新流程";
|
||||
}
|
||||
|
||||
// 获取流程的动态表单
|
||||
getProcessForm({
|
||||
definitionId: this.definitionId,
|
||||
deployId: this.deployId,
|
||||
procInsId: this.procInsId
|
||||
}).then(res => {
|
||||
if (res.data) {
|
||||
// 赋值到表单
|
||||
this.formData = res.data;
|
||||
this.formOpen = true;
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
/** 接收子组件传的值 */
|
||||
getData(data) {
|
||||
if (data) {
|
||||
const variables = [];
|
||||
data.fields.forEach(item => {
|
||||
let variableData = {};
|
||||
// 直接获得标签信息
|
||||
variableData.label = item.__config__.label
|
||||
// 表单值为多个选项时
|
||||
if (item.__config__.defaultValue instanceof Array) {
|
||||
|
@ -86,6 +85,7 @@ export default {
|
|||
})
|
||||
variableData.val = array;
|
||||
} else {
|
||||
// 如果是单个信息,直接得到defaultValue
|
||||
variableData.val = item.__config__.defaultValue
|
||||
}
|
||||
variables.push(variableData)
|
||||
|
@ -96,7 +96,9 @@ export default {
|
|||
submit(data) {
|
||||
if (data && this.definitionId) {
|
||||
// 启动流程并将表单数据加入流程变量
|
||||
startProcess(this.definitionId, JSON.stringify(data.valData)).then(res => {
|
||||
console.log("submit");
|
||||
console.log(data.valData);
|
||||
updateProcess(this.procInsId, JSON.stringify(data.valData)).then(res => {
|
||||
this.$modal.msgSuccess(res.msg);
|
||||
this.$tab.closeOpenPage({
|
||||
path: '/work/own'
|
|
@ -0,0 +1,49 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>ruoyi-flowable-plus</artifactId>
|
||||
<groupId>com.ruoyi</groupId>
|
||||
<version>0.8.3</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>scientific</artifactId>
|
||||
|
||||
<description>
|
||||
scientific模块
|
||||
</description>
|
||||
|
||||
<dependencies>
|
||||
|
||||
<!-- 通用工具-->
|
||||
<dependency>
|
||||
<groupId>com.ruoyi</groupId>
|
||||
<artifactId>ruoyi-common</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.ruoyi</groupId>
|
||||
<artifactId>ruoyi-sms</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.ruoyi</groupId>
|
||||
<artifactId>ruoyi-flowable</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 短信 用哪个导入哪个依赖 -->
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>com.aliyun</groupId>-->
|
||||
<!-- <artifactId>dysmsapi20170525</artifactId>-->
|
||||
<!-- </dependency>-->
|
||||
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>com.tencentcloudapi</groupId>-->
|
||||
<!-- <artifactId>tencentcloud-sdk-java-sms</artifactId>-->
|
||||
<!-- </dependency>-->
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
|
@ -0,0 +1,109 @@
|
|||
package com.ruoyi.scientific.controller;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Arrays;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import com.ruoyi.scientific.domain.vo.DepartmentVo;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.constraints.*;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import com.ruoyi.common.annotation.RepeatSubmit;
|
||||
import com.ruoyi.common.annotation.Log;
|
||||
import com.ruoyi.common.core.controller.BaseController;
|
||||
import com.ruoyi.common.core.domain.PageQuery;
|
||||
import com.ruoyi.common.core.domain.R;
|
||||
import com.ruoyi.common.core.validate.AddGroup;
|
||||
import com.ruoyi.common.core.validate.EditGroup;
|
||||
import com.ruoyi.common.core.validate.QueryGroup;
|
||||
import com.ruoyi.common.enums.BusinessType;
|
||||
import com.ruoyi.common.utils.poi.ExcelUtil;
|
||||
|
||||
import com.ruoyi.scientific.domain.bo.DepartmentBo;
|
||||
import com.ruoyi.scientific.service.IDepartmentService;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
|
||||
/**
|
||||
* department
|
||||
*
|
||||
* @author zqjia
|
||||
* @date 2024-08-13
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/scientific/department")
|
||||
public class DepartmentController extends BaseController {
|
||||
|
||||
private final IDepartmentService iDepartmentService;
|
||||
|
||||
/**
|
||||
* 查询department列表
|
||||
*/
|
||||
@SaCheckPermission("scientific:department:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<DepartmentVo> list(DepartmentBo bo, PageQuery pageQuery) {
|
||||
return iDepartmentService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出department列表
|
||||
*/
|
||||
@SaCheckPermission("scientific:department:export")
|
||||
@Log(title = "department", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(DepartmentBo bo, HttpServletResponse response) {
|
||||
List<DepartmentVo> list = iDepartmentService.queryList(bo);
|
||||
ExcelUtil.exportExcel(list, "department", DepartmentVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取department详细信息
|
||||
*
|
||||
* @param departmentId 主键
|
||||
*/
|
||||
@SaCheckPermission("scientific:department:query")
|
||||
@GetMapping("/{departmentId}")
|
||||
public R<DepartmentVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long departmentId) {
|
||||
return R.ok(iDepartmentService.queryById(departmentId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增department
|
||||
*/
|
||||
@SaCheckPermission("scientific:department:add")
|
||||
@Log(title = "department", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<Void> add(@Validated(AddGroup.class) @RequestBody DepartmentBo bo) {
|
||||
return toAjax(iDepartmentService.insertByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改department
|
||||
*/
|
||||
@SaCheckPermission("scientific:department:edit")
|
||||
@Log(title = "department", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
public R<Void> edit(@Validated(EditGroup.class) @RequestBody DepartmentBo bo) {
|
||||
return toAjax(iDepartmentService.updateByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除department
|
||||
*
|
||||
* @param departmentIds 主键串
|
||||
*/
|
||||
@SaCheckPermission("scientific:department:remove")
|
||||
@Log(title = "department", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{departmentIds}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable Long[] departmentIds) {
|
||||
return toAjax(iDepartmentService.deleteWithValidByIds(Arrays.asList(departmentIds), true));
|
||||
}
|
||||
}
|
|
@ -1,9 +1,10 @@
|
|||
package com.ruoyi.project.controller;
|
||||
package com.ruoyi.scientific.controller;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Arrays;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import com.ruoyi.scientific.domain.bo.FundsReceivedBo;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.constraints.*;
|
||||
|
@ -20,21 +21,21 @@ import com.ruoyi.common.core.validate.EditGroup;
|
|||
import com.ruoyi.common.core.validate.QueryGroup;
|
||||
import com.ruoyi.common.enums.BusinessType;
|
||||
import com.ruoyi.common.utils.poi.ExcelUtil;
|
||||
import com.ruoyi.project.domain.vo.ProjectApplicationVo;
|
||||
import com.ruoyi.project.domain.bo.ProjectApplicationBo;
|
||||
import com.ruoyi.project.service.IProjectApplicationService;
|
||||
import com.ruoyi.scientific.domain.vo.ProjectApplicationVo;
|
||||
import com.ruoyi.scientific.domain.bo.ProjectApplicationBo;
|
||||
import com.ruoyi.scientific.service.IProjectApplicationService;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
|
||||
/**
|
||||
* 项目申报
|
||||
*
|
||||
* @author ruoyi
|
||||
* @date 2024-06-14
|
||||
* @date 2024-07-18
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/project/application")
|
||||
@RequestMapping("/scientific/application")
|
||||
public class ProjectApplicationController extends BaseController {
|
||||
|
||||
private final IProjectApplicationService iProjectApplicationService;
|
||||
|
@ -42,7 +43,7 @@ public class ProjectApplicationController extends BaseController {
|
|||
/**
|
||||
* 查询项目申报列表
|
||||
*/
|
||||
@SaCheckPermission("project:application:list")
|
||||
// @SaCheckPermission("scientific:application:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<ProjectApplicationVo> list(ProjectApplicationBo bo, PageQuery pageQuery) {
|
||||
return iProjectApplicationService.queryPageList(bo, pageQuery);
|
||||
|
@ -51,7 +52,7 @@ public class ProjectApplicationController extends BaseController {
|
|||
/**
|
||||
* 导出项目申报列表
|
||||
*/
|
||||
@SaCheckPermission("project:application:export")
|
||||
@SaCheckPermission("scientific:application:export")
|
||||
@Log(title = "项目申报", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(ProjectApplicationBo bo, HttpServletResponse response) {
|
||||
|
@ -64,7 +65,7 @@ public class ProjectApplicationController extends BaseController {
|
|||
*
|
||||
* @param projectId 主键
|
||||
*/
|
||||
@SaCheckPermission("project:application:query")
|
||||
@SaCheckPermission("scientific:application:query")
|
||||
@GetMapping("/{projectId}")
|
||||
public R<ProjectApplicationVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long projectId) {
|
||||
|
@ -74,7 +75,7 @@ public class ProjectApplicationController extends BaseController {
|
|||
/**
|
||||
* 新增项目申报
|
||||
*/
|
||||
@SaCheckPermission("project:application:add")
|
||||
@SaCheckPermission("scientific:application:add")
|
||||
@Log(title = "项目申报", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
|
@ -85,7 +86,7 @@ public class ProjectApplicationController extends BaseController {
|
|||
/**
|
||||
* 修改项目申报
|
||||
*/
|
||||
@SaCheckPermission("project:application:edit")
|
||||
@SaCheckPermission("scientific:application:edit")
|
||||
@Log(title = "项目申报", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
|
@ -93,16 +94,48 @@ public class ProjectApplicationController extends BaseController {
|
|||
return toAjax(iProjectApplicationService.updateByBo(bo));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 修改项项目预算审批
|
||||
*/
|
||||
@SaCheckPermission("scientific:application:edit")
|
||||
@RepeatSubmit()
|
||||
@PostMapping("/updateBudgetProc")
|
||||
public R<Void> updateBudgetProc(@Validated(EditGroup.class) @RequestBody ProjectApplicationBo bo) {
|
||||
return toAjax(iProjectApplicationService.updateBudgetProc(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改项项目预算审批
|
||||
* @author zhanli
|
||||
*/
|
||||
@SaCheckPermission("scientific:application:edit")
|
||||
@RepeatSubmit()
|
||||
@PostMapping("/confirmFunds")
|
||||
public R<Void> confirmFundsReceivedById(@Validated(EditGroup.class) @RequestBody FundsReceivedBo bo) {
|
||||
iProjectApplicationService.confirmFundsReceivedById(bo);
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除项目申报
|
||||
*
|
||||
* @param projectIds 主键串
|
||||
*/
|
||||
@SaCheckPermission("project:application:remove")
|
||||
@SaCheckPermission("scientific:application:remove")
|
||||
@Log(title = "项目申报", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{projectIds}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable Long[] projectIds) {
|
||||
return toAjax(iProjectApplicationService.deleteWithValidByIds(Arrays.asList(projectIds), true));
|
||||
}
|
||||
/**
|
||||
* 获取已申报项目
|
||||
* cyf
|
||||
*/
|
||||
@SaCheckPermission("scientific:application:declared")
|
||||
@GetMapping("/declared")
|
||||
public R<List<ProjectApplicationVo>> getDeclaredProjects() {
|
||||
return R.ok(iProjectApplicationService.queryDeclaredProjects());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,106 @@
|
|||
package com.ruoyi.scientific.controller;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Arrays;
|
||||
|
||||
import com.ruoyi.scientific.domain.bo.ProjectHandbookBo;
|
||||
import com.ruoyi.scientific.service.IProjectHandbookService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.constraints.*;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import com.ruoyi.common.annotation.RepeatSubmit;
|
||||
import com.ruoyi.common.annotation.Log;
|
||||
import com.ruoyi.common.core.controller.BaseController;
|
||||
import com.ruoyi.common.core.domain.PageQuery;
|
||||
import com.ruoyi.common.core.domain.R;
|
||||
import com.ruoyi.common.core.validate.AddGroup;
|
||||
import com.ruoyi.common.core.validate.EditGroup;
|
||||
import com.ruoyi.common.enums.BusinessType;
|
||||
import com.ruoyi.common.utils.poi.ExcelUtil;
|
||||
import com.ruoyi.scientific.domain.vo.ProjectHandbookVo;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
|
||||
/**
|
||||
* 项目申报指南
|
||||
*
|
||||
* @author zqjia
|
||||
* @date 2024-07-29
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/scientific/handbook")
|
||||
public class ProjectHandbookController extends BaseController {
|
||||
|
||||
private final IProjectHandbookService iProjectHandbookService;
|
||||
|
||||
/**
|
||||
* 查询项目申报指南列表
|
||||
*/
|
||||
@SaCheckPermission("scientific:handbook:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<ProjectHandbookVo> list(ProjectHandbookBo bo, PageQuery pageQuery) {
|
||||
return iProjectHandbookService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出项目申报指南列表
|
||||
*/
|
||||
@SaCheckPermission("scientific:handbook:export")
|
||||
@Log(title = "项目申报指南", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(ProjectHandbookBo bo, HttpServletResponse response) {
|
||||
List<ProjectHandbookVo> list = iProjectHandbookService.queryList(bo);
|
||||
ExcelUtil.exportExcel(list, "项目申报指南", ProjectHandbookVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取项目申报指南详细信息
|
||||
*
|
||||
* @param handbookId 主键
|
||||
*/
|
||||
@SaCheckPermission("scientific:handbook:query")
|
||||
@GetMapping("/{handbookId}")
|
||||
public R<ProjectHandbookVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long handbookId) {
|
||||
return R.ok(iProjectHandbookService.queryById(handbookId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增项目申报指南
|
||||
*/
|
||||
@SaCheckPermission("scientific:handbook:add")
|
||||
@Log(title = "项目申报指南", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<Void> add(@Validated(AddGroup.class) @RequestBody ProjectHandbookBo bo) {
|
||||
return toAjax(iProjectHandbookService.insertByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改项目申报指南
|
||||
*/
|
||||
@SaCheckPermission("scientific:handbook:edit")
|
||||
@Log(title = "项目申报指南", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ProjectHandbookBo bo) {
|
||||
return toAjax(iProjectHandbookService.updateByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除项目申报指南
|
||||
*
|
||||
* @param handbookIds 主键串
|
||||
*/
|
||||
@SaCheckPermission("scientific:handbook:remove")
|
||||
@Log(title = "项目申报指南", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{handbookIds}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable Long[] handbookIds) {
|
||||
return toAjax(iProjectHandbookService.deleteWithValidByIds(Arrays.asList(handbookIds), true));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,106 @@
|
|||
package com.ruoyi.scientific.controller;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Arrays;
|
||||
|
||||
import com.ruoyi.scientific.domain.bo.ProjectPlanBo;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.constraints.*;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import com.ruoyi.common.annotation.RepeatSubmit;
|
||||
import com.ruoyi.common.annotation.Log;
|
||||
import com.ruoyi.common.core.controller.BaseController;
|
||||
import com.ruoyi.common.core.domain.PageQuery;
|
||||
import com.ruoyi.common.core.domain.R;
|
||||
import com.ruoyi.common.core.validate.AddGroup;
|
||||
import com.ruoyi.common.core.validate.EditGroup;
|
||||
import com.ruoyi.common.enums.BusinessType;
|
||||
import com.ruoyi.common.utils.poi.ExcelUtil;
|
||||
import com.ruoyi.scientific.domain.vo.ProjectPlanVo;
|
||||
import com.ruoyi.scientific.service.IProjectPlanService;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
|
||||
/**
|
||||
* 项目申报v2
|
||||
*
|
||||
* @author ruoyi
|
||||
* @date 2024-07-23
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/scientific/plan")
|
||||
public class ProjectPlanController extends BaseController {
|
||||
|
||||
private final IProjectPlanService iProjectHandbookService;
|
||||
|
||||
/**
|
||||
* 查询项目申报v2列表
|
||||
*/
|
||||
@SaCheckPermission("scientific:project_application_plan:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<ProjectPlanVo> list(ProjectPlanBo bo, PageQuery pageQuery) {
|
||||
return iProjectHandbookService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出项目申报计划列表
|
||||
*/
|
||||
@SaCheckPermission("scientific:plan:export")
|
||||
@Log(title = "项目申报v2", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(ProjectPlanBo bo, HttpServletResponse response) {
|
||||
List<ProjectPlanVo> list = iProjectHandbookService.queryList(bo);
|
||||
ExcelUtil.exportExcel(list, "项目申报v2", ProjectPlanVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取项目申报计划详细信息
|
||||
*
|
||||
* @param planId 主键
|
||||
*/
|
||||
@SaCheckPermission("scientific:plan:query")
|
||||
@GetMapping("/{planId}")
|
||||
public R<ProjectPlanVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long planId) {
|
||||
return R.ok(iProjectHandbookService.queryById(planId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增项目申报计划
|
||||
*/
|
||||
@SaCheckPermission("scientific:plan:add")
|
||||
@Log(title = "项目申报计划", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<Void> add(@Validated(AddGroup.class) @RequestBody ProjectPlanBo bo) {
|
||||
return toAjax(iProjectHandbookService.insertByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改项目申报计划
|
||||
*/
|
||||
@SaCheckPermission("scientific:plan:edit")
|
||||
@Log(title = "项目申报计划", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ProjectPlanBo bo) {
|
||||
return toAjax(iProjectHandbookService.updateByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除项目申报计划
|
||||
*
|
||||
* @param planIds 主键串
|
||||
*/
|
||||
@SaCheckPermission("scientific:plan:remove")
|
||||
@Log(title = "项目申报计划", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{planIds}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable Long[] planIds) {
|
||||
return toAjax(iProjectHandbookService.deleteWithValidByIds(Arrays.asList(planIds), true));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,72 @@
|
|||
package com.ruoyi.scientific.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
import com.ruoyi.common.core.domain.BaseEntity;
|
||||
|
||||
/**
|
||||
* department对象 department
|
||||
*
|
||||
* @author zqjia
|
||||
* @date 2024-08-13
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("department")
|
||||
public class Department extends BaseEntity {
|
||||
|
||||
private static final long serialVersionUID=1L;
|
||||
|
||||
/**
|
||||
* 单位ID
|
||||
*/
|
||||
@TableId(value = "department_id")
|
||||
private Long departmentId;
|
||||
/**
|
||||
* 单位名称
|
||||
*/
|
||||
private String departmentName;
|
||||
/**
|
||||
* 单位地址
|
||||
*/
|
||||
private String departmentAddress;
|
||||
/**
|
||||
* 单位性质,1企业,2科研机构,3高校
|
||||
*/
|
||||
private String departmentCategory;
|
||||
/**
|
||||
* 单位联系人姓名
|
||||
*/
|
||||
private String departmentPerson;
|
||||
/**
|
||||
* 单位联系人电话
|
||||
*/
|
||||
private String departmentPhone;
|
||||
/**
|
||||
* 单位联系人邮件
|
||||
*/
|
||||
private String departmentEmail;
|
||||
/**
|
||||
* 相关文件
|
||||
*/
|
||||
private String departmentFile;
|
||||
/**
|
||||
* 其他备注信息
|
||||
*/
|
||||
private String departmentNote;
|
||||
|
||||
/**
|
||||
* 指南录入流程实例Id
|
||||
*/
|
||||
private String departmentProcId;
|
||||
|
||||
/**
|
||||
* 指南录入流程状态(0未发起审核 1审核中 2审核失败 3审核通过)
|
||||
*/
|
||||
private String departmentStatus;
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package com.ruoyi.project.domain;
|
||||
package com.ruoyi.scientific.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import lombok.Data;
|
||||
|
@ -15,7 +15,7 @@ import com.ruoyi.common.core.domain.BaseEntity;
|
|||
* 项目申报对象 project_application
|
||||
*
|
||||
* @author ruoyi
|
||||
* @date 2024-06-14
|
||||
* @date 2024-07-18
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
|
@ -37,6 +37,18 @@ public class ProjectApplication extends BaseEntity {
|
|||
* 状态(0正常 1停用)
|
||||
*/
|
||||
private String projectStatus;
|
||||
/**
|
||||
* 项目立项流程实例Id
|
||||
*/
|
||||
private String projectAppProcId;
|
||||
/**
|
||||
* 项目申报状态(0 未申报 2申报中 3已申报 4 申报失败)
|
||||
*/
|
||||
private String projectDeclareStatus;
|
||||
/**
|
||||
* 项目立项状态(0未立项 2审核中 3已立项)
|
||||
*/
|
||||
private String projectAppStaus;
|
||||
/**
|
||||
* 申报开始日期
|
||||
*/
|
||||
|
@ -58,4 +70,33 @@ public class ProjectApplication extends BaseEntity {
|
|||
*/
|
||||
private String projectLeaderPhone;
|
||||
|
||||
/**
|
||||
* 项目关联计划ID
|
||||
*/
|
||||
private Long projectPlanId;
|
||||
|
||||
/**
|
||||
* 项目关联计划名称
|
||||
*/
|
||||
private String projectPlanName;
|
||||
|
||||
/**
|
||||
* 项目类别(0纵向 1横向 2院级 )
|
||||
*/
|
||||
private String projectCategory;
|
||||
|
||||
/**
|
||||
* 项目到账情况 0:未到账 1:已到账
|
||||
*/
|
||||
private String projectFundsReceived;
|
||||
|
||||
/**
|
||||
* 项目到账情况备注说明
|
||||
*/
|
||||
private String projectFundsRemark;
|
||||
|
||||
/**
|
||||
* 项目表单内容
|
||||
*/
|
||||
private String projectContent;
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
package com.ruoyi.scientific.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import com.ruoyi.common.core.domain.BaseEntity;
|
||||
|
||||
/**
|
||||
* 项目申报指南对象 handbook
|
||||
*
|
||||
* @author zqjia
|
||||
* @date 2024-07-29
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("project_handbook")
|
||||
public class ProjectHandbook extends BaseEntity {
|
||||
|
||||
private static final long serialVersionUID=1L;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
@TableId(value = "handbook_id")
|
||||
private Long handbookId;
|
||||
/**
|
||||
* 指南名称
|
||||
*/
|
||||
private String handbookName;
|
||||
/**
|
||||
* 指南分类
|
||||
*/
|
||||
private String handbookCategory;
|
||||
/**
|
||||
* 指南级别(4院级 3市级 2省级 1国家级)
|
||||
*/
|
||||
private String handbookLevel;
|
||||
/**
|
||||
* 发布时间
|
||||
*/
|
||||
private Date handbookDate;
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String handbookNote;
|
||||
/**
|
||||
* 指南文件
|
||||
*/
|
||||
private String handbookFile;
|
||||
/**
|
||||
* 指南录入流程实例Id
|
||||
*/
|
||||
private String handbookProcId;
|
||||
/**
|
||||
* 指南录入流程状态(0未发起审核 1审核中 2审核失败 3审核通过)
|
||||
*/
|
||||
private String handbookStatus;
|
||||
|
||||
/**
|
||||
* 指南发布人姓名
|
||||
*/
|
||||
private String directorName;
|
||||
}
|
|
@ -0,0 +1,105 @@
|
|||
package com.ruoyi.scientific.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import com.ruoyi.common.core.domain.BaseEntity;
|
||||
|
||||
/**
|
||||
* 项目申报v2对象 project_handbook
|
||||
*
|
||||
* @author ruoyi
|
||||
* @date 2024-07-23
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("project_plan")
|
||||
public class ProjectPlan extends BaseEntity {
|
||||
|
||||
private static final long serialVersionUID=1L;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
@TableId(value = "plan_id")
|
||||
private Long planId;
|
||||
/**
|
||||
* 申报信息名称
|
||||
*/
|
||||
private String planName;
|
||||
/**
|
||||
* 项目立项流程实例Id
|
||||
*/
|
||||
private String planProcId;
|
||||
/**
|
||||
* 项目审核状态(1审核中 2审核失败 3审核通过)
|
||||
*/
|
||||
private String planStatus;
|
||||
|
||||
/**
|
||||
* 项目指南级别(4院级 3市级 2省级 1国家级)
|
||||
*/
|
||||
private String planLevel;
|
||||
|
||||
/**
|
||||
* 申报指南文件
|
||||
*/
|
||||
private String planFile;
|
||||
|
||||
/**
|
||||
* 申报计划
|
||||
*/
|
||||
private String planComment;
|
||||
|
||||
/**
|
||||
* 申报开始日期
|
||||
*/
|
||||
private Date projectAppStTime;
|
||||
/**
|
||||
* 申报结束日期
|
||||
*/
|
||||
private Date projectAppEndTime;
|
||||
|
||||
/**
|
||||
* 项目来源单位
|
||||
*/
|
||||
private String projectSourceDepartment;
|
||||
|
||||
/**
|
||||
* 项目分类(即申报计划类别)
|
||||
*/
|
||||
private String projectCategory;
|
||||
|
||||
/**
|
||||
* 项目子类
|
||||
*/
|
||||
private String projectSubclass;
|
||||
|
||||
/**
|
||||
* 评审名称
|
||||
*/
|
||||
private String reviewName;
|
||||
|
||||
/**
|
||||
* 评审开始时间
|
||||
*/
|
||||
private Date reviewStTime;
|
||||
|
||||
/**
|
||||
* 评审结束时间
|
||||
*/
|
||||
private Date reviewEndTime;
|
||||
|
||||
/**
|
||||
* 创建人名字
|
||||
*/
|
||||
private String createName;
|
||||
|
||||
/**
|
||||
* 关联的指南ID
|
||||
*/
|
||||
private Long handbookId;
|
||||
}
|
|
@ -0,0 +1,80 @@
|
|||
package com.ruoyi.scientific.domain.bo;
|
||||
|
||||
import com.ruoyi.common.core.validate.AddGroup;
|
||||
import com.ruoyi.common.core.validate.EditGroup;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import javax.validation.constraints.*;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import com.ruoyi.common.core.domain.BaseEntity;
|
||||
|
||||
/**
|
||||
* department业务对象 department
|
||||
*
|
||||
* @author zqjia
|
||||
* @date 2024-08-13
|
||||
*/
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class DepartmentBo extends BaseEntity {
|
||||
|
||||
/**
|
||||
* 单位ID
|
||||
*/
|
||||
@NotNull(message = "单位ID不能为空", groups = { EditGroup.class })
|
||||
private Long departmentId;
|
||||
|
||||
/**
|
||||
* 单位名称
|
||||
*/
|
||||
@NotBlank(message = "单位不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String departmentName;
|
||||
|
||||
/**
|
||||
* 单位地址
|
||||
*/
|
||||
private String departmentAddress;
|
||||
|
||||
/**
|
||||
* 单位性质,1企业,2科研机构,3高校
|
||||
*/
|
||||
private String departmentCategory;
|
||||
|
||||
/**
|
||||
* 单位联系人姓名
|
||||
*/
|
||||
private String departmentPerson;
|
||||
|
||||
/**
|
||||
* 单位联系人电话
|
||||
*/
|
||||
private String departmentPhone;
|
||||
|
||||
/**
|
||||
* 单位联系人邮件
|
||||
*/
|
||||
private String departmentEmail;
|
||||
|
||||
/**
|
||||
* 相关文件
|
||||
*/
|
||||
private String departmentFile;
|
||||
|
||||
/**
|
||||
* 其他备注信息
|
||||
*/
|
||||
private String departmentNote;
|
||||
|
||||
/**
|
||||
* 指南录入流程实例Id
|
||||
*/
|
||||
private String departmentProcId;
|
||||
|
||||
/**
|
||||
* 指南录入流程状态(0未发起审核 1审核中 2审核失败 3审核通过)
|
||||
*/
|
||||
private String departmentStatus;
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
package com.ruoyi.scientific.domain.bo;
|
||||
import com.ruoyi.common.core.validate.AddGroup;
|
||||
import com.ruoyi.common.core.validate.EditGroup;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* 项目到账信息结构体, 用于财务更新项目的到账情况
|
||||
* @author zhanli
|
||||
*/
|
||||
@Data
|
||||
public class FundsReceivedBo {
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
@NotNull(message = "项目ID不能为空", groups = { EditGroup.class })
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 项目到账状态 0: 未到账 1: 已到账
|
||||
*/
|
||||
@NotBlank(message = "到账情况不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String projectFundsReceived;
|
||||
|
||||
/**
|
||||
* 项目立项流程实例Id
|
||||
*/
|
||||
@NotBlank(message = "请填写项目到账备注说明", groups = { AddGroup.class, EditGroup.class })
|
||||
private String projectFundsRemark;
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
package com.ruoyi.project.domain.bo;
|
||||
package com.ruoyi.scientific.domain.bo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import com.ruoyi.common.core.validate.AddGroup;
|
||||
import com.ruoyi.common.core.validate.EditGroup;
|
||||
import lombok.Data;
|
||||
|
@ -16,7 +17,7 @@ import com.ruoyi.common.core.domain.BaseEntity;
|
|||
* 项目申报业务对象 project_application
|
||||
*
|
||||
* @author ruoyi
|
||||
* @date 2024-06-14
|
||||
* @date 2024-07-18
|
||||
*/
|
||||
|
||||
@Data
|
||||
|
@ -42,16 +43,32 @@ public class ProjectApplicationBo extends BaseEntity {
|
|||
@NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String projectStatus;
|
||||
|
||||
/**
|
||||
* 项目立项流程实例Id
|
||||
*/
|
||||
private String projectAppProcId;
|
||||
|
||||
/**
|
||||
* 项目立项状态(0未立项 2审核中 3已立项)
|
||||
*/
|
||||
private String projectAppStaus;
|
||||
|
||||
|
||||
/**
|
||||
* 项目申报状态(0 未申报 2申报中 3已申报 4 申报失败)
|
||||
*/
|
||||
private String projectDeclareStatus;
|
||||
|
||||
/**
|
||||
* 申报开始日期
|
||||
*/
|
||||
@NotNull(message = "申报开始日期不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
@NotNull(message = "项目开始日期不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private Date projectAppStTime;
|
||||
|
||||
/**
|
||||
* 申报结束日期
|
||||
*/
|
||||
@NotNull(message = "申报结束日期不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
@NotNull(message = "项目结束日期不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private Date projectAppEndTime;
|
||||
|
||||
/**
|
||||
|
@ -69,8 +86,35 @@ public class ProjectApplicationBo extends BaseEntity {
|
|||
/**
|
||||
* 项目负责人联系电话
|
||||
*/
|
||||
@NotBlank(message = "项目负责人联系电话不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String projectLeaderPhone;
|
||||
|
||||
/**
|
||||
* 项目关联计划ID
|
||||
*/
|
||||
private Long projectPlanId;
|
||||
|
||||
/**
|
||||
* 项目关联计划名称
|
||||
*/
|
||||
private String projectPlanName;
|
||||
|
||||
/**
|
||||
* 项目关类别(0纵向 1横向 2院级 )
|
||||
*/
|
||||
private String projectCategory;
|
||||
|
||||
/**
|
||||
* 项目表单内容
|
||||
*/
|
||||
private String projectContent;
|
||||
|
||||
/**
|
||||
* 项目到账情况 0:未到账 1:已到账
|
||||
*/
|
||||
private String projectFundsReceived;
|
||||
|
||||
/**
|
||||
* 项目到账情况备注说明
|
||||
*/
|
||||
private String projectFundsRemark;
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package com.ruoyi.scientific.domain.bo;
|
||||
|
||||
public class ProjectBaseBo {
|
||||
/**
|
||||
* 项目未立项常量
|
||||
*/
|
||||
public static String PROJECT_NO_INIT = "0";
|
||||
/**
|
||||
* 项目审核中
|
||||
*/
|
||||
public static String PROJECT_REVIEWING = "1";
|
||||
|
||||
/**
|
||||
* 项目已立项
|
||||
*/
|
||||
public static String PROJECT_INIT = "2";
|
||||
|
||||
/**
|
||||
* 项目未申报
|
||||
*/
|
||||
public static String PROJECT_NO_DECLARE = "0";
|
||||
|
||||
/**
|
||||
* 项目经费未到账
|
||||
*/
|
||||
public static String PROJECT_FUNDS_NO_RECEIVED = "0";
|
||||
|
||||
/**
|
||||
* 项目经费到账
|
||||
*/
|
||||
public static String PROJECT_FUNDS_RECEIVED = "1";
|
||||
|
||||
/**
|
||||
* 项目经费到账备注
|
||||
*/
|
||||
public static String PROJECT_FUNDS_NO_RECEIVED_REMARK = "暂无";
|
||||
}
|
|
@ -0,0 +1,79 @@
|
|||
package com.ruoyi.scientific.domain.bo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import com.ruoyi.common.core.validate.AddGroup;
|
||||
import com.ruoyi.common.core.validate.EditGroup;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import javax.validation.constraints.*;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import com.ruoyi.common.core.domain.BaseEntity;
|
||||
|
||||
/**
|
||||
* 项目申报指南业务对象 handbook
|
||||
*
|
||||
* @author zqjia
|
||||
* @date 2024-07-29
|
||||
*/
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class ProjectHandbookBo extends BaseEntity {
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
@NotNull(message = "项目ID不能为空", groups = { EditGroup.class })
|
||||
private Long handbookId;
|
||||
|
||||
/**
|
||||
* 指南名称
|
||||
*/
|
||||
@NotBlank(message = "指南名称不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String handbookName;
|
||||
|
||||
/**
|
||||
* 指南分类
|
||||
*/
|
||||
@NotBlank(message = "指南分类不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String handbookCategory;
|
||||
|
||||
/**
|
||||
* 指南级别(4院级 3市级 2省级 1国家级)
|
||||
*/
|
||||
@NotBlank(message = "指南级别(4院级 3市级 2省级 1国家级)不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String handbookLevel;
|
||||
|
||||
/**
|
||||
* 发布时间
|
||||
*/
|
||||
@NotNull(message = "发布时间不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private Date handbookDate;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String handbookNote;
|
||||
|
||||
/**
|
||||
* 指南文件
|
||||
*/
|
||||
private String handbookFile;
|
||||
|
||||
/**
|
||||
* 指南录入流程实例Id
|
||||
*/
|
||||
private String handbookProcId;
|
||||
|
||||
/**
|
||||
* 指南录入流程状态(0未发起审核 1审核中 2审核失败 3审核通过)
|
||||
*/
|
||||
private String handbookStatus;
|
||||
|
||||
/**
|
||||
* 指南发布人姓名
|
||||
*/
|
||||
private String directorName;
|
||||
}
|
|
@ -0,0 +1,116 @@
|
|||
package com.ruoyi.scientific.domain.bo;
|
||||
|
||||
import com.ruoyi.common.core.validate.AddGroup;
|
||||
import com.ruoyi.common.core.validate.EditGroup;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import javax.validation.constraints.*;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import com.ruoyi.common.core.domain.BaseEntity;
|
||||
|
||||
/**
|
||||
* 项目申报v2业务对象 project_handbook
|
||||
*
|
||||
* @author ruoyi
|
||||
* @date 2024-07-23
|
||||
*/
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class ProjectPlanBo extends BaseEntity {
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
@NotNull(message = "项目ID不能为空", groups = { EditGroup.class })
|
||||
private Long planId;
|
||||
|
||||
/**
|
||||
* 申报信息名称
|
||||
*/
|
||||
@NotBlank(message = "申报信息名称不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String planName;
|
||||
|
||||
/**
|
||||
* 指南录入流程实例Id
|
||||
*/
|
||||
@NotBlank(message = "指南录入流程实例Id不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String planProcId;
|
||||
|
||||
/**
|
||||
* 指南录入流程审核状态(1审核中 2审核失败 3审核通过)
|
||||
*/
|
||||
@NotBlank(message = "指南录入流程审核状态", groups = { AddGroup.class, EditGroup.class })
|
||||
private String planStatus;
|
||||
|
||||
/**
|
||||
* 项目指南级别(4院级 3市级 2省级 1国家级)
|
||||
*/
|
||||
@NotBlank(message = "项目指南级别(4院级 3市级 2省级 1国家级)不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String planLevel;
|
||||
|
||||
/**
|
||||
* 申报指南文件
|
||||
*/
|
||||
|
||||
private String planFile;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String planComment;
|
||||
|
||||
/**
|
||||
* 申报开始日期
|
||||
*/
|
||||
@NotNull(message = "申报开始日期不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private Date projectAppStTime;
|
||||
|
||||
/**
|
||||
* 申报结束日期
|
||||
*/
|
||||
@NotNull(message = "申报结束日期不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private Date projectAppEndTime;
|
||||
|
||||
/**
|
||||
* 项目来源单位
|
||||
*/
|
||||
private String projectSourceDepartment;
|
||||
|
||||
/**
|
||||
* 项目分类(即申报计划类别)
|
||||
*/
|
||||
private String projectCategory;
|
||||
|
||||
/**
|
||||
* 项目子类
|
||||
*/
|
||||
private String projectSubclass;
|
||||
|
||||
/**
|
||||
* 评审名称
|
||||
*/
|
||||
private String reviewName;
|
||||
|
||||
/**
|
||||
* 评审开始时间
|
||||
*/
|
||||
private Date reviewStTime;
|
||||
|
||||
/**
|
||||
* 评审结束时间
|
||||
*/
|
||||
private Date reviewEndTime;
|
||||
|
||||
/**
|
||||
* 创建人名字
|
||||
*/
|
||||
private String createName;
|
||||
|
||||
/**
|
||||
* 关联的指南ID
|
||||
*/
|
||||
private Long handbookId;
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
package com.ruoyi.scientific.domain.bo;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class UpdateBudgetBo {
|
||||
/**
|
||||
* 项目ID,不能为空
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
private Long projectOldBudget;
|
||||
|
||||
private Long projectNewBudget;
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
package com.ruoyi.scientific.domain.vo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import com.ruoyi.common.annotation.ExcelDictFormat;
|
||||
import com.ruoyi.common.convert.ExcelDictConvert;
|
||||
import lombok.Data;
|
||||
import java.util.Date;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* department视图对象 department
|
||||
*
|
||||
* @author zqjia
|
||||
* @date 2024-08-13
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class DepartmentVo {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 单位ID
|
||||
*/
|
||||
@ExcelProperty(value = "单位ID")
|
||||
private Long departmentId;
|
||||
|
||||
/**
|
||||
* 单位名称
|
||||
*/
|
||||
@ExcelProperty(value = "单位名称")
|
||||
private String departmentName;
|
||||
|
||||
/**
|
||||
* 单位地址
|
||||
*/
|
||||
@ExcelProperty(value = "单位地址")
|
||||
private String departmentAddress;
|
||||
|
||||
/**
|
||||
* 单位性质,1企业,2科研机构,3高校
|
||||
*/
|
||||
@ExcelProperty(value = "单位性质,1企业,2科研机构,3高校")
|
||||
private String departmentCategory;
|
||||
|
||||
/**
|
||||
* 单位联系人姓名
|
||||
*/
|
||||
@ExcelProperty(value = "单位联系人姓名")
|
||||
private String departmentPerson;
|
||||
|
||||
/**
|
||||
* 单位联系人电话
|
||||
*/
|
||||
@ExcelProperty(value = "单位联系人电话")
|
||||
private String departmentPhone;
|
||||
|
||||
/**
|
||||
* 单位联系人邮件
|
||||
*/
|
||||
@ExcelProperty(value = "单位联系人邮件")
|
||||
private String departmentEmail;
|
||||
|
||||
/**
|
||||
* 相关文件
|
||||
*/
|
||||
@ExcelProperty(value = "相关文件")
|
||||
private String departmentFile;
|
||||
|
||||
/**
|
||||
* 其他备注信息
|
||||
*/
|
||||
@ExcelProperty(value = "其他备注信息")
|
||||
private String departmentNote;
|
||||
|
||||
/**
|
||||
* 指南录入流程实例Id
|
||||
*/
|
||||
private String departmentProcId;
|
||||
|
||||
/**
|
||||
* 指南录入流程状态(0未发起审核 1审核中 2审核失败 3审核通过)
|
||||
*/
|
||||
private String departmentStatus;
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package com.ruoyi.project.domain.vo;
|
||||
package com.ruoyi.scientific.domain.vo;
|
||||
|
||||
import java.util.Date;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
|
@ -42,6 +42,22 @@ public class ProjectApplicationVo {
|
|||
@ExcelDictFormat(readConverterExp = "0=正常,1=停用")
|
||||
private String projectStatus;
|
||||
|
||||
/**
|
||||
* 项目立项流程实例Id
|
||||
*/
|
||||
private String projectAppProcId;
|
||||
|
||||
/**
|
||||
* 项目立项状态(0未立项 2审核中 3已立项 4 立项失败)
|
||||
*/
|
||||
private String projectAppStaus;
|
||||
|
||||
|
||||
/**
|
||||
* 项目申报状态(0 未申报 2申报中 3已申报 4 申报失败)
|
||||
*/
|
||||
private String projectDeclareStatus;
|
||||
|
||||
/**
|
||||
* 申报开始日期
|
||||
*/
|
||||
|
@ -72,5 +88,35 @@ public class ProjectApplicationVo {
|
|||
@ExcelProperty(value = "项目负责人联系电话")
|
||||
private String projectLeaderPhone;
|
||||
|
||||
/**
|
||||
* 项目关联计划ID
|
||||
*/
|
||||
private Long projectPlanId;
|
||||
|
||||
/**
|
||||
* 项目关联计划名称
|
||||
*/
|
||||
private String projectPlanName;
|
||||
|
||||
/**
|
||||
* 项目类别(0纵向 1横向 2院级 )
|
||||
*/
|
||||
private String projectCategory;
|
||||
|
||||
/**
|
||||
* 项目表单内容
|
||||
*/
|
||||
private String projectContent;
|
||||
|
||||
/**
|
||||
* 项目到账情况 0:未到账 1:已到账
|
||||
*/
|
||||
@ExcelProperty(value = "项目到账情况 0:未到账 1:已到账")
|
||||
private String projectFundsReceived;
|
||||
|
||||
/**
|
||||
* 项目到账情况备注说明
|
||||
*/
|
||||
@ExcelProperty(value = "到账情况备注说明")
|
||||
private String projectFundsRemark;
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
package com.ruoyi.scientific.domain.vo;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
|
||||
/**
|
||||
* 项目申报指南视图对象 handbook
|
||||
*
|
||||
* @author zqjia
|
||||
* @date 2024-07-29
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class ProjectHandbookVo {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
@ExcelProperty(value = "项目ID")
|
||||
private Long handbookId;
|
||||
|
||||
/**
|
||||
* 指南名称
|
||||
*/
|
||||
@ExcelProperty(value = "指南名称")
|
||||
private String handbookName;
|
||||
|
||||
/**
|
||||
* 指南分类
|
||||
*/
|
||||
@ExcelProperty(value = "指南分类")
|
||||
private String handbookCategory;
|
||||
|
||||
/**
|
||||
* 指南级别(4院级 3市级 2省级 1国家级)
|
||||
*/
|
||||
@ExcelProperty(value = "指南级别(4院级 3市级 2省级 1国家级)")
|
||||
private String handbookLevel;
|
||||
|
||||
/**
|
||||
* 发布时间
|
||||
*/
|
||||
@ExcelProperty(value = "发布时间")
|
||||
private Date handbookDate;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
@ExcelProperty(value = "备注")
|
||||
private String handbookNote;
|
||||
|
||||
/**
|
||||
* 指南文件
|
||||
*/
|
||||
@ExcelProperty(value = "指南文件")
|
||||
private String handbookFile;
|
||||
|
||||
/**
|
||||
* 指南录入流程实例Id
|
||||
*/
|
||||
@ExcelProperty(value = "指南录入流程实例Id")
|
||||
private String handbookProcId;
|
||||
|
||||
/**
|
||||
* 指南录入流程状态(0未发起审核 1审核中 2审核失败 3审核通过)
|
||||
*/
|
||||
@ExcelProperty(value = "指南录入流程状态(0未发起审核 1审核中 2审核失败 3审核通过)")
|
||||
private String handbookStatus;
|
||||
|
||||
/**
|
||||
* 指南发布人姓名
|
||||
*/
|
||||
@ExcelProperty(value = "指南发布人姓名")
|
||||
private String directorName;
|
||||
}
|
|
@ -0,0 +1,113 @@
|
|||
package com.ruoyi.scientific.domain.vo;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
|
||||
/**
|
||||
* 项目申报v2视图对象 project_handbook
|
||||
*
|
||||
* @author ruoyi
|
||||
* @date 2024-07-23
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class ProjectPlanVo {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
@ExcelProperty(value = "项目ID")
|
||||
private Long planId;
|
||||
|
||||
/**
|
||||
* 申报信息名称
|
||||
*/
|
||||
@ExcelProperty(value = "申报信息名称")
|
||||
private String planName;
|
||||
|
||||
/**
|
||||
* 项目立项流程实例Id
|
||||
*/
|
||||
@ExcelProperty(value = "项目立项流程实例Id")
|
||||
private String planProcId;
|
||||
|
||||
/**
|
||||
* 项目审核状态(0未审核 1审核中 3审核通过)
|
||||
*/
|
||||
@ExcelProperty(value = "项目审核状态(0未审核 1审核中 3审核通过)")
|
||||
private String planStatus;
|
||||
|
||||
/**
|
||||
* 项目指南级别(0市级 1区级 3省级 4国家级)
|
||||
*/
|
||||
@ExcelProperty(value = "项目指南级别(0市级 1区级 3省级 4国家级)")
|
||||
private String planLevel;
|
||||
|
||||
/**
|
||||
* 申报指南文件
|
||||
*/
|
||||
private String planFile;
|
||||
|
||||
/**
|
||||
* 申报计划
|
||||
*/
|
||||
private String planComment;
|
||||
|
||||
/**
|
||||
* 申报开始日期
|
||||
*/
|
||||
@ExcelProperty(value = "申报开始日期")
|
||||
private Date projectAppStTime;
|
||||
|
||||
/**
|
||||
* 申报结束日期
|
||||
*/
|
||||
@ExcelProperty(value = "申报结束日期")
|
||||
private Date projectAppEndTime;
|
||||
|
||||
/**
|
||||
* 项目来源单位
|
||||
*/
|
||||
private String projectSourceDepartment;
|
||||
|
||||
/**
|
||||
* 项目分类(即申报计划类别)
|
||||
*/
|
||||
private String projectCategory;
|
||||
|
||||
/**
|
||||
* 项目子类
|
||||
*/
|
||||
private String projectSubclass;
|
||||
|
||||
/**
|
||||
* 评审名称
|
||||
*/
|
||||
private String reviewName;
|
||||
|
||||
/**
|
||||
* 评审开始时间
|
||||
*/
|
||||
private Date reviewStTime;
|
||||
|
||||
/**
|
||||
* 评审结束时间
|
||||
*/
|
||||
private Date reviewEndTime;
|
||||
|
||||
/**
|
||||
* 创建人名字
|
||||
*/
|
||||
private String createName;
|
||||
|
||||
/**
|
||||
* 关联的指南ID
|
||||
*/
|
||||
private Long handbookId;
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
package com.ruoyi.scientific.listener;
|
||||
import com.ruoyi.common.utils.spring.SpringUtils;
|
||||
import com.ruoyi.scientific.service.IProjectApplicationService;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.flowable.engine.delegate.ExecutionListener;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
|
||||
@Component
|
||||
public class BudgetUpdateTaskListener implements ExecutionListener {
|
||||
/**
|
||||
* 注入字段(名称与流程设计时字段名称一致)
|
||||
*/
|
||||
|
||||
private final IProjectApplicationService iProjectApplicationService =
|
||||
SpringUtils.getBean(IProjectApplicationService.class);
|
||||
|
||||
|
||||
@Override
|
||||
public void notify(DelegateExecution execution) {
|
||||
System.out.println("科研模块:执行任务监听器...");
|
||||
|
||||
String projectIdStr = (String) execution.getVariable("projectId");
|
||||
Long projectId = Long.parseLong(projectIdStr);
|
||||
|
||||
String projectBudget = (String) execution.getVariable("newBudget");
|
||||
Long budget = Long.parseLong(projectBudget);
|
||||
|
||||
String status = (String) execution.getVariable("taskStatus");
|
||||
System.out.println("科研模块:项目Id:" + status);
|
||||
iProjectApplicationService.updateBudgetInfoById(projectId, budget);
|
||||
|
||||
System.out.println("科研模块:项目Id:" + projectIdStr);
|
||||
System.out.println("科研模块:项目预算:" + projectBudget);
|
||||
// 调用其他模块的服务完成数据库的更新操作
|
||||
// Your Code
|
||||
}
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
package com.ruoyi.scientific.listener;
|
||||
import com.ruoyi.common.utils.spring.SpringUtils;
|
||||
import com.ruoyi.flowable.common.constant.ProcessConstants;
|
||||
import com.ruoyi.scientific.domain.bo.DepartmentBo;
|
||||
import com.ruoyi.scientific.service.IDepartmentService;
|
||||
import com.ruoyi.scientific.service.IDepartmentService;
|
||||
import org.flowable.engine.RuntimeService;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.flowable.engine.delegate.ExecutionListener;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.flowable.engine.HistoryService;
|
||||
import com.ruoyi.common.core.domain.PageQuery;
|
||||
import com.ruoyi.scientific.domain.vo.DepartmentVo;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
|
||||
@Component
|
||||
public class DepartmentUpdateListener implements ExecutionListener {
|
||||
/**
|
||||
* 注入字段(名称与流程设计时字段名称一致)
|
||||
*/
|
||||
|
||||
private final IDepartmentService IdepartmentService =
|
||||
SpringUtils.getBean(IDepartmentService.class);
|
||||
private final HistoryService historyService =
|
||||
SpringUtils.getBean(HistoryService.class);
|
||||
|
||||
private final RuntimeService runtimeService =
|
||||
SpringUtils.getBean(RuntimeService.class);
|
||||
|
||||
@Override
|
||||
public void notify(DelegateExecution execution) {
|
||||
System.out.println("科研模块:执行合作单位更新任务监听器...");
|
||||
|
||||
String departmentProcId = execution.getProcessInstanceId();
|
||||
DepartmentBo bo = new DepartmentBo();
|
||||
bo.setDepartmentProcId(departmentProcId);
|
||||
PageQuery pageQuery = new PageQuery();
|
||||
TableDataInfo<DepartmentVo> result = IdepartmentService.queryPageList(bo, pageQuery);
|
||||
Long departmentId = result.getRows().get(0).getDepartmentId();
|
||||
|
||||
// zqjia:获取在task complete时注入的review状态
|
||||
String reviewStatus = (String) execution.getVariable("review");
|
||||
// 获取流程状态
|
||||
String status = (String) runtimeService.getVariable(departmentProcId, ProcessConstants.PROCESS_STATUS_KEY);
|
||||
|
||||
// zqjia: runtimeService获取是否terminated,判断注入review字段可以区分是complete还是cancel
|
||||
if("terminated".equals(status)) {
|
||||
IdepartmentService.updateDepartmentInfoById(departmentId, "2");
|
||||
}
|
||||
else {
|
||||
if("1".equals(reviewStatus)) {
|
||||
IdepartmentService.updateDepartmentInfoById(departmentId, "3");
|
||||
}
|
||||
else {
|
||||
IdepartmentService.updateDepartmentInfoById(departmentId, "0");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
package com.ruoyi.scientific.listener;
|
||||
import com.ruoyi.common.utils.spring.SpringUtils;
|
||||
import com.ruoyi.flowable.common.constant.ProcessConstants;
|
||||
import com.ruoyi.scientific.domain.bo.ProjectHandbookBo;
|
||||
import com.ruoyi.scientific.service.IProjectHandbookService;
|
||||
import org.flowable.engine.RuntimeService;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.flowable.engine.delegate.ExecutionListener;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.flowable.engine.HistoryService;
|
||||
import com.ruoyi.common.core.domain.PageQuery;
|
||||
import com.ruoyi.scientific.domain.vo.ProjectHandbookVo;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
|
||||
@Component
|
||||
public class HandbookUpdateListener implements ExecutionListener {
|
||||
/**
|
||||
* 注入字段(名称与流程设计时字段名称一致)
|
||||
*/
|
||||
|
||||
private final IProjectHandbookService ihandbookServiceProject =
|
||||
SpringUtils.getBean(IProjectHandbookService.class);
|
||||
private final HistoryService historyService =
|
||||
SpringUtils.getBean(HistoryService.class);
|
||||
|
||||
private final RuntimeService runtimeService =
|
||||
SpringUtils.getBean(RuntimeService.class);
|
||||
|
||||
@Override
|
||||
public void notify(DelegateExecution execution) {
|
||||
System.out.println("科研模块:执行申报指南更新任务监听器...");
|
||||
|
||||
String handbookProcId = execution.getProcessInstanceId();
|
||||
ProjectHandbookBo bo = new ProjectHandbookBo();
|
||||
bo.setHandbookProcId(handbookProcId);
|
||||
PageQuery pageQuery = new PageQuery();
|
||||
TableDataInfo<ProjectHandbookVo> result = ihandbookServiceProject.queryPageList(bo, pageQuery);
|
||||
Long handbookId = result.getRows().get(0).getHandbookId();
|
||||
|
||||
// zqjia:获取在task complete时注入的review状态
|
||||
String reviewStatus = (String) execution.getVariable("review");
|
||||
// 获取流程状态
|
||||
String status = (String) runtimeService.getVariable(handbookProcId, ProcessConstants.PROCESS_STATUS_KEY);
|
||||
|
||||
// zqjia: runtimeService获取是否terminated,判断注入review字段可以区分是complete还是cancel
|
||||
if("terminated".equals(status)) {
|
||||
ihandbookServiceProject.updateHandbookInfoById(handbookId, "2");
|
||||
}
|
||||
else {
|
||||
if("1".equals(reviewStatus)) {
|
||||
ihandbookServiceProject.updateHandbookInfoById(handbookId, "3");
|
||||
}
|
||||
else {
|
||||
ihandbookServiceProject.updateHandbookInfoById(handbookId, "0");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,76 @@
|
|||
package com.ruoyi.scientific.listener;
|
||||
import com.ruoyi.common.utils.spring.SpringUtils;
|
||||
import com.ruoyi.flowable.common.constant.ProcessConstants;
|
||||
import com.ruoyi.scientific.service.IProjectPlanService;
|
||||
import org.flowable.engine.RuntimeService;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.flowable.engine.delegate.ExecutionListener;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.flowable.engine.HistoryService;
|
||||
import com.ruoyi.scientific.domain.bo.ProjectPlanBo;
|
||||
import com.ruoyi.common.core.domain.PageQuery;
|
||||
import com.ruoyi.scientific.domain.vo.ProjectPlanVo;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
|
||||
//@Component
|
||||
//public class HandbookUpdateListener implements ExecutionListener {
|
||||
//
|
||||
// @Override
|
||||
// public void notify(DelegateExecution execution) {
|
||||
// System.out.println("当前活动名称: " + execution.getProcessInstanceBusinessStatus());
|
||||
//
|
||||
// if ("end".equals(execution.getEventName())) {
|
||||
// if (execution.isEnded()) {
|
||||
// System.out.println("任务被终止: " + execution.getId());
|
||||
// } else {
|
||||
// System.out.println("任务正常完成: " + execution.getId());
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
@Component
|
||||
public class PlanUpdateListener implements ExecutionListener {
|
||||
/**
|
||||
* 注入字段(名称与流程设计时字段名称一致)
|
||||
*/
|
||||
|
||||
private final IProjectPlanService iProjectHandbookService =
|
||||
SpringUtils.getBean(IProjectPlanService.class);
|
||||
private final HistoryService historyService =
|
||||
SpringUtils.getBean(HistoryService.class);
|
||||
|
||||
private final RuntimeService runtimeService =
|
||||
SpringUtils.getBean(RuntimeService.class);
|
||||
|
||||
@Override
|
||||
public void notify(DelegateExecution execution) {
|
||||
System.out.println("科研模块:执行申报计划更新任务监听器...");
|
||||
|
||||
String handbookProcId = execution.getProcessInstanceId();
|
||||
ProjectPlanBo bo = new ProjectPlanBo();
|
||||
bo.setPlanProcId(handbookProcId);
|
||||
PageQuery pageQuery = new PageQuery();
|
||||
TableDataInfo<ProjectPlanVo> result = iProjectHandbookService.queryPageList(bo, pageQuery);
|
||||
Long handbookId = result.getRows().get(0).getPlanId();
|
||||
|
||||
// zqjia:获取在task complete时注入的review状态
|
||||
String reviewStatus = (String) execution.getVariable("review");
|
||||
// 获取流程状态
|
||||
String status = (String) runtimeService.getVariable(handbookProcId, ProcessConstants.PROCESS_STATUS_KEY);
|
||||
|
||||
// zqjia: runtimeService获取是否terminated,判断注入review字段可以区分是complete还是cancel
|
||||
// 退回有bug,暂时不知道会不会到这来
|
||||
if("terminated".equals(status)) {
|
||||
iProjectHandbookService.updateHandbookInfoById(handbookId, "2");
|
||||
}
|
||||
else {
|
||||
if("1".equals(reviewStatus)) {
|
||||
iProjectHandbookService.updateHandbookInfoById(handbookId, "3");
|
||||
}
|
||||
else {
|
||||
iProjectHandbookService.updateHandbookInfoById(handbookId, "0");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
package com.ruoyi.scientific.listener;
|
||||
|
||||
import com.ruoyi.common.utils.spring.SpringUtils;
|
||||
import com.ruoyi.flowable.common.constant.ProcessConstants;
|
||||
import com.ruoyi.scientific.service.IProjectApplicationService;
|
||||
import org.flowable.engine.RuntimeService;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.flowable.engine.delegate.ExecutionListener;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class ProjectAppStatusUpdateListener implements ExecutionListener {
|
||||
|
||||
private final IProjectApplicationService projectApplicationService =
|
||||
SpringUtils.getBean(IProjectApplicationService.class);
|
||||
private final RuntimeService runtimeService =
|
||||
SpringUtils.getBean(RuntimeService.class);
|
||||
|
||||
@Override
|
||||
public void notify(DelegateExecution execution) {
|
||||
System.out.println("科研模块:执行项目立项状态更新任务监听器...");
|
||||
|
||||
String projectProcId = execution.getProcessInstanceId();
|
||||
|
||||
String projectIdStr = (String) execution.getVariable("projectId");
|
||||
Long projectId = Long.parseLong(projectIdStr);
|
||||
|
||||
String reviewStatus = (String) execution.getVariable("review");
|
||||
String status = (String) runtimeService.getVariable(projectProcId, ProcessConstants.PROCESS_STATUS_KEY);
|
||||
|
||||
if ("terminated".equals(status)) {
|
||||
projectApplicationService.updateAppstausInfoById(projectId, "2");
|
||||
} else {
|
||||
if ("1".equals(reviewStatus)) {
|
||||
projectApplicationService.updateAppstausInfoById(projectId, "3");
|
||||
} else {
|
||||
projectApplicationService.updateAppstausInfoById(projectId, "0");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
package com.ruoyi.scientific.listener;
|
||||
|
||||
import com.ruoyi.common.utils.spring.SpringUtils;
|
||||
import com.ruoyi.flowable.common.constant.ProcessConstants;
|
||||
import com.ruoyi.scientific.service.IProjectApplicationService;
|
||||
import org.flowable.engine.RuntimeService;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.flowable.engine.delegate.ExecutionListener;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class ProjectDeclareStatusListener implements ExecutionListener {
|
||||
|
||||
private final IProjectApplicationService projectApplicationService =
|
||||
SpringUtils.getBean(IProjectApplicationService.class);
|
||||
private final RuntimeService runtimeService =
|
||||
SpringUtils.getBean(RuntimeService.class);
|
||||
|
||||
@Override
|
||||
public void notify(DelegateExecution execution) {
|
||||
System.out.println("科研模块:执行项目申报状态更新任务监听器...");
|
||||
// 获得项目的流程ID
|
||||
String projectProcId = execution.getProcessInstanceId();
|
||||
// 获取项目的ID
|
||||
String projectIdStr = (String) execution.getVariable("projectId");
|
||||
Long projectId = Long.parseLong(projectIdStr);
|
||||
|
||||
String reviewStatus = (String) execution.getVariable("review");
|
||||
String status = (String) runtimeService.getVariable(projectProcId, ProcessConstants.PROCESS_STATUS_KEY);
|
||||
|
||||
// 判断流程是否结束
|
||||
if ("terminated".equals(status)) {
|
||||
// 审批人员选择拒绝 申报状态修改为2 审核失败
|
||||
projectApplicationService.updateDecStatusInfoById(projectId, "2");
|
||||
} else {
|
||||
if ("1".equals(reviewStatus)) {
|
||||
// 如果reviewStatus == 1 说明申报成功 3 审核通过
|
||||
projectApplicationService.updateDecStatusInfoById(projectId, "3");
|
||||
} else {
|
||||
// 其他状态设置为0 未审核
|
||||
projectApplicationService.updateDecStatusInfoById(projectId, "0");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
package com.ruoyi.scientific.mapper;
|
||||
|
||||
import com.ruoyi.scientific.domain.Department;
|
||||
import com.ruoyi.scientific.domain.vo.DepartmentVo;
|
||||
import com.ruoyi.common.core.mapper.BaseMapperPlus;
|
||||
|
||||
/**
|
||||
* departmentMapper接口
|
||||
*
|
||||
* @author zqjia
|
||||
* @date 2024-08-13
|
||||
*/
|
||||
public interface DepartmentMapper extends BaseMapperPlus<DepartmentMapper, Department, DepartmentVo> {
|
||||
|
||||
}
|
|
@ -1,14 +1,14 @@
|
|||
package com.ruoyi.project.mapper;
|
||||
package com.ruoyi.scientific.mapper;
|
||||
|
||||
import com.ruoyi.project.domain.ProjectApplication;
|
||||
import com.ruoyi.project.domain.vo.ProjectApplicationVo;
|
||||
import com.ruoyi.scientific.domain.ProjectApplication;
|
||||
import com.ruoyi.scientific.domain.vo.ProjectApplicationVo;
|
||||
import com.ruoyi.common.core.mapper.BaseMapperPlus;
|
||||
|
||||
/**
|
||||
* 项目申报Mapper接口
|
||||
*
|
||||
* @author ruoyi
|
||||
* @date 2024-06-14
|
||||
* @date 2024-07-18
|
||||
*/
|
||||
public interface ProjectApplicationMapper extends BaseMapperPlus<ProjectApplicationMapper, ProjectApplication, ProjectApplicationVo> {
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
package com.ruoyi.scientific.mapper;
|
||||
|
||||
import com.ruoyi.scientific.domain.ProjectHandbook;
|
||||
import com.ruoyi.scientific.domain.vo.ProjectHandbookVo;
|
||||
import com.ruoyi.common.core.mapper.BaseMapperPlus;
|
||||
|
||||
/**
|
||||
* 项目申报指南Mapper接口
|
||||
*
|
||||
* @author zqjia
|
||||
* @date 2024-07-29
|
||||
*/
|
||||
public interface ProjectHandbookMapper extends BaseMapperPlus<ProjectHandbookMapper, ProjectHandbook, ProjectHandbookVo> {
|
||||
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
package com.ruoyi.scientific.mapper;
|
||||
|
||||
import com.ruoyi.scientific.domain.ProjectPlan;
|
||||
import com.ruoyi.scientific.domain.vo.ProjectPlanVo;
|
||||
import com.ruoyi.common.core.mapper.BaseMapperPlus;
|
||||
|
||||
/**
|
||||
* 项目申报v2Mapper接口
|
||||
*
|
||||
* @author ruoyi
|
||||
* @date 2024-07-23
|
||||
*/
|
||||
public interface ProjectPlanMapper extends BaseMapperPlus<ProjectPlanMapper, ProjectPlan, ProjectPlanVo> {
|
||||
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
package com.ruoyi.scientific.service;
|
||||
|
||||
import com.ruoyi.scientific.domain.Department;
|
||||
import com.ruoyi.scientific.domain.vo.DepartmentVo;
|
||||
import com.ruoyi.scientific.domain.bo.DepartmentBo;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
import com.ruoyi.common.core.domain.PageQuery;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* departmentService接口
|
||||
*
|
||||
* @author zqjia
|
||||
* @date 2024-08-13
|
||||
*/
|
||||
public interface IDepartmentService {
|
||||
|
||||
/**
|
||||
* 查询department
|
||||
*/
|
||||
DepartmentVo queryById(Long departmentId);
|
||||
|
||||
/**
|
||||
* 查询department列表
|
||||
*/
|
||||
TableDataInfo<DepartmentVo> queryPageList(DepartmentBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询department列表
|
||||
*/
|
||||
List<DepartmentVo> queryList(DepartmentBo bo);
|
||||
|
||||
/**
|
||||
* 新增department
|
||||
*/
|
||||
Boolean insertByBo(DepartmentBo bo);
|
||||
|
||||
/**
|
||||
* 修改department
|
||||
*/
|
||||
Boolean updateByBo(DepartmentBo bo);
|
||||
|
||||
/**
|
||||
* 校验并批量删除department信息
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
|
||||
Boolean updateDepartmentInfoById(Long handbookId, String status);
|
||||
}
|
|
@ -0,0 +1,82 @@
|
|||
package com.ruoyi.scientific.service;
|
||||
|
||||
import com.ruoyi.scientific.domain.ProjectApplication;
|
||||
import com.ruoyi.scientific.domain.bo.FundsReceivedBo;
|
||||
import com.ruoyi.scientific.domain.vo.ProjectApplicationVo;
|
||||
import com.ruoyi.scientific.domain.bo.ProjectApplicationBo;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
import com.ruoyi.common.core.domain.PageQuery;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 项目申报Service接口
|
||||
*
|
||||
* @author zhanli
|
||||
* @date 2024-07-18
|
||||
*/
|
||||
public interface IProjectApplicationService {
|
||||
|
||||
/**
|
||||
* 查询项目申报
|
||||
*/
|
||||
ProjectApplicationVo queryById(Long projectId);
|
||||
|
||||
/**
|
||||
* 查询项目申报列表
|
||||
*/
|
||||
TableDataInfo<ProjectApplicationVo> queryPageList(ProjectApplicationBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询项目申报列表
|
||||
*/
|
||||
List<ProjectApplicationVo> queryList(ProjectApplicationBo bo);
|
||||
|
||||
/**
|
||||
* 新增项目申报
|
||||
*/
|
||||
Boolean insertByBo(ProjectApplicationBo bo);
|
||||
|
||||
/**
|
||||
* 修改项目申报
|
||||
*/
|
||||
Boolean updateByBo(ProjectApplicationBo bo);
|
||||
|
||||
/**
|
||||
* 修改项目预算审批流程
|
||||
*/
|
||||
Boolean updateBudgetProc(ProjectApplicationBo bo);
|
||||
|
||||
/**
|
||||
* 校验并批量删除项目申报信息
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
|
||||
/**
|
||||
* 更新项目Id更新预算信息
|
||||
*/
|
||||
Boolean updateBudgetInfoById(Long projectId, Long newProjectBudget);
|
||||
|
||||
/**
|
||||
* 项目经费到账确认:项目经费到账情况(由财务根据实际情况进行填写)
|
||||
* @param fundsReceivedBo 项目到账情况描述类,包含项目Id,项目到账情况,项目到账备注
|
||||
* @author zhanli
|
||||
* TODO: 2024/7/24 前版本暂时没有加权限的限制以及人员的限制,后续需要加入
|
||||
*/
|
||||
Boolean confirmFundsReceivedById(FundsReceivedBo fundsReceivedBo);
|
||||
/**
|
||||
* 查询已申报项目
|
||||
* cyf
|
||||
*/
|
||||
List<ProjectApplicationVo> queryDeclaredProjects();
|
||||
|
||||
Boolean updateAppstausInfoById(Long projectId, String newProjectAppStaus);
|
||||
|
||||
/**
|
||||
* 通过项目的ID,更新项目申报状态
|
||||
* @author zhanli
|
||||
*/
|
||||
public Boolean updateDecStatusInfoById(Long projectId, String newProjectDecStatus);
|
||||
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
package com.ruoyi.scientific.service;
|
||||
|
||||
import com.ruoyi.scientific.domain.bo.ProjectHandbookBo;
|
||||
import com.ruoyi.scientific.domain.vo.ProjectHandbookVo;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
import com.ruoyi.common.core.domain.PageQuery;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 项目申报指南Service接口
|
||||
*
|
||||
* @author zqjia
|
||||
* @date 2024-07-29
|
||||
*/
|
||||
public interface IProjectHandbookService {
|
||||
|
||||
/**
|
||||
* 查询项目申报指南
|
||||
*/
|
||||
ProjectHandbookVo queryById(Long handbookId);
|
||||
|
||||
/**
|
||||
* 查询项目申报指南列表
|
||||
*/
|
||||
TableDataInfo<ProjectHandbookVo> queryPageList(ProjectHandbookBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询项目申报指南列表
|
||||
*/
|
||||
List<ProjectHandbookVo> queryList(ProjectHandbookBo bo);
|
||||
|
||||
/**
|
||||
* 新增项目申报指南
|
||||
*/
|
||||
Boolean insertByBo(ProjectHandbookBo bo);
|
||||
|
||||
/**
|
||||
* 修改项目申报指南
|
||||
*/
|
||||
Boolean updateByBo(ProjectHandbookBo bo);
|
||||
|
||||
/**
|
||||
* 校验并批量删除项目申报指南信息
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
|
||||
/**
|
||||
* 更新指南的审核状态
|
||||
*/
|
||||
Boolean updateHandbookInfoById(Long handbookId, String status);
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
package com.ruoyi.scientific.service;
|
||||
|
||||
import com.ruoyi.scientific.domain.bo.ProjectPlanBo;
|
||||
import com.ruoyi.scientific.domain.vo.ProjectPlanVo;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
import com.ruoyi.common.core.domain.PageQuery;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 项目申报v2Service接口
|
||||
*
|
||||
* @author ruoyi
|
||||
* @date 2024-07-23
|
||||
*/
|
||||
public interface IProjectPlanService {
|
||||
|
||||
/**
|
||||
* 查询项目申报v2
|
||||
*/
|
||||
ProjectPlanVo queryById(Long handbookId);
|
||||
|
||||
/**
|
||||
* 查询项目申报v2列表
|
||||
*/
|
||||
TableDataInfo<ProjectPlanVo> queryPageList(ProjectPlanBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询项目申报v2列表
|
||||
*/
|
||||
List<ProjectPlanVo> queryList(ProjectPlanBo bo);
|
||||
|
||||
/**
|
||||
* 新增项目申报v2
|
||||
*/
|
||||
Boolean insertByBo(ProjectPlanBo bo);
|
||||
|
||||
/**
|
||||
* 修改项目申报v2
|
||||
*/
|
||||
Boolean updateByBo(ProjectPlanBo bo);
|
||||
|
||||
/**
|
||||
* 校验并批量删除项目申报v2信息
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
|
||||
/**
|
||||
* 更新指南的审核状态
|
||||
*/
|
||||
Boolean updateHandbookInfoById(Long handbookId, String status);
|
||||
}
|
|
@ -0,0 +1,134 @@
|
|||
package com.ruoyi.scientific.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
import com.ruoyi.common.core.domain.PageQuery;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.ruoyi.scientific.domain.ProjectHandbook;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.ruoyi.scientific.domain.bo.DepartmentBo;
|
||||
import com.ruoyi.scientific.domain.vo.DepartmentVo;
|
||||
import com.ruoyi.scientific.domain.Department;
|
||||
import com.ruoyi.scientific.mapper.DepartmentMapper;
|
||||
import com.ruoyi.scientific.service.IDepartmentService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* departmentService业务层处理
|
||||
*
|
||||
* @author zqjia
|
||||
* @date 2024-08-13
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class DepartmentServiceImpl implements IDepartmentService {
|
||||
|
||||
private final DepartmentMapper baseMapper;
|
||||
|
||||
/**
|
||||
* 查询department
|
||||
*/
|
||||
@Override
|
||||
public DepartmentVo queryById(Long departmentId){
|
||||
return baseMapper.selectVoById(departmentId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询department列表
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<DepartmentVo> queryPageList(DepartmentBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<Department> lqw = buildQueryWrapper(bo);
|
||||
Page<DepartmentVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询department列表
|
||||
*/
|
||||
@Override
|
||||
public List<DepartmentVo> queryList(DepartmentBo bo) {
|
||||
LambdaQueryWrapper<Department> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<Department> buildQueryWrapper(DepartmentBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<Department> lqw = Wrappers.lambdaQuery();
|
||||
lqw.eq(bo.getDepartmentId() != null, Department::getDepartmentId, bo.getDepartmentId());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getDepartmentName()), Department::getDepartmentName, bo.getDepartmentName());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getDepartmentAddress()), Department::getDepartmentAddress, bo.getDepartmentAddress());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getDepartmentCategory()), Department::getDepartmentCategory, bo.getDepartmentCategory());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getDepartmentPerson()), Department::getDepartmentPerson, bo.getDepartmentPerson());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getDepartmentPhone()), Department::getDepartmentPhone, bo.getDepartmentPhone());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getDepartmentEmail()), Department::getDepartmentEmail, bo.getDepartmentEmail());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getDepartmentFile()), Department::getDepartmentFile, bo.getDepartmentFile());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getDepartmentNote()), Department::getDepartmentNote, bo.getDepartmentNote());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getDepartmentProcId()), Department::getDepartmentProcId, bo.getDepartmentProcId());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getDepartmentStatus()), Department::getDepartmentStatus, bo.getDepartmentStatus());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增department
|
||||
*/
|
||||
@Override
|
||||
public Boolean insertByBo(DepartmentBo bo) {
|
||||
Department add = BeanUtil.toBean(bo, Department.class);
|
||||
validEntityBeforeSave(add);
|
||||
boolean flag = baseMapper.insert(add) > 0;
|
||||
if (flag) {
|
||||
bo.setDepartmentId(add.getDepartmentId());
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改department
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateByBo(DepartmentBo bo) {
|
||||
Department update = BeanUtil.toBean(bo, Department.class);
|
||||
validEntityBeforeSave(update);
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(Department entity){
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除department
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteBatchIds(ids) > 0;
|
||||
}
|
||||
|
||||
public Boolean updateDepartmentInfoById(Long departmentId, String status){
|
||||
// 获取项目的详细信息
|
||||
Department update = baseMapper.selectById(departmentId);
|
||||
if (update == null) {
|
||||
return false;
|
||||
}
|
||||
// 更新状态信息
|
||||
update.setDepartmentStatus(status);
|
||||
// 保存信息
|
||||
validEntityBeforeSave(update);
|
||||
// 返回结果取决于是否更新成功
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,234 @@
|
|||
package com.ruoyi.scientific.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
import com.ruoyi.common.core.domain.PageQuery;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.ruoyi.scientific.domain.bo.FundsReceivedBo;
|
||||
import com.ruoyi.scientific.domain.bo.ProjectBaseBo;
|
||||
import com.ruoyi.scientific.domain.bo.UpdateBudgetBo;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.ruoyi.scientific.domain.bo.ProjectApplicationBo;
|
||||
import com.ruoyi.scientific.domain.vo.ProjectApplicationVo;
|
||||
import com.ruoyi.scientific.domain.ProjectApplication;
|
||||
import com.ruoyi.scientific.mapper.ProjectApplicationMapper;
|
||||
import com.ruoyi.scientific.service.IProjectApplicationService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* 项目申报Service业务层处理
|
||||
*
|
||||
* @author ruoyi
|
||||
* @date 2024-07-18
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class ProjectApplicationServiceImpl implements IProjectApplicationService {
|
||||
|
||||
private final ProjectApplicationMapper baseMapper;
|
||||
|
||||
/**
|
||||
* 查询项目申报
|
||||
*/
|
||||
@Override
|
||||
public ProjectApplicationVo queryById(Long projectId){
|
||||
return baseMapper.selectVoById(projectId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询项目申报列表
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<ProjectApplicationVo> queryPageList(ProjectApplicationBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<ProjectApplication> lqw = buildQueryWrapper(bo);
|
||||
Page<ProjectApplicationVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询项目申报列表
|
||||
*/
|
||||
@Override
|
||||
public List<ProjectApplicationVo> queryList(ProjectApplicationBo bo) {
|
||||
LambdaQueryWrapper<ProjectApplication> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<ProjectApplication> buildQueryWrapper(ProjectApplicationBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<ProjectApplication> lqw = Wrappers.lambdaQuery();
|
||||
lqw.like(StringUtils.isNotBlank(bo.getProjectName()), ProjectApplication::getProjectName, bo.getProjectName());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getProjectStatus()), ProjectApplication::getProjectStatus, bo.getProjectStatus());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getProjectAppProcId()), ProjectApplication::getProjectAppProcId, bo.getProjectAppProcId());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getProjectAppStaus()), ProjectApplication::getProjectAppStaus, bo.getProjectAppStaus());
|
||||
lqw.eq(bo.getProjectAppStTime() != null, ProjectApplication::getProjectAppStTime, bo.getProjectAppStTime());
|
||||
lqw.eq(bo.getProjectAppEndTime() != null, ProjectApplication::getProjectAppEndTime, bo.getProjectAppEndTime());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getProjectLeader()), ProjectApplication::getProjectLeader, bo.getProjectLeader());
|
||||
lqw.eq(bo.getProjectBudget() != null, ProjectApplication::getProjectBudget, bo.getProjectBudget());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getProjectLeaderPhone()), ProjectApplication::getProjectLeaderPhone, bo.getProjectLeaderPhone());
|
||||
|
||||
|
||||
// zqjia:自定义条件查询
|
||||
lqw.eq(bo.getProjectPlanId() != null, ProjectApplication::getProjectPlanId, bo.getProjectPlanId());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增项目申报
|
||||
*/
|
||||
@Override
|
||||
public Boolean insertByBo(ProjectApplicationBo bo) {
|
||||
// 新增的时候默认设置为未立项状态
|
||||
bo.setProjectAppStaus(ProjectBaseBo.PROJECT_NO_INIT);
|
||||
// 新增项目默认设置为未申报状态
|
||||
bo.setProjectDeclareStatus(ProjectBaseBo.PROJECT_NO_DECLARE);
|
||||
// 新增的项目默认资金处于未到账状态
|
||||
bo.setProjectFundsReceived(ProjectBaseBo.PROJECT_FUNDS_NO_RECEIVED);
|
||||
// 设项目资金到账默认备注
|
||||
bo.setProjectFundsRemark(ProjectBaseBo.PROJECT_FUNDS_NO_RECEIVED_REMARK);
|
||||
// 数据转换
|
||||
ProjectApplication add = BeanUtil.toBean(bo, ProjectApplication.class);
|
||||
// 保存实体信息
|
||||
validEntityBeforeSave(add);
|
||||
boolean flag = baseMapper.insert(add) > 0;
|
||||
// 如果数据库成功插入,那么就可以获得项目的Id
|
||||
if (flag) {
|
||||
bo.setProjectId(add.getProjectId());
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改项目申报
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateByBo(ProjectApplicationBo bo) {
|
||||
ProjectApplication update = BeanUtil.toBean(bo, ProjectApplication.class);
|
||||
validEntityBeforeSave(update);
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 项目预算追加流程
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateBudgetProc(ProjectApplicationBo bo) {
|
||||
// ProjectApplication update = BeanUtil.toBean(bo, ProjectApplication.class);
|
||||
// validEntityBeforeSave(update);
|
||||
// 将项目的表单转换为Map
|
||||
UpdateBudgetBo budgetBo = new UpdateBudgetBo();
|
||||
budgetBo.setProjectId(bo.getProjectId());
|
||||
//budgetBo.se
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(ProjectApplication entity){
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除项目申报
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteBatchIds(ids) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据给定的Id更新预算信息,这个功能用于支持项目预算变更。当用户发起预算变更流程,当流程
|
||||
* 完成后,通过监听流程审批是否完成,确定是否更新预算信息
|
||||
* @author : zhanli
|
||||
*/
|
||||
public Boolean updateBudgetInfoById(Long projectId, Long newProjectBudget){
|
||||
// 获取项目的详细信息
|
||||
ProjectApplication projectApplication = baseMapper.selectById(projectId);
|
||||
if (projectApplication == null) {
|
||||
return false;
|
||||
}
|
||||
// 更新预算信息
|
||||
projectApplication.setProjectBudget(newProjectBudget);
|
||||
// 保存信息
|
||||
validEntityBeforeSave(projectApplication);
|
||||
// 返回结果取决于是否更新成功
|
||||
return baseMapper.updateById(projectApplication) > 0;
|
||||
}
|
||||
/**
|
||||
* 项目经费到账确认:项目经费到账情况(由财务根据实际情况进行填写)
|
||||
* @param fundsReceivedBo 项目到账情况描述类,包含项目Id,项目到账情况,项目到账备注
|
||||
* @author zhanli
|
||||
* TODO: 2024/7/24 前版本暂时没有加权限的限制以及人员的限制,后续需要加入
|
||||
*/
|
||||
public Boolean confirmFundsReceivedById(FundsReceivedBo fundsReceivedBo){
|
||||
// 获取项目的详细信息
|
||||
ProjectApplication projectApplication = baseMapper.selectById(fundsReceivedBo.getProjectId());
|
||||
if (projectApplication == null) {
|
||||
return false;
|
||||
}
|
||||
// 设置项目的状态到账状态
|
||||
projectApplication.setProjectFundsReceived(fundsReceivedBo.getProjectFundsReceived());
|
||||
projectApplication.setProjectFundsRemark(fundsReceivedBo.getProjectFundsRemark());
|
||||
// 保存信息
|
||||
validEntityBeforeSave(projectApplication);
|
||||
// 返回结果取决于是否更新成功
|
||||
return baseMapper.updateById(projectApplication) > 0;
|
||||
}
|
||||
/**
|
||||
* 查询已经申报的项目
|
||||
* cyf
|
||||
*/
|
||||
@Override
|
||||
public List<ProjectApplicationVo> queryDeclaredProjects() {
|
||||
LambdaQueryWrapper<ProjectApplication> lqw = Wrappers.lambdaQuery();
|
||||
lqw.eq(ProjectApplication::getProjectDeclareStatus, "3");
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
/**
|
||||
* 更新项目审核状态
|
||||
* cyf
|
||||
*/
|
||||
public Boolean updateAppstausInfoById(Long projectId, String newProjectAppStaus){
|
||||
// 获取项目的详细信息
|
||||
ProjectApplication projectApplication = baseMapper.selectById(projectId);
|
||||
if (projectApplication == null) {
|
||||
return false;
|
||||
}
|
||||
// 更新立项状态信息
|
||||
projectApplication.setProjectAppStaus(newProjectAppStaus);
|
||||
// 保存信息
|
||||
validEntityBeforeSave(projectApplication);
|
||||
// 返回结果取决于是否更新成功
|
||||
return baseMapper.updateById(projectApplication) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过项目的ID更改,更新项目申报状态
|
||||
* @author zhanli
|
||||
*/
|
||||
public Boolean updateDecStatusInfoById(Long projectId, String newProjectDecStatus){
|
||||
// 获取项目的详细信息
|
||||
ProjectApplication projectApplication = baseMapper.selectById(projectId);
|
||||
if (projectApplication == null) {
|
||||
return false;
|
||||
}
|
||||
// 更新项目的申报信息
|
||||
projectApplication.setProjectDeclareStatus(newProjectDecStatus);
|
||||
// 保存信息
|
||||
validEntityBeforeSave(projectApplication);
|
||||
// 返回结果取决于是否更新成功
|
||||
return baseMapper.updateById(projectApplication) > 0;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,131 @@
|
|||
package com.ruoyi.scientific.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
import com.ruoyi.common.core.domain.PageQuery;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.ruoyi.scientific.domain.bo.ProjectHandbookBo;
|
||||
import com.ruoyi.scientific.mapper.ProjectHandbookMapper;
|
||||
import com.ruoyi.scientific.service.IProjectHandbookService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.ruoyi.scientific.domain.vo.ProjectHandbookVo;
|
||||
import com.ruoyi.scientific.domain.ProjectHandbook;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* 项目申报指南Service业务层处理
|
||||
*
|
||||
* @author zqjia
|
||||
* @date 2024-07-29
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class ProjectHandbookServiceImpl implements IProjectHandbookService {
|
||||
|
||||
private final ProjectHandbookMapper baseMapper;
|
||||
|
||||
/**
|
||||
* 查询项目申报指南
|
||||
*/
|
||||
@Override
|
||||
public ProjectHandbookVo queryById(Long handbookId){
|
||||
return baseMapper.selectVoById(handbookId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询项目申报指南列表
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<ProjectHandbookVo> queryPageList(ProjectHandbookBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<ProjectHandbook> lqw = buildQueryWrapper(bo);
|
||||
Page<ProjectHandbookVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询项目申报指南列表
|
||||
*/
|
||||
@Override
|
||||
public List<ProjectHandbookVo> queryList(ProjectHandbookBo bo) {
|
||||
LambdaQueryWrapper<ProjectHandbook> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<ProjectHandbook> buildQueryWrapper(ProjectHandbookBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<ProjectHandbook> lqw = Wrappers.lambdaQuery();
|
||||
lqw.eq(bo.getHandbookId() != null, ProjectHandbook::getHandbookId, bo.getHandbookId());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getHandbookName()), ProjectHandbook::getHandbookName, bo.getHandbookName());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getHandbookCategory()), ProjectHandbook::getHandbookCategory, bo.getHandbookCategory());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getHandbookLevel()), ProjectHandbook::getHandbookLevel, bo.getHandbookLevel());
|
||||
lqw.eq(bo.getHandbookDate() != null, ProjectHandbook::getHandbookDate, bo.getHandbookDate());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getHandbookNote()), ProjectHandbook::getHandbookNote, bo.getHandbookNote());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getHandbookFile()), ProjectHandbook::getHandbookFile, bo.getHandbookFile());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getHandbookProcId()), ProjectHandbook::getHandbookProcId, bo.getHandbookProcId());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getHandbookStatus()), ProjectHandbook::getHandbookStatus, bo.getHandbookStatus());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增项目申报指南
|
||||
*/
|
||||
@Override
|
||||
public Boolean insertByBo(ProjectHandbookBo bo) {
|
||||
ProjectHandbook add = BeanUtil.toBean(bo, ProjectHandbook.class);
|
||||
validEntityBeforeSave(add);
|
||||
boolean flag = baseMapper.insert(add) > 0;
|
||||
if (flag) {
|
||||
bo.setHandbookId(add.getHandbookId());
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改项目申报指南
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateByBo(ProjectHandbookBo bo) {
|
||||
ProjectHandbook update = BeanUtil.toBean(bo, ProjectHandbook.class);
|
||||
validEntityBeforeSave(update);
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(ProjectHandbook entity){
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除项目申报指南
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteBatchIds(ids) > 0;
|
||||
}
|
||||
|
||||
public Boolean updateHandbookInfoById(Long handbookId, String status){
|
||||
// 获取项目的详细信息
|
||||
ProjectHandbook update = baseMapper.selectById(handbookId);
|
||||
if (update == null) {
|
||||
return false;
|
||||
}
|
||||
// 更新状态信息
|
||||
update.setHandbookStatus(status);
|
||||
// 保存信息
|
||||
validEntityBeforeSave(update);
|
||||
// 返回结果取决于是否更新成功
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,131 @@
|
|||
package com.ruoyi.scientific.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
import com.ruoyi.common.core.domain.PageQuery;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.ruoyi.scientific.domain.bo.ProjectPlanBo;
|
||||
import com.ruoyi.scientific.mapper.ProjectPlanMapper;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.ruoyi.scientific.domain.vo.ProjectPlanVo;
|
||||
import com.ruoyi.scientific.domain.ProjectPlan;
|
||||
import com.ruoyi.scientific.service.IProjectPlanService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* 项目申报v2Service业务层处理
|
||||
*
|
||||
* @author ruoyi
|
||||
* @date 2024-07-23
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class ProjectPlanServiceImpl implements IProjectPlanService {
|
||||
|
||||
private final ProjectPlanMapper baseMapper;
|
||||
|
||||
/**
|
||||
* 查询项目申报v2
|
||||
*/
|
||||
@Override
|
||||
public ProjectPlanVo queryById(Long handbookId){
|
||||
return baseMapper.selectVoById(handbookId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询项目申报v2列表
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<ProjectPlanVo> queryPageList(ProjectPlanBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<ProjectPlan> lqw = buildQueryWrapper(bo);
|
||||
Page<ProjectPlanVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询项目申报v2列表
|
||||
*/
|
||||
@Override
|
||||
public List<ProjectPlanVo> queryList(ProjectPlanBo bo) {
|
||||
LambdaQueryWrapper<ProjectPlan> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<ProjectPlan> buildQueryWrapper(ProjectPlanBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<ProjectPlan> lqw = Wrappers.lambdaQuery();
|
||||
lqw.like(StringUtils.isNotBlank(bo.getPlanName()), ProjectPlan::getPlanName, bo.getPlanName());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getPlanProcId()), ProjectPlan::getPlanProcId, bo.getPlanProcId());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getPlanStatus()), ProjectPlan::getPlanStatus, bo.getPlanStatus());
|
||||
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getPlanLevel()), ProjectPlan::getPlanLevel, bo.getPlanLevel());
|
||||
|
||||
lqw.eq(bo.getProjectAppStTime() != null, ProjectPlan::getProjectAppStTime, bo.getProjectAppStTime());
|
||||
lqw.eq(bo.getProjectAppEndTime() != null, ProjectPlan::getProjectAppEndTime, bo.getProjectAppEndTime());
|
||||
|
||||
return lqw;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增项目申报v2
|
||||
*/
|
||||
@Override
|
||||
public Boolean insertByBo(ProjectPlanBo bo) {
|
||||
ProjectPlan add = BeanUtil.toBean(bo, ProjectPlan.class);
|
||||
validEntityBeforeSave(add);
|
||||
boolean flag = baseMapper.insert(add) > 0;
|
||||
if (flag) {
|
||||
bo.setPlanId(add.getPlanId());
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改项目申报v2
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateByBo(ProjectPlanBo bo) {
|
||||
ProjectPlan update = BeanUtil.toBean(bo, ProjectPlan.class);
|
||||
validEntityBeforeSave(update);
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(ProjectPlan entity){
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除项目申报v2
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteBatchIds(ids) > 0;
|
||||
}
|
||||
|
||||
public Boolean updateHandbookInfoById(Long handbookId, String status){
|
||||
// 获取项目的详细信息
|
||||
ProjectPlan update = baseMapper.selectById(handbookId);
|
||||
if (update == null) {
|
||||
return false;
|
||||
}
|
||||
// 更新状态信息
|
||||
update.setPlanStatus(status);
|
||||
// 保存信息
|
||||
validEntityBeforeSave(update);
|
||||
// 返回结果取决于是否更新成功
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
}
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,3 @@
|
|||
java包使用 `.` 分割 resource 目录使用 `/` 分割
|
||||
<br>
|
||||
此文件目的 防止文件夹粘连找不到 `xml` 文件
|
|
@ -0,0 +1,24 @@
|
|||
<?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="com.ruoyi.scientific.mapper.DepartmentMapper">
|
||||
|
||||
<resultMap type="com.ruoyi.scientific.domain.Department" id="DepartmentResult">
|
||||
<result property="departmentId" column="department_id"/>
|
||||
<result property="departmentName" column="department_name"/>
|
||||
<result property="departmentAddress" column="department_address"/>
|
||||
<result property="departmentCategory" column="department_category"/>
|
||||
<result property="departmentPerson" column="department_person"/>
|
||||
<result property="departmentPhone" column="department_phone"/>
|
||||
<result property="departmentEmail" column="department_email"/>
|
||||
<result property="departmentFile" column="department_file"/>
|
||||
<result property="departmentNote" column="department_note"/>
|
||||
<result property="createBy" column="create_by"/>
|
||||
<result property="createTime" column="create_time"/>
|
||||
<result property="updateBy" column="update_by"/>
|
||||
<result property="updateTime" column="update_time"/>
|
||||
</resultMap>
|
||||
|
||||
|
||||
</mapper>
|
|
@ -0,0 +1,30 @@
|
|||
<?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="com.ruoyi.scientific.mapper.ProjectApplicationMapper">
|
||||
|
||||
<resultMap type="com.ruoyi.scientific.domain.ProjectApplication" id="ProjectApplicationResult">
|
||||
<result property="projectId" column="project_id"/>
|
||||
<result property="projectName" column="project_name"/>
|
||||
<result property="projectStatus" column="project_status"/>
|
||||
<result property="projectAppProcId" column="project_app_proc_id"/>
|
||||
<result property="projectDeclareStatus" column="project_declare_status"/>
|
||||
<result property="projectAppStaus" column="project_app_staus"/>
|
||||
<result property="projectAppStTime" column="project_app_st_time"/>
|
||||
<result property="projectAppEndTime" column="project_app_end_time"/>
|
||||
<result property="projectPlanId" column="project_plan_id"/>
|
||||
<result property="projectPlanName" column="project_plan_name"/>
|
||||
<result property="projectCategory" column="project_category"/>
|
||||
<result property="projectLeader" column="project_leader"/>
|
||||
<result property="projectBudget" column="project_budget"/>
|
||||
<result property="projectLeaderPhone" column="project_leader_phone"/>
|
||||
<result property="projectFundsReceived" column="project_funds_received"/>
|
||||
<result property="projectFundsRemark" column="project_funds_remark"/>
|
||||
<result property="createBy" column="create_by"/>
|
||||
<result property="createTime" column="create_time"/>
|
||||
<result property="updateBy" column="update_by"/>
|
||||
<result property="updateTime" column="update_time"/>
|
||||
</resultMap>
|
||||
|
||||
</mapper>
|
|
@ -0,0 +1,25 @@
|
|||
<?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="com.ruoyi.scientific.mapper.ProjectHandbookMapper">
|
||||
|
||||
<resultMap type="com.ruoyi.scientific.domain.ProjectHandbook" id="HandbookResult">
|
||||
<result property="handbookId" column="handbook_id"/>
|
||||
<result property="handbookName" column="handbook_name"/>
|
||||
<result property="handbookCategory" column="handbook_category"/>
|
||||
<result property="handbookLevel" column="handbook_level"/>
|
||||
<result property="handbookDate" column="handbook_date"/>
|
||||
<result property="handbookNote" column="handbook_note"/>
|
||||
<result property="handbookFile" column="handbook_file"/>
|
||||
<result property="handbookProcId" column="handbook_proc_id"/>
|
||||
<result property="handbookStatus" column="handbook_status"/>
|
||||
<result property="directorName" column="director_name"/>
|
||||
<result property="createBy" column="create_by"/>
|
||||
<result property="createTime" column="create_time"/>
|
||||
<result property="updateBy" column="update_by"/>
|
||||
<result property="updateTime" column="update_time"/>
|
||||
</resultMap>
|
||||
|
||||
|
||||
</mapper>
|
|
@ -0,0 +1,26 @@
|
|||
<?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="com.ruoyi.scientific.mapper.ProjectPlanMapper">
|
||||
|
||||
<resultMap type="com.ruoyi.scientific.domain.ProjectPlan" id="ProjectHandbookResult">
|
||||
<result property="handbookId" column="handbook_id"/>
|
||||
<result property="handbookName" column="handbook_name"/>
|
||||
<result property="handbookProcId" column="handbook_proc_id"/>
|
||||
<result property="handbookStatus" column="handbook_status"/>
|
||||
<result property="handbookType" column="handbook_type"/>
|
||||
<result property="handbookLevel" column="handbook_level"/>
|
||||
<result property="declareStatus" column="declare_status"/>
|
||||
<result property="projectAppStTime" column="project_app_st_time"/>
|
||||
<result property="projectAppEndTime" column="project_app_end_time"/>
|
||||
<result property="handbookLeader" column="handbook_leader"/>
|
||||
<result property="projectLeaderPhone" column="project_leader_phone"/>
|
||||
<result property="createBy" column="create_by"/>
|
||||
<result property="createTime" column="create_time"/>
|
||||
<result property="updateBy" column="update_by"/>
|
||||
<result property="updateTime" column="update_time"/>
|
||||
</resultMap>
|
||||
|
||||
|
||||
</mapper>
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue