diff --git a/src/main/java/com/budwk/app/base/constant/RoleConstant.java b/src/main/java/com/budwk/app/base/constant/RoleConstant.java
index c5231a4a..ff9d81d7 100644
--- a/src/main/java/com/budwk/app/base/constant/RoleConstant.java
+++ b/src/main/java/com/budwk/app/base/constant/RoleConstant.java
@@ -50,6 +50,7 @@ RoleConstant {
TEACHER_CONGRESS_DELEGATE_SPECIALLY_INVITE("教代会特邀代表"),
TEACHER_CONGRESS_DELEGATION_HEAD("教代会代表团团长"),
TEACHER_CONGRESS_VICE_DELEGATION_HEAD("教代会代表团副团长"),
+ TEACHER_CONGRESS_DELEGATION_CONTACT("教代会代表团联络人"),
PROPOSAL_COMMITTEE_DIRECTOR("提案委员会主任"),
PROPOSAL_COMMITTEE_DEPUTY_DIRECTOR("提案委员会副主任"),
diff --git a/src/main/java/com/budwk/app/flow/controller/FlowCommonController.java b/src/main/java/com/budwk/app/flow/controller/FlowCommonController.java
index 733fb9de..22728170 100644
--- a/src/main/java/com/budwk/app/flow/controller/FlowCommonController.java
+++ b/src/main/java/com/budwk/app/flow/controller/FlowCommonController.java
@@ -236,46 +236,6 @@ public class FlowCommonController {
@Aop(TransAop.READ_COMMITTED)
public Result executeTask(@Param("data") String 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);
return Result.success();
}
@@ -330,7 +290,7 @@ public class FlowCommonController {
@At("/surrogate")
@SaCheckLogin
- @ApiOperation("代理")
+ @ApiOperation("委托")
public Result surrogate(@Param("taskId") Long taskId, @Param("actorIds") String[] actorIds) {
flowEngine.processTaskService().addTaskActor(taskId, Arrays.asList(actorIds));
return Result.success();
@@ -338,11 +298,9 @@ public class FlowCommonController {
@At("/addCandidate")
@SaCheckLogin
- @ApiOperation("代理")
+ @ApiOperation("加签")
public Result addCandidate(@Param("taskId") Long taskId, @Param("actorIds") String[] actorIds) {
flowEngine.processTaskService().addCandidateActor(taskId, Arrays.asList(actorIds));
return Result.success();
}
-
-
}
diff --git a/src/main/java/com/budwk/app/flow/engine/cfg/Configuration.java b/src/main/java/com/budwk/app/flow/engine/cfg/Configuration.java
index 5fe4d0db..beea775e 100644
--- a/src/main/java/com/budwk/app/flow/engine/cfg/Configuration.java
+++ b/src/main/java/com/budwk/app/flow/engine/cfg/Configuration.java
@@ -9,8 +9,6 @@ import com.budwk.app.flow.engine.parser.impl.*;
/**
*
* 流程引擎配置类
- * @author mldong
- * @date 2022/6/12
*/
public class Configuration {
public Configuration() {
diff --git a/src/main/java/com/budwk/app/flow/engine/core/Execution.java b/src/main/java/com/budwk/app/flow/engine/core/Execution.java
index 64c434bb..c3525926 100644
--- a/src/main/java/com/budwk/app/flow/engine/core/Execution.java
+++ b/src/main/java/com/budwk/app/flow/engine/core/Execution.java
@@ -16,8 +16,6 @@ import java.util.stream.Collectors;
/**
*
* 执行对象参数
- * @author mldong
- * @date 2023/4/25
*/
@Data
public class Execution {
diff --git a/src/main/java/com/budwk/app/flow/engine/core/FlowEngineImpl.java b/src/main/java/com/budwk/app/flow/engine/core/FlowEngineImpl.java
index 324f0b74..c70a34ce 100644
--- a/src/main/java/com/budwk/app/flow/engine/core/FlowEngineImpl.java
+++ b/src/main/java/com/budwk/app/flow/engine/core/FlowEngineImpl.java
@@ -27,9 +27,6 @@ import java.util.List;
/**
* 工作流引擎实现
- *
- * @author mldong
- * @date 2023/5/29
*/
public class FlowEngineImpl implements FlowEngine {
protected Configuration configuration;
diff --git a/src/main/java/com/budwk/app/flow/engine/core/ServiceContext.java b/src/main/java/com/budwk/app/flow/engine/core/ServiceContext.java
index 64cdf2cf..381cc1e7 100644
--- a/src/main/java/com/budwk/app/flow/engine/core/ServiceContext.java
+++ b/src/main/java/com/budwk/app/flow/engine/core/ServiceContext.java
@@ -8,8 +8,6 @@ import java.util.List;
/**
*
* 单例服务上下文
- * @author mldong
- * @date 2022/6/12
*/
public class ServiceContext {
private static Context context;
diff --git a/src/main/java/com/budwk/app/flow/engine/event/ProcessEvent.java b/src/main/java/com/budwk/app/flow/engine/event/ProcessEvent.java
index bb6ae2de..3d317db0 100644
--- a/src/main/java/com/budwk/app/flow/engine/event/ProcessEvent.java
+++ b/src/main/java/com/budwk/app/flow/engine/event/ProcessEvent.java
@@ -6,8 +6,6 @@ import lombok.Data;
/**
* 流程开始事件
- * @author mldong
- * @date 2023/12/5
*/
@Data
@Builder
diff --git a/src/main/java/com/budwk/app/flow/engine/event/ProcessEventListener.java b/src/main/java/com/budwk/app/flow/engine/event/ProcessEventListener.java
index c28bec11..38de77b4 100644
--- a/src/main/java/com/budwk/app/flow/engine/event/ProcessEventListener.java
+++ b/src/main/java/com/budwk/app/flow/engine/event/ProcessEventListener.java
@@ -2,8 +2,6 @@ package com.budwk.app.flow.engine.event;
/**
* 流程事件监听接口
- * @author mldong
- * @date 2023/12/5
*/
public interface ProcessEventListener {
void onEvent(ProcessEvent event);
diff --git a/src/main/java/com/budwk/app/flow/engine/event/ProcessPublisher.java b/src/main/java/com/budwk/app/flow/engine/event/ProcessPublisher.java
index 7bced1ee..7665dad0 100644
--- a/src/main/java/com/budwk/app/flow/engine/event/ProcessPublisher.java
+++ b/src/main/java/com/budwk/app/flow/engine/event/ProcessPublisher.java
@@ -6,8 +6,6 @@ import java.util.List;
/**
* 流程事件发布者类
- * @author mldong
- * @date 2023/12/5
*/
public class ProcessPublisher {
// 事件通知方法
diff --git a/src/main/java/com/budwk/app/flow/engine/handlers/IHandler.java b/src/main/java/com/budwk/app/flow/engine/handlers/IHandler.java
index b66fa287..da6a9a78 100644
--- a/src/main/java/com/budwk/app/flow/engine/handlers/IHandler.java
+++ b/src/main/java/com/budwk/app/flow/engine/handlers/IHandler.java
@@ -5,8 +5,6 @@ import com.budwk.app.flow.engine.core.Execution;
/**
* 流程各模型操作处理接口
- * @author mldong
- * @date 2023/5/17
*/
public interface IHandler {
/**
diff --git a/src/main/java/com/budwk/app/flow/engine/handlers/impl/CountersignHandler.java b/src/main/java/com/budwk/app/flow/engine/handlers/impl/CountersignHandler.java
index 14089e7b..6d222013 100644
--- a/src/main/java/com/budwk/app/flow/engine/handlers/impl/CountersignHandler.java
+++ b/src/main/java/com/budwk/app/flow/engine/handlers/impl/CountersignHandler.java
@@ -16,8 +16,6 @@ import java.util.stream.Collectors;
/**
* 会签任务处理,用于判断会签任务是否可通过
*
- * @author mldong
- * @date 2023/11/24
*/
public class CountersignHandler implements IHandler {
private TaskModel taskModel;
diff --git a/src/main/java/com/budwk/app/flow/engine/handlers/impl/CreateTaskHandler.java b/src/main/java/com/budwk/app/flow/engine/handlers/impl/CreateTaskHandler.java
index 4b32ee6b..74515aba 100644
--- a/src/main/java/com/budwk/app/flow/engine/handlers/impl/CreateTaskHandler.java
+++ b/src/main/java/com/budwk/app/flow/engine/handlers/impl/CreateTaskHandler.java
@@ -16,8 +16,6 @@ import java.util.List;
/**
* 创建任务处理器
- * @author mldong
- * @date 2023/5/16
*/
public class CreateTaskHandler implements IHandler {
private TaskModel taskModel;
diff --git a/src/main/java/com/budwk/app/flow/engine/handlers/impl/EndProcessHandler.java b/src/main/java/com/budwk/app/flow/engine/handlers/impl/EndProcessHandler.java
index 689b81c5..d9d50b18 100644
--- a/src/main/java/com/budwk/app/flow/engine/handlers/impl/EndProcessHandler.java
+++ b/src/main/java/com/budwk/app/flow/engine/handlers/impl/EndProcessHandler.java
@@ -14,10 +14,7 @@ import com.budwk.app.flow.enums.ProcessEventTypeEnum;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
/**
- *
* 结束流程实例的处理器
- * @author mldong
- * @date 2023/5/29
*/
public class EndProcessHandler implements IHandler {
private EndModel endModel;
diff --git a/src/main/java/com/budwk/app/flow/engine/handlers/impl/MergeBranchHandler.java b/src/main/java/com/budwk/app/flow/engine/handlers/impl/MergeBranchHandler.java
index 6beb2861..b3196fcd 100644
--- a/src/main/java/com/budwk/app/flow/engine/handlers/impl/MergeBranchHandler.java
+++ b/src/main/java/com/budwk/app/flow/engine/handlers/impl/MergeBranchHandler.java
@@ -11,8 +11,6 @@ import java.util.List;
/**
* 合并分支操作的处理器
- * @author mldong
- * @date 2023/5/21
*/
public class MergeBranchHandler implements IHandler {
private JoinModel joinModel;
diff --git a/src/main/java/com/budwk/app/flow/engine/handlers/impl/StartSubProcessHandler.java b/src/main/java/com/budwk/app/flow/engine/handlers/impl/StartSubProcessHandler.java
index 8d213b6d..756b9db1 100644
--- a/src/main/java/com/budwk/app/flow/engine/handlers/impl/StartSubProcessHandler.java
+++ b/src/main/java/com/budwk/app/flow/engine/handlers/impl/StartSubProcessHandler.java
@@ -9,9 +9,6 @@ import com.budwk.app.flow.entity.ProcessDefine;
/**
* 启动子流程处理类
- *
- * @author mldong
- * @date 2023/12/7
*/
public class StartSubProcessHandler implements IHandler {
private SubProcessModel model;
diff --git a/src/main/java/com/budwk/app/flow/engine/impl/SimpleContext.java b/src/main/java/com/budwk/app/flow/engine/impl/SimpleContext.java
index 074754bd..aae8cba8 100644
--- a/src/main/java/com/budwk/app/flow/engine/impl/SimpleContext.java
+++ b/src/main/java/com/budwk/app/flow/engine/impl/SimpleContext.java
@@ -12,8 +12,6 @@ import java.util.Map;
/**
*
* 简单的上下文发现实现类
- * @author mldong
- * @date 2023/4/26
*/
public class SimpleContext implements Context {
private Dict dict = Dict.create();
diff --git a/src/main/java/com/budwk/app/flow/engine/impl/SurrogateInterceptor.java b/src/main/java/com/budwk/app/flow/engine/impl/SurrogateInterceptor.java
index ad02e5fa..7779e8ea 100644
--- a/src/main/java/com/budwk/app/flow/engine/impl/SurrogateInterceptor.java
+++ b/src/main/java/com/budwk/app/flow/engine/impl/SurrogateInterceptor.java
@@ -16,8 +16,6 @@ import java.util.List;
/**
* 任务拦截器,处理代理人
*
- * @author mldong
- * @date 2023/12/6
*/
@IocBean
public class SurrogateInterceptor implements FlowInterceptor {
diff --git a/src/main/java/com/budwk/app/flow/engine/util/FlowUtil.java b/src/main/java/com/budwk/app/flow/engine/util/FlowUtil.java
index 192ea31e..cc7af134 100644
--- a/src/main/java/com/budwk/app/flow/engine/util/FlowUtil.java
+++ b/src/main/java/com/budwk/app/flow/engine/util/FlowUtil.java
@@ -14,6 +14,7 @@ import com.budwk.app.sys.views.View_user;
import org.dromara.warm.flow.core.exception.FlowException;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
+import org.nutz.lang.util.NutMap;
import java.util.Date;
import java.util.HashMap;
@@ -22,8 +23,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
/**
* 流程工具
*
- * @author mldong
- * @date 2023/10/7
*/
public class FlowUtil {
private FlowUtil() {
@@ -83,6 +82,19 @@ public class FlowUtil {
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();
+ }
+
/**
* 判断是否为第一个任务节点
*
diff --git a/src/main/java/com/budwk/app/flow/entity/ProcessTask.java b/src/main/java/com/budwk/app/flow/entity/ProcessTask.java
index 0c0c7584..072cadfc 100644
--- a/src/main/java/com/budwk/app/flow/entity/ProcessTask.java
+++ b/src/main/java/com/budwk/app/flow/entity/ProcessTask.java
@@ -15,9 +15,6 @@ import java.util.Date;
*
* 流程任务
*
- *
- * @author mldong
- * @since 2023-09-26
*/
@Getter
@Setter
@@ -25,7 +22,6 @@ import java.util.Date;
@Comment("流程任务")
public class ProcessTask extends BaseModel {
-
@Comment("主键")
@Id
private Long id;
diff --git a/src/main/java/com/budwk/app/flow/entity/ProcessTaskActor.java b/src/main/java/com/budwk/app/flow/entity/ProcessTaskActor.java
index 0c1d3756..9324166b 100644
--- a/src/main/java/com/budwk/app/flow/entity/ProcessTaskActor.java
+++ b/src/main/java/com/budwk/app/flow/entity/ProcessTaskActor.java
@@ -12,9 +12,6 @@ import org.nutz.dao.entity.annotation.Table;
*
* 流程任务和参与人关系
*
- *
- * @author mldong
- * @since 2023-09-26
*/
@EqualsAndHashCode(callSuper = true)
@Data
diff --git a/src/main/java/com/budwk/app/flow/enums/ProcessTaskStateEnum.java b/src/main/java/com/budwk/app/flow/enums/ProcessTaskStateEnum.java
index b9b01ea7..85e933fa 100644
--- a/src/main/java/com/budwk/app/flow/enums/ProcessTaskStateEnum.java
+++ b/src/main/java/com/budwk/app/flow/enums/ProcessTaskStateEnum.java
@@ -8,13 +8,13 @@ import lombok.Getter;
@Getter
public enum ProcessTaskStateEnum {
- DOING(10,"进行中"),
+ DOING(10, "进行中"),
FINISHED(20, "已完成"),
WITHDRAW(30, "已撤回"),
INTERRUPT(40, "强行终止"),
- PENDING(50,"挂起"),
- ABANDON(99,"已废弃")
- ;
+ PENDING(50, "挂起"),
+ TRANSFER(60, "已转办"),
+ ABANDON(99, "已废弃");
private final Integer code;
private final String message;
diff --git a/src/main/java/com/budwk/app/flow/service/ProcessInstanceService.java b/src/main/java/com/budwk/app/flow/service/ProcessInstanceService.java
index f92e552e..1c1fcc46 100644
--- a/src/main/java/com/budwk/app/flow/service/ProcessInstanceService.java
+++ b/src/main/java/com/budwk/app/flow/service/ProcessInstanceService.java
@@ -17,9 +17,6 @@ import java.util.List;
*
* 流程实例 服务类
*
- *
- * @author mldong
- * @since 2023-09-26
*/
public interface ProcessInstanceService extends BaseService {
/**
diff --git a/src/main/java/com/budwk/app/flow/service/ProcessSurrogateService.java b/src/main/java/com/budwk/app/flow/service/ProcessSurrogateService.java
index 7054ee63..269555d6 100644
--- a/src/main/java/com/budwk/app/flow/service/ProcessSurrogateService.java
+++ b/src/main/java/com/budwk/app/flow/service/ProcessSurrogateService.java
@@ -28,12 +28,6 @@ public interface ProcessSurrogateService extends BaseService {
*/
boolean update(ProcessSurrogate param);
- /**
- * 自定义分页查询流程委托代理
- * @param param
- * @return
- */
-// CommonPage page(ProcessSurrogatePageParam param);
/**
* 通过id查询
* @param id
diff --git a/src/main/java/com/budwk/app/flow/service/ProcessTaskActorService.java b/src/main/java/com/budwk/app/flow/service/ProcessTaskActorService.java
index c3859739..88cffd7b 100644
--- a/src/main/java/com/budwk/app/flow/service/ProcessTaskActorService.java
+++ b/src/main/java/com/budwk/app/flow/service/ProcessTaskActorService.java
@@ -9,9 +9,6 @@ import com.budwk.app.flow.vo.ProcessTaskActorVO;
*
* 流程任务和参与人关系 服务类
*
- *
- * @author mldong
- * @since 2023-09-26
*/
public interface ProcessTaskActorService extends BaseService {
/**
@@ -28,12 +25,6 @@ public interface ProcessTaskActorService extends BaseService {
*/
boolean update(ProcessTaskActor param);
- /**
- * 自定义分页查询流程任务和参与人关系
- * @param param
- * @return
- */
-// CommonPage page(ProcessTaskActorPageParam param);
/**
* 通过id查询
* @param id
diff --git a/src/main/java/com/budwk/app/flow/service/ProcessTaskService.java b/src/main/java/com/budwk/app/flow/service/ProcessTaskService.java
index 53889111..ab9402cd 100644
--- a/src/main/java/com/budwk/app/flow/service/ProcessTaskService.java
+++ b/src/main/java/com/budwk/app/flow/service/ProcessTaskService.java
@@ -11,77 +11,82 @@ import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.vo.ProcessTaskVO;
import java.util.List;
-import java.util.Map;
/**
*
* 流程任务 服务类
*
- *
- * @author mldong
- * @since 2023-09-26
*/
public interface ProcessTaskService extends BaseService {
/**
- * 添加流程任务
- * @param param
- * @return
- */
+ * 添加流程任务
+ *
+ * @param param
+ * @return
+ */
boolean save(ProcessTask param);
/**
- * 更新流程任务
- * @param param
- * @return
- */
+ * 更新流程任务
+ *
+ * @param param
+ * @return
+ */
boolean update(ProcessTask param);
/**
- * 通过id查询
- * @param id
- * @return
- */
+ * 通过id查询
+ *
+ * @param id
+ * @return
+ */
ProcessTaskVO findById(Long id);
/**
* 保存流程任务
+ *
* @param processTask
*/
void saveProcessTask(ProcessTask processTask);
/**
* 更新流程任务
+ *
* @param processTask
*/
void updateProcessTask(ProcessTask processTask);
/**
* 根据流程实例ID获取正在进行的任务
+ *
* @param processInstanceId 流程实例ID
- * @param taskNames 任务名称
+ * @param taskNames 任务名称
* @return
*/
List getDoingTaskList(Long processInstanceId, String[] taskNames);
/**
* 根据流程实例ID获取已完成的任务
+ *
* @param processInstanceId 流程实例ID
- * @param taskNames 任务名称
+ * @param taskNames 任务名称
* @return
*/
List getDoneTaskList(Long processInstanceId, String[] taskNames);
/**
* 将流程任务修改为已完成
+ *
* @param processTaskId
- * @param operator 任务处理人
+ * @param operator 任务处理人
* @param args
*/
void finishProcessTask(Long processTaskId, String operator, Dict args);
/**
* 废弃任务
+ *
* @param processTaskId
* @param operator
* @param args
@@ -90,6 +95,7 @@ public interface ProcessTaskService extends BaseService {
/**
* 根据任务模型和流程执行对象创建任务
+ *
* @param taskModel
* @param execution
* @return
@@ -98,6 +104,7 @@ public interface ProcessTaskService extends BaseService {
/**
* 通过id获取流程任务
+ *
* @param id
* @return
*/
@@ -105,27 +112,32 @@ public interface ProcessTaskService extends BaseService {
/**
* 向指定的任务id添加参与者
+ *
* @param processTaskId 任务id
- * @param actors 参与者
+ * @param actors 参与者
*/
void addTaskActor(Long processTaskId, List actors);
/**
* 向指定的任务id添加参与者
+ *
* @param processTaskId 流程任务id
- * @param actors 参与者
+ * @param actors 参与者
*/
void addCandidateActor(Long processTaskId, List actors);
/**
* 向指定任务移除参与者
+ *
* @param processTaskId 任务id
- * @param actors 参与者
+ * @param actors 参与者
*/
void removeTaskActor(Long processTaskId, List actors);
+
/**
* 根据taskId、operator,判断操作人operator是否允许执行任务
- * @param task 任务对象
+ *
+ * @param task 任务对象
* @param operator 操作人
* @return boolean 是否允许操作
*/
@@ -133,6 +145,7 @@ public interface ProcessTaskService extends BaseService {
/**
* 根据任务ID获取参与者ID
+ *
* @param processTaskId
* @return
*/
@@ -140,7 +153,8 @@ public interface ProcessTaskService extends BaseService {
/**
* 根据当前任务对象驳回至上一步处理
- * @param model 流程定义模型,用以获取上一步模型对象
+ *
+ * @param model 流程定义模型,用以获取上一步模型对象
* @param currentTask 当前任务对象
* @return Task 任务对象
*/
@@ -148,6 +162,7 @@ public interface ProcessTaskService extends BaseService {
/**
* 获取可跳转的任务节点名称
+ *
* @param processInstanceId
* @return
*/
@@ -155,6 +170,7 @@ public interface ProcessTaskService extends BaseService {
/**
* 创建会签任务
+ *
* @param taskModel
* @param execution
* @return
@@ -163,16 +179,26 @@ public interface ProcessTaskService extends BaseService {
/**
* 根据执行对象、自定义节点模型创建历史任务记录
+ *
* @param execution 执行对象
- * @param model 自定义节点模型
+ * @param model 自定义节点模型
* @return 历史任务
*/
ProcessTask history(Execution execution, CustomModel model);
/**
* 根据流程实例ID获取最新的进行中的任务
+ *
* @param processInstanceId
* @return
*/
ProcessTaskVO latest(Long processInstanceId);
+
+ /**
+ * 转办任务
+ *
+ * @param taskId 任务ID
+ * @param transferUserId 转办用户ID
+ */
+ void transfer(Long taskId, String transferUserId);
}
diff --git a/src/main/java/com/budwk/app/flow/service/impl/ProcessTaskServiceImpl.java b/src/main/java/com/budwk/app/flow/service/impl/ProcessTaskServiceImpl.java
index 35d5e627..fc01dcbe 100644
--- a/src/main/java/com/budwk/app/flow/service/impl/ProcessTaskServiceImpl.java
+++ b/src/main/java/com/budwk/app/flow/service/impl/ProcessTaskServiceImpl.java
@@ -211,7 +211,7 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl impleme
if (CollectionUtil.isEmpty(actors)) return;
List dbActors = getTaskActors(processTaskId);
List 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);
List list = listMap(sql);
@@ -222,19 +222,11 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl impleme
processTaskActor.setActorName(actor.getString("username"));
processTaskActor.setActorAccount(actor.getString("loginname"));
processTaskActor.setActorUnitName(actor.getString("unitName"));
+ processTaskActor.setActorUnitId(actor.getString("unitId"));
processTaskActor.setCreatedAt(System.currentTimeMillis());
System.out.println(StrUtil.format("给任务:{},添加参与者:{}", processTaskId, actor.toString()));
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
@@ -465,6 +457,41 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl impleme
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 processTaskList = List.of(task);
+ processTaskList.forEach(processTask -> {
+ ProcessPublisher.notify(ProcessEvent.builder().eventType(ProcessEventTypeEnum.PROCESS_TASK_START).sourceId(processTask.getId()).build());
+ });
+
+ }
+
/**
* 根据Task模型的assignee、assignmentHandler属性以及运行时数据,确定参与者
*
diff --git a/src/main/java/com/budwk/app/flow/vo/ProcessTaskVO.java b/src/main/java/com/budwk/app/flow/vo/ProcessTaskVO.java
index 5accdfbc..d962cdda 100644
--- a/src/main/java/com/budwk/app/flow/vo/ProcessTaskVO.java
+++ b/src/main/java/com/budwk/app/flow/vo/ProcessTaskVO.java
@@ -1,5 +1,6 @@
package com.budwk.app.flow.vo;
+import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil;
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.replaceAll(FlowConst.TASK_FORM_DATA_PREFIX,""),ext.get(key));
});
+ this.taskFormData.put("finishTimeForDocx", DateUtil.format(getFinishTime(),"yyyy年MM月dd日"));
return taskFormData;
}
diff --git a/src/main/java/com/budwk/app/sys/controller/SysHomeController.java b/src/main/java/com/budwk/app/sys/controller/SysHomeController.java
index 7123fbaf..764f3c90 100644
--- a/src/main/java/com/budwk/app/sys/controller/SysHomeController.java
+++ b/src/main/java/com/budwk/app/sys/controller/SysHomeController.java
@@ -5,7 +5,7 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.useragent.UserAgent;
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.sys.models.Sys_home_activity;
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.Ok;
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.HttpSession;
@@ -172,6 +170,22 @@ public class SysHomeController {
return Result.success(sysMenus);
}
+ @At
+ @SaCheckLogin
+ @ApiOperation("获取收藏应用")
+ @Ok("json")
+ public Result listFavorite(@Param(value = "platform", df = "PC") String platform) {
+ List 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 menus = sysUserService.getMenus(SecurityUtil.getUserId());
+ List allMenuIds = menus.stream().map(Sys_menu::getId).toList();
+ List sysMenus = list.stream().filter(m -> allMenuIds.contains(m.getId())).sorted(Comparator.comparingInt(Sys_menu::getLocation)).toList();
+ return Result.success(sysMenus);
+ }
+
@At
@SaCheckLogin
@@ -240,43 +254,76 @@ public class SysHomeController {
@SaCheckLogin
@ApiOperation("获取新闻")
@Ok("json")
- @CacheDefaults(cacheName = RedisConstant.PLATFORM_REDIS_WKCACHE_PREFIX + "web_news", isHash = true)
- @CacheResult(cacheKey = "news", ignoreNull = true, cacheLiveTime = 60 * 60 * 24)
+// @CacheDefaults(cacheName = RedisConstant.PLATFORM_REDIS_WKCACHE_PREFIX + "web_news", isHash = true)
+// @CacheResult(cacheKey = "news", ignoreNull = true, cacheLiveTime = 60 * 60 * 24)
public Result getNews() {
// 定义要爬取的URL
- String domain = "http://nsdgh.njnu.edu.cn";
+ String domain = "https://cdgh.ncu.edu.cn/";
try {
// 使用Jsoup连接到URL并获取页面内容
- Document document = Jsoup.connect(domain).get();
- List results = new ArrayList<>();
+ Document doc = Jsoup.connect(domain).get();
- // 最新新闻
- Element newsElement = document.getElementById("news");
- // 获取所有li元素下的a标签
- Elements links = newsElement.select("li a");
- List 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));
+ JSONObject root = new JSONObject();
- // 通知公告
- Elements newsSections = document.select("div.news1");
- for (Element section : newsSections) {
- String category = section.selectFirst("h6").ownText(); // 获取"通知公告"或"分工会"
- Elements items = section.select("li a");
- List list1 = items.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", category).addv("value", list1));
+ // 1. 新闻快讯(来自 .list1)
+ List newsArray = new ArrayList<>();
+ Elements newsItems = doc.select(".group1 .list1 li");
+ for (Element item : newsItems) {
+ String date = item.select(".date").text().trim();
+ Element link = item.select("a.text").first();
+ String title = link.select(".title").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);
+ newsArray.add(node);
}
+ root.set("news", newsArray);
- return Result.success(results);
+ // 2. 通知公告(来自 .list2)
+ List 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 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();
+ }
+
+ 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) {
log.error(e);
return Result.success();
diff --git a/src/main/java/com/budwk/app/sys/services/SysRoleService.java b/src/main/java/com/budwk/app/sys/services/SysRoleService.java
index 7371e05c..f8cb5d87 100644
--- a/src/main/java/com/budwk/app/sys/services/SysRoleService.java
+++ b/src/main/java/com/budwk/app/sys/services/SysRoleService.java
@@ -114,6 +114,11 @@ public interface SysRoleService extends BaseService {
*/
Sys_role getByCode(String code);
+ /**
+ * 通过枚举获取角色
+ * @param roleConstant
+ * @return
+ */
Sys_role getByCode(RoleConstant roleConstant);
/**
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/config/ProposalConfigUnitController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/config/ProposalConfigUnitController.java
index 1009764f..6e5ac641 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/config/ProposalConfigUnitController.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/config/ProposalConfigUnitController.java
@@ -114,7 +114,7 @@ public class ProposalConfigUnitController {
@SLog(tag = "提案", msg = "承办单位同步系统单位")
public Result syncSysUnit() {
Sql sql = Sqls.create("select code from proposal_undertake");
- List sysUnits = dao.query(Sys_unit.class, Cnd.where(Sys_unit::getUnitcode, "not in", sql).and(Sys_unit::getUnitLevel, "=", 2));
+ List sysUnits = dao.query(Sys_unit.class, Cnd.where(Sys_unit::getUnitcode, "not in", sql).and(Sys_unit::getUnitTypeCode, "=", 1));
List proposalUndertakes = sysUnits.stream().map(unit -> {
ProposalUndertake proposalUndertake = new ProposalUndertake();
proposalUndertake.setCode(unit.getUnitcode());
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/dashboard/ProposalDashboardController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/dashboard/ProposalDashboardController.java
index b2ee782e..8a16d65c 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/dashboard/ProposalDashboardController.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/dashboard/ProposalDashboardController.java
@@ -133,8 +133,8 @@ public class ProposalDashboardController {
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.displayName curTaskName,
- JSON_UNQUOTE(JSON_EXTRACT(caseTasks.variable, '$.tf_hostUnitName')) AS masterUnitName,
- caseTasks.variable->>'$.tf_helpUnitNameStr' AS slaveUnitNames
+ 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
proposal_info info
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_delegate tcde on tcde.loginName = info.createUserLoginName
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 proposal_reply_unit pru ON pru.proposalId = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
$condition
""");
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/export/ProposalExportComprehensiveController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/export/ProposalExportComprehensiveController.java
index 21609f7f..d008cc05 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/export/ProposalExportComprehensiveController.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/export/ProposalExportComprehensiveController.java
@@ -21,22 +21,12 @@ import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
-/**
- * @version 1.0
- * @Author zzr
- * @name:ProposalExportComprehensiveController
- * @Date 2024/10/10 9:52
- * @注释
- */
@Slf4j
@IocBean
@Ok("json:full")
@At("/platform/proposal/export/comprehensive")
public class ProposalExportComprehensiveController {
- @Inject
- private BaseService baseService;
-
@Inject
private ProposalExportService proposalExportService;
@@ -62,8 +52,8 @@ public class ProposalExportComprehensiveController {
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.displayName curTaskName,
- JSON_UNQUOTE(JSON_EXTRACT(caseTasks.variable, '$.tf_hostUnitName')) AS masterUnitName,
- caseTasks.variable->>'$.tf_helpUnitNameStr' AS slaveUnitNames
+ 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
proposal_info info
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_delegate tcde on tcde.loginName = info.createUserLoginName
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 proposal_reply_unit pru ON pru.proposalId = info.id
$condition
""");
Cnd cnd = Cnd.NEW();
ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm);
cnd.groupBy("info.id");
sql.setCondition(cnd);
- Pagination pagination = baseService.listPageVO(pageForm, sql, ProposalInfoPageVO.class);
+ Pagination pagination = proposalExportService.listPageMap(pageForm.getPageNumber(),pageForm.getPageSize(), sql);
return Result.success(pagination);
}
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryComprehensiveController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryComprehensiveController.java
index 7e233ae2..ba78e8c8 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryComprehensiveController.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryComprehensiveController.java
@@ -59,8 +59,8 @@ public class ProposalQueryComprehensiveController {
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.displayName curTaskName,
- JSON_UNQUOTE(JSON_EXTRACT(caseTasks.variable, '$.tf_hostUnitName')) AS masterUnitName,
- caseTasks.variable->>'$.tf_helpUnitNameStr' AS slaveUnitNames
+ 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
proposal_info info
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_delegate tcde on tcde.loginName = info.createUserLoginName
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 proposal_reply_unit pru ON pru.proposalId = info.id
$condition
""");
Cnd cnd = Cnd.NEW();
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryHistoryController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryHistoryController.java
index 00363d62..bef552b4 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryHistoryController.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryHistoryController.java
@@ -52,8 +52,8 @@ public class ProposalQueryHistoryController {
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.displayName curTaskName,
- JSON_UNQUOTE(JSON_EXTRACT(caseTasks.variable, '$.tf_hostUnitName')) AS masterUnitName,
- caseTasks.variable->>'$.tf_helpUnitNameStr' AS slaveUnitNames
+ 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
proposal_info info
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_delegate tcde on tcde.loginName = info.createUserLoginName
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 proposal_reply_unit pru ON pru.proposalId = info.id
$condition
""");
Cnd cnd = Cnd.NEW();
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryUnitReplyController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryUnitReplyController.java
index 5c8f090f..c4d7cc88 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryUnitReplyController.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryUnitReplyController.java
@@ -2,26 +2,24 @@ package com.budwk.app.zhgh.democratic.proposal.controller.query;
import cn.dev33.satoken.annotation.SaCheckPermission;
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.enums.ProcessTaskStateEnum;
-import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
-import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake;
+import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig;
+import com.budwk.app.zhgh.democratic.proposal.models.ProposalReplyUnit;
import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Cnd;
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.IocBean;
-import org.nutz.json.Json;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
import java.util.stream.Collectors;
/**
@@ -47,111 +45,90 @@ public class ProposalQueryUnitReplyController {
@At
@SaCheckPermission("proposal.query.unitReply")
public Result data(String sessionId, String undertakeUnitId) {
- List infos = dao.query(ProposalInfo.class, Cnd.where(ProposalInfo::getSessionId, "=", sessionId));
- List infoIds = infos.stream().map(v -> v.getId()).toList();
- List instances = dao.query(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "in", infoIds));
- List instIds = instances.stream().map(v -> v.getId()).toList();
+ // 提案配置 协办是否需要答复
+ ProposalConfig proposalConfig = dao.fetch(ProposalConfig.class, Cnd.NEW());
+ boolean slaveNeedReply = proposalConfig.getSlaveUnitNeedReply();
- // 立案任务记录
- List caseTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds)
- .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode())
- .and(ProcessTask::getTaskName, "=", "9846ab38-40c5-4093-bafc-a9b3b443338b"));
+ // 当前届次所有的提案ID
+ Sql sql = Sqls.create("select id from proposal_info where sessionId = @sessionId").setParam("sessionId", sessionId);
+ sql.setCallback(Sqls.callback.strList());
+ dao.execute(sql);
+ List proposalIds = sql.getList(String.class);
- // 主办任务记录
- List masterUnitTasks = 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, "in", List.of("85cf23da-2dd5-4007-a1e9-bd9bfddc68f0", "5ed5a1be-0cd3-4b47-a0d5-238d53b61f34")));
-
- // 协办任务记录
- List 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"));
+ if(proposalIds.isEmpty()){
+ return Result.success().addData(Map.of("tableData", Collections.EMPTY_LIST, "slaveNeedReply", slaveNeedReply));
+ }
- //该届次所有涉及到的承办单位
- List underTakeIds = caseTasks.stream().map(v -> {
- NutMap variable = Json.fromJson(NutMap.class, v.getVariable());
- String hostUnitId = variable.getString("tf_hostUnitId");
- List helpUnitIds = variable.getAsList("tf_helpUnitIds", String.class);
- List list = new ArrayList<>();
- list.add(hostUnitId);
- list.addAll(helpUnitIds);
- return list;
- })
- .flatMap(List::stream)
- .distinct()
- .toList();
+ // 关联所有的实例ID
+ Sql instSql = Sqls.create("select id from wf_process_instance where businessNo in (@proposalIds)");
+ instSql.setParam("proposalIds", proposalIds);
+ instSql.setCallback(Sqls.callback.strList());
+ dao.execute(instSql);
+ List instIds = instSql.getList(String.class);
+ // 提案委员会立案分配的承办单位
+ Cnd cnd = Cnd.where(ProposalReplyUnit::getProposalId, "in", proposalIds);
+ cnd.andEX(ProposalReplyUnit::getUnitId, "=", undertakeUnitId);
+ List replyUnits = dao.query(ProposalReplyUnit.class, cnd);
- List undertakes = dao.query(ProposalUndertake.class, Cnd.where(ProposalUndertake::getId, "in", underTakeIds));
- Map undertakeMap = undertakes.stream().collect(Collectors.toMap(ProposalUndertake::getId, v -> v));
+ // 承办单位答复记录
+ List 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 tableData = new ArrayList<>();
- for (String underTakeId : underTakeIds) {
+ replyUnits.stream().collect(Collectors.groupingBy(ProposalReplyUnit::getUnitCode)).forEach((k, v) -> {
NutMap tableRow = NutMap.NEW();
- tableRow.put("id", underTakeId);
- if(undertakeMap.get(underTakeId) == null){
- continue;
- }
- tableRow.put("name", undertakeMap.get(underTakeId).getName());
+ tableRow.put("id", k);
+ v.stream().findAny().ifPresent(item -> {
+ tableRow.put("unitName", item.getUnitName());
+ tableRow.put("unitCode", item.getUnitCode());
+ });
- //找出承办提案总数
- long sum = caseTasks.stream()
- .filter(v -> {
- NutMap variable = Json.fromJson(NutMap.class, v.getVariable());
- if (variable == null) {
- return false;
- }
+ // 提案总数
+ 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());
- String hostUnitId = variable.getString("tf_hostUnitId");
- List 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;
- })
- .map(ProcessTask::getProcessInstanceId)
- .distinct()
- .count();
+ // 协办提案已答复数
+ long slaveReplySum = 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();
- // 主办提案数量
- long hostSum = masterUnitTasks.stream().map(v -> Json.fromJson(NutMap.class, v.getVariable())).filter(variable -> underTakeId.equals(variable.getString("unitId")) && variable.getBoolean("isMaster")).count();
- // 主办已答复的数量
- 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();
- // 主办未答复的数量
- long hostNoReplySum = hostSum - hostReplySum;
+ // 协办提案未答复数
+ long slaveNoReplySum = 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();
+ 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);
- }
- return Result.success().addData(Map.of("tableData", tableData, "slaveNeedReply", false));
+ });
+
+ return Result.success().addData(Map.of("tableData", tableData, "slaveNeedReply", slaveNeedReply));
}
}
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryYearReportController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryYearReportController.java
index 0df1aca2..b1909122 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryYearReportController.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryYearReportController.java
@@ -29,8 +29,6 @@ import javax.validation.Valid;
@Api(tags = "提案年度报告")
public class ProposalQueryYearReportController {
- @Inject
- private BaseService baseService;
@Inject
private ProposalCommonService proposalCommonService;
@@ -51,13 +49,14 @@ public class ProposalQueryYearReportController {
type.name AS typeName,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName,
- inst.processInstanceNodeId,
- inst.processInstanceNodeCode,
- inst.processInstanceNodeName,
- inst.processInstanceTaskIds,
- inst.processInstanceStatus,
- JSON_UNQUOTE(JSON_EXTRACT(caseUnitTasks.extVariable, '$.hostUnit')) AS masterUnderTakeName,
- JSON_EXTRACT(caseUnitTasks.extVariable, '$.helpUnits') AS slaveUnderTakeNames
+ ins.id AS instanceId,
+ ins.businessNo,
+ ins.state instanceState,
+ ins.variable instanceVariable,
+ ins.processDefineId instanceProcessDefineId,
+ t.displayName curTaskName,
+ 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
proposal_info info
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_delegation tcd on tcd.id = info.delegationId
LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName
- LEFT JOIN bpm_process_instance inst ON inst.processInstanceBusinessId = info.id
- LEFT JOIN (
- SELECT
- 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
+ LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
+ 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
""");
Cnd cnd = Cnd.NEW();
ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm);
cnd.groupBy("info.id");
sql.setCondition(cnd);
- Pagination pagination = baseService.listPageVO(pageForm,sql, ProposalInfoPageVO.class);
+ Pagination pagination = proposalCommonService.listPageMap(pageForm.getPageNumber(),pageForm.getPageSize(),sql);
return Result.success(pagination);
}
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalUnderTakeSatisfactionController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalUnderTakeSatisfactionController.java
index beb8a3a0..8bfd4b08 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalUnderTakeSatisfactionController.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalUnderTakeSatisfactionController.java
@@ -2,26 +2,26 @@ package com.budwk.app.zhgh.democratic.proposal.controller.query;
import cn.dev33.satoken.annotation.SaCheckPermission;
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.ProcessTask;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.sys.models.Sys_dict;
import com.budwk.app.sys.services.SysDictService;
-import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
-import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake;
+import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig;
+import com.budwk.app.zhgh.democratic.proposal.models.ProposalReplyUnit;
import io.swagger.annotations.Api;
import org.nutz.dao.Cnd;
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.IocBean;
-import org.nutz.json.Json;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.stream.Collectors;
@IocBean
@@ -44,98 +44,72 @@ public class ProposalUnderTakeSatisfactionController {
@At
@SaCheckPermission("proposal.query.underTake.satisfaction")
- public Result data(String sessionId){
- List infos = dao.query(ProposalInfo.class, Cnd.where(ProposalInfo::getSessionId, "=", sessionId));
- List infoIds = infos.stream().map(v -> v.getId()).toList();
- List instances = dao.query(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "in", infoIds));
- List instIds = instances.stream().map(v -> v.getId()).toList();
+ public Result data(String sessionId, String undertakeUnitId) {
+ List feedbackCodes = sysDictService.getSubListByCode("PROPOSAL_FEEDBACK");
- // 立案任务记录
- List caseTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds)
- .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode())
- .and(ProcessTask::getTaskName, "=", "9846ab38-40c5-4093-bafc-a9b3b443338b"));
-
- // 主办任务记录
- List masterUnitTasks = 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, "in", List.of("85cf23da-2dd5-4007-a1e9-bd9bfddc68f0", "5ed5a1be-0cd3-4b47-a0d5-238d53b61f34")));
-
- // 协办任务记录
- List 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"));
-
-
- // 所有承办单位任务记录
- List allUnitTasks = new ArrayList<>();
- allUnitTasks.addAll(masterUnitTasks);
- allUnitTasks.addAll(slaveUnitTasks);
-
-
- //该届次所有涉及到的承办单位
- List underTakeIds = caseTasks.stream().map(v -> {
- NutMap variable = Json.fromJson(NutMap.class, v.getVariable());
- String hostUnitId = variable.getString("tf_hostUnitId");
- List helpUnitIds = variable.getAsList("tf_helpUnitIds", String.class);
- List list = new ArrayList<>();
- list.add(hostUnitId);
- list.addAll(helpUnitIds);
- return list;
- })
- .flatMap(List::stream)
- .distinct()
- .toList();
-
-
- List undertakes = dao.query(ProposalUndertake.class, Cnd.where(ProposalUndertake::getId, "in", underTakeIds));
- Map undertakeMap = undertakes.stream().collect(Collectors.toMap(ProposalUndertake::getId, v -> v));
-
- List tableData = new ArrayList<>();
-
- // 反馈评分
- List proposalFeedback = sysDictService.getSubListByCode("PROPOSAL_FEEDBACK");
-
- for (String underTakeId : underTakeIds) {
- NutMap tableRow = NutMap.NEW();
- tableRow.put("id", underTakeId);
- if (undertakeMap.get(underTakeId) == null) {
- continue;
- }
- tableRow.put("name", undertakeMap.get(underTakeId).getName());
-
- //找出承办提案总数
- 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 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
+ // 当前届次所有的提案ID
+ Sql sql = Sqls.create("select id from proposal_info where sessionId = @sessionId").setParam("sessionId", sessionId);
+ sql.setCallback(Sqls.callback.strList());
+ dao.execute(sql);
+ List proposalIds = sql.getList(String.class);
+ if (proposalIds.isEmpty()) {
+ return Result.success(Collections.EMPTY_LIST);
}
+ // 关联所有的实例ID
+ Sql instSql = Sqls.create("select id from wf_process_instance where businessNo in (@proposalIds)");
+ instSql.setParam("proposalIds", proposalIds);
+ instSql.setCallback(Sqls.callback.strList());
+ dao.execute(instSql);
+ List instIds = instSql.getList(String.class);
- return Result.success();
+ // 提案委员会立案分配的承办单位
+ Cnd cnd = Cnd.where(ProposalReplyUnit::getProposalId, "in", proposalIds);
+ cnd.andEX(ProposalReplyUnit::getUnitId, "=", undertakeUnitId);
+ List replyUnits = dao.query(ProposalReplyUnit.class, cnd);
+
+ // 反馈评分记录
+// List feedbackTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "in", instIds)
+// .and(ProcessTask::getTaskName, "=", "feedback")
+// .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode()));
+
+ // 承办单位
+ List tableData = new ArrayList<>();
+
+ replyUnits.stream().collect(Collectors.groupingBy(ProposalReplyUnit::getUnitCode)).forEach((k, v) -> {
+ NutMap tableRow = NutMap.NEW();
+ tableRow.put("id", k);
+ v.stream().findAny().ifPresent(item -> {
+ 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 thisUnitProposalIds = v.stream().map(ProposalReplyUnit::getProposalId).toList();
+ List instances = dao.query(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "in", thisUnitProposalIds));
+ List thisUnitInstIds = instances.stream().map(ProcessInstance::getId).toList();
+
+ // 反馈评分记录
+ List 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);
+ }
+ tableData.add(tableRow);
+ });
+
+ return Result.success(tableData);
}
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalExpeditingController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalExpeditingController.java
index 5bd994cd..02334627 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalExpeditingController.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalExpeditingController.java
@@ -85,7 +85,9 @@ public class ProposalExpeditingController {
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,
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
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalSeniorDeleteController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalSeniorDeleteController.java
index 0bae8d69..ad467563 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalSeniorDeleteController.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/senior/ProposalSeniorDeleteController.java
@@ -5,13 +5,8 @@ import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
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.zhgh.democratic.proposal.controller.vo.ProposalInfoPageVO;
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.service.common.ProposalCommonService;
import io.swagger.annotations.Api;
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommitteeFilingController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommitteeFilingController.java
index 3b74ce67..45d0659a 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommitteeFilingController.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommitteeFilingController.java
@@ -78,7 +78,7 @@ public class ProposalCommitteeFilingController {
$condition
""");
Cnd cnd = Cnd.NEW();
- cnd.and("t.taskName", "=", "9846ab38-40c5-4093-bafc-a9b3b443338b");
+ cnd.and("t.taskName", "=", "committee");
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
}
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalDelegationController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalDelegationController.java
index 7104e70c..eb57d6b9 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalDelegationController.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalDelegationController.java
@@ -105,7 +105,7 @@ public class ProposalDelegationController {
$condition
""");
Cnd cnd = Cnd.NEW();
- cnd.and("t.taskName", "=", "93d5ba64-8220-4e62-9783-83422f474b36");
+ cnd.and("t.taskName", "=", "delegation");
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalFeedbackEvaluationController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalFeedbackEvaluationController.java
index 10a5a11a..2b8438de 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalFeedbackEvaluationController.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalFeedbackEvaluationController.java
@@ -92,7 +92,7 @@ public class ProposalFeedbackEvaluationController {
$condition
""");
Cnd cnd = Cnd.NEW();
- cnd.and("t.taskName", "=", "013a7cf9-20dd-4188-a196-53fd595448e5");
+ cnd.and("t.taskName", "=", "feedback");
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalMineController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalMineController.java
index 46288613..0b273ebb 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalMineController.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalMineController.java
@@ -12,7 +12,6 @@ import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.entity.ProcessInstance;
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.ProcessTaskStateEnum;
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.models.ProposalConfig;
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.service.common.ProposalCommonService;
import io.swagger.annotations.Api;
@@ -42,6 +42,7 @@ import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
+import java.util.Date;
import java.util.List;
@IocBean
@@ -123,7 +124,7 @@ public class ProposalMineController {
@At
@SaCheckPermission("proposal.mine")
@Aop(TransAop.READ_COMMITTED)
- public Result selectOne(@Valid String id){
+ public Result selectOne(@Valid String id) {
Sql sql = Sqls.create("""
SELECT
info.*,
@@ -189,22 +190,26 @@ public class ProposalMineController {
String delegationId, boolean isInvite) {
// 查询已经邀请的附议人
- 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, "=", "85b7b9bd-d706-48cb-99a1-ef1370fb1819")
- .and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode()))
- .desc(ProcessTask::getCreatedAt));
-
- List 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 seconds = dao.query(ProposalSecond.class, Cnd.where(ProposalSecond::getProposalId, "=", proposalId));
- List 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 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 taskActors = dao.query(ProcessTaskActor.class, Cnd.where(ProcessTaskActor::getProcessTaskId, "in", taskList.stream().map(ProcessTask::getId).toList()));
Sql sql = Sqls.create("""
SELECT
@@ -213,6 +218,7 @@ public class ProposalMineController {
t1.sex,
t1.unitName,
t1.unionName,
+ t1.mobile,
t2.NAME AS delegationName
FROM
teacher_congress_delegate t1
@@ -225,9 +231,9 @@ public class ProposalMineController {
cnd.and("t1.loginName", "!=", SecurityUtil.getUserLoginname());
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 {
- 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())) {
@@ -239,59 +245,6 @@ public class ProposalMineController {
sql.setCondition(cnd);
Pagination pagination = proposalCommonService.listPageVO(pageForm, sql, ProposalInviteSeconderVO.class);
return Result.success(pagination);
-
-
-// if (isInvite) {
-// // 先执行条件过滤再手动分页
-// List 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 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 pagination = proposalCommonService.listPageVO(pageForm, sql, ProposalInviteSeconderVO.class);
-// return Result.success(pagination);
-// }
}
@At
@@ -304,12 +257,13 @@ public class ProposalMineController {
// 查询最新一次的邀请附议人任务
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()))
.desc(ProcessTask::getCreatedAt));
+ // 已完成附议的代表
List 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::getId, ">", inviteTask.getId())
);
@@ -330,7 +284,7 @@ public class ProposalMineController {
t1.sex,
t1.unitName,
t1.unionName,
- t1.delegationId,
+ t1.mobile,
t2.NAME AS delegationName
FROM
teacher_congress_delegate t1
@@ -344,7 +298,7 @@ public class ProposalMineController {
// 获取正在执行的任务(邀请附议人||提案附议)
List 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) {
Dict args = Dict.create();
@@ -366,6 +320,22 @@ public class ProposalMineController {
dao.update(inviteTask, "variable");
}
+ // 储存到提案附议表
+ List 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();
}
@@ -378,8 +348,8 @@ public class ProposalMineController {
String measures = HtmlUtil.cleanHtmlTag(StrUtil.nullToDefault(info.getMeasures(), ""));
String brief = HtmlUtil.cleanHtmlTag(StrUtil.nullToDefault(info.getBrief(), ""));
- if (StrUtil.isBlank(info.getSessionId()) || StrUtil.isBlank(info.getDelegationId())
- || StrUtil.isBlank(info.getName())
+ if (StrUtil.isBlank(info.getSessionId())
+ || StrUtil.isBlank(info.getDelegationId())
|| StrUtil.isBlank(info.getName())
|| StrUtil.isBlank(info.getBrief())
|| StrUtil.isBlank(measures)
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSchoolLeaderApprovalController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSchoolLeaderApprovalController.java
index 79e1fa11..95e3dda1 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSchoolLeaderApprovalController.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSchoolLeaderApprovalController.java
@@ -97,7 +97,7 @@ public class ProposalSchoolLeaderApprovalController {
$condition
""");
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())) {
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSecondedController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSecondedController.java
index a096301b..0d6c7261 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSecondedController.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSecondedController.java
@@ -1,36 +1,28 @@
package com.budwk.app.zhgh.democratic.proposal.controller.transact;
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.page.Pagination;
import com.budwk.app.base.result.Result;
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.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
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.service.ProposalSecondedService;
import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService;
import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
-import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
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.IocBean;
+import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
-import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.List;
@@ -107,9 +99,9 @@ public class ProposalSecondedController {
$condition
""");
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()));
}
@@ -122,7 +114,11 @@ public class ProposalSecondedController {
cnd.groupBy("t.id");
cnd.desc("t.createdAt");
sql.setCondition(cnd);
- Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(),pageForm.getPageSize(), sql);
+ Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
+ List list = pagination.getList(NutMap.class);
+ for (NutMap row : list) {
+// String instanceId = row.getString("instanceId");
+ }
return Result.success(pagination);
}
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalUnderTakeReplyController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalUnderTakeReplyController.java
index 026e7719..bbc33505 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalUnderTakeReplyController.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalUnderTakeReplyController.java
@@ -5,23 +5,31 @@ import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
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.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.SecurityUtil;
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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
+import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
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.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
+import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.List;
@@ -37,7 +45,13 @@ public class ProposalUnderTakeReplyController {
@Inject
private ProposalCommonService proposalCommonService;
@Inject
- private ProposalUnderTakeReplyService proposalUnderTakeReplyService;
+ private FlowCommonService flowCommonService;
+ @Inject
+ private ProcessTaskService processTaskService;
+ @Inject
+ private SysRoleService sysRoleService;
+ @Inject
+ private SysUserService sysUserService;
@At("")
@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.taskName),'结束') curTaskKey,
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,
- IF(JSON_EXTRACT(t.variable, '$.isMaster') = true, 1, 0) AS taskIsMaster
+ t.variable->>'$.underTakeName' AS underTakeName,
+ IF(JSON_EXTRACT(t.variable, '$.underTakeIsMaster') = true, 1, 0) AS underTakeIsMaster,
+ t.variable->>'$.tf_transferUserId' AS tf_transferUserId,
+ transferUser.username AS transferUserName
FROM
wf_process_task t
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 teacher_congress_session tcs on tcs.id = info.sessionId
LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId
+ LEFT JOIN sys_user transferUser on transferUser.id = t.variable->>'$.tf_transferUserId'
$condition
""");
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())) {
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
}
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 {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
@@ -113,12 +130,12 @@ public class ProposalUnderTakeReplyController {
List list = pagination.getList();
for (NutMap row : list) {
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));
- row.setv("canRevoke",b && row.getInt("taskState") == ProcessTaskStateEnum.FINISHED.getCode());
- }else{
- boolean b = Stream.of("85cf23da-2dd5-4007-a1e9-bd9bfddc68f0", "c9a1586e-272b-41b8-b438-0be9f9e3781d").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 {
+ 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());
}
}
pagination.setList(list);
@@ -126,4 +143,46 @@ public class ProposalUnderTakeReplyController {
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();
+ }
+
}
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/handler/ProposalMasterUnitAssignmentHandler.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/handler/ProposalMasterUnitAssignmentHandler.java
index aef0cdaf..0df59c86 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/handler/ProposalMasterUnitAssignmentHandler.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/handler/ProposalMasterUnitAssignmentHandler.java
@@ -26,14 +26,14 @@ public class ProposalMasterUnitAssignmentHandler implements AssignmentHandler {
SysRoleService sysRoleService = ServiceContext.find(SysRoleService.class);
// 主办单位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("请选择主办单位");
}
// 获取主办单位
- ProposalUndertake undertake = dao.fetch(ProposalUndertake.class, hostUnitId);
+ ProposalUndertake undertake = dao.fetch(ProposalUndertake.class, masterUnitId);
if (undertake == null) {
throw new BaseException("主办单位不存在");
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/handler/ProposalSlaveUnitAssignmentHandler.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/handler/ProposalSlaveUnitAssignmentHandler.java
index f52aca2d..bb1c732f 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/handler/ProposalSlaveUnitAssignmentHandler.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/handler/ProposalSlaveUnitAssignmentHandler.java
@@ -38,7 +38,7 @@ public class ProposalSlaveUnitAssignmentHandler implements AssignmentHandler {
SysRoleService sysRoleService = ServiceContext.find(SysRoleService.class);
// 协办单位id
- List helpUnitIds = (List) execution.getArgs().get("tf_helpUnitIds");
+ List helpUnitIds = (List) execution.getArgs().get("tf_slaveUnitIds");
if (helpUnitIds != null && !helpUnitIds.isEmpty()) {
Sys_role sysRole = sysRoleService.getByCode(RoleConstant.PROPOSAL_UNIT_LEADER);
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalCaseFilingInterceptor.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalCaseFilingInterceptor.java
index 70d009f7..a2de47b9 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalCaseFilingInterceptor.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalCaseFilingInterceptor.java
@@ -1,5 +1,8 @@
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.engine.FlowInterceptor;
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.ProcessTask;
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.ProposalReplyUnit;
+import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
@@ -26,28 +33,75 @@ public class ProposalCaseFilingInterceptor implements FlowInterceptor {
@Aop(TransAop.READ_COMMITTED)
public void intercept(Execution execution) {
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 processTaskList = execution.getProcessTaskList();
for (ProcessTask task : processTaskList) {
NutMap variable = Json.fromJson(NutMap.class, task.getVariable());
-
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));
}
- // 更新立案结果
+ // 立案结果
+ 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 helpUnitIds = (List) 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();
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");
}
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalInfo.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalInfo.java
index e8671894..94235067 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalInfo.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalInfo.java
@@ -18,7 +18,7 @@ import java.util.List;
@TableMeta("{'mysql-charset':'utf8mb4'}")
@Comment("提案信息")
@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 {
@@ -55,6 +55,11 @@ public class ProposalInfo extends BaseModel {
@ColDefine(type = ColType.VARCHAR, width = 32)
private String caseFilingResult;
+ @Column
+ @Comment("立案类型(重点、普通提案)")
+ @ColDefine(type = ColType.VARCHAR, width = 32)
+ private String caseFilingType;
+
@Column
@Comment("教代会ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalReply.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalReply.java
deleted file mode 100644
index 897d3c91..00000000
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalReply.java
+++ /dev/null
@@ -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;
-}
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalSeconded.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalSecond.java
similarity index 77%
rename from src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalSeconded.java
rename to src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalSecond.java
index fe4df1c5..46080d51 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalSeconded.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalSecond.java
@@ -11,10 +11,10 @@ import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = true)
-@Table("proposal_seconded")
+@Table("proposal_second")
@TableMeta("{'mysql-charset':'utf8mb4'}")
@Comment("提案附议信息")
-public class ProposalSeconded extends BaseModel {
+public class ProposalSecond extends BaseModel {
@Name
@Comment("ID")
@@ -35,22 +35,32 @@ public class ProposalSeconded extends BaseModel {
@Column
@Comment("附议人姓名")
@ColDefine(type = ColType.VARCHAR, width = 100)
- private String seconderName;
+ private String userName;
@Column
@Comment("附议人工号")
@ColDefine(type = ColType.VARCHAR, width = 100)
- private String seconderLoginName;
+ private String loginName;
@Column
@Comment("附议人单位")
@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
@Comment("附议人手机号")
@ColDefine(type = ColType.VARCHAR, width = 32)
- private String seconderMobile;
+ private String mobile;
@Column
@Comment("附议时间")
@@ -62,11 +72,6 @@ public class ProposalSeconded extends BaseModel {
@ColDefine(type = ColType.DATETIME)
private Date inviteTime;
- @Column
- @Comment("附议人签字id")
- @ColDefine(type = ColType.VARCHAR, width = 32)
- private String seconderSignId;
-
@Column
@Comment("附议结果")
@ColDefine(type = ColType.BOOLEAN)
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/ProposalSecondedService.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/ProposalSecondedService.java
index 75376971..2bc7b9ed 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/ProposalSecondedService.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/ProposalSecondedService.java
@@ -1,15 +1,9 @@
package com.budwk.app.zhgh.democratic.proposal.service;
import com.budwk.app.base.service.BaseService;
-import com.budwk.app.bpm.param.BpmTaskApprovalParam;
-import com.budwk.app.zhgh.democratic.proposal.models.ProposalSeconded;
+import com.budwk.app.zhgh.democratic.proposal.models.ProposalSecond;
-public interface ProposalSecondedService extends BaseService {
+public interface ProposalSecondedService extends BaseService {
- /**
- * 附议
- * @param approvalParam
- */
- void approval(BpmTaskApprovalParam approvalParam);
}
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonService.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonService.java
index 90d9b39d..c93f9785 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonService.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonService.java
@@ -15,6 +15,11 @@ public interface ProposalCommonService extends BaseService {
*/
NutMap info(String id);
+ /**
+ * 导出word
+ * @param id
+ * @param response
+ */
void exportProposalAsDocx(String id, HttpServletResponse response);
/**
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonServiceImpl.java
index ab2bcab7..edd918ab 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonServiceImpl.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonServiceImpl.java
@@ -4,28 +4,24 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
-import cn.hutool.http.HtmlUtil;
import cn.hutool.json.JSONObject;
-import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.exception.BaseException;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.base.utils.CommonDownloadUtil;
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.engine.FlowEngine;
+import com.budwk.app.flow.engine.util.FlowUtil;
import com.budwk.app.flow.entity.ProcessInstance;
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.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_user;
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.web.commons.auth.utils.SecurityUtil;
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.deepoove.poi.XWPFTemplate;
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.policy.AttachmentRenderPolicy;
import lombok.extern.slf4j.Slf4j;
import org.ddr.poi.html.HtmlRenderPolicy;
import org.nutz.dao.Cnd;
@@ -68,9 +61,11 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp
@Inject
private SysRoleService sysRoleService;
@Inject
- private BpmService bpmService;
- @Inject
private SysOfficeTemplateUtil sysOfficeTemplateUtil;
+ @Inject
+ private FlowEngine flowEngine;
+ @Inject
+ private SysDictService sysDictService;
public ProposalCommonServiceImpl(Dao dao) {
super(dao);
@@ -101,59 +96,11 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp
WHERE
info.id = @id
""").setParam("id", id);
- NutMap nutMap = (NutMap) dao().execute(sql.setCallback(Sqls.callback.map())).getResult();
-
-// List nodeTasks = bpmService.getNodeTasks(BpmProcessConstant.PROPOSAL, id);
-// nutMap.put("nodeTasks", nodeTasks);
-//
-// //查询附议人信息
-// 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 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 consolidationProposalIds = getConsolidation(id);
-// List 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 consolidationProposals = listMap(otherProposalSql);
-// nutMap.put("consolidationProposals", consolidationProposals);
-// nutMap.put("isConsolidation", true);
-// } else {
-// nutMap.put("consolidationProposals", null);
-// nutMap.put("isConsolidation", false);
-// }
- return nutMap;
+ NutMap info = (NutMap) dao().execute(sql.setCallback(Sqls.callback.map())).getResult();
+ if (StrUtil.isNotBlank(info.getString("suggestUnits"))) {
+ info.put("suggestUnits", String.join(",", Json.fromJson(ArrayList.class, info.getString("suggestUnits"))));
+ }
+ return info;
}
@Override
@@ -175,8 +122,6 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp
if (id == null || id.isEmpty()) {
throw new BaseException("提案信息不存在");
}
- // 查询提案信息
- HashMap docData = new HashMap<>();
//基本信息
Sql sql = Sqls.create("""
@@ -186,6 +131,8 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp
info.brief,
info.measures,
info.createUserName,
+ DATE_FORMAT(info.createTime, '%Y年%m月%d日') AS createTime,
+ info.unitName,
tcde.unitName,
tcde.mobile,
type.name AS typeName,
@@ -201,26 +148,41 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp
""").setParam("id", id);
sql.setCallback(Sqls.callback.map());
execute(sql);
- NutMap info = (NutMap) sql.getResult();
+ NutMap docData = (NutMap) sql.getResult();
//处理下富文本
- String brief = info.getString("brief");
- String measures = info.getString("measures");
- info.put("brief", sysOfficeTemplateUtil.convertRichTextToDocText(brief));
- info.put("measures", sysOfficeTemplateUtil.convertRichTextToDocText(measures));
+ String brief = docData.getString("brief");
+ String measures = docData.getString("measures");
+ docData.put("brief", sysOfficeTemplateUtil.convertRichTextToDocText(brief));
+ docData.put("measures", sysOfficeTemplateUtil.convertRichTextToDocText(measures));
- docData.put("info", info);
+ List feedBackDict = sysDictService.getSubListByCode("PROPOSAL_FEEDBACK");
+ Map feedBackMap = feedBackDict.stream().collect(Collectors.toMap(Sys_dict::getCode, Sys_dict::getName));
+
+
+ // 流程实例
+ ProcessInstance processInstance = dao().fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", id));
+
+ List doneTaskVos = new ArrayList<>();
+ List doneTaskList = flowEngine.processTaskService().getDoneTaskList(processInstance.getId(), null);
+ for (ProcessTask doneTask : doneTaskList) {
+ ProcessTaskVO taskVO = flowEngine.processTaskService().findById(doneTask.getId());
+ doneTaskVos.add(taskVO);
+ }
+
+ // 按任务节点分组
+ Map> taskGroups = doneTaskVos.stream().collect(Collectors.groupingBy(ProcessTaskVO::getDisplayName));
+ docData.putAll(taskGroups);
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
htmlRenderPolicy.getConfig().setShowDefaultTableBorderInTableCell(true);
- AttachmentRenderPolicy attachmentRenderPolicy = new AttachmentRenderPolicy();
Configure config = Configure.builder()
.bind("seconders", policy)
- .bind("info.brief", htmlRenderPolicy)
- .bind("info.measures", htmlRenderPolicy)
- .bind("zbdf.opinion", htmlRenderPolicy)
- .bind("attachment", attachmentRenderPolicy)
+ .bind("提案附议", policy)
+ .bind("brief", htmlRenderPolicy)
+ .bind("measures", htmlRenderPolicy)
+ .bind("taskFormData.tf_opinion", htmlRenderPolicy)
.build();
try {
@@ -243,15 +205,13 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp
SELECT
info.name,
info.code,
- info.excerpt,
- info.brief,
info.measures,
info.createUserName,
- tcde.unitName,
- tcde.mobile,
type.name AS typeName,
tcs.fullName AS sessionName,
- tcd.`name` AS delegationName
+ tcd.`name` AS delegationName,
+ tcs.j,
+ tcs.c
FROM
proposal_info info
LEFT JOIN proposal_type type on type.id = info.typeId
@@ -263,80 +223,46 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp
sql.setCallback(Sqls.callback.map());
execute(sql);
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"))
+ .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode())
+ .desc(ProcessTask::getFinishTime)
+ );
+ if (masterUnitReplyTask != null) {
+ // 办理解决情况
+ String implementState = FlowUtil.variableToDict(masterUnitReplyTask.getVariable()).getStr("tf_implementState");
+ info.put(implementState, "√");
+ // 承办单位名称
+ info.put("underTakeName",FlowUtil.variableToDict(masterUnitReplyTask.getVariable()).getStr("underTakeName"));
+ }
- //审批记录
- List nodeTasks = bpmService.getNodeTasks(BpmProcessConstant.PROPOSAL, id);
- //委员会确认承办单位
- nodeTasks.stream().filter(v -> v.getNodeCode() == 70)
- .flatMap(v -> v.getTasks().stream())
- .max(Comparator.comparing(BpmProcessTaskVo::getEndOn))
- .ifPresent(v -> {
- HashMap committeeConfirm = new HashMap<>();
- committeeConfirm.put("date", DateUtil.format(v.getEndOn(), "yyyy年MM月dd日"));
- 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())
- .filter(v1 -> ObjectUtil.isNotEmpty(v1.getCreateVariable()) && v1.getCreateVariable().getBool("isMaster"))
- .max(Comparator.comparing(BpmProcessTaskVo::getEndOn))
- .ifPresent(v -> {
- HashMap masterUnderTakeReply = new HashMap<>();
- masterUnderTakeReply.put("name", v.getCreateVariable().getStr("underTakeName"));
- masterUnderTakeReply.put("date", DateUtil.format(v.getEndOn(), "yyyy年MM月dd日"));
- masterUnderTakeReply.put("user", v.getActualOwnerUserName());
- if (ObjectUtil.isNotEmpty(v.getExtVariable())) {
- masterUnderTakeReply.put("opinion", v.getExtVariable().getStr("approvalOpinion"));
- masterUnderTakeReply.put("implementState", v.getExtVariable().getStr("implementState"));
- masterUnderTakeReply.put("sign", sysOfficeTemplateUtil.createPictureRenderData(v.getExtVariable().getStr("approvalSignature")));
- }
- docData.put("zbdf", masterUnderTakeReply);
- });
- //反馈评分
- nodeTasks.stream().filter(v -> v.getNodeCode() == 100)
- .flatMap(v -> v.getTasks().stream())
- .max(Comparator.comparing(BpmProcessTaskVo::getEndOn))
- .ifPresent(v -> {
- HashMap 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);
- });
+ // 反馈评价
+ ProcessTask feedbackTask = dao().fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstance.getId())
+ .and(ProcessTask::getTaskName, "=", "feedback")
+ .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode())
+ .desc(ProcessTask::getFinishTime)
+ );
+ if (feedbackTask != null) {
+ info.put(FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_feedback"), "√");
+ info.put("tf_feedback", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_feedback"));
+ info.put("tf_opinion", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_opinion"));
+ info.put("tf_phone", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_phone"));
+ info.put("tf_address", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_address"));
+ info.put("tf_postcode", FlowUtil.variableToDict(feedbackTask.getVariable()).getStr("tf_postcode"));
+ }
HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
htmlRenderPolicy.getConfig().setShowDefaultTableBorderInTableCell(true);
- Configure config = Configure.builder()
- .bind("info.excerpt", htmlRenderPolicy)
- .bind("zbdf.opinion", htmlRenderPolicy)
- .build();
+ Configure config = Configure.builder().build();
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) {
log.error("提案导出失败{},提案id:{}", e.getMessage(), id);
}
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalExportServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalExportServiceImpl.java
index 01076f66..fb07496d 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalExportServiceImpl.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalExportServiceImpl.java
@@ -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.SysOfficeTemplateUtil;
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.ProcessTask;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
@@ -38,7 +39,6 @@ import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
@@ -186,8 +186,8 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp
// 添加序号,去除富文本,获取附议人
for (int i = 0; i < list.size(); i++) {
list.get(i).put("index", i + 1);
- 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("brief", HtmlUtil.cleanHtmlTag(list.get(i).getString("brief")));
+ 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")));
@@ -203,7 +203,7 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp
if (inviteTask != null) {
NutMap variable = Json.fromJson(NutMap.class, inviteTask.getVariable());
List 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 imp
$condition
""");
Cnd cnd = Cnd.NEW();
+ cnd.groupBy("info.id");
ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm);
sql.setCondition(cnd);
List list = listMap(sql);
@@ -385,13 +386,15 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp
SELECT
info.name,
info.code,
+ DATE_FORMAT(info.createTime, '%Y年%m月%d日') AS createTime,
+ info.suggestUnits,
info.researchFindings,
info.brief,
info.measures,
info.createUserName,
+ type.name AS typeName,
tcde.unitName,
tcde.mobile,
- type.name AS typeName,
tcs.j,
tcs.c,
tcs.fullName AS sessionName,
@@ -412,8 +415,10 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp
info.put("brief", sysOfficeTemplateUtil.convertRichTextToDocText(info.getString("brief")));
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中的数据
HashMap docData = new HashMap<>(info);
@@ -425,7 +430,7 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp
// 查询附议人信息
ProcessTask inviteTask = dao().fetch(ProcessTask.class,
Cnd.where(ProcessTask::getProcessInstanceId, "=", instance.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()))
.desc(ProcessTask::getCreatedAt));
@@ -434,9 +439,24 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp
NutMap variable = Json.fromJson(NutMap.class, inviteTask.getVariable());
if (variable != null) {
List 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);
+ }
+
}
// 配置渲染策略
@@ -469,13 +489,13 @@ public class ProposalExportServiceImpl extends BaseServiceImpl imp
info.name
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
LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName
$condition
""");
Cnd cnd = Cnd.NEW();
+ cnd.groupBy("info.id");
ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm);
sql.setCondition(cnd);
List list = listMap(sql);
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalSecondedServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalSecondedServiceImpl.java
index b9c5cd13..e6d64742 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalSecondedServiceImpl.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalSecondedServiceImpl.java
@@ -1,113 +1,21 @@
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.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.zhgh.democratic.proposal.models.ProposalConfig;
-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.models.ProposalSecond;
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.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
@IocBean(args = {"refer:dao"})
-public class ProposalSecondedServiceImpl extends BaseServiceImpl implements ProposalSecondedService {
+public class ProposalSecondedServiceImpl extends BaseServiceImpl implements ProposalSecondedService {
@Inject
private CommonService commonService;
- @Inject
- private BpmService bpmService;
- @Inject
- private SysMsgService sysMsgService;
public ProposalSecondedServiceImpl(Dao dao) {
super(dao);
}
- @Override
- @Aop(TransAop.READ_COMMITTED)
- public void approval(BpmTaskApprovalParam approvalParam) {
- approvalParam.getBpmTaskApprovalTypeEnum();
- // 将审批参数转换为Map
- Map variables = BeanUtil.beanToMap(approvalParam);
-
- // 获取提案配置中的最少附议人数
- ProposalConfig proposalConfig = dao().fetch(ProposalConfig.class, Cnd.NEW());
- Integer seconderNum = proposalConfig.getSeconderNum();
-
- //团长接收人
- List assignments = new ArrayList<>();
-
- ProposalInfo proposalInfo = dao().fetch(ProposalInfo.class, approvalParam.getProcessInstanceBusinessId());
- BpmProcessTask processTask = dao().fetch(BpmProcessTask.class, approvalParam.getProcessInstanceTaskId());
-
- //查询其他人是否附议完成
- List 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 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());
-// }
-// }
-
- }
}
diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/controller/TeacherCongressDelegationController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/controller/TeacherCongressDelegationController.java
index 27f7f2b8..b449b7c4 100644
--- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/controller/TeacherCongressDelegationController.java
+++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/controller/TeacherCongressDelegationController.java
@@ -7,6 +7,7 @@ import cn.hutool.core.lang.tree.TreeNode;
import cn.hutool.core.lang.tree.TreeUtil;
import cn.hutool.core.util.StrUtil;
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.param.PageForm;
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) {
Sys_role role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_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("""
SELECT
tcd.*,
tcs.fullName as sessionName,
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
teacher_congress_delegation tcd
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_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_role sur3 ON sur3.tcDelegationId = tcd.id AND sur3.roleId = @roleId3
+ LEFT JOIN sys_user u3 ON u3.id = sur3.userId
$condition""");
sql.setParam("roleId", role.getId());
sql.setParam("roleId2", role2.getId());
+ sql.setParam("roleId3", role3.getId());
Cnd cnd = Cnd.NEW();
cnd.and("tcd.sessionId", "=", sessionId);
cnd.asc("tcd.code");
@@ -268,8 +275,12 @@ public class TeacherCongressDelegationController {
Sys_role role = null;
if (type.equals(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD.name())) {
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);
+ } 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()));
@@ -298,31 +309,32 @@ public class TeacherCongressDelegationController {
/**
* 设置团长
*
- * @param delegationId
- * @param sessionId
- * @param userId
+ * @param delegationId 代表团ID
+ * @param sessionId 届次ID
+ * @param userId 团长id
+ * @param viceUserId 副团长id
+ * @param contactUserId 联络人
* @return
*/
@At
@SaCheckPermission("tc.delegation")
@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);
- 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())
- );
+ 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()));
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);
- 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())
- );
+ 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()));
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();
return Result.success();
}
@@ -340,11 +352,7 @@ public class TeacherCongressDelegationController {
public Result deleteHead(@Valid String delegationId, @Valid String sessionId, @Valid String userId) {
Sys_role role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD);
//先删除角色
- 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)
- );
+ 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));
sysUserService.clearCache();
return Result.success();
}
diff --git a/src/main/resources/views/layouts/v4/home.html b/src/main/resources/views/layouts/v4/home.html
index ec359bec..b8a6a8f2 100644
--- a/src/main/resources/views/layouts/v4/home.html
+++ b/src/main/resources/views/layouts/v4/home.html
@@ -12,8 +12,9 @@ layout("/layouts/v4/baseLayout.html"){
.oa-main-content {
margin: 0 auto;
padding-bottom: 20px;
- background: url(/assets/platform/img/v4/home-bg.png);
+ /*background: url(/assets/platform/img/v4/home-bg.png);*/
background-size: cover;
+ background: #ffffff;
}
/* 背景图和搜索统计区域容器 */
@@ -319,7 +320,7 @@ layout("/layouts/v4/baseLayout.html"){
/* 右侧活动列表 */
.oa-activity-content {
/*padding: 20px;*/
- background: #ffffff;
+ /*background: #ffffff;*/
max-height: 410px;
display: flex;
flex-direction: column;
@@ -482,7 +483,7 @@ layout("/layouts/v4/baseLayout.html"){
/* box2 - 系统通知公告 */
.oa-box-2-section {
display: grid;
- grid-template-columns: 1fr 400px;
+ grid-template-columns: 1fr 450px;
gap: 30px;
border-radius: 6px;
width: 1500px;
@@ -491,7 +492,7 @@ layout("/layouts/v4/baseLayout.html"){
}
.oa-box-2-section-act {
- background: #ffffff;
+ /*background: #ffffff;*/
}
@@ -500,7 +501,7 @@ layout("/layouts/v4/baseLayout.html"){
justify-content: space-between;
align-items: center;
padding: 20px;
- background: #ffffff;
+ /*background: #ffffff;*/
color: #000;
}
@@ -537,6 +538,49 @@ layout("/layouts/v4/baseLayout.html"){
flex-shrink: 0;
}
+ /* 工会活动独立样式 */
+ .oa-activity-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 20px;
+ /*background: #ffffff;*/
+ color: #000;
+ }
+
+ .oa-activity-header-content {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ position: relative;
+ }
+
+ .oa-activity-header-content::after {
+ content: '';
+ position: absolute;
+ bottom: -10px;
+ left: 0;
+ right: 0;
+ height: 2px;
+ background-color: var(--color-primary);
+ }
+
+ .oa-activity-header-icon {
+ font-size: 24px;
+ color: var(--color-primary);
+ }
+
+ .oa-activity-header-title {
+ font-size: 20px;
+ font-weight: 600;
+ margin: 0;
+ color: var(--color-primary);
+ }
+
+ .oa-activity-header-more {
+ flex-shrink: 0;
+ }
+
.oa-header-more-btn {
background: transparent;
border: none;
@@ -568,7 +612,7 @@ layout("/layouts/v4/baseLayout.html"){
.oa-notice-content {
padding: 20px;
- background: #ffffff;
+ /*background: #ffffff;*/
max-height: 400px;
overflow-y: auto;
scrollbar-width: none; /* Firefox */
@@ -588,7 +632,7 @@ layout("/layouts/v4/baseLayout.html"){
display: flex;
align-items: flex-start;
padding: 15px 20px;
- background: #ffffff;
+ /*background: #ffffff;*/
border-bottom: 1px solid #e8e8e8;
transition: all 0.2s ease;
cursor: pointer;
@@ -625,7 +669,76 @@ layout("/layouts/v4/baseLayout.html"){
border-radius: 6px;
}
- .oa-notice-item-content {
+ .oa-notice-item-desc {
+ font-size: 14px;
+ color: #666;
+ line-height: 1.5;
+ margin-bottom: 8px;
+ display: flex;
+ align-items: center;
+ }
+
+ /* 工会活动 */
+ .oa-activity-content {
+ padding: 20px;
+ /*background: #ffffff;*/
+ max-height: 400px;
+ overflow-y: auto;
+ scrollbar-width: none; /* Firefox */
+ -ms-overflow-style: none; /* IE and Edge */
+ }
+
+ .oa-activity-content::-webkit-scrollbar {
+ display: none; /* Chrome, Safari and Opera */
+ }
+
+ .oa-activity-list {
+ display: grid;
+ gap: 15px;
+ }
+
+ .oa-activity-item {
+ display: flex;
+ align-items: flex-start;
+ padding: 15px 20px;
+ /*background: #ffffff;*/
+ border-bottom: 1px solid #e8e8e8;
+ transition: all 0.2s ease;
+ cursor: pointer;
+ }
+
+ .oa-activity-item:hover {
+ background: #f5f5f5;
+ }
+
+ .oa-activity-item:last-child {
+ border-bottom: none;
+ }
+
+ .oa-activity-item-icon {
+ width: 16px;
+ height: 16px;
+ color: #666;
+ margin-right: 12px;
+ margin-top: 2px;
+ flex-shrink: 0;
+ }
+
+ .oa-activity-item-img {
+ width: 300px;
+ height: 150px;
+ flex-shrink: 0;
+ margin-right: 12px;
+ }
+
+ .oa-activity-item-img img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ border-radius: 6px;
+ }
+
+ .oa-activity-item-content {
flex: 1;
min-width: 0;
height: 150px;
@@ -635,7 +748,7 @@ layout("/layouts/v4/baseLayout.html"){
/*padding: 10px 0;*/
}
- .oa-notice-item-title {
+ .oa-activity-item-title {
font-size: 16px;
font-weight: 500;
color: #333;
@@ -647,7 +760,7 @@ layout("/layouts/v4/baseLayout.html"){
overflow: hidden;
}
- .oa-notice-item-desc {
+ .oa-activity-item-desc {
font-size: 14px;
color: #666;
line-height: 1.5;
@@ -657,6 +770,23 @@ layout("/layouts/v4/baseLayout.html"){
gap: 8px;
}
+ .oa-activity-item-desc i {
+ /*color: var(--color-primary);*/
+ font-size: 14px;
+ flex-shrink: 0;
+ }
+
+ .oa-activity-item-detail {
+ margin-top: auto;
+ }
+
+ .oa-activity-item-date {
+ margin-left: 15px;
+ flex-shrink: 0;
+ white-space: nowrap;
+ font-size: 16px;
+ }
+
.oa-notice-item-desc i {
/*color: var(--color-primary);*/
font-size: 14px;
@@ -687,17 +817,544 @@ layout("/layouts/v4/baseLayout.html"){
transform: translateX(2px);
}
+ /* 扩展工会活动样式 */
+ .oa-extended-activities-wrapper {
+ width: 100%;
+ background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
+ padding: 60px 0;
+ margin: 40px 0;
+ }
+
+ .oa-extended-activities-section {
+ max-width: 1500px;
+ margin: 0 auto;
+ padding: 0 20px;
+ }
+
+ .oa-extended-activities-header {
+ text-align: center;
+ margin-bottom: 50px;
+ }
+
+ .oa-extended-activities-header-content {
+ display: inline-block;
+ }
+
+ .oa-extended-activities-header-icon {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 60px;
+ height: 60px;
+ background: var(--color-primary);
+ border-radius: 50%;
+ margin: 0 auto 20px;
+ box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
+ }
+
+ .oa-extended-activities-header-icon i {
+ font-size: 28px;
+ color: white;
+ }
+
+ .oa-extended-activities-header-title {
+ font-size: 36px;
+ font-weight: 700;
+ color: #2c3e50;
+ margin: 0 0 10px 0;
+ letter-spacing: 1px;
+ }
+
+ .oa-extended-activities-header-subtitle {
+ font-size: 16px;
+ color: #7f8c8d;
+ margin: 0;
+ font-weight: 400;
+ }
+
+ .oa-extended-activities-content {
+ position: relative;
+ }
+
+ .oa-extended-activities-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
+ gap: 30px;
+ padding: 20px 0;
+ }
+
+ .oa-extended-activity-card {
+ background: white;
+ border-radius: 16px;
+ overflow: hidden;
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ cursor: pointer;
+ position: relative;
+ }
+
+ .oa-extended-activity-card:hover {
+ transform: translateY(-8px);
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
+ }
+
+ .oa-extended-activity-card-image {
+ position: relative;
+ height: 200px;
+ overflow: hidden;
+ }
+
+ .oa-extended-activity-card-image img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ transition: transform 0.3s ease;
+ }
+
+ .oa-extended-activity-card:hover .oa-extended-activity-card-image img {
+ transform: scale(1.05);
+ }
+
+ .oa-extended-activity-card-overlay {
+ position: absolute;
+ top: 15px;
+ right: 15px;
+ }
+
+ .oa-extended-activity-card-status {
+ padding: 6px 12px;
+ border-radius: 20px;
+ font-size: 12px;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ }
+
+ .oa-extended-activity-card-status.active {
+ background: #27ae60;
+ color: white;
+ }
+
+ .oa-extended-activity-card-status.upcoming {
+ background: #f39c12;
+ color: white;
+ }
+
+ .oa-extended-activity-card-status.ended {
+ background: #95a5a6;
+ color: white;
+ }
+
+ .oa-extended-activity-card-content {
+ padding: 25px;
+ }
+
+ .oa-extended-activity-card-title {
+ font-size: 20px;
+ font-weight: 600;
+ color: #2c3e50;
+ margin: 0 0 15px 0;
+ line-height: 1.3;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ }
+
+ .oa-extended-activity-card-meta {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ margin-bottom: 15px;
+ }
+
+ .oa-extended-activity-card-date,
+ .oa-extended-activity-card-location {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-size: 14px;
+ color: #7f8c8d;
+ }
+
+ .oa-extended-activity-card-date i,
+ .oa-extended-activity-card-location i {
+ color: var(--color-primary);
+ width: 16px;
+ }
+
+ .oa-extended-activity-card-description {
+ font-size: 14px;
+ color: #7f8c8d;
+ line-height: 1.5;
+ margin: 0 0 20px 0;
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ }
+
+ .oa-extended-activity-card-footer {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding-top: 15px;
+ border-top: 1px solid #ecf0f1;
+ }
+
+ .oa-extended-activity-card-participants {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ font-size: 14px;
+ color: #7f8c8d;
+ }
+
+ .oa-extended-activity-card-participants i {
+ color: var(--color-primary);
+ }
+
+ .oa-extended-activity-card-btn {
+ background: var(--color-primary);
+ color: white;
+ border: none;
+ padding: 8px 16px;
+ border-radius: 20px;
+ font-size: 12px;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.2s ease;
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ }
+
+ .oa-extended-activity-card-btn:hover {
+ background: #2980b9;
+ transform: translateY(-1px);
+ }
+
+ .oa-extended-activities-empty {
+ text-align: center;
+ padding: 60px 20px;
+ }
+
+ .oa-extended-activities-empty-icon {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 80px;
+ height: 80px;
+ background: #ecf0f1;
+ border-radius: 50%;
+ margin: 0 auto 20px;
+ }
+
+ .oa-extended-activities-empty-icon i {
+ font-size: 36px;
+ color: #bdc3c7;
+ }
+
+ .oa-extended-activities-empty-title {
+ font-size: 24px;
+ font-weight: 600;
+ color: #7f8c8d;
+ margin: 0 0 10px 0;
+ }
+
+ .oa-extended-activities-empty-desc {
+ font-size: 16px;
+ color: #95a5a6;
+ line-height: 1.5;
+ margin: 0;
+ }
+
+ /* 响应式设计 */
+ @media (max-width: 768px) {
+ .oa-extended-activities-wrapper {
+ padding: 40px 0;
+ margin: 20px 0;
+ }
+
+ .oa-extended-activities-section {
+ padding: 0 15px;
+ }
+
+ .oa-extended-activities-header-title {
+ font-size: 28px;
+ }
+
+ .oa-extended-activities-grid {
+ grid-template-columns: 1fr;
+ gap: 20px;
+ }
+
+ .oa-extended-activity-card-content {
+ padding: 20px;
+ }
+
+ .oa-extended-activity-card-footer {
+ flex-direction: column;
+ gap: 15px;
+ align-items: stretch;
+ }
+
+ .oa-extended-activity-card-btn {
+ justify-content: center;
+ }
+ }
+
+ @media (max-width: 480px) {
+ .oa-extended-activities-header-title {
+ font-size: 24px;
+ }
+
+ .oa-extended-activity-card-image {
+ height: 160px;
+ }
+
+ .oa-extended-activity-card-content {
+ padding: 15px;
+ }
+ }
+
.oa-notice-item-date {
- margin-left: 15px;
flex-shrink: 0;
white-space: nowrap;
font-size: 16px;
}
+ /* 工会网站新闻样式 */
+ .oa-box-3-section {
+ width: 1500px;
+ margin: 30px auto 0;
+ }
+
+ .oa-box-3-news-notices {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 20px;
+ margin-bottom: 20px;
+ }
+
+ .oa-grassroots-wrapper {
+ width: 100%;
+ background-image: url('https://cdgh.ncu.edu.cn/images/index_bg2.png');
+ background-size: cover;
+ background-position: center;
+ background-repeat: no-repeat;
+ }
+
+ .oa-box-3-grassroots {
+ display: grid;
+ grid-template-columns: 1fr;
+ }
+
+ .oa-grassroots-list {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 20px;
+ }
+
+ .oa-grassroots-item {
+ display: flex;
+ flex-direction: column;
+ padding: 16px;
+ /*background: #ffffff;*/
+ border: none;
+ /*border-radius: 8px;*/
+ border-bottom: 3px solid transparent;
+ transition: all 0.3s ease;
+ cursor: pointer;
+ height: auto;
+ }
+
+ .oa-grassroots-item:hover {
+ background: #ffffff;
+ border-bottom-color: var(--color-primary);
+ transform: translateY(-4px);
+ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.15);
+ }
+
+ .oa-grassroots-item-date {
+ font-size: 20px;
+ /*color: var(--color-primary);*/
+ font-weight: bold;
+ white-space: nowrap;
+ text-align: left;
+ margin-bottom: 8px;
+ transition: opacity 0.3s ease;
+ }
+
+ .oa-grassroots-item-title {
+ font-size: 16px;
+ font-weight: 600;
+ /*color: var(--color-primary);*/
+ margin-bottom: 12px;
+ line-height: 1.4;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ height: 44.8px;
+ }
+
+ .oa-grassroots-item-image {
+ width: 100%;
+ height: 180px;
+ margin: 0 0 16px 0;
+ border-radius: 8px;
+ overflow: hidden;
+ background: #f5f5f5;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ transition: transform 0.3s ease;
+ }
+
+ .oa-grassroots-item-image img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ transition: transform 0.3s ease;
+ }
+
+ .oa-grassroots-item-image-placeholder {
+ color: #ccc;
+ font-size: 24px;
+ }
+
+ .oa-grassroots-item-summary {
+ font-size: 14px;
+ color: #666;
+ line-height: 1.6;
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ text-align: justify;
+ margin-bottom: 12px;
+ }
+
+ .oa-news-section,
+ .oa-notices-section,
+ .oa-grassroots-section {
+ /*background: #ffffff;*/
+ border-radius: 8px;
+ overflow: hidden;
+ }
+
+ .oa-grassroots-section {
+ width: 1500px;
+ margin: 0 auto;
+ }
+
+
+ .oa-news-content,
+ .oa-notices-content {
+ padding: 20px;
+ /*background: #ffffff;*/
+ /*max-height: 400px;*/
+ /*overflow-y: auto;*/
+ /*scrollbar-width: none;*/
+ /*-ms-overflow-style: none;*/
+ }
+
+ .oa-grassroots-content {
+ padding: 20px;
+ /*background: #ffffff;*/
+ min-height: 500px;
+ }
+
+ .oa-news-content::-webkit-scrollbar,
+ .oa-notices-content::-webkit-scrollbar {
+ display: none;
+ }
+
+ .oa-news-list, .oa-notices-list {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ }
+
+ .oa-news-item,
+ .oa-notice-item {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ padding: 12px 16px;
+ /*background: #ffffff;*/
+ border-bottom: 1px solid #e8e8e8;
+ transition: all 0.2s ease;
+ cursor: pointer;
+ }
+
+ .oa-news-item:hover, .oa-notice-item:hover {
+ background: #f5f5f5;
+ transform: translateX(5px);
+ }
+
+ .oa-news-item:hover .oa-news-item-title,
+ .oa-notice-item:hover .oa-notice-item-title {
+ color: var(--color-primary);
+ text-decoration: underline;
+ text-decoration-color: var(--color-primary);
+ }
+
+ .oa-news-item:hover .oa-news-item-date,
+ .oa-notice-item:hover .oa-notice-item-date {
+ color: var(--color-primary);
+ }
+
+ .oa-news-item:last-child,
+ .oa-notice-item:last-child {
+ border-bottom: none;
+ }
+
+ .oa-news-item-content,
+ .oa-notice-item-content {
+ flex: 1;
+ min-width: 0;
+ }
+
+ .oa-news-item-title,
+ .oa-notice-item-title {
+ font-size: 14px;
+ font-weight: 500;
+ color: #333;
+ margin-bottom: 6px;
+ line-height: 1.4;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ .oa-news-item-date,
+ .oa-notice-item-date {
+ font-size: 14px;
+ color: #999;
+ white-space: nowrap;
+ font-weight: bold;
+ }
+
+ .oa-news-item-arrow,
+ .oa-notice-item-arrow {
+ margin-left: 12px;
+ flex-shrink: 0;
+ color: #ccc;
+ font-size: 14px;
+ }
+
+ .oa-news-item:hover .oa-news-item-arrow,
+ .oa-notice-item:hover .oa-notice-item-arrow {
+ color: var(--color-primary);
+ }
+
/*推荐服务*/
.oa-box-2-section-recommend {
padding: 20px;
- background: #ffffff;
+ /*background: #ffffff;*/
}
.oa-recommend-tabs {
@@ -767,16 +1424,19 @@ layout("/layouts/v4/baseLayout.html"){
align-items: center;
text-align: center;
padding: 20px 16px;
- background: #f8f9fa;
+ /* background: #f8f9fa; */
border-radius: 8px;
transition: all 0.2s ease;
cursor: pointer;
+ min-height: 120px;
+ width: 100%;
+ box-sizing: border-box;
+ min-width: 0;
}
.oa-recommend-item:hover {
background: #e9ecef;
transform: translateY(-2px);
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.oa-recommend-item-icon {
@@ -798,6 +1458,8 @@ layout("/layouts/v4/baseLayout.html"){
.oa-recommend-item-info {
flex: 1;
+ width: 100%;
+ min-width: 0;
}
.oa-recommend-item-info h4 {
@@ -805,13 +1467,10 @@ layout("/layouts/v4/baseLayout.html"){
font-size: 16px;
font-weight: 500;
color: #333;
- }
-
- .oa-recommend-item-info p {
- margin: 0;
- font-size: 14px;
- color: #666;
- line-height: 1.4;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ width: 100%;
}
/* 空数据提示样式 */
@@ -950,7 +1609,7 @@ layout("/layouts/v4/baseLayout.html"){
- 个人主页
+ 个人中心
@@ -995,59 +1654,59 @@ layout("/layouts/v4/baseLayout.html"){
-
+