This commit is contained in:
那些花儿
2025-07-28 10:48:38 +08:00
parent 030cf7cc4c
commit 3b51ed7a51
450 changed files with 82310 additions and 1213 deletions
@@ -1,39 +1,46 @@
package com.budwk.app.zhgh.dayofficework.article.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
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.utils.FieldMappingUtil;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum;
import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.dayofficework.article.models.Article;
import com.budwk.app.zhgh.dayofficework.article.param.ArticleInfoPageParam;
import com.budwk.app.zhgh.dayofficework.article.service.ArticleService;
import com.budwk.app.zhgh.dayofficework.article.vo.ArticleInfoPageVO;
import com.budwk.app.zhgh.dayofficework.article.vo.ArticlePageVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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.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.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -49,6 +56,9 @@ public class ArticleBranchUnionApprovalController {
private BpmService bpmService;
@Inject
private CommonService commonService;
@Inject
private FlowEngine flowEngine;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/article/branchUnionApproval/index.html")
@@ -56,81 +66,79 @@ public class ArticleBranchUnionApprovalController {
public void index() {
}
@At("/form")
@Ok("beetl:/platform/zhgh/dayofficework/article/branchUnionApproval/form.html")
@SaCheckLogin
public void form() {
}
@At
@SaCheckPermission("article.branchUnionApproval")
@ApiOperation("分页查询")
public Result pageData(@Valid ArticleInfoPageParam pageForm, boolean approval) {
Sql sql = Sqls.create("""
SELECT
info.*,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
task.id processInstanceTaskId,
task.taskStatus processInstanceTaskStatus,
COUNT(nt.id) OVER (PARTITION BY task.id) > 0 AS nextTaskIsComplete\s
info.id,
info.title,
info.userName,
info.loginName,
info.unitName,
info.unionName,
info.submitTime,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariale,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariale
FROM
bpm_process_task task
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN article info ON info.id = inst.processInstanceBusinessId
LEFT JOIN bpm_process_task nt ON nt.prevTaskId = task.id AND nt.taskStatus = 'COMPLETE'
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN article info ON info.id = ins.businessNo
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname())));
}
cnd.and("nd.nodeCode","=",20);
if(approval){
cnd.and("task.taskStatus","=", BpmProcessTaskStatusEnum.COMPLETE);
}else{
cnd.and("task.taskStatus","=",BpmProcessTaskStatusEnum.ACTIVE);
cnd.and("t.taskName", "=", "f4d62c2d-3947-4c68-b34f-127af89952b0");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (approval) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
cnd.andEX("YEAR(info.submitTime)","=",pageForm.getYear());
cnd.and(Cnd.likeEX("info.title",pageForm.getTitle()));
cnd.desc("t.createdAt");
if(StrUtil.isAllBlank(pageForm.getPageOrderName(),pageForm.getPageOrderBy())){
cnd.andEX("YEAR(info.submitTime)", "=", pageForm.getYear());
cnd.and(Cnd.likeEX("info.title", pageForm.getTitle()));
if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.desc("info.submitTime");
}else{
} else {
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
sql.setCondition(cnd);
Pagination<ArticleInfoPageVO> pageVO = articleService.listPageVO(pageForm, sql, ArticleInfoPageVO.class);
Pagination<NutMap> pageVO = articleService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pageVO);
}
@At
@SaCheckPermission("article.branchUnionApproval")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "新闻投稿", msg = "分工会审核")
@ApiOperation("分工会审核")
public Result approval(@Valid @Param("approval") BpmTaskApprovalParam approvalParam) {
approvalParam.getBpmTaskApprovalTypeEnum();
Map<String, Object> variables = BeanUtil.beanToMap(approvalParam);
List<String> assignments = new ArrayList<>();
if(approvalParam.getBpmTaskApprovalTypeEnum().equals(BpmTaskApprovalTypeEnum.PASS)){
String schoolUnionApprovalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.SCHOOL_UNION_ARTICLE_ADMIN, Cnd.NEW());
assignments.add(schoolUnionApprovalLoginName);
}
bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), approvalParam.getBpmTaskApprovalTypeEnum(), variables, assignments);
public Result doApproval(Long taskId, @Param("submitType") Integer submitType) {
Dict args = new Dict();
args.put(FlowConst.SUBMIT_TYPE,submitType);
flowEngine.executeProcessTask(taskId, SecurityUtil.getUserId(), args);
return Result.success();
}
@At
@SaCheckPermission("article.branchUnionApproval")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "新闻投稿", msg = "分工会撤回")
@ApiOperation("分工会撤回")
public Result revoke(@Valid String taskId) {
bpmService.revokeTask(taskId);
return Result.success();
}
}
@@ -31,9 +31,9 @@ import org.nutz.ioc.loader.annotation.IocBean;
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.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -48,6 +48,8 @@ public class ArticleClubApprovalController {
private BpmService bpmService;
@Inject
private CommonService commonService;
// @Inject
// private SnakerEngine snakerEngine;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/article/clubApproval/index.html")
@@ -79,22 +81,22 @@ public class ArticleClubApprovalController {
$condition
""");
Cnd cnd = Cnd.NEW();
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname())));
}
cnd.and("nd.nodeCode","=",32);
if(approval){
cnd.and("task.taskStatus","=", BpmProcessTaskStatusEnum.COMPLETE);
}else{
cnd.and("task.taskStatus","=",BpmProcessTaskStatusEnum.ACTIVE);
cnd.and("nd.nodeCode", "=", 32);
if (approval) {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.COMPLETE);
} else {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.ACTIVE);
}
cnd.andEX("YEAR(info.submitTime)","=",pageForm.getYear());
cnd.and(Cnd.likeEX("info.title",pageForm.getTitle()));
cnd.andEX("YEAR(info.submitTime)", "=", pageForm.getYear());
cnd.and(Cnd.likeEX("info.title", pageForm.getTitle()));
if(StrUtil.isAllBlank(pageForm.getPageOrderName(),pageForm.getPageOrderBy())){
if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.desc("info.submitTime");
}else{
} else {
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
sql.setCondition(cnd);
@@ -111,7 +113,7 @@ public class ArticleClubApprovalController {
approvalParam.getBpmTaskApprovalTypeEnum();
Map<String, Object> variables = BeanUtil.beanToMap(approvalParam);
List<String> assignments = new ArrayList<>();
if(approvalParam.getBpmTaskApprovalTypeEnum().equals(BpmTaskApprovalTypeEnum.PASS)){
if (approvalParam.getBpmTaskApprovalTypeEnum().equals(BpmTaskApprovalTypeEnum.PASS)) {
String schoolUnionApprovalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.SCHOOL_UNION_ARTICLE_ADMIN, Cnd.NEW());
assignments.add(schoolUnionApprovalLoginName);
}
@@ -1,5 +1,6 @@
package com.budwk.app.zhgh.dayofficework.article.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.dayofficework.article.service.ArticleService;
@@ -30,4 +31,11 @@ public class ArticleCommonController {
return Result.success(articleVO);
}
@At
@SaCheckLogin
@Ok("beetl:/platform/zhgh/dayofficework/article/common/fullForm.html")
public void fullForm(){
}
}
@@ -1,16 +1,16 @@
package com.budwk.app.zhgh.dayofficework.article.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.bean.BeanUtil;
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.bpm.service.BpmService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.article.models.Article;
import com.budwk.app.zhgh.dayofficework.article.param.ArticleInfoPageParam;
import com.budwk.app.zhgh.dayofficework.article.service.ArticleService;
import com.budwk.app.zhgh.dayofficework.article.vo.ArticleInfoPageVO;
import com.budwk.app.zhgh.dayofficework.article.vo.ArticlePageVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
@@ -20,10 +20,15 @@ import org.nutz.dao.sql.Sql;
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 javax.validation.Valid;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
@IocBean
@At("/platform/article/mine")
@@ -33,53 +38,92 @@ public class ArticleMineController {
@Inject
private ArticleService articleService;
@Inject
private BpmService bpmService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/article/mine/index.html")
@SaCheckPermission("article.mine")
public void index() {}
public void index() {
}
@At
@SaCheckPermission("article.mine")
@ApiOperation("分页查询")
public Result pageData(@Valid ArticleInfoPageParam pageForm){
public Result pageData(@Valid ArticleInfoPageParam pageForm) {
Sql sql = Sqls.create("""
SELECT
info.*,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeCode,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
(
SELECT
count( 1 ) > 0
FROM
bpm_process_task
WHERE
prevTaskId = ( SELECT id FROM bpm_process_task WHERE processInstanceId = inst.id AND processTaskNodeCode IN ( 10, 30 ) ORDER BY createdAt DESC LIMIT 1 )
AND taskStatus = 'COMPELTE'
) AS nextTaskIsComplete
info.id,
info.title,
info.userName,
info.loginName,
info.unitName,
info.unionName,
info.submitTime,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariale,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariale
FROM
article info
LEFT JOIN bpm_process_instance inst ON inst.processInstanceBusinessId = info.id
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 wf_process_task_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name()) && !SecurityUtil.getUserLoginname().equals("20210004")) {
cnd.and("inst.processInstanceInitiatorLoginName", "=", SecurityUtil.getUserLoginname());
}
cnd.andEX("YEAR(info.submitTime)","=",pageForm.getYear());
cnd.and(Cnd.likeEX("info.title",pageForm.getTitle()));
cnd.and("info.createdBy", "=", SecurityUtil.getUserId());
cnd.andEX("YEAR(info.submitTime)", "=", pageForm.getYear());
cnd.desc("info.submitTime");
sql.setCondition(cnd);
Pagination<ArticleInfoPageVO> pageVO = articleService.listPageVO(pageForm, sql, ArticleInfoPageVO.class);
Pagination<NutMap> pageVO = articleService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pageVO);
// // 获取当前用户发起的流程实例列表
// Page<HistoryOrder> page = new Page<>();
// page.setPageNo(pageForm.getPageNumber());
// page.setPageSize(pageForm.getPageSize());
// QueryFilter queryFilter = new QueryFilter();
//// queryFilter.setProcessId("89032d1a30ee46e79361b503a5d250db");
// queryFilter.setName("XWTG");
//
// List<HistoryOrder> historyOrders = snakerEngine.query().getHistoryOrders(page, queryFilter);
//
// Cnd cnd = Cnd.NEW();
// cnd.and("userId", "=", SecurityUtil.getUserId());
// cnd.andEX("YEAR(submitTime)", "=", pageForm.getYear());
// cnd.and(Cnd.likeEX("title", pageForm.getTitle()));
// cnd.desc("submitTime");
// Pagination<Article> pagination = articleService.listPage(pageForm.getPageNumber(), pageForm.getPageSize(), cnd);
//
// List<Map<String, Object>> list = pagination.getList().stream().map(row -> {
// Map<String, Object> mapBean = BeanUtil.beanToMap(row);
// Optional<HistoryOrder> hisOrder = historyOrders.stream().filter(historyOrder -> historyOrder.getVariableMap().get("businessId").equals(row.getId())).findFirst();
// hisOrder.ifPresent(historyOrder -> mapBean.put("instance", historyOrder));
//
// // 查询任务信息
// if (hisOrder.isPresent()) {
// List<Task> tasks = snakerEngine.query().getActiveTasks(new QueryFilter().setOrderId(hisOrder.get().getId()));
// // 待办任务列表
// mapBean.put("activeTasks", tasks);
// // 当前任务节点
// mapBean.put("activeTaskName", tasks.stream().map(Task::getDisplayName).collect(Collectors.joining(",")));
// // 申请的任务列表 只会有一条吧 别搞
// mapBean.put("applyTask", tasks.stream().filter(task -> task.getParentTaskId().equals("start")).findFirst().orElse(null));
// }
// return mapBean;
// }).toList();
//
// Pagination<Map<String, Object>> mapPagination = new Pagination<>(pagination.getPageNo(), pagination.getPageSize(), pagination.getTotalCount(), list);
//
// return Result.success(mapPagination);
}
@At
@@ -87,8 +131,8 @@ public class ArticleMineController {
@ApiOperation("撤回")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "新闻投稿", msg = "撤回新闻投稿")
public Result revokeApply(@Valid String id){
bpmService.revokeApply(id);
public Result revokeApply(@Valid String id) {
// bpmService.revokeApply(id);
return Result.success();
}
@@ -97,9 +141,9 @@ public class ArticleMineController {
@ApiOperation("删除")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "新闻投稿", msg = "删除新闻投稿")
public Result delete(@Valid String id){
public Result delete(@Valid String id) {
articleService.delete(id);
bpmService.deleteInstance(id);
// bpmService.deleteInstance(id);
return Result.success();
}
@@ -1,7 +1,9 @@
package com.budwk.app.zhgh.dayofficework.article.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
@@ -11,6 +13,9 @@ import com.budwk.app.base.utils.PageUtil;
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.constant.FlowConst;
import com.budwk.app.flow.engine.FlowEngine;
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.web.controllers.open.commons.service.CommonService;
@@ -27,6 +32,7 @@ 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;
@@ -48,6 +54,8 @@ public class ArticleSchoolUnionApprovalController {
private BpmService bpmService;
@Inject
private CommonService commonService;
@Inject
private FlowEngine flowEngine;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/article/schoolUnionApproval/index.html")
@@ -55,85 +63,82 @@ public class ArticleSchoolUnionApprovalController {
public void index() {
}
@At("/form")
@Ok("beetl:/platform/zhgh/dayofficework/article/schoolUnionApproval/form.html")
@SaCheckLogin
public void form() {
}
@At
@SaCheckPermission("article.schoolUnionApproval")
@ApiOperation("分页查询")
public Result pageData(@Valid ArticleInfoPageParam pageForm, boolean approval) {
Sql sql = Sqls.create("""
SELECT
info.*,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
task.id processInstanceTaskId,
task.taskStatus processInstanceTaskStatus,
COUNT(nt.id) OVER (PARTITION BY task.id) > 0 AS nextTaskIsComplete\s
info.id,
info.title,
info.userName,
info.loginName,
info.unitName,
info.unionName,
info.submitTime,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariale,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariale
FROM
bpm_process_task task
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN article info ON info.id = inst.processInstanceBusinessId
LEFT JOIN bpm_process_task nt ON nt.prevTaskId = task.id AND nt.taskStatus = 'COMPLETE'
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN article info ON info.id = ins.businessNo
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname())));
}
cnd.and("nd.nodeCode","=",40);
if(approval){
cnd.and("task.taskStatus","=", BpmProcessTaskStatusEnum.COMPLETE);
}else{
cnd.and("task.taskStatus","=",BpmProcessTaskStatusEnum.ACTIVE);
cnd.and("t.taskName", "=", "a29bdec1-e285-41f3-aa2c-2c24fccefea1");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (approval) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
cnd.andEX("YEAR(info.submitTime)","=",pageForm.getYear());
cnd.and(Cnd.likeEX("info.title",pageForm.getTitle()));
cnd.andEX("info.unionId","=",pageForm.getUnionId());
cnd.andEX("info.unitId","=",pageForm.getUnitId());
cnd.andEX("info.origin","=",pageForm.getOrigin());
cnd.desc("t.createdAt");
if(StrUtil.isAllBlank(pageForm.getPageOrderName(),pageForm.getPageOrderBy())){
cnd.andEX("YEAR(info.submitTime)", "=", pageForm.getYear());
cnd.and(Cnd.likeEX("info.title", pageForm.getTitle()));
if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.desc("info.submitTime");
}else{
} else {
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
sql.setCondition(cnd);
Pagination<ArticleInfoPageVO> pageVO = articleService.listPageVO(pageForm, sql, ArticleInfoPageVO.class);
Pagination<NutMap> pageVO = articleService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pageVO);
}
@At
@SaCheckPermission("article.schoolUnionApproval")
@SaCheckPermission("article.branchUnionApproval")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "新闻投稿", msg = "校工会审核")
@ApiOperation("校工会审核")
public Result approval(@Valid @Param("approval") BpmTaskApprovalParam approvalParam) {
approvalParam.getBpmTaskApprovalTypeEnum();
Map<String, Object> variables = BeanUtil.beanToMap(approvalParam);
List<String> assignments = new ArrayList<>();
public Result doApproval(Long taskId, @Param("submitType") Integer submitType) {
Dict args = new Dict();
// flowEngine.executeProcessTask(taskId, SecurityUtil.getUserId(), args);
args.set(FlowConst.SUBMIT_TYPE, submitType);
flowEngine.executeAndJumpToFirstTaskNode(taskId, SecurityUtil.getUserId(), args);
// 同意退回都到校工会投稿编辑人
String schoolUnionApprovalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.SCHOOL_UNION_ARTICLE_ADMIN, Cnd.NEW());
assignments.add(schoolUnionApprovalLoginName);
bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), approvalParam.getBpmTaskApprovalTypeEnum(), variables, assignments);
return Result.success();
}
@At
@SaCheckPermission("article.schoolUnionApproval")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "新闻投稿", msg = "校工会撤回")
@ApiOperation("校工会撤回")
public Result revoke(@Valid String taskId) {
bpmService.revokeTask(taskId);
return Result.success();
}
}
@@ -1,20 +1,21 @@
package com.budwk.app.zhgh.dayofficework.article.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.result.Result;
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.sys.models.Sys_user_role;
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.enums.ProcessSubmitTypeEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.club.model.ClubUser;
import com.budwk.app.zhgh.club.model.SysClub;
import com.budwk.app.zhgh.club.service.SysClubService;
import com.budwk.app.zhgh.dayofficework.article.models.Article;
import io.swagger.annotations.Api;
@@ -48,15 +49,24 @@ public class ArticleWriteController {
private BpmService bpmService;
@Inject
private CommonService commonService;
@Inject
private SysClubService sysClubService;
@Inject
private FlowEngine flowEngine;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/article/write/index.html")
@SaCheckPermission("article.write")
@ApiOperation("撰写新闻投稿")
public void index() {
}
@At
@SaCheckLogin
@Ok("beetl:/platform/zhgh/dayofficework/article/write/index_.html")
public void index_() {
}
@@ -66,74 +76,52 @@ public class ArticleWriteController {
@Aop(TransAop.READ_COMMITTED)
public Result save(@Param("article") Article article) {
dao.insertOrUpdate(article);
bpmService.startSaveProcessInstance(BpmProcessConstant.ARTICLE.name(), article.getTitle(), article.getId(), null);
return Result.success();
// 启动流程 阻塞在第一个任务节点
ProcessInstance instance = flowEngine.startProcessInstanceByKey("XWTG", article.getId(), SecurityUtil.getUserId(), null);
return Result.success(article);
}
@At
@SaCheckPermission("article.write")
@ApiOperation("提交新闻投稿")
@Aop(TransAop.READ_COMMITTED)
public Result submit(@Param("article") Article article) {
List<String> assignments = new ArrayList<>();
if ("ARTICLE_ORIGIN_CLUB".equals(article.getOrigin())) {
SysClub club = sysClubService.fetch(article.getClubId());
article.setClubName(club.getClubName());
//查询协会会长
String branchClubApprovalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.CLUB_PRESIDENT, Cnd.where(Sys_user_role::getClubId, "=", article.getClubId()));
if (StrUtil.isBlank(branchClubApprovalLoginName)) {
return Result.error("协会未配置审批人,请联系协会!");
}
assignments.add(branchClubApprovalLoginName);
} else {
//查询分工会主席
String branchUnionApprovalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.BRANCH_UNION_CHAIRMAN, Cnd.where(Sys_user_role::getUnionId, "=", article.getUnionId()));
if (StrUtil.isBlank(branchUnionApprovalLoginName)) {
return Result.error("分工会未配置审批人,请联系校工会!");
}
assignments.add(branchUnionApprovalLoginName);
}
public Result submit(@Param("article") Article article, Long instanceId, Long taskId) {
dao.insertOrUpdate(article);
HashMap<String, Object> variables = new HashMap<>();
variables.put("MODE", article.getOrigin());
// 默认false
variables.put("FIRST_EXAMINE_BACK", false);
variables.put("FINAL_EXAMINE_BACK", false);
// 查询最新一次审核的任务
BpmProcessInstance instance = dao.fetch(BpmProcessInstance.class, Cnd.where(BpmProcessInstance::getProcessInstanceBusinessId, "=", article.getId()));
if (ObjectUtil.isNotNull(instance)) {
List<String> taskIds = instance.getProcessInstanceTaskIds();
BpmProcessTask endBackTask = dao.fetch(BpmProcessTask.class, Cnd.where(BpmProcessTask::getId, "in", taskIds).and(BpmProcessTask::getProcessTaskNodeCode, "in", List.of(38, 65)).desc(BpmProcessTask::getCreatedOn));
if (ObjectUtil.isNotNull(endBackTask)) {
BpmProcessTask prevTask = dao.fetch(BpmProcessTask.class, Cnd.where(BpmProcessTask::getId, "=", endBackTask.getPrevTaskId()));
String result = prevTask.getExtVariable().getStr("RESULT", "");
Boolean processAgain = prevTask.getExtVariable().getBool("processAgain", false);
if ("BACK_TO_START".equals(result) && !processAgain) {
// 哪里来的回哪儿去
if (prevTask.getProcessTaskNodeCode() == 36) {
variables.put("FIRST_EXAMINE_BACK", true);
} else if (prevTask.getProcessTaskNodeCode() == 60) {
variables.put("FINAL_EXAMINE_BACK", true);
}
// 重新赋值
assignments = new ArrayList<>();
String schoolUnionApprovalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.SCHOOL_UNION_ARTICLE_ADMIN, Cnd.NEW());
assignments.add(schoolUnionApprovalLoginName);
}
if (instanceId == null && taskId == null) {
ProcessInstance instance = flowEngine.startProcessInstanceByKey("XWTG", article.getId(), SecurityUtil.getUserId(), null);
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), new String[]{});
for (ProcessTask task : doingTaskList) {
Dict args = new Dict();
args.put(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.put("origin", article.getOrigin());
flowEngine.executeProcessTask(task.getId(), FlowConst.AUTO_ID, args);
}
} else {
flowEngine.executeProcessTask(taskId, SecurityUtil.getUserId(), Dict.create().set("origin", article.getOrigin()));
}
bpmService.startSubmitProcessInstance(BpmProcessConstant.ARTICLE.name(), article.getTitle(), article.getId(), assignments, variables);
return Result.success();
}
@At
@SaCheckPermission("article.write")
@ApiOperation("撤销新闻投稿")
@Aop(TransAop.READ_COMMITTED)
public Result revokeApply(@Param("id") String id) {
// FlowInstance instance = dao.fetch(FlowInstance.class, Cnd.where(FlowInstance::getBusinessId, "=", id));
// BusinessStatusEnum.checkCancelStatus(instance.getFlowStatus());
// FlowParams flowParams = FlowParams.build()
//// .message(message)
// .flowStatus(BusinessStatusEnum.CANCEL.getStatus())
// .hisStatus(BusinessStatusEnum.CANCEL.getStatus())
// .handler(SecurityUtil.getUserId())
// .ignore(true);
// taskService.revoke(instance.getId(), flowParams);
return Result.success();
}
@At
@SaCheckPermission("article.write")
@ApiOperation("新闻投稿详情")
@@ -0,0 +1,33 @@
package com.budwk.app.zhgh.dayofficework.article.interceptor;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowInterceptor;
import com.budwk.app.flow.engine.core.Execution;
import com.budwk.app.flow.engine.core.ServiceContext;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.zhgh.dayofficework.article.models.Article;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.json.Json;
public class ArticleSaveInterceptor implements FlowInterceptor {
@Override
public void intercept(Execution execution) {
System.out.println("..................");
String formDataStr = execution.getArgs().getStr(FlowConst.FORM_DATA);
Article article = Json.fromJson(Article.class, formDataStr);
Dao dao = ServiceContext.find(Dao.class);
dao.insertOrUpdate(article);
// 设置流程变量
execution.getArgs().set("origin", article.getOrigin());
int instanceId = execution.getArgs().getInt(FlowConst.PROCESS_INSTANCE_ID_KEY);
dao.update(ProcessInstance.class, Chain.make("businessNo", article.getId()), Cnd.where(ProcessInstance::getId, "=", instanceId));
System.out.println(execution);
}
}
@@ -24,6 +24,11 @@ public class Article extends BaseModel {
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("流程实例ID")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String instanceId;
@Column
@Comment("标题")
@ColDefine(type = ColType.VARCHAR, width = 100)
@@ -96,7 +101,6 @@ public class Article extends BaseModel {
@PrevUpdate(els = @EL("$me.now()"))
private Date submitTime;
@Column
@Comment("投稿人联系方式")
@ColDefine(type = ColType.VARCHAR, width = 50)
@@ -111,7 +115,6 @@ public class Article extends BaseModel {
@Comment("发布链接地质")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String publishLink;
public Date now() {
return new Date();
}
@@ -29,8 +29,8 @@ public class ArticleServiceImpl extends BaseServiceImpl<Article> implements Arti
Article article = fetch(id);
ArticleVO articleVO = BeanUtil.copyProperties(article, ArticleVO.class);
List<BpmTaskApprovalRecordVo> nodeTasks = bpmService.getNodeTasks(BpmProcessConstant.ARTICLE, id);
articleVO.setNodeTasks(nodeTasks);
// List<BpmTaskApprovalRecordVo> nodeTasks = bpmService.getNodeTasks(BpmProcessConstant.ARTICLE, id);
// articleVO.setNodeTasks(nodeTasks);
return articleVO;
}
@@ -0,0 +1,29 @@
package com.budwk.app.zhgh.dayofficework.article.vo;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
public class ArticlePageVo {
private boolean orderState;
private String currentTaskName;
private String parentTaskId;
private String businessId;
private String title;
private String userName;
private String loginName;
private String unitName;
private String unionName;
private String submitTime;
}
@@ -0,0 +1,51 @@
package com.budwk.app.zhgh.dayofficework.holidaywishes.models;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
@EqualsAndHashCode(callSuper = true)
@Table("holiday_wishes_matter")
@Comment("节日祝福事项")
@Data
public class HolidayWishesMatter extends BaseModel {
@Comment("ID")
@Name
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String name;
@Column
@Comment("消息模板")
@ColDefine(type = ColType.TEXT)
private String msgTemplate;
@Column
@Comment("发送方式(手动、自动)")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String sendWay;
@Column
@Comment("自动发送时间")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String autoCron;
@Column
@Comment("发送途径(系统、短信、企业微信)")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String sendChannel;
@Column
@Comment("接收人")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String sendRange;
}
@@ -0,0 +1,61 @@
package com.budwk.app.zhgh.dayofficework.holidaywishes.models;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
@Table("holiday_wishes_message")
@Comment("节日祝福信息")
@Data
@EqualsAndHashCode(callSuper = true)
public class HolidayWishesMessage extends BaseModel {
@Comment("ID")
@Name
@PrevInsert(uu32 = true)
private String id;
@Comment("事项ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Column
private String matterId;
@Comment("接收人ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Column
private String receiverId;
@Comment("接收人姓名")
@ColDefine(type = ColType.VARCHAR, width = 50)
@Column
private String receiverName;
@Comment("接收人工号")
@ColDefine(type = ColType.VARCHAR, width = 50)
@Column
private String receiverLoginName;
@Comment("接收人单位ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Column
private String receiverUnitId;
@Comment("接收人单位名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
@Column
private String receiverUnitName;
@Comment("发送内容")
@ColDefine(type = ColType.TEXT)
@Column
private String sendContent;
@Comment("是否发送")
@ColDefine(type = ColType.BOOLEAN)
@Column
@Default("0")
private Boolean isSend;
}
@@ -0,0 +1,81 @@
package com.budwk.app.zhgh.democratic.grassrootscongress.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.bean.BeanUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.zhgh.democratic.grassrootscongress.service.GrassrootsCongressService;
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.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
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.Map;
/**
* @version 1.0
* @Author zzr
* @nameGrassrootsCongressApprovalController
* @Date 2024/8/16 17:21
* @注释 基层双代会批复
*/
@Slf4j
@IocBean
@Ok("json:full")
@At("/platform/grassrootsCongress/approval")
@Api(tags = "基层双代会批复")
public class GrassrootsCongressApprovalController {
@Inject
private GrassrootsCongressService grassrootsCongressService;
@Inject
private BpmService bpmService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/grassrootscongress/approval/index.html")
@SaCheckPermission("grassrootsCongress.approval")
public void index() {
}
@At
@ApiOperation("会议列表")
@SaCheckPermission("grassrootsCongress.approval")
public Result pageData(PageForm pageForm, Integer year, String unionId) {
Pagination pagination = grassrootsCongressService.approvalPageData(pageForm, year, unionId);
return Result.success(pagination);
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("会议批复")
@SaCheckPermission("grassrootsCongress.approval")
@SLog(type = "基层双代会", tag = "基层双代会批复", msg = "校工会批复信息")
public Result approval(@Param("approval") @Valid BpmTaskApprovalParam approvalParam) {
Map<String, Object> variables = BeanUtil.beanToMap(approvalParam);
bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), approvalParam.getBpmTaskApprovalTypeEnum(), variables, null);
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("会议批复撤回")
@SaCheckPermission("grassrootsCongress.approval")
@SLog(type = "基层双代会", tag = "基层双代会批复撤回", msg = "校工会批复信息撤回")
public Result revoke(@Valid String taskId) {
bpmService.revokeTask(taskId);
return Result.success();
}
}
@@ -0,0 +1,80 @@
package com.budwk.app.zhgh.democratic.grassrootscongress.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.zhgh.democratic.grassrootscongress.service.GrassrootsCongressMeetingService;
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.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
/**
* @ClassName GrassrootsCongressMeetingAuditController
* @Description TODO
* @Author zhf
* @Date 2024/9/6 15:17
*/
@Slf4j
@IocBean
@Ok("json:full")
@At("/platform/grassrootsCongress/materials/audit")
@Api(tags = "基层双代会资料审核")
public class GrassrootsCongressMaterialsAuditController {
@Inject
private BpmService bpmService;
@Inject
private GrassrootsCongressMeetingService grassrootsCongressMeetingService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/grassrootscongress/materials/audit/index.html")
@SaCheckPermission("grassrootsCongress.materials.audit")
public void index() {
}
@At
@ApiOperation("资料列表")
@SaCheckPermission("grassrootsCongress.materials.audit")
public Result pageData(PageForm pageForm, Integer year, String unionId) {
Pagination pagination = grassrootsCongressMeetingService.pageData(pageForm, year, unionId);
return Result.success(pagination);
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("会议资料审核")
@SaCheckPermission("grassrootsCongress.materials.audit")
@SLog(type = "基层双代会", tag = "基层双代会资料审核", msg = "校工会审核信息")
public Result approval(@Param("approval") @Valid BpmTaskApprovalParam approvalParam) {
bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), approvalParam.getBpmTaskApprovalTypeEnum(), null, null);
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("会议批复撤回")
@SaCheckPermission("grassrootsCongress.materials.audit")
@SLog(type = "基层双代会", tag = "基层双代会资料撤回", msg = "基层双代会资料撤回")
public Result revoke(@Valid String taskId) {
bpmService.revokeTask(taskId);
return Result.success();
}
}
@@ -0,0 +1,143 @@
package com.budwk.app.zhgh.democratic.grassrootscongress.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
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.page.Pagination;
import com.budwk.app.base.param.PageForm;
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.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.democratic.grassrootscongress.models.GrassrootsCongressMaterialsInfo;
import com.budwk.app.zhgh.democratic.grassrootscongress.service.GrassrootsCongressMeetingService;
import com.budwk.app.zhgh.democratic.grassrootscongress.vo.GrassrootsCongressMaterialVo;
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.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
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.Date;
import java.util.List;
/**
* @ClassName GrassrootsCongressMaterialsController
* @Description TODO
* @Author zhf
* @Date 2024/9/6 9:53
*/
@Slf4j
@IocBean
@Ok("json:full")
@At("/platform/grassrootsCongress/materials/manage")
@Api(tags = "基层双代会资料管理")
public class GrassrootsCongressMaterialsController {
@Inject
private GrassrootsCongressMeetingService grassrootsCongressMeetingService;
@Inject
private BpmService bpmService;
@Inject
private BaseService baseService;
@Inject
private CommonService commonService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/grassrootscongress/materials/manage/index.html")
@SaCheckPermission("grassrootsCongress.materials.manage")
public void index() {
}
@At
@ApiOperation("我的资料列表")
@SaCheckPermission("grassrootsCongress.materials.manage")
public Result pageData(PageForm pageForm, Integer year) {
Pagination pagination = grassrootsCongressMeetingService.pageData(pageForm, year);
return Result.success(pagination);
}
@At
@ApiOperation("提交")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("grassrootsCongress.materials.manage")
@SLog(tag = "基层双代会", msg = "上传会议资料", type = "grassrootsCongressMaterials")
public Result doSave(@Param("data") GrassrootsCongressMaterialsInfo data) {
data.setCreatedDate(new Date());
data.setUserName(SecurityUtil.getUserUsername());
data.setLoginName(SecurityUtil.getUserLoginname());
data.setUserId(SecurityUtil.getUserId());
grassrootsCongressMeetingService.insertOrUpdate(data);
bpmService.startSaveProcessInstance(BpmProcessConstant.GRASSROOTS_CONGRESS_MATERIALS.name(), data.getMaterialsName(), data.getId(), null);
return Result.success();
}
@At
@ApiOperation("提交")
@Aop({TransAop.READ_COMMITTED})
@SaCheckPermission("grassrootsCongress.materials.manage")
@SLog(type = "grassrootsCongressMaterials", tag = "基层双代会", msg = "会议请示添加会议")
public Result doSubmit(@Param("data") GrassrootsCongressMaterialsInfo data) {
data.setCreatedDate(new Date());
data.setUserName(SecurityUtil.getUserUsername());
data.setLoginName(SecurityUtil.getUserLoginname());
data.setUserId(SecurityUtil.getUserId());
grassrootsCongressMeetingService.insertOrUpdate(data);
String approvalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.SCHOOL_UNION_ADMIN);
if (StrUtil.isBlank(approvalLoginName)) {
throw new BaseException("会议资料审批人未设置");
}
bpmService.startSubmitProcessInstance(BpmProcessConstant.GRASSROOTS_CONGRESS_MATERIALS.name(), data.getMaterialsName(), data.getId(), List.of(approvalLoginName), null);
return Result.success();
}
@At
@ApiOperation("删除会议资料")
@SaCheckPermission("grassrootsCongress.myMeeting")
@Aop(TransAop.READ_COMMITTED)
@SLog(type = "grassrootsCongressMaterials", tag = "基层双代会", msg = "删除会议资料")
public Result doDelete(@Valid String id) {
grassrootsCongressMeetingService.dao().delete(GrassrootsCongressMaterialsInfo.class, id);
bpmService.deleteInstance(id);
return Result.success();
}
@At
@ApiOperation("撤回申请")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "基层双代会", msg = "撤回申请")
@SaCheckPermission("grassrootsCongress.myMeeting")
public Result revokeApply(@Valid String id) {
bpmService.revokeApply(id);
return Result.success();
}
@At
@SaCheckPermission("grassrootsCongress.materials.manage")
@ApiOperation("查询单个会议资料信息")
public Result findOne(@Valid String id) {
Sql sql = Sqls.create("""
select * from grassroots_congress_materials_info where id=@id
""").setParam("id", id);
GrassrootsCongressMaterialVo grassrootsCongressMaterialVo = (GrassrootsCongressMaterialVo) baseService.fetchVO(sql, GrassrootsCongressMaterialVo.class);
grassrootsCongressMaterialVo.setNodeTasks(bpmService.getNodeTasks(BpmProcessConstant.GRASSROOTS_CONGRESS_MATERIALS, id));
return Result.success(grassrootsCongressMaterialVo);
}
}
@@ -0,0 +1,124 @@
package com.budwk.app.zhgh.democratic.grassrootscongress.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant;
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.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.democratic.grassrootscongress.models.GrassrootsCongressMeetingInfo;
import com.budwk.app.zhgh.democratic.grassrootscongress.vo.GrassrootsCongressVo;
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.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
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;
/**
* @version 1.0
* @Author zzr
* @nameGrassrootsCongressApplyController
* @Date 2024/8/16 16:44
* @注释 基层双代会请示
*/
@Slf4j
@IocBean
@Ok("json:full")
@At("/platform/grassrootsCongress/meeting")
@Api(tags = "基层双代会请示")
public class GrassrootsCongressMeetingController {
@Inject
private Dao dao;
@Inject
private BpmService bpmService;
@Inject
private BaseService baseService;
@Inject
private CommonService commonService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/grassrootscongress/meetings/index.html")
@SaCheckPermission("grassrootsCongress.meeting")
public void index() {
}
@At
@ApiOperation("提交")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "基层双代会", msg = "会议请示添加会议")
@SaCheckPermission("grassrootsCongress.meeting")
public Result doSubmit(@Param("data") GrassrootsCongressMeetingInfo data) {
data.setCreateTime(DateUtil.now());
data.setCreateUserId(SecurityUtil.getUserId());
data.setCreateUserName(SecurityUtil.getUserUsername());
dao.insertOrUpdate(data);
List<String> loginNameList = commonService.findUsersLoginNameByRoleCode(RoleConstant.SCHOOL_UNION_WC_AUDIT_ADMIN);
if (ObjectUtil.isEmpty(loginNameList)) {
return Result.error("校工会基层双代会批复人未设置");
}
bpmService.startSubmitProcessInstance(BpmProcessConstant.GRASSROOTS_CONGRESS.name(), data.getMeetingName(), data.getId(), loginNameList, null);
return Result.success();
}
@At
@ApiOperation("保存")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "基层双代会", msg = "会议请示添加会议")
@SaCheckPermission("grassrootsCongress.meeting")
public Result doSave(@Param("data") GrassrootsCongressMeetingInfo data) {
data.setCreateTime(DateUtil.now());
data.setCreateUserId(SecurityUtil.getUserId());
data.setCreateUserName(SecurityUtil.getUserUsername());
dao.insertOrUpdate(data);
bpmService.startSaveProcessInstance(BpmProcessConstant.GRASSROOTS_CONGRESS.name(), data.getMeetingName(), data.getId(), null);
return Result.success();
}
@At
@SaCheckPermission("grassrootsCongress")
@ApiOperation("查询单个会议信息")
public Result findOne(@Valid String id) {
Sql sql = Sqls.create("""
select * from grassroots_congress_meeting_info where id=@id
""").setParam("id", id);
GrassrootsCongressVo grassrootsCongressVo = (GrassrootsCongressVo) baseService.fetchVO(sql, GrassrootsCongressVo.class);
grassrootsCongressVo.setNodeTasks(bpmService.getNodeTasks(BpmProcessConstant.GRASSROOTS_CONGRESS, id));
return Result.success(grassrootsCongressVo);
}
@At
@ApiOperation("根据unionId查询所有基层双代会")
public Result querySessionList(String unionId) {
Cnd cnd = Cnd.NEW();
if (!AuthUtil.hasRoleOr(RoleConstant.SCHOOL_UNION_ADMIN.name(), RoleConstant.SYSADMIN.name())) {
cnd.and("unionId", "=", SecurityUtil.getUnionId());
}
cnd.andEX("unionId", "=", unionId);
cnd.groupBy("fullName");
cnd.desc("createdAt");
List<GrassrootsCongressMeetingInfo> infoList = dao.query(GrassrootsCongressMeetingInfo.class, cnd);
return Result.success(infoList);
}
}
@@ -0,0 +1,71 @@
package com.budwk.app.zhgh.democratic.grassrootscongress.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.democratic.grassrootscongress.param.GrassrootsCongressPageForm;
import com.budwk.app.zhgh.democratic.grassrootscongress.service.GrassrootsCongressService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
/**
* @version 1.0
* @Author zzr
* @nameGrassrootsCongressMeetingStatisticsController
* @Date 2024/11/14 19:25
* @注释
*/
@Slf4j
@IocBean
@Ok("json:full")
@At("/platform/grassrootsCongress/meetingStatistics")
@Api(tags = "基层双代会汇总统计")
public class GrassrootsCongressMeetingStatisticsController {
@Inject
private GrassrootsCongressService grassrootsCongressService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/grassrootscongress/meetingstatistics/index.html")
@SaCheckPermission("grassrootsCongress.meetingStatistics")
public void index() {
}
@At
@ApiOperation("汇总统计列表")
@SaCheckPermission("grassrootsCongress.myMeeting")
public Result pageData(GrassrootsCongressPageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
su.*,
sum(CASE WHEN info.unionId = su.id THEN 1 ELSE 0 END) as unionNum
FROM
sys_union su
LEFT JOIN grassroots_congress_meeting_info info ON su.id = info.unionId $yearSql $nameSql
$condition
""");
Cnd cnd = Cnd.NEW();
if (pageForm.getYear() != null) {
sql.setVar("yearSql", new Static(" and YEAR(info.createTime) = %s".formatted( pageForm.getYear())));
}
if (StrUtil.isNotBlank(pageForm.getFullName())) {
sql.setVar("nameSql", new Static(" and info.fullName = '%s'".formatted(pageForm.getFullName())));
}
// cnd.andEX("YEAR(info.createTime)", "=", pageForm.getYear());
// cnd.andEX("info.fullName", "=", pageForm.getFullName());
cnd.andEX("su.id", "=", pageForm.getUnionId());
cnd.groupBy("su.id");
sql.setCondition(cnd);
return Result.success(grassrootsCongressService.listMap(sql));
}
}
@@ -0,0 +1,100 @@
package com.budwk.app.zhgh.democratic.grassrootscongress.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
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.zhgh.democratic.grassrootscongress.models.GrassrootsCongressMeetingInfo;
import com.budwk.app.zhgh.democratic.grassrootscongress.param.GrassrootsCongressPageForm;
import com.budwk.app.zhgh.democratic.grassrootscongress.service.GrassrootsCongressService;
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.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
import java.util.List;
/**
* @ClassName GrassrootsCongressMyMeetingController
* @Description 我的申请
* @Author zhf
* @Date 2024/9/5 9:57
*/
@Slf4j
@IocBean
@Ok("json:full")
@At("/platform/grassrootsCongress/myMeeting")
@Api(tags = "基层双代会我的请示")
public class GrassrootsCongressMyMeetingController {
@Inject
private BaseService baseService;
@Inject
private BpmService bpmService;
@Inject
private GrassrootsCongressService grassrootsCongressService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/grassrootscongress/myMeetings/index.html")
@SaCheckPermission("grassrootsCongress.myMeeting")
public void index() {
}
@At
@ApiOperation("我的请示列表")
@SaCheckPermission("grassrootsCongress.myMeeting")
public Result pageData(@Valid GrassrootsCongressPageForm pageForm, Integer year) {
Pagination pagination = grassrootsCongressService.pageData(pageForm, year);
return Result.success(pagination);
}
@At
@ApiOperation("删除会议请示")
@SaCheckPermission("grassrootsCongress.myMeeting")
@Aop(TransAop.READ_COMMITTED)
@SLog(type = "grassrootsCongress", tag = "基层双代会", msg = "删除会议请示")
public Result doDelete(@Valid String id) {
baseService.dao().delete(GrassrootsCongressMeetingInfo.class, id);
grassrootsCongressService.delete(id);
bpmService.deleteInstance(id);
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("会议请示撤回")
@SaCheckPermission("grassrootsCongress.myMeeting")
@SLog(type = "基层双代会", tag = "基层双代会请示撤回", msg = "会议请示信息撤回")
public Result revoke(@Valid String id) {
bpmService.revokeApply(id);
return Result.success();
}
@At
@ApiOperation("基层双代会届次")
@SaCheckPermission("grassrootsCongress.myMeeting")
public Result getAllJc(Integer year){
List<GrassrootsCongressMeetingInfo> query = baseService.dao().query(GrassrootsCongressMeetingInfo.class,
Cnd.where("YEAR(createTime)", "=", year).and("fullName", "is not", null).groupBy("fullName"));
if (Lang.isNotEmpty(query)) {
List<String> list = query.stream().map(GrassrootsCongressMeetingInfo::getFullName).toList();
return Result.success(list);
}
return Result.success();
}
}
@@ -0,0 +1,82 @@
package com.budwk.app.zhgh.democratic.grassrootscongress.models;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.Date;
import java.util.List;
/**
* @ClassName GrassrootsCongressMaterialsInfo
* @Description TODO
* @Author zhf
* @Date 2024/9/6 10:06
*/
@Data
@Comment("基层双代会资料")
@EqualsAndHashCode(callSuper = true)
@TableMeta("{'mysql-charset':'utf8mb4'}")
@Table("grassroots_congress_materials_info")
public class GrassrootsCongressMaterialsInfo 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 userId;
@Column
@Comment("创建人姓名")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String userName;
@Column
@Comment("创建人工号")
@ColDefine(type = ColType.VARCHAR, width = 120)
private String loginName;
@Column
@Comment("创建人工会")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String unionName;
@Column
@Comment("教代会id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String sessionId;
@Column
@Comment("教代会全称")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String fullName;
@Column
@Comment("资料类型")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String materialsType;
@Column
@Comment("资料名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String materialsName;
@Column
@Comment("附件")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> files;
@Column
@Comment("创建时间")
@ColDefine(type = ColType.DATETIME)
private Date createdDate;
}
@@ -0,0 +1,118 @@
package com.budwk.app.zhgh.democratic.grassrootscongress.models;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameGrassrootsCongressInfo
* @Date 2024/8/16 16:49
* @注释 基层双代会信息
*/
@Data
@Comment("基层双代会信息")
@EqualsAndHashCode(callSuper = true)
@TableMeta("{'mysql-charset':'utf8mb4'}")
@Table("grassroots_congress_meeting_info")
public class GrassrootsCongressMeetingInfo extends BaseModel {
@Column
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
private String id;
@Column
@Comment("会议名称")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String meetingName;
@Column
@Comment("会议类型")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String meetingType;
@Column
@Comment("届数")
@ColDefine(type = ColType.VARCHAR, width = 8)
private String j;
@Column
@Comment("次数")
@ColDefine(type = ColType.VARCHAR, width = 8)
private String c;
@Column
@Comment("所属单位")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unitId;
@Column
@Comment("所属单位")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unitName;
@Column
@Comment("所属工会")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unionId;
@Column
@Comment("所属工会")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unionName;
@Column
@Comment("创建时间")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String createTime;
@Column
@Comment("创建人")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String createUserId;
@Column
@Comment("创建人")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String createUserName;
@Column
@Comment("届次")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String sessionId;
@Column
@Comment("会议时间")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String meetingTime;
@Column
@Comment("会议议程")
@ColDefine(type = ColType.TEXT)
private String meetingTopic;
@Column
@Comment("会议备注")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String meetingRemark;
@Column
@Comment("文件")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> files;
@Column
@Comment("教代会全称")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String fullName;
}
@@ -0,0 +1,23 @@
package com.budwk.app.zhgh.democratic.grassrootscongress.param;
import com.budwk.app.base.param.PageForm;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @version 1.0
* @Author zzr
* @nameGrassrootsCongressPageForm
* @Date 2024/11/14 19:29
* @注释
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class GrassrootsCongressPageForm extends PageForm<GrassrootsCongressPageForm> {
private Integer year;
private String unionId;
private String fullName;
}
@@ -0,0 +1,12 @@
package com.budwk.app.zhgh.democratic.grassrootscongress.service;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.democratic.grassrootscongress.models.GrassrootsCongressMaterialsInfo;
public interface GrassrootsCongressMeetingService extends BaseService<GrassrootsCongressMaterialsInfo> {
Pagination pageData(PageForm pageForm,Integer year);
Pagination pageData(PageForm pageForm,Integer year,String unionId);
}
@@ -0,0 +1,15 @@
package com.budwk.app.zhgh.democratic.grassrootscongress.service;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.democratic.grassrootscongress.models.GrassrootsCongressMeetingInfo;
import com.budwk.app.zhgh.democratic.grassrootscongress.param.GrassrootsCongressPageForm;
public interface GrassrootsCongressService extends BaseService<GrassrootsCongressMeetingInfo> {
Pagination pageData(GrassrootsCongressPageForm pageForm, Integer year);
Pagination approvalPageData(PageForm pageForm, Integer year,String unionId);
}
@@ -0,0 +1,112 @@
package com.budwk.app.zhgh.democratic.grassrootscongress.service.impl;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.democratic.grassrootscongress.models.GrassrootsCongressMaterialsInfo;
import com.budwk.app.zhgh.democratic.grassrootscongress.service.GrassrootsCongressMeetingService;
import com.budwk.app.zhgh.democratic.grassrootscongress.vo.GrassrootsCongressMaterialPageVo;
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.loader.annotation.IocBean;
/**
* @ClassName GrassrootsCongressMeetingServiceImpl
* @Description TODO
* @Author zhf
* @Date 2024/9/6 9:55
*/
@IocBean(args = {"refer:dao"})
public class GrassrootsCongressMeetingServiceImpl extends BaseServiceImpl<GrassrootsCongressMaterialsInfo> implements GrassrootsCongressMeetingService {
public GrassrootsCongressMeetingServiceImpl(Dao dao) {
super(dao);
}
@Override
public Pagination pageData(PageForm pageForm, Integer year) {
Sql sql = Sqls.create("""
SELECT
info.*,
inst.processInstanceNodeId,
inst.processInstanceNodeCode,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
nd.nodeType AS processInstanceTaskNodeType,
(
SELECT
count( 1 ) > 0
FROM
bpm_process_task
WHERE
prevTaskId = ( SELECT id FROM bpm_process_task WHERE processInstanceId = inst.id AND processTaskNodeCode IN ( 10, 40, 70 ) ORDER BY createdAt DESC LIMIT 1 )
AND taskStatus = 'COMPELTE'
) AS nextTaskIsComplete
FROM
grassroots_congress_materials_info info
LEFT JOIN bpm_process_instance inst ON inst.processInstanceBusinessId = info.id
LEFT JOIN bpm_process_node_define nd ON nd.id = inst.processInstanceNodeId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("YEAR(info.createdDate)", "=", year);
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
cnd.and(Cnd.likeEX("info.materialsName", pageForm.getSearchKeyword()));
}
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
cnd.and("info.userId", "=", SecurityUtil.getUserId());
}
cnd.desc("info.createdAt");
sql.setCondition(cnd);
return listPageVO(pageForm, sql, GrassrootsCongressMaterialPageVo.class);
}
@Override
public Pagination pageData(PageForm pageForm, Integer year, String unionId) {
Cnd cnd = Cnd.NEW();
cnd.and("nd.nodeCode", "=", 20);
cnd.andEX("YEAR(info.createdDate)", "=", year);
cnd.andEX("info.unionId", "=", unionId);
Sql sql = Sqls.create("""
SELECT
info.*,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
task.id processInstanceTaskId,
task.taskStatus processInstanceTaskStatus,
COUNT( nt.id ) OVER ( PARTITION BY task.id ) > 0 AS nextTaskIsComplete
FROM
bpm_process_task task
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN grassroots_congress_materials_info info ON info.id = inst.processInstanceBusinessId
LEFT JOIN bpm_process_task nt ON nt.prevTaskId = task.id AND nt.taskStatus = 'COMPLETE'
$condition
""");
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
cnd.and(Cnd.likeEX("info.materialsName", pageForm.getSearchKeyword()));
}
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname())));
}
if (pageForm.getAudit()) {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.COMPLETE);
} else {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.ACTIVE);
}
cnd.desc("info.createdBy");
sql.setCondition(cnd);
return listPageVO(pageForm, sql, GrassrootsCongressMaterialPageVo.class);
}
}
@@ -0,0 +1,116 @@
package com.budwk.app.zhgh.democratic.grassrootscongress.service.impl;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.democratic.grassrootscongress.models.GrassrootsCongressMeetingInfo;
import com.budwk.app.zhgh.democratic.grassrootscongress.param.GrassrootsCongressPageForm;
import com.budwk.app.zhgh.democratic.grassrootscongress.service.GrassrootsCongressService;
import com.budwk.app.zhgh.democratic.grassrootscongress.vo.GrassrootsCongressPageVo;
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.loader.annotation.IocBean;
/**
* @ClassName GrassrootsCongressServiceImpl
* @Description TODO
* @Author zhf
* @Date 2024/9/5 18:06
*/
@IocBean(args = {"refer:dao"})
public class GrassrootsCongressServiceImpl extends BaseServiceImpl<GrassrootsCongressMeetingInfo> implements GrassrootsCongressService {
public GrassrootsCongressServiceImpl(Dao dao) {
super(dao);
}
@Override
public Pagination pageData(GrassrootsCongressPageForm pageForm, Integer year) {
Sql sql = Sqls.create("""
SELECT
info.*,
inst.processInstanceNodeId,
inst.processInstanceNodeCode,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
nd.nodeType AS processInstanceTaskNodeType,
(
SELECT
count( 1 ) > 0
FROM
bpm_process_task
WHERE
prevTaskId = ( SELECT id FROM bpm_process_task WHERE processInstanceId = inst.id AND processTaskNodeCode IN ( 10, 40 ) ORDER BY createdAt DESC LIMIT 1 )
AND taskStatus = 'COMPELTE'
) AS nextTaskIsComplete
FROM
grassroots_congress_meeting_info info
LEFT JOIN bpm_process_instance inst ON inst.processInstanceBusinessId = info.id
LEFT JOIN bpm_process_node_define nd ON nd.id = inst.processInstanceNodeId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("YEAR(info.createTime)", "=", year);
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
cnd.and(Cnd.likeEX("info.meetingName", pageForm.getSearchKeyword()));
}
if(!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_CHAIRMAN.name(), RoleConstant.SCHOOL_UNION_VICE_CHAIRMAN.name(), RoleConstant.SCHOOL_UNION_WC_AUDIT_ADMIN.name())){
cnd.and("info.createUserId", "=", SecurityUtil.getUserId());
}
cnd.desc("info.createTime");
sql.setCondition(cnd);
return listPageVO(pageForm, sql, GrassrootsCongressPageVo.class);
}
@Override
public Pagination approvalPageData(PageForm pageForm, Integer year, String unionId) {
Cnd cnd = Cnd.NEW();
cnd.and("nd.nodeCode", "=", 20);
cnd.andEX("YEAR(info.createTime)", "=", year);
cnd.andEX("info.unionId", "=", unionId);
Sql sql = generateSql(pageForm, cnd);
sql.setCondition(cnd);
return listPageVO(pageForm, sql, GrassrootsCongressPageVo.class);
}
private Sql generateSql(PageForm pageForm, Cnd cnd) {
Sql sql = Sqls.create("""
SELECT
info.*,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
task.id processInstanceTaskId,
task.taskStatus processInstanceTaskStatus,
COUNT(nt.id) OVER (PARTITION BY task.id) > 0 AS nextTaskIsComplete
FROM
bpm_process_task task
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN grassroots_congress_meeting_info info ON info.id = inst.processInstanceBusinessId
LEFT JOIN bpm_process_task nt ON nt.prevTaskId = task.id AND nt.taskStatus = 'COMPLETE'
$condition
""");
if(!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_CHAIRMAN.name(), RoleConstant.SCHOOL_UNION_VICE_CHAIRMAN.name(), RoleConstant.SCHOOL_UNION_WC_AUDIT_ADMIN.name())){
cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname())));
}
if (pageForm.getAudit()) {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.COMPLETE);
} else {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.ACTIVE);
}
cnd.desc("info.createTime");
return sql;
}
}
@@ -0,0 +1,31 @@
package com.budwk.app.zhgh.democratic.grassrootscongress.vo;
import com.budwk.app.bpm.vo.BpmTaskApprovalVo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* @version 1.0
* @Author zzr
* @nameGrassrootsCongressMaterialPageVo
* @Date 2024/10/23 13:59
* @注释 基层双代会资料
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class GrassrootsCongressMaterialPageVo extends BpmTaskApprovalVo {
private String id;
private String userId;
private String userName;
private String loginName;
private String unionName;
private String sessionId;
private String fullName;
private String materialsType;
private String materialsName;
private String files;
private Date createdDate;
}
@@ -0,0 +1,24 @@
package com.budwk.app.zhgh.democratic.grassrootscongress.vo;
import com.budwk.app.bpm.vo.BpmTaskApprovalRecordVo;
import com.budwk.app.zhgh.democratic.grassrootscongress.models.GrassrootsCongressMaterialsInfo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameGrassrootsCongressMaterialVo
* @Date 2024/10/23 15:28
* @注释
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class GrassrootsCongressMaterialVo extends GrassrootsCongressMaterialsInfo {
@ApiModelProperty("节点审批记录")
private List<BpmTaskApprovalRecordVo> nodeTasks;
}
@@ -0,0 +1,44 @@
package com.budwk.app.zhgh.democratic.grassrootscongress.vo;
import com.budwk.app.bpm.vo.BpmTaskApprovalVo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* @version 1.0
* @Author zzr
* @nameGrassrootsCongressVo
* @Date 2024/10/22 18:21
* @注释
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class GrassrootsCongressPageVo extends BpmTaskApprovalVo {
private String id;
private String meetingName;
private String unitId;
private String unionId;
private Date createTime;
private String sessionId;
private Date meetingTime;
private String meetingTopic;
private String meetingRemark;
private String files;
private String createdBy;
private long createdAt;
private String updatedBy;
private long updatedAt;
private boolean delFlag;
private String meetingType;
private String j;
private String c;
private String unitName;
private String unionName;
private String fullName;
private String createUserId;
private String createUserName;
}
@@ -0,0 +1,25 @@
package com.budwk.app.zhgh.democratic.grassrootscongress.vo;
import com.budwk.app.bpm.vo.BpmTaskApprovalRecordVo;
import com.budwk.app.zhgh.democratic.grassrootscongress.models.GrassrootsCongressMeetingInfo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameGrassrootsCongressVo
* @Date 2024/10/23 15:26
* @注释
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class GrassrootsCongressVo extends GrassrootsCongressMeetingInfo {
@ApiModelProperty("节点审批记录")
private List<BpmTaskApprovalRecordVo> nodeTasks;
}
@@ -0,0 +1,105 @@
package com.budwk.app.zhgh.democratic.proposal.controller.common;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalType;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake;
import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService;
import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation;
import com.budwk.app.zhgh.democratic.teachercongress.prepare.models.Teacher_congress_session;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.List;
@IocBean
@At("/platform/proposal/common")
@Ok("json:full")
public class ProposalCommonController {
@Inject
private Dao dao;
@Inject
private ProposalCommonService proposalCommonService;
@At
@SaCheckPermission("proposal")
@ApiOperation("提案详情")
public Result proposalInfo(@Valid String id) {
return Result.success(proposalCommonService.info(id));
}
@At
@ApiOperation("查询全部的提案类型")
@SaCheckLogin
public Result listProposalType(){
List<ProposalType> list = dao.query(ProposalType.class, Cnd.NEW().asc(ProposalType::getCode));
return Result.success(list);
}
@At
@SaCheckLogin
@ApiOperation("查询全部的教代会")
public Result listSession() {
List<Teacher_congress_session> list = dao.query(Teacher_congress_session.class, Cnd.NEW().desc("startDate"));
return Result.success(list);
}
@At
@SaCheckLogin
@ApiOperation("查询开启的教代会")
public Result listOpenSession() {
List<Teacher_congress_session> list = dao.query(Teacher_congress_session.class, Cnd.where("enable", "=", 1).desc("startDate"));
return Result.success(list);
}
@At
@SaCheckLogin
@ApiOperation("查询当前用户所属的教代会")
public Result listOpenSessionByUser() {
List<Teacher_congress_session> list = dao.query(Teacher_congress_session.class, Cnd.where("enable", "=", 1).desc("startDate"));
return Result.success(list);
}
@At
@SaCheckLogin
@ApiOperation("查询当前教代会的代表团")
public Result listDelegation(@Valid String sessionId) {
List<Teacher_congress_delegation> list = dao.query(Teacher_congress_delegation.class, Cnd.where("sessionId", "=", sessionId).asc("code"));
return Result.success(list);
}
@At
@SaCheckLogin
@ApiOperation("承办单位列表")
public Result listUnderTake() {
List<ProposalUndertake> list = dao.query(ProposalUndertake.class, Cnd.NEW());
return Result.success(list);
}
@At
@SaCheckPermission("proposal")
@ApiOperation("提案配置")
public Result config() {
ProposalConfig config = dao.fetch(ProposalConfig.class, Cnd.NEW());
return Result.success(config);
}
@At
@Ok("void")
@SaCheckPermission("proposal")
public void exportProposalAsDocx(String id, HttpServletResponse response) {
proposalCommonService.exportProposalAsDocx(id, response);
}
}
@@ -0,0 +1,49 @@
package com.budwk.app.zhgh.democratic.proposal.controller.config;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
@IocBean
@At("/platform/proposal/config/all")
@Slf4j
@Ok("json:full")
@Api("提案全局配置")
public class ProposalConfigAllController {
@Inject
private Dao dao;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/config/all/index.html")
@SaCheckPermission("proposal.config.all")
public void index() {
}
@At
@SaCheckPermission("proposal.config.all")
@ApiOperation("查询提案配置")
public Object findOne() {
ProposalConfig config = dao.fetch(ProposalConfig.class);
return Result.success(config);
}
@At
@SaCheckPermission("proposal.config.all")
@ApiOperation("修改提案配置")
public Object update(@Param("config") ProposalConfig proposalConfig) {
dao.updateIgnoreNull(proposalConfig);
return Result.success();
}
}
@@ -0,0 +1,94 @@
package com.budwk.app.zhgh.democratic.proposal.controller.config;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
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.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
@IocBean
@At("/platform/proposal/config/type")
@Slf4j
@Ok("json:full")
@Api("提案类型配置")
public class ProposalConfigTypeController {
@Inject
private Dao dao;
@Inject
private BaseService baseService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/config/type/index.html")
@SaCheckPermission("proposal.config.type")
public void index() {
}
@At
@SaCheckPermission("proposal.config.type")
@ApiModelProperty("分页查询提案类型")
public Result pageData(@Valid PageForm pageForm,String name){
Sql sql = Sqls.create("select * from proposal_type $condition");
Cnd cnd = Cnd.NEW();
cnd.and(Cnd.likeEX("name", name));
sql.setCondition(cnd);
Pagination pagination = baseService.listPageVO(pageForm, sql, ProposalType.class);
return Result.success(pagination);
}
@At
@SaCheckPermission("proposal.config.type")
@ApiModelProperty("新增提案类型")
@SLog(type = "提案类型配置", tag = "新增提案类型", msg = "${type.name}")
public Result insert(ProposalType type){
int count = dao.count(ProposalType.class, Cnd.where("code", "=", type.getCode()));
if(count>0){
return Result.error("编码重复!");
}
dao.insert(type);
return Result.success();
}
@At
@SaCheckPermission("proposal.config.type")
@ApiModelProperty("修改提案类型")
@SLog(type = "提案类型配置", tag = "修改提案类型", msg = "${type.name}")
public Result update(ProposalType type){
int count = dao.count(ProposalType.class, Cnd.where("code", "=", type.getCode()).and("id", "!=", type.getId()));
if (count > 0) {
return Result.error("编码重复!");
}
dao.updateIgnoreNull(type);
return Result.success();
}
@At
@SaCheckPermission("proposal.config.type")
@ApiModelProperty("删除提案类型")
@SLog(type = "提案类型配置", tag = "删除提案类型", msg = "${id}")
public Result delete(@Valid Integer id){
int count = dao.count(ProposalInfo.class, Cnd.where(ProposalInfo::getTypeId, "=", id));
if(count > 0){
return Result.error("该类型有关联的提案,无法删除!");
}
dao.delete(ProposalType.class, id);
return Result.success();
}
}
@@ -0,0 +1,243 @@
package com.budwk.app.zhgh.democratic.proposal.controller.config;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNode;
import cn.hutool.core.lang.tree.TreeUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
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.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.sys.models.Sys_role;
import com.budwk.app.sys.models.Sys_unit;
import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.sys.services.SysRoleService;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake;
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.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.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* 提案承办单位配置
*/
@IocBean
@At("/platform/proposal/config/unit")
@Slf4j
@Ok("json:full")
public class ProposalConfigUnitController {
@Inject
private Dao dao;
@Inject
private BaseService baseService;
@Inject
private SysRoleService sysRoleService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/config/unit/index.html")
@SaCheckPermission("proposal.config.unit")
public void index() {
}
@At
@SaCheckPermission("proposal.config.unit")
public Result tree() {
List<ProposalUndertake> list = dao.query(ProposalUndertake.class, Cnd.NEW().asc(ProposalUndertake::getCode));
List<TreeNode<String>> treeNodes = new ArrayList<>(list.stream().map(undertake -> new TreeNode<>(undertake.getId(), "0", undertake.getName(), 0)).toList());
treeNodes.add(new TreeNode<>("0", "", "提案承办单位", 1000));
List<Tree<String>> build = TreeUtil.build(treeNodes, "");
return Result.success(build);
}
@At
@SaCheckPermission("proposal.config.unit")
public Result pageData(@Valid PageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
t1.*,
u1.username AS branchSchoolLeader,
u2.username AS unitLeader
FROM
proposal_undertake t1
LEFT JOIN sys_user_role sur1 ON sur1.underTakeId = t1.id
AND sur1.roleId = ( SELECT r.id FROM sys_role r WHERE r.CODE = @PROPOSAL_BRANCH_SCHOOL_LEADER )
LEFT JOIN sys_user u1 ON u1.id = sur1.userId
LEFT JOIN sys_user_role sur2 ON sur2.underTakeId = t1.id
AND sur2.roleId = ( SELECT r.id FROM sys_role r WHERE r.CODE = @PROPOSAL_UNIT_LEADER)
LEFT JOIN sys_user u2 ON u2.id = sur2.userId
$condition
""");
sql.setParam("PROPOSAL_BRANCH_SCHOOL_LEADER", RoleConstant.PROPOSAL_BRANCH_SCHOOL_LEADER.name());
sql.setParam("PROPOSAL_UNIT_LEADER", RoleConstant.PROPOSAL_UNIT_LEADER.name());
Cnd cnd = Cnd.NEW();
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
cnd.where().orLike("u1.username", pageForm.getSearchKeyword());
cnd.where().orLike("u1.loginname", pageForm.getSearchKeyword());
cnd.where().orLike("u2.username", pageForm.getSearchKeyword());
cnd.where().orLike("u2.loginname", pageForm.getSearchKeyword());
cnd.where().orLike("t1.name", pageForm.getSearchKeyword());
}
cnd.asc("t1.code");
sql.setCondition(cnd);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
/**
* 同步系统单位数
*
* @return
*/
@At
@SaCheckPermission("proposal.config.unit")
@SLog(tag = "提案", msg = "承办单位同步系统单位")
public Result syncSysUnit() {
Sql sql = Sqls.create("select code from proposal_undertake");
List<Sys_unit> sysUnits = dao.query(Sys_unit.class, Cnd.where(Sys_unit::getUnitcode, "not in", sql).and(Sys_unit::getUnitLevel, "=", 2));
List<ProposalUndertake> proposalUndertakes = sysUnits.stream().map(unit -> {
ProposalUndertake proposalUndertake = new ProposalUndertake();
proposalUndertake.setCode(unit.getUnitcode());
proposalUndertake.setEnable(true);
proposalUndertake.setName(unit.getName());
return proposalUndertake;
}).toList();
dao.insert(proposalUndertakes);
return Result.success();
}
/**
* 设置分管校领导
*
* @param id
* @param userIds
* @return
*/
@At
@SaCheckPermission("proposal.config.unit")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "提案", msg = "设置分管校领导")
public Result updateBranchSchoolLeader(@Valid String id, @Param("userIds") String[] userIds) {
Sys_role sysRole = sysRoleService.getByCode(RoleConstant.PROPOSAL_BRANCH_SCHOOL_LEADER);
//删除原来的用户
dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getRoleId, "=", sysRole.getId())
.and(Sys_user_role::getUnderTakeId, "=", id));
List<Sys_user_role> sysUserRoles = Arrays.stream(userIds).map(userId -> {
Sys_user_role sysUserRole = new Sys_user_role();
sysUserRole.setRoleId(sysRole.getId());
sysUserRole.setUserId(userId);
sysUserRole.setUnderTakeId(id);
return sysUserRole;
}).toList();
dao.insert(sysUserRoles);
return Result.success();
}
/**
* 设置单位负责人
*
* @param id
* @param userIds
* @return
*/
@At
@SaCheckPermission("proposal.config.unit")
@SLog(tag = "提案", msg = "设置承办单位领导")
@Aop(TransAop.READ_COMMITTED)
public Result updateUnitLeader(@Valid String id, @Param("userIds") String[] userIds) {
Sys_role sysRole = sysRoleService.getByCode(RoleConstant.PROPOSAL_UNIT_LEADER);
//删除原来的用户
dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getRoleId, "=", sysRole.getId())
.and(Sys_user_role::getUnderTakeId, "=", id));
List<Sys_user_role> sysUserRoles = Arrays.stream(userIds).map(userId -> {
Sys_user_role sysUserRole = new Sys_user_role();
sysUserRole.setRoleId(sysRole.getId());
sysUserRole.setUserId(userId);
sysUserRole.setUnderTakeId(id);
return sysUserRole;
}).toList();
dao.insert(sysUserRoles);
return Result.success();
}
/**
* 分管领导数据
*
* @param id
* @return
*/
@At
@SaCheckPermission("proposal.config.unit")
public Result branchSchoolLeaderTransferData(@Valid String id) {
//已设置的领导
Sys_role sysRole = sysRoleService.getByCode(RoleConstant.PROPOSAL_BRANCH_SCHOOL_LEADER);
List<Sys_user_role> sysUserRoles = dao.query(Sys_user_role.class, Cnd.where(Sys_user_role::getRoleId, "=", sysRole.getId()).and(Sys_user_role::getUnderTakeId, "=", id));
List<String> selectUserIds = sysUserRoles.stream().map(Sys_user_role::getUserId).toList();
//查询全部的校领导
Sql sql = Sqls.create("select id,username,loginname,unitname,concat(username,'(',loginname,')') label from vw_user where unitId in (@unitId)");
ProposalConfig proposalConfig = dao.fetch(ProposalConfig.class, Cnd.NEW());
if(ObjectUtil.isNull(proposalConfig)){
return Result.error("提案全局配置未配置,请在提案管理-基础配置-提案配置页面进行配置。");
}
if(ObjectUtil.isEmpty(proposalConfig.getSchoolLeaderUnitIds())){
return Result.error("校领导单位未配置,请在提案管理-基础配置-提案配置页面进行配置。");
}
sql.setParam("unitId", proposalConfig.getSchoolLeaderUnitIds());
List<NutMap> allUsers = baseService.listMap(sql);
return Result.success(Map.of("allUsers", allUsers, "selectUserIds", selectUserIds));
}
/**
* 单位成员数据
*
* @param id
* @return
*/
@At
@SaCheckPermission("proposal.config.unit")
public Result unitUsersTransferData(@Valid String id) {
//已设置的单位领导
Sys_role sysRole = sysRoleService.getByCode(RoleConstant.PROPOSAL_UNIT_LEADER);
List<Sys_user_role> sysUserRoles = dao.query(Sys_user_role.class, Cnd.where(Sys_user_role::getRoleId, "=", sysRole.getId()).and(Sys_user_role::getUnderTakeId, "=", id));
List<String> selectUserIds = sysUserRoles.stream().map(Sys_user_role::getUserId).toList();
//查询该单位下全部的用户
ProposalUndertake proposalUndertake = dao.fetch(ProposalUndertake.class, id);
Sql sql = Sqls.create("select id,username,loginname,unitname,concat(username,'(',loginname,')') label from vw_user $condition");
Cnd cnd = Cnd.NEW();
cnd.and("unitCode","=",proposalUndertake.getCode());
cnd.orEX("id","in",selectUserIds);
sql.setCondition(cnd);
// sql.setParam("unitCode", proposalUndertake.getCode());
// sql.setParam("selectUserIds", selectUserIds);
List<NutMap> allUsers = baseService.listMap(sql);
return Result.success(Map.of("allUsers", allUsers, "selectUserIds", selectUserIds));
}
}
@@ -0,0 +1,64 @@
package com.budwk.app.zhgh.democratic.proposal.controller.dashboard;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.democratic.proposal.service.TeacherCongressDashBoardService;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
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.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
import java.util.List;
@IocBean
@At("/platform/teacherCongress/dashboard")
@Slf4j
@Ok("json:full")
@Api("教代会数据看板")
public class TeacherCongressDashBoardController {
@Inject
private TeacherCongressDashBoardService teacherCongressDashBoardService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/teachercongress/dashboard/index.html")
@SaCheckPermission("tc.dashboard")
public void index() {
}
//查询各代表团人数根据届次
@At
@SaCheckPermission("tc.dashboard")
public Result listDelegationCount(@Valid String sessionId) {
Sql sql = Sqls.create("""
SELECT
tcd.id,
tcd.name,
COALESCE(tcdd.delegate_count, 0) AS delegateCount
FROM
teacher_congress_delegation tcd
LEFT JOIN (
SELECT
delegationId,
COUNT(*) AS delegate_count
FROM
teacher_congress_delegate
WHERE sessionId = @sessionId
GROUP BY
delegationId
) tcdd ON tcd.id = tcdd.delegationId
WHERE
tcd.sessionId = @sessionId
ORDER BY tcd.code
""");
sql.setParam("sessionId", sessionId);
List<NutMap> list = teacherCongressDashBoardService.listMap(sql);
return Result.success(list);
}
}
@@ -0,0 +1,94 @@
package com.budwk.app.zhgh.democratic.proposal.controller.export;
import cn.dev33.satoken.annotation.SaCheckPermission;
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.zhgh.democratic.proposal.controller.vo.ProposalInfoPageVO;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalQueryComprehensiveParam;
import com.budwk.app.zhgh.democratic.proposal.service.ProposalExportService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Cnd;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
/**
* @version 1.0
* @Author zzr
* @nameProposalExportComprehensiveController
* @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;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/export/comprehensive/index.html")
@SaCheckPermission("proposal.export.comprehensive")
public void index() {}
@At
@SaCheckPermission("proposal.query.comprehensive")
@ApiOperation(value = "分页列表")
public Result pageData(@Valid @Param("pageForm") ProposalQueryComprehensiveParam pageForm) {
Sql sql = proposalExportService.exportComprehensiveSql(pageForm);
Cnd cnd = Cnd.NEW();
ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm);
cnd.groupBy("info.id");
sql.setCondition(cnd);
Pagination pagination = baseService.listPageVO(pageForm, sql, ProposalInfoPageVO.class);
return Result.success(pagination);
}
@At
@Ok("void")
@ApiOperation("导出提案汇总表excel")
@SaCheckPermission("proposal.query.comprehensive")
public void exportProposalSummaryAsExcel(@Valid @Param("pageForm") ProposalQueryComprehensiveParam pageForm, HttpServletResponse response){
proposalExportService.exportProposalSummaryAsExcel(pageForm, response);
}
@At
@Ok("void")
@ApiOperation("导出提案立案汇总表excel")
@SaCheckPermission("proposal.query.comprehensive")
public void exportProposalRegisterSummaryAsExcel(@Valid @Param("pageForm") ProposalQueryComprehensiveParam pageForm, HttpServletResponse response){
proposalExportService.exportProposalRegisterSummaryAsExcel(pageForm, response);
}
@At
@Ok("void")
@ApiOperation("导出全部提案ZIP")
@SaCheckPermission("proposal.query.comprehensive")
public void exportAllProposalAsZip(@Valid @Param("pageForm") ProposalQueryComprehensiveParam pageForm, HttpServletResponse response){
proposalExportService.exportProposalStatisticsAsZip(pageForm, response);
}
@At
@Ok("void")
@ApiOperation("导出全部提案反馈表ZIP")
@SaCheckPermission("proposal.query.comprehensive")
public void exportAllProposalFeedBackAsZip(@Valid @Param("pageForm") ProposalQueryComprehensiveParam pageForm, HttpServletResponse response){
proposalExportService.exportFeedBackAsZip(pageForm, response);
}
}
@@ -0,0 +1,33 @@
package com.budwk.app.zhgh.democratic.proposal.controller.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
@ApiModel("提案承办单位答复转办参数")
public class ProposalUnderTakeReplyTransferParam {
@ApiModelProperty("提案id")
@NotBlank(message = "提案id不能为空")
private String proposalId;
@ApiModelProperty("承办单位id")
@NotBlank(message = "承办单位id不能为空")
private String underTakeId;
@ApiModelProperty("流程实例id")
@NotBlank(message = "流程实例id不能为空")
private String processInstanceId;
@ApiModelProperty("流程实例任务id")
@NotBlank(message = "流程实例任务id不能为空")
private String processInstanceTaskId;
@ApiModelProperty("转办用户工号")
@NotBlank(message = "转办用户工号不能为空")
private String transferUserLoginName;
}
@@ -0,0 +1,154 @@
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.sys.models.Sys_dict;
import com.budwk.app.sys.services.SysDictService;
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.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.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
@IocBean
@At("/platform/proposal/query/chart")
@Slf4j
@Ok("json:full")
@Api(tags = "提案类型统计")
public class ProposalQueryChartController {
@Inject
private SysDictService sysDictService;
@Inject
private Dao dao;
@Inject
private ProposalCommonService proposalCommonService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/query/chart/index.html")
@SaCheckPermission("proposal.query.chart")
public void index() {
}
@At
@ApiOperation("提案类型统计")
@SaCheckPermission("proposal.query.chart")
public Result typeData(String sessionId) {
Sql sql = Sqls.create("""
SELECT
concat(type.`name`,'(',type.code,')') AS typeName,
count( info.id ) AS count
FROM
proposal_type type
LEFT JOIN proposal_info info ON info.typeId = type.id AND info.sessionId = @sessionId
GROUP BY
type.id
ORDER BY
type.code
""");
sql.setParam("sessionId", sessionId);
List<NutMap> list = sysDictService.listMap(sql);
return Result.success(list);
}
@At
@ApiOperation("提案立案统计")
@SaCheckPermission("proposal.query.chart")
public Result resultData(String sessionId) {
Sys_dict typeDict = sysDictService.fetch(Cnd.where(Sys_dict::getCode, "=", "PROPOSAL_CASE_FILING_RESULT"));
Sql sql = Sqls.create("""
SELECT
d.`name`,
count( info.id ) AS count
FROM
sys_dict d
LEFT JOIN proposal_info info ON info.caseFilingResult = d.`code`
AND info.sessionId = @sessionId
WHERE
d.parentId = @parentId
and d.disabled = 0
GROUP BY
d.id
ORDER BY
d.location
""");
sql.setParam("sessionId", sessionId);
sql.setParam("parentId", typeDict.getId());
List<NutMap> list = sysDictService.listMap(sql);
return Result.success(list);
}
@At
@ApiOperation("提案满意度统计")
@SaCheckPermission("proposal.query.chart")
public Result feedBackScoreData(String sessionId) {
Sql sql = Sqls.create("""
WITH LatestTask AS ( SELECT processInstanceId, MAX( endOn ) AS maxEndOn FROM bpm_process_task WHERE processTaskNodeCode = 100 AND taskStatus = 'COMPLETE' GROUP BY processInstanceId )\s
SELECT
JSON_UNQUOTE(JSON_EXTRACT( feedBackScoreTask.extVariable, '$.feedBackScore' )) AS feedBackScore
FROM
bpm_process_instance inst
INNER JOIN proposal_info info ON info.id = inst.processInstanceBusinessId
LEFT JOIN LatestTask lt ON lt.processInstanceId = inst.id
LEFT JOIN bpm_process_task feedBackScoreTask ON feedBackScoreTask.processInstanceId = inst.id
AND feedBackScoreTask.processTaskNodeCode = 100
AND feedBackScoreTask.taskStatus = 'COMPLETE'
AND feedBackScoreTask.endOn = lt.maxEndOn
""");
List<NutMap> list = proposalCommonService.listMap(sql);
List<Sys_dict> dicts = sysDictService.getSubListByCode("PROPOSAL_FEEDBACK_UNIT");
List<NutMap> result = dicts.stream().map(v -> {
long count = list.stream().filter(v1 -> v1.getString("feedBackScore","").equals(v.getCode())).count();
return NutMap.NEW().addv("name", v.getName()).addv("count", count);
}).toList();
return Result.success(result);
}
@At
@ApiOperation("提案状态统计")
@SaCheckPermission("proposal.query.chart")
public Result stateData(String sessionId) {
Sql sql = Sqls.create("""
SELECT
nd.nodeName as name,
(
SELECT
count( DISTINCT(task.processInstanceId) )
FROM
bpm_process_task task
LEFT JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
LEFT JOIN proposal_info info ON info.id = inst.processInstanceBusinessId
WHERE
task.processTaskNodeId = nd.id AND task.taskStatus in ('ACTIVE','AUTO_COMPLETE') AND
task.delFlag = 0 AND info.sessionId = @sessionId
) AS count
FROM
bpm_process_node_define nd
LEFT JOIN bpm_process_define d ON d.id = nd.processDefineId
WHERE
d.`code` = 'PROPOSAL'
GROUP BY
nd.id
ORDER BY
nd.nodeCode
""");
sql.setParam("sessionId", sessionId);
List<NutMap> list = proposalCommonService.listMap(sql);
return Result.success(list);
}
}
@@ -0,0 +1,135 @@
package com.budwk.app.zhgh.democratic.proposal.controller.query;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.ArrayUtil;
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.zhgh.democratic.proposal.param.ProposalQueryComprehensiveParam;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
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.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.ArrayList;
import java.util.List;
@IocBean
@At("/platform/proposal/query/collectProgress")
@Slf4j
@Ok("json:full")
@Api(tags = "征集进度查询")
public class ProposalQueryCollectProgressController {
static List<NutMap> states = new ArrayList<>() {{
add(NutMap.NEW().addv("code", 10).addv("id", 10).addv("name", "撰写提案"));
add(NutMap.NEW().addv("code", 20).addv("id", 20).addv("name", "附议提案"));
add(NutMap.NEW().addv("code", 30).addv("id", 30).addv("name", "待团长审核"));
add(NutMap.NEW().addv("code", 40).addv("id", 40).addv("name", "团长审核退回"));
add(NutMap.NEW().addv("code", 50).addv("id", 50).addv("name", "团长审核通过"));
}};
@Inject
private BaseService baseService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/query/collectProgress/index.html")
@SaCheckPermission("proposal.query.collectProgress")
public void index() {
}
@At
@SaCheckPermission("proposal.query.collectProgress")
@ApiOperation(value = "分页列表")
public Result pageData(@Valid @Param("pageForm") ProposalQueryComprehensiveParam pageForm) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.name,
info.code,
info.createUserName,
type.NAME AS typeName,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName,
inst.processInstanceNodeName,
count( secondedTask.id ) seconderSum,
sum( CASE WHEN secondedTask.taskStatus = 'ACTIVE' THEN 1 ELSE 0 END ) activeCount,
sum( CASE WHEN secondedTask.taskStatus = 'COMPLETE' THEN 1 ELSE 0 END ) completeCount
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
LEFT JOIN bpm_process_instance inst ON inst.processInstanceBusinessId = info.id
LEFT JOIN bpm_process_task secondedTask ON secondedTask.processInstanceId = inst.id
AND secondedTask.taskStatus IN ( 'ACTIVE', 'COMPLETE' )
AND secondedTask.processTaskNodeCode = 20
$condition
""");
sql.setParam("sessionId", pageForm.getSessionId());
Cnd cnd = Cnd.NEW();
// Sql subSql = Sqls.create("""
// SELECT
// inst.id
// FROM
// bpm_process_instance inst
// INNER JOIN proposal_info info ON info.id = inst.processInstanceBusinessId
// $condition
// """);
// Cnd subCnd = Cnd.NEW();
// subCnd.and("info.sessionId", "=", pageForm.getSessionId());
// subCnd.and("inst.processInstanceNodeCode", "in", pageForm.getCollectIds());
// if (ArrayUtil.contains(pageForm.getCollectIds(), 50)) {
// subCnd.and("inst.processInstanceNodeCode", ">", pageForm.getCollectIds());
// }
// subSql.setCondition(subCnd);
// cnd.and("inst.id", "in", subSql);
SqlExpressionGroup seg = new SqlExpressionGroup();
if (ArrayUtil.contains(pageForm.getCollectIds(), 10)) {
seg.or("inst.processInstanceNodeCode", "=", 10);
}
if (ArrayUtil.contains(pageForm.getCollectIds(), 20)) {
seg.or("inst.processInstanceNodeCode", "=", 20);
}
if (ArrayUtil.contains(pageForm.getCollectIds(), 30)) {
seg.or("inst.processInstanceNodeCode", "=", 30);
}
if (ArrayUtil.contains(pageForm.getCollectIds(), 40)) {
seg.or("inst.processInstanceNodeCode", "=", 40);
}
if (ArrayUtil.contains(pageForm.getCollectIds(), 50)) {
seg.or("inst.processInstanceNodeCode", ">", 50);
}
if (!seg.isEmpty()) {
cnd.and(seg);
}
// cnd.and("inst.processInstanceNodeCode", "in", List.of(10, 20, 30, 40, 50));
ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm);
cnd.groupBy("info.id");
sql.setCondition(cnd);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@ApiOperation(value = "获取征集状态")
@SaCheckPermission("proposal.query.collectProgress")
public Result collectState() {
return Result.success(states);
}
}
@@ -0,0 +1,105 @@
package com.budwk.app.zhgh.democratic.proposal.controller.query;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
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.zhgh.democratic.proposal.controller.vo.ProposalInfoPageVO;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalQueryComprehensiveParam;
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.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
@IocBean
@At("/platform/proposal/query/comprehensive")
@Slf4j
@Ok("json:full")
@Api(tags = "提案综合查询")
public class ProposalQueryComprehensiveController {
@Inject
private BaseService baseService;
@Inject
private ProposalCommonService proposalCommonService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/query/comprehensive/index.html")
@SaCheckPermission("proposal.query.comprehensive")
public void index() {
}
@At
@SaCheckPermission("proposal.query.comprehensive")
@ApiOperation(value = "分页列表")
public Result pageData(@Valid @Param("pageForm") ProposalQueryComprehensiveParam pageForm) {
Sql sql = Sqls.create("""
SELECT
info.*,
COUNT(p.consolidationIds) > 0 AS isConsolidation,
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
FROM
proposal_info info
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
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
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
$condition
""");
Cnd cnd = Cnd.NEW();
if(StrUtil.isNotBlank(pageForm.getUndertakeUnitId())){
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("JSON_EXTRACT(caseUnitTasks.extVariable, '$.hostUnitId')","=",pageForm.getUndertakeUnitId());
seg.orLike("JSON_UNQUOTE(JSON_EXTRACT(caseUnitTasks.extVariable, '$.helpUnitIds'))",pageForm.getUndertakeUnitId());
cnd.and(seg);
}
ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm);
cnd.groupBy("info.id");
sql.setCondition(cnd);
Pagination pagination = baseService.listPageVO(pageForm,sql, ProposalInfoPageVO.class);
return Result.success(pagination);
}
@At
@Ok("void")
@ApiOperation(value = "导出单个提案word")
public void exportDocx(String id, HttpServletResponse response) {
proposalCommonService.exportProposalAsDocx(id, response);
}
}
@@ -0,0 +1,108 @@
package com.budwk.app.zhgh.democratic.proposal.controller.query;
import cn.dev33.satoken.annotation.SaCheckPermission;
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.sys.models.Sys_dict;
import com.budwk.app.sys.services.SysDictService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Cnd;
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.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
import java.util.stream.Collectors;
@IocBean
@At("/platform/proposal/query/delegation")
@Slf4j
@Ok("json:full")
@Api(tags = "代表团提案统计")
public class ProposalQueryDelegationController {
@Inject
private BaseService baseService;
@Inject
private SysDictService sysDictService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/query/delegation/index.html")
@SaCheckPermission("proposal.query.delegation")
public void index() {
}
@At
@ApiOperation("代表团提案统计")
@SaCheckPermission("proposal.query.delegation")
public Result pageData(String sessionId) {
List<Sys_dict> dictList = sysDictService.getSubListByCode("PROPOSAL_CASE_FILING_RESULT");
Sql sql = Sqls.create("""
SELECT
dbt.id,
dbt.`name` AS dbtName,
(select count(1) from proposal_info info where info.delegationId = dbt.id and info.sessionId = dbt.sessionId ) as TOTAL,
(select count(1) from proposal_info info where info.delegationId = dbt.id and info.sessionId = dbt.sessionId and info.isSubmit = 1 ) as SUBMIT_COUNT,
$resultSql
FROM
teacher_congress_delegation dbt
$condition
""");
String resultStr = dictList.stream().map(v -> {
return "( select count(1) from proposal_info info where info.delegationId = dbt.id and info.sessionId = dbt.sessionId and info.caseFilingResult= '%s' ) as `%s`".formatted(v.getCode(), v.getCode());
}).collect(Collectors.joining(","));
sql.setVar("resultSql", resultStr);
Cnd cnd = Cnd.NEW();
cnd.andEX("dbt.sessionId", "=", sessionId);
if (!AuthUtil.hasRoleOr("SYSADMIN", "SCHOOL_UNION_ADMIN")) {
}
cnd.asc("dbt.`code`");
sql.setCondition(cnd);
return Result.success(baseService.listMap(sql));
}
@At
@ApiOperation("代表团提案列表")
@SaCheckPermission("proposal.query.delegation")
public Result getProposalsByDelegation(ProposalSearchParam pageForm) {
Sql sql = Sqls.create("""
SELECT
info.*,
COUNT(p.consolidationIds) > 0 AS isConsolidation,
type.name AS typeName,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName,
inst.processInstanceNodeId,
inst.processInstanceNodeCode,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus
FROM
proposal_info info
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
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 bpm_process_instance inst ON inst.processInstanceBusinessId = info.id
$condition
""");
Cnd cnd = Cnd.NEW();
ProposalSearchParam.buildSearch(cnd, pageForm);
cnd.groupBy("info.id");
sql.setCondition(cnd);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
}
@@ -0,0 +1,72 @@
package com.budwk.app.zhgh.democratic.proposal.controller.query;
import cn.dev33.satoken.annotation.SaCheckPermission;
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.zhgh.democratic.proposal.param.ProposalQueryComprehensiveParam;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Cnd;
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.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
@IocBean
@At("/platform/proposal/query/history")
@Slf4j
@Ok("json:full")
@Api(tags = "提案管理系统-查询统计-历史提案查询")
public class ProposalQueryHistoryController {
@Inject
private BaseService baseService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/query/history/index.html")
@SaCheckPermission("proposal.query.history")
public void index() {
}
@At
@SaCheckPermission("proposal.query.history")
@ApiOperation(value = "分页列表")
public Result pageData(@Valid @Param("pageForm") ProposalQueryComprehensiveParam pageForm) {
Sql sql = Sqls.create("""
SELECT
info.*,
COUNT(p.consolidationIds) > 0 AS isConsolidation,
type.name AS typeName,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName,
inst.processInstanceNodeId,
inst.processInstanceNodeCode,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus
FROM
proposal_info info
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
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
LEFT JOIN bpm_process_instance inst ON inst.processInstanceBusinessId = info.id
$condition
""");
Cnd cnd = Cnd.NEW();
ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm);
cnd.groupBy("info.id");
sql.setCondition(cnd);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
}
@@ -0,0 +1,139 @@
package com.budwk.app.zhgh.democratic.proposal.controller.query;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.result.Result;
import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum;
import com.budwk.app.bpm.models.BpmProcessTask;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake;
import com.budwk.app.zhgh.democratic.proposal.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.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.*;
import java.util.stream.Collectors;
/**
* 承办单位办理统计
*/
@IocBean
@At("/platform/proposal/query/unitReply")
@Slf4j
@Ok("json:full")
public class ProposalQueryUnitReplyController {
@Inject
private Dao dao;
@Inject
private ProposalCommonService proposalCommonService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/query/underTakeReply/index.html")
@SaCheckPermission("proposal.query.unitReply")
public void index() {
}
@At
@SaCheckPermission("proposal.query.unitReply")
public Result data(String sessionId, String undertakeUnitId) {
Sql sql = Sqls.create("""
SELECT
info.id,
inst.id AS instId
FROM
proposal_info info
INNER JOIN bpm_process_instance inst ON inst.processInstanceBusinessId = info.id
WHERE info.sessionId = @sessionId
""");
sql.setParam("sessionId", sessionId);
List<NutMap> list = proposalCommonService.listMap(sql);
List<String> instIds = list.stream().map(v -> v.getString("instId")).toList();
//查询提案委员会分配的承办单位
List<BpmProcessTask> caseUnitTasks = dao.query(BpmProcessTask.class, Cnd.where(BpmProcessTask::getProcessInstanceId, "in", instIds)
.and(BpmProcessTask::getTaskStatus, "=", BpmProcessTaskStatusEnum.COMPLETE.name())
.and(BpmProcessTask::getProcessTaskNodeCode, "=", 70)
.and(BpmProcessTask::getDelFlag, "=", 0)
);
List<JSONObject> caseUnitTaskExtVariables = caseUnitTasks.stream().map(BpmProcessTask::getExtVariable).toList();
//所有承办单位
Set<String> underTakeIds = new HashSet<>();
if (StrUtil.isNotBlank(undertakeUnitId)) {
underTakeIds.add(undertakeUnitId);
} else {
for (JSONObject caseUnitTaskExtVariable : caseUnitTaskExtVariables) {
String hostUnitId = caseUnitTaskExtVariable.getStr("hostUnitId");
List<String> helpUnitIds = caseUnitTaskExtVariable.getBeanList("helpUnitIds", String.class);
underTakeIds.addAll(helpUnitIds);
underTakeIds.add(hostUnitId);
}
}
List<ProposalUndertake> undertakes = dao.query(ProposalUndertake.class, Cnd.where(ProposalUndertake::getId, "in", underTakeIds));
Map<String, ProposalUndertake> undertakeMap = undertakes.stream().collect(Collectors.toMap(ProposalUndertake::getId, v -> v));
//查询承办单位任务
List<BpmProcessTask> underTakeTasks = dao.query(BpmProcessTask.class, Cnd.where(BpmProcessTask::getProcessInstanceId, "in", instIds)
.and(BpmProcessTask::getProcessTaskNodeCode, "=", 80)
.and(BpmProcessTask::getDelFlag, "=", 0)
);
ProposalConfig proposalConfig = dao.fetch(ProposalConfig.class, Cnd.NEW());
Boolean slaveNeedReply = ObjectUtil.defaultIfNull(proposalConfig.getSlaveUnitLeaderNeedApprove(), false);
List<NutMap> tableData = new ArrayList<>();
for (String underTakeId : underTakeIds) {
NutMap tableRow = NutMap.NEW();
tableRow.put("id", underTakeId);
tableRow.put("name", undertakeMap.get(underTakeId).getName());
//找出承办提案总数
long sum = caseUnitTasks.stream().filter(v -> v.getExtVariable().getStr("hostUnitId").equals(underTakeId) || v.getExtVariable().getBeanList("helpUnitIds", String.class).contains(underTakeId)).map(BpmProcessTask::getProcessInstanceId).collect(Collectors.toSet()).size();
//找出主办提案数量
long hostSum = underTakeTasks.stream().filter(v -> v.getCreateVariable().getStr("underTakeId").equals(underTakeId) && v.getCreateVariable().getBool("isMaster", false)).map(BpmProcessTask::getProcessInstanceId).collect(Collectors.toSet()).size();
//主办已答复的数量
long hostReplySum = 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 hostNoReplySum = hostSum - hostReplySum;
tableRow.put("sum", sum);
tableRow.put("hostSum", hostSum);
tableRow.put("hostReplySum", hostReplySum);
tableRow.put("hostNoReplySum", hostNoReplySum);
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", slaveNeedReply));
}
}
@@ -0,0 +1,97 @@
package com.budwk.app.zhgh.democratic.proposal.controller.query;
import cn.dev33.satoken.annotation.SaCheckPermission;
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.zhgh.democratic.proposal.controller.vo.ProposalInfoPageVO;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalQueryComprehensiveParam;
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.dao.Cnd;
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.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
@IocBean
@At("/platform/proposal/query/yearReport")
@Slf4j
@Ok("json:full")
@Api(tags = "提案年度报告")
public class ProposalQueryYearReportController {
@Inject
private BaseService baseService;
@Inject
private ProposalCommonService proposalCommonService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/query/yearReport/index.html")
@SaCheckPermission("proposal.query.yearReport")
public void index() {
}
@At
@SaCheckPermission("proposal.query.yearReport")
@ApiOperation(value = "分页列表")
public Result pageData(@Valid @Param("pageForm") ProposalQueryComprehensiveParam pageForm) {
Sql sql = Sqls.create("""
SELECT
info.*,
COUNT(p.consolidationIds) > 0 AS isConsolidation,
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
FROM
proposal_info info
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
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
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
$condition
""");
Cnd cnd = Cnd.NEW();
ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm);
cnd.groupBy("info.id");
sql.setCondition(cnd);
Pagination pagination = baseService.listPageVO(pageForm,sql, ProposalInfoPageVO.class);
return Result.success(pagination);
}
@At
@Ok("void")
@ApiOperation(value = "导出年度报告")
public void exportYearReport(@Valid String sessionId, HttpServletResponse response) {
proposalCommonService.exportYearReport(sessionId, response);
}
}
@@ -0,0 +1,86 @@
package com.budwk.app.zhgh.democratic.proposal.controller.senior;
import cn.dev33.satoken.annotation.SaCheckPermission;
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.zhgh.democratic.proposal.controller.vo.ProposalInfoPageVO;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalQueryComprehensiveParam;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
@IocBean
@At("/platform/senior/basic")
@Ok("json:full")
@Api(tags = "提案-高级管理-提案内容修改")
public class ProposalSeniorBasicController {
@Inject
private Dao dao;
@Inject
private BaseService baseService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/senior/basic/index.html")
@SaCheckPermission("proposal.senior.basic")
public void index() {
}
@At
@SaCheckPermission("proposal.senior.basic")
@ApiOperation(value = "分页列表")
public Result pageData(@Valid ProposalQueryComprehensiveParam pageForm) {
Sql sql = Sqls.create("""
SELECT
info.*,
COUNT(p.consolidationIds) > 0 AS isConsolidation,
type.name AS typeName,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName,
inst.processInstanceNodeId,
inst.processInstanceNodeCode,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus
FROM
proposal_info info
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
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 bpm_process_instance inst ON inst.processInstanceBusinessId = 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);
return Result.success(pagination);
}
@At
@SaCheckPermission("proposal.senior.basic")
@ApiOperation(value = "提案内容修改")
@Aop(TransAop.READ_COMMITTED)
public Result update(@Valid ProposalInfo proposalInfo) {
dao.update(proposalInfo,"^name|typeId|brief|measures|excerpt$$");
return Result.success();
}
}
@@ -0,0 +1,95 @@
package com.budwk.app.zhgh.democratic.proposal.controller.senior;
import cn.dev33.satoken.annotation.SaCheckPermission;
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.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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
@IocBean
@At("/platform/senior/delete")
@Ok("json:full")
@Api(tags = "提案-高级管理-删除")
public class ProposalSeniorDeleteController {
@Inject
private Dao dao;
@Inject
private BaseService baseService;
@Inject
private BpmService bpmService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/senior/delete/index.html")
@SaCheckPermission("proposal.senior.delete")
public void index() {
}
@At
@SaCheckPermission("proposal.senior.delete")
@ApiOperation(value = "分页列表")
public Result pageData(@Valid ProposalQueryComprehensiveParam pageForm) {
Sql sql = Sqls.create("""
SELECT
info.*,
COUNT(p.consolidationIds) > 0 AS isConsolidation,
type.name AS typeName,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName,
inst.processInstanceNodeId,
inst.processInstanceNodeCode,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus
FROM
proposal_info info
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
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 bpm_process_instance inst ON inst.processInstanceBusinessId = 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);
return Result.success(pagination);
}
@At
@SaCheckPermission("proposal.senior.delete")
@ApiOperation(value = "删除提案")
@SLog(tag = "提案管理系统-高级管理-万能删除提案", msg = "删除提案")
@Aop(TransAop.READ_COMMITTED)
public Result delete(String id) {
dao.clear(ProposalReplyUnit.class, Cnd.where(ProposalReplyUnit::getProposalId, "=", id));
dao.clear(ProposalSeconded.class, Cnd.where(ProposalReplyUnit::getProposalId, "=", id));
dao.clear(ProposalInfo.class, Cnd.where(ProposalInfo::getId, "=", id));
bpmService.deleteInstance(id);
return Result.success();
}
}
@@ -0,0 +1,87 @@
package com.budwk.app.zhgh.democratic.proposal.controller.senior;
import cn.dev33.satoken.annotation.SaCheckPermission;
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.zhgh.democratic.proposal.controller.vo.ProposalInfoPageVO;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalQueryComprehensiveParam;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalSeniorUpdateTypeParam;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
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.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
@IocBean
@At("/platform/senior/type")
@Ok("json:full")
@Api(tags = "提案-高级管理-修改类型")
public class ProposalSeniorTypeController {
@Inject
private Dao dao;
@Inject
private BaseService baseService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/senior/type/index.html")
@SaCheckPermission("proposal.senior.type")
public void index() {
}
@At
@SaCheckPermission("proposal.senior.type")
@ApiOperation(value = "分页列表")
public Result pageData(@Valid ProposalQueryComprehensiveParam pageForm) {
Sql sql = Sqls.create("""
SELECT
info.*,
COUNT(p.consolidationIds) > 0 AS isConsolidation,
type.name AS typeName,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName,
inst.processInstanceNodeId,
inst.processInstanceNodeCode,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus
FROM
proposal_info info
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
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 bpm_process_instance inst ON inst.processInstanceBusinessId = 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);
return Result.success(pagination);
}
@At
@SaCheckPermission("proposal.senior.type")
@ApiOperation(value = "修改提案类型")
@Aop(TransAop.READ_COMMITTED)
public Result update(@Valid ProposalSeniorUpdateTypeParam param) {
dao.update(ProposalInfo.class, Chain.make("typeId", param.getTypeId()),Cnd.where("id", "=", param.getId()));
return Result.success();
}
}
@@ -0,0 +1,181 @@
package com.budwk.app.zhgh.democratic.proposal.controller.transact;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
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.models.BpmProcessTask;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.sys.services.SysMsgService;
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.models.ProposalInfo;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalCommitteeFilingApprovalParam;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam;
import com.budwk.app.zhgh.democratic.proposal.service.ProposalCommitteeFilingService;
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.Chain;
import org.nutz.dao.Cnd;
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.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.List;
import java.util.Map;
@IocBean
@At("/platform/proposal/committeeFiling")
@Slf4j
@Ok("json:full")
@Api(tags = "提案委员会立案审核")
public class ProposalCommitteeFilingController {
@Inject
private BaseService baseService;
@Inject
private BpmService bpmService;
@Inject
private ProposalCommitteeFilingService proposalCommitteeFilingService;
@Inject
private SysMsgService sysMsgService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/transact/committeeFiling/index.html")
@SaCheckPermission("proposal.committeeFiling")
public void index() {
}
@At
@SaCheckPermission("proposal.committeeFiling")
@ApiOperation("分页列表")
public Result pageData(@Valid ProposalSearchParam pageForm, boolean approval) {
Sql sql = Sqls.create("""
SELECT
info.*,
type.name AS typeName,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
task.id processInstanceTaskId,
task.taskStatus processInstanceTaskStatus,
COUNT(p.consolidationIds) > 0 AS isConsolidation,
EXISTS (
SELECT 1
FROM bpm_process_task next_task
WHERE next_task.prevTaskId = task.id
AND next_task.taskStatus = 'COMPLETE'
) AS nextTaskIsComplete
FROM
bpm_process_task task
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN proposal_info info ON info.id = inst.processInstanceBusinessId
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
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
$condition
""");
Cnd cnd = Cnd.NEW();
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname())));
}
cnd.and("nd.nodeCode", "=", 60);
if (approval) {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.COMPLETE);
} else {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.ACTIVE);
}
ProposalSearchParam.buildSearch(cnd, pageForm);
cnd.and(new Static("""
NOT EXISTS(
SELECT 1
FROM bpm_process_task t2
WHERE t2.processInstanceId = task.processInstanceId
AND t2.processTaskNodeCode = task.processTaskNodeCode
AND t2.createdOn > task.createdOn
)
"""));
cnd.groupBy("info.id");
cnd.groupBy("task.id");
sql.setCondition(cnd);
Pagination<ProposalInfoPageVO> pagination = baseService.listPageVO(pageForm, sql, ProposalInfoPageVO.class);
return Result.success(pagination);
}
@At
@SaCheckPermission("proposal.committeeFiling")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "提案委员会立案审核", msg = "立案")
@ApiOperation("立案")
public Result approval(@Valid @Param("approval") ProposalCommitteeFilingApprovalParam approvalParam) {
proposalCommitteeFilingService.approval(approvalParam);
return Result.success();
}
@At
@SaCheckPermission("proposal.committeeFiling")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "提案委员会立案审核", msg = "退回提案人")
@ApiOperation("退回提案人")
public Result approvalBack(@Valid BpmTaskApprovalParam approvalParam) {
approvalParam.getBpmTaskApprovalTypeEnum();
Map<String, Object> variables = BeanUtil.beanToMap(approvalParam);
variables.put("caseFilingResult","退回提案人");
bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), approvalParam.getBpmTaskApprovalTypeEnum(), variables, null);
//退回要清空附议人
List<BpmProcessTask> secondedTasks = proposalCommitteeFilingService.dao().query(BpmProcessTask.class, Cnd.where(BpmProcessTask::getProcessInstanceId, "=", approvalParam.getProcessInstanceId()).and(BpmProcessTask::getProcessTaskNodeCode, "=", 20));
for (BpmProcessTask task : secondedTasks) {
proposalCommitteeFilingService.dao().update(BpmProcessTask.class, Chain.make("delFlag", true), Cnd.where(BpmProcessTask::getId, "=", task.getId()));
}
ProposalInfo proposalInfo = baseService.dao().fetch(ProposalInfo.class, approvalParam.getProcessInstanceBusinessId());
String template = "{}代表您好!您的提案《{}》提案委员会已经审核,审核结果为退回提案人重新修改,您可重新编辑提案邀请附议人再次提交,请您登录系统查看详情。";
String content = StrUtil.format(template, proposalInfo.getCreateUserName(), proposalInfo.getName());
sysMsgService.sendMsg(proposalInfo.getCreateUserLoginName(), "提案委员会立案审核", content, SecurityUtil.getUserId());
return Result.success();
}
@At
@SaCheckPermission("proposal.committeeFiling")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "提案委员会立案审核", msg = "委员会立案撤回")
public Result revoke(@Valid String taskId) {
proposalCommitteeFilingService.revoke(taskId);
return Result.success();
}
@At
@ApiOperation("查询承办单位")
@SaCheckPermission("proposal.committeeFiling")
public Result listUnderTake() {
List<ProposalUndertake> list = baseService.dao().query(ProposalUndertake.class, Cnd.NEW().asc(ProposalUndertake::getCode));
return Result.success(list);
}
}
@@ -0,0 +1,186 @@
package com.budwk.app.zhgh.democratic.proposal.controller.transact;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject;
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.models.BpmProcessTask;
import com.budwk.app.bpm.service.BpmService;
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.models.ProposalUndertake;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalCommitteeFilingUnitApprovalParam;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam;
import com.budwk.app.zhgh.democratic.proposal.service.ProposalCommitteeFilingUnitService;
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.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
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;
@IocBean
@At("/platform/proposal/committeeFilingUnit")
@Slf4j
@Ok("json:full")
@Api(tags = "提案-办理-确认承办单位")
public class ProposalCommitteeFilingUnitController {
@Inject
private BaseService baseService;
@Inject
private BpmService bpmService;
@Inject
private ProposalCommitteeFilingUnitService proposalCommitteeFilingUnitService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/transact/committeeFilingUnit/index.html")
@SaCheckPermission("proposal.committeeFilingUnit")
public void index() {
}
@At
@SaCheckPermission("proposal.committeeFilingUnit")
@ApiOperation("分页列表")
public Result pageData(@Valid ProposalSearchParam pageForm, boolean approval) {
Sql sql = Sqls.create("""
SELECT
info.*,
type.name AS typeName,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
task.id processInstanceTaskId,
task.taskStatus processInstanceTaskStatus,
COUNT(p.consolidationIds) > 0 AS isConsolidation,
EXISTS (
SELECT 1
FROM bpm_process_task next_task
WHERE next_task.prevTaskId = task.id
AND next_task.taskStatus = 'COMPLETE'
) AS nextTaskIsComplete
FROM
bpm_process_task task
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN proposal_info info ON info.id = inst.processInstanceBusinessId
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
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 bpm_process_task nt ON nt.prevTaskId = task.id AND nt.taskStatus = 'COMPLETE'
$condition
""");
Cnd cnd = Cnd.NEW();
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname())));
}
cnd.and("nd.nodeCode", "=", 70);
if (approval) {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.COMPLETE);
} else {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.ACTIVE);
}
ProposalSearchParam.buildSearch(cnd, pageForm);
cnd.and(new Static("""
NOT EXISTS(
SELECT 1
FROM bpm_process_task t2
WHERE t2.processInstanceId = task.processInstanceId
AND t2.processTaskNodeCode = task.processTaskNodeCode
AND t2.createdOn > task.createdOn
)
"""));
cnd.groupBy("info.id");
cnd.groupBy("task.id");
sql.setCondition(cnd);
Pagination pagination = baseService.listPageVO(pageForm, sql, ProposalInfoPageVO.class);
return Result.success(pagination);
}
@At
@SaCheckPermission("proposal.committeeFilingUnit")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "委员会确认承办单位", msg = "委员会确认承办单位")
@ApiOperation("委员会确认承办单位")
public Result approval(@Valid @Param("approval") ProposalCommitteeFilingUnitApprovalParam approvalParam) {
proposalCommitteeFilingUnitService.approval(approvalParam);
return Result.success();
}
@At
@SaCheckPermission("proposal.committeeFilingUnit")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "委员会确认承办单位", msg = "委员会确认承办单位撤回")
public Result revoke(@Valid String taskId) {
proposalCommitteeFilingUnitService.revoke(taskId);
return Result.success();
}
@At
@SaCheckPermission("proposal.committeeFilingUnit")
@ApiOperation("查询立案的结果及承办单位")
public Result committeeFiling(@Valid String processInstanceId, @Valid String processInstanceTaskId) {
JSONObject newJson = new JSONObject();
BpmProcessTask caseUnitTask = proposalCommitteeFilingUnitService.dao().fetch(BpmProcessTask.class,
Cnd.where(BpmProcessTask::getId, "=", processInstanceTaskId)
.and(BpmProcessTask::getProcessInstanceId, "=", processInstanceId)
.and(BpmProcessTask::getProcessTaskNodeCode, "=", 70)
.and(BpmProcessTask::getDelFlag, "=", 0)
);
if (ObjectUtil.isNotNull(caseUnitTask) && ObjectUtil.isNotEmpty(caseUnitTask.getExtVariable())) {
JSONObject jsonObject = caseUnitTask.getExtVariable();
newJson.set("caseFilingResult", jsonObject.get("caseFilingResult"));
newJson.set("hostUnitId", jsonObject.get("hostUnitId"));
newJson.set("helpUnitIds", jsonObject.getBeanList("helpUnitIds", String.class));
newJson.set("approvalOpinion", jsonObject.get("approvalOpinion"));
newJson.set("consolidationIds", jsonObject.getBeanList("consolidationIds", String.class));
return Result.success(newJson);
}
BpmProcessTask caseTask = proposalCommitteeFilingUnitService.dao().fetch(BpmProcessTask.class,
Cnd.where(BpmProcessTask::getProcessInstanceId, "=", processInstanceId)
.and(BpmProcessTask::getDelFlag, "=", 0)
.and(BpmProcessTask::getProcessTaskNodeCode, "=", 60)
.desc(BpmProcessTask::getCreatedOn)
);
JSONObject jsonObject = caseTask.getExtVariable();
newJson.set("caseFilingResult", jsonObject.get("caseFilingResult"));
newJson.set("hostUnitId", jsonObject.get("hostUnitId"));
newJson.set("helpUnitIds", jsonObject.getBeanList("helpUnitIds", String.class));
newJson.set("approvalOpinion", jsonObject.get("approvalOpinion"));
newJson.set("consolidationIds", jsonObject.getBeanList("consolidationIds", String.class));
return Result.success(newJson);
}
@At
@SaCheckPermission("proposal.committeeFilingUnit")
@ApiOperation("查询承办单位")
public Result listUnderTake() {
List<ProposalUndertake> list = baseService.dao().query(ProposalUndertake.class, Cnd.NEW().asc(ProposalUndertake::getCode));
return Result.success(list);
}
}
@@ -0,0 +1,140 @@
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.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.ProposalDelegationService;
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.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
/**
* 团长审核
*/
@IocBean
@At("/platform/proposal/delegation")
@Slf4j
@Ok("json:full")
@Api(tags = "提案-办理-团长审核")
public class ProposalDelegationController {
@Inject
private BaseService baseService;
@Inject
private ProposalCommonService proposalCommonService;
@Inject
private ProposalDelegationService proposalDelegationService;
@Inject
private BpmService bpmService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/transact/delegation/index.html")
@SaCheckPermission("proposal.delegation")
public void index() {
}
@At
@SaCheckPermission("proposal.delegation")
@ApiOperation("分页列表")
public Result pageData(@Valid ProposalSearchParam pageForm,boolean approval) {
Sql sql = Sqls.create("""
SELECT
info.*,
type.name AS typeName,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
task.id processInstanceTaskId,
task.taskStatus processInstanceTaskStatus,
EXISTS (
SELECT 1
FROM bpm_process_task next_task
WHERE next_task.prevTaskId = task.id
AND next_task.taskStatus = 'COMPLETE'
) AS nextTaskIsComplete
FROM
bpm_process_task task
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN proposal_info info ON info.id = inst.processInstanceBusinessId
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
$condition
""");
Cnd cnd = Cnd.NEW();
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname())));
}
cnd.and("nd.nodeCode", "=", 30);
if (approval) {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.COMPLETE);
cnd.groupBy("info.id");
} else {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.ACTIVE);
}
ProposalSearchParam.buildSearch(cnd, pageForm);
cnd.and(new Static("""
NOT EXISTS(
SELECT 1
FROM bpm_process_task t2
WHERE t2.processInstanceId = task.processInstanceId
AND t2.processTaskNodeCode = task.processTaskNodeCode
AND t2.createdOn > task.createdOn
)
"""));
sql.setCondition(cnd);
Pagination pagination = baseService.listPageVO(pageForm, sql, ProposalInfoPageVO.class);
return Result.success(pagination);
}
@At
@SaCheckPermission("proposal.delegation")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "提案", msg = "团长审核")
@ApiOperation("审核")
public Result approval(@Valid @Param("approval") BpmTaskApprovalParam approvalParam) {
proposalDelegationService.approval(approvalParam);
return Result.success();
}
@At
@SaCheckPermission("proposal.delegation")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "提案", msg = "团长审核撤回")
@ApiOperation("撤回")
public Result revoke(@Valid String taskId) {
proposalDelegationService.revokeTask(taskId);
// bpmService.revokeTask(taskId);
return Result.success();
}
}
@@ -0,0 +1,123 @@
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.service.BpmService;
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.ProposalFeedbackEvaluationParam;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam;
import com.budwk.app.zhgh.democratic.proposal.service.ProposalFeedbackEvaluationService;
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.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
@IocBean
@At("/platform/proposal/feedbackEvaluation")
@Slf4j
@Ok("json:full")
@Api(tags = "提案-办理-反馈评分")
public class ProposalFeedbackEvaluationController {
@Inject
private BaseService baseService;
@Inject
private BpmService bpmService;
@Inject
private ProposalFeedbackEvaluationService proposalFeedbackEvaluationService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/transact/feedbackEvaluation/index.html")
@SaCheckPermission("proposal.feedbackEvaluation")
public void index() {
}
@At
@SaCheckPermission("proposal.feedbackEvaluation")
@ApiOperation("分页列表")
public Result pageData(@Valid ProposalSearchParam pageForm, boolean approval) {
Sql sql = Sqls.create("""
SELECT
info.*,
type.name AS typeName,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
task.id processInstanceTaskId,
task.taskStatus processInstanceTaskStatus,
COUNT(p.consolidationIds) > 0 AS isConsolidation,
COUNT( nt.id ) OVER ( PARTITION BY task.id ) > 0 AS nextTaskIsComplete
FROM
bpm_process_task task
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN proposal_info info ON info.id = inst.processInstanceBusinessId
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
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 bpm_process_task nt ON nt.prevTaskId = task.id AND nt.taskStatus = 'COMPLETE'
$condition
""");
Cnd cnd = Cnd.NEW();
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname())));
}
cnd.and("nd.nodeCode", "=", 100);
if (approval) {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.COMPLETE);
} else {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.ACTIVE);
}
sql.setCondition(cnd);
ProposalSearchParam.buildSearch(cnd, pageForm);
cnd.groupBy("info.id");
cnd.groupBy("task.id");
Pagination pagination = baseService.listPageVO(pageForm, sql, ProposalInfoPageVO.class);
return Result.success(pagination);
}
@At
@SaCheckPermission("proposal.feedbackEvaluation")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "提案", msg = "反馈评分审核")
@ApiOperation("审核")
public Result approval(@Param("approval") @Valid ProposalFeedbackEvaluationParam param) {
proposalFeedbackEvaluationService.approval(param);
return Result.success();
}
@At
@SaCheckPermission("proposal.feedbackEvaluation")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "提案", msg = "反馈评分撤回")
@ApiOperation("撤回")
public Result revoke(@Valid String taskId) {
bpmService.revokeTask(taskId);
return Result.success();
}
}
@@ -0,0 +1,298 @@
package com.budwk.app.zhgh.democratic.proposal.controller.transact;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HtmlUtil;
import cn.hutool.json.JSONUtil;
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.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.bpm.dto.BpmAssignmentDto;
import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum;
import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum;
import com.budwk.app.bpm.models.BpmProcessInstance;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.sys.services.SysMsgService;
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.controller.vo.ProposalInviteSeconderVO;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam;
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.SqlExpressionGroup;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
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;
@IocBean
@At("/platform/proposal/mine")
@Slf4j
@Ok("json:full")
@Api(tags = "提案管理-我的提案")
public class ProposalMineController {
@Inject
private Dao dao;
@Inject
private BaseService baseService;
@Inject
private ProposalCommonService proposalCommonService;
@Inject
private BpmService bpmService;
@Inject
private SysMsgService sysMsgService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/transact/mine/index.html")
@SaCheckPermission("proposal.mine")
public void index() {
}
@At
@SaCheckPermission("proposal.mine")
@Aop(TransAop.READ_COMMITTED)
public Result pageData(@Valid ProposalSearchParam pageForm, String sessionId) {
Sql sql = Sqls.create("""
SELECT
info.*,
type.name AS typeName,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeCode,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
(
SELECT
count( 1 ) > 0
FROM
bpm_process_task
WHERE
prevTaskId = ( SELECT id FROM bpm_process_task WHERE processInstanceId = inst.id AND processTaskNodeCode IN ( 10, 40 ) ORDER BY createdAt DESC LIMIT 1 )
AND taskStatus = 'COMPELTE'
) AS nextTaskIsComplete
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 bpm_process_instance inst ON inst.processInstanceBusinessId = info.id
$condition
""");
Cnd cnd = Cnd.NEW();
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
cnd.and("inst.processInstanceInitiatorLoginName", "=", SecurityUtil.getUserLoginname());
}
ProposalSearchParam.buildSearch(cnd, pageForm);
cnd.andEX("info.sessionId", "=", sessionId);
cnd.groupBy("info.id");
sql.setCondition(cnd);
Pagination<ProposalInfoPageVO> pagination = proposalCommonService.listPageVO(pageForm, sql, ProposalInfoPageVO.class);
return Result.success(pagination);
}
@At
@SaCheckPermission("proposal.mine")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "提案", msg = "删除提案")
public Result delete(@Valid String id) {
dao.delete(ProposalInfo.class, id);
bpmService.deleteInstance(id);
return Result.success();
}
@At
@SaCheckPermission("proposal.mine")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "提案", msg = "撤回提案申请")
public Result revokeApply(@Valid String id) {
bpmService.revokeApply(id);
return Result.success();
}
@At
@SaCheckPermission("proposal.mine")
public Result detail(@Valid String id) {
ProposalInfo info = dao.fetch(ProposalInfo.class, id);
return Result.success(info);
}
@At
@SaCheckPermission("proposal.mine")
@ApiOperation("查询可邀请的附议人")
public Result listSeconder(@Valid PageForm pageForm, @Valid String proposalId, @Valid String sessionId,
String delegationId, boolean isInvite) {
if (isInvite) {
Sql hasInviteSql = Sqls.create("""
SELECT
task.id,
JSON_EXTRACT( task.createVariable, '$.loginName' ) AS loginName,
JSON_EXTRACT( task.createVariable, '$.userName' ) AS userName,
JSON_EXTRACT( task.createVariable, '$.unitName' ) AS unitName,
JSON_EXTRACT( task.createVariable, '$.unionName' ) AS unionName,
JSON_EXTRACT( task.createVariable, '$.delegationName' ) AS delegationName,
JSON_EXTRACT( task.createVariable, '$.sex' ) AS sex
FROM
`bpm_process_task` task
INNER JOIN bpm_process_instance inst ON task.processInstanceId = inst.id
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("inst.processInstanceBusinessId", "=", proposalId);
cnd.and("task.processTaskNodeCode", "=", 20);
cnd.and("task.taskStatus", "!=", BpmProcessTaskStatusEnum.REVOKE.name());
cnd.and("task.delFlag", "=", 0);
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("JSON_EXTRACT( task.createVariable, '$.loginName' )", pageForm.getSearchKeyword());
seg.orLike("JSON_EXTRACT( task.createVariable, '$.userName' )", pageForm.getSearchKeyword());
cnd.and(seg);
}
cnd.andEX("JSON_EXTRACT( task.createVariable, '$.delegationId' )", "=", delegationId);
hasInviteSql.setCondition(cnd);
Pagination<ProposalInviteSeconderVO> pagination = proposalCommonService.listPageVO(pageForm, hasInviteSql, ProposalInviteSeconderVO.class);
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","=","19fb858ae9514ddd999c85306b38bd02");
cnd.and("t1.loginName", "!=", SecurityUtil.getUserLoginname());
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 hasInviteSql = Sqls.create("""
SELECT
JSON_EXTRACT( task.createVariable, '$.loginName' ) AS loginName
FROM
`bpm_process_task` task
INNER JOIN bpm_process_instance inst ON task.processInstanceId = inst.id
WHERE inst.processInstanceBusinessId = @proposalId
AND task.processTaskNodeCode = 20
AND task.taskStatus != 'REVOKE'
AND task.delFlag = 0
$condition
""").setParam("proposalId", proposalId);
cnd.and("t1.loginName", "not in", hasInviteSql);
sql.setCondition(cnd);
Pagination<ProposalInviteSeconderVO> pagination = proposalCommonService.listPageVO(pageForm, sql, ProposalInviteSeconderVO.class);
return Result.success(pagination);
}
}
@At
@SaCheckPermission("proposal.mine")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "提案", msg = "邀请附议人")
public Result inviteSeconder(@Param("seconders") String[] seconders, @Valid String proposalId) {
//插入附议人数据
Sql sql = Sqls.create("""
SELECT
t1.loginName,
t1.userName,
t1.sex,
t1.unitName,
t1.unionName,
t1.delegationId,
t2.NAME AS delegationName
FROM
teacher_congress_delegate t1
LEFT JOIN teacher_congress_delegation t2 ON t2.id = t1.delegationId
$condition
""");
sql.setCondition(Cnd.where("t1.loginName", "in", seconders).groupBy("t1.loginName"));
List<ProposalInviteSeconderVO> seconderVOS = proposalCommonService.listVO(sql, ProposalInviteSeconderVO.class);
List<BpmAssignmentDto> bpmAssignmentDtos = seconderVOS.stream().map(seconderVO -> {
BpmAssignmentDto assignmentDto = new BpmAssignmentDto();
assignmentDto.setLoginName(seconderVO.getLoginName());
assignmentDto.setJsonObject(JSONUtil.parseObj(seconderVO));
return assignmentDto;
}).toList();
BpmProcessInstance processInstance = dao.fetch(BpmProcessInstance.class, Cnd.where(BpmProcessInstance::getProcessInstanceBusinessId, "=", proposalId));
//判断是否为撰写任务 团长退回 委员会退回
if (List.of(10, 40, 61).contains(processInstance.getProcessInstanceNodeCode())) {
//完成自己的待办
String taskId = processInstance.getProcessInstanceTaskIds().get(0);
bpmService.completeTaskWithNextTaskVariable(taskId, BpmTaskApprovalTypeEnum.PASS, null, bpmAssignmentDtos);
} else if (processInstance.getProcessInstanceNodeCode() == 20) {
//继续添加附议人
BpmProcessInstance instance = dao.fetch(BpmProcessInstance.class, Cnd.where(BpmProcessInstance::getProcessInstanceBusinessId, "=", proposalId));
bpmService.addTaskAssignmentsWithVariable(instance.getId(), processInstance.getProcessInstanceNodeCode(), bpmAssignmentDtos);
}
ProposalInfo info = dao.fetch(ProposalInfo.class, proposalId);
String createUserName = info.getCreateUserName();
String proposalName = info.getName();
for (ProposalInviteSeconderVO seconderVO : seconderVOS) {
String template = "{}代表,您好,{}代表的提案《{}》邀请您作为附议人,请您登陆智慧校园下的暖心工会系统进行附议,感谢您对教代会提案工作的大力支持!";
String content = StrUtil.format(template, seconderVO.getUserName(), createUserName, proposalName);
sysMsgService.sendMsg(seconderVO.getLoginName(), "提案附议", content, info.getCreateUserId());
}
return Result.success();
}
@At
@SaCheckPermission("proposal.mine")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "提案", msg = "检查能否邀请邀请附议人")
public Result inviteCheck(@Valid String id) {
ProposalInfo info = dao.fetch(ProposalInfo.class, id);
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())
|| StrUtil.isBlank(info.getName())
|| StrUtil.isBlank(info.getBrief())
|| StrUtil.isBlank(measures)
|| StrUtil.isBlank(brief)
) {
return Result.error("提案信息填写不完整,请填写完成后再邀请代表附议!");
}
return Result.success();
}
}
@@ -0,0 +1,130 @@
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.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.param.ProposalUnderTakeSchoolLeaderApprovalParam;
import com.budwk.app.zhgh.democratic.proposal.service.ProposalSchoolLeaderApprovalService;
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.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
@IocBean
@At("/platform/proposal/schoolLeaderApproval")
@Slf4j
@Ok("json:full")
@Api(tags = "提案分管领导审批")
public class ProposalSchoolLeaderApprovalController {
@Inject
private Dao dao;
@Inject
private BaseService baseService;
@Inject
private ProposalSchoolLeaderApprovalService proposalSchoolLeaderApprovalService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/transact/schoolLeaderApproval/index.html")
@SaCheckPermission("proposal.schoolLeaderApproval")
public void index() {
}
@At
@SaCheckPermission("proposal.schoolLeaderApproval")
@ApiOperation("分页列表")
public Result pageData(@Valid ProposalSearchParam pageForm,boolean approval) {
Sql sql = Sqls.create("""
SELECT
info.*,
type.name AS typeName,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
task.id processInstanceTaskId,
task.taskStatus processInstanceTaskStatus,
JSON_EXTRACT(task.createVariable, '$.isMaster') AS isMasterUnderTake,
JSON_EXTRACT(task.createVariable, '$.underTakeName') AS underTakeName,
JSON_EXTRACT(task.createVariable, '$.underTakeId') AS underTakeId,
COUNT(p.consolidationIds) > 0 AS isConsolidation,
EXISTS (
SELECT 1
FROM bpm_process_task next_task
WHERE next_task.prevTaskId = task.id
AND next_task.taskStatus = 'COMPLETE'
) AS nextTaskIsComplete
FROM
bpm_process_task task
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN proposal_info info ON info.id = inst.processInstanceBusinessId
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
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
$condition
""");
Cnd cnd = Cnd.NEW();
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname())));
}
cnd.and("nd.nodeCode", "=", 90);
if (approval) {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.COMPLETE);
} else {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.ACTIVE);
}
ProposalSearchParam.buildSearch(cnd, pageForm);
cnd.groupBy("info.id");
cnd.groupBy("task.id");
sql.setCondition(cnd);
Pagination pagination = baseService.listPageVO(pageForm, sql, ProposalInfoPageVO.class);
return Result.success(pagination);
}
@At
@SaCheckPermission("proposal.schoolLeaderApproval")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "提案", msg = "提案分管领导审核")
@ApiOperation("审核")
public Result approval(@Param("approval") @Valid ProposalUnderTakeSchoolLeaderApprovalParam param) {
proposalSchoolLeaderApprovalService.approval(param);
return Result.success();
}
@At
@SaCheckPermission("proposal.schoolLeaderApproval")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "提案", msg = "提案分管领导撤回")
@ApiOperation("撤回")
public Result revoke(@Valid String taskId) {
proposalSchoolLeaderApprovalService.revoke(taskId);
return Result.success();
}
}
@@ -0,0 +1,129 @@
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.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.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
/**
* 附议提案
*/
@IocBean
@At("/platform/proposal/seconded")
@Slf4j
@Ok("json:full")
@Api(tags = "提案管理系统-提案附议")
public class ProposalSecondedController {
@Inject
private Dao dao;
@Inject
private BaseService baseService;
@Inject
private ProposalCommonService proposalCommonService;
@Inject
private BpmService bpmService;
@Inject
private ProposalSecondedService proposalSecondedService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/transact/seconded/index.html")
@SaCheckPermission("proposal.seconded")
public void index() {
}
@At
@SaCheckPermission("proposal.seconded")
public Result pageData(@Valid ProposalSearchParam pageForm, boolean approval) {
Sql sql = Sqls.create("""
SELECT
info.*,
type.name AS typeName,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
task.id processInstanceTaskId,
task.taskStatus processInstanceTaskStatus,
JSON_EXTRACT( task.createVariable, '$.userName' ) AS seconderName,
COUNT( nt.id ) OVER ( PARTITION BY task.id ) > 0 AS nextTaskIsComplete
FROM
bpm_process_task task
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN proposal_info info ON info.id = inst.processInstanceBusinessId
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 bpm_process_task nt ON nt.prevTaskId = task.id AND nt.taskStatus = 'COMPLETE'
$condition
""");
Cnd cnd = Cnd.NEW();
if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){
cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname())));
}
cnd.and("nd.nodeCode", "=", 20);
if (approval) {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.COMPLETE);
} else {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.ACTIVE);
}
ProposalSearchParam.buildSearch(cnd, pageForm);
// cnd.and(new Static("""
// NOT EXISTS(
// SELECT 1
// FROM bpm_process_task t2
// WHERE t2.processInstanceId = task.processInstanceId
// AND t2.processTaskNodeCode = task.processTaskNodeCode
// AND t2.createdOn > task.createdOn
// )
// """));
// cnd.groupBy("task.id");
sql.setCondition(cnd);
Pagination pagination = baseService.listPageVO(pageForm, sql, ProposalInfoPageVO.class);
return Result.success(pagination);
}
@At
@SaCheckPermission("proposal.seconded")
@ApiOperation("附议")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "提案", msg = "提案人附议")
public Result approval(@Valid @Param("approval") BpmTaskApprovalParam approvalParam) {
proposalSecondedService.approval(approvalParam);
return Result.success();
}
}
@@ -0,0 +1,168 @@
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.service.BpmService;
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.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.param.ProposalUnderTakeReadApprovalParam;
import com.budwk.app.zhgh.democratic.proposal.service.ProposalUnderTakeReadService;
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.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.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@IocBean
@At("/platform/proposal/unitRead")
@Slf4j
@Ok("json:full")
@Api(tags = "提案承办单位初步阅览")
public class ProposalUnderTakeReadController {
@Inject
private BaseService baseService;
@Inject
private BpmService bpmService;
@Inject
private ProposalUnderTakeReadService proposalUnderTakeReadService;
@Inject
private ProposalCommonService proposalCommonService;
@Inject
private SysRoleService sysRoleService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/transact/unitRead/index.html")
@SaCheckPermission("proposal.unitRead")
public void index() {
}
@At
@SaCheckPermission("proposal.unitRead")
@ApiOperation("分页列表")
public Result pageData(@Valid ProposalSearchParam pageForm, boolean approval, boolean transfer) {
Sql sql = Sqls.create("""
SELECT
info.*,
type.name AS typeName,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
task.id processInstanceTaskId,
task.taskStatus processInstanceTaskStatus,
task.extVariable,
JSON_EXTRACT(unit_data.data, '$.isMaster') AS isMasterUnderTake,
JSON_UNQUOTE(JSON_EXTRACT(unit_data.data, '$.underTakeName')) AS underTakeName,
JSON_UNQUOTE(JSON_EXTRACT(unit_data.data, '$.underTakeId')) AS underTakeId,
COUNT(p.consolidationIds) > 0 AS isConsolidation,
EXISTS (
SELECT 1
FROM bpm_process_task next_task
WHERE next_task.prevTaskId = task.id
AND next_task.taskStatus = 'COMPLETE'
) AS nextTaskIsComplete
FROM
bpm_process_task task
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN proposal_info info ON info.id = inst.processInstanceBusinessId
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
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,
JSON_TABLE(
JSON_EXTRACT(task.extVariable, '$.units'),
'$[*]' COLUMNS (
data JSON PATH '$'
)
) unit_data
$condition
""");
boolean isSysAdmin = AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(),RoleConstant.SCHOOL_UNION_PROPOSAL_ADMIN.name());
Set<String> unitIds = new HashSet<>();
String unitIdsStr = "''";
if (!isSysAdmin) {
Sys_role role = sysRoleService.getByCode(RoleConstant.PROPOSAL_UNIT_LEADER.name());
List<Sys_user_role> userRoles = proposalCommonService.dao().query(Sys_user_role.class,
Cnd.where(Sys_user_role::getUserId, "=", SecurityUtil.getUserId())
.and(Sys_user_role::getRoleId, "=", role.getId())
);
unitIds = userRoles.stream().map(Sys_user_role::getUnderTakeId).collect(Collectors.toSet());
unitIdsStr = unitIds.stream()
.map(id -> "'" + id + "'")
.collect(Collectors.joining(","));
}
Cnd cnd = Cnd.NEW();
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or(isSysAdmin ? "1" : "0", "=", 1);
seg.or(new Static("JSON_UNQUOTE(JSON_EXTRACT(unit_data.data, '$.underTakeId')) IN (%s)".formatted(unitIdsStr)));
cnd.and(seg);
cnd.and("nd.nodeCode", "=", 60);
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.COMPLETE);
ProposalSearchParam.buildSearch(cnd, pageForm);
cnd.groupBy("info.id","task.id","JSON_EXTRACT( unit_data.DATA, '$.underTakeId' )");
// cnd.groupBy("task.id");
// cnd.groupBy("JSON_EXTRACT( unit_data.DATA, '$.underTakeId' ) ");
sql.setCondition(cnd);
Pagination pagination = baseService.listPageVO(pageForm, sql, ProposalInfoPageVO.class);
return Result.success(pagination);
}
@At
@SaCheckPermission("proposal.unitRead")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "提案承办单位初步阅览", msg = "承办单位阅览")
@ApiOperation("承办单位阅览")
public Result approval(@Param("approval") @Valid ProposalUnderTakeReadApprovalParam param) {
// proposalUnderTakeReadService.approval(param);
return Result.success();
}
@At
@SaCheckPermission("proposal.unitRead")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "提案承办单位初步阅览", msg = "承办单位阅览撤回")
@ApiOperation("撤回")
public Result revoke(@Valid String taskId) {
// proposalUnderTakeReadService.revokeTask(taskId);
return Result.success();
}
}
@@ -0,0 +1,258 @@
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.models.BpmProcessTask;
import com.budwk.app.bpm.service.BpmService;
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.param.ProposalUnderTakeReplyApprovalParam;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalUnderTakeReplyTransferParam;
import com.budwk.app.zhgh.democratic.proposal.service.ProposalUnderTakeReplyService;
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.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;
import java.util.stream.Collectors;
@IocBean
@At("/platform/proposal/unitReply")
@Slf4j
@Ok("json:full")
@Api(tags = "提案承办单位答复")
public class ProposalUnderTakeReplyController {
@Inject
private BaseService baseService;
@Inject
private BpmService bpmService;
@Inject
private ProposalUnderTakeReplyService proposalUnderTakeReplyService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/transact/unitReply/index.html")
@SaCheckPermission("proposal.unitReply")
public void index() {
}
@At
@SaCheckPermission("proposal.unitReply")
@ApiOperation("分页列表")
public Result pageData(@Valid ProposalSearchParam pageForm, boolean approval, boolean transfer) {
//获取每个实例每个节点每个单位的最新任务ID
Sql sql = Sqls.create("""
SELECT
info.*,
type.name AS typeName,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName,
inst.id processInstanceId,
inst.processInstanceNodeId,
inst.processInstanceNodeName,
inst.processInstanceTaskIds,
inst.processInstanceStatus,
task.id processInstanceTaskId,
task.taskStatus processInstanceTaskStatus,
JSON_EXTRACT(task.createVariable, '$.isMaster') AS isMasterUnderTake,
JSON_EXTRACT(task.createVariable, '$.underTakeName') AS underTakeName,
JSON_EXTRACT(task.createVariable, '$.underTakeId') AS underTakeId,
COUNT(p.consolidationIds) > 0 AS isConsolidation,
EXISTS (
SELECT 1
FROM bpm_process_task next_task
WHERE next_task.prevTaskId = task.id
AND next_task.taskStatus = 'COMPLETE'
) AS nextTaskIsComplete,
EXISTS (
SELECT 1
FROM bpm_process_task next_task
WHERE next_task.id = task.transferAfterTaskId
AND next_task.taskStatus = 'COMPLETE'
) AS nextTransferTaskIsComplete,
CASE
WHEN task.transferAfterTaskId IS NOT NULL AND task.taskStatus = 'TRANSFER' THEN (
SELECT assignmentUserNames
FROM bpm_process_task
WHERE id = task.transferAfterTaskId
)
ELSE NULL
END as underTakeTransferUserName,
task.transferAfterTaskId IS NOT NULL as underTakeReplyIsTransfer
FROM
bpm_process_task task
INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId
INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
INNER JOIN proposal_info info ON info.id = inst.processInstanceBusinessId
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
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 bpm_process_task transferTask on transferTask.id = task.transferAfterTaskId
$condition
""");
Cnd cnd = Cnd.NEW();
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname())));
}
cnd.and("nd.nodeCode", "=", 80);
if (AuthUtil.hasRole(RoleConstant.PROPOSAL_UNIT_LEADER.name())) {
if (transfer) {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.TRANSFER);
} else {
cnd.and(Cnd.exps("transferTask.id", "is", null)
.or("transferTask.taskStatus", "=", BpmProcessTaskStatusEnum.REVOKE.name()));
// cnd.and("task.transferAfterTaskId","is",null);
cnd.and(new Static("""
NOT EXISTS (
SELECT 1
FROM bpm_process_task prev_task
WHERE prev_task.id = task.prevTaskId
AND prev_task.taskStatus = 'TRANSFER'
)
"""));
cnd.and(new Static("""
NOT EXISTS (
SELECT 1
FROM bpm_process_task source_task
WHERE source_task.transferAfterTaskId = task.id
)
"""));
if (approval) {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.COMPLETE);
} else {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.ACTIVE);
}
}
} else {
if (approval) {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.COMPLETE);
} else {
cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.ACTIVE);
}
}
ProposalSearchParam.buildSearch(cnd, pageForm);
cnd.groupBy("info.id");
cnd.groupBy("task.id");
if (!transfer) {
cnd.and(new Static("""
NOT EXISTS(
SELECT 1
FROM bpm_process_task t2
WHERE JSON_EXTRACT(t2.createVariable, '$.underTakeId') = JSON_EXTRACT(task.createVariable, '$.underTakeId')
AND t2.createdOn > task.createdOn
AND t2.taskStatus = 'COMPLETE'
AND t2.processTaskNodeCode = task.processTaskNodeCode
AND t2.processInstanceId = task.processInstanceId
)
"""));
}
sql.setCondition(cnd);
Pagination pagination = baseService.listPageVO(pageForm, sql, ProposalInfoPageVO.class);
return Result.success(pagination);
}
@At
@SaCheckPermission("proposal.unitReply")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "提案承办单位答复", msg = "承办单位答复")
@ApiOperation("审核")
public Result approval(@Param("approval") @Valid ProposalUnderTakeReplyApprovalParam param) {
proposalUnderTakeReplyService.approval(param);
return Result.success();
}
@At
@SaCheckPermission("proposal.unitReply")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "提案承办单位答复", msg = "承办单位答复撤回")
@ApiOperation("撤回")
public Result revoke(@Valid String taskId) {
proposalUnderTakeReplyService.revokeTask(taskId);
return Result.success();
}
@At
@SaCheckPermission("proposal.unitReply")
@ApiOperation("查询本单位可转办用户")
public Result queryTransferUser(@Valid String keyword) {
return Result.success(proposalUnderTakeReplyService.queryTransferUser(keyword));
}
@At
@SaCheckPermission("proposal.unitReply")
@ApiOperation("转办")
@SLog(tag = "提案承办单位答复", msg = "转办")
@Aop(TransAop.READ_COMMITTED)
public Result transfer(@Valid @Param("transfer") ProposalUnderTakeReplyTransferParam param) {
proposalUnderTakeReplyService.transfer(param);
return Result.success();
}
@At
@SaCheckPermission("proposal.unitReply")
@ApiOperation("检查是否可以办理")
public Result checkCanReply(@Valid String taskId) {
String errorMsg = proposalUnderTakeReplyService.checkCanReply(taskId);
BpmProcessTask task = proposalUnderTakeReplyService.dao().fetch(BpmProcessTask.class, taskId);
Sql sql = Sqls.create("""
SELECT
JSON_UNQUOTE(JSON_EXTRACT( createVariable, '$.underTakeName' )) AS underTakeName,
JSON_UNQUOTE(JSON_EXTRACT(extVariable,'$.approvalOpinion')) as approvalOpinion
FROM
bpm_process_task
WHERE
processInstanceId = @processInstanceId
AND processTaskNodeCode = 80
AND taskStatus = 'COMPLETE'
AND JSON_EXTRACT(createVariable,'$.isMaster')= false
""");
sql.setParam("processInstanceId", task.getProcessInstanceId());
List<NutMap> slaveReplyList = proposalUnderTakeReplyService.listMap(sql);
String allSlaveApprovalOpinion = slaveReplyList.stream().map(slave -> slave.getString("underTakeName", "") + "<br/>" + slave.getString("approvalOpinion", "")).collect(Collectors.joining("<br/><br/>"));
NutMap map = NutMap.NEW();
map.put("errMsg", errorMsg);
map.put("allSlaveApprovalOpinion", allSlaveApprovalOpinion);
map.put("task",task);
return Result.success().addData(map);
}
@At
@SaCheckPermission("proposal.unitReply")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "提案承办单位答复", msg = "承办单位转办撤回")
@ApiOperation("转办撤回")
public Result revokeTransfer(@Valid String taskId) {
proposalUnderTakeReplyService.revokeTransfer(taskId);
return Result.success();
}
}
@@ -0,0 +1,104 @@
package com.budwk.app.zhgh.democratic.proposal.controller.transact;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.result.Result;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.sys.models.Sys_dict;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import com.budwk.app.zhgh.democratic.proposal.service.ProposalWriteService;
import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.Teacher_congress_delegate;
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.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
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;
/**
* 提案撰写
*/
@IocBean
@At("/platform/proposal/write")
@Slf4j
@Ok("json:full")
@Api(tags = "提案管理-提案撰写")
public class ProposalWriteController {
@Inject
private Dao dao;
@Inject
private ProposalWriteService proposalWriteService;
@Inject
private BpmService bpmService;
@At("")
@Ok("beetl:/platform/zhgh/democratic/proposal/transact/write/index.html")
@SaCheckPermission("proposal.write")
public void index() {
}
@At
@SaCheckPermission("proposal.write")
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("保存提案")
@SLog(tag = "提案管理系统-我的提案", msg = "保存提案")
public Result save(@Param("info") ProposalInfo proposalInfo) {
if (StrUtil.isBlank(proposalInfo.getCode())) {
proposalInfo.setCode(proposalWriteService.generateProposalCode(proposalInfo.getSessionId(),proposalInfo.getDelegationId()));
}
dao.insertOrUpdate(proposalInfo);
bpmService.startSaveProcessInstance(BpmProcessConstant.PROPOSAL.name(),proposalInfo.getName(),proposalInfo.getId(), null);
return Result.success(proposalInfo);
}
@At
@SaCheckPermission("proposal.write")
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("保存提案")
@SLog(tag = "提案管理系统-我的提案", msg = "手动提交提案")
public Result submit(@Param("info") ProposalInfo proposalInfo) {
dao.insertOrUpdate(proposalInfo);
bpmService.startSubmitProcessInstance(BpmProcessConstant.PROPOSAL.name(),proposalInfo.getName(),proposalInfo.getId(), null,null);
return Result.success(proposalInfo);
}
@At
@SaCheckPermission("proposal.write")
@ApiOperation("提案详情")
public Result detail(@Valid String id) {
ProposalInfo info = dao.fetch(ProposalInfo.class, id);
return Result.success(info);
}
@At
@SaCheckPermission("proposal.write")
@ApiOperation("查询自己所属代表团")
public Result searchMineDelegation(@Valid String sessionId) {
Teacher_congress_delegate delegate = dao.fetch(Teacher_congress_delegate.class,
Cnd.where(Teacher_congress_delegate::getSessionId, "=", sessionId)
.and(Teacher_congress_delegate::getUserId, "=", SecurityUtil.getUserId())
);
return Result.success().addData(delegate != null ? delegate.getDelegationId() : null);
}
@At
@SaCheckPermission("proposal.write")
@ApiOperation("查询自己可撰写的提案方式(个人、代表团、委员会)")
public Result listSource(@Valid String sessionId) {
List<Sys_dict> sysDicts = proposalWriteService.listSource(sessionId);
return Result.success().addData(sysDicts);
}
}
@@ -0,0 +1,124 @@
package com.budwk.app.zhgh.democratic.proposal.controller.vo;
import cn.hutool.json.JSONObject;
import com.budwk.app.bpm.vo.BpmTaskApprovalVo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
public class ProposalInfoPageVO extends BpmTaskApprovalVo {
@ApiModelProperty("主键")
private String id;
@ApiModelProperty("提案编号")
private String code;
@ApiModelProperty("提案名称")
private String name;
@ApiModelProperty("提案类型")
private int typeId;
@ApiModelProperty("提案来源")
private String source;
@ApiModelProperty("立案结果(字典表)")
private String caseFilingResult;
@ApiModelProperty("届次")
private String sessionId;
@ApiModelProperty("创建人")
private String createUserId;
@ApiModelProperty("创建人姓名")
private String createUserName;
@ApiModelProperty("创建人工号")
private String createUserLoginName;
@ApiModelProperty("所属代表团ID")
private String delegationId;
@ApiModelProperty("所属委员会ID")
private String committeeId;
@ApiModelProperty("是否提交")
private boolean isSubmit;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("案由")
private String brief;
@ApiModelProperty("建议措施")
private String measures;
@ApiModelProperty("摘要")
private String excerpt;
@ApiModelProperty("建议落实部门")
private String implementUnitName;
@ApiModelProperty("提案状态")
private String stateCode;
@ApiModelProperty("附件")
private List<JSONObject> files;
@ApiModelProperty("是否公示提案")
private boolean publicity;
@ApiModelProperty("是否优秀提案")
private boolean excellent;
@ApiModelProperty("签字")
private String signature;
@ApiModelProperty("附议人姓名")
private String seconderName;
@ApiModelProperty("提案类型名称")
private String typeName;
@ApiModelProperty("届次")
private String sessionName;
@ApiModelProperty("代表团")
private String delegationName;
@ApiModelProperty("办理数据")
private JSONObject extVariable;
@ApiModelProperty("是否是主办承办单位")
private boolean isMasterUnderTake;
@ApiModelProperty("承办单位ID")
private String underTakeId;
@ApiModelProperty("承办单位")
private String underTakeName;
@ApiModelProperty("是否并案")
private boolean isConsolidation;
@ApiModelProperty("主办承办单位")
private String masterUnderTakeName;
@ApiModelProperty("协办承办单位")
private String[] slaveUnderTakeNames;
@ApiModelProperty("承办单位答复是否转办")
private boolean underTakeReplyIsTransfer;
@ApiModelProperty("承办单位答复转办答复人")
private String[] underTakeTransferUserName;
}
@@ -0,0 +1,73 @@
package com.budwk.app.zhgh.democratic.proposal.controller.vo;
import cn.hutool.json.JSONObject;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
public class ProposalInfoVO extends ProposalInfo {
@ApiModelProperty("流程实例ID")
private String processInstanceId;
@ApiModelProperty("流程实例当前节点ID")
private String processInstanceNodeId;
@ApiModelProperty("流程实例当前节点名称")
private String processInstanceNodeName;
@ApiModelProperty("流程实例任务IDS")
private List<String> processInstanceTaskIds;
@ApiModelProperty("流程实例任务ID")
private String processInstanceTaskId;
@ApiModelProperty("流程实例任务状态")
private String processInstanceTaskStatus;
@ApiModelProperty("流程状态")
private String processInstanceStatus;
@ApiModelProperty("当前节点任务类型")
private String processInstanceTaskNodeType;
@ApiModelProperty("下一节点任务是否完成")
private Boolean nextTaskIsComplete;
@ApiModelProperty("审批参数")
private JSONObject approvalParam;
public JSONObject getApprovalParam() {
JSONObject object = new JSONObject();
object.set("processInstanceBusinessId",this.getId());
object.set("processInstanceId",this.getProcessInstanceId());
object.set("processInstanceNodeId",this.getProcessInstanceNodeId());
object.set("processInstanceNodeName",this.getProcessInstanceNodeName());
object.set("processInstanceTaskIds",this.getProcessInstanceTaskIds());
object.set("processInstanceTaskId",this.getProcessInstanceTaskId());
object.set("processInstanceTaskNodeType",this.getProcessInstanceTaskNodeType());
return object;
}
@ApiModelProperty("提案类型名称")
private String typeName;
@ApiModelProperty("届次")
private String sessionName;
@ApiModelProperty("代表团")
private String delegationName;
@ApiModelProperty("是否是主办承办单位")
private boolean isMasterUnderTake;
@ApiModelProperty("承办单位")
private String underTakeName;
}
@@ -0,0 +1,34 @@
package com.budwk.app.zhgh.democratic.proposal.controller.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("提案邀请附议人")
public class ProposalInviteSeconderVO {
@ApiModelProperty("工号")
private String loginName;
@ApiModelProperty("姓名")
private String userName;
@ApiModelProperty("手机号")
private String mobile;
@ApiModelProperty("性别")
private String sex;
@ApiModelProperty("单位")
private String unitName;
@ApiModelProperty("分工会")
private String unionName;
@ApiModelProperty("代表团ID")
private String delegationId;
@ApiModelProperty("代表团")
private String delegationName;
}
@@ -0,0 +1,21 @@
package com.budwk.app.zhgh.democratic.proposal.h5controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import io.swagger.annotations.Api;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@IocBean
@At("/platform/h5/proposal/common")
@Ok("json:full")
@Api(tags = "h5提案公共")
public class H5ProposalCommonController {
@At("")
@Ok("beetl:/platform/zhghh5/democratic/proposal/common/info/index.html")
@SaCheckPermission("h5.proposal")
public void index() {
}
}
@@ -0,0 +1,21 @@
package com.budwk.app.zhgh.democratic.proposal.h5controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import io.swagger.annotations.Api;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@IocBean
@At("/platform/h5/proposal/delegation")
@Ok("json:full")
@Api("h5提案附议")
public class H5ProposalDelegationController {
@At("")
@Ok("beetl:/platform/zhghh5/democratic/proposal/transact/delegation/index.html")
@SaCheckPermission("h5.proposal.delegation")
public void index() {
}
}
@@ -0,0 +1,21 @@
package com.budwk.app.zhgh.democratic.proposal.h5controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import io.swagger.annotations.Api;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@IocBean
@At("/platform/h5/proposal/mine")
@Ok("json:full")
@Api("h5我的提案")
public class H5ProposalMineController {
@At("")
@Ok("beetl:/platform/zhghh5/democratic/proposal/transact/mine/index.html")
@SaCheckPermission("h5.proposal.mine")
public void index() {
}
}
@@ -0,0 +1,22 @@
package com.budwk.app.zhgh.democratic.proposal.h5controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@IocBean
@At("/platform/h5/proposal/query/comprehensive")
@Slf4j
@Ok("json:full")
@Api(tags = "提案综合查询")
public class H5ProposalQueryComprehensiveController {
@At("")
@Ok("beetl:/platform/zhghh5/democratic/proposal/query/comprehensive/index.html")
@SaCheckPermission("h5.proposal.query.comprehensive")
public void index() {
}
}
@@ -0,0 +1,21 @@
package com.budwk.app.zhgh.democratic.proposal.h5controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import io.swagger.annotations.Api;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@IocBean
@At("/platform/h5/proposal/seconded")
@Ok("json:full")
@Api("h5提案附议")
public class H5ProposalSecondedController {
@At("")
@Ok("beetl:/platform/zhghh5/democratic/proposal/transact/seconded/index.html")
@SaCheckPermission("h5.proposal.seconded")
public void index() {
}
}
@@ -0,0 +1,20 @@
package com.budwk.app.zhgh.democratic.proposal.h5controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import io.swagger.annotations.Api;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@IocBean
@At("/platform/h5/proposal/write")
@Ok("json:full")
@Api("h5提案撰写")
public class H5ProposalWriteController {
@At("")
@Ok("beetl:/platform/zhghh5/democratic/proposal/transact/write/index.html")
@SaCheckPermission("h5.proposal.write")
public void index() {
}
}
@@ -0,0 +1,63 @@
package com.budwk.app.zhgh.democratic.proposal.models;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = true)
@Table("proposal_config")
@TableMeta("{'mysql-charset':'utf8mb4'}")
@Comment("提案配置")
public class ProposalConfig extends BaseModel {
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("附议人数量")
@ColDefine(type = ColType.INT, width = 1)
@Default("1")
private Integer seconderNum;
@Column
@Comment("案由最少字数")
@ColDefine(type = ColType.INT, width = 1)
@Default("1")
private Integer briefMinLength;
@Column
@Comment("协办单位是否需要答复")
@ColDefine(type = ColType.BOOLEAN)
@Default("0")
private Boolean slaveUnitNeedReply;
@Column
@Comment("协办单位是否首先答复")
@ColDefine(type = ColType.BOOLEAN)
@Default("0")
private Boolean slaveUnitFirstReply;
@Column
@Comment("协办单位领导单位是否需要审批")
@ColDefine(type = ColType.BOOLEAN)
@Default("0")
private Boolean slaveUnitLeaderNeedApprove;
@Column
@Comment("撰写须知")
@ColDefine(type = ColType.TEXT)
private String writeRemind;
@Column
@Comment("校领导单位")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> schoolLeaderUnitIds;
}
@@ -0,0 +1,26 @@
package com.budwk.app.zhgh.democratic.proposal.models;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = true)
@Table("proposal_consolidation")
@TableMeta("{'mysql-charset':'utf8mb4'}")
@Comment("提案并案")
public class ProposalConsolidation extends BaseModel {
@Id
@Comment("id")
private Long id;
@Column
@ColDefine(type = ColType.MYSQL_JSON)
@Comment("并案id")
private List<String> consolidationIds;
}
@@ -0,0 +1,162 @@
package com.budwk.app.zhgh.democratic.proposal.models;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import org.nutz.json.JsonField;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = true)
@Table("proposal_info")
@TableMeta("{'mysql-charset':'utf8mb4'}")
@Comment("提案信息")
@TableIndexes({
@Index(name = "INDEX_PROPOSAL_INFO_SESSION_CODE", fields = {"sessionId","code"})
})
public class ProposalInfo extends BaseModel {
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("提案编号")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String code;
@Column
@Comment("提案名称")
@ColDefine(type = ColType.VARCHAR, width = 100)
@NotBlank(message = "提案名称不能为空")
@Size(max = 100)
private String name;
@Column
@Comment("提案类型")
@ColDefine(type = ColType.INT)
private Integer typeId;
@Column
@Comment("提案来源")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String source;
@Column
@Comment("立案结果(字典表)")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String caseFilingResult;
@Column
@Comment("教代会ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String sessionId;
@Column
@Comment("提案人ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String createUserId;
@Column
@Comment("提案人姓名")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String createUserName;
@Column
@Comment("提案人工号")
@ColDefine(type = ColType.VARCHAR, width = 120)
private String createUserLoginName;
@Column
@Comment("联系电话")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String mobile;
@Column
@Comment("所属代表团ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String delegationId;
@Column
@Comment("所属委员会ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String committeeId;
@Column
@Comment("单位")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String unitName;
@Column
@Comment("是否提交")
@ColDefine(type = ColType.BOOLEAN)
@Default(value = "0")
private Boolean isSubmit;
@Column
@Comment("创建时间")
@ColDefine(type = ColType.VARCHAR, width = 30)
@JsonField(dataFormat = "yyyy-MM-dd")
private String createTime;
@Column
@Comment("摘要")
@ColDefine(type = ColType.TEXT)
private String excerpt;
@Column
@Comment("案由")
@ColDefine(type = ColType.TEXT)
private String brief;
@Column
@Comment("建议措施")
@ColDefine(type = ColType.TEXT)
private String measures;
@Column
@Comment("建议落实部门")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String implementUnitName;
@Column
@Comment("提案状态")
@ColDefine(type = ColType.INT, width = 4)
private Integer stateCode;
@Column
@Comment("附件")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> files;
@Column
@Comment("提案人签字ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String signId;
@Column
@Comment("是否公示提案")
@ColDefine(type = ColType.BOOLEAN)
@Default(value = "0")
private Boolean publicity;
@Column
@Comment("是否优秀提案")
@ColDefine(type = ColType.BOOLEAN)
@Default(value = "0")
private Boolean excellent;
@Comment("签字")
@ColDefine(type = ColType.VARCHAR, width = 255)
@Column(hump = true)
private String signature;
}
@@ -0,0 +1,55 @@
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;
}
@@ -0,0 +1,55 @@
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 ProposalReplyUnit 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;
}
@@ -0,0 +1,75 @@
package com.budwk.app.zhgh.democratic.proposal.models;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = true)
@Table("proposal_seconded")
@TableMeta("{'mysql-charset':'utf8mb4'}")
@Comment("提案附议信息")
public class ProposalSeconded 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 seconderId;
@Column
@Comment("附议人姓名")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String seconderName;
@Column
@Comment("附议人工号")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String seconderLoginName;
@Column
@Comment("附议人单位")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String seconderUnitName;
@Column
@Comment("附议人手机号")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String seconderMobile;
@Column
@Comment("附议时间")
@ColDefine(type = ColType.DATETIME)
private Date secondedTime;
@Column
@Comment("邀请时间")
@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)
private Boolean isAgree;
}
@@ -0,0 +1,36 @@
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.*;
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@Table("proposal_type")
@TableMeta("{'mysql-charset':'utf8mb4'}")
@Comment("提案类型")
public class ProposalType extends BaseModel {
@Id
@Comment("id")
private Integer id;
@Column
@Comment("编码")
@ColDefine(type = ColType.VARCHAR, width = 10)
private String code;
@Column
@Comment("名称")
@ColDefine(type = ColType.VARCHAR, width = 10)
private String name;
@Column
@Comment("排序")
@ColDefine(type = ColType.INT)
private Integer sort;
}
@@ -0,0 +1,37 @@
package com.budwk.app.zhgh.democratic.proposal.models;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
@Table("proposal_undertake")
@Data
@EqualsAndHashCode(callSuper = true)
@TableMeta("{'mysql-charset':'utf8mb4'}")
@Comment("提案承办单位")
public class ProposalUndertake extends BaseModel {
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("承办单位编码")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String code;
@Column
@Comment("承办单位名称")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String name;
@Column
@Comment("是否启用")
@ColDefine(type = ColType.BOOLEAN)
@Default(value = "1")
private Boolean enable;
}
@@ -0,0 +1,29 @@
package com.budwk.app.zhgh.democratic.proposal.param;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel(description = "提案委员会立案参数")
public class ProposalCommitteeFilingApprovalParam extends BpmTaskApprovalParam {
@NotEmpty(message = "提案id不能为空,多条即为并案")
private String[] proposalIds;
@NotBlank(message = "立案结果不能为空")
private String caseFilingResult;
@ApiModelProperty("主办单位")
private String hostUnitId;
@ApiModelProperty("协办单位")
private String[] helpUnitIds;
}
@@ -0,0 +1,23 @@
package com.budwk.app.zhgh.democratic.proposal.param;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* 提案委员会立案参数
*/
@Data
public class ProposalCommitteeFilingParam {
@NotBlank(message = "提案id不能为空")
String id;
@NotBlank(message = "立案结果不能为空")
private String caseFilingResult;
private String hostUnit;
private String[] helpUnit;
}
@@ -0,0 +1,29 @@
package com.budwk.app.zhgh.democratic.proposal.param;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel(description = "提案委员会确认承办单位参数")
public class ProposalCommitteeFilingUnitApprovalParam extends BpmTaskApprovalParam {
@NotEmpty(message = "提案id不能为空,这里是立案的时候储存的提案id集合")
private String[] proposalIds;
@NotBlank(message = "立案结果不能为空")
private String caseFilingResult;
@ApiModelProperty("主办单位")
private String hostUnitId;
@ApiModelProperty("协办单位")
private String[] helpUnitIds;
}
@@ -0,0 +1,20 @@
package com.budwk.app.zhgh.democratic.proposal.param;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel("提案反馈评分")
public class ProposalFeedbackEvaluationParam extends BpmTaskApprovalParam {
@ApiModelProperty("反馈评价")
@NotBlank(message = "反馈评价不能为空")
private String feedBackScore;
}
@@ -0,0 +1,89 @@
package com.budwk.app.zhgh.democratic.proposal.param;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.param.PageForm;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.Cnd;
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel(description = "提案办理进度参数")
public class ProposalQueryCollectProgressParam extends PageForm {
@ApiModelProperty(name = "提案名称")
private String name;
@ApiModelProperty(name = "提案编号")
private String code;
@ApiModelProperty(name = "教代会ID")
private String sessionId;
@ApiModelProperty(name = "代表团ID")
private String delegationId;
@ApiModelProperty(name = "提案人姓名")
private String createUserName;
@ApiModelProperty(name = "提案人工号")
private String createUserLoginName;
@ApiModelProperty(name = "提案立案结果")
private String caseFilingResult;
@ApiModelProperty(name = "提案立案结果")
private String[] caseFilingResults;
@ApiModelProperty(name = "提案类型")
private String type;
@ApiModelProperty(name = "提案类型")
private String[] typeIds;
@ApiModelProperty(name = "提案人分工会ID")
private String unionId;
@ApiModelProperty(name = "提案人单位ID")
private String unitId;
@ApiModelProperty(name = "承办单位编码")
private String replyUnitCode;
/**
* 构建通用查询参数
*
* @param cnd cnd
* @param searchParam searchParam
*/
public static void buildSearch(Cnd cnd, ProposalQueryCollectProgressParam searchParam) {
if (cnd == null) {
cnd = Cnd.NEW();
}
//教代会届次
cnd.andEX("info.sessionId", "=", searchParam.getSessionId());
//提案名称
if (StrUtil.isNotBlank(searchParam.getName())) {
cnd.where().andLike("info.name", searchParam.getName());
}
//提案编号
if (StrUtil.isNotBlank(searchParam.getCode())) {
cnd.where().andLike("info.code", searchParam.getCode());
}
//代表团ID
cnd.andEX("info.delegationId", "=", searchParam.getDelegationId());
if (StrUtil.isNotBlank(searchParam.getCreateUserName())) {
cnd.where().andLike("info.createUserName", searchParam.getCreateUserName());
}
//提案人工号
if (StrUtil.isNotBlank(searchParam.getCreateUserLoginName())) {
cnd.where().andLike("info.createUserLoginName", searchParam.getCreateUserLoginName());
}
//提案人姓名
if (StrUtil.isNotBlank(searchParam.getCreateUserName())) {
cnd.where().andLike("info.createUserName", searchParam.getCreateUserName());
}
//提案人分工会
cnd.andEX("tcd.unionId", "=", searchParam.getUnionId());
//提案人单位
cnd.andEX("tcd.unitId", "=", searchParam.getUnitId());
//提案类型
cnd.andEX("info.typeId", "=", searchParam.getType());
cnd.andEX("info.typeId", "in", searchParam.getTypeIds());
//提案立案结果
cnd.andEX("info.caseFilingResult", "in", searchParam.getCaseFilingResults());
//承办单位编码
cnd.andEX("pru.code", "=", searchParam.getReplyUnitCode());
}
}
@@ -0,0 +1,104 @@
package com.budwk.app.zhgh.democratic.proposal.param;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.param.PageForm;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.Cnd;
import org.nutz.dao.util.cri.SqlExpressionGroup;
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel(description = "提案综合查询参数")
public class ProposalQueryComprehensiveParam extends PageForm {
@ApiModelProperty(name = "提案名称")
private String name;
@ApiModelProperty(name = "提案编号")
private String code;
@ApiModelProperty(name = "教代会ID")
private String sessionId;
@ApiModelProperty(name = "代表团ID")
private String delegationId;
@ApiModelProperty(name = "提案人姓名")
private String createUserName;
@ApiModelProperty(name = "提案人工号")
private String createUserLoginName;
@ApiModelProperty(name = "提案立案结果")
private String caseFilingResult;
@ApiModelProperty(name = "提案立案结果")
private String[] caseFilingResults;
@ApiModelProperty(name = "提案类型")
private String type;
@ApiModelProperty(name = "提案类型")
private String[] typeIds;
@ApiModelProperty(name = "提案人分工会ID")
private String unionId;
@ApiModelProperty(name = "提案人单位ID")
private String unitId;
@ApiModelProperty(name = "承办单位编码")
private String replyUnitCode;
@ApiModelProperty(name = "承办单位ID")
private String undertakeUnitId;
@ApiModelProperty(name = "征集进度状态")
private Integer[] collectIds;
/**
* 构建通用查询参数
*
* @param cnd cnd
* @param searchParam searchParam
*/
public static void buildSearch(Cnd cnd, ProposalQueryComprehensiveParam searchParam) {
if (cnd == null) {
cnd = Cnd.NEW();
}
//教代会届次
cnd.andEX("info.sessionId", "=", searchParam.getSessionId());
//提案名称
if (StrUtil.isNotBlank(searchParam.getName())) {
cnd.where().andLike("info.name", searchParam.getName());
}
//提案编号
if (StrUtil.isNotBlank(searchParam.getCode())) {
cnd.where().andLike("info.code", searchParam.getCode());
}
//代表团ID
cnd.andEX("info.delegationId", "=", searchParam.getDelegationId());
if (StrUtil.isNotBlank(searchParam.getCreateUserName())) {
cnd.where().andLike("info.createUserName", searchParam.getCreateUserName());
}
//提案人工号
if (StrUtil.isNotBlank(searchParam.getCreateUserLoginName())) {
cnd.where().andLike("info.createUserLoginName", searchParam.getCreateUserLoginName());
}
//提案人姓名
if (StrUtil.isNotBlank(searchParam.getCreateUserName())) {
cnd.where().andLike("info.createUserName", searchParam.getCreateUserName());
}
//提案人分工会
cnd.andEX("tcde.unionId", "=", searchParam.getUnionId());
//提案人单位
cnd.andEX("tcde.unitId", "=", searchParam.getUnitId());
//提案类型
cnd.andEX("info.typeId", "=", searchParam.getType());
cnd.andEX("info.typeId", "in", searchParam.getTypeIds());
//提案立案结果
cnd.andEX("info.caseFilingResult", "in", searchParam.getCaseFilingResults());
//承办单位编码
cnd.andEX("pru.code", "=", searchParam.getReplyUnitCode());
//承办单位Id
SqlExpressionGroup seg = new SqlExpressionGroup();
if(StrUtil.isNotBlank(searchParam.getUndertakeUnitId())){
seg.orLike("JSON_EXTRACT(caseUnitTasks.extVariable, '$.hostUnitId')",searchParam.getUndertakeUnitId());
seg.orLike("JSON_EXTRACT(caseUnitTasks.extVariable, '$.helpUnitIds')",searchParam.getUndertakeUnitId());
cnd.and(seg);
}
}
}
@@ -0,0 +1,58 @@
package com.budwk.app.zhgh.democratic.proposal.param;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.Cnd;
/**
* 提案通用搜索
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class ProposalSearchParam extends PageForm<ProposalInfo> {
private String name;
private String code;
private String sessionId;
private String delegationId;
private String createUserName;
private String createUserLoginName;
private String caseFilingResult;
/**
* 构建通用查询参数
*
* @param cnd cnd
* @param searchParam searchParam
*/
public static void buildSearch(Cnd cnd, ProposalSearchParam searchParam) {
if (cnd == null) {
cnd = Cnd.NEW();
}
if (StrUtil.isNotBlank(searchParam.getName())) {
cnd.where().andLike("info.name", searchParam.getName());
}
if (StrUtil.isNotBlank(searchParam.getCode())) {
cnd.where().andLike("info.code", searchParam.getCode());
}
cnd.andEX("info.sessionId", "=", searchParam.getSessionId());
cnd.andEX("info.delegationId", "=", searchParam.getDelegationId());
if (StrUtil.isNotBlank(searchParam.getCreateUserName())) {
cnd.where().andLike("info.createUserName", searchParam.getCreateUserName());
}
if (StrUtil.isNotBlank(searchParam.getCreateUserLoginName())) {
cnd.where().andLike("info.createUserLoginName", searchParam.getCreateUserLoginName());
}
cnd.andEX("info.caseFilingResult", "=", searchParam.getCaseFilingResult());
if(StrUtil.isAllNotBlank(searchParam.getPageOrderName(), searchParam.getPageOrderBy())){
cnd.orderBy(searchParam.getPageOrderName(), PageUtil.getOrder(searchParam.getPageOrderBy()));
}else{
cnd.asc("info.code");
}
}
}
@@ -0,0 +1,21 @@
package com.budwk.app.zhgh.democratic.proposal.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
@ApiModel(description = "修改提案类型参数")
public class ProposalSeniorUpdateTypeParam {
@ApiModelProperty(value = "提案ID")
@NotBlank(message = "提案ID不能为空")
private String id;
@ApiModelProperty(value = "类型")
@NotBlank(message = "提案类型不能为空")
private String typeId;
}
@@ -0,0 +1,20 @@
package com.budwk.app.zhgh.democratic.proposal.param;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel("承办单位阅览意见参数")
public class ProposalUnderTakeReadApprovalParam extends BpmTaskApprovalParam {
@ApiModelProperty("能否承办")
@NotBlank(message = "能否承办不能为空")
private String canTake;
}
@@ -0,0 +1,24 @@
package com.budwk.app.zhgh.democratic.proposal.param;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel("承办单位答复参数")
public class ProposalUnderTakeReplyApprovalParam extends BpmTaskApprovalParam {
@ApiModelProperty("落实情况")
@NotBlank(message = "落实情况不能为空")
private String implementState;
@ApiModelProperty("承办单位id")
@NotBlank(message = "承办单位id不能为空")
private String underTakeId;
}
@@ -0,0 +1,33 @@
package com.budwk.app.zhgh.democratic.proposal.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
@ApiModel("提案承办单位答复转办参数")
public class ProposalUnderTakeReplyTransferParam {
@ApiModelProperty("提案id")
@NotBlank(message = "提案id不能为空")
private String proposalId;
@ApiModelProperty("承办单位id")
@NotBlank(message = "承办单位id不能为空")
private String underTakeId;
@ApiModelProperty("流程实例id")
@NotBlank(message = "流程实例id不能为空")
private String processInstanceId;
@ApiModelProperty("流程实例任务id")
@NotBlank(message = "流程实例任务id不能为空")
private String processInstanceTaskId;
@ApiModelProperty("转办用户工号")
@NotBlank(message = "转办用户工号不能为空")
private String transferUserLoginName;
}
@@ -0,0 +1,24 @@
package com.budwk.app.zhgh.democratic.proposal.param;
import com.budwk.app.bpm.param.BpmTaskApprovalParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel("承办单位分管校领导审批参数")
public class ProposalUnderTakeSchoolLeaderApprovalParam extends BpmTaskApprovalParam {
// @ApiModelProperty("是否同意")
// @NotBlank(message = "是否同意不能为空")
// private boolean isAgree;
@ApiModelProperty("承办单位id")
@NotBlank(message = "承办单位id不能为空")
private String underTakeId;
}
@@ -0,0 +1,17 @@
package com.budwk.app.zhgh.democratic.proposal.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
@ApiModel("承办单位答复参数")
public class ProposalUnitReplyParam {
@ApiModelProperty("落实情况")
@NotBlank(message = "落实情况不能为空")
private String implementState;
}
@@ -0,0 +1,12 @@
package com.budwk.app.zhgh.democratic.proposal.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalCommitteeFilingApprovalParam;
public interface ProposalCommitteeFilingService extends BaseService<ProposalInfo> {
void approval(ProposalCommitteeFilingApprovalParam approvalParam);
void revoke(String taskId);
}
@@ -0,0 +1,12 @@
package com.budwk.app.zhgh.democratic.proposal.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalCommitteeFilingUnitApprovalParam;
public interface ProposalCommitteeFilingUnitService extends BaseService<ProposalInfo> {
void approval(ProposalCommitteeFilingUnitApprovalParam approvalParam);
void revoke(String taskId);
}
@@ -0,0 +1,20 @@
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.ProposalInfo;
public interface ProposalDelegationService extends BaseService<ProposalInfo> {
/**
* 团长审核
* @param approvalParam
*/
void approval(BpmTaskApprovalParam approvalParam);
/**
* 撤回
* @param taskId
*/
void revokeTask(String taskId);
}
@@ -0,0 +1,53 @@
package com.budwk.app.zhgh.democratic.proposal.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalQueryComprehensiveParam;
import org.nutz.dao.sql.Sql;
import javax.servlet.http.HttpServletResponse;
/**
* @version 1.0
* @Author zzr
* @nameProposalExportService
* @Date 2024/10/10 10:26
* @注释
*/
public interface ProposalExportService extends BaseService<ProposalInfo> {
/**
* 某些页面的公共SQL,用于导出或者综合查询
* @param pageForm
* @return
*/
Sql exportComprehensiveSql(ProposalQueryComprehensiveParam pageForm);
/**
* 导出提案汇总表excel
* @param pageForm
* @param response
*/
void exportProposalSummaryAsExcel(ProposalQueryComprehensiveParam pageForm, HttpServletResponse response);
/**
* 导出提案立案汇总表excel
* @param pageForm
* @param response
*/
void exportProposalRegisterSummaryAsExcel(ProposalQueryComprehensiveParam pageForm, HttpServletResponse response);
/**
* 导出提案统计表zip
* @param pageForm
* @param response
*/
void exportProposalStatisticsAsZip(ProposalQueryComprehensiveParam pageForm, HttpServletResponse response);
/**
* 导出反馈表
* @param pageForm
* @param response
*/
void exportFeedBackAsZip(ProposalQueryComprehensiveParam pageForm, HttpServletResponse response);
}
@@ -0,0 +1,11 @@
package com.budwk.app.zhgh.democratic.proposal.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalFeedbackEvaluationParam;
import javax.validation.Valid;
public interface ProposalFeedbackEvaluationService extends BaseService<ProposalInfo> {
void approval(@Valid ProposalFeedbackEvaluationParam param);
}
@@ -0,0 +1,14 @@
package com.budwk.app.zhgh.democratic.proposal.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalUnderTakeSchoolLeaderApprovalParam;
import javax.validation.Valid;
public interface ProposalSchoolLeaderApprovalService extends BaseService<ProposalInfo> {
void approval(ProposalUnderTakeSchoolLeaderApprovalParam param);
void revoke(@Valid String taskId);
}
@@ -0,0 +1,15 @@
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;
public interface ProposalSecondedService extends BaseService<ProposalSeconded> {
/**
* 附议
* @param approvalParam
*/
void approval(BpmTaskApprovalParam approvalParam);
}
@@ -0,0 +1,21 @@
package com.budwk.app.zhgh.democratic.proposal.service;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalUnderTakeReadApprovalParam;
import javax.validation.Valid;
public interface ProposalUnderTakeReadService {
Pagination pageData(ProposalSearchParam param);
void approval(ProposalUnderTakeReadApprovalParam param);
/**
* 撤回
* @param taskId
*/
void revokeTask(@Valid String taskId);
}
@@ -0,0 +1,49 @@
package com.budwk.app.zhgh.democratic.proposal.service;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalUnderTakeReplyApprovalParam;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalUnderTakeReplyTransferParam;
import org.nutz.lang.util.NutMap;
import javax.validation.Valid;
import java.util.List;
public interface ProposalUnderTakeReplyService extends BaseService<ProposalInfo> {
Pagination pageData(ProposalSearchParam param);
void approval(ProposalUnderTakeReplyApprovalParam param);
/**
* 查询本单位可转办用户
* @param keyword
*/
List<NutMap> queryTransferUser(String keyword);
/**
* 转办
* @param param
*/
void transfer(ProposalUnderTakeReplyTransferParam param);
/**
* 撤回
* @param taskId
*/
void revokeTask(@Valid String taskId);
/**
* 检查是否可以办理
* @param taskId
*/
String checkCanReply(String taskId);
/**
* 撤回转办
* @param taskId
*/
void revokeTransfer(String taskId);
}
@@ -0,0 +1,21 @@
package com.budwk.app.zhgh.democratic.proposal.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.sys.models.Sys_dict;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import java.util.List;
public interface ProposalWriteService extends BaseService<ProposalInfo> {
List<Sys_dict> listSource(String sessionId);
/**
* 生成提案编号 代表团编码+顺序号
*
* @param sessionId 届次id
* @param delegationId 代表团id
*/
String generateProposalCode(String sessionId,String delegationId);
}
@@ -0,0 +1,7 @@
package com.budwk.app.zhgh.democratic.proposal.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.democratic.teachercongress.prepare.models.Teacher_congress_session;
public interface TeacherCongressDashBoardService extends BaseService<Teacher_congress_session> {
}
@@ -0,0 +1,79 @@
package com.budwk.app.zhgh.democratic.proposal.service.common;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import org.nutz.lang.util.NutMap;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.util.List;
public interface ProposalCommonService extends BaseService<ProposalInfo> {
/**
* 查询提案信息
*/
NutMap info(String id);
void exportProposalAsDocx(String id, HttpServletResponse response);
/**
* 导出word
*
* @param id
* @param byteArrayOutputStream
*/
void exportProposalAsDocx(String id, ByteArrayOutputStream byteArrayOutputStream);
/**
* 导出单个反馈表
* @param id
* @param byteArrayOutputStream
*/
void exportProposalFeedBackAsDocx(String id,ByteArrayOutputStream byteArrayOutputStream);
/**
* 根据提案id查询团长
*
* @param proposalId
* @return
*/
String getDelegationHeadByProposalId(String proposalId);
/**
* 根据代表团id查询团长
*
* @param delegationId
* @return
*/
String getDelegationHeadById(String delegationId);
/**
* 根据提案id查询提案委员会主任
*
* @param proposalId
* @return
*/
String getCommitteeDirectorByProposalId(String proposalId);
/**
* 获取自管代表团
* @return
*/
List<String> getSelfManageDelegationIds();
/**
* 根据提案id查询并案的提案
* @param id
* @return
*/
List<String> getConsolidation(String id);
/**
* 导出年度报告
* @param sessionId
* @param response
*/
void exportYearReport(String sessionId, HttpServletResponse response);
}
@@ -0,0 +1,719 @@
package com.budwk.app.zhgh.democratic.proposal.service.common;
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.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.SysRoleService;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalConsolidation;
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;
import org.nutz.dao.Dao;
import org.nutz.dao.FieldFilter;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.Daos;
import org.nutz.dao.util.cri.Static;
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 javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@IocBean(args = {"refer:dao"})
public class ProposalCommonServiceImpl extends BaseServiceImpl<ProposalInfo> implements ProposalCommonService {
//找出富文本里面上传的图片
static String IMG_SRC_REGEX = "<img\\s+[^>]*src\\s*=\\s*([\"'])(/platform/sys/file/download\\?id=.*?)\\1[^>]*>";
@Inject
private SysRoleService sysRoleService;
@Inject
private BpmService bpmService;
@Inject
private SysOfficeTemplateUtil sysOfficeTemplateUtil;
public ProposalCommonServiceImpl(Dao dao) {
super(dao);
}
@Override
public NutMap info(String id) {
if (StrUtil.isBlank(id)) {
throw new BaseException("提案信息不存在");
}
Sql sql = Sqls.create("""
SELECT
info.*,
type.name AS typeName,
tcs.fullName,
tcs.fullName as sessionName,
tcd.unionName,
tcde.NAME AS delegationName,
tci.`name` AS committeeName
FROM
`proposal_info` info
LEFT JOIN teacher_congress_session tcs ON tcs.id = info.sessionId
LEFT JOIN teacher_congress_delegate tcd ON tcd.userId = info.createUserId
AND tcd.sessionId = info.sessionId
LEFT JOIN teacher_congress_delegation tcde ON tcde.id = tcd.delegationId
LEFT JOIN teacher_congress_institution tci ON tci.id = info.committeeId
LEFT JOIN proposal_type type on type.id = info.typeId
WHERE
info.id = @id
""").setParam("id", id);
NutMap nutMap = (NutMap) dao().execute(sql.setCallback(Sqls.callback.map())).getResult();
List<BpmTaskApprovalRecordVo> 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<BpmProcessTask> seconderTasks = dao().query(BpmProcessTask.class, Cnd.where(BpmProcessTask::getPrevTaskId, "=", lastestWriteTaskId)
.and(BpmProcessTask::getProcessInstanceId, "=", bpmProcessInstance.getId())
.and(BpmProcessTask::getTaskStatus, "!=", BpmProcessTaskStatusEnum.REVOKE.name())
.and(BpmProcessTask::getDelFlag, "=", 0)
.asc(BpmProcessTask::getCreatedOn)
);
nutMap.put("seconders", seconderTasks);
}
//查询并案的提案
List<String> consolidationProposalIds = getConsolidation(id);
List<String> otherProposalIds = consolidationProposalIds.stream().filter(proposalId -> !proposalId.equals(id)).toList();
if (ObjectUtil.isNotEmpty(otherProposalIds)) {
Sql otherProposalSql = Sqls.create("""
SELECT
info.id,
info.name,
info.code,
info.createUserName,
type.name AS typeName,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName
FROM
proposal_info info
LEFT JOIN proposal_type type on type.id = info.typeId
LEFT JOIN teacher_congress_session tcs ON tcs.id = info.sessionId
LEFT JOIN teacher_congress_delegation tcd ON tcd.id = info.delegationId
WHERE info.id in (@otherProposalIds)
""").setParam("otherProposalIds", otherProposalIds);
List<NutMap> consolidationProposals = listMap(otherProposalSql);
nutMap.put("consolidationProposals", consolidationProposals);
nutMap.put("isConsolidation", true);
} else {
nutMap.put("consolidationProposals", null);
nutMap.put("isConsolidation", false);
}
return nutMap;
}
@Override
public void exportProposalAsDocx(String id, HttpServletResponse response) {
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
exportProposalAsDocx(id, byteArrayOutputStream);
FieldFilter fieldFilter = FieldFilter.create(ProposalInfo.class, "^name|code$");
ProposalInfo proposalInfo = Daos.ext(dao(), fieldFilter).fetch(ProposalInfo.class, id);
String name = proposalInfo.getName();
String code = proposalInfo.getCode();
CommonDownloadUtil.download(code + "-" + name + ".docx", byteArrayOutputStream.toByteArray(), response);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void exportProposalAsDocx(String id, ByteArrayOutputStream byteArrayOutputStream) {
if (id == null || id.isEmpty()) {
throw new BaseException("提案信息不存在");
}
// 查询提案信息
HashMap<String, Object> docData = new HashMap<>();
//基本信息
Sql sql = Sqls.create("""
SELECT
info.name,
info.code,
info.brief,
info.measures,
info.createUserName,
tcde.unitName,
tcde.mobile,
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
LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName
WHERE info.id = @id
""").setParam("id", id);
sql.setCallback(Sqls.callback.map());
execute(sql);
NutMap info = (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));
docData.put("info", info);
//查询附议人信息
BpmProcessInstance bpmProcessInstance = dao().fetch(BpmProcessInstance.class, Cnd.where(BpmProcessInstance::getProcessInstanceBusinessId, "=", id));
BpmProcessTask lastestWriteTask = dao().fetch(BpmProcessTask.class, Cnd.where(BpmProcessTask::getProcessInstanceId, "=", bpmProcessInstance.getId())
.and(BpmProcessTask::getTaskStatus, "=", BpmProcessTaskStatusEnum.COMPLETE.name())
.and(BpmProcessTask::getProcessTaskNodeCode, "=", 10)
.and(BpmProcessTask::getDelFlag, "=", 0)
.desc(BpmProcessTask::getEndOn)
);
if (ObjectUtil.isNotEmpty(lastestWriteTask)) {
String lastestWriteTaskId = lastestWriteTask.getId();
List<BpmProcessTask> seconderTasks = dao().query(BpmProcessTask.class, Cnd.where(BpmProcessTask::getPrevTaskId, "=", lastestWriteTaskId)
.and(BpmProcessTask::getProcessInstanceId, "=", bpmProcessInstance.getId())
.and(BpmProcessTask::getTaskStatus, "!=", BpmProcessTaskStatusEnum.REVOKE.name())
.and(BpmProcessTask::getDelFlag, "=", 0)
.asc(BpmProcessTask::getCreatedOn)
);
List<HashMap<String, Object>> seconders = seconderTasks.stream().filter(v -> v.getTaskStatus().equals(BpmProcessTaskStatusEnum.COMPLETE.name()) && ObjectUtil.isNotEmpty(v.getExtVariable().getStr("bpmTaskApprovalType").equals("PASS"))).map(v -> {
HashMap<String, Object> seconderApproval = new HashMap<>();
seconderApproval.put("userName", v.getCreateVariable().getStr("userName"));
seconderApproval.put("loginName", v.getCreateVariable().getStr("loginName"));
seconderApproval.put("unitName", v.getCreateVariable().getStr("unitName"));
return seconderApproval;
}).toList();
docData.put("seconders", seconders);
}
//审批记录
List<BpmTaskApprovalRecordVo> nodeTasks = bpmService.getNodeTasks(BpmProcessConstant.PROPOSAL, id);
//团长审核
nodeTasks.stream().filter(v -> v.getNodeCode() == 30)
.flatMap(v -> v.getTasks().stream())
.max(Comparator.comparing(BpmProcessTaskVo::getEndOn))
.ifPresent(v -> {
HashMap<String, Object> delegationApproval = new HashMap<>();
delegationApproval.put("date", DateUtil.format(v.getEndOn(), "yyyy年MM月dd日"));
delegationApproval.put("user", v.getActualOwnerUserName());
if (ObjectUtil.isNotEmpty(v.getExtVariable())) {
delegationApproval.put("opinion", v.getExtVariable().getStr("approvalOpinion"));
delegationApproval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(v.getExtVariable().getStr("approvalSignature")));
}
docData.put("tz", delegationApproval);
});
//委员会立案
nodeTasks.stream().filter(v -> v.getNodeCode() == 60)
.flatMap(v -> v.getTasks().stream())
.max(Comparator.comparing(BpmProcessTaskVo::getEndOn))
.ifPresent(v -> {
HashMap<String, Object> committeeApproval = new HashMap<>();
committeeApproval.put("date", DateUtil.format(v.getEndOn(), "yyyy年MM月dd日"));
committeeApproval.put("user", v.getActualOwnerUserName());
if (ObjectUtil.isNotEmpty(v.getExtVariable())) {
committeeApproval.put("opinion", v.getExtVariable().getStr("approvalOpinion"));
committeeApproval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(v.getExtVariable().getStr("approvalSignature")));
committeeApproval.put("hostUnit", v.getExtVariable().getStr("hostUnit"));
if (ObjectUtil.isNotEmpty(v.getExtVariable().getBeanList("helpUnits", String.class))) {
committeeApproval.put("helpUnits", String.join("", v.getExtVariable().getBeanList("helpUnits", String.class)));
}
}
docData.put("wyh", committeeApproval);
});
//委员会确认承办单位
nodeTasks.stream().filter(v -> v.getNodeCode() == 70)
.flatMap(v -> v.getTasks().stream())
.max(Comparator.comparing(BpmProcessTaskVo::getEndOn))
.ifPresent(v -> {
HashMap<String, Object> 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<String, Object> 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);
});
//协办单位答复
List<HashMap<String, Object>> slaveUnderTakeReplyList = new ArrayList<>();
nodeTasks.stream().filter(v -> v.getNodeCode() == 80).flatMap(v -> v.getTasks().stream())
.filter(v1 -> ObjectUtil.isNotEmpty(v1.getCreateVariable()) && !v1.getCreateVariable().getBool("isMaster"))
.collect(Collectors.groupingBy(v1 -> v1.getCreateVariable().getStr("underTakeId")))
.forEach((k, v1) -> {
v1.stream().max(Comparator.comparing(BpmProcessTask::getEndOn)).ifPresent(v2 -> {
HashMap<String, Object> slaveUnderTakeReply = new HashMap<>();
slaveUnderTakeReply.put("name", v2.getCreateVariable().getStr("underTakeName"));
slaveUnderTakeReply.put("date", DateUtil.format(v2.getEndOn(), "yyyy年MM月dd日"));
slaveUnderTakeReply.put("user", v2.getActualOwnerUserName());
if (ObjectUtil.isNotEmpty(v2.getExtVariable())) {
slaveUnderTakeReply.put("opinion",HtmlUtil.cleanHtmlTag(StrUtil.blankToDefault(v2.getExtVariable().getStr("approvalOpinion"), "")));
slaveUnderTakeReply.put("implementState", v2.getExtVariable().getStr("implementState"));
slaveUnderTakeReply.put("sign", sysOfficeTemplateUtil.createPictureRenderData(v2.getExtVariable().getStr("approvalSignature")));
}
slaveUnderTakeReplyList.add(slaveUnderTakeReply);
});
});
docData.put("xbdf", slaveUnderTakeReplyList);
//主办校领导审批
nodeTasks.stream().filter(v -> v.getNodeCode() == 90)
.flatMap(v -> v.getTasks().stream())
.filter(v1 -> ObjectUtil.isNotEmpty(v1.getCreateVariable()) && v1.getCreateVariable().getBool("isMaster"))
.max(Comparator.comparing(BpmProcessTaskVo::getEndOn))
.ifPresent(v -> {
HashMap<String, Object> masterLeaderApproval = new HashMap<>();
masterLeaderApproval.put("date", DateUtil.format(v.getEndOn(), "yyyy年MM月dd日"));
masterLeaderApproval.put("user", v.getActualOwnerUserName());
if (ObjectUtil.isNotEmpty(v.getExtVariable())) {
masterLeaderApproval.put("opinion", v.getExtVariable().getStr("approvalOpinion"));
masterLeaderApproval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(v.getExtVariable().getStr("approvalSignature")));
}
docData.put("zbldsp", masterLeaderApproval);
});
List<HashMap<String, Object>> slaveLeaderApprovalList = new ArrayList<>();
//协办校领导审批
nodeTasks.stream().filter(v -> v.getNodeCode() == 90).flatMap(v -> v.getTasks().stream())
.filter(v1 -> ObjectUtil.isNotEmpty(v1.getCreateVariable()) && !v1.getCreateVariable().getBool("isMaster"))
.collect(Collectors.groupingBy(v1 -> v1.getCreateVariable().getStr("underTakeId")))
.forEach((k, v1) -> {
v1.stream().max(Comparator.comparing(BpmProcessTask::getEndOn)).ifPresent(v2 -> {
HashMap<String, Object> slaveLeaderApproval = new HashMap<>();
slaveLeaderApproval.put("name", v2.getCreateVariable().getStr("underTakeName"));
slaveLeaderApproval.put("date", DateUtil.format(v2.getEndOn(), "yyyy年MM月dd日"));
slaveLeaderApproval.put("user", v2.getActualOwnerUserName());
if (ObjectUtil.isNotEmpty(v2.getExtVariable())) {
slaveLeaderApproval.put("opinion", v2.getExtVariable().getStr("approvalOpinion"));
slaveLeaderApproval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(v2.getExtVariable().getStr("approvalSignature")));
}
slaveLeaderApprovalList.add(slaveLeaderApproval);
});
});
docData.put("xbldsp", slaveLeaderApprovalList);
//反馈评分
nodeTasks.stream().filter(v -> v.getNodeCode() == 100)
.flatMap(v -> v.getTasks().stream())
.max(Comparator.comparing(BpmProcessTaskVo::getEndOn))
.ifPresent(v -> {
HashMap<String, Object> feedbackScore = new HashMap<>();
feedbackScore.put("date", DateUtil.format(v.getEndOn(), "yyyy年MM月dd日"));
feedbackScore.put("user", v.getActualOwnerUserName());
if (ObjectUtil.isNotEmpty(v.getExtVariable())) {
feedbackScore.put("opinion", v.getExtVariable().getStr("approvalOpinion"));
String feedBackScore = v.getExtVariable().getStr("feedBackScore", "");
feedbackScore.put("manyi", feedBackScore.equals("满意") ? "" : "");
feedbackScore.put("jibenmanyi", feedBackScore.equals("基本满意") ? "" : "");
feedbackScore.put("bumanyi", feedBackScore.equals("不满意") ? "" : "");
}
docData.put("fk", feedbackScore);
});
AttachmentRenderData attachmentRenderData = Attachments.ofLocal("C:\\Users\\zxy\\Desktop\\1.七届二次教代会提案反馈表(xxx部门).docx").create();
docData.put("attachment", attachmentRenderData);
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)
.build();
try {
XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("proposal"), config).render(docData).writeAndClose(byteArrayOutputStream);
} catch (IOException e) {
log.error("提案导出失败{},提案id:{}", e.getMessage(), id);
}
}
@Override
public void exportProposalFeedBackAsDocx(String id, ByteArrayOutputStream byteArrayOutputStream) {
if (id == null || id.isEmpty()) {
throw new BaseException("提案信息不存在");
}
// 查询提案信息
HashMap<String, Object> docData = new HashMap<>();
//基本信息
Sql sql = Sqls.create("""
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
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
WHERE info.id = @id
""").setParam("id", id);
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));
docData.put("info", info);
//审批记录
List<BpmTaskApprovalRecordVo> 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<String, Object> 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<String, Object> 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<String, Object> feedbackScore = new HashMap<>();
feedbackScore.put("date", DateUtil.format(v.getEndOn(), "yyyy年MM月dd日"));
feedbackScore.put("user", v.getActualOwnerUserName());
if (ObjectUtil.isNotEmpty(v.getExtVariable())) {
feedbackScore.put("opinion", v.getExtVariable().getStr("approvalOpinion"));
String feedBackScore = v.getExtVariable().getStr("feedBackScore", "");
feedbackScore.put("manyi", feedBackScore.equals("满意") ? "" : "");
feedbackScore.put("jibenmanyi", feedBackScore.equals("基本满意") ? "" : "");
feedbackScore.put("bumanyi", feedBackScore.equals("不满意") ? "" : "");
}
docData.put("fk", feedbackScore);
});
HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
htmlRenderPolicy.getConfig().setShowDefaultTableBorderInTableCell(true);
Configure config = Configure.builder()
.bind("info.excerpt", htmlRenderPolicy)
.bind("zbdf.opinion", htmlRenderPolicy)
.build();
try {
XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("proposal_feedback"), config).render(docData).writeAndClose(byteArrayOutputStream);
} catch (IOException e) {
log.error("提案导出失败{},提案id:{}", e.getMessage(), id);
}
}
@Override
public String getDelegationHeadByProposalId(String proposalId) {
ProposalInfo proposalInfo = dao().fetch(ProposalInfo.class, proposalId);
return getDelegationHeadById(proposalInfo.getDelegationId());
}
@Override
public String getDelegationHeadById(String delegationId) {
Sys_role sys_role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD);
Sys_user_role sys_user_role = dao().fetch(Sys_user_role.class, Cnd.where(Sys_user_role::getRoleId, "=", sys_role.getId()).and(Sys_user_role::getTcDelegationId, "=", delegationId));
if (ObjectUtil.isEmpty(sys_user_role)) {
throw new BaseException("您所在的代表团没有设置团长,无法流转到下一步,请联系管理员进行设置。");
}
Sys_user sys_user = dao().fetch(Sys_user.class, sys_user_role.getUserId());
if (ObjectUtil.isEmpty(sys_user)) {
throw new BaseException("您所在的代表团没有设置团长,无法流转到下一步,请联系管理员进行设置。");
}
return sys_user.getLoginname();
}
@Override
public String getCommitteeDirectorByProposalId(String proposalId) {
ProposalInfo proposalInfo = dao().fetch(ProposalInfo.class, proposalId);
String sessionId = proposalInfo.getSessionId();
Sys_role sys_role = sysRoleService.getByCode(RoleConstant.PROPOSAL_COMMITTEE_DIRECTOR);
Sys_user_role sys_user_role = dao().fetch(Sys_user_role.class, Cnd.where(Sys_user_role::getRoleId, "=", sys_role.getId()).and(Sys_user_role::getTcSessionId, "=", sessionId));
if (ObjectUtil.isEmpty(sys_user_role)) {
// throw new BaseException("本届教代会没有设置提案委员会主任,请联系管理员进行设置。");
return "";
}
Sys_user sys_user = dao().fetch(Sys_user.class, sys_user_role.getUserId());
if (ObjectUtil.isEmpty(sys_user)) {
// throw new BaseException("本届教代会没有设置提案委员会主任,请联系管理员进行设置。");
return "";
}
return sys_user.getLoginname();
}
@Override
public List<String> getSelfManageDelegationIds() {
Sys_role role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD.name());
List<Sys_user_role> sysUserRoles = dao().query(Sys_user_role.class, Cnd.where(Sys_user_role::getRoleId, "=", role.getId())
.and(Sys_user_role::getUserId, "=", SecurityUtil.getUserId()));
List<String> delegationIds = sysUserRoles.stream()
.map(Sys_user_role::getTcDelegationId)
.filter(StrUtil::isNotBlank)
.toList();
return delegationIds;
}
@Override
public List<String> getConsolidation(String id) {
ProposalConsolidation consolidation = dao().fetch(ProposalConsolidation.class, Cnd.where(new Static("JSON_CONTAINS(consolidationIds,'\"" + id + "\"')")));
if (ObjectUtil.isNotEmpty(consolidation)) {
return consolidation.getConsolidationIds();
}
return List.of(id);
}
@Override
public void exportYearReport(String sessionId, HttpServletResponse response) {
HashMap<String, Object> docData = new HashMap<>();
Teacher_congress_session session = dao().fetch(Teacher_congress_session.class, sessionId);
docData.put("sessionName", session.getFullName());
Sql sql = Sqls.create("""
SELECT
info.id,
info.caseFilingResult,
type.`name` typeName
FROM
proposal_info info
LEFT JOIN proposal_type type ON type.id = info.typeId
WHERE info.sessionId = @sessionId
""");
sql.setParam("sessionId", sessionId);
List<NutMap> list = listMap(sql);
//提案数量
docData.put("sum", list.size());
//提案类型
docData.put("typeNames", list.stream().filter(v -> StrUtil.isNotBlank(v.getString("typeName"))).map(v -> v.getString("typeName")).distinct().collect(Collectors.joining(",")));
//立案
docData.put("caseFilingSum", list.stream().filter(v -> StrUtil.isNotBlank(v.getString("caseFilingResult")) && v.getString("caseFilingResult").equals("CONFIRM_FILING")).count());
//作为意见
docData.put("opinionSum", list.stream().filter(v -> StrUtil.isNotBlank(v.getString("caseFilingResult")) && v.getString("caseFilingResult").equals("SUGGESTION")).count());
//不予立案
docData.put("notCaseFilingSum", list.stream().filter(v -> StrUtil.isNotBlank(v.getString("caseFilingResult")) && v.getString("caseFilingResult").equals("NOT")).count());
Set<String> underTakeNames = new HashSet<>();
Sql caseUnitSql = Sqls.create("""
SELECT
task.extVariable
FROM
bpm_process_task task
INNER JOIN ( SELECT processInstanceId, MAX( endOn ) AS maxEndOn FROM bpm_process_task WHERE processTaskNodeCode = 70 AND taskStatus = 'COMPLETE' GROUP BY processInstanceId ) latestTask ON task.processInstanceId = latestTask.processInstanceId\s
AND task.endOn = latestTask.maxEndOn
LEFT JOIN bpm_process_instance inst ON inst.id = task.processInstanceId
WHERE
inst.processInstanceBusinessId IN (@businessIds)
""");
caseUnitSql.setParam("businessIds", list.stream().map(v -> v.getString("id")).toList());
List<NutMap> caseUnitList = listMap(caseUnitSql);
for (NutMap v : caseUnitList) {
JSONObject extVariable = Json.fromJson(JSONObject.class, v.getString("extVariable"));
String hostUnitName = extVariable.getStr("hostUnit");
List<String> helpUnitNames = extVariable.getBeanList("helpUnits", String.class);
underTakeNames.add(hostUnitName);
underTakeNames.addAll(helpUnitNames);
}
//承办单位数量
docData.put("underTakeNum", underTakeNames.size());
//承办单位名称
docData.put("underTakeNames", String.join(",", underTakeNames));
//提案办理的详细情况
Sql transactSql = Sqls.create("""
SELECT
concat( type.`name`, '(', type.CODE, ')' ) AS typeName,
count( info.id ) AS sum,
count(case when info.caseFilingResult = 'CONFIRM_FILING' then info.id end) confirmFilingCount,
count(case when info.caseFilingResult = 'SUGGESTION' then info.id end) suggestionCount,
count(case when info.caseFilingResult = 'NOT' then info.id end) notCount
FROM
proposal_type type
LEFT JOIN proposal_info info ON info.typeId = type.id
AND info.sessionId = @sessionId
GROUP BY
type.id
ORDER BY
type.CODE
""");
transactSql.setParam("sessionId", sessionId);
List<NutMap> transactList = listMap(transactSql);
int sum = transactList.stream().mapToInt(v -> v.getInt("sum")).sum();
docData.put("transactSum", sum);
docData.put("transactConfirmFilingSum", transactList.stream().mapToInt(v -> v.getInt("confirmFilingCount")).sum());
docData.put("transactSuggestionSum", transactList.stream().mapToInt(v -> v.getInt("suggestionCount")).sum());
docData.put("transactNotSum", transactList.stream().mapToInt(v -> v.getInt("notCount")).sum());
for (int i = 0; i < transactList.size(); i++) {
NutMap v = transactList.get(i);
v.setv("index", i + 1);
v.setv("ratio", NumberUtil.decimalFormat("#.##%", v.getInt("sum") / sum));
}
docData.put("transacts", transactList);
//下届教代会信息
Teacher_congress_session nextSession = dao().fetch(Teacher_congress_session.class, Cnd.where(Teacher_congress_session::getStartDate, ">", session.getStartDate()).asc(Teacher_congress_session::getStartDate));
if (ObjectUtil.isNotEmpty(nextSession)) {
docData.put("newSessionYear", nextSession.getStartDate().getYear());
docData.put("newSessionMonth", nextSession.getStartDate().getMonth());
docData.put("newSessionDay", nextSession.getStartDate().getMonth());
docData.put("newSessionName", nextSession.getFullName());
docData.put("currentMonth", DateUtil.thisMonth());
Sql newSessionSql = Sqls.create("""
SELECT
concat( type.`name`, '(', type.CODE, ')' ) AS typeName,
count( info.id ) AS count
FROM
proposal_type type
LEFT JOIN proposal_info info ON info.typeId = type.id
AND info.sessionId = @newSessionId
GROUP BY
type.id
ORDER BY
type.CODE
""");
newSessionSql.setParam("newSessionId", nextSession.getId());
List<NutMap> newSessionProposals = listMap(sql);
docData.put("newSum", newSessionProposals.stream().mapToInt(v -> v.getInt("count", 0)).sum());
docData.put("newTypesSummary", newSessionProposals.stream()
.map(proposal -> proposal.getString("typeName") + ": " + proposal.getInt("count") + "")
.collect(Collectors.joining(",")));
docData.put("newTypeNames", newSessionProposals.stream()
.map(proposal -> proposal.getString("typeName"))
.collect(Collectors.joining(",")));
}
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure config = Configure.builder().bind("transacts", policy).build();
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("proposalYearReport"), config).render(docData).write(byteArrayOutputStream);
CommonDownloadUtil.download(session.getFullName() + "提案报告.docx", byteArrayOutputStream.toByteArray(), response);
} catch (IOException e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,196 @@
package com.budwk.app.zhgh.democratic.proposal.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
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.bpm.dto.BpmAssignmentDto;
import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum;
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.sys.models.Sys_user_role;
import com.budwk.app.sys.services.SysMsgService;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalConsolidation;
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.param.ProposalCommitteeFilingApprovalParam;
import com.budwk.app.zhgh.democratic.proposal.service.ProposalCommitteeFilingService;
import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
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 java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@IocBean(args = {"refer:dao"})
public class ProposalCommitteeFilingServiceImpl extends BaseServiceImpl<ProposalInfo> implements ProposalCommitteeFilingService {
@Inject
private ProposalCommonService proposalCommonService;
@Inject
private BpmService bpmService;
@Inject
private CommonService commonService;
@Inject
private SysMsgService sysMsgService;
public ProposalCommitteeFilingServiceImpl(Dao dao) {
super(dao);
}
@Override
public void approval(ProposalCommitteeFilingApprovalParam approvalParam) {
approvalParam.getBpmTaskApprovalTypeEnum();
Map<String, Object> variables = BeanUtil.beanToMap(approvalParam);
variables.put("proposalIds", approvalParam.getProposalIds());
variables.put("hostUnitId", approvalParam.getHostUnitId());
variables.put("helpUnitIds", approvalParam.getHelpUnitIds());
variables.put("caseFilingResult", approvalParam.getCaseFilingResult());
variables.put("consolidationIds", approvalParam.getProposalIds());
ProposalUndertake hostUnit = null;
List<ProposalUndertake> helpUnits = null;
//承办单位答复人初步阅览
List<BpmAssignmentDto> nextApprovals = new ArrayList<>();
if (approvalParam.getBpmTaskApprovalTypeEnum().equals(BpmTaskApprovalTypeEnum.DYNAMIC)) {
if (List.of("CONFIRM_FILING", "SUGGESTION").contains(approvalParam.getCaseFilingResult())) {
hostUnit = dao().fetch(ProposalUndertake.class, approvalParam.getHostUnitId());
helpUnits = dao().query(ProposalUndertake.class, Cnd.where(ProposalUndertake::getId, "in", approvalParam.getHelpUnitIds()));
variables.put("hostUnit", hostUnit.getName());
variables.put("helpUnits", helpUnits.stream().map(ProposalUndertake::getName).toArray(String[]::new));
List<JSONObject> units = new ArrayList<>();
units.add(new JSONObject()
.set("isMaster",true)
.set("underTakeId", hostUnit.getId())
.set("underTakeName", hostUnit.getName())
.set("underTakeCode", hostUnit.getCode())
);
if(ObjectUtil.isNotEmpty(helpUnits)){
for (ProposalUndertake helpUnit : helpUnits) {
units.add(new JSONObject()
.set("isMaster",false)
.set("underTakeId", helpUnit.getId())
.set("underTakeName", helpUnit.getName())
.set("underTakeCode", helpUnit.getCode())
);
}
}
variables.put("units",units);
}
//并案审核
if (approvalParam.getProposalIds().length > 1) {
ProposalConsolidation proposalConsolidation = new ProposalConsolidation();
proposalConsolidation.setConsolidationIds(Arrays.asList(approvalParam.getProposalIds()));
dao().insert(proposalConsolidation);
}
//立案和作为意见会有承办单位
if (approvalParam.getCaseFilingResult().equals("CONFIRM_FILING") || approvalParam.getCaseFilingResult().equals("SUGGESTION")) {
List<ProposalUndertake> units = new ArrayList<>();
units.add(hostUnit);
if (ObjectUtil.isNotNull(helpUnits)) {
units.addAll(helpUnits);
}
for (ProposalUndertake unit : units) {
String approvalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.PROPOSAL_UNIT_LEADER, Cnd.where(Sys_user_role::getUnderTakeId, "=", unit.getId()));
if (StrUtil.isBlank(approvalLoginName)) {
throw new BaseException("{}答复人没有配置,请到承办单位管理页面设置!", unit.getName());
}
assert hostUnit != null;
nextApprovals.add(new BpmAssignmentDto()
.setLoginName(approvalLoginName)
.setJsonObject(new JSONObject()
.set("isMaster", hostUnit.getId().equals(unit.getId()))
.set("underTakeId", unit.getId())
.set("underTakeName", unit.getName())
.set("underTakeCode", unit.getCode())
)
);
}
}
//下一个审批人
String nextApprovalLoginName = proposalCommonService.getCommitteeDirectorByProposalId(approvalParam.getProcessInstanceBusinessId());
//提交并案
for (String consolidationProposalId : approvalParam.getProposalIds()) {
BpmProcessInstance instance = dao().fetch(BpmProcessInstance.class, Cnd.where(BpmProcessInstance::getProcessInstanceBusinessId, "=", consolidationProposalId));
// bpmService.completeTaskWithNextTaskVariable(instance.getProcessInstanceTaskIds().get(0), approvalParam.getBpmTaskApprovalTypeEnum(), variables, nextApprovals);
bpmService.completeTask(instance.getProcessInstanceTaskIds().get(0), approvalParam.getBpmTaskApprovalTypeEnum(), variables, List.of(nextApprovalLoginName));
}
//修改提案立案结果
dao().update(ProposalInfo.class, Chain.make("caseFilingResult", approvalParam.getCaseFilingResult()), Cnd.where(ProposalInfo::getId, "in", approvalParam.getProposalIds()));
List<ProposalInfo> proposalInfos = dao().query(ProposalInfo.class, Cnd.where(ProposalInfo::getId, "in", approvalParam.getProposalIds()));
for (ProposalInfo proposalInfo : proposalInfos) {
//给代表发送消息
if("CONFIRM_FILING".equals(approvalParam.getCaseFilingResult())){
String template = "{}代表您好!您的提案《{}》提案委员会已立案审核,审核结果为准予立案,您可登陆智慧校园下的暖心工会查看详情。";
String content = StrUtil.format(template, proposalInfo.getCreateUserName(), proposalInfo.getName());
sysMsgService.sendMsg(proposalInfo.getCreateUserLoginName(), "提案委员会立案审核", content, SecurityUtil.getUserId());
}else if("SUGGESTION".equals(approvalParam.getCaseFilingResult())){
}else if("NOT".equals(approvalParam.getCaseFilingResult())){
String template = "{}代表您好!您的提案《{}》提案委员会已立案审核,审核结果为不予立案,您可登陆智慧校园下的暖心工会查看详情。";
String content = StrUtil.format(template, proposalInfo.getCreateUserName(), proposalInfo.getName());
sysMsgService.sendMsg(proposalInfo.getCreateUserLoginName(), "提案委员会立案审核", content, SecurityUtil.getUserId());
}
//给承办单位发送消息
if("CONFIRM_FILING".equals(approvalParam.getCaseFilingResult())){
for (BpmAssignmentDto nextApproval : nextApprovals) {
String template = "经提案委员会立案审核,提案《{}》由{}作为{}单位,您可登陆智慧校园下的暖心工会查看详情,感谢您对教代会提案工作的大力支持!。";
String underTakeName = nextApproval.getJsonObject().getStr("underTakeName");
Boolean isMaster = nextApproval.getJsonObject().getBool("isMaster", false);
String content = StrUtil.format(template, proposalInfo.getName(), underTakeName,isMaster?"主办":"协办");
sysMsgService.sendMsg(nextApproval.getLoginName(), "承办单位初步意见", content, SecurityUtil.getUserId());
}
}
}
}
}
@Override
@Aop(TransAop.READ_COMMITTED)
public void revoke(String taskId) {
BpmProcessTask task = dao().fetch(BpmProcessTask.class, taskId);
String instanceId = task.getProcessInstanceId();
BpmProcessInstance instance = dao().fetch(BpmProcessInstance.class, instanceId);
String instanceBusinessId = instance.getProcessInstanceBusinessId();
List<String> consolidationIds = proposalCommonService.getConsolidation(instanceBusinessId);
for (String consolidationId : consolidationIds) {
BpmProcessInstance consolidationProposalInstance = dao().fetch(BpmProcessInstance.class, Cnd.where(BpmProcessInstance::getProcessInstanceBusinessId, "=", consolidationId));
if (ObjectUtil.isNotEmpty(consolidationProposalInstance.getProcessInstanceTaskIds())) {
//还有待处理的任务 那么走的就是确定立案
String activeTaskId = consolidationProposalInstance.getProcessInstanceTaskIds().get(0);
BpmProcessTask activeTask = dao().fetch(BpmProcessTask.class, Cnd.where(BpmProcessTask::getId, "=", activeTaskId));
bpmService.revokeTask(activeTask.getPrevTaskId());
}else{
//不予立案后撤回
bpmService.revokeTask(taskId);
}
}
dao().update(ProposalInfo.class, Chain.make("caseFilingResult", null), Cnd.where(ProposalInfo::getId, "in", consolidationIds));
dao().clear(ProposalConsolidation.class, Cnd.where(new Static("JSON_CONTAINS(consolidationIds,'\"" + instanceBusinessId + "\"')")));
}
}

Some files were not shown because too many files have changed in this diff Show More