This commit is contained in:
Paidax
2025-12-20 18:07:17 +08:00
parent b5546625db
commit 5c75104efd
19 changed files with 140 additions and 16 deletions
@@ -0,0 +1,14 @@
package com.budwk.app.base.event.flow.jumptofirsttask;
/**
* @version 1.0
* @Author FKY
* @nameFlowJumpToFirstTaskNodeListener
* @Date 2025/12/20 14:10
* @注释
*/
public interface FlowJumpToFirstTaskNodeListener {
void receive(Long processTaskId);
}
@@ -0,0 +1,25 @@
package com.budwk.app.base.event.flow.jumptofirsttask;
import com.budwk.app.base.event.user.UserChangeEventListener;
import com.budwk.app.base.utils.AppIocUtil;
import org.nutz.ioc.Ioc;
import org.nutz.mvc.Mvcs;
/**
* @version 1.0
* @Author FKY
* @nameFlowJumpToFirstTaskNodeEvent
* @Date 2025/12/20 14:09
* @注释
*/
public class FlowJumpToFirstTaskNodePublisher {
public static void broadcast(Long processTaskId) {
String[] names = Mvcs.getIoc().getNamesByType(FlowJumpToFirstTaskNodeListener.class);
for (String listener : names) {
FlowJumpToFirstTaskNodeListener listenerBean = Mvcs.getIoc().get(FlowJumpToFirstTaskNodeListener.class, listener);
listenerBean.receive(processTaskId);
}
}
}
@@ -2,6 +2,7 @@ package com.budwk.app.flow.service;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil;
import com.budwk.app.base.event.flow.jumptofirsttask.FlowJumpToFirstTaskNodePublisher;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
@@ -52,6 +53,10 @@ public class FlowCommonService {
} else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.ROLLBACK_TO_OPERATOR.getCode())) {
// 退回发起人
flowEngine.executeAndJumpToFirstTaskNode(processTaskId, operator, args);
// 退回发起人发送订阅消息,执行相关操作
FlowJumpToFirstTaskNodePublisher.broadcast(processTaskId);
} else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.COUNTERSIGN_DISAGREE.getCode())) {
// 会签不同意,追加不同意标识
args.put(FlowConst.COUNTERSIGN_DISAGREE_FLAG, 1);
@@ -326,7 +326,7 @@ public class SysUnitController {
public Object addDo(@Param("..") Sys_unit unit, @Param("parentId") String parentId, HttpServletRequest req) {
try {
if ("root".equals(parentId)) {
parentId = "";
parentId = "0";
}
unit.setCreatedBy(SecurityUtil.getUserId());
unit.setUnitType("用户自建");
@@ -50,7 +50,7 @@ public class ProposalCommonController {
@SaCheckLogin
@ApiOperation("查询全部的教代会")
public Result listSession() {
List<Teacher_congress_session> list = dao.query(Teacher_congress_session.class, Cnd.NEW().desc("startDate"));
List<Teacher_congress_session> list = dao.query(Teacher_congress_session.class, Cnd.NEW().asc("startDate"));
return Result.success(list);
}
@@ -93,7 +93,8 @@ public class ProposalSchoolLeaderApprovalController {
t.taskParentId,
t.variable taskVariable,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke,
GROUP_CONCAT(DISTINCT ta.actorName, '(', ta.actorAccount, ')' ) AS auditUser
FROM
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
@@ -104,7 +104,8 @@ public class ProposalUnderTakeReplyController {
t.variable->>'$.underTakeName' AS underTakeName,
IF(JSON_EXTRACT(t.variable, '$.underTakeIsMaster') = true, 1, 0) AS underTakeIsMaster,
t.variable->>'$.tf_transferUserId' AS tf_transferUserId,
transferUser.username AS transferUserName
transferUser.username AS transferUserName,
GROUP_CONCAT(DISTINCT ta.actorName, '(', ta.actorAccount, ')' ) AS auditUser
FROM
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
@@ -13,8 +13,10 @@ import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.sys.services.SysRoleService;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalReplyUnit;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.aop.Aop;
import java.util.List;
@@ -22,7 +24,9 @@ import java.util.List;
* 提案主办单位处理人
*/
public class ProposalMasterUnitAssignmentHandler implements AssignmentHandler {
@Override
@Aop(TransAop.READ_COMMITTED)
public List<String> assign(TaskModel model, Execution execution) {
Dao dao = ServiceContext.find(Dao.class);
SysRoleService sysRoleService = ServiceContext.find(SysRoleService.class);
@@ -42,7 +46,8 @@ public class ProposalMasterUnitAssignmentHandler implements AssignmentHandler {
// 如果没有 认为是需要重新答复 从记录表里取值
if(StrUtil.isBlank(masterUnitId)){
ProposalReplyUnit masterUnit = dao.fetch(ProposalReplyUnit.class, Cnd.where(ProposalReplyUnit::getProposalId, "=", proposalId).and(ProposalReplyUnit::getIsMaster, "=", 1));
ProposalReplyUnit masterUnit = dao.fetch(ProposalReplyUnit.class, Cnd.where(ProposalReplyUnit::getProposalId, "=", proposalId)
.and(ProposalReplyUnit::getIsMaster, "=", 1));
if (masterUnit == null) {
throw new BaseException("系统异常");
}
@@ -26,9 +26,13 @@ public class ProposalCaseTaskRevokeEventListener implements ProcessEventListener
if (event.getEventType() == ProcessEventTypeEnum.PROCESS_TASK_REVOKE) {
Long taskId = event.getSourceId();
ProcessTask task = dao.fetch(ProcessTask.class, taskId);
ProcessInstance instance = dao.fetch(ProcessInstance.class, task.getProcessInstanceId());
String businessNo = instance.getBusinessNo();
dao.clear(ProposalReplyUnit.class, Cnd.where(ProposalReplyUnit::getProposalId, "=", businessNo));
ProcessTask parentProcessTask = dao.fetch(ProcessTask.class, task.getTaskParentId());
if ("committee".equals(parentProcessTask.getTaskName())) {
ProcessInstance instance = dao.fetch(ProcessInstance.class, task.getProcessInstanceId());
String businessNo = instance.getBusinessNo();
dao.clear(ProposalReplyUnit.class, Cnd.where(ProposalReplyUnit::getProposalId, "=", businessNo));
}
}
}
}
@@ -0,0 +1,39 @@
package com.budwk.app.zhgh.democratic.proposal.listenter;
import com.budwk.app.base.event.flow.jumptofirsttask.FlowJumpToFirstTaskNodeListener;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.service.ProcessInstanceService;
import com.budwk.app.flow.service.ProcessTaskService;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalSecond;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
/**
* @version 1.0
* @Author FKY
* @nameProposalJumpToWriteEventListener
* @Date 2025/12/20 14:50
* @注释 提案退回发起人监听器
*/
@IocBean
public class ProposalJumpToWriteEventListener implements FlowJumpToFirstTaskNodeListener {
@Inject
private Dao dao;
@Inject
private ProcessTaskService processTaskService;
@Inject
private ProcessInstanceService processInstanceService;
@Override
public void receive(Long processTaskId) {
ProcessTask processTask = processTaskService.getById(processTaskId);
ProcessInstance processInstance = processInstanceService.getById(processTask.getProcessInstanceId());
// 清空提案的附议人
dao.clear(ProposalSecond.class, Cnd.where(ProposalSecond::getProposalId, "=", processInstance.getBusinessNo()));
}
}
@@ -8,6 +8,7 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.Cnd;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.lang.Lang;
@EqualsAndHashCode(callSuper = true)
@Data
@@ -58,6 +59,8 @@ public class ProposalQueryComprehensiveParam extends PageForm {
@ApiModelProperty(name = "通用关键字")
private String commonKeyword;
@ApiModelProperty(name = "搜索关键字")
private String createUserKeyword;
/**
@@ -71,7 +74,12 @@ public class ProposalQueryComprehensiveParam extends PageForm {
cnd = Cnd.NEW();
}
//教代会届次
cnd.andEX("info.sessionId", "=", searchParam.getSessionId());
if (Lang.isNotEmpty(searchParam.getSessionIds())) {
cnd.and("info.sessionId", "in", searchParam.getSessionIds());
} else {
cnd.andEX("info.sessionId", "=", searchParam.getSessionId());
}
//提案名称
if (StrUtil.isNotBlank(searchParam.getName())) {
cnd.where().andLike("info.name", searchParam.getName());
@@ -93,6 +101,14 @@ public class ProposalQueryComprehensiveParam extends PageForm {
if (StrUtil.isNotBlank(searchParam.getCreateUserName())) {
cnd.where().andLike("info.createUserName", searchParam.getCreateUserName());
}
if (StrUtil.isNotBlank(searchParam.getCreateUserKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("info.createUserName", searchParam.getCreateUserKeyword());
seg.orLike("info.createUserLoginName", searchParam.getCreateUserKeyword());
cnd.and(seg);
}
// 提案人分工会
cnd.andEX("tcde.unionId", "=", searchParam.getUnionId());
// 提案人单位
@@ -36,6 +36,7 @@ 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 javax.servlet.http.HttpServletResponse;
@@ -209,7 +210,9 @@ public class ProposalExportServiceImpl extends BaseServiceImpl<ProposalInfo> imp
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(",")));
if (Lang.isNotEmpty(seconders)) {
list.get(i).put("secondedUserNames", seconders.stream().map(v -> v.getString("userName")).collect(Collectors.joining(",")));
}
}
}
@@ -9,7 +9,7 @@ const UNIT_MANAGE_TEMPLATE = {
</el-card>
<el-card shadow="never" style="border: 1px solid var(--border-color-lighter); margin-top: 10px">
<table-tool label="单位列表">
<el-button @click="openAdd" type="primary" size="small">新建单位</el-button>
<!-- <el-button @click="openAdd" type="primary" size="small">新建单位</el-button>-->
</table-tool>
<el-table :data="tableData" size="mini">
<el-table-column label="序号" type="index" width="60">
@@ -75,7 +75,7 @@ layout("/layouts/platform.html"){
</el-form>
<el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到提案</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起</el-button>
<el-button @click="handleTaskAction(20)" size="small" type="danger">不同意</el-button>
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意</el-button>
</el-row>
@@ -28,9 +28,9 @@ const PROPOSAL_INFO = {
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="viewData.caseFilingResult"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="调研情况" :span="3">
<!--<el-descriptions-item label="调研情况" :span="3">
<div class="text-left">{{viewData.researchFindings}}</div>
</el-descriptions-item>
</el-descriptions-item>-->
<el-descriptions-item label="提案案由" :span="3">
<div class="text-left" v-html="viewData.brief"></div>
</el-descriptions-item>
@@ -231,6 +231,14 @@ layout("/layouts/platform.html"){
cancelButtonText: "取消",
type: "warning"
}).then(() => {
// 是否有协办单位
let tf_helpunitreply;
if (this.formData.tf_slaveUnitIds && this.formData.tf_slaveUnitIds.length > 0) {
tf_helpunitreply = 'HAS_HELP_UNIT'
} else {
tf_helpunitreply = 'NO_HELP_UNIT'
}
const loading = createLoading('提交中')
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
@@ -239,6 +247,7 @@ layout("/layouts/platform.html"){
tf_masterUnitName: this.formData.tf_masterUnitId ? this.underTakeOptions.find(v => v.id === this.formData.tf_masterUnitId)?.name : null,
tf_slaveUnitNames: this.formData.tf_slaveUnitIds.map(v => this.underTakeOptions.find(v2 => v2.id === v)?.name),
tf_slaveUnitNameStr: this.formData.tf_slaveUnitIds.map(v => this.underTakeOptions.find(v2 => v2.id === v)?.name).join(','),
tf_helpunitreply: tf_helpunitreply
})
}).then((res) => {
if (res.code === 0) {
@@ -137,6 +137,7 @@ layout("/layouts/platform.html"){
{label: "提案类别", prop: "typeName"},
{label: "是否并案", prop: "merge"},
{label: "当前节点", prop: "curTaskName"},
{label: "审核人", prop: "auditUser"},
{label: "流程状态", prop: "instanceState"}
],
pageForm: {
@@ -260,6 +260,7 @@ layout("/layouts/platform.html"){
{label: "承办单位", prop: "underTakeName"},
{label: "承办类型", prop: "underTakeIsMaster"},
{label: "当前节点", prop: "curTaskName"},
{label: "审核人", prop: "auditUser"},
{label: "流程状态", prop: "instanceState"}
],
pageForm: {
@@ -270,7 +270,7 @@ layout("/layouts/platform_h5.html"){
</van-cell-group>
<van-cell-group title="提案内容" class="form-group">
<van-field
<!--<van-field
v-model="formData.researchFindings"
name="researchFindings"
label="调研情况"
@@ -280,7 +280,7 @@ layout("/layouts/platform_h5.html"){
placeholder="请输入调研情况"
:rules="[{ required: true, message: '请填写调研情况' }]"
required
></van-field>
></van-field>-->
<van-field
v-model="formData.brief"