This commit is contained in:
那些花儿
2025-09-02 15:35:28 +08:00
parent 1531aea1d6
commit 7665726c84
51 changed files with 893 additions and 472 deletions
@@ -11,7 +11,7 @@ import javax.validation.constraints.Positive;
* @Digits注解 验证注解的元素值的整数位数和小数位数上限 ,并且类型为floatdoubleBigDecimal。
*/
@Data
public class PageForm<T> {
public class PageForm {
@NotNull(message = "pageNumber不能为空")
@Min(value = 1, message = "pageNumber最小为1")
@@ -30,8 +30,19 @@ public class PageForm<T> {
private String searchKeyword;
/*======================流程参数==============================*/
/**
* 是否审核
*/
private Boolean audit;
/**
* 业务ID
*/
private String bizId;
public PageForm defaultSort(String column, String order) {
this.setPageOrderName(column);
this.setPageOrderBy(order);
@@ -884,7 +884,6 @@ public interface BaseService<T> {
*/
Pagination listPageMap(Integer pageNumber, int pageSize, Condition cnd);
/**
* DataTable Page
*
@@ -950,4 +949,12 @@ public interface BaseService<T> {
* @return
*/
NutMap data(int length, int start, int draw, Cnd cnd, String linkName);
/**
* 获取Map
* @param sql
* @return
*/
NutMap fetchMap(Sql sql);
}
@@ -1436,4 +1436,12 @@ public class BaseServiceImpl<T> extends EntityService<T> implements BaseService<
re.put("recordsTotal", length);
return re;
}
@Override
public NutMap fetchMap(Sql sql) {
sql.setCallback(Sqls.callback.map());
execute(sql);
NutMap result = (NutMap)sql.getResult();
return result;
}
}
@@ -1,7 +1,6 @@
package com.budwk.app.bpm.param;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.bpm.models.BpmProcessInstance;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -10,7 +9,7 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@ApiModel(description = "流程实例查询参数")
@Data
public class BpmProcessInstancePageForm extends PageForm<BpmProcessInstance> {
public class BpmProcessInstancePageForm extends PageForm {
@ApiModelProperty("流程实例名称")
private String processInstanceName;
@@ -25,7 +25,7 @@ import java.util.Map;
@IocBean
@At("/flow/todoCenter")
@Ok("json:full")
public class FlowTodoCenter {
public class FlowTodoCenterController {
@Inject
private Dao dao;
@@ -44,6 +44,7 @@ public class FlowTodoCenter {
Sql sql = Sqls.create("""
SELECT
t.id AS taskId,
t.taskName AS taskKey,
t.displayName AS taskName,
t.taskState,
t.formKey,
@@ -79,6 +80,7 @@ public class FlowTodoCenter {
Sql sql = Sqls.create("""
SELECT
t.id AS taskId,
t.taskName AS taskKey,
t.displayName AS taskName,
t.taskState,
t.formKey,
@@ -0,0 +1,41 @@
package com.budwk.app.flow.handler;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.exception.BaseException;
import com.budwk.app.flow.engine.AssignmentHandler;
import com.budwk.app.flow.engine.core.Execution;
import com.budwk.app.flow.engine.core.ServiceContext;
import com.budwk.app.flow.engine.model.TaskModel;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import java.util.List;
/**
* 获取协会审批人根据流程变量参数(clubId) 必传
*/
public class FlowClubPresidentByArgsAssignmentHandler implements AssignmentHandler {
@Override
public List<String> assign(TaskModel model, Execution execution) {
String clubId = execution.getArgs().getStr("clubId");
if (StrUtil.isBlank(clubId)) {
throw new BaseException("参数 clubId 不能为空");
}
CommonService commonService = ServiceContext.find(CommonService.class);
List<Sys_user> users = commonService.findUserInfoByRoleCode(Sys_user_role::getClubId, clubId, RoleConstant.CLUB_PRESIDENT);
return users.stream().map(Sys_user::getId).toList();
}
@Override
public String getMessage() {
return "获取协会会长(根据args中的clubId)";
}
@Override
public int getOrder() {
return AssignmentHandler.super.getOrder();
}
}
@@ -0,0 +1,21 @@
package com.budwk.app.flow.listenter;
import com.budwk.app.flow.engine.event.ProcessEvent;
import com.budwk.app.flow.engine.event.ProcessEventListener;
import com.budwk.app.flow.enums.ProcessEventTypeEnum;
import org.nutz.ioc.loader.annotation.IocBean;
/**
* 流程实例开始事件监听器
*/
@IocBean
public class ProcessInstanceStartEventListener implements ProcessEventListener {
@Override
public void onEvent(ProcessEvent event) {
// TODO: 可以对接到学校OA的流程实例进行同步
if (event.getEventType() == ProcessEventTypeEnum.PROCESS_INSTANCE_START) {
Long sourceId = event.getSourceId();
System.out.println("流程实例开始事件:" + sourceId);
}
}
}
@@ -0,0 +1,28 @@
package com.budwk.app.flow.listenter;
import com.budwk.app.flow.engine.event.ProcessEvent;
import com.budwk.app.flow.engine.event.ProcessEventListener;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessEventTypeEnum;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
/**
* 流程任务完成事件监听器
*/
@IocBean
public class ProcessTaskEndEventListener implements ProcessEventListener {
@Inject
private Dao dao;
@Override
public void onEvent(ProcessEvent event) {
if (event.getEventType() == ProcessEventTypeEnum.PROCESS_TASK_END) {
Long sourceId = event.getSourceId();
ProcessTask task = dao.fetch(ProcessTask.class, sourceId);
System.out.println("流程任务完成事件:" + task.getDisplayName());
}
}
}
@@ -0,0 +1,64 @@
package com.budwk.app.flow.listenter;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.event.ProcessEvent;
import com.budwk.app.flow.engine.event.ProcessEventListener;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.entity.ProcessTaskActor;
import com.budwk.app.flow.enums.ProcessEventTypeEnum;
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.json.Json;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* 流程任务开始监听器
*/
@IocBean
public class ProcessTaskStartEventListener implements ProcessEventListener {
@Inject
private Dao dao;
@Override
public void onEvent(ProcessEvent event) {
if (event.getEventType() == ProcessEventTypeEnum.PROCESS_TASK_START) {
Long sourceId = event.getSourceId();
ProcessTask task = dao.fetch(ProcessTask.class, sourceId);
sendMessage( task);
}
}
private void sendMessage(ProcessTask task) {
// 说明是流程开始 用户首次完成任务
if (task.getTaskParentId() == 0 && task.getTaskName().equals("startTask")) {
return;
}
// 节点名称
String taskDisplayName = task.getDisplayName();
// 实例名称
Long instanceId = task.getProcessInstanceId();
ProcessInstance instance = dao.fetch(ProcessInstance.class, instanceId);
String instanceName = Json.fromJson(NutMap.class, instance.getVariable()).getString(FlowConst.PROCESS_INSTANCE_NAME);
// 任务接收人
List<ProcessTaskActor> taskActors = dao.query(ProcessTaskActor.class, Cnd.where(ProcessTaskActor::getProcessTaskId, "=", task.getId()));
for (ProcessTaskActor taskActor : taskActors) {
// 模拟发送消息
String message = StrUtil.format("{}您有一条待办任务,实例:{},任务:{}", taskActor.getActorName(), instanceName, taskDisplayName);
System.out.println(message);
}
}
}
@@ -1,7 +1,6 @@
package com.budwk.app.sys.param;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.sys.models.Sys_user_source;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -10,7 +9,7 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel("用户数据拉取分页参数")
public class SysDataUserPullPageForm extends PageForm<Sys_user_source> {
public class SysDataUserPullPageForm extends PageForm {
@ApiModelProperty("拉取日期")
private String pullTime;
@@ -1,7 +1,6 @@
package com.budwk.app.sys.param;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.sys.views.View_user;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -10,7 +9,7 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel("用户数据更新分页参数")
public class SysDataUserUpdatePageForm extends PageForm<View_user> {
public class SysDataUserUpdatePageForm extends PageForm {
@ApiModelProperty("姓名")
private String userName;
@@ -1,7 +1,6 @@
package com.budwk.app.sys.param;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.sys.models.Sys_home_activity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -10,7 +9,7 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel("系统首页活动管理查询参数")
public class SysHomeActivityPageForm extends PageForm<Sys_home_activity> {
public class SysHomeActivityPageForm extends PageForm {
@ApiModelProperty("活动名称")
private String name;
@@ -5,7 +5,6 @@ import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.models.ActivityDeclareInfo;
import com.budwk.app.zhgh.activity.declarereimbursement.enums.ActivityDeclareReimbursement;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@@ -23,7 +22,7 @@ import org.nutz.dao.util.cri.SqlExpressionGroup;
@Data
@ApiModel("通用分页参数")
@EqualsAndHashCode(callSuper = true)
public class CommonPageParam extends PageForm<ActivityDeclareInfo> {
public class CommonPageParam extends PageForm {
private Integer year;
@@ -114,6 +114,8 @@ public class ArticleClubApprovalController {
} else {
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
cnd.groupBy("t.id");
cnd.desc("t.createdAt");
sql.setCondition(cnd);
Pagination<NutMap> pageVO = articleService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pageVO);
@@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.enums.ProcessInstanceStateEnum;
import com.budwk.app.zhgh.dayofficework.article.param.ArticleInfoPageParam;
import com.budwk.app.zhgh.dayofficework.article.service.ArticleService;
import com.budwk.app.zhgh.dayofficework.article.vo.ArticleInfoPageVO;
@@ -42,15 +43,34 @@ public class ArticleQueryController {
public Result pageData(@Valid ArticleInfoPageParam pageForm) {
Sql sql = Sqls.create("""
SELECT
info.*,
info.id,
info.title,
info.userName,
info.loginName,
info.unitName,
info.unionName,
info.submitTime,
info.origin,
ins.id AS instanceId,
ins.processDefineId instanceProcessDefineId
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime
FROM
article info
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("ins.state","=", ProcessInstanceStateEnum.FINISHED.getCode());
cnd.andEX("YEAR(info.submitTime)", "=", pageForm.getYear());
if (StrUtil.isNotBlank(pageForm.getTitle())) {
cnd.and(Cnd.likeEX("info.title", pageForm.getTitle()));
@@ -65,7 +85,6 @@ public class ArticleQueryController {
}else{
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
cnd.groupBy("info.id");
sql.setCondition(cnd);
Pagination<ArticleInfoPageVO> pageVO = articleService.listPageVO(pageForm, sql, ArticleInfoPageVO.class);
@@ -87,6 +87,7 @@ public class ArticleWriteController {
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, article);
args.set("origin", article.getOrigin());
args.set("clubId",article.getClubId());
ProcessInstance instance = flowEngine.startProcessInstanceByKey("XWTG", article.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务
@@ -109,6 +110,8 @@ public class ArticleWriteController {
Dict dict = Dict.create();
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
dict.set("origin", article.getOrigin());
dict.set("clubId",article.getClubId());
flowCommonService.executeTask(dict);
return Result.success();
}
@@ -1,7 +1,6 @@
package com.budwk.app.zhgh.dayofficework.article.param;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.zhgh.dayofficework.article.models.Article;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -10,7 +9,7 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel(value = "稿件分页查询参数")
public class ArticleInfoPageParam extends PageForm<Article> {
public class ArticleInfoPageParam extends PageForm {
@ApiModelProperty("稿件标题")
private String title;
@@ -58,7 +58,7 @@ public class EvaluateActivityController {
@At
@SaCheckPermission("evaluation.activity")
@ApiOperation("获取评优评先活动列表")
public Result pageData(@Valid PageForm<EvaluateActivity> pageForm, Integer year, String searchKeyword) {
public Result pageData(@Valid PageForm pageForm, Integer year, String searchKeyword) {
Sql sql = Sqls.create("""
SELECT
eva.*,
@@ -1,7 +1,6 @@
package com.budwk.app.zhgh.dayofficework.evaluation.vo;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.zhgh.dayofficework.evaluation.models.EvaluateApply;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -10,7 +9,7 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@ApiModel("评优评先分页参数")
@Data
public class EvaluatePageForm extends PageForm<EvaluateApply> {
public class EvaluatePageForm extends PageForm {
@ApiModelProperty("年度")
private Integer year;
@@ -13,7 +13,7 @@ import lombok.EqualsAndHashCode;
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class GrassrootsCongressPageForm extends PageForm<GrassrootsCongressPageForm> {
public class GrassrootsCongressPageForm extends PageForm {
private Integer year;
@@ -10,6 +10,7 @@ import com.budwk.app.zhgh.democratic.proposal.service.ProposalExportService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
@@ -48,7 +49,34 @@ public class ProposalExportComprehensiveController {
@SaCheckPermission("proposal.query.comprehensive")
@ApiOperation(value = "分页列表")
public Result pageData(@Valid @Param("pageForm") ProposalQueryComprehensiveParam pageForm) {
Sql sql = proposalExportService.exportComprehensiveSql(pageForm);
Sql sql = Sqls.create("""
SELECT
info.*,
COUNT(p.consolidationIds) > 0 AS isConsolidation,
type.name AS typeName,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.displayName curTaskName,
JSON_UNQUOTE(JSON_EXTRACT(caseTasks.variable, '$.tf_hostUnitName')) AS masterUnitName,
caseTasks.variable->>'$.tf_helpUnitNameStr' AS slaveUnitNames
FROM
proposal_info info
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
LEFT JOIN proposal_type type on type.id = info.typeId
LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId
LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId
LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
LEFT JOIN (SELECT processInstanceId, MAX(finishTime) AS finishTime FROM wf_process_task WHERE taskName = '9846ab38-40c5-4093-bafc-a9b3b443338b' AND taskState = 20 GROUP BY processInstanceId) latestTasks ON latestTasks.processInstanceId = ins.id
LEFT JOIN wf_process_task caseTasks ON caseTasks.processInstanceId = ins.id AND caseTasks.taskName = '9846ab38-40c5-4093-bafc-a9b3b443338b' AND caseTasks.taskState = 20 AND caseTasks.finishTime = latestTasks.finishTime
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
$condition
""");
Cnd cnd = Cnd.NEW();
ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm);
cnd.groupBy("info.id");
@@ -60,10 +88,10 @@ public class ProposalExportComprehensiveController {
@At
@Ok("void")
@ApiOperation("导出提案汇总表excel")
@ApiOperation("导出汇总表excel")
@SaCheckPermission("proposal.query.comprehensive")
public void exportProposalSummaryAsExcel(@Valid @Param("pageForm") ProposalQueryComprehensiveParam pageForm, HttpServletResponse response){
proposalExportService.exportProposalSummaryAsExcel(pageForm, response);
public void exportSummaryAsExcel(@Valid @Param("pageForm") ProposalQueryComprehensiveParam pageForm, HttpServletResponse response){
proposalExportService.exportSummaryAsExcel(pageForm, response);
}
@@ -91,4 +119,12 @@ public class ProposalExportComprehensiveController {
proposalExportService.exportFeedBackAsZip(pageForm, response);
}
@At
@Ok("void")
@ApiOperation("导出征集表ZIP")
@SaCheckPermission("proposal.query.comprehensive")
public void exportCollectZip(@Valid @Param("pageForm") ProposalQueryComprehensiveParam pageForm, HttpServletResponse response){
proposalExportService.exportCollectZip(pageForm, response);
}
}
@@ -60,7 +60,7 @@ public class ProposalQueryComprehensiveController {
ins.processDefineId instanceProcessDefineId,
t.displayName curTaskName,
JSON_UNQUOTE(JSON_EXTRACT(caseTasks.variable, '$.tf_hostUnitName')) AS masterUnitName,
JSON_EXTRACT(caseTasks.variable, '$.tf_helpUnitNames') AS slaveUnitNames
caseTasks.variable->>'$.tf_helpUnitNameStr' AS slaveUnitNames
FROM
proposal_info info
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
@@ -53,7 +53,7 @@ public class ProposalQueryHistoryController {
ins.processDefineId instanceProcessDefineId,
t.displayName curTaskName,
JSON_UNQUOTE(JSON_EXTRACT(caseTasks.variable, '$.tf_hostUnitName')) AS masterUnitName,
JSON_EXTRACT(caseTasks.variable, '$.tf_helpUnitNames') AS slaveUnitNames
caseTasks.variable->>'$.tf_helpUnitNameStr' AS slaveUnitNames
FROM
proposal_info info
LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id))
@@ -91,11 +91,12 @@ public class ProposalQueryUnitReplyController {
for (String underTakeId : underTakeIds) {
NutMap tableRow = NutMap.NEW();
tableRow.put("id", underTakeId);
if(undertakeMap.get(underTakeId) == null){
continue;
}
tableRow.put("name", undertakeMap.get(underTakeId).getName());
//找出承办提案总数
// long sum = caseTasks.stream().filter(v -> (Json.fromJson(NutMap.class, v.getVariable())).getString("tf_hostUnitId").equals(underTakeId) || (Json.fromJson(NutMap.class, v.getVariable())).getAsList("helpUnitIds", String.class).contains(underTakeId)).map(ProcessTask::getProcessInstanceId).collect(Collectors.toSet()).size();
long sum = caseTasks.stream()
.filter(v -> {
NutMap variable = Json.fromJson(NutMap.class, v.getVariable());
@@ -115,17 +116,22 @@ public class ProposalQueryUnitReplyController {
.distinct()
.count();
//找出主办提案数量
// 主办提案数量
long hostSum = masterUnitTasks.stream().map(v -> Json.fromJson(NutMap.class, v.getVariable())).filter(variable -> underTakeId.equals(variable.getString("unitId")) && variable.getBoolean("isMaster")).count();
//主办已答复的数量
// 主办已答复的数量
long hostReplySum = masterUnitTasks.stream().filter(v -> Objects.equals(v.getTaskState(), ProcessTaskStateEnum.FINISHED.getCode())).map(v -> Json.fromJson(NutMap.class, v.getVariable())).filter(variable -> underTakeId.equals(variable.getString("unitId")) && variable.getBoolean("isMaster")).count();
//主办未答复的数量
// 主办未答复的数量
long hostNoReplySum = hostSum - hostReplySum;
// 协办提案数量
long slaveSum = slaveUnitTasks.stream().map(v -> Json.fromJson(NutMap.class, v.getVariable())).filter(variable -> underTakeId.equals(variable.getString("unitId")) && !variable.getBoolean("isMaster")).count();
tableRow.put("sum", sum);
tableRow.put("hostSum", hostSum);
tableRow.put("hostReplySum", hostReplySum);
tableRow.put("hostNoReplySum", hostNoReplySum);
tableRow.put("slaveSum", slaveSum);
// if (slaveNeedReply) {
// //协办提案数量
@@ -112,6 +112,11 @@ public class ProposalInfo extends BaseModel {
@ColDefine(type = ColType.TEXT)
private String excerpt;
@Column
@Comment("调研情况")
@ColDefine(type = ColType.TEXT)
private String researchFindings;
@Column
@Comment("案由")
@ColDefine(type = ColType.TEXT)
@@ -3,7 +3,6 @@ package com.budwk.app.zhgh.democratic.proposal.param;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.Cnd;
@@ -13,7 +12,7 @@ import org.nutz.dao.Cnd;
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class ProposalSearchParam extends PageForm<ProposalInfo> {
public class ProposalSearchParam extends PageForm {
private String name;
private String code;
@@ -6,6 +6,7 @@ import com.budwk.app.zhgh.democratic.proposal.param.ProposalQueryComprehensivePa
import org.nutz.dao.sql.Sql;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
/**
* @version 1.0
@@ -18,6 +19,7 @@ public interface ProposalExportService extends BaseService<ProposalInfo> {
/**
* 某些页面的公共SQL,用于导出或者综合查询
*
* @param pageForm
* @return
*/
@@ -25,13 +27,15 @@ public interface ProposalExportService extends BaseService<ProposalInfo> {
/**
* 导出提案汇总表excel
*
* @param pageForm
* @param response
*/
void exportProposalSummaryAsExcel(ProposalQueryComprehensiveParam pageForm, HttpServletResponse response);
void exportSummaryAsExcel(ProposalQueryComprehensiveParam pageForm, HttpServletResponse response);
/**
* 导出提案立案汇总表excel
*
* @param pageForm
* @param response
*/
@@ -39,6 +43,7 @@ public interface ProposalExportService extends BaseService<ProposalInfo> {
/**
* 导出提案统计表zip
*
* @param pageForm
* @param response
*/
@@ -46,8 +51,25 @@ public interface ProposalExportService extends BaseService<ProposalInfo> {
/**
* 导出反馈表
*
* @param pageForm
* @param response
*/
void exportFeedBackAsZip(ProposalQueryComprehensiveParam pageForm, HttpServletResponse response);
/**
* 导出征集表docx
* @param id
* @param byteArrayOutputStream
*/
void exportCollectDocx(String id, ByteArrayOutputStream byteArrayOutputStream);
/**
* 导出征集表zip
*
* @param pageForm
* @param response
*/
void exportCollectZip(ProposalQueryComprehensiveParam pageForm, HttpServletResponse response);
}
@@ -32,6 +32,14 @@ public interface ProposalCommonService extends BaseService<ProposalInfo> {
*/
void exportProposalFeedBackAsDocx(String id,ByteArrayOutputStream byteArrayOutputStream);
/**
* 导出征集表
* @param id
* @param byteArrayOutputStream
*/
void exportCollectAsDocx(String id, ByteArrayOutputStream byteArrayOutputStream);
/**
* 根据提案id查询团长
*
@@ -18,11 +18,17 @@ import com.budwk.app.bpm.models.BpmProcessTask;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.bpm.vo.BpmProcessTaskVo;
import com.budwk.app.bpm.vo.BpmTaskApprovalRecordVo;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessInstanceStateEnum;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.sys.models.Sys_role;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.sys.services.SysRoleService;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.commons.base.Globals;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalConsolidation;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import com.budwk.app.zhgh.democratic.teachercongress.prepare.models.Teacher_congress_session;
@@ -204,187 +210,6 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl<ProposalInfo> imp
docData.put("info", info);
//查询附议人信息
BpmProcessInstance bpmProcessInstance = dao().fetch(BpmProcessInstance.class, Cnd.where(BpmProcessInstance::getProcessInstanceBusinessId, "=", id));
BpmProcessTask lastestWriteTask = dao().fetch(BpmProcessTask.class, Cnd.where(BpmProcessTask::getProcessInstanceId, "=", bpmProcessInstance.getId())
.and(BpmProcessTask::getTaskStatus, "=", BpmProcessTaskStatusEnum.COMPLETE.name())
.and(BpmProcessTask::getProcessTaskNodeCode, "=", 10)
.and(BpmProcessTask::getDelFlag, "=", 0)
.desc(BpmProcessTask::getEndOn)
);
if (ObjectUtil.isNotEmpty(lastestWriteTask)) {
String lastestWriteTaskId = lastestWriteTask.getId();
List<BpmProcessTask> seconderTasks = dao().query(BpmProcessTask.class, Cnd.where(BpmProcessTask::getPrevTaskId, "=", lastestWriteTaskId)
.and(BpmProcessTask::getProcessInstanceId, "=", bpmProcessInstance.getId())
.and(BpmProcessTask::getTaskStatus, "!=", BpmProcessTaskStatusEnum.REVOKE.name())
.and(BpmProcessTask::getDelFlag, "=", 0)
.asc(BpmProcessTask::getCreatedOn)
);
List<HashMap<String, Object>> seconders = seconderTasks.stream().filter(v -> v.getTaskStatus().equals(BpmProcessTaskStatusEnum.COMPLETE.name()) && ObjectUtil.isNotEmpty(v.getExtVariable().getStr("bpmTaskApprovalType").equals("PASS"))).map(v -> {
HashMap<String, Object> seconderApproval = new HashMap<>();
seconderApproval.put("userName", v.getCreateVariable().getStr("userName"));
seconderApproval.put("loginName", v.getCreateVariable().getStr("loginName"));
seconderApproval.put("unitName", v.getCreateVariable().getStr("unitName"));
return seconderApproval;
}).toList();
docData.put("seconders", seconders);
}
//审批记录
List<BpmTaskApprovalRecordVo> nodeTasks = bpmService.getNodeTasks(BpmProcessConstant.PROPOSAL, id);
//团长审核
nodeTasks.stream().filter(v -> v.getNodeCode() == 30)
.flatMap(v -> v.getTasks().stream())
.max(Comparator.comparing(BpmProcessTaskVo::getEndOn))
.ifPresent(v -> {
HashMap<String, Object> delegationApproval = new HashMap<>();
delegationApproval.put("date", DateUtil.format(v.getEndOn(), "yyyy年MM月dd日"));
delegationApproval.put("user", v.getActualOwnerUserName());
if (ObjectUtil.isNotEmpty(v.getExtVariable())) {
delegationApproval.put("opinion", v.getExtVariable().getStr("approvalOpinion"));
delegationApproval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(v.getExtVariable().getStr("approvalSignature")));
}
docData.put("tz", delegationApproval);
});
//委员会立案
nodeTasks.stream().filter(v -> v.getNodeCode() == 60)
.flatMap(v -> v.getTasks().stream())
.max(Comparator.comparing(BpmProcessTaskVo::getEndOn))
.ifPresent(v -> {
HashMap<String, Object> committeeApproval = new HashMap<>();
committeeApproval.put("date", DateUtil.format(v.getEndOn(), "yyyy年MM月dd日"));
committeeApproval.put("user", v.getActualOwnerUserName());
if (ObjectUtil.isNotEmpty(v.getExtVariable())) {
committeeApproval.put("opinion", v.getExtVariable().getStr("approvalOpinion"));
committeeApproval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(v.getExtVariable().getStr("approvalSignature")));
committeeApproval.put("hostUnit", v.getExtVariable().getStr("hostUnit"));
if (ObjectUtil.isNotEmpty(v.getExtVariable().getBeanList("helpUnits", String.class))) {
committeeApproval.put("helpUnits", String.join("", v.getExtVariable().getBeanList("helpUnits", String.class)));
}
}
docData.put("wyh", committeeApproval);
});
//委员会确认承办单位
nodeTasks.stream().filter(v -> v.getNodeCode() == 70)
.flatMap(v -> v.getTasks().stream())
.max(Comparator.comparing(BpmProcessTaskVo::getEndOn))
.ifPresent(v -> {
HashMap<String, Object> committeeConfirm = new HashMap<>();
committeeConfirm.put("date", DateUtil.format(v.getEndOn(), "yyyy年MM月dd日"));
committeeConfirm.put("user", v.getActualOwnerUserName());
if (ObjectUtil.isNotEmpty(v.getExtVariable())) {
committeeConfirm.put("opinion", v.getExtVariable().getStr("approvalOpinion"));
committeeConfirm.put("sign", sysOfficeTemplateUtil.createPictureRenderData(v.getExtVariable().getStr("approvalSignature")));
committeeConfirm.put("hostUnit", v.getExtVariable().getStr("hostUnit"));
if (ObjectUtil.isNotEmpty(v.getExtVariable().getBeanList("helpUnits", String.class))) {
committeeConfirm.put("helpUnits", String.join("", v.getExtVariable().getBeanList("helpUnits", String.class)));
}
}
docData.put("wyhConfirm", committeeConfirm);
});
//主办单位答复
nodeTasks.stream().filter(v -> v.getNodeCode() == 80)
.flatMap(v -> v.getTasks().stream())
.filter(v1 -> ObjectUtil.isNotEmpty(v1.getCreateVariable()) && v1.getCreateVariable().getBool("isMaster"))
.max(Comparator.comparing(BpmProcessTaskVo::getEndOn))
.ifPresent(v -> {
HashMap<String, Object> masterUnderTakeReply = new HashMap<>();
masterUnderTakeReply.put("name", v.getCreateVariable().getStr("underTakeName"));
masterUnderTakeReply.put("date", DateUtil.format(v.getEndOn(), "yyyy年MM月dd日"));
masterUnderTakeReply.put("user", v.getActualOwnerUserName());
if (ObjectUtil.isNotEmpty(v.getExtVariable())) {
masterUnderTakeReply.put("opinion", v.getExtVariable().getStr("approvalOpinion"));
masterUnderTakeReply.put("implementState", v.getExtVariable().getStr("implementState"));
masterUnderTakeReply.put("sign", sysOfficeTemplateUtil.createPictureRenderData(v.getExtVariable().getStr("approvalSignature")));
}
docData.put("zbdf", masterUnderTakeReply);
});
//协办单位答复
List<HashMap<String, Object>> slaveUnderTakeReplyList = new ArrayList<>();
nodeTasks.stream().filter(v -> v.getNodeCode() == 80).flatMap(v -> v.getTasks().stream())
.filter(v1 -> ObjectUtil.isNotEmpty(v1.getCreateVariable()) && !v1.getCreateVariable().getBool("isMaster"))
.collect(Collectors.groupingBy(v1 -> v1.getCreateVariable().getStr("underTakeId")))
.forEach((k, v1) -> {
v1.stream().max(Comparator.comparing(BpmProcessTask::getEndOn)).ifPresent(v2 -> {
HashMap<String, Object> slaveUnderTakeReply = new HashMap<>();
slaveUnderTakeReply.put("name", v2.getCreateVariable().getStr("underTakeName"));
slaveUnderTakeReply.put("date", DateUtil.format(v2.getEndOn(), "yyyy年MM月dd日"));
slaveUnderTakeReply.put("user", v2.getActualOwnerUserName());
if (ObjectUtil.isNotEmpty(v2.getExtVariable())) {
slaveUnderTakeReply.put("opinion",HtmlUtil.cleanHtmlTag(StrUtil.blankToDefault(v2.getExtVariable().getStr("approvalOpinion"), "")));
slaveUnderTakeReply.put("implementState", v2.getExtVariable().getStr("implementState"));
slaveUnderTakeReply.put("sign", sysOfficeTemplateUtil.createPictureRenderData(v2.getExtVariable().getStr("approvalSignature")));
}
slaveUnderTakeReplyList.add(slaveUnderTakeReply);
});
});
docData.put("xbdf", slaveUnderTakeReplyList);
//主办校领导审批
nodeTasks.stream().filter(v -> v.getNodeCode() == 90)
.flatMap(v -> v.getTasks().stream())
.filter(v1 -> ObjectUtil.isNotEmpty(v1.getCreateVariable()) && v1.getCreateVariable().getBool("isMaster"))
.max(Comparator.comparing(BpmProcessTaskVo::getEndOn))
.ifPresent(v -> {
HashMap<String, Object> masterLeaderApproval = new HashMap<>();
masterLeaderApproval.put("date", DateUtil.format(v.getEndOn(), "yyyy年MM月dd日"));
masterLeaderApproval.put("user", v.getActualOwnerUserName());
if (ObjectUtil.isNotEmpty(v.getExtVariable())) {
masterLeaderApproval.put("opinion", v.getExtVariable().getStr("approvalOpinion"));
masterLeaderApproval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(v.getExtVariable().getStr("approvalSignature")));
}
docData.put("zbldsp", masterLeaderApproval);
});
List<HashMap<String, Object>> slaveLeaderApprovalList = new ArrayList<>();
//协办校领导审批
nodeTasks.stream().filter(v -> v.getNodeCode() == 90).flatMap(v -> v.getTasks().stream())
.filter(v1 -> ObjectUtil.isNotEmpty(v1.getCreateVariable()) && !v1.getCreateVariable().getBool("isMaster"))
.collect(Collectors.groupingBy(v1 -> v1.getCreateVariable().getStr("underTakeId")))
.forEach((k, v1) -> {
v1.stream().max(Comparator.comparing(BpmProcessTask::getEndOn)).ifPresent(v2 -> {
HashMap<String, Object> slaveLeaderApproval = new HashMap<>();
slaveLeaderApproval.put("name", v2.getCreateVariable().getStr("underTakeName"));
slaveLeaderApproval.put("date", DateUtil.format(v2.getEndOn(), "yyyy年MM月dd日"));
slaveLeaderApproval.put("user", v2.getActualOwnerUserName());
if (ObjectUtil.isNotEmpty(v2.getExtVariable())) {
slaveLeaderApproval.put("opinion", v2.getExtVariable().getStr("approvalOpinion"));
slaveLeaderApproval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(v2.getExtVariable().getStr("approvalSignature")));
}
slaveLeaderApprovalList.add(slaveLeaderApproval);
});
});
docData.put("xbldsp", slaveLeaderApprovalList);
//反馈评分
nodeTasks.stream().filter(v -> v.getNodeCode() == 100)
.flatMap(v -> v.getTasks().stream())
.max(Comparator.comparing(BpmProcessTaskVo::getEndOn))
.ifPresent(v -> {
HashMap<String, Object> feedbackScore = new HashMap<>();
feedbackScore.put("date", DateUtil.format(v.getEndOn(), "yyyy年MM月dd日"));
feedbackScore.put("user", v.getActualOwnerUserName());
if (ObjectUtil.isNotEmpty(v.getExtVariable())) {
feedbackScore.put("opinion", v.getExtVariable().getStr("approvalOpinion"));
String feedBackScore = v.getExtVariable().getStr("feedBackScore", "");
feedbackScore.put("manyi", feedBackScore.equals("满意") ? "" : "");
feedbackScore.put("jibenmanyi", feedBackScore.equals("基本满意") ? "" : "");
feedbackScore.put("bumanyi", feedBackScore.equals("不满意") ? "" : "");
}
docData.put("fk", feedbackScore);
});
AttachmentRenderData attachmentRenderData = Attachments.ofLocal("C:\\Users\\zxy\\Desktop\\1.七届二次教代会提案反馈表(xxx部门).docx").create();
docData.put("attachment", attachmentRenderData);
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
htmlRenderPolicy.getConfig().setShowDefaultTableBorderInTableCell(true);
@@ -517,6 +342,80 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl<ProposalInfo> imp
}
}
@Override
public void exportCollectAsDocx(String id, ByteArrayOutputStream byteArrayOutputStream) {
if (id == null || id.isEmpty()) {
throw new BaseException("提案信息不存在");
}
//基本信息
Sql sql = Sqls.create("""
SELECT
info.name,
info.code,
info.researchFindings,
info.brief,
info.measures,
info.createUserName,
tcde.unitName,
tcde.mobile,
type.name AS typeName,
tcs.j,
tcs.c,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName
FROM
proposal_info info
LEFT JOIN proposal_type type on type.id = info.typeId
LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId
LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId
LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName
WHERE info.id = @id
""").setParam("id", id);
sql.setCallback(Sqls.callback.map());
execute(sql);
NutMap info = (NutMap) sql.getResult();
HashMap<String, Object> docData = new HashMap<>(info);
//处理下富文本
String brief = info.getString("brief");
String measures = info.getString("measures");
info.put("brief", sysOfficeTemplateUtil.convertRichTextToDocText(brief));
info.put("measures", sysOfficeTemplateUtil.convertRichTextToDocText(measures));
// 高校
info.put("schoolName", Globals.AppName);
// 附议人信息
ProcessInstance instance = dao().fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", id));
// 查询附议人信息
ProcessTask inviteTask = dao().fetch(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", instance.getId())
.and(ProcessTask::getTaskName, "=", "85b7b9bd-d706-48cb-99a1-ef1370fb1819")
.and(ProcessTask::getTaskState, "in", List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode()))
.desc(ProcessTask::getCreatedAt));
NutMap variable = Json.fromJson(NutMap.class, inviteTask.getVariable());
List<NutMap> seconders = variable.getAsList(FlowConst.TASK_FORM_DATA_PREFIX + "seconder", NutMap.class);
docData.put("seconders", seconders);
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
htmlRenderPolicy.getConfig().setShowDefaultTableBorderInTableCell(true);
Configure config = Configure.builder()
.bind("seconders", policy)
.bind("brief", htmlRenderPolicy)
.bind("measures", htmlRenderPolicy)
.build();
try {
XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("proposal"), config).render(docData).writeAndClose(byteArrayOutputStream);
} catch (IOException e) {
log.error("提案导出失败{},提案id:{}", e.getMessage(), id);
}
}
@Override
public String getDelegationHeadByProposalId(String proposalId) {
ProposalInfo proposalInfo = dao().fetch(ProposalInfo.class, proposalId);
@@ -8,40 +8,52 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HtmlUtil;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.base.utils.SysOfficeTemplateUtil;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.base.Globals;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalQueryComprehensiveParam;
import com.budwk.app.zhgh.democratic.proposal.service.ProposalExportService;
import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService;
import com.budwk.app.zhgh.democratic.teachercongress.prepare.models.Teacher_congress_session;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
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.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 javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* @version 1.0
* @Author zzr
* @nameProposalExportServiceImpl
* @Date 2024/10/10 10:28
* @注释
*/
@IocBean(args = {"refer:dao"})
@Slf4j
public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> implements ProposalExportService {
@Inject
private ProposalCommonService proposalCommonService;
@Inject
private SysOfficeTemplateUtil sysOfficeTemplateUtil;
public ProposalExportServiceImpl(Dao dao) {
super(dao);
@@ -139,37 +151,77 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
}
@Override
public void exportProposalSummaryAsExcel(ProposalQueryComprehensiveParam pageForm, HttpServletResponse response) {
// 自定义导出 excel
Sql sql = exportComprehensiveSql(pageForm);
public void exportSummaryAsExcel(ProposalQueryComprehensiveParam pageForm, HttpServletResponse response) {
// 基本信息查询
Sql sql = Sqls.create("""
SELECT
info.id,
info.name,
info.code,
info.researchFindings,
info.brief,
info.measures,
info.createUserName,
tcde.unitName,
tcde.mobile,
type.name AS typeName,
tcs.j,
tcs.c,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName
FROM
proposal_info info
LEFT JOIN proposal_type type on type.id = info.typeId
LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId
LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId
LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName
$condition
""");
Cnd cnd = Cnd.NEW();
ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm);
cnd.groupBy("info.id");
sql.setCondition(cnd);
// 导出的数据
List<NutMap> list = listMap(sql);
for (NutMap row : list) {
String content = HtmlUtil.cleanHtmlTag(StrUtil.blankToDefault(row.getString("masterUnderTakeReply"), ""));
row.put("masterUnderTakeReply", content);
// 添加序号,去除富文本,获取附议人
for (int i = 0; i < list.size(); i++) {
list.get(i).put("index", i + 1);
list.get(i).put("brief",HtmlUtil.cleanHtmlTag(list.get(i).getString("brief")));
list.get(i).put("measures",HtmlUtil.cleanHtmlTag(list.get(i).getString("measures")));
// 流程实例
ProcessInstance instance = dao().fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", list.get(i).getString("id")));
// 查询附议人信息
ProcessTask inviteTask = dao().fetch(ProcessTask.class,
Cnd.where(ProcessTask::getProcessInstanceId, "=", instance.getId())
.and(ProcessTask::getTaskName, "=", "85b7b9bd-d706-48cb-99a1-ef1370fb1819")
.and(ProcessTask::getTaskState, "in",
List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode()))
.desc(ProcessTask::getCreatedAt));
if (inviteTask != null) {
NutMap variable = Json.fromJson(NutMap.class, inviteTask.getVariable());
List<NutMap> seconders = variable.getAsList(FlowConst.TASK_FORM_DATA_PREFIX + "seconder", NutMap.class);
list.get(i).put("secondedUserNames", seconders.stream().map(v->v.getString("userName")).collect(Collectors.joining(",")));
}
}
List<ExcelExportEntity> exportEntities = new ArrayList<>();
exportEntities.add(new ExcelExportEntity("序号", "index", 10));
exportEntities.add(new ExcelExportEntity("提案编号", "code", 20));
exportEntities.add(new ExcelExportEntity("提案名称", "name", 20));
exportEntities.add(new ExcelExportEntity("提案类别", "typeName", 20));
exportEntities.add(new ExcelExportEntity("提案摘要", "excerpt", 100));
exportEntities.add(new ExcelExportEntity("单位", "unitName", 20));
exportEntities.add(new ExcelExportEntity("提案案由", "brief", 40));
exportEntities.add(new ExcelExportEntity("代表调研情况", "researchFindings", 40));
exportEntities.add(new ExcelExportEntity("代表建议措施", "measures", 40));
exportEntities.add(new ExcelExportEntity("提案人", "createUserName", 20));
exportEntities.add(new ExcelExportEntity("附议人", "secondedUserNames", 40));
exportEntities.add(new ExcelExportEntity("立案结果", "caseFilingResultName", 20));
exportEntities.add(new ExcelExportEntity("主办单位", "masterUnderTakeName", 20));
exportEntities.add(new ExcelExportEntity("办单位", "slaveUnderTakeNamesStr", 30));
exportEntities.add(new ExcelExportEntity("承办单位答复", "masterUnderTakeReply", 30));
exportEntities.add(new ExcelExportEntity("备注", "remark", 30));
exportEntities.add(new ExcelExportEntity("提案状态", "processInstanceNodeName", 20));
exportEntities.add(new ExcelExportEntity("提案人电话", "mobile", 20));
exportEntities.add(new ExcelExportEntity("附议人(两名)", "secondedUserNames", 20));
exportEntities.add(new ExcelExportEntity("提案单位", "unitName", 20));
exportEntities.add(new ExcelExportEntity("拟交办单位", "", 20));
Teacher_congress_session session = dao().fetch(Teacher_congress_session.class, pageForm.getSessionId());
String title = StrUtil.format("第{}届教职工代表大会第{}次会议提案汇总表", session.getJ(), session.getC());
String title = StrUtil.format("{}第{}{}教代会提案征集汇总表", Globals.AppName, session.getJ(), session.getC());
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
@@ -324,6 +376,129 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void exportCollectDocx(String id, ByteArrayOutputStream byteArrayOutputStream) {
// 基本信息查询
Sql sql = Sqls.create("""
SELECT
info.name,
info.code,
info.researchFindings,
info.brief,
info.measures,
info.createUserName,
tcde.unitName,
tcde.mobile,
type.name AS typeName,
tcs.j,
tcs.c,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName
FROM
proposal_info info
LEFT JOIN proposal_type type on type.id = info.typeId
LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId
LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId
LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName
WHERE info.id = @id
""").setParam("id", id);
sql.setCallback(Sqls.callback.map());
execute(sql);
NutMap info = (NutMap) sql.getResult();
// 处理富文本内容
info.put("brief", sysOfficeTemplateUtil.convertRichTextToDocText(info.getString("brief")));
info.put("measures", sysOfficeTemplateUtil.convertRichTextToDocText(info.getString("measures")));
// 添加高校信息
info.put("schoolName", Globals.AppName);
// 创建docData直接复用info中的数据
HashMap<String, Object> docData = new HashMap<>(info);
// 流程实例
ProcessInstance instance = dao().fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", id));
if (instance != null) {
// 查询附议人信息
ProcessTask inviteTask = dao().fetch(ProcessTask.class,
Cnd.where(ProcessTask::getProcessInstanceId, "=", instance.getId())
.and(ProcessTask::getTaskName, "=", "85b7b9bd-d706-48cb-99a1-ef1370fb1819")
.and(ProcessTask::getTaskState, "in",
List.of(ProcessTaskStateEnum.DOING.getCode(), ProcessTaskStateEnum.FINISHED.getCode()))
.desc(ProcessTask::getCreatedAt));
if (inviteTask != null) {
NutMap variable = Json.fromJson(NutMap.class, inviteTask.getVariable());
if (variable != null) {
List<NutMap> seconders = variable.getAsList(FlowConst.TASK_FORM_DATA_PREFIX + "seconder", NutMap.class);
docData.put("seconders", seconders != null ? seconders : Collections.emptyList());
}
}
}
// 配置渲染策略
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
htmlRenderPolicy.getConfig().setShowDefaultTableBorderInTableCell(true);
Configure config = Configure.builder()
.bind("seconders", policy)
.bind("brief", htmlRenderPolicy)
.bind("measures", htmlRenderPolicy)
.build();
try {
XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("proposal_collect"), config)
.render(docData)
.writeAndClose(byteArrayOutputStream);
} catch (IOException e) {
log.error("提案导出失败,提案id:{},错误信息:{}", id, e.getMessage());
}
}
@Override
public void exportCollectZip(ProposalQueryComprehensiveParam pageForm, HttpServletResponse response) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.code,
info.name
FROM
proposal_info info
LEFT JOIN proposal_type type on type.id = info.typeId
LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId
LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId
LEFT JOIN teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName
$condition
""");
Cnd cnd = Cnd.NEW();
ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm);
sql.setCondition(cnd);
List<NutMap> list = listMap(sql);
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ZipOutputStream zipOutputStream = new ZipOutputStream(bos);
for (NutMap proposalRow : list) {
try (ByteArrayOutputStream docxByteArrayOutputStream = new ByteArrayOutputStream()) {
exportCollectDocx(proposalRow.getString("id"), docxByteArrayOutputStream);
ZipEntry zipEntry = new ZipEntry("征集表-" + proposalRow.getString("code") + "-" + proposalRow.getString("name") + ".docx");
zipOutputStream.putNextEntry(zipEntry);
docxByteArrayOutputStream.writeTo(zipOutputStream);
zipOutputStream.closeEntry();
} catch (IOException e) {
// 处理单个文件生成失败的情况
e.printStackTrace();
}
}
zipOutputStream.close();
CommonDownloadUtil.download("提案征集表压缩包.zip", bos.toByteArray(), response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -3,7 +3,6 @@ package com.budwk.app.zhgh.democratic.suggestion.param;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.zhgh.democratic.suggestion.models.SuggestionInfo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.Cnd;
@@ -13,7 +12,7 @@ import org.nutz.dao.Cnd;
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class SuggestionSearchParam extends PageForm<SuggestionInfo> {
public class SuggestionSearchParam extends PageForm {
private String name;
private String code;
@@ -10,6 +10,7 @@ import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.democratic.suggestionBox.service.SuggestionBoxService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
@@ -18,7 +19,9 @@ import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.List;
@IocBean
@@ -39,7 +42,7 @@ public class SuggestionXghController {
@At
@SaCheckLogin
public Result pageData(PageForm pageForm, String title, Integer year, boolean approval) {
public Result pageData(PageForm pageForm, String taskId, String title, Integer year, boolean approval) {
Sql sql = Sqls.create("""
SELECT
info.id,
@@ -99,5 +102,46 @@ public class SuggestionXghController {
return Result.success(pageVO);
}
@At
@SaCheckLogin
@ApiOperation("查询任务")
public Result queryTask(@Valid @Param("taskId") String taskId) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.title,
info.userName,
info.loginName,
info.unitName,
info.unionName,
info.submitTime,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke
FROM
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN suggestion_box info ON info.id = ins.businessNo
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10
LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10
WHERE t.id = @taskId
""");
sql.setParam("taskId", taskId);
NutMap data = suggestionBoxService.fetchMap(sql);
return Result.success(data);
}
}
@@ -5,7 +5,6 @@ import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.staffbenefit.difficulthelp.models.DifficultHelpInfo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.Cnd;
@@ -23,7 +22,7 @@ import java.util.List;
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class DifficultHelpPageParam extends PageForm<DifficultHelpInfo> {
public class DifficultHelpPageParam extends PageForm {
private String year;
@@ -2,7 +2,6 @@ package com.budwk.app.zhgh.staffmanage.member.param.pageform;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.Cnd;
@@ -17,7 +16,7 @@ import org.nutz.dao.util.cri.SqlExpressionGroup;
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class MemberApplyPageForm extends PageForm<MemberApplyRecord> {
public class MemberApplyPageForm extends PageForm {
private String unionId;
@@ -2,7 +2,6 @@ package com.budwk.app.zhgh.staffmanage.member.param.pageform;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.zhgh.staffmanage.member.models.MemberChangeRecord;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -18,7 +17,7 @@ import org.nutz.dao.util.cri.SqlExpressionGroup;
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class MemberChangePageForm extends PageForm<MemberChangeRecord> {
public class MemberChangePageForm extends PageForm {
// 工会id
@ApiModelProperty("工会id")
@@ -1,7 +1,6 @@
package com.budwk.app.zhgh.staffmanage.sourcechange.param;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.sys.models.Sys_user_history;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -16,7 +15,7 @@ import java.util.List;
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class SourceChangePageForm extends PageForm<Sys_user_history> {
public class SourceChangePageForm extends PageForm {
private String unionId;
@@ -1,7 +1,6 @@
package com.budwk.app.zhgh.staffmanage.specialstaff.param;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.zhgh.staffmanage.specialstaff.model.SpecialStaff;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -14,7 +13,7 @@ import lombok.EqualsAndHashCode;
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class SpecialStaffPageForm extends PageForm<SpecialStaff> {
public class SpecialStaffPageForm extends PageForm {
private String unionId;