diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/controller/BgPartymatterController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/controller/BgPartymatterController.java index 6bbb384..0b66ed5 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/controller/BgPartymatterController.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/controller/BgPartymatterController.java @@ -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 { + private static final String DEFAULT_MEETING_TYPE = "party"; + @Autowired private IBgPartymatterService bgPartymatterService; @@ -101,12 +104,13 @@ public class BgPartymatterController extends JeecgController 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 edit(@RequestBody BgPartymatter bgPartymatter) { + fillMeetingTypeForUpdate(bgPartymatter); fillGeneratedNumber(bgPartymatter); bgPartymatterService.updateById(bgPartymatter); return Result.OK("编辑成功!"); @@ -142,12 +147,39 @@ public class BgPartymatterController extends JeecgController delete(@RequestParam(name="id",required=true) String id) { bgPartymatterService.delMain(id); @@ -181,7 +213,7 @@ public class BgPartymatterController extends JeecgController deleteBatch(@RequestParam(name="ids",required=true) String ids) { this.bgPartymatterService.delBatchMain(Arrays.asList(ids.split(","))); @@ -192,17 +224,18 @@ public class BgPartymatterController extends JeecgController importExcel(HttpServletRequest request, HttpServletResponse response) { return super.importExcel(request, response, BgPartymatter.class); diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/entity/BgPartymatter.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/entity/BgPartymatter.java index 1b9d692..b965a56 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/entity/BgPartymatter.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/bgpartymatter/entity/BgPartymatter.java @@ -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") diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspectproblem/controller/DqInspectProblemController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspectproblem/controller/DqInspectProblemController.java index 11b26c7..19ca86d 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspectproblem/controller/DqInspectProblemController.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspectproblem/controller/DqInspectProblemController.java @@ -193,6 +193,27 @@ public class DqInspectProblemController extends JeecgController>> parentOptions(@RequestParam(name = "nodeType") String nodeType) { + return Result.OK(dqInspectProblemService.queryParentOptions(nodeType)); + } + + /** + * 任务清单选择具体问题时使用,分类和面上问题仅用于分组展示,不可选择。 + */ + @Operation(summary="dq_inspect_problem-具体问题候选") + @GetMapping(value = "/specificOptions") + public Result>> specificOptions() { + return Result.OK(dqInspectProblemService.querySpecificOptions()); + } + /** * 添加 * diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspectproblem/service/IDqInspectProblemService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspectproblem/service/IDqInspectProblemService.java index d53b852..3acd86b 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspectproblem/service/IDqInspectProblemService.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspectproblem/service/IDqInspectProblemService.java @@ -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 { /**树节点无子节点状态值*/ 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 { */ List queryListByPid(String pid); + /** + * 根据当前节点类型,返回合法的父级候选树。 + * + * @param nodeType 当前节点类型 + * @return 父级候选树 + */ + List> queryParentOptions(String nodeType); + + /** + * 返回任务清单可选择的具体问题树:问题分类 -> 面上问题 -> 具体问题。 + * + * @return 具体问题候选树 + */ + List> querySpecificOptions(); + } diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspectproblem/service/impl/DqInspectProblemServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspectproblem/service/impl/DqInspectProblemServiceImpl.java index e4a7236..d61643e 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspectproblem/service/impl/DqInspectProblemServiceImpl.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspectproblem/service/impl/DqInspectProblemServiceImpl.java @@ -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> 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> 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> queryParentNodesByType(String nodeType) { + List nodes = baseMapper.selectList( + new QueryWrapper() + .eq("node_type", nodeType) + .orderByAsc("sort_no", "create_time") + ); + List> result = new ArrayList<>(); + for (DqInspectProblem node : nodes) { + result.add(toTreeOption(node, false)); + } + return result; + } + + private List> querySurfaceParentTree() { + List categories = baseMapper.selectList( + new QueryWrapper() + .eq("node_type", NODE_TYPE_CATEGORY) + .orderByAsc("sort_no", "create_time") + ); + List> result = new ArrayList<>(); + for (DqInspectProblem category : categories) { + Map categoryOption = toTreeOption(category, true); + List surfaces = baseMapper.selectList( + new QueryWrapper() + .eq("pid", category.getId()) + .eq("node_type", NODE_TYPE_SURFACE) + .orderByAsc("sort_no", "create_time") + ); + List> children = new ArrayList<>(); + for (DqInspectProblem surface : surfaces) { + children.add(toTreeOption(surface, false)); + } + categoryOption.put("children", children); + result.add(categoryOption); + } + return result; + } + + private List> querySpecificProblemTree() { + List categories = baseMapper.selectList( + new QueryWrapper() + .eq("node_type", NODE_TYPE_CATEGORY) + .orderByAsc("sort_no", "create_time") + ); + List> result = new ArrayList<>(); + for (DqInspectProblem category : categories) { + Map categoryOption = toTreeOption(category, true); + List surfaces = baseMapper.selectList( + new QueryWrapper() + .eq("pid", category.getId()) + .eq("node_type", NODE_TYPE_SURFACE) + .orderByAsc("sort_no", "create_time") + ); + List> surfaceOptions = new ArrayList<>(); + for (DqInspectProblem surface : surfaces) { + Map surfaceOption = toTreeOption(surface, true); + List specifics = baseMapper.selectList( + new QueryWrapper() + .eq("pid", surface.getId()) + .eq("node_type", NODE_TYPE_SPECIFIC) + .orderByAsc("sort_no", "create_time") + ); + List> 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 toTreeOption(DqInspectProblem node, boolean disabled) { + Map 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 queryListByPid(String pid) { if (oConvertUtils.isEmpty(pid)) { diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/controller/DqInspectTaskController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/controller/DqInspectTaskController.java new file mode 100644 index 0000000..23c1f04 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/controller/DqInspectTaskController.java @@ -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> queryPageList(DqInspectTask dqInspectTask, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(dqInspectTask, req.getParameterMap()); + Page page = new Page(pageNo, pageSize); + IPage 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> queryLedgerList(DqInspectTask dqInspectTask, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize) { + Page page = new Page(pageNo, pageSize); + IPage 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 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 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 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 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 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> queryDqInspectProgressListByMainId(@RequestParam(name="id",required=true) String id) { + List 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 queryWrapper = QueryGenerator.initQueryWrapper(dqInspectTask, request.getParameterMap()); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + + //配置选中数据查询条件 + String selections = request.getParameter("selections"); + if(oConvertUtils.isNotEmpty(selections)) { + List selectionList = Arrays.asList(selections.split(",")); + queryWrapper.in("id",selectionList); + } + //Step.2 获取导出数据 + List dqInspectTaskList = dqInspectTaskService.list(queryWrapper); + + // Step.3 组装pageList + List pageList = new ArrayList(); + for (DqInspectTask main : dqInspectTaskList) { + DqInspectTaskPage vo = new DqInspectTaskPage(); + BeanUtils.copyProperties(main, vo); + List 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 fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + // 获取上传文件对象 + MultipartFile file = entity.getValue(); + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List 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("文件导入失败!"); + } + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/entity/DqInspectProgress.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/entity/DqInspectProgress.java new file mode 100644 index 0000000..849c5e0 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/entity/DqInspectProgress.java @@ -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; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/entity/DqInspectTask.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/entity/DqInspectTask.java new file mode 100644 index 0000000..12df303 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/entity/DqInspectTask.java @@ -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; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/mapper/DqInspectProgressMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/mapper/DqInspectProgressMapper.java new file mode 100644 index 0000000..41ec189 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/mapper/DqInspectProgressMapper.java @@ -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 { + + /** + * 通过主表id删除子表数据 + * + * @param mainId 主表id + * @return boolean + */ + public boolean deleteByMainId(@Param("mainId") String mainId); + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List + */ + public List selectByMainId(@Param("mainId") String mainId); +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/mapper/DqInspectTaskMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/mapper/DqInspectTaskMapper.java new file mode 100644 index 0000000..a54d3fc --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/mapper/DqInspectTaskMapper.java @@ -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 { + + /** + * 查询整改任务台账,补齐问题分类、面上问题、具体问题信息。 + * + * @param page 分页参数 + * @param task 查询条件 + * @return 台账分页 + */ + IPage queryLedgerPage(Page page, @Param("task") DqInspectTask task); + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/mapper/xml/DqInspectProgressMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/mapper/xml/DqInspectProgressMapper.xml new file mode 100644 index 0000000..dc6c9ba --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/mapper/xml/DqInspectProgressMapper.xml @@ -0,0 +1,16 @@ + + + + + + DELETE + FROM dq_inspect_progress + WHERE + main_id = #{mainId} + + + diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/mapper/xml/DqInspectTaskMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/mapper/xml/DqInspectTaskMapper.xml new file mode 100644 index 0000000..2b15231 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/mapper/xml/DqInspectTaskMapper.xml @@ -0,0 +1,72 @@ + + + + + + + diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/service/IDqInspectProgressService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/service/IDqInspectProgressService.java new file mode 100644 index 0000000..e5706d0 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/service/IDqInspectProgressService.java @@ -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 { + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List + */ + public List selectByMainId(String mainId); +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/service/IDqInspectTaskService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/service/IDqInspectTaskService.java new file mode 100644 index 0000000..4c2b977 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/service/IDqInspectTaskService.java @@ -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 { + + /** + * 添加一对多 + * + * @param dqInspectTask + * @param dqInspectProgressList + */ + public void saveMain(DqInspectTask dqInspectTask,List dqInspectProgressList) ; + + /** + * 修改一对多 + * + * @param dqInspectTask + * @param dqInspectProgressList + */ + public void updateMain(DqInspectTask dqInspectTask,List dqInspectProgressList); + + /** + * 删除一对多 + * + * @param id + */ + public void delMain (String id); + + /** + * 批量删除一对多 + * + * @param idList + */ + public void delBatchMain (Collection idList); + + /** + * 查询整改任务台账。 + * + * @param page 分页参数 + * @param dqInspectTask 查询条件 + * @return 台账分页 + */ + IPage queryLedgerPage(Page page, DqInspectTask dqInspectTask); + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/service/impl/DqInspectProgressServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/service/impl/DqInspectProgressServiceImpl.java new file mode 100644 index 0000000..2c9fea1 --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/service/impl/DqInspectProgressServiceImpl.java @@ -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 implements IDqInspectProgressService { + + @Autowired + private DqInspectProgressMapper dqInspectProgressMapper; + + @Override + public List selectByMainId(String mainId) { + return dqInspectProgressMapper.selectByMainId(mainId); + } +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/service/impl/DqInspectTaskServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/service/impl/DqInspectTaskServiceImpl.java new file mode 100644 index 0000000..5340aea --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/service/impl/DqInspectTaskServiceImpl.java @@ -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 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 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 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 idList) { + for(Serializable id:idList) { + dqInspectProgressMapper.deleteByMainId(id.toString()); + dqInspectTaskMapper.deleteById(id); + } + } + + @Override + public IPage queryLedgerPage(Page 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("整改任务只能挂在具体问题节点下"); + } + } + +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/vo/DqInspectTaskLedgerVo.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/vo/DqInspectTaskLedgerVo.java new file mode 100644 index 0000000..4b31dee --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/vo/DqInspectTaskLedgerVo.java @@ -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; +} diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/vo/DqInspectTaskPage.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/vo/DqInspectTaskPage.java new file mode 100644 index 0000000..2d8b0dd --- /dev/null +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/dqinspecttask/vo/DqInspectTaskPage.java @@ -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 dqInspectProgressList; + +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/controller/TaskTaskController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/controller/TaskTaskController.java index 82a2f6e..d52b703 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/controller/TaskTaskController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/controller/TaskTaskController.java @@ -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> queryByBusinessId(@RequestParam(name = "businessId", required = true) String businessId) throws Exception { - List taskTaskList = taskTaskService.getTaskTaskListByBusinessId(businessId); - if (CollectionUtils.isEmpty(taskTaskList)) { - return Result.error("未找到对应数据"); - } - return Result.OK(taskTaskList); + public Result> 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 page = new Page<>(pageNo, pageSize); + IPage pageList = taskTaskService.getTaskTaskPageByBusinessId(page, businessId); + return Result.OK(pageList); } /** diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/service/ITaskTaskService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/service/ITaskTaskService.java index 29ee58d..ad36ed7 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/service/ITaskTaskService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/service/ITaskTaskService.java @@ -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 { 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 getTaskTaskListByBusinessId(String businessId) throws Exception; + IPage getTaskTaskPageByBusinessId(Page page, String businessId) throws Exception; boolean updateDeptHandlerName(String processInstanceId, String deptHandlerName); boolean deleteSingleProcess(String processInstId); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/service/impl/TaskTaskServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/service/impl/TaskTaskServiceImpl.java index 1178c96..918375c 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/service/impl/TaskTaskServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/tasktask/service/impl/TaskTaskServiceImpl.java @@ -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 i TaskTask newTask = new TaskTask(); BeanUtils.copyProperties(taskTask, newTask); newTask.setId(null); - newTask.setStartTime(null); + // 立即发起流程以实际发起时刻为准,避免流程记录缺少开始时间。 + newTask.setStartTime(new Date()); this.save(newTask); Result 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 i return Result.ok(); } - public List getTaskTaskListByBusinessId(String businessId) throws Exception{ + @Override + public IPage getTaskTaskPageByBusinessId(Page page, String businessId) throws Exception{ if (StringUtils.isBlank(businessId)) { - return Collections.emptyList(); + return page; } LambdaQueryWrapper 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 diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/v380/V20260529_1__add_officematter_ledger.sql b/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/v380/V20260529_1__add_officematter_ledger.sql new file mode 100644 index 0000000..f09cc32 --- /dev/null +++ b/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/v380/V20260529_1__add_officematter_ledger.sql @@ -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);