fix(inspectimprove): 删除遗留孤立实体并修复阶段字段默认值

- 删除 dj_inspect_improve 遗留实体(控制器/实体/mapper/service/完成监听器及其测试),
  清理 InspectImproveFlow 与两个监听器的未使用注入,删除无数据表并记录 DDL
- DqInspectTaskServiceImpl.saveMain 兜底 completedStage=0,修复 completed_stage 为 NULL 导致阶段递增失效
- 同步修正相关测试的构造函数参数
This commit is contained in:
wsm
2026-08-06 18:41:14 +08:00
parent 57af8575c3
commit 91455194ce
17 changed files with 18 additions and 987 deletions
@@ -42,6 +42,9 @@ public class DqInspectTaskServiceImpl extends ServiceImpl<DqInspectTaskMapper, D
if (dqInspectTask.getBpmStatus() == null) {
dqInspectTask.setBpmStatus("1");
}
if (dqInspectTask.getCompletedStage() == null) {
dqInspectTask.setCompletedStage(0);
}
validateProblemId(dqInspectTask);
dqInspectTaskMapper.insert(dqInspectTask);
if(dqInspectProgressList!=null && dqInspectProgressList.size()>0) {
@@ -1,340 +0,0 @@
package org.jeecg.modules.supervision.inspectimprove.controller;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.common.system.vo.SelectTreeModel;
import org.jeecg.modules.supervision.common.BpmStatus;
import org.jeecg.modules.supervision.common.SupervisionConstant;
import org.jeecg.modules.supervision.bqtakepulse.entity.BgTakepulse;
import org.jeecg.modules.supervision.inspectimprove.entity.DjInspectImprove;
import org.jeecg.modules.supervision.inspectimprove.service.IDjInspectImproveService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.jeecg.common.system.base.controller.JeecgController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import com.alibaba.fastjson.JSON;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.apache.shiro.authz.annotation.RequiresPermissions;
/**
* @Description: 巡视整改台账
* @Author: jeecg-boot
* @Date: 2026-05-18
* @Version: V1.0
*/
@Tag(name="巡视整改台账")
@RestController
@RequestMapping("/dj/inspectimprove/djInspectImprove")
@Slf4j
public class DjInspectImproveController extends JeecgController<DjInspectImprove, IDjInspectImproveService>{
@Autowired
private IDjInspectImproveService djInspectImproveService;
/**
* 分页列表查询
*
* @param djInspectImprove
* @param pageNo
* @param pageSize
* @param req
* @return
*/
@AutoLog(value = "巡视整改台账-分页列表查询")
@Operation(summary="巡视整改台账-分页列表查询")
@GetMapping(value = "/rootList")
public Result<IPage<DjInspectImprove>> queryPageList(DjInspectImprove djInspectImprove,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
String hasQuery = req.getParameter("hasQuery");
if(hasQuery != null && "true".equals(hasQuery)){
QueryWrapper<DjInspectImprove> queryWrapper = QueryGenerator.initQueryWrapper(djInspectImprove, req.getParameterMap());
List<DjInspectImprove> list = djInspectImproveService.queryTreeListNoPage(queryWrapper);
IPage<DjInspectImprove> pageList = new Page<>(1, 10, list.size());
pageList.setRecords(list);
return Result.OK(pageList);
}else{
String parentId = djInspectImprove.getPid();
if (oConvertUtils.isEmpty(parentId)) {
parentId = "0";
}
djInspectImprove.setPid(null);
QueryWrapper<DjInspectImprove> queryWrapper = QueryGenerator.initQueryWrapper(djInspectImprove, req.getParameterMap());
// 使用 eq 防止模糊查询
queryWrapper.eq("pid", parentId);
Page<DjInspectImprove> page = new Page<DjInspectImprove>(pageNo, pageSize);
IPage<DjInspectImprove> pageList = djInspectImproveService.page(page, queryWrapper);
return Result.OK(pageList);
}
}
/**
* 【vue3专用】加载节点的子数据
*
* @param pid
* @return
*/
@AutoLog(value = "巡视整改台账-加载树子节点")
@RequestMapping(value = "/loadTreeChildren", method = RequestMethod.GET)
public Result<List<SelectTreeModel>> loadTreeChildren(@RequestParam(name = "pid") String pid) {
Result<List<SelectTreeModel>> result = new Result<>();
try {
List<SelectTreeModel> ls = djInspectImproveService.queryListByPid(pid);
result.setResult(ls);
result.setSuccess(true);
} catch (Exception e) {
e.printStackTrace();
result.setMessage(e.getMessage());
result.setSuccess(false);
}
return result;
}
/**
* 【vue3专用】加载一级节点/如果是同步 则所有数据
*
* @param async
* @param pcode
* @return
*/
@AutoLog(value = "巡视整改台账-加载树根节点")
@RequestMapping(value = "/loadTreeRoot", method = RequestMethod.GET)
public Result<List<SelectTreeModel>> loadTreeRoot(@RequestParam(name = "async") Boolean async, @RequestParam(name = "pcode") String pcode) {
Result<List<SelectTreeModel>> result = new Result<>();
try {
List<SelectTreeModel> ls = djInspectImproveService.queryListByCode(pcode);
if (!async) {
loadAllChildren(ls);
}
result.setResult(ls);
result.setSuccess(true);
} catch (Exception e) {
e.printStackTrace();
result.setMessage(e.getMessage());
result.setSuccess(false);
}
return result;
}
/**
* 【vue3专用】递归求子节点 同步加载用到
*
* @param ls
*/
private void loadAllChildren(List<SelectTreeModel> ls) {
for (SelectTreeModel tsm : ls) {
List<SelectTreeModel> temp = djInspectImproveService.queryListByPid(tsm.getKey());
if (temp != null && temp.size() > 0) {
tsm.setChildren(temp);
loadAllChildren(temp);
}
}
}
/**
* 获取子数据
* @param djInspectImprove
* @param req
* @return
*/
@AutoLog(value = "巡视整改台账-获取子数据")
@Operation(summary="巡视整改台账-获取子数据")
@GetMapping(value = "/childList")
public Result<IPage<DjInspectImprove>> queryPageList(DjInspectImprove djInspectImprove,HttpServletRequest req) {
QueryWrapper<DjInspectImprove> queryWrapper = QueryGenerator.initQueryWrapper(djInspectImprove, req.getParameterMap());
List<DjInspectImprove> list = djInspectImproveService.list(queryWrapper);
IPage<DjInspectImprove> pageList = new Page<>(1, 10, list.size());
pageList.setRecords(list);
return Result.OK(pageList);
}
/**
* 批量查询子节点
* @param parentIds 父ID(多个采用半角逗号分割)
* @return 返回 IPage
* @param parentIds
* @return
*/
@AutoLog(value = "巡视整改台账-批量获取子数据")
@Operation(summary="巡视整改台账-批量获取子数据")
@GetMapping("/getChildListBatch")
public Result getChildListBatch(@RequestParam("parentIds") String parentIds) {
try {
QueryWrapper<DjInspectImprove> queryWrapper = new QueryWrapper<>();
List<String> parentIdList = Arrays.asList(parentIds.split(","));
queryWrapper.in("pid", parentIdList);
List<DjInspectImprove> list = djInspectImproveService.list(queryWrapper);
IPage<DjInspectImprove> pageList = new Page<>(1, 10, list.size());
pageList.setRecords(list);
return Result.OK(pageList);
} catch (Exception e) {
log.error(e.getMessage(), e);
return Result.error("批量查询子节点失败:" + e.getMessage());
}
}
/**
* 添加
*
* @param djInspectImprove
* @return
*/
@AutoLog(value = "巡视整改台账-添加")
@Operation(summary="巡视整改台账-添加")
@RequiresPermissions("dj.inspectimprove:dj_inspect_improve:add")
@PostMapping(value = "/add")
public Result<String> add(@RequestBody DjInspectImprove djInspectImprove) {
djInspectImproveService.addDjInspectImprove(djInspectImprove);
return Result.OK("添加成功!");
}
/**
* 编辑
*
* @param djInspectImprove
* @return
*/
@AutoLog(value = "巡视整改台账-编辑")
@Operation(summary="巡视整改台账-编辑")
@RequiresPermissions("dj.inspectimprove:dj_inspect_improve:edit")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> edit(@RequestBody DjInspectImprove djInspectImprove) {
djInspectImproveService.updateDjInspectImprove(djInspectImprove);
return Result.OK("编辑成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "巡视整改台账-通过id删除")
@Operation(summary="巡视整改台账-通过id删除")
@RequiresPermissions("dj.inspectimprove:dj_inspect_improve:delete")
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name="id",required=true) String id) {
djInspectImproveService.deleteDjInspectImprove(id);
return Result.OK("删除成功!");
}
/**
* 批量删除
*
* @param ids
* @return
*/
@AutoLog(value = "巡视整改台账-批量删除")
@Operation(summary="巡视整改台账-批量删除")
@RequiresPermissions("dj.inspectimprove:dj_inspect_improve:deleteBatch")
@DeleteMapping(value = "/deleteBatch")
public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
this.djInspectImproveService.removeByIds(Arrays.asList(ids.split(",")));
return Result.OK("批量删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
@AutoLog(value = "巡视整改台账-通过id查询")
@Operation(summary="巡视整改台账-通过id查询")
@GetMapping(value = "/queryById")
public Result<DjInspectImprove> queryById(@RequestParam(name="id",required=true) String id) {
DjInspectImprove djInspectImprove = djInspectImproveService.getById(id);
if(djInspectImprove==null) {
return Result.error("未找到对应数据");
}
return Result.OK(djInspectImprove);
}
/**
* 导出excel
*
* @param request
* @param djInspectImprove
*/
@AutoLog(value = "巡视整改台账-通过excel导出")
@RequiresPermissions("dj.inspectimprove:dj_inspect_improve:exportXls")
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, DjInspectImprove djInspectImprove) {
return super.exportXls(request, djInspectImprove, DjInspectImprove.class, "巡视整改台账");
}
/**
* 通过excel导入数据
*
* @param request
* @param response
* @return
*/
@AutoLog(value = "巡视整改台账-通过excel导入")
@RequiresPermissions("dj.inspectimprove:dj_inspect_improve:importExcel")
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, DjInspectImprove.class);
}
/**
* 仅导出Excel表头(EasyExcel
*/
@AutoLog(value = "巡视整改台账-通过EasyExcel导出模板")
@RequiresPermissions("dj.inspectimprove:dj_inspect_improve:exportXls")
@GetMapping(value = "/exportXlsHeaders")
public void exportXlsHeaders(HttpServletResponse response) throws IOException {
super.exportXlsHeadersByEasyExcel(response, DjInspectImprove.class, "巡视整改台账");
}
/**
* 通过EasyExcel导入数据
*/
@AutoLog(value = "巡视整改台账-通过EasyExcel导入")
@RequiresPermissions("dj.inspectimprove:dj_inspect_improve:importExcel")
@RequestMapping(value = "/importExcelByEasyExcel", method = RequestMethod.POST)
public Result<?> importExcelByEasyExcel(HttpServletRequest request) {
return super.importExcelByEasyExcel(request, DjInspectImprove.class,
Map.of(
SupervisionConstant.ClassFieldName.BPM_STATUS_NAME,
BpmStatus.NOT_START.getCode(),
SupervisionConstant.ClassFieldName.DEL_FLAG_NAME,
SupervisionConstant.DelFlag.NORMAL));
}
/**
* 通过EasyExcel校验数据,只返回校验结果,不保存到数据库
*/
@AutoLog(value = "巡视整改台账-通过EasyExcel校验导入")
@RequiresPermissions("dj.inspectimprove:dj_inspect_improve:importExcel")
@RequestMapping(value = "/checkExcelByEasyExcel", method = RequestMethod.POST)
public Result<?> checkExcelByEasyExcel(HttpServletRequest request) {
return super.checkExcelByEasyExcel(request, DjInspectImprove.class);
}
}
@@ -1,154 +0,0 @@
package org.jeecg.modules.supervision.inspectimprove.entity;
import java.io.Serializable;
import java.util.Date;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableLogic;
import org.jeecg.common.constant.ProvinceCityArea;
import org.jeecg.common.util.SpringContextUtils;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecg.common.util.excel.annotation.ExcelColumn;
import org.jeecg.common.aspect.annotation.Dict;
import io.swagger.v3.oas.annotations.media.Schema;
import java.io.UnsupportedEncodingException;
/**
* @Description: 巡视整改台账
* @Author: jeecg-boot
* @Date: 2026-05-18
* @Version: V1.0
*/
@Data
@TableName("dj_inspect_improve")
@Schema(description="巡视整改台账")
public class DjInspectImprove implements Serializable {
private static final long serialVersionUID = 1L;
/**主键*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description = "主键")
private java.lang.String id;
/**创建人*/
@Schema(description = "创建人")
private java.lang.String createBy;
/**创建日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@Schema(description = "创建日期")
private java.util.Date createTime;
/**更新人*/
@Schema(description = "更新人")
private java.lang.String updateBy;
/**更新日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@Schema(description = "更新日期")
private java.util.Date updateTime;
/**所属部门*/
@Schema(description = "所属部门")
private java.lang.String sysOrgCode;
/**树形表单父id*/
// @Excel(name = "树形表单父id", width = 15)
@Schema(description = "树形表单父id")
private java.lang.String pid;
/**是否有子节点*/
// @Excel(name = "是否有子节点", width = 15, dicCode = "yn")
@Dict(dicCode = "yn")
@Schema(description = "是否有子节点")
private java.lang.String hasChild;
/**问题分类*/
@Excel(name = "问题分类", width = 15)
@ExcelColumn(name = "问题分类", width = 15, dicCode = "inspect_improve_type")
@Schema(description = "问题分类")
@Dict(dicCode = "inspect_improve_type")
private java.lang.Integer questionCategory;
/**面上问题*/
@Excel(name = "面上问题", width = 15)
@ExcelColumn(name = "面上问题", width = 15)
@Schema(description = "面上问题")
private java.lang.String mianshangQuestion;
/**具体问题*/
@Excel(name = "具体问题", width = 15)
@ExcelColumn(name = "具体问题", width = 15)
@Schema(description = "具体问题")
private java.lang.String specicalQuestion;
/**巡视建议*/
@Excel(name = "巡视建议", width = 15)
@ExcelColumn(name = "巡视建议", width = 15)
@Schema(description = "巡视建议")
private java.lang.String inspectAdvice;
/**整改措施*/
@Excel(name = "整改措施", width = 15)
@ExcelColumn(name = "整改措施", width = 15)
@Schema(description = "整改措施")
private java.lang.String improveMeasure;
/**完成时限*/
@Excel(name = "完成时限", width = 15, format = "yyyy-MM-dd")
@ExcelColumn(name = "完成时限", width = 15, format = "yyyy-MM-dd")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
@Schema(description = "完成时限")
private java.util.Date deadline;
/**目标节点*/
@Excel(name = "目标节点", width = 15)
@ExcelColumn(name = "目标节点", width = 15)
@Schema(description = "目标节点")
private java.lang.String targetNode;
/**问题责任领导*/
@Excel(name = "问题责任领导", width = 15)
@ExcelColumn(name = "问题责任领导", width = 15, dictTable = "sys_user", dicText = "realname", dicCode = "username")
@Schema(description = "问题责任领导")
private java.lang.String questionResLeader;
/**问题责任部门*/
@Excel(name = "问题责任部门", width = 15)
@ExcelColumn(name = "问题责任部门", width = 15, dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
@Schema(description = "问题责任部门")
private java.lang.String questionResDept;
/**措施责任领导*/
@Excel(name = "措施责任领导", width = 15)
@ExcelColumn(name = "措施责任领导", width = 15, dictTable = "sys_user", dicText = "realname", dicCode = "username")
@Schema(description = "措施责任领导")
private java.lang.String measureResLeader;
/**措施责任部门*/
@Excel(name = "措施责任部门", width = 15)
@ExcelColumn(name = "措施责任部门", width = 15, dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
@Schema(description = "措施责任部门")
private java.lang.String measureResDept;
/**整改交付成果*/
@Excel(name = "整改交付成果", width = 15)
@ExcelColumn(name = "整改交付成果", width = 15)
@Schema(description = "整改交付成果")
private java.lang.String rectificationEvidence;
/**成效评价标准*/
@Excel(name = "成效评价标准", width = 15)
@ExcelColumn(name = "成效评价标准", width = 15)
@Schema(description = "成效评价标准")
private java.lang.String evaluationCriterion;
/**工作进展*/
@Excel(name = "工作进展", width = 15)
@ExcelColumn(name = "工作进展", width = 15)
@Schema(description = "工作进展")
private java.lang.String workProgress;
/**检查情况*/
@Excel(name = "检查情况", width = 15)
@ExcelColumn(name = "检查情况", width = 15)
@Schema(description = "检查情况")
private java.lang.String inspectionStatus;
/**监督意见*/
@Excel(name = "监督意见", width = 15)
@ExcelColumn(name = "监督意见", width = 15)
@Schema(description = "监督意见")
private java.lang.String supervisoryOpinion;
/**措施数量*/
@Excel(name = "措施数量", width = 15)
@ExcelColumn(name = "措施数量", width = 15)
@Schema(description = "措施数量")
private java.lang.Integer measureCount;
}
@@ -13,8 +13,6 @@ import org.jeecg.modules.supervision.inspectimprove.config.InspectImproveConfig;
import org.jeecg.common.system.api.ISysBaseAPI;
import org.jeecg.modules.supervision.dqinspecttask.entity.DqInspectTask;
import org.jeecg.modules.supervision.dqinspecttask.service.IDqInspectTaskService;
import org.jeecg.modules.supervision.inspectimprove.entity.DjInspectImprove;
import org.jeecg.modules.supervision.inspectimprove.service.IDjInspectImproveService;
import org.jeecg.modules.extbpm.process.common.expression.FlowNodeExpression;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -30,7 +28,6 @@ public class InspectImproveFlow {
private final InspectImproveConfig inspectImproveConfig;
private final OrgConfig orgConfig;
private final IDjInspectImproveService djInspectImproveService;
private final FlowNodeExpression flowNodeExpression;
private final ISysBaseAPI iSysBaseAPI;
private final IDqInspectTaskService dqInspectTaskService;
@@ -5,7 +5,6 @@ import org.flowable.engine.RuntimeService;
import org.flowable.engine.delegate.TaskListener;
import org.flowable.task.service.delegate.DelegateTask;
import org.jeecg.modules.supervision.inspectimprove.constant.InspectConstant;
import org.jeecg.modules.supervision.inspectimprove.service.IDjInspectImproveService;
import org.jeecg.modules.supervision.inspectimprove.config.InspectImproveConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -19,7 +18,6 @@ public class AfterDqLeaderApproveListener implements TaskListener {
private static final long serialVersionUID = 1L;
private final InspectImproveConfig inspectImproveConfig;
private final IDjInspectImproveService djInspectImproveService;
private final RuntimeService runtimeService;
@Override
@@ -5,7 +5,6 @@ import org.flowable.engine.RuntimeService;
import org.flowable.engine.delegate.TaskListener;
import org.flowable.task.service.delegate.DelegateTask;
import org.jeecg.modules.supervision.inspectimprove.constant.InspectConstant;
import org.jeecg.modules.supervision.inspectimprove.service.IDjInspectImproveService;
import org.jeecg.modules.supervision.inspectimprove.config.InspectImproveConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -19,7 +18,6 @@ public class AfterImplDeptLeaderApproveListener implements TaskListener {
private static final long serialVersionUID = 1L;
private final InspectImproveConfig inspectImproveConfig;
private final IDjInspectImproveService djInspectImproveService;
private final RuntimeService runtimeService;
@Override
@@ -1,50 +0,0 @@
package org.jeecg.modules.supervision.inspectimprove.listener;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.delegate.TaskListener;
import org.flowable.task.service.delegate.DelegateTask;
import org.jeecg.modules.supervision.inspectimprove.entity.DjInspectImprove;
import org.jeecg.modules.supervision.inspectimprove.service.IDjInspectImproveService;
import org.jeecg.modules.supervision.inspectimprove.config.InspectImproveConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Objects;
/**
* 巡视整改流程最终审批通过后,将业务表单状态标记为已完成
*/
@Slf4j
@Component("AfterInspectImproveCompleteListener")
@RequiredArgsConstructor(onConstructor_ = @Autowired)
public class AfterInspectImproveCompleteListener implements TaskListener {
private static final long serialVersionUID = 1L;
private final InspectImproveConfig inspectImproveConfig;
private final IDjInspectImproveService djInspectImproveService;
@Override
public void notify(DelegateTask delegateTask) {
Object businessKeyObj = delegateTask.getVariable(
inspectImproveConfig.getInspectImprove().getBusinessKey());
String businessKey = Objects.toString(businessKeyObj, "").trim();
if (businessKey.isEmpty()) {
log.warn("【巡视整改完成监听器】未查询到业务表单ID,跳过。TaskId: {}", delegateTask.getId());
return;
}
try {
DjInspectImprove entity = djInspectImproveService.getById(businessKey);
if (entity == null) {
log.warn("【巡视整改完成监听器】业务数据不存在,id: {}", businessKey);
return;
}
// TODO: 根据实际业务补充完成状态字段的更新逻辑
log.info("【巡视整改完成监听器】业务表单 [id={}] 流程已完成", businessKey);
} catch (Exception e) {
log.error("【巡视整改完成监听器】更新业务表单异常, businessKey: " + businessKey, e);
}
}
}
@@ -1,35 +0,0 @@
package org.jeecg.modules.supervision.inspectimprove.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.jeecg.common.system.vo.SelectTreeModel;
import org.jeecg.modules.supervision.inspectimprove.entity.DjInspectImprove;
import java.util.List;
import java.util.Map;
/**
* @Description: 巡视整改台账
* @Author: jeecg-boot
* @Date: 2026-05-18
* @Version: V1.0
*/
public interface DjInspectImproveMapper extends BaseMapper<DjInspectImprove> {
/**
* 编辑节点状态
* @param id
* @param status
*/
void updateTreeNodeStatus(@Param("id") String id,@Param("status") String status);
/**
* 【vue3专用】根据父级ID查询树节点数据
*
* @param pid
* @param query
* @return
*/
List<SelectTreeModel> queryListByPid(@Param("pid") String pid, @Param("query") Map<String, String> query);
}
@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.supervision.inspectimprove.mapper.DjInspectImproveMapper">
<update id="updateTreeNodeStatus" parameterType="java.lang.String">
update dj_inspect_improve set has_child = #{status} where id = #{id}
</update>
<!-- 【vue3专用】 -->
<select id="queryListByPid" parameterType="java.lang.Object" resultType="org.jeecg.common.system.vo.SelectTreeModel">
select
id as "key",
specical_question as "title",
(case when has_child = '1' then 0 else 1 end) as isLeaf,
pid as parentId
from dj_inspect_improve
where pid = #{pid}
<if test="query != null">
<foreach collection="query.entrySet()" item="value" index="key">
and ${key} = #{value}
</foreach>
</if>
</select>
</mapper>
@@ -1,74 +0,0 @@
package org.jeecg.modules.supervision.inspectimprove.service;
import org.jeecg.common.system.vo.SelectTreeModel;
import org.jeecg.modules.supervision.inspectimprove.entity.DjInspectImprove;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.common.exception.JeecgBootException;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.List;
/**
* @Description: 巡视整改台账
* @Author: jeecg-boot
* @Date: 2026-05-18
* @Version: V1.0
*/
public interface IDjInspectImproveService extends IService<DjInspectImprove> {
/**根节点父ID的值*/
public static final String ROOT_PID_VALUE = "0";
/**树节点有子节点状态值*/
public static final String HASCHILD = "1";
/**树节点无子节点状态值*/
public static final String NOCHILD = "0";
/**
* 新增节点
*
* @param djInspectImprove
*/
void addDjInspectImprove(DjInspectImprove djInspectImprove);
/**
* 修改节点
*
* @param djInspectImprove
* @throws JeecgBootException
*/
void updateDjInspectImprove(DjInspectImprove djInspectImprove) throws JeecgBootException;
/**
* 删除节点
*
* @param id
* @throws JeecgBootException
*/
void deleteDjInspectImprove(String id) throws JeecgBootException;
/**
* 查询所有数据,无分页
*
* @param queryWrapper
* @return List<DjInspectImprove>
*/
List<DjInspectImprove> queryTreeListNoPage(QueryWrapper<DjInspectImprove> queryWrapper);
/**
* 【vue3专用】根据父级编码加载分类字典的数据
*
* @param parentCode
* @return
*/
List<SelectTreeModel> queryListByCode(String parentCode);
/**
* 【vue3专用】根据pid查询子节点集合
*
* @param pid
* @return
*/
List<SelectTreeModel> queryListByPid(String pid);
}
@@ -1,219 +0,0 @@
package org.jeecg.modules.supervision.inspectimprove.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.common.system.vo.SelectTreeModel;
import org.jeecg.modules.supervision.inspectimprove.entity.DjInspectImprove;
import org.jeecg.modules.supervision.inspectimprove.mapper.DjInspectImproveMapper;
import org.jeecg.modules.supervision.inspectimprove.service.IDjInspectImproveService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: 巡视整改台账
* @Author: jeecg-boot
* @Date: 2026-05-18
* @Version: V1.0
*/
@Service
public class DjInspectImproveServiceImpl extends ServiceImpl<DjInspectImproveMapper, DjInspectImprove> implements IDjInspectImproveService {
@Override
public void addDjInspectImprove(DjInspectImprove djInspectImprove) {
//新增时设置hasChild为0
djInspectImprove.setHasChild(IDjInspectImproveService.NOCHILD);
if(oConvertUtils.isEmpty(djInspectImprove.getPid())){
djInspectImprove.setPid(IDjInspectImproveService.ROOT_PID_VALUE);
}else{
//如果当前节点父ID不为空 则设置父节点的hasChildren 为1
DjInspectImprove parent = baseMapper.selectById(djInspectImprove.getPid());
if(parent!=null && !"1".equals(parent.getHasChild())){
parent.setHasChild("1");
baseMapper.updateById(parent);
}
}
baseMapper.insert(djInspectImprove);
}
@Override
public void updateDjInspectImprove(DjInspectImprove djInspectImprove) {
DjInspectImprove entity = this.getById(djInspectImprove.getId());
if(entity==null) {
throw new JeecgBootException("未找到对应实体");
}
String old_pid = entity.getPid();
String new_pid = djInspectImprove.getPid();
if(!old_pid.equals(new_pid)) {
updateOldParentNode(old_pid);
if(oConvertUtils.isEmpty(new_pid)){
djInspectImprove.setPid(IDjInspectImproveService.ROOT_PID_VALUE);
}
if(!IDjInspectImproveService.ROOT_PID_VALUE.equals(djInspectImprove.getPid())) {
baseMapper.updateTreeNodeStatus(djInspectImprove.getPid(), IDjInspectImproveService.HASCHILD);
}
}
baseMapper.updateById(djInspectImprove);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteDjInspectImprove(String id) throws JeecgBootException {
//查询选中节点下所有子节点一并删除
id = this.queryTreeChildIds(id);
if(id.indexOf(",")>0) {
StringBuffer sb = new StringBuffer();
String[] idArr = id.split(",");
for (String idVal : idArr) {
if(idVal != null){
DjInspectImprove djInspectImprove = this.getById(idVal);
String pidVal = djInspectImprove.getPid();
//查询此节点上一级是否还有其他子节点
List<DjInspectImprove> dataList = baseMapper.selectList(new QueryWrapper<DjInspectImprove>().eq("pid", pidVal).notIn("id",Arrays.asList(idArr)));
boolean flag = (dataList == null || dataList.size() == 0) && !Arrays.asList(idArr).contains(pidVal) && !sb.toString().contains(pidVal);
if(flag){
//如果当前节点原本有子节点 现在木有了,更新状态
sb.append(pidVal).append(",");
}
}
}
//批量删除节点
baseMapper.deleteBatchIds(Arrays.asList(idArr));
//修改已无子节点的标识
String[] pidArr = sb.toString().split(",");
for(String pid : pidArr){
this.updateOldParentNode(pid);
}
}else{
DjInspectImprove djInspectImprove = this.getById(id);
if(djInspectImprove==null) {
throw new JeecgBootException("未找到对应实体");
}
updateOldParentNode(djInspectImprove.getPid());
baseMapper.deleteById(id);
}
}
@Override
public List<DjInspectImprove> queryTreeListNoPage(QueryWrapper<DjInspectImprove> queryWrapper) {
List<DjInspectImprove> dataList = baseMapper.selectList(queryWrapper);
List<DjInspectImprove> mapList = new ArrayList<>();
for(DjInspectImprove data : dataList){
String pidVal = data.getPid();
//递归查询子节点的根节点
if(pidVal != null && !IDjInspectImproveService.NOCHILD.equals(pidVal)){
DjInspectImprove rootVal = this.getTreeRoot(pidVal);
if(rootVal != null && !mapList.contains(rootVal)){
mapList.add(rootVal);
}
}else{
if(!mapList.contains(data)){
mapList.add(data);
}
}
}
return mapList;
}
@Override
public List<SelectTreeModel> queryListByCode(String parentCode) {
String pid = ROOT_PID_VALUE;
if (oConvertUtils.isNotEmpty(parentCode)) {
LambdaQueryWrapper<DjInspectImprove> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DjInspectImprove::getPid, parentCode);
List<DjInspectImprove> list = baseMapper.selectList(queryWrapper);
if (list == null || list.size() == 0) {
throw new JeecgBootException("该编码【" + parentCode + "】不存在,请核实!");
}
if (list.size() > 1) {
throw new JeecgBootException("该编码【" + parentCode + "】存在多个,请核实!");
}
pid = list.get(0).getId();
}
return baseMapper.queryListByPid(pid, null);
}
@Override
public List<SelectTreeModel> queryListByPid(String pid) {
if (oConvertUtils.isEmpty(pid)) {
pid = ROOT_PID_VALUE;
}
return baseMapper.queryListByPid(pid, null);
}
/**
* 根据所传pid查询旧的父级节点的子节点并修改相应状态值
* @param pid
*/
private void updateOldParentNode(String pid) {
if(!IDjInspectImproveService.ROOT_PID_VALUE.equals(pid)) {
Long count = baseMapper.selectCount(new QueryWrapper<DjInspectImprove>().eq("pid", pid));
if(count==null || count<=1) {
baseMapper.updateTreeNodeStatus(pid, IDjInspectImproveService.NOCHILD);
}
}
}
/**
* 递归查询节点的根节点
* @param pidVal
* @return
*/
private DjInspectImprove getTreeRoot(String pidVal){
DjInspectImprove data = baseMapper.selectById(pidVal);
if(data != null && !IDjInspectImproveService.ROOT_PID_VALUE.equals(data.getPid())){
return this.getTreeRoot(data.getPid());
}else{
return data;
}
}
/**
* 根据id查询所有子节点id
* @param ids
* @return
*/
private String queryTreeChildIds(String ids) {
//获取id数组
String[] idArr = ids.split(",");
StringBuffer sb = new StringBuffer();
for (String pidVal : idArr) {
if(pidVal != null){
if(!sb.toString().contains(pidVal)){
if(sb.toString().length() > 0){
sb.append(",");
}
sb.append(pidVal);
this.getTreeChildIds(pidVal,sb);
}
}
}
return sb.toString();
}
/**
* 递归查询所有子节点
* @param pidVal
* @param sb
* @return
*/
private StringBuffer getTreeChildIds(String pidVal,StringBuffer sb){
List<DjInspectImprove> dataList = baseMapper.selectList(new QueryWrapper<DjInspectImprove>().eq("pid", pidVal));
if(dataList != null && dataList.size()>0){
for(DjInspectImprove tree : dataList) {
if(!sb.toString().contains(tree.getId())){
sb.append(",").append(tree.getId());
}
this.getTreeChildIds(tree.getId(),sb);
}
}
return sb;
}
}
@@ -70,8 +70,8 @@ class InspectImproveFlowTest {
lenient().when(orgConfig.getDept()).thenReturn(dept);
lenient().when(orgConfig.getRole()).thenReturn(role);
// IDjInspectImproveService, FlowNodeExpression 未使用,传 null
flow = new InspectImproveFlow(inspectImproveConfig, orgConfig, null, null,
// FlowNodeExpression 未使用,传 null
flow = new InspectImproveFlow(inspectImproveConfig, orgConfig, null,
iSysBaseAPI, dqInspectTaskService, runtimeService);
}
@@ -25,7 +25,7 @@ class AfterDqLeaderApproveListenerTest {
when(delegateTask.getProcessInstanceId()).thenReturn("proc-001");
// inspectImproveConfig and djInspectImproveService 在此监听器中未使用,传 null
new AfterDqLeaderApproveListener(null, null, runtimeService).notify(delegateTask);
new AfterDqLeaderApproveListener(null, runtimeService).notify(delegateTask);
verify(runtimeService).setVariable("proc-001", InspectConstant.DQ_DEPT_LEADER_KEY, "zhangsan");
}
@@ -34,7 +34,7 @@ class AfterDqLeaderApproveListenerTest {
void shouldSkipWhenAssigneeIsNull() {
when(delegateTask.getAssignee()).thenReturn(null);
new AfterDqLeaderApproveListener(null, null, runtimeService).notify(delegateTask);
new AfterDqLeaderApproveListener(null, runtimeService).notify(delegateTask);
verify(runtimeService, never()).setVariable(any(), any(), any());
}
@@ -24,7 +24,7 @@ class AfterImplDeptLeaderApproveListenerTest {
when(delegateTask.getAssignee()).thenReturn("lisi");
when(delegateTask.getProcessInstanceId()).thenReturn("proc-002");
new AfterImplDeptLeaderApproveListener(null, null, runtimeService).notify(delegateTask);
new AfterImplDeptLeaderApproveListener(null, runtimeService).notify(delegateTask);
verify(runtimeService).setVariable("proc-002", InspectConstant.IMPL_DEPT_LEADER_KEY, "lisi");
}
@@ -33,7 +33,7 @@ class AfterImplDeptLeaderApproveListenerTest {
void shouldSkipWhenAssigneeIsNull() {
when(delegateTask.getAssignee()).thenReturn(null);
new AfterImplDeptLeaderApproveListener(null, null, runtimeService).notify(delegateTask);
new AfterImplDeptLeaderApproveListener(null, runtimeService).notify(delegateTask);
verify(runtimeService, never()).setVariable(any(), any(), any());
}
@@ -1,77 +0,0 @@
package org.jeecg.modules.supervision.inspectimprove.listener;
import static org.mockito.Mockito.*;
import org.flowable.task.service.delegate.DelegateTask;
import org.jeecg.modules.supervision.inspectimprove.config.InspectImproveConfig;
import org.jeecg.modules.supervision.inspectimprove.config.InspectImproveConfig.InspectImproveProperties;
import org.jeecg.modules.supervision.inspectimprove.entity.DjInspectImprove;
import org.jeecg.modules.supervision.inspectimprove.service.IDjInspectImproveService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
class AfterInspectImproveCompleteListenerTest {
@Mock
private InspectImproveConfig inspectImproveConfig;
@Mock
private IDjInspectImproveService djInspectImproveService;
@Mock
private DelegateTask delegateTask;
private AfterInspectImproveCompleteListener listener;
@BeforeEach
void setUp() {
InspectImproveProperties props = new InspectImproveProperties();
props.setBusinessKey("businessKey");
when(inspectImproveConfig.getInspectImprove()).thenReturn(props);
listener = new AfterInspectImproveCompleteListener(inspectImproveConfig, djInspectImproveService);
}
@Test
void shouldSkipWhenBusinessKeyIsNull() {
when(delegateTask.getVariable("businessKey")).thenReturn(null);
listener.notify(delegateTask);
verify(djInspectImproveService, never()).getById(any());
}
@Test
void shouldSkipWhenBusinessKeyIsEmpty() {
when(delegateTask.getVariable("businessKey")).thenReturn("");
listener.notify(delegateTask);
verify(djInspectImproveService, never()).getById(any());
}
@Test
void shouldSkipWhenEntityNotFound() {
when(delegateTask.getVariable("businessKey")).thenReturn("biz-001");
when(djInspectImproveService.getById("biz-001")).thenReturn(null);
listener.notify(delegateTask);
verify(djInspectImproveService).getById("biz-001");
}
@Test
void shouldNotThrowWhenEntityExists() {
when(delegateTask.getVariable("businessKey")).thenReturn("biz-001");
when(djInspectImproveService.getById("biz-001")).thenReturn(new DjInspectImprove());
// 当前实现仅有 TODO,不应抛异常
listener.notify(delegateTask);
verify(djInspectImproveService).getById("biz-001");
}
}
+1
View File
@@ -26,6 +26,7 @@ YYYYMMDD_描述.sql
| 2026-08-05 | DDL | `20260805_系统日志表新增操作人密级字段.sql` | sys_log 新增 user_security_level 列,记录操作人密级 |
| 2026-08-05 | DDL | `20260805_系统日志表新增操作结果字段.sql` | sys_log 新增 operate_result 列,记录操作日志成功/失败 |
| 2026-08-06 | DML | `20260806_纪检JJ部门用户挂靠修复.sql` | jj_worker_01/jj_leader_01 挂靠修正到纪检部门 2054466800692432898 |
| 2026-08-06 | DDL | `20260806_删除遗留dj_inspect_improve表.sql` | 删除遗留孤立实体 dj_inspect_improve 表 |
## 使用方式
@@ -0,0 +1,8 @@
-- 删除遗留孤立实体 dj_inspect_improve 表
-- 背景:DjInspectImprove 实体/控制器/服务为遗留代码——无前端页面、提升/销号流程均不引用
-- InspectImproveFlow 注入的 djInspectImproveService 从未被调用)、代码库外部无引用。
-- 且表结构(缺 pid/has_child/del_flag/bpm_status 列)与树表设计的实体不匹配。
-- 正确业务模型为:问题表 dq_inspect_problem + 具体措施表 dq_inspect_task。
-- 执行前请确认目标环境该表无需要保留的数据(本环境已确认 0 行)。
DROP TABLE IF EXISTS dj_inspect_improve;