init
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
+306
@@ -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");
|
||||
}
|
||||
|
||||
}
|
||||
+648
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+57
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+227
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+330
@@ -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();
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+141
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+237
@@ -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) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+204
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+131
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+57
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+77
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+176
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+178
@@ -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;
|
||||
}
|
||||
}
|
||||
+50
@@ -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;
|
||||
}
|
||||
}
|
||||
+51
@@ -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));
|
||||
}
|
||||
}
|
||||
+290
@@ -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);
|
||||
}
|
||||
}
|
||||
+116
@@ -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);
|
||||
}
|
||||
}
|
||||
+83
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
+152
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+39
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
+168
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+113
@@ -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);
|
||||
}
|
||||
}
|
||||
+143
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+195
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+334
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+299
@@ -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(" ");
|
||||
sbf.append("<i class='el-icon-user-solid'></i>");
|
||||
sbf.append(StrUtil.isBlank(unitMap.getString("username")) ? "未分配校领导" : unitMap.getString("username"));
|
||||
sbf.append(" ");
|
||||
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;
|
||||
}
|
||||
}
|
||||
+187
@@ -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);
|
||||
}
|
||||
}
|
||||
+153
@@ -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);
|
||||
}
|
||||
}
|
||||
+425
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
+158
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
+89
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+185
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+270
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+201
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
+217
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+137
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+89
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
+423
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+488
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
+197
@@ -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;
|
||||
}
|
||||
}
|
||||
+361
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+259
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
+134
@@ -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);
|
||||
|
||||
|
||||
}
|
||||
+21
@@ -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);
|
||||
|
||||
|
||||
}
|
||||
+156
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
+169
@@ -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);
|
||||
// });
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+158
@@ -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);
|
||||
// });
|
||||
//
|
||||
// }
|
||||
}
|
||||
}
|
||||
+253
@@ -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));
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
+195
@@ -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
Reference in New Issue
Block a user