Browse Source

Merge remote-tracking branch 'origin/dev' into dev

dev-V1.0.1
庄锐波 5 months ago
parent
commit
44d87376e5
  1. 53
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/common/commonenum/MsgSourceTypeEnum.java
  2. 16
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfEvaluateController.java
  3. 56
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnforcementInspectionProgramController.java
  4. 3
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnforcementRegistrationController.java
  5. 5
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EnforcementRegistrationBo.java
  6. 11
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/enterprise/EnforcementRegistrationInfoVo.java
  7. 9
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EnforcementRegistrationMapper.java
  8. 19
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/SysMessageViewLogMapper.java
  9. 19
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/ISysMessageViewLogService.java
  10. 37
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnforcementEducationServicesServiceImpl.java
  11. 58
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnforcementInspectionProgramServiceImpl.java
  12. 51
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnforcementRegistrationServiceImpl.java
  13. 98
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/SysMessageViewLogServiceImpl.java
  14. 15
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EnforcementRegistrationMapper.xml
  15. 30
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/SysMessageViewLogMapper.xml

53
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/common/commonenum/MsgSourceTypeEnum.java

@ -0,0 +1,53 @@
package com.zdxt.enforcementcode.common.commonenum;
/**
* 消息来源枚举
* @author liaoz
*/
public enum MsgSourceTypeEnum {
/**
* 普法服务
*/
PFFF(1, "普法服务"),
/**
* 执法评价
*/
ZFPJ(2, "执法评价");
private Integer key;
private String value;
MsgSourceTypeEnum(Integer key, String value) {
this.value = value;
this.key = key;
}
public String getValue() {
return value;
}
public Integer getKey() {
return key;
}
/**
* 根据value获取description
* @description
*
* @createDate 2017年11月28日
* @param key
* @return
*/
public static String getValueByKey(String key) {
MsgSourceTypeEnum[] enums = MsgSourceTypeEnum.values();
for (int i = 0; i < enums.length; i++) {
if (enums[i].getKey().equals(key)) {
return enums[i].getValue();
}
}
return "";
}
}

16
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfEvaluateController.java

@ -1,9 +1,11 @@
package com.zdxt.enforcementcode.controller.app.enforcement; package com.zdxt.enforcementcode.controller.app.enforcement;
import com.zdxt.enforcementcode.common.commonenum.MsgSourceTypeEnum;
import com.zdxt.enforcementcode.domain.bo.EnforcementRegistrationQueryBo; import com.zdxt.enforcementcode.domain.bo.EnforcementRegistrationQueryBo;
import com.zdxt.enforcementcode.domain.vo.enterprise.EnforcementRegistrationDetailVo; import com.zdxt.enforcementcode.domain.vo.enterprise.EnforcementRegistrationDetailVo;
import com.zdxt.enforcementcode.domain.vo.enterprise.EnforcementRegistrationListVo; import com.zdxt.enforcementcode.domain.vo.enterprise.EnforcementRegistrationListVo;
import com.zdxt.enforcementcode.service.IEnforcementRegistrationService; import com.zdxt.enforcementcode.service.IEnforcementRegistrationService;
import com.zdxt.enforcementcode.service.ISysMessageViewLogService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
@ -29,6 +31,7 @@ public class AppEnfEvaluateController extends BaseController {
private final IEnforcementRegistrationService enforcementRegistrationService; private final IEnforcementRegistrationService enforcementRegistrationService;
private final ISysMessageViewLogService sysMessageViewLogService;
/** /**
* 执法端-执法评价(分页) * 执法端-执法评价(分页)
*/ */
@ -45,7 +48,20 @@ public class AppEnfEvaluateController extends BaseController {
@ResponseBody @ResponseBody
public R<EnforcementRegistrationDetailVo> queryDetailById(String id){ public R<EnforcementRegistrationDetailVo> queryDetailById(String id){
EnforcementRegistrationDetailVo detailVo = enforcementRegistrationService.queryDetailById(id); EnforcementRegistrationDetailVo detailVo = enforcementRegistrationService.queryDetailById(id);
if (detailVo != null) {
sysMessageViewLogService.insertViewLog(id, MsgSourceTypeEnum.ZFPJ.getKey()); // 2-执法评价
}
return R.ok(detailVo); return R.ok(detailVo);
} }
/**
* 统计当前执法评价未读个数
*/
@GetMapping("/unreadCount")
public R<Long> getUnreadCount() {
Long unreadCount = sysMessageViewLogService.countUnreadEvaluate();
return R.ok(unreadCount);
}
} }

56
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnforcementInspectionProgramController.java

@ -25,7 +25,7 @@ import org.springframework.web.bind.annotation.*;
import java.util.List; import java.util.List;
/** /**
* 执法检查计划 * 执法端-执法检查计划
* *
* @author Lion Li * @author Lion Li
* @date 2026-04-17 * @date 2026-04-17
@ -38,40 +38,38 @@ public class AppEnforcementInspectionProgramController extends BaseController {
private final IEnforcementInspectionProgramService enforcementInspectionProgramService; private final IEnforcementInspectionProgramService enforcementInspectionProgramService;
// /**
// * 执法端-查询执法检查计划列表
// */
// @GetMapping("/list")
// public TableDataInfo<EnforcementInspectionProgramVo> list(EnforcementInspectionProgramBo bo, PageQuery pageQuery) {
// return enforcementInspectionProgramService.queryPageList(bo, pageQuery);
// }
//
// /**
// * 导出执法检查计划列表
// */
// @Log(title = "执法检查计划", businessType = BusinessType.EXPORT)
// @PostMapping("/export")
// public void export(EnforcementInspectionProgramBo bo, HttpServletResponse response) {
// List<EnforcementInspectionProgramVo> list = enforcementInspectionProgramService.queryList(bo);
// ExcelUtil.exportExcel(list, "执法检查计划", EnforcementInspectionProgramVo.class, response);
// }
//
//
/** /**
* 查询执法检查计划列表 * 执法端-查询执法检查计划列表(支持复杂查询条件)
*/ */
// @SaCheckPermission("enforcementcode:inspectionProgram:list")
@GetMapping("/list")
public TableDataInfo<EnforcementInspectionProgramVo> list(EnforcementInspectionProgramBo bo, PageQuery pageQuery) {
return enforcementInspectionProgramService.queryPageList(bo, pageQuery);
}
/**
* 导出执法检查计划列表
*/
// @SaCheckPermission("enforcementcode:inspectionProgram:export")
@Log(title = "执法检查计划", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(EnforcementInspectionProgramBo bo, HttpServletResponse response) {
List<EnforcementInspectionProgramVo> list = enforcementInspectionProgramService.queryList(bo);
ExcelUtil.exportExcel(list, "执法检查计划", EnforcementInspectionProgramVo.class, response);
}
/**
* 查询执法检查计划列表(支持复杂查询条件)
*/
// @SaCheckPermission("enforcementcode:inspectionProgram:list")
@GetMapping("/selectInspectionProgramList") @GetMapping("/selectInspectionProgramList")
public TableDataInfo<EnforcementInspectionProgramVo> selectInspectionProgramList(EnforcementInspectionProgramBo bo, PageQuery pageQuery) { public TableDataInfo<EnforcementInspectionProgramVo> selectInspectionProgramList(EnforcementInspectionProgramBo bo, PageQuery pageQuery) {
return enforcementInspectionProgramService.selectEnforcementInspectionProgramPage(bo, pageQuery); return enforcementInspectionProgramService.selectEnforcementInspectionProgramPage(bo, pageQuery);
} }
/** /**
* 查询计划列表(包含权限控制) * 执法端-查询计划列表(消息通知包含权限控制)
* 自己单位
* 公开
*/ */
// @SaCheckPermission("enforcementcode:inspectionProgram:list")
@GetMapping("/queryListNoPermission") @GetMapping("/queryListNoPermission")
public TableDataInfo<EnforcementInspectionProgramVo> queryListNoPermission(EnforcementInspectionProgramBo bo, PageQuery pageQuery) { public TableDataInfo<EnforcementInspectionProgramVo> queryListNoPermission(EnforcementInspectionProgramBo bo, PageQuery pageQuery) {
String deptId = LoginHelper.getDeptId(); String deptId = LoginHelper.getDeptId();
@ -85,7 +83,6 @@ public class AppEnforcementInspectionProgramController extends BaseController {
* *
* @param id 主键 * @param id 主键
*/ */
// @SaCheckPermission("enforcementcode:inspectionProgram:query")
@GetMapping("/getInfo") @GetMapping("/getInfo")
public R<EnforcementInspectionProgramVo> getInfo(@NotNull(message = "主键不能为空") public R<EnforcementInspectionProgramVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable String id) { @PathVariable String id) {
@ -95,7 +92,6 @@ public class AppEnforcementInspectionProgramController extends BaseController {
/** /**
* 新增执法检查计划 * 新增执法检查计划
*/ */
// @SaCheckPermission("enforcementcode:inspectionProgram:add")
@Log(title = "执法检查计划", businessType = BusinessType.INSERT) @Log(title = "执法检查计划", businessType = BusinessType.INSERT)
@RepeatSubmit() @RepeatSubmit()
@PostMapping() @PostMapping()
@ -106,7 +102,6 @@ public class AppEnforcementInspectionProgramController extends BaseController {
/** /**
* 修改执法检查计划 * 修改执法检查计划
*/ */
// @SaCheckPermission("enforcementcode:inspectionProgram:edit")
@Log(title = "执法检查计划", businessType = BusinessType.UPDATE) @Log(title = "执法检查计划", businessType = BusinessType.UPDATE)
@RepeatSubmit() @RepeatSubmit()
@PutMapping() @PutMapping()
@ -119,9 +114,8 @@ public class AppEnforcementInspectionProgramController extends BaseController {
* *
* @param ids 主键串 * @param ids 主键串
*/ */
// @SaCheckPermission("enforcementcode:inspectionProgram:remove")
@Log(title = "执法检查计划", businessType = BusinessType.DELETE) @Log(title = "执法检查计划", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}") @DeleteMapping("remove")
public R<Void> remove(@NotEmpty(message = "主键不能为空") public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable String[] ids) { @PathVariable String[] ids) {
return toAjax(enforcementInspectionProgramService.deleteWithValidByIds(List.of(ids), true)); return toAjax(enforcementInspectionProgramService.deleteWithValidByIds(List.of(ids), true));

3
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnforcementRegistrationController.java

@ -101,11 +101,12 @@ public class AppEnforcementRegistrationController extends BaseController {
/** /**
* 执法端-查询执法记录-全市-本单位 * 执法端-查询执法记录-全市-本单位
*/ */
@SaIgnore
@GetMapping("/queryList") @GetMapping("/queryList")
@ResponseBody @ResponseBody
public R<EnforcementRegistrationVo> queryList(EnforcementRegistrationBo bo, PageQuery pageQuery) { public R<EnforcementRegistrationVo> queryList(EnforcementRegistrationBo bo, PageQuery pageQuery) {
// dateType本单位 0 全市 1 // dateType本单位 0 全市 1
if (Objects.nonNull(bo.getUserId()) && bo.getDateType()==0) { if (Objects.nonNull( LoginHelper.getUserId()) && bo.getWarnType()==0) {
bo.setDeptId(LoginHelper.getDeptId() == null ? null : LoginHelper.getDeptId()); bo.setDeptId(LoginHelper.getDeptId() == null ? null : LoginHelper.getDeptId());
SysDeptVo bureauDept = sysDeptService.iterationDeptParentToBureau(LoginHelper.getDeptId()); SysDeptVo bureauDept = sysDeptService.iterationDeptParentToBureau(LoginHelper.getDeptId());

5
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EnforcementRegistrationBo.java

@ -315,4 +315,9 @@ public class EnforcementRegistrationBo extends BaseEntity {
private String region; private String region;
private String regionId; private String regionId;
/**
* 提醒类型 0:本单位 1:全市
*/
private Integer warnType;
} }

11
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/enterprise/EnforcementRegistrationInfoVo.java

@ -5,6 +5,7 @@ import lombok.Data;
import java.io.Serial; import java.io.Serial;
import java.util.Date; import java.util.Date;
import java.util.List;
/** /**
* 企业端-执法登记记录对象 enforcement_registration * 企业端-执法登记记录对象 enforcement_registration
@ -283,6 +284,16 @@ public class EnforcementRegistrationInfoVo {
*/ */
private Long isRealUnion; private Long isRealUnion;
/**
* 执法人员1展示文本(姓名+执法证号)
*/
private String lawEnforcerDisplay;
/**
* 其他执法人员展示列表(姓名+执法证号)
*/
private List<String> lawEnforcer2List;
/** /**
* 创建部门 * 创建部门
*/ */

9
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EnforcementRegistrationMapper.java

@ -68,4 +68,13 @@ public interface EnforcementRegistrationMapper extends BaseMapperPlus<Enforcemen
@InterceptorIgnore(dataPermission = "true") @InterceptorIgnore(dataPermission = "true")
List<EnforcementRegistrationVo> selectEnforcementRegistrationList(@Param("bo") EnforcementRegistrationBo bo,@Param("page") Page<EnforcementRegistrationVo> page); List<EnforcementRegistrationVo> selectEnforcementRegistrationList(@Param("bo") EnforcementRegistrationBo bo,@Param("page") Page<EnforcementRegistrationVo> page);
/**
* 统计当前用户作为执法人员的执法登记总数
* (包含执法人员1和执法人员2)
*
* @param userId 用户ID
* @return 执法登记总数
*/
Long countByLawEnforcerId(@Param("userId") Long userId);
} }

19
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/SysMessageViewLogMapper.java

@ -3,6 +3,7 @@ package com.zdxt.enforcementcode.mapper;
import com.zdxt.enforcementcode.domain.bean.SysMessageViewLog; import com.zdxt.enforcementcode.domain.bean.SysMessageViewLog;
import com.zdxt.enforcementcode.domain.vo.SysMessageViewLogVo; import com.zdxt.enforcementcode.domain.vo.SysMessageViewLogVo;
import org.apache.ibatis.annotations.Param;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
@ -14,4 +15,22 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
*/ */
public interface SysMessageViewLogMapper extends BaseMapperPlus<SysMessageViewLog, SysMessageViewLogVo> { public interface SysMessageViewLogMapper extends BaseMapperPlus<SysMessageViewLog, SysMessageViewLogVo> {
/**
* 统计当前用户已读的消息数量
*
* @param userId 用户ID
* @param sourceType 来源类型:1-普法消息 2-执法评价
* @return 已读数量
*/
Long countReadByUserIdAndSourceType(@Param("userId") Long userId, @Param("sourceType") Integer sourceType);
/**
* 统计当前用户的未读执法评价数量
* (存在于 enforcement_registration 但不存在于 sys_message_view_log 的记录数)
*
* @param userId 用户ID
* @param sourceType 来源类型:2-执法评价
* @return 未读数量
*/
Long countUnreadByUserIdAndSourceType(@Param("userId") Long userId, @Param("sourceType") Integer sourceType);
} }

19
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/ISysMessageViewLogService.java

@ -65,4 +65,23 @@ public interface ISysMessageViewLogService {
* @return 是否删除成功 * @return 是否删除成功
*/ */
Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid); Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);
/**
* 插入消息查看记录(公共方法)
*
* @param sourceId 来源表ID
* @param sourceType 来源表类型:1-普法消息 2-执法评价
*/
void insertViewLog(String sourceId, Integer sourceType);
/**
* 统计当前登录用户的未读消息数量
* <p>
* 计算公式:总数 - 已读数 = 未读数
* - 总数:当前用户在 enforcement_registration 表中作为执法人员1或执法人员2的记录数
* - 已读数:sys_message_view_log 表中存在当前用户ID + sourceType=2 的记录数
*
* @return 未读数量
*/
Long countUnreadEvaluate();
} }

37
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnforcementEducationServicesServiceImpl.java

@ -1,5 +1,6 @@
package com.zdxt.enforcementcode.service.impl; package com.zdxt.enforcementcode.service.impl;
import com.zdxt.enforcementcode.common.commonenum.MsgSourceTypeEnum;
import com.zdxt.enforcementcode.common.commonenum.PlatformTypeEnums; import com.zdxt.enforcementcode.common.commonenum.PlatformTypeEnums;
import com.zdxt.enforcementcode.domain.bean.EnforcementEducationServices; import com.zdxt.enforcementcode.domain.bean.EnforcementEducationServices;
import com.zdxt.enforcementcode.service.ISysMessageViewLogService; import com.zdxt.enforcementcode.service.ISysMessageViewLogService;
@ -12,13 +13,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.zdxt.enforcementcode.domain.bo.EnforcementEducationServicesBo; import com.zdxt.enforcementcode.domain.bo.EnforcementEducationServicesBo;
import com.zdxt.enforcementcode.domain.vo.EnforcementEducationServicesVo; import com.zdxt.enforcementcode.domain.vo.EnforcementEducationServicesVo;
import com.zdxt.enforcementcode.mapper.EnforcementEducationServicesMapper; import com.zdxt.enforcementcode.mapper.EnforcementEducationServicesMapper;
import com.zdxt.enforcementcode.service.IEnforcementEducationServicesService; import com.zdxt.enforcementcode.service.IEnforcementEducationServicesService;
import org.dromara.common.satoken.utils.LoginHelper;
import com.zdxt.enforcementcode.domain.bo.SysMessageViewLogBo;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -53,38 +53,9 @@ public class EnforcementEducationServicesServiceImpl implements IEnforcementEduc
public EnforcementEducationServicesVo queryById(String id){ public EnforcementEducationServicesVo queryById(String id){
EnforcementEducationServicesVo vo = baseMapper.selectVoById(id); EnforcementEducationServicesVo vo = baseMapper.selectVoById(id);
// 插入查看记录 // 插入查看记录(调用公共方法)
if (vo != null) { if (vo != null) {
try { sysMessageViewLogService.insertViewLog(id, MsgSourceTypeEnum.PFFF.getKey()); // 1-普法消息
// 检查是否登录
if (!LoginHelper.isLogin()) {
log.warn("用户未登录,跳过插入查看记录: id={}", id);
return vo;
}
SysMessageViewLogBo viewLogBo = new SysMessageViewLogBo();
viewLogBo.setSourceId(id);
viewLogBo.setSourceType(1); // 1-普法消息
Long userId = LoginHelper.getUserId();
String username = LoginHelper.getUsername();
String deptId = LoginHelper.getDeptId();
Integer platformType = LoginHelper.getPlatformType();
log.debug("获取登录用户信息: userId={}, username={}, deptId={}, platformType={}",
userId, username, deptId, platformType);
viewLogBo.setCreateBy(userId);
viewLogBo.setCreateByName(username);
viewLogBo.setCreateDept(deptId);
viewLogBo.setIsDelete(0); // 0=否
viewLogBo.setPlatformType(platformType);
viewLogBo.setCompanyId(deptId);
sysMessageViewLogService.insertByBo(viewLogBo);
} catch (Exception e) {
log.error("插入查看记录失败: id={}", id, e);
}
} }
return vo; return vo;

58
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnforcementInspectionProgramServiceImpl.java

@ -25,6 +25,8 @@ import com.zdxt.enforcementcode.service.IEnforcementInspectionProgramService;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.stream.Collectors;
/** /**
* 执法检查计划Service业务层处理 * 执法检查计划Service业务层处理
@ -145,15 +147,31 @@ public class EnforcementInspectionProgramServiceImpl implements IEnforcementInsp
public TableDataInfo<EnforcementInspectionProgramVo> selectEnforcementInspectionProgramPage(EnforcementInspectionProgramBo bo, PageQuery pageQuery) { public TableDataInfo<EnforcementInspectionProgramVo> selectEnforcementInspectionProgramPage(EnforcementInspectionProgramBo bo, PageQuery pageQuery) {
Page<EnforcementInspectionProgramVo> result = baseMapper.selectEnforcementInspectionProgramPage(pageQuery.build(), bo); Page<EnforcementInspectionProgramVo> result = baseMapper.selectEnforcementInspectionProgramPage(pageQuery.build(), bo);
// 为每个计划查询关联的文件列表 // 批量查询关联的文件列表(优化 N+1 查询问题)
if (result.getRecords() != null && !result.getRecords().isEmpty()) { if (result.getRecords() != null && !result.getRecords().isEmpty()) {
result.getRecords().forEach(vo -> { // 1. 收集所有计划ID
List<String> planIds = result.getRecords().stream()
.map(EnforcementInspectionProgramVo::getId)
.filter(StringUtils::isNotBlank)
.toList();
// 2. 一次性查询所有计划关联的文件
if (!planIds.isEmpty()) {
LambdaQueryWrapper<ZdxtFile> fileLqw = Wrappers.lambdaQuery(); LambdaQueryWrapper<ZdxtFile> fileLqw = Wrappers.lambdaQuery();
fileLqw.eq(ZdxtFile::getBusinessId, vo.getId()); fileLqw.in(ZdxtFile::getBusinessId, planIds);
fileLqw.eq(ZdxtFile::getIsDelete2, 0); // 只查询未删除的文件 fileLqw.eq(ZdxtFile::getIsDelete2, 0); // 只查询未删除的文件
List<ZdxtFileVo> fileList = zdxtFileMapper.selectVoList(fileLqw); List<ZdxtFileVo> allFiles = zdxtFileMapper.selectVoList(fileLqw);
vo.setFileList(fileList);
}); // 3. 按 businessId 分组,构建 Map
Map<String, List<ZdxtFileVo>> filesByPlanId = allFiles.stream()
.collect(Collectors.groupingBy(ZdxtFileVo::getBusinessId));
// 4. 为每个计划设置对应的文件列表
result.getRecords().forEach(vo -> {
List<ZdxtFileVo> fileList = filesByPlanId.getOrDefault(vo.getId(), Collections.emptyList());
vo.setFileList(fileList);
});
}
} }
return TableDataInfo.build(result); return TableDataInfo.build(result);
@ -192,15 +210,31 @@ public class EnforcementInspectionProgramServiceImpl implements IEnforcementInsp
public TableDataInfo<EnforcementInspectionProgramVo> selectPlanPage(EnforcementInspectionProgramBo bo, PageQuery pageQuery) { public TableDataInfo<EnforcementInspectionProgramVo> selectPlanPage(EnforcementInspectionProgramBo bo, PageQuery pageQuery) {
Page<EnforcementInspectionProgramVo> result = baseMapper.selectPlanPage(pageQuery.build(), bo); Page<EnforcementInspectionProgramVo> result = baseMapper.selectPlanPage(pageQuery.build(), bo);
// 为每个计划查询关联的文件列表 // 批量查询关联的文件列表(优化 N+1 查询问题)
if (result.getRecords() != null && !result.getRecords().isEmpty()) { if (result.getRecords() != null && !result.getRecords().isEmpty()) {
result.getRecords().forEach(vo -> { // 1. 收集所有计划ID
List<String> planIds = result.getRecords().stream()
.map(EnforcementInspectionProgramVo::getId)
.filter(StringUtils::isNotBlank)
.toList();
// 2. 一次性查询所有计划关联的文件
if (!planIds.isEmpty()) {
LambdaQueryWrapper<ZdxtFile> fileLqw = Wrappers.lambdaQuery(); LambdaQueryWrapper<ZdxtFile> fileLqw = Wrappers.lambdaQuery();
fileLqw.eq(ZdxtFile::getBusinessId, vo.getId()); fileLqw.in(ZdxtFile::getBusinessId, planIds);
fileLqw.eq(ZdxtFile::getIsDelete2, 0); // 只查询未删除的文件 fileLqw.eq(ZdxtFile::getIsDelete2, 0); // 只查询未删除的文件
List<ZdxtFileVo> fileList = zdxtFileMapper.selectVoList(fileLqw); List<ZdxtFileVo> allFiles = zdxtFileMapper.selectVoList(fileLqw);
vo.setFileList(fileList);
}); // 3. 按 businessId 分组,构建 Map
Map<String, List<ZdxtFileVo>> filesByPlanId = allFiles.stream()
.collect(Collectors.groupingBy(ZdxtFileVo::getBusinessId));
// 4. 为每个计划设置对应的文件列表
result.getRecords().forEach(vo -> {
List<ZdxtFileVo> fileList = filesByPlanId.getOrDefault(vo.getId(), Collections.emptyList());
vo.setFileList(fileList);
});
}
} }
return TableDataInfo.build(result); return TableDataInfo.build(result);

51
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnforcementRegistrationServiceImpl.java

@ -510,7 +510,56 @@ public class EnforcementRegistrationServiceImpl implements IEnforcementRegistrat
detailVo.setEnterpriseEvaluateInfoVo(enterpriseEvaluateInfoVo); detailVo.setEnterpriseEvaluateInfoVo(enterpriseEvaluateInfoVo);
} }
} }
// TODO: 2026/5/7 执法人员二需要处理
//执法人员格式化(参考 queryEnforcementRegistrationPageList 方法)
if (registrationVo != null) {
// 1. 收集所有用户ID(执法人员1 + 执法人员2)
Set<Long> allUserIds = new HashSet<>();
if (StringUtils.isNotBlank(registrationVo.getLawEnforcerId())) {
try { allUserIds.add(Convert.toLong(registrationVo.getLawEnforcerId())); } catch (Exception ignored) {}
}
if (StringUtils.isNotBlank(registrationVo.getLawEnforcerIdTwo())) {
for (String idStr : registrationVo.getLawEnforcerIdTwo().split(",")) {
try { allUserIds.add(Convert.toLong(idStr.trim())); } catch (Exception ignored) {}
}
}
// 2. 批量查询所有用户
Map<Long, SysUser> userMap = new HashMap<>();
if (CollUtil.isNotEmpty(allUserIds)) {
List<SysUser> users = sysUserMapper.selectList(
new LambdaQueryWrapper<SysUser>()
.select(SysUser::getUserId, SysUser::getUserName, SysUser::getLawCertificateNum, SysUser::getPhonenumber)
.in(SysUser::getUserId, allUserIds)
);
userMap = users.stream().collect(Collectors.toMap(SysUser::getUserId, u -> u, (a, b) -> a));
}
// 3. 执法人员1格式化展示
if (StringUtils.isNotBlank(registrationVo.getLawEnforcerId())) {
try {
SysUser user = userMap.get(Convert.toLong(registrationVo.getLawEnforcerId()));
if (user != null) {
infoVo.setLawEnforcerDisplay(formatEnforcerDisplay(user));
}
} catch (Exception ignored) {}
}
// 4. 执法人员2列表格式化展示
if (StringUtils.isNotBlank(registrationVo.getLawEnforcerIdTwo())) {
List<String> lawTwoList = new ArrayList<>();
for (String idStr : registrationVo.getLawEnforcerIdTwo().split(",")) {
try {
SysUser user = userMap.get(Convert.toLong(idStr.trim()));
if (user != null) {
lawTwoList.add(formatEnforcerDisplay(user));
}
} catch (Exception ignored) {}
}
infoVo.setLawEnforcer2List(lawTwoList);
}
}
return detailVo; return detailVo;
} }

98
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/SysMessageViewLogServiceImpl.java

@ -1,6 +1,10 @@
package com.zdxt.enforcementcode.service.impl; package com.zdxt.enforcementcode.service.impl;
import cn.hutool.core.util.StrUtil;
import com.zdxt.enforcementcode.common.commonenum.MsgSourceTypeEnum;
import com.zdxt.enforcementcode.domain.bean.SysMessageViewLog; import com.zdxt.enforcementcode.domain.bean.SysMessageViewLog;
import com.zdxt.enforcementcode.domain.bo.SysMessageViewLogBo;
import com.zdxt.enforcementcode.mapper.EnforcementRegistrationMapper;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
@ -10,8 +14,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.zdxt.enforcementcode.domain.bo.SysMessageViewLogBo;
import com.zdxt.enforcementcode.domain.vo.SysMessageViewLogVo; import com.zdxt.enforcementcode.domain.vo.SysMessageViewLogVo;
import com.zdxt.enforcementcode.mapper.SysMessageViewLogMapper; import com.zdxt.enforcementcode.mapper.SysMessageViewLogMapper;
import com.zdxt.enforcementcode.service.ISysMessageViewLogService; import com.zdxt.enforcementcode.service.ISysMessageViewLogService;
@ -32,6 +36,7 @@ import java.util.Collection;
public class SysMessageViewLogServiceImpl implements ISysMessageViewLogService { public class SysMessageViewLogServiceImpl implements ISysMessageViewLogService {
private final SysMessageViewLogMapper baseMapper; private final SysMessageViewLogMapper baseMapper;
private final EnforcementRegistrationMapper enforcementRegistrationMapper;
/** /**
* 查询系统消息浏览 * 查询系统消息浏览
@ -138,4 +143,95 @@ public class SysMessageViewLogServiceImpl implements ISysMessageViewLogService {
} }
return baseMapper.deleteByIds(ids) > 0; return baseMapper.deleteByIds(ids) > 0;
} }
/**
* 插入消息查看记录(公共方法)
* 用于在查询详情时自动记录用户查看行为
*
* @param sourceId 来源表ID
* @param sourceType 来源表类型:1-普法消息 2-执法评价
*/
@Override
public void insertViewLog(String sourceId, Integer sourceType) {
// 参数校验
if (StrUtil.isBlank(sourceId) || sourceType == null) {
log.warn("插入查看记录失败:参数为空, sourceId={}, sourceType={}", sourceId, sourceType);
return;
}
try {
// 检查是否登录
if (!LoginHelper.isLogin()) {
log.warn("用户未登录,跳过插入查看记录: sourceId={}", sourceId);
return;
}
// 构建查看记录对象
SysMessageViewLogBo viewLogBo = new SysMessageViewLogBo();
viewLogBo.setSourceId(sourceId);
viewLogBo.setSourceType(sourceType);
// 获取登录用户信息
Long userId = LoginHelper.getUserId();
String username = LoginHelper.getUsername();
String deptId = LoginHelper.getDeptId();
Integer platformType = LoginHelper.getPlatformType();
log.debug("获取登录用户信息: userId={}, username={}, deptId={}, platformType={}",
userId, username, deptId, platformType);
// 设置创建者信息
viewLogBo.setCreateBy(userId);
viewLogBo.setCreateByName(username);
viewLogBo.setCreateDept(deptId);
viewLogBo.setIsDelete(0); // 0=否
viewLogBo.setPlatformType(platformType);
viewLogBo.setCompanyId(deptId);
// 插入查看记录
this.insertByBo(viewLogBo);
log.debug("插入查看记录成功: sourceId={}, sourceType={}, userId={}", sourceId, sourceType, userId);
} catch (Exception e) {
log.error("插入查看记录失败: sourceId={}, sourceType={}", sourceId, sourceType, e);
}
}
/**
* 统计当前登录用户的执法评价未读数量
* <p>
* 计算逻辑:存在于 enforcement_registration 表中但不存在于 sys_message_view_log 表中的记录数
* - 条件1:当前用户在 enforcement_registration 表中作为执法人员1或执法人员2
* - 条件2:该记录在 sys_message_view_log 表中不存在(create_by=当前用户ID AND source_type=2)
*
* @return 未读数量
*/
@Override
public Long countUnreadEvaluate() {
try {
// 检查是否登录
if (!LoginHelper.isLogin()) {
log.warn("用户未登录,无法统计未读数量");
return 0L;
}
// 获取当前登录用户ID
Long userId = LoginHelper.getUserId();
if (userId == null) {
log.warn("当前用户ID为空,无法统计未读数量");
return 0L;
}
// 直接统计未读数(存在于 enforcement_registration 但不存在于 sys_message_view_log 的记录数)
Long unreadCount = baseMapper.countUnreadByUserIdAndSourceType(userId, MsgSourceTypeEnum.ZFPJ.getKey());
if (unreadCount == null) {
unreadCount = 0L;
}
log.info("用户 {} 的执法评价未读数量: {}", userId, unreadCount);
return unreadCount;
} catch (Exception e) {
log.error("统计执法评价未读数量失败", e);
return 0L;
}
}
} }

15
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EnforcementRegistrationMapper.xml

@ -562,8 +562,23 @@
<if test="bo.num != null and bo.num != ''"> <if test="bo.num != null and bo.num != ''">
and t.num &gt;= #{bo.num} and t.num &gt;= #{bo.num}
</if> </if>
<!-- <if test="bo.deptId != null and bo.warnType!=null and bo.warnType ==0" >
and t.bureau_dept_id = #{bo.deptId}
</if>-->
<!-- 数据范围过滤 -->
</where> </where>
order by t.num desc order by t.num desc
</select> </select>
<!-- 统计当前用户作为执法人员的执法登记总数 -->
<select id="countByLawEnforcerId" resultType="java.lang.Long">
SELECT COUNT(DISTINCT id)
FROM enforcement_registration
WHERE is_delete = 0
AND (
law_enforcer_id = #{userId}
OR FIND_IN_SET(#{userId}, law_enforcer_id_two) > 0
)
</select>
</mapper> </mapper>

30
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/SysMessageViewLogMapper.xml

@ -3,4 +3,34 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zdxt.enforcementcode.mapper.SysMessageViewLogMapper"> <mapper namespace="com.zdxt.enforcementcode.mapper.SysMessageViewLogMapper">
<!-- 统计当前用户已读的消息数量 -->
<select id="countReadByUserIdAndSourceType" resultType="java.lang.Long">
SELECT COUNT(DISTINCT source_id)
FROM sys_message_view_log
WHERE create_by = #{userId}
AND source_type = #{sourceType}
AND is_delete = 0
</select>
<!-- 统计当前用户的未读执法评价数量 -->
<!-- 存在于 enforcement_registration 但不存在于 sys_message_view_log 的记录数 -->
<select id="countUnreadByUserIdAndSourceType" resultType="java.lang.Long">
SELECT COUNT(DISTINCT er.id)
FROM enforcement_registration er
WHERE er.is_delete = 0
AND (
er.law_enforcer_id = #{userId}
OR FIND_IN_SET(#{userId}, er.law_enforcer_id_two) > 0
)
AND NOT EXISTS (
SELECT 1
FROM sys_message_view_log svl
WHERE svl.source_id = er.id
AND svl.create_by = #{userId}
AND svl.source_type = #{sourceType}
AND svl.is_delete = 0
)
</select>
</mapper> </mapper>

Loading…
Cancel
Save