From 4235deede705fb3bf7642d69ddf80f77b0f13af1 Mon Sep 17 00:00:00 2001 From: hongqiwei <1143662660@qq.com> Date: Fri, 4 Sep 2026 16:07:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=B0=E5=A4=A7bug=E6=95=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ProcessInstanceServiceImpl.java | 10 +- .../ClubRefreshReportController.java | 19 ++- .../controller/SiteCugManageController.java | 22 ++++ .../siteCug/service/SiteCugInfoService.java | 8 ++ .../service/impl/SiteCugInfoServiceImpl.java | 16 +++ .../dayofficework/siteCug/manage/index.html | 18 ++- .../zhgh/democratic/proposal/common/info.js | 111 +++++++++++++++++- 7 files changed, 193 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/budwk/app/flow/service/impl/ProcessInstanceServiceImpl.java b/src/main/java/com/budwk/app/flow/service/impl/ProcessInstanceServiceImpl.java index d3559ba9..0ea552b7 100644 --- a/src/main/java/com/budwk/app/flow/service/impl/ProcessInstanceServiceImpl.java +++ b/src/main/java/com/budwk/app/flow/service/impl/ProcessInstanceServiceImpl.java @@ -23,6 +23,7 @@ import com.budwk.app.flow.entity.ProcessCcInstance; import com.budwk.app.flow.entity.ProcessDefine; 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.ProcessInstanceStateEnum; import com.budwk.app.flow.enums.ProcessSubmitTypeEnum; import com.budwk.app.flow.enums.ProcessTaskStateEnum; @@ -556,11 +557,18 @@ public class ProcessInstanceServiceImpl extends BaseServiceImpl public void deleteProcessInstanceById(Long processInstanceId) { List taskList = dao().query(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", processInstanceId)); List taskIds = taskList.stream().map(ProcessTask::getId).toList(); - dao().clear(ProcessTask.class, Cnd.where(ProcessTask::getId, "in", taskIds)); + // 任务参与人依赖流程任务,删除流程时先清理参与人,避免遗留无法回查所属流程的孤立记录。 + if (CollectionUtil.isNotEmpty(taskIds)) { + dao().clear(ProcessTaskActor.class, Cnd.where(ProcessTaskActor::getProcessTaskId, "in", taskIds)); + dao().clear(ProcessTask.class, Cnd.where(ProcessTask::getId, "in", taskIds)); + } + // 抄送记录直接依赖流程实例,需要与实例一并清理。 + dao().clear(ProcessCcInstance.class, Cnd.where(ProcessCcInstance::getProcessInstanceId, "=", processInstanceId)); dao().clear(ProcessInstance.class, Cnd.where(ProcessInstance::getId, "=", processInstanceId)); } @Override + @Aop(TransAop.READ_COMMITTED) public void deleteProcessInstanceByBusinessKey(String businessKey) { ProcessInstance processInstance = fetch(Cnd.where(ProcessInstance::getBusinessNo, "=", businessKey)); if (processInstance != null) { diff --git a/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubRefreshReportController.java b/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubRefreshReportController.java index 0f55c8c8..57cb0397 100644 --- a/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubRefreshReportController.java +++ b/src/main/java/com/budwk/app/zhgh/club/controller/infoManage/ClubRefreshReportController.java @@ -11,6 +11,7 @@ import com.budwk.app.base.result.Result; import com.budwk.app.base.utils.PageUtil; import com.budwk.app.flow.constant.FlowConst; import com.budwk.app.flow.engine.FlowEngine; +import com.budwk.app.flow.entity.ProcessDefine; import com.budwk.app.flow.entity.ProcessInstance; import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.enums.ProcessInstanceStateEnum; @@ -95,6 +96,7 @@ public class ClubRefreshReportController { sys_club_refresh info LEFT JOIN sys_club club ON club.id = info.clubId LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id + AND ins.processDefineId IN (SELECT id FROM wf_process_define WHERE name = 'XHHJBG') 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 @@ -176,10 +178,23 @@ public class ClubRefreshReportController { @ApiOperation("删除") @Aop(TransAop.READ_COMMITTED) @SaCheckPermission("club.infoManage.refreshReport") - @SLog(tag = "社团管理系统-信息管理", msg = "删除换届报告") + @SLog(tag = "社团管理系统-信息管理", msg = "删除换届报告") public Result delete(@Param("id") String id) { + // 历史换届记录可能与社团注册共用业务编号,必须按流程定义精确定位换届流程,避免误删注册流程。 + List refreshDefineIds = dao.query(ProcessDefine.class, + Cnd.where(ProcessDefine::getName, "=", "XHHJBG")) + .stream() + .map(ProcessDefine::getId) + .toList(); + List refreshInstances = refreshDefineIds.isEmpty() + ? List.of() + : dao.query(ProcessInstance.class, + Cnd.where(ProcessInstance::getBusinessNo, "=", id) + .and(ProcessInstance::getProcessDefineId, "in", refreshDefineIds)); clubInfoManageService.dao().delete(SysClubRefresh.class, id); - flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id); + for (ProcessInstance refreshInstance : refreshInstances) { + flowEngine.processInstanceService().deleteProcessInstanceById(refreshInstance.getId()); + } return Result.success(); } } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugManageController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugManageController.java index b90572dd..810a1ed8 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugManageController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/controller/SiteCugManageController.java @@ -17,6 +17,8 @@ import lombok.extern.slf4j.Slf4j; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.dao.util.cri.SqlExpressionGroup; +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; @@ -161,6 +163,26 @@ public class SiteCugManageController { return Result.success(savedInfo == null ? info : savedInfo); } + /** + * 切换场地开启状态。 + * + * @param id 场地ID,必须传入已存在的 site_cug_info 主键 + * @param state 目标状态,true 表示开启,false 表示关闭 + * @return Result 响应;code 为 0 表示状态更新成功,否则 msg 为参数错误信息 + */ + @At + @ApiOperation("切换场地开启状态") + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("siteCug.manage") + @SLog(tag = "场馆功能管理-场地管理", msg = "切换场地开启状态") + public Result switchState(String id, Boolean state) { + if (StrUtil.isBlank(id) || state == null) { + return Result.error("场地ID或开启状态不能为空"); + } + infoService.updateState(id, state); + return Result.success(); + } + @At @ApiOperation("delete") @SaCheckPermission("siteCug.manage") diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/service/SiteCugInfoService.java b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/service/SiteCugInfoService.java index 1fa2d0bc..925eb536 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/service/SiteCugInfoService.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/service/SiteCugInfoService.java @@ -4,4 +4,12 @@ import com.budwk.app.base.service.BaseService; import com.budwk.app.zhgh.dayofficework.siteCug.model.SiteCugInfo; public interface SiteCugInfoService extends BaseService { + + /** + * 仅更新场地开启状态,不触发场地完整表单校验。 + * + * @param id 场地ID + * @param state true 表示开启,false 表示关闭 + */ + void updateState(String id, Boolean state); } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/service/impl/SiteCugInfoServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/service/impl/SiteCugInfoServiceImpl.java index 0292fb6c..9429306a 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/service/impl/SiteCugInfoServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/siteCug/service/impl/SiteCugInfoServiceImpl.java @@ -4,7 +4,11 @@ import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.zhgh.dayofficework.siteCug.model.SiteCugInfo; import com.budwk.app.zhgh.dayofficework.siteCug.service.SiteCugInfoService; import lombok.extern.slf4j.Slf4j; +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.IocBean; @Slf4j @@ -14,4 +18,16 @@ public class SiteCugInfoServiceImpl extends BaseServiceImpl impleme public SiteCugInfoServiceImpl(Dao dao) { super(dao); } + + /** + * 仅更新指定场地的开启状态,防止开关操作覆盖其他场地配置。 + * + * @param id 场地ID + * @param state true 表示开启,false 表示关闭 + */ + @Override + @Aop(TransAop.READ_COMMITTED) + public void updateState(String id, Boolean state) { + update(Chain.make("state", state), Cnd.where("id", "=", id)); + } } diff --git a/src/main/resources/views/platform/zhgh/dayofficework/siteCug/manage/index.html b/src/main/resources/views/platform/zhgh/dayofficework/siteCug/manage/index.html index ce353561..b7a61705 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/siteCug/manage/index.html +++ b/src/main/resources/views/platform/zhgh/dayofficework/siteCug/manage/index.html @@ -36,7 +36,7 @@ layout("/layouts/platform.html"){ 新增场地 - + {}) }, switchChange(row) { - this.$axios.post("/platform/siteCug/manage/submit", row).then((res) => { + const previousState = !row.state + this.tableLoading = true + this.$axios.post("/platform/siteCug/manage/switchState", { + id: row.id, + state: row.state + }).then((res) => { if (res.code === 0) { this.$message.success(res.msg) - this.pageData() + } else { + // 状态更新失败时恢复开关,避免页面显示与数据库实际状态不一致。 + this.$set(row, "state", previousState) + this.$message.warning(res.msg) } + }).catch(() => { + this.$set(row, "state", previousState) + }).finally(() => { + this.tableLoading = false }) }, querySiteType() { diff --git a/src/main/resources/views/platform/zhgh/democratic/proposal/common/info.js b/src/main/resources/views/platform/zhgh/democratic/proposal/common/info.js index 279b2753..3aa3926f 100644 --- a/src/main/resources/views/platform/zhgh/democratic/proposal/common/info.js +++ b/src/main/resources/views/platform/zhgh/democratic/proposal/common/info.js @@ -110,10 +110,10 @@ const PROPOSAL_INFO = { -