This commit is contained in:
那些花儿
2025-09-25 13:42:37 +08:00
parent 37e23100e1
commit 271b5837c8
78 changed files with 2197 additions and 1164 deletions
@@ -50,6 +50,7 @@ RoleConstant {
TEACHER_CONGRESS_DELEGATE_SPECIALLY_INVITE("教代会特邀代表"), TEACHER_CONGRESS_DELEGATE_SPECIALLY_INVITE("教代会特邀代表"),
TEACHER_CONGRESS_DELEGATION_HEAD("教代会代表团团长"), TEACHER_CONGRESS_DELEGATION_HEAD("教代会代表团团长"),
TEACHER_CONGRESS_VICE_DELEGATION_HEAD("教代会代表团副团长"), TEACHER_CONGRESS_VICE_DELEGATION_HEAD("教代会代表团副团长"),
TEACHER_CONGRESS_DELEGATION_CONTACT("教代会代表团联络人"),
PROPOSAL_COMMITTEE_DIRECTOR("提案委员会主任"), PROPOSAL_COMMITTEE_DIRECTOR("提案委员会主任"),
PROPOSAL_COMMITTEE_DEPUTY_DIRECTOR("提案委员会副主任"), PROPOSAL_COMMITTEE_DEPUTY_DIRECTOR("提案委员会副主任"),
@@ -236,46 +236,6 @@ public class FlowCommonController {
@Aop(TransAop.READ_COMMITTED) @Aop(TransAop.READ_COMMITTED)
public Result executeTask(@Param("data") String param) { public Result executeTask(@Param("data") String param) {
Dict args = Json.fromJson(Dict.class, param); Dict args = Json.fromJson(Dict.class, param);
// Long processTaskId = args.getLong(FlowConst.PROCESS_TASK_ID_KEY);
// String operator = SecurityUtil.getUserId();
// args.remove(FlowConst.PROCESS_TASK_ID_KEY);
// Integer submitType = args.getInt(FlowConst.SUBMIT_TYPE);
// if (submitType == null) {
// submitType = ProcessSubmitTypeEnum.AGREE.getCode();
// }
// args.put(FlowConst.SUBMIT_TYPE, submitType);
//
// // 设置办理人信息到表单参数
// args.put(FlowConst.TASK_FORM_DATA_PREFIX + "userName", SecurityUtil.getUserUsername());
// args.put(FlowConst.TASK_FORM_DATA_PREFIX + "loginName", SecurityUtil.getUserLoginname());
// args.put(FlowConst.TASK_FORM_DATA_PREFIX + "unitId", SecurityUtil.getUnitId());
// args.put(FlowConst.TASK_FORM_DATA_PREFIX + "unitName", SecurityUtil.getUnitId());
// args.put(FlowConst.TASK_FORM_DATA_PREFIX + "unionId", SecurityUtil.getUnionId());
//
// if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.ROLLBACK.getCode())) {
// // 退回上一个节点
// flowEngine.executeAndJumpTask(processTaskId, operator, args, null);
// } else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.REJECT.getCode())) {
// // 拒绝,跳转到结束节点
// flowEngine.executeAndJumpToEnd(processTaskId, operator, args);
// } else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.JUMP.getCode())) {
// // 跳转到指定节点
// String taskName = args.getStr(FlowConst.TASK_NAME);
// flowEngine.executeAndJumpTask(processTaskId, operator, args, taskName);
// } else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.ROLLBACK_TO_OPERATOR.getCode())) {
// // 退回发起人
// flowEngine.executeAndJumpToFirstTaskNode(processTaskId, operator, args);
// } else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.COUNTERSIGN_DISAGREE.getCode())) {
// // 会签不同意,追加不同意标识
// args.put(FlowConst.COUNTERSIGN_DISAGREE_FLAG, 1);
// flowEngine.executeProcessTask(processTaskId, operator, args);
// } else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.RE_APPLY.getCode())) {
// // 重新提交
// flowEngine.executeProcessTask(processTaskId, operator, args);
// } else {
// // 默认执行
// flowEngine.executeProcessTask(processTaskId, operator, args);
// }
flowCommonService.executeTask(args); flowCommonService.executeTask(args);
return Result.success(); return Result.success();
} }
@@ -330,7 +290,7 @@ public class FlowCommonController {
@At("/surrogate") @At("/surrogate")
@SaCheckLogin @SaCheckLogin
@ApiOperation("代理") @ApiOperation("委托")
public Result surrogate(@Param("taskId") Long taskId, @Param("actorIds") String[] actorIds) { public Result surrogate(@Param("taskId") Long taskId, @Param("actorIds") String[] actorIds) {
flowEngine.processTaskService().addTaskActor(taskId, Arrays.asList(actorIds)); flowEngine.processTaskService().addTaskActor(taskId, Arrays.asList(actorIds));
return Result.success(); return Result.success();
@@ -338,11 +298,9 @@ public class FlowCommonController {
@At("/addCandidate") @At("/addCandidate")
@SaCheckLogin @SaCheckLogin
@ApiOperation("代理") @ApiOperation("加签")
public Result addCandidate(@Param("taskId") Long taskId, @Param("actorIds") String[] actorIds) { public Result addCandidate(@Param("taskId") Long taskId, @Param("actorIds") String[] actorIds) {
flowEngine.processTaskService().addCandidateActor(taskId, Arrays.asList(actorIds)); flowEngine.processTaskService().addCandidateActor(taskId, Arrays.asList(actorIds));
return Result.success(); return Result.success();
} }
} }
@@ -9,8 +9,6 @@ import com.budwk.app.flow.engine.parser.impl.*;
/** /**
* *
* 流程引擎配置类 * 流程引擎配置类
* @author mldong
* @date 2022/6/12
*/ */
public class Configuration { public class Configuration {
public Configuration() { public Configuration() {
@@ -16,8 +16,6 @@ import java.util.stream.Collectors;
/** /**
* *
* 执行对象参数 * 执行对象参数
* @author mldong
* @date 2023/4/25
*/ */
@Data @Data
public class Execution { public class Execution {
@@ -27,9 +27,6 @@ import java.util.List;
/** /**
* 工作流引擎实现 * 工作流引擎实现
*
* @author mldong
* @date 2023/5/29
*/ */
public class FlowEngineImpl implements FlowEngine { public class FlowEngineImpl implements FlowEngine {
protected Configuration configuration; protected Configuration configuration;
@@ -8,8 +8,6 @@ import java.util.List;
/** /**
* *
* 单例服务上下文 * 单例服务上下文
* @author mldong
* @date 2022/6/12
*/ */
public class ServiceContext { public class ServiceContext {
private static Context context; private static Context context;
@@ -6,8 +6,6 @@ import lombok.Data;
/** /**
* 流程开始事件 * 流程开始事件
* @author mldong
* @date 2023/12/5
*/ */
@Data @Data
@Builder @Builder
@@ -2,8 +2,6 @@ package com.budwk.app.flow.engine.event;
/** /**
* 流程事件监听接口 * 流程事件监听接口
* @author mldong
* @date 2023/12/5
*/ */
public interface ProcessEventListener { public interface ProcessEventListener {
void onEvent(ProcessEvent event); void onEvent(ProcessEvent event);
@@ -6,8 +6,6 @@ import java.util.List;
/** /**
* 流程事件发布者类 * 流程事件发布者类
* @author mldong
* @date 2023/12/5
*/ */
public class ProcessPublisher { public class ProcessPublisher {
// 事件通知方法 // 事件通知方法
@@ -5,8 +5,6 @@ import com.budwk.app.flow.engine.core.Execution;
/** /**
* 流程各模型操作处理接口 * 流程各模型操作处理接口
* @author mldong
* @date 2023/5/17
*/ */
public interface IHandler { public interface IHandler {
/** /**
@@ -16,8 +16,6 @@ import java.util.stream.Collectors;
/** /**
* 会签任务处理,用于判断会签任务是否可通过 * 会签任务处理,用于判断会签任务是否可通过
* *
* @author mldong
* @date 2023/11/24
*/ */
public class CountersignHandler implements IHandler { public class CountersignHandler implements IHandler {
private TaskModel taskModel; private TaskModel taskModel;
@@ -16,8 +16,6 @@ import java.util.List;
/** /**
* 创建任务处理器 * 创建任务处理器
* @author mldong
* @date 2023/5/16
*/ */
public class CreateTaskHandler implements IHandler { public class CreateTaskHandler implements IHandler {
private TaskModel taskModel; private TaskModel taskModel;
@@ -14,10 +14,7 @@ import com.budwk.app.flow.enums.ProcessEventTypeEnum;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum; import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
/** /**
*
* 结束流程实例的处理器 * 结束流程实例的处理器
* @author mldong
* @date 2023/5/29
*/ */
public class EndProcessHandler implements IHandler { public class EndProcessHandler implements IHandler {
private EndModel endModel; private EndModel endModel;
@@ -11,8 +11,6 @@ import java.util.List;
/** /**
* 合并分支操作的处理器 * 合并分支操作的处理器
* @author mldong
* @date 2023/5/21
*/ */
public class MergeBranchHandler implements IHandler { public class MergeBranchHandler implements IHandler {
private JoinModel joinModel; private JoinModel joinModel;
@@ -9,9 +9,6 @@ import com.budwk.app.flow.entity.ProcessDefine;
/** /**
* 启动子流程处理类 * 启动子流程处理类
*
* @author mldong
* @date 2023/12/7
*/ */
public class StartSubProcessHandler implements IHandler { public class StartSubProcessHandler implements IHandler {
private SubProcessModel model; private SubProcessModel model;
@@ -12,8 +12,6 @@ import java.util.Map;
/** /**
* *
* 简单的上下文发现实现类 * 简单的上下文发现实现类
* @author mldong
* @date 2023/4/26
*/ */
public class SimpleContext implements Context { public class SimpleContext implements Context {
private Dict dict = Dict.create(); private Dict dict = Dict.create();
@@ -16,8 +16,6 @@ import java.util.List;
/** /**
* 任务拦截器,处理代理人 * 任务拦截器,处理代理人
* *
* @author mldong
* @date 2023/12/6
*/ */
@IocBean @IocBean
public class SurrogateInterceptor implements FlowInterceptor { public class SurrogateInterceptor implements FlowInterceptor {
@@ -14,6 +14,7 @@ import com.budwk.app.sys.views.View_user;
import org.dromara.warm.flow.core.exception.FlowException; import org.dromara.warm.flow.core.exception.FlowException;
import org.nutz.dao.Cnd; import org.nutz.dao.Cnd;
import org.nutz.dao.Dao; import org.nutz.dao.Dao;
import org.nutz.lang.util.NutMap;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
@@ -22,8 +23,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
/** /**
* 流程工具 * 流程工具
* *
* @author mldong
* @date 2023/10/7
*/ */
public class FlowUtil { public class FlowUtil {
private FlowUtil() { private FlowUtil() {
@@ -83,6 +82,19 @@ public class FlowUtil {
return Dict.create(); return Dict.create();
} }
/**
* 参数转字典
*
* @param variable
* @return
*/
public static NutMap variableToNutMap(String variable) {
if (JSONUtil.isTypeJSON(variable)) {
return NutMap.WRAP(JSONUtil.parseObj(variable));
}
return NutMap.NEW();
}
/** /**
* 判断是否为第一个任务节点 * 判断是否为第一个任务节点
* *
@@ -15,9 +15,6 @@ import java.util.Date;
* <p> * <p>
* 流程任务 * 流程任务
* </p> * </p>
*
* @author mldong
* @since 2023-09-26
*/ */
@Getter @Getter
@Setter @Setter
@@ -25,7 +22,6 @@ import java.util.Date;
@Comment("流程任务") @Comment("流程任务")
public class ProcessTask extends BaseModel { public class ProcessTask extends BaseModel {
@Comment("主键") @Comment("主键")
@Id @Id
private Long id; private Long id;
@@ -12,9 +12,6 @@ import org.nutz.dao.entity.annotation.Table;
* <p> * <p>
* 流程任务和参与人关系 * 流程任务和参与人关系
* </p> * </p>
*
* @author mldong
* @since 2023-09-26
*/ */
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
@@ -8,13 +8,13 @@ import lombok.Getter;
@Getter @Getter
public enum ProcessTaskStateEnum { public enum ProcessTaskStateEnum {
DOING(10,"进行中"), DOING(10, "进行中"),
FINISHED(20, "已完成"), FINISHED(20, "已完成"),
WITHDRAW(30, "已撤回"), WITHDRAW(30, "已撤回"),
INTERRUPT(40, "强行终止"), INTERRUPT(40, "强行终止"),
PENDING(50,"挂起"), PENDING(50, "挂起"),
ABANDON(99,"废弃") TRANSFER(60, "转办"),
; ABANDON(99, "已废弃");
private final Integer code; private final Integer code;
private final String message; private final String message;
@@ -17,9 +17,6 @@ import java.util.List;
* <p> * <p>
* 流程实例 服务类 * 流程实例 服务类
* </p> * </p>
*
* @author mldong
* @since 2023-09-26
*/ */
public interface ProcessInstanceService extends BaseService<ProcessInstance> { public interface ProcessInstanceService extends BaseService<ProcessInstance> {
/** /**
@@ -28,12 +28,6 @@ public interface ProcessSurrogateService extends BaseService<ProcessSurrogate> {
*/ */
boolean update(ProcessSurrogate param); boolean update(ProcessSurrogate param);
/**
* 自定义分页查询流程委托代理
* @param param
* @return
*/
// CommonPage<ProcessSurrogateVO> page(ProcessSurrogatePageParam param);
/** /**
* 通过id查询 * 通过id查询
* @param id * @param id
@@ -9,9 +9,6 @@ import com.budwk.app.flow.vo.ProcessTaskActorVO;
* <p> * <p>
* 流程任务和参与人关系 服务类 * 流程任务和参与人关系 服务类
* </p> * </p>
*
* @author mldong
* @since 2023-09-26
*/ */
public interface ProcessTaskActorService extends BaseService<ProcessTaskActor> { public interface ProcessTaskActorService extends BaseService<ProcessTaskActor> {
/** /**
@@ -28,12 +25,6 @@ public interface ProcessTaskActorService extends BaseService<ProcessTaskActor> {
*/ */
boolean update(ProcessTaskActor param); boolean update(ProcessTaskActor param);
/**
* 自定义分页查询流程任务和参与人关系
* @param param
* @return
*/
// CommonPage<ProcessTaskActorVO> page(ProcessTaskActorPageParam param);
/** /**
* 通过id查询 * 通过id查询
* @param id * @param id
@@ -11,19 +11,16 @@ import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.vo.ProcessTaskVO; import com.budwk.app.flow.vo.ProcessTaskVO;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* <p> * <p>
* 流程任务 服务类 * 流程任务 服务类
* </p> * </p>
*
* @author mldong
* @since 2023-09-26
*/ */
public interface ProcessTaskService extends BaseService<ProcessTask> { public interface ProcessTaskService extends BaseService<ProcessTask> {
/** /**
* 添加流程任务 * 添加流程任务
*
* @param param * @param param
* @return * @return
*/ */
@@ -31,6 +28,7 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
/** /**
* 更新流程任务 * 更新流程任务
*
* @param param * @param param
* @return * @return
*/ */
@@ -39,6 +37,7 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
/** /**
* 通过id查询 * 通过id查询
*
* @param id * @param id
* @return * @return
*/ */
@@ -46,18 +45,21 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
/** /**
* 保存流程任务 * 保存流程任务
*
* @param processTask * @param processTask
*/ */
void saveProcessTask(ProcessTask processTask); void saveProcessTask(ProcessTask processTask);
/** /**
* 更新流程任务 * 更新流程任务
*
* @param processTask * @param processTask
*/ */
void updateProcessTask(ProcessTask processTask); void updateProcessTask(ProcessTask processTask);
/** /**
* 根据流程实例ID获取正在进行的任务 * 根据流程实例ID获取正在进行的任务
*
* @param processInstanceId 流程实例ID * @param processInstanceId 流程实例ID
* @param taskNames 任务名称 * @param taskNames 任务名称
* @return * @return
@@ -66,6 +68,7 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
/** /**
* 根据流程实例ID获取已完成的任务 * 根据流程实例ID获取已完成的任务
*
* @param processInstanceId 流程实例ID * @param processInstanceId 流程实例ID
* @param taskNames 任务名称 * @param taskNames 任务名称
* @return * @return
@@ -74,6 +77,7 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
/** /**
* 将流程任务修改为已完成 * 将流程任务修改为已完成
*
* @param processTaskId * @param processTaskId
* @param operator 任务处理人 * @param operator 任务处理人
* @param args * @param args
@@ -82,6 +86,7 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
/** /**
* 废弃任务 * 废弃任务
*
* @param processTaskId * @param processTaskId
* @param operator * @param operator
* @param args * @param args
@@ -90,6 +95,7 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
/** /**
* 根据任务模型和流程执行对象创建任务 * 根据任务模型和流程执行对象创建任务
*
* @param taskModel * @param taskModel
* @param execution * @param execution
* @return * @return
@@ -98,6 +104,7 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
/** /**
* 通过id获取流程任务 * 通过id获取流程任务
*
* @param id * @param id
* @return * @return
*/ */
@@ -105,6 +112,7 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
/** /**
* 向指定的任务id添加参与者 * 向指定的任务id添加参与者
*
* @param processTaskId 任务id * @param processTaskId 任务id
* @param actors 参与者 * @param actors 参与者
*/ */
@@ -112,6 +120,7 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
/** /**
* 向指定的任务id添加参与者 * 向指定的任务id添加参与者
*
* @param processTaskId 流程任务id * @param processTaskId 流程任务id
* @param actors 参与者 * @param actors 参与者
*/ */
@@ -119,12 +128,15 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
/** /**
* 向指定任务移除参与者 * 向指定任务移除参与者
*
* @param processTaskId 任务id * @param processTaskId 任务id
* @param actors 参与者 * @param actors 参与者
*/ */
void removeTaskActor(Long processTaskId, List<String> actors); void removeTaskActor(Long processTaskId, List<String> actors);
/** /**
* 根据taskId、operator,判断操作人operator是否允许执行任务 * 根据taskId、operator,判断操作人operator是否允许执行任务
*
* @param task 任务对象 * @param task 任务对象
* @param operator 操作人 * @param operator 操作人
* @return boolean 是否允许操作 * @return boolean 是否允许操作
@@ -133,6 +145,7 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
/** /**
* 根据任务ID获取参与者ID * 根据任务ID获取参与者ID
*
* @param processTaskId * @param processTaskId
* @return * @return
*/ */
@@ -140,6 +153,7 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
/** /**
* 根据当前任务对象驳回至上一步处理 * 根据当前任务对象驳回至上一步处理
*
* @param model 流程定义模型,用以获取上一步模型对象 * @param model 流程定义模型,用以获取上一步模型对象
* @param currentTask 当前任务对象 * @param currentTask 当前任务对象
* @return Task 任务对象 * @return Task 任务对象
@@ -148,6 +162,7 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
/** /**
* 获取可跳转的任务节点名称 * 获取可跳转的任务节点名称
*
* @param processInstanceId * @param processInstanceId
* @return * @return
*/ */
@@ -155,6 +170,7 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
/** /**
* 创建会签任务 * 创建会签任务
*
* @param taskModel * @param taskModel
* @param execution * @param execution
* @return * @return
@@ -163,6 +179,7 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
/** /**
* 根据执行对象、自定义节点模型创建历史任务记录 * 根据执行对象、自定义节点模型创建历史任务记录
*
* @param execution 执行对象 * @param execution 执行对象
* @param model 自定义节点模型 * @param model 自定义节点模型
* @return 历史任务 * @return 历史任务
@@ -171,8 +188,17 @@ public interface ProcessTaskService extends BaseService<ProcessTask> {
/** /**
* 根据流程实例ID获取最新的进行中的任务 * 根据流程实例ID获取最新的进行中的任务
*
* @param processInstanceId * @param processInstanceId
* @return * @return
*/ */
ProcessTaskVO latest(Long processInstanceId); ProcessTaskVO latest(Long processInstanceId);
/**
* 转办任务
*
* @param taskId 任务ID
* @param transferUserId 转办用户ID
*/
void transfer(Long taskId, String transferUserId);
} }
@@ -211,7 +211,7 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl<ProcessTask> impleme
if (CollectionUtil.isEmpty(actors)) return; if (CollectionUtil.isEmpty(actors)) return;
List<String> dbActors = getTaskActors(processTaskId); List<String> dbActors = getTaskActors(processTaskId);
List<String> newActors = actors.stream().filter(actor -> !dbActors.contains(actor)).toList(); List<String> newActors = actors.stream().filter(actor -> !dbActors.contains(actor)).toList();
Sql sql = Sqls.create("select id,username,loginname,unitName from vw_user where id in (@ids)"); Sql sql = Sqls.create("select id,username,loginname,unitName,unitId from vw_user where id in (@ids)");
sql.setParam("ids", newActors); sql.setParam("ids", newActors);
List<NutMap> list = listMap(sql); List<NutMap> list = listMap(sql);
@@ -222,19 +222,11 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl<ProcessTask> impleme
processTaskActor.setActorName(actor.getString("username")); processTaskActor.setActorName(actor.getString("username"));
processTaskActor.setActorAccount(actor.getString("loginname")); processTaskActor.setActorAccount(actor.getString("loginname"));
processTaskActor.setActorUnitName(actor.getString("unitName")); processTaskActor.setActorUnitName(actor.getString("unitName"));
processTaskActor.setActorUnitId(actor.getString("unitId"));
processTaskActor.setCreatedAt(System.currentTimeMillis()); processTaskActor.setCreatedAt(System.currentTimeMillis());
System.out.println(StrUtil.format("给任务:{},添加参与者:{}", processTaskId, actor.toString())); System.out.println(StrUtil.format("给任务:{},添加参与者:{}", processTaskId, actor.toString()));
insert(processTaskActor); insert(processTaskActor);
} }
// actors.stream().filter(actor -> !dbActors.contains(actor)).forEach(actor -> {
// ProcessTaskActor processTaskActor = new ProcessTaskActor();
// processTaskActor.setProcessTaskId(processTaskId);
// processTaskActor.setActorId(actor);
// processTaskActor.setCreatedAt(System.currentTimeMillis());
// System.out.println(StrUtil.format("给任务:{},添加参与者:{}", processTaskId, actor));
// insert(processTaskActor);
// });
} }
@Override @Override
@@ -465,6 +457,41 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl<ProcessTask> impleme
return findById(processTaskList.get(0).getId()); return findById(processTaskList.get(0).getId());
} }
@Override
@Aop(TransAop.READ_COMMITTED)
public void transfer(Long taskId, String transferUserId) {
// 设置原任务状态为已转办
ProcessTask task = fetch(taskId);
task.setTaskState(ProcessTaskStateEnum.TRANSFER.getCode());
Dict variable = FlowUtil.variableToDict(task.getVariable());
variable.put(FlowConst.TASK_FORM_DATA_PREFIX + "transferUserId", transferUserId);
task.setVariable(JSONUtil.toJsonStr(variable));
updateIgnoreNull(task);
// 创建转办任务
ProcessTask newTask = BeanUtil.copyProperties(task, ProcessTask.class, "id");
newTask.setTaskParentId(taskId);
newTask.setId(null);
newTask.setCreatedAt(null);
newTask.setUpdatedAt(null);
newTask.setCreatedBy(null);
newTask.setUpdatedBy(null);
variable.put(FlowConst.TASK_FORM_DATA_PREFIX + "transferUserId", null);
newTask.setVariable(JSONUtil.toJsonStr(variable));
newTask.setTaskState(ProcessTaskStateEnum.DOING.getCode());
dao().insert(newTask);
// 创建转办任务参与者
addTaskActor(newTask.getId(), List.of(transferUserId));
// 发布流程任务开始事件
List<ProcessTask> processTaskList = List.of(task);
processTaskList.forEach(processTask -> {
ProcessPublisher.notify(ProcessEvent.builder().eventType(ProcessEventTypeEnum.PROCESS_TASK_START).sourceId(processTask.getId()).build());
});
}
/** /**
* 根据Task模型的assignee、assignmentHandler属性以及运行时数据,确定参与者 * 根据Task模型的assignee、assignmentHandler属性以及运行时数据,确定参与者
* *
@@ -1,5 +1,6 @@
package com.budwk.app.flow.vo; package com.budwk.app.flow.vo;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Dict; import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
@@ -78,6 +79,7 @@ public class ProcessTaskVO extends ProcessTask {
this.taskFormData.put(key,ext.get(key)); this.taskFormData.put(key,ext.get(key));
this.taskFormData.put(key.replaceAll(FlowConst.TASK_FORM_DATA_PREFIX,""),ext.get(key)); this.taskFormData.put(key.replaceAll(FlowConst.TASK_FORM_DATA_PREFIX,""),ext.get(key));
}); });
this.taskFormData.put("finishTimeForDocx", DateUtil.format(getFinishTime(),"yyyy年MM月dd日"));
return taskFormData; return taskFormData;
} }
@@ -5,7 +5,7 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgent;
import cn.hutool.http.useragent.UserAgentUtil; import cn.hutool.http.useragent.UserAgentUtil;
import com.budwk.app.base.constant.RedisConstant; import cn.hutool.json.JSONObject;
import com.budwk.app.base.result.Result; import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_home_activity; import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.sys.models.Sys_menu; import com.budwk.app.sys.models.Sys_menu;
@@ -35,8 +35,6 @@ import org.nutz.log.Logs;
import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param; import org.nutz.mvc.annotation.Param;
import org.nutz.plugins.wkcache.annotation.CacheDefaults;
import org.nutz.plugins.wkcache.annotation.CacheResult;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
@@ -172,6 +170,22 @@ public class SysHomeController {
return Result.success(sysMenus); return Result.success(sysMenus);
} }
@At
@SaCheckLogin
@ApiOperation("获取收藏应用")
@Ok("json")
public Result listFavorite(@Param(value = "platform", df = "PC") String platform) {
List<Sys_menu> list = sysMenuService.query(Cnd.where(Sys_menu::getId, "in", Sqls.create("select appId from sys_user_favorite_app where userId = @userId").setParam("userId", SecurityUtil.getUserId()))
.and(Sys_menu::getDisabled, "=", 0)
.and(Sys_menu::getShowit, "=", 1)
.and(Sys_menu::getPlatform, "=", platform)
);
List<Sys_menu> menus = sysUserService.getMenus(SecurityUtil.getUserId());
List<String> allMenuIds = menus.stream().map(Sys_menu::getId).toList();
List<Sys_menu> sysMenus = list.stream().filter(m -> allMenuIds.contains(m.getId())).sorted(Comparator.comparingInt(Sys_menu::getLocation)).toList();
return Result.success(sysMenus);
}
@At @At
@SaCheckLogin @SaCheckLogin
@@ -240,43 +254,76 @@ public class SysHomeController {
@SaCheckLogin @SaCheckLogin
@ApiOperation("获取新闻") @ApiOperation("获取新闻")
@Ok("json") @Ok("json")
@CacheDefaults(cacheName = RedisConstant.PLATFORM_REDIS_WKCACHE_PREFIX + "web_news", isHash = true) // @CacheDefaults(cacheName = RedisConstant.PLATFORM_REDIS_WKCACHE_PREFIX + "web_news", isHash = true)
@CacheResult(cacheKey = "news", ignoreNull = true, cacheLiveTime = 60 * 60 * 24) // @CacheResult(cacheKey = "news", ignoreNull = true, cacheLiveTime = 60 * 60 * 24)
public Result getNews() { public Result getNews() {
// 定义要爬取的URL // 定义要爬取的URL
String domain = "http://nsdgh.njnu.edu.cn"; String domain = "https://cdgh.ncu.edu.cn/";
try { try {
// 使用Jsoup连接到URL并获取页面内容 // 使用Jsoup连接到URL并获取页面内容
Document document = Jsoup.connect(domain).get(); Document doc = Jsoup.connect(domain).get();
List<NutMap> results = new ArrayList<>();
// 最新新闻 JSONObject root = new JSONObject();
Element newsElement = document.getElementById("news");
// 获取所有li元素下的a标签
Elements links = newsElement.select("li a");
List<NutMap> list = links.stream().map(a -> {
NutMap map = new NutMap();
map.put("href", domain + "/" + a.attr("href"));
map.put("text", a.text());
return map;
}).toList();
results.add(NutMap.NEW().addv("label", "最新新闻").addv("value", list));
// 通知公告 // 1. 新闻快讯(来自 .list1
Elements newsSections = document.select("div.news1"); List<JSONObject> newsArray = new ArrayList<>();
for (Element section : newsSections) { Elements newsItems = doc.select(".group1 .list1 li");
String category = section.selectFirst("h6").ownText(); // 获取"通知公告"或"分工会" for (Element item : newsItems) {
Elements items = section.select("li a"); String date = item.select(".date").text().trim();
List<NutMap> list1 = items.stream().map(a -> { Element link = item.select("a.text").first();
NutMap map = new NutMap(); String title = link.select(".title").text().trim();
map.put("href", domain + "/" + a.attr("href")); String url = link.attr("href").trim();
map.put("text", a.text());
return map; JSONObject node = new JSONObject();
}).toList(); node.set("title", title);
results.add(NutMap.NEW().addv("label", category).addv("value", list1)); node.set("date", date);
node.set("url", domain + url);
newsArray.add(node);
}
root.set("news", newsArray);
// 2. 通知公告(来自 .list2
List<JSONObject> noticesArray = new ArrayList<>();
Elements noticeItems = doc.select(".group2 .list2 li");
for (Element item : noticeItems) {
String date = item.select(".date").text().trim();
Element link = item.select("a.title").first();
String title = link.text().trim();
String url = link.attr("href").trim();
JSONObject node = new JSONObject();
node.set("title", title);
node.set("date", date);
node.set("url", domain + url);
noticesArray.add(node);
}
root.set("notices", noticesArray);
// 3. 基层风采(来自 .pic-list1
List<JSONObject> grassrootsArray = new ArrayList<>();
Elements grassrootsItems = doc.select(".group3 .pic-list1 li");
for (Element item : grassrootsItems) {
Element link = item.select("a.img-scale").first();
String date = link.select(".date").text().trim();
String title = link.select(".title").text().trim();
String url = link.attr("href").trim();
String summary = link.select(".info").text().trim();
String imageUrl = "";
Element img = link.select("img").first();
if (img != null) {
imageUrl = img.attr("src").trim();
} }
return Result.success(results); JSONObject node = new JSONObject();
node.set("title", title);
node.set("date", date);
node.set("url", domain + url);
node.set("summary", summary);
node.set("image", domain + imageUrl);
grassrootsArray.add(node);
}
root.set("grassroots", grassrootsArray);
return Result.success(root);
} catch (Exception e) { } catch (Exception e) {
log.error(e); log.error(e);
return Result.success(); return Result.success();
@@ -114,6 +114,11 @@ public interface SysRoleService extends BaseService<Sys_role> {
*/ */
Sys_role getByCode(String code); Sys_role getByCode(String code);
/**
* 通过枚举获取角色
* @param roleConstant
* @return
*/
Sys_role getByCode(RoleConstant roleConstant); Sys_role getByCode(RoleConstant roleConstant);
/** /**
@@ -114,7 +114,7 @@ public class ProposalConfigUnitController {
@SLog(tag = "提案", msg = "承办单位同步系统单位") @SLog(tag = "提案", msg = "承办单位同步系统单位")
public Result syncSysUnit() { public Result syncSysUnit() {
Sql sql = Sqls.create("select code from proposal_undertake"); Sql sql = Sqls.create("select code from proposal_undertake");
List<Sys_unit> sysUnits = dao.query(Sys_unit.class, Cnd.where(Sys_unit::getUnitcode, "not in", sql).and(Sys_unit::getUnitLevel, "=", 2)); List<Sys_unit> sysUnits = dao.query(Sys_unit.class, Cnd.where(Sys_unit::getUnitcode, "not in", sql).and(Sys_unit::getUnitTypeCode, "=", 1));
List<ProposalUndertake> proposalUndertakes = sysUnits.stream().map(unit -> { List<ProposalUndertake> proposalUndertakes = sysUnits.stream().map(unit -> {
ProposalUndertake proposalUndertake = new ProposalUndertake(); ProposalUndertake proposalUndertake = new ProposalUndertake();
proposalUndertake.setCode(unit.getUnitcode()); proposalUndertake.setCode(unit.getUnitcode());
@@ -133,8 +133,8 @@ public class ProposalDashboardController {
ins.variable instanceVariable, ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId, ins.processDefineId instanceProcessDefineId,
t.displayName curTaskName, t.displayName curTaskName,
JSON_UNQUOTE(JSON_EXTRACT(caseTasks.variable, '$.tf_hostUnitName')) AS masterUnitName, GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 1 THEN pru.unitName END) AS masterUnitName,
caseTasks.variable->>'$.tf_helpUnitNameStr' AS slaveUnitNames GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 0 THEN pru.unitName END) AS slaveUnitNames
FROM FROM
proposal_info info proposal_info info
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id)) LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
@@ -143,8 +143,7 @@ public class ProposalDashboardController {
LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId
LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
LEFT JOIN (SELECT processInstanceId, MAX(finishTime) AS finishTime FROM wf_process_task WHERE taskName = '9846ab38-40c5-4093-bafc-a9b3b443338b' AND taskState = 20 GROUP BY processInstanceId) latestTasks ON latestTasks.processInstanceId = ins.id LEFT JOIN proposal_reply_unit pru ON pru.proposalId = info.id
LEFT JOIN wf_process_task caseTasks ON caseTasks.processInstanceId = ins.id AND caseTasks.taskName = '9846ab38-40c5-4093-bafc-a9b3b443338b' AND caseTasks.taskState = 20 AND caseTasks.finishTime = latestTasks.finishTime
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
$condition $condition
"""); """);
@@ -21,22 +21,12 @@ import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
/**
* @version 1.0
* @Author zzr
* @nameProposalExportComprehensiveController
* @Date 2024/10/10 9:52
* @注释
*/
@Slf4j @Slf4j
@IocBean @IocBean
@Ok("json:full") @Ok("json:full")
@At("/platform/proposal/export/comprehensive") @At("/platform/proposal/export/comprehensive")
public class ProposalExportComprehensiveController { public class ProposalExportComprehensiveController {
@Inject
private BaseService baseService;
@Inject @Inject
private ProposalExportService proposalExportService; private ProposalExportService proposalExportService;
@@ -62,8 +52,8 @@ public class ProposalExportComprehensiveController {
ins.variable instanceVariable, ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId, ins.processDefineId instanceProcessDefineId,
t.displayName curTaskName, t.displayName curTaskName,
JSON_UNQUOTE(JSON_EXTRACT(caseTasks.variable, '$.tf_hostUnitName')) AS masterUnitName, GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 1 THEN pru.unitName END) AS masterUnitName,
caseTasks.variable->>'$.tf_helpUnitNameStr' AS slaveUnitNames GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 0 THEN pru.unitName END) AS slaveUnitNames
FROM FROM
proposal_info info proposal_info info
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id)) LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
@@ -72,16 +62,15 @@ public class ProposalExportComprehensiveController {
LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId
LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
LEFT JOIN (SELECT processInstanceId, MAX(finishTime) AS finishTime FROM wf_process_task WHERE taskName = '9846ab38-40c5-4093-bafc-a9b3b443338b' AND taskState = 20 GROUP BY processInstanceId) latestTasks ON latestTasks.processInstanceId = ins.id
LEFT JOIN wf_process_task caseTasks ON caseTasks.processInstanceId = ins.id AND caseTasks.taskName = '9846ab38-40c5-4093-bafc-a9b3b443338b' AND caseTasks.taskState = 20 AND caseTasks.finishTime = latestTasks.finishTime
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN proposal_reply_unit pru ON pru.proposalId = info.id
$condition $condition
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm); ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm);
cnd.groupBy("info.id"); cnd.groupBy("info.id");
sql.setCondition(cnd); sql.setCondition(cnd);
Pagination pagination = baseService.listPageVO(pageForm, sql, ProposalInfoPageVO.class); Pagination pagination = proposalExportService.listPageMap(pageForm.getPageNumber(),pageForm.getPageSize(), sql);
return Result.success(pagination); return Result.success(pagination);
} }
@@ -59,8 +59,8 @@ public class ProposalQueryComprehensiveController {
ins.variable instanceVariable, ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId, ins.processDefineId instanceProcessDefineId,
t.displayName curTaskName, t.displayName curTaskName,
JSON_UNQUOTE(JSON_EXTRACT(caseTasks.variable, '$.tf_hostUnitName')) AS masterUnitName, GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 1 THEN pru.unitName END) AS masterUnitName,
caseTasks.variable->>'$.tf_helpUnitNameStr' AS slaveUnitNames GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 0 THEN pru.unitName END) AS slaveUnitNames
FROM FROM
proposal_info info proposal_info info
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id)) LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
@@ -69,9 +69,8 @@ public class ProposalQueryComprehensiveController {
LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId
LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
LEFT JOIN (SELECT processInstanceId, MAX(finishTime) AS finishTime FROM wf_process_task WHERE taskName = '9846ab38-40c5-4093-bafc-a9b3b443338b' AND taskState = 20 GROUP BY processInstanceId) latestTasks ON latestTasks.processInstanceId = ins.id
LEFT JOIN wf_process_task caseTasks ON caseTasks.processInstanceId = ins.id AND caseTasks.taskName = '9846ab38-40c5-4093-bafc-a9b3b443338b' AND caseTasks.taskState = 20 AND caseTasks.finishTime = latestTasks.finishTime
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN proposal_reply_unit pru ON pru.proposalId = info.id
$condition $condition
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
@@ -52,8 +52,8 @@ public class ProposalQueryHistoryController {
ins.variable instanceVariable, ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId, ins.processDefineId instanceProcessDefineId,
t.displayName curTaskName, t.displayName curTaskName,
JSON_UNQUOTE(JSON_EXTRACT(caseTasks.variable, '$.tf_hostUnitName')) AS masterUnitName, GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 1 THEN pru.unitName END) AS masterUnitName,
caseTasks.variable->>'$.tf_helpUnitNameStr' AS slaveUnitNames GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 0 THEN pru.unitName END) AS slaveUnitNames
FROM FROM
proposal_info info proposal_info info
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id)) LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
@@ -62,9 +62,8 @@ public class ProposalQueryHistoryController {
LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId
LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
LEFT JOIN (SELECT processInstanceId, MAX(finishTime) AS finishTime FROM wf_process_task WHERE taskName = '9846ab38-40c5-4093-bafc-a9b3b443338b' AND taskState = 20 GROUP BY processInstanceId) latestTasks ON latestTasks.processInstanceId = ins.id
LEFT JOIN wf_process_task caseTasks ON caseTasks.processInstanceId = ins.id AND caseTasks.taskName = '9846ab38-40c5-4093-bafc-a9b3b443338b' AND caseTasks.taskState = 20 AND caseTasks.finishTime = latestTasks.finishTime
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN proposal_reply_unit pru ON pru.proposalId = info.id
$condition $condition
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
@@ -2,26 +2,24 @@ package com.budwk.app.zhgh.democratic.proposal.controller.query;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.result.Result; import com.budwk.app.base.result.Result;
import com.budwk.app.flow.entity.ProcessInstance; import com.budwk.app.flow.engine.util.FlowUtil;
import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake; import com.budwk.app.zhgh.democratic.proposal.models.ProposalReplyUnit;
import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Cnd; import org.nutz.dao.Cnd;
import org.nutz.dao.Dao; import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.util.NutMap; import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Ok;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@@ -47,111 +45,90 @@ public class ProposalQueryUnitReplyController {
@At @At
@SaCheckPermission("proposal.query.unitReply") @SaCheckPermission("proposal.query.unitReply")
public Result data(String sessionId, String undertakeUnitId) { public Result data(String sessionId, String undertakeUnitId) {
List<ProposalInfo> infos = dao.query(ProposalInfo.class, Cnd.where(ProposalInfo::getSessionId, "=", sessionId)); // 提案配置 协办是否需要答复
List<String> infoIds = infos.stream().map(v -> v.getId()).toList(); ProposalConfig proposalConfig = dao.fetch(ProposalConfig.class, Cnd.NEW());
List<ProcessInstance> instances = dao.query(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "in", infoIds)); boolean slaveNeedReply = proposalConfig.getSlaveUnitNeedReply();
List<Long> instIds = instances.stream().map(v -> v.getId()).toList();
// 立案任务记录 // 当前届次所有的提案ID
List<ProcessTask> caseTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds) Sql sql = Sqls.create("select id from proposal_info where sessionId = @sessionId").setParam("sessionId", sessionId);
.and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode()) sql.setCallback(Sqls.callback.strList());
.and(ProcessTask::getTaskName, "=", "9846ab38-40c5-4093-bafc-a9b3b443338b")); dao.execute(sql);
List<String> proposalIds = sql.getList(String.class);
// 主办任务记录 if(proposalIds.isEmpty()){
List<ProcessTask> masterUnitTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds) return Result.success().addData(Map.of("tableData", Collections.EMPTY_LIST, "slaveNeedReply", slaveNeedReply));
.and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.DOING.getCode())) }
.and(ProcessTask::getTaskName, "in", List.of("85cf23da-2dd5-4007-a1e9-bd9bfddc68f0", "5ed5a1be-0cd3-4b47-a0d5-238d53b61f34")));
// 协办任务记录
List<ProcessTask> slaveUnitTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds)
.and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.DOING.getCode()))
.and(ProcessTask::getTaskName, "=", "c9a1586e-272b-41b8-b438-0be9f9e3781d"));
//该届次所有涉及到的承办单位 // 关联所有的实例ID
List<String> underTakeIds = caseTasks.stream().map(v -> { Sql instSql = Sqls.create("select id from wf_process_instance where businessNo in (@proposalIds)");
NutMap variable = Json.fromJson(NutMap.class, v.getVariable()); instSql.setParam("proposalIds", proposalIds);
String hostUnitId = variable.getString("tf_hostUnitId"); instSql.setCallback(Sqls.callback.strList());
List<String> helpUnitIds = variable.getAsList("tf_helpUnitIds", String.class); dao.execute(instSql);
List<String> list = new ArrayList<>(); List<String> instIds = instSql.getList(String.class);
list.add(hostUnitId);
list.addAll(helpUnitIds);
return list;
})
.flatMap(List::stream)
.distinct()
.toList();
// 提案委员会立案分配的承办单位
Cnd cnd = Cnd.where(ProposalReplyUnit::getProposalId, "in", proposalIds);
cnd.andEX(ProposalReplyUnit::getUnitId, "=", undertakeUnitId);
List<ProposalReplyUnit> replyUnits = dao.query(ProposalReplyUnit.class, cnd);
List<ProposalUndertake> undertakes = dao.query(ProposalUndertake.class, Cnd.where(ProposalUndertake::getId, "in", underTakeIds)); // 承办单位答复记录
Map<String, ProposalUndertake> undertakeMap = undertakes.stream().collect(Collectors.toMap(ProposalUndertake::getId, v -> v)); List<ProcessTask> replyTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds).and(ProcessTask::getTaskName, "in", List.of("master_reply", "slave_reply", "opinion_master_reply")).and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.DOING.getCode())));
// 承办单位
List<NutMap> tableData = new ArrayList<>(); List<NutMap> tableData = new ArrayList<>();
for (String underTakeId : underTakeIds) { replyUnits.stream().collect(Collectors.groupingBy(ProposalReplyUnit::getUnitCode)).forEach((k, v) -> {
NutMap tableRow = NutMap.NEW(); NutMap tableRow = NutMap.NEW();
tableRow.put("id", underTakeId); tableRow.put("id", k);
if(undertakeMap.get(underTakeId) == null){ v.stream().findAny().ifPresent(item -> {
continue; tableRow.put("unitName", item.getUnitName());
} tableRow.put("unitCode", item.getUnitCode());
tableRow.put("name", undertakeMap.get(underTakeId).getName()); });
//找出承办提案总数 // 提案总数
long sum = caseTasks.stream() tableRow.put("sum", v.size());
.filter(v -> { // 主办提案数
NutMap variable = Json.fromJson(NutMap.class, v.getVariable()); tableRow.put("masterSum", v.stream().filter(unit -> Objects.equals(unit.getUnitCode(), k) && unit.getIsMaster()).count());
if (variable == null) { // 协办提案数
return false; tableRow.put("slaveSum", v.stream().filter(unit -> Objects.equals(unit.getUnitCode(), k) && !unit.getIsMaster()).count());
}
String hostUnitId = variable.getString("tf_hostUnitId"); // 主办提案已答复数
List<String> helpUnitIds = variable.getAsList("tf_helpUnitIds", String.class); long masterReplySum = replyTasks.stream().filter(x ->
FlowUtil.variableToNutMap(x.getVariable()).getString("underTakeId", "").equals(k)
&& FlowUtil.variableToNutMap(x.getVariable()).getBoolean("underTakeIsMaster")
&& x.getTaskState().equals(ProcessTaskStateEnum.FINISHED.getCode())
).map(ProcessTask::getProcessInstanceId).distinct().count();
boolean isHost = underTakeId != null && underTakeId.equals(hostUnitId); // 主办提案未答复数
boolean isHelper = helpUnitIds != null && helpUnitIds.contains(underTakeId); long masterNoReplySum = replyTasks.stream().filter(x ->
FlowUtil.variableToNutMap(x.getVariable()).getString("underTakeId", "").equals(k)
&& FlowUtil.variableToNutMap(x.getVariable()).getBoolean("underTakeIsMaster")
&& x.getTaskState().equals(ProcessTaskStateEnum.DOING.getCode())
).map(ProcessTask::getProcessInstanceId).distinct().count();
return isHost || isHelper; // 协办提案已答复数
}) long slaveReplySum = replyTasks.stream().filter(x ->
.map(ProcessTask::getProcessInstanceId) FlowUtil.variableToNutMap(x.getVariable()).getString("underTakeId", "").equals(k)
.distinct() && !FlowUtil.variableToNutMap(x.getVariable()).getBoolean("underTakeIsMaster")
.count(); && x.getTaskState().equals(ProcessTaskStateEnum.FINISHED.getCode())
).map(ProcessTask::getProcessInstanceId).distinct().count();
// 办提案数 // 办提案未答复
long hostSum = masterUnitTasks.stream().map(v -> Json.fromJson(NutMap.class, v.getVariable())).filter(variable -> underTakeId.equals(variable.getString("unitId")) && variable.getBoolean("isMaster")).count(); long slaveNoReplySum = replyTasks.stream().filter(x ->
// 主办已答复的数量 FlowUtil.variableToNutMap(x.getVariable()).getString("underTakeId", "").equals(k)
long hostReplySum = masterUnitTasks.stream().filter(v -> Objects.equals(v.getTaskState(), ProcessTaskStateEnum.FINISHED.getCode())).map(v -> Json.fromJson(NutMap.class, v.getVariable())).filter(variable -> underTakeId.equals(variable.getString("unitId")) && variable.getBoolean("isMaster")).count(); && !FlowUtil.variableToNutMap(x.getVariable()).getBoolean("underTakeIsMaster")
// 主办未答复的数量 && x.getTaskState().equals(ProcessTaskStateEnum.DOING.getCode())
long hostNoReplySum = hostSum - hostReplySum; ).map(ProcessTask::getProcessInstanceId).distinct().count();
tableRow.put("masterReplySum", masterReplySum);
tableRow.put("masterNoReplySum", masterNoReplySum);
tableRow.put("slaveReplySum", slaveReplySum);
tableRow.put("slaveNoReplySum", slaveNoReplySum);
// 协办提案数量
long slaveSum = slaveUnitTasks.stream().map(v -> Json.fromJson(NutMap.class, v.getVariable())).filter(variable -> underTakeId.equals(variable.getString("unitId")) && !variable.getBoolean("isMaster")).count();
tableRow.put("sum", sum);
tableRow.put("hostSum", hostSum);
tableRow.put("hostReplySum", hostReplySum);
tableRow.put("hostNoReplySum", hostNoReplySum);
tableRow.put("slaveSum", slaveSum);
// if (slaveNeedReply) {
// //协办提案数量
// long helpSum = underTakeTasks.stream().filter(v -> v.getCreateVariable().getStr("underTakeId").equals(underTakeId) && !v.getCreateVariable().getBool("isMaster", false)).map(BpmProcessTask::getProcessInstanceId).collect(Collectors.toSet()).size();
// //协办已答复的数量
// long helpReplySum = underTakeTasks.stream().filter(v -> v.getCreateVariable().getStr("underTakeId").equals(underTakeId) && !v.getCreateVariable().getBool("isMaster", false) && v.getTaskStatus().equals(BpmProcessTaskStatusEnum.COMPLETE.name())).map(BpmProcessTask::getProcessInstanceId).collect(Collectors.toSet()).size();
// //协办未答复的数量
// long helpNoReplySum = helpSum - helpReplySum;
// tableRow.put("helpSum", helpSum);
// tableRow.put("helpReplySum", helpReplySum);
// tableRow.put("helpNoReplySum", helpNoReplySum);
// } else {
// //不需要协办答复 计算出提案总数即可
// int helpSum = caseUnitTasks.stream()
// .filter(v -> v.getExtVariable().getBeanList("helpUnitIds", String.class).contains(underTakeId))
// .map(BpmProcessTask::getProcessInstanceId).collect(Collectors.toSet()).size();
// tableRow.put("helpSum", helpSum);
// }
tableData.add(tableRow); tableData.add(tableRow);
} });
return Result.success().addData(Map.of("tableData", tableData, "slaveNeedReply", false));
return Result.success().addData(Map.of("tableData", tableData, "slaveNeedReply", slaveNeedReply));
} }
} }
@@ -29,8 +29,6 @@ import javax.validation.Valid;
@Api(tags = "提案年度报告") @Api(tags = "提案年度报告")
public class ProposalQueryYearReportController { public class ProposalQueryYearReportController {
@Inject
private BaseService baseService;
@Inject @Inject
private ProposalCommonService proposalCommonService; private ProposalCommonService proposalCommonService;
@@ -51,13 +49,14 @@ public class ProposalQueryYearReportController {
type.name AS typeName, type.name AS typeName,
tcs.fullName AS sessionName, tcs.fullName AS sessionName,
tcd.`name` AS delegationName, tcd.`name` AS delegationName,
inst.processInstanceNodeId, ins.id AS instanceId,
inst.processInstanceNodeCode, ins.businessNo,
inst.processInstanceNodeName, ins.state instanceState,
inst.processInstanceTaskIds, ins.variable instanceVariable,
inst.processInstanceStatus, ins.processDefineId instanceProcessDefineId,
JSON_UNQUOTE(JSON_EXTRACT(caseUnitTasks.extVariable, '$.hostUnit')) AS masterUnderTakeName, t.displayName curTaskName,
JSON_EXTRACT(caseUnitTasks.extVariable, '$.helpUnits') AS slaveUnderTakeNames GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 1 THEN pru.unitName END) AS masterUnitName,
GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 0 THEN pru.unitName END) AS slaveUnitNames
FROM FROM
proposal_info info proposal_info info
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id)) LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
@@ -65,26 +64,16 @@ public class ProposalQueryYearReportController {
LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId
LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId
LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName
LEFT JOIN bpm_process_instance inst ON inst.processInstanceBusinessId = info.id LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
LEFT JOIN ( LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
SELECT LEFT JOIN proposal_reply_unit pru ON pru.proposalId = info.id
processInstanceId,
MAX(endOn) AS maxEndOn
FROM
bpm_process_task
WHERE
processTaskNodeCode = 70 AND taskStatus = 'COMPLETE'
GROUP BY
processInstanceId
) latestTasks ON latestTasks.processInstanceId = inst.id
LEFT JOIN bpm_process_task caseUnitTasks ON caseUnitTasks.processInstanceId = inst.id AND caseUnitTasks.processTaskNodeCode = 70 AND caseUnitTasks.taskStatus = 'COMPLETE' AND caseUnitTasks.endOn = latestTasks.maxEndOn
$condition $condition
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm); ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm);
cnd.groupBy("info.id"); cnd.groupBy("info.id");
sql.setCondition(cnd); sql.setCondition(cnd);
Pagination pagination = baseService.listPageVO(pageForm,sql, ProposalInfoPageVO.class); Pagination pagination = proposalCommonService.listPageMap(pageForm.getPageNumber(),pageForm.getPageSize(),sql);
return Result.success(pagination); return Result.success(pagination);
} }
@@ -2,26 +2,26 @@ package com.budwk.app.zhgh.democratic.proposal.controller.query;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.result.Result; import com.budwk.app.base.result.Result;
import com.budwk.app.flow.engine.util.FlowUtil;
import com.budwk.app.flow.entity.ProcessInstance; import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.sys.models.Sys_dict; import com.budwk.app.sys.models.Sys_dict;
import com.budwk.app.sys.services.SysDictService; import com.budwk.app.sys.services.SysDictService;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake; import com.budwk.app.zhgh.democratic.proposal.models.ProposalReplyUnit;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import org.nutz.dao.Cnd; import org.nutz.dao.Cnd;
import org.nutz.dao.Dao; import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.util.NutMap; import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Ok;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@IocBean @IocBean
@@ -44,98 +44,72 @@ public class ProposalUnderTakeSatisfactionController {
@At @At
@SaCheckPermission("proposal.query.underTake.satisfaction") @SaCheckPermission("proposal.query.underTake.satisfaction")
public Result data(String sessionId){ public Result data(String sessionId, String undertakeUnitId) {
List<ProposalInfo> infos = dao.query(ProposalInfo.class, Cnd.where(ProposalInfo::getSessionId, "=", sessionId)); List<Sys_dict> feedbackCodes = sysDictService.getSubListByCode("PROPOSAL_FEEDBACK");
List<String> infoIds = infos.stream().map(v -> v.getId()).toList();
List<ProcessInstance> instances = dao.query(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "in", infoIds));
List<Long> instIds = instances.stream().map(v -> v.getId()).toList();
// 立案任务记录 // 当前届次所有的提案ID
List<ProcessTask> caseTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds) Sql sql = Sqls.create("select id from proposal_info where sessionId = @sessionId").setParam("sessionId", sessionId);
.and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode()) sql.setCallback(Sqls.callback.strList());
.and(ProcessTask::getTaskName, "=", "9846ab38-40c5-4093-bafc-a9b3b443338b")); dao.execute(sql);
List<String> proposalIds = sql.getList(String.class);
// 主办任务记录 if (proposalIds.isEmpty()) {
List<ProcessTask> masterUnitTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds) return Result.success(Collections.EMPTY_LIST);
.and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.DOING.getCode())) }
.and(ProcessTask::getTaskName, "in", List.of("85cf23da-2dd5-4007-a1e9-bd9bfddc68f0", "5ed5a1be-0cd3-4b47-a0d5-238d53b61f34")));
// 协办任务记录 // 关联所有的实例ID
List<ProcessTask> slaveUnitTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds) Sql instSql = Sqls.create("select id from wf_process_instance where businessNo in (@proposalIds)");
.and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.DOING.getCode())) instSql.setParam("proposalIds", proposalIds);
.and(ProcessTask::getTaskName, "=", "c9a1586e-272b-41b8-b438-0be9f9e3781d")); instSql.setCallback(Sqls.callback.strList());
dao.execute(instSql);
List<String> instIds = instSql.getList(String.class);
// 提案委员会立案分配的承办单位
Cnd cnd = Cnd.where(ProposalReplyUnit::getProposalId, "in", proposalIds);
cnd.andEX(ProposalReplyUnit::getUnitId, "=", undertakeUnitId);
List<ProposalReplyUnit> replyUnits = dao.query(ProposalReplyUnit.class, cnd);
// 所有承办单位任务记录 // 反馈评分记录
List<ProcessTask> allUnitTasks = new ArrayList<>(); // List<ProcessTask> feedbackTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds)
allUnitTasks.addAll(masterUnitTasks); // .and(ProcessTask::getTaskName, "=", "feedback")
allUnitTasks.addAll(slaveUnitTasks); // .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode()));
//该届次所有涉及到的承办单位
List<String> underTakeIds = caseTasks.stream().map(v -> {
NutMap variable = Json.fromJson(NutMap.class, v.getVariable());
String hostUnitId = variable.getString("tf_hostUnitId");
List<String> helpUnitIds = variable.getAsList("tf_helpUnitIds", String.class);
List<String> list = new ArrayList<>();
list.add(hostUnitId);
list.addAll(helpUnitIds);
return list;
})
.flatMap(List::stream)
.distinct()
.toList();
List<ProposalUndertake> undertakes = dao.query(ProposalUndertake.class, Cnd.where(ProposalUndertake::getId, "in", underTakeIds));
Map<String, ProposalUndertake> undertakeMap = undertakes.stream().collect(Collectors.toMap(ProposalUndertake::getId, v -> v));
// 承办单位
List<NutMap> tableData = new ArrayList<>(); List<NutMap> tableData = new ArrayList<>();
// 反馈评分 replyUnits.stream().collect(Collectors.groupingBy(ProposalReplyUnit::getUnitCode)).forEach((k, v) -> {
List<Sys_dict> proposalFeedback = sysDictService.getSubListByCode("PROPOSAL_FEEDBACK");
for (String underTakeId : underTakeIds) {
NutMap tableRow = NutMap.NEW(); NutMap tableRow = NutMap.NEW();
tableRow.put("id", underTakeId); tableRow.put("id", k);
if (undertakeMap.get(underTakeId) == null) { v.stream().findAny().ifPresent(item -> {
continue; tableRow.put("unitName", item.getUnitName());
tableRow.put("unitCode", item.getUnitCode());
});
// 提案总数
tableRow.put("sum", v.size());
// 主办提案数
tableRow.put("masterSum", v.stream().filter(unit -> Objects.equals(unit.getUnitCode(), k) && unit.getIsMaster()).count());
// 协办提案数
tableRow.put("slaveSum", v.stream().filter(unit -> Objects.equals(unit.getUnitCode(), k) && !unit.getIsMaster()).count());
// 该单位负责的提案
List<String> thisUnitProposalIds = v.stream().map(ProposalReplyUnit::getProposalId).toList();
List<ProcessInstance> instances = dao.query(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "in", thisUnitProposalIds));
List<Long> thisUnitInstIds = instances.stream().map(ProcessInstance::getId).toList();
// 反馈评分记录
List<ProcessTask> feedbackTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", thisUnitInstIds)
.and(ProcessTask::getTaskName, "=", "feedback")
.and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode()));
for (Sys_dict code : feedbackCodes) {
long count = feedbackTasks.stream().filter(task -> FlowUtil.variableToNutMap(task.getVariable()).getString("tf_feedback", "").equals(code.getCode())).map(ProcessTask::getProcessInstanceId).distinct().count();
tableRow.put(code.getCode(), count);
} }
tableRow.put("name", undertakeMap.get(underTakeId).getName()); tableData.add(tableRow);
});
//找出承办提案总数 return Result.success(tableData);
long sum = caseTasks.stream()
.filter(v -> {
NutMap variable = Json.fromJson(NutMap.class, v.getVariable());
if (variable == null) {
return false;
}
String hostUnitId = variable.getString("tf_hostUnitId");
List<String> helpUnitIds = variable.getAsList("tf_helpUnitIds", String.class);
boolean isHost = underTakeId != null && underTakeId.equals(hostUnitId);
boolean isHelper = helpUnitIds != null && helpUnitIds.contains(underTakeId);
return isHost || isHelper;
})
.map(ProcessTask::getProcessInstanceId)
.distinct()
.count();
// 主办提案数量
long hostSum = masterUnitTasks.stream().map(v -> Json.fromJson(NutMap.class, v.getVariable())).filter(variable -> underTakeId.equals(variable.getString("unitId")) && variable.getBoolean("isMaster")).count();
// 协办提案数量
long slaveSum = slaveUnitTasks.stream().map(v -> Json.fromJson(NutMap.class, v.getVariable())).filter(variable -> underTakeId.equals(variable.getString("unitId")) && !variable.getBoolean("isMaster")).count();
// 满意
// allUnitTasks
}
return Result.success();
} }
@@ -85,7 +85,9 @@ public class ProposalExpeditingController {
IFNULL(GROUP_CONCAT(DISTINCT nt.taskName),'结束') curTaskKey, IFNULL(GROUP_CONCAT(DISTINCT nt.taskName),'结束') curTaskKey,
CASE WHEN t.taskState = 20 AND ( rt.id IS NULL OR rt.taskState = 10 ) THEN 1 ELSE 0 END AS canRevoke, CASE WHEN t.taskState = 20 AND ( rt.id IS NULL OR rt.taskState = 10 ) THEN 1 ELSE 0 END AS canRevoke,
t.variable->>'$.unitName' AS taskUnitName, t.variable->>'$.unitName' AS taskUnitName,
IF(JSON_EXTRACT(t.variable, '$.isMaster') = true, 1, 0) AS taskIsMaster IF(JSON_EXTRACT(t.variable, '$.isMaster') = true, 1, 0) AS taskIsMaster,
ta.actorName,
ta.actorAccount
FROM FROM
wf_process_task t wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
@@ -5,13 +5,8 @@ import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination; import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result; import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.flow.engine.FlowEngine; import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.zhgh.democratic.proposal.controller.vo.ProposalInfoPageVO;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalReplyUnit;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalSeconded;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalQueryComprehensiveParam; import com.budwk.app.zhgh.democratic.proposal.param.ProposalQueryComprehensiveParam;
import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
@@ -78,7 +78,7 @@ public class ProposalCommitteeFilingController {
$condition $condition
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "9846ab38-40c5-4093-bafc-a9b3b443338b"); cnd.and("t.taskName", "=", "committee");
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){ if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
} }
@@ -105,7 +105,7 @@ public class ProposalDelegationController {
$condition $condition
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "93d5ba64-8220-4e62-9783-83422f474b36"); cnd.and("t.taskName", "=", "delegation");
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){ if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
@@ -92,7 +92,7 @@ public class ProposalFeedbackEvaluationController {
$condition $condition
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "013a7cf9-20dd-4188-a196-53fd595448e5"); cnd.and("t.taskName", "=", "feedback");
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) { if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
@@ -12,7 +12,6 @@ import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowEngine; import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.entity.ProcessInstance; import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.entity.ProcessTaskActor;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum; import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.flow.service.FlowCommonService; import com.budwk.app.flow.service.FlowCommonService;
@@ -21,6 +20,7 @@ import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.democratic.proposal.controller.vo.ProposalInviteSeconderVO; import com.budwk.app.zhgh.democratic.proposal.controller.vo.ProposalInviteSeconderVO;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig; import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalSecond;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam; import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam;
import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
@@ -42,6 +42,7 @@ import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param; import org.nutz.mvc.annotation.Param;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.Date;
import java.util.List; import java.util.List;
@IocBean @IocBean
@@ -123,7 +124,7 @@ public class ProposalMineController {
@At @At
@SaCheckPermission("proposal.mine") @SaCheckPermission("proposal.mine")
@Aop(TransAop.READ_COMMITTED) @Aop(TransAop.READ_COMMITTED)
public Result selectOne(@Valid String id){ public Result selectOne(@Valid String id) {
Sql sql = Sqls.create(""" Sql sql = Sqls.create("""
SELECT SELECT
info.*, info.*,
@@ -189,22 +190,26 @@ public class ProposalMineController {
String delegationId, boolean isInvite) { String delegationId, boolean isInvite) {
// 查询已经邀请的附议人 // 查询已经邀请的附议人
ProcessInstance processInstance = dao.fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", proposalId)); List<ProposalSecond> seconds = dao.query(ProposalSecond.class, Cnd.where(ProposalSecond::getProposalId, "=", proposalId));
// 查询最新一次的邀请附议人任务
ProcessTask inviteTask = dao.fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId())
.and(ProcessTask::getTaskName, "=", "85b7b9bd-d706-48cb-99a1-ef1370fb1819")
.and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode()))
.desc(ProcessTask::getCreatedAt));
List<ProcessTask> taskList = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId())
.and(ProcessTask::getTaskName, "=", "74458b33-ad6e-46c4-b8d9-1aa897142b25")
.and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode()))
.and(ProcessTask::getId, ">", inviteTask.getId())
);
List<ProcessTaskActor> taskActors = dao.query(ProcessTaskActor.class, Cnd.where(ProcessTaskActor::getProcessTaskId, "in", taskList.stream().map(ProcessTask::getId).toList())); // // 查询已经邀请的附议人
// ProcessInstance processInstance = dao.fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", proposalId));
//
// // 查询最新一次的邀请附议人任务
// ProcessTask inviteTask = dao.fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId())
// .and(ProcessTask::getTaskName, "=", "invite")
// .and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode()))
// .desc(ProcessTask::getCreatedAt));
//
// List<ProcessTask> taskList = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId())
// .and(ProcessTask::getTaskName, "=", "second")
// .and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode()))
// .and(ProcessTask::getId, ">", inviteTask.getId())
// );
//
//
// List<ProcessTaskActor> taskActors = dao.query(ProcessTaskActor.class, Cnd.where(ProcessTaskActor::getProcessTaskId, "in", taskList.stream().map(ProcessTask::getId).toList()));
Sql sql = Sqls.create(""" Sql sql = Sqls.create("""
SELECT SELECT
@@ -213,6 +218,7 @@ public class ProposalMineController {
t1.sex, t1.sex,
t1.unitName, t1.unitName,
t1.unionName, t1.unionName,
t1.mobile,
t2.NAME AS delegationName t2.NAME AS delegationName
FROM FROM
teacher_congress_delegate t1 teacher_congress_delegate t1
@@ -225,9 +231,9 @@ public class ProposalMineController {
cnd.and("t1.loginName", "!=", SecurityUtil.getUserLoginname()); cnd.and("t1.loginName", "!=", SecurityUtil.getUserLoginname());
if (isInvite) { if (isInvite) {
cnd.and("t1.loginName", "in", taskActors.stream().map(ProcessTaskActor::getActorAccount).toList()); cnd.and("t1.loginName", "in", seconds.stream().map(ProposalSecond::getLoginName).toList());
} else { } else {
cnd.andEX("t1.loginName", "not in", taskActors.stream().map(ProcessTaskActor::getActorAccount).toList()); cnd.andEX("t1.loginName", "not in", seconds.stream().map(ProposalSecond::getLoginName).toList());
} }
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
@@ -239,59 +245,6 @@ public class ProposalMineController {
sql.setCondition(cnd); sql.setCondition(cnd);
Pagination<ProposalInviteSeconderVO> pagination = proposalCommonService.listPageVO(pageForm, sql, ProposalInviteSeconderVO.class); Pagination<ProposalInviteSeconderVO> pagination = proposalCommonService.listPageVO(pageForm, sql, ProposalInviteSeconderVO.class);
return Result.success(pagination); return Result.success(pagination);
// if (isInvite) {
// // 先执行条件过滤再手动分页
// List<ProposalInviteSeconderVO> pageList = voList;
// if (StrUtil.isNotBlank(delegationId)) {
// pageList = voList.stream().filter(vo -> vo.getDelegationId().equals(delegationId)).toList();
// }
// if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
// pageList = voList.stream().filter(vo -> (vo.getLoginName().contains(pageForm.getSearchKeyword()) || vo.getUserName().contains(pageForm.getSearchKeyword()))).toList();
// }
//
// pageList = pageList.stream()
// .skip((long) (pageForm.getPageNumber() - 1) * pageForm.getPageSize()).limit(pageForm.getPageSize()).toList();
//
// Pagination<ProposalInviteSeconderVO> pagination = new Pagination<>();
// pagination.setList(pageList);
// pagination.setPageNo(pageForm.getPageNumber());
// pagination.setPageSize(pageForm.getPageSize());
// pagination.setTotalCount(voList.size());
// return Result.success(pagination);
// } else {
// // 查询可邀请的附议人
// Sql sql = Sqls.create("""
// SELECT
// t1.loginName,
// t1.userName,
// t1.sex,
// t1.unitName,
// t1.unionName,
// t2.NAME AS delegationName
// FROM
// teacher_congress_delegate t1
// LEFT JOIN teacher_congress_delegation t2 ON t2.id = t1.delegationId
// $condition
// """);
// Cnd cnd = Cnd.where("t1.sessionId", "=", sessionId);
// cnd.andEX("t1.delegationId", "=", delegationId);
// cnd.and("t1.roleId", "=", "72e24b5b4c4f4e90a6641e6af8487e42");
// cnd.and("t1.loginName", "!=", SecurityUtil.getUserLoginname());
// // 过滤到已邀请的附议人
// cnd.and("t1.loginName", "not in", voList.stream().map(ProposalInviteSeconderVO::getLoginName).toList());
//
// if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
// SqlExpressionGroup seg = new SqlExpressionGroup();
// seg.orLike("t1.loginName", pageForm.getSearchKeyword());
// seg.orLike("t1.userName", pageForm.getSearchKeyword());
// cnd.and(seg);
// }
// sql.setCondition(cnd);
// Pagination<ProposalInviteSeconderVO> pagination = proposalCommonService.listPageVO(pageForm, sql, ProposalInviteSeconderVO.class);
// return Result.success(pagination);
// }
} }
@At @At
@@ -304,12 +257,13 @@ public class ProposalMineController {
// 查询最新一次的邀请附议人任务 // 查询最新一次的邀请附议人任务
ProcessTask inviteTask = dao.fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId()) ProcessTask inviteTask = dao.fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId())
.and(ProcessTask::getTaskName, "=", "85b7b9bd-d706-48cb-99a1-ef1370fb1819") .and(ProcessTask::getTaskName, "=", "invite")
.and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode())) .and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode()))
.desc(ProcessTask::getCreatedAt)); .desc(ProcessTask::getCreatedAt));
// 已完成附议的代表
List<ProcessTask> taskList = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId()) List<ProcessTask> taskList = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId())
.and(ProcessTask::getTaskName, "=", "74458b33-ad6e-46c4-b8d9-1aa897142b25") .and(ProcessTask::getTaskName, "=", "second")
.and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode())) .and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode()))
.and(ProcessTask::getId, ">", inviteTask.getId()) .and(ProcessTask::getId, ">", inviteTask.getId())
); );
@@ -330,7 +284,7 @@ public class ProposalMineController {
t1.sex, t1.sex,
t1.unitName, t1.unitName,
t1.unionName, t1.unionName,
t1.delegationId, t1.mobile,
t2.NAME AS delegationName t2.NAME AS delegationName
FROM FROM
teacher_congress_delegate t1 teacher_congress_delegate t1
@@ -344,7 +298,7 @@ public class ProposalMineController {
// 获取正在执行的任务(邀请附议人||提案附议) // 获取正在执行的任务(邀请附议人||提案附议)
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(processInstance.getId(), null); List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(processInstance.getId(), null);
if (doingTaskList.stream().anyMatch(task -> task.getTaskName().equals("85b7b9bd-d706-48cb-99a1-ef1370fb1819"))) { if (doingTaskList.stream().anyMatch(task -> task.getTaskName().equals("invite"))) {
// 完成邀请任务并添加附议人 // 完成邀请任务并添加附议人
for (ProcessTask task : doingTaskList) { for (ProcessTask task : doingTaskList) {
Dict args = Dict.create(); Dict args = Dict.create();
@@ -366,6 +320,22 @@ public class ProposalMineController {
dao.update(inviteTask, "variable"); dao.update(inviteTask, "variable");
} }
// 储存到提案附议表
List<ProposalSecond> secondeds = list.stream().map(item -> {
ProposalSecond seconded = new ProposalSecond();
seconded.setProposalId(proposalId);
seconded.setSeconderId(item.getString("userId"));
seconded.setUserName(item.getString("userName"));
seconded.setLoginName(item.getString("loginName"));
seconded.setUnitName(item.getString("unitName"));
seconded.setUnionName(item.getString("unionName"));
seconded.setDelegationName(item.getString("delegationName"));
seconded.setMobile(item.getString("mobile"));
seconded.setInviteTime(new Date());
return seconded;
}).toList();
dao.insert(secondeds);
return Result.success(); return Result.success();
} }
@@ -378,8 +348,8 @@ public class ProposalMineController {
String measures = HtmlUtil.cleanHtmlTag(StrUtil.nullToDefault(info.getMeasures(), "")); String measures = HtmlUtil.cleanHtmlTag(StrUtil.nullToDefault(info.getMeasures(), ""));
String brief = HtmlUtil.cleanHtmlTag(StrUtil.nullToDefault(info.getBrief(), "")); String brief = HtmlUtil.cleanHtmlTag(StrUtil.nullToDefault(info.getBrief(), ""));
if (StrUtil.isBlank(info.getSessionId()) || StrUtil.isBlank(info.getDelegationId()) if (StrUtil.isBlank(info.getSessionId())
|| StrUtil.isBlank(info.getName()) || StrUtil.isBlank(info.getDelegationId())
|| StrUtil.isBlank(info.getName()) || StrUtil.isBlank(info.getName())
|| StrUtil.isBlank(info.getBrief()) || StrUtil.isBlank(info.getBrief())
|| StrUtil.isBlank(measures) || StrUtil.isBlank(measures)
@@ -97,7 +97,7 @@ public class ProposalSchoolLeaderApprovalController {
$condition $condition
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "04ecf80c-a9d0-4986-8aac-231758d6a7af"); cnd.and("t.taskName", "=", "school_leader");
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) { if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
@@ -1,36 +1,28 @@
package com.budwk.app.zhgh.democratic.proposal.controller.transact; package com.budwk.app.zhgh.democratic.proposal.controller.transact;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination; import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result; import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService; import com.budwk.app.base.service.BaseService;
import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import com.budwk.app.bpm.service.BpmService; import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.democratic.proposal.controller.vo.ProposalInfoPageVO;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam; import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam;
import com.budwk.app.zhgh.democratic.proposal.service.ProposalSecondedService; import com.budwk.app.zhgh.democratic.proposal.service.ProposalSecondedService;
import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd; import org.nutz.dao.Cnd;
import org.nutz.dao.Dao; import org.nutz.dao.Dao;
import org.nutz.dao.Sqls; import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql; import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.List; import java.util.List;
@@ -107,9 +99,9 @@ public class ProposalSecondedController {
$condition $condition
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "74458b33-ad6e-46c4-b8d9-1aa897142b25"); cnd.and("t.taskName", "=", "second");
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){ if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
} }
@@ -122,7 +114,11 @@ public class ProposalSecondedController {
cnd.groupBy("t.id"); cnd.groupBy("t.id");
cnd.desc("t.createdAt"); cnd.desc("t.createdAt");
sql.setCondition(cnd); sql.setCondition(cnd);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(),pageForm.getPageSize(), sql); Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
List<NutMap> list = pagination.getList(NutMap.class);
for (NutMap row : list) {
// String instanceId = row.getString("instanceId");
}
return Result.success(pagination); return Result.success(pagination);
} }
@@ -5,23 +5,31 @@ import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination; import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result; import com.budwk.app.base.result.Result;
import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.flow.service.ProcessTaskService; import com.budwk.app.flow.service.ProcessTaskService;
import com.budwk.app.sys.models.Sys_role;
import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.sys.services.SysRoleService;
import com.budwk.app.sys.services.SysUserService;
import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam; import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam;
import com.budwk.app.zhgh.democratic.proposal.service.ProposalUnderTakeReplyService;
import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd; import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls; import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql; import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap; import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.List; import java.util.List;
@@ -37,7 +45,13 @@ public class ProposalUnderTakeReplyController {
@Inject @Inject
private ProposalCommonService proposalCommonService; private ProposalCommonService proposalCommonService;
@Inject @Inject
private ProposalUnderTakeReplyService proposalUnderTakeReplyService; private FlowCommonService flowCommonService;
@Inject
private ProcessTaskService processTaskService;
@Inject
private SysRoleService sysRoleService;
@Inject
private SysUserService sysUserService;
@At("") @At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/transact/unitReply/index.html") @Ok("beetl:/platform/zhgh/democratic/proposal/transact/unitReply/index.html")
@@ -78,8 +92,10 @@ public class ProposalUnderTakeReplyController {
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName, IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IFNULL(GROUP_CONCAT(DISTINCT nt.taskName),'结束') curTaskKey, IFNULL(GROUP_CONCAT(DISTINCT nt.taskName),'结束') curTaskKey,
CASE WHEN t.taskState = 20 AND ( rt.id IS NULL OR rt.taskState = 10 ) THEN 1 ELSE 0 END AS canRevoke, CASE WHEN t.taskState = 20 AND ( rt.id IS NULL OR rt.taskState = 10 ) THEN 1 ELSE 0 END AS canRevoke,
t.variable->>'$.unitName' AS taskUnitName, t.variable->>'$.underTakeName' AS underTakeName,
IF(JSON_EXTRACT(t.variable, '$.isMaster') = true, 1, 0) AS taskIsMaster IF(JSON_EXTRACT(t.variable, '$.underTakeIsMaster') = true, 1, 0) AS underTakeIsMaster,
t.variable->>'$.tf_transferUserId' AS tf_transferUserId,
transferUser.username AS transferUserName
FROM FROM
wf_process_task t wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
@@ -90,17 +106,18 @@ public class ProposalUnderTakeReplyController {
LEFT JOIN proposal_type type on type.id = info.typeId LEFT JOIN proposal_type type on type.id = info.typeId
LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId
LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId
LEFT JOIN sys_user transferUser on transferUser.id = t.variable->>'$.tf_transferUserId'
$condition $condition
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "in", List.of("85cf23da-2dd5-4007-a1e9-bd9bfddc68f0", "c9a1586e-272b-41b8-b438-0be9f9e3781d","5ed5a1be-0cd3-4b47-a0d5-238d53b61f34")); cnd.and("t.taskName", "in", List.of("master_reply", "slave_reply", "opinion_master_reply"));
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) { if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
} }
if (approval) { if (approval) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.TRANSFER.getCode()));
} else { } else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
} }
@@ -113,12 +130,12 @@ public class ProposalUnderTakeReplyController {
List<NutMap> list = pagination.getList(); List<NutMap> list = pagination.getList();
for (NutMap row : list) { for (NutMap row : list) {
if (row.getInt("taskIsMaster") == 1) { if (row.getInt("taskIsMaster") == 1) {
boolean b = Stream.of("85cf23da-2dd5-4007-a1e9-bd9bfddc68f0", "c9a1586e-272b-41b8-b438-0be9f9e3781d", "04ecf80c-a9d0-4986-8aac-231758d6a7af") boolean b = Stream.of("master_reply", "slave_reply", "school_leader")
.anyMatch(a -> row.getString("curTaskKey").contains(a)); .anyMatch(a -> row.getString("curTaskKey").contains(a));
row.setv("canRevoke",b && row.getInt("taskState") == ProcessTaskStateEnum.FINISHED.getCode()); row.setv("canRevoke", b && row.getInt("taskState") == ProcessTaskStateEnum.FINISHED.getCode());
}else{ } else {
boolean b = Stream.of("85cf23da-2dd5-4007-a1e9-bd9bfddc68f0", "c9a1586e-272b-41b8-b438-0be9f9e3781d").anyMatch(a -> row.getString("curTaskKey").contains(a)); boolean b = Stream.of("master_reply", "slave_reply").anyMatch(a -> row.getString("curTaskKey").contains(a));
row.setv("canRevoke",b && row.getInt("taskState") == ProcessTaskStateEnum.FINISHED.getCode()); row.setv("canRevoke", b && row.getInt("taskState") == ProcessTaskStateEnum.FINISHED.getCode());
} }
} }
pagination.setList(list); pagination.setList(list);
@@ -126,4 +143,46 @@ public class ProposalUnderTakeReplyController {
return Result.success(pagination); return Result.success(pagination);
} }
@At
@SaCheckPermission("proposal.unitReply")
@ApiOperation("查询本单位可转办用户")
public Result selectViceUser(@Param("keyword") @Valid String keyword) {
Sql sql = Sqls.create("select id,loginname,username from vw_user $condition");
Cnd cnd = Cnd.NEW();
cnd.andEX("unitId", "=", SecurityUtil.getUnitId());
cnd.andEX("id", "!=", SecurityUtil.getUserId());
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("username", keyword);
seg.orLike("loginname", keyword);
cnd.and(seg);
sql.setCondition(cnd);
sql.setParam("unitId", SecurityUtil.getUnitId());
sql.setParam("userId", SecurityUtil.getUserId());
Pagination pagination = proposalCommonService.listPageMap(1, 10, sql);
return Result.success(pagination.getList());
}
@At
@SaCheckPermission("proposal.unitReply")
@ApiOperation("转办")
@Aop(TransAop.READ_COMMITTED)
public Result transfer(@Param("taskId") @Valid Long taskId, @Param("userId") @Valid String userId) {
// 此处设置转办用户的角色即可
Sys_role proxyRole = sysRoleService.getByCode(RoleConstant.PROPOSAL_UNIT_PROXY);
int count = sysRoleService.dao().count(Sys_user_role.class, Cnd.where(Sys_user_role::getUserId, "=", userId).and(Sys_user_role::getRoleId, "=", proxyRole.getId()));
if (count == 0) {
// 添加转办用户的角色
Sys_user_role userRole = new Sys_user_role();
userRole.setUserId(userId);
userRole.setRoleId(proxyRole.getId());
sysRoleService.insert(userRole);
sysUserService.clearCache();
sysRoleService.clearCache();
}
processTaskService.transfer(taskId, userId);
return Result.success();
}
} }
@@ -26,14 +26,14 @@ public class ProposalMasterUnitAssignmentHandler implements AssignmentHandler {
SysRoleService sysRoleService = ServiceContext.find(SysRoleService.class); SysRoleService sysRoleService = ServiceContext.find(SysRoleService.class);
// 主办单位id // 主办单位id
String hostUnitId = execution.getArgs().getStr("tf_hostUnitId"); String masterUnitId = execution.getArgs().getStr("tf_masterUnitId");
if (StrUtil.isBlank(hostUnitId)) { if (StrUtil.isBlank(masterUnitId)) {
throw new BaseException("请选择主办单位"); throw new BaseException("请选择主办单位");
} }
// 获取主办单位 // 获取主办单位
ProposalUndertake undertake = dao.fetch(ProposalUndertake.class, hostUnitId); ProposalUndertake undertake = dao.fetch(ProposalUndertake.class, masterUnitId);
if (undertake == null) { if (undertake == null) {
throw new BaseException("主办单位不存在"); throw new BaseException("主办单位不存在");
@@ -38,7 +38,7 @@ public class ProposalSlaveUnitAssignmentHandler implements AssignmentHandler {
SysRoleService sysRoleService = ServiceContext.find(SysRoleService.class); SysRoleService sysRoleService = ServiceContext.find(SysRoleService.class);
// 协办单位id // 协办单位id
List<String> helpUnitIds = (List<String>) execution.getArgs().get("tf_helpUnitIds"); List<String> helpUnitIds = (List<String>) execution.getArgs().get("tf_slaveUnitIds");
if (helpUnitIds != null && !helpUnitIds.isEmpty()) { if (helpUnitIds != null && !helpUnitIds.isEmpty()) {
Sys_role sysRole = sysRoleService.getByCode(RoleConstant.PROPOSAL_UNIT_LEADER); Sys_role sysRole = sysRoleService.getByCode(RoleConstant.PROPOSAL_UNIT_LEADER);
@@ -1,5 +1,8 @@
package com.budwk.app.zhgh.democratic.proposal.interceptor; package com.budwk.app.zhgh.democratic.proposal.interceptor;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.flow.constant.FlowConst; import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowInterceptor; import com.budwk.app.flow.engine.FlowInterceptor;
import com.budwk.app.flow.engine.core.Execution; import com.budwk.app.flow.engine.core.Execution;
@@ -7,7 +10,11 @@ import com.budwk.app.flow.engine.core.ServiceContext;
import com.budwk.app.flow.entity.ProcessInstance; import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.entity.ProcessTaskActor; import com.budwk.app.flow.entity.ProcessTaskActor;
import com.budwk.app.sys.models.Sys_role;
import com.budwk.app.sys.services.SysRoleService;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalReplyUnit;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake;
import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain; import org.nutz.dao.Chain;
import org.nutz.dao.Cnd; import org.nutz.dao.Cnd;
@@ -26,28 +33,75 @@ public class ProposalCaseFilingInterceptor implements FlowInterceptor {
@Aop(TransAop.READ_COMMITTED) @Aop(TransAop.READ_COMMITTED)
public void intercept(Execution execution) { public void intercept(Execution execution) {
Dao dao = ServiceContext.find(Dao.class); Dao dao = ServiceContext.find(Dao.class);
SysRoleService sysRoleService = ServiceContext.find(SysRoleService.class);
// 获取负责人
Sys_role sysRole = sysRoleService.getByCode(RoleConstant.PROPOSAL_UNIT_LEADER);
// 提案ID
String proposalId = execution.getProcessInstance().getBusinessNo();
List<ProcessTask> processTaskList = execution.getProcessTaskList(); List<ProcessTask> processTaskList = execution.getProcessTaskList();
for (ProcessTask task : processTaskList) { for (ProcessTask task : processTaskList) {
NutMap variable = Json.fromJson(NutMap.class, task.getVariable()); NutMap variable = Json.fromJson(NutMap.class, task.getVariable());
ProcessTaskActor taskActor = dao.fetch(ProcessTaskActor.class, Cnd.where(ProcessTaskActor::getProcessTaskId, "=", task.getId())); ProcessTaskActor taskActor = dao.fetch(ProcessTaskActor.class, Cnd.where(ProcessTaskActor::getProcessTaskId, "=", task.getId()));
// 单位名称 // 单位名称
variable.setv("unitName", taskActor.getActorUnitName());
variable.setv("unitId", taskActor.getActorUnitId()); variable.setv("underTakeName", taskActor.getActorUnitName());
variable.setv("underTakeId", taskActor.getActorUnitId());
// 是否主办 // 是否主办
variable.setv("isMaster", task.getTaskName().equals("85cf23da-2dd5-4007-a1e9-bd9bfddc68f0")); variable.setv("isMaster", task.getTaskName().equals("master_reply") || task.getTaskName().equals("opinion_master_reply"));
variable.setv("underTakeIsMaster", List.of("master_reply", "opinion_master_reply").contains(task.getTaskName()));
task.setVariable(Json.toJson(variable)); task.setVariable(Json.toJson(variable));
} }
// 更新立案结果 // 立案结果
String caseFilingResult = execution.getArgs().getStr(FlowConst.TASK_FORM_DATA_PREFIX + "caseFilingResult");
// 储存承办单位
if (StrUtil.isNotBlank(caseFilingResult) && List.of("CONFIRM_FILING", "SUGGESTION").contains(caseFilingResult)) {
// 删除原来的记录
dao.clear(ProposalReplyUnit.class,Cnd.where(ProposalReplyUnit::getProposalId, "=", proposalId));
// 主办单位
String masterUnitId = execution.getArgs().getStr(FlowConst.TASK_FORM_DATA_PREFIX + "masterUnitId");
ProposalUndertake masterUnit = dao.fetch(ProposalUndertake.class, masterUnitId);
ProposalReplyUnit masterReplyUnit = new ProposalReplyUnit();
masterReplyUnit.setProposalId(proposalId);
masterReplyUnit.setUnitId(masterUnit.getId());
masterReplyUnit.setUnitCode(masterUnit.getCode());
masterReplyUnit.setUnitName(masterUnit.getName());
masterReplyUnit.setIsMaster(true);
dao.insert(masterReplyUnit);
// 协办单位
List<String> helpUnitIds = (List<String>) execution.getArgs().getObj(FlowConst.TASK_FORM_DATA_PREFIX + "slaveUnitIds");
if(ObjectUtil.isNotEmpty(helpUnitIds)){
for (String helpUnitId : helpUnitIds) {
ProposalUndertake helpUnit = dao.fetch(ProposalUndertake.class, helpUnitId);
ProposalReplyUnit helpReplyUnit = new ProposalReplyUnit();
helpReplyUnit.setProposalId(proposalId);
helpReplyUnit.setUnitId(helpUnit.getId());
helpReplyUnit.setUnitCode(helpUnit.getCode());
helpReplyUnit.setUnitName(helpUnit.getName());
helpReplyUnit.setIsMaster(false);
dao.insert(helpReplyUnit);
}
}
}
// 更新立案结果、立案类型
ProcessInstance processInstance = execution.getProcessInstance(); ProcessInstance processInstance = execution.getProcessInstance();
String businessNo = processInstance.getBusinessNo(); String businessNo = processInstance.getBusinessNo();
dao.update(ProposalInfo.class, Chain.make("caseFilingResult", execution.getArgs().getStr(FlowConst.TASK_FORM_DATA_PREFIX + "caseFilingResult")), Cnd.where(ProposalInfo::getId, "=", businessNo));
Chain chain = Chain.make("caseFilingResult", execution.getArgs().getStr(FlowConst.TASK_FORM_DATA_PREFIX + "caseFilingResult"));
chain.add("caseFilingType", execution.getArgs().getStr(FlowConst.TASK_FORM_DATA_PREFIX + "caseFilingType"));
dao.update(ProposalInfo.class, chain, Cnd.where(ProposalInfo::getId, "=", businessNo));
dao.update(processTaskList, "variable"); dao.update(processTaskList, "variable");
} }
@@ -18,7 +18,7 @@ import java.util.List;
@TableMeta("{'mysql-charset':'utf8mb4'}") @TableMeta("{'mysql-charset':'utf8mb4'}")
@Comment("提案信息") @Comment("提案信息")
@TableIndexes({ @TableIndexes({
@Index(name = "INDEX_PROPOSAL_INFO_SESSION_CODE", fields = {"sessionId","code"}) @Index(name = "INDEX_PROPOSAL_INFO_SESSION_CODE", fields = {"sessionId", "code"})
}) })
public class ProposalInfo extends BaseModel { public class ProposalInfo extends BaseModel {
@@ -55,6 +55,11 @@ public class ProposalInfo extends BaseModel {
@ColDefine(type = ColType.VARCHAR, width = 32) @ColDefine(type = ColType.VARCHAR, width = 32)
private String caseFilingResult; private String caseFilingResult;
@Column
@Comment("立案类型(重点、普通提案)")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String caseFilingType;
@Column @Column
@Comment("教代会ID") @Comment("教代会ID")
@ColDefine(type = ColType.VARCHAR, width = 32) @ColDefine(type = ColType.VARCHAR, width = 32)
@@ -1,55 +0,0 @@
package com.budwk.app.zhgh.democratic.proposal.models;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@Table("proposal_reply_unit")
@TableMeta("{'mysql-charset':'utf8mb4'}")
@Comment("提案答复表")
public class ProposalReply extends BaseModel {
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("提案ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String proposalId;
@Column
@Comment("承办单位ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unitId;
@Column
@Comment("承办单位code")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String unitCode;
@Column
@Comment("承办单位名称")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String unitName;
@Column
@Comment("是否主办单位")
@ColDefine(type = ColType.BOOLEAN)
@Default("0")
private Boolean isMaster;
@Column
@Comment("是否答复")
@ColDefine(type = ColType.BOOLEAN)
@Default("0")
private Boolean isReply;
}
@@ -11,10 +11,10 @@ import java.util.Date;
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Table("proposal_seconded") @Table("proposal_second")
@TableMeta("{'mysql-charset':'utf8mb4'}") @TableMeta("{'mysql-charset':'utf8mb4'}")
@Comment("提案附议信息") @Comment("提案附议信息")
public class ProposalSeconded extends BaseModel { public class ProposalSecond extends BaseModel {
@Name @Name
@Comment("ID") @Comment("ID")
@@ -35,22 +35,32 @@ public class ProposalSeconded extends BaseModel {
@Column @Column
@Comment("附议人姓名") @Comment("附议人姓名")
@ColDefine(type = ColType.VARCHAR, width = 100) @ColDefine(type = ColType.VARCHAR, width = 100)
private String seconderName; private String userName;
@Column @Column
@Comment("附议人工号") @Comment("附议人工号")
@ColDefine(type = ColType.VARCHAR, width = 100) @ColDefine(type = ColType.VARCHAR, width = 100)
private String seconderLoginName; private String loginName;
@Column @Column
@Comment("附议人单位") @Comment("附议人单位")
@ColDefine(type = ColType.VARCHAR, width = 255) @ColDefine(type = ColType.VARCHAR, width = 255)
private String seconderUnitName; private String unitName;
@Column
@Comment("附议人分工会")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String unionName;
@Column
@Comment("附议人代表团")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String delegationName;
@Column @Column
@Comment("附议人手机号") @Comment("附议人手机号")
@ColDefine(type = ColType.VARCHAR, width = 32) @ColDefine(type = ColType.VARCHAR, width = 32)
private String seconderMobile; private String mobile;
@Column @Column
@Comment("附议时间") @Comment("附议时间")
@@ -62,11 +72,6 @@ public class ProposalSeconded extends BaseModel {
@ColDefine(type = ColType.DATETIME) @ColDefine(type = ColType.DATETIME)
private Date inviteTime; private Date inviteTime;
@Column
@Comment("附议人签字id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String seconderSignId;
@Column @Column
@Comment("附议结果") @Comment("附议结果")
@ColDefine(type = ColType.BOOLEAN) @ColDefine(type = ColType.BOOLEAN)
@@ -1,15 +1,9 @@
package com.budwk.app.zhgh.democratic.proposal.service; package com.budwk.app.zhgh.democratic.proposal.service;
import com.budwk.app.base.service.BaseService; import com.budwk.app.base.service.BaseService;
import com.budwk.app.bpm.param.BpmTaskApprovalParam; import com.budwk.app.zhgh.democratic.proposal.models.ProposalSecond;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalSeconded;
public interface ProposalSecondedService extends BaseService<ProposalSeconded> { public interface ProposalSecondedService extends BaseService<ProposalSecond> {
/**
* 附议
* @param approvalParam
*/
void approval(BpmTaskApprovalParam approvalParam);
} }
@@ -15,6 +15,11 @@ public interface ProposalCommonService extends BaseService<ProposalInfo> {
*/ */
NutMap info(String id); NutMap info(String id);
/**
* 导出word
* @param id
* @param response
*/
void exportProposalAsDocx(String id, HttpServletResponse response); void exportProposalAsDocx(String id, HttpServletResponse response);
/** /**
@@ -4,28 +4,24 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HtmlUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.exception.BaseException; import com.budwk.app.base.exception.BaseException;
import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.base.utils.SysOfficeTemplateUtil; import com.budwk.app.base.utils.SysOfficeTemplateUtil;
import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum;
import com.budwk.app.bpm.models.BpmProcessInstance;
import com.budwk.app.bpm.models.BpmProcessTask;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.bpm.vo.BpmProcessTaskVo;
import com.budwk.app.bpm.vo.BpmTaskApprovalRecordVo;
import com.budwk.app.flow.constant.FlowConst; import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.engine.util.FlowUtil;
import com.budwk.app.flow.entity.ProcessInstance; import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessInstanceStateEnum;
import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.flow.vo.ProcessTaskVO;
import com.budwk.app.sys.models.Sys_dict;
import com.budwk.app.sys.models.Sys_role; import com.budwk.app.sys.models.Sys_role;
import com.budwk.app.sys.models.Sys_user; import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.models.Sys_user_role; import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.sys.services.SysDictService;
import com.budwk.app.sys.services.SysRoleService; import com.budwk.app.sys.services.SysRoleService;
import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.commons.base.Globals; import com.budwk.app.web.commons.base.Globals;
@@ -34,10 +30,7 @@ import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import com.budwk.app.zhgh.democratic.teachercongress.prepare.models.Teacher_congress_session; import com.budwk.app.zhgh.democratic.teachercongress.prepare.models.Teacher_congress_session;
import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.AttachmentRenderData;
import com.deepoove.poi.data.Attachments;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy; import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.deepoove.poi.policy.AttachmentRenderPolicy;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.ddr.poi.html.HtmlRenderPolicy; import org.ddr.poi.html.HtmlRenderPolicy;
import org.nutz.dao.Cnd; import org.nutz.dao.Cnd;
@@ -68,9 +61,11 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl<ProposalInfo> imp
@Inject @Inject
private SysRoleService sysRoleService; private SysRoleService sysRoleService;
@Inject @Inject
private BpmService bpmService;
@Inject
private SysOfficeTemplateUtil sysOfficeTemplateUtil; private SysOfficeTemplateUtil sysOfficeTemplateUtil;
@Inject
private FlowEngine flowEngine;
@Inject
private SysDictService sysDictService;
public ProposalCommonServiceImpl(Dao dao) { public ProposalCommonServiceImpl(Dao dao) {
super(dao); super(dao);
@@ -101,59 +96,11 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl<ProposalInfo> imp
WHERE WHERE
info.id = @id info.id = @id
""").setParam("id", id); """).setParam("id", id);
NutMap nutMap = (NutMap) dao().execute(sql.setCallback(Sqls.callback.map())).getResult(); NutMap info = (NutMap) dao().execute(sql.setCallback(Sqls.callback.map())).getResult();
if (StrUtil.isNotBlank(info.getString("suggestUnits"))) {
// List<BpmTaskApprovalRecordVo> nodeTasks = bpmService.getNodeTasks(BpmProcessConstant.PROPOSAL, id); info.put("suggestUnits", String.join(",", Json.fromJson(ArrayList.class, info.getString("suggestUnits"))));
// nutMap.put("nodeTasks", nodeTasks); }
// return info;
// //查询附议人信息
// BpmProcessInstance bpmProcessInstance = dao().fetch(BpmProcessInstance.class, Cnd.where(BpmProcessInstance::getProcessInstanceBusinessId, "=", id));
// BpmProcessTask lastestWriteTask = dao().fetch(BpmProcessTask.class, Cnd.where(BpmProcessTask::getProcessInstanceId, "=", bpmProcessInstance.getId())
// .and(BpmProcessTask::getTaskStatus, "=", BpmProcessTaskStatusEnum.COMPLETE.name())
// .and(BpmProcessTask::getProcessTaskNodeCode, "in", List.of(10, 40, 61))
// .and(BpmProcessTask::getDelFlag, "=", 0)
// .desc(BpmProcessTask::getEndOn)
// );
//
// if (ObjectUtil.isNotEmpty(lastestWriteTask)) {
// String lastestWriteTaskId = lastestWriteTask.getId();
// List<BpmProcessTask> seconderTasks = dao().query(BpmProcessTask.class, Cnd.where(BpmProcessTask::getPrevTaskId, "=", lastestWriteTaskId)
// .and(BpmProcessTask::getProcessInstanceId, "=", bpmProcessInstance.getId())
// .and(BpmProcessTask::getTaskStatus, "!=", BpmProcessTaskStatusEnum.REVOKE.name())
// .and(BpmProcessTask::getDelFlag, "=", 0)
// .asc(BpmProcessTask::getCreatedOn)
// );
// nutMap.put("seconders", seconderTasks);
// }
//
// //查询并案的提案
// List<String> consolidationProposalIds = getConsolidation(id);
// List<String> otherProposalIds = consolidationProposalIds.stream().filter(proposalId -> !proposalId.equals(id)).toList();
// if (ObjectUtil.isNotEmpty(otherProposalIds)) {
// Sql otherProposalSql = Sqls.create("""
// SELECT
// info.id,
// info.name,
// info.code,
// info.createUserName,
// type.name AS typeName,
// tcs.fullName AS sessionName,
// tcd.`name` AS delegationName
// FROM
// proposal_info info
// LEFT JOIN proposal_type type on type.id = info.typeId
// LEFT JOIN teacher_congress_session tcs ON tcs.id = info.sessionId
// LEFT JOIN teacher_congress_delegation tcd ON tcd.id = info.delegationId
// WHERE info.id in (@otherProposalIds)
// """).setParam("otherProposalIds", otherProposalIds);
// List<NutMap> consolidationProposals = listMap(otherProposalSql);
// nutMap.put("consolidationProposals", consolidationProposals);
// nutMap.put("isConsolidation", true);
// } else {
// nutMap.put("consolidationProposals", null);
// nutMap.put("isConsolidation", false);
// }
return nutMap;
} }
@Override @Override
@@ -175,8 +122,6 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl<ProposalInfo> imp
if (id == null || id.isEmpty()) { if (id == null || id.isEmpty()) {
throw new BaseException("提案信息不存在"); throw new BaseException("提案信息不存在");
} }
// 查询提案信息
HashMap<String, Object> docData = new HashMap<>();
//基本信息 //基本信息
Sql sql = Sqls.create(""" Sql sql = Sqls.create("""
@@ -186,6 +131,8 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl<ProposalInfo> imp
info.brief, info.brief,
info.measures, info.measures,
info.createUserName, info.createUserName,
DATE_FORMAT(info.createTime, '%Y年%m月%d日') AS createTime,
info.unitName,
tcde.unitName, tcde.unitName,
tcde.mobile, tcde.mobile,
type.name AS typeName, type.name AS typeName,
@@ -201,26 +148,41 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl<ProposalInfo> imp
""").setParam("id", id); """).setParam("id", id);
sql.setCallback(Sqls.callback.map()); sql.setCallback(Sqls.callback.map());
execute(sql); execute(sql);
NutMap info = (NutMap) sql.getResult(); NutMap docData = (NutMap) sql.getResult();
//处理下富文本 //处理下富文本
String brief = info.getString("brief"); String brief = docData.getString("brief");
String measures = info.getString("measures"); String measures = docData.getString("measures");
info.put("brief", sysOfficeTemplateUtil.convertRichTextToDocText(brief)); docData.put("brief", sysOfficeTemplateUtil.convertRichTextToDocText(brief));
info.put("measures", sysOfficeTemplateUtil.convertRichTextToDocText(measures)); docData.put("measures", sysOfficeTemplateUtil.convertRichTextToDocText(measures));
docData.put("info", info); List<Sys_dict> feedBackDict = sysDictService.getSubListByCode("PROPOSAL_FEEDBACK");
Map<String, String> feedBackMap = feedBackDict.stream().collect(Collectors.toMap(Sys_dict::getCode, Sys_dict::getName));
// 流程实例
ProcessInstance processInstance = dao().fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", id));
List<ProcessTaskVO> doneTaskVos = new ArrayList<>();
List<ProcessTask> doneTaskList = flowEngine.processTaskService().getDoneTaskList(processInstance.getId(), null);
for (ProcessTask doneTask : doneTaskList) {
ProcessTaskVO taskVO = flowEngine.processTaskService().findById(doneTask.getId());
doneTaskVos.add(taskVO);
}
// 按任务节点分组
Map<String, List<ProcessTaskVO>> taskGroups = doneTaskVos.stream().collect(Collectors.groupingBy(ProcessTaskVO::getDisplayName));
docData.putAll(taskGroups);
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy(); HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
htmlRenderPolicy.getConfig().setShowDefaultTableBorderInTableCell(true); htmlRenderPolicy.getConfig().setShowDefaultTableBorderInTableCell(true);
AttachmentRenderPolicy attachmentRenderPolicy = new AttachmentRenderPolicy();
Configure config = Configure.builder() Configure config = Configure.builder()
.bind("seconders", policy) .bind("seconders", policy)
.bind("info.brief", htmlRenderPolicy) .bind("提案附议", policy)
.bind("info.measures", htmlRenderPolicy) .bind("brief", htmlRenderPolicy)
.bind("zbdf.opinion", htmlRenderPolicy) .bind("measures", htmlRenderPolicy)
.bind("attachment", attachmentRenderPolicy) .bind("taskFormData.tf_opinion", htmlRenderPolicy)
.build(); .build();
try { try {
@@ -243,15 +205,13 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl<ProposalInfo> imp
SELECT SELECT
info.name, info.name,
info.code, info.code,
info.excerpt,
info.brief,
info.measures, info.measures,
info.createUserName, info.createUserName,
tcde.unitName,
tcde.mobile,
type.name AS typeName, type.name AS typeName,
tcs.fullName AS sessionName, tcs.fullName AS sessionName,
tcd.`name` AS delegationName tcd.`name` AS delegationName,
tcs.j,
tcs.c
FROM FROM
proposal_info info proposal_info info
LEFT JOIN proposal_type type on type.id = info.typeId LEFT JOIN proposal_type type on type.id = info.typeId
@@ -263,80 +223,46 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl<ProposalInfo> imp
sql.setCallback(Sqls.callback.map()); sql.setCallback(Sqls.callback.map());
execute(sql); execute(sql);
NutMap info = (NutMap) sql.getResult(); NutMap info = (NutMap) sql.getResult();
// String brief = info.getString("brief");
// info.put("brief", sysOfficeTemplateUtil.convertRichTextToDocText(brief));
String excerpt = StrUtil.blankToDefault(info.getString("excerpt"),""); // 获取流程实例
info.put("excerpt", HtmlUtil.cleanHtmlTag(excerpt)); ProcessInstance processInstance = dao().fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", id));
docData.put("info", info); // 主办办理情况
ProcessTask masterUnitReplyTask = dao().fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId())
//审批记录 .and(ProcessTask::getTaskName, "in", List.of("master_reply", "opinion_master_reply"))
List<BpmTaskApprovalRecordVo> nodeTasks = bpmService.getNodeTasks(BpmProcessConstant.PROPOSAL, id); .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode())
.desc(ProcessTask::getFinishTime)
//委员会确认承办单位 );
nodeTasks.stream().filter(v -> v.getNodeCode() == 70) if (masterUnitReplyTask != null) {
.flatMap(v -> v.getTasks().stream()) // 办理解决情况
.max(Comparator.comparing(BpmProcessTaskVo::getEndOn)) String implementState = FlowUtil.variableToDict(masterUnitReplyTask.getVariable()).getStr("tf_implementState");
.ifPresent(v -> { info.put(implementState, "");
HashMap<String, Object> committeeConfirm = new HashMap<>(); // 承办单位名称
committeeConfirm.put("date", DateUtil.format(v.getEndOn(), "yyyy年MM月dd日")); info.put("underTakeName",FlowUtil.variableToDict(masterUnitReplyTask.getVariable()).getStr("underTakeName"));
committeeConfirm.put("user", v.getActualOwnerUserName());
if (ObjectUtil.isNotEmpty(v.getExtVariable())) {
committeeConfirm.put("opinion", v.getExtVariable().getStr("approvalOpinion"));
committeeConfirm.put("sign", sysOfficeTemplateUtil.createPictureRenderData(v.getExtVariable().getStr("approvalSignature")));
committeeConfirm.put("hostUnit", v.getExtVariable().getStr("hostUnit"));
if (ObjectUtil.isNotEmpty(v.getExtVariable().getBeanList("helpUnits", String.class))) {
committeeConfirm.put("helpUnits", String.join("", v.getExtVariable().getBeanList("helpUnits", String.class)));
} }
}
docData.put("wyhConfirm", committeeConfirm);
});
//主办单位答复
nodeTasks.stream().filter(v -> v.getNodeCode() == 80) // 反馈评价
.flatMap(v -> v.getTasks().stream()) ProcessTask feedbackTask = dao().fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId())
.filter(v1 -> ObjectUtil.isNotEmpty(v1.getCreateVariable()) && v1.getCreateVariable().getBool("isMaster")) .and(ProcessTask::getTaskName, "=", "feedback")
.max(Comparator.comparing(BpmProcessTaskVo::getEndOn)) .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode())
.ifPresent(v -> { .desc(ProcessTask::getFinishTime)
HashMap<String, Object> masterUnderTakeReply = new HashMap<>(); );
masterUnderTakeReply.put("name", v.getCreateVariable().getStr("underTakeName")); if (feedbackTask != null) {
masterUnderTakeReply.put("date", DateUtil.format(v.getEndOn(), "yyyy年MM月dd日")); info.put(FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_feedback"), "");
masterUnderTakeReply.put("user", v.getActualOwnerUserName()); info.put("tf_feedback", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_feedback"));
if (ObjectUtil.isNotEmpty(v.getExtVariable())) { info.put("tf_opinion", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_opinion"));
masterUnderTakeReply.put("opinion", v.getExtVariable().getStr("approvalOpinion")); info.put("tf_phone", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_phone"));
masterUnderTakeReply.put("implementState", v.getExtVariable().getStr("implementState")); info.put("tf_address", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_address"));
masterUnderTakeReply.put("sign", sysOfficeTemplateUtil.createPictureRenderData(v.getExtVariable().getStr("approvalSignature"))); info.put("tf_postcode", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_postcode"));
} }
docData.put("zbdf", masterUnderTakeReply);
});
//反馈评分
nodeTasks.stream().filter(v -> v.getNodeCode() == 100)
.flatMap(v -> v.getTasks().stream())
.max(Comparator.comparing(BpmProcessTaskVo::getEndOn))
.ifPresent(v -> {
HashMap<String, Object> feedbackScore = new HashMap<>();
feedbackScore.put("date", DateUtil.format(v.getEndOn(), "yyyy年MM月dd日"));
feedbackScore.put("user", v.getActualOwnerUserName());
if (ObjectUtil.isNotEmpty(v.getExtVariable())) {
feedbackScore.put("opinion", v.getExtVariable().getStr("approvalOpinion"));
String feedBackScore = v.getExtVariable().getStr("feedBackScore", "");
feedbackScore.put("manyi", feedBackScore.equals("满意") ? "" : "");
feedbackScore.put("jibenmanyi", feedBackScore.equals("基本满意") ? "" : "");
feedbackScore.put("bumanyi", feedBackScore.equals("不满意") ? "" : "");
}
docData.put("fk", feedbackScore);
});
HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy(); HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
htmlRenderPolicy.getConfig().setShowDefaultTableBorderInTableCell(true); htmlRenderPolicy.getConfig().setShowDefaultTableBorderInTableCell(true);
Configure config = Configure.builder() Configure config = Configure.builder().build();
.bind("info.excerpt", htmlRenderPolicy)
.bind("zbdf.opinion", htmlRenderPolicy)
.build();
try { try {
XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("proposal_feedback"), config).render(docData).writeAndClose(byteArrayOutputStream); XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("proposal_feedback"), config).render(info).writeAndClose(byteArrayOutputStream);
} catch (IOException e) { } catch (IOException e) {
log.error("提案导出失败{},提案id:{}", e.getMessage(), id); log.error("提案导出失败{},提案id:{}", e.getMessage(), id);
} }
@@ -10,6 +10,7 @@ import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.base.utils.SysOfficeTemplateUtil; import com.budwk.app.base.utils.SysOfficeTemplateUtil;
import com.budwk.app.flow.constant.FlowConst; import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.util.FlowUtil;
import com.budwk.app.flow.entity.ProcessInstance; import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.flow.enums.ProcessTaskStateEnum;
@@ -38,7 +39,6 @@ import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -186,8 +186,8 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
// 添加序号,去除富文本,获取附议人 // 添加序号,去除富文本,获取附议人
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
list.get(i).put("index", i + 1); list.get(i).put("index", i + 1);
list.get(i).put("brief",HtmlUtil.cleanHtmlTag(list.get(i).getString("brief"))); list.get(i).put("brief", HtmlUtil.cleanHtmlTag(list.get(i).getString("brief")));
list.get(i).put("measures",HtmlUtil.cleanHtmlTag(list.get(i).getString("measures"))); list.get(i).put("measures", HtmlUtil.cleanHtmlTag(list.get(i).getString("measures")));
// 流程实例 // 流程实例
ProcessInstance instance = dao().fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", list.get(i).getString("id"))); ProcessInstance instance = dao().fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", list.get(i).getString("id")));
@@ -203,7 +203,7 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
if (inviteTask != null) { if (inviteTask != null) {
NutMap variable = Json.fromJson(NutMap.class, inviteTask.getVariable()); NutMap variable = Json.fromJson(NutMap.class, inviteTask.getVariable());
List<NutMap> seconders = variable.getAsList(FlowConst.TASK_FORM_DATA_PREFIX + "seconder", NutMap.class); List<NutMap> seconders = variable.getAsList(FlowConst.TASK_FORM_DATA_PREFIX + "seconder", NutMap.class);
list.get(i).put("secondedUserNames", seconders.stream().map(v->v.getString("userName")).collect(Collectors.joining(","))); list.get(i).put("secondedUserNames", seconders.stream().map(v -> v.getString("userName")).collect(Collectors.joining(",")));
} }
} }
@@ -352,6 +352,7 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
$condition $condition
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
cnd.groupBy("info.id");
ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm); ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm);
sql.setCondition(cnd); sql.setCondition(cnd);
List<NutMap> list = listMap(sql); List<NutMap> list = listMap(sql);
@@ -385,13 +386,15 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
SELECT SELECT
info.name, info.name,
info.code, info.code,
DATE_FORMAT(info.createTime, '%Y年%m月%d日') AS createTime,
info.suggestUnits,
info.researchFindings, info.researchFindings,
info.brief, info.brief,
info.measures, info.measures,
info.createUserName, info.createUserName,
type.name AS typeName,
tcde.unitName, tcde.unitName,
tcde.mobile, tcde.mobile,
type.name AS typeName,
tcs.j, tcs.j,
tcs.c, tcs.c,
tcs.fullName AS sessionName, tcs.fullName AS sessionName,
@@ -412,8 +415,10 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
info.put("brief", sysOfficeTemplateUtil.convertRichTextToDocText(info.getString("brief"))); info.put("brief", sysOfficeTemplateUtil.convertRichTextToDocText(info.getString("brief")));
info.put("measures", sysOfficeTemplateUtil.convertRichTextToDocText(info.getString("measures"))); info.put("measures", sysOfficeTemplateUtil.convertRichTextToDocText(info.getString("measures")));
// 添加高校信息 // 处理建议承办单位
info.put("schoolName", Globals.AppName); if(StrUtil.isNotBlank(info.getString("suggestUnits"))){
info.put("suggestUnits", String.join("", Json.fromJsonAsList(String.class, info.getString("suggestUnits"))));
}
// 创建docData,直接复用info中的数据 // 创建docData,直接复用info中的数据
HashMap<String, Object> docData = new HashMap<>(info); HashMap<String, Object> docData = new HashMap<>(info);
@@ -425,7 +430,7 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
// 查询附议人信息 // 查询附议人信息
ProcessTask inviteTask = dao().fetch(ProcessTask.class, ProcessTask inviteTask = dao().fetch(ProcessTask.class,
Cnd.where(ProcessTask::getProcessInstanceId, "=", instance.getId()) Cnd.where(ProcessTask::getProcessInstanceId, "=", instance.getId())
.and(ProcessTask::getTaskName, "=", "85b7b9bd-d706-48cb-99a1-ef1370fb1819") .and(ProcessTask::getTaskName, "=", "invite")
.and(ProcessTask::getTaskState, "in", .and(ProcessTask::getTaskState, "in",
List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode())) List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode()))
.desc(ProcessTask::getCreatedAt)); .desc(ProcessTask::getCreatedAt));
@@ -434,11 +439,26 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
NutMap variable = Json.fromJson(NutMap.class, inviteTask.getVariable()); NutMap variable = Json.fromJson(NutMap.class, inviteTask.getVariable());
if (variable != null) { if (variable != null) {
List<NutMap> seconders = variable.getAsList(FlowConst.TASK_FORM_DATA_PREFIX + "seconder", NutMap.class); List<NutMap> seconders = variable.getAsList(FlowConst.TASK_FORM_DATA_PREFIX + "seconder", NutMap.class);
docData.put("seconders", seconders != null ? seconders : Collections.emptyList()); if(seconders != null){
String secondersNames = seconders.stream().map(seconder -> seconder.getString("userName")).collect(Collectors.joining(""));
docData.put("secondersNames", secondersNames);
} }
} }
} }
// 委员会立案信息
ProcessTask caseTask = dao().fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", instance.getId())
.and(ProcessTask::getTaskName, "=", "committee")
.and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode())
.desc(ProcessTask::getCreatedAt)
);
if (caseTask != null) {
String opinion = FlowUtil.variableToDict(caseTask.getVariable()).getStr("tf_opinion");
docData.put("committeeOpinion", opinion);
}
}
// 配置渲染策略 // 配置渲染策略
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy(); HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
@@ -469,13 +489,13 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
info.name info.name
FROM FROM
proposal_info info proposal_info info
LEFT JOIN proposal_type type on type.id = info.typeId
LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId
LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId
LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName
$condition $condition
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
cnd.groupBy("info.id");
ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm); ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm);
sql.setCondition(cnd); sql.setCondition(cnd);
List<NutMap> list = listMap(sql); List<NutMap> list = listMap(sql);
@@ -1,113 +1,21 @@
package com.budwk.app.zhgh.democratic.proposal.service.impl; package com.budwk.app.zhgh.democratic.proposal.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum;
import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum;
import com.budwk.app.bpm.models.BpmProcessTask;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.sys.services.SysMsgService;
import com.budwk.app.web.controllers.open.commons.service.CommonService; import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig; import com.budwk.app.zhgh.democratic.proposal.models.ProposalSecond;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalSeconded;
import com.budwk.app.zhgh.democratic.proposal.service.ProposalSecondedService; import com.budwk.app.zhgh.democratic.proposal.service.ProposalSecondedService;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao; import org.nutz.dao.Dao;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.ioc.loader.annotation.IocBean;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@IocBean(args = {"refer:dao"}) @IocBean(args = {"refer:dao"})
public class ProposalSecondedServiceImpl extends BaseServiceImpl<ProposalSeconded> implements ProposalSecondedService { public class ProposalSecondedServiceImpl extends BaseServiceImpl<ProposalSecond> implements ProposalSecondedService {
@Inject @Inject
private CommonService commonService; private CommonService commonService;
@Inject
private BpmService bpmService;
@Inject
private SysMsgService sysMsgService;
public ProposalSecondedServiceImpl(Dao dao) { public ProposalSecondedServiceImpl(Dao dao) {
super(dao); super(dao);
} }
@Override
@Aop(TransAop.READ_COMMITTED)
public void approval(BpmTaskApprovalParam approvalParam) {
approvalParam.getBpmTaskApprovalTypeEnum();
// 将审批参数转换为Map
Map<String, Object> variables = BeanUtil.beanToMap(approvalParam);
// 获取提案配置中的最少附议人数
ProposalConfig proposalConfig = dao().fetch(ProposalConfig.class, Cnd.NEW());
Integer seconderNum = proposalConfig.getSeconderNum();
//团长接收人
List<String> assignments = new ArrayList<>();
ProposalInfo proposalInfo = dao().fetch(ProposalInfo.class, approvalParam.getProcessInstanceBusinessId());
BpmProcessTask processTask = dao().fetch(BpmProcessTask.class, approvalParam.getProcessInstanceTaskId());
//查询其他人是否附议完成
List<BpmProcessTask> otherTasks = dao().query(BpmProcessTask.class,
Cnd.where(BpmProcessTask::getProcessInstanceId, "=", approvalParam.getProcessInstanceId())
.and(BpmProcessTask::getId, "!=", approvalParam.getProcessInstanceTaskId())
.and(BpmProcessTask::getPrevTaskId, "=", processTask.getPrevTaskId())
.and(BpmProcessTask::getDelFlag, "=", 0));
boolean otherTaskAllComplete = otherTasks.stream().allMatch(v -> v.getTaskStatus().equals(BpmProcessTaskStatusEnum.COMPLETE.name()) || v.getTaskStatus().equals(BpmProcessTaskStatusEnum.REVOKE.name()));
boolean finish = otherTaskAllComplete && otherTasks.size() + 1 >= seconderNum;
variables.put("finish", finish);
if (finish) {
//查询团长
assignments.add(commonService.findUserLoginNameByRoleCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD, Cnd.where(Sys_user_role::getTcSessionId, "=", proposalInfo.getSessionId()).and(Sys_user_role::getTcDelegationId, "=", proposalInfo.getDelegationId())));
}
bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), BpmTaskApprovalTypeEnum.DYNAMIC, variables, assignments);
if (finish) {
for (String assignment : assignments) {
String template = "{}代表的提案《{}》已经完成附议,请您登陆智慧校园下的暖心工会系统进行审批,感谢您对教代会提案工作的大力支持!";
String content = StrUtil.format(template, proposalInfo.getCreateUserName(), proposalInfo.getName());
sysMsgService.sendMsg(assignment, "团长审核", content, proposalInfo.getCreateUserId());
}
}
//查询已完成任务同意的数量
// List<BpmProcessTask> tasks = dao().query(BpmProcessTask.class, Cnd.where(BpmProcessTask::getProcessInstanceId, "=", approvalParam.getProcessInstanceId()).and(BpmProcessTask::getTaskStatus, "=", BpmProcessTaskStatusEnum.COMPLETE.name()).and(BpmProcessTask::getPrevTaskId, "=", processTask.getPrevTaskId()).and(BpmProcessTask::getDelFlag, "=", 0));
// long agreeCount = tasks.stream().filter(v -> v.getExtVariable().getStr("bpmTaskApprovalType").equals(BpmTaskApprovalTypeEnum.PASS.name())).count();
// if (approvalParam.getBpmTaskApprovalTypeEnum().equals(BpmTaskApprovalTypeEnum.PASS)) {
// agreeCount = agreeCount + 1;
// }
//
// ProposalConfig proposalConfig = dao().fetch(ProposalConfig.class, Cnd.NEW());
// Integer seconderNum = proposalConfig.getSeconderNum();
// variables.put("finish", agreeCount == seconderNum);
//
// if (agreeCount == seconderNum) {
// //查询团长
// assignments.add(commonService.findUserLoginNameByRoleCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD, Cnd.where(Sys_user_role::getTcSessionId, "=", proposalInfo.getSessionId()).and(Sys_user_role::getTcDelegationId, "=", proposalInfo.getDelegationId())));
// }
// bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), BpmTaskApprovalTypeEnum.DYNAMIC, variables, assignments);
//
//
// if (agreeCount == seconderNum) {
// for (String assignment : assignments) {
// String template = "{}代表的提案《{}》已经完成附议,请您登陆智慧校园下的暖心工会系统进行审批,感谢您对教代会提案工作的大力支持!";
// String content = StrUtil.format(template, proposalInfo.getCreateUserName(), proposalInfo.getName());
// sysMsgService.sendMsg(assignment, "团长审核", content, proposalInfo.getCreateUserId());
// }
// }
}
} }
@@ -7,6 +7,7 @@ import cn.hutool.core.lang.tree.TreeNode;
import cn.hutool.core.lang.tree.TreeUtil; import cn.hutool.core.lang.tree.TreeUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.exception.BaseException;
import com.budwk.app.base.page.Pagination; import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm; import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result; import com.budwk.app.base.result.Result;
@@ -74,12 +75,15 @@ public class TeacherCongressDelegationController {
public Result pageData(@Valid @ApiParam(value = "分页表单") PageForm pageForm, @Valid @ApiParam(value = "届次ID") String sessionId) { public Result pageData(@Valid @ApiParam(value = "分页表单") PageForm pageForm, @Valid @ApiParam(value = "届次ID") String sessionId) {
Sys_role role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD); Sys_role role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD);
Sys_role role2 = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_VICE_DELEGATION_HEAD); Sys_role role2 = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_VICE_DELEGATION_HEAD);
Sys_role role3 = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_CONTACT);
Sql sql = Sqls.create(""" Sql sql = Sqls.create("""
SELECT SELECT
tcd.*, tcd.*,
tcs.fullName as sessionName, tcs.fullName as sessionName,
GROUP_CONCAT(u.username,u.loginname) as delegationHead, GROUP_CONCAT(u.username,u.loginname) as delegationHead,
GROUP_CONCAT(u2.username,u2.loginname) as viceDelegationHead GROUP_CONCAT(u2.username,u2.loginname) as viceDelegationHead,
GROUP_CONCAT(u3.username,u3.loginname) as delegationContact
FROM FROM
teacher_congress_delegation tcd teacher_congress_delegation tcd
LEFT JOIN teacher_congress_session tcs ON tcs.id = tcd.sessionId LEFT JOIN teacher_congress_session tcs ON tcs.id = tcd.sessionId
@@ -87,9 +91,12 @@ public class TeacherCongressDelegationController {
LEFT JOIN sys_user u ON u.id = sur.userId LEFT JOIN sys_user u ON u.id = sur.userId
LEFT JOIN sys_user_role sur2 ON sur2.tcDelegationId = tcd.id AND sur2.roleId = @roleId2 LEFT JOIN sys_user_role sur2 ON sur2.tcDelegationId = tcd.id AND sur2.roleId = @roleId2
LEFT JOIN sys_user u2 ON u2.id = sur2.userId LEFT JOIN sys_user u2 ON u2.id = sur2.userId
LEFT JOIN sys_user_role sur3 ON sur3.tcDelegationId = tcd.id AND sur3.roleId = @roleId3
LEFT JOIN sys_user u3 ON u3.id = sur3.userId
$condition"""); $condition""");
sql.setParam("roleId", role.getId()); sql.setParam("roleId", role.getId());
sql.setParam("roleId2", role2.getId()); sql.setParam("roleId2", role2.getId());
sql.setParam("roleId3", role3.getId());
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
cnd.and("tcd.sessionId", "=", sessionId); cnd.and("tcd.sessionId", "=", sessionId);
cnd.asc("tcd.code"); cnd.asc("tcd.code");
@@ -268,8 +275,12 @@ public class TeacherCongressDelegationController {
Sys_role role = null; Sys_role role = null;
if (type.equals(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD.name())) { if (type.equals(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD.name())) {
role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD); role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD);
} else { } else if (type.equals(RoleConstant.TEACHER_CONGRESS_VICE_DELEGATION_HEAD.name())) {
role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_VICE_DELEGATION_HEAD); role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_VICE_DELEGATION_HEAD);
} else if (type.equals(RoleConstant.TEACHER_CONGRESS_DELEGATION_CONTACT.name())) {
role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_CONTACT);
} else {
throw new BaseException("参数错误");
} }
Record record = dao.fetch("sys_user_role", Cnd.where("tcSessionId", "=", sessionId).and("tcDelegationId", "=", delegationId).and("roleId", "=", role.getId())); Record record = dao.fetch("sys_user_role", Cnd.where("tcSessionId", "=", sessionId).and("tcDelegationId", "=", delegationId).and("roleId", "=", role.getId()));
@@ -298,31 +309,32 @@ public class TeacherCongressDelegationController {
/** /**
* 设置团长 * 设置团长
* *
* @param delegationId * @param delegationId 代表团ID
* @param sessionId * @param sessionId 届次ID
* @param userId * @param userId 团长id
* @param viceUserId 副团长id
* @param contactUserId 联络人
* @return * @return
*/ */
@At @At
@SaCheckPermission("tc.delegation") @SaCheckPermission("tc.delegation")
@Aop(TransAop.READ_COMMITTED) @Aop(TransAop.READ_COMMITTED)
public Result insertHead(@Valid String delegationId, @Valid String sessionId, @Valid String userId, String viceUserId) { public Result insertHead(@Valid String delegationId, @Valid String sessionId, @Valid String userId, @Valid String viceUserId, String contactUserId) {
// 团长 // 团长
Sys_role role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD); Sys_role role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD);
dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", delegationId) dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", delegationId).and(Sys_user_role::getTcSessionId, "=", sessionId).and(Sys_user_role::getRoleId, "=", role.getId()));
.and(Sys_user_role::getTcSessionId, "=", sessionId)
.and(Sys_user_role::getRoleId, "=", role.getId())
);
dao.insert("sys_user_role", Chain.make("userId", userId).add("roleId", role.getId()).add("tcDelegationId", delegationId).add("tcSessionId", sessionId)); dao.insert("sys_user_role", Chain.make("userId", userId).add("roleId", role.getId()).add("tcDelegationId", delegationId).add("tcSessionId", sessionId));
// 副团长 // 副团长
Sys_role role2 = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_VICE_DELEGATION_HEAD); Sys_role role2 = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_VICE_DELEGATION_HEAD);
dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", delegationId) dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", delegationId).and(Sys_user_role::getTcSessionId, "=", sessionId).and(Sys_user_role::getRoleId, "=", role2.getId()));
.and(Sys_user_role::getTcSessionId, "=", sessionId)
.and(Sys_user_role::getRoleId, "=", role2.getId())
);
dao.insert("sys_user_role", Chain.make("userId", viceUserId).add("roleId", role2.getId()).add("tcDelegationId", delegationId).add("tcSessionId", sessionId)); dao.insert("sys_user_role", Chain.make("userId", viceUserId).add("roleId", role2.getId()).add("tcDelegationId", delegationId).add("tcSessionId", sessionId));
// 联络人
Sys_role role3 = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_CONTACT);
dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", delegationId).and(Sys_user_role::getTcSessionId, "=", sessionId).and(Sys_user_role::getRoleId, "=", role3.getId()));
dao.insert("sys_user_role", Chain.make("userId", contactUserId).add("roleId", role3.getId()).add("tcDelegationId", delegationId).add("tcSessionId", sessionId));
sysUserService.clearCache(); sysUserService.clearCache();
return Result.success(); return Result.success();
} }
@@ -340,11 +352,7 @@ public class TeacherCongressDelegationController {
public Result deleteHead(@Valid String delegationId, @Valid String sessionId, @Valid String userId) { public Result deleteHead(@Valid String delegationId, @Valid String sessionId, @Valid String userId) {
Sys_role role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD); Sys_role role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD);
//先删除角色 //先删除角色
dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", delegationId) dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getTcDelegationId, "=", delegationId).and(Sys_user_role::getTcSessionId, "=", sessionId).and(Sys_user_role::getRoleId, "=", role.getId()).and(Sys_user_role::getUserId, "=", userId));
.and(Sys_user_role::getTcSessionId, "=", sessionId)
.and(Sys_user_role::getRoleId, "=", role.getId())
.and(Sys_user_role::getUserId, "=", userId)
);
sysUserService.clearCache(); sysUserService.clearCache();
return Result.success(); return Result.success();
} }
File diff suppressed because it is too large Load Diff
@@ -79,24 +79,31 @@ const PROPOSAL_INFO = {
<template v-for="task in doneTasks"> <template v-for="task in doneTasks">
<div class="mt10"> <div class="mt10">
<div class="process-title">{{ task.displayName }}</div> <div class="process-title">{{ task.displayName }}</div>
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-if="task.ext.isFirstTaskNode"> <el-descriptions border class="flow-task-form" :column="3" :key="task.id"
<el-descriptions-item label="申请用户">{{ task.ext.initiatorName }}({{task.ext.initiatorAccount}}) v-if="task.ext.isFirstTaskNode">
<el-descriptions-item label="申请用户">{{ task.ext.initiatorName
}}({{task.ext.initiatorAccount}})
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="申请时间">{{ task.finishTime }}</el-descriptions-item> <el-descriptions-item label="申请时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果"> <el-descriptions-item label="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE" :value="task.ext.submitType"></dict-tag> <dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
:value="task.ext.submitType"></dict-tag>
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
<!--邀请附议人--> <!--邀请附议人-->
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-else-if="task.taskName === '85b7b9bd-d706-48cb-99a1-ef1370fb1819'"> <el-descriptions border class="flow-task-form" :column="3" :key="task.id"
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName }}({{task.taskFormData.loginName}})</el-descriptions-item> v-else-if="task.taskName === 'invite'">
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName
}}({{task.taskFormData.loginName}})
</el-descriptions-item>
<el-descriptions-item label="办理时间" :span="2">{{ task.finishTime }}</el-descriptions-item> <el-descriptions-item label="办理时间" :span="2">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="附议人" :span="3" v-if="task.taskName === '85b7b9bd-d706-48cb-99a1-ef1370fb1819'"> <el-descriptions-item label="附议人" :span="3" v-if="task.taskName === 'invite'">
<el-table :data="task?.taskFormData?.seconder"> <el-table :data="task?.taskFormData?.seconder">
<el-table-column label="姓名" prop="userName"></el-table-column> <el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="工号" prop="loginName"></el-table-column> <el-table-column label="工号" prop="loginName"></el-table-column>
<el-table-column label="性别" prop="sex"></el-table-column> <el-table-column label="性别" prop="sex"></el-table-column>
<el-table-column label="联系方式" prop="mobile"></el-table-column>
<el-table-column label="单位" prop="unitName"></el-table-column> <el-table-column label="单位" prop="unitName"></el-table-column>
<el-table-column label="分工会" prop="unionName"></el-table-column> <el-table-column label="分工会" prop="unionName"></el-table-column>
<el-table-column label="代表团" prop="delegationName"></el-table-column> <el-table-column label="代表团" prop="delegationName"></el-table-column>
@@ -105,20 +112,43 @@ const PROPOSAL_INFO = {
</el-descriptions> </el-descriptions>
<!--提案委员会立案--> <!--提案委员会立案-->
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-else-if="task.taskName === '9846ab38-40c5-4093-bafc-a9b3b443338b'"> <el-descriptions border class="flow-task-form" :column="3" :key="task.id"
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName }}({{task.taskFormData.loginName}})</el-descriptions-item> v-else-if="task.taskName === 'committee'">
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName
}}({{task.taskFormData.loginName}})
</el-descriptions-item>
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item> <el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="立案结果"> <el-descriptions-item label="立案结果">
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT" :value="task.ext.caseFilingResult"></dict-tag> <dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="task.ext.tf_caseFilingResult"></dict-tag>
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
:value="task.ext.tf_caseFilingType"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="主办单位" :span="3">{{task.ext.tf_masterUnitName}}
</el-descriptions-item>
<el-descriptions-item label="协办单位" :span="3">{{task?.ext?.tf_slaveUnitNameStr}}
</el-descriptions-item>
<el-descriptions-item label="办理意见" :span="3">
<div v-html="task.taskFormData.tf_opinion"></div>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="主办单位" :span="3">{{task.ext.tf_hostUnitName}}</el-descriptions-item>
<el-descriptions-item label="协办单位" :span="3">{{task?.ext?.tf_helpUnitNames.join('、')}}</el-descriptions-item>
</el-descriptions> </el-descriptions>
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-else> <el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-else>
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName }}({{task.taskFormData.loginName}})</el-descriptions-item> <el-descriptions-item label="承办单位"
v-if="['master_reply','slave_reply'].includes(task.taskName)" :span="3">
{{task.ext.underTakeName}}
</el-descriptions-item>
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName
}}({{task.taskFormData.loginName}})
</el-descriptions-item>
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item> <el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">
<el-descriptions-item label="办理评价" v-if="['feedback'].includes(task.taskName)" :span="3">
<dict-tag :options="dict.type.PROPOSAL_FEEDBACK"
:value="task.ext.tf_feedback"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="办理结果" v-else>
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE" <dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
:value="task.ext.submitType"></dict-tag> :value="task.ext.submitType"></dict-tag>
</el-descriptions-item> </el-descriptions-item>
@@ -132,7 +162,7 @@ const PROPOSAL_INFO = {
<slot></slot> <slot></slot>
</div> </div>
`, `,
dicts: ["PROPOSAL_TYPE", "PROPOSAL_CASE_FILING_RESULT","PROCESS_TASK_SUBMIT_TYPE"], dicts: ["PROPOSAL_TYPE", "PROPOSAL_CASE_FILING_RESULT", "PROPOSAL_CASE_FILING_TYPE", "PROCESS_TASK_SUBMIT_TYPE", "PROPOSAL_FEEDBACK"],
props: { props: {
hide_slave: false hide_slave: false
}, },
@@ -3,7 +3,7 @@ layout("/layouts/platform.html"){
#--> #-->
<div id="app" v-cloak> <div id="app" v-cloak>
<el-row type="flex" :gutter="10" style="height: calc(100vh - 126px)"> <el-row type="flex" :gutter="10" style="height: calc(100vh - 84px)">
<el-col :span="5"> <el-col :span="5">
<tree @node-click="treeNodeClick" ref="treeRef"></tree> <tree @node-click="treeNodeClick" ref="treeRef"></tree>
</el-col> </el-col>
@@ -114,7 +114,7 @@ layout("/layouts/platform.html"){
<table-tool> <table-tool>
<el-button type="primary" size="small" @click="exportAllProposalAsZip">导出提案压缩包</el-button> <el-button type="primary" size="small" @click="exportAllProposalAsZip">导出提案压缩包</el-button>
<el-button type="primary" size="small" @click="exportCollectZip">导出提案征集表压缩包</el-button> <el-button type="primary" size="small" @click="exportCollectZip">导出提案征集表压缩包</el-button>
<!-- <el-button type="primary" size="small" @click="exportAllProposalFeedBackAsZip">导出反馈表压缩包</el-button>--> <el-button type="primary" size="small" @click="exportAllProposalFeedBackAsZip">导出反馈表压缩包</el-button>
<el-button type="primary" size="small" @click="exportSummaryAsExcel">导出汇总表</el-button> <el-button type="primary" size="small" @click="exportSummaryAsExcel">导出汇总表</el-button>
<!-- <el-button type="primary" size="small" @click="exportProposalRegisterSummaryAsExcel">导出立案汇总表--> <!-- <el-button type="primary" size="small" @click="exportProposalRegisterSummaryAsExcel">导出立案汇总表-->
</el-button> </el-button>
@@ -21,17 +21,17 @@ layout("/layouts/platform.html"){
<el-card shadow="never"> <el-card shadow="never">
<el-table :data="tableData"> <el-table :data="tableData">
<el-table-column label="序号" type="index" width="50"></el-table-column> <el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column label="单位名称" prop="name" width="400" sortable show-overflow-tooltip></el-table-column> <el-table-column label="单位名称" prop="unitName" width="400" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="提案总数" prop="sum" sortable></el-table-column> <el-table-column label="提案总数" prop="sum" sortable></el-table-column>
<el-table-column label="主办提案"> <el-table-column label="主办提案">
<el-table-column label="提案数量" prop="hostSum" sortable></el-table-column> <el-table-column label="提案数量" prop="masterSum" sortable></el-table-column>
<el-table-column label="已答复" prop="hostReplySum" sortable></el-table-column> <el-table-column label="已答复" prop="masterReplySum" sortable></el-table-column>
<el-table-column label="未答复" prop="hostNoReplySum" sortable></el-table-column> <el-table-column label="未答复" prop="masterNoReplySum" sortable></el-table-column>
</el-table-column> </el-table-column>
<el-table-column label="协办提案"> <el-table-column label="协办提案">
<el-table-column label="提案数量" prop="helpSum" sortable></el-table-column> <el-table-column label="提案数量" prop="slaveSum" sortable></el-table-column>
<el-table-column label="已答复" prop="hostReplySum" sortable v-if="slaveNeedReply"></el-table-column> <el-table-column label="已答复" prop="slaveReplySum" sortable v-if="slaveNeedReply"></el-table-column>
<el-table-column label="未答复" prop="hostNoReplySum" sortable v-if="slaveNeedReply"></el-table-column> <el-table-column label="未答复" prop="slaveNoReplySum" sortable v-if="slaveNeedReply"></el-table-column>
</el-table-column> </el-table-column>
</el-table> </el-table>
</el-card> </el-card>
@@ -1,10 +1,93 @@
<!DOCTYPE html> <!--#
<html lang="en"> layout("/layouts/platform.html"){
<head> #-->
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body> <div id="app" v-cloak>
</html> <el-card shadow="never">
<search @search="doSearch">
<search-item label="教代会">
<el-select @change="meetingChange" clearable filterable placeholder="所属教代会"
v-model="pageForm.sessionId">
<el-option :key="item.id" :label="item.fullName" :value="item.id"
v-for="item in sessionOptions"></el-option>
</el-select>
</search-item>
<search-item label="承办单位">
<el-select clearable filterable placeholder="承办单位" v-model="pageForm.undertakeUnitId">
<el-option :key="item.code" :label="item.name" :value="item.id"
v-for="item in underTakeOptions"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<el-table :data="tableData">
<el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column label="单位名称" prop="unitName" width="400" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="提案总数" prop="sum" sortable></el-table-column>
<el-table-column label="主办提案数" prop="masterSum" sortable></el-table-column>
<el-table-column label="协办提案数" prop="slaveSum" sortable></el-table-column>
<template v-for="dict in dict.type.PROPOSAL_FEEDBACK">
<el-table-column :label="dict.label" :prop="dict.code" sortable></el-table-column>
</template>
</el-table>
</el-card>
</div>
<script>
<!--#include("../../common/info.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
dicts: ['PROPOSAL_FEEDBACK'],
components: {
"proposal-info": PROPOSAL_INFO
},
data() {
return {
sessionOptions: [],
underTakeOptions: [],
}
},
methods: {
meetingChange() {
this.doSearch()
},
listSession() {
this.$axios.post("/platform/proposal/common/listSession").then((res) => {
if (res.code === 0) {
this.sessionOptions = res.data
if (this.sessionOptions) {
this.$set(this.pageForm, "sessionId", this.sessionOptions[0].id)
this.pageData()
}
}
})
},
listUnderTake() {
this.$axios.post("/platform/proposal/common/listUnderTake").then((res) => {
if (res.code === 0) {
this.underTakeOptions = res.data
}
})
},
pageData() {
this.$axios.post(loc() + "/data", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data
}
})
}
},
created() {
this.listSession()
this.listUnderTake()
}
})
</script>
<!--#
}
#-->
@@ -108,28 +108,33 @@ layout("/layouts/platform.html"){
<el-button type="primary" size="small" @click="exportYearReport">导出提案报告</el-button> <el-button type="primary" size="small" @click="exportYearReport">导出提案报告</el-button>
</table-tool> </table-tool>
<el-table :data="tableData" @sort-change="pageOrder" header-align="center" style="width: 100%" row-key="id"> <el-table :data="tableData" @sort-change="pageOrder" header-align="center" style="width: 100%" row-key="id">
<el-table-column label="序号" width="50px" type="index" :index="indexMethod"></el-table-column> <el-table-column label="序号" width="50" type="index" :index="indexMethod"></el-table-column>
<el-table-column label="提案编号" prop="code" width="200px"></el-table-column> <el-table-column label="提案编号" prop="code" width="100px" show-overflow-tooltip></el-table-column>
<el-table-column label="提案名称" prop="name"></el-table-column> <el-table-column label="提案名称" prop="name" show-overflow-tooltip></el-table-column>
<el-table-column label="提案人" prop="createUserName"></el-table-column> <el-table-column label="提案人" prop="createUserName"></el-table-column>
<el-table-column label="提案类别" prop="typeName"></el-table-column> <el-table-column label="提案类别" prop="typeName"></el-table-column>
<el-table-column label="届次" prop="sessionName"></el-table-column>
<el-table-column label="代表团" prop="delegationName"></el-table-column> <el-table-column label="代表团" prop="delegationName"></el-table-column>
<el-table-column label="立案结果" prop="caseFilingResult"> <el-table-column label="立案结果" prop="caseFilingResult">
<template scope="{row}"> <template scope="{row}">
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT" :value="row.caseFilingResult"></dict-tag> <dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT" :value="row.caseFilingResult"></dict-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="是否并案" prop="isConsolidation"> <el-table-column label="是否并案" prop="isConsolidation" width="100">
<template scope="{row}"> <template scope="{row}">
<el-tag size="mini" v-if="row.isConsolidation" type="success"></el-tag> <el-tag size="mini" v-if="row.isConsolidation" type="success"></el-tag>
<el-tag size="mini" v-else type="danger"></el-tag> <el-tag size="mini" v-else type="danger"></el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="主办单位" prop="masterUnderTakeName"></el-table-column> <el-table-column label="主办单位" prop="masterUnitName" show-overflow-tooltip></el-table-column>
<el-table-column label="协办单位" prop="slaveUnderTakeNames" show-overflow-tooltip></el-table-column> <el-table-column label="协办单位" prop="slaveUnitNames" show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="processInstanceNodeName"></el-table-column> <el-table-column prop="curTaskName" label="当前节点"></el-table-column>
<el-table-column label="操作" fixed="right" width="100px"> <el-table-column prop="instanceState" label="流程状态">
<template slot-scope="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200px">
<template scope="{row}"> <template scope="{row}">
<el-button size="mini" type="primary" @click="openView(row)">查看</el-button> <el-button size="mini" type="primary" @click="openView(row)">查看</el-button>
</template> </template>
@@ -148,6 +148,7 @@ layout("/layouts/platform.html"){
{prop: 'curTaskName', label: '当前节点'}, {prop: 'curTaskName', label: '当前节点'},
{prop: 'taskUnitName', label: '承办单位'}, {prop: 'taskUnitName', label: '承办单位'},
{prop: 'taskName', label: '承办类型'}, {prop: 'taskName', label: '承办类型'},
{prop: 'actorName', label: '负责人'},
{prop: 'instanceState', label: '流程状态'}, {prop: 'instanceState', label: '流程状态'},
], ],
chooseTableData: [], chooseTableData: [],
@@ -83,38 +83,56 @@ layout("/layouts/platform.html"){
{{formData.taskName}} {{formData.taskName}}
</div> </div>
<el-form :model="formData" ref="formRef" label-width="120px" :rules="formRules" label-suffix=""> <el-form :model="formData" ref="formRef" label-width="120px" :rules="formRules" label-suffix="">
<el-form-item label="立案结果" prop="tf_caseFilingResult" :rules="[{required:true,message:'必填',trigger:['change','blur']}]"> <el-form-item label="立案结果" prop="tf_caseFilingResult"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-radio-group v-model="formData.tf_caseFilingResult" size="small"> <el-radio-group v-model="formData.tf_caseFilingResult" size="small">
<el-radio v-for="item in dict.type.PROPOSAL_CASE_FILING_RESULT" :label="item.code" border>{{item.label}}</el-radio> <el-radio v-for="item in dict.type.PROPOSAL_CASE_FILING_RESULT" :label="item.code"
border>{{item.label}}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="['CONFIRM_FILING'].includes(formData.tf_caseFilingResult)" label="立案类型"
prop="tf_caseFilingType"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-radio-group v-model="formData.tf_caseFilingType" size="small">
<el-radio v-for="item in dict.type.PROPOSAL_CASE_FILING_TYPE" :label="item.code" border>
{{item.label}}
</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="主办单位" label="主办单位"
v-if="['CONFIRM_FILING','SUGGESTION'].includes(formData.tf_caseFilingResult)" v-if="['CONFIRM_FILING','SUGGESTION'].includes(formData.tf_caseFilingResult)"
:rules="[{required:['CONFIRM_FILING','SUGGESTION'].includes(formData.tf_caseFilingResult),message:'必填',trigger:['change','blur']}]" :rules="[{required:['CONFIRM_FILING','SUGGESTION'].includes(formData.tf_caseFilingResult),message:'必填',trigger:['change','blur']}]"
prop="tf_masterUnitId"
> >
<el-select v-model="formData.tf_hostUnitId" filterable clearable style="width: 100%"> <el-select v-model="formData.tf_masterUnitId" filterable clearable style="width: 100%">
<el-option <el-option
v-for="item in underTakeOptions" v-for="item in underTakeOptions"
:label="item.name" :label="item.name"
:value="item.id" :value="item.id"
:key="item.id" :key="item.id"
:disabled="formData && formData.tf_helpUnitIds.includes(item.id)" :disabled="formData && formData.tf_slaveUnitIds.includes(item.id)"
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="协办单位" v-if="['CONFIRM_FILING','SUGGESTION'].includes(formData.tf_caseFilingResult)"> <el-form-item label="协办单位"
<el-select v-model="formData.tf_helpUnitIds" filterable clearable multiple style="width: 100%"> v-if="['CONFIRM_FILING','SUGGESTION'].includes(formData.tf_caseFilingResult)"
prop="tf_slaveUnitIds"
>
<el-select v-model="formData.tf_slaveUnitIds" filterable clearable multiple
style="width: 100%">
<el-option <el-option
v-for="item in underTakeOptions" v-for="item in underTakeOptions"
:label="item.name" :label="item.name"
:value="item.id" :value="item.id"
:key="item.id" :key="item.id"
:disabled="item.id===formData.tf_hostUnitId" :disabled="item.id===formData.tf_masterUnitId"
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]"> <el-form-item label="审核意见" prop="approvalOpinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea> <user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
</el-form-item> </el-form-item>
</el-form> </el-form>
@@ -135,7 +153,7 @@ layout("/layouts/platform.html"){
new Vue({ new Vue({
el: "#app", el: "#app",
store, store,
dicts: ["PROPOSAL_CASE_FILING_RESULT"], dicts: ["PROPOSAL_CASE_FILING_RESULT", "PROPOSAL_CASE_FILING_TYPE"],
mixins: [initTableMixins], mixins: [initTableMixins],
components: { components: {
"proposal-info": PROPOSAL_INFO "proposal-info": PROPOSAL_INFO
@@ -146,8 +164,8 @@ layout("/layouts/platform.html"){
approval: false approval: false
}, },
formData: { formData: {
tf_hostUnitId: null, tf_masterUnitId: null,
tf_helpUnitIds: [] tf_slaveUnitIds: []
}, },
showApprovalForm: false, showApprovalForm: false,
sessionOptions: [], sessionOptions: [],
@@ -168,8 +186,8 @@ layout("/layouts/platform.html"){
this.formData = { this.formData = {
processTaskId: row.taskId, processTaskId: row.taskId,
taskName: row.curTaskName, taskName: row.curTaskName,
tf_hostUnitId: null, tf_masterUnitId: null,
tf_helpUnitIds: [] tf_slaveUnitIds: []
} }
this.$refs.proposalInfoRef.onOpen(row) this.$refs.proposalInfoRef.onOpen(row)
}) })
@@ -185,9 +203,9 @@ layout("/layouts/platform.html"){
data: JSON.stringify({ data: JSON.stringify({
...this.formData, ...this.formData,
submitType: val, submitType: val,
tf_hostUnitName: this.formData.tf_hostUnitId ? this.underTakeOptions.find(v => v.id === this.formData.tf_hostUnitId)?.name : null, tf_masterUnitName: this.formData.tf_masterUnitId ? this.underTakeOptions.find(v => v.id === this.formData.tf_masterUnitId)?.name : null,
tf_helpUnitNames: this.formData.tf_helpUnitIds.map(v => this.underTakeOptions.find(v2 => v2.id === v)?.name), tf_slaveUnitNames: this.formData.tf_slaveUnitIds.map(v => this.underTakeOptions.find(v2 => v2.id === v)?.name),
tf_helpUnitNameStr: this.formData.tf_helpUnitIds.map(v => this.underTakeOptions.find(v2 => v2.id === v)?.name).join(','), tf_slaveUnitNameStr: this.formData.tf_slaveUnitIds.map(v => this.underTakeOptions.find(v2 => v2.id === v)?.name).join(','),
}) })
}).then((res) => { }).then((res) => {
if (res.code === 0) { if (res.code === 0) {
@@ -95,6 +95,17 @@ layout("/layouts/platform.html"){
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"> :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea> <user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item> </el-form-item>
<template v-if="['SATISFIED','FAIRLY_SATISFIED'].includes(formData.tf_feedback)">
<el-form-item label="通讯地址" prop="tf_address">
<el-input v-model="formData.tf_address" placeholder="请输入通讯地址" clearable></el-input>
</el-form-item>
<el-form-item label="联系电话" prop="tf_phone">
<el-input v-model="formData.tf_phone" placeholder="请输入联系电话" clearable></el-input>
</el-form-item>
<el-form-item label="邮政编码" prop="tf_postcode">
<el-input v-model="formData.tf_postcode" placeholder="请输入邮政编码" clearable></el-input>
</el-form-item>
</template>
</el-form> </el-form>
<el-row type="flex" justify="end"> <el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()" size="small">取消</el-button> <el-button @click="$refs.guava.index()" size="small">取消</el-button>
@@ -49,7 +49,7 @@ layout("/layouts/platform.html"){
size="mini" size="mini"
type="primary" type="primary"
@click="onOpenInviteSeconder(row)" @click="onOpenInviteSeconder(row)"
v-if="row.taskKey === '85b7b9bd-d706-48cb-99a1-ef1370fb1819' || row.taskKey === '74458b33-ad6e-46c4-b8d9-1aa897142b25'" v-if="row.taskKey === 'invite' || row.taskKey === 'second'"
> >
邀请附议人 邀请附议人
</el-button> </el-button>
@@ -21,10 +21,11 @@ const PROPOSAL_INVITE_SECONDER_COMPONENT = {
<el-divider class="mt10 mb10"></el-divider> <el-divider class="mt10 mb10"></el-divider>
<div> <div>
<table-tool label="代表数据"> <table-tool label="代表数据">
<!-- <el-button size="small" @click="invite" type="primary" icon="el-icon-plus"--> <!-- <el-button size="small" @click="invite" type="primary" icon="el-icon-plus"-->
<!-- :disabled="pageForm.isInvite">邀请--> <!-- :disabled="pageForm.isInvite">邀请-->
<!-- </el-button>--> <!-- </el-button>-->
<el-radio-group v-model="pageForm.isInvite" @change="doSearch" size="small" style="margin-left: 5px;"> <el-radio-group v-model="pageForm.isInvite" @change="doSearch" size="small"
style="margin-left: 5px;">
<el-radio-button :label="true">已邀请</el-radio-button> <el-radio-button :label="true">已邀请</el-radio-button>
<el-radio-button :label="false">可邀请</el-radio-button> <el-radio-button :label="false">可邀请</el-radio-button>
</el-radio-group> </el-radio-group>
@@ -126,6 +127,7 @@ const PROPOSAL_INVITE_SECONDER_COMPONENT = {
cancelButtonText: "取消", cancelButtonText: "取消",
type: "info" type: "info"
}).then(() => { }).then(() => {
const loading = createLoading('邀请中...')
this.$axios.post("/platform/proposal/mine/inviteSeconder", { this.$axios.post("/platform/proposal/mine/inviteSeconder", {
proposalId: this.record.id, proposalId: this.record.id,
seconders: JSON.stringify(loginNames) seconders: JSON.stringify(loginNames)
@@ -137,7 +139,7 @@ const PROPOSAL_INVITE_SECONDER_COMPONENT = {
this.visible = false this.visible = false
this.$emit("refresh", null) this.$emit("refresh", null)
} }
}) }).finally(() => loading.close())
}) })
}, },
pageData() { pageData() {
@@ -47,8 +47,8 @@ layout("/layouts/platform.html"){
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button> <el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核 <el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
</el-button> </el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回 <!-- <el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回-->
</el-button> <!-- </el-button>-->
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -111,7 +111,8 @@ layout("/layouts/platform.html"){
this.showApprovalForm = true this.showApprovalForm = true
this.formData = { this.formData = {
processTaskId: row.taskId, processTaskId: row.taskId,
taskName: row.curTaskName taskName: row.curTaskName,
tf_opinion: "同意该提案"
} }
this.$refs.proposalInfoRef.onOpen(row) this.$refs.proposalInfoRef.onOpen(row)
}) })
@@ -2,12 +2,62 @@
layout("/layouts/platform.html"){ layout("/layouts/platform.html"){
#--> #-->
<style>
/* 提案信息卡片样式 - OA风格 */
.proposal-info-card {
background: #ffffff;
border: 1px solid var(--border-color-lighter);
margin-bottom: 20px;
overflow: hidden;
}
.proposal-info-content {
padding: 16px;
background: #fafafa;
}
.info-item {
display: flex;
align-items: flex-start;
margin-bottom: 12px;
line-height: 1.6;
padding: 8px 12px;
background: #ffffff;
border-left: 3px solid var(--color-primary-2);
transition: all 0.2s ease;
}
.info-item:hover {
border-left-color: var(--color-primary);
}
.info-item:last-child {
margin-bottom: 0;
}
.info-item label {
color: var(--color-text-regular);
font-weight: 500;
min-width: 80px;
margin-right: 12px;
flex-shrink: 0;
font-size: 13px;
}
.info-item span {
color: var(--color-text-primary);
word-break: break-all;
flex: 1;
font-size: 13px;
}
</style>
<div id="app"> <div id="app">
<guava ref="guava"> <guava ref="guava">
<el-card shadow="never"> <el-card shadow="never">
<search @search="doSearch"> <search @search="doSearch">
<search-item label="教代会"> <search-item label="教代会">
<el-select @change="meetingChange" clearable filterable placeholder="所属教代会" <el-select @change="meetingChange" clearable filterable placeholder="所属教代会" style="width: 100%"
v-model="pageForm.sessionId"> v-model="pageForm.sessionId">
<el-option :key="item.id" :label="item.fullName" :value="item.id" <el-option :key="item.id" :label="item.fullName" :value="item.id"
v-for="item in sessionOptions"></el-option> v-for="item in sessionOptions"></el-option>
@@ -57,25 +107,40 @@ layout("/layouts/platform.html"){
<el-table-column label="代表团" prop="delegationName"></el-table-column> <el-table-column label="代表团" prop="delegationName"></el-table-column>
<el-table-column label="立案结果" prop="caseFilingResult"> <el-table-column label="立案结果" prop="caseFilingResult">
<template scope="{row}"> <template scope="{row}">
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT" :value="row.caseFilingResult"></dict-tag> <dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="row.caseFilingResult"></dict-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="当前节点" prop="curTaskName"></el-table-column> <el-table-column label="当前节点" prop="curTaskName"></el-table-column>
<el-table-column label="承办单位" prop="taskUnitName"></el-table-column> <el-table-column label="承办单位" prop="underTakeName"></el-table-column>
<el-table-column label="承办类型" prop="taskName"></el-table-column> <el-table-column label="承办类型" prop="underTakeIsMaster">
<template scope="{row}">
<el-tag v-if="row.underTakeIsMaster" size="small">主办</el-tag>
<el-tag v-else type="warning" size="small">协办</el-tag>
</template>
</el-table-column>
<el-table-column label="流程状态" prop="instanceState"> <el-table-column label="流程状态" prop="instanceState">
<template slot-scope="{row}"> <template slot-scope="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" <enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag> size="small"></enum-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<el-table-column label="转交" prop="transfer" v-if="pageForm.approval && $auth.hasRoleOr('SYSADMIN,PROPOSAL_UNIT_LEADER')">
<template slot-scope="{row}">
{{row.transferUserName}}
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" min-width="250px">
<template slot-scope="{row}"> <template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button> <el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">答复 <el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">答复
</el-button> </el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回 <el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button> </el-button>
<!--承办单位领导、超级管理员才能转办-->
<el-button v-if="!pageForm.approval && $auth.hasRoleOr('SYSADMIN,PROPOSAL_UNIT_LEADER')" @click="openTransfer(row)" size="mini" type="primary">转交</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -88,14 +153,16 @@ layout("/layouts/platform.html"){
<div class="process-title"> <div class="process-title">
{{formData.taskName}} {{formData.taskName}}
</div> </div>
<el-form :model="formData" ref="formRef" label-width="120px" :rules="formRules" label-suffix=""> <el-form :model="formData" ref="formRef" label-width="80px" :rules="formRules" label-suffix="">
<el-form-item label="承办单位"> <el-form-item label="承办单位">
<el-input :value="formData.taskUnitName" disabled></el-input> <el-input :value="formData.underTakeName" disabled></el-input>
</el-form-item> </el-form-item>
<el-form-item label="落实情况" prop="tf_implementState" <el-form-item label="落实情况" prop="tf_implementState"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"> :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-radio-group v-model="formData.tf_implementState" size="small"> <el-radio-group v-model="formData.tf_implementState" size="small">
<el-radio v-for="item in dict.type.PROPOSAL_REPLY_IMPLEMENT" :label="item.code" border>{{item.label}}</el-radio> <el-radio v-for="item in dict.type.PROPOSAL_REPLY_IMPLEMENT" :label="item.code" border>
{{item.label}}
</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="答复内容" prop="tf_opinion" <el-form-item label="答复内容" prop="tf_opinion"
@@ -104,7 +171,7 @@ layout("/layouts/platform.html"){
</el-form-item> </el-form-item>
<el-form-item label="校领导" prop="tf_nextNodeOperator" <el-form-item label="校领导" prop="tf_nextNodeOperator"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]" :rules="[{required:true,message:'必填',trigger:['change','blur']}]"
v-if="supportCandidate && formData.taskIsMaster"> v-if="supportCandidate && formData.underTakeIsMaster">
<el-select v-model="formData.tf_nextNodeOperator" placeholder="请选择校领导"> <el-select v-model="formData.tf_nextNodeOperator" placeholder="请选择校领导">
<el-option :key="item.id" :label="item.userName" :value="item.userId" <el-option :key="item.id" :label="item.userName" :value="item.userId"
v-for="item in candidates"></el-option> v-for="item in candidates"></el-option>
@@ -119,6 +186,49 @@ layout("/layouts/platform.html"){
</proposal-info> </proposal-info>
</template> </template>
</guava> </guava>
<el-dialog title="转交" :visible.sync="showTransferDialog" width="500px">
<!--展示提案基本信息 名称、编号等-->
<div class="proposal-info-card">
<div class="proposal-info-content">
<div class="info-item">
<label>提案编号:</label>
<span>{{ transferForm.code }}</span>
</div>
<div class="info-item">
<label>提案名称:</label>
<span>{{ transferForm.name }}</span>
</div>
<div class="info-item">
<label>代表团:</label>
<span>{{ transferForm.delegationName }}</span>
</div>
</div>
</div>
<el-form ref="transferFormRef" :model="transferForm" label-position="top">
<el-form-item label="转交给" prop="userId"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-select v-model="transferForm.userId"
placeholder="请选择转交用户"
filterable
remote
:remote-method="selectTransferUser"
style="width: 100%"
>
<el-option :key="item.id"
:label="item.username"
:value="item.id"
v-for="item in transferUserOptions"></el-option>
</el-select>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="showTransferDialog = false" size="small">取消</el-button>
<el-button @click="handleTransfer" size="small" type="primary">提交</el-button>
</el-row>
</el-dialog>
</div> </div>
<script> <script>
@@ -127,7 +237,7 @@ layout("/layouts/platform.html"){
new Vue({ new Vue({
el: "#app", el: "#app",
store, store,
dicts: ["PROPOSAL_CASE_FILING_RESULT","PROPOSAL_REPLY_IMPLEMENT"], dicts: ["PROPOSAL_CASE_FILING_RESULT", "PROPOSAL_REPLY_IMPLEMENT"],
mixins: [initTableMixins], mixins: [initTableMixins],
components: { components: {
"proposal-info": PROPOSAL_INFO "proposal-info": PROPOSAL_INFO
@@ -142,7 +252,12 @@ layout("/layouts/platform.html"){
sessionOptions: [], sessionOptions: [],
delegationOptions: [], delegationOptions: [],
candidates: [], candidates: [],
supportCandidate: false supportCandidate: false,
// 转交
showTransferDialog: false,
transferForm: {},
transferUserOptions: [],
} }
}, },
methods: { methods: {
@@ -161,8 +276,8 @@ layout("/layouts/platform.html"){
processTaskId: row.taskId, processTaskId: row.taskId,
taskKey: row.taskKey, taskKey: row.taskKey,
taskName: row.taskName, taskName: row.taskName,
taskUnitName: row.taskUnitName, underTakeName: row.underTakeName,
taskIsMaster: row.taskIsMaster underTakeIsMaster: row.underTakeIsMaster
} }
this.$refs.proposalInfoRef.onOpen(row) this.$refs.proposalInfoRef.onOpen(row)
}) })
@@ -174,6 +289,9 @@ layout("/layouts/platform.html"){
cancelButtonText: "取消", cancelButtonText: "取消",
type: "warning" type: "warning"
}).then(() => { }).then(() => {
delete this.formData.underTakeIsMaster
delete this.formData.underTakeName
this.$axios.post("/flow/common/executeTask", { this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({ data: JSON.stringify({
...this.formData, ...this.formData,
@@ -205,7 +323,6 @@ layout("/layouts/platform.html"){
}) })
}, },
// 加载候选人列表 // 加载候选人列表
loadCandidates(taskId) { loadCandidates(taskId) {
$.get("/flow/common/candidate", {taskId}).then((res) => { $.get("/flow/common/candidate", {taskId}).then((res) => {
@@ -216,6 +333,50 @@ layout("/layouts/platform.html"){
}) })
}, },
// 打开转办
openTransfer(row) {
this.showTransferDialog = true
this.transferForm = {
taskId: row.taskId,
name: row.name,
code: row.code,
delegationName: row.delegationName
}
},
// 查询转办用户
selectTransferUser(keyword) {
this.$axios.post("/platform/proposal/unitReply/selectViceUser", {keyword}).then(res => {
if (res.code === 0) {
this.transferUserOptions = res.data
}
})
},
// 转办
handleTransfer() {
this.$refs.transferFormRef.validate(valid => {
if (!valid) return
const transferUserName = this.transferUserOptions.find(item => item.id === this.transferForm.userId)?.username
const name = this.transferForm.name
this.$confirm("您确定要将" + name + "提案转交给" + transferUserName + "办理吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post('/platform/proposal/unitReply/transfer', this.transferForm).then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
this.showTransferDialog = false
this.doSearch()
}
})
})
})
},
// 教代会 // 教代会
async meetingChange(val) { async meetingChange(val) {
@@ -230,7 +391,6 @@ layout("/layouts/platform.html"){
if (this.sessionOptions) { if (this.sessionOptions) {
this.$set(this.pageForm, "sessionId", this.sessionOptions[0].id) this.$set(this.pageForm, "sessionId", this.sessionOptions[0].id)
this.pageData() this.pageData()
this.listDelegation()
} }
} }
}) })
@@ -31,6 +31,18 @@ const HEAD_FORM_TEMPLATE = {
placeholder="请输入工号或者姓名" placeholder="请输入工号或者姓名"
style="width: 100%"></user-select> style="width: 100%"></user-select>
</el-form-item> </el-form-item>
<el-form-item prop="contactUserId" label="联络人">
<user-select v-model="formData.contactUserId"
v-if="headDialogFormVisible"
api="/platform/teacherCongress/delegation/notHeadUser"
:api_params="{sessionId:formData.sessionId,delegationId:formData.delegationId}"
api_input_key_name="keyWord"
:option_list="contactOptions"
option_value="userId"
:option_label_func="(item)=>{return item.userName + item.loginName + '(' + item.unitName + ')'}"
placeholder="请输入工号或者姓名"
style="width: 100%"></user-select>
</el-form-item>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button @click="headDialogFormVisible = false"> </el-button> <el-button @click="headDialogFormVisible = false"> </el-button>
@@ -44,6 +56,7 @@ const HEAD_FORM_TEMPLATE = {
headDialogFormVisible: false, headDialogFormVisible: false,
headOptions: [], headOptions: [],
viceHeadOptions: [], viceHeadOptions: [],
contactOptions: [],
sessionOptions: [], sessionOptions: [],
formRules: { formRules: {
@@ -51,7 +64,8 @@ const HEAD_FORM_TEMPLATE = {
name: [{required: true, message: "必填", trigger: ["change", "blur"]}], name: [{required: true, message: "必填", trigger: ["change", "blur"]}],
code: [{required: true, message: "必填", trigger: ["change", "blur"]}], code: [{required: true, message: "必填", trigger: ["change", "blur"]}],
userId: [{required: true, message: "必填", trigger: ["change", "blur"]}], userId: [{required: true, message: "必填", trigger: ["change", "blur"]}],
viceUserId: [{required: true, message: "必填", trigger: ["change", "blur"]}] viceUserId: [{required: true, message: "必填", trigger: ["change", "blur"]}],
contactUserId: [{required: true, message: "必填", trigger: ["change", "blur"]}]
} }
} }
}, },
@@ -69,7 +83,7 @@ const HEAD_FORM_TEMPLATE = {
this.findHeadUser() this.findHeadUser()
}, },
// 查询团长副团长 // 查询团长副团长、联络人
findHeadUser() { findHeadUser() {
this.$axios.post("/platform/teacherCongress/delegation/headUser", { this.$axios.post("/platform/teacherCongress/delegation/headUser", {
...this.formData, ...this.formData,
@@ -78,7 +92,7 @@ const HEAD_FORM_TEMPLATE = {
if (res.code === 0) { if (res.code === 0) {
if (res.data) { if (res.data) {
this.headOptions = [res.data] this.headOptions = [res.data]
this.$set(this.formData, "userId", res.data.id) this.$set(this.formData, "userId", res.data.userId)
} }
} }
}) })
@@ -89,7 +103,18 @@ const HEAD_FORM_TEMPLATE = {
if (res.code === 0) { if (res.code === 0) {
if (res.data) { if (res.data) {
this.viceHeadOptions = [res.data] this.viceHeadOptions = [res.data]
this.$set(this.formData, "viceUserId", res.data.id) this.$set(this.formData, "viceUserId", res.data.userId)
}
}
})
this.$axios.post("/platform/teacherCongress/delegation/headUser", {
...this.formData,
type: 'TEACHER_CONGRESS_DELEGATION_CONTACT'
}).then((res) => {
if (res.code === 0) {
if (res.data) {
this.contactOptions = [res.data]
this.$set(this.formData, "contactUserId", res.data.userId)
} }
} }
}) })
@@ -27,6 +27,7 @@ layout("/layouts/platform.html"){
<el-table-column label="教代会" prop="sessionName"></el-table-column> <el-table-column label="教代会" prop="sessionName"></el-table-column>
<el-table-column label="团长" prop="delegationHead"></el-table-column> <el-table-column label="团长" prop="delegationHead"></el-table-column>
<el-table-column label="副团长" prop="viceDelegationHead"></el-table-column> <el-table-column label="副团长" prop="viceDelegationHead"></el-table-column>
<el-table-column label="联络人" prop="delegationContact"></el-table-column>
<el-table-column label="操作" width="300"> <el-table-column label="操作" width="300">
<template slot-scope="scope"> <template slot-scope="scope">
<el-link @click="$refs.auFormRef.onOpen(scope.row.id)" size="mini" type="primary">编辑</el-link> <el-link @click="$refs.auFormRef.onOpen(scope.row.id)" size="mini" type="primary">编辑</el-link>
@@ -20,6 +20,9 @@ const PROPOSAL_INFO = {
<van-cell title="提案类别"> <van-cell title="提案类别">
{{viewData.typeName}} {{viewData.typeName}}
</van-cell> </van-cell>
<van-cell title="建议承办单位">
{{viewData.suggestUnits}}
</van-cell>
<van-cell title="立案结果"> <van-cell title="立案结果">
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT" <dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="viewData.caseFilingResult"></dict-tag> :value="viewData.caseFilingResult"></dict-tag>
@@ -57,11 +60,11 @@ const PROPOSAL_INFO = {
<!--邀请附议人--> <!--邀请附议人-->
<van-cell-group :title="task.displayName" <van-cell-group :title="task.displayName"
v-else-if="task.taskName === '85b7b9bd-d706-48cb-99a1-ef1370fb1819'"> v-else-if="task.taskName === 'invite'">
<van-cell title="办理用户">{{ task.taskFormData.userName }}({{task.taskFormData.loginName}}) <van-cell title="办理用户">{{ task.taskFormData.userName }}({{task.taskFormData.loginName}})
</van-cell> </van-cell>
<van-cell title="办理时间">{{ task.finishTime }}</van-cell> <van-cell title="办理时间">{{ task.finishTime }}</van-cell>
<van-cell title="附议人" v-if="task.taskName === '85b7b9bd-d706-48cb-99a1-ef1370fb1819'" <van-cell title="附议人" v-if="task.taskName === 'invite'"
class="direction-column-cell"> class="direction-column-cell">
<el-table :data="task?.taskFormData?.seconder"> <el-table :data="task?.taskFormData?.seconder">
<el-table-column label="姓名" prop="userName"></el-table-column> <el-table-column label="姓名" prop="userName"></el-table-column>
@@ -100,7 +103,7 @@ const PROPOSAL_INFO = {
<!--提案委员会立案--> <!--提案委员会立案-->
<van-cell-group :title="task.displayName" <van-cell-group :title="task.displayName"
v-else-if="task.taskName === '9846ab38-40c5-4093-bafc-a9b3b443338b'"> v-else-if="task.taskName === 'committee'">
<van-cell title="办理用户">{{ task.taskFormData.userName }}({{task.taskFormData.loginName}}) <van-cell title="办理用户">{{ task.taskFormData.userName }}({{task.taskFormData.loginName}})
</van-cell> </van-cell>
<van-cell title="办理时间">{{ task.finishTime }}</van-cell> <van-cell title="办理时间">{{ task.finishTime }}</van-cell>
@@ -113,10 +116,19 @@ const PROPOSAL_INFO = {
</van-cell-group> </van-cell-group>
<van-cell-group :title="task.displayName" v-else> <van-cell-group :title="task.displayName" v-else>
<van-cell title="办理单位" v-if="['master_reply','slave_reply'].includes(task.taskName)">
{{task.ext.underTakeName}}
</van-cell>
<van-cell title="办理用户">{{ task.taskFormData.userName }}({{task.taskFormData.loginName}}) <van-cell title="办理用户">{{ task.taskFormData.userName }}({{task.taskFormData.loginName}})
</van-cell> </van-cell>
<van-cell title="办理时间">{{ task.finishTime }}</van-cell> <van-cell title="办理时间">{{ task.finishTime }}</van-cell>
<van-cell title="办理结果">
<van-cell title="办理评价" v-if="['feedback'].includes(task.taskName)">
<dict-tag :options="dict.type.PROPOSAL_FEEDBACK"
:value="task.ext.tf_feedback"></dict-tag>
</van-cell>
<van-cell title="办理结果" v-else>
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT" <dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="task.ext.caseFilingResult"></dict-tag> :value="task.ext.caseFilingResult"></dict-tag>
</van-cell> </van-cell>
@@ -130,7 +142,7 @@ const PROPOSAL_INFO = {
<slot></slot> <slot></slot>
</van-action-sheet> </van-action-sheet>
`, `,
dicts: ["PROPOSAL_TYPE", "PROPOSAL_CASE_FILING_RESULT","PROCESS_TASK_SUBMIT_TYPE"], dicts: ["PROPOSAL_TYPE", "PROPOSAL_CASE_FILING_RESULT", "PROPOSAL_CASE_FILING_TYPE", "PROCESS_TASK_SUBMIT_TYPE", "PROPOSAL_FEEDBACK"],
data() { data() {
return { return {
visible:false, visible:false,
@@ -38,7 +38,7 @@ layout("/layouts/platform_h5.html"){
<span>编辑</span> <span>编辑</span>
</div> </div>
<div class="action-btn" <div class="action-btn"
v-if="row.taskKey === '85b7b9bd-d706-48cb-99a1-ef1370fb1819' || row.taskKey === '74458b33-ad6e-46c4-b8d9-1aa897142b25'" v-if="row.taskKey === 'invite' || row.taskKey === 'second'"
@click="onInvite(row)"> @click="onInvite(row)">
<i class="fa fa-user-plus"></i> <i class="fa fa-user-plus"></i>
<span>邀请附议人</span> <span>邀请附议人</span>
@@ -42,10 +42,10 @@ layout("/layouts/platform_h5.html"){
<i class="fa fa-edit"></i> <i class="fa fa-edit"></i>
<span>附议</span> <span>附议</span>
</div> </div>
<div class="action-btn delete" v-if="row.canRevoke" @click="onRevoke(row)"> <!-- <div class="action-btn delete" v-if="row.canRevoke" @click="onRevoke(row)">-->
<i class="fa fa-reply"></i> <!-- <i class="fa fa-reply"></i>-->
<span>撤回</span> <!-- <span>撤回</span>-->
</div> <!-- </div>-->
</template> </template>
</table-list> </table-list>
@@ -135,7 +135,8 @@ layout("/layouts/platform_h5.html"){
this.$refs.proposalInfoRef.onOpen(row) this.$refs.proposalInfoRef.onOpen(row)
this.formData = { this.formData = {
processTaskId: row.taskId, processTaskId: row.taskId,
taskName: row.curTaskName taskName: row.curTaskName,
tf_opinion: "同意该提案"
} }
}, },
@@ -187,8 +187,8 @@ layout("/layouts/platform_h5.html"){
processTaskId: row.taskId, processTaskId: row.taskId,
taskKey: row.taskKey, taskKey: row.taskKey,
taskName: row.taskName, taskName: row.taskName,
taskUnitName: row.taskUnitName, underTakeName: row.underTakeName,
taskIsMaster: row.taskIsMaster underTakeIsMaster: row.underTakeIsMaster
} }
}, },
@@ -209,7 +209,6 @@ layout("/layouts/platform_h5.html"){
}, },
onCandidatesConfirm(value) { onCandidatesConfirm(value) {
debugger
this.$set(this.formData, "tf_nextNodeOperatorName", value.text) this.$set(this.formData, "tf_nextNodeOperatorName", value.text)
this.$set(this.formData, "tf_nextNodeOperator", value.value) this.$set(this.formData, "tf_nextNodeOperator", value.value)
this.showCandidatesPicker = false this.showCandidatesPicker = false
@@ -222,6 +221,8 @@ layout("/layouts/platform_h5.html"){
title: "提示", title: "提示",
message: "您确定要提交吗?" message: "您确定要提交吗?"
}).then(() => { }).then(() => {
delete this.formData.underTakeIsMaster
delete this.formData.underTakeName
this.$axios.post("/flow/common/executeTask", { this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({ data: JSON.stringify({
...this.formData, ...this.formData,