diff --git a/src/main/java/io/v/nutz/base/utils/MsgApi.java b/src/main/java/io/v/nutz/base/utils/MsgApi.java index 70a32df..2adc358 100644 --- a/src/main/java/io/v/nutz/base/utils/MsgApi.java +++ b/src/main/java/io/v/nutz/base/utils/MsgApi.java @@ -3,7 +3,9 @@ package io.v.nutz.base.utils; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; +import io.v.nutz.constant.Env; import io.v.nutz.sys.models.Sys_wechat_msg; +import io.v.nutz.web.commons.base.Globals; import lombok.extern.slf4j.Slf4j; import org.nutz.dao.Dao; import org.nutz.dao.Sqls; @@ -58,6 +60,10 @@ public class MsgApi { public boolean sendMsg(String msgContent, List receivers){ + if(Globals.isEnv(Env.dev)) { + log.info("本地开发模式,不发送消息"); + return false; + } Assert.notBlank(msgContent); Assert.notEmpty(receivers); @@ -98,6 +104,10 @@ public class MsgApi { * @param receivers 接收人工号/手机号 */ public void sendSmsMsg(String msgContent, List receivers) { + if(Globals.isEnv(Env.dev)) { + log.info("本地开发模式,不发送消息"); + return; + } Assert.notBlank(msgContent); Assert.notEmpty(receivers); diff --git a/src/main/java/io/v/nutz/oa/client/HhuEduOaClient.java b/src/main/java/io/v/nutz/oa/client/HhuEduOaClient.java index a278e1f..454852b 100644 --- a/src/main/java/io/v/nutz/oa/client/HhuEduOaClient.java +++ b/src/main/java/io/v/nutz/oa/client/HhuEduOaClient.java @@ -1,6 +1,8 @@ package io.v.nutz.oa.client; +import io.v.nutz.constant.Env; import io.v.nutz.oa.util.MyHttpDelete; +import io.v.nutz.web.commons.base.Globals; import org.apache.http.HttpEntity; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.config.RequestConfig; @@ -33,6 +35,9 @@ public class HhuEduOaClient { } public String doDelete(String url,String json,String signature,String nonce,String timestamp) { + if(Globals.isEnv(Env.dev)) { + throw new RuntimeException("本地开发模式,不调用待办"); + } System.out.println(url); CloseableHttpClient httpClient = null; CloseableHttpResponse response = null; @@ -93,7 +98,10 @@ public class HhuEduOaClient { public String doGet(String url,String timestamp,String nonce,String signature,String summaryVer,String summary) { - System.out.println(url); + if(Globals.isEnv(Env.dev)) { + throw new RuntimeException("本地开发模式,不调用待办"); + } + System.out.println(url); CloseableHttpClient httpClient = null; CloseableHttpResponse response = null; String result = ""; @@ -154,7 +162,10 @@ public class HhuEduOaClient { } public String doPost(String url, String json, String signature, String nonce,String timestamp,String summary) { - System.out.println(url); + if(Globals.isEnv(Env.dev)) { + throw new RuntimeException("本地开发模式,不调用待办"); + } + System.out.println(url); CloseableHttpClient httpClient = null; CloseableHttpResponse response = null; String result = ""; @@ -217,6 +228,9 @@ public class HhuEduOaClient { } public String doPut(String url,String json,String signature,String nonce,String timestamp) { + if(Globals.isEnv(Env.dev)) { + throw new RuntimeException("本地开发模式,不调用待办"); + } CloseableHttpClient httpClient = null; CloseableHttpResponse response = null; String result = ""; diff --git a/src/main/java/io/v/nutz/oa/enums/OaBusinessTypeEnum.java b/src/main/java/io/v/nutz/oa/enums/OaBusinessTypeEnum.java index 5272df0..e85cdb0 100644 --- a/src/main/java/io/v/nutz/oa/enums/OaBusinessTypeEnum.java +++ b/src/main/java/io/v/nutz/oa/enums/OaBusinessTypeEnum.java @@ -11,7 +11,8 @@ public enum OaBusinessTypeEnum { DIRECTOR_EXECUTIVE_COMMITTEE(8, "执委会主任审核", "36"), PRINCIPAL_SECRETARY_AUDIT(9, "校长、书记审核", "45"), DIRECTOR_EXECUTIVE_CONFIRM_COMMITTEE(10, "执委会主任确认审核", "54"), - DIRECTOR_CONFIRM_ORGANIZER_REPLY(11, "提案委确认承办审核", "63"); + DIRECTOR_CONFIRM_ORGANIZER_REPLY(11, "提案委确认承办审核", "63"), + COMMITTEE_READ(12, "提案委查阅", "54"); private Integer code; diff --git a/src/main/java/io/v/nutz/proposal/constants/ProposalAuditEnum.java b/src/main/java/io/v/nutz/proposal/constants/ProposalAuditEnum.java index ce661f6..b7d9e18 100644 --- a/src/main/java/io/v/nutz/proposal/constants/ProposalAuditEnum.java +++ b/src/main/java/io/v/nutz/proposal/constants/ProposalAuditEnum.java @@ -82,11 +82,11 @@ public enum ProposalAuditEnum { // 生成代办 if (flag == 1) { Sys_user createUser = dao.fetch(Sys_user.class, info.getCreateUser()); - String title = "提案委审核-" + info.getProposalName() + "(" + info.getProposalCode() + "[" + createUser.getUsername() + "]" + ")"; - String subTitle = createUser.getUsername() + "邀请您提案审核"; + String title = "提案委查阅-" + info.getProposalName() + "(" + info.getProposalCode() + "[" + createUser.getUsername() + "]" + ")"; + String subTitle = createUser.getUsername() + "邀请您提案查阅"; // 参与审核人员 - Sql userSql = Sqls.create("select su.* from sys_user su left join sys_user_role sur on su.id = sur.userid" + + /*Sql userSql = Sqls.create("select su.* from sys_user su left join sys_user_role sur on su.id = sur.userid" + " where sur.roleId in (@roleId)"); userSql.params().set("roleId", Arrays.asList(Roles.WYH_ZR, Roles.tmanage)); userSql.setCallback(Sqls.callback.maps()); @@ -103,7 +103,15 @@ public enum ProposalAuditEnum { createUser.getId(), userIds, Globals.AppDomain + "/platform/proposal/transact/case/case?proposalId=" + info.getId(), - Globals.AppDomain + "/platform/proposal/transact/case/case"); + Globals.AppDomain + "/platform/proposal/transact/case/case");*/ + auditInstanceService.createTask(OaBusinessTypeEnum.COMMITTEE_READ, + info.getId(), + title, + subTitle, + createUser.getId(), + List.of("20010021"), + Globals.AppDomain + "/platform/proposal/transact/caseRead?proposalId=" + info.getId(), + Globals.AppDomain + "/platform/proposal/transact/caseRead"); } }catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/io/v/nutz/proposal/constants/ProposalState.java b/src/main/java/io/v/nutz/proposal/constants/ProposalState.java index 909d1d3..7a23c5b 100644 --- a/src/main/java/io/v/nutz/proposal/constants/ProposalState.java +++ b/src/main/java/io/v/nutz/proposal/constants/ProposalState.java @@ -1,5 +1,7 @@ package io.v.nutz.proposal.constants; +import org.nutz.lang.random.R; + /** * @author: Aaron * @create: 2021-01-27 09:54 @@ -32,6 +34,11 @@ public interface ProposalState { */ Integer PREAUDIT = 250; + /** + * 提案委员会查阅 + */ + Integer COMMITTEE_READ = 260; + /** * 待提案委员会立案审核 */ diff --git a/src/main/java/io/v/nutz/proposal/controller/transact/CaseReadController.java b/src/main/java/io/v/nutz/proposal/controller/transact/CaseReadController.java index 4dd2fcb..0f6aa15 100644 --- a/src/main/java/io/v/nutz/proposal/controller/transact/CaseReadController.java +++ b/src/main/java/io/v/nutz/proposal/controller/transact/CaseReadController.java @@ -7,35 +7,46 @@ import io.v.nutz.base.utils.MsgApi; import io.v.nutz.base.utils.Roles; import io.v.nutz.dao.CndPlus; import io.v.nutz.modules.models.PageForm; +import io.v.nutz.oa.enums.OaBusinessTypeEnum; +import io.v.nutz.oa.service.IOaAuditInstanceService; +import io.v.nutz.oa.service.impl.OaAuditInstanceServiceImpl; import io.v.nutz.proposal.constants.ProposalConstant; import io.v.nutz.proposal.constants.ProposalState; +import io.v.nutz.proposal.constants.ProposalStateDirectionEnum; import io.v.nutz.proposal.models.ProposalAudit; import io.v.nutz.proposal.models.ProposalInfo; import io.v.nutz.proposal.models.ProposalSearch; import io.v.nutz.proposal.services.ProposalInfoService; +import io.v.nutz.proposal.services.ProposalProcessService; import io.v.nutz.sys.models.Sys_signature; +import io.v.nutz.sys.models.Sys_user; import io.v.nutz.sys.models.Sys_user_role; import io.v.nutz.sys.models.User; import io.v.nutz.sys.services.SysSignatureService; import io.v.nutz.util.ShiroUtil; +import io.v.nutz.web.commons.base.Globals; import org.apache.shiro.authz.annotation.RequiresAuthentication; import org.apache.shiro.authz.annotation.RequiresPermissions; +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.json.Json; import org.nutz.lang.Lang; import org.nutz.lang.Strings; import org.nutz.lang.util.NutMap; +import org.nutz.mvc.Mvcs; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -101,15 +112,18 @@ public class CaseReadController { if (Strings.isNotBlank(search.getIsAudit())) { if (search.getIsAudit().equals("true")) { + cnd.and("info.stateCode", ">", ProposalState.COMMITTEE_READ); cnd.and(new Static("FIND_IN_SET(( SELECT id FROM proposal_audit WHERE proposalId = info.id AND userId = '%s' AND other IS NOT NULL limit 1), info.membersOpinions )is not null".formatted(ShiroUtil.getUserId()))); // cnd.and(new Static("JSON_CONTAINS(JSON_EXTRACT( info.membersOpinions, '$[*].userId' ), '\"%s\"') = 1".formatted(ShiroUtil.getUserId()))); } else { + cnd.and("info.stateCode", "=", ProposalState.COMMITTEE_READ); cnd.and(new Static("FIND_IN_SET(( SELECT id FROM proposal_audit WHERE proposalId = info.id AND userId = '%s' AND other IS NOT NULL limit 1), info.membersOpinions ) is null".formatted(ShiroUtil.getUserId()))); - // cnd.and(new Static("(JSON_CONTAINS(JSON_EXTRACT( info.membersOpinions, '$[*].userId' ), '\"%s\"') = 0 or JSON_CONTAINS(JSON_EXTRACT( info.membersOpinions, '$[*].userId' ), '\"%s\"') is null)".formatted(ShiroUtil.getUserId(), ShiroUtil.getUserId()))); } - } - cnd.and("info.stateCode", ">", ProposalState.DELEGATION); + } else { + cnd.and("info.stateCode", ">=", ProposalState.COMMITTEE_READ); + } + cnd.asc("info.stateCode"); // proposalInfoService.sortAndSearch(cnd,page,search); Pagination pagination = (Pagination) proposalInfoService.initSql(sql, page, search, cnd); @@ -160,6 +174,7 @@ public class CaseReadController { */ @At @ViReturn + @Aop(TransAop.READ_COMMITTED) public Object putSuggestion(String sign, @Param("audit") String audit, @Param("proposalId") String proposalId) { ProposalInfo proposalInfo = proposalInfoService.fetch(proposalId); String signId = sysSignatureService.insert(new Sys_signature(sign)).getId(); @@ -178,7 +193,40 @@ public class CaseReadController { List membersOpinions = proposalInfo.getMembersOpinions() == null ? new ArrayList<>() : proposalInfo.getMembersOpinions(); membersOpinions.add(proposalAudit.getId()); proposalInfo.setMembersOpinions(membersOpinions); - proposalInfoService.updateIgnoreNull(proposalInfo); + + // 搞下一个节点去 + ProposalProcessService processService = Mvcs.getIoc().get(ProposalProcessService.class); + int nextStateCode = processService.getSomeNodeNextStateCode(proposalInfo.getStateCode(), ProposalStateDirectionEnum.NEXT); + proposalInfo.setStateCode(nextStateCode); + + proposalInfoService.updateIgnoreNull(proposalInfo); + + // 发待办 + IOaAuditInstanceService auditInstanceService = Mvcs.getIoc().get(OaAuditInstanceServiceImpl.class); + + Sql userSql = Sqls.create("select su.* from sys_user su left join sys_user_role sur on su.id = sur.userid" + + " where sur.roleId in (@roleId)"); + userSql.params().set("roleId", Arrays.asList(Roles.WYH_ZR, Roles.tmanage)); + userSql.setCallback(Sqls.callback.maps()); + dao.execute(userSql); + List sysUsers = userSql.getList(NutMap.class); + + if(Lang.isNotEmpty(sysUsers)) { + List userIds = sysUsers.stream().map(item-> { return item.getString("id"); }).collect(Collectors.toList()); + + Sys_user createUser = dao.fetch(Sys_user.class, proposalInfo.getCreateUser()); + String title = "提案委审核-" + proposalInfo.getProposalName() + "(" + proposalInfo.getProposalCode() + "[" + createUser.getUsername() + "]" + ")"; + String subTitle = createUser.getUsername() + "邀请您提案审核"; + + auditInstanceService.createTask(OaBusinessTypeEnum.PROPOSAL_COMMITTEE_AUDIT, + proposalInfo.getId(), + title, + subTitle, + createUser.getId(), + userIds, + Globals.AppDomain + "/platform/proposal/transact/case/case?proposalId=" + proposalInfo.getId(), + Globals.AppDomain + "/platform/proposal/transact/case/case"); + } return null; } diff --git a/src/main/resources/static/assets/platform/module/proposal/common.js b/src/main/resources/static/assets/platform/module/proposal/common.js index 779d9cb..d0243eb 100644 --- a/src/main/resources/static/assets/platform/module/proposal/common.js +++ b/src/main/resources/static/assets/platform/module/proposal/common.js @@ -3,6 +3,7 @@ window.proposal = { UNSUBMIT: 100, INVIRTE: 150, DELEGATION: 200, + COMMITTEE_READ: 260, CASE: 300, PRINCIPALREAD: 330, CASEUNIT: 400, diff --git a/src/main/resources/views/platform/proposal/transact/caseRead.html b/src/main/resources/views/platform/proposal/transact/caseRead.html index 761b258..f40b605 100644 --- a/src/main/resources/views/platform/proposal/transact/caseRead.html +++ b/src/main/resources/views/platform/proposal/transact/caseRead.html @@ -13,10 +13,10 @@ layout("/layouts/platform.html"){ {{row.proposalName}} @@ -146,18 +146,18 @@ layout("/layouts/platform.html"){ {prop: 'proposalName', label: '提案名称', width: "300", disabled: true}, {prop: 'username', label: '提案人', disabled: true}, {prop: 'typeCode', label: '提案类型编码', sortable: true, checked: 0}, - {prop: 'typeName', label: '提案类型', sortable: true, checked: 0}, + {prop: 'typeName', label: '提案类型', sortable: true, checked: 1}, {prop: 'mannerCode', label: '提案方式编码', sortable: true, checked: 0}, - {prop: 'mannerName', label: '提案方式', sortable: true, checked: 0}, - {prop: 'meetingName', label: '届次', sortable: true, checked: 0}, + {prop: 'mannerName', label: '提案方式', sortable: true, checked: 1}, + {prop: 'meetingName', label: '届次', sortable: true, checked: 1}, {prop: 'delegationCode', label: '代表团编码', sortable: true, checked: 0}, - {prop: 'delegationName', label: '代表团', sortable: true, checked: 0}, + {prop: 'delegationName', label: '代表团', sortable: true, checked: 1}, {prop: 'stateName', label: '提案状态', sortable: true}, - {prop: 'caseNum', label: '立案票数', sortable: true}, + // {prop: 'caseNum', label: '立案票数', sortable: true}, // {prop: 'emphasisNum', label: '重点提案票数', sortable: true}, // {prop: 'ordinaryNum', label: '普通提案票数', sortable: true}, - {prop: 'opinionNum', label: '意见建议票数', sortable: true}, - {prop: 'notGiveNum', label: '不予立案票数', sortable: true}, + // {prop: 'opinionNum', label: '意见建议票数', sortable: true}, + // {prop: 'notGiveNum', label: '不予立案票数', sortable: true}, ], @@ -272,4 +272,4 @@ layout("/layouts/platform.html"){ \ No newline at end of file +#-->