Merge branch 'master' into dev

This commit is contained in:
wsm
2026-06-01 16:50:47 +08:00
22 changed files with 1480 additions and 24 deletions
@@ -40,6 +40,7 @@ import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
/**
* @Description: 党委会
@@ -53,6 +54,8 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
@Slf4j
public class BgPartymatterController extends JeecgController<BgPartymatter, IBgPartymatterService> {
private static final String DEFAULT_MEETING_TYPE = "party";
@Autowired
private IBgPartymatterService bgPartymatterService;
@@ -101,12 +104,13 @@ public class BgPartymatterController extends JeecgController<BgPartymatter, IBgP
*/
@AutoLog(value = "党委会-添加")
@Operation(summary="党委会-添加")
@RequiresPermissions("bgpartymatter:bg_partymatter:add")
@RequiresPermissions(value = {"bgpartymatter:bg_partymatter:add", "bgofficematter:bg_officematter:add"}, logical = Logical.OR)
@PostMapping(value = "/add")
public Result<String> add(@RequestBody BgPartymatter bgPartymatter) {
if (oConvertUtils.isEmpty(bgPartymatter.getDelFlag())) {
bgPartymatter.setDelFlag("0");
}
fillDefaultMeetingTypeForCreate(bgPartymatter);
fillGeneratedNumber(bgPartymatter);
bgPartymatterService.save(bgPartymatter);
return Result.OK("添加成功!");
@@ -119,9 +123,10 @@ public class BgPartymatterController extends JeecgController<BgPartymatter, IBgP
*/
@AutoLog(value = "党委会-编辑")
@Operation(summary="党委会-编辑")
@RequiresPermissions("bgpartymatter:bg_partymatter:edit")
@RequiresPermissions(value = {"bgpartymatter:bg_partymatter:edit", "bgofficematter:bg_officematter:edit"}, logical = Logical.OR)
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> edit(@RequestBody BgPartymatter bgPartymatter) {
fillMeetingTypeForUpdate(bgPartymatter);
fillGeneratedNumber(bgPartymatter);
bgPartymatterService.updateById(bgPartymatter);
return Result.OK("编辑成功!");
@@ -142,12 +147,39 @@ public class BgPartymatterController extends JeecgController<BgPartymatter, IBgP
return Result.error("流程实例ID不能为空");
}
String varField = oConvertUtils.isEmpty(dto.getVarField()) ? "json_data" : dto.getVarField();
fillMeetingTypeForUpdate(dto.getFormData());
fillGeneratedNumber(dto.getFormData());
bgPartymatterService.updateById(dto.getFormData());
runtimeService.setVariable(dto.getProcessInstanceId(), varField, JSONObject.toJSONString(dto.getFormData()));
return Result.OK("保存成功");
}
/**
* 新增入口没有会议类型时默认归入党委会,兼容旧页面和直接接口调用。
*/
private void fillDefaultMeetingTypeForCreate(BgPartymatter bgPartymatter) {
if (bgPartymatter != null && oConvertUtils.isEmpty(bgPartymatter.getMeetingType())) {
bgPartymatter.setMeetingType(DEFAULT_MEETING_TYPE);
}
}
/**
* 部分字段更新不传 meetingType 时沿用数据库原值,避免所务会被默认值覆盖为党委会。
*/
private void fillMeetingTypeForUpdate(BgPartymatter bgPartymatter) {
if (bgPartymatter == null || oConvertUtils.isNotEmpty(bgPartymatter.getMeetingType())) {
return;
}
if (oConvertUtils.isNotEmpty(bgPartymatter.getId())) {
BgPartymatter oldData = bgPartymatterService.getById(bgPartymatter.getId());
if (oldData != null && oConvertUtils.isNotEmpty(oldData.getMeetingType())) {
bgPartymatter.setMeetingType(oldData.getMeetingType());
return;
}
}
bgPartymatter.setMeetingType(DEFAULT_MEETING_TYPE);
}
/**
* 根据会议时间和议题序号生成业务序号,规则:yyyyMMdd-议题序号。
* 前端会即时回显,后端保存前再次生成,保证接口调用和流程保存数据一致。
@@ -167,7 +199,7 @@ public class BgPartymatterController extends JeecgController<BgPartymatter, IBgP
*/
@AutoLog(value = "党委会-通过id删除")
@Operation(summary="党委会-通过id删除")
@RequiresPermissions("bgpartymatter:bg_partymatter:delete")
@RequiresPermissions(value = {"bgpartymatter:bg_partymatter:delete", "bgofficematter:bg_officematter:delete"}, logical = Logical.OR)
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name="id",required=true) String id) {
bgPartymatterService.delMain(id);
@@ -181,7 +213,7 @@ public class BgPartymatterController extends JeecgController<BgPartymatter, IBgP
*/
@AutoLog(value = "党委会-批量删除")
@Operation(summary="党委会-批量删除")
@RequiresPermissions("bgpartymatter:bg_partymatter:deleteBatch")
@RequiresPermissions(value = {"bgpartymatter:bg_partymatter:deleteBatch", "bgofficematter:bg_officematter:deleteBatch"}, logical = Logical.OR)
@DeleteMapping(value = "/deleteBatch")
public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
this.bgPartymatterService.delBatchMain(Arrays.asList(ids.split(",")));
@@ -192,17 +224,18 @@ public class BgPartymatterController extends JeecgController<BgPartymatter, IBgP
* 导出
* @return
*/
@RequiresPermissions("bgpartymatter:bg_partymatter:exportXls")
@RequiresPermissions(value = {"bgpartymatter:bg_partymatter:exportXls", "bgofficematter:bg_officematter:exportXls"}, logical = Logical.OR)
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, BgPartymatter bgPartymatter) {
return super.exportXls(request, bgPartymatter, BgPartymatter.class, "党委会");
String exportName = "office".equals(bgPartymatter.getMeetingType()) ? "所务会" : "党委会";
return super.exportXls(request, bgPartymatter, BgPartymatter.class, exportName);
}
/**
* 导入
* @return
*/
@RequiresPermissions("bgpartymatter:bg_partymatter:importExcel")
@RequiresPermissions(value = {"bgpartymatter:bg_partymatter:importExcel", "bgofficematter:bg_officematter:importExcel"}, logical = Logical.OR)
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, BgPartymatter.class);
@@ -57,6 +57,10 @@ public class BgPartymatter implements Serializable {
@Excel(name = "年份", width = 15)
@Schema(description = "年份")
private java.lang.String year;
/**会议类型*/
@Schema(description = "会议类型:party党委会,office所务会")
@TableField("meeting_type")
private java.lang.String meetingType;
/**密级*/
@Excel(name = "密级", width = 15)
@Dict(dicCode = "secret_level")
@@ -193,6 +193,27 @@ public class DqInspectProblemController extends JeecgController<DqInspectProblem
}
}
/**
* 根据当前节点类型获取合法父级候选。
*
* @param nodeType 当前节点类型
* @return 父级候选树
*/
@Operation(summary="dq_inspect_problem-父级候选")
@GetMapping(value = "/parentOptions")
public Result<List<Map<String, Object>>> parentOptions(@RequestParam(name = "nodeType") String nodeType) {
return Result.OK(dqInspectProblemService.queryParentOptions(nodeType));
}
/**
* 任务清单选择具体问题时使用,分类和面上问题仅用于分组展示,不可选择。
*/
@Operation(summary="dq_inspect_problem-具体问题候选")
@GetMapping(value = "/specificOptions")
public Result<List<Map<String, Object>>> specificOptions() {
return Result.OK(dqInspectProblemService.querySpecificOptions());
}
/**
* 添加
*
@@ -6,6 +6,7 @@ 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;
import java.util.Map;
/**
* @Description: dq_inspect_problem
@@ -24,6 +25,12 @@ public interface IDqInspectProblemService extends IService<DqInspectProblem> {
/**树节点无子节点状态值*/
public static final String NOCHILD = "0";
String NODE_TYPE_CATEGORY = "category";
String NODE_TYPE_SURFACE = "surface";
String NODE_TYPE_SPECIFIC = "specific";
/**
* 新增节点
*
@@ -71,4 +78,19 @@ public interface IDqInspectProblemService extends IService<DqInspectProblem> {
*/
List<SelectTreeModel> queryListByPid(String pid);
/**
* 根据当前节点类型,返回合法的父级候选树。
*
* @param nodeType 当前节点类型
* @return 父级候选树
*/
List<Map<String, Object>> queryParentOptions(String nodeType);
/**
* 返回任务清单可选择的具体问题树:问题分类 -> 面上问题 -> 具体问题。
*
* @return 具体问题候选树
*/
List<Map<String, Object>> querySpecificOptions();
}
@@ -12,7 +12,9 @@ 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.HashMap;
import java.util.List;
import java.util.Map;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -27,6 +29,7 @@ public class DqInspectProblemServiceImpl extends ServiceImpl<DqInspectProblemMap
@Override
public void addDqInspectProblem(DqInspectProblem dqInspectProblem) {
validateAndNormalizeNode(dqInspectProblem, false);
//新增时设置hasChild为0
dqInspectProblem.setHasChild(IDqInspectProblemService.NOCHILD);
if(oConvertUtils.isEmpty(dqInspectProblem.getPid())){
@@ -48,9 +51,12 @@ public class DqInspectProblemServiceImpl extends ServiceImpl<DqInspectProblemMap
if(entity==null) {
throw new JeecgBootException("未找到对应实体");
}
validateAndNormalizeNode(dqInspectProblem, true);
// hasChild 由树结构维护,忽略前端提交值,避免编辑时误改父子状态。
dqInspectProblem.setHasChild(entity.getHasChild());
String old_pid = entity.getPid();
String new_pid = dqInspectProblem.getPid();
if(!old_pid.equals(new_pid)) {
if(!trimToEmpty(old_pid).equals(trimToEmpty(new_pid))) {
updateOldParentNode(old_pid);
if(oConvertUtils.isEmpty(new_pid)){
dqInspectProblem.setPid(IDqInspectProblemService.ROOT_PID_VALUE);
@@ -139,6 +145,178 @@ public class DqInspectProblemServiceImpl extends ServiceImpl<DqInspectProblemMap
return baseMapper.queryListByPid(pid, null);
}
@Override
public List<Map<String, Object>> queryParentOptions(String nodeType) {
if (NODE_TYPE_SURFACE.equals(nodeType)) {
return queryParentNodesByType(NODE_TYPE_CATEGORY);
}
if (NODE_TYPE_SPECIFIC.equals(nodeType)) {
return querySurfaceParentTree();
}
return new ArrayList<>();
}
@Override
public List<Map<String, Object>> querySpecificOptions() {
return querySpecificProblemTree();
}
/**
* 问题清单固定为三层:问题分类 -> 面上问题 -> 具体问题。
* 服务层兜底校验层级,避免绕过前端直接提交非法关系。
*/
private void validateAndNormalizeNode(DqInspectProblem dqInspectProblem, boolean update) {
if (dqInspectProblem == null) {
throw new JeecgBootException("表单数据不能为空");
}
String nodeType = trimToEmpty(dqInspectProblem.getNodeType());
if (!NODE_TYPE_CATEGORY.equals(nodeType) && !NODE_TYPE_SURFACE.equals(nodeType) && !NODE_TYPE_SPECIFIC.equals(nodeType)) {
throw new JeecgBootException("请选择正确的问题种类");
}
dqInspectProblem.setNodeType(nodeType);
if (NODE_TYPE_CATEGORY.equals(nodeType)) {
dqInspectProblem.setPid(ROOT_PID_VALUE);
clearSpecificFields(dqInspectProblem);
return;
}
String pid = trimToEmpty(dqInspectProblem.getPid());
if (oConvertUtils.isEmpty(pid) || ROOT_PID_VALUE.equals(pid)) {
throw new JeecgBootException("请选择上一级问题");
}
if (update && pid.equals(dqInspectProblem.getId())) {
throw new JeecgBootException("上一级问题不能选择自身");
}
if (update && isDescendantOf(pid, dqInspectProblem.getId())) {
throw new JeecgBootException("上一级问题不能选择当前节点的下级节点");
}
DqInspectProblem parent = baseMapper.selectById(pid);
if (parent == null) {
throw new JeecgBootException("上一级问题不存在");
}
String expectedParentType = NODE_TYPE_SURFACE.equals(nodeType) ? NODE_TYPE_CATEGORY : NODE_TYPE_SURFACE;
if (!expectedParentType.equals(parent.getNodeType())) {
throw new JeecgBootException("上一级问题类型不正确");
}
dqInspectProblem.setPid(pid);
if (!NODE_TYPE_SPECIFIC.equals(nodeType)) {
clearSpecificFields(dqInspectProblem);
}
}
private void clearSpecificFields(DqInspectProblem dqInspectProblem) {
dqInspectProblem.setInspectAdvice(null);
dqInspectProblem.setQuestionResLeader(null);
dqInspectProblem.setQuestionResDept(null);
}
private String trimToEmpty(String value) {
return value == null ? "" : value.trim();
}
private boolean isDescendantOf(String possibleChildId, String parentId) {
if (oConvertUtils.isEmpty(possibleChildId) || oConvertUtils.isEmpty(parentId)) {
return false;
}
DqInspectProblem node = baseMapper.selectById(possibleChildId);
while (node != null && !ROOT_PID_VALUE.equals(node.getPid())) {
if (parentId.equals(node.getPid())) {
return true;
}
node = baseMapper.selectById(node.getPid());
}
return false;
}
private List<Map<String, Object>> queryParentNodesByType(String nodeType) {
List<DqInspectProblem> nodes = baseMapper.selectList(
new QueryWrapper<DqInspectProblem>()
.eq("node_type", nodeType)
.orderByAsc("sort_no", "create_time")
);
List<Map<String, Object>> result = new ArrayList<>();
for (DqInspectProblem node : nodes) {
result.add(toTreeOption(node, false));
}
return result;
}
private List<Map<String, Object>> querySurfaceParentTree() {
List<DqInspectProblem> categories = baseMapper.selectList(
new QueryWrapper<DqInspectProblem>()
.eq("node_type", NODE_TYPE_CATEGORY)
.orderByAsc("sort_no", "create_time")
);
List<Map<String, Object>> result = new ArrayList<>();
for (DqInspectProblem category : categories) {
Map<String, Object> categoryOption = toTreeOption(category, true);
List<DqInspectProblem> surfaces = baseMapper.selectList(
new QueryWrapper<DqInspectProblem>()
.eq("pid", category.getId())
.eq("node_type", NODE_TYPE_SURFACE)
.orderByAsc("sort_no", "create_time")
);
List<Map<String, Object>> children = new ArrayList<>();
for (DqInspectProblem surface : surfaces) {
children.add(toTreeOption(surface, false));
}
categoryOption.put("children", children);
result.add(categoryOption);
}
return result;
}
private List<Map<String, Object>> querySpecificProblemTree() {
List<DqInspectProblem> categories = baseMapper.selectList(
new QueryWrapper<DqInspectProblem>()
.eq("node_type", NODE_TYPE_CATEGORY)
.orderByAsc("sort_no", "create_time")
);
List<Map<String, Object>> result = new ArrayList<>();
for (DqInspectProblem category : categories) {
Map<String, Object> categoryOption = toTreeOption(category, true);
List<DqInspectProblem> surfaces = baseMapper.selectList(
new QueryWrapper<DqInspectProblem>()
.eq("pid", category.getId())
.eq("node_type", NODE_TYPE_SURFACE)
.orderByAsc("sort_no", "create_time")
);
List<Map<String, Object>> surfaceOptions = new ArrayList<>();
for (DqInspectProblem surface : surfaces) {
Map<String, Object> surfaceOption = toTreeOption(surface, true);
List<DqInspectProblem> specifics = baseMapper.selectList(
new QueryWrapper<DqInspectProblem>()
.eq("pid", surface.getId())
.eq("node_type", NODE_TYPE_SPECIFIC)
.orderByAsc("sort_no", "create_time")
);
List<Map<String, Object>> specificOptions = new ArrayList<>();
for (DqInspectProblem specific : specifics) {
specificOptions.add(toTreeOption(specific, false));
}
surfaceOption.put("children", specificOptions);
surfaceOptions.add(surfaceOption);
}
categoryOption.put("children", surfaceOptions);
result.add(categoryOption);
}
return result;
}
private Map<String, Object> toTreeOption(DqInspectProblem node, boolean disabled) {
Map<String, Object> option = new HashMap<>();
option.put("key", node.getId());
option.put("value", node.getId());
option.put("title", node.getProblemName());
option.put("label", node.getProblemName());
option.put("nodeType", node.getNodeType());
option.put("disabled", disabled);
return option;
}
@Override
public List<SelectTreeModel> queryListByPid(String pid) {
if (oConvertUtils.isEmpty(pid)) {
@@ -0,0 +1,293 @@
package org.jeecg.modules.demo.dqinspecttask.controller;
import java.io.UnsupportedEncodingException;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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.vo.LoginUser;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.query.QueryRuleEnum;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.demo.dqinspecttask.entity.DqInspectProgress;
import org.jeecg.modules.demo.dqinspecttask.entity.DqInspectTask;
import org.jeecg.modules.demo.dqinspecttask.vo.DqInspectTaskLedgerVo;
import org.jeecg.modules.demo.dqinspecttask.vo.DqInspectTaskPage;
import org.jeecg.modules.demo.dqinspecttask.service.IDqInspectTaskService;
import org.jeecg.modules.demo.dqinspecttask.service.IDqInspectProgressService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
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 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: dq_inspect_task
* @Author: jeecg-boot
* @Date: 2026-05-28
* @Version: V1.0
*/
@Tag(name="dq_inspect_task")
@RestController
@RequestMapping("/dqinspecttask/dqInspectTask")
@Slf4j
public class DqInspectTaskController {
@Autowired
private IDqInspectTaskService dqInspectTaskService;
@Autowired
private IDqInspectProgressService dqInspectProgressService;
/**
* 分页列表查询
*
* @param dqInspectTask
* @param pageNo
* @param pageSize
* @param req
* @return
*/
//@AutoLog(value = "dq_inspect_task-分页列表查询")
@Operation(summary="dq_inspect_task-分页列表查询")
@GetMapping(value = "/list")
public Result<IPage<DqInspectTask>> queryPageList(DqInspectTask dqInspectTask,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<DqInspectTask> queryWrapper = QueryGenerator.initQueryWrapper(dqInspectTask, req.getParameterMap());
Page<DqInspectTask> page = new Page<DqInspectTask>(pageNo, pageSize);
IPage<DqInspectTask> pageList = dqInspectTaskService.page(page, queryWrapper);
return Result.OK(pageList);
}
/**
* 整改任务台账:一行一条整改任务,补齐问题分类、面上问题、具体问题。
*
* @param dqInspectTask
* @param pageNo
* @param pageSize
* @return
*/
@Operation(summary="dq_inspect_task-台账分页列表查询")
@GetMapping(value = "/ledgerList")
public Result<IPage<DqInspectTaskLedgerVo>> queryLedgerList(DqInspectTask dqInspectTask,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize) {
Page<DqInspectTaskLedgerVo> page = new Page<DqInspectTaskLedgerVo>(pageNo, pageSize);
IPage<DqInspectTaskLedgerVo> pageList = dqInspectTaskService.queryLedgerPage(page, dqInspectTask);
return Result.OK(pageList);
}
/**
* 添加
*
* @param dqInspectTaskPage
* @return
*/
@AutoLog(value = "dq_inspect_task-添加")
@Operation(summary="dq_inspect_task-添加")
@RequiresPermissions("dqinspecttask:dq_inspect_task:add")
@PostMapping(value = "/add")
public Result<String> add(@RequestBody DqInspectTaskPage dqInspectTaskPage) {
DqInspectTask dqInspectTask = new DqInspectTask();
BeanUtils.copyProperties(dqInspectTaskPage, dqInspectTask);
dqInspectTask.setBpmStatus("1");
if (oConvertUtils.isEmpty(dqInspectTask.getDelFlag())) {
dqInspectTask.setDelFlag("0");
}
dqInspectTaskService.saveMain(dqInspectTask, dqInspectTaskPage.getDqInspectProgressList());
return Result.OK("添加成功!");
}
/**
* 编辑
*
* @param dqInspectTaskPage
* @return
*/
@AutoLog(value = "dq_inspect_task-编辑")
@Operation(summary="dq_inspect_task-编辑")
@RequiresPermissions("dqinspecttask:dq_inspect_task:edit")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> edit(@RequestBody DqInspectTaskPage dqInspectTaskPage) {
DqInspectTask dqInspectTask = new DqInspectTask();
BeanUtils.copyProperties(dqInspectTaskPage, dqInspectTask);
DqInspectTask dqInspectTaskEntity = dqInspectTaskService.getById(dqInspectTask.getId());
if(dqInspectTaskEntity==null) {
return Result.error("未找到对应数据");
}
dqInspectTaskService.updateMain(dqInspectTask, dqInspectTaskPage.getDqInspectProgressList());
return Result.OK("编辑成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "dq_inspect_task-通过id删除")
@Operation(summary="dq_inspect_task-通过id删除")
@RequiresPermissions("dqinspecttask:dq_inspect_task:delete")
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name="id",required=true) String id) {
dqInspectTaskService.delMain(id);
return Result.OK("删除成功!");
}
/**
* 批量删除
*
* @param ids
* @return
*/
@AutoLog(value = "dq_inspect_task-批量删除")
@Operation(summary="dq_inspect_task-批量删除")
@RequiresPermissions("dqinspecttask:dq_inspect_task:deleteBatch")
@DeleteMapping(value = "/deleteBatch")
public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
this.dqInspectTaskService.delBatchMain(Arrays.asList(ids.split(",")));
return Result.OK("批量删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
//@AutoLog(value = "dq_inspect_task-通过id查询")
@Operation(summary="dq_inspect_task-通过id查询")
@GetMapping(value = "/queryById")
public Result<DqInspectTask> queryById(@RequestParam(name="id",required=true) String id) {
DqInspectTask dqInspectTask = dqInspectTaskService.getById(id);
if(dqInspectTask==null) {
return Result.error("未找到对应数据");
}
return Result.OK(dqInspectTask);
}
/**
* 通过id查询
*
* @param id
* @return
*/
//@AutoLog(value = "工作进展反馈通过主表ID查询")
@Operation(summary="工作进展反馈主表ID查询")
@GetMapping(value = "/queryDqInspectProgressByMainId")
public Result<List<DqInspectProgress>> queryDqInspectProgressListByMainId(@RequestParam(name="id",required=true) String id) {
List<DqInspectProgress> dqInspectProgressList = dqInspectProgressService.selectByMainId(id);
return Result.OK(dqInspectProgressList);
}
/**
* 导出excel
*
* @param request
* @param dqInspectTask
*/
@RequiresPermissions("dqinspecttask:dq_inspect_task:exportXls")
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, DqInspectTask dqInspectTask) {
// Step.1 组装查询条件查询数据
QueryWrapper<DqInspectTask> queryWrapper = QueryGenerator.initQueryWrapper(dqInspectTask, request.getParameterMap());
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
//配置选中数据查询条件
String selections = request.getParameter("selections");
if(oConvertUtils.isNotEmpty(selections)) {
List<String> selectionList = Arrays.asList(selections.split(","));
queryWrapper.in("id",selectionList);
}
//Step.2 获取导出数据
List<DqInspectTask> dqInspectTaskList = dqInspectTaskService.list(queryWrapper);
// Step.3 组装pageList
List<DqInspectTaskPage> pageList = new ArrayList<DqInspectTaskPage>();
for (DqInspectTask main : dqInspectTaskList) {
DqInspectTaskPage vo = new DqInspectTaskPage();
BeanUtils.copyProperties(main, vo);
List<DqInspectProgress> dqInspectProgressList = dqInspectProgressService.selectByMainId(main.getId());
vo.setDqInspectProgressList(dqInspectProgressList);
pageList.add(vo);
}
// Step.4 AutoPoi 导出Excel
ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
mv.addObject(NormalExcelConstants.FILE_NAME, "dq_inspect_task列表");
mv.addObject(NormalExcelConstants.CLASS, DqInspectTaskPage.class);
mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("dq_inspect_task数据", "导出人:"+sysUser.getRealname(), "dq_inspect_task"));
mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
return mv;
}
/**
* 通过excel导入数据
*
* @param request
* @param response
* @return
*/
@RequiresPermissions("dqinspecttask:dq_inspect_task:importExcel")
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
// 获取上传文件对象
MultipartFile file = entity.getValue();
ImportParams params = new ImportParams();
params.setTitleRows(2);
params.setHeadRows(1);
params.setNeedSave(true);
try {
List<DqInspectTaskPage> list = ExcelImportUtil.importExcel(file.getInputStream(), DqInspectTaskPage.class, params);
for (DqInspectTaskPage page : list) {
DqInspectTask po = new DqInspectTask();
BeanUtils.copyProperties(page, po);
dqInspectTaskService.saveMain(po, page.getDqInspectProgressList());
}
return Result.OK("文件导入成功!数据行数:" + list.size());
} catch (Exception e) {
log.error(e.getMessage(),e);
return Result.error("文件导入失败:"+e.getMessage());
} finally {
try {
file.getInputStream().close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return Result.OK("文件导入失败!");
}
}
@@ -0,0 +1,91 @@
package org.jeecg.modules.demo.dqinspecttask.entity;
import java.io.Serializable;
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 java.util.Date;
import io.swagger.v3.oas.annotations.media.Schema;
import java.io.UnsupportedEncodingException;
/**
* @Description: 工作进展反馈
* @Author: jeecg-boot
* @Date: 2026-05-28
* @Version: V1.0
*/
@Schema(description="工作进展反馈")
@Data
@TableName("dq_inspect_progress")
public class DqInspectProgress implements Serializable {
private static final long serialVersionUID = 1L;
/**id*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description = "id")
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 feedbackDeptId;
/**反馈部门名称*/
@Excel(name = "反馈部门名称", width = 15)
@Schema(description = "反馈部门名称")
private java.lang.String feedbackDeptName;
/**反馈人ID*/
@Excel(name = "反馈人ID", width = 15)
@Schema(description = "反馈人ID")
private java.lang.String feedbackPersonId;
/**反馈人姓名*/
@Excel(name = "反馈人姓名", width = 15)
@Schema(description = "反馈人姓名")
private java.lang.String feedbackPersonName;
/**实际完成时间*/
@Excel(name = "实际完成时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
@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 actualTime;
/**工作进展*/
@Excel(name = "工作进展", width = 15)
@Schema(description = "工作进展")
private java.lang.String workProgress;
/**进展状态*/
@Excel(name = "进展状态", width = 15, dicCode = "feedback_status")
@Schema(description = "进展状态")
private java.lang.String bpmStatus;
/**删除标识*/
@Excel(name = "删除标识", width = 15)
@Schema(description = "删除标识")
@TableLogic
private java.lang.String delFlag;
/**整改措施任务ID*/
@Schema(description = "整改措施任务ID")
private java.lang.String mainId;
}
@@ -0,0 +1,145 @@
package org.jeecg.modules.demo.dqinspecttask.entity;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.Date;
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.aspect.annotation.Dict;
import io.swagger.v3.oas.annotations.media.Schema;
/**
* @Description: dq_inspect_task
* @Author: jeecg-boot
* @Date: 2026-05-28
* @Version: V1.0
*/
@Schema(description="dq_inspect_task")
@Data
@TableName("dq_inspect_task")
public class DqInspectTask implements Serializable {
private static final long serialVersionUID = 1L;
/**id*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description = "id")
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 = "具体问题", width = 15, dictTable = "dq_inspect_problem", dicText = "problem_name", dicCode = "id")
@Dict(dictTable = "dq_inspect_problem", dicText = "problem_name", dicCode = "id")
@Schema(description = "具体问题ID")
private java.lang.String problemId;
/**密级*/
@Excel(name = "密级", width = 15, dicCode = "secret_level")
@Dict(dicCode = "secret_level")
@Schema(description = "密级")
private java.lang.String secretLevel;
/**整改措施*/
@Excel(name = "整改措施", width = 15)
@Schema(description = "整改措施")
private java.lang.String improveMeasure;
/**完成时限*/
@Excel(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)
@Schema(description = "目标节点")
private java.lang.String targetNode;
/**措施责任领导*/
@Excel(name = "措施责任领导", width = 15, dictTable = "sys_user", dicText = "realname", dicCode = "username")
@Dict(dictTable = "sys_user", dicText = "realname", dicCode = "username")
@Schema(description = "措施责任领导")
private java.lang.String measureResLeader;
/**措施责任部门*/
@Excel(name = "措施责任部门", width = 15, dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
@Dict(dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
@Schema(description = "措施责任部门")
private java.lang.String measureResDept;
/**整改交付成果*/
@Excel(name = "整改交付成果", width = 15)
@Schema(description = "整改交付成果")
private java.lang.String rectificationEvidence;
/**成效评价标准*/
@Excel(name = "成效评价标准", width = 15)
@Schema(description = "成效评价标准")
private java.lang.String evaluationCriterion;
/**是否需要党群领导审批*/
@Excel(name = "是否需要党群领导审批", width = 15, dicCode = "yn")
@Dict(dicCode = "yn")
@Schema(description = "是否需要党群领导审批")
private java.lang.String isNeedAppro;
/**党群领导*/
@Excel(name = "党群领导", width = 15, dictTable = "sys_user", dicText = "realname", dicCode = "username")
@Dict(dictTable = "sys_user", dicText = "realname", dicCode = "username")
@Schema(description = "党群领导")
private java.lang.String supDeptleaderid;
/**检查情况*/
@Excel(name = "检查情况", width = 15)
@Schema(description = "检查情况")
private java.lang.String inspectionStatus;
/**监督意见*/
@Excel(name = "监督意见", width = 15)
@Schema(description = "监督意见")
private java.lang.String supervisoryOpinion;
/**措施数量*/
@Excel(name = "措施数量", width = 15)
@Schema(description = "措施数量")
private java.lang.Integer measureCount;
/**流程实例ID*/
@Excel(name = "流程实例ID", width = 15)
@Schema(description = "流程实例ID")
private java.lang.String bpmProcessId;
/**流程状态*/
@Excel(name = "流程状态", width = 15, dicCode = "super_status")
@Dict(dicCode = "super_status")
@Schema(description = "流程状态")
private java.lang.String bpmStatus;
/**整改状态*/
@Excel(name = "整改状态", width = 15)
@Schema(description = "整改状态")
private java.lang.String taskStatus;
/**督办次数*/
@Excel(name = "督办次数", width = 15)
@Schema(description = "督办次数")
private java.lang.String superviseCount;
/**排序*/
@Excel(name = "排序", width = 15)
@Schema(description = "排序")
private java.lang.Integer sortNo;
/**删除标识*/
@Excel(name = "删除标识", width = 15)
@Schema(description = "删除标识")
@TableLogic
private java.lang.String delFlag;
}
@@ -0,0 +1,31 @@
package org.jeecg.modules.demo.dqinspecttask.mapper;
import java.util.List;
import org.jeecg.modules.demo.dqinspecttask.entity.DqInspectProgress;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
/**
* @Description: 工作进展反馈
* @Author: jeecg-boot
* @Date: 2026-05-28
* @Version: V1.0
*/
public interface DqInspectProgressMapper extends BaseMapper<DqInspectProgress> {
/**
* 通过主表id删除子表数据
*
* @param mainId 主表id
* @return boolean
*/
public boolean deleteByMainId(@Param("mainId") String mainId);
/**
* 通过主表id查询子表数据
*
* @param mainId 主表id
* @return List<DqInspectProgress>
*/
public List<DqInspectProgress> selectByMainId(@Param("mainId") String mainId);
}
@@ -0,0 +1,29 @@
package org.jeecg.modules.demo.dqinspecttask.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.demo.dqinspecttask.entity.DqInspectTask;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.jeecg.modules.demo.dqinspecttask.vo.DqInspectTaskLedgerVo;
/**
* @Description: dq_inspect_task
* @Author: jeecg-boot
* @Date: 2026-05-28
* @Version: V1.0
*/
public interface DqInspectTaskMapper extends BaseMapper<DqInspectTask> {
/**
* 查询整改任务台账,补齐问题分类、面上问题、具体问题信息。
*
* @param page 分页参数
* @param task 查询条件
* @return 台账分页
*/
IPage<DqInspectTaskLedgerVo> queryLedgerPage(Page<DqInspectTaskLedgerVo> page, @Param("task") DqInspectTask task);
}
@@ -0,0 +1,16 @@
<?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.demo.dqinspecttask.mapper.DqInspectProgressMapper">
<delete id="deleteByMainId" parameterType="java.lang.String">
DELETE
FROM dq_inspect_progress
WHERE
main_id = #{mainId} </delete>
<select id="selectByMainId" parameterType="java.lang.String" resultType="org.jeecg.modules.demo.dqinspecttask.entity.DqInspectProgress">
SELECT *
FROM dq_inspect_progress
WHERE
main_id = #{mainId} </select>
</mapper>
@@ -0,0 +1,72 @@
<?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.demo.dqinspecttask.mapper.DqInspectTaskMapper">
<select id="queryLedgerPage" resultType="org.jeecg.modules.demo.dqinspecttask.vo.DqInspectTaskLedgerVo">
select
t.id,
p_category.id as categoryId,
p_category.problem_name as categoryName,
p_surface.id as surfaceId,
p_surface.problem_name as surfaceName,
p_specific.id as specificId,
p_specific.problem_name as specificName,
t.problem_id as problemId,
p_specific.inspect_advice as inspectAdvice,
t.secret_level as secretLevel,
t.improve_measure as improveMeasure,
t.deadline,
t.target_node as targetNode,
t.measure_res_leader as measureResLeader,
t.measure_res_dept as measureResDept,
t.rectification_evidence as rectificationEvidence,
t.evaluation_criterion as evaluationCriterion,
t.is_need_appro as isNeedAppro,
t.sup_deptleaderid as supDeptleaderid,
t.inspection_status as inspectionStatus,
t.supervisory_opinion as supervisoryOpinion,
t.measure_count as measureCount,
t.bpm_process_id as bpmProcessId,
t.bpm_status as bpmStatus,
t.task_status as taskStatus,
t.supervise_count as superviseCount,
t.sort_no as sortNo,
t.create_time as createTime
from dq_inspect_task t
inner join dq_inspect_problem p_specific
on t.problem_id = p_specific.id
and p_specific.node_type = 'specific'
and ifnull(p_specific.del_flag, '0') = '0'
left join dq_inspect_problem p_surface
on p_specific.pid = p_surface.id
and ifnull(p_surface.del_flag, '0') = '0'
left join dq_inspect_problem p_category
on p_surface.pid = p_category.id
and ifnull(p_category.del_flag, '0') = '0'
where ifnull(t.del_flag, '0') = '0'
<if test="task != null">
<if test="task.improveMeasure != null and task.improveMeasure != ''">
and t.improve_measure like concat('%', #{task.improveMeasure}, '%')
</if>
<if test="task.measureResLeader != null and task.measureResLeader != ''">
and t.measure_res_leader = #{task.measureResLeader}
</if>
<if test="task.measureResDept != null and task.measureResDept != ''">
and t.measure_res_dept = #{task.measureResDept}
</if>
<if test="task.problemId != null and task.problemId != ''">
and t.problem_id = #{task.problemId}
</if>
</if>
order by
p_category.sort_no asc,
p_category.create_time asc,
p_surface.sort_no asc,
p_surface.create_time asc,
p_specific.sort_no asc,
p_specific.create_time asc,
t.sort_no asc,
t.create_time asc
</select>
</mapper>
@@ -0,0 +1,22 @@
package org.jeecg.modules.demo.dqinspecttask.service;
import org.jeecg.modules.demo.dqinspecttask.entity.DqInspectProgress;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* @Description: 工作进展反馈
* @Author: jeecg-boot
* @Date: 2026-05-28
* @Version: V1.0
*/
public interface IDqInspectProgressService extends IService<DqInspectProgress> {
/**
* 通过主表id查询子表数据
*
* @param mainId 主表id
* @return List<DqInspectProgress>
*/
public List<DqInspectProgress> selectByMainId(String mainId);
}
@@ -0,0 +1,60 @@
package org.jeecg.modules.demo.dqinspecttask.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.jeecg.modules.demo.dqinspecttask.entity.DqInspectProgress;
import org.jeecg.modules.demo.dqinspecttask.entity.DqInspectTask;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.demo.dqinspecttask.vo.DqInspectTaskLedgerVo;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
/**
* @Description: dq_inspect_task
* @Author: jeecg-boot
* @Date: 2026-05-28
* @Version: V1.0
*/
public interface IDqInspectTaskService extends IService<DqInspectTask> {
/**
* 添加一对多
*
* @param dqInspectTask
* @param dqInspectProgressList
*/
public void saveMain(DqInspectTask dqInspectTask,List<DqInspectProgress> dqInspectProgressList) ;
/**
* 修改一对多
*
* @param dqInspectTask
* @param dqInspectProgressList
*/
public void updateMain(DqInspectTask dqInspectTask,List<DqInspectProgress> dqInspectProgressList);
/**
* 删除一对多
*
* @param id
*/
public void delMain (String id);
/**
* 批量删除一对多
*
* @param idList
*/
public void delBatchMain (Collection<? extends Serializable> idList);
/**
* 查询整改任务台账。
*
* @param page 分页参数
* @param dqInspectTask 查询条件
* @return 台账分页
*/
IPage<DqInspectTaskLedgerVo> queryLedgerPage(Page<DqInspectTaskLedgerVo> page, DqInspectTask dqInspectTask);
}
@@ -0,0 +1,27 @@
package org.jeecg.modules.demo.dqinspecttask.service.impl;
import org.jeecg.modules.demo.dqinspecttask.entity.DqInspectProgress;
import org.jeecg.modules.demo.dqinspecttask.mapper.DqInspectProgressMapper;
import org.jeecg.modules.demo.dqinspecttask.service.IDqInspectProgressService;
import org.springframework.stereotype.Service;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
/**
* @Description: 工作进展反馈
* @Author: jeecg-boot
* @Date: 2026-05-28
* @Version: V1.0
*/
@Service
public class DqInspectProgressServiceImpl extends ServiceImpl<DqInspectProgressMapper, DqInspectProgress> implements IDqInspectProgressService {
@Autowired
private DqInspectProgressMapper dqInspectProgressMapper;
@Override
public List<DqInspectProgress> selectByMainId(String mainId) {
return dqInspectProgressMapper.selectByMainId(mainId);
}
}
@@ -0,0 +1,109 @@
package org.jeecg.modules.demo.dqinspecttask.service.impl;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.demo.dqinspectproblem.entity.DqInspectProblem;
import org.jeecg.modules.demo.dqinspectproblem.service.IDqInspectProblemService;
import org.jeecg.modules.demo.dqinspecttask.entity.DqInspectTask;
import org.jeecg.modules.demo.dqinspecttask.entity.DqInspectProgress;
import org.jeecg.modules.demo.dqinspecttask.mapper.DqInspectProgressMapper;
import org.jeecg.modules.demo.dqinspecttask.mapper.DqInspectTaskMapper;
import org.jeecg.modules.demo.dqinspecttask.service.IDqInspectTaskService;
import org.jeecg.modules.demo.dqinspecttask.vo.DqInspectTaskLedgerVo;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import java.io.Serializable;
import java.util.List;
import java.util.Collection;
/**
* @Description: dq_inspect_task
* @Author: jeecg-boot
* @Date: 2026-05-28
* @Version: V1.0
*/
@Service
public class DqInspectTaskServiceImpl extends ServiceImpl<DqInspectTaskMapper, DqInspectTask> implements IDqInspectTaskService {
@Autowired
private DqInspectTaskMapper dqInspectTaskMapper;
@Autowired
private DqInspectProgressMapper dqInspectProgressMapper;
@Autowired
private IDqInspectProblemService dqInspectProblemService;
@Override
@Transactional(rollbackFor = Exception.class)
public void saveMain(DqInspectTask dqInspectTask, List<DqInspectProgress> dqInspectProgressList) {
validateProblemId(dqInspectTask);
dqInspectTaskMapper.insert(dqInspectTask);
if(dqInspectProgressList!=null && dqInspectProgressList.size()>0) {
for(DqInspectProgress entity:dqInspectProgressList) {
//外键设置
entity.setMainId(dqInspectTask.getId());
dqInspectProgressMapper.insert(entity);
}
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateMain(DqInspectTask dqInspectTask,List<DqInspectProgress> dqInspectProgressList) {
validateProblemId(dqInspectTask);
dqInspectTaskMapper.updateById(dqInspectTask);
//1.先删除子表数据
dqInspectProgressMapper.deleteByMainId(dqInspectTask.getId());
//2.子表数据重新插入
if(dqInspectProgressList!=null && dqInspectProgressList.size()>0) {
for(DqInspectProgress entity:dqInspectProgressList) {
//外键设置
entity.setMainId(dqInspectTask.getId());
dqInspectProgressMapper.insert(entity);
}
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delMain(String id) {
dqInspectProgressMapper.deleteByMainId(id);
dqInspectTaskMapper.deleteById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delBatchMain(Collection<? extends Serializable> idList) {
for(Serializable id:idList) {
dqInspectProgressMapper.deleteByMainId(id.toString());
dqInspectTaskMapper.deleteById(id);
}
}
@Override
public IPage<DqInspectTaskLedgerVo> queryLedgerPage(Page<DqInspectTaskLedgerVo> page, DqInspectTask dqInspectTask) {
return dqInspectTaskMapper.queryLedgerPage(page, dqInspectTask);
}
/**
* 整改任务必须挂在问题清单的“具体问题”节点下,避免接口绕过前端产生非法层级数据。
*/
private void validateProblemId(DqInspectTask dqInspectTask) {
if (dqInspectTask == null || oConvertUtils.isEmpty(dqInspectTask.getProblemId())) {
throw new JeecgBootException("请选择具体问题");
}
DqInspectProblem problem = dqInspectProblemService.getById(dqInspectTask.getProblemId());
if (problem == null) {
throw new JeecgBootException("选择的具体问题不存在");
}
if (!IDqInspectProblemService.NODE_TYPE_SPECIFIC.equals(problem.getNodeType())) {
throw new JeecgBootException("整改任务只能挂在具体问题节点下");
}
}
}
@@ -0,0 +1,113 @@
package org.jeecg.modules.demo.dqinspecttask.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.jeecg.common.aspect.annotation.Dict;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
* 整改任务台账行:一行对应一条整改任务,同时带出所属的问题层级信息。
*/
@Data
@Schema(description = "整改任务台账")
public class DqInspectTaskLedgerVo implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "任务ID")
private String id;
@Schema(description = "问题分类ID")
private String categoryId;
@Schema(description = "问题分类")
private String categoryName;
@Schema(description = "面上问题ID")
private String surfaceId;
@Schema(description = "面上问题")
private String surfaceName;
@Schema(description = "具体问题ID")
private String specificId;
@Schema(description = "具体问题")
private String specificName;
@Schema(description = "具体问题ID")
private String problemId;
@Schema(description = "巡视建议")
private String inspectAdvice;
@Dict(dicCode = "secret_level")
@Schema(description = "密级")
private String secretLevel;
@Schema(description = "整改措施")
private String improveMeasure;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@Schema(description = "完成时限")
private Date deadline;
@Schema(description = "目标节点")
private String targetNode;
@Dict(dictTable = "sys_user", dicText = "realname", dicCode = "username")
@Schema(description = "措施责任领导")
private String measureResLeader;
@Dict(dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
@Schema(description = "措施责任部门")
private String measureResDept;
@Schema(description = "整改交付成果")
private String rectificationEvidence;
@Schema(description = "成效评价标准")
private String evaluationCriterion;
@Dict(dicCode = "yn")
@Schema(description = "是否需要党群领导审批")
private String isNeedAppro;
@Dict(dictTable = "sys_user", dicText = "realname", dicCode = "username")
@Schema(description = "党群领导")
private String supDeptleaderid;
@Schema(description = "检查情况")
private String inspectionStatus;
@Schema(description = "监督意见")
private String supervisoryOpinion;
@Schema(description = "措施数量")
private Integer measureCount;
@Schema(description = "流程实例ID")
private String bpmProcessId;
@Dict(dicCode = "super_status")
@Schema(description = "流程状态")
private String bpmStatus;
@Schema(description = "整改状态")
private String taskStatus;
@Schema(description = "督办次数")
private String superviseCount;
@Schema(description = "排序")
private Integer sortNo;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Schema(description = "创建时间")
private Date createTime;
}
@@ -0,0 +1,145 @@
package org.jeecg.modules.demo.dqinspecttask.vo;
import java.util.List;
import org.jeecg.modules.demo.dqinspecttask.entity.DqInspectTask;
import org.jeecg.modules.demo.dqinspecttask.entity.DqInspectProgress;
import lombok.Data;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecgframework.poi.excel.annotation.ExcelEntity;
import org.jeecgframework.poi.excel.annotation.ExcelCollection;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import org.jeecg.common.aspect.annotation.Dict;
import org.jeecg.common.constant.ProvinceCityArea;
import org.jeecg.common.util.SpringContextUtils;
import io.swagger.v3.oas.annotations.media.Schema;
/**
* @Description: dq_inspect_task
* @Author: jeecg-boot
* @Date: 2026-05-28
* @Version: V1.0
*/
@Data
@Schema(description="dq_inspect_task")
public class DqInspectTaskPage {
/**id*/
@Schema(description = "id")
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 = "具体问题", width = 15, dictTable = "dq_inspect_problem", dicText = "problem_name", dicCode = "id")
@Dict(dictTable = "dq_inspect_problem", dicText = "problem_name", dicCode = "id")
@Schema(description = "具体问题ID")
private java.lang.String problemId;
/**密级*/
@Excel(name = "密级", width = 15, dicCode = "secret_level")
@Dict(dicCode = "secret_level")
@Schema(description = "密级")
private java.lang.String secretLevel;
/**整改措施*/
@Excel(name = "整改措施", width = 15)
@Schema(description = "整改措施")
private java.lang.String improveMeasure;
/**完成时限*/
@Excel(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)
@Schema(description = "目标节点")
private java.lang.String targetNode;
/**措施责任领导*/
@Excel(name = "措施责任领导", width = 15, dictTable = "sys_user", dicText = "realname", dicCode = "username")
@Dict(dictTable = "sys_user", dicText = "realname", dicCode = "username")
@Schema(description = "措施责任领导")
private java.lang.String measureResLeader;
/**措施责任部门*/
@Excel(name = "措施责任部门", width = 15, dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
@Dict(dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
@Schema(description = "措施责任部门")
private java.lang.String measureResDept;
/**整改交付成果*/
@Excel(name = "整改交付成果", width = 15)
@Schema(description = "整改交付成果")
private java.lang.String rectificationEvidence;
/**成效评价标准*/
@Excel(name = "成效评价标准", width = 15)
@Schema(description = "成效评价标准")
private java.lang.String evaluationCriterion;
/**是否需要党群领导审批*/
@Excel(name = "是否需要党群领导审批", width = 15, dicCode = "yn")
@Dict(dicCode = "yn")
@Schema(description = "是否需要党群领导审批")
private java.lang.String isNeedAppro;
/**党群领导*/
@Excel(name = "党群领导", width = 15, dictTable = "sys_user", dicText = "realname", dicCode = "username")
@Dict(dictTable = "sys_user", dicText = "realname", dicCode = "username")
@Schema(description = "党群领导")
private java.lang.String supDeptleaderid;
/**检查情况*/
@Excel(name = "检查情况", width = 15)
@Schema(description = "检查情况")
private java.lang.String inspectionStatus;
/**监督意见*/
@Excel(name = "监督意见", width = 15)
@Schema(description = "监督意见")
private java.lang.String supervisoryOpinion;
/**措施数量*/
@Excel(name = "措施数量", width = 15)
@Schema(description = "措施数量")
private java.lang.Integer measureCount;
/**流程实例ID*/
@Excel(name = "流程实例ID", width = 15)
@Schema(description = "流程实例ID")
private java.lang.String bpmProcessId;
/**流程状态*/
@Excel(name = "流程状态", width = 15, dicCode = "super_status")
@Dict(dicCode = "super_status")
@Schema(description = "流程状态")
private java.lang.String bpmStatus;
/**整改状态*/
@Excel(name = "整改状态", width = 15)
@Schema(description = "整改状态")
private java.lang.String taskStatus;
/**督办次数*/
@Excel(name = "督办次数", width = 15)
@Schema(description = "督办次数")
private java.lang.String superviseCount;
/**排序*/
@Excel(name = "排序", width = 15)
@Schema(description = "排序")
private java.lang.Integer sortNo;
/**删除标识*/
@Excel(name = "删除标识", width = 15)
@Schema(description = "删除标识")
private java.lang.String delFlag;
@ExcelCollection(name="工作进展反馈")
@Schema(description = "工作进展反馈")
private List<DqInspectProgress> dqInspectProgressList;
}
@@ -39,7 +39,6 @@ import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.jeecg.common.system.base.controller.JeecgController;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
@@ -198,12 +197,12 @@ public class TaskTaskController extends JeecgController<TaskTask, ITaskTaskServi
//@AutoLog(value = "事项任务计划表(发起流程)-通过id查询")
@Operation(summary = "事项任务计划表(发起流程)-通过businessId查询")
@GetMapping(value = "/queryByBusinessId")
public Result<List<TaskTask>> queryByBusinessId(@RequestParam(name = "businessId", required = true) String businessId) throws Exception {
List<TaskTask> taskTaskList = taskTaskService.getTaskTaskListByBusinessId(businessId);
if (CollectionUtils.isEmpty(taskTaskList)) {
return Result.error("未找到对应数据");
}
return Result.OK(taskTaskList);
public Result<IPage<TaskTask>> queryByBusinessId(@RequestParam(name = "businessId", required = true) String businessId,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) throws Exception {
Page<TaskTask> page = new Page<>(pageNo, pageSize);
IPage<TaskTask> pageList = taskTaskService.getTaskTaskPageByBusinessId(page, businessId);
return Result.OK(pageList);
}
/**
@@ -2,10 +2,10 @@ package org.jeecg.modules.tasktask.service;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.tasktask.entity.TaskTask;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* @Description: 事项任务计划表(发起流程)
* @Author: jeecg-boot
@@ -16,7 +16,7 @@ public interface ITaskTaskService extends IService<TaskTask> {
boolean singleFlowStart(TaskTask taskTask,String userName) throws Exception;
boolean multiFlowStart(TaskTask taskTask,String userName,Integer intervalType, Integer startCount) throws Exception;
Result<?> handleFlowStart(TaskTask taskTask, String username, Integer intervalType, Integer startCount)throws Exception;
List<TaskTask> getTaskTaskListByBusinessId(String businessId) throws Exception;
IPage<TaskTask> getTaskTaskPageByBusinessId(Page<TaskTask> page, String businessId) throws Exception;
boolean updateDeptHandlerName(String processInstanceId, String deptHandlerName);
boolean deleteSingleProcess(String processInstId);
}
@@ -2,6 +2,8 @@ package org.jeecg.modules.tasktask.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.util.Assert;
@@ -50,7 +52,8 @@ public class TaskTaskServiceImpl extends ServiceImpl<TaskTaskMapper, TaskTask> i
TaskTask newTask = new TaskTask();
BeanUtils.copyProperties(taskTask, newTask);
newTask.setId(null);
newTask.setStartTime(null);
// 立即发起流程以实际发起时刻为准,避免流程记录缺少开始时间。
newTask.setStartTime(new Date());
this.save(newTask);
Result<String> res = bpmBaseExtApiImpl.startMutilProcess(taskTask.getFlowCode(), newTask.getId(), taskTask.getFormUrl(), taskTask.getFormUrl(), userName, jsonString);
String procId = res.getResult();
@@ -140,14 +143,17 @@ public class TaskTaskServiceImpl extends ServiceImpl<TaskTaskMapper, TaskTask> i
return Result.ok();
}
public List<TaskTask> getTaskTaskListByBusinessId(String businessId) throws Exception{
@Override
public IPage<TaskTask> getTaskTaskPageByBusinessId(Page<TaskTask> page, String businessId) throws Exception{
if (StringUtils.isBlank(businessId)) {
return Collections.emptyList();
return page;
}
LambdaQueryWrapper<TaskTask> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(TaskTask::getBusinessId, businessId);
// 2. 查询不到数据 → MP 本身会返回空集合,不是 null
return this.list(queryWrapper);
queryWrapper.eq(TaskTask::getBusinessId, businessId)
// Show the latest started or created process first for the current business.
.orderByDesc(TaskTask::getStartTime)
.orderByDesc(TaskTask::getCreateTime);
return this.page(page, queryWrapper);
}
@Override
@@ -0,0 +1,40 @@
-- 所务会台账:党委会和所务会共用 bg_partymatter,通过 meeting_type 隔离数据。
SET @add_meeting_type_sql = IF(
(SELECT COUNT(1)
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'bg_partymatter'
AND column_name = 'meeting_type') = 0,
'ALTER TABLE `bg_partymatter` ADD COLUMN `meeting_type` varchar(20) DEFAULT ''party'' COMMENT ''会议类型:party党委会,office所务会''',
'SELECT 1'
);
PREPARE add_meeting_type_stmt FROM @add_meeting_type_sql;
EXECUTE add_meeting_type_stmt;
DEALLOCATE PREPARE add_meeting_type_stmt;
UPDATE `bg_partymatter`
SET `meeting_type` = 'party'
WHERE `meeting_type` IS NULL OR `meeting_type` = '';
-- 所务会菜单
INSERT IGNORE INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description, status, del_flag, rule_flag, create_by, create_time, update_by, update_time, internal_or_external)
VALUES ('2026052900010000000', NULL, '所务会', '/bg/bgpartymatter/bgOfficematterList', 'bg/bgpartymatter/BgOfficematterList', NULL, NULL, 0, NULL, '1', 0.00, 0, NULL, 1, 0, 0, 0, 0, NULL, '1', 0, 0, 'admin', '2026-05-29 00:00:00', NULL, NULL, 0);
-- 所务会权限控制
INSERT IGNORE INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
VALUES ('2026052900010000001', '2026052900010000000', '添加所务会', NULL, NULL, 0, NULL, NULL, 2, 'bgofficematter:bg_officematter:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-05-29 00:00:00', NULL, NULL, 0, 0, '1', 0);
INSERT IGNORE INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
VALUES ('2026052900010000002', '2026052900010000000', '编辑所务会', NULL, NULL, 0, NULL, NULL, 2, 'bgofficematter:bg_officematter:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-05-29 00:00:00', NULL, NULL, 0, 0, '1', 0);
INSERT IGNORE INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
VALUES ('2026052900010000003', '2026052900010000000', '删除所务会', NULL, NULL, 0, NULL, NULL, 2, 'bgofficematter:bg_officematter:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-05-29 00:00:00', NULL, NULL, 0, 0, '1', 0);
INSERT IGNORE INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
VALUES ('2026052900010000004', '2026052900010000000', '批量删除所务会', NULL, NULL, 0, NULL, NULL, 2, 'bgofficematter:bg_officematter:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-05-29 00:00:00', NULL, NULL, 0, 0, '1', 0);
INSERT IGNORE INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
VALUES ('2026052900010000005', '2026052900010000000', '导出excel_所务会', NULL, NULL, 0, NULL, NULL, 2, 'bgofficematter:bg_officematter:exportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-05-29 00:00:00', NULL, NULL, 0, 0, '1', 0);
INSERT IGNORE INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
VALUES ('2026052900010000006', '2026052900010000000', '导入excel_所务会', NULL, NULL, 0, NULL, NULL, 2, 'bgofficematter:bg_officematter:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-05-29 00:00:00', NULL, NULL, 0, 0, '1', 0);