This commit is contained in:
Paidax
2024-11-29 09:03:59 +08:00
commit 2ffadd89a7
3480 changed files with 879405 additions and 0 deletions
@@ -0,0 +1,440 @@
package io.v.nutz.zhgh.proposal.constants;
import io.v.nutz.base.utils.DateUtil;
import io.v.nutz.base.utils.MsgApi;
import io.v.nutz.sys.services.SysLocalProcessService;
import io.v.nutz.web.commons.base.Globals;
import io.v.nutz.zhgh.proposal.models.*;
import io.v.nutz.zhgh.proposal.services.ProposalCommonService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.zhgh.proposal.services.ProposalProcessService;
import io.v.nutz.zhgh.proposal.services.ProposalReplyService;
import io.v.nutz.base.service.ViService;
import io.v.nutz.base.service.impl.ViServiceImpl;
import io.v.nutz.sys.models.Sys_user;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.base.utils.ViResource;
import lombok.Getter;
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.ioc.aop.Aop;
import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.random.R;
import org.nutz.lang.util.NutMap;
import org.nutz.trans.Trans;
import java.util.ArrayList;
import java.util.List;
/**
* @author: Aaron
* @create: 2021-01-25 18:38
* @description: 提案审核
**/
@Getter
public enum ProposalAuditEnum {
/**
* 团长审核
*/
DELEGATION_AUDIT(200) {
@Override
@Aop(TransAop.READ_COMMITTED)
public void audit(NutMap nutMap) {
ProposalAudit audit = nutMap.getAs("audit", ProposalAudit.class);
ProposalInfo info = proposalInfoService.fetch(audit.getProposalId());
int flag = nutMap.getInt("flag");
Integer newStateCode = null;
Sys_user proposalCreator = dao.fetch(Sys_user.class, Cnd.where("id", "=", info.getCreateUser()));
if (flag == 0) {
newStateCode = ProposalState.DELEGATION_BACK;
proposalSecondedService.clear(Cnd.where("proposalId", "=", audit.getProposalId()));
String rollBackTemplate = "{}团长审核并退回了您的[{}]提案,请您通过门户网站或企业微信登录到智慧工会平台修改并重新邀请附议人";
} else if (flag == 1) {
//通过
newStateCode = proposalProcessService.getStateCode(info.getId(), ProposalStateDirectionEnum.NEXT, false);
} else {
//建议撤销
newStateCode = ProposalState.DELEGATION_REVOKE;
String rollBackTemplate = "{}团长审核并建议撤销了您的[{}]提案,请您通过门户网站或企业微信登录到智慧工会平台修改并重新邀请附议人";
// msgApi.sendMsg(StrUtil.format(rollBackTemplate, audit.getUsername(), info.getProposalName()), List.of(proposalCreater.getLoginname()));
}
audit.setFlag(flag == 1);
ProposalAudit auditRecord = dao.insert(audit);
List<String> delegationAuditId = info.getDelegationAuditId() == null ? new ArrayList<>() : info.getDelegationAuditId();
delegationAuditId.add(auditRecord.getId());
info.setStateCode(newStateCode);
info.setDelegationAuditId(delegationAuditId);
proposalInfoService.updateIgnoreNull(info);
ProposalToDoHandler.COMPLETE_TEAM_LEADER_TASK.exec(info.getId(), nutMap);
if (flag == 0) {
//退回
ProposalToDoHandler.CREATE_TEAM_LEADER_BACK_TASK.exec(info.getId(), nutMap);
} else if (flag == 1) {
//通过
ProposalToDoHandler.CREATE_CASE_TASK.exec(info.getId(), nutMap);
} else if (flag == 2) {
//建议撤销
ProposalToDoHandler.CREATE_TEAM_LEADER_REVOKE_TASK.exec(info.getId(), nutMap);
}
}
},
/**
* 提案委员会立案审核
*/
CASE(ProposalState.CASE) {
@Override
public void audit(NutMap nutMap) {
Trans.exec(() -> {
//审核信息
ProposalAudit audit = nutMap.getAs("audit", ProposalAudit.class);
//提案信息
String proposalId = audit.getProposalId();
ProposalInfo info = proposalInfoService.fetch(audit.getProposalId());
String resultCode = nutMap.getString("resultCode");
String hostUnit = nutMap.getString("hostUnit");
String typeId = nutMap.getString("typeId");
String determineTypeCode = nutMap.getString("determineTypeCode", null);
if (audit.getFlag()) {
List<String> helpUnits = Json.fromJsonAsList(String.class, nutMap.getString("helpUnit"));
//储存提案委员会立案时候的信息 可能确定承办单位的时候又不一样了
NutMap auditOther = NutMap.NEW()
.addv("hostUnit", hostUnit)
.addv("helpUnit", helpUnits);
audit.setOther(Json.toJson(auditOther));
ProposalAudit auditRecord = dao.insert(audit);
ProposalInfo proposalInfo = dao.fetch(ProposalInfo.class, proposalId);
proposalInfo.setTypeId(typeId);
proposalInfo.setResultCode(resultCode);
// proposalInfo.setCaseAuditId(auditRecord.getId());
switch (resultCode) {
//立案 建议
case ProposalConstant.DETERMINE, ProposalConstant.OPINION -> {
int stateCode = proposalProcessService.getStateCode(proposalId, ProposalStateDirectionEnum.NEXT, false);
proposalInfo.setStateCode(stateCode);
String proposalCode = proposalProcessService.getProposalCode(info.getTeacherMeetingId(), resultCode);
proposalInfo.setProposalCode(proposalCode);
//分管领导审批表
ProposalBranchLeaderAudit hostBranchAudit = new ProposalBranchLeaderAudit();
hostBranchAudit.setProposalId(proposalId);
hostBranchAudit.setIsAudit(false);
hostBranchAudit.setUnderTakeId(hostUnit);
hostBranchAudit.setIsMaster(true);
dao.insert(hostBranchAudit);
helpUnits.forEach(v -> {
ProposalBranchLeaderAudit helpBranchAudit = new ProposalBranchLeaderAudit();
helpBranchAudit.setProposalId(proposalId);
helpBranchAudit.setIsAudit(false);
helpBranchAudit.setUnderTakeId(v);
helpBranchAudit.setIsMaster(false);
dao.insert(helpBranchAudit);
});
}
//不立案
case ProposalConstant.NOTGIVE -> {
proposalInfo.setStateCode(900);
String proposalCode = proposalProcessService.getProposalCode(info.getTeacherMeetingId(), resultCode);
proposalInfo.setProposalCode(proposalCode);
}
default -> {
}
}
if (resultCode.equals(ProposalConstant.DETERMINE)) {
proposalInfo.setDetermineTypeCode(determineTypeCode);
}
dao.updateIgnoreNull(proposalInfo);
// dao.update(ProposalInfo.class, infoChain, Cnd.where("id", "=", proposalId));
/*承办单位答复记录*/
if (Lang.list(ProposalConstant.DETERMINE, ProposalConstant.OPINION).contains(resultCode)) {
ProposalReply hostReply = new ProposalReply();
hostReply.setId(R.UU32());
hostReply.setProposalId(proposalId);
hostReply.setReplyUnitId(hostUnit);
hostReply.setUndertakeType(1);
hostReply.setReplyNumber(1);
hostReply.setLeaderCheckNumber(1);
hostReply.setIsReply(false);
hostReply.setIsLeaderAudit(false);
dao.insert(ProposalReply.class, Chain.from(hostReply));
if (!helpUnits.isEmpty()) {
helpUnits.forEach(unit -> {
ProposalReply helpReply = new ProposalReply();
helpReply.setId(R.UU32());
helpReply.setProposalId(proposalId);
helpReply.setReplyUnitId(unit);
helpReply.setUndertakeType(2);
helpReply.setReplyNumber(1);
helpReply.setLeaderCheckNumber(1);
helpReply.setIsReply(false);
helpReply.setIsLeaderAudit(false);
dao.insert(ProposalReply.class, Chain.from(helpReply));
});
}
}
}
});
}
},
/**
* 提案委员会确认承办单位
*/
CASE_UNIT(ProposalState.CASEUNIT) {
@Override
public void audit(NutMap nutMap) {
Trans.exec(() -> {
ProposalAudit audit = nutMap.getAs("audit", ProposalAudit.class);
String hostUnit = nutMap.getString("hostUnit");
List<String> helpUnits = Json.fromJsonAsList(String.class, nutMap.getString("helpUnit"));
String proposalId = audit.getProposalId();
ProposalAudit auditRecord = dao.insert(audit);
ProposalInfo proposalInfo = proposalInfoService.fetch(proposalId);
proposalInfo.setCaseUnitAuditId(auditRecord.getId());
if (proposalInfo.getResultCode().equals(ProposalConstant.DETERMINE)) {
//确定立案获取下一个节点的状态
int stateCode = proposalProcessService.getStateCode(proposalId, ProposalStateDirectionEnum.NEXT, false);
proposalInfo.setStateCode(stateCode);
} else {
//所有作为建议的都是要承办单位答复后直接完结了
proposalInfo.setStateCode(ProposalState.UNITREPLY);
}
proposalInfoService.updateIgnoreNull(proposalInfo);
dao.clear(ProposalReply.class, Cnd.where("proposalId", "=", proposalId));
/*重新插入承办单位答复记录*/
ProposalReply hostReply = new ProposalReply();
hostReply.setId(R.UU32());
hostReply.setProposalId(proposalId);
hostReply.setReplyUnitId(hostUnit);
hostReply.setUndertakeType(1);
hostReply.setReplyNumber(1);
hostReply.setLeaderCheckNumber(1);
hostReply.setIsReply(false);
hostReply.setIsLeaderAudit(false);
dao.insert(ProposalReply.class, Chain.from(hostReply));
if (!helpUnits.isEmpty()) {
helpUnits.forEach(unit -> {
ProposalReply helpReply = new ProposalReply();
helpReply.setId(R.UU32());
helpReply.setProposalId(proposalId);
helpReply.setReplyUnitId(unit);
helpReply.setUndertakeType(2);
helpReply.setReplyNumber(1);
helpReply.setLeaderCheckNumber(1);
helpReply.setIsReply(false);
helpReply.setIsLeaderAudit(false);
dao.insert(ProposalReply.class, Chain.from(helpReply));
});
}
});
}
},
/**
* 承办单位答复
*/
UNDERTAKE_REPLY(ProposalState.UNITREPLY) {
@Override
public void audit(NutMap nutMap) {
Trans.exec(() -> {
ProposalReply reply = nutMap.getAs("reply", ProposalReply.class);
reply.setReplyPersonId(ShiroUtil.getUserId());
reply.setReplyTime(DateUtil.getDateTime());
reply.setIsReply(true);
if (reply.getReplyNumber() == 1) {
reply.setIsLeaderAudit(false);
}
dao.updateIgnoreNull(reply);
String proposalId = reply.getProposalId();
Boolean allReply = proposalReplyService.checkAllReply(proposalId);
if (allReply) {
ProposalInfo proposalInfo = dao.fetch(ProposalInfo.class, proposalId);
if (proposalInfo.getResultCode().equals(ProposalConstant.DETERMINE)) {
if (reply.getReplyNumber() > 1) {
String feedbackCode = dao.fetch(ProposalFeedback.class, Cnd.where("proposalId", "=", proposalId)).getFeedbackCode();
if (feedbackCode.equals(ProposalConstant.NOT_SATISFIED)) {
if (proposalInfo.getCaseCheckNeedSecondAudit()) {
int stateCode = proposalProcessService.getStateCode(proposalId, ProposalStateDirectionEnum.NEXT, false);
proposalInfo.setStateCode(stateCode);
} else {
proposalInfo.setStateCode(ProposalState.FEEDBACKSCORE);
}
} else {
if (proposalInfo.getCaseCheckNeedSecondAudit()) {
int stateCode = proposalProcessService.getStateCode(proposalId, ProposalStateDirectionEnum.NEXT, false);
proposalInfo.setStateCode(stateCode);
} else {
proposalInfo.setStateCode(ProposalState.FINISH);
}
}
// if (!proposalInfo.getCaseCheckNeedSecondAudit()) {
// proposalInfo.setStateCode();
// } else {
// proposalInfo.setStateCode(ProposalState.CASE_CHECK);
// }
} else {
int stateCode = proposalProcessService.getStateCode(proposalId, ProposalStateDirectionEnum.NEXT, false);
proposalInfo.setStateCode(stateCode);
}
// if (reply.getReplyNumber() > 1 && proposalInfo.getCaseCheckNeedSecondAudit()) {
//
// String feedbackCode = dao.fetch(ProposalFeedback.class, Cnd.where("proposalId", "=", proposalId)).getFeedbackCode();
//
// //二次答复 并且不需要校领导二次审批 就去反馈评分吧
// proposalInfo.setStateCode(ProposalState.FEEDBACKSCORE);
// } else {
// int stateCode = proposalProcessService.getStateCode(proposalId, ProposalStateDirectionEnum.NEXT, false);
// proposalInfo.setStateCode(stateCode);
// }
} else {
proposalInfo.setStateCode(ProposalState.FINISH);
}
dao.updateIgnoreNull(proposalInfo);
}
});
}
},
/**
* 分管校领导批示
*/
SCHOOL_LEAD_AUDIT(ProposalState.LEADER_PREFIX_AUDIT) {
@Override
public void audit(NutMap nutMap) {
Trans.exec(() -> {
ProposalReply reply = nutMap.getAs("reply", ProposalReply.class);
reply.setLeaderId(ShiroUtil.getUserId());
reply.setLeaderCheckTime(DateUtil.getDateTime());
reply.setIsLeaderAudit(true);
dao.updateIgnoreNull(reply);
// boolean isNode = proposalProcessService.isNode(ProposalState.LEADERAUDIT);
// if (isNode) {
// String proposalId = reply.getProposalId();
// Integer stateCode = null;
//
// if (reply.getLeaderCheckNumber() == 1) {
// stateCode = proposalProcessService.getStateCode(proposalId, ProposalStateDirectionEnum.NEXT, false);
// } else if (reply.getLeaderCheckNumber() > 1) {
// String feedbackCode = dao.fetch(ProposalFeedback.class, Cnd.where("proposalId", "=", proposalId)).getFeedbackCode();
// if (feedbackCode.equals(ProposalConstant.NOT_SATISFIED)) {
// stateCode = proposalProcessService.getStateCode(proposalId, ProposalStateDirectionEnum.NEXT, false);
// } else {
// stateCode = ProposalState.FINISH;
// }
// }
//
// ProposalInfo proposalInfo = dao.fetch(ProposalInfo.class, proposalId);
// proposalInfo.setStateCode(stateCode);
// dao.updateIgnoreNull(proposalInfo);
// }
});
}
},
/**
* 反馈评分
*/
FEEDBACK_SCORE(ProposalState.FEEDBACKSCORE) {
@Override
public void audit(NutMap nutMap) {
proposalFeedbackService.transactional(() -> {
ProposalFeedback feedback = nutMap.getAs("feedback", ProposalFeedback.class);
String proposalId = feedback.getProposalId();
ProposalInfo proposalInfo = dao.fetch(ProposalInfo.class, proposalId);
int feedbackCount = dao.count(ProposalFeedback.class, Cnd.where("proposalId", "=", proposalId));
feedback.setFeedbackNumber(feedbackCount + 1);
feedback.setFeedbackPerson(ShiroUtil.getUserId());
feedback.setFeedbackTime(DateUtil.getDateTime());
proposalFeedbackService.insert(feedback);
if (feedbackCount == 0) {
int stateCode = proposalProcessService.getStateCode(proposalId, ProposalStateDirectionEnum.NEXT, false);
proposalInfo.setStateCode(stateCode);
} else if (feedbackCount > 0) {
proposalInfo.setStateCode(ProposalState.FINISH);
}
dao.updateIgnoreNull(proposalInfo);
// if (feedback.getFeedbackCode().equals(ProposalConstant.NOT_SATISFIED) && feedback.getFeedbackNumber() == 1) {
// proposalInfo.setStateCode(ProposalState.UNITREPLY);
// ProposalReply hostReply = dao.fetch(ProposalReply.class, Cnd.where("proposalId", "=", proposalId).and("underTakeType", "=", 1));
//
// ProposalReply hostReply2 = new ProposalReply();
// hostReply2.setId(R.UU32());
// hostReply2.setProposalId(proposalId);
// hostReply2.setReplyUnitId(hostReply.getReplyUnitId());
// hostReply2.setUndertakeType(1);
// hostReply2.setReplyNumber(hostReply.getReplyNumber() + 1);
// hostReply2.setLeaderCheckNumber(hostReply.getLeaderCheckNumber() + 1);
// hostReply2.setIsReply(false);
// hostReply2.setIsLeaderAudit(true);
// hostReply2.setLeaderId(hostReply.getLeaderId());
// hostReply2.setLeaderCheckTime(hostReply.getLeaderCheckTime());
// hostReply2.setLeaderCheckOpinion(hostReply.getLeaderCheckOpinion());
// dao.insert(ProposalReply.class, Chain.from(hostReply2));
//
// } else {
// proposalInfo.setStateCode(ProposalState.FINISH);
// }
});
}
};
private final Integer state;
ProposalAuditEnum(Integer state) {
this.state = state;
}
public ProposalCommonService proposalCommonService = ViResource.ioc.getByType(ProposalCommonService.class);
public SysLocalProcessService sysLocalProcessService = ViResource.ioc.getByType(SysLocalProcessService.class);
public MsgApi msgApi = ViResource.ioc.getByType(MsgApi.class);
public ProposalInfoService proposalInfoService = ViResource.ioc.getByType(ProposalInfoService.class);
public ProposalProcessService proposalProcessService = ViResource.ioc.getByType(ProposalProcessService.class);
public ProposalReplyService proposalReplyService = ViResource.ioc.getByType(ProposalReplyService.class);
public ViService<ProposalSeconded> proposalAuditService = ViResource.ioc.get(ViServiceImpl.class, "ProposalAudit");
public ViService<ProposalSeconded> proposalSecondedService = ViResource.ioc.get(ViServiceImpl.class, "ProposalSeconded");
public ViService<ProposalFeedback> proposalFeedbackService = ViResource.ioc.get(ViServiceImpl.class, "ProposalFeedback");
public Dao dao = ViResource.dao;
public abstract void audit(NutMap nutMap);
}
@@ -0,0 +1,48 @@
package io.v.nutz.zhgh.proposal.constants;
/**
* @author: Aaron
* @create: 2021-01-28 09:19
* @description:
**/
public class ProposalConstant {
/*提案立案结果*/
/**
* 确定立案
*/
public static final String DETERMINE = "determine";
/**
* 作为意见
*/
public static final String OPINION = "opinion";
/**
* 不予立案
*/
public static final String NOTGIVE = "notGive";
/*提案反馈评分*/
/**
* 满意
*/
public static final String SATISFIED = "satisfied";
/**
* 比较满意
*/
public static final String QUITE_SATISFIED = "QuiteSatisfied";
/**
* 基本满意
*/
public static final String BASICALLY_SATISFIED = "BasicallySatisfied";
/**
* 不满意
*/
public static final String NOT_SATISFIED = "NotSatisfied";
}
@@ -0,0 +1,27 @@
package io.v.nutz.zhgh.proposal.constants;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author zhf
* @date 2022/2/9 11:09
* @description
*/
@Getter
@AllArgsConstructor
public enum ProposalImportEnum {
LOGINNAME(1, 1, "工号"),
EMAIL(3, 3, "邮箱"),
TYPE(4, 1, "类型"),
MANNER(4, 3, "方式"),
NAME(5, 1, "名称"),
BRIEF(6, 1, "案由"),
MEASURES(7, 1, "建议措施");
private final int row;
private final int col;
private final String desc;
}
@@ -0,0 +1,85 @@
package io.v.nutz.zhgh.proposal.constants;
import cn.wizzer.framework.base.Result;
import io.v.nutz.zhgh.proposal.models.ProposalConfig;
import io.v.nutz.zhgh.proposal.models.ProposalInfo;
import io.v.nutz.zhgh.proposal.models.ProposalSeconded;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.zhgh.proposal.services.ProposalProcessService;
import io.v.nutz.zhgh.proposal.services.ProposalSecondedService;
import io.v.nutz.base.service.ViService;
import io.v.nutz.base.service.impl.ViServiceImpl;
import io.v.nutz.base.utils.ViResource;
import lombok.Getter;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
/**
* @author: Aaron
* @create: 2021-01-25 20:08
* @description:
**/
@Getter
public enum ProposalMannerEnum {
/**
* 个人提案
*/
W01 {
@Override
public Object submit(String id) {
ProposalConfig proposalConfig = dao.fetch(ProposalConfig.class);
int count = dao.count(ProposalSeconded.class, Cnd.where("proposalId", "=", id).and("isAgree", "=", 1));
if (count < proposalConfig.getSeconderNum()) {
return Result.error("必须要" + proposalConfig.getSeconderNum() + "个及以上代表附议通过后才能提交!");
}
int stateCode = proposalProcessService.getSomeNodeNextStateCode(ProposalState.UNSUBMIT, ProposalStateDirectionEnum.NEXT);
dao.update(ProposalInfo.class, Chain.make("stateCode", stateCode), Cnd.where("id", "=", id));
ProposalToDoHandler.PERSONAL_SUBMIT.exec(id, null);
return Result.success("提交成功!");
}
},
/**
* 代表团提案
*/
W02 {
@Override
public Object submit(String id) {
proposalInfoService.update(Chain.make("stateCode", ProposalState.CASE), Cnd.where("id", "=", id));
return Result.success("提交成功!");
}
},
/**
* 委员会提案
*/
W03 {
@Override
public Object submit(String id) {
proposalInfoService.update(Chain.make("stateCode", ProposalState.CASE), Cnd.where("id", "=", id));
return Result.success("提交成功!");
}
},
/**
* 委员会提案
*/
W04 {
@Override
public Object submit(String id) {
proposalInfoService.update(Chain.make("stateCode", ProposalState.DELEGATION), Cnd.where("id", "=", id));
return Result.success("提交成功!");
}
};
public ProposalInfoService proposalInfoService = ViResource.ioc.getByType(ProposalInfoService.class);
public ProposalSecondedService proposalSecondedService = ViResource.ioc.getByType(ProposalSecondedService.class);
public ProposalProcessService proposalProcessService = ViResource.ioc.getByType(ProposalProcessService.class);
public ViService<ProposalConfig> proposalConfigService = ViResource.ioc.get(ViServiceImpl.class, "ProposalConfig");
public Dao dao = ViResource.dao;
public abstract Object submit(String id);
}
@@ -0,0 +1,69 @@
package io.v.nutz.zhgh.proposal.constants;
/**
* @author: Aaron
* @create: 2021-01-27 09:54
* @description: 提案状态
**/
public interface ProposalState {
/**
* 未提交
*/
Integer UNSUBMIT = 100;
/**
* 邀请附议人
*/
Integer INVIRTE = 150;
/**
* 团长退回
*/
Integer DELEGATION_BACK = 190;
/**
* 团长建议撤销
*/
Integer DELEGATION_REVOKE = 195;
/**
* 待团长审核
*/
Integer DELEGATION = 200;
/**
* 待提案委员会立案审核
*/
Integer CASE = 300;
/**
* 待提案委员会确认承办单位
*/
Integer CASEUNIT = 400;
/**
* 分管校领导批示
*/
Integer LEADER_PREFIX_AUDIT = 450;
/**
* 待承办单位办理
*/
Integer UNITREPLY = 500;
/**
* 待反馈评分
*/
Integer FEEDBACKSCORE = 600;
/**
* 分管校领导审批
*/
Integer LEADER_SUFFIX_AUDIT = 700;
/**
* 已完结
*/
Integer FINISH = 900;
}
@@ -0,0 +1,24 @@
package io.v.nutz.zhgh.proposal.constants;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author zxy
* @Description TODO
* @createTime 2022年01月20日 09:42:00
*/
@AllArgsConstructor
public enum ProposalStateDirectionEnum {
NEXT("nextState", "下一个节点"),
PREV("prevState", "上一个节点");
@Getter
private final String value;
@Getter
private final String desc;
}
@@ -0,0 +1,421 @@
package io.v.nutz.zhgh.proposal.constants;
import io.v.nutz.base.utils.DateUtil;
import io.v.nutz.base.utils.ViResource;
import io.v.nutz.sys.models.Sys_user;
import io.v.nutz.sys.services.SysLocalProcessService;
import io.v.nutz.sys.services.impl.SysLocalProcessServiceImpl;
import io.v.nutz.web.commons.base.Globals;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.zhgh.proposal.models.*;
import io.v.nutz.zhgh.proposal.services.ProposalCommonService;
import io.v.nutz.zhgh.proposal.services.impl.ProposalCommonServiceImpl;
import lombok.Data;
import lombok.Getter;
import org.nutz.dao.*;
import org.nutz.dao.entity.Record;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.Daos;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import java.util.List;
import java.util.stream.Collectors;
/**
* 提案待办处理
*/
@Getter
public enum ProposalToDoHandler {
/**
* 写提案
*/
START_PROCESS() {
@Override
public void exec(String proposalId, NutMap extra) {
ProposalInfo info = dao.fetch(ProposalInfo.class, proposalId);
localProcessService.startProcess(
"[提案]" + info.getProposalName(),
"proposal_info@" + info.getId(),
"未提交",
info.getCreateUser(),
"/platform/proposal/transact/compose",
"/platform/proposal/transact/compose");
}
},
/**
* 邀请附议人
*/
CREATE_SECONDED_TASK() {
@Override
public void exec(String proposalId, NutMap extra) {
ProposalInfo proposalInfo = dao.fetch(ProposalInfo.class, proposalId);
List<ProposalSeconded> secondedList = extra.getAsList("secondedList", ProposalSeconded.class);
for (ProposalSeconded seconded : secondedList) {
Sql sql = Sqls.fetchString(Sqls.create("select loginname from sys_user where id = @id").setParam("id", seconded.getSeconderId()).toString());
dao.execute(sql);
String loginName = sql.getString();
localProcessService.createTask(
"proposal_info@" + proposalId,
"proposal_seconded@" + seconded.getId(),
"提案附议",
proposalInfo.getCreateUser(),
List.of(loginName),
"/platform/proposal/transact/seconded",
"/platform/proposal/transact/seconded",
"/platform/proposal/transact/seconded",
"/platform/proposal/transact/seconded");
}
localProcessService.updateProcessNodeName("proposal_info@" + proposalId, "邀请附议人");
}
},
/**
* 附议完成
*/
COMPLETE_SECONDED_TASK() {
@Override
public void exec(String proposalId, NutMap extra) {
String secondedId = extra.getString("secondedId");
localProcessService.completeTask(
"proposal_seconded@" + secondedId,
"proposal_info@" + proposalId,
ShiroUtil.getUserId(),
""
);
}
},
/**
* 个人提案提交
*/
PERSONAL_SUBMIT() {
@Override
public void exec(String proposalId, NutMap extra) {
}
},
/**
* 创建团长待办
*/
CREATE_TEAM_LEADER_TASK() {
@Override
public void exec(String proposalId, NutMap extra) {
ProposalInfo proposalInfo = dao.fetch(ProposalInfo.class, proposalId);
//都附议了 改变流程节点状态名称
localProcessService.updateProcessNodeName("proposal_info@" + proposalId, "团长审核");
localProcessService.createTask("proposal_info@" + proposalId,
"delegationAuditId",
"团长审核",
proposalInfo.getCreateUser(),
proposalCommonService.getTeamLeaderByProposalId(proposalId),
"/platform/proposal/transact/delegation",
"/platform/proposal/transact/delegation",
"/platform/proposal/transact/delegation",
"/platform/proposal/transact/delegation"
);
}
},
/**
* 团长完成
*/
COMPLETE_TEAM_LEADER_TASK() {
@Override
public void exec(String proposalId, NutMap extra) {
String opinion = extra.getString("opinion");
localProcessService.completeTask(
"delegationAuditId",
"proposal_info@" + proposalId,
ShiroUtil.getUserId(),
opinion);
}
},
/**
* 团长退回
*/
CREATE_TEAM_LEADER_BACK_TASK() {
@Override
public void exec(String proposalId, NutMap extra) {
localProcessService.updateProcessNodeName(
"proposal_info@" + proposalId,
"团长退回"
);
}
},
/**
* 团长建议撤销
*/
CREATE_TEAM_LEADER_REVOKE_TASK() {
@Override
public void exec(String proposalId, NutMap extra) {
localProcessService.updateProcessNodeName(
"proposal_info@" + proposalId,
"团长建议撤销"
);
}
},
/**
* 创建委员会待办
*/
CREATE_CASE_TASK() {
@Override
public void exec(String proposalId, NutMap extra) {
localProcessService.createTask(
"proposal_info@" + proposalId,
"caseAuditId",
"待提案委员会立案",
ShiroUtil.getUserId(),
proposalCommonService.getCommitteeLeader(proposalId),
"/platform/proposal/transact/case/case",
"/platform/proposal/transact/case/case",
null,
null
);
localProcessService.updateProcessNodeName(
"proposal_info@" + proposalId,
"待提案委员会立案"
);
}
},
COMPLETE_CASE_TASK() {
@Override
public void exec(String proposalId, NutMap extra) {
//完成待办
localProcessService.completeTask(
"caseAuditId",
"proposal_info@" + proposalId,
ShiroUtil.getUserId(),
extra.getString("opinion")
);
}
},
/**
* 提委会确认承办单位
*/
CREATE_CASE_UNIT_TASK() {
@Override
public void exec(String proposalId, NutMap extra) {
localProcessService.updateProcessNodeName(
"proposal_info@" + proposalId,
"提委会确认承办单位"
);
localProcessService.createTask(
"proposal_info@" + proposalId,
"caseUnitAuditId",
"提委会确认承办单位",
ShiroUtil.getUserId(),
proposalCommonService.getCommitteeLeader(proposalId),
"/platform/proposal/transact/caseUnit",
"/platform/proposal/transact/caseUnit",
null,
null
);
}
},
COMPLETE_CASE_UNIT_TASK() {
@Override
public void exec(String proposalId, NutMap extra) {
//完成待办
localProcessService.completeTask(
"caseUnitAuditId",
"proposal_info@" + proposalId,
ShiroUtil.getUserId(),
""
);
}
},
/**
* 分管校领导批示任务
*/
CREATE_BRANCH_LEADER_PREFIX_AUDIT_TASK() {
@Override
public void exec(String proposalId, NutMap extra) {
ProposalBranchLeaderAudit hostBranchAudit = extra.getAs("hostBranchAudit", ProposalBranchLeaderAudit.class);
String hostBranchAuditId = hostBranchAudit.getId();
String underTakeId = hostBranchAudit.getUnderTakeId();
localProcessService.createTask("proposal_info@" + proposalId, "proposal_branch_leader_audit@" + hostBranchAuditId, "分管校领导批示", ShiroUtil.getUserId(), proposalCommonService.getUnderTakeSchoolLeader(underTakeId), "/platform/proposal/transact/branchLeaderPrefixAudit", "/platform/proposal/transact/branchLeaderPrefixAudit", null, null);
localProcessService.updateProcessNodeName("proposal_info@" + proposalId, "分管校领导批示");
}
},
/**
* 分管校领导完成任务
*/
COMPLETE_BRANCH_LEADER_PREFIX_AUDIT_TASK() {
@Override
public void exec(String proposalId, NutMap extra) {
//完成待办
localProcessService.completeTask(
"proposal_branch_leader_audit@" + extra.getString("pblaId"),
"proposal_info@" + proposalId,
ShiroUtil.getUserId(),
""
);
}
},
/**
* 创建承办单位答复待办
*/
CREATE_UNDERTAKE_TASK() {
@Override
public void exec(String proposalId, NutMap extra) {
localProcessService.updateProcessNodeName(
"proposal_info@" + proposalId,
"承办单位办理"
);
//查询主办、协办答复配置
Sql sql = Sqls.fetchRecord(Sqls.create("SELECT t1.* FROM `proposal_config` t INNER JOIN proposal_reply_config t1 on t1.id = t.slaveUnitConfigId").toString());
dao.execute(sql);
Record slaveReplyConfig = (Record) sql.getResult();
//协办需要答复吗
boolean slaveNeedReply = slaveReplyConfig.getInt("isNeedReply") == 1;
//查询最大一次的replyNumber
int maxReplyNumber = dao.func(ProposalReply.class, "max", "replyNumber", Cnd.where("proposalId", "=", proposalId));
List<ProposalReply> replies = dao.query(ProposalReply.class, Cnd.where("proposalId", "=", proposalId).and("replyNumber", "=", maxReplyNumber).and("undertakeType", "in", slaveNeedReply ? Lang.list(1, 2) : Lang.list(1)));
for (ProposalReply reply : replies) {
localProcessService.createTask("proposal_info@" + proposalId, "proposal_reply@" + reply.getId(), "承办单位办理", ShiroUtil.getUserId(), proposalCommonService.getUnderTakeLeader(reply.getReplyUnitId()), "/platform/proposal/transact/reply", "/platform/proposal/transact/reply", null, null);
}
}
},
COMPLETE_UNDERTAKE_TASK() {
@Override
public void exec(String proposalId, NutMap extra) {
ProposalReply reply = extra.getAs("reply", ProposalReply.class);
localProcessService.completeTask(
"proposal_reply@" + reply.getId(),
"proposal_info@" + proposalId,
ShiroUtil.getUserId(),
reply.getReplyContent()
);
}
},
CREATE_FEEDBACK_TASK() {
@Override
public void exec(String proposalId, NutMap extra) {
Sql sql = Sqls.fetchString(Sqls.create("""
SELECT
u.loginname
FROM
proposal_info info
LEFT JOIN sys_user u ON u.id = info.createUser
WHERE info.id = @id
""").setParam("id", proposalId).toString());
dao.execute(sql);
String loginName = sql.getString();
localProcessService.createTask(
"proposal_info@" + proposalId,
"feedback",
"提案人反馈评价",
ShiroUtil.getUserId(),
List.of(loginName),
"/platform/proposal/transact/feedback",
"/platform/proposal/transact/feedback",
null,
null
);
localProcessService.updateProcessNodeName("proposal_info@" + proposalId, "提案人反馈评价");
}
},
COMPLETE_FEEDBACK_TASK() {
@Override
public void exec(String proposalId, NutMap extra) {
localProcessService.completeTask(
"feedback",
"proposal_info@" + proposalId,
ShiroUtil.getUserId(),
extra.getString("opinion"));
}
},
CREATE_BRANCH_LEADER_SUFFIX_AUDIT_TASK() {
@Override
public void exec(String proposalId, NutMap extra) {
ProposalBranchLeaderSuffixAudit leaderSuffixAudit = extra.getAs("leaderSuffixAudit", ProposalBranchLeaderSuffixAudit.class);
localProcessService.createTask(
"proposal_info@" + proposalId,
"proposal_branch_leader_suffix_audit@" + leaderSuffixAudit.getId(),
"分管校领导审批",
ShiroUtil.getUserId(),
proposalCommonService.getUnderTakeSchoolLeader(leaderSuffixAudit.getUnderTakeId()),
"/platform/proposal/transact/branchLeaderSuffixAudit",
"/platform/proposal/transact/branchLeaderSuffixAudit",
null,
null
);
localProcessService.updateProcessNodeName("proposal_info@" + proposalId, "分管校领导审批");
}
},
COMPLETE_BRANCH_LEADER_SUFFIX_AUDIT_TASK() {
@Override
public void exec(String proposalId, NutMap extra) {
String pblsaId = extra.getString("pblsaId");
String opinion = extra.getString("opinion");
localProcessService.completeTask(
"proposal_branch_leader_suffix_audit@" + pblsaId,
"proposal_info@" + proposalId,
ShiroUtil.getUserId(),
opinion);
localProcessService.completeProcess("proposal_info@" + proposalId);
}
},
COMPLETE_PROCESS() {
@Override
public void exec(String proposalId, NutMap extra) {
localProcessService.completeProcess("proposal_info@" + proposalId);
}
},
DELETE_PROCESS() {
@Override
public void exec(String proposalId, NutMap extra) {
localProcessService.deleteProcessInstance("proposal_info@" + proposalId);
}
};
/**
* @param proposalId 提案id
* @param secondedId 附议表id
* @param schoolLeaderPrefixId 校领导批示id
* @param replyId 答复id
* @param schoolLeaderSuffixId 校领导批示id
*/
public abstract void exec(String proposalId, NutMap extra);
public Dao dao = ViResource.dao;
public SysLocalProcessService localProcessService = ViResource.ioc.get(SysLocalProcessServiceImpl.class);
public ProposalCommonService proposalCommonService = ViResource.ioc.get(ProposalCommonServiceImpl.class);
}
@@ -0,0 +1,81 @@
package io.v.nutz.zhgh.proposal.controller.basics;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.zhgh.proposal.models.ProposalConfig;
import io.v.nutz.zhgh.proposal.services.ProposalConfigService;
import io.v.nutz.sys.models.Sys_dict;
import io.v.nutz.sys.services.SysDictService;
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.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.ArrayList;
/**
* @author: Aaron
* @create: 2021-01-21 16:03
* @description: 提案配置
**/
@At("/platform/proposal/basics/config")
@Ok("json:full")
@IocBean
public class ProposalConfigController {
@Inject
private ProposalConfigService proposalConfigService;
@Inject
private Dao dao;
@Inject
private SysDictService sysDictService;
@At("")
@Ok("beetl:/platform/proposal/basics/config.html")
@RequiresPermissions("proposal.basics.config")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.basics.config")
public Object findOne() {
return dao.fetchLinks(dao.fetch(ProposalConfig.class), null);
}
@At
@ViReturn
@Aop(TransAop.READ_COMMITTED)
@RequiresPermissions("proposal.basics.config")
public Object doAdd(@Param("data") ProposalConfig config) {
proposalConfigService.add(config);
return null;
}
@At
@ViReturn
@Aop(TransAop.READ_COMMITTED)
@RequiresPermissions("proposal.basics.config")
public Object doEdit(@Param("data") ProposalConfig config, @Param(value = "mannerList", required = false) String[] mannerList) {
proposalConfigService.edit(config, mannerList);
return null;
}
@At
@ViReturn
@RequiresAuthentication
public Object getDictByCode(String code) {
Sys_dict dict = sysDictService.fetch(Cnd.where("code", "=", code));
return dict == null ? new ArrayList<>() : sysDictService.query(Cnd.where("parentId", "=", Strings.sNull(dict.getId())).asc("location"));
}
}
@@ -0,0 +1,221 @@
package io.v.nutz.zhgh.proposal.controller.basics;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.base.Result;
import cn.wizzer.framework.page.Pagination;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.models.ProposalState;
import io.v.nutz.base.service.ViService;
import io.v.nutz.sys.controllers.platform.sys.SysMenuController;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.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.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 javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.List;
/**
* @author: Aaron
* @create: 2021-01-21 16:03
* @description: 提案状态
**/
@At("/platform/proposal/basics/state")
@Ok("json:full")
@IocBean
@Slf4j
public class ProposalStateController {
@Inject("ProposalState")
private ViService<ProposalState> proposalStateService;
@At("")
@Ok("beetl:/platform/proposal/basics/state.html")
@RequiresPermissions("proposal.basics.state")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.basics.state")
public Object pageData(PageForm page) {
Cnd cnd = Cnd.NEW();
if (Strings.isNotBlank(page.getSearchName()) && Strings.isNotBlank(page.getSearchKeyword())) {
cnd.where().andLike(page.getSearchName(), page.getSearchKeyword());
}
Sql sql = Sqls.create("""
SELECT
ps.*,
sm.`name` AS menuName,
GROUP_CONCAT(sr.`name`) AS roleNames
FROM
proposal_state ps
LEFT JOIN sys_menu sm ON sm.id = ps.menuId
LEFT JOIN sys_role_menu srm ON srm.menuId = sm.id
LEFT JOIN sys_role sr ON sr.id = srm.roleId
$condition
""");
cnd.asc("ps.stateCode");
cnd.groupBy("ps.id");
sql.setCondition(cnd);
List<NutMap> list = proposalStateService.listMap(sql);
List<ProposalState> proposalStateList = Lang.collection2list(list, ProposalState.class);
//^prevState|nextState$
List<ProposalState> nutMapList = proposalStateService.dao().fetchLinks(proposalStateList, null);
Pagination pagination = new Pagination();
pagination.setList(nutMapList);
return pagination;
}
@At
@ViReturn
@Aop(TransAop.READ_COMMITTED)
@RequiresPermissions("proposal.basics.state")
public Object doHandler(ProposalState proposalState, HttpServletRequest request) {
if (isExist(proposalState.getId(), proposalState.getStateCode()) > 0) {
return Result.error("该编码已存在");
}
boolean nextIsNotNull = StrUtil.isNotBlank(proposalState.getNextId());
boolean prevIsNotNull = StrUtil.isNotBlank(proposalState.getPrevId());
//前置后置不规范
/*if (nextIsNotNull) {
if (proposalState.getStateCode() > proposalStateService.fetch(proposalState.getNextId()).getStateCode()) {
return Result.error("后置节点设置不规范");
}
}
if (prevIsNotNull) {
if (proposalState.getStateCode() < proposalStateService.fetch(proposalState.getPrevId()).getStateCode()) {
return Result.error("前置节点设置不规范");
}
}*/
if (nextIsNotNull) {
proposalStateService.update(Chain.make("prevId", proposalState.getId()), Cnd.where("id", "=", proposalState.getNextId()));
}
if (prevIsNotNull) {
proposalStateService.update(Chain.make("nextId", proposalState.getId()), Cnd.where("id", "=", proposalState.getPrevId()));
}
if (StrUtil.isNotBlank(proposalState.getId())) {
proposalStateService.updateIgnoreNull(proposalState);
} else {
proposalStateService.insert(proposalState);
}
if (StrUtil.isNotBlank(proposalState.getMenuId())) {
SysMenuController menuControllerBean = Mvcs.getIoc().get(SysMenuController.class);
String invokeMethodName = proposalState.getIsEnable() ? "enable" : "disable";
try {
Class<?> menuClass = Class.forName("io.v.nutz.sys.controllers.platform.sys.SysMenuController");
Method enableMethod = menuClass.getMethod(invokeMethodName, String.class, HttpServletRequest.class);
io.v.nutz.base.result.Result invoke = (io.v.nutz.base.result.Result) enableMethod.invoke(menuControllerBean, proposalState.getMenuId(), request);
} catch (Exception e) {
log.error("菜单{}失败{}", invokeMethodName, e.getMessage());
}
}
return null;
}
@At
@ViReturn
@Aop(TransAop.READ_COMMITTED)
@RequiresPermissions("proposal.basics.state")
public Object doEdit(@Param("data") ProposalState proposalState, HttpServletRequest request) {
if (isExist(proposalState.getId(), proposalState.getStateCode()) > 0) {
return Result.error("该编码已存在");
}
boolean nextIsNotNull = StrUtil.isNotBlank(proposalState.getNextId());
boolean prevIsNotNull = StrUtil.isNotBlank(proposalState.getPrevId());
//前置后置不规范
/*if (nextIsNotNull) {
if (proposalState.getStateCode() > proposalStateService.fetch(proposalState.getNextId()).getStateCode()) {
return Result.error("后置节点设置不规范");
}
}
if (prevIsNotNull) {
if (proposalState.getStateCode() < proposalStateService.fetch(proposalState.getPrevId()).getStateCode()) {
return Result.error("前置节点设置不规范");
}
}*/
if (nextIsNotNull) {
proposalStateService.update(Chain.make("prevId", proposalState.getId()), Cnd.where("id", "=", proposalState.getNextId()));
}
if (prevIsNotNull) {
proposalStateService.update(Chain.make("nextId", proposalState.getId()), Cnd.where("id", "=", proposalState.getPrevId()));
}
proposalStateService.updateIgnoreNull(proposalState);
if (StrUtil.isNotBlank(proposalState.getMenuId())) {
SysMenuController menuControllerBean = Mvcs.getIoc().get(SysMenuController.class);
String invokeMethodName = proposalState.getIsEnable() ? "enable" : "disable";
try {
Class<?> menuClass = Class.forName("io.v.nutz.sys.controllers.platform.sys.SysMenuController");
Method enableMethod = menuClass.getMethod(invokeMethodName, String.class, HttpServletRequest.class);
io.v.nutz.base.result.Result invoke = (io.v.nutz.base.result.Result) enableMethod.invoke(menuControllerBean, proposalState.getMenuId(), request);
} catch (Exception e) {
log.error("菜单{}失败{}", invokeMethodName, e.getMessage());
}
}
return null;
}
@At
@ViReturn
@RequiresPermissions("proposal.basics.state")
public Object doDelete(String id) {
proposalStateService.delete(id);
return null;
}
@At
@ViReturn
@RequiresPermissions("proposal.basics.state")
public Object listAll() {
return proposalStateService.query(Cnd.NEW().asc("stateCode"));
}
@At
@ViReturn
@RequiresPermissions("proposal.basics.state")
public Object menuInProposal() {
//fc145e23cd0348d1a0d3265b1c01dbd2 提案办理菜单id 会变吗?(●'◡'●)
Sql sql = Sqls.create("""
SELECT
id,`name`
FROM
`sys_menu`
WHERE
parentId in ('fc145e23cd0348d1a0d3265b1c01dbd2','6483cd92c0804424993909f89ab3af12')
AND disabled is false
ORDER BY
location ASC
""");
// AND id NOT IN ( SELECT menuId FROM proposal_state WHERE menuId IS NOT NULL )
return proposalStateService.listMap(sql);
}
private Integer isExist(String id, Integer stateCode) {
return proposalStateService.count(Cnd.where("stateCode", "=", stateCode).andNot("id", "=", id));
}
}
@@ -0,0 +1,68 @@
package io.v.nutz.zhgh.proposal.controller.basics;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.models.ProposalType;
import io.v.nutz.base.service.ViService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Cnd;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
/**
* @author: Aaron
* @create: 2021-01-21 16:03
* @description: 提案类型
**/
@At("/platform/proposal/basics/type")
@Ok("json:full")
@IocBean
public class ProposalTypeController {
@Inject("ProposalType")
private ViService<ProposalType> proposalTypeService;
@At("")
@Ok("beetl:/platform/proposal/basics/type.html")
@RequiresPermissions("proposal.basics.type")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.basics.type")
public Object pageData(PageForm page) {
Cnd cnd = Cnd.NEW();
if (Strings.isNotBlank(page.getSearchName()) && Strings.isNotBlank(page.getSearchKeyword())) {
cnd.where().andLike(page.getSearchName(), page.getSearchKeyword());
}
cnd.asc("typeCode");
return proposalTypeService.listPage(page.getPageNumber(), page.getPageSize(), cnd);
}
@At
@ViReturn
@RequiresPermissions("proposal.basics.type")
public Object doAdd(@Param("proposalType") ProposalType proposalType) {
return proposalTypeService.insert(proposalType);
}
@At
@ViReturn
@RequiresPermissions("proposal.basics.type")
public Object doEdit(@Param("proposalType") ProposalType proposalType) {
return proposalTypeService.updateIgnoreNull(proposalType);
}
@At
@ViReturn
@RequiresPermissions("proposal.basics.type")
public Object doDelete(String id) {
return proposalTypeService.delete(id);
}
}
@@ -0,0 +1,306 @@
package io.v.nutz.zhgh.proposal.controller.basics;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.base.Result;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.Roles;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.models.ProposalConfig;
import io.v.nutz.zhgh.proposal.models.ProposalUndertake;
import io.v.nutz.base.service.ViService;
import io.v.nutz.sys.models.Sys_unit;
import io.v.nutz.sys.models.Sys_user_role;
import io.v.nutz.sys.services.SysRoleService;
import io.v.nutz.sys.services.SysUnitService;
import io.v.nutz.sys.services.SysUserRoleService;
import io.v.nutz.sys.services.SysUserService;
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.entity.Record;
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.Strings;
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 java.util.List;
/**
* @author: Aaron
* @create: 2021-01-22 15:19
* @description: 承办单位管理
**/
@At("/platform/proposal/basics/undertake")
@Ok("json:full")
@IocBean
public class ProposalUndertakeController {
@Inject
private Dao dao;
@Inject
private SysUserService sysUserService;
@Inject
private SysRoleService sysRoleService;
@Inject
private SysUserRoleService sysUserRoleService;
@Inject
private SysUnitService sysUnitService;
@Inject("ProposalUndertake")
private ViService<ProposalUndertake> proposalUndertakeService;
@At("")
@Ok("beetl:/platform/proposal/basics/undertake.html")
@RequiresPermissions("proposal.basics.undertake")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.basics.undertake")
public Object undertakeUnitTree() {
NutMap nutMap = new NutMap();
nutMap.setv("unitName", "提案承办单位");
nutMap.setv("childrens", proposalUndertakeService.query(Cnd.orderBy().desc("isEnable").asc("unitCode")));
return nutMap;
}
@At
@ViReturn
@RequiresPermissions("proposal.basics.undertake")
public Object pageData(PageForm page, @Param(value = "unitName", required = false) String unitName) {
Sql sql = Sqls.create("""
SELECT
un.*,
GROUP_CONCAT(DISTINCT su_principal.username,'(',IFNULL(su_principal.mobile,'暂无'),')') AS principal,
GROUP_CONCAT(DISTINCT su_leader.username,'(',IFNULL(su_leader.mobile,'暂无'),')') AS leader
FROM
proposal_undertake un
LEFT JOIN
sys_user_role sur_principal ON sur_principal.cbdwid = un.id AND sur_principal.roleId = '2b17b5d68c754914b4637dddb66ea4ed'
LEFT JOIN
sys_user su_principal ON sur_principal.userId = su_principal.id
LEFT JOIN
sys_user_role sur_leader ON sur_leader.cbdwid = un.id AND sur_leader.roleId = '153cba3fb88b4c88b7c1002f0eb63749'
LEFT JOIN
sys_user su_leader ON sur_leader.userId = su_leader.id
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.groupBy("un.id");
if (Strings.isNotBlank(unitName)) {
cnd.where().andLike("un.unitName", unitName);
}
if (StrUtil.isAllNotBlank(page.getPageOrderName(), page.getPageOrderBy())) {
cnd.orderBy(page.getPageOrderName(), page.getPageOrderBy());
} else {
cnd.desc("isEnable").asc("un.unitCode");
}
sql.setCondition(cnd);
return sysUnitService.listPageMap(page.getPageNumber(), page.getPageSize(), sql);
}
@At
@ViReturn
@RequiresPermissions("proposal.basics.undertake")
public Object adminPageData(@Param(value = "id", required = false) String id, Boolean flag) {
return findAdmin(id, flag);
}
@At
@ViReturn
@RequiresPermissions("proposal.basics.undertake")
public Object doAdd(@Param("data") ProposalUndertake undertake) {
if (isExist(undertake.getId(), undertake.getUnitCode()) > 0) {
return Result.error("该编码已存在");
}
proposalUndertakeService.insert(undertake);
return null;
}
@At
@ViReturn
@RequiresPermissions("proposal.basics.undertake")
public Object doEdit(@Param("data") ProposalUndertake undertake) {
if (isExist(undertake.getId(), undertake.getUnitCode()) > 0) {
return Result.error("该编码已存在");
}
proposalUndertakeService.updateIgnoreNull(undertake);
return null;
}
private Integer isExist(String id, String state_code) {
return proposalUndertakeService.count(Cnd.where("unitCode", "=", state_code).andNot("id", "=", id));
}
@At
@ViReturn
@RequiresPermissions("proposal.basics.undertake")
public Object doDelete(String id) {
if (sysUserRoleService.count(Cnd.where("cbdwid", "=", id)) > 0) {
return Result.error("该单位下还存在管理员,请移除后再删除");
}
proposalUndertakeService.delete(id);
return null;
}
/**
* 查询该单位下所有用户以及负责人或校领导
*
* @param id 承办单位id
* @param unitCode 承办单位编码
* @param flag false-负责人,true-校领导,
* @return
*/
@At
@ViReturn
@RequiresPermissions("proposal.basics.undertake")
public Object findUserAndAdmin(String id, String unitCode, Boolean flag) {
ProposalConfig config = dao.fetch(ProposalConfig.class);
String schoolLeaderUnitCode = config.getSchoolLeaderUnitCode();
unitCode = flag ? schoolLeaderUnitCode : unitCode;
Sql user = Sqls.create("""
SELECT
su.id,
su.username,
CONCAT( su.username, '', su.loginname, '', '- ', un.`name` ) `name`
FROM
sys_user su
LEFT JOIN sys_unit un ON un.id = su.unitid
WHERE
su.unitid = @unitId
""").setParam("unitId", unitCode);
return Record.create().set("data", sysUserService.list(user)).set("value", findAdmin(id, flag));
}
/**
* 设置负责人或者校领导
*
* @param adminValue 用户ID
* @param unitId 单位ID
* @param flag false-负责人,true-校领导
* @return
*/
@At
@ViReturn
@RequiresPermissions("proposal.basics.undertake")
@Aop(TransAop.READ_COMMITTED)
public Object setAdmin(@Param(value = "adminValue", required = false) String[] adminValue, String unitId, Boolean flag) {
sysUserRoleService.clear(Cnd.where("cbdwid", "=", unitId).and("roleId", "=", flag ? Roles.IN_CHARGE_LEADER : Roles.CONTRACTOR_PERSON));
if (!flag) {
sysUserRoleService.clear(Cnd.where("roleId", "=", Roles.UNIT_MANGER).and("userId", "in", adminValue));
}
for (String userId : adminValue) {
Sys_user_role sysUserRole = new Sys_user_role();
sysUserRole.setUserId(userId);
sysUserRole.setCbdwid(unitId);
sysUserRole.setRoleId(flag ? Roles.IN_CHARGE_LEADER : Roles.CONTRACTOR_PERSON);
sysUserRoleService.insert(sysUserRole);
}
//还需增加二级单位负责人的角色
if (!flag) {
ProposalUndertake proposalUndertake = dao.fetch(ProposalUndertake.class, unitId);
for (String userId : adminValue) {
Sys_user_role sysUserRole = new Sys_user_role();
sysUserRole.setUserId(userId);
sysUserRole.setRoleId(Roles.UNIT_MANGER);
sysUserRole.setUnitid(proposalUndertake.getUnitCode());
sysUserRoleService.insert(sysUserRole);
}
}
sysUserService.clearCache();
sysRoleService.clearCache();
return null;
}
/**
* 移除负责人或者校领导
*
* @param unitId 承办单位id
* @param userId 用户id
* @param roleId 角色id
* @return
*/
@At
@ViReturn
@RequiresPermissions("proposal.basics.undertake")
@Aop(TransAop.READ_COMMITTED)
public Object removeAdmin(String unitId, String userId, String roleId) {
sysUserRoleService.clear(Cnd.where("cbdwid", "=", unitId).and("userId", "=", userId).and("roleId", "=", roleId));
if (roleId.equals(Roles.CONTRACTOR_PERSON)) {
sysUserRoleService.clear(Cnd.where("userId", "=", userId).and("roleId", "=", Roles.UNIT_MANGER));
}
sysUserService.clearCache();
sysRoleService.clearCache();
return null;
}
/**
* 查询所有二级单位设置为承办单位
*
* @return
*/
@At
@ViReturn
@RequiresPermissions("proposal.basics.undertake")
public void setUndertake() {
if (proposalUndertakeService.count() == 0) {
List<Sys_unit> unitLevel2 = sysUnitService.query(Cnd.where("unitlevel", "=", 2).and("parentId", "IS NOT", null).asc("unitcode"));
unitLevel2.forEach(v -> {
ProposalUndertake undertake = new ProposalUndertake();
undertake.setIsEnable(Boolean.TRUE);
undertake.setUnitCode(v.getUnitcode());
undertake.setUnitName(v.getName());
proposalUndertakeService.insert(undertake);
});
}
}
/**
* 查询负责人或者分管校领导
*
* @param id 承办单位id
* @param flag false-负责人,true-校领导,
* @return
*/
private List<Record> findAdmin(String id, Boolean flag) {
CndPlus cnd = CndPlus.create();
Sql sql = Sqls.create("""
SELECT
su.id,
su.username,
su.loginname,
su.sex,
su.mobile,
sur.roleId
FROM
sys_user su
LEFT JOIN sys_user_role sur ON sur.userId = su.id
LEFT JOIN proposal_undertake pun ON pun.id = sur.cbdwid
$condition
""");
cnd.andEx("sur.cbdwid", "=", id);
cnd.andEx("sur.roleId", "=", flag ? Roles.IN_CHARGE_LEADER : Roles.CONTRACTOR_PERSON);
sql.setCondition(cnd);
return sysUserService.list(sql);
}
}
@@ -0,0 +1,373 @@
package io.v.nutz.zhgh.proposal.controller.common;
import cn.hutool.core.util.StrUtil;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.Roles;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.ProposalReplyConfig;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.zhgh.proposal.services.ProposalProcessService;
import io.v.nutz.zhgh.proposal.services.ProposalReplyService;
import io.v.nutz.sys.models.Sys_user_role;
import io.v.nutz.web.commons.utils.ShiroUtil;
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.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;
/**
* @author: Aaron
* @create: 2021-02-04 16:54
* @description: 提案代办事项
**/
@IocBean
@Ok("json:full")
@At("/platform/proposal/agent")
public class ProposalAgentController {
@Inject
private Vi vi;
@Inject
private Dao dao;
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalReplyService proposalReplyService;
private static final String COMPOSEURL = "/platform/proposal/transact/compose";
private static final String SECONDEDURL = "/platform/proposal/transact/seconded";
private static final String DELEGATIONURL = "/platform/proposal/transact/delegation";
private static final String SECRETARYURL = "/platform/proposal/transact/secretary";
private static final String OPINIONSURL = "/platform/proposal/transact/case/opinions";
private static final String CASEURL = "/platform/proposal/transact/case/case";
private static final String CASEUNIT = "/platform/proposal/transact/caseUnit";
private static final String MAKEURL = "/platform/proposal/transact/make";
private static final String INSTRUCTIONSURL = "/platform/proposal/transact/leader/leaderAudit";
private static final String REPLYURL = "/platform/proposal/transact/reply";
private static final String LEADERAUDITURL = "/platform/proposal/transact/leader/audit";
private static final String COMMITTEEURL = "/platform/proposal/transact/committee";
private static final String FEEDBACKURL = "/platform/proposal/transact/feedback";
private static final String SECONDREPLYURL = "/platform/proposal/senior/second";
private static final String CASECHECK = "/platform/proposal/transact/caseCheck";
private static final String EXECUTORREAD = "/platform/proposal/transact/executorRead";
private static final String BRANCHLEADERREAD = "/platform/proposal/transact/branchLeaderRead";
private static final String PRINCIPALREAD = "/platform/proposal/transact/principalRead";
@At
@ViReturn
public Object getAgenda() {
// final String title = "【提案管理系统】";
// boolean executorReadIsNode = proposalProcessService.isNode(ProposalState.EXECUTORREAD);
// boolean branchLeaderReadIsNode = proposalProcessService.isNode(ProposalState.BRANCHLEADERREAD);
// boolean principalReadIsNode = proposalProcessService.isNode(ProposalState.PRINCIPALREAD);
// List<NutMap> result = new ArrayList<>();
// result.add(new NutMap().setv("title", title).setv("url", SECONDEDURL).setv("iconClass", vi.getIconByPath(SECONDEDURL)).setv("label", "待附议提案").setv("number", getSecondedCount()));
// result.add(new NutMap().setv("title", title).setv("url", DELEGATIONURL).setv("iconClass", vi.getIconByPath(DELEGATIONURL)).setv("label", "待团长审核").setv("number", getDelegationCount()));
//// result.add(new NutMap().setv("title", title).setv("url", SECRETARYURL).setv("iconClass", vi.getIconByPath(SECRETARYURL)).setv("label", "待秘书处审核").setv("number", getSecretaryCount()));
// result.add(new NutMap().setv("title", title).setv("url", CASEURL).setv("iconClass", vi.getIconByPath(CASEURL)).setv("label", "待立案审核").setv("number", getCaseCount()));
// if (executorReadIsNode) {
// result.add(new NutMap().setv("title", title).setv("url", EXECUTORREAD).setv("iconClass", vi.getIconByPath(EXECUTORREAD)).setv("label", "待执委会审核").setv("number", getExecutorReadCount()));
// }
// if (branchLeaderReadIsNode) {
// result.add(new NutMap().setv("title", title).setv("url", BRANCHLEADERREAD).setv("iconClass", vi.getIconByPath(BRANCHLEADERREAD)).setv("label", "待领导审批立案").setv("number", getBranchLeaderReadCount()));
// }
// if (principalReadIsNode) {
// result.add(new NutMap().setv("title", title).setv("url", PRINCIPALREAD).setv("iconClass", vi.getIconByPath(PRINCIPALREAD)).setv("label", "待校长、书记审阅").setv("number", getPrincipalReadIsNodeCount()));
// }
// result.add(new NutMap().setv("title", title).setv("url", CASEUNIT).setv("iconClass", vi.getIconByPath(CASEUNIT)).setv("label", "待确认承办单位").setv("number", getCaseUnitCount()));
// result.add(new NutMap().setv("title", title).setv("url", REPLYURL).setv("iconClass", vi.getIconByPath(REPLYURL)).setv("label", "待承办单位答复").setv("number", getReplyCount()));
// result.add(new NutMap().setv("title", title).setv("url", INSTRUCTIONSURL).setv("iconClass", vi.getIconByPath(INSTRUCTIONSURL)).setv("label", "待领导审批办理").setv("number", getLeaderAuditCount()));
// result.add(new NutMap().setv("title", title).setv("url", CASECHECK).setv("iconClass", vi.getIconByPath(CASECHECK)).setv("label", "待提案委员会审查").setv("number", getCaseCheckCount()));
// result.add(new NutMap().setv("title", title).setv("url", FEEDBACKURL).setv("iconClass", vi.getIconByPath(FEEDBACKURL)).setv("label", "待反馈评分").setv("number", getFeedbackCount()));
//
// Sys_user user = (Sys_user) ShiroUtil.getPrincipal();
// List<Sys_menu> menus = Optional.ofNullable(user).orElse(new Sys_user()).getMenus();
// List<NutMap> collect = result.stream().filter(v -> Strings.isNotBlank(v.getString("url")) && menus.stream().anyMatch(x -> Strings.isNotBlank(x.getHref()) && v.getString("url").equals(x.getHref()))).distinct().collect(Collectors.toList());
// return collect;
return null;
}
/**
* 分管校领导审批
*
* @return
*/
private Integer getBranchLeaderReadCount() {
// Sql sql = Sqls.create("""
// SELECT
// COUNT(1)
// FROM
// proposal_branch_leader_audit pbla
// LEFT JOIN `proposal_info` info ON pbla.proposalId = info.id
// LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
// $condition
// """);
// Cnd cnd = Cnd.NEW();
// if (!io.v.nutz.web.commons.utils.ShiroUtil.hasRole("sysadmin")) {
// cnd.and(new Static("pbla.underTakeId IN (SELECT cbdwid FROM sys_user_role WHERE userid = '%s' AND roleid = '%s')"
// .formatted(io.v.nutz.web.commons.utils.ShiroUtil.getPrincipalProperty("id"), Roles.IN_CHARGE_LEADER)));
// }
// cnd.and("pbla.auditId", "is", null);
// cnd.and("jdh.id", "=", getJdhId());
// cnd.and("info.stateCode", "=", ProposalState.BRANCHLEADERREAD);
// sql.setCondition(cnd);
// return proposalInfoService.count(sql);
return null;
}
/**
* 待附议数量
*
* @return 数量
*/
private Integer getSecondedCount() {
String userId = ShiroUtil.getPrincipalProperty("id").toString();
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
count( 1 )
FROM
proposal_seconded ps
LEFT JOIN proposal_info info ON ps.proposalId = info.id
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
$condition
""");
if (!ShiroUtil.hasAnyRoles("sysadmin, tamange")) {
cnd.and("ps.seconderId", "=", userId);
}
cnd.and("jdh.id", "=", getJdhId());
cnd.and("info.stateCode", ">=", ProposalState.UNSUBMIT);
cnd.and("ps.isAgree", "IS", null);
sql.setCondition(cnd);
return proposalInfoService.count(sql);
}
/**
* 待团长审核
*
* @return 数量
*/
private Integer getDelegationCount() {
Cnd cnd = Cnd.NEW();
if (!ShiroUtil.hasAnyRoles("sysadmin, tamange")) {
List<Sys_user_role> roleList = dao.query(Sys_user_role.class, Cnd.where("roleid", "=", Roles.DBT_TZ).and("userId", "=", ShiroUtil.getPrincipalProperty("id")));
List<String> dbtIdList = roleList.stream().filter(v -> StrUtil.isNotBlank(v.getDbtid())).map(v -> v.getDbtid()).collect(Collectors.toList());
cnd.and("info.delegationId", "in", dbtIdList);
}
return getProposalCount(ProposalState.DELEGATION, cnd);
}
/**
* 待秘书处审核
*
* @return 数量
*/
private Integer getSecretaryCount() {
return 0;
// return proposalInfoService.count(Cnd.where("stateCode", "=", ProposalState.SECRETARIAT));
}
/**
* 待立案审核
*
* @return 数量
*/
private Integer getCaseCount() {
return getProposalCount(ProposalState.CASE, Cnd.NEW());
}
/**
* 待立案审核
*
* @return 数量
*/
private Integer getCaseUnitCount() {
return getProposalCount(ProposalState.CASEUNIT, Cnd.NEW());
}
private Integer getLeaderAuditCount() {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
COUNT(*)
FROM
proposal_reply pr
LEFT JOIN proposal_info info ON info.id = pr.proposalId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
$condition
""");
if (!ShiroUtil.hasAnyRoles("sysadmin, tamange,A06")) {
if (ShiroUtil.hasAnyRoles("T04")) {
List<Sys_user_role> userRoles = proposalInfoService.dao().query(Sys_user_role.class, Cnd.where("userId", "=", ShiroUtil.getUserId()).and("roleId", "=", Roles.IN_CHARGE_LEADER));
List<String> collect = userRoles.stream().filter(v -> StrUtil.isNotBlank(v.getCbdwid())).map(Sys_user_role::getCbdwid).collect(Collectors.toList());
cnd.and("pr.replyUnitId", "IN", collect);
}
}
cnd.and("jdh.id", "=", getJdhId());
cnd.and("info.resultCode", "=", ProposalConstant.DETERMINE);
// cnd.and("info.stateCode", "=", ProposalState.LEADERAUDIT);
cnd.and("pr.isLeaderAudit", "=", 0);
sql.setCondition(cnd);
return proposalInfoService.count(sql);
}
/**
* 根据code获取承办中审核的代办数量
*
* @param code 提案状态码
* @return 数量
*/
private Integer getUndertakingCount(Integer code) {
String userId = ShiroUtil.getPrincipalProperty("id").toString();
String role = null;
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
count( 1 )
FROM
proposal_relation_undertake pru
LEFT JOIN proposal_info info ON pru.proposalId = info.id
$condition
""");
cnd.and("info.stateCode", "=", code);
cnd.and("pru.delFlag", "=", false);
if (!ShiroUtil.hasAnyRoles("sysadmin, tamange,jdh10")) {
cnd.and("undertakeId", "IN", Sqls.create("SELECT cbdwid FROM sys_user_role sur LEFT JOIN proposal_info info ON info.teacherMeetingId = sur.jdhid WHERE sur.roleId = '" + role + "' AND sur.userId = '" + userId + "'"));
}
sql.setCondition(cnd);
return proposalInfoService.count(sql);
}
@Inject
private ProposalProcessService proposalProcessService;
/**
* 获取待答复数量
*
* @return 数量
*/
private Integer getReplyCount() {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
COUNT(*)
FROM
proposal_reply pr
LEFT JOIN proposal_info info ON info.id = pr.proposalId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
$condition
""");
ProposalReplyConfig slaveUnitConfig = proposalProcessService.getProposalConfig().getSlaveUnitConfig();
if (!slaveUnitConfig.getIsNeedReply()) {
cnd.and("pr.underTakeType", "=", 1);
}
cnd.and("info.stateCode", "=", ProposalState.UNITREPLY);
if (!ShiroUtil.hasAnyRoles("sysadmin, tamange,A06")) {
if (ShiroUtil.hasAnyRoles("T01")) {
List<Sys_user_role> userRoles = proposalInfoService.dao().query(Sys_user_role.class, Cnd.where("userId", "=", ShiroUtil.getUserId()).and("roleId", "=", Roles.CONTRACTOR_PERSON));
cnd.and("pr.replyUnitId", "IN", userRoles.stream().filter(v -> StrUtil.isNotBlank(v.getCbdwid())).map(Sys_user_role::getCbdwid).collect(Collectors.toList()));
}
//自己管的承办单位
List<String> manageUnderTakeIds = proposalProcessService.getUnderTakeId(ShiroUtil.getUserId(), Roles.CONTRACTOR_PERSON);
//分配答复的记录id
List<String> proxyReplyIds = proposalReplyService.getReplyIdList((String) ShiroUtil.getPrincipalProperty("id"));
if (ShiroUtil.hasRole("T01") && ShiroUtil.hasRole("proxyT01")) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("pr.replyUnitId", "in", manageUnderTakeIds);
seg.or("pr.id", "in", proxyReplyIds);
cnd.and(seg);
} else if (ShiroUtil.hasRole("T01")) {
cnd.and("pr.replyUnitId", "in", manageUnderTakeIds);
} else if (ShiroUtil.hasRole("proxyT01")) {
cnd.and("pr.id", "in", proxyReplyIds);
}
}
cnd.and("jdh.id", "=", getJdhId());
cnd.and("pr.isReply", "=", 0);
sql.setCondition(cnd);
return proposalInfoService.count(sql);
}
/**
* 待反馈评分数量
*
* @return 数量
*/
private Integer getFeedbackCount() {
String userId = ShiroUtil.getPrincipalProperty("id").toString();
Cnd cnd = Cnd.NEW();
if (!ShiroUtil.hasAnyRoles("sysadmin")) {
cnd.and("createUser", "=", userId);
}
return getProposalCount(ProposalState.FEEDBACKSCORE, cnd);
}
/**
* 待确认是否需要二次答复
*
* @return 数量
*/
private Integer getSecondReplyCount() {
return null;
// return proposalInfoService.count(Cnd.where("stateCode", "=", ProposalState.HAS_SECOND_REPLY));
}
/**
* 根据条件查询
*
* @param proposalState
* @param cnd
* @return
*/
private Integer getProposalCount(Integer proposalState, Cnd cnd) {
Sql sql = Sqls.create("""
SELECT
count( 1 )
FROM
proposal_info info
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
$condition
""");
cnd.and("jdh.id", "=", getJdhId());
cnd.and("info.stateCode", "=", proposalState);
sql.setCondition(cnd);
return proposalInfoService.count(sql);
}
private String getJdhId() {
return vi.getLastTeacherMeetingId();
// return proposalInfoService.list(Sqls.create("SELECT MAX(`jdhkqsj`) AS jdhkqsj,id FROM `jdh_jdhxx` where jdhkqzt is true ")).get(0).getString("id");
}
}
@@ -0,0 +1,648 @@
package io.v.nutz.zhgh.proposal.controller.common;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.base.Result;
import cn.wizzer.framework.base.service.BaseService;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.zhgh.jdh.model.cb.Jdh_jdhxx;
import io.v.nutz.zhgh.jdh.model.db.Jdh_db;
import io.v.nutz.zhgh.jdh.model.zzjg.Jdh_dbt;
import io.v.nutz.zhgh.jdh.model.zzjg.Jdh_jgsz;
import io.v.nutz.zhgh.proposal.constants.ProposalStateDirectionEnum;
import io.v.nutz.zhgh.proposal.models.ProposalConfig;
import io.v.nutz.zhgh.proposal.models.ProposalReply;
import io.v.nutz.zhgh.proposal.models.ProposalType;
import io.v.nutz.zhgh.proposal.models.ProposalUndertake;
import io.v.nutz.zhgh.proposal.services.ProposalCommonService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.zhgh.proposal.services.ProposalProcessService;
import io.v.nutz.zhgh.proposal.services.ProposalReplyService;
import io.v.nutz.base.service.ViService;
import io.v.nutz.sys.models.Sys_dict;
import io.v.nutz.sys.services.SysDictService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
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.Daos;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.GET;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
/**
* @author: Aaron
* @create: 2021-01-22 11:16
* @description: 提案公共部分
**/
@At("/platform/proposal/common")
@Ok("json:full")
@IocBean
public class ProposalCommonController {
@Inject
private Dao dao;
@Inject
private BaseService baseService;
@Inject
private SysDictService sysDictService;
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalReplyService replyService;
@Inject
private ProposalProcessService proposalProcessService;
@Inject("ProposalReply")
private ViService<ProposalReply> proposalReplyService;
@Inject("ProposalUndertake")
private ViService<ProposalUndertake> proposalUndertakeService;
@Inject
private ProposalCommonService proposalCommonService;
/**
* 根据code获取字典选项
*
* @param code 字典编码
* @return
*/
@At
@ViReturn
public Object getDictByCode(String code) {
Sys_dict dict = sysDictService.fetch(Cnd.where("code", "=", code));
return dict == null ? new ArrayList<>() : sysDictService.query(Cnd.where("parentId", "=", Strings.sNull(dict.getId())).and("disabled", "=", false).asc("location"));
}
/**
* 获取提案类型
*
* @return
*/
@At
@ViReturn
public Object getProposalType() {
return baseService.dao().query(ProposalType.class, Cnd.orderBy().asc("typeCode"));
}
/**
* 获取提案状态
*
* @return
*/
@At
@ViReturn
public Object getProposalState(Integer stateCode) {
CndPlus cnd = CndPlus.create();
cnd.andEx("stateCode", "=", stateCode);
cnd.asc("stateCode");
return baseService.dao().query(io.v.nutz.zhgh.proposal.models.ProposalState.class, cnd);
}
/**
* 获取全部开启的提案状态
*
* @return
*/
@At
@ViReturn
public Object getOpenProposalState() {
CndPlus cnd = CndPlus.create();
cnd.and("isEnable", "=", true);
cnd.asc("stateCode");
return baseService.dao().query(io.v.nutz.zhgh.proposal.models.ProposalState.class, cnd);
}
/**
* 根据教代会获取当前登录用户的代表团
*
* @param meetingId 教代会ID
* @return
*/
@At
@ViReturn
public Object getUserDelegationId(String meetingId) {
List<Jdh_db> dbs = baseService.dao().query(Jdh_db.class, Cnd.where("jdhid", "=", meetingId).and("dbid", "=", ShiroUtil.getPrincipalProperty("id")));
return dbs.isEmpty() ? null : dbs.get(0);
}
/**
* 获取提案配置
*
* @return
*/
@At
@ViReturn
public Object getProposalConfig() {
return dao.fetchLinks(dao.fetch(ProposalConfig.class), null);
}
/**
* 获取所有开启的承办单位
*
* @return
*/
@At
@ViReturn
public Object getProposalUndertake() {
return baseService.dao().query(ProposalUndertake.class, Cnd.where("isEnable", "=", true).desc("isEnable").asc("unitCode"));
}
/**
* 按教代会届次获取承办单位
*
* @return
*/
@At
@ViReturn
public Object getUndertakeByMeeting(String meetingId) {
Sql sql = Sqls.create("""
SELECT
pu.*
FROM
proposal_undertake pu
WHERE
pu.id IN (
SELECT DISTINCT
( pr.replyUnitId )
FROM
proposal_reply pr
WHERE
pr.undertakeType in (@underTakeType)
AND pr.proposalId IN ( SELECT id FROM proposal_info WHERE teacherMeetingId = @meetingId )
)
ORDER BY pu.unitCode
""");
sql.setParam("meetingId", meetingId);
ProposalConfig proposalConfig = proposalInfoService.dao().fetch(ProposalConfig.class, Cnd.NEW());
dao.fetchLinks(proposalConfig, "slaveUnitConfig");
if (proposalConfig.getSlaveUnitConfig() != null && proposalConfig.getSlaveUnitConfig().getIsNeedReply()) {
sql.setParam("underTakeType", new Integer[]{1, 2});
} else {
sql.setParam("underTakeType", new Integer[]{1});
}
return proposalInfoService.listMap(sql);
}
/**
* 根据教代会获取代表团(系统管理员、提案管理员、提案委员会主任、提案委员会委员看所有代表团,个人只查自己所在代表团)
*
* @param meetingId 教代会ID
* @return
*/
@At
@ViReturn
public Object getDelegation(String meetingId) {
List dbtList;
Cnd cnd = Cnd.NEW();
if (ShiroUtil.hasAnyRoles("sysadmin,tamange,jdh10,jdh12,xgh01,T04,gh03,unit_manger")) {
cnd.and("jdhid", "=", meetingId);
cnd.asc("code");
dbtList = baseService.dao().query(Jdh_dbt.class, cnd);
} else {
Sql sql = Sqls.create("""
SELECT
db.dbtid id,
dbt.dbtname
FROM
jdh_db db
LEFT JOIN jdh_dbt dbt ON dbt.id = db.dbtid
WHERE
db.dbid = @userId
AND db.jdhid = @meetingId
""").setParam("meetingId", meetingId).setParam("userId", ShiroUtil.getPrincipalProperty("id").toString());
dbtList = baseService.list(sql);
}
return dbtList;
}
/**
* 根据教代会获取委员会
*
* @param meetingId
* @return
*/
@At
@ViReturn
public Object getCommittee(String meetingId) {
Jdh_jgsz jgsz = baseService.dao().fetch(Jdh_jgsz.class, Cnd.where("mechanismcode", "=", "005"));
return baseService.dao().query(Jdh_jgsz.class, Cnd.where("parentId", "=", jgsz.getId()));
}
/**
* 获取代表可以操作的教代会
*
* @return
*/
@At
@ViReturn
public Object getJdhByDb() {
if (ShiroUtil.hasAnyRoles("sysadmin,tamange,jdh10,jdh12,xgh01")) {
return baseService.dao().query("jdh_jdhxx", Cnd.NEW().desc("jdhkqsj"));
} else {
Sql sql = Sqls.create("SELECT jdh.* FROM sys_user_role sur left join jdh_jdhxx jdh on sur.jdhid = jdh.id WHERE sur.userId = @userid AND jdh.id IS NOT NULL GROUP BY sur.jdhid ORDER BY jdh.jdhkqsj DESC").setParam("userid", ShiroUtil.getPrincipalProperty("id"));
return baseService.list(sql);
}
}
/**
* 获取开启的教代会(超管获取所有开启的教代会,代表只获取自己可以操作的教代会)
*
* @return
*/
@At
@ViReturn
public Object getOpenMeeting() {
if (ShiroUtil.hasAnyRoles("sysadmin,tamange,jdh10,jdh12,xgh01,T04,gh03,gh04,unit_manger")) {
return baseService.dao().query("jdh_jdhxx", Cnd.where("jdhkqzt", "=", 1).desc("jdhkqsj"));
} else {
Sql sql = Sqls.create("""
SELECT
jdh.*
FROM
sys_user_role sur
LEFT JOIN jdh_jdhxx jdh ON sur.jdhid = jdh.id
WHERE
sur.userId = @userId
AND jdh.jdhkqzt = 1
GROUP BY
sur.jdhid
ORDER BY
jdh.jdhkqsj DESC
""").setParam("userId", ShiroUtil.getPrincipalProperty("id").toString());
return baseService.list(sql);
}
}
/**
* 获取所有教代会
*
* @return
*/
@At
@ViReturn
public Object getAllMeeting() {
return baseService.dao().query(Jdh_jdhxx.class, Cnd.orderBy().desc("jdhkqsj"));
}
/**
* 查询该提案下的承办单位
*
* @param proposalId 提案ID
* @return
*/
@At
@ViReturn
public Object findOrganizer(String proposalId) {
Sql sql = Sqls.create("""
SELECT
pr.*,
pu.unitName
FROM
proposal_reply pr
LEFT JOIN proposal_undertake pu ON pu.id = pr.replyUnitId
WHERE
pr.proposalId = @proposalId
ORDER BY
pr.undertakeType
""").setParam("proposalId", proposalId);
return proposalInfoService.listMap(sql);
}
/**
* 获取提案的详细信息
*
* @param id
* @return
*/
@At
@ViReturn
public Object getProposalInfo(String id) {
if (StrUtil.isBlank(id)) {
return Result.error("参数错误");
}
return proposalCommonService.findOne(id);
}
/**
* 承办单位初步意见
*
* @param proposalId
* @return
*/
@At
@ViReturn
private Object getUnderTakeFirstOpinion(String proposalId) {
Sql sql = Sqls.create("""
SELECT
putfo.opinion,
putfo.opionTime,
putfo.canTake,
pu.unitName AS underTakeName
FROM
proposal_under_take_first_opinion putfo
left join proposal_undertake pu on pu.id = putfo.underTakeId
WHERE
putfo.proposalId = @proposalId
""");
sql.setParam("proposalId", proposalId);
return proposalInfoService.listMap(sql);
}
/**
* 返回 多个 审核记录
*
* @param ids 多个id
* @return Object
*/
private Object getAuditRecords(String[] ids) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
pa.*,
sign.`data` auditSign ,
dict.`name` dictName
FROM
proposal_audit pa
LEFT JOIN sys_signature sign ON sign.id = pa.signId
LEFT JOIN sys_dict dict ON pa.other = dict.`code`
$condition
""");
cnd.where().andIn("pa.id", ids);
sql.setCondition(cnd);
return ids.length > 0 ? proposalReplyService.listMap(sql) : new ArrayList<>();
}
/**
* 返回 单个 审核记录
*
* @param id 审核id
* @return Object
*/
private Object getOneAuditRecord(String id) {
CndPlus cnd = CndPlus.create();
Sql sql = Sqls.create("""
SELECT
pa.*,
sign.`data` auditSign
FROM
proposal_audit pa
LEFT JOIN sys_signature sign ON sign.id = pa.signId
$condition
""");
cnd.and("pa.id", "=", id);
sql.setCondition(cnd);
return proposalReplyService.listMap(sql).isEmpty() ? null : proposalReplyService.listMap(sql).get(0);
}
/**
* 根据提案ID查询附议人
*
* @param proposalId 提案ID
* @return Object
*/
private Object getSeconded(String proposalId) {
Sql sql = Sqls.create("""
SELECT
u.username,
u.loginname,
u.unitname,
ps.isAgree,
ps.secondedTime,
ps.inviteTime,
ps.isAgree,
sign.`data` signData
FROM
proposal_seconded ps
LEFT JOIN `user` u ON ps.seconderId = u.id
LEFT JOIN sys_signature sign ON sign.id = ps.seconderSignId
WHERE
ps.proposalId = @proposalId
ORDER BY
ps.secondedTime
""").setParam("proposalId", proposalId);
List<NutMap> list = proposalInfoService.listMap(sql);
return proposalInfoService.listMap(sql).isEmpty() ? null : proposalInfoService.listMap(sql);
}
/**
* 获取该提案下的承办单位
*
* @param proposalId 提案ID
* @return Object
*/
private Object getUndertake(String proposalId) {
Sql sql = Sqls.create("""
SELECT
pr.*,
pu.unitName,
pr.undertakeType
FROM
proposal_reply pr
LEFT JOIN proposal_undertake pu ON pu.id = pr.replyUnitId
WHERE
pr.proposalId = @proposalId
GROUP BY
pu.unitName
ORDER BY
pr.undertakeType
""").setParam("proposalId", proposalId);
return proposalInfoService.listMap(sql).isEmpty() ? null : proposalInfoService.listMap(sql);
}
/**
* 反馈评分信息
*
* @param proposalId 提案id
* @return Object
*/
private Object getFeedback(String proposalId) {
Sql sql = Sqls.create("""
SELECT
pf.*,
su.username,
su.loginname,
dict.`name` feedbackResult,
sign.`data` scoreSign
FROM
proposal_feedback pf
LEFT JOIN sys_user su ON su.id = pf.feedbackPerson
LEFT JOIN sys_signature sign ON sign.id=pf.scoreSignId
LEFT JOIN sys_dict dict ON dict.`code` = pf.feedbackCode
WHERE
pf.proposalId = @proposalId
ORDER BY
pf.feedbackNumber DESC
""").setParam("proposalId", proposalId);
List<NutMap> map = proposalInfoService.listMap(sql);
map.forEach(v -> {
if (Strings.isNotBlank(v.getString("unsatisfiedUnit"))) {
String[] units = Json.fromJsonAsArray(String.class, v.getString("unsatisfiedUnit"));
v.setv("units", proposalUndertakeService.query(Cnd.where("id", "IN", units)));
} else {
v.setv("units", null);
}
});
return map.isEmpty() ? null : map;
}
@At
@ViReturn
public Object getProposalResultCode(String proposal_id) {
return proposalInfoService.fetch(Cnd.where("id", "=", proposal_id)).getResultCode();
}
@At
@ViReturn
public Object getProposalStateCode(String proposal_id) {
return proposalInfoService.fetch(Cnd.where("id", "=", proposal_id)).getStateCode();
}
/**
* 查询所有状态
*
* @return
* @see ProposalState
*/
@At
@ViReturn
public Object getProposalAllStateCode() {
try {
return Result.success().addData(proposalInfoService.getProposalAllStateCode());
} catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
e.printStackTrace();
return Result.error();
}
}
/**
* 查询开启的状态 关联前端查看组件
*
* @return
*/
@At
@ViReturn
@Ok("json")
public Object getProposalEnableStateCode() {
try {
return Result.success().addData(proposalInfoService.getProposalEnableStateCode());
} catch (Exception e) {
e.printStackTrace();
return Result.error();
}
}
/**
* 查询需要签字的状态
*
* @return
*/
@At
@ViReturn
@Ok("json")
public Object getProposalNeedSignStateCode() {
try {
return Result.success().addData(proposalInfoService.getProposalNeedSignStateCode());
} catch (Exception e) {
e.printStackTrace();
return Result.error();
}
}
/**
* 当前状态是否在流程节点上
* 必须开启 必须有前置节点
*
* @param stateCode
* @return
*/
@At
@ViReturn
@Ok("json")
public Object getProposalIsNodeState(@Param("stateCode") int stateCode) {
return proposalProcessService.isNode(stateCode);
}
@At
@ViReturn
@Ok("json")
public Object getProposalNextNode(@Param("stateCode") int stateCode) {
return proposalProcessService.getSomeNodeNextStateCode(stateCode, ProposalStateDirectionEnum.NEXT);
}
@At
@ViReturn
@Ok("json")
public Object getProposalPrevNode(@Param("stateCode") int stateCode) {
return proposalProcessService.getSomeNodeNextStateCode(stateCode, ProposalStateDirectionEnum.PREV);
}
/**
* 获取某个提案并案的其它提案 查询结果包括自己
*
* @param proposalId
* @return
*/
@At
@GET
@Ok("json:full")
@ViReturn
public Object findConjoinProposal(@Param("proposalId") String proposalId) {
List<String> conjoinIdList = proposalCommonService.findConjoin(proposalId);
Sql sql = Sqls.create("""
SELECT
info.id,
info.proposalName,
info.proposalCode,
u.username
FROM
proposal_info info
LEFT JOIN sys_user u ON u.id = info.createUser
WHERE info.id in (@ids)
""");
sql.setParam("ids", conjoinIdList);
return Daos.query(dao, sql.toString(), Sqls.callback.maps());
}
@At
@ViReturn
public Object getLeaderAuditJoinList(String replyUnitId, String proposalId) {
List<String> underTakeList = proposalCommonService.getUnderTakeByLeaderAndProId(replyUnitId, proposalId);
//3.查询出本提案所涉及到的承办单位在该校领导管辖内的
List<String> conjoinIdList = proposalCommonService.findConjoin(proposalId);
Sql sql = Sqls.create("""
SELECT pr.*,pu.unitName AS replyUnitName FROM proposal_reply pr LEFT JOIN proposal_undertake pu ON pu.id = pr.replyUnitId where pr.proposalId in (@proposalId) and pr.replyUnitId in (@replyUnitIdList)
""").setParam("proposalId", conjoinIdList).setParam("replyUnitIdList", underTakeList);
List<NutMap> leaderAuditList = proposalInfoService.listMap(sql);
return leaderAuditList;
}
}
@@ -0,0 +1,57 @@
package io.v.nutz.zhgh.proposal.controller.common;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.zhgh.proposal.models.ProposalSeconded;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.base.service.ViService;
import org.nutz.dao.Cnd;
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;
@IocBean
@At("/platform/proposal/task/common")
@Ok("json:full")
public class ProposalTaskCommonController {
@Inject
private ProposalInfoService proposalInfoService;
@Inject("ProposalSeconded")
private ViService<ProposalSeconded> proposalSecondedViService;
@At
@ViReturn
public Object isSeconded(String proposal_id,String id) {
int count = proposalSecondedViService.count(Cnd.where("proposalId", "=", proposal_id)
.and("id", "=", id)
.and("isAgree", "is", null));
return count;
}
@At
@ViReturn
public Object isDelegationAudit(String proposal_id) {
int count = proposalInfoService.count(Cnd.where("id", "=", proposal_id)
.and("delegationAuditId", "is", null));
return count;
}
@At
@ViReturn
public Object isSecretaryAudit(String proposal_id) {
int count = proposalInfoService.count(Cnd.where("id", "=", proposal_id)
.and("delegationAuditId", "is", null));
return count;
}
@At
@ViReturn
public Object isReplyOnUnderTake(String proposal_id,String undertake_id) {
return null;
}
}
@@ -0,0 +1,227 @@
package io.v.nutz.zhgh.proposal.controller.export;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.ProposalAudit;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalExportService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.base.utils.ViTool;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.json.Json;
import org.nutz.lang.Strings;
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.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author zhf
* @date 2022/1/26 9:57
* @description 导出立案
*/
@IocBean
@At("/platform/proposal/export/case")
@Ok("json:full")
public class ProposalExportCaseController {
@At("")
@Ok("beetl:/platform/proposal/export/case.html")
@RequiresPermissions("proposal.export.case")
public void index() {
}
@Inject
private Vi vi;
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalExportService proposalExportService;
private static final String SQL = """
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
dbt.`code` delegationCode,
manner.`name` mannerName,
result.`name` resultName,
zbpu.unitName pruMaster,
zbpu.unitCode pruMasterCode,
GROUP_CONCAT( xbpu.unitName ) pruSlave
FROM
proposal_info info
LEFT JOIN sys_user su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
LEFT JOIN proposal_reply zbpr ON zbpr.proposalId = info.id AND zbpr.undertakeType = 1
LEFT JOIN proposal_undertake zbpu ON zbpu.id = zbpr.replyUnitId
LEFT JOIN proposal_reply xbpr ON xbpr.proposalId = info.id AND xbpr.undertakeType = 2
LEFT JOIN proposal_underTake xbpu ON xbpu.id = xbpr.replyUnitId
$condition
""";
@At
@ViReturn
@RequiresPermissions("proposal.export.case")
public Object pageData(PageForm page,
ProposalSearch search,
@Param(value = "stateCode", required = false) String stateCode,
@Param(value = "proposalTypes", required = false) String[] proposalTypes,
@Param(value = "proposalResult", required = false) String[] proposalResult,
@Param(value = "searchName2", required = false) String searchName2,
@Param(value = "searchKeyword2", required = false) String searchKeyword2,
@Param(value = "undertakeId", required = false) String undertakeId,
@Param(value = "determineTypeOptions", required = false) String[] determineTypeOptions) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create(SQL);
if (StrUtil.isNotBlank(undertakeId)) {
cnd.and(Cnd.exps("zbpr.replyUnitId", "=", undertakeId).or("xbpr.replyUnitId", "=", undertakeId));
}
cnd.andEX("info.stateCode", "=", stateCode);
cnd.and("info.stateCode", ">", ProposalState.CASE);
if (!ShiroUtil.hasAnyRoles(new String[]{"sysadmin", "A06", "tamange", "jdhdbt01"})) {
if (ShiroUtil.hasRole("H04")) {
cnd.and("su.unionid", " in ", vi.getMangeUnionStr());
}
}
if (Strings.isNotBlank(searchName2) && Strings.isNotBlank(searchKeyword2)) {
cnd.where().andLike(searchName2, searchKeyword2);
}
if (proposalTypes != null && proposalTypes.length > 0) {
cnd.and("info.typeId", "in", proposalTypes);
}
if (proposalResult != null && proposalResult.length > 0) {
cnd.and("info.resultCode", "in", proposalResult);
if (ArrayUtil.contains(proposalResult, ProposalConstant.DETERMINE)) {
if (determineTypeOptions != null && determineTypeOptions.length > 0) {
cnd.and("info.determineTypeCode", "in", determineTypeOptions);
}
}
}
cnd.asc("info.resultCode");
cnd.groupBy("info.id");
proposalInfoService.sortAndSearch(cnd, page, search);
sql.setCondition(cnd);
return proposalInfoService.listPageMap(page.getPageNumber(), page.getPageSize(), sql);
}
@At
@Ok("void")
@RequiresPermissions("proposal.export.case")
public void exportAllProposal(PageForm page,
ProposalSearch search,
@Param(value = "props", required = false) String props,
@Param(value = "stateCode",required = false)String stateCode,
@Param(value = "proposalTypes",required = false)String[] proposalTypes,
@Param(value = "proposalResult",required = false)String[] proposalResult,
@Param(value = "searchName2",required = false) String searchName2,
@Param(value = "searchKeyword2",required = false)String searchKeyword2,
HttpServletResponse response) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create(SQL);
cnd.andEX("info.stateCode", "=", stateCode);
cnd.and("info.stateCode", ">", ProposalState.CASE);
if (!ShiroUtil.hasAnyRoles(new String[]{"sysadmin", "A06", "tamange", "jdhdbt01"})) {
if (ShiroUtil.hasRole("H04")) {
cnd.and("su.unionid", " in ", vi.getMangeUnionStr());
}
}
if (Strings.isNotBlank(searchName2) && Strings.isNotBlank(searchKeyword2)) {
cnd.where().andLike(searchName2, searchKeyword2);
}
if (proposalTypes != null && proposalTypes.length > 0) {
cnd.and("info.typeId", "in", proposalTypes);
}
if (proposalResult != null && proposalResult.length > 0) {
cnd.and("info.resultCode", "in", proposalResult);
}
cnd.asc("info.resultCode");
proposalInfoService.sortAndSearch(cnd, page, search);
cnd.groupBy("info.id");
sql.setCondition(cnd);
List<ExcelExportEntity> entityList = new ArrayList<>();
Map<String, String> propMap = Json.fromJson(Map.class, props);
entityList.add(new ExcelExportEntity("序号", "index", 20));
propMap.forEach((k, v) -> {
entityList.add(new ExcelExportEntity(v, k, 20));
});
entityList.add(new ExcelExportEntity("备注", "remark", 100));
List<NutMap> proposalList = proposalInfoService.listMap(sql);
proposalList.forEach(v -> {
if (v.getString("resultCode").equals(ProposalConstant.NOTGIVE)) {
ProposalAudit audit = proposalInfoService.dao().fetch(ProposalAudit.class, Cnd.where("id", "=", v.getString("caseAuditId")));
v.setv("remark", audit.getOpinion());
}
});
for (int i = 0; i < proposalList.size(); i++) {
proposalList.get(i).put("index", i + 1);
}
try {
ViTool.excelResponse(response, "提案立案汇总表.xlsx");
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, proposalList);
workbook.write(response.getOutputStream());
} catch (Exception e) {
}
}
@At
@Ok("void")
@RequiresPermissions("proposal.export.whole")
public void oneProposalExport(String proposalId, HttpServletResponse response) {
try {
proposalExportService.exportFull(proposalId, response);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
@@ -0,0 +1,330 @@
package io.v.nutz.zhgh.proposal.controller.export;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.page.Pagination;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.Roles;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.ProposalAudit;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.zhgh.proposal.services.ProposalProcessService;
import io.v.nutz.base.utils.ViTool;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.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.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 导出领导办理汇总表
*
* @author jug
* @date 2023/07/03
*/
@IocBean
@At("/platform/proposal/export/leaderHandle")
@Ok("json:full")
public class ProposalExportLeaderHandleController {
@Inject
private Dao dao;
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalProcessService proposalProcessService;
@At("")
@Ok("beetl:/platform/proposal/export/leaderHandle.html")
@RequiresPermissions("proposal.export.leaderHandle")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.export.leaderHandle")
public Object getLeaderList(String meetingId) {
Sql sql = Sqls.create("""
SELECT
u.id,
u.username
FROM
sys_user u
LEFT JOIN sys_user_role sur ON sur.userId = u.id AND sur.roleid = @leaderRoleId
WHERE
sur.cbdwid IN ( SELECT replyUnitId FROM proposal_reply plfo LEFT JOIN proposal_info info ON info.id = plfo.proposalId WHERE info.teacherMeetingId = @meetingId )
GROUP BY
u.id
""");
sql.setParam("meetingId", meetingId);
sql.setParam("leaderRoleId",Roles.IN_CHARGE_LEADER);
return proposalInfoService.listMap(sql);
}
@At
@ViReturn
@RequiresPermissions("proposal.export.leaderHandle")
public Object pageData(PageForm page, String meetingId, String username, String leaderId) {
Sql sql = Sqls.create("""
SELECT
pr.*,
info.proposalCode,
info.proposalName,
info.resultCode,
info.secretaryOpinions,
type.typeCode,
type.typeName,
u.username,
pu.unitName,
IF( pr.undertakeType = 1, '主办', '协办' ) underTakeTypeName,
info.branchLeaderOpinions,
GROUP_CONCAT(DISTINCT xld.username) as leaderUserName,
pbla.isAudit AS isAuditByLeaderSpla,
pr.isLeaderAudit AS isAuditByLeaderSpdf
FROM
`proposal_reply` pr
LEFT JOIN proposal_info info ON info.id = pr.proposalId
LEFT JOIN `user` u ON u.id=info.createUser
LEFT JOIN proposal_undertake pu ON pu.id = pr.replyUnitId
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN sys_user_role xldsur on xldsur.cbdwid = pr.replyUnitId and xldsur.roleId = '153cba3fb88b4c88b7c1002f0eb63749'
LEFT JOIN sys_user xld on xld.id = xldsur.userId
LEFT JOIN proposal_branch_leader_audit pbla on pbla.proposalId = pr.proposalId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("pr.undertakeType", "=", "1");
cnd.and("info.resultCode", "in", Arrays.asList("determine", "opinion"));
cnd.andEX("info.teacherMeetingId", "=", meetingId);
if (StrUtil.isNotBlank(leaderId)) {
cnd.and(new Static("pr.replyUnitId in (select cbdwid from sys_user_role where roleid = '%s' and userid = '%s')".formatted(Roles.IN_CHARGE_LEADER, leaderId)));
}
if (Strings.isNotBlank(username)) {
cnd.and("u.username", "like", "%" + username + "%");
}
if (Strings.isNotBlank(page.getSearchName()) && Strings.isNotBlank(page.getSearchKeyword())) {
cnd.where().andLike(page.getSearchName(), page.getSearchKeyword());
}
if (Strings.isNotBlank(page.getPageOrderBy()) && Strings.isNotBlank(page.getPageOrderName())) {
if (page.getPageOrderBy().equals("descending")) {
cnd.orderBy(page.getPageOrderName(), "DESC");
} else if (page.getPageOrderBy().equals("ascending")) {
cnd.orderBy(page.getPageOrderName(), "ASC");
}
} else {
cnd.desc("pr.leaderId");
}
cnd.groupBy("pr.proposalId");
sql.setCondition(cnd);
Pagination pagination = proposalInfoService.listPageMap(page.getPageNumber(), page.getPageSize(), sql);
List<NutMap> list = pagination.getList();
list.forEach(v -> {
String secretaryOpinions = v.getString("secretaryOpinions");
v.putAll(getSecretaryInfo(secretaryOpinions));
Sql sqlChild = Sqls.create("""
SELECT
pr.*,
info.proposalCode,
info.proposalName,
info.resultCode,
info.secretaryOpinions,
type.typeCode,
type.typeName,
u.username,
pu.unitName,
IF( pr.undertakeType = 1, '主办', '协办' ) underTakeTypeName,
info.branchLeaderOpinions,
GROUP_CONCAT(DISTINCT xld.username) as leaderUserName,
pbla.isAudit AS isAuditByLeaderSpla,
pr.isLeaderAudit AS isAuditByLeaderSpdf
FROM
`proposal_reply` pr
LEFT JOIN proposal_info info ON info.id = pr.proposalId
LEFT JOIN `user` u ON u.id=info.createUser
LEFT JOIN proposal_undertake pu ON pu.id = pr.replyUnitId
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN sys_user_role xldsur on xldsur.cbdwid = pr.replyUnitId and xldsur.roleId = '153cba3fb88b4c88b7c1002f0eb63749'
LEFT JOIN sys_user xld on xld.id = xldsur.userId
LEFT JOIN proposal_branch_leader_audit pbla on pbla.proposalId = pr.proposalId
$condition
""");
Cnd cndChild = Cnd.NEW();
cndChild.and("info.id", "=", v.getString("proposalId"));
cndChild.and("pr.undertakeType", "=", "2");
cndChild.groupBy("pr.replyUnitId");
sqlChild.setCondition(cndChild);
List<NutMap> childList = proposalInfoService.listMap(sqlChild);
childList.forEach(c -> {
c.putAll(getSecretaryInfo(c.getString("secretaryOpinions")));
});
v.setv("children", childList);
v.setv("hasChild", Lang.isNotEmpty(childList));
});
return pagination;
}
private NutMap getSecretaryInfo(String secretaryOpinions) {
if (StrUtil.isNotBlank(secretaryOpinions)) {
List<String> auditIdList = Json.fromJsonAsList(String.class, secretaryOpinions);
ProposalAudit proposalAudit = dao.fetch(ProposalAudit.class, Cnd.where("id", "in", auditIdList));
return NutMap.NEW().addv("secretaryUserName", proposalAudit.getUsername())
.addv("secretaryAuditInfo", true);
} else {
return NutMap.NEW().addv("secretaryUserName", null)
.addv("secretaryAuditInfo", false);
}
}
@At
@Ok("void")
@RequiresPermissions("proposal.export.leaderHandle")
public void exportAllProposal(PageForm page, String username, String leaderId, String meetingId, HttpServletResponse response) throws Exception {
// boolean branchIsNode = proposalProcessService.isNode(ProposalState.BRANCHLEADERREAD);
// boolean principalIsNode = proposalProcessService.isNode(ProposalState.PRINCIPALREAD);
//
//
// Sql sql = Sqls.create("""
// SELECT YEAR
// ( info.createTime ) YEAR,
// info.proposalCode,
// info.resultCode,
// info.proposalName,
// info.secretaryOpinions,
// type.typeCode,
// type.typeName,
// result.`name` resultName,
// u.username as createUserName,
// u.loginname as createLoginName,
// u.unioncode unionCode,
// u.unionname unionName,
// u.unitcode unitCode,
// u.unitname unitName,
// GROUP_CONCAT( DISTINCT zbxld.username ) AS masterLeaderUserName,
// pbla.isAudit AS isAuditByLeaderSpla,
// pr.isLeaderAudit AS isAuditByLeaderSpdf,
// zbpu.unitName AS masterUnitName,
// zbpu.unitCode AS masterUnitCode,
// GROUP_CONCAT( DISTINCT zbuser.username ) AS masterUserName,
// xbpu.unitName AS slaveUnitName,
// xbpu.unitCode AS slaveUnitCode,
// GROUP_CONCAT( DISTINCT xbuser.username ) AS slaveUserName,
// pr.*
// FROM
// `proposal_reply` pr
// LEFT JOIN proposal_info info ON info.id = pr.proposalId
// LEFT JOIN `user` u ON u.id = info.createUser
// LEFT JOIN proposal_undertake pu ON pu.id = pr.replyUnitId
// LEFT JOIN proposal_type type ON type.id = info.typeId
// LEFT JOIN sys_dict result ON result.`code` = info.resultCode
// LEFT JOIN sys_user_role zbxldsur ON zbxldsur.cbdwid = pr.replyUnitId
// AND zbxldsur.roleId = '153cba3fb88b4c88b7c1002f0eb63749'
// LEFT JOIN sys_user zbxld ON zbxld.id = zbxldsur.userId
// LEFT JOIN proposal_branch_leader_audit pbla ON pbla.proposalId = pr.proposalId
// LEFT JOIN proposal_reply zbpr ON zbpr.proposalId = info.id
// AND zbpr.undertakeType = 1
// LEFT JOIN proposal_undertake zbpu ON zbpu.id = zbpr.replyUnitId
// LEFT JOIN sys_user_role zbsur ON zbsur.cbdwid = zbpu.id
// AND zbsur.roleid = '2b17b5d68c754914b4637dddb66ea4ed'
// LEFT JOIN sys_user zbuser ON zbuser.id = zbsur.userId
// LEFT JOIN proposal_reply xbpr ON xbpr.proposalId = info.id
// AND xbpr.undertakeType = 2
// LEFT JOIN proposal_underTake xbpu ON xbpu.id = xbpr.replyUnitId
// LEFT JOIN sys_user_role xbsur ON xbsur.cbdwid = xbpu.id
// AND xbsur.roleid = '2b17b5d68c754914b4637dddb66ea4ed'
// LEFT JOIN sys_user xbuser ON xbuser.id = xbsur.userId
// $condition
// """);
// Cnd cnd = Cnd.NEW();
// cnd.and("pr.undertakeType", "=", 1);
// cnd.and("info.resultCode", "IN", Lang.list(ProposalConstant.DETERMINE, ProposalConstant.OPINION));
// cnd.and("info.teacherMeetingId", "=", meetingId);
//
// if (StrUtil.isNotBlank(leaderId)) {
// cnd.and(new Static("pr.replyUnitId in (select cbdwid from sys_user_role where roleid = '%s' and userid = '%s')".formatted(Roles.IN_CHARGE_LEADER, leaderId)));
// }
//
// if (Strings.isNotBlank(username)) {
// cnd.and("u.username", "like", "%" + username + "%");
// }
// if (Strings.isNotBlank(page.getSearchName()) && Strings.isNotBlank(page.getSearchKeyword())) {
// cnd.where().andLike(page.getSearchName(), page.getSearchKeyword());
// }
// cnd.groupBy("info.id");
// sql.setCondition(cnd);
// List<NutMap> list = proposalInfoService.listMap(sql);
//
//
// List<ExcelExportEntity> exportEntities = new ArrayList<>();
// exportEntities.add(new ExcelExportEntity("年度", "YEAR", 20));
// exportEntities.add(new ExcelExportEntity("提案名称", "proposalName", 20));
// exportEntities.add(new ExcelExportEntity("提案类型编码", "typeCode", 20));
// exportEntities.add(new ExcelExportEntity("提案类型", "typeName", 20));
// exportEntities.add(new ExcelExportEntity("立案结果", "resultName", 20));
// exportEntities.add(new ExcelExportEntity("分工会代码", "unionCode", 20));
// exportEntities.add(new ExcelExportEntity("分工会名称", "unionName", 20));
// exportEntities.add(new ExcelExportEntity("提案人工号", "createLoginName", 20));
// exportEntities.add(new ExcelExportEntity("提案人姓名", "createUserName", 20));
// if (principalIsNode) {
// list.forEach(v -> {
// v.putAll(getSecretaryInfo(v.getString("secretaryOpinions")));
// v.setv("secretaryAuditInfo", v.getBoolean("secretaryAuditInfo", false) ? "已审批立案" : "未审批立案");
// });
// exportEntities.add(new ExcelExportEntity("校长、书记", "secretaryUserName", 20));
// exportEntities.add(new ExcelExportEntity("校长、书记审批立案", "secretaryAuditInfo", 20));
// }
// exportEntities.add(new ExcelExportEntity("主办单位编码", "masterUnitCode", 20));
// exportEntities.add(new ExcelExportEntity("主办单位", "masterUnitName", 20));
// exportEntities.add(new ExcelExportEntity("主办单位人员", "masterUserName", 20));
// exportEntities.add(new ExcelExportEntity("主办单位分管校领导", "masterLeaderUserName", 30));
// if (branchIsNode) {
// list.forEach(v -> {
// v.setv("isAuditByLeaderSpla", v.getBoolean("isAuditByLeaderSpla", false) ? "已审批立案" : "未审批立案");
// });
// exportEntities.add(new ExcelExportEntity("主办单位分管校领导审批立案", "isAuditByLeaderSpla", 30));
// }
// list.forEach(v -> {
// v.setv("isAuditByLeaderSpdf", v.getBoolean("isAuditByLeaderSpdf", false) ? "已审批答复" : "未审批答复");
// });
// exportEntities.add(new ExcelExportEntity("主办单位分管校领导审批答复", "isAuditByLeaderSpdf", 30));
//
// exportEntities.add(new ExcelExportEntity("协办单位编码", "slaveUnitCode", 20));
// exportEntities.add(new ExcelExportEntity("协办单位", "slaveUnitName", 20));
// exportEntities.add(new ExcelExportEntity("协办单位人员", "slaveUserName", 50));
//
// try {
// ViTool.excelResponse(response, "提案领导审核汇总表.xls");
// Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), exportEntities, list);
// workbook.write(response.getOutputStream());
// } catch (Exception e) {
// e.printStackTrace();
// }
}
}
@@ -0,0 +1,141 @@
package io.v.nutz.zhgh.proposal.controller.export;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalExportService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.lang.Strings;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author zhf
* @date 2022/1/26 9:21
* @description
*/
@IocBean
@At("/platform/proposal/export/single")
@Ok("json:full")
public class ProposalExportSingleController {
@At("")
@Ok("beetl:/platform/proposal/export/single.html")
@RequiresPermissions("proposal.export.single")
public void index() {
}
@Inject
private Vi vi;
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalExportService proposalExportService;
@At
@ViReturn
@RequiresPermissions("proposal.export.single")
public Object pageData(PageForm page,
ProposalSearch search,
@Param(value = "searchName2",required = false) String searchName2,
@Param(value = "searchKeyword2",required = false)String searchKeyword2,
@Param(value = "stateCode",required = false)String stateCode,
@Param(value = "proposalTypes",required = false)String[] proposalTypes,
@Param(value = "proposalResult",required = false)String[] proposalResult,
@Param(value = "undertakeId",required = false) String undertakeId,
@Param(value = "determineTypeOptions",required = false)String[] determineTypeOptions) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
dbt.`code` delegationCode,
manner.`name` mannerName,
result.`name` resultName,
zbpu.unitName pruMaster,
zbpu.unitCode pruMasterCode,
GROUP_CONCAT( xbpu.unitName ) pruSlave
FROM
proposal_info info
LEFT JOIN sys_user su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
LEFT JOIN proposal_reply zbpr ON zbpr.proposalId = info.id AND zbpr.undertakeType = 1
LEFT JOIN proposal_undertake zbpu ON zbpu.id = zbpr.replyUnitId
LEFT JOIN proposal_reply xbpr ON xbpr.proposalId = info.id AND xbpr.undertakeType = 2
LEFT JOIN proposal_underTake xbpu ON xbpu.id = xbpr.replyUnitId
$condition
""");
cnd.andEX("info.stateCode", "=", stateCode);
if (StrUtil.isNotBlank(undertakeId)) {
cnd.and(Cnd.exps("zbpr.replyUnitId", "=", undertakeId).or("xbpr.replyUnitId", "=", undertakeId));
}
if (!ShiroUtil.hasAnyRoles(new String[]{"sysadmin", "A06", "tamange", "jdhdbt01"})) {
if (ShiroUtil.hasRole("H04")) {
cnd.and("su.unionid", " in ", vi.getMangeUnionStr());
}
}
if (Strings.isNotBlank(searchName2) && Strings.isNotBlank(searchKeyword2)) {
cnd.where().andLike(searchName2, searchKeyword2);
}
if (proposalTypes != null && proposalTypes.length > 0) {
cnd.and("info.typeId", "in", proposalTypes);
}
if (proposalResult != null && proposalResult.length > 0) {
cnd.and("info.resultCode", "in", proposalResult);
if (ArrayUtil.contains(proposalResult, ProposalConstant.DETERMINE)) {
if (determineTypeOptions != null && determineTypeOptions.length > 0) {
cnd.and("info.determineTypeCode", "in", determineTypeOptions);
}
}
}
proposalInfoService.sortAndSearch(cnd, page, search);
cnd.groupBy("info.id");
sql.setCondition(cnd);
return proposalInfoService.listPageMap(page.getPageNumber(), page.getPageSize(), sql);
}
@At
@Ok("void")
@RequiresPermissions("proposal.export.single")
public void oneProposalExport(String proposalId, HttpServletResponse response) {
try {
proposalExportService.exportFull(proposalId, response);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
@@ -0,0 +1,237 @@
package io.v.nutz.zhgh.proposal.controller.export;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HtmlUtil;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.base.utils.ViTool;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.json.Json;
import org.nutz.lang.Strings;
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.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
* @author zhf
* @date 2022/1/26 9:03
* @description 导出提案汇总表
*/
@IocBean
@At("/platform/proposal/export/summary")
@Ok("json:full")
public class ProposalExportSummaryController {
@At("")
@Ok("beetl:/platform/proposal/export/summary.html")
@RequiresPermissions("proposal.export.summary")
public void index() {
}
@Inject
private Vi vi;
@Inject
private ProposalInfoService proposalInfoService;
@At
@ViReturn
@RequiresPermissions("proposal.export.summary")
public Object pageData(PageForm page,
ProposalSearch search,
@Param(value = "searchName2", required = false) String searchName2,
@Param(value = "searchKeyword2", required = false) String searchKeyword2,
@Param(value = "stateCode", required = false) String stateCode,
@Param(value = "proposalTypes", required = false) String[] proposalTypes,
@Param(value = "proposalResult", required = false) String[] proposalResult,
@Param(value = "undertakeId", required = false) String undertakeId,
@Param(value = "determineTypeOptions", required = false) String[] determineTypeOptions) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
dbt.`code` delegationCode,
manner.`name` mannerName,
result.`name` resultName,
masterPu.unitName AS pruMaster,
masterPu.unitCode AS pruMasterCode,
GROUP_CONCAT(DISTINCT(slavePu.unitName)) AS pruSlave
FROM
proposal_info info
LEFT JOIN proposal_reply pr on pr.proposalId = info.id
LEFT JOIN proposal_reply masterPr on masterPr.proposalId = info.id AND masterPr.undertakeType = 1
LEFT JOIN proposal_underTake masterPu on masterPu.id = masterPr.replyUnitId
LEFT JOIN proposal_reply slavePr on slavePr.proposalId = info.id AND slavePr.undertakeType = 2
LEFT JOIN proposal_underTake slavePu on slavePu.id = slavePr.replyUnitId
LEFT JOIN sys_user su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
$condition
""");
cnd.andEX("info.stateCode", "=", stateCode);
if (StrUtil.isNotBlank(undertakeId)) {
cnd.and(Cnd.exps("masterPr.replyUnitId", "=", undertakeId).or("slavePr.replyUnitId", "=", undertakeId));
}
if (!ShiroUtil.hasAnyRoles(new String[]{"sysadmin", "A06", "tamange", "jdhdbt01"})) {
if (ShiroUtil.hasRole("H04")) {
cnd.and("su.unionid", " in ", vi.getMangeUnionStr());
}
}
if (Strings.isNotBlank(searchName2) && Strings.isNotBlank(searchKeyword2)) {
cnd.where().andLike(searchName2, searchKeyword2);
}
if (proposalTypes != null && proposalTypes.length > 0) {
cnd.and("info.typeId", "in", proposalTypes);
}
if (proposalResult != null && proposalResult.length > 0) {
cnd.and("info.resultCode", "in", proposalResult);
if (ArrayUtil.contains(proposalResult, ProposalConstant.DETERMINE)) {
if (determineTypeOptions != null && determineTypeOptions.length > 0) {
cnd.and("info.determineTypeCode", "in", determineTypeOptions);
}
}
}
proposalInfoService.sortAndSearch(cnd, page, search);
cnd.groupBy("info.id");
sql.setCondition(cnd);
return proposalInfoService.listPageMap(page.getPageNumber(), page.getPageSize(), sql);
}
/**
* 按条件导出提案
*
* @param exportCnd
*/
@At
@Ok("void")
@RequiresPermissions("proposal.export.summary")
public void exportByCnd(@Param("cnd") String exportCnd,
@Param("tableColumns") String tableColumns,
HttpServletResponse response) {
NutMap mapCnd = Json.fromJson(NutMap.class, exportCnd);
List<NutMap> tableColumnList = Json.fromJsonAsList(NutMap.class, tableColumns);
Sql sql = Sqls.create("""
SELECT
info.proposalCode,
info.proposalName,
info.brief,
info.measures,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
dbt.`code` delegationCode,
manner.`name` mannerName,
result.`name` resultName,
masterPu.unitName AS pruMaster,
masterPu.unitCode AS pruMasterCode,
GROUP_CONCAT(slavePu.unitName) AS pruSlave
FROM
proposal_info info
LEFT JOIN proposal_reply masterPr on masterPr.proposalId = info.id AND masterPr.undertakeType = 1
LEFT JOIN proposal_underTake masterPu on masterPu.id = masterPr.replyUnitId
LEFT JOIN proposal_reply slavePr on slavePr.proposalId = info.id AND slavePr.undertakeType = 2
LEFT JOIN proposal_underTake slavePu on slavePu.id = slavePr.replyUnitId
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and(Cnd.likeEX(mapCnd.getString("searchName"), mapCnd.getString("searchKeyword")));
cnd.and(Cnd.likeEX(mapCnd.getString("searchName2"), mapCnd.getString("searchKeyword2")));
cnd.andEX("info.teacherMeetingId", "=", mapCnd.getString("meetingId"));
if (StrUtil.isNotBlank(mapCnd.getString("undertakeId"))) {
cnd.and(Cnd.exps("masterPr.replyUnitId", "=", mapCnd.getString("undertakeId")).or("slavePr.replyUnitId", "=", mapCnd.getString("undertakeId")));
}
List<String> proposalTypes = mapCnd.getAsList("proposalTypes", String.class);
cnd.andEX("info.typeId", "in", proposalTypes);
List<String> proposalResult = mapCnd.getAsList("proposalResult", String.class);
cnd.andEX("info.resultCode", "in", proposalResult);
cnd.andEX("info.delegationId", "=", mapCnd.getString("delegationId"));
cnd.andEX("info.stateCode", "=", mapCnd.getString("stateCode"));
cnd.andEX("su.unionId", "=", mapCnd.getString("unionId"));
cnd.andEX("su.unitId", "=", mapCnd.getString("unitId"));
cnd.asc("info.proposalCode");
cnd.groupBy("info.id");
sql.setCondition(cnd);
List<NutMap> list = proposalInfoService.listMap(sql);
list.forEach(v -> {
v.put("brief", HtmlUtil.cleanHtmlTag(v.getString("brief")));
v.put("measures", HtmlUtil.cleanHtmlTag(v.getString("measures")));
});
List<ExcelExportEntity> excelExportEntities = new ArrayList<ExcelExportEntity>();
tableColumnList.forEach(v -> {
excelExportEntities.add(new ExcelExportEntity(v.getString("label"), v.getString("prop"), 20));
});
try {
ViTool.excelResponse(response, "提案表.xlsx");
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, excelExportEntities, list);
workbook.write(response.getOutputStream());
} catch (Exception e) {
}
}
}
@@ -0,0 +1,204 @@
package io.v.nutz.zhgh.proposal.controller.export;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.ZipUtil;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalExportService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import org.apache.commons.io.IOUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.entity.Record;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
/**
* @author zhf
* @date 2022/1/26 9:45
* @description
*/
@IocBean
@At("/platform/proposal/export/whole")
@Ok("json:full")
public class ProposalExportWholeController {
@At("")
@Ok("beetl:/platform/proposal/export/whole.html")
@RequiresPermissions("proposal.export.whole")
public void index() {
}
@Inject
private Vi vi;
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalExportService proposalExportService;
@At
@ViReturn
@RequiresPermissions("proposal.export.whole")
public Object pageData(PageForm page, ProposalSearch search, @Param(value = "searchName2", required = false) String searchName2, @Param(value = "searchKeyword2", required = false) String searchKeyword2, @Param(value = "stateCode", required = false) String stateCode, @Param(value = "proposalTypes", required = false) String[] proposalTypes, @Param(value = "proposalResult", required = false) String[] proposalResult, @Param(value = "undertakeId", required = false) String undertakeId, @Param(value = "determineTypeOptions", required = false) String[] determineTypeOptions) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
dbt.`code` delegationCode,
manner.`name` mannerName,
result.`name` resultName,
zbpu.unitName pruMaster,
zbpu.unitCode pruMasterCode,
GROUP_CONCAT( xbpu.unitName ) pruSlave
FROM
proposal_info info
LEFT JOIN sys_user su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
LEFT JOIN proposal_reply zbpr ON zbpr.proposalId = info.id AND zbpr.undertakeType = 1
LEFT JOIN proposal_undertake zbpu ON zbpu.id = zbpr.replyUnitId
LEFT JOIN proposal_reply xbpr ON xbpr.proposalId = info.id AND xbpr.undertakeType = 2
LEFT JOIN proposal_underTake xbpu ON xbpu.id = xbpr.replyUnitId
$condition
""");
cnd.andEX("info.stateCode", "=", stateCode);
if (StrUtil.isNotBlank(undertakeId)) {
cnd.and(Cnd.exps("zbpr.replyUnitId", "=", undertakeId).or("xbpr.replyUnitId", "=", undertakeId));
}
if (!ShiroUtil.hasAnyRoles(new String[]{"sysadmin", "A06", "tamange", "jdhdbt01"})) {
if (ShiroUtil.hasRole("H04")) {
cnd.and("su.unionid", " in ", vi.getMangeUnionStr());
}
}
if (Strings.isNotBlank(searchName2) && Strings.isNotBlank(searchKeyword2)) {
cnd.where().andLike(searchName2, searchKeyword2);
}
if (proposalTypes != null && proposalTypes.length > 0) {
cnd.and("info.typeId", "in", proposalTypes);
}
if (proposalResult != null && proposalResult.length > 0) {
cnd.and("info.resultCode", "in", proposalResult);
if (ArrayUtil.contains(proposalResult, ProposalConstant.DETERMINE)) {
if (determineTypeOptions != null && determineTypeOptions.length > 0) {
cnd.and("info.determineTypeCode", "in", determineTypeOptions);
}
}
}
proposalInfoService.sortAndSearch(cnd, page, search);
cnd.groupBy("info.id");
sql.setCondition(cnd);
return proposalInfoService.listPageMap(page.getPageNumber(), page.getPageSize(), sql);
}
@At
@Ok("void")
@RequiresPermissions("proposal.export.whole")
public void exportAllProposal(ProposalSearch search, @Param(value = "stateCode", required = false) String stateCode, @Param(value = "proposalTypes", required = false) String[] proposalTypes, @Param(value = "proposalResult", required = false) String[] proposalResult, @Param(value = "searchName2", required = false) String searchName2, @Param(value = "searchKeyword2", required = false) String searchKeyword2, HttpServletResponse response) throws Exception {
CndPlus cnd = CndPlus.create();
Sql sql = Sqls.create("""
SELECT
info.*,
su.username,
su.loginname
FROM
proposal_info info
LEFT JOIN `user` su ON su.id = info.createUser
$condition
""");
if (Strings.isNotBlank(searchName2) && Strings.isNotBlank(searchKeyword2)) {
cnd.where().andLike(searchName2, searchKeyword2);
}
if (Strings.isNotBlank(search.getSearchKeyWord())) {
cnd.and(Cnd.exps("info.proposalCode", "like", "%" + search.getSearchKeyWord() + "%").or("info.proposalName", "like", "%" + search.getSearchKeyWord() + "%"));
}
cnd.andEX("info.stateCode", "=", stateCode);
cnd.andEX("info.typeId", "in", proposalTypes);
cnd.andEX("info.resultCode", "in", proposalResult);
cnd.andEX("info.teacherMeetingId", "=", search.getMeetingId());
cnd.andEX("info.delegationId", "=", search.getDelegationId());
cnd.andEX("su.unionId", "=", search.getUnionId());
cnd.andEX("su.unitId", "=", search.getUnitId());
sql.setCondition(cnd);
List<Record> list = proposalInfoService.list(sql);
response.reset();
response.setContentType("application/x-msdownload;charset=utf-8");
String fileName = "提案汇总文件夹";
//创建临时文件夹
Path templateDir = Files.createTempDirectory("提案汇总文件夹");
for (Record v : list) {
FileOutputStream outputStream = new FileOutputStream(templateDir.toString() + "/" + v.getString("proposalName") + "-" + v.getString("username") + ".docx");
proposalExportService.exportFull(v.getString("id"), outputStream);
outputStream.close();
}
//压缩
File zipFile = ZipUtil.zip(templateDir.toString());
response.setHeader("content-disposition", "attachment;filename="
+ URLEncoder.encode(zipFile.getName(), "UTF-8"));
try (ServletOutputStream outputStream = response.getOutputStream();
FileInputStream zipFis = new FileInputStream(zipFile);) {
IOUtils.copy(zipFis, outputStream);
} catch (Exception e) {
e.printStackTrace();
}finally {
FileUtil.del(templateDir);
FileUtil.del(zipFile);
}
}
@At
@Ok("void")
@RequiresPermissions("proposal.export.whole")
public void oneProposalExport(String proposalId, HttpServletResponse response) {
try {
proposalExportService.exportFull(proposalId, response);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
@@ -0,0 +1,131 @@
package io.v.nutz.zhgh.proposal.controller.senior;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.ProposalFeedback;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.zhgh.proposal.services.ProposalProcessService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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;
/**
* @author zhf
* @date 2022/1/25 14:14
* @description 修改反馈评价
*/
@IocBean
@Ok("json:full")
@At("/platform/proposal/senior/modify/feedback")
public class ProposalModifyFeedbackController {
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalProcessService proposalProcessService;
@Inject
private Dao dao;
@At("")
@Ok("beetl:/platform/proposal/senior/ModifyFeedback.html")
@RequiresPermissions("proposal.senior.feedback")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.senior.feedback")
public Object pageData(PageForm page, ProposalSearch search) {
Sql sql = Sqls.create("""
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName,
(
SELECT
dict.`name`
FROM
proposal_feedback pf
LEFT JOIN sys_dict dict ON dict.`code` = pf.feedbackCode
WHERE
pf.proposalId = info.id
ORDER BY
pf.feedbackNumber DESC
LIMIT 1
) AS feedBackResultName
FROM
proposal_info info
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("info.stateCode", ">", ProposalState.FEEDBACKSCORE);
cnd.and("info.resultCode", "=", ProposalConstant.DETERMINE);
proposalInfoService.sortAndSearch(cnd, page, search);
sql.setCondition(cnd);
return proposalInfoService.list(page, sql);
// return proposalInfoService.pageData(page, search, cnd);
}
@At
@ViReturn
@RequiresPermissions("proposal.senior.feedback")
public Object getFeedbackData(String id) {
Sql sql = Sqls.create("""
SELECT
pf.*,
su.username,
su.loginname,
dict.`name` feedbackResult
FROM
proposal_feedback pf
LEFT JOIN sys_user su ON su.id = pf.feedbackPerson
LEFT JOIN sys_dict dict ON dict.`code` = pf.feedbackCode
WHERE
pf.proposalId = @proposalId
ORDER BY
pf.feedbackNumber DESC
""").setParam("proposalId", id);
return proposalInfoService.listMap(sql);
}
@At
@ViReturn
@RequiresPermissions("proposal.senior.feedback")
public Object doEdit(String id, String feedbackOpinion, String feedbackCode) {
ProposalFeedback feedback = dao.fetch(ProposalFeedback.class, Cnd.where("id", "=", id));
feedback.setFeedbackCode(feedbackCode);
feedback.setFeedbackOpinion(feedbackOpinion);
dao.updateIgnoreNull(feedback);
return null;
}
}
@@ -0,0 +1,57 @@
package io.v.nutz.zhgh.proposal.controller.senior;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.models.ProposalInfo;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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;
/**
* 修改提案基本信息
*/
@IocBean
@At("/platform/proposal/senior/modify/proposalBasicInfo")
@Ok("json:full")
public class ProposalModifyProposalBasicInfoController {
@Inject
private Dao dao;
@Inject
private ProposalInfoService proposalInfoService;
@At("")
@Ok("beetl:/platform/proposal/senior/ModifyBasicInfo.html")
@RequiresPermissions("proposal.senior.editproposal")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.senior.editproposal")
public Object pageData(PageForm page, ProposalSearch search) {
CndPlus cnd = CndPlus.create();
return proposalInfoService.pageData(page, search, cnd);
}
/**
* 修改提案信息 案由 建议措施
* @param proposalInfo
* @return
*/
@At("/updateBasicInfo")
@ViReturn
@RequiresPermissions("proposal.senior.editproposal")
public Object updateBasicInfo(ProposalInfo proposalInfo) {
dao.updateIgnoreNull(proposalInfo);
return null;
}
}
@@ -0,0 +1,77 @@
package io.v.nutz.zhgh.proposal.controller.senior;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.models.ProposalSeconded;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Chain;
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 org.nutz.trans.Trans;
/**
* @description:
* @author: zhf
* @time: 2022/4/26 14:52
*/
@IocBean
@At("/platform/proposal/senior/modify/proposalStateCode")
@Ok("json:full")
public class ProposalModifyProposalStateCodeController {
@Inject
private Dao dao;
@Inject
private ProposalInfoService proposalInfoService;
@At("")
@Ok("beetl:/platform/proposal/senior/ModifyStateCode.html")
@RequiresPermissions("proposal.senior.editProposalStateCode")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.senior.editProposalStateCode")
public Object pageData(PageForm page, ProposalSearch search) {
CndPlus cnd = CndPlus.create();
cnd.and("info.stateCode", "<=", ProposalState.CASE);
return proposalInfoService.pageData(page, search, cnd);
}
@At
@ViReturn
@RequiresPermissions("proposal.senior.editProposalStateCode")
public Object doConfirm(String id, Integer stateCode, boolean isDelete) {
Trans.exec(() -> {
if (isDelete) {
if (stateCode.equals(ProposalState.INVIRTE) || stateCode.equals(ProposalState.UNSUBMIT)) {
dao.clear(ProposalSeconded.class, Cnd.where("proposalId", "=", id));
proposalInfoService.update(Chain.make("delegationAuditId", null), Cnd.where("id", "=", id));
proposalInfoService.update(Chain.make("preAuditId", null), Cnd.where("id", "=", id));
}
if (stateCode.equals(ProposalState.DELEGATION)) {
proposalInfoService.update(Chain.make("delegationAuditId", null), Cnd.where("id", "=", id));
proposalInfoService.update(Chain.make("preAuditId", null), Cnd.where("id", "=", id));
}
// if (stateCode.equals(ProposalState.PREAUDIT)) {
// proposalInfoService.update(Chain.make("preAuditId", null), Cnd.where("id", "=", id));
// }
}
proposalInfoService.update(Chain.make("stateCode", stateCode), Cnd.where("id", "=", id));
});
return null;
}
}
@@ -0,0 +1,176 @@
package io.v.nutz.zhgh.proposal.controller.senior;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.DateUtil;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.ProposalAudit;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalCaseService;
import io.v.nutz.zhgh.proposal.services.ProposalCommonService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.zhgh.proposal.services.ProposalProcessService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.aop.interceptor.ioc.TransAop;
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 java.util.Arrays;
import java.util.List;
/**
* @author zhf
* @date 2022/1/25 10:32
* @description 修改立案结果
*/
@IocBean
@Ok("json:full")
@At("/platform/proposal/senior/modify/ResultCode")
public class ProposalModifyResultCodeController {
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalProcessService proposalProcessService;
@Inject
private ProposalCommonService proposalCommonService;
@Inject
private ProposalCaseService proposalCaseService;
@Inject
private Dao dao;
@At("")
@Ok("beetl:/platform/proposal/senior/modifyResultCode.html")
@RequiresPermissions("proposal.senior.ResultCode")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.senior.ResultCode")
public Object pageData(PageForm page, ProposalSearch search) {
CndPlus cnd = CndPlus.create();
cnd.and("info.stateCode", ">", ProposalState.CASE);
cnd.and("info.stateCode", "<", ProposalState.FEEDBACKSCORE);
return proposalInfoService.pageData(page, search, cnd);
}
@At
@ViReturn
@Aop(TransAop.READ_COMMITTED)
@RequiresPermissions("proposal.senior.ResultCode")
public Object doEdit(String id,
String resultCode,
@Param(value = "determineTypeCode", required = false) String determineTypeCode,
String hostUnit,
@Param(value = "helpUnits", required = false) String[] helpUnits,
ProposalAudit audit) {
audit.setAuditTime(DateUtil.getDateTime());
audit.setUserId((String) ShiroUtil.getPrincipalProperty("id"));
audit.setLoginName((String) ShiroUtil.getPrincipalProperty("loginname"));
audit.setUsername((String) ShiroUtil.getPrincipalProperty("username"));
audit.setProposalId(id);
List<String> conjoinList = proposalCommonService.findConjoin(id);
proposalCaseService.edit(conjoinList);
List<String> helpUnitList = Arrays.asList(helpUnits);
proposalCaseService.audit(conjoinList, resultCode, determineTypeCode, hostUnit, helpUnitList, null, audit, "many", 1);
// dao.clear(ProposalUnderTakeFirstOpinion.class, Cnd.where("proposalId", "=", id));
//// dao.clear(ProposalAudit.class, Cnd.where("proposalId", "=", id).and("id", "!=", proposalInfo.getCaseAuditId()));
// dao.clear(ProposalReply.class, Cnd.where("proposalId", "=", id));
// NutMap auditOther = NutMap.NEW()
// .addv("hostUnit", hostUnit)
// .addv("helpUnit", helpUnits);
//
// ProposalAudit proposalAudit = dao.fetch(ProposalAudit.class, Cnd.where("id", "=", proposalInfo.getCaseAuditId()));
// proposalAudit.setOpinion(opinion);
// proposalAudit.setOther(Json.toJson(auditOther));
// dao.updateIgnoreNull(proposalAudit);
//
//
// Trans.exec(() -> {
// ProposalInfo proposalInfo = dao.fetch(ProposalInfo.class, id);
//
// dao.clear(ProposalUnderTakeFirstOpinion.class, Cnd.where("proposalId", "=", id));
// dao.clear(ProposalAudit.class, Cnd.where("proposalId", "=", id).and("id", "!=", proposalInfo.getCaseAuditId()));
// dao.clear(ProposalReply.class, Cnd.where("proposalId", "=", id));
//
//
// NutMap auditOther = NutMap.NEW()
// .addv("hostUnit", hostUnit)
// .addv("helpUnit", helpUnits);
//
// ProposalAudit proposalAudit = dao.fetch(ProposalAudit.class, Cnd.where("id", "=", proposalInfo.getCaseAuditId()));
// proposalAudit.setOpinion(opinion);
// proposalAudit.setOther(Json.toJson(auditOther));
// dao.updateIgnoreNull(proposalAudit);
//
//
// switch (resultCode) {
// //立案 建议
// case ProposalConstant.DETERMINE, ProposalConstant.OPINION -> {
// int someNodeNextStateCode = proposalProcessService.getSomeNodeNextStateCode(ProposalState.CASE, ProposalStateDirectionEnum.NEXT);
// proposalInfo.setStateCode(someNodeNextStateCode);
// String proposalCode = proposalProcessService.getProposalCode(proposalInfo.getTeacherMeetingId(), resultCode);
// proposalInfo.setProposalCode(proposalCode);
// }
// //不立案
// case ProposalConstant.NOTGIVE -> {
// proposalInfo.setStateCode(900);
// String proposalCode = proposalProcessService.getProposalCode(proposalInfo.getTeacherMeetingId(), resultCode);
// proposalInfo.setProposalCode(proposalCode);
// }
// }
// proposalInfo.setResultCode(resultCode);
// dao.updateIgnoreNull(proposalInfo);
//
//
// if (Lang.list(ProposalConstant.DETERMINE, ProposalConstant.OPINION).contains(resultCode)) {
// ProposalReply hostReply = new ProposalReply();
// hostReply.setId(R.UU32());
// hostReply.setProposalId(id);
// hostReply.setReplyUnitId(hostUnit);
// hostReply.setUndertakeType(1);
// hostReply.setReplyNumber(1);
// hostReply.setIsReply(false);
// hostReply.setIsLeaderAudit(false);
// dao.insert(ProposalReply.class, Chain.from(hostReply));
//
// if (helpUnits.length > 0) {
// List<String> asList = Arrays.asList(helpUnits);
// asList.forEach(unit -> {
// ProposalReply helpReply = new ProposalReply();
// helpReply.setId(R.UU32());
// helpReply.setProposalId(id);
// helpReply.setReplyUnitId(unit);
// helpReply.setUndertakeType(2);
// helpReply.setReplyNumber(1);
// helpReply.setIsReply(false);
// helpReply.setIsLeaderAudit(false);
// dao.insert(ProposalReply.class, Chain.from(helpReply));
// });
// }
// }
//
// });
return null;
}
}
@@ -0,0 +1,178 @@
package io.v.nutz.zhgh.proposal.controller.senior;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.ProposalInfo;
import io.v.nutz.zhgh.proposal.models.ProposalReply;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalCommonService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.lang.Lang;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author: Aaron
* @create: 2021-01-30 15:51
* @description: 变更承办单位
**/
@IocBean
@Ok("json:full")
@At("/platform/proposal/senior/modify/undertake")
public class ProposalModifyUndertakeController {
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalCommonService proposalCommonService;
@Inject
private Dao dao;
@At("")
@Ok("beetl:/platform/proposal/senior/modifyUndertake.html")
@RequiresPermissions("proposal.senior.modify")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.senior.modify")
public Object pageData(PageForm page, ProposalSearch search) {
Sql sql = Sqls.create("""
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName,
(
SELECT
pu.unitName
FROM
proposal_reply pr
LEFT JOIN proposal_undertake pu ON pu.id = pr.replyUnitId
WHERE
pr.undertakeType = 1
AND pr.replyNumber = 1
AND pr.proposalId = info.id
)pruMaster,
(
SELECT
GROUP_CONCAT(pu.unitName)
FROM
proposal_reply pr
LEFT JOIN proposal_undertake pu ON pu.id = pr.replyUnitId
WHERE
pr.undertakeType = 2
AND pr.replyNumber = 1
AND pr.proposalId = info.id
ORDER BY pu.unitCode
) pruSlave
FROM
proposal_info info
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("info.stateCode", ">=", ProposalState.CASEUNIT);
cnd.and("info.stateCode", "<", ProposalState.FEEDBACKSCORE);
cnd.and("info.resultCode", "!=", ProposalConstant.NOTGIVE);
proposalInfoService.sortAndSearch(cnd, page, search);
sql.setCondition(cnd);
return proposalInfoService.list(page, sql);
// return proposalInfoService.pageData(page, search, cnd);
}
/**
* 变更承办单位
*
* @param id 提案ID
* @param hostUnit 主办单位ID
* @param helpUnits 协办单位ID
* @param isChangeProcess 变更流程?
* @return
*/
@At
@ViReturn
@Aop(TransAop.READ_COMMITTED)
@RequiresPermissions("proposal.senior.modify")
public Object doEdit(String id, String hostUnit, @Param(value = "helpUnits", required = false) String[] helpUnits, boolean isChangeProcess) {
List<String> conjoinList = proposalCommonService.findConjoin(id);
List<ProposalReply> replyList = dao.query(ProposalReply.class, Cnd.where("proposalId", "=", id));
String oldHostUnit = replyList.stream().filter(v -> v.getUndertakeType() == 1).map(v -> v.getReplyUnitId()).findFirst().orElse("");
List<String> oldHelpUnits = replyList.stream().filter(v -> v.getUndertakeType() == 2).map(v -> v.getReplyUnitId()).collect(Collectors.toList());
List<String> newHelpUnits = Arrays.asList(helpUnits);
List<String> needDeleteHelpUnits = oldHelpUnits.stream().filter(v -> !newHelpUnits.contains(v)).collect(Collectors.toList());
if (Lang.isNotEmpty(needDeleteHelpUnits)) {
dao.clear(ProposalReply.class, Cnd.where("replyUnitId", "IN", needDeleteHelpUnits).and("proposalId", "in", conjoinList));
}
for (String pid : conjoinList) {
//主办单位变更了
if (!hostUnit.equals(oldHostUnit)) {
dao.clear(ProposalReply.class, Cnd.where("replyUnitId", "=", oldHostUnit).and("proposalId", "=", pid));
ProposalReply reply = new ProposalReply();
reply.setProposalId(pid);
reply.setReplyUnitId(hostUnit);
reply.setReplyNumber(1);
reply.setUndertakeType(1);
reply.setIsReply(false);
reply.setLeaderCheckNumber(1);
reply.setIsLeaderAudit(false);
dao.insert(reply);
}
List<String> needInsertHelpUnits = Arrays.stream(helpUnits).filter(v -> !oldHelpUnits.contains(v)).collect(Collectors.toList());
if (Lang.isNotEmpty(needInsertHelpUnits)) {
for (String needInsertHelpUnit : needInsertHelpUnits) {
ProposalReply reply = new ProposalReply();
reply.setProposalId(pid);
reply.setReplyUnitId(needInsertHelpUnit);
reply.setReplyNumber(1);
reply.setUndertakeType(2);
reply.setIsReply(false);
reply.setLeaderCheckNumber(1);
reply.setIsLeaderAudit(false);
dao.insert(reply);
}
}
if (isChangeProcess) {
dao.update(ProposalInfo.class, Chain.make("stateCode", ProposalState.UNITREPLY), Cnd.where("id", "=", pid));
}
}
return null;
}
}
@@ -0,0 +1,50 @@
package io.v.nutz.zhgh.proposal.controller.senior;
import cn.wizzer.framework.base.Result;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.zhgh.proposal.constants.ProposalToDoHandler;
import io.v.nutz.zhgh.proposal.services.ProposalCommonService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.lang.Lang;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.POST;
import org.nutz.mvc.annotation.Param;
import java.util.Arrays;
@IocBean
@At("/platform/proposal/delete")
public class ProposalProposalDeleteController {
@Inject
private ProposalCommonService proposalCommonService;
@At("")
@Ok("beetl:/platform/proposal/senior/seniorDelete.html")
@RequiresPermissions("proposal.senior.delete")
public void index() {
}
@At
@POST
@Ok("json:full")
@ViReturn
@RequiresPermissions("proposal.senior.delete")
@Aop(TransAop.READ_COMMITTED)
public Object doBatchDelete(@Param("proposalIds") String[] proposalIds) {
if (Lang.isEmpty(proposalIds)) {
return Result.error("参数错误");
}
proposalCommonService.doBatchDelete(Arrays.asList(proposalIds));
for (String proposalId : proposalIds) {
ProposalToDoHandler.DELETE_PROCESS.exec(proposalId, null);
}
return null;
}
}
@@ -0,0 +1,50 @@
package io.v.nutz.zhgh.proposal.controller.senior;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
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;
/**
* @author: Aaron
* @create: 2021-01-30 14:43
* @description: 提案重新归类
**/
@IocBean
@Ok("json:full")
@At("/platform/proposal/senior/again")
public class ProposalReTypeController {
@Inject
private ProposalInfoService proposalInfoService;
@At("")
@Ok("beetl:/platform/proposal/senior/again.html")
@RequiresPermissions("proposal.senior.again")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.senior.again")
public Object pageData(PageForm page, ProposalSearch search) {
return proposalInfoService.pageData(page, search, CndPlus.create());
}
@At
@ViReturn
@RequiresPermissions("proposal.senior.again")
public Object reType(String id, String typeId) {
proposalInfoService.update(Chain.make("typeId", typeId), Cnd.where("id", "=", id));
return null;
}
}
@@ -0,0 +1,51 @@
package io.v.nutz.zhgh.proposal.controller.senior;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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;
/**
* @author: Aaron
* @create: 2021-01-29 16:35
* @description: 确认是否需要二次答复
**/
@IocBean
@Ok("json:full")
@At("/platform/proposal/senior/second")
public class ProposalSecondReplyController {
@Inject
private ProposalInfoService proposalInfoService;
@At("")
@Ok("beetl:/platform/proposal/senior/second.html")
@RequiresPermissions("proposal.senior.second")
public void index() {
}
@At
@ViReturn
public Object pageData(PageForm page, ProposalSearch search) {
CndPlus cnd = CndPlus.create();
cnd.and("info.resultCode", "=", ProposalConstant.DETERMINE);
// if (!search.getIsAudit()) {
// SqlExpressionGroup group = new SqlExpressionGroup();
// group.and("info.secondAuditId", "IS", null);
// group.and("info.stateCode", "=", ProposalState.HAS_SECOND_REPLY);
// cnd.and(group);
// } else {
// cnd.and("info.secondAuditId", "IS NOT", null);
// }
return proposalInfoService.pageData(page, search, cnd);
}
}
@@ -0,0 +1,103 @@
package io.v.nutz.zhgh.proposal.controller.senior;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.zhgh.proposal.services.ProposalUrgeService;
import io.v.nutz.sys.services.SysUserService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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 java.util.Arrays;
/**
* @author: Aaron
* @create: 2021-02-01 17:38
* @description: 提案催办
**/
@IocBean
@Ok("json:full")
@At("/platform/proposal/senior/urge")
public class ProposalUrgeController {
@Inject
private SysUserService sysUserService;
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalUrgeService proposalUrgeService;
@At("")
@Ok("beetl:/platform/proposal/senior/urge.html")
@RequiresPermissions("proposal.senior.urge")
public void index() {
}
@At
@ViReturn
public Object pageData(PageForm page, ProposalSearch search) {
CndPlus cnd = CndPlus.create();
Sql sql = Sqls.create("""
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName,
(SELECT COUNT(1) FROM proposal_urge urge WHERE urge.proposalId = info.id ) urgeNum,
((SELECT COUNT(1) FROM proposal_relation_undertake pru WHERE pru.proposalId = info.id and pru.isReply IS NOT TRUE)=0) isAllReply
FROM
proposal_info info
LEFT JOIN sys_user su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
$condition
""");
// cnd.and("info.stateCode", ">", ProposalState.CASE_REVIEW);
// cnd.and("info.stateCode", "<", ProposalState.COMMITTEE_REVIEW);
return proposalInfoService.pageData(sql, page, search, cnd);
}
@At
@ViReturn
public Object doUrge(String proposalId) {
return proposalUrgeService.doUrge(proposalId);
}
@At
@ViReturn
public Object doBatchUrge(@Param("ids") String[] ids) {
Arrays.stream(ids).forEach(v -> {
proposalUrgeService.doUrge(v);
});
return null;
}
@At
@ViReturn
public Object findUrgeRecord(String proposalId) {
return proposalUrgeService.query(Cnd.where("proposalId", "=", proposalId));
}
}
@@ -0,0 +1,290 @@
package io.v.nutz.zhgh.proposal.controller.statistics;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.zhgh.jdh.model.cb.Jdh_jdhxx;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.base.service.ViService;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.ArrayList;
import java.util.List;
/**
* @author: Aaron
* @create: @endYear-04-11 09:04
* @description: 提案年度查询综合数据
**/
@IocBean
@Ok("json:full")
@RequiresAuthentication
@At("/platform/proposal/statistics/complex")
public class ProposalComplexDataController {
@Inject
private ProposalInfoService proposalInfoService;
@Inject("Jdh_jdhxx")
private ViService<Jdh_jdhxx> meetingService;
@At("")
@Ok("beetl:/platform/proposal/statistics/complex.html")
@RequiresPermissions("proposal.statistics.complex")
public void index() {
}
@At
@ViReturn
public Object getData(String switchType, String meetingId, Integer startYear, Integer endYear) {
return switch (switchType) {
case "type" -> getTypeData(startYear, endYear);
case "union" -> getUnionData(startYear, endYear);
case "unit" -> getUnitData(startYear, endYear);
case "delegation" -> getDelegationData(meetingId, startYear, endYear);
default -> new ArrayList<>();
};
}
/**
* 根据年份查询教代会信息
*
* @param startYear 开始时间
* @param endYear 结束时间
* @return Object
*/
@At
@ViReturn
public Object getMeetingByYear(Integer startYear, Integer endYear) {
return meetingService.query(Cnd.where("YEAR(jdhkqsj)", ">=", startYear).and("YEAR(jdhkqsj)", "<=", endYear));
}
/**
* 根据提案类型查
*
* @param startYear 开始时间
* @param endYear 结束时间
* @return List<NutMap>
*/
private List<NutMap> getTypeData(Integer startYear, Integer endYear) {
Sql sql = Sqls.create("""
SELECT
*
FROM
(
SELECT
type.id,
type.typeName `name`,
type.typeCode,
(SELECT count( 1 ) FROM proposal_info info WHERE info.typeId = type.id AND info.stateCode <= 700 AND YEAR(info.createTime) >= @startYear AND YEAR(info.createTime) <= @endYear) num,'待立案审核' type,1 i
FROM
proposal_type type
UNION ALL
SELECT
type.id,
type.typeName `name`,
type.typeCode,
(SELECT count( 1 ) FROM proposal_info info WHERE info.typeId = type.id AND info.resultCode = 'determine' AND YEAR(info.createTime) >= @startYear AND YEAR(info.createTime) <= @endYear) num,'确定立案' type,2 i
FROM
proposal_type type
UNION ALL
SELECT
type.id,
type.typeName `name`,
type.typeCode,
(SELECT count( 1 ) FROM proposal_info info WHERE info.typeId = type.id AND info.resultCode = 'opinion' AND YEAR(info.createTime) >= @startYear AND YEAR(info.createTime) <= @endYear) num,'作为意见' type,3 i
FROM
proposal_type type
UNION ALL
SELECT
type.id,
type.typeName `name`,
type.typeCode,
(SELECT count( 1 ) FROM proposal_info info WHERE info.typeId = type.id AND info.resultCode = 'notGive' AND YEAR(info.createTime) >= @startYear AND YEAR(info.createTime) <= @endYear) num, '不予立案' type,4 i
FROM
proposal_type type
) info
ORDER BY
info.i,
info.typeCode
""").setParam("startYear", startYear).setParam("endYear", endYear);
return proposalInfoService.listMap(sql);
}
/**
* 根据工会查
*
* @param startYear 开始时间
* @param endYear 结束时间
* @return List<NutMap>
*/
private List<NutMap> getUnionData(Integer startYear, Integer endYear) {
Sql sql = Sqls.create("""
SELECT
*
FROM
(
SELECT
uni.id,
uni.unionname `name`,
uni.unioncode,
(SELECT count( 1 ) FROM proposal_info info LEFT JOIN sys_user u ON info.createUser = u.id LEFT JOIN sys_unit un ON u.unitid = un.id WHERE un.unionid = uni.id AND info.stateCode <= 700 AND YEAR(info.createTime) >= @startYear AND YEAR(info.createTime) <= @endYear) num,'待立案审核' type,1 i
FROM
sys_union uni
UNION ALL
SELECT
uni.id,
uni.unionname `name`,
uni.unioncode,
(SELECT count( 1 ) FROM proposal_info info LEFT JOIN sys_user u ON info.createUser = u.id LEFT JOIN sys_unit un ON u.unitid = un.id WHERE un.unionid = uni.id AND info.resultCode = 'determine' AND YEAR(info.createTime) >= @startYear AND YEAR(info.createTime) <= @endYear) num,'确定立案' type,2 i
FROM
sys_union uni
UNION ALL
SELECT
uni.id,
uni.unionname `name`,
uni.unioncode,
(SELECT count( 1 ) FROM proposal_info info LEFT JOIN sys_user u ON info.createUser = u.id LEFT JOIN sys_unit un ON u.unitid = un.id WHERE un.unionid = uni.id AND info.resultCode = 'opinion' AND YEAR(info.createTime) >= @startYear AND YEAR(info.createTime) <= @endYear) num,'作为意见' type,3 i
FROM
sys_union uni
UNION ALL
SELECT
uni.id,
uni.unionname `name`,
uni.unioncode,
(SELECT count( 1 ) FROM proposal_info info LEFT JOIN sys_user u ON info.createUser = u.id LEFT JOIN sys_unit un ON u.unitid = un.id WHERE un.unionid = uni.id AND info.resultCode = 'notGive' AND YEAR(info.createTime) >= @startYear AND YEAR(info.createTime) <= @endYear) num, '不予立案' type,4 i
FROM
sys_union uni
) info
ORDER BY
info.i,
info.unioncode
""").setParam("startYear", startYear).setParam("endYear", endYear);
return proposalInfoService.listMap(sql);
}
/**
* 根据单位查
*
* @param startYear 开始时间
* @param endYear 结束时间
* @return List<NutMap>
*/
private List<NutMap> getUnitData(Integer startYear, Integer endYear) {
Sql sql = Sqls.create("""
SELECT
*
FROM
(
SELECT
un.id,
un.`name` `name`,
un.unitcode,
(SELECT count( 1 ) FROM proposal_info info LEFT JOIN sys_user u ON info.createUser = u.id WHERE u.unitid = un.id AND info.stateCode <= 700 AND YEAR(info.createTime) >= @startYear AND YEAR(info.createTime) <= @endYear) num,'待立案审核' type,1 i
FROM
sys_unit un
UNION ALL
SELECT
un.id,
un.`name` `name`,
un.unitcode,
(SELECT count( 1 ) FROM proposal_info info LEFT JOIN sys_user u ON info.createUser = u.id WHERE u.unitid = un.id AND info.resultCode = 'determine' AND YEAR(info.createTime) >= @startYear AND YEAR(info.createTime) <= @endYear) num,'确定立案' type,2 i
FROM
sys_unit un
UNION ALL
SELECT
un.id,
un.`name` `name`,
un.unitcode,
(SELECT count( 1 ) FROM proposal_info info LEFT JOIN sys_user u ON info.createUser = u.id WHERE u.unitid = un.id AND info.resultCode = 'opinion' AND YEAR(info.createTime) >= @startYear AND YEAR(info.createTime) <= @endYear) num,'作为意见' type,3 i
FROM
sys_unit un
UNION ALL
SELECT
un.id,
un.`name` `name`,
un.unitcode,
(SELECT count( 1 ) FROM proposal_info info LEFT JOIN sys_user u ON info.createUser = u.id WHERE u.unitid = un.id AND info.resultCode = 'notGive' AND YEAR(info.createTime) >= @startYear AND YEAR(info.createTime) <= @endYear) num, '不予立案' type,4 i
FROM
sys_unit un
) info
ORDER BY
info.i,
info.unitcode
""").setParam("startYear", startYear).setParam("endYear", endYear);
return proposalInfoService.listMap(sql);
}
/**
* 根据代表团查
*
* @param startYear 开始时间
* @param endYear 结束时间
* @return List<NutMap>
*/
private List<NutMap> getDelegationData(String meetingId, Integer startYear, Integer endYear) {
Sql sql = Sqls.create("""
SELECT
*
FROM
(
SELECT
dbt.id,
dbt.dbtname `name`,
dbt.`code`,
(SELECT count( 1 ) FROM proposal_info info WHERE info.delegationId = dbt.id AND dbt.jdhid = @meetingId AND info.stateCode <= 700 AND YEAR(info.createTime) >= @startYear AND YEAR(info.createTime) <= @endYear) num,'待立案审核' type,1 i
FROM
jdh_dbt dbt
UNION ALL
SELECT
dbt.id,
dbt.dbtname `name`,
dbt.`code`,
(SELECT count( 1 ) FROM proposal_info info WHERE info.delegationId = dbt.id AND dbt.jdhid = @meetingId AND info.resultCode = 'determine' AND YEAR(info.createTime) >= @startYear AND YEAR(info.createTime) <= @endYear) num,'确定立案' type,2 i
FROM
jdh_dbt dbt
UNION ALL
SELECT
dbt.id,
dbt.dbtname `name`,
dbt.`code`,
(SELECT count( 1 ) FROM proposal_info info WHERE info.delegationId = dbt.id AND dbt.jdhid = @meetingId AND info.resultCode = 'opinion' AND YEAR(info.createTime) >= @startYear AND YEAR(info.createTime) <= @endYear) num,'作为意见' type,3 i
FROM
jdh_dbt dbt
UNION ALL
SELECT
dbt.id,
dbt.dbtname `name`,
dbt.`code`,
(SELECT count( 1 ) FROM proposal_info info WHERE info.delegationId = dbt.id AND dbt.jdhid = @meetingId AND info.resultCode = 'notGive' AND YEAR(info.createTime) >= @startYear AND YEAR(info.createTime) <= @endYear) num, '不予立案' type,4 i
FROM
jdh_dbt dbt
) info
ORDER BY
info.i,
info.`code`
""").setParam("meetingId", meetingId).setParam("startYear", startYear).setParam("endYear", endYear);
return proposalInfoService.listMap(sql);
}
}
@@ -0,0 +1,116 @@
package io.v.nutz.zhgh.proposal.controller.statistics;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalDataBoardService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.Strings;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
/**
* 提案数据看板
*
* @author jug
* @date 2023/06/30
*/
@IocBean
@Ok("json:full")
@At("/platform/proposal/statistics/board")
public class ProposalDataBoardController {
@Inject
private ProposalDataBoardService proposalDataBoardService;
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private Vi vi;
@At("")
@Ok("beetl:/platform/proposal/statistics/board.html")
@RequiresPermissions("proposal.statistics.board")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.statistics.board")
public Object pageData(PageForm page, ProposalSearch search, String type) {
return proposalDataBoardService.pageData(page, search, type);
}
@At
@ViReturn
@RequiresPermissions("proposal.statistics.board")
public Object numData(String meetingId) {
return proposalDataBoardService.numData(meetingId);
}
@At
@ViReturn
@RequiresPermissions("proposal.statistics.board")
public Object getChatData(String meetingId) {
Sql sql = Sqls.create("""
SELECT
*
FROM
(
SELECT
type.id,
type.typeName,
type.typeCode,
(SELECT count( 1 ) FROM proposal_info info LEFT JOIN sys_user u ON info.createUser = u.id LEFT JOIN sys_unit un ON u.unitid = un.id WHERE info.typeId = type.id AND info.stateCode <= @case $meeting $union ) num,'待立案审核' type,1 i
FROM
proposal_type type UNION ALL
SELECT
type.id,
type.typeName,
type.typeCode,
(SELECT count( 1 ) FROM proposal_info info LEFT JOIN sys_user u ON info.createUser = u.id LEFT JOIN sys_unit un ON u.unitid = un.id WHERE info.typeId = type.id AND info.resultCode = @determine $meeting $union) num,'确定立案' type,2 i
FROM
proposal_type type UNION ALL
SELECT
type.id,
type.typeName,
type.typeCode,
(SELECT count( 1 ) FROM proposal_info info LEFT JOIN sys_user u ON info.createUser = u.id LEFT JOIN sys_unit un ON u.unitid = un.id WHERE info.typeId = type.id AND info.resultCode = @opinion $meeting $union) num,'作为意见' type,3 i
FROM
proposal_type type UNION ALL
SELECT
type.id,
type.typeName,
type.typeCode,
(SELECT count( 1 ) FROM proposal_info info LEFT JOIN sys_user u ON info.createUser = u.id LEFT JOIN sys_unit un ON u.unitid = un.id WHERE info.typeId = type.id AND info.resultCode = @notGive $meeting $union ) num, '不予立案' type,4 i
FROM
proposal_type type
) info
ORDER BY
info.i
""").setParam("case", ProposalState.CASE)
.setParam("determine", ProposalConstant.DETERMINE)
.setParam("opinion", ProposalConstant.OPINION)
.setParam("notGive", ProposalConstant.NOTGIVE)
.setVar("meeting", Strings.isNotBlank(meetingId) ? "AND info.teacherMeetingId = '" + meetingId + "'" : "");
if (!ShiroUtil.hasAnyRoles(new String[]{"sysadmin", "A06", "tamange"})) {
if (ShiroUtil.hasRole("H04")) {
sql.setVar("union", "AND un.unionid in " + vi.getMangeUnionStr());
}
}
return proposalInfoService.listMap(sql);
}
}
@@ -0,0 +1,83 @@
package io.v.nutz.zhgh.proposal.controller.statistics;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.Roles;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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;
/**
* @author: Aaron
* @create: 2021-02-02 16:58
* @description: 代表团提案汇总
**/
@IocBean
@Ok("json:full")
@At("/platform/proposal/statistics/delegation")
public class ProposalDelegationSumController {
@Inject
private ProposalInfoService proposalInfoService;
@At("")
@Ok("beetl:/platform/proposal/statistics/delegation.html")
@RequiresPermissions("proposal.statistics.delegation")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.statistics.delegation")
public Object pageData(PageForm page, ProposalSearch search) {
CndPlus cnd = CndPlus.create();
cnd.and("info.stateCode", ">", ProposalState.UNSUBMIT);
return proposalInfoService.pageData(page, search, cnd);
}
@At
@ViReturn
@RequiresPermissions("proposal.statistics.delegation")
public Object corpsPageData(String meetingId) {
CndPlus cnd = CndPlus.create();
Sql sql = Sqls.create("""
SELECT
dbt.id,
dbt.dbtname,
(SELECT COUNT(1) FROM proposal_info info WHERE info.delegationId = dbt.id AND info.teacherMeetingId = dbt.jdhid AND info.stateCode > @unSubmit) total,
(SELECT COUNT(1) FROM proposal_info info WHERE info.delegationId = dbt.id AND info.teacherMeetingId = dbt.jdhid AND info.resultCode = @determine) determine,
(SELECT COUNT(1) FROM proposal_info info WHERE info.delegationId = dbt.id AND info.teacherMeetingId = dbt.jdhid AND info.resultCode = @opinion) opinion,
(SELECT COUNT(1) FROM proposal_info info WHERE info.delegationId = dbt.id AND info.teacherMeetingId = dbt.jdhid AND info.resultCode = @notGive) notGive
FROM
jdh_dbt dbt $condition
""");
sql.setParam("unSubmit", ProposalState.UNSUBMIT);
sql.setParam("determine", ProposalConstant.DETERMINE);
sql.setParam("opinion", ProposalConstant.OPINION);
sql.setParam("notGive", ProposalConstant.NOTGIVE);
if (!ShiroUtil.hasAnyRoles(new String[]{"sysadmin", "A06", "tamange"})) {
if (ShiroUtil.hasRole("jdhdbt01")) {
cnd.and("dbt.id", " in ", "SELECT sur.dbtid FROM sys_user_role sur WHERE sur.userId = '" + ShiroUtil.getPrincipalProperty("id") + "' AND sur.roleId = '" + Roles.DBT_TZ + "' AND sur.jdhid = '" + meetingId + "'");
}
}
cnd.andEx("dbt.jdhid", "=", meetingId);
cnd.asc("dbt.`code`");
sql.setCondition(cnd);
return proposalInfoService.listMap(sql);
}
}
@@ -0,0 +1,152 @@
package io.v.nutz.zhgh.proposal.controller.statistics;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.service.BaseService;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.sys.models.Sys_dict;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.GET;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.text.NumberFormat;
import java.util.List;
import java.util.stream.Collectors;
/**
* 提案办理详情
*/
@IocBean
@At("/platform/proposal/statistics/handletype")
@Ok("json:full")
public class ProposalHandleTypeController {
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private BaseService baseService;
@Inject
private Dao dao;
@At("")
@Ok("beetl:/platform/proposal/statistics/handleInfo.html")
@RequiresPermissions("proposal.statistics.handletype")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.statistics.handletype")
public Object getData(String teacherMeetingId) {
Sql sql = Sqls.create("""
SELECT
type.id AS typeId,
type.typeCode,
type.typeName,
count( 1 ) AS totalCount,
count( CASE WHEN info.resultCode = 'determine' THEN 1 ELSE NULL END ) laCount,
count( CASE WHEN info.resultCode = 'determine' AND info.determineTypeCode = 'emphasis' THEN 1 ELSE NULL END ) zdCount,
count( CASE WHEN info.resultCode = 'opinion' THEN 1 ELSE NULL END ) jyCount,
count( CASE WHEN info.resultCode = 'notGive' THEN 1 ELSE NULL END ) caCount,
count( CASE WHEN ( info.resultCode = 'determine' AND fb.feedbackCode = 'satisfied' ) THEN 1 ELSE NULL END ) myCount,
count( CASE WHEN info.resultCode = 'determine' AND fb.feedbackCode = 'QuiteSatisfied' THEN 1 ELSE NULL END ) bjmyCount,
count( CASE WHEN info.resultCode = 'determine' AND fb.feedbackCode = 'NotSatisfied' THEN 1 ELSE NULL END ) bmyCount
$jbmySql
FROM
proposal_type type
LEFT JOIN proposal_info info ON info.typeId = type.id
LEFT JOIN proposal_feedback fb ON fb.proposalId = info.id
WHERE
info.teacherMeetingId = @teacherMeetingId
AND info.resultCode IS NOT NULL
GROUP BY
type.id
ORDER BY
type.typeCode
""");
Sys_dict parentDict = dao.fetch(Sys_dict.class, Cnd.where("code", "=", "proposal_feedback"));
List<Sys_dict> childrenDicts = dao.query(Sys_dict.class, Cnd.where("parentId", "=", parentDict.getId()).and("disabled", "=", 0));
List<String> childrenDictNames = childrenDicts.stream().map(v -> v.getCode()).collect(Collectors.toList());
if (childrenDictNames.contains(ProposalConstant.BASICALLY_SATISFIED)) {
sql.setVar("jbmySql", ",count( CASE WHEN info.resultCode = 'determine' AND fb.feedbackCode = 'BasicallySatisfied' THEN 1 ELSE NULL END ) jbmyCount");
}
sql.setParam("teacherMeetingId", teacherMeetingId);
List<NutMap> list = baseService.listMap(sql);
NumberFormat numberFormat = NumberFormat.getInstance();
numberFormat.setMaximumFractionDigits(2);
long totalCount = list.stream().mapToLong(v -> v.getInt("totalCount")).sum();
list.forEach(v -> {
float proportion = v.getFloat("totalCount") / (float) totalCount;
v.put("proportion", numberFormat.format(proportion * 100) + "%");
});
return list;
}
/**
* 查询某个类型的提案集合
*
* @param meetingId
* @param typeId
* @return
*/
@At
@GET
@ViReturn
@Ok("json:full")
@RequiresPermissions("proposal.statistics.handletype")
public Object selectProposalByType(@Param("meetingId") String meetingId, @Param("typeId") String typeId) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.proposalCode,
info.proposalName,
u.username,
state.stateName,
state.stateColor,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName
FROM
proposal_info info
LEFT JOIN proposal_reply pr ON pr.proposalId = info.id
LEFT JOIN sys_user u on u.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
WHERE
info.teacherMeetingId = @meetingId
AND info.typeId = @typeId
AND info.resultCode IS NOT NULL
GROUP BY info.id
ORDER BY info.proposalCode
""");
sql.setParam("meetingId", meetingId);
sql.setParam("typeId", typeId);
return proposalInfoService.listMap(sql);
}
}
@@ -0,0 +1,39 @@
package io.v.nutz.zhgh.proposal.controller.statistics;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalHandlingProgressService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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
@Ok("json:full")
@At("/platform/proposal/statistics/handlingProgress")
public class ProposalHandlingProgressController {
@Inject
private ProposalHandlingProgressService proposalHandlingProgressService;
@At("")
@Ok("beetl:/platform/proposal/statistics/handlingProgress.html")
@RequiresPermissions("proposal.statistics.handling.progress")
public void index() {
}
@At("/pageData")
@ViReturn
@RequiresPermissions("proposal.statistics.handling.progress")
public Object pageData(PageForm page, ProposalSearch search, @Param(value = "stateCnd", required = false) String[] stateCnd) {
return proposalHandlingProgressService.pageData(page, search, stateCnd);
}
}
@@ -0,0 +1,168 @@
package io.v.nutz.zhgh.proposal.controller.statistics;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalExportService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.Lang;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author zxy
* @Description TODO
* @createTime 2022年02月10日 16:01:00
*/
@IocBean
@At({"/platform/proposal/statistics/history", "/platform/proposal/statistics/mySearch"})
public class ProposalHistoryController {
@Inject
private Vi vi;
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalExportService proposalExportService;
@At("")
@Ok("beetl:/platform/proposal/statistics/history.html")
@RequiresPermissions(value = {"proposal.statistics.history", "proposal.statistics.mySearch"}, logical = Logical.OR)
public void index() {
}
@At
@ViReturn
@Ok("json:full")
@RequiresPermissions(value = {"proposal.statistics.history", "proposal.statistics.mySearch"}, logical = Logical.OR)
public Object pageData(PageForm page, ProposalSearch search,
@Param(value = "stateCode", required = false) String stateCode,
@Param(value = "delegationName", required = false) String delegationName,
@Param(value = "underTakeId", required = false) String underTakeId,
@Param(value = "proposalTypes", required = false) String[] proposalTypes,
@Param(value = "proposalResult", required = false) String[] proposalResult,
@Param(value = "meetingIds", required = false) String[] meetingIds,
@Param(value = "searchNames", required = false) String[] searchNames,
@Param(value = "determineTypeOptions", required = false) String[] determineTypeOptions) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName,
zbpu.unitName as pruMaster,
zbpu.unitCode as pruMasterCode,
xbpu.unitName as pruSlave
FROM
proposal_info info
LEFT JOIN sys_user su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
LEFT JOIN proposal_reply zbpr ON zbpr.proposalId = info.id\s
AND zbpr.undertakeType = 1
LEFT JOIN proposal_undertake zbpu ON zbpu.id = zbpr.replyUnitId
LEFT JOIN proposal_reply xbpr ON xbpr.proposalId = info.id\s
AND xbpr.undertakeType = 2
LEFT JOIN proposal_undertake xbpu ON xbpu.id = xbpr.replyUnitId\s
$condition
""");
cnd.andEX("info.stateCode", "=", stateCode);
cnd.andEX("dbt.dbtname", "=", delegationName);
if (StrUtil.isNotBlank(underTakeId)) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.and("zbpr.replyUnitId", "=", underTakeId);
seg.or("xbpr.replyUnitId", "=", underTakeId);
cnd.and(seg);
}
if (!ShiroUtil.hasAnyRoles(new String[]{"sysadmin", "A06", "tamange", "jdhdbt01", "H01"})) {
if (ShiroUtil.hasRole("H04")) {
cnd.and("su.unionid", " in ", vi.getMangeUnionStr());
}
}
if (proposalTypes != null && proposalTypes.length > 0) {
cnd.and("info.typeId", "in", proposalTypes);
}
if (proposalResult != null && proposalResult.length > 0) {
cnd.and("info.resultCode", "in", proposalResult);
if (ArrayUtil.contains(proposalResult, ProposalConstant.DETERMINE)) {
if (determineTypeOptions != null && determineTypeOptions.length > 0) {
cnd.and("info.determineTypeCode", "in", determineTypeOptions);
}
}
}
if (meetingIds != null && meetingIds.length > 0) {
cnd.and("info.teacherMeetingId", "in", meetingIds);
}
proposalInfoService.sortAndSearch(cnd, page, search);
if (Lang.isNotEmpty(searchNames) && StrUtil.isNotBlank(page.getSearchKeyword().trim())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
//去除用户输入两端空格
String[] keywords = page.getSearchKeyword().trim().split(" ");
if (ArrayUtil.contains(searchNames, "zbpr.replyContent")) {
ArrayUtil.append(searchNames, "xbpr.replyContent");
}
if (ArrayUtil.contains(searchNames, "su.username")) {
ArrayUtil.append(searchNames, "su.loginname");
}
for (String searchName : searchNames) {
for (String keyword : keywords) {
seg.orLike(searchName, keyword);
}
}
cnd.and(seg);
}
cnd.groupBy("info.id");
sql.setCondition(cnd);
return proposalInfoService.listPageMap(page.getPageNumber(), page.getPageSize(), sql);
}
@At
@Ok("void")
@RequiresPermissions(value = {"proposal.statistics.history", "proposal.statistics.mySearch"}, logical = Logical.OR)
public void oneProposalExport(String proposalId, HttpServletResponse response) {
try {
proposalExportService.exportFull(proposalId, response);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
@@ -0,0 +1,113 @@
package io.v.nutz.zhgh.proposal.controller.statistics;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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;
/**
* @author: Aaron
* @create: 2021-02-03 15:23
* @description: 提案综合统计图表
**/
@IocBean
@Ok("json:full")
@At("/platform/proposal/statistics/chart")
public class ProposalIntegratedChartController {
@Inject
private Vi vi;
@Inject
private ProposalInfoService proposalInfoService;
@At("")
@Ok("beetl:/platform/proposal/statistics/chart.html")
@RequiresPermissions("proposal.statistics.chart")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.statistics.chart")
public Object satisfiedData(String meetingId) {
Sql sql = Sqls.create("""
SELECT
dict.`name`,
(SELECT COUNT(1) FROM proposal_info info LEFT JOIN proposal_feedback pf ON pf.proposalId = info.id WHERE info.teacherMeetingId = @meetingId AND pf.feedbackCode = dict.`code` AND pf.feedbackNumber = (SELECT MAX(feedbackNumber) FROM proposal_feedback WHERE proposalId = info.id)) num
FROM
sys_dict dict
WHERE
dict.parentId = (SELECT id FROM sys_dict dict WHERE dict.`code` = 'proposal_feedback')
""").setParam("meetingId", meetingId);
return proposalInfoService.listMap(sql);
}
@At
@ViReturn
@RequiresPermissions("proposal.statistics.chart")
public Object resultData(String meetingId) {
Sql sql = Sqls.create("""
SELECT
dict.`name`,
( SELECT COUNT( 1 ) FROM proposal_info info WHERE info.teacherMeetingId = @meetingId AND info.resultCode = dict.`code` ) num ,'数量' type
FROM
sys_dict dict
WHERE
dict.parentId = (SELECT id FROM sys_dict dict WHERE dict.`code` = 'proposal_result')
UNION ALL
SELECT
dict.`name`,
concat(truncate(((SELECT COUNT( 1 ) FROM proposal_info info WHERE info.teacherMeetingId = @meetingId AND info.resultCode = dict.`code` )/( SELECT COUNT( 1 ) FROM proposal_info info WHERE info.teacherMeetingId = @meetingId)) * 100,2),'%') num, '百分比' type
FROM
sys_dict dict
WHERE
dict.parentId = (SELECT id FROM sys_dict dict WHERE dict.`code` = 'proposal_result')
""").setParam("meetingId", meetingId);
return proposalInfoService.listMap(sql);
}
@At
@ViReturn
@RequiresPermissions("proposal.statistics.chart")
public Object typeData(String meetingId) {
Sql sql = Sqls.create("""
SELECT
pt.typeName,
(SELECT COUNT(1) FROM proposal_info info WHERE info.typeId = pt.id AND info.teacherMeetingId = @meetingId) num
FROM
proposal_type pt
ORDER BY pt.typeCode
""").setParam("meetingId", meetingId);
return proposalInfoService.listMap(sql);
}
@At
@ViReturn
@RequiresPermissions("proposal.statistics.chart")
public Object stateData(String meetingId) {
Sql sql = Sqls.create("""
SELECT
ps.stateName,
(SELECT COUNT(1) FROM proposal_info info WHERE info.stateCode = ps.stateCode AND info.teacherMeetingId = @meetingId) num
FROM
proposal_state ps
WHERE
ps.isEnable IS TRUE
ORDER BY
ps.stateCode
""").setParam("meetingId", meetingId);
return proposalInfoService.listMap(sql);
}
}
@@ -0,0 +1,143 @@
package io.v.nutz.zhgh.proposal.controller.statistics;
import cn.hutool.core.util.ArrayUtil;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalExportService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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 java.io.IOException;
/**
* @author: Aaron
* @create: 2021-02-02 14:29
* @description: 综合查询
**/
@IocBean
@Ok("json:full")
@At("/platform/proposal/statistics/integrated")
public class ProposalIntegratedController {
@Inject
private Vi vi;
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalExportService proposalExportService;
@At("")
@Ok("beetl:/platform/proposal/statistics/integrated.html")
@RequiresPermissions("proposal.statistics.integrated")
public void index() {
}
@At("/two")
@Ok("beetl:/platform/proposal/statistics/integrated.html")
@RequiresPermissions("proposal.statistics.integrated.two")
public void two() {
}
@At
@ViReturn
@RequiresPermissions(value = {"proposal.statistics.integrated", "proposal.statistics.integrated.two", "proposal.senior.delete"}, logical = Logical.OR)
public Object pageData(PageForm page, ProposalSearch search, @Param(value = "stateCode", required = false) String stateCode, @Param(value = "proposalTypes", required = false) String[] proposalTypes, @Param(value = "proposalResult", required = false) String[] proposalResult, @Param(value = "determineTypeOptions", required = false) String[] determineTypeOptions, @Param(value = "undertakeId", required = false) String undertakeId) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName,
zbpu.unitName pruMaster,
zbpu.unitCode pruMasterCode,
GROUP_CONCAT( DISTINCT xbpu.unitName ) pruSlave,
lalevel.`name` laLevelName,
( SELECT
fcsd.`name`
FROM
proposal_feedback pf
LEFT JOIN sys_dict fcsd ON fcsd.`code` = pf.feedbackCode
WHERE
pf.proposalId = info.id
ORDER BY
pf.feedbackNumber
LIMIT 1
)feedBackResultName
FROM
proposal_info info
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
LEFT JOIN proposal_reply zbpr ON zbpr.proposalId = info.id AND zbpr.undertakeType = 1
LEFT JOIN proposal_undertake zbpu ON zbpu.id = zbpr.replyUnitId
LEFT JOIN proposal_reply xbpr ON xbpr.proposalId = info.id AND xbpr.undertakeType = 2
LEFT JOIN proposal_underTake xbpu ON xbpu.id = xbpr.replyUnitId
LEFT JOIN sys_dict lalevel ON lalevel.`code` = info.determineTypeCode
LEFT JOIN proposal_reply pr on pr.proposalId = info.id
$condition
""");
cnd.groupBy("info.id");
cnd.andEX("info.stateCode", "=", stateCode);
if (!ShiroUtil.hasAnyRoles(new String[]{"sysadmin", "A06", "tamange", "jdhdbt01"})) {
if (ShiroUtil.hasRole("H04")) {
cnd.and("su.unionid", " in ", vi.getMangeUnionStr());
}
}
if (proposalTypes != null && proposalTypes.length > 0) {
cnd.and("info.typeId", "in", proposalTypes);
}
if (proposalResult != null && proposalResult.length > 0) {
cnd.and("info.resultCode", "in", proposalResult);
if (ArrayUtil.contains(proposalResult, ProposalConstant.DETERMINE)) {
if (determineTypeOptions != null && determineTypeOptions.length > 0) {
cnd.and("info.determineTypeCode", "in", determineTypeOptions);
}
}
}
cnd.andEX("pr.replyUnitId", "=", undertakeId);
proposalInfoService.sortAndSearch(cnd, page, search);
sql.setCondition(cnd);
return proposalInfoService.listPageMap(page.getPageNumber(), page.getPageSize(), sql);
}
@At
@Ok("void")
@RequiresPermissions(value = {"proposal.statistics.integrated", "proposal.statistics.integrated.two", "proposal.senior.delete"}, logical = Logical.OR)
public void oneProposalExport(String proposalId, HttpServletResponse response) {
try {
proposalExportService.exportFull(proposalId, response);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
@@ -0,0 +1,195 @@
package io.v.nutz.zhgh.proposal.controller.statistics;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.zhgh.jdh.model.db.Jdh_db;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalConfigService;
import io.v.nutz.zhgh.proposal.services.ProposalExportService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.zhgh.proposal.services.ProposalProgressService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.POST;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@IocBean
@At("/platform/proposal/statistics/progress")
@Ok("json:full")
public class ProposalProgressController {
@Inject
private Vi vi;
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalProgressService proposalProgressService;
@Inject
private ProposalConfigService proposalConfigService;
@Inject
private ProposalExportService proposalExportService;
@At("")
@Ok("beetl:/platform/proposal/statistics/progress.html")
@RequiresPermissions("proposal.statistics.progress")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.statistics.progress")
public Object pageData(PageForm page,
ProposalSearch search,
@Param(value = "stateCode", required = false) String stateCode,
@Param(value = "proposalTypes", required = false) String[] proposalTypes,
@Param(value = "proposalResult", required = false) String[] proposalResult,
@Param(value = "searchName2", required = false) String searchName2,
@Param(value = "searchKeyword2", required = false) String searchKeyword2,
@Param(value = "levyStates", required = false) Integer[] levyStates) {
CndPlus cnd = CndPlus.create();
cnd.andEx("info.stateCode", "=", stateCode);
if (!ShiroUtil.hasAnyRoles(new String[]{"sysadmin", "A06", "tamange"})) {
if (ShiroUtil.hasAnyRoles("jdhdbt01,jdhdbt02")) {
Jdh_db jdhDb = proposalInfoService.dao().fetch(Jdh_db.class, Cnd.where("dbid", "=", ShiroUtil.getUserId()).and("jdhid", "=", search.getMeetingId()));
cnd.and("info.delegationId", " = ", jdhDb.getDbtid());
}
if (ShiroUtil.hasRole("H04")) {
cnd.and("su.unionid", " in ", vi.getMangeUnionStr());
}
}
if (proposalTypes != null && proposalTypes.length > 0) {
cnd.and("info.typeId", "in", proposalTypes);
}
if (proposalResult != null && proposalResult.length > 0) {
cnd.and("info.resultCode", "in", proposalResult);
}
if (levyStates != null && levyStates.length > 0) {
if (ArrayUtil.contains(levyStates, 0)) {
cnd.and("info.stateCode", "=", ProposalState.UNSUBMIT);
}
if (ArrayUtil.contains(levyStates, 1)) {
cnd.and("info.stateCode", "=", ProposalState.INVIRTE);
cnd.and(new Static("(select count(1) from proposal_seconded where isAgree is null and proposalId = info.id) > 0"));
}
if (ArrayUtil.contains(levyStates, 2)) {
cnd.and("info.stateCode", "=", ProposalState.INVIRTE);
cnd.and(new Static("(select count(1) from proposal_seconded where isAgree is not null and proposalId = info.id) > 0"));
}
if (ArrayUtil.contains(levyStates, 3)) {
cnd.and("info.stateCode", "=", ProposalState.DELEGATION);
}
if (ArrayUtil.contains(levyStates, 4)) {
cnd.and("info.stateCode", ">", ProposalState.DELEGATION);
}
}
Sql sql = Sqls.create("""
SELECT
su.username,
su.loginname,
su.mobile,
su.unitname,
(select count(DISTINCT(seconderId))from proposal_seconded where proposalId = info.id) AS secondedNum,
(select count(DISTINCT(seconderId))from proposal_seconded where proposalId = info.id and isAgree = 1) AS secondedAgreeNum,
IF(info.delegationAuditId is NULL,'未审核','已审核') AS delegationAudit,
info.id,
info.proposalName,
info.proposalCode,
state.stateName,
state.stateColor,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName
FROM
proposal_info info
LEFT JOIN proposal_seconded ps on ps.proposalId = info.id
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
$condition
""");
cnd.and("info.teacherMeetingId", "=", search.getMeetingId());
if (Strings.isNotBlank(page.getSearchName()) && Strings.isNotBlank(page.getSearchKeyword())) {
cnd.where().andLike(page.getSearchName(), page.getSearchKeyword());
}
if (Strings.isNotBlank(searchName2) && Strings.isNotBlank(searchKeyword2)) {
cnd.where().andLike(searchName2, searchKeyword2);
}
if (StrUtil.isNotBlank(page.getPageOrderName()) && StrUtil.isNotBlank(page.getPageOrderBy())) {
if (page.getPageOrderBy().equals("descending")) {
cnd.orderBy(page.getPageOrderName(), "DESC");
} else if (page.getPageOrderBy().equals("ascending")) {
cnd.orderBy(page.getPageOrderName(), "ASC");
}
}
if (Strings.isNotBlank(search.getCreateUser())) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.orLike("su.username", search.getCreateUser());
group.orLike("su.loginname", search.getCreateUser());
cnd.and(group);
}
cnd.andEx("info.delegationId", "=", search.getDelegationId());
cnd.andEx("su.unionId", "=", search.getUnionId());
cnd.andEx("su.unitId", "=", search.getUnitId());
cnd.groupBy("info.id");
cnd.desc("info.proposalCode");
sql.setCondition(cnd);
return proposalInfoService.listPageMap(page.getPageNumber(), page.getPageSize(), sql);
}
@At
@POST
@ViReturn
@RequiresPermissions("proposal.statistics.progress")
public Object remindProposalCreator(@Param("teacherMeetingId") String teacherMeetingId) {
proposalConfigService.remindProposalCreator(teacherMeetingId);
return null;
}
@At
@Ok("void")
@RequiresPermissions("proposal.statistics.progress")
public void oneProposalExport(String proposalId, HttpServletResponse response) {
try {
proposalExportService.exportFull(proposalId, response);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
@@ -0,0 +1,334 @@
package io.v.nutz.zhgh.proposal.controller.statistics;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.OfficeTemplateUtil;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.zhgh.jdh.model.cb.Jdh_jdhxx;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalExportService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.base.utils.ViTool;
import lombok.Data;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.json.Json;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.*;
/**
* @author: Aaron
* @create: 2021-02-04 09:14
* @description: 提案汇总导出
**/
@IocBean
@Ok("json:full")
@At("/platform/proposal/statistics/summary")
public class ProposalSummaryController {
@Inject
private Vi vi;
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private OfficeTemplateUtil officeTemplateUtil;
@Inject
private ProposalExportService proposalExportService;
@At("")
@Ok("beetl:/platform/proposal/statistics/summary.html")
@RequiresPermissions("proposal.statistics.summary")
public void index() {
}
@At
@ViReturn
public Object pageData(PageForm page, ProposalSearch search, String undertakeId, String stateCode, String delegationId, String typeId) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName
FROM
proposal_info info
LEFT JOIN proposal_reply pr ON pr.proposalId = info.id
LEFT JOIN sys_user su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
$condition
""");
if (!ShiroUtil.hasAnyRoles(new String[]{"sysadmin", "A06", "tamange", "jdhdbt01"})) {
if (ShiroUtil.hasRole("H04")) {
cnd.and("su.unionid", " in ", vi.getMangeUnionStr());
}
}
cnd.andEX("info.stateCode", "=", stateCode);
cnd.andEX("info.typeId", "=", typeId);
cnd.andEX("info.delegationId", "=", delegationId);
cnd.andEX("pr.replyUnitId", "=", undertakeId);
cnd.groupBy("info.id");
proposalInfoService.sortAndSearch(cnd, page, search);
sql.setCondition(cnd);
return proposalInfoService.listPageMap(page.getPageNumber(), page.getPageSize(), sql);
}
/**
* 按届次导出提案
*
* @param meetingId 教代会届次ID
*/
@At
@Ok("void")
public void sessionExport(String props, String meetingId, String stateCode, String delegationId, String typeId, HttpServletResponse response) {
try {
CndPlus cnd = CndPlus.create();
Sql sql = Sqls.create("""
SELECT
info.proposalCode,
info.proposalName,
info.createTime,
type.typeName,
u.loginname,
u.username,
u.unionname,
result.`name` resultName,
jdh.jdhallname meetingName,
state.stateName,
dbt.dbtname AS delegationName,
GROUP_CONCAT( pu.unitName,( CASE pr.undertakeType WHEN 1 THEN '(主办)' WHEN 2 THEN '(协办)' END )) undertakeName
FROM
proposal_info info
LEFT JOIN proposal_reply pr ON pr.proposalId = info.id
LEFT JOIN proposal_undertake pu ON pu.id = pr.replyUnitId
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN `user` u ON u.id = info.createUser
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
$condition
""");
cnd.andEx("info.teacherMeetingId", "=", meetingId);
cnd.andEx("info.stateCode", "=", stateCode);
cnd.andEx("info.delegationId", "=", delegationId);
cnd.andEx("info.typeId", "=", typeId);
cnd.groupBy("pr.proposalId");
sql.setCondition(cnd);
List<NutMap> list = proposalInfoService.listMap(sql);
String jdhallname = proposalInfoService.dao().fetch(Jdh_jdhxx.class, Cnd.where("id", "=", meetingId)).getJdhallname();
List<ExportEntity> exportList = proposalInfoService.listEntity(sql, ExportEntity.class);
Map<String, String> propMap = Json.fromJson(Map.class, props);
List<ExcelExportEntity> entityList = new ArrayList<>();
String meetingName = exportList.isEmpty() ? "" : exportList.get(0).getMeetingName();
ViTool.excelResponse(response, jdhallname + "教代会提案汇总.xls");
propMap.remove("stateId");
propMap.put("stateName", "提案状态");
propMap.forEach((k, v) -> {
entityList.add(new ExcelExportEntity(v, k, 20));
});
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), entityList, list);
workbook.write(response.getOutputStream());
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 按承办单位导出
*
* @param meetingId 教代会届次ID
* @param undertakeId 承办单位ID
*/
@At
public void undertakeExport(String meetingId, String undertakeId, HttpServletResponse response) {
try {
CndPlus cnd = CndPlus.create();
Sql sql = Sqls.create("""
SELECT
info.proposalCode,
info.proposalName,
type.typeName,
u.loginname,
u.username,
u.unionname,
result.`name` resultName,
pru.undertakeId,
pru.undertakeType,
pu.unitCode,
pu.unitName undertakeName,
jdh.jdhallname meetingName
FROM
proposal_info info
LEFT JOIN proposal_relation_undertake pru ON pru.proposalId = info.id
LEFT JOIN proposal_undertake pu ON pu.id = pru.undertakeId
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN `user` u ON u.id = info.createUser
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
$condition
""");
cnd.andEx("info.teacherMeetingId", "=", meetingId);
cnd.andEx("pru.undertakeId", "=", undertakeId);
cnd.groupBy("pru.proposalId");
sql.setCondition(cnd);
List<ExportEntity> exportList = proposalInfoService.listEntity(sql, ExportEntity.class);
String unitName = exportList.isEmpty() ? "" : exportList.get(0).getUndertakeName();
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + new String((unitName + "提案汇总.xls").getBytes("utf-8"), "ISO8859-1"));
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), ExportEntity.class, exportList);
workbook.write(response.getOutputStream());
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 按提案导出承办
*
* @param proposalId 提案ID
*/
@At
public void proposalExport(String proposalId, HttpServletResponse response) {
try {
Sql sql = Sqls.create("""
SELECT
info.proposalCode,
info.proposalName,
type.typeName,
u.loginname,
u.username,
u.unionname,
result.`name` resultName,
pru.undertakeId,
pru.undertakeType,
pu.unitCode,
jdh.jdhallname meetingName,
CONCAT( pu.unitName,( CASE pru.undertakeType WHEN 1 THEN '(主办)' WHEN 2 THEN '(协办)' END )) undertakeName
FROM
proposal_info info
LEFT JOIN proposal_relation_undertake pru ON pru.proposalId = info.id
LEFT JOIN proposal_undertake pu ON pu.id = pru.undertakeId
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN `user` u ON u.id = info.createUser
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
WHERE
info.id = @proposalId
AND pru.delFlag = FALSE
""").setParam("proposalId", proposalId);
List<ExportEntity> exportList = proposalInfoService.listEntity(sql, ExportEntity.class);
String proposalName = exportList.isEmpty() ? "" : exportList.get(0).getProposalName();
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + new String((proposalName + "提案汇总.xls").getBytes(StandardCharsets.UTF_8), "ISO8859-1"));
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), ExportEntity.class, exportList);
workbook.write(response.getOutputStream());
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 导出单个提案信息
*
* @param proposalId 提案ID
*/
@At
@Ok("void")
public void oneProposalExport(String proposalId, HttpServletResponse response) {
try {
proposalExportService.exportFull(proposalId, response);
} catch (IOException e) {
e.printStackTrace();
}
}
@Data
public static class ExportEntity {
@Excel(name = "提案编号", width = 20d)
private String proposalCode;
@Excel(name = "提案名称", width = 60d)
private String proposalName;
@Excel(name = "教代会届次", width = 40d)
private String meetingName;
@Excel(name = "提案类型", width = 20d)
private String typeName;
@Excel(name = "分工会名称", width = 20d)
private String unionname;
@Excel(name = "提案人工号", width = 20d)
private String loginname;
@Excel(name = "提案人姓名", width = 20d)
private String username;
@Excel(name = "立案意见", width = 20d)
private String resultName;
@Excel(name = "承办单位", width = 50d)
private String undertakeName;
}
}
@@ -0,0 +1,299 @@
package io.v.nutz.zhgh.proposal.controller.statistics;
import cn.hutool.core.util.StrUtil;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.Roles;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.zhgh.jdh.model.cb.Jdh_jdhxx;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.models.ProposalConfig;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.models.ProposalState;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.zhgh.proposal.services.ProposalProcessService;
import io.v.nutz.base.service.ViService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
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.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
/**
* 承办汇总
*
* @author: 1V
* @date: 2021/2/7
* @since 1.0
*/
@IocBean
@Ok("json:full")
@At("/platform/proposal/statistics/undertake/summary")
public class ProposalUnderTakeSummaryController {
@Inject
private Vi vi;
@Inject
private Dao dao;
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalProcessService proposalProcessService;
@At("")
@Ok("beetl:/platform/proposal/statistics/undertake/summary.html")
@RequiresPermissions("proposal.statistics.undertake.summary")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.statistics.undertake.summary")
public Object data(String meetingId,
@Param(value = "unitId", required = false) String unitId,
PageForm pageForm) {
return getData(meetingId, unitId, pageForm);
}
// SELECT
// info.id,
// info.proposalName,
// u.username,
// u.unitname,
// GROUP_CONCAT( DISTINCT pru1_unit.unitName, '【', IF ( pru1.isReply = 1, '已答复', '未答复' ), '】' ) pruMaster,
// GROUP_CONCAT( DISTINCT pru2_unit.unitName, '【', IF ( pru2.isReply = 1, '已答复', '未答复' ), '】' ) pruSlave,
// state.stateCode,
// state.stateName,
// state.stateColor,
// (SELECT COUNT(1) FROM proposal_urge urge WHERE urge.proposalId = info.id ) urgeNum,
// ( SELECT count( 1 ) FROM proposal_feedback WHERE proposalId = info.id ) > 0 feedback,
// (( SELECT COUNT( 1 ) FROM proposal_relation_undertake pru WHERE pru.proposalId = info.id AND pru.isReply IS NOT TRUE )= 0 ) isAllReply
// FROM
// proposal_info info
// LEFT JOIN proposal_relation_undertake pru1 ON info.id = pru1.proposalId
// AND pru1.undertakeType = 1
// AND pru1.delFlag = 0
// LEFT JOIN proposal_undertake pru1_unit ON pru1.undertakeId = pru1_unit.id
// LEFT JOIN proposal_relation_undertake pru2 ON info.id = pru2.proposalId
// AND pru2.undertakeType = 2
// AND pru2.delFlag = 0
// LEFT JOIN proposal_undertake pru2_unit ON pru2.undertakeId = pru2_unit.id
// LEFT JOIN `user` u ON info.createUser = u.id
// LEFT JOIN proposal_state state ON info.stateCode = state.stateCode
private List<NutMap> getData(String meetingId, String unitId, PageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.proposalName,
info.resultCode,
info.caseCheckNeedSecondAudit,
info.caseCheckAuditId,
u.username,
u.unitname,
state.stateCode,
state.stateName,
state.stateColor,
result.`name` AS resultName,
GROUP_CONCAT( DISTINCT pu.unitName) pruMaster,
GROUP_CONCAT( DISTINCT pu.id) pruMasterId,
CONCAT(IF( pr.isReply = 1, '已答复', '未答复' )) pruMasterReply,
$slaveReply,
pr.replyNumber,
pr.isLeaderAudit,
GROUP_CONCAT( DISTINCT pu2.unitName ) pruSlave,
GROUP_CONCAT( DISTINCT pu2.id) pruSlaveId,
(SELECT group_concat(u.username) FROM sys_user_role sur LEFT JOIN `user` u on u.id = sur.userId WHERE cbdwid = pr.replyUnitId AND sur.roleId = '153cba3fb88b4c88b7c1002f0eb63749') pruMasterLeader,
(SELECT COUNT(1) FROM proposal_urge urge WHERE urge.proposalId = info.id ) urgeNum,
( SELECT count( 1 ) FROM proposal_feedback WHERE proposalId = info.id ) > 0 feedback
FROM
proposal_info info
LEFT JOIN (SELECT a.* from proposal_reply a where a.replyNumber = (select MAX(replyNumber) from proposal_reply where a.proposalId = proposalId)) pr ON info.id = pr.proposalId
AND pr.undertakeType = 1
LEFT JOIN proposal_undertake pu ON pu.id = pr.replyUnitId
LEFT JOIN proposal_reply pr2 ON info.id = pr2.proposalId
AND pr2.undertakeType = 2
LEFT JOIN proposal_undertake pu2 ON pu2.id = pr2.replyUnitId
LEFT JOIN `user` u ON info.createUser = u.id
LEFT JOIN proposal_state state ON info.stateCode = state.stateCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
$condition
""");
//协办答复情况
ProposalConfig proposalConfig = dao.fetch(ProposalConfig.class, Cnd.NEW());
dao.fetchLinks(proposalConfig, null);
if (proposalConfig.getSlaveUnitConfig() != null && proposalConfig.getSlaveUnitConfig().getIsNeedReply()) {
sql.setVar("slaveReply", "GROUP_CONCAT( DISTINCT pu2.unitName,'【',IF ( pr2.isReply = 1, '已答复', '未答复' ),'】' ) pruSlaveReply");
} else {
sql.setVar("slaveReply", "GROUP_CONCAT( DISTINCT pu2.unitName,'【无需答复】' ) pruSlaveReply");
}
CndPlus cndPlus = CndPlus.create();
cndPlus.and("info.resultCode", "in", Lang.array(ProposalConstant.DETERMINE, ProposalConstant.OPINION));
cndPlus.andEx("info.teacherMeetingId", "=", meetingId);
if (Strings.isNotBlank(unitId)) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.or("pu.id", "=", unitId);
group.or("pu2.id", "=", unitId);
cndPlus.and(group);
}
cndPlus.groupBy("info.id");
cndPlus.desc("info.createTime");
proposalInfoService.sortAndSearch(cndPlus, pageForm, new ProposalSearch());
sql.setCondition(cndPlus);
List<NutMap> list = proposalInfoService.listMap(sql);
// ProposalState caseCheckState = dao.fetch(ProposalState.class, Cnd.where("stateCode", "=", io.v.nutz.zhgh.proposal.constants.ProposalState.CASE_CHECK));
list.forEach(v -> {
if (v.getInt("replyNumber") == 1 || v.getInt("caseCheckNeedSecondAudit") == 0) {
v.put("pruMasterLeaderIsAudit", v.getInt("isLeaderAudit") == 1 ? "已审批" : "未审批");
} else {
v.put("pruMasterLeaderIsAudit", "无需审批");
}
// if (caseCheckState.getIsEnable()) {
// if (Lang.isNotEmpty(v.getList("caseCheckAuditId", String.class))) {
// v.put("caseCheckAudit", "已审查");
// } else {
// v.put("caseCheckAudit", "未审查");
// }
// } else {
// v.put("caseCheckAudit", "无需审查");
// }
});
return list;
}
@Inject("Jdh_jdhxx")
private ViService<Jdh_jdhxx> jdhxxViService;
/**
* 导出
*/
@At
@Ok("void")
@RequiresPermissions("proposal.statistics.undertake.summary")
public void export(String meetingId, String unitId, HttpServletResponse response) throws IOException {
List<NutMap> pros = getData(meetingId, unitId, new PageForm());
Jdh_jdhxx jdhxx = jdhxxViService.fetch(meetingId);
Sql sql = Sqls.create("""
SELECT
pu.unitName,
u.username
FROM
proposal_undertake pu
LEFT JOIN sys_user_role sur ON sur.cbdwid = pu.id
LEFT JOIN `user` u ON u.id = sur.userId
WHERE
pu.id = @unitId
AND sur.roleId = @roleId
""").setParam("unitId", unitId).setParam("roleId", Roles.CONTRACTOR_PERSON);
List<NutMap> nutMaps = proposalInfoService.listMap(sql);
String unitName = nutMaps.isEmpty() ? "汇总" : nutMaps.get(0).getString("unitName");
String principal = nutMaps.isEmpty() ? "" : "(承办单位代表)" + nutMaps.get(0).getString("username");
Map<String, Object> map = Map.of("pros", pros, "meetingName", jdhxx.getJdhallname(), "unitName", unitName, "principal", principal);
File file = null;
InputStream inputStream = null;
ServletOutputStream out = null;
// try {
// response.setCharacterEncoding("UTF-8");
// file = ExcelUtils.createExcel(map, "myExcel", "/docTemplate/proposal/UndertakeSummary.ftl");//调用创建excel帮助类
// inputStream = new FileInputStream(file);
// response.setCharacterEncoding("utf-8");
// response.setContentType("application/msexcel");
// response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode("提案承办单位信息汇总表" + ".xls", "UTF-8"));
// out = response.getOutputStream();
// byte[] buffer = new byte[512]; // 缓冲区
// int bytesToRead = -1;
// // 通过循环将读入的Excel文件的内容输出到浏览器中
// while ((bytesToRead = inputStream.read(buffer)) != -1) {
// out.write(buffer, 0, bytesToRead);
// }
// out.flush();
// } catch (Exception e) {
// e.printStackTrace();
// } finally {
// if (inputStream != null)
// inputStream.close();
// if (out != null)
// out.close();
// if (file != null)
// file.delete(); // 删除临时文件
// }
}
/**
* 查询承办单位负责人 联系电话信息
*
* @param unitIds 承办单位id数组
* @return 富文本信息
*/
@At
@ViReturn
@RequiresPermissions("proposal.statistics.undertake.summary")
public Object getUnitLeader(@Param("unitIds") String[] unitIds) {
Sql sql = Sqls.create("""
SELECT
pu.unitName,
u.username,
u.mobile
FROM
proposal_undertake pu
LEFT JOIN sys_user_role sur ON sur.cbdwid = pu.id
AND sur.roleId = @leaderRoleId
LEFT JOIN sys_user u ON u.id = sur.userId
$condition
""");
sql.setParam("leaderRoleId", Roles.IN_CHARGE_LEADER);
Cnd cnd = Cnd.NEW();
cnd.and("pu.id", "in", unitIds);
cnd.groupBy("pu.id");
sql.setCondition(cnd);
List<NutMap> list = proposalInfoService.listMap(sql);
StringBuffer sbf = new StringBuffer();
for (int i = 0; i < list.size(); i++) {
NutMap unitMap = list.get(i);
sbf.append("<div class=" + (i < list.size() - 1 ? "\"mb5\"" : "") + ">");
sbf.append(i + 1 + ".");
sbf.append(unitMap.getString("unitName"));
sbf.append("&nbsp;&nbsp;");
sbf.append("<i class='el-icon-user-solid'></i>");
sbf.append(StrUtil.isBlank(unitMap.getString("username")) ? "未分配校领导" : unitMap.getString("username"));
sbf.append("&nbsp;&nbsp;");
sbf.append("<i class='el-icon-phone'></i>");
sbf.append(StrUtil.isBlank(unitMap.getString("mobile")) ? "暂无联系方式" : unitMap.getString("mobile"));
sbf.append("<br/>");
sbf.append("</div>");
}
return sbf;
}
}
@@ -0,0 +1,187 @@
package io.v.nutz.zhgh.proposal.controller.statistics;
import cn.hutool.core.util.StrUtil;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.ProposalConfig;
import io.v.nutz.zhgh.proposal.models.ProposalInfo;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.GET;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
* @author: Aaron
* @create: 2021-04-10 14:09
* @description: 承办单位办理提案统计
**/
@IocBean
@Ok("json:full")
@At("/platform/proposal/statistics/undertake/reply")
public class ProposalUndertakeReplyController {
@Inject
private Dao dao;
@Inject
private ProposalInfoService proposalInfoService;
@At("")
@Ok("beetl:/platform/proposal/statistics/UndertakeReply.html")
@RequiresPermissions("proposal.statistics.undertake.reply")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.statistics.undertake.reply")
public Object pageData(String meetingId, @Param(value = "undertakeId", required = false) String undertakeId) {
ProposalConfig proposalConfig = dao.fetchLinks(dao.fetch(ProposalConfig.class), null);
//某届教代会下所有的答复记录
Sql replySql = Sqls.create("""
select
pr.*
from proposal_reply pr
left join proposal_info info on info.id = pr.proposalId
where
pr.proposalId in (select id from proposal_info where teacherMeetingId = @meetingId )
AND info.stateCode = 900 and info.resultCode in ('determine','opinion')
""").setParam("meetingId", meetingId);
List<NutMap> replyList = proposalInfoService.listMap(replySql);
if (Lang.isEmpty(replyList)) {
return new ArrayList<>();
}
//某届教代会参与承办的单位
boolean slaveNeedReply = proposalConfig.getSlaveUnitConfig() != null && proposalConfig.getSlaveUnitConfig().getIsNeedReply();
List<String> partakeUnit = replyList.stream().filter(v -> slaveNeedReply ? Lang.list(1, 2).contains(v.getInt("undertakeType")) : v.getInt("undertakeType") == 1).map(v -> v.getString("replyUnitId")).distinct().collect(Collectors.toList());
Sql sql = Sqls.create("""
select * from proposal_underTake
where id in (@replyUnitIds)
""").setParam("replyUnitIds", StrUtil.isBlank(undertakeId) ? partakeUnit : new String[]{undertakeId});
List<NutMap> replyUnitList = proposalInfoService.listMap(sql);
replyUnitList.forEach(v -> {
//过滤出该承办单位的答复记录 然后根据提案id分组即为承办提案数量
Map<String, List<NutMap>> masterProposalMap = replyList.stream().filter(x -> x.getString("replyUnitId").equals(v.getString("id")) && x.getInt("undertakeType") == 1).collect(Collectors.groupingBy(x -> x.getString("proposalId")));
Map<String, List<NutMap>> slaveProposalMap = replyList.stream().filter(x -> x.getString("replyUnitId").equals(v.getString("id")) && x.getInt("undertakeType") == 2).collect(Collectors.groupingBy(x -> x.getString("proposalId")));
v.setv("totalCount", masterProposalMap.size() + slaveProposalMap.size());
//作为主办单位承办的提案总数
v.setv("masterTotalCount", masterProposalMap.size());
//作为协办单位承办的提案总数
v.setv("slaveTotalCount", slaveProposalMap.size());
//作为主办单位已答复的数量
AtomicInteger masterHasReplyCount = new AtomicInteger();
//作为主办单位未答复的数量
AtomicInteger masterNotReplyCount = new AtomicInteger();
masterProposalMap.forEach((key, value) -> {
boolean allReply = value.stream().allMatch(a -> a.getBoolean("isReply"));
if (allReply) {
masterHasReplyCount.addAndGet(1);
} else {
masterNotReplyCount.addAndGet(1);
}
});
v.setv("masterHasReplyCount", masterHasReplyCount.intValue());
v.setv("masterNotReplyCount", masterNotReplyCount.intValue());
int masterFinishCount = dao.count(ProposalInfo.class, Cnd.where("id", "in", masterProposalMap.keySet()).and("stateCode", "=", ProposalState.FINISH));
v.setv("masterFinishCount", masterFinishCount);
//作为协办单位已答复的数量
AtomicInteger slaveHasReplyCount = new AtomicInteger();
//作为协办单位未答复的数量
AtomicInteger slaveNotReplyCount = new AtomicInteger();
slaveProposalMap.forEach((key, value) -> {
boolean allReply = value.stream().allMatch(a -> a.getBoolean("isReply"));
if (allReply) {
slaveHasReplyCount.addAndGet(1);
} else {
slaveNotReplyCount.addAndGet(1);
}
});
v.setv("slaveHasReplyCount", slaveHasReplyCount.intValue());
v.setv("slaveNotReplyCount", slaveNotReplyCount.intValue());
int slaveFinishCount = dao.count(ProposalInfo.class, Cnd.where("id", "in", slaveProposalMap.keySet()).and("stateCode", "=", ProposalState.FINISH));
v.setv("slaveFinishCount", slaveFinishCount);
});
//提案总数降序
return replyUnitList.stream().sorted((a, b) -> b.getInt("totalCount") - a.getInt("totalCount")).collect(Collectors.toList());
}
/**
* 查询某个承办单位承办的提案集合
*
* @param meetingId
* @param underTakeId
* @return
*/
@At
@GET
@ViReturn
@Ok("json:full")
@RequiresPermissions("proposal.statistics.undertake.reply")
public Object selectProposalByUnit(@Param("meetingId") String meetingId, @Param("underTakeId") String underTakeId) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.proposalCode,
info.proposalName,
u.username,
state.stateName,
state.stateColor,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName
FROM
proposal_info info
LEFT JOIN proposal_reply pr ON pr.proposalId = info.id
LEFT JOIN sys_user u on u.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
WHERE
info.teacherMeetingId = @meetingId
AND pr.replyUnitId = @underTakeId
AND info.stateCode = 900 and info.resultCode in('determine','opinion')
GROUP BY info.id
ORDER BY info.proposalCode
""");
sql.setParam("meetingId", meetingId);
sql.setParam("underTakeId", underTakeId);
return proposalInfoService.listMap(sql);
}
}
@@ -0,0 +1,153 @@
package io.v.nutz.zhgh.proposal.controller.statistics;
import cn.hutool.core.util.StrUtil;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.models.ProposalConfig;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.sys.models.Sys_dict;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.GET;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author: zxy
* @create: 2022-02-11 09:58
* @description: 承办单位满意度汇总
**/
@IocBean
@Ok("json:full")
@At("/platform/proposal/statistics/undertake")
public class ProposalUndertakeSatisfactionController {
@Inject
private Dao dao;
@Inject
private ProposalInfoService proposalInfoService;
@At("")
@Ok("beetl:/platform/proposal/statistics/undertake.html")
@RequiresPermissions("proposal.statistics.undertake")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.statistics.undertake")
public Object pageData(String meetingId, @Param(value = "undertakeId", required = false) String undertakeId) {
ProposalConfig proposalConfig = dao.fetchLinks(dao.fetch(ProposalConfig.class), null);
//协办是否要答复
boolean slaveNeedReply = proposalConfig.getSlaveUnitConfig() != null && proposalConfig.getSlaveUnitConfig().getIsNeedReply();
Sys_dict parentDict = dao.fetch(Sys_dict.class, Cnd.where("code", "=", "proposal_feedback_underTake"));
List<Sys_dict> childrenDicts = dao.query(Sys_dict.class, Cnd.where("parentId", "=", parentDict.getId()).and("disabled", "=", 0));
List<String> childrenDictNames = childrenDicts.stream().map(Sys_dict::getCode).collect(Collectors.toList());
//某届教代会下所有的答复记录
Sql replySql = Sqls.create("""
SELECT
pu.id,
pu.unitName,
count(DISTINCT(pr.proposalId)) totalCount,
count(DISTINCT case when pr.undertakeType = 1 then pr.proposalId end ) masterCount,
count(DISTINCT case when pr.undertakeType = 2 then pr.proposalId end ) slaveCount,
count(DISTINCT case when pf.feedbackCodeByUnderTake = '很好' $maxFeedBackNumSql then pf.proposalId end ) 'veryGoodCount',
count(DISTINCT case when pf.feedbackCodeByUnderTake = '比较好' $maxFeedBackNumSql then pf.proposalId end ) 'quiteGoodCount',
count(DISTINCT case when pf.feedbackCodeByUnderTake = '一般' $maxFeedBackNumSql then pf.proposalId end ) 'commonlyCount',
count(DISTINCT case when pf.feedbackCodeByUnderTake = '较差' $maxFeedBackNumSql then pf.proposalId end ) 'poorCount'
$basicSatisfiedSql
FROM
proposal_reply pr
LEFT JOIN proposal_undertake pu on pu.id = pr.replyUnitId
LEFT JOIN proposal_feedback pf on pf.proposalId = pr.proposalId
LEFT JOIN proposal_info info on info.id = pr.proposalId
WHERE
$underTakeCnd
pr.proposalId IN (SELECT id FROM proposal_info WHERE teacherMeetingId = @meetingId)
AND pr.undertakeType in (@undertakeType)
AND info.stateCode = 900 AND info.resultCode = 'determine'
group by pr.replyUnitId
""");
if (childrenDictNames.contains(ProposalConstant.BASICALLY_SATISFIED)) {
replySql.setVar("basicSatisfiedSql", """
,count(DISTINCT case when pf.feedbackCode = 'BasicallySatisfied' and pf.feedbackNumber = (select max(feedbackNumber)
from proposal_feedback where proposalId = pr.proposalId) then pf.proposalId end ) basicallySatisfiedCount""");
} else {
replySql.setVar("basicSatisfiedSql", "");
}
replySql.setVar("maxFeedBackNumSql", """
and pf.feedbackNumber = (select max(feedbackNumber)
from proposal_feedback where proposalId = pr.proposalId)
""");
if (StrUtil.isNotBlank(undertakeId)) {
replySql.setVar("underTakeCnd", "pr.replyUnitId='%s' AND".formatted(undertakeId));
}
replySql.setParam("meetingId", meetingId);
replySql.setParam("undertakeType", slaveNeedReply ? new Integer[]{1, 2} : new Integer[]{1});
return proposalInfoService.listMap(replySql);
}
/**
* 查询某个承办单位承办的提案集合
*
* @param meetingId
* @param underTakeId
* @return
*/
@At
@GET
@ViReturn
@Ok("json:full")
@RequiresPermissions("proposal.statistics.undertake")
public Object selectProposalByUnit(@Param("meetingId") String meetingId, @Param("underTakeId") String underTakeId) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.proposalCode,
info.proposalName,
u.username,
state.stateName,
state.stateColor,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName
FROM
proposal_info info
LEFT JOIN proposal_reply pr ON pr.proposalId = info.id
LEFT JOIN sys_user u on u.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
WHERE
info.teacherMeetingId = @meetingId
AND pr.replyUnitId = @underTakeId
AND info.stateCode = 900 and info.resultCode = 'determine'
GROUP BY info.id
ORDER BY info.proposalCode
""");
sql.setParam("meetingId", meetingId);
sql.setParam("underTakeId", underTakeId);
return proposalInfoService.listMap(sql);
}
}
@@ -0,0 +1,425 @@
package io.v.nutz.zhgh.proposal.controller.statistics;
import cn.hutool.core.util.ArrayUtil;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.Html2Text;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.zhgh.jdh.model.cb.Jdh_jdhxx;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.ProposalInfo;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.web.commons.base.Globals;
import io.v.nutz.web.commons.ext.beetl.Html2TxtFormat;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Lang;
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.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.text.NumberFormat;
import java.util.Calendar;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
* 提案年度报告
*/
@IocBean
@At("/platform/proposal/statistics/yearReport")
@Ok("json:full")
public class ProposalYearReportController {
@Inject
private ProposalInfoService proposalInfoService;
@At("")
@Ok("beetl:/platform/proposal/statistics/yearReport.html")
@RequiresPermissions("proposal.statistics.yearReport")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.statistics.yearReport")
public Object pageData(PageForm pageForm,
ProposalSearch search,
@Param(value = "stateCode",required = false) String stateCode,
@Param(value = "proposalTypes",required = false)String[] proposalTypes,
@Param(value = "proposalResult",required = false)String[] proposalResult,
@Param(value = "determineTypeOptions",required = false)String[] determineTypeOptions,
@Param(value = "undertakeId",required = false)String undertakeId) {
Sql sql = Sqls.create("""
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeName,
type.typeCode,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
dbtdict.`code` delegationCode,
manner.`name` mannerName,
result.`name` resultName,
lalevel.`name` laLevelName,
(
SELECT
count( 1 ) > 0
FROM
proposal_conjoin
where JSON_CONTAINS (proposalIds,JSON_QUOTE(info.id))
) AS isConjoin
FROM
proposal_info info
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
LEFT JOIN sys_dict dbtdict ON dbtdict.`name` = dbt.`dbtname`
LEFT JOIN sys_dict lalevel ON lalevel.`code` = info.determineTypeCode
LEFT JOIN proposal_reply pr on pr.proposalId = info.id
$condition
ORDER BY
FIELD(`resultCode`,'determine','opinion','notGive'),
info.proposalCode ASC,
info.createTime DESC
""");
CndPlus cnd = CndPlus.create();
// cnd.andEx("info.teacherMeetingId", "=", search.getMeetingId());
// cnd.and("info.resultCode", "is not", null);
cnd.andEX("info.stateCode", "=", stateCode);
if (proposalTypes != null && proposalTypes.length > 0) {
cnd.and("info.typeId", "in", proposalTypes);
}
if (proposalResult != null && proposalResult.length > 0) {
cnd.and("info.resultCode", "in", proposalResult);
if (ArrayUtil.contains(proposalResult, ProposalConstant.DETERMINE)) {
if (determineTypeOptions != null && determineTypeOptions.length > 0) {
cnd.and("info.determineTypeCode", "in", determineTypeOptions);
}
}
}
cnd.andEX("pr.replyUnitId", "=", undertakeId);
proposalInfoService.sortAndSearch(cnd, pageForm, search);
cnd.groupBy("info.id");
sql.setCondition(cnd);
String sourceSql = sql.toString();
sourceSql = sourceSql.replaceAll("ORDER BY info.proposalCode ASC, info.createTime DESC, info.stateCode ASC", "");
return proposalInfoService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), Sqls.create(sourceSql));
}
/**
* @param data
*/
@At
@Ok("void")
@RequiresPermissions("proposal.statistics.yearReport")
public void doExport(@Param("data") String data, HttpServletResponse response) throws IOException {
Dao dao = proposalInfoService.dao();
NutMap dataMap = Json.fromJson(NutMap.class, data);
String meetingId = dataMap.getString("meetingId");
List<String> proposalIds = dataMap.getAsList("proposalIds", String.class);
//当前教代会
Jdh_jdhxx currentJdh = dao.fetch(Jdh_jdhxx.class, meetingId);
//下一届教代会
Jdh_jdhxx prevJdh = dao.fetch(Jdh_jdhxx.class, Cnd.where("jdhkqsj", ">", currentJdh.getJdhkqsj()).asc("jdhkqsj"));
NutMap proposalResultCountMap = getProposalResultCount(currentJdh.getId());
List<NutMap> underTakesMap = getUnderTakes(currentJdh.getId());
List<NutMap> proposalCountByProposalType = getProposalCountByProposalType(currentJdh.getId());
NutMap map = NutMap.NEW();
map.put("lxlist", proposalCountByProposalType);
map.put("totalCountX", proposalCountByProposalType.stream().mapToInt(v -> v.getInt("totalCount")).sum());
map.put("laTotalCountX", proposalCountByProposalType.stream().mapToInt(v -> v.getInt("laCount")).sum());
map.put("zdTotalCountX", proposalCountByProposalType.stream().mapToInt(v -> v.getInt("zdCount")).sum());
map.put("jyTotalCountX", proposalCountByProposalType.stream().mapToInt(v -> v.getInt("jyCount")).sum());
map.put("caTotalCountX", proposalCountByProposalType.stream().mapToInt(v -> v.getInt("caCount")).sum());
map.put("myTotalCountX", proposalCountByProposalType.stream().mapToInt(v -> v.getInt("myCount")).sum());
map.put("ybTotalCountX", proposalCountByProposalType.stream().mapToInt(v -> v.getInt("ybCount")).sum());
map.put("bmyTotalCountX", proposalCountByProposalType.stream().mapToInt(v -> v.getInt("bmyCount")).sum());
map.put("gxName", Globals.MyConfig.getString("GxName"));
map.put("jdhxx", prevJdh.getJdhallname());
map.put("oldjdhxx", currentJdh.getJdhallname());
map.put("tazs", proposalResultCountMap.getInt("totalCount"));
map.put("talx", getProposalTypes(currentJdh.getId()));
map.put("lacount", proposalResultCountMap.getInt("laCount"));
map.put("zdcount", proposalResultCountMap.getInt("zdCount"));
map.put("jycount", proposalResultCountMap.getInt("jyCount"));
map.put("cacount", proposalResultCountMap.getInt("caCount"));
map.put("cbdwcount", underTakesMap.size());
if (Lang.isEmpty(underTakesMap)) {
map.put("cbdwNames", "");
} else {
if (underTakesMap.size() > 5) {
map.put("cbdwNames", Lang.isEmpty(underTakesMap) ? "" : underTakesMap.subList(0, 5).stream().map(v -> v.getString("unitName")).collect(Collectors.joining("")));
} else {
map.put("cbdwNames", Lang.isEmpty(underTakesMap) ? "" : underTakesMap.stream().map(v -> v.getString("unitName")).collect(Collectors.joining("")));
}
}
List<NutMap> zdlist = getkeyPointProposal(currentJdh.getId(), proposalIds);
map.put("zdlist", zdlist);
List<NutMap> excellentProposal = getExcellentProposal(currentJdh.getId());
map.put("yxtaCount", excellentProposal.size());
map.put("yxtaNames", excellentProposal.stream().map(v -> "" + v.getString("proposalName") + "").collect(Collectors.joining("")));
List<NutMap> prevJdhProposalType = getPrevJdhProposalType(currentJdh.getId());
map.put("talxhz", prevJdhProposalType.stream().map(v -> v.getString("typeName") + "方面" + v.getInt("count") + "").collect(Collectors.joining(",")));
map.put("talx", prevJdhProposalType.stream().map(v -> v.getString("typeName")).collect(Collectors.joining("")));
String[] prevJdhDate = prevJdh.getJdhkqsj().split("-");
map.put("jdhxxYear", prevJdhDate[0]);
map.put("jdhxxMonth", prevJdhDate[1]);
map.put("jdhxxDay", prevJdhDate[2]);
int jdhxxCurrentMonth = Calendar.getInstance().get(Calendar.MONTH) + 1;
map.put("jdhxxCurrentMonth", jdhxxCurrentMonth);
map.put("jdhTotalCount", dao.count(ProposalInfo.class, Cnd.where("teacherMeetingId", "=", prevJdh.getId())));
HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
Configure config = Configure.newBuilder().bind("lxlist", policy).build();
response.addHeader("Content-Type", "application/octet-stream");
response.addHeader("Content-Disposition", "attachment; filename=\"" + new String((currentJdh.getJdhallname() + "提案报告").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1) + "\".docx");
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("docTemplate/proposal/yearReport.docx");
assert inputStream != null;
XWPFTemplate.compile(inputStream, config).render(map, response.getOutputStream());
inputStream.close();
}
/**
* 查询某届教代会下的提案类型
*
* @param meetingId
* @return
*/
private String getProposalTypes(String meetingId) {
Sql sql = Sqls.create("""
SELECT
typeName
FROM
proposal_type
WHERE
id IN ( SELECT typeId FROM proposal_info WHERE teacherMeetingId = @meetingId )
ORDER BY
typeCode
""");
sql.setParam("meetingId", meetingId);
List<NutMap> list = proposalInfoService.listMap(sql);
return list.stream().map(v -> v.getString("typeName")).collect(Collectors.joining(""));
}
/**
* 查询某届教代会下的立案 撤案 等数量
*
* @param meetingId
* @return
*/
private NutMap getProposalResultCount(String meetingId) {
Sql sql = Sqls.create("""
SELECT
count( 1 ) totalCount,
count( CASE WHEN info.resultCode = 'determine' THEN 1 ELSE NULL END ) laCount,
count( CASE WHEN info.resultCode = 'determine' AND determineTypeCode = 'emphasis' THEN 1 ELSE NULL END ) zdCount,
count( CASE WHEN info.resultCode IN ( 'opinion' ) THEN 1 ELSE NULL END ) jyCount,
count( CASE WHEN info.resultCode IN ( 'notGive' ) THEN 1 ELSE NULL END ) caCount
FROM
proposal_info info
WHERE
info.resultCode IS NOT NULL
AND info.teacherMeetingId = @meetingId
""");
sql.setParam("meetingId", meetingId);
return proposalInfoService.listMap(sql).get(0);
}
/**
* 查询某届教代会下的立案 撤案 等数量 并且按类型来统计
*
* @return
*/
public List<NutMap> getProposalCountByProposalType(String meetingId) {
//按类型统计的数据 word中的表格数据
Sql sql = Sqls.create("""
SELECT
type.typeCode,
type.typeName,
count( 1 ) AS totalCount,
count( CASE WHEN info.resultCode = 'determine' THEN 1 ELSE NULL END ) laCount,
count( CASE WHEN info.resultCode = 'determine' AND info.determineTypeCode = 'emphasis' THEN 1 ELSE NULL END ) zdCount,
count( CASE WHEN info.resultCode = 'opinion' AND info.determineTypeCode = 'ordinary' THEN 1 ELSE NULL END ) jyCount,
count( CASE WHEN info.resultCode = 'notGive' THEN 1 ELSE NULL END ) caCount,
count( CASE WHEN ( info.resultCode = 'determine' AND fb.feedbackCode = 'satisfied' ) THEN 1 ELSE NULL END ) myCount,
count( CASE WHEN info.resultCode = 'determine' AND fb.feedbackCode = 'QuiteSatisfied' THEN 1 ELSE NULL END ) ybCount,
count( CASE WHEN info.resultCode = 'determine' AND fb.feedbackCode = 'NotSatisfied' THEN 1 ELSE NULL END ) bmyCount
FROM
proposal_type type
LEFT JOIN proposal_info info ON info.typeId = type.id
LEFT JOIN proposal_feedback fb ON fb.proposalId = info.id
WHERE
info.teacherMeetingId = @teacherMeetingId
AND info.stateCode > @unSubmit
GROUP BY
type.id
ORDER BY
type.typeCode
""");
sql.setParam("teacherMeetingId", meetingId);
sql.setParam("unSubmit", ProposalState.UNSUBMIT);
List<NutMap> list = proposalInfoService.listMap(sql);
NumberFormat numberFormat = NumberFormat.getInstance();
numberFormat.setMaximumFractionDigits(2);
long totalCount = list.stream().mapToLong(v -> v.getInt("totalCount")).sum();
AtomicInteger listIndex = new AtomicInteger(1);
list.forEach(v -> {
float proportion = v.getFloat("totalCount") / (float) totalCount;
v.put("proportion", numberFormat.format(proportion * 100) + "%");
v.put("index", listIndex.get());
listIndex.getAndIncrement();
});
return list;
}
/**
* 获取某届教代会 承办单位信息
*
* @param meetingId
* @return
*/
public List<NutMap> getUnderTakes(String meetingId) {
Sql sql = Sqls.create("""
SELECT
pu.id AS undertakeId,
pu.unitName,
count( pu.id )
FROM
proposal_reply pr
LEFT JOIN proposal_undertake pu ON pu.id = pr.replyUnitId
LEFT JOIN proposal_info info ON info.id = pr.proposalId
WHERE
info.teacherMeetingId = @teacherMeetingId
GROUP BY
pr.replyUnitId
ORDER BY
count( pr.replyUnitId ) DESC
""");
sql.setParam("teacherMeetingId", meetingId);
return proposalInfoService.listMap(sql);
}
private List<NutMap> getkeyPointProposal(String meetingId, List<String> proposalIds) {
Sql sql = Sqls.create("""
SELECT
info.proposalName,
info.brief,
info.measures,
pr.replyContent,
( SELECT pf.feedbackCode FROM proposal_feedback pf WHERE pf.proposalId = info.id ORDER BY pf.feedbackNumber DESC LIMIT 0, 1 ) AS feedbackCode
FROM
proposal_info info
LEFT JOIN proposal_relation_undertake pru ON pru.proposalId = info.id
LEFT JOIN proposal_reply pr ON pr.proposalId = info.id
AND pr.replyUnitId = pru.undertakeId
LEFT JOIN proposal_feedback pf ON pf.proposalId = info.id
WHERE
info.teacherMeetingId = @teacherMeetingId
AND info.resultCode = 'emphasis'
AND pru.undertakeType = 1
AND info.id IN (@proposalIds)
""");
sql.setParam("teacherMeetingId", meetingId);
sql.setParam("proposalIds", proposalIds);
List<NutMap> list = proposalInfoService.listMap(sql);
Html2TxtFormat html2TxtFormat = new Html2TxtFormat();
list.forEach(v -> {
v.put("taname", Html2Text.toPlainText(v.getString("proposalName")));
v.put("tanr", Html2Text.toPlainText(v.getString("brief")));
v.put("jycs", Html2Text.toPlainText(v.getString("measures")));
v.put("dfnr", Html2Text.toPlainText(v.getString("replyContent")));
switch (v.getString("feedbackCode")) {
case "satisfied" -> v.put("fknr", "满意");
case "QuiteSatisfied" -> v.put("fknr", "比较满意");
case "NotSatisfied" -> v.put("fknr", "不满意");
default -> v.put("fknr", "");
}
});
return list;
}
private List<NutMap> getPrevJdhProposalType(String meetingId) {
Sql sql = Sqls.create("""
SELECT
type.typeName,
count( CASE WHEN info.typeId = type.id THEN 1 ELSE NULL END ) count
FROM
proposal_type type
LEFT JOIN proposal_info info ON info.typeId = type.id
WHERE
info.teacherMeetingId = @teacherMeetingId
GROUP BY
type.id
""");
sql.setParam("teacherMeetingId", meetingId);
List<NutMap> list = proposalInfoService.listMap(sql);
return list;
}
private List<NutMap> getExcellentProposal(String meetingId) {
Sql sql = Sqls.create("""
select proposalName from proposal_info where teacherMeetingId = @meetingId
and excellent = 1
""");
sql.setParam("meetingId", meetingId);
return proposalInfoService.listMap(sql);
}
}
@@ -0,0 +1,158 @@
package io.v.nutz.zhgh.proposal.controller.transact;
import cn.hutool.core.util.StrUtil;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.zhgh.jdh.model.db.Jdh_db;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.Strings;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
/**
* 已完结
*/
@IocBean
@Ok("json:full")
@At("/platform/proposal/transact/allFinishedQuery")
public class ProposalAllFinishedQueryController {
@Inject
private Vi vi;
@Inject
private ProposalInfoService proposalInfoService;
@At("")
@Ok("beetl:/platform/proposal/transact/allFinishedQuery.html")
@RequiresPermissions("proposal.transact.allFinishedQuery")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.allFinishedQuery")
public Object pageData(PageForm page,
ProposalSearch search,
@Param(value = "stateCode",required = false) String stateCode,
@Param(value = "proposalTypes",required = false)String[] proposalTypes,
@Param(value = "proposalResult",required = false)String[] proposalResult,
@Param(value = "levyStates",required = false)Integer[] levyStates,
@Param(value = "searchName2",required = false)String searchName2,
@Param(value = "searchKeyword2",required = false)String searchKeyword2) {
CndPlus cnd = CndPlus.create();
cnd.andEx("info.stateCode", "=", stateCode);
if (!ShiroUtil.hasAnyRoles(new String[]{"sysadmin", "A06", "tamange"})) {
if (ShiroUtil.hasAnyRoles("jdhdbt01,jdhdbt02")) {
Jdh_db jdhDb = proposalInfoService.dao().fetch(Jdh_db.class, Cnd.where("dbid", "=", ShiroUtil.getUserId()).and("jdhid", "=", search.getMeetingId()));
cnd.and("info.delegationId", " = ", jdhDb.getDbtid());
}
if (ShiroUtil.hasRole("H04")) {
cnd.and("su.unionid", " in ", vi.getMangeUnionStr());
}
}
if (proposalTypes != null && proposalTypes.length > 0) {
cnd.and("info.typeId", "in", proposalTypes);
}
if (proposalResult != null && proposalResult.length > 0) {
cnd.and("info.resultCode", "in", proposalResult);
}
cnd.and("info.stateCode", "=", ProposalState.FINISH);
Sql sql = Sqls.create("""
SELECT
su.username,
su.loginname,
su.mobile,
su.unitname,
(select count(DISTINCT(seconderId))from proposal_seconded where proposalId = info.id) AS secondedNum,
(select count(DISTINCT(seconderId))from proposal_seconded where proposalId = info.id and isAgree = 1) AS secondedAgreeNum,
IF(info.delegationAuditId is NULL,'未审核','已审核') AS delegationAudit,
info.id,
info.proposalName,
info.proposalCode,
info.oldProposalCode,
info.determineTypeCode,
info.resultCode,
state.stateName,
state.stateColor,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName,
(
SELECT
count( 1 ) > 0
FROM
proposal_conjoin
where JSON_CONTAINS (proposalIds,JSON_QUOTE(info.id))
) AS isConjoin
FROM
proposal_info info
LEFT JOIN proposal_seconded ps on ps.proposalId = info.id
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
$condition
""");
cnd.and("info.teacherMeetingId", "=", search.getMeetingId());
if (Strings.isNotBlank(page.getSearchName()) && Strings.isNotBlank(page.getSearchKeyword())) {
if ("proposalCode".equals(page.getSearchName())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("info.proposalCode", page.getSearchKeyword());
seg.orLike("info.oldProposalCode", page.getSearchKeyword());
cnd.and(seg);
} else {
cnd.where().andLike(page.getSearchName(), page.getSearchKeyword());
}
}
if (Strings.isNotBlank(searchName2) && Strings.isNotBlank(searchKeyword2)) {
cnd.where().andLike(searchName2, searchKeyword2);
}
if (StrUtil.isNotBlank(page.getPageOrderName()) && StrUtil.isNotBlank(page.getPageOrderBy())) {
if (page.getPageOrderBy().equals("descending")) {
cnd.orderBy(page.getPageOrderName(), "DESC");
} else if (page.getPageOrderBy().equals("ascending")) {
cnd.orderBy(page.getPageOrderName(), "ASC");
}
}
if (Strings.isNotBlank(search.getCreateUser())) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.orLike("su.username", search.getCreateUser());
group.orLike("su.loginname", search.getCreateUser());
cnd.and(group);
}
cnd.andEx("info.delegationId", "=", search.getDelegationId());
cnd.andEx("su.unionId", "=", search.getUnionId());
cnd.andEx("su.unitId", "=", search.getUnitId());
cnd.groupBy("info.id");
cnd.desc("info.proposalCode");
sql.setCondition(cnd);
return proposalInfoService.listPageMap(page.getPageNumber(), page.getPageSize(), sql);
}
}
@@ -0,0 +1,89 @@
package io.v.nutz.zhgh.proposal.controller.transact;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.lang.Enum;
import io.v.nutz.zhgh.proposal.constants.ProposalAuditEnum;
import io.v.nutz.zhgh.proposal.models.ProposalAudit;
import io.v.nutz.zhgh.proposal.models.ProposalReply;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.sys.models.Sys_signature;
import io.v.nutz.sys.services.SysSignatureService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
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.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
/**
* 提案审核流程
*/
@At("/platform/proposal/transact/audit")
@Ok("json:full")
@IocBean
@RequiresAuthentication
public class ProposalAuditController {
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private SysSignatureService sysSignatureService;
/**
* 审核
*
* @param nutMap
* @return
*/
@At
@ViReturn
@Aop(TransAop.READ_COMMITTED)
public Object doAudit(@Param("..") NutMap nutMap) {
ProposalAudit audit = nutMap.getAs("audit", ProposalAudit.class);
String sign = nutMap.getString("sign");
audit.setUserId(ShiroUtil.getPrincipalProperty("id").toString());
if (Strings.isNotBlank(sign)) {
audit.setSignId(sysSignatureService.insert(new Sys_signature(sign)).getId());
}
nutMap.setv("audit", audit);
int stateCode = proposalInfoService.fetch(audit.getProposalId()).getStateCode();
ProposalAuditEnum instance = Enum.instance(ProposalAuditEnum.class, stateCode);
instance.audit(nutMap);
return null;
}
/**
* 承办答复 校领导批示
*
* @param nutMap
* @return
*/
@At
@ViReturn
public Object doReply(@Param("..") NutMap nutMap) {
ProposalReply reply = nutMap.getAs("reply", ProposalReply.class);
String replySign = nutMap.getString("replySign");
String leaderSign = nutMap.getString("leaderSign");
if (Strings.isNotBlank(replySign)) {
reply.setReplySignId(sysSignatureService.insert(new Sys_signature(replySign)).getId());
}
if (Strings.isNotBlank(leaderSign)) {
reply.setLeaderSignId(sysSignatureService.insert(new Sys_signature(leaderSign)).getId());
}
nutMap.setv("reply", reply);
String proposalId = reply.getProposalId();
Integer stateCode = proposalInfoService.fetch(proposalId).getStateCode();
ProposalAuditEnum instance = Enum.instance(ProposalAuditEnum.class, stateCode);
instance.audit(nutMap);
return null;
}
}
@@ -0,0 +1,185 @@
package io.v.nutz.zhgh.proposal.controller.transact;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.base.Result;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.sys.services.SysLocalProcessService;
import io.v.nutz.web.commons.base.Globals;
import io.v.nutz.web.commons.slog.annotation.SLog;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.constants.ProposalToDoHandler;
import io.v.nutz.zhgh.proposal.models.*;
import io.v.nutz.zhgh.proposal.services.ProposalBranchLeaderPrefixAuditService;
import io.v.nutz.zhgh.proposal.services.ProposalCommonService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.zhgh.proposal.services.ProposalProcessService;
import io.v.nutz.sys.models.Sys_signature;
import io.v.nutz.sys.services.SysSignatureService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.POST;
import org.nutz.mvc.annotation.Param;
import java.util.List;
/**
* 分管校领导批示
*
* @author jug
* @date 2024/01/11
*/
@IocBean
@At("/platform/proposal/transact/branchLeaderPrefixAudit")
@Ok("json:full")
public class ProposalBranchLeaderPrefixAuditController {
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalProcessService proposalProcessService;
@Inject
private ProposalBranchLeaderPrefixAuditService proposalBranchLeaderPrefixAuditService;
@Inject
private ProposalCommonService proposalCommonService;
@Inject
private Dao dao;
@Inject
private SysSignatureService sysSignatureService;
@Inject
private SysLocalProcessService sysLocalProcessService;
@At("")
@Ok("beetl:/platform/proposal/transact/branchLeaderPrefixAudit.html")
@RequiresPermissions("proposal.transact.branchLeaderPrefixAudit")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.branchLeaderPrefixAudit")
public Object pageData(PageForm page, ProposalSearch search) {
Cnd cnd = Cnd.NEW();
proposalInfoService.sortAndSearch(cnd, page, search);
return proposalBranchLeaderPrefixAuditService.pageData(page, cnd, search);
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.branchLeaderPrefixAudit")
public Object getBranchLeaderAuditList(String replyUnitId, String proposalId) {
List<String> underTakeList = proposalCommonService.getUnderTakeByLeaderAndProId(replyUnitId, proposalId);
if (Lang.isEmpty(underTakeList)) {
return Result.error("该承办单位未设置分管校领导!");
}
//3.查询出本提案所涉及到的承办单位在该校领导管辖内的
Sql sql = Sqls.create("""
SELECT * FROM proposal_reply where proposalId = @proposalId and replyUnitId in (@underTakeList)
""").setParam("proposalId", proposalId).setParam("underTakeList", underTakeList);
List<NutMap> branchLeaderAuditList = proposalInfoService.listMap(sql);
return branchLeaderAuditList;
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.branchLeaderPrefixAudit")
public Object getUnderTakeName(String proposalId, String underTakeId) {
ProposalUndertake undertake = dao.fetch(ProposalUndertake.class, underTakeId);
if (undertake != null) {
return undertake.getUnitName();
}
return "";
}
/**
* 分管领导审批立案
*
* @param sign 签字
* @param proposalAudit 提案审核对象
* @param pblaId
* @param proposalId 提案id
* @return {@link Object}
*/
@At
@POST
@ViReturn
@Aop(TransAop.READ_COMMITTED)
@RequiresPermissions("proposal.transact.branchLeaderPrefixAudit")
@SLog(type = "proposal", tag = "分管领导审批立案", msg = "分管领导审批立案", result = true, param = true)
public Object audit(@Param("sign") String sign, @Param("audit") ProposalAudit proposalAudit, @Param("pblaId") String pblaId, @Param("proposalId") String proposalId) {
//签字
String signId = null;
if (StrUtil.isNotBlank(sign)) {
signId = sysSignatureService.insert(new Sys_signature(sign)).getId();
}
proposalAudit.setUserId(ShiroUtil.getUserId());
proposalAudit.setSignId(signId);
dao.insert(proposalAudit);
//并案的一起审核
dao.update(ProposalBranchLeaderAudit.class,
Chain.make("isAudit", true).add("auditId", proposalAudit.getId()),
Cnd.where("proposalId", "=", proposalId).and("isMaster", "=", 1));
//并案的一起修改提案状态
dao.update(ProposalInfo.class,
Chain.make("stateCode", ProposalState.UNITREPLY),
Cnd.where("id", "=", proposalId));
//完成待办
ProposalToDoHandler.COMPLETE_BRANCH_LEADER_PREFIX_AUDIT_TASK.exec(proposalId, NutMap.NEW().addv("pblaId", pblaId));
//递交给承办单位
ProposalToDoHandler.CREATE_UNDERTAKE_TASK.exec(proposalId,null);
return null;
}
/**
* 撤回
*
* @param proposalId 提案id
* @return
*/
@At
@ViReturn
@POST
@RequiresPermissions("proposal.transact.branchLeaderPrefixAudit")
@SLog(type = "proposal", tag = "分管领导审批立案撤回", msg = "分管领导审批立案撤回")
public Object rollback(@Param("proposalId") String proposalId, @Param("underTakeId") String underTakeId) {
// List<String> underTakeList = proposalCommonService.getUnderTakeByLeaderAndProId(underTakeId, proposalId);
// List<String> conjoin = proposalCommonService.findConjoin(proposalId);
// Sql sql = Sqls.create("""
// SELECT * FROM proposal_branch_leader_audit where proposalId in (@proposalId) and underTakeId in (@underTakeList)
// """).setParam("proposalId", conjoin).setParam("underTakeList", underTakeList);
// List<NutMap> branchLeaderAuditList = proposalInfoService.listMap(sql);
// boolean isNode = proposalProcessService.isNode(ProposalState.BRANCHLEADERREAD);
// branchLeaderAuditList.forEach(v -> {
// if (isNode) {
// dao.update(ProposalInfo.class, Chain.make("stateCode", ProposalState.BRANCHLEADERREAD), Cnd.where("id", "=", v.getString("proposalId")));
// }
// dao.update(ProposalBranchLeaderAudit.class, Chain.make("isAudit", 0)
// .add("auditId", null), Cnd.where("proposalId", "=", v.getString("proposalId")).and("underTakeId", "=", v.getString("underTakeId")));
// });
// return Result.success().addMsg("撤回成功!");
return null;
}
}
@@ -0,0 +1,270 @@
package io.v.nutz.zhgh.proposal.controller.transact;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.base.Result;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.MsgApi;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.sys.services.SysLocalProcessService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.web.commons.slog.annotation.SLog;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.constants.ProposalToDoHandler;
import io.v.nutz.zhgh.proposal.models.*;
import io.v.nutz.zhgh.proposal.services.ProposalBranchLeaderSuffixAuditService;
import io.v.nutz.zhgh.proposal.services.ProposalCommonService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.zhgh.proposal.services.ProposalProcessService;
import io.v.nutz.sys.models.Sys_signature;
import io.v.nutz.sys.services.SysSignatureService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.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.POST;
import org.nutz.mvc.annotation.Param;
import org.nutz.trans.Trans;
import java.util.List;
/**
* 分管校领导审批
*
* @author jug
* @date 2024/01/11
*/
@IocBean
@Ok("json:full")
@At("/platform/proposal/transact/branchLeaderSuffixAudit")
public class ProposalBranchLeaderSuffixAuditController {
@Inject
private Dao dao;
@Inject
private MsgApi msgApi;
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalBranchLeaderSuffixAuditService proposalBranchLeaderSuffixAuditService;
@Inject
private ProposalProcessService proposalProcessService;
@Inject
private SysSignatureService sysSignatureService;
@Inject
private ProposalCommonService proposalCommonService;
@Inject
private SysLocalProcessService sysLocalProcessService;
@At("")
@Ok("beetl:/platform/proposal/transact/branchLeaderSuffixAudit.html")
@RequiresPermissions("proposal.transact.branchLeaderSuffixAudit")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.branchLeaderSuffixAudit")
public Object pageData(PageForm page, ProposalSearch search) {
Cnd cnd = Cnd.NEW();
proposalInfoService.sortAndSearch(cnd, page, search);
return proposalBranchLeaderSuffixAuditService.pageData(page, cnd, search);
}
/**
* 退回
*
* @param proposalId
* @param replyId
* @return
*/
@At
@ViReturn
@RequiresPermissions("proposal.transact.branchLeaderSuffixAudit")
public Object doRollBack(String proposalId, String replyId, String replyUnitId, String leaderCheckOpinion) {
Trans.exec(() -> {
List<String> conjoinIdList = proposalCommonService.findConjoin(proposalId);
List<String> underTakeList = proposalCommonService.getUnderTakeByLeaderAndProId(replyUnitId, proposalId);
List<ProposalReply> sameUnitReplyRecord = dao.query(ProposalReply.class, Cnd.where("proposalId", "in", conjoinIdList).and("replyUnitId", "in", underTakeList));
sameUnitReplyRecord.forEach(v -> {
// int stateCode = proposalProcessService.getSomeNodeNextStateCode(ProposalState.LEADERAUDIT, ProposalStateDirectionEnum.PREV);
// ProposalInfo proposalInfo = proposalInfoService.fetch(v.getProposalId());
// proposalInfo.setStateCode(ProposalState.LEADERAUDIT.equals(stateCode) ? ProposalState.LEADERAUDIT : stateCode);
// dao.updateIgnoreNull(proposalInfo);
// Chain chain = Chain.make("isReply", false);
// chain.add("leaderId", ShiroUtil.getUserId());
// chain.add("leaderCheckTime", DateUtil.getDateTime());
// chain.add("leaderCheckOpinion", leaderCheckOpinion);
// chain.add("isLeaderAudit", false);
// dao.update(ProposalReply.class, chain, Cnd.where("id", "=", v.getId()));
// System.out.println();
});
});
return null;
}
/**
* 审核
* 分管领导审批答复
*
* @param sign 签字
* @param proposalAudit 提案审核对象
* @param pblsaId
* @return {@link Object}
*/
@At
@POST
@ViReturn
@Aop(TransAop.READ_COMMITTED)
@RequiresPermissions("proposal.transact.branchLeaderPrefixAudit")
@SLog(type = "proposal", tag = "分管领导审批答复", msg = "分管领导审批答复")
public Object doAudit(@Param(value = "sign", required = false) String sign, @Param("audit") ProposalAudit proposalAudit, @Param("pblsaId") String pblsaId) {
//签字
String signId = null;
if (StrUtil.isNotBlank(sign)) {
signId = sysSignatureService.insert(new Sys_signature(sign)).getId();
}
proposalAudit.setUserId(ShiroUtil.getUserId());
proposalAudit.setSignId(signId);
dao.insert(proposalAudit);
dao.update(ProposalBranchLeaderSuffixAudit.class,
Chain.make("isAudit", true)
.add("auditId", proposalAudit.getId()),
Cnd.where("id", "=", pblsaId));
dao.update(ProposalInfo.class, Chain.make("stateCode", ProposalState.FINISH), Cnd.where("id", "=", proposalAudit.getProposalId()));
ProposalToDoHandler.COMPLETE_BRANCH_LEADER_SUFFIX_AUDIT_TASK.exec(proposalAudit.getProposalId(), NutMap.NEW().addv("pblsaId", pblsaId).addv("opinion", proposalAudit.getOpinion()));
ProposalToDoHandler.COMPLETE_PROCESS.exec(proposalAudit.getProposalId(), null);
return null;
}
/**
* 撤回
*
* @param proposalId
* @param replyUnitId
* @return
*/
@At
@ViReturn
@POST
@RequiresPermissions("proposal.transact.branchLeaderSuffixAudit")
@Aop(TransAop.READ_COMMITTED)
public Object rollback(@Param("proposalId") String proposalId, @Param("replyUnitId") String replyUnitId) {
// List<String> conjoin = proposalCommonService.findConjoin(proposalId);
// boolean isNode = proposalProcessService.isNode(ProposalState.LEADERAUDIT);
// List<ProposalReply> sameUnitReplyRecord = dao.query(ProposalReply.class, Cnd.where("proposalId", "in", conjoin).and("replyUnitId", "=", replyUnitId));
// sameUnitReplyRecord.forEach(v -> {
// if (isNode) {
// dao.update(ProposalInfo.class, Chain.make("stateCode", ProposalState.LEADERAUDIT), Cnd.where("id", "=", v.getProposalId()));
// dao.update(ProposalReply.class, Chain.make("isLeaderAudit", 0), Cnd.where("id", "=", v.getId()));
// } else {
// dao.update(ProposalReply.class, Chain.make("isLeaderAudit", 0), Cnd.where("id", "=", v.getId()));
// }
// });
return Result.success().addMsg("撤回成功!");
}
/**
* 查询待答复的单位的记录 一键提醒
*
* @param meetingId
* @return
*/
@At
@ViReturn
@RequiresPermissions("proposal.transact.branchLeaderSuffixAudit")
public Object selectReadySendMsgUsers(String meetingId) {
// Sql sql = Sqls.create("""
// SELECT
// info.id,
// info.proposalCode,
// info.proposalName,
// pu.unitName,
// u.username as leaderUserName,
// u.loginname as leaderLoginName
// FROM
// proposal_reply r
// LEFT JOIN proposal_info info on info.id = r.proposalId
// left join proposal_undertake pu on pu.id = r.replyUnitId
// left join sys_user_role sur on sur.cbdwid = r.replyUnitId AND sur.roleId = '153cba3fb88b4c88b7c1002f0eb63749'
// left join sys_user u on u.id = sur.userId
// where r.undertakeType = 1 and info.teacherMeetingId = @meetingId
// AND r.isLeaderAudit = 0
// AND info.stateCode = @stateCode
// AND info.resultCode = 'determine'
// ORDER BY info.proposalCode
// """);
// sql.setParam("meetingId", meetingId).setParam("stateCode", ProposalState.LEADERAUDIT);
// return proposalLeaderAuditService.listMap(sql);
return null;
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.branchLeaderSuffixAudit")
public Object oneKeyRemind(@Param("proposalIds") String[] proposalIds) {
// Assert.notEmpty(proposalIds);
// Sql sql = Sqls.create("""
// SELECT
// info.id,
// info.proposalCode,
// info.proposalName,
// r.replyUnitId,
// pu.unitName,
// u.username as leaderUserName,
// u.loginname as leaderLoginName,
// u.unitname as leaderUnitName,
// u.weAppOpenid
// FROM
// proposal_reply r
// LEFT JOIN proposal_info info on info.id = r.proposalId
// left join proposal_undertake pu on pu.id = r.replyUnitId
// left join sys_user_role sur on sur.cbdwid = r.replyUnitId AND sur.roleId = '153cba3fb88b4c88b7c1002f0eb63749'
// left join `user` u on u.id = sur.userId
// where r.undertakeType = 1
// AND info.id in (@proposalIds)
// AND r.isLeaderAudit = 0
// ORDER BY info.proposalCode
// """);
// sql.setParam("proposalIds", proposalIds);
// List<NutMap> list = proposalBranchLeaderSuffixAuditService.listMap(sql);
// for (NutMap nutMap : list) {
// String msg = String.format("智慧工会提醒:承办单位“%s”已经完成所有提案的答复,请您审批!",
// nutMap.getString("unitName"));
//
// NutMap map = new NutMap();
// map.setv("keyword1", NutMap.NEW().setv("value", "提案系统"));
// map.setv("keyword2", NutMap.NEW().setv("value", nutMap.getString("leaderUserName")
// + "(" + nutMap.getString("leaderLoginName") + ")"));
// map.setv("keyword3", NutMap.NEW().setv("value", nutMap.getString("leaderUnitName")));
// map.setv("keyword4", NutMap.NEW().setv("value", msg));
// map.setv("keyword5", NutMap.NEW().setv("value", cn.hutool.core.date.DateUtil.now()));
// msgApi.sendMsg(nutMap.getString("weAppOpenid"), msgApi.DSH_TEMPLATE_ID, Globals.AppDomain, map);
// }
return null;
}
}
@@ -0,0 +1,201 @@
package io.v.nutz.zhgh.proposal.controller.transact;
import cn.hutool.core.util.StrUtil;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.sys.services.SysLocalProcessService;
import io.v.nutz.zhgh.proposal.models.ProposalAudit;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalAuditService;
import io.v.nutz.zhgh.proposal.services.ProposalCaseService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.sys.models.Sys_signature;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.aop.interceptor.ioc.TransAop;
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.*;
import java.util.Arrays;
/**
* 立案审核
*
* @author jug
* @date 2024/01/11
*/
@IocBean
@At(value = {"/platform/proposal/transact/case/case", "/platform/proposal/transact/case/index"})
@Ok("json:full")
public class ProposalCaseController {
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalCaseService proposalCaseService;
@Inject
private ProposalAuditService proposalAuditService;
@Inject
private Dao dao;
@Inject
private SysLocalProcessService sysLocalProcessService;
@At("")
@Ok("beetl:/platform/proposal/transact/case.html")
@RequiresPermissions("proposal.transact.case")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.case")
public Object pageData(PageForm page, ProposalSearch search) {
return proposalCaseService.pageData(page, search);
}
/**
* 获取开启的承办单位及领导信息
*
* @return
*/
@At
@Ok("json:full")
@ViReturn
@RequiresPermissions(value = {"proposal.transact.case", "offerAdvice.schoolUnionAudit"}, logical = Logical.OR)
public Object getUnderTakeAndLeader() {
Sql sql = Sqls.create("""
SELECT
pu.*,
(
SELECT
GROUP_CONCAT( su.username )
FROM
sys_user_role sur
LEFT JOIN sys_user su ON sur.userId = su.id
WHERE
sur.cbdwid = pu.id
AND sur.roleId = '153cba3fb88b4c88b7c1002f0eb63749'
) leader
FROM
proposal_undertake pu
WHERE
pu.isEnable = 1
ORDER BY
pu.unitCode ASC
""");
return proposalInfoService.listMap(sql);
}
/**
* 审核
*
* @param audit 审核通用对象
* @param resultCode 立案结构
* @param determineTypeCode 立案类型
* @param typeId 类型
* @param hostUnit 主办
* @param helpUnit 协办
* @param sign 签字
* @param proposalIds 提案
* @param auditType 审核类型,one=>页面点击行内审核按钮,进行单个审核,many=>并案审核
* @return
*/
@At("/audit")
@POST
@Ok("json:full")
@ViReturn
@RequiresPermissions("proposal.transact.case")
@Aop(TransAop.READ_COMMITTED)
public Object audit(@Param("audit") ProposalAudit audit,
@Param("resultCode") String resultCode,
@Param(value = "determineTypeCode", required = false) String determineTypeCode,
@Param("typeId") String typeId,
@Param("hostUnit") String hostUnit,
@Param(value = "helpUnit", required = false) String[] helpUnit,
@Param(value = "sign", required = false) String sign,
@Param("proposalIds") String[] proposalIds,
@Param("auditType") String auditType,
@Param("flag") int flag) {
if (StrUtil.isNotBlank(sign)) {
String signId = dao.insert(new Sys_signature(sign)).getId();
audit.setSignId(signId);
}
audit.setFlag(flag == 1);
proposalCaseService.audit(Arrays.asList(proposalIds), resultCode, determineTypeCode, hostUnit, Arrays.asList(helpUnit), typeId, audit, auditType, flag);
return null;
}
/**
* 编辑
*
* @param audit 审核通用对象
* @param resultCode 立案结构
* @param determineTypeCode 立案类型
* @param typeId 类型
* @param hostUnit 主办
* @param helpUnit 协办
* @param sign 签字
* @param proposalIds 提案
* @return
*/
@At
@POST
@Ok("json:full")
@ViReturn
@Aop(TransAop.READ_COMMITTED)
@RequiresPermissions("proposal.transact.case")
public Object edit(@Param("audit") ProposalAudit audit, @Param("resultCode") String resultCode,
@Param("determineTypeCode") String determineTypeCode,
@Param("typeId") String typeId, @Param("hostUnit") String hostUnit,
@Param("helpUnit") String[] helpUnit, @Param("sign") String sign,
@Param("proposalIds") String[] proposalIds, @Param("auditType") String auditType,
@Param("flag") int flag) {
proposalCaseService.edit(Arrays.asList(proposalIds));
if (StrUtil.isNotBlank(sign)) {
String signId = dao.insert(new Sys_signature(sign)).getId();
audit.setSignId(signId);
}
proposalCaseService.audit(Arrays.asList(proposalIds), resultCode, determineTypeCode, hostUnit, Arrays.asList(helpUnit), typeId, audit, auditType, flag);
return null;
}
/**
* 撤回
*
* @param proposalId 提案id
* @return
*/
@At("/revoke")
@Ok("json:full")
@ViReturn
@RequiresPermissions("proposal.transact.case")
public Object revoke(@Param("proposalId") String proposalId) {
proposalCaseService.revoke(proposalId);
return null;
}
@At("/backShow")
@GET
@Ok("json:full")
@ViReturn
@RequiresPermissions("proposal.transact.case")
public Object backShow(@Param("proposalId") String proposalId) {
return proposalCaseService.backShow(proposalId);
}
}
@@ -0,0 +1,217 @@
package io.v.nutz.zhgh.proposal.controller.transact;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.page.Pagination;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.MsgApi;
import io.v.nutz.base.utils.Roles;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.ProposalAudit;
import io.v.nutz.zhgh.proposal.models.ProposalInfo;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.sys.models.Sys_signature;
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.web.commons.utils.ShiroUtil;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.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.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@IocBean
@At("/platform/proposal/transact/caseRead")
@Ok("json:full")
public class ProposalCaseReadController {
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private Dao dao;
@At("")
@Ok("beetl:/platform/proposal/transact/caseRead.html")
@RequiresPermissions("proposal.transact.caseRead")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.caseRead")
public Object pageData(PageForm page, ProposalSearch search) {
CndPlus cnd = CndPlus.create();
Sql sql = Sqls.create("""
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
dbt.`code` delegationCode,
manner.`name` mannerName,
result.`name` resultName,
$temp_sql
FROM
proposal_info info
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
$condition
""").setParam("userId", ShiroUtil.getPrincipalProperty("id"));
/* StringBuffer tempStr = new StringBuffer("""
(JSON_CONTAINS(JSON_EXTRACT( membersOpinions, '$[*].userId' ), '\\"%s\\"') = 1) AS isOpinion
""".formatted(ShiroUtil.getUserId()));
sql.setVar("temp_sql", tempStr);*/
StringBuffer tempStr = new StringBuffer("""
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 isOpinion
""".formatted(ShiroUtil.getUserId()));
sql.setVar("temp_sql", tempStr);
if (Strings.isNotBlank(search.getIsAudit())) {
if (search.getIsAudit().equals("true")) {
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(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);
cnd.asc("info.stateCode");
// proposalInfoService.sortAndSearch(cnd,page,search);
Pagination pagination = (Pagination) proposalInfoService.initSql(sql, page, search, cnd);
List<NutMap> list = pagination.getList();
for (NutMap map : list) {
if (StrUtil.isNotBlank(search.getIsAudit()) && "true".equals(search.getIsAudit())) {
String membersOpinions = map.getString("membersOpinions");
List<String> mlist = Json.fromJsonAsList(String.class, membersOpinions);
map.putAll(getCommitteeOpinion(mlist));
} else {
map.putAll(NutMap.NEW().addv("caseNum", "暂无")
.addv("opinionNum", "暂无").addv("notGiveNum", "暂无"));
}
}
// pagination.setList(list);
return pagination;
}
private NutMap getCommitteeOpinion(List<String> mlist) {
if (Lang.isEmpty(mlist)) {
// return NutMap.NEW().addv("caseNum", 0).addv("emphasisNum", 0).addv("ordinaryNum", 0)
// .addv("opinionNum", 0).addv("notGiveNum", 0);
return NutMap.NEW().addv("caseNum", "暂无")
.addv("opinionNum", "暂无").addv("notGiveNum", "暂无");
}
List<ProposalAudit> alist = dao.query(ProposalAudit.class, Cnd.where("id", "in", mlist));
long caseNum = alist.stream().filter(v -> "determine".equals(v.getOther())).count();
long emphasisNum = alist.stream().filter(v -> "determine".equals(v.getOther()) && "emphasis".equals(v.getDetermineTypeCode())).count();
long ordinaryNum = alist.stream().filter(v -> "determine".equals(v.getOther()) && "ordinary".equals(v.getDetermineTypeCode())).count();
long opinionNum = alist.stream().filter(v -> "opinion".equals(v.getOther())).count();
long notGiveNum = alist.stream().filter(v -> "notGive".equals(v.getOther())).count();
return NutMap.NEW().addv("caseNum", caseNum).addv("emphasisNum", emphasisNum).addv("ordinaryNum", ordinaryNum)
.addv("opinionNum", opinionNum).addv("notGiveNum", notGiveNum);
}
@Inject
private SysSignatureService sysSignatureService;
/**
* 委员会成员意见
*
* @param audit 审核记录
* @param proposalId 提案id
* @return 🤭
*/
@At
@ViReturn
@RequiresPermissions("proposal.transact.caseRead")
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();
ProposalAudit proposalAudit = Json.fromJson(ProposalAudit.class, audit);
proposalAudit.setSignId(signId);
proposalAudit.setUserId(ShiroUtil.getUserId());
if (!proposalAudit.getOther().equals(ProposalConstant.DETERMINE)) {
proposalAudit.setDetermineTypeCode(null);
}
dao.insert(proposalAudit);
/*List<NutMap> membersOpinions = proposalInfo.getMembersOpinions() == null ? new ArrayList<>() : proposalInfo.getMembersOpinions();
membersOpinions.add(NutMap.NEW().addv("userId", ShiroUtil.getUserId()).addv("auditId", insertAudit.getId()));
proposalInfo.setMembersOpinions(membersOpinions);*/
List<String> membersOpinions = proposalInfo.getMembersOpinions() == null ? new ArrayList<>() : proposalInfo.getMembersOpinions();
membersOpinions.add(proposalAudit.getId());
proposalInfo.setMembersOpinions(membersOpinions);
proposalInfoService.updateIgnoreNull(proposalInfo);
return null;
}
@Inject
private MsgApi msgApi;
@At
@ViReturn
@RequiresPermissions("proposal.transact.caseRead")
public Object doSend(String meetingId) {
List<String> userRoles = new ArrayList<>();
userRoles.add(Roles.WYH_ZR);
userRoles.add(Roles.WYH_FZR);
userRoles.add(Roles.JDH_TA_WXY_WY_ROLE_ID);
List<Sys_user_role> sysUserRoles = dao.query(Sys_user_role.class, Cnd.where("roleid", "in", userRoles).and("jdhid", "=", meetingId));
List<String> userIds = sysUserRoles.stream().map(Sys_user_role::getUserId).collect(Collectors.toList());
List<User> userList = dao.query(User.class, Cnd.where("id", "in", userIds));
String wyhCyTemplate = "各位委员,提案已经预审完毕,请登录pc端智慧工会平台,选择委员会成员意见功能,对每个提案进行投票并提出意见!";
userList.forEach(v -> {
NutMap map = new NutMap();
map.setv("keyword1", NutMap.NEW().setv("value", "提案系统"));
map.setv("keyword2", NutMap.NEW().setv("value", v.getUsername()
+ "(" + v.getLoginname() + ")"));
map.setv("keyword3", NutMap.NEW().setv("value", v.getUnitname()));
map.setv("keyword4", NutMap.NEW().setv("value", wyhCyTemplate));
map.setv("keyword5", NutMap.NEW().setv("value", DateUtil.now()));
// msgApi.sendMsg(v.getWeAppOpenid(), msgApi.DSH_TEMPLATE_ID, Globals.AppDomain, map);
});
return null;
}
}
@@ -0,0 +1,137 @@
package io.v.nutz.zhgh.proposal.controller.transact;
import cn.hutool.core.util.StrUtil;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.Roles;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.web.commons.slog.annotation.SLog;
import io.v.nutz.zhgh.proposal.models.ProposalAudit;
import io.v.nutz.zhgh.proposal.models.ProposalReply;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalCaseConfirmService;
import io.v.nutz.zhgh.proposal.services.ProposalCommonService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.sys.models.Sys_signature;
import io.v.nutz.sys.models.Sys_user_role;
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.FieldFilter;
import org.nutz.dao.util.Daos;
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 org.nutz.mvc.annotation.POST;
import org.nutz.mvc.annotation.Param;
import java.util.Arrays;
import java.util.List;
/**
* 委员会确认承办单位
*
* @author jug
* @date 2024/01/11
*/
@IocBean
@Ok("json:full")
@At("/platform/proposal/transact/caseUnit")
public class ProposalCaseUnitController {
@Inject
private Dao dao;
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalCaseConfirmService proposalCaseConfirmService;
@Inject
private ProposalCommonService proposalCommonService;
@At("")
@Ok("beetl:/platform/proposal/transact/caseUnit.html")
@RequiresPermissions("proposal.transact.caseUnit")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.caseUnit")
public Object pageData(PageForm page, ProposalSearch search) {
return proposalCaseConfirmService.pageData(page, search);
}
@At("/audit")
@POST
@Ok("json:full")
@ViReturn
@RequiresPermissions("proposal.transact.caseUnit")
@Aop(TransAop.READ_COMMITTED)
@SLog(type = "proposal", tag = "提案委员会确认承办单位", msg = "提案委员会确认承办单位")
public Object audit(@Param("audit") ProposalAudit audit,
@Param("resultCode") String resultCode,
@Param("determineTypeCode") String determineTypeCode,
@Param(value = "typeId", required = false) String typeId,
@Param("hostUnit") String hostUnit,
@Param(value = "helpUnit", required = false) String[] helpUnit,
@Param(value = "sign", required = false) String sign,
@Param(value = "proposalIds") String[] proposalIds) {
if (StrUtil.isNotBlank(sign)) {
String signId = dao.insert(new Sys_signature(sign)).getId();
audit.setSignId(signId);
}
proposalCaseConfirmService.audit(Arrays.asList(proposalIds), resultCode, determineTypeCode, hostUnit, Arrays.asList(helpUnit), typeId, audit);
return null;
}
/**
* 撤回
*
* @param proposalId 提案id
* @return
*/
@At("/revoke")
@Ok("json:full")
@ViReturn
@RequiresPermissions("proposal.transact.caseUnit")
public Object revoke(@Param("proposalId") String proposalId) {
// proposalCaseConfirmService.revoke(proposalId);
// return null;
return "撤回个锤子";
}
/**
* 查询该提案下分配的承办单位
*
* @param proposalId
* @return
*/
@At
@ViReturn
@Ok("json")
@RequiresPermissions("proposal.transact.caseUnit")
public Object queryUnderTakeByProposalId(String proposalId) {
FieldFilter ff = FieldFilter.create(ProposalReply.class, "^replyUnitId|undertakeType$");
List<ProposalReply> underTakeList = Daos.ext(proposalInfoService.dao(), ff).query(ProposalReply.class, Cnd.where("proposalId", "=", proposalId));
return underTakeList;
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.caseUnit")
public Object checkUnderTakeUser(String hostUnit) {
String[] roleIds = Lang.array(Roles.CONTRACTOR_PERSON, Roles.IN_CHARGE_LEADER);
Dao dao = proposalInfoService.dao();
int count = dao.count(Sys_user_role.class, Cnd.where("cbdwid", "=", hostUnit).and("roleId", "in", roleIds));
return count >= 2;
}
}
@@ -0,0 +1,89 @@
package io.v.nutz.zhgh.proposal.controller.transact;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.MsgApi;
import io.v.nutz.base.utils.Roles;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.web.commons.slog.annotation.SLog;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
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 java.util.List;
/**
* 团长审核
*
* @author jug
* @date 2024/01/11
*/
@IocBean
@Ok("json:full")
@At("/platform/proposal/transact/delegation")
public class ProposalDelegationHeadController {
@Inject
private Dao dao;
@Inject
private MsgApi msgApi;
@Inject
private ProposalInfoService proposalInfoService;
@At("")
@Ok("beetl:/platform/proposal/transact/delegation.html")
@RequiresPermissions("proposal.transact.delegation")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.delegation")
public Object pageData(PageForm page, ProposalSearch search) {
String userId = ShiroUtil.getPrincipalProperty("id").toString();
CndPlus cnd = CndPlus.create();
if (!ShiroUtil.hasAnyRoles("tamange,sysadmin")) {
Sql sql = Sqls.create("SELECT dbtid FROM sys_user_role sur LEFT JOIN proposal_info info ON info.teacherMeetingId = sur.jdhid WHERE sur.roleId = @roleId AND sur.userId = @userId").setParam("roleId", Roles.DBT_TZ).setParam("userId", userId);
cnd.and("info.delegationId", "IN", sql);
cnd.and(Cnd.exps("info.delegationUnionId", "=", Vi.getUnionId()).or("info.delegationUnionId", "is", null));
}
if (Strings.isNotBlank(search.getIsAudit())) {
if (search.getIsAudit().equals("true")) {
cnd.and(Cnd.exps("info.stateCode", ">", ProposalState.DELEGATION));
} else {
cnd.and("info.stateCode", "=", ProposalState.DELEGATION);
}
} else {
cnd.and(Cnd.exps("info.stateCode", ">=", ProposalState.DELEGATION));
}
if (Strings.isNotBlank(search.getSearchKeyWord())) {
SqlExpressionGroup sqlExpressionGroup = new SqlExpressionGroup();
sqlExpressionGroup.andLike("info.proposalName", search.getSearchKeyWord());
sqlExpressionGroup.orLike("info.proposalCode", search.getSearchKeyWord());
cnd.and(sqlExpressionGroup);
}
return proposalInfoService.pageData(page, search, cnd);
}
}
@@ -0,0 +1,423 @@
package io.v.nutz.zhgh.proposal.controller.transact;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.page.Pagination;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.DateUtil;
import io.v.nutz.base.utils.Html2Text;
import io.v.nutz.base.utils.MsgApi;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.sys.services.SysLocalProcessService;
import io.v.nutz.web.commons.slog.annotation.SLog;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.constants.ProposalStateDirectionEnum;
import io.v.nutz.zhgh.proposal.constants.ProposalToDoHandler;
import io.v.nutz.zhgh.proposal.models.*;
import io.v.nutz.zhgh.proposal.services.ProposalCommonService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.zhgh.proposal.services.ProposalProcessService;
import io.v.nutz.zhgh.proposal.services.ProposalReplyService;
import io.v.nutz.base.service.ViService;
import io.v.nutz.sys.services.SysSignatureService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.web.commons.base.Globals;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import org.nutz.trans.Trans;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
/**
* 反馈评分
*
* @author jug
* @date 2023/07/03
*/
@IocBean
@Ok("json:full")
@At("/platform/proposal/transact/feedback")
public class ProposalFeedbackScoreController {
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalProcessService proposalProcessService;
@Inject("ProposalFeedback")
private ViService<ProposalFeedback> proposalFeedbackService;
@Inject
private SysSignatureService sysSignatureService;
@Inject
private ProposalReplyService replyService;
@Inject
private MsgApi msgApi;
@Inject
private Dao dao;
@Inject
private SysLocalProcessService sysLocalProcessService;
@Inject
private ProposalCommonService proposalCommonService;
@At("")
@Ok("beetl:/platform/proposal/transact/feedback.html")
@RequiresPermissions("proposal.transact.feedback")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.feedback")
public Object pageData(PageForm page, ProposalSearch search) {
CndPlus cnd = CndPlus.create();
Sql sql = Sqls.create("""
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.`code` delegationCode,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName,
(
SELECT
count( 1 ) > 0
FROM
proposal_conjoin
where JSON_CONTAINS (proposalIds,JSON_QUOTE(info.id))
) AS isConjoin
FROM
proposal_info info
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
$condition
""");
if (!ShiroUtil.hasAnyRoles("sysadmin, tamange,A06")) {
cnd.and("info.createUser", "=", ShiroUtil.getUserId());
}
proposalInfoService.sortAndSearch(cnd, page, search);
if (StrUtil.isBlank(search.getIsAudit())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("info.stateCode", "=", ProposalState.FEEDBACKSCORE);
SqlExpressionGroup seg2 = new SqlExpressionGroup();
seg2.or("info.stateCode", ">=", ProposalState.FEEDBACKSCORE);
seg2.orGT("(select count(1) from proposal_reply pr where pr.proposalId = info.id and pr.undertakeType = 1)", 1);
cnd.and(Cnd.exps(seg).or(seg2));
} else if (search.getIsAudit().equals("true")) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("info.stateCode", ">=", ProposalState.FEEDBACKSCORE);
seg.orGT("(select count(1) from proposal_reply pr where pr.proposalId = info.id and pr.undertakeType = 1)", 1);
cnd.and(seg);
} else if (search.getIsAudit().equals("false")) {
cnd.and("info.stateCode", "=", ProposalState.FEEDBACKSCORE);
}
sql.setCondition(cnd);
Pagination pagination = proposalInfoService.listPageMap(page.getPageNumber(), page.getPageSize(), sql);
List<NutMap> list = pagination.getList();
list.forEach(v -> {
int stateCode = v.getInt("stateCode");
int someNodeNextStateCode = proposalProcessService.getSomeNodeNextStateCode(ProposalState.FEEDBACKSCORE, ProposalStateDirectionEnum.NEXT);
v.put("canRollBack", stateCode == someNodeNextStateCode);
});
return pagination;
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.feedback")
@SLog(type = "proposal", tag = "提案人反馈评价", msg = "提案人反馈评价")
@Aop(TransAop.READ_COMMITTED)
public Object doFeedback(@Param("feedBack") ProposalFeedback proposalFeedback) {
int feedbackCount = proposalFeedbackService.count(Cnd.where("proposalId", "=", proposalFeedback.getProposalId()));
proposalFeedback.setFeedbackPerson(ShiroUtil.getUserId());
proposalFeedback.setFeedbackNumber(feedbackCount + 1);
proposalFeedback.setFeedbackTime(DateUtil.getDateTime());
proposalFeedbackService.insert(proposalFeedback);
//完成待办
ProposalToDoHandler.COMPLETE_FEEDBACK_TASK.exec(proposalFeedback.getProposalId(), NutMap.NEW().addv("opinion", proposalFeedback.getFeedbackOpinion()));
ProposalReply lastReply = dao.fetch(ProposalReply.class, Cnd.where("proposalId", "=", proposalFeedback.getProposalId()).and("undertakeType", "=", 1));
if (ProposalConstant.NOT_SATISFIED.equals(proposalFeedback.getFeedbackCode())) {
dao.update(ProposalInfo.class, Chain.make("stateCode", ProposalState.UNITREPLY), Cnd.where("id", "=", proposalFeedback.getProposalId()));
ProposalReply newReply = new ProposalReply();
newReply.setProposalId(lastReply.getProposalId());
newReply.setUndertakeType(lastReply.getUndertakeType());
newReply.setReplyUnitId(lastReply.getReplyUnitId());
newReply.setReplyNumber(lastReply.getReplyNumber() + 1);
newReply.setIsReply(false);
newReply.setIsLeaderAudit(false);
dao.insert(newReply);
//再次推送承办单位办理任务
ProposalToDoHandler.CREATE_UNDERTAKE_TASK.exec(proposalFeedback.getProposalId(), null);
} else {
dao.update(ProposalInfo.class, Chain.make("stateCode", ProposalState.LEADER_SUFFIX_AUDIT), Cnd.where("id", "=", proposalFeedback.getProposalId()));
//插入领导审批记录
ProposalBranchLeaderSuffixAudit leaderSuffixAudit = new ProposalBranchLeaderSuffixAudit();
leaderSuffixAudit.setProposalId(proposalFeedback.getProposalId());
leaderSuffixAudit.setUnderTakeId(lastReply.getReplyUnitId());
leaderSuffixAudit.setIsMaster(true);
leaderSuffixAudit.setIsAudit(false);
dao.insert(leaderSuffixAudit);
ProposalToDoHandler.CREATE_BRANCH_LEADER_SUFFIX_AUDIT_TASK.exec(proposalFeedback.getProposalId(), NutMap.NEW().addv("leaderSuffixAudit", leaderSuffixAudit));
}
return null;
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.feedback")
public Object doWithdraw(String proposalId) {
ProposalInfo proposalInfo = proposalInfoService.fetch(proposalId);
proposalInfo.setStateCode(ProposalState.FEEDBACKSCORE);
proposalInfoService.dao().updateIgnoreNull(proposalInfo);
ProposalFeedback proposalFeedback = proposalInfoService.dao().fetch(ProposalFeedback.class, Cnd.where("proposalId", "=", proposalId).desc("feedbackNumber"));
proposalFeedbackService.clear(Cnd.where("id", "=", proposalFeedback.getId()));
return null;
}
@At
@Ok("void")
@RequiresPermissions("proposal.transact.feedback")
public void doExport(String proposalId, HttpServletResponse response) throws IOException {
Sql sql = Sqls.create("""
SELECT
info.*,
su.username,
su.mobile,
su.email,
un.`name` unitName,
type.typeName,
result.`name` resultName,
pu.unitName implementUnitName,
jdh.jdhallname jdhAllName,
dbt.dbtname dbtName,
under1.unitName under1Unit,
GROUP_CONCAT(under2.unitName) under2Unit
FROM
proposal_info info
LEFT JOIN sys_user su ON su.id = info.createUser
LEFT JOIN sys_unit un ON un.id = su.unitid
LEFT JOIN proposal_undertake pu ON pu.id = info.implementUnitId
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
LEFT JOIN jdh_jdhxx jdh ON jdh.id=info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id=info.delegationId
LEFT JOIN proposal_reply reply1 ON reply1.proposalId=info.id AND reply1.undertakeType=1
LEFT JOIN proposal_undertake under1 ON under1.id=reply1.replyUnitId
LEFT JOIN proposal_reply reply2 ON reply2.proposalId=info.id AND reply2.undertakeType=2
LEFT JOIN proposal_undertake under2 ON under2.id=reply2.replyUnitId
WHERE
info.id = @proposalId
""").setParam("proposalId", proposalId);
NutMap nutMap = proposalInfoService.fetch(sql);
//每个承办单位最大答复次数记录
List<NutMap> maxReplyList = new ArrayList<>();
List<NutMap> undertakeList = (List<NutMap>) replyService.getUndertakeReply(proposalId);
Map<String, List<NutMap>> collect = undertakeList.stream().collect(Collectors.groupingBy(v -> v.getString("unitName")));
collect.forEach((k, v) -> {
NutMap maxReplyRecord = v.stream().max(Comparator.comparingInt(a -> a.getInt("replyNumber"))).get();
maxReplyList.add(maxReplyRecord);
});
maxReplyList.forEach(v -> {
v.setv("replyTime", v.getString("replyTime").substring(0, 10));
v.setv("replyContent", Html2Text.toPlainText(v.getString("replyContent")));
if (v.getString("implementState").equals("已经落实")) {
v.setv("implementState", "☑已经落实 ☐列入年度工作计划\n" + "☐暂缓落实 ☐无法落实");
} else if (v.getString("implementState").equals("列入年度工作计划")) {
v.setv("implementState", "☐已经落实 ☑列入年度工作计划\n" + "☐暂缓落实 ☐无法落实");
} else if (v.getString("implementState").equals("暂缓落实")) {
v.setv("implementState", "☐已经落实 ☐列入年度工作计划\n" + "☑暂缓落实 ☐无法落实");
} else {
v.setv("implementState", "☐已经落实 ☐列入年度工作计划\n" + "☐暂缓落实 ☑无法落实");
}
});
List<NutMap> undertakeOne = maxReplyList.stream().filter(v -> v.getString("undertakeType").equals("1")).collect(Collectors.toList());
List<NutMap> undertakeTwo = maxReplyList.stream().filter(v -> v.getString("undertakeType").equals("2")).collect(Collectors.toList());
Sql feedbackSql = Sqls.create("""
SELECT
pf.*,
su.username,
su.loginname,
dict.`name` feedbackResult,
sign.`data` feedbackSign
FROM
proposal_feedback pf
LEFT JOIN sys_user su ON su.id = pf.feedbackPerson
LEFT JOIN sys_dict dict ON dict.`code` = pf.feedbackCode
LEFT JOIN sys_signature sign ON sign.id = pf.scoreSignId
WHERE
pf.proposalId = @proposalId
""").setParam("proposalId", proposalId);
List<NutMap> feedbackList = proposalInfoService.listMap(feedbackSql);
feedbackList.forEach(v -> {
try {
v.setv("feedbackSign", StrUtil.isNotBlank(v.getString("feedbackSign")) ? getImg(v.getString("feedbackSign")) : null);
} catch (IOException e) {
e.printStackTrace();
}
if (v.getString("feedbackResult").equals("满意")) {
v.setv("feedbackResult", "1.满意(√)2.较满意()3.不满意()");
} else if (v.getString("feedbackResult").equals("比较满意")) {
v.setv("feedbackResult", "1.满意()2.较满意(√)3.不满意()");
} else {
v.setv("feedbackResult", "1.满意()2.较满意()3.不满意(√)");
}
v.setv("feedbackOpinion", Html2Text.toPlainText(v.getString("feedbackOpinion")));
v.setv("feedbackTime", v.getString("feedbackTime").substring(0, 10));
});
NutMap maxFeedback = feedbackList.stream().max(Comparator.comparingInt(a -> a.getInt("feedbackNumber"))).get();
HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
Configure config = Configure.newBuilder().bind("secondedList", policy).build();
HashMap<String, Object> map = new HashMap<>();
map.put("proposal", nutMap);
map.put("schoolName", Globals.MyConfig.getString("GxName"));
map.put("maxReplyList", maxReplyList);
map.put("undertakeOne", undertakeOne);
map.put("undertakeTwo", undertakeTwo);
map.put("maxFeedback", maxFeedback);
String fileName = nutMap.getString("proposalName");
response.addHeader("Content-Type", "application/octet-stream");
response.addHeader("Content-Disposition", "attachment; filename=\"" + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1) + "\".docx");
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("docTemplate/proposal/feedbackExport.docx");
XWPFTemplate.compile(inputStream, config).render(map, response.getOutputStream());
inputStream.close();
}
private PictureRenderData getImg(String base64) throws IOException {
String s = base64.split(",")[1];
byte[] bytes = Base64.getDecoder().decode(s);
return new PictureRenderData(70, 30, ".png", bytes);
}
/**
* 查询待答复的单位的记录 一键提醒
*
* @param meetingId
* @return
*/
@At
@ViReturn
@RequiresPermissions("proposal.transact.feedback")
public Object selectReadySendMsgUsers(String meetingId) {
Assert.notBlank(meetingId);
Sql sql = Sqls.create("""
SELECT
info.id,
info.proposalCode,
info.proposalName,
u.username,
u.loginname
FROM
proposal_info info
left join sys_user u on u.id = info.createUser
where info.teacherMeetingId = @meetingId
AND info.stateCode = @feedBackStateCode
ORDER BY info.proposalCode
""");
sql.setParam("meetingId", meetingId);
sql.setParam("feedBackStateCode", ProposalState.FEEDBACKSCORE);
return proposalFeedbackService.listMap(sql);
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.feedback")
public Object oneKeyRemind(@Param("proposalIds") String[] proposalIds) {
Assert.notEmpty(proposalIds);
Sql sql = Sqls.create("""
SELECT
info.id,
info.proposalCode,
info.proposalName,
u.username,
u.loginname
FROM
proposal_info info
left join sys_user u on u.id = info.createUser
where info.id in (@proposalIds)
AND info.stateCode = @feedBackStateCode
ORDER BY info.proposalCode
""");
sql.setParam("proposalIds", proposalIds);
sql.setParam("feedBackStateCode", ProposalState.FEEDBACKSCORE);
List<NutMap> list = proposalFeedbackService.listMap(sql);
Trans.exec(() -> {
});
for (NutMap nutMap : list) {
String msg = String.format("温馨提醒:%s老师,目前提案“%s”还没有反馈评价,您作为该提案的撰写人,请登录智慧工会系统进行反馈评价。", nutMap.getString("username"), nutMap.getString("proposalName"));
System.out.println(msg);
// msgApi.sendMsg(msg, List.of(nutMap.getString("loginname")));
}
return null;
}
}
@@ -0,0 +1,488 @@
package io.v.nutz.zhgh.proposal.controller.transact;
import cn.wizzer.framework.base.Result;
import cn.wizzer.framework.base.service.BaseService;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.DateUtil;
import io.v.nutz.base.utils.Roles;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.web.commons.base.Globals;
import io.v.nutz.zhgh.proposal.constants.ProposalMannerEnum;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.constants.ProposalStateDirectionEnum;
import io.v.nutz.zhgh.proposal.constants.ProposalToDoHandler;
import io.v.nutz.zhgh.proposal.models.ProposalInfo;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.models.ProposalSeconded;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.zhgh.proposal.services.ProposalProcessService;
import io.v.nutz.base.service.ViService;
import io.v.nutz.sys.models.Sys_signature;
import io.v.nutz.sys.models.Sys_user;
import io.v.nutz.sys.services.SysLocalProcessService;
import io.v.nutz.sys.services.SysSignatureService;
import io.v.nutz.sys.services.SysUserService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.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.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
/**
* 我的提案
*
* @author jug
* @date 2023/06/30
*/
@At("/platform/proposal/transact/compose")
@Ok("json:full")
@IocBean
public class ProposalMineController {
@Inject
private Dao dao;
@Inject
private BaseService baseService;
@Inject
private SysUserService sysUserService;
@Inject
private SysSignatureService sysSignatureService;
@Inject
private ProposalInfoService proposalInfoService;
@Inject("ProposalSeconded")
private ViService<ProposalSeconded> secondedService;
@Inject
private ProposalProcessService proposalProcessService;
@Inject
private SysLocalProcessService sysLocalProcessService;
@At("")
@Ok("beetl:/platform/proposal/transact/compose.html")
@RequiresPermissions("proposal.transact.compose")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.compose")
public Object deleteSeconder(String proposalId, String seconderId) {
secondedService.clear(Cnd.where("proposalId", "=", proposalId).and("seconderId", "=", seconderId));
return null;
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.compose")
public Object pageData(PageForm page, ProposalSearch search) {
Sql sql = Sqls.create("""
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName,
(select count(1) from proposal_seconded ps where ps.proposalId = info.id and ps.isAgree = 1) AS alreadySecondedCount
FROM
proposal_info info
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
$condition
""");
String userId = ShiroUtil.getPrincipalProperty("id").toString();
CndPlus cnd = CndPlus.create();
// if (!ShiroUtil.hasAnyRoles("tamange,sysadmin")) {
cnd.and("info.createUser", "=", userId);
// }
cnd.desc("info.createTime");
proposalInfoService.sortAndSearch(cnd, page, search);
sql.setCondition(cnd);
return proposalInfoService.listPageMap(page.getPageNumber(), page.getPageSize(), sql);
}
/**
* 添加提案并返回proposalInfo对象
*
* @param info
* @return
*/
@At
@ViReturn
@RequiresPermissions("proposal.transact.compose")
@Aop(TransAop.READ_COMMITTED)
public Object doAdd(@Param("data") ProposalInfo info, @Param("sign") String sign) {
Sys_signature sysSignature = new Sys_signature();
sysSignature.setData(sign);
dao.insert(sysSignature);
info.setSignId(sysSignature.getId());
NutMap map = proposalInfoService.fetch(Sqls.create("select max(proposalCode) proposalCode from proposal_info where teacherMeetingId='%s' and stateCode<='%s'".formatted(info.getTeacherMeetingId(), ProposalState.CASE)));
int proposalCode = map.getInt("proposalCode");
if (proposalCode == -1) {
proposalCode = Integer.parseInt(DateUtil.getYear() + "01");
} else {
proposalCode = proposalCode + 1;
}
info.setProposalCode(String.valueOf(proposalCode));
info.setOldProposalCode(String.valueOf(proposalCode));
info.setCreateUser((String) ShiroUtil.getPrincipalProperty("id"));
info.setCreateTime(DateUtil.getDate());
info.setStateCode(ProposalState.UNSUBMIT);
proposalInfoService.doAdd(info);
ProposalToDoHandler.START_PROCESS.exec(info.getId(), null);
return Result.success().addData(info.getId());
}
/**
* 修改提案
*
* @param info
* @param sign
* @return
*/
@At
@ViReturn
@RequiresPermissions("proposal.transact.compose")
public Object doEdit(@Param("data") ProposalInfo info, @Param(value = "sign", required = false) String sign) {
// if (info.getStateCode().equals(ProposalState.DELEGATION_BACK)) {
// info.setStateCode(ProposalState.DELEGATION);
// }
Sys_signature sysSignature = new Sys_signature();
sysSignature.setData(sign);
dao.insert(sysSignature);
info.setSignId(sysSignature.getId());
proposalInfoService.doEdit(info);
return Result.success().addData(info.getId());
}
/**
* 删除提案
*
* @param id
* @return
*/
@At
@ViReturn
@RequiresPermissions("proposal.transact.compose")
@Aop(TransAop.READ_COMMITTED)
public Object doDelete(String id) {
proposalInfoService.doDelete(id);
ProposalToDoHandler.DELETE_PROCESS.exec(id, null);
return null;
}
/**
* 添加附议人
*
* @param proposalId
* @param users
* @return
*/
@At
@ViReturn
@Aop(TransAop.READ_COMMITTED)
@RequiresPermissions("proposal.transact.compose")
public Object addSeconded(String proposalId, String[] users) {
ProposalInfo proposalInfo = dao.fetch(ProposalInfo.class, proposalId);
if (proposalInfo.getStateCode().equals(ProposalState.UNSUBMIT) || proposalInfo.getStateCode().equals(ProposalState.DELEGATION_BACK)) {
// int stateCode = proposalProcessService.getStateCode(proposalId, ProposalStateDirectionEnum.NEXT, false);
dao.update(ProposalInfo.class, Chain.make("stateCode", ProposalState.INVIRTE), Cnd.where("id", "=", proposalId));
}
List<ProposalSeconded> secondedList = Arrays.stream(users).map(userId -> {
ProposalSeconded seconded = new ProposalSeconded();
seconded.setProposalId(proposalId);
seconded.setSeconderId(userId);
seconded.setInviteTime(DateUtil.getDate());
return seconded;
}).collect(Collectors.toList());
dao.insert(secondedList);
ProposalToDoHandler.CREATE_SECONDED_TASK.exec(proposalId, NutMap.NEW().addv("secondedList", secondedList));
return null;
}
/**
* 查询可进行附议的代表
*
* @param proposalId
* @param query
* @return
*/
@At
@ViReturn
@RequiresPermissions("proposal.transact.compose")
public Object queryDelegate(String proposalId, String query) {
String userId = ShiroUtil.getPrincipalProperty("id").toString();
Sql sql;
if (ShiroUtil.hasAnyRoles("tamange,sysadmin")) {
sql = Sqls.create("SELECT u.id,u.loginname,u.username,db.dbunitname from jdh_db db LEFT JOIN sys_user u ON db.dbid = u.id WHERE db.dbzt = 2 and (u.username like @query or u.loginname like @query) and db.dbid != @myId and db.dbid not in (SELECT ps.seconderId FROM proposal_seconded ps WHERE ps.proposalId = @proposalId) GROUP BY db.dbid LIMIT 50");
} else {
sql = Sqls.create("SELECT u.id,u.loginname,u.username,db.dbunitname from jdh_db db LEFT JOIN sys_user u ON db.dbid = u.id WHERE db.dbzt = 2 and (u.username like @query or u.loginname like @query) and db.jdhid in (SELECT sur.jdhid FROM sys_user_role sur WHERE sur.userId = @userId) and db.dbid not in (SELECT ps.seconderId FROM proposal_seconded ps WHERE ps.proposalId = @proposalId) GROUP BY db.dbid LIMIT 50");
}
sql.setParam("myId", userId);
sql.setParam("userId", userId);
sql.setParam("seconderId", proposalId);
sql.setParam("proposalId", proposalId);
sql.setParam("query", "%" + query + "%");
return baseService.list(sql);
}
/**
* 查询可进行附议的代表
*
* @param proposalId
* @return
*/
@At
@ViReturn
@RequiresPermissions("proposal.transact.compose")
public Object queryDb(PageForm pageForm, String proposalId, boolean isAudit, String jdhid, String dbtid, String unionid, String unitid) {
String userId = ShiroUtil.getPrincipalProperty("id").toString();
if (!isAudit) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
u.id,
u.loginname,
u.username,
u.sex,
u.mobile,
u.unitname AS dbUnitName,
u.unionname AS dbUnionName,
jdh.jdhallname AS jdhAllName,
dbt.dbtname dbtName
FROM
jdh_db db
LEFT JOIN `user` u ON db.dbid = u.id
LEFT JOIN jdh_jdhxx jdh ON jdh.id=db.jdhid
LEFT JOIN jdh_dbt dbt ON dbt.id=db.dbtid
$condition
""").setParam("proposalId", proposalId);
cnd.and("db.dbzt", "=", 2);
cnd.and("db.roleid", "=", Roles.ZSDB);
cnd.andEX("db.jdhid", "=", jdhid);
cnd.andEX("db.dbtid", "=", dbtid);
cnd.andEX("u.unionid", "=", unionid);
cnd.andEX("u.unitid", "=", unitid);
cnd.and(new Static("db.dbid NOT IN ( SELECT ps.seconderId FROM proposal_seconded ps WHERE ps.proposalId = '%s' )".formatted(proposalId)));
// if (Strings.isNotBlank(pageForm.getSearchName()) && Strings.isNotBlank(pageForm.getSearchKeyword())) {
// cnd.where().andLike(pageForm.getSearchName(), pageForm.getSearchKeyword());
// }
SqlExpressionGroup sqlExpressionGroup = new SqlExpressionGroup();
sqlExpressionGroup.andLike("u.username", pageForm.getSearchKeyword());
sqlExpressionGroup.orLike("u.loginname", pageForm.getSearchKeyword());
cnd.and(sqlExpressionGroup);
if (ShiroUtil.hasAnyRoles("tamange,sysadmin")) {
cnd.and("db.dbid", "!=", userId);
} else {
cnd.and(new Static("db.jdhid IN ( SELECT sur.jdhid FROM sys_user_role sur WHERE sur.userId = '%s' ) ".formatted(userId)));
}
cnd.desc("u.unitcode");
sql.setCondition(cnd);
return baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
} else {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
seconded.*,
u.sex,
u.mobile,
u.loginname,
u.username,
u.unitname AS dbUnitName,
u.unionname AS dbUnionName,
jdh.jdhallname AS jdhAllName,
dbt.dbtname dbtName
FROM
proposal_seconded seconded
LEFT JOIN `user` u ON seconded.seconderId = u.id
LEFT JOIN jdh_db db ON db.dbid = u.id
LEFT JOIN jdh_jdhxx jdh ON jdh.id = db.jdhid
LEFT JOIN jdh_dbt dbt ON dbt.id = db.dbtid
$condition
""");
cnd.and("seconded.proposalId", "=", proposalId);
if (Strings.isNotBlank(pageForm.getSearchName()) && Strings.isNotBlank(pageForm.getSearchKeyword())) {
cnd.where().andLike(pageForm.getSearchName(), pageForm.getSearchKeyword());
}
cnd.groupBy("seconded.seconderId");
cnd.desc("u.unitcode");
sql.setCondition(cnd);
return secondedService.listPageMap(1, 20, sql);
}
}
/**
* 查询该提案下的附议人
*
* @param proposalId
* @return
*/
@At
@ViReturn
@RequiresPermissions("proposal.transact.compose")
public Object getSecondedData(String proposalId) {
Sql sql = Sqls.create("""
SELECT
seconded.*,
su.username,
su.loginname,
su.sex,
su.mobile ,
un.`name` unitName
FROM
proposal_seconded seconded
LEFT JOIN sys_user su ON seconded.seconderId = su.id
LEFT JOIN sys_unit un ON su.unitid = un.id
WHERE
seconded.proposalId = @proposalId
ORDER BY
seconded.inviteTime DESC
""").setParam("proposalId", proposalId);
return secondedService.listMap(sql);
}
/**
* 查询一条提案信息
*
* @param id
* @return
*/
@At
@ViReturn
@RequiresPermissions("proposal.transact.compose")
public Object findOne(String id) {
Dao dao = proposalInfoService.dao();
ProposalInfo proposalInfo = dao.fetch(ProposalInfo.class, id);
NutMap proposalInfoMap = Lang.obj2nutmap(proposalInfo);
String username = dao.fetch(Sys_user.class, proposalInfo.getCreateUser()).getUsername();
proposalInfoMap.put("username", username);
return proposalInfoMap;
}
/**
* 提交提案
*
* @param id
* @param mannerCode
* @return
*/
@At
@ViReturn
@RequiresPermissions("proposal.transact.compose")
public Object doSubmit(String id, String mannerCode) {
return ProposalMannerEnum.valueOf(mannerCode).submit(id);
}
/**
* 获取邀请的附议人数量
*
* @param proposalId
* @return
*/
@At
@GET
@ViReturn
@RequiresPermissions("proposal.transact.compose")
public Object getProposalSecondedNum(String proposalId) {
return dao.count(ProposalSeconded.class, Cnd.where("proposalId", "=", proposalId));
}
/**
* 查询可附议的代表
*
* @param
* @return
*/
@At
@ViReturn
@RequiresPermissions("proposal.transact.compose")
public Object getSecondedList(String proposalId, String jdhid) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
u.id,
u.loginname,
u.username,
u.sex,
u.mobile,
u.unitname AS dbUnitName,
u.unionname AS dbUnionName,
jdh.jdhallname AS jdhAllName,
dbt.dbtname dbtName
FROM
jdh_db db
LEFT JOIN `user` u ON db.dbid = u.id
LEFT JOIN jdh_jdhxx jdh ON jdh.id=db.jdhid
LEFT JOIN jdh_dbt dbt ON dbt.id=db.dbtid
$condition
""").setParam("proposalId", proposalId);
cnd.and("db.dbzt", "=", 2);
cnd.and("db.roleid", "=", Roles.ZSDB);
cnd.andEX("db.jdhid", "=", jdhid);
cnd.and(new Static("db.dbid NOT IN ( SELECT ps.seconderId FROM proposal_seconded ps WHERE ps.proposalId = '%s' )".formatted(proposalId)));
cnd.and("u.id", "!=", ShiroUtil.getPrincipalProperty("id"));
if (ShiroUtil.hasAnyRoles("tamange,sysadmin")) {
cnd.and("db.dbid", "!=", ShiroUtil.getUserId());
} else {
cnd.and(new Static("db.jdhid IN ( SELECT sur.jdhid FROM sys_user_role sur WHERE sur.userId = '%s' ) ".formatted(ShiroUtil.getUserId())));
}
sql.setCondition(cnd);
return secondedService.listMap(sql);
}
}
@@ -0,0 +1,197 @@
package io.v.nutz.zhgh.proposal.controller.transact;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.base.Result;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.DateUtil;
import io.v.nutz.base.utils.Html2Text;
import io.v.nutz.base.utils.MsgApi;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.web.commons.slog.annotation.SLog;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.*;
import io.v.nutz.zhgh.proposal.services.ProposalCommonService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.zhgh.proposal.services.ProposalProcessService;
import io.v.nutz.zhgh.proposal.services.ProposalReplyService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.web.commons.base.Globals;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import org.nutz.trans.Trans;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
/**
* 承办单位答复
*
* @author jug
* @date 2023/07/03
*/
@IocBean
@Ok("json:full")
@At("/platform/proposal/transact/reply")
public class ProposalReplyController {
@Inject
private Dao dao;
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalProcessService proposalProcessService;
@Inject
private ProposalReplyService proposalReplyService;
@Inject
private ProposalCommonService proposalCommonService;
@Inject
private ProposalReplyService replyService;
@At("")
@Ok("beetl:/platform/proposal/transact/reply.html")
@RequiresPermissions("proposal.transact.reply")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.reply")
public Object pageData(PageForm page, ProposalSearch search) {
Cnd cnd = Cnd.NEW();
proposalInfoService.sortAndSearch(cnd, page, search);
if (ShiroUtil.hasAnyRoles("sysadmin, tamange,A06")) {
return proposalReplyService.pageDataBySuperAdmin(page, cnd, search);
} else {
return proposalReplyService.pageDataByUnitAdmin(page, cnd, search);
}
}
/**
* 检验是否可以答复
*
* @param proposalId
* @param underTakeId
* @return
*/
@At
@ViReturn
@RequiresPermissions("proposal.transact.reply")
public Object checkCanReply(String proposalId, String underTakeId) {
Result result = proposalReplyService.checkCanReply(proposalId, underTakeId);
return Result.success().addData(NutMap.NEW().addv("valid", result.getCode()).addv("msg", result.getMsg()));
}
/**
* 承办答复
*
* @param reply
* @return
*/
@At
@ViReturn
@RequiresPermissions("proposal.transact.reply")
@SLog(type = "proposal", tag = "承办单位答复", msg = "承办单位答复")
public Object audit(@Param("reply") ProposalReply reply, String replySign, Boolean isSave) {
proposalReplyService.audit(reply, replySign, isSave);
return null;
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.reply")
public Object findOnReply(String proposalId, String replyUnitId) {
Sql sql = Sqls.create("""
SELECT
pr.*,
su.username,
s.`data` sign
FROM
proposal_reply pr
LEFT JOIN sys_user su ON su.id = pr.replyPersonId
LEFT JOIN sys_signature s ON s.id = pr.replySignId
WHERE
pr.replyType = 2
AND pr.proposalId = @proposalId
AND pr.replyUnitId = @replyUnitId
ORDER BY
pr.replyNumber DESC
""").setParam("proposalId", proposalId).setParam("replyUnitId", replyUnitId);
List<NutMap> replyList = proposalInfoService.listMap(sql);
return replyList.isEmpty() ? new ArrayList<>() : replyList.get(0);
}
/**
* 承办撤回
*
* @param proposalId
* @param
* @return
*/
@At
@ViReturn
@RequiresPermissions("proposal.transact.reply")
public Object doRollBack(String proposalId, String replyUnitId) {
Trans.exec(() -> {
List<String> conjoin = proposalCommonService.findConjoin(proposalId);
dao.update(ProposalReply.class, Chain.make("isReply", false).add("isLeaderAudit", true), Cnd.where("replyUnitId", "=", replyUnitId).and("proposalId", "in", conjoin));
dao.update(ProposalInfo.class, Chain.make("stateCode", ProposalState.UNITREPLY), Cnd.where("id", "in", conjoin));
});
return null;
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.reply")
public Object getConJoinInfoList(String proposalId) {
return proposalCommonService.conJoinInfoList(proposalId);
}
@At("/findSameUnitUser/?")
@ViReturn
@RequiresPermissions("proposal.transact.reply")
public Object findSameUnitUser(String val) {
if (StrUtil.isBlank(val)) {
return Collections.emptyList();
}
return proposalReplyService.findSameUnitUser(val);
}
@At("/doForwardReply")
@ViReturn
@RequiresPermissions("proposal.transact.reply")
public Object doForwardReply(@Param("data") String data) {
List<ProposalReplyForward> replyForwardList = Json.fromJsonAsList(ProposalReplyForward.class, data);
proposalReplyService.forwardReply(replyForwardList);
return null;
}
}
@@ -0,0 +1,361 @@
package io.v.nutz.zhgh.proposal.controller.transact;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.page.Pagination;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.DateUtil;
import io.v.nutz.base.utils.MsgApi;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.web.commons.slog.annotation.SLog;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.constants.ProposalStateDirectionEnum;
import io.v.nutz.zhgh.proposal.constants.ProposalToDoHandler;
import io.v.nutz.zhgh.proposal.mode.ProposalSubmitMode;
import io.v.nutz.zhgh.proposal.models.ProposalConfig;
import io.v.nutz.zhgh.proposal.models.ProposalInfo;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.models.ProposalSeconded;
import io.v.nutz.zhgh.proposal.services.ProposalCommonService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.zhgh.proposal.services.ProposalProcessService;
import io.v.nutz.zhgh.proposal.services.ProposalSecondedService;
import io.v.nutz.sys.models.Sys_signature;
import io.v.nutz.sys.services.SysLocalProcessService;
import io.v.nutz.sys.services.SysSignatureService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.web.commons.base.Globals;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
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 java.util.List;
/**
* 提案附议
*
* @author jug
* @date 2024/01/11
*/
@At("/platform/proposal/transact/seconded")
@Ok("json:full")
@IocBean
public class ProposalSecondedController {
@Inject
private Dao dao;
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalProcessService proposalProcessService;
@Inject
private SysSignatureService sysSignatureService;
@Inject
private ProposalSecondedService proposalSecondedService;
@Inject
private SysLocalProcessService sysLocalProcessService;
@Inject
private ProposalCommonService proposalCommonService;
@At("")
@Ok("beetl:/platform/proposal/transact/seconded.html")
@RequiresPermissions("proposal.transact.seconded")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.seconded")
public Object pageData(PageForm page, ProposalSearch search) {
CndPlus cnd = CndPlus.create();
Sql sql = Sqls.create("""
SELECT
info.*,
ps.id secondedId,
ps.isAgree,
psu.username secondedUserName,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
dbt.`code` delegationCode,
manner.`name` mannerName,
result.`name` resultName
FROM
proposal_seconded ps
LEFT JOIN proposal_info info ON info.id = ps.proposalId
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN sys_user psu ON psu.id = ps.seconderId
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
$condition
""");
if (!ShiroUtil.hasAnyRoles("tamange,sysadmin")) {
cnd.and("ps.seconderId", "=", ShiroUtil.getPrincipalProperty("id"));
}
cnd.and("info.stateCode", ">=", ProposalState.UNSUBMIT);
if (Strings.isNotBlank(search.getIsAudit())) {
cnd.and("ps.isAgree", search.getIsAudit().equals("true") ? "IS NOT" : "IS", null);
}
if (StrUtil.isAllNotBlank(page.getSearchName(), page.getSearchKeyword())) {
cnd.where().andLike(page.getSearchName(), page.getSearchKeyword());
}
if (Strings.isNotBlank(search.getCreateUser())) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.orLike("su.username", search.getCreateUser());
group.orLike("su.loginname", search.getCreateUser());
cnd.and(group);
}
cnd.andEx("info.teacherMeetingId", "=", search.getMeetingId());
cnd.andEx("info.delegationId", "=", search.getDelegationId());
cnd.andEx("su.unionId", "=", search.getUnionId());
cnd.andEx("su.unitId", "=", search.getUnitId());
if (ShiroUtil.hasRole("sysadmin")) {
cnd.groupBy("info.id");
}
cnd.asc("info.proposalCode").asc("info.stateCode").desc("info.createTime");
cnd.asc("ps.isAgree");
sql.setCondition(cnd);
if (!ShiroUtil.hasRole("sysadmin")) {
return proposalInfoService.listPageMap(page.getPageNumber(), page.getPageSize(), sql);
}
Pagination pagination = proposalInfoService.listPageMap(page.getPageNumber(), page.getPageSize(), sql);
List<NutMap> list = pagination.getList();
list.forEach(v -> {
Sql sqlChild = Sqls.create("""
SELECT
info.*,
ps.id secondedId,
ps.isAgree,
psu.username secondedUserName,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName
FROM
proposal_seconded ps
LEFT JOIN proposal_info info ON info.id = ps.proposalId
LEFT JOIN sys_user su ON su.id = info.createUser
LEFT JOIN sys_user psu ON psu.id = ps.seconderId
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
$condition
""");
CndPlus cndChild = CndPlus.create();
cndChild.and("info.id", "=", v.getString("id"));
cndChild.and("ps.id", "!=", v.getString("secondedId"));
cndChild.asc("info.stateCode").desc("info.createTime");
cndChild.asc("ps.isAgree");
sqlChild.setCondition(cndChild);
List<NutMap> childList = proposalInfoService.listMap(sqlChild);
v.setv("children", childList);
v.setv("hasSeconded", Lang.isNotEmpty(childList));
});
pagination.setList(list);
return pagination;
}
/**
* 附议
*
* @param secondedId
* @param proposalId
* @param flag
* @return
*/
@At
@ViReturn
@Aop(TransAop.READ_COMMITTED)
@SLog(type = "proposal", tag = "提案附议", msg = "提案附议")
public Object doAudit(String secondedId, String proposalId, Boolean flag, @Param(value = "seconderSign", required = false) String seconderSign) {
ProposalConfig proposalConfig = dao.fetch(ProposalConfig.class);
//签字
String seconderSignId = sysSignatureService.insert(new Sys_signature(seconderSign)).getId();
dao.update(ProposalSeconded.class, Chain.make("isAgree", flag).add("seconderSignId", seconderSignId).add("secondedTime", DateUtil.getDate()), Cnd.where("id", "=", secondedId));
//完成附议待办
ProposalToDoHandler.COMPLETE_SECONDED_TASK.exec(proposalId, NutMap.NEW().addv("secondedId", secondedId));
ProposalInfo proposalInfo = dao.fetch(ProposalInfo.class, proposalId);
//如果是自动提交
if (proposalConfig.getSubmitMode().equals(ProposalSubmitMode.AUTOMATIC.getCode())) {
List<NutMap> secondedList = proposalInfoService.listMap(Sqls.create("SELECT * FROM proposal_seconded WHERE proposalId = @proposalId").setParam("proposalId", proposalId));
long agreeCount = secondedList.stream().filter(v -> v.getInt("isAgree") == 1).count();
if (agreeCount == proposalConfig.getSeconderNum() || (proposalInfo.getStateCode().equals(ProposalState.INVIRTE) && agreeCount > proposalConfig.getSeconderNum())) {
int stateCode = proposalProcessService.getSomeNodeNextStateCode(ProposalState.INVIRTE, ProposalStateDirectionEnum.NEXT);
dao.update(ProposalInfo.class, Chain.make("stateCode", stateCode), Cnd.where("id", "=", proposalId));
ProposalToDoHandler.CREATE_TEAM_LEADER_TASK.exec(proposalId, null);
}
}
return null;
}
@At
@ViReturn
public Object getSecondedList(String id, String secondedId) {
Sql sql = Sqls.create("""
SELECT
info.*,
ps.id secondedId,
ps.isAgree,
psu.username secondedUserName,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName,
false AS 'hasChildren'
FROM
proposal_seconded ps
LEFT JOIN proposal_info info ON info.id = ps.proposalId
LEFT JOIN sys_user su ON su.id = info.createUser
LEFT JOIN sys_user psu ON psu.id = ps.seconderId
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
$condition
""");
CndPlus cnd = CndPlus.create();
cnd.and("info.id", "=", id);
cnd.and("ps.id", "!=", secondedId);
cnd.asc("info.stateCode").desc("info.createTime");
cnd.asc("ps.isAgree");
sql.setCondition(cnd);
return proposalInfoService.listMap(sql);
}
@At
@ViReturn
public Object readyToRemindRecords(@Param("meetingId") String meetingId) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.proposalCode,
info.proposalName,
su.username,
fyr.username fyrUserName,
fyr.loginname fyrLoginName,
ps.id AS psId,
ps.isAgree
FROM
proposal_seconded ps
LEFT JOIN proposal_info info ON info.id = ps.proposalId
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN sys_user fyr ON fyr.id = ps.seconderId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("info.teacherMeetingId", "=", meetingId);
cnd.and("info.stateCode", "<", ProposalState.DELEGATION);
cnd.and("info.stateCode", ">", ProposalState.UNSUBMIT);
cnd.and("ps.isAgree", "is", null);
cnd.and("info.id", "is not", null);
sql.setCondition(cnd);
return proposalInfoService.listMap(sql);
}
@Inject
private MsgApi msgApi;
@At
@ViReturn
public Object doConfirmRemind(@Param("proposalIds") String[] proposalIds) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.proposalCode,
info.proposalName,
su.username,
fyr.username fyrUserName,
fyr.loginname fyrLoginName
fyr.unitname fyrUnitName,
fyr.weAppOpenid
FROM
proposal_seconded ps
LEFT JOIN proposal_info info ON info.id = ps.proposalId
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN `user` fyr ON fyr.id = ps.seconderId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("info.id", "in", proposalIds);
sql.setCondition(cnd);
List<NutMap> infoList = proposalInfoService.listMap(sql);
for (NutMap map : infoList) {
String proposalName = map.getString("proposalName");
String username = map.getString("username");
String fyrUserName = map.getString("fyrUserName");
String fyrLoginName = map.getString("fyrLoginName");
String fyrUnitName = map.getString("fyrUnitName");
String weAppOpenid = map.getString("weAppOpenid");
String msgContent = String.format("%s代表,您好!%s代表邀请附议提案“%s”,请您登录智慧工会平台进行附议!",
fyrUserName,
username,
proposalName
);
System.out.println(msgContent);
NutMap map2 = new NutMap();
map2.setv("keyword1", NutMap.NEW().setv("value", "提案系统"));
map2.setv("keyword2", NutMap.NEW().setv("value", fyrUserName
+ "(" + fyrLoginName + ")"));
map2.setv("keyword3", NutMap.NEW().setv("value", fyrUnitName));
map2.setv("keyword4", NutMap.NEW().setv("value", msgContent));
map2.setv("keyword5", NutMap.NEW().setv("value", cn.hutool.core.date.DateUtil.now()));
// msgApi.sendMsg(weAppOpenid, msgApi.DSH_TEMPLATE_ID, Globals.AppDomain, map2);
}
return null;
}
}
@@ -0,0 +1,259 @@
package io.v.nutz.zhgh.proposal.controller.transact;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.utils.DateUtil;
import io.v.nutz.base.utils.Html2Text;
import io.v.nutz.base.utils.Roles;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.models.ProposalUnderTakeFirstOpinion;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.sys.models.Sys_user_role;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.web.commons.base.Globals;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.entity.Record;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author: zxy
* @create: 2021-01-28 11:02
* @description: 承办单位阅览提案
**/
@IocBean
@Ok("json:full")
@At("/platform/proposal/transact/underTakeRead")
public class ProposalUnderTakeReadController {
@Inject
private Dao dao;
@Inject
private ProposalInfoService proposalInfoService;
@At("")
@Ok("beetl:/platform/proposal/transact/underTakeRead.html")
@RequiresPermissions("proposal.transact.underTakeRead")
public void index() {
}
private String sql() {
String sql = """
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
dbt.`code` delegationCode,
manner.`name` mannerName,
result.`name` resultName,
pr.id AS prId,
pr.replyUnitId AS underTakeId,
pr.underTakeType,
pu.unitName AS underTakeName,
putfo.canTake,
$hasreply,
lalevel.`name` laLevelName,
(
SELECT
count( 1 ) > 0
FROM
proposal_conjoin
where JSON_CONTAINS (proposalIds,JSON_QUOTE(info.id))
) AS isConjoin
FROM
proposal_info info
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
LEFT JOIN proposal_reply pr on pr.proposalId = info.id
LEFT JOIN proposal_underTake pu on pu.id = pr.replyUnitId
LEFT JOIN proposal_under_take_first_opinion putfo on putfo.proposalId = info.id AND putfo.underTakeId=pu.id
LEFT JOIN sys_dict lalevel ON lalevel.`code` = info.determineTypeCode
$condition
""";
return sql;
}
@At
@ViReturn
public Object pageData(PageForm page, ProposalSearch search) {
CndPlus cnd = CndPlus.create();
Sql sql = Sqls.create(this.sql());
if (!ShiroUtil.hasAnyRoles("tamange,sysadmin")) {
List<Sys_user_role> userRoles = dao.query(Sys_user_role.class, Cnd.where("userId", "=", ShiroUtil.getUserId()).and("roleId", "=", Roles.CONTRACTOR_PERSON));
cnd.and("pr.replyUnitId", "IN", userRoles.stream().map(Sys_user_role::getCbdwid).collect(Collectors.toList()));
}
if (ShiroUtil.hasRole("sysadmin")) {
sql.setVar("hasreply", "(SELECT COUNT(1) FROM proposal_reply WHERE proposalId=info.id AND id !=pr.id )>0 hasUnderTakeRead");
} else {
sql.setVar("hasreply", "null");
}
proposalInfoService.sortAndSearch(cnd, page, search);
cnd.and("pr.replyNumber", "=", 1);
/*if (ShiroUtil.hasRole("sysadmin")) {
cnd.groupBy("info.id");
}*/
cnd.groupBy("info.id");
sql.setCondition(cnd);
return proposalInfoService.listPageMap(page.getPageNumber(), page.getPageSize(), sql);
}
@At
@Ok("void")
public void oneProposalExport(String proposalId, HttpServletResponse response) {
try {
Sql sql = Sqls.create("""
SELECT
info.*,
su.username,
su.mobile,
su.email,
un.`name` unitName,
type.typeName,
pu.unitName implementUnitName
FROM
proposal_info info
LEFT JOIN sys_user su ON su.id = info.createUser
LEFT JOIN sys_unit un ON un.id = su.unitid
LEFT JOIN proposal_undertake pu ON pu.id = info.implementUnitId
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
WHERE
info.id = @proposalId
""").setParam("proposalId", proposalId);
NutMap nutMap = proposalInfoService.fetch(sql);
nutMap.setv("brief", Html2Text.toPlainText(nutMap.getString("brief")));
nutMap.setv("measures", Html2Text.toPlainText(nutMap.getString("measures")));
Sql seconded = Sqls.create("""
SELECT
su.username s_username,
su.mobile s_mobile,
su.position s_zw,
un.`name` s_unitName
FROM
proposal_seconded ps
LEFT JOIN sys_user su ON ps.seconderId = su.id
LEFT JOIN sys_unit un ON un.id = su.unitid
WHERE
ps.proposalId = @proposalId
ORDER BY
ps.secondedTime
""").setParam("proposalId", proposalId);
List<Record> secondedList = proposalInfoService.list(seconded);
HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
Configure config = Configure.newBuilder().bind("secondedList", policy).build();
HashMap<String, Object> map = new HashMap<>();
map.put("proposal", nutMap);
map.put("schoolName", Globals.MyConfig.getString("GxName"));
map.put("secondedList", secondedList);
String fileName = nutMap.getString("proposalName");
response.addHeader("Content-Type", "application/octet-stream");
response.addHeader("Content-Disposition", "attachment; filename=\"" + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1) + "\".docx");
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("docTemplate/proposal/underTakeView.docx");
XWPFTemplate.compile(inputStream, config).render(map, response.getOutputStream());
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@At
@ViReturn
public Object getUnderTakeFirstOpinion(String proposalId, String underTakeId) {
ProposalUnderTakeFirstOpinion opinion = dao.fetch(ProposalUnderTakeFirstOpinion.class, Cnd.where("proposalId", "=", proposalId)
.and("underTakeId", "=", underTakeId));
return opinion;
}
/**
* 承办单位初步意见
*
* @param id
* @param resultCode
* @param opinion
* @return
*/
@At
@ViReturn
public Object doAudit(String id, boolean resultCode, String opinion, String underTakeId) {
ProposalUnderTakeFirstOpinion firstOpinion = dao.fetch(ProposalUnderTakeFirstOpinion.class, Cnd.where("proposalId", "=", id)
.and("underTakeId", "=", underTakeId));
if (Lang.isNotEmpty(firstOpinion)) {
firstOpinion.setOpinion(opinion);
firstOpinion.setCanTake(resultCode);
firstOpinion.setOpionTime(DateUtil.getDateTime());
dao.update(firstOpinion);
} else {
ProposalUnderTakeFirstOpinion takeFirstOpinion = new ProposalUnderTakeFirstOpinion();
takeFirstOpinion.setProposalId(id);
takeFirstOpinion.setUnderTakeId(underTakeId);
takeFirstOpinion.setCanTake(resultCode);
takeFirstOpinion.setOpinion(opinion);
takeFirstOpinion.setOpionTime(DateUtil.getDateTime());
takeFirstOpinion.setUserId(ShiroUtil.getUserId());
dao.insert(takeFirstOpinion);
}
return null;
}
@At
@ViReturn
public Object getUnderTakeReadList(String id, String prId) {
CndPlus cnd = CndPlus.create();
Sql sql = Sqls.create(this.sql());
sql.setVar("hasreply", "null");
cnd.and("info.id", "=", id);
cnd.and("pr.id", "!=", prId);
cnd.and("pr.replyNumber", "=", 1);
cnd.groupBy("pu.id");
cnd.asc("info.createTime").asc("info.stateCode");
sql.setCondition(cnd);
return proposalInfoService.listMap(sql);
}
}
@@ -0,0 +1,134 @@
package io.v.nutz.zhgh.proposal.controller.transact;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.service.BaseService;
import io.v.nutz.base.utils.DateUtil;
import io.v.nutz.base.utils.Roles;
import io.v.nutz.zhgh.proposal.constants.ProposalMannerEnum;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.ProposalInfo;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.sys.models.Sys_signature;
import io.v.nutz.sys.models.Sys_user_role;
import io.v.nutz.web.commons.utils.ShiroUtil;
import org.apache.shiro.authz.annotation.RequiresPermissions;
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 org.nutz.mvc.annotation.POST;
import org.nutz.mvc.annotation.Param;
import java.util.List;
/**
* 撰写提案
*
* @author jug
* @date 2023/06/30
*/
@IocBean
@At("/platform/proposal/transact/writeproposal")
@Ok("json:full")
public class ProposalWriteController {
@Inject
private Dao dao;
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private BaseService baseService;
@At("")
@Ok("beetl:/platform/proposal/transact/write.html")
@RequiresPermissions("proposal.transact.writeproposal")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("proposal.transact.writeproposal")
public Object getJdhJgcy(String jdhid) {
Sql sql = Sqls.create("""
SELECT
COUNT(1)
FROM
jdh_jgcy cy
LEFT JOIN jdh_jgsz sz ON cy.jgid = sz.id
WHERE
sz.parentId = @ZMWYH
AND cy.jdhid = @jdhid
AND cy.userid=@userid
and cy.sf=3
""").setParam("ZMWYH", Roles.ZMWYH).setParam("jdhid", jdhid).setParam("userid", ShiroUtil.getUserId());
return baseService.count(sql);
}
/**
* 委员会机构
* @param teacherMeetId
* @return
*/
@At
@ViReturn
@RequiresPermissions("proposal.transact.writeproposal")
public Object getInstitutions(String teacherMeetId) {
Sql sql = Sqls.create("""
SELECT
sz.name,
sz.mechanismcode,
sz.id
FROM
jdh_jgcy cy
LEFT JOIN jdh_jgsz sz ON cy.jgid = sz.id
WHERE
sz.parentId = '84519c3978404af89147c42f19e9c5d8'
AND cy.jdhid = @teacherMeetId
AND cy.userid= @userId
and cy.sf=3
group by sz.id
""");
sql.setParam("teacherMeetId", teacherMeetId);
sql.setParam("userId", ShiroUtil.getUserId());
List<NutMap> list = proposalInfoService.listMap(sql);
return list;
}
/**
* 非个人提案提交
*
* @param info
* @return
*/
@At
@POST
@ViReturn
@RequiresPermissions("proposal.transact.writeproposal")
public Object doSubmit(@Param("data") ProposalInfo info, @Param(value = "sign", required = false) String sign) {
Sys_signature sysSignature = new Sys_signature();
sysSignature.setData(sign);
dao.insert(sysSignature);
info.setSignId(sysSignature.getId());
NutMap map = proposalInfoService.fetch(Sqls.create("select max(proposalCode) proposalCode from proposal_info where teacherMeetingId='%s' and stateCode<='%s'".formatted(info.getTeacherMeetingId(), ProposalState.CASE)));
int proposalCode = map.getInt("proposalCode");
if (proposalCode == -1) {
proposalCode = Integer.parseInt(DateUtil.getYear() + "01");
} else {
proposalCode = proposalCode + 1;
}
info.setProposalCode(String.valueOf(proposalCode));
info.setOldProposalCode(String.valueOf(proposalCode));
info.setCreateUser((String) ShiroUtil.getPrincipalProperty("id"));
info.setCreateTime(DateUtil.getDate());
proposalInfoService.doAdd(info);
return ProposalMannerEnum.valueOf(info.getMannerCode()).submit(info.getId());
}
}
@@ -0,0 +1,24 @@
package io.v.nutz.zhgh.proposal.mode;
import io.v.nutz.base.annontation.SelectEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author zxy
* @Description 提案提交模式
* @createTime 2022年02月17日 15:10:00
*/
@Getter
@AllArgsConstructor
@SelectEnum
public enum ProposalSubmitMode {
MANUAL("manual", "手动提交"),
AUTOMATIC("automatic", "自动提交");
// AMT("AMT", "手自一体");
private final String code;
private final String description;
}
@@ -0,0 +1,74 @@
package io.v.nutz.zhgh.proposal.models;
import lombok.Data;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
/**
* @author: Aaron
* @create: 2021-01-25 10:31
* @description: 提案审核表
**/
@Data
@Table("proposal_audit")
@Accessors(chain = true)
public class ProposalAudit {
@Column
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
private String id;
@Column
@Comment("审核人ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String userId;
@Column
@Comment("审核人意见")
@ColDefine(type = ColType.VARCHAR, width = 1000)
private String opinion;
@Column
@Comment("审核时间")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String auditTime;
@Column
@Comment("审核人签字ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String signId;
@Column
@Comment("审核人姓名")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String username;
@Column
@Comment("审核人工号")
@ColDefine(type = ColType.VARCHAR, width = 120)
private String loginName;
@Column
@Comment("提案ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String proposalId;
@Column
@Comment("审核结果")
@ColDefine(type = ColType.BOOLEAN)
private Boolean flag;
@Column
@Comment("其他")
@ColDefine(type = ColType.VARCHAR, width = 2000)
private String other;
@Column
@Comment("确定立案类型")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String determineTypeCode;
}
@@ -0,0 +1,48 @@
package io.v.nutz.zhgh.proposal.models;
import lombok.Data;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.io.Serializable;
/**
* @author zxy
* @Description 承办单位分管校领导审批立案表
* @createTime 2022年02月15日 17:33:00
*/
@Data
@Table
public class ProposalBranchLeaderAudit implements Serializable {
@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 underTakeId;
@Column
@Comment("是否主办")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isMaster;
@Column
@Comment("是否审批")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isAudit;
@Column
@Comment("审核记录Id")
@ColDefine(type = ColType.VARCHAR)
private String auditId;
}
@@ -0,0 +1,46 @@
package io.v.nutz.zhgh.proposal.models;
import io.v.nutz.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.io.Serializable;
@EqualsAndHashCode(callSuper = true)
@Data
@Table
public class ProposalBranchLeaderSuffixAudit extends BaseModel implements Serializable {
@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 underTakeId;
@Column
@Comment("是否主办")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isMaster;
@Column
@Comment("是否审批")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isAudit;
@Column
@Comment("审核记录Id")
@ColDefine(type = ColType.VARCHAR)
private String auditId;
}
@@ -0,0 +1,128 @@
package io.v.nutz.zhgh.proposal.models;
import lombok.Data;
import org.nutz.dao.entity.annotation.*;
import java.util.Date;
import java.util.List;
/**
* @author: Aaron
* @create: 2021-01-21 15:44
* @description: 提案配置表
**/
@Data
@Table("proposal_config")
public class ProposalConfig {
@Column
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
private String id;
@Column
@Comment("配置名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String configName;
@Column
@Comment("附议人数量")
@ColDefine(type = ColType.INT, width = 1)
private Integer seconderNum;
@Column
@Comment("是否自动提交")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isAutoSubmit;
@Column
@Comment("提交模式")
@ColDefine(type = ColType.VARCHAR)
private String submitMode;
@Column
@Comment("个人是否能看审核环节控制")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isSeeAudit;
@Column
@Comment("办理提醒设置")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> reminder;
@Column
@Comment("撰写提案方式")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> manner;
@Column
@Comment("提案超时自动提交天数")
@ColDefine(customType = "SMALLINT")
private Integer timeoutDays;
@Column
@Comment("提案内容要求最少字数")
@ColDefine(customType = "SMALLINT")
private Long words;
@Column
@Comment("团长审核方式 unite | TRADITION")
@ColDefine(type = ColType.VARCHAR)
private String headAuditMethod;
@Column
@Comment("二次答复完毕后需要校领导审核吗")
@ColDefine(type = ColType.BOOLEAN)
private boolean secondReplyAfterNeedLeaderAudit;
@Column
@Comment("不予立案的理由列表")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> noFilingReason;
@Column
@Comment("主办配置")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String masterUnitConfigId;
@Column
@Comment("协办配置")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String slaveUnitConfigId;
@Column
@Comment("提醒提案人的消息发送时间")
@ColDefine(type = ColType.TIMESTAMP)
private Date remindProposalCreatorDate;
@One(field = "masterUnitConfigId")
private ProposalReplyConfig masterUnitConfig;
@One(field = "slaveUnitConfigId")
private ProposalReplyConfig slaveUnitConfig;
@Column
@Comment("撰写须知")
@ColDefine(type = ColType.TEXT)
private String writeRemind;
@Column
@Comment("schoolLeaderUnitCode")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String schoolLeaderUnitCode;
/**
* 团长审核方式
*/
enum auditMethods {
TRADITION,
//华交
ECJTU;
}
}
@@ -0,0 +1,25 @@
package io.v.nutz.zhgh.proposal.models;
import lombok.Data;
import org.nutz.dao.entity.annotation.*;
import java.util.List;
/**
* 提案并案表
*/
@Data
@Table
public class ProposalConjoin {
@Id
@ColDefine(type = ColType.INT)
@Comment("id")
private Integer id;
@Column
@ColDefine(type = ColType.MYSQL_JSON)
@Comment("并案的id集合")
private List<String> proposalIds;
}
@@ -0,0 +1,86 @@
package io.v.nutz.zhgh.proposal.models;
import io.v.nutz.sys.models.Sys_file;
import lombok.Data;
import org.nutz.dao.entity.annotation.*;
import java.util.List;
/**
* @author: Aaron
* @create: 2021-01-29 14:28
* @description: 提案反馈评分
**/
@Data
@Table("proposal_feedback")
public class ProposalFeedback {
@Column
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
private String id;
@Column
@Comment("反馈人ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String feedbackPerson;
@Column
@Comment("提案ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String proposalId;
@Column
@Comment("反馈评分(字典表)")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String feedbackCode;
@Column
@Comment("对承办单位反馈评分(字典表)")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String feedbackCodeByUnderTake;
@Column
@Comment("反馈意见")
@ColDefine(type = ColType.TEXT)
private String feedbackOpinion;
@Column
@Comment("反馈时间")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String feedbackTime;
@Column
@Comment("反馈人签字id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String scoreSignId;
@Column
@Comment("反馈次数")
@ColDefine(type = ColType.INT, width = 4)
private Integer feedbackNumber;
@Column
@Comment("不满意的单位")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> unsatisfiedUnit;
@Column
@Comment("附件")
@ColDefine(type = ColType.MYSQL_JSON)
private List<Sys_file> files;
@Column
@Comment("修改人ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String modifierId;
@Column
@Comment("修改时间")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String modifierTime;
}
@@ -0,0 +1,256 @@
package io.v.nutz.zhgh.proposal.models;
import cn.wizzer.framework.base.model.BaseModel;
import io.v.nutz.sys.models.Sys_file;
import lombok.Data;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import org.nutz.lang.util.NutMap;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;
/**
* @author: Aaron
* @create: 2021-01-21 15:04
* @description: 提案信息表
**/
@Data
@Table("proposal_info")
@TableIndexes({
@Index(name = "INDEX_PROPOSAL_CODE", fields = {"proposalCode"}, unique = false),
@Index(name = "INDEX_PROPOSAL_TYPE", fields = {"typeId"}, unique = false),
@Index(name = "INDEX_PROPOSAL_STATE", fields = {"stateCode"}, unique = false),
@Index(name = "INDEX_PROPOSAL_DBT", fields = {"delegationId"}, unique = false),
@Index(name = "INDEX_PROPOSAL_RESULT", fields = {"resultCode"}, unique = false),
@Index(name = "INDEX_PROPOSAL_USER", fields = {"createUser"}, unique = false),
})
public class ProposalInfo extends BaseModel implements Serializable {
private static final long serialVersionUID = 1L;
@Column
@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 proposalCode;
@Column
@Comment("旧提案编号")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String oldProposalCode;
@Column
@Comment("提案名称")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String proposalName;
@Column
@Comment("提案类型")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String typeId;
@Column
@Comment("提案方式(字典表)")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String mannerCode;
@Column
@Comment("立案结果(字典表)")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String resultCode;
@Column
@Comment("确定立案类型")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String determineTypeCode;
@Column
@Comment("教代会ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String teacherMeetingId;
@Column
@Comment("创建人ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String createUser;
@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 = 30)
private String createTime;
@Column
@Comment("案由")
@ColDefine(type = ColType.TEXT)
private String brief;
@Column
@Comment("建议措施")
@ColDefine(type = ColType.TEXT)
private String measures;
@Column
@Comment("建议落实部门ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String implementUnitId;
@Column
@Comment("提案状态")
@ColDefine(type = ColType.INT, width = 4)
private Integer stateCode;
@Column
@Comment("附件")
@ColDefine(type = ColType.MYSQL_JSON)
private List<Sys_file> files;
@Column
@Comment("提案人签字ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String signId;
@Column
@Comment("是否公示提案")
@ColDefine(type = ColType.BOOLEAN)
private Boolean publicity;
@Column
@Comment("是否优秀提案")
@ColDefine(type = ColType.BOOLEAN)
private Boolean excellent;
@Column
@Comment("审核团长的分工会id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String delegationUnionId;
/*---------------审核相关 start ---------------*/
@Column
@Comment("团长审核人(可能有多次记录)")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> delegationAuditId;
@Column
@Comment("预审核")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> preAuditId;
/* @Column
@Comment("提案委员会立案")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String caseAuditId;*/
@Column
@Comment("团长审核人(可能有多次记录)")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> caseAuditId;
@Column
@Comment("二级单位审核意见")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String secondaryUnitOpinion;
@Column
@Comment("二级单位审核意见集合")
@ColDefine(type = ColType.MYSQL_JSON)
@PrevInsert(els = {@EL("$me.emptyList()")}, nullEffective = true)
private List<String> secondaryUnitOpinions;
@Column
@Comment("院级党组织")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String partyOrganizationOpinion;
@Column
@Comment("院级党组织集合")
@ColDefine(type = ColType.MYSQL_JSON)
@PrevInsert(els = {@EL("$me.emptyList()")}, nullEffective = true)
private List<String> partyOrganizationOpinions;
@Column
@Comment("委员会成员意见")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> membersOpinions;
@Column
@Comment("执委会主任意见")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String executorOpinion;
@Column
@Comment("执委会主任意见确认")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String executorOpinionConfirm;
@Column
@Comment("分管校领导意见")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> branchLeaderOpinions;
@Column
@Comment("校长意见")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> secretaryOpinions;
@Column
@Comment("书记意见")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> secretaryOpinionsAgain;
@Column
@Comment("提案委员会确认承办单位")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String caseUnitAuditId;
@Column
@Comment("提案委员会审查")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> caseCheckAuditId;
@Column
@Comment("提案委员会归档")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> caseFiledAuditId;
@Column
@Comment("提案委员会复核结果")
@ColDefine(type = ColType.INT)
private Integer caseCheckResult;
@Column
@Comment("提案委员会审查(需要答复人二次答复吗)")
@ColDefine(type = ColType.BOOLEAN)
private Boolean caseCheckNeedSecondReply;
/**
* true -> 无需二次答复
*/
@Column
@Comment("提案委员会审查结果(需要二次校领导审批吗)")
@ColDefine(type = ColType.BOOLEAN)
private Boolean caseCheckNeedSecondAudit;
/*---------------审核相关 end ---------------*/
public List<NutMap> emptyList() {
return Collections.emptyList();
}
}
@@ -0,0 +1,119 @@
package io.v.nutz.zhgh.proposal.models;
import cn.wizzer.framework.base.model.BaseModel;
import io.v.nutz.sys.models.Sys_file;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import java.util.List;
/**
* @author: Aaron
* @create: 2021-01-28 10:08
* @description:
**/
@EqualsAndHashCode(callSuper = true)
@Data
@Table("proposal_reply")
public class ProposalReply extends BaseModel {
@Column
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
private String id;
@Column
@Comment("提案ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String proposalId;
@Column
@Comment("承办单位类型(1-主办,2-协办)")
@ColDefine(type = ColType.INT, width = 1)
private Integer undertakeType;
@Column
@Comment("答复单位ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String replyUnitId;
@Column
@Comment("答复人id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String replyPersonId;
@Column
@Comment("答复时间")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String replyTime;
@Column
@Comment("答复人签字id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String replySignId;
@Column
@Comment("落实情况")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String implementState;
@Column
@Comment("答复内容")
@ColDefine(type = ColType.TEXT)
private String replyContent;
@Column
@Comment("答复次数")
@ColDefine(type = ColType.INT, width = 4)
private Integer replyNumber;
@Column
@Comment("是否答复")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isReply;
@Column
@Comment("附件")
@ColDefine(type = ColType.MYSQL_JSON)
private List<Sys_file> replyFiles;
@Column
@Comment("分管校领导id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String leaderId;
@Column
@Comment("分管校领导签字id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String leaderSignId;
@Column
@Comment("分管校领导审批时间")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String leaderCheckTime;
@Column
@Comment("分管校领导审批意见")
@ColDefine(type = ColType.TEXT)
private String leaderCheckOpinion;
@Column
@Comment("分管校领导审批次数")
@ColDefine(type = ColType.INT, width = 4)
private Integer leaderCheckNumber;
@Column
@Comment("分管校领导审批结果")
@ColDefine(type = ColType.BOOLEAN)
private Boolean leaderCheckResult;
@Column
@Comment("是否批示")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isLeaderAudit;
}
@@ -0,0 +1,41 @@
package io.v.nutz.zhgh.proposal.models;
import lombok.Data;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
/**
* @author zxy
* @Description TODO
* @createTime 2022年01月21日 15:16:00
*/
@Table
@Data
@Accessors(chain = true)
public class ProposalReplyConfig {
@Column
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("是否首先答复")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isFirstReply;
@Column
@Comment("是否需要答复")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isNeedReply;
@Column
@Comment("是否需要二次答复")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isNeedSecondReply;
}
@@ -0,0 +1,37 @@
package io.v.nutz.zhgh.proposal.models;
import lombok.Data;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
/**
* 答复转交表
*/
@Data
@Accessors(chain = true)
@Table
public class ProposalReplyForward {
@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 replyId;
@Column
@Comment("代理答复人id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String proxyReplyUserId;
}
@@ -0,0 +1,33 @@
package io.v.nutz.zhgh.proposal.models;
import lombok.Data;
/**
* @author: Aaron
* @create: 2021-01-25 14:50
* @description: 提案搜索
**/
@Data
public class ProposalSearch {
private String meetingId;
private String createUser;
private String delegationId;
private String isAudit;
private String unionId;
private String unitId;
private String proposalTypeId;
private String searchKeyWord;
private String proposalResultCode;
private String resultCode;
}
@@ -0,0 +1,52 @@
package io.v.nutz.zhgh.proposal.models;
import lombok.Data;
import org.nutz.dao.entity.annotation.*;
/**
* @author: Aaron
* @create: 2021-01-25 11:03
* @description: 提案附议表
**/
@Data
@Table("proposal_seconded")
public class ProposalSeconded {
@Column
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
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 = 30)
private String secondedTime;
@Column
@Comment("邀请时间")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String 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,87 @@
package io.v.nutz.zhgh.proposal.models;
import lombok.Data;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
/**
* @author: Aaron
* @create: 2021-01-21 15:45
* @description: 提案状态表
**/
@Data
@Table("proposal_state")
@Accessors(chain = true)
public class ProposalState {
@Column
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
private String id;
@Column
@Comment("状态编码")
@ColDefine(type = ColType.INT, width = 4)
private Integer stateCode;
@Column
@Comment("状态名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String stateName;
@Column
@Comment("状态颜色")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String stateColor;
@Column
@Comment("是否需要签字")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isSign;
@Column
@Comment("是否启用")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isEnable;
@Column
@Comment("menuId")
@ColDefine(type = ColType.VARCHAR)
private String menuId;
@Column
@Comment("prevId")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String prevId;
@Column
@Comment("nextId")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String nextId;
/**
* 上一个节点
*/
@One(field = "prevId")
private ProposalState prevState;
/**
* 下一个节点
*/
@One(field = "nextId")
private ProposalState nextState;
/**
* 关联菜单名
*/
private String menuName;
/**
* 对应角色名
*/
private String roleNames;
}
@@ -0,0 +1,37 @@
package io.v.nutz.zhgh.proposal.models;
import lombok.Data;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
/**
* @author: Aaron
* @create: 2021-01-21 15:08
* @description: 提案类型表
**/
@Data
@Table("proposal_type")
public class ProposalType {
@Column
@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 typeCode;
@Column
@Comment("类型名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String typeName;
@Column
@Comment("颜色")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String typeColor;
}
@@ -0,0 +1,46 @@
package io.v.nutz.zhgh.proposal.models;
import lombok.Data;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
@Table
@Data
public class ProposalUnderTakeFirstOpinion {
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("提案id")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String proposalId;
@Column
@Comment("承办单位id")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String underTakeId;
@Column
@Comment("userId")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String userId;
@Column
@Comment("意见")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String opinion;
@Column
@Comment("是否能承办")
@ColDefine(type = ColType.BOOLEAN)
private boolean canTake;
@Column
@Comment("日期")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String opionTime;
}
@@ -0,0 +1,36 @@
package io.v.nutz.zhgh.proposal.models;
import lombok.Data;
import org.nutz.dao.entity.annotation.*;
/**
* @author: Aaron
* @create: 2021-01-23 09:31
* @description: 提案承办单位表
**/
@Data
@Table("proposal_undertake")
public class ProposalUndertake {
@Column
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
private String id;
@Column
@Comment("承办单位编码")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String unitCode;
@Column
@Comment("承办单位名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String unitName;
@Column
@Comment("是否启用")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isEnable;
}
@@ -0,0 +1,57 @@
package io.v.nutz.zhgh.proposal.models;
import lombok.Data;
import org.nutz.dao.entity.annotation.*;
/**
* @author: Aaron
* @create: 2021-02-06 17:16
* @description: 提案催办记录
**/
@Data
@Table("proposal_urge")
public class ProposalUrge {
@Column
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
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 undertakeId;
@Column
@Comment("催办内容")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String urgeContent;
@Column
@Comment("催办人姓名")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String urgeUserName;
@Column
@Comment("催办人工号")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String urgeLoginName;
@Column
@Comment("操作人ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String operateUserId;
@Column
@Comment("操作时间")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String operateTime;
}
@@ -0,0 +1,64 @@
package io.v.nutz.zhgh.proposal.services;
import io.v.nutz.zhgh.proposal.models.ProposalAudit;
import io.v.nutz.base.service.ViService;
/**
* @author: Aaron
* @create: 2021-01-26 21:23
* @description:
**/
public interface ProposalAuditService extends ViService<ProposalAudit> {
// /**
// * 添加制定方案信息和答复信息
// *
// * @param reply 答复信息
// * @param type 答复类型
// */
// void addReply(ProposalReply reply, Integer type);
//
// /**
// * 添加领导审核记录关联表信息
// *
// * @param proposalId 提案id
// * @param replyUnitId 答复单位id
// * @param auditId 审核id
// * @param auditType 审核类型
// */
// void addReplyLeader(String proposalId, String replyUnitId, String auditId, Integer auditType);
//
// /**
// * 添加承办单位
// *
// * @param proposalId 提案id
// * @param undertakeId 承办单位id
// * @param undertakeType 承办单位类型
// */
// void insertUndertake(String proposalId, String undertakeId, Integer undertakeType);
//
// /**
// * 添加任务
// *
// * @param info 提案信息
// */
// void addTask(ProposalInfo info);
//
// /**
// * 删除提案定时任务
// *
// * @param proposalId 提案id
// */
// void clearTask(String proposalId);
/**
* 获取审核记录
* if ids.length==1 return map >1 else return list map
*
* @param ids
* @return
*/
Object getAuditRecordList(String[] ids);
}
@@ -0,0 +1,21 @@
package io.v.nutz.zhgh.proposal.services;
import cn.wizzer.framework.page.Pagination;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.base.service.ViService;
import org.nutz.dao.Cnd;
/**
* 分管校领导批示
*
* @author jug
* @date 2024/01/11
*/
public interface ProposalBranchLeaderPrefixAuditService extends ViService {
Pagination pageData(PageForm pageForm, Cnd cnd, ProposalSearch search);
}
@@ -0,0 +1,156 @@
package io.v.nutz.zhgh.proposal.services;
import cn.wizzer.framework.page.Pagination;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.models.ProposalReply;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.base.service.ViService;
import org.nutz.dao.Cnd;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* @author zxy
* @Description 校领导批示 答复之后的
* @createTime 2022年01月22日 15:37:00
*/
public interface ProposalBranchLeaderSuffixAuditService extends ViService<ProposalReply> {
/**
* temp_undertakeType 查询主办还是协办最高的答复记录
*/
String COMMON_SQL = """
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.`code` delegationCode,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName,
pr.id AS replyId,
pr.replyUnitId,
pr.replyNumber,
pr.leaderCheckNumber,
pr.replyPersonId,
pr.isReply,
pr.leaderId,
pr.isLeaderAudit,
pu.unitName as underTakeName,
(
SELECT
count( 1 ) > 0
FROM
proposal_conjoin
where JSON_CONTAINS (proposalIds,JSON_QUOTE(info.id))
) AS isConjoin,
IF(pr.underTakeType=1,'主办','协办') AS undertakeType,
(SELECT GROUP_CONCAT(DISTINCT ( u.username )) FROM sys_user_role sur LEFT JOIN sys_user u ON u.id = sur.userid WHERE sur.cbdwid = pr.replyUnitId AND sur.roleid = @XLD ) AS underTakeNameUser
FROM
proposal_reply pr
LEFT JOIN proposal_undertake pu on pu.id = pr.replyUnitId
LEFT JOIN proposal_info info on info.id = pr.proposalId
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
$condition
""";
/**
* INNER JOIN ( SELECT proposalId, max( replyNumber ) AS replyNumber FROM proposal_reply WHERE undertakeType in (@temp_undertakeType) $temp_con GROUP BY proposalId ) b ON b.proposalId = pr.proposalId
* AND b.replyNumber = pr.replyNumber
*/
/**
* 折叠记录SQL
*/
String CHILD_COMMON_SQL = """
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.`code` delegationCode,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName,
pr.id AS replyId,
pr.replyUnitId,
pr.replyNumber,
pr.leaderCheckNumber,
pr.replyPersonId,
pr.isReply,
pr.leaderId,
pr.isLeaderAudit,
pu.unitName as underTakeName,
(
SELECT
count( 1 ) > 0
FROM
proposal_conjoin
where JSON_CONTAINS (proposalIds,JSON_QUOTE(info.id))
) AS isConjoin,
IF(pr.underTakeType=1,'主办','协办') AS undertakeType,
(SELECT GROUP_CONCAT(DISTINCT ( u.username )) FROM sys_user_role sur LEFT JOIN sys_user u ON u.id = sur.userid WHERE sur.cbdwid = pr.replyUnitId AND sur.roleid = @XLD ) AS underTakeNameUser
FROM
proposal_reply pr
LEFT JOIN proposal_undertake pu on pu.id = pr.replyUnitId
LEFT JOIN proposal_info info on info.id = pr.proposalId
LEFT JOIN sys_user su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
$condition
""";
/**
* 系统管理员查询记录
*
* @param page
* @param cnd
* @return
*/
Pagination pageData(PageForm page, Cnd cnd, ProposalSearch search);
/**
* 主办分管领导查询记录
*
* @param page
* @param cnd
* @return
*/
Pagination pageDataByUnitAdmin(PageForm page, Cnd cnd);
/**
* 获取协办分管领导记录
*
* @param proposalId
* @return
*/
List<NutMap> getHelpUnitRecords(String proposalId);
/**
* 审核
* @param proposalReply
*/
void audit(ProposalReply proposalReply);
}
@@ -0,0 +1,53 @@
package io.v.nutz.zhgh.proposal.services;
import cn.wizzer.framework.page.Pagination;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.models.ProposalAudit;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.base.service.ViService;
import java.util.List;
/**
* 委员会确认
*/
public interface ProposalCaseConfirmService extends ViService {
/**
* 分页查询
*
* @param pageForm 分页
* @param search 条件
* @return
*/
Pagination pageData(PageForm pageForm, ProposalSearch search);
/**
* 立案
*
* @param proposalIds 提案id集合
* @param resultCode 立案结果
* @param determineTypeCode 重点提案/普通提案
* @param hostUnit 主办单位
* @param helpUnits 协办单位
* @param typeId 提案类型
* @param audit 审核通用对象
*/
void audit(List<String> proposalIds, String resultCode, String determineTypeCode, String hostUnit, List<String> helpUnits, String typeId, ProposalAudit audit);
/**
* 编辑 这里只做删除清空工作 清空了再调用audit方法 (●'◡'●)
*
* @param proposalIds 提案id
*/
void edit(List<String> proposalIds);
/**
* 撤回 并不是每个提案都能撤回的
*
* @param proposalId 提案id
*/
void revoke(String proposalId);
}
@@ -0,0 +1,61 @@
package io.v.nutz.zhgh.proposal.services;
import cn.wizzer.framework.page.Pagination;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.models.ProposalAudit;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.base.service.ViService;
import java.util.List;
import java.util.Map;
/**
* 委员会立案接口
*/
public interface ProposalCaseService extends ViService {
/**
* 分页查询
*
* @param pageForm 分页
* @param search 条件
* @return
*/
Pagination pageData(PageForm pageForm, ProposalSearch search);
/**
* 立案
*
* @param proposalIds 提案id集合
* @param resultCode 立案结果
* @param determineTypeCode 重点提案/普通提案
* @param hostUnit 主办单位
* @param helpUnits 协办单位
* @param typeId 提案类型
* @param audit 审核通用对象
* @param auditType 审核类型,one=>页面点击行内审核按钮,进行单个审核,many=>并案审核
*/
void audit(List<String> proposalIds, String resultCode, String determineTypeCode, String hostUnit, List<String> helpUnits, String typeId, ProposalAudit audit, String auditType,int flag);
/**
* 编辑 这里只做删除清空工作 清空了再调用audit方法 (●'◡'●)
*
* @param proposalIds 提案id
*/
void edit(List<String> proposalIds);
/**
* 撤回 并不是每个提案都能撤回的
*
* @param proposalId 提案id
*/
void revoke(String proposalId);
/**
* 并案回显数据
*
* @param proposalId
*/
Map<String, Object> backShow(String proposalId);
}
@@ -0,0 +1,88 @@
package io.v.nutz.zhgh.proposal.services;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.base.service.ViService;
import org.nutz.dao.Cnd;
import org.nutz.lang.util.NutMap;
import java.util.List;
public interface ProposalCommonService extends ViService {
/**
* 排序 查询
*
* @param cnd
* @param pageForm
* @param search
*/
void sortAndSearch(Cnd cnd, PageForm pageForm, ProposalSearch search);
/**
* 查询单个提案信息
*
* @param proposalId
* @return
*/
NutMap findOne(String proposalId);
/**
* 根据一个提案id找到跟它并案的所有提案
*
* @param proposalId 提案id
* @return
*/
List<String> findConjoin(String proposalId);
// List<String> findUnderTake();
/**
* 根据提案id查询该提案下校领导承办的单位
*
* @param replyUnitId
* @param proposalId
* @return
*/
List<String> getUnderTakeByLeaderAndProId(String replyUnitId, String proposalId);
/**
* 批量删除
*
* @param proposalIds 提案id
*/
void doBatchDelete(List<String> proposalIds);
List<NutMap> conJoinInfoList(String proposalId);
/**
* 查询某个提案的代表团团长
*
* @param proposalId
* @return
*/
List<String> getTeamLeaderByProposalId(String proposalId);
/**
* 查询某个提案所属教代会的提案委员会主任
* @param proposalId
* @return
*/
List<String> getCommitteeLeader(String proposalId);
/**
* 查询承办单位负责人
* @param underTakeId
* @return
*/
List<String> getUnderTakeLeader(String underTakeId);
/**
* 查询承办单位分管校领导
* @param underTakeId
* @return
*/
List<String> getUnderTakeSchoolLeader(String underTakeId);
}
@@ -0,0 +1,27 @@
package io.v.nutz.zhgh.proposal.services;
import io.v.nutz.zhgh.proposal.models.ProposalConfig;
/**
* @author zxy
* @Description 提案配置
* @createTime 2022年02月18日 11:33:00
*/
public interface ProposalConfigService {
void add(ProposalConfig config);
void edit(ProposalConfig config, String[] mannerList);
/**
* 设置提醒定时任务
*/
void setRemindTaskForProposalCreator(ProposalConfig config, String teacherMeetingId);
/**
* 消息提醒
*
* @param teacherMeetingId
*/
void remindProposalCreator(String teacherMeetingId);
}
@@ -0,0 +1,13 @@
package io.v.nutz.zhgh.proposal.services;
import cn.wizzer.framework.page.Pagination;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import org.nutz.lang.util.NutMap;
public interface ProposalDataBoardService {
Pagination pageData(PageForm page, ProposalSearch search, String type);
NutMap numData(String meetingId);
}
@@ -0,0 +1,16 @@
package io.v.nutz.zhgh.proposal.services;
import io.v.nutz.base.service.BaseService;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
public interface ProposalExportService extends BaseService {
void exportFull(String proposalId, HttpServletResponse response) throws IOException;
void exportFull(String proposalId, OutputStream outputStream) throws IOException;
}
@@ -0,0 +1,17 @@
package io.v.nutz.zhgh.proposal.services;
import io.v.nutz.zhgh.proposal.models.ProposalFeedback;
import io.v.nutz.base.service.ViService;
import org.nutz.lang.util.NutMap;
import java.util.List;
public interface ProposalFeedBackService extends ViService<ProposalFeedback> {
/**
* @param proposalId 提案id
* @return
*/
List<NutMap> getFeedbackList(String proposalId);
}
@@ -0,0 +1,25 @@
package io.v.nutz.zhgh.proposal.services;
import cn.wizzer.framework.page.Pagination;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.base.service.ViService;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* 提案办理进度
*/
public interface ProposalHandlingProgressService extends ViService {
Pagination pageData(PageForm pageForm, ProposalSearch search, String[] stateCnd);
/**
* 获取每个提案的承办信息
*
* @param proposalId
* @return
*/
List<NutMap> getReplyInfo(String proposalId);
}
@@ -0,0 +1,122 @@
package io.v.nutz.zhgh.proposal.services;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.models.ProposalInfo;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.models.ProposalState;
import io.v.nutz.base.service.ViService;
import org.nutz.dao.Cnd;
import org.nutz.dao.sql.Sql;
import org.nutz.lang.util.NutMap;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
/**
* @author: Aaron
* @create: 2021-01-25 10:20
* @description:
**/
public interface ProposalInfoService extends ViService<ProposalInfo> {
/**
* 表格数据
*
* @param page 分页参数
* @param search 搜索参数
* @param cnd 拼接条件
* @return
*/
Object pageData(PageForm page, ProposalSearch search, CndPlus cnd);
/**
* 表格数据
*
* @param sql
* @param page
* @param search
* @param cnd
* @return
*/
Object pageData(Sql sql, PageForm page, ProposalSearch search, CndPlus cnd);
/**
* 添加
*
* @param proposalInfo
*/
ProposalInfo doAdd(ProposalInfo proposalInfo);
/**
* 编辑
*
* @param proposalInfo
*/
void doEdit(ProposalInfo proposalInfo);
/**
* 删除
*
* @param id
*/
void doDelete(String id);
/**
* 排序 及 查询
*
* @return
*/
void sortAndSearch(Cnd cnd, PageForm pageForm, ProposalSearch search);
/**
* 执委会建议
*
* @param executorOpinionId
* @return
*/
List<NutMap> executorReadOpinion(String executorOpinionId);
/**
* 分管校领导意见
*
* @param proposalId
* @return
*/
List<NutMap> branchLeaderOpinion(String proposalId);
/**
* 校长、书记意见
*
* @param secretaryOpinionId
* @return
*/
List<NutMap> secretaryOpinion(String secretaryOpinionId);
/**
* 全部状态信息
*
* @return
*/
NutMap getProposalAllStateCode() throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException;
/**
* 开启状态信息
*
* @return
*/
List<ProposalState> getProposalEnableStateCode();
/**
* 开启需要签字状态
*
* @return
*/
List<ProposalState> getProposalNeedSignStateCode();
Object initSql(Sql sql, PageForm page, ProposalSearch search, CndPlus cnd);
void Export(String proposalId, OutputStream outputStream);
}
@@ -0,0 +1,226 @@
package io.v.nutz.zhgh.proposal.services;
import cn.hutool.core.util.StrUtil;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.constants.ProposalStateDirectionEnum;
import io.v.nutz.zhgh.proposal.models.ProposalConfig;
import io.v.nutz.zhgh.proposal.models.ProposalInfo;
import io.v.nutz.zhgh.proposal.models.ProposalState;
import io.v.nutz.sys.models.Sys_user_role;
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.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author zxy
* @Description 提案状态扭转
* @createTime 2022年01月19日 10:22:00
*/
@IocBean
public class ProposalProcessService {
@Inject
private Dao dao;
/**
* 获取当前节点完整信息 可以拿到上下节点信息
*
* @param proposalId 提案id
* @param directionEnum 上下枚举信息
* @param isUpdate 是否更新 你可以选择在这里不更新 只拿到更新节点的状态即可 在你自己的业务代码里更新 减少sql执行次数
* @return 当前节点完整信息
*/
public int getStateCode(String proposalId, ProposalStateDirectionEnum directionEnum, boolean isUpdate) {
int stateCode = dao.fetch(ProposalInfo.class, proposalId).getStateCode();
ProposalState currentState = dao.fetch(ProposalState.class, Cnd.where("stateCode", "=", stateCode));
ProposalState fullState = dao.fetchLinks(currentState, directionEnum.getValue());
if (Lang.isEmpty(fullState)) {
throw new NullPointerException("节点信息为空???????");
}
if (isUpdate) {
// Chain stateCodeChain = null;
// if (directionEnum.getValue().equals(ProposalStateDirectionEnum.NEXT.getValue())) {
// stateCodeChain = Chain.make("stateCode", fullState.getNextState().getStateCode());
// } else if (directionEnum.getValue().equals(ProposalStateDirectionEnum.PREV.getValue())) {
// stateCodeChain = Chain.make("stateCode", fullState.getPrevState().getStateCode());
// }
// if (stateCodeChain != null) {
// dao.update(ProposalInfo.class, stateCodeChain, Cnd.where("proposalId", "=", proposalId));
// }
}
if (ProposalStateDirectionEnum.PREV.getValue().equals(directionEnum.getValue())) {
if (Lang.isEmpty(fullState.getPrevState())) {
return -1;
}
return fullState.getPrevState().getStateCode();
} else {
if (Lang.isEmpty(fullState.getNextState())) {
return -1;
}
return fullState.getNextState().getStateCode();
}
}
/**
* 获取某个节点的全部信息 包括上下节点
*
* @param stateCode 节点状态
* @param directionEnum 上下
* @return
*/
public int getSomeNodeNextStateCode(int stateCode, ProposalStateDirectionEnum directionEnum) {
ProposalState currentStateCode = dao.fetch(ProposalState.class, Cnd.where("stateCode", "=", stateCode));
if (directionEnum.getValue().equals(ProposalStateDirectionEnum.NEXT.getValue())) {
ProposalState state = dao.fetchLinks(currentStateCode, "nextState");
if (Lang.isNotEmpty(state.getNextState())) {
return state.getNextState().getStateCode();
} else {
return -1;
}
// return dao.fetchLinks(currentStateCode, "nextState").getNextState().getStateCode();
}
ProposalState state = dao.fetchLinks(currentStateCode, "prevState");
if (Lang.isNotEmpty(state.getPrevState())) {
return state.getPrevState().getStateCode();
} else {
return -1;
}
// return dao.fetchLinks(currentStateCode, "prevState").getPrevState().getStateCode();
}
/**
* 变为自定义状态
*
* @param proposalId 提案id
* @param stateCode 状态码
*/
public void custom(String proposalId, int stateCode) {
change(proposalId, stateCode);
}
private void change(String proposalId, int changeStateCode) {
Chain stateCodeChain = Chain.make("stateCode", changeStateCode);
dao.update(ProposalInfo.class, stateCodeChain, Cnd.where("proposalId", "=", proposalId));
}
/**
* 当前状态是否是节点
*
* @param stateCode
* @return
*/
public boolean isNode(int stateCode) {
ProposalState currentStateCode = dao.fetch(ProposalState.class, Cnd.where("stateCode", "=", stateCode));
if (currentStateCode == null) {
return false;
}
if (!currentStateCode.getIsEnable()) {
return false;
}
ProposalState fullState = dao.fetchLinks(currentStateCode, null);
return fullState.getPrevState() != null || fullState.getNextState() != null;
}
/**
* 提案编号生成
*
* @param teacherMeetingId
* @param resultCode
* @return
*/
public String getProposalCode(String teacherMeetingId, String resultCode) {
int currentYear = Calendar.getInstance().get(Calendar.YEAR);
// Cnd codeCnd = Cnd.where("teacherMeetingId", "=", teacherMeetingId);
// int count = dao.count(ProposalInfo.class, codeCnd.and("resultCode", "=", resultCode));
// String code = String.format("%03d", count + 1);
String codeEng = "";
switch (resultCode) {
case ProposalConstant.DETERMINE -> codeEng = "A";
case ProposalConstant.OPINION -> codeEng = "B";
case ProposalConstant.NOTGIVE -> codeEng = "C";
}
// Cnd cnd = Cnd.where("teacherMeetingId", "=", teacherMeetingId);
// cnd.and(Cnd.likeEX("proposalCode", codeEng));
//
// String maxProposalCode = (String) dao.func2(ProposalInfo.class, "max", "proposalCode", cnd);
Sql maxSql = Sqls.create("""
SELECT max(proposalCode) as proposalCode,max(oldProposalCode) as oldProposalCode FROM `proposal_info` $condition
""");
Cnd maxCnd = Cnd.NEW();
maxCnd.and(Cnd.exps("proposalCode", "like", "%" + codeEng + "%").or("oldProposalCode", "like", "%" + codeEng + "%"));
maxCnd.and("teacherMeetingId", "=", teacherMeetingId);
maxSql.setCondition(maxCnd);
maxSql.setCallback(Sqls.callback.map());
dao.execute(maxSql);
NutMap maxMap = (NutMap) maxSql.getResult();
String proposalCode = maxMap.getString("proposalCode", "");
String oldProposalCode = maxMap.getString("oldProposalCode", "");
int i = proposalCode.compareTo(oldProposalCode);
String maxProposalCode = "";
if (i > 0) {
maxProposalCode = proposalCode;
} else {
maxProposalCode = oldProposalCode;
}
int codeEngIndex = 0;
String maxCode = "0";
if (StrUtil.isNotBlank(maxProposalCode)) {
codeEngIndex = maxProposalCode.indexOf(codeEng);
maxCode = maxProposalCode.substring(codeEngIndex + 1);
}
maxCode = String.format("%03d", Integer.parseInt(maxCode) + 1);
return currentYear + codeEng + maxCode;
}
/**
* 提案配置
*
* @return
*/
public ProposalConfig getProposalConfig() {
return dao.fetchLinks(dao.fetch(ProposalConfig.class, Cnd.NEW()), null);
}
/**
* 获取承办单位负责人 或者 校领导 所管辖的承办单位id
*
* @param userId
* @return
*/
public List<String> getUnderTakeId(String userId, String roleId) {
List<Sys_user_role> roles = dao.query(Sys_user_role.class, Cnd.where("userId", "=", userId).and("roleId", "=", roleId));
if (Lang.isEmpty(roles)) {
return Collections.emptyList();
}
return roles.stream().filter(v -> StrUtil.isNotBlank(v.getCbdwid())).map(Sys_user_role::getCbdwid).collect(Collectors.toList());
}
}
@@ -0,0 +1,22 @@
package io.v.nutz.zhgh.proposal.services;
/**
* @author zxy
* @Description 提案征集进度
* @createTime 2022年02月18日 09:10:00
*/
public interface ProposalProgressService {
String remindTemplate = """
您的《{}》提案,已经附议完成,但还未提交,请关注!
您的《{}》提案,已经有({})人附议,但还没有达到提交的要求数量,请关注!
""";
/**
* 短信提醒提案人
*
* @param proposalId 提案id
*/
void remindProposalCreator(String proposalId);
}
@@ -0,0 +1,206 @@
package io.v.nutz.zhgh.proposal.services;
import cn.wizzer.framework.base.Result;
import cn.wizzer.framework.page.Pagination;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.models.ProposalReply;
import io.v.nutz.zhgh.proposal.models.ProposalReplyForward;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.base.service.ViService;
import org.nutz.dao.Cnd;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* @author zxy
* @Description TODO
* @createTime 2022年01月22日 10:10:00
*/
public interface ProposalReplyService extends ViService<ProposalReply> {
/**
* temp_undertakeType 查询主办还是协办最高的答复记录
*/
String COMMON_SQL = """
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.`code` delegationCode,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName,
pr.id AS replyId,
pr.replyUnitId,
pr.replyNumber,
pr.replyPersonId,
pr.isReply,
pr.leaderId,
pr.replyContent,
pr.implementState,
pr.replyFiles,
IF(pr.underTakeType=1,'主办','协办') AS undertakeType,
pu.unitName as underTakeName,
(
SELECT
count( 1 ) > 0
FROM
proposal_conjoin
where JSON_CONTAINS (proposalIds,JSON_QUOTE(info.id))
) AS isConjoin,
(count(prf.id) > 0) isForward,
GROUP_CONCAT(proxyReplyUser.username) proxyReplyUserName
FROM
proposal_reply pr
INNER JOIN ( SELECT id,proposalId, max( replyNumber ) AS replyNumber FROM proposal_reply WHERE undertakeType in (@temp_undertakeType) $temp_sql ) b ON b.proposalId = pr.proposalId
AND b.replyNumber = pr.replyNumber
AND b.id = pr.id
LEFT JOIN proposal_undertake pu on pu.id = pr.replyUnitId
LEFT JOIN proposal_info info on info.id = pr.proposalId
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
LEFT JOIN proposal_reply_forward prf ON prf.replyId = pr.id
LEFT JOIN sys_user proxyReplyUser ON proxyReplyUser.id = prf.proxyReplyUserId
$condition
""";
/**
* temp_undertakeType 查询主办还是协办最高的答复记录
*/
String UNIT_COMMON_SQL = """
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.`code` delegationCode,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName,
pr.id AS replyId,
pr.replyUnitId,
pr.replyNumber,
pr.replyPersonId,
pr.isReply,
pr.leaderId,
pr.replyContent,
pr.replyFiles,
IF(pr.underTakeType=1,'主办','协办') AS undertakeType,
pu.unitName as underTakeName,
max(pr.replyNumber),
(
SELECT
count( 1 ) > 0
FROM
proposal_conjoin
where JSON_CONTAINS (proposalIds,JSON_QUOTE(info.id))
) AS isConjoin,
(count(prf.id) > 0) isForward,
GROUP_CONCAT(proxyReplyUser.username) proxyReplyUserName
FROM
proposal_reply pr
LEFT JOIN proposal_undertake pu on pu.id = pr.replyUnitId
LEFT JOIN proposal_info info on info.id = pr.proposalId
LEFT JOIN sys_user su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
LEFT JOIN proposal_reply_forward prf ON prf.replyId = pr.id
LEFT JOIN sys_user proxyReplyUser ON proxyReplyUser.id = prf.proxyReplyUserId
$condition
""";
/**
* 系统管理员查询记录
*
* @param page
* @param cnd
* @return
*/
Pagination pageDataBySuperAdmin(PageForm page, Cnd cnd, ProposalSearch search);
/**
* 承办单位查询记录
*
* @param page
* @param cnd
* @return
*/
Pagination pageDataByUnitAdmin(PageForm page, Cnd cnd, ProposalSearch search);
/**
* 获取协办单位的答复记录
*
* @param proposalId
* @return
*/
List<NutMap> getHelpUnitRecords(String proposalId);
/**
* 检查能否答复
*
* @return
*/
public Result checkCanReply(String proposalId, String underTakeId);
/**
* 检查是否所有应该答复的单位是否答复完
*
* @param proposalId
* @return
*/
public boolean checkAllReply(String proposalId);
/**
* 获取一个提案的答复信息
*
* @param proposalId
* @return
*/
public Object getUndertakeReply(String proposalId);
void audit(ProposalReply reply, String replySign, Boolean isSave);
/**
* 查询同单位的用户
*
* @param val
* @return
*/
List<NutMap> findSameUnitUser(String val);
/**
* @param replyForwardList 转发集合 前端封装好
*/
void forwardReply(List<ProposalReplyForward> replyForwardList);
/**
* 查询代理答复人可答复的记录
* @param userId
* @return
*/
List<String> getReplyIdList(String userId);
}
@@ -0,0 +1,17 @@
package io.v.nutz.zhgh.proposal.services;
/**
* @author zxy
* @Description TODO
* @createTime 2022年02月17日 16:01:00
*/
public interface ProposalSecondedService {
String TZ_TEMPLATE = "[{}]提案待您审核,请您通过门户网站或企业微信登录智慧工会平台进行审核";
/**
* 发送信息给提案人的团长
*/
void sendMsgToHead(String proposalId);
}
@@ -0,0 +1,15 @@
package io.v.nutz.zhgh.proposal.services;
import io.v.nutz.zhgh.proposal.models.ProposalUrge;
import io.v.nutz.base.service.ViService;
/**
* @author: Aaron
* @create: 2021-04-09 10:51
* @description:
**/
public interface ProposalUrgeService extends ViService<ProposalUrge> {
Object doUrge(String proposalId);
}
@@ -0,0 +1,45 @@
package io.v.nutz.zhgh.proposal.services.impl;
import io.v.nutz.zhgh.proposal.models.ProposalAudit;
import io.v.nutz.zhgh.proposal.services.ProposalAuditService;
import io.v.nutz.base.service.impl.ViServiceImpl;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import java.util.Collections;
import java.util.List;
@IocBean(args = {"refer:dao"})
public class ProposalAuditServiceImpl extends ViServiceImpl<ProposalAudit> implements ProposalAuditService {
public ProposalAuditServiceImpl(Dao dao) {
super(dao);
}
@Override
public Object getAuditRecordList(String[] ids) {
Sql sql = Sqls.create("""
SELECT
DISTINCT(pa.id),
pa.*,
sign.`data` auditSign,
dict.`name` dictName
FROM
proposal_audit pa
LEFT JOIN sys_signature sign ON sign.id = pa.signId
LEFT JOIN sys_dict dict ON pa.other = dict.`code`
WHERE pa.id in (@ids)
""");
sql.setParam("ids", ids);
List<NutMap> list = listMap(sql);
if (Lang.isNotEmpty(list)) {
return ids.length == 1 ? list.get(0) : list;
} else {
return ids.length == 1 ? Collections.emptyMap() : Collections.emptyList();
}
}
}
@@ -0,0 +1,169 @@
package io.v.nutz.zhgh.proposal.services.impl;
import cn.wizzer.framework.page.Pagination;
import io.v.nutz.base.utils.Roles;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.base.service.impl.ViServiceImpl;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalBranchLeaderPrefixAuditService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.zhgh.proposal.services.ProposalProcessService;
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 java.util.List;
/**
* @author zhf
* @date 2022/3/15 14:39
* @description
*/
@IocBean(args = {"refer:dao"})
public class ProposalBranchLeaderPrefixAuditServiceImpl extends ViServiceImpl implements ProposalBranchLeaderPrefixAuditService {
public ProposalBranchLeaderPrefixAuditServiceImpl(Dao dao) {
super(dao);
}
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalProcessService proposalProcessService;
String COMMON_SQL = """
SELECT
pbla.id pblaId,
pbla.underTakeId,
pbla.isAudit,
pbla.isMaster,
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.`code` delegationCode,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName,
(
SELECT
count( 1 ) > 0
FROM
proposal_conjoin
where JSON_CONTAINS (proposalIds,JSON_QUOTE(info.id))
) AS isConjoin,
IF(pr.underTakeType=1,'主办','协办') AS undertakeType,
(SELECT pu.unitName FROM proposal_reply pr LEFT JOIN proposal_undertake pu ON pu.id = pr.replyUnitId WHERE pr.proposalId=info.id AND pbla.underTakeId=pr.replyUnitId GROUP BY pr.proposalId) AS underTakeNames,
(SELECT GROUP_CONCAT(DISTINCT ( u.username )) FROM sys_user_role sur LEFT JOIN sys_user u ON u.id = sur.userid WHERE sur.cbdwid = pbla.underTakeId AND sur.roleid = @XLD ) AS underTakeNameUser
FROM
`proposal_branch_leader_audit` pbla
LEFT JOIN proposal_info info ON info.id = pbla.proposalId
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
LEFT JOIN proposal_reply pr ON pr.replyUnitId=pbla.underTakeId AND pbla.proposalId=pr.proposalId
$condition
""";
@Override
public Pagination pageData(PageForm pageForm, Cnd cnd, ProposalSearch search) {
Sql sql = Sqls.create(COMMON_SQL).setParam("XLD", Roles.XLD);
cnd.and("pbla.isMaster", "=", 1);
cnd.desc("pbla.isMaster");
cnd.groupBy("pbla.proposalId");
switch (search.getIsAudit()) {
case "" -> cnd.and("info.stateCode", ">=", ProposalState.LEADER_PREFIX_AUDIT);
case "true" ->
cnd.and("info.stateCode", ">", ProposalState.LEADER_PREFIX_AUDIT).and("pbla.isAudit", "=", 1);
case "false" ->
cnd.and("info.stateCode", "=", ProposalState.LEADER_PREFIX_AUDIT).and("pbla.isAudit", "=", 0);
}
sql.setCondition(cnd);
Pagination pagination = proposalInfoService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return pagination;
// Sql sqlUnit = Sqls.create("SELECT cbdwid FROM sys_user_role WHERE userid = @userid AND roleid = @roleid AND cbdwid is NOT NULL");
// sqlUnit.setParam("userid", ShiroUtil.getPrincipalProperty("id"));
// sqlUnit.setParam("roleid", Roles.IN_CHARGE_LEADER);
// sqlUnit.setCallback(Sqls.callback.strList());
// dao().execute(sqlUnit);
// List<String> unitList = sqlUnit.getList(String.class);
// if (!ShiroUtil.hasRole("sysadmin")) {
// cnd.and("pbla.underTakeId", "in", unitList);
// if (isNode) {
//// cnd.and("pbla.isMaster", "=", 1);
// }
// }
// int prevStateCode = proposalProcessService.getSomeNodeNextStateCode(ProposalState.BRANCHLEADERREAD, ProposalStateDirectionEnum.PREV);
//
//
// if (isNode) {
// switch (search.getIsAudit()) {
// case "" -> cnd.and("info.stateCode", ">", prevStateCode);
// case "true" -> cnd.and("pbla.isAudit", "=", 1).and("info.stateCode", ">", prevStateCode);
// case "false" -> cnd.and("pbla.isAudit", "=", 0).and("info.stateCode", "=", ProposalState.BRANCHLEADERREAD);
// }
// } else {
// switch (search.getIsAudit()) {
// case "" -> cnd.and("info.stateCode", ">", prevStateCode);
// case "true" -> cnd.and("pbla.isAudit", "=", 1).and("info.stateCode", ">", ProposalState.CASE);
// case "false" -> cnd.and("pbla.isAudit", "=", 0).and("info.stateCode", ">", ProposalState.CASE);
// }
// }
// List<NutMap> list = pagination.getList();
// list.forEach(v -> {
// Cnd childCnd = Cnd.NEW();
// Sql sqlChild = Sqls.create(COMMON_SQL).setParam("XLD", Roles.XLD);
// childCnd.and("pbla.underTakeId", "!=", v.getString("underTakeId"));
// childCnd.and("pbla.proposalId", "=", v.getString("id"));
// if ((ShiroUtil.hasRole("sysadmin") && unitList.size() > 1)) {
// childCnd.and("pbla.underTakeId", "in", unitList);
// }
// if (!ShiroUtil.hasRole("sysadmin")) {
// childCnd.and("pbla.underTakeId", "in", unitList);
// }
// childCnd.desc("pbla.isMaster");
// childCnd.groupBy("pbla.underTakeId");
// if (isNode) {
// switch (search.getIsAudit()) {
// case "" -> childCnd.and("info.stateCode", ">", prevStateCode);
// case "true" -> childCnd.and("pbla.isAudit", "=", 1).and("info.stateCode", ">", prevStateCode);
// case "false" -> childCnd.and("pbla.isAudit", "=", 0).and("info.stateCode", "=", ProposalState.BRANCHLEADERREAD);
// }
// } else {
// switch (search.getIsAudit()) {
// case "" -> childCnd.and("info.stateCode", ">", prevStateCode);
// case "true" -> childCnd.and("pbla.isAudit", "=", 1).and("info.stateCode", ">", ProposalState.CASE);
// case "false" -> childCnd.and("pbla.isAudit", "=", 0).and("info.stateCode", ">", ProposalState.CASE);
// }
// }
// sqlChild.setCondition(childCnd);
// List<NutMap> childList = proposalInfoService.listMap(sqlChild);
// v.put("children", childList);
// });
}
}
@@ -0,0 +1,158 @@
package io.v.nutz.zhgh.proposal.services.impl;
import cn.wizzer.framework.page.Pagination;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.base.service.impl.ViServiceImpl;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.ProposalReply;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalBranchLeaderSuffixAuditService;
import io.v.nutz.zhgh.proposal.services.ProposalCommonService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.zhgh.proposal.services.ProposalProcessService;
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 java.util.List;
/**
* @author zxy
* @Description TODO
* @createTime 2022年01月22日 15:39:00
*/
@IocBean(args = {"refer:dao"})
public class ProposalBranchLeaderSuffixAuditServiceImpl extends ViServiceImpl<ProposalReply> implements ProposalBranchLeaderSuffixAuditService {
public ProposalBranchLeaderSuffixAuditServiceImpl(Dao dao) {
super(dao);
}
@Inject
private ProposalProcessService proposalProcessService;
@Inject
private ProposalCommonService proposalCommonService;
@Inject
private ProposalInfoService proposalInfoService;
@Override
public Pagination pageData(PageForm pageForm, Cnd cnd, ProposalSearch search) {
Sql sql = Sqls.create("""
SELECT
pbla.id pblsaId,
pbla.underTakeId,
pbla.isAudit,
pbla.isMaster,
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.`code` delegationCode,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName,
(
SELECT
count( 1 ) > 0
FROM
proposal_conjoin
where JSON_CONTAINS (proposalIds,JSON_QUOTE(info.id))
) AS isConjoin,
IF(pr.underTakeType=1,'主办','协办') AS undertakeType,
(SELECT pu.unitName FROM proposal_reply pr LEFT JOIN proposal_undertake pu ON pu.id = pr.replyUnitId WHERE pr.proposalId=info.id AND pbla.underTakeId=pr.replyUnitId GROUP BY pr.proposalId) AS underTakeNames,
(SELECT GROUP_CONCAT(DISTINCT ( u.username )) FROM sys_user_role sur LEFT JOIN sys_user u ON u.id = sur.userid WHERE sur.cbdwid = pbla.underTakeId AND sur.roleid = @XLD ) AS underTakeNameUser
FROM
proposal_branch_leader_suffix_audit pbla
LEFT JOIN proposal_info info ON info.id = pbla.proposalId
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode\s
LEFT JOIN proposal_reply pr ON pr.replyUnitId=pbla.underTakeId AND pbla.proposalId=pr.proposalId
$condition
""");
cnd.and("pr.undertakeType", "=", 1);
cnd.desc("pbla.isMaster");
cnd.groupBy("pbla.proposalId");
switch (search.getIsAudit()) {
case "" -> cnd.and("info.stateCode", ">=", ProposalState.LEADER_SUFFIX_AUDIT);
case "true" ->
cnd.and("info.stateCode", ">", ProposalState.LEADER_SUFFIX_AUDIT).and("pbla.isAudit", "=", 1);
case "false" ->
cnd.and("info.stateCode", "=", ProposalState.LEADER_SUFFIX_AUDIT).and("pbla.isAudit", "=", 0);
}
sql.setCondition(cnd);
Pagination pagination = proposalInfoService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return pagination;
}
@Override
public Pagination pageDataByUnitAdmin(PageForm page, Cnd cnd) {
return null;
}
@Override
public List<NutMap> getHelpUnitRecords(String proposalId) {
return null;
}
@Override
public void audit(ProposalReply reply) {
// String proposalId = reply.getProposalId();
//
// String replyUnitId = reply.getReplyUnitId();
//
// String auditTime = DateUtil.getDateTime();
// String auditUserId = (String) ShiroUtil.getPrincipalProperty("id");
// String leaderCheckOpinion = reply.getLeaderCheckOpinion();
// Integer leaderCheckNumber = reply.getLeaderCheckNumber();
//
// //并案的提案id
// List<String> conjoinIdList = proposalCommonService.findConjoin(proposalId);
// List<String> underTakeList = proposalCommonService.getUnderTakeByLeaderAndProId(replyUnitId, proposalId);
//
// //同单位答复记录
// List<ProposalReply> sameUnitReplyRecord = dao().query(ProposalReply.class, Cnd.where("proposalId", "in", conjoinIdList).and("replyUnitId", "in", underTakeList)
// .and("replyNumber","=",leaderCheckNumber));
// sameUnitReplyRecord.forEach(v -> {
// v.setLeaderId(auditUserId);
// v.setLeaderCheckTime(auditTime);
// v.setIsLeaderAudit(true);
// v.setLeaderCheckOpinion(leaderCheckOpinion);
// });
// dao().update(sameUnitReplyRecord);
//
// boolean isNode = proposalProcessService.isNode(ProposalState.LEADERAUDIT);
// int count = dao().count(ProposalReply.class, Cnd.where("proposalId", "in", conjoinIdList).and("isLeaderAudit", "=", 0));
//
// if (isNode && count == 0) {
// conjoinIdList.forEach(v -> {
// Integer stateCode = null;
// if (reply.getLeaderCheckNumber() == 1) {
// stateCode = proposalProcessService.getSomeNodeNextStateCode(ProposalState.LEADERAUDIT, ProposalStateDirectionEnum.NEXT);
// } else if (reply.getLeaderCheckNumber() > 1) {
// stateCode = proposalProcessService.getSomeNodeNextStateCode(ProposalState.LEADERAUDIT, ProposalStateDirectionEnum.NEXT);
// }
//
// ProposalInfo proposalInfo = dao().fetch(ProposalInfo.class, v);
// proposalInfo.setStateCode(stateCode);
// dao().updateIgnoreNull(proposalInfo);
// });
//
// }
}
}
@@ -0,0 +1,253 @@
package io.v.nutz.zhgh.proposal.services.impl;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.page.Pagination;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.sys.services.SysLocalProcessService;
import io.v.nutz.web.commons.base.Globals;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.constants.ProposalStateDirectionEnum;
import io.v.nutz.zhgh.proposal.constants.ProposalToDoHandler;
import io.v.nutz.zhgh.proposal.models.*;
import io.v.nutz.zhgh.proposal.services.*;
import io.v.nutz.base.service.impl.ViServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.*;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.sql.SqlType;
import org.nutz.dao.util.Daos;
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.random.R;
import org.nutz.lang.util.NutMap;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@IocBean(args = {"refer:dao"})
@Slf4j
public class ProposalCaseConfirmServiceImpl extends ViServiceImpl implements ProposalCaseConfirmService {
@Inject
private ProposalInfoService proposalInfoService;
@Inject
private ProposalProcessService proposalProcessService;
@Inject
private ProposalCommonService proposalCommonService;
@Inject
private SysLocalProcessService sysLocalProcessService;
public ProposalCaseConfirmServiceImpl(Dao dao) {
super(dao);
}
@Override
public Pagination pageData(PageForm pageForm, ProposalSearch search) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.`code` delegationCode,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName,
lalevel.`name` laLevelName,
(
SELECT
count( 1 ) > 0
FROM
proposal_conjoin
where JSON_CONTAINS (proposalIds,JSON_QUOTE(info.id))
) AS isConjoin,
(select count(1) from proposal_under_take_first_opinion where proposalId = info.id and canTake = 0) AS canNotNum
FROM
proposal_info info
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
LEFT JOIN sys_dict lalevel ON lalevel.`code` = info.determineTypeCode
$condition
""");
cnd.and("info.stateCode", ">=", ProposalState.CASEUNIT);
cnd.and("info.resultCode", "!=", ProposalConstant.NOTGIVE);
if (Strings.isNotBlank(search.getIsAudit())) {
cnd.and("info.stateCode", "true".equals(search.getIsAudit()) ? ">" : "=", ProposalState.CASEUNIT);
} else {
cnd.and("info.stateCode", ">=", ProposalState.CASEUNIT);
}
cnd.asc("info.proposalCode");
proposalInfoService.sortAndSearch(cnd, pageForm, search);
cnd.groupBy("info.id");
sql.setCondition(cnd);
return proposalInfoService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
}
@Override
public void audit(List<String> proposalIds, String resultCode, String determineTypeCode, String hostUnit, List<String> helpUnits, String typeId, ProposalAudit audit) {
//提案委员会审核记录
NutMap auditOther = NutMap.NEW().addv("hostUnit", hostUnit).addv("helpUnit", helpUnits).addv("conJoin", proposalIds);
audit.setOther(Json.toJson(auditOther));
dao().insert(audit);
//确定承办单位后的下个节点
int caseConfirmAfterStateCode = proposalProcessService.getSomeNodeNextStateCode(ProposalState.CASEUNIT, ProposalStateDirectionEnum.NEXT);
//确定立案 && 作为建议
ArrayList<String> dolist = Lang.list(ProposalConstant.DETERMINE, ProposalConstant.OPINION);
//教代会id
String someProposalId = proposalIds.get(0);
ProposalInfo someProposal = Daos.ext(dao(), FieldFilter.create(ProposalInfo.class, "^teacherMeetingId$")).fetch(ProposalInfo.class, someProposalId);
String teacherMeetingId;
if (Lang.isNotEmpty(someProposal) && StrUtil.isNotBlank(someProposal.getTeacherMeetingId())) {
teacherMeetingId = someProposal.getTeacherMeetingId();
} else {
log.error("提案列表{},提案{}错误", proposalIds, someProposalId);
throw new RuntimeException("参数错误");
}
//删除掉立案时候分配的承办单位
dao().clear(ProposalReply.class, Cnd.where("proposalId", "in", proposalIds));
for (String id : proposalIds) {
Chain updateChain = Chain.make("typeId", typeId);
updateChain.add("resultCode", resultCode);
updateChain.add("caseUnitAuditId", audit.getId());
if (resultCode.equals(ProposalConstant.DETERMINE)) {
updateChain.add("stateCode", caseConfirmAfterStateCode);
} else {
updateChain.add("stateCode", ProposalState.UNITREPLY);
}
String proposalCode = proposalProcessService.getProposalCode(teacherMeetingId, resultCode);
ProposalInfo proposalInfo = dao().fetch(ProposalInfo.class, id);
if (!proposalInfo.getResultCode().equals(resultCode)) {
updateChain.add("proposalCode", proposalCode);
}
dao().update(ProposalInfo.class, updateChain, Cnd.where("id", "=", id));
if (dolist.contains(resultCode)) {
//分管领导审批表
ProposalBranchLeaderAudit hostBranchAudit = new ProposalBranchLeaderAudit();
hostBranchAudit.setProposalId(id);
hostBranchAudit.setIsAudit(false);
hostBranchAudit.setUnderTakeId(hostUnit);
hostBranchAudit.setIsMaster(true);
dao().insert(hostBranchAudit);
helpUnits.forEach(v -> {
ProposalBranchLeaderAudit helpBranchAudit = new ProposalBranchLeaderAudit();
helpBranchAudit.setProposalId(id);
helpBranchAudit.setIsAudit(false);
helpBranchAudit.setUnderTakeId(v);
helpBranchAudit.setIsMaster(false);
dao().insert(helpBranchAudit);
});
ProposalReply hostReply = new ProposalReply();
hostReply.setId(R.UU32());
hostReply.setProposalId(id);
hostReply.setReplyUnitId(hostUnit);
hostReply.setUndertakeType(1);
hostReply.setReplyNumber(1);
hostReply.setLeaderCheckNumber(1);
hostReply.setIsReply(false);
hostReply.setIsLeaderAudit(false);
dao().insert(ProposalReply.class, Chain.from(hostReply));
if (Lang.isNotEmpty(helpUnits)) {
helpUnits.forEach(h -> {
ProposalReply helpReply = new ProposalReply();
helpReply.setId(R.UU32());
helpReply.setProposalId(id);
helpReply.setReplyUnitId(h);
helpReply.setUndertakeType(2);
helpReply.setReplyNumber(1);
helpReply.setLeaderCheckNumber(1);
helpReply.setIsReply(false);
helpReply.setIsLeaderAudit(false);
dao().insert(ProposalReply.class, Chain.from(helpReply));
});
}
//完成审核待办
ProposalToDoHandler.COMPLETE_CASE_UNIT_TASK.exec(id, null);
if (resultCode.equals(ProposalConstant.DETERMINE)) {
//推送分管校领导审批待办
ProposalToDoHandler.CREATE_BRANCH_LEADER_PREFIX_AUDIT_TASK.exec(id, NutMap.NEW().addv("hostBranchAudit", hostBranchAudit));
} else if (resultCode.equals(ProposalConstant.OPINION)) {
//推送承办单位答复待办
ProposalToDoHandler.CREATE_UNDERTAKE_TASK.exec(id, null);
}
}
}
// //删除立案时候的并案关系 重新并案
// for (String id : proposalIds) {
// Sql deleteConjoinSql = Sqls.create("delete from proposal_conjoin where JSON_CONTAINS(proposalIds, JSON_QUOTE(@someProposalId))");
// deleteConjoinSql.setParam("someProposalId", id);
// dao().execute(deleteConjoinSql);
// }
//
// //立案并且多条才会执行
// if (resultCode.equals(ProposalConstant.DETERMINE) && proposalIds.size() > 1) {
// //并案关联表
// ProposalConjoin proposalConjoin = new ProposalConjoin();
// proposalConjoin.setProposalIds(proposalIds);
// dao().insert(proposalConjoin);
// }
}
@Override
public void edit(List<String> proposalIds) {
}
@Override
public void revoke(String proposalId) {
List<String> proposalIdList = proposalCommonService.findConjoin(proposalId);
for (String id : proposalIdList) {
ProposalInfo info = dao().fetch(ProposalInfo.class, id);
// info.setResultCode(null);
info.setCaseUnitAuditId(null);
info.setStateCode(ProposalState.CASEUNIT);
// info.setDetermineTypeCode(null);
// info.setExecutorOpinion(null);
dao().update(info, "^caseUnitAuditId|stateCode$");
Sql deleteConjoinSql = Sqls.create("""
DELETE FROM proposal_conjoin
WHERE JSON_CONTAINS(proposalIds,JSON_QUOTE(@id))
""");
deleteConjoinSql.setParam("id", id);
SqlType sqlType = deleteConjoinSql.getSqlType();
log.info("revoke方法{}", sqlType);
dao().execute(deleteConjoinSql);
}
}
}
@@ -0,0 +1,325 @@
package io.v.nutz.zhgh.proposal.services.impl;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.page.Pagination;
import com.alibaba.fastjson.JSONArray;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.sys.services.SysLocalProcessService;
import io.v.nutz.web.commons.base.Globals;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.constants.ProposalStateDirectionEnum;
import io.v.nutz.zhgh.proposal.constants.ProposalToDoHandler;
import io.v.nutz.zhgh.proposal.models.*;
import io.v.nutz.zhgh.proposal.services.ProposalAuditService;
import io.v.nutz.zhgh.proposal.services.ProposalCaseService;
import io.v.nutz.zhgh.proposal.services.ProposalCommonService;
import io.v.nutz.zhgh.proposal.services.ProposalProcessService;
import io.v.nutz.base.service.impl.ViServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.*;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.sql.SqlType;
import org.nutz.dao.util.Daos;
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.random.R;
import org.nutz.lang.util.NutMap;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* 委员会立案
*/
@IocBean(args = {"refer:dao"})
@Slf4j
public class ProposalCaseServiceImpl extends ViServiceImpl implements ProposalCaseService {
public ProposalCaseServiceImpl(Dao dao) {
super(dao);
}
@Inject
private ProposalCommonService proposalCommonService;
@Inject
private ProposalProcessService proposalProcessService;
@Inject
private ProposalAuditService proposalAuditService;
@Inject
private SysLocalProcessService sysLocalProcessService;
@Override
public Pagination pageData(PageForm pageForm, ProposalSearch search) {
Sql sql = Sqls.create("""
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
dbt.`code` delegationCode,
manner.`name` mannerName,
result.`name` resultName,
lalevel.`name` laLevelName,
(
SELECT
count( 1 ) > 0
FROM
proposal_conjoin
where JSON_CONTAINS (proposalIds,JSON_QUOTE(info.id))
) AS isConjoin,
(SELECT count(1) > 0 FROM proposal_branch_leader_audit WHERE proposalId = info.id AND isAudit = 1) branchLeaderIsAudit
FROM
proposal_info info
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
LEFT JOIN sys_dict lalevel ON lalevel.`code` = info.determineTypeCode
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("info.stateCode", ">=", ProposalState.CASE);
if (Strings.isNotBlank(search.getIsAudit())) {
cnd.and("info.stateCode", "true".equals(search.getIsAudit()) ? ">" : "=", ProposalState.CASE);
} else {
cnd.and("info.stateCode", ">=", ProposalState.CASE);
}
cnd.groupBy("info.id");
cnd.asc("info.proposalCode");
proposalCommonService.sortAndSearch(cnd, pageForm, search);
sql.setCondition(cnd);
Pagination pagination = listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
List<NutMap> list = pagination.getList(NutMap.class);
int someNodeNextStateCode = proposalProcessService.getSomeNodeNextStateCode(ProposalState.CASE, ProposalStateDirectionEnum.NEXT);
return pagination;
}
@Override
@Aop(TransAop.READ_COMMITTED)
public void audit(List<String> proposalIds, String resultCode, String determineTypeCode, String hostUnit, List<String> helpUnits, String typeId, ProposalAudit audit, String auditType, int flag) {
//提案委员会审核记录
NutMap auditOther = NutMap.NEW()
.addv("hostUnit", hostUnit)
.addv("helpUnit", helpUnits)
.addv("conJoin", proposalIds);
audit.setOther(Json.toJson(auditOther));
dao().insert(audit);
//立案后的下个节点
int caseAfterStateCode = proposalProcessService.getSomeNodeNextStateCode(ProposalState.CASE, ProposalStateDirectionEnum.NEXT);
int casePrevStateCode = proposalProcessService.getSomeNodeNextStateCode(ProposalState.CASE, ProposalStateDirectionEnum.PREV);
//确定立案 && 作为建议
ArrayList<String> dolist = Lang.list(ProposalConstant.DETERMINE, ProposalConstant.OPINION);
//教代会id
String someProposalId = proposalIds.get(0);
ProposalInfo someProposal = Daos.ext(dao(), FieldFilter.create(ProposalInfo.class, "^teacherMeetingId$")).fetch(ProposalInfo.class, someProposalId);
String teacherMeetingId;
if (Lang.isNotEmpty(someProposal) && StrUtil.isNotBlank(someProposal.getTeacherMeetingId())) {
teacherMeetingId = someProposal.getTeacherMeetingId();
} else {
log.error("提案列表{},提案{}错误", proposalIds, someProposalId);
throw new RuntimeException("参数错误");
}
for (String id : proposalIds) {
ProposalInfo proposalInfo = dao().fetch(ProposalInfo.class, id);
List<String> caseAuditId = proposalInfo.getCaseAuditId() == null ? new ArrayList<>() : proposalInfo.getCaseAuditId();
caseAuditId.add(audit.getId());
Chain updateChain = Chain.make("resultCode", resultCode);
if (StrUtil.isNotBlank(typeId)) {
updateChain.add("typeId", typeId);
}
updateChain.add("resultCode", resultCode);
updateChain.add("caseAuditId", caseAuditId);
updateChain.add("stateCode", flag == 1 ? caseAfterStateCode : casePrevStateCode);
if (flag == 1) {
String oldProposalCode = proposalInfo.getOldProposalCode();
String proposalCode = proposalInfo.getProposalCode();
if (oldProposalCode.contains("A") || oldProposalCode.contains("B") || oldProposalCode.contains("C")) {
//说明撤回过
if (StrUtil.isNotBlank(proposalInfo.getResultCode()) && proposalInfo.getResultCode().equals(resultCode)) {
//立案结果没变
updateChain.add("proposalCode", proposalInfo.getOldProposalCode());
updateChain.add("oldProposalCode", proposalInfo.getProposalCode());
} else {
//立案结果有变
//生成编号
String generateProposalCode = proposalProcessService.getProposalCode(teacherMeetingId, resultCode);
updateChain.add("proposalCode", generateProposalCode);
updateChain.add("oldProposalCode", proposalCode);
}
} else {
//没撤回过 生成编号
//生成编号
String generateProposalCode = proposalProcessService.getProposalCode(teacherMeetingId, resultCode);
updateChain.add("proposalCode", generateProposalCode);
}
if (resultCode.equals(ProposalConstant.NOTGIVE)) {
updateChain.add("stateCode", ProposalState.FINISH);
}
if (dolist.contains(resultCode)) {
ProposalReply hostReply = new ProposalReply();
hostReply.setId(R.UU32());
hostReply.setProposalId(id);
hostReply.setReplyUnitId(hostUnit);
hostReply.setUndertakeType(1);
hostReply.setReplyNumber(1);
hostReply.setLeaderCheckNumber(1);
hostReply.setIsReply(false);
hostReply.setIsLeaderAudit(false);
dao().insert(ProposalReply.class, Chain.from(hostReply));
if (Lang.isNotEmpty(helpUnits)) {
helpUnits.forEach(h -> {
ProposalReply helpReply = new ProposalReply();
helpReply.setId(R.UU32());
helpReply.setProposalId(id);
helpReply.setReplyUnitId(h);
helpReply.setUndertakeType(2);
helpReply.setReplyNumber(1);
helpReply.setLeaderCheckNumber(1);
helpReply.setIsReply(false);
helpReply.setIsLeaderAudit(false);
dao().insert(ProposalReply.class, Chain.from(helpReply));
});
}
}
}
dao().update(ProposalInfo.class, updateChain, Cnd.where("id", "=", id));
// /*
// *只有在并案操作时才会操作并案关联表
// */
// //并案关联表
// if (Lang.isNotEmpty(proposalIds) && proposalIds.size() > 1) {
// ProposalConjoin proposalConjoin = new ProposalConjoin();
// proposalConjoin.setProposalIds(proposalIds);
// dao().insert(proposalConjoin);
// }
ProposalToDoHandler.COMPLETE_CASE_TASK.exec(id,NutMap.NEW().addv("opinion",audit.getOpinion()));
if (resultCode.equals(ProposalConstant.NOTGIVE)) {
sysLocalProcessService.completeProcess("proposal_info@" + id);
} else if (resultCode.equals(ProposalConstant.DETERMINE)) {
ProposalToDoHandler.CREATE_CASE_UNIT_TASK.exec(id,null);
} else if (resultCode.equals(ProposalConstant.OPINION)) {
ProposalToDoHandler.CREATE_CASE_UNIT_TASK.exec(id,null);
}
}
}
@Override
@Aop(TransAop.READ_COMMITTED)
public void edit(List<String> proposalIds) {
dao().clear(ProposalUnderTakeFirstOpinion.class, Cnd.where("proposalId", "in", proposalIds));
dao().clear(ProposalBranchLeaderAudit.class, Cnd.where("proposalId", "in", proposalIds));
dao().clear(ProposalReply.class, Cnd.where("proposalId", "in", proposalIds));
dao().clear(ProposalFeedback.class, Cnd.where("proposalId", "in", proposalIds));
Chain chain = Chain.make("executorOpinion", null);
chain.add("secretaryOpinions", null);
chain.add("caseUnitAuditId", null);
chain.add("caseCheckAuditId", null);
chain.add("caseCheckNeedSecondReply", null);
chain.add("caseCheckNeedSecondAudit", null);
chain.add("caseCheckResult", null);
dao().update(ProposalInfo.class, chain, Cnd.where("id", "in", proposalIds));
//删除并案记录
for (String id : proposalIds) {
Sql deleteConjoinSql = Sqls.create("delete from proposal_conjoin where JSON_CONTAINS(proposalIds, JSON_QUOTE(@someProposalId))");
deleteConjoinSql.setParam("someProposalId", id);
dao().execute(deleteConjoinSql);
}
}
@Override
@Aop(TransAop.READ_COMMITTED)
public void revoke(String proposalId) {
List<String> proposalIdList = proposalCommonService.findConjoin(proposalId);
for (String id : proposalIdList) {
ProposalInfo info = dao().fetch(ProposalInfo.class, id);
String currentProposalCode = info.getProposalCode();
info.setProposalCode(info.getOldProposalCode());
info.setOldProposalCode(currentProposalCode);
info.setResultCode(null);
int size = info.getCaseAuditId().size();
List<String> collect = info.getCaseAuditId().stream().filter(v -> !v.contains(info.getCaseAuditId().get(size - 1))).collect(Collectors.toList());
info.setCaseAuditId(collect.size() == 0 ? null : collect);
info.setStateCode(ProposalState.CASE);
info.setDetermineTypeCode(null);
info.setExecutorOpinion(null);
dao().update(info, "^caseAuditId|executorOpinion|stateCode|resultCode|determineTypeCode|oldProposalCode|proposalCode$");
dao().clear(ProposalBranchLeaderAudit.class, Cnd.where("proposalId", "=", id));
Sql deleteConjoinSql = Sqls.create("""
DELETE FROM proposal_conjoin
WHERE JSON_CONTAINS(proposalIds,JSON_QUOTE(@id))
""");
deleteConjoinSql.setParam("id", id);
SqlType sqlType = deleteConjoinSql.getSqlType();
log.info("revoke方法{}", sqlType);
dao().execute(deleteConjoinSql);
}
dao().clear(ProposalReply.class, Cnd.where("proposalId", "in", proposalIdList));
}
@Override
public Map<String, Object> backShow(String proposalId) {
String actived = "^id|proposalCode|proposalName|typeId|resultCode|determineTypeCode|stateCode|caseAuditId$";
ProposalInfo info = Daos.ext(dao(), FieldFilter.create(ProposalInfo.class, actived)).fetch(ProposalInfo.class, proposalId);
// ProposalInfo info = dao().fetch(ProposalInfo.class, proposalId);
List<String> caseAuditId = info.getCaseAuditId();
int size = caseAuditId.size();
Object toJSON = JSONArray.toJSON(caseAuditId.get(size - 1));
Object caseAuditRecord = proposalAuditService.getAuditRecordList(Lang.array(toJSON.toString()));
List<ProposalReply> replyList = dao().query(ProposalReply.class, Cnd.where("proposalId", "=", proposalId));
Optional<String> hostUnderTakeOptional = replyList.stream().filter(v -> v.getUndertakeType() == 1).map(v -> v.getReplyUnitId()).findFirst();
List<String> helpUnitIds = replyList.stream().filter(v -> v.getUndertakeType() == 2).map(ProposalReply::getReplyUnitId).collect(Collectors.toList());
return Map.of("basic_info", info, "caseAuditRecord", caseAuditRecord,
"hostUnitId", hostUnderTakeOptional.orElse(""), "helpUnitIds", helpUnitIds);
}
}
@@ -0,0 +1,394 @@
package io.v.nutz.zhgh.proposal.services.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import io.v.nutz.base.utils.Roles;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.models.*;
import io.v.nutz.zhgh.proposal.services.ProposalAuditService;
import io.v.nutz.zhgh.proposal.services.ProposalCommonService;
import io.v.nutz.zhgh.proposal.services.ProposalFeedBackService;
import io.v.nutz.zhgh.proposal.services.ProposalReplyService;
import io.v.nutz.base.service.impl.ViServiceImpl;
import io.v.nutz.sys.models.Sys_user_role;
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.Daos;
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.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@IocBean(args = {"refer:dao"})
public class ProposalCommonServiceImpl extends ViServiceImpl implements ProposalCommonService {
public ProposalCommonServiceImpl(Dao dao) {
super(dao);
}
@Inject
private ProposalAuditService proposalAuditService;
@Inject
private ProposalReplyService proposalReplyService;
@Inject
private ProposalFeedBackService proposalFeedBackService;
@Override
public void sortAndSearch(Cnd cnd, PageForm pageForm, ProposalSearch search) {
if (Strings.isNotBlank(pageForm.getSearchName()) && Strings.isNotBlank(pageForm.getSearchKeyword())) {
cnd.where().andLike(pageForm.getSearchName(), pageForm.getSearchKeyword());
}
if (StrUtil.isNotBlank(search.getCreateUser())) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.orLike("su.username", search.getCreateUser());
group.orLike("su.loginname", search.getCreateUser());
cnd.and(group);
}
cnd.andEX("info.teacherMeetingId", "=", search.getMeetingId());
cnd.andEX("info.delegationId", "=", search.getDelegationId());
cnd.andEX("info.resultCode", "=", search.getResultCode());
cnd.andEX("su.unionId", "=", search.getUnionId());
cnd.andEX("su.unitId", "=", search.getUnitId());
if (StrUtil.isNotBlank(pageForm.getPageOrderName())) {
String orderBy = pageForm.getPageOrderBy().startsWith("asc") ? "ASC" : "DESC";
switch (pageForm.getPageOrderName()) {
case "createTime" -> cnd.orderBy("info.createTime", orderBy);
case "typeName" -> cnd.orderBy("info.typeId", orderBy);
case "meetingName" -> cnd.orderBy("info.teacherMeetingId", orderBy);
case "delegationName" -> cnd.orderBy("info.delegationId", orderBy);
case "stateName" -> cnd.orderBy("info.stateCode", orderBy);
}
} else {
cnd.desc("info.proposalCode").desc("info.createTime").asc("info.stateCode");
}
}
@Override
public NutMap findOne(String proposalId) {
Sql basicInfoSql = Sqls.create("""
SELECT
info.*,
su.username createUserName,
su.loginname,
sign.data createUserSign,
state.stateName,
state.stateColor,
type.typeName,
un.unitName implementUnitName,
su.unionname unionName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
manner.`name` mannerName,
result.`name` resultName,
lalevel.`name` laLevelName,
jg.`name` as committeeName,
(
SELECT
count( 1 ) > 0
FROM
proposal_conjoin
where JSON_CONTAINS (proposalIds,JSON_QUOTE(info.id))
) AS isConjoin
FROM
proposal_info info
LEFT JOIN sys_signature sign on sign.id = info.signId
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN proposal_undertake un ON un.id = info.implementUnitId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
LEFT JOIN sys_dict lalevel ON lalevel.`code` = info.determineTypeCode
left join jdh_jgsz jg on jg.id = info.committeeId
WHERE
info.id = @proposalId
""").setParam("proposalId", proposalId);
NutMap basicInfo = fetch(basicInfoSql);
List<String> conjoinIdList = findConjoin(proposalId);
Sql sql = Sqls.create("""
SELECT
info.id,
info.proposalName,
info.proposalCode,
u.username
FROM
proposal_info info
LEFT JOIN sys_user u ON u.id = info.createUser
WHERE info.id in (@ids)
""");
sql.setParam("ids", conjoinIdList);
basicInfo.setv("conJoinList", Daos.query(dao(), sql.toString(), Sqls.callback.maps()));
//附议人
Sql secondedSql = Sqls.create("""
SELECT
u.username,
u.loginname,
u.unitname,
ps.isAgree,
ps.secondedTime,
ps.inviteTime,
ps.isAgree,
sign.`data` signData
FROM
proposal_seconded ps
LEFT JOIN `user` u ON ps.seconderId = u.id
LEFT JOIN sys_signature sign ON sign.id = ps.seconderSignId
WHERE
ps.proposalId = @proposalId
ORDER BY
ps.secondedTime
""").setParam("proposalId", proposalId);
List<NutMap> secondedList = listMap(secondedSql);
basicInfo.setv("seconded", secondedList);
//承办单位
Sql underTakeSql = Sqls.create("""
SELECT
pr.*,
pu.unitName,
pr.undertakeType
FROM
proposal_reply pr
LEFT JOIN proposal_undertake pu ON pu.id = pr.replyUnitId
WHERE
pr.proposalId = @proposalId
GROUP BY
pu.unitName
ORDER BY
pr.undertakeType
""").setParam("proposalId", proposalId);
List<NutMap> underTakeList = listMap(underTakeSql);
basicInfo.setv("undertake", underTakeList);
//团长审核记录
String delegationAuditId = basicInfo.getString("delegationAuditId");
if (StrUtil.isNotBlank(delegationAuditId)) {
String[] delegationAuditIdArray = Json.fromJsonAsArray(String.class, delegationAuditId);
basicInfo.setv("delegationAudit", CollectionUtil.addAll(new ArrayList<>(), proposalAuditService.getAuditRecordList(delegationAuditIdArray)));
} else {
basicInfo.setv("delegationAudit", Collections.EMPTY_LIST);
}
//委员会成员意见
String membersOpinions = basicInfo.getString("membersOpinions");
if (Strings.isNotBlank(membersOpinions)) {
String[] membersOpinionsArray = Json.fromJsonAsArray(String.class, membersOpinions);
basicInfo.setv("membersOpinions", CollectionUtil.addAll(new ArrayList<>(), proposalAuditService.getAuditRecordList(membersOpinionsArray)));
} else {
basicInfo.setv("membersOpinions", Collections.EMPTY_LIST);
}
//委员会立案
String caseAuditId = basicInfo.getString("caseAuditId");
if (Strings.isNotBlank(caseAuditId)) {
String[] caseAuditIdArray = Json.fromJsonAsArray(String.class, caseAuditId);
basicInfo.setv("caseAudit", CollectionUtil.addAll(new ArrayList<>(), proposalAuditService.getAuditRecordList(caseAuditIdArray)));
} else {
basicInfo.setv("caseAudit", Collections.EMPTY_LIST);
}
//委员会确定承办单位
String caseUnitAuditId = basicInfo.getString("caseUnitAuditId");
if (Strings.isNotBlank(caseUnitAuditId)) {
basicInfo.setv("caseUnitAudit", proposalAuditService.getAuditRecordList(Lang.array(caseUnitAuditId)));
} else {
basicInfo.setv("caseUnitAudit", null);
}
//分管校领导审批立案
Sql branchCaseSql = Sqls.create("select auditId from proposal_branch_leader_audit where proposalId = @proposalId");
branchCaseSql.setParam("proposalId", proposalId);
String[] branchCaseArray = (String[]) Daos.query(dao(), branchCaseSql.toString(), Sqls.callback.strs());
if (Lang.isNotEmpty(branchCaseArray)) {
basicInfo.setv("branchLeaderOpinion", CollectionUtil.addAll(new ArrayList<>(), proposalAuditService.getAuditRecordList(branchCaseArray)));
} else {
basicInfo.setv("branchLeaderOpinion", Collections.emptyList());
}
//承办单位答复信息
basicInfo.setv("replyInfo", proposalReplyService.getUndertakeReply(proposalId));
//反馈评分信息
basicInfo.setv("feedback", proposalFeedBackService.getFeedbackList(proposalId));
//分管校领导审批答复
Sql branchLeaderSuffixAuditSql = Sqls.create("select auditId from proposal_branch_leader_suffix_audit where proposalId = @proposalId and isMaster = 1 AND auditId IS NOT NULL");
branchLeaderSuffixAuditSql.setParam("proposalId", proposalId);
List<NutMap> branchLeaderSuffixAuditList = listMap(branchLeaderSuffixAuditSql);
String[] branchLeaderSuffixAuditIdArray = branchLeaderSuffixAuditList.stream().map(v -> v.getString("auditId")).toArray(String[]::new);
if (!Lang.isEmptyArray(branchLeaderSuffixAuditIdArray)) {
basicInfo.setv("branchLeaderSuffixAuditOpinion", CollectionUtil.addAll(new ArrayList<>(), proposalAuditService.getAuditRecordList(branchLeaderSuffixAuditIdArray)));
} else {
basicInfo.setv("branchLeaderSuffixAuditOpinion", Collections.emptyList());
}
return basicInfo;
}
@Override
public List<String> findConjoin(String proposalId) {
Sql sql = Sqls.create("""
SELECT
proposalIds
FROM
proposal_conjoin
where JSON_CONTAINS (proposalIds,JSON_QUOTE(@proposalId))
""");
sql.setParam("proposalId", proposalId);
String proposalIds = (String) Daos.query(dao(), sql.toString(), Sqls.callback.str());
if (StrUtil.isBlank(proposalIds)) {
return List.of(proposalId);
}
return Json.fromJsonAsList(String.class, proposalIds);
}
@Override
public List<String> getUnderTakeByLeaderAndProId(String replyUnitId, String proposalId) {
//1.首先查询出本条记录的分管校领导是谁 之所以要这么查是为了防止管理员或者别人帮忙答复的时候 拿不到真正的校领导id
Sys_user_role userRole = dao().fetch(Sys_user_role.class, Cnd.where("cbdwid", "=", replyUnitId).and("roleid", "=", Roles.IN_CHARGE_LEADER));
if (userRole == null) {
return Collections.emptyList();
}
String leaderId = userRole.getUserId();
//2.根据userId查询出该校领导管辖的承办单位
List<Sys_user_role> userRoles = dao().query(Sys_user_role.class, Cnd.where("userid", "=", leaderId).and("roleid", "=", Roles.IN_CHARGE_LEADER).and("cbdwid", "is not", null));
List<String> underTakeList = userRoles.stream().map(v -> v.getCbdwid()).collect(Collectors.toList());
return underTakeList;
}
@Override
@Aop(TransAop.READ_COMMITTED)
public void doBatchDelete(List<String> proposalIds) {
dao().clear(ProposalInfo.class, Cnd.where("id", "in", proposalIds));
dao().clear(ProposalSeconded.class, Cnd.where("proposalId", "in", proposalIds));
dao().clear(ProposalBranchLeaderAudit.class, Cnd.where("proposalId", "in", proposalIds));
dao().clear(ProposalReply.class, Cnd.where("proposalId", "in", proposalIds));
dao().clear(ProposalUnderTakeFirstOpinion.class, Cnd.where("proposalId", "in", proposalIds));
dao().clear(ProposalFeedback.class, Cnd.where("proposalId", "in", proposalIds));
}
@Override
public List<NutMap> conJoinInfoList(String proposalId) {
List<String> conjoinIdList = findConjoin(proposalId);
Sql sql = Sqls.create("""
SELECT
info.id,
info.proposalName,
info.proposalCode,
u.username
FROM
proposal_info info
LEFT JOIN sys_user u ON u.id = info.createUser
WHERE info.id in (@ids)
""");
sql.setParam("ids", conjoinIdList);
List<NutMap> conJoinList = (List<NutMap>) Daos.query(dao(), sql.toString(), Sqls.callback.maps());
return conJoinList;
}
@Override
public List<String> getTeamLeaderByProposalId(String proposalId) {
ProposalInfo info = dao().fetch(ProposalInfo.class, proposalId);
Sql sql = Sqls.fetchRecord("""
SELECT
u.username,
u.mobile,
u.unitid,
u.unitname,
u.loginname
FROM
`user` u
LEFT JOIN sys_user_role sur ON sur.userid = u.id
WHERE
sur.roleId = @tzRoleId
AND dbtid = @dbtId
""");
sql.setParam("dbtId", info.getDelegationId());
sql.setParam("tzRoleId", Roles.DBT_TZ);
List<NutMap> list = listMap(sql);
return list.stream().map(v -> v.getString("loginname")).collect(Collectors.toList());
}
@Override
public List<String> getCommitteeLeader(String proposalId) {
ProposalInfo info = dao().fetch(ProposalInfo.class, proposalId);
Sql sql = Sqls.create("""
SELECT
us.loginname
FROM
jdh_jgcy cy
LEFT JOIN jdh_jdhxx jdh ON jdh.id = cy.jdhid
LEFT JOIN sys_user USER ON USER.id = cy.userid
LEFT JOIN `user` us ON us.id = cy.userid
WHERE
cy.jgid = 'oljk9ojm5qh6jqm1spo3os5ge5'
AND cy.jdhid = @jdhid
""");
sql.setParam("jdhid", info.getTeacherMeetingId());
List<NutMap> list = listMap(sql);
return list.stream().map(v -> v.getString("loginname")).collect(Collectors.toList());
}
@Override
public List<String> getUnderTakeLeader(String underTakeId) {
Sql sql = Sqls.create("""
SELECT
u.loginname\s
FROM
sys_user_role sur
LEFT JOIN sys_user u ON u.id = sur.userid\s
WHERE
sur.roleId = '2b17b5d68c754914b4637dddb66ea4ed'\s
AND sur.cbdwid = @underTakeId
""");
sql.setParam("underTakeId", underTakeId);
List<NutMap> list = listMap(sql);
return list.stream().map(v -> v.getString("loginname")).collect(Collectors.toList());
}
@Override
public List<String> getUnderTakeSchoolLeader(String underTakeId) {
Sql sql = Sqls.create("""
SELECT
u.loginname\s
FROM
sys_user_role sur
LEFT JOIN sys_user u ON u.id = sur.userid\s
WHERE
sur.roleId = '153cba3fb88b4c88b7c1002f0eb63749'\s
AND sur.cbdwid = @underTakeId
""");
sql.setParam("underTakeId", underTakeId);
List<String> list = dao().execute(Sqls.queryString(sql.toString())).getList(String.class);
return list;
}
}
@@ -0,0 +1,170 @@
package io.v.nutz.zhgh.proposal.services.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import io.v.nutz.zhgh.jdh.model.cb.Jdh_jdhxx;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.ProposalConfig;
import io.v.nutz.zhgh.proposal.services.ProposalConfigService;
import io.v.nutz.base.service.impl.ViServiceImpl;
import io.v.nutz.sys.models.Sys_dict;
import io.v.nutz.sys.models.Sys_task;
import io.v.nutz.sys.services.SysDictService;
import io.v.nutz.task.job.ProposalRemindCreatorJob;
import io.v.nutz.task.services.TaskPlatformService;
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.json.Json;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author zxy
* @Description TODO
* @createTime 2022年02月18日 11:33:00
*/
@IocBean(args = {"refer:dao"})
public class ProposalConfigServiceImpl extends ViServiceImpl<ProposalConfig> implements ProposalConfigService {
@Inject
private TaskPlatformService taskPlatformService;
@Inject
private SysDictService sysDictService;
/* @Inject
private MsgApi msgApi;*/
public ProposalConfigServiceImpl(Dao dao) {
super(dao);
}
@Override
@Aop(TransAop.READ_COMMITTED)
public void add(ProposalConfig config) {
dao().insertWith(config, null);
}
@Override
@Aop(TransAop.READ_COMMITTED)
public void edit(ProposalConfig config, String[] mannerList) {
if (StrUtil.isBlank(config.getMasterUnitConfigId())) {
dao().insertLinks(config, "masterUnitConfig");
}
if (StrUtil.isBlank(config.getSlaveUnitConfigId())) {
dao().insertLinks(config, "slaveUnitConfig");
}
dao().updateWith(config, null);
Sys_dict dict = sysDictService.fetch(Cnd.where("code", "=", "proposal_manner"));
sysDictService.update(Chain.make("disabled", true), Cnd.where("parentId", "=", Strings.sNull(dict.getId())));
for (String s : mannerList) {
sysDictService.update(Chain.make("disabled", false), Cnd.where("id", "=", s));
}
Jdh_jdhxx latestJdh = dao().fetch(Jdh_jdhxx.class, Cnd.where("jdhkqzt", "=", 1).desc("jdhkqsj"));
if (latestJdh != null) {
setRemindTaskForProposalCreator(config, latestJdh.getId());
}
}
@Override
@Aop(TransAop.READ_COMMITTED)
public void setRemindTaskForProposalCreator(ProposalConfig config, String teacherMeetingId) {
ProposalConfig oldConfig = dao().fetch(ProposalConfig.class, config.getId());
String jobClass = ProposalRemindCreatorJob.class.getCanonicalName();
//删除旧任务
Sys_task oldTask = dao().fetch(Sys_task.class, Cnd.where("name", "=", "提案人提醒"));
if (oldTask != null) {
taskPlatformService.delete(oldTask.getId(), oldTask.getId());
dao().delete(oldTask);
}
//添加新任务
if (config.getRemindProposalCreatorDate() != null) {
//定时任务
Sys_task task = new Sys_task();
task.setDisabled(false);
task.setName("提案人提醒");
task.setJobClass(jobClass);
String cron = DateUtil.format(config.getRemindProposalCreatorDate(), "ss mm HH dd MM ? yyyy");
task.setCron(cron);
task.setData(Json.toJson(Map.of("teacherMeetingId", teacherMeetingId)));
task.setNote(null);
dao().insert(task);
taskPlatformService.add(task.getId(), task.getId(), task.getJobClass(), task.getCron()
, task.getNote(), task.getData());
}
}
@Override
public void remindProposalCreator(String teacherMeetingId) {
ProposalConfig proposalConfig = dao().fetch(ProposalConfig.class);
Integer seconderNum = proposalConfig.getSeconderNum();
Sql sql = Sqls.create("""
SELECT
info.id,
info.proposalName,
info.createUser,
info.stateCode,
u.loginname AS creatorLoginName,
u.username AS creatorUserName,
u.unitid AS creatorUnitId,
u.unitname AS creatorUnitName,
u.mobile AS creatorMobile,
count( ps.isAgree = 1 ) as alreadySecondedCount
FROM
proposal_info info
LEFT JOIN proposal_seconded ps ON ps.proposalId = info.id
LEFT JOIN user u on u.id = info.createUser
WHERE
info.teacherMeetingId = @teacherMeetingId
AND info.mannerCode = 'W01'
AND info.stateCode = @inviteStateCode
GROUP BY
info.id
""");
sql.setParam("teacherMeetingId", teacherMeetingId);
sql.setParam("inviteStateCode", ProposalState.INVIRTE);
List<NutMap> list = listMap(sql);
list.forEach(v -> {
String proposalName = v.getString("proposalName");
String creatorLoginName = v.getString("creatorLoginName");
String creatorUserName = v.getString("creatorUserName");
String creatorUnitId = v.getString("creatorUnitId");
String creatorUnitName = v.getString("creatorUnitName");
String creatorMobile = v.getString("creatorMobile");
int alreadySecondedCount = v.getInt("alreadySecondedCount");
List<String> list2 = new ArrayList<>();
list2.add(creatorUserName);
list2.add(creatorLoginName);
list2.add(creatorUnitId);
list2.add(creatorUnitName);
list2.add(creatorMobile != null ? creatorMobile : "");
list2.add("");
list2.add("");
String collect = list2.stream().collect(Collectors.joining("|"));
if (alreadySecondedCount >= seconderNum) {
// msgApi.sendWxMsg(collect, StrUtil.format("您的《{}》提案已经附议完成,但还未提交,请关注!", proposalName));
} else {
// msgApi.sendWxMsg(collect, StrUtil.format("您的《{}》提案已经有({})人附议通过,但还未达到提交的要求数量,请关注!", proposalName, alreadySecondedCount));
}
});
}
}
@@ -0,0 +1,195 @@
package io.v.nutz.zhgh.proposal.services.impl;
import cn.wizzer.framework.page.Pagination;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.zhgh.proposal.constants.ProposalConstant;
import io.v.nutz.zhgh.proposal.constants.ProposalState;
import io.v.nutz.zhgh.proposal.models.ProposalSearch;
import io.v.nutz.zhgh.proposal.services.ProposalDataBoardService;
import io.v.nutz.zhgh.proposal.services.ProposalHandlingProgressService;
import io.v.nutz.base.service.impl.ViServiceImpl;
import io.v.nutz.web.commons.utils.ShiroUtil;
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.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import java.util.List;
@IocBean(args = {"refer:dao"})
public class ProposalDataBoardServiceImpl extends ViServiceImpl implements ProposalDataBoardService {
@Inject
private Vi vi;
@Inject
private ProposalHandlingProgressService proposalHandlingProgressService;
public ProposalDataBoardServiceImpl(Dao dao) {
super(dao);
}
@Override
public Pagination pageData(PageForm page, ProposalSearch search, String type) {
Sql sql = Sqls.create("""
SELECT
info.*,
su.username,
su.loginname,
state.stateName,
state.stateColor,
type.typeCode,
type.typeName,
jdh.jdhallname meetingName,
dbt.dbtname delegationName,
dbt.`code` delegationCode,
manner.`name` mannerName,
result.`name` resultName,
( SELECT count( 1 ) > 0 FROM proposal_conjoin WHERE JSON_CONTAINS ( proposalIds, JSON_QUOTE( info.id )) ) AS isConjoin,
masterPu.unitName AS pruMaster,
masterPu.unitCode AS pruMasterCode,
GROUP_CONCAT(DISTINCT ( slavePu.unitName )) AS pruSlave
FROM
proposal_info info
LEFT JOIN `user` su ON su.id = info.createUser
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id = info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id = info.delegationId
LEFT JOIN sys_dict manner ON manner.`code` = info.mannerCode
LEFT JOIN sys_dict result ON result.`code` = info.resultCode
LEFT JOIN proposal_reply masterPr ON masterPr.proposalId = info.id
AND masterPr.undertakeType = 1
LEFT JOIN proposal_underTake masterPu ON masterPu.id = masterPr.replyUnitId
LEFT JOIN proposal_reply slavePr ON slavePr.proposalId = info.id
AND slavePr.undertakeType = 2
LEFT JOIN proposal_underTake slavePu ON slavePu.id = slavePr.replyUnitId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("info.teacherMeetingId", "=", search.getMeetingId());
switch (type) {
case "determine" -> cnd.and("info.resultCode", "=", ProposalConstant.DETERMINE);
case "opinion" -> cnd.and("info.resultCode", "=", ProposalConstant.OPINION);
case "notGive" -> cnd.and("info.resultCode", "=", ProposalConstant.NOTGIVE);
case "delegation" -> cnd.and("info.stateCode", "=", ProposalState.DELEGATION);
case "case" -> cnd.and("info.stateCode", "=", ProposalState.CASE);
case "waitUnitReply" -> {
cnd.and("info.resultCode", "in", Lang.list(ProposalConstant.DETERMINE, ProposalConstant.OPINION));
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("masterPr.isReply", "=", 0);
seg.or("slavePr.isReply", "=", 0);
cnd.and(seg);
}
case "unitReplyFinish" -> {
cnd.and("info.resultCode", "in", Lang.list(ProposalConstant.DETERMINE, ProposalConstant.OPINION));
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("masterPr.isReply", "=", 1);
seg.or("slavePr.isReply", "=", 1);
cnd.and(seg);
}
case "awaitLeaderAuditReply" -> {
cnd.and("info.resultCode", "=", ProposalConstant.DETERMINE);
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("masterPr.isLeaderAudit", "=", 0);
seg.or("slavePr.isLeaderAudit", "=", 0);
cnd.and(seg);
}
case "LeaderAuditReplyFinish" -> {
cnd.and("info.resultCode", "=", ProposalConstant.DETERMINE);
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("masterPr.isLeaderAudit", "=", 1);
seg.or("slavePr.isLeaderAudit", "=", 1);
cnd.and(seg);
}
case "caseCheck" -> {
// cnd.and("info.stateCode", "=", ProposalState.CASE_CHECK);
}
case "feedback" -> cnd.and("info.stateCode", "=", ProposalState.FEEDBACKSCORE);
case "finish" -> cnd.and("info.stateCode", "=", ProposalState.FINISH);
default -> {
}
}
if (!ShiroUtil.hasAnyRoles(new String[]{"sysadmin", "A06", "tamange"})) {
if (ShiroUtil.hasRole("H04")) {
cnd.and("su.unionid", " in ", vi.getMangeUnionStr());
}
}
cnd.and("info.stateCode", ">", ProposalState.UNSUBMIT);
cnd.groupBy("info.id");
sql.setCondition(cnd);
Pagination pagination = list(page, sql);
List<NutMap> list = pagination.getList();
for (NutMap proMap : list) {
List<NutMap> replyInfo = proposalHandlingProgressService.getReplyInfo(proMap.getString("id"));
proMap.setv("replyInfo", replyInfo);
}
return pagination;
}
@Override
public NutMap numData(String meetingId) {
Sql sql = Sqls.create("""
SELECT
( SELECT count( 1 ) FROM proposal_info info $left_user_unit_union_info WHERE info.stateCode > @unSubmit $union $meeting) `all`,
( SELECT count( 1 ) FROM proposal_info info $left_user_unit_union_info WHERE info.resultCode = @determine $union $meeting) `determine`,
( SELECT count( 1 ) FROM proposal_info info $left_user_unit_union_info WHERE info.resultCode = @opinion $union $meeting) `opinion`,
( SELECT count( 1 ) FROM proposal_info info $left_user_unit_union_info WHERE info.resultCode = @notgive $union $meeting) `notGive`,
( SELECT count( 1 ) FROM proposal_info info $left_user_unit_union_info WHERE info.stateCode = @delegation_state $union $meeting) `delegation`,
( SELECT count( 1 ) FROM proposal_info info $left_user_unit_union_info WHERE info.stateCode = @case_state $union $meeting) `case`,
( SELECT count( DISTINCT pr.proposalId ) FROM proposal_reply pr LEFT JOIN proposal_info info ON info.id = pr.proposalId $left_user_unit_union_info
WHERE
pr.isReply = 0
$union $meeting
) AS waitUnitReply,
( SELECT count( DISTINCT pr.proposalId ) FROM proposal_reply pr LEFT JOIN proposal_info info ON info.id = pr.proposalId $left_user_unit_union_info
WHERE
pr.isReply = 1
$union $meeting
) AS unitReplyFinish,
( SELECT count( DISTINCT pr.proposalId ) FROM proposal_reply pr LEFT JOIN proposal_info info ON info.id = pr.proposalId $left_user_unit_union_info
WHERE
pr.isLeaderAudit = 0
AND info.resultCode = @determine
$union $meeting
) AS awaitLeaderAuditReply,
( SELECT count( DISTINCT pr.proposalId ) FROM proposal_reply pr LEFT JOIN proposal_info info ON info.id = pr.proposalId $left_user_unit_union_info
WHERE
pr.isLeaderAudit = 1
AND info.resultCode = @determine
$union $meeting
) AS LeaderAuditReplyFinish,
( SELECT count( 1 ) FROM proposal_info info LEFT JOIN sys_user u ON info.createUser = u.id LEFT JOIN sys_unit un ON u.unitid= un.id WHERE info.stateCode = @feedbackscore_state $union $meeting) `feedback`,
( SELECT count( 1 ) FROM proposal_info info LEFT JOIN sys_user u ON info.createUser = u.id LEFT JOIN sys_unit un ON u.unitid= un.id WHERE info.stateCode = @finish_state $union $meeting) `finish`
""");
sql.setVar("left_user_unit_union_info", "LEFT JOIN sys_user u ON info.createUser = u.id LEFT JOIN sys_unit un ON u.unitid= un.id");
sql.setVar("meeting", Strings.isNotBlank(meetingId) ? "AND info.teacherMeetingId = '" + meetingId + "'" : "");
if (!ShiroUtil.hasAnyRoles(new String[]{"sysadmin", "A06", "tamange"})) {
if (ShiroUtil.hasRole("H04")) {
sql.setVar("union", "AND un.unionid in " + vi.getMangeUnionStr());
}
}
sql.setParam("unSubmit", ProposalState.UNSUBMIT);
sql.setParam("determine", ProposalConstant.DETERMINE);
sql.setParam("opinion", ProposalConstant.OPINION);
sql.setParam("notgive", ProposalConstant.NOTGIVE);
sql.setParam("delegation_state", ProposalState.DELEGATION);
sql.setParam("case_state", ProposalState.CASE);
sql.setParam("feedbackscore_state", ProposalState.FEEDBACKSCORE);
sql.setParam("finish_state", ProposalState.FINISH);
return fetch(sql);
}
}
@@ -0,0 +1,388 @@
package io.v.nutz.zhgh.proposal.services.impl;
import cn.hutool.core.util.StrUtil;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
import io.v.nutz.base.service.impl.BaseServiceImpl;
import io.v.nutz.base.utils.Html2Text;
import io.v.nutz.base.utils.OfficeTemplateUtil;
import io.v.nutz.zhgh.proposal.services.ProposalExportService;
import io.v.nutz.zhgh.proposal.services.ProposalInfoService;
import io.v.nutz.sys.models.Sys_signature;
import io.v.nutz.web.commons.base.Globals;
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.Sqls;
import org.nutz.dao.entity.Record;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.Daos;
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 javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;
@IocBean(args = {"refer:dao"})
@Slf4j
public class ProposalExportServiceImpl extends BaseServiceImpl implements ProposalExportService {
public ProposalExportServiceImpl(Dao dao) {
super(dao);
}
@Inject
private OfficeTemplateUtil officeTemplateUtil;
@Inject
private ProposalInfoService proposalInfoService;
@Override
public void exportFull(String proposalId, HttpServletResponse response) throws IOException {
Sql sql = Sqls.create("select proposalName,proposalCode from proposal_info where id = @id");
sql.setParam("id", proposalId);
NutMap proposalMap = (NutMap) Daos.query(dao(), sql.toString(), Sqls.callback.map());
String proposalName = proposalMap.getString("proposalName");
String proposalCode = proposalMap.getString("proposalCode");
response.addHeader("Content-Type", "application/octet-stream");
response.addHeader("Content-Disposition", "attachment; filename=\"" + new String(proposalName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1) + "\".docx");
ServletOutputStream outputStream = response.getOutputStream();
exportFull(proposalId, outputStream);
}
@Override
public void exportFull(String proposalId, OutputStream outputStream) throws IOException {
Sql sql = Sqls.create("""
SELECT
createUser_sign.data AS createUserSignData,
info.*,
su.username,
su.mobile,
su.email,
un.`name` unitName,
type.typeName,
pu.unitName implementUnitName,
jdh.jdhallname jdhAllName,
dbt.dbtname delegationName,
under1.unitName under1Unit,
GROUP_CONCAT(under2.unitName) as under2Unit,
(SELECT gdhJs FROM workers_congress_session WHERE `startState` is TRUE GROUP BY `year` LIMIT 1) gdhJs,
(SELECT GROUP_CONCAT(u.username) FROM proposal_seconded ps LEFT JOIN `user` u ON u.id=ps.seconderId WHERE ps.proposalId=info.id AND ps.isAgree =1) secondedUserName
FROM
proposal_info info
LEFT JOIN sys_user su ON su.id = info.createUser
LEFT JOIN sys_signature createUser_sign ON createUser_sign.id = info.signId
LEFT JOIN sys_unit un ON un.id = su.unitid
LEFT JOIN proposal_undertake pu ON pu.id = info.implementUnitId
LEFT JOIN proposal_state state ON state.stateCode = info.stateCode
LEFT JOIN proposal_type type ON type.id = info.typeId
LEFT JOIN jdh_jdhxx jdh ON jdh.id=info.teacherMeetingId
LEFT JOIN jdh_dbt dbt ON dbt.id=info.delegationId
LEFT JOIN proposal_reply reply1 ON reply1.proposalId=info.id AND reply1.undertakeType=1
LEFT JOIN proposal_undertake under1 ON under1.id=reply1.replyUnitId
LEFT JOIN proposal_reply reply2 ON reply2.proposalId=info.id AND reply2.undertakeType=2
LEFT JOIN proposal_undertake under2 ON under2.id=reply2.replyUnitId
WHERE
info.id = @proposalId
group by info.id
""").setParam("proposalId", proposalId);
NutMap nutMap = proposalInfoService.fetch(sql);
nutMap.setv("brief", nutMap.getString("brief"));
nutMap.setv("measures", nutMap.getString("measures"));
String createUserSignData = nutMap.getString("createUserSignData");
// nutMap.setv("createUserSign", StrUtil.isNotBlank(createUserSignData) ? getImg(createUserSignData) : null);
Sql seconded = Sqls.create("""
SELECT
ps.seconderSignId,
su.username s_username,
su.mobile s_mobile,
su.position s_zw,
un.`name` s_unitName
FROM
proposal_seconded ps
LEFT JOIN sys_user su ON ps.seconderId = su.id
LEFT JOIN sys_unit un ON un.id = su.unitid
WHERE
ps.proposalId = @proposalId
and ps.isAgree is true
ORDER BY
ps.secondedTime
""").setParam("proposalId", proposalId);
List<Record> secondedList = proposalInfoService.list(seconded);
List<NutMap> secondedSignList = new ArrayList<>();
if (Lang.isNotEmpty(secondedSignList)) {
secondedList.forEach(v -> {
Sys_signature signData = proposalInfoService.dao().fetch(Sys_signature.class, v.getString("seconderSignId"));
if (signData != null) {
try {
secondedSignList.add(NutMap.NEW().addv("secondedSign", StrUtil.isNotBlank(signData.getData()) ? getImg(signData.getData()) : null));
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
List<NutMap> delegationAuditList = new ArrayList<>();
if (Strings.isNotBlank(nutMap.getString("delegationAuditId"))) {
String[] delegationAuditIds = Json.fromJsonAsArray(String.class, nutMap.getString("delegationAuditId"));
Cnd delegationCnd = Cnd.NEW();
Sql delegationAuditSql = Sqls.create("""
SELECT
pa.*,
sign.`data` auditSign ,
dict.`name` dictName
FROM
proposal_audit pa
LEFT JOIN sys_signature sign ON sign.id = pa.signId
LEFT JOIN sys_dict dict ON pa.other = dict.`code`
$condition
""");
delegationCnd.where().andIn("pa.id", delegationAuditIds);
delegationAuditSql.setCondition(delegationCnd);
delegationAuditList = proposalInfoService.listMap(delegationAuditSql);
delegationAuditList.forEach(v -> {
try {
v.setv("auditSign", StrUtil.isNotBlank(v.getString("auditSign")) ? getImg(v.getString("auditSign")) : null);
} catch (IOException e) {
e.printStackTrace();
}
v.setv("auditTime", v.getString("auditTime").substring(0, 10));
});
}
Sql oneAuditRecordSql = Sqls.create("""
SELECT
pa.*,
sign.`data` auditSign
FROM
proposal_audit pa
LEFT JOIN sys_signature sign ON sign.id = pa.signId
where pa.id in (@id)
""").setParam("id", Json.fromJsonAsList(String.class, nutMap.getString("caseAuditId")));
List<NutMap> oneAuditRecordList = proposalInfoService.listMap(oneAuditRecordSql);
if (Lang.isNotEmpty(oneAuditRecordList)) {
oneAuditRecordList.forEach(v -> {
try {
v.setv("auditSign", StrUtil.isNotBlank(v.getString("auditSign")) ? getImg(v.getString("auditSign")) : null);
} catch (IOException e) {
e.printStackTrace();
}
if (nutMap.getString("resultCode").equals("determine")) {
v.setv("resultAudit", "经提案工作委员会研究,符合提案立案条件,予以立案,此提案建议由%s办理,%s协办。".formatted(nutMap.getString("under1Unit"), (Strings.isNotBlank(nutMap.getString("under2Unit")) ? nutMap.getString("under2Unit") : "暂无")));
} else if (nutMap.getString("resultCode").equals("opinion")) {
v.setv("resultAudit", "作为意见建议转送参考");
} else {
v.setv("resultAudit", "该提案不予立项,不予立案原因属于以下提案内容");
}
});
}
Sql branchCaseSql = Sqls.create("select auditId from proposal_branch_leader_audit where proposalId = @proposalId AND isMaster=true").setParam("proposalId", proposalId);
String[] branchCaseArray = (String[]) Daos.query(dao(), branchCaseSql.toString(), Sqls.callback.strs());
List<NutMap> replyAuditList = new ArrayList<>();
if (Lang.isNotEmpty(branchCaseArray)) {
Sql replyAuditSql = Sqls.create("""
SELECT
DISTINCT(pa.id),
pa.*,
sign.`data` auditSign,
dict.`name` dictName
FROM
proposal_audit pa
LEFT JOIN sys_signature sign ON sign.id = pa.signId
LEFT JOIN sys_dict dict ON pa.other = dict.`code`
WHERE pa.id in (@ids)
""").setParam("ids", branchCaseArray);
replyAuditList = proposalInfoService.listMap(replyAuditSql);
}
Sql caseUnitRecordSql = Sqls.create("""
SELECT
pa.*,
sign.`data` auditSign
FROM
proposal_audit pa
LEFT JOIN sys_signature sign ON sign.id = pa.signId
where pa.id=@id
""").setParam("id", nutMap.getString("caseUnitAuditId"));
List<NutMap> caseUnitRecordList = proposalInfoService.listMap(caseUnitRecordSql);
if (Lang.isNotEmpty(caseUnitRecordList)) {
caseUnitRecordList.forEach(v -> {
try {
v.setv("auditSign", StrUtil.isNotBlank(v.getString("auditSign")) ? getImg(v.getString("auditSign")) : null);
} catch (IOException e) {
e.printStackTrace();
}
if (nutMap.getString("resultCode").equals("determine")) {
v.setv("resultAudit", "经提案工作委员会研究,符合提案立案条件,予以立案,此提案建议由%s办理,%s协办。".formatted(nutMap.getString("under1Unit"), (Strings.isNotBlank(nutMap.getString("under2Unit")) ? nutMap.getString("under2Unit") : "暂无")));
} else if (nutMap.getString("resultCode").equals("opinion")) {
v.setv("resultAudit", "作为意见建议转送参考");
} else {
v.setv("resultAudit", "该提案不予立项,不予立案原因属于以下提案内容");
}
});
}
Sql undertakeReplySql = Sqls.create("""
SELECT
pr.*,
pu.unitName,
u.username,
u.loginname
FROM
proposal_reply pr
LEFT JOIN proposal_undertake pu ON pu.id = pr.replyUnitId
LEFT JOIN `user` u ON u.id = pr.replyPersonId
WHERE
pr.proposalId = @proposalId
AND pr.undertakeType = 1
and pr.replyPersonId is not null
""").setParam("proposalId", proposalId);
List<NutMap> undertakeReplyList = proposalInfoService.listMap(undertakeReplySql);
if (Lang.isNotEmpty(undertakeReplyList)) {
for (NutMap map : undertakeReplyList) {
if (Strings.isNotBlank(map.getString("implementState"))) {
// if (map.getString("implementState").equals("已经落实")) {
// map.setv("implementState", "(√)已经落实 ()正在落实 ()暂缓落实 ()无法落实");
// } else if (map.getString("implementState").equals("正在落实")) {
// map.setv("implementState", "()已经落实 (√) 正在落实 ()暂缓落实 ()无法落实");
// } else if (map.getString("implementState").equals("暂缓落实")) {
// map.setv("implementState", "()已经落实 () 正在落实 (√)暂缓落实 ()无法落实");
// } else {
// map.setv("implementState", "()已经落实 () 正在落实 ()暂缓落实 (√)无法落实");
// }
}
map.setv("replyContent", Html2Text.toPlainText(map.getString("replyContent")));
}
}
Sql helpundertakeReplySql = Sqls.create("""
SELECT
pr.*,
pu.unitName,
u.username,
u.loginname
FROM
proposal_reply pr
LEFT JOIN proposal_undertake pu ON pu.id = pr.replyUnitId
LEFT JOIN `user` u ON u.id = pr.replyPersonId
WHERE
pr.proposalId = @proposalId
AND pr.undertakeType = 2
and pr.replyPersonId is not null
""").setParam("proposalId", proposalId);
List<NutMap> helpundertakeReplyList = proposalInfoService.listMap(helpundertakeReplySql);
if (Lang.isNotEmpty(helpundertakeReplyList)) {
for (NutMap map : helpundertakeReplyList) {
map.setv("replyContent", Html2Text.toPlainText(map.getString("replyContent")));
}
}
Sql leaderListSql = Sqls.create("""
SELECT
pr.*,
pu.unitName,
u.username,
u.loginname,
sign.`data`
FROM
proposal_reply pr
LEFT JOIN proposal_undertake pu ON pu.id = pr.replyUnitId
LEFT JOIN `user` u ON u.id = pr.leaderId
LEFT JOIN sys_signature sign ON sign.id=pr.leaderSignId
WHERE
pr.proposalId = @proposalId
AND pr.leaderId IS NOT NULL
And pr.undertakeType=1
ORDER BY
pr.undertakeType ASC,
pr.leaderCheckNumber ASC
""").setParam("proposalId", proposalId);
List<NutMap> leaderList = proposalInfoService.listMap(leaderListSql);
if (Lang.isNotEmpty(leaderList)) {
leaderList.forEach(v -> {
v.setv("replyContent", Html2Text.toPlainText(v.getString("replyContent")));
});
}
Sql feedbackSql = Sqls.create("""
SELECT
pf.*,
su.username,
su.loginname,
dict.`name` feedbackResult,
sign.`data` feedbackSign
FROM
proposal_feedback pf
LEFT JOIN sys_user su ON su.id = pf.feedbackPerson
LEFT JOIN sys_dict dict ON dict.`code` = pf.feedbackCode
LEFT JOIN sys_signature sign ON sign.id = pf.scoreSignId
WHERE
pf.proposalId = @proposalId
""").setParam("proposalId", proposalId);
List<NutMap> feedbackList = proposalInfoService.listMap(feedbackSql);
if (Lang.isNotEmpty(feedbackList)) {
for (NutMap map : feedbackList) {
if (map.getString("feedbackResult").equals("满意")) {
map.setv("feedbackResult", "1.满意(√)2.较满意()3.不满意()");
} else if (map.getString("feedbackResult").equals("比较满意")) {
map.setv("feedbackResult", "1.满意()2.较满意(√)3.不满意()");
} else {
map.setv("feedbackResult", "1.满意()2.较满意()3.不满意(√)");
}
map.setv("feedbackOpinion", Html2Text.toPlainText(map.getString("feedbackOpinion")));
}
}
HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
htmlRenderPolicy.getConfig().setShowDefaultTableBorderInTableCell(true);
Configure config = Configure.newBuilder().bind("secondedList", policy).bind("proposal.brief", htmlRenderPolicy).bind("proposal.measures", htmlRenderPolicy).build();
HashMap<String, Object> map = new HashMap<>();
map.put("proposal", nutMap);
map.put("schoolName", Globals.MyConfig.getString("GxName"));
map.put("secondedList", secondedList);
map.put("secondedSignList", secondedSignList);
map.put("delegationAuditList", delegationAuditList);
map.put("replyAuditList", replyAuditList);
map.put("oneAuditRecordList", oneAuditRecordList);
map.put("caseUnitRecordList", caseUnitRecordList);
map.put("undertakeReplyList", undertakeReplyList);
map.put("helpundertakeReplyList", helpundertakeReplyList);
map.put("leaderList", leaderList);
map.put("feedbackList", feedbackList);
XWPFTemplate.compile(officeTemplateUtil.getPath("proposal_info"), config).render(map).writeAndClose(outputStream);
}
private PictureRenderData getImg(String base64) throws IOException {
String s = base64.split(",")[1];
byte[] bytes = Base64.getDecoder().decode(s);
return new PictureRenderData(70, 30, ".png", bytes);
}
}

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