Browse Source

执法端-优化查询计划通知接口,页面数据绑定

dev-v1.0.2
niujiyi 5 months ago
parent
commit
5e71035db3
  1. 21
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EnforcementInspectionProgramMapper.java
  2. 29
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnforcementInspectionProgramServiceImpl.java
  3. 30
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EnforcementInspectionProgramMapper.xml
  4. 3
      zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/index.js
  5. 49
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/planNoticeList.vue

21
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EnforcementInspectionProgramMapper.java

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zdxt.enforcementcode.domain.EnforcementInspectionProgram;
import com.zdxt.enforcementcode.domain.bo.EnforcementInspectionProgramBo;
import com.zdxt.enforcementcode.domain.vo.EnforcementInspectionProgramVo;
import org.apache.ibatis.annotations.Param;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import java.util.List;
@ -50,4 +51,24 @@ public interface EnforcementInspectionProgramMapper extends BaseMapperPlus<Enfor
*/
Page<EnforcementInspectionProgramVo> selectPlanPage(Page<EnforcementInspectionProgramVo> page, EnforcementInspectionProgramBo bo);
/**
* 分页查询计划列表(包含权限控制) - 优化版本
*
* @param page 分页参数
* @param bo 查询条件
* @param accessibleDeptIds 可访问的部门ID列表
* @return 计划分页列表
*/
Page<EnforcementInspectionProgramVo> selectPlanPageOptimized(Page<EnforcementInspectionProgramVo> page,
EnforcementInspectionProgramBo bo,
@Param("accessibleDeptIds") List<String> accessibleDeptIds);
/**
* 查询可访问的部门ID列表
*
* @param currentDeptId 当前部门ID
* @return 部门ID列表
*/
List<String> selectAccessibleDeptIds(@Param("currentDeptId") String currentDeptId);
}

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

@ -202,7 +202,7 @@ public class EnforcementInspectionProgramServiceImpl implements IEnforcementInsp
}
/**
* 分页查询计划列表(包含权限控制)
* 分页查询计划列表(包含权限控制)
*
* @param bo 查询条件
* @param pageQuery 分页参数
@ -210,9 +210,13 @@ public class EnforcementInspectionProgramServiceImpl implements IEnforcementInsp
*/
@Override
public TableDataInfo<EnforcementInspectionProgramVo> selectPlanPage(EnforcementInspectionProgramBo bo, PageQuery pageQuery) {
Page<EnforcementInspectionProgramVo> result = baseMapper.selectPlanPage(pageQuery.build(), bo);
// 1. 先查询当前部门及其所有下级部门的ID列表
List<String> accessibleDeptIds = getAccessibleDeptIds(bo.getDeptId());
// 批量查询关联的文件列表(优化 N+1 查询问题)
// 2. 将部门ID列表传入查询
Page<EnforcementInspectionProgramVo> result = baseMapper.selectPlanPageOptimized(pageQuery.build(), bo, accessibleDeptIds);
// 批量查询关联的文件列表(优化 N+1 查询问题)
if (result.getRecords() != null && !result.getRecords().isEmpty()) {
// 1. 收集所有计划ID
List<String> planIds = result.getRecords().stream()
@ -227,7 +231,7 @@ public class EnforcementInspectionProgramServiceImpl implements IEnforcementInsp
fileLqw.eq(ZdxtFile::getIsDelete2, 0); // 只查询未删除的文件
List<ZdxtFileVo> allFiles = zdxtFileMapper.selectVoList(fileLqw);
// 3. 按 businessId 分组,构建 Map
// 3. 按 businessId 分组,构建 Map
Map<String, List<ZdxtFileVo>> filesByPlanId = allFiles.stream()
.collect(Collectors.groupingBy(ZdxtFileVo::getBusinessId));
@ -242,6 +246,23 @@ public class EnforcementInspectionProgramServiceImpl implements IEnforcementInsp
return TableDataInfo.build(result);
}
/**
* 获取可访问的部门ID列表(包括当前部门和所有下级部门)
*
* @param currentDeptId 当前部门ID
* @return 可访问的部门ID列表
*/
private List<String> getAccessibleDeptIds(String currentDeptId) {
if (StringUtils.isBlank(currentDeptId)) {
return Collections.emptyList();
}
// 查询当前部门及其所有下级部门的ID
// 这里需要注入 SysDeptMapper 或者调用现有的部门服务
// 示例代码,需要根据实际项目调整
return baseMapper.selectAccessibleDeptIds(currentDeptId);
}
private LambdaQueryWrapper<EnforcementInspectionProgram> buildQueryWrapper(EnforcementInspectionProgramBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<EnforcementInspectionProgram> lqw = Wrappers.lambdaQuery();

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

@ -190,4 +190,34 @@
</where>
ORDER BY create_time DESC
</select>
<!-- 分页查询计划列表(包含权限控制) - 最优化版本 -->
<select id="selectPlanPageOptimized" resultType="com.zdxt.enforcementcode.domain.vo.EnforcementInspectionProgramVo">
<include refid="selectEnforcementInspectionProgramVo"/>
<where>
<!-- 权限控制:已发布 或 在可访问部门列表中 -->
(
is_publish = 1
OR enforcement_department_id IN
<foreach collection="accessibleDeptIds" item="deptId" open="(" separator="," close=")">
#{deptId}
</foreach>
)
<!-- 搜索条件 -->
<if test="bo.searchText != null and bo.searchText != ''">
AND (plan_name LIKE CONCAT('%', #{bo.searchText}, '%')
OR enforcement_department LIKE CONCAT('%', #{bo.searchText}, '%')
OR bureau_dept_name LIKE CONCAT('%', #{bo.searchText}, '%'))
</if>
</where>
ORDER BY create_time DESC
</select>
<!-- 查询可访问的部门ID列表 -->
<select id="selectAccessibleDeptIds" resultType="java.lang.String">
SELECT dept_id FROM sys_dept
WHERE dept_id = #{currentDeptId}
OR FIND_IN_SET(#{currentDeptId}, ancestors) != 0
</select>
</mapper>

3
zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/index.js

@ -72,6 +72,9 @@ export const queryEnforcementNoticeList = (params, success, error) => _post(base
// 执法预告列表
export const getLawNoticeList = (params, success, error) => _post(baseUrl + "/enforcement/queryList", params, success, error);
//计划通知列表
export const queryListNoPermission = (params, success, error) => _get(baseUrl + "/inspectionProgram/queryListNoPermission", params, success, error);
// 执法评价列表
export const queryEvaluateList = (params, success, error) => _get("/app-ent/evaluate/queryEvaluateList", params, success, error);

49
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/planNoticeList.vue

@ -24,7 +24,7 @@
<div class="plan-card" v-for="item in list" :key="item.id">
<div class="card-header">
<van-icon name="bell" class="bell-icon" />
<span class="plan-title">{{ item.checkItemText || item.checkItem }}</span>
<span class="plan-title">{{ item.planName || item.planName }}</span>
</div>
<div class="card-content">
<div class="info-row">
@ -33,15 +33,27 @@
</div>
<div class="info-row">
<span class="label">执法区域:</span>
<span class="value">{{ item.unitCheck }}</span>
<span class="value">{{ item.enforcementAreaName || item.enforcementArea }}</span>
</div>
<div class="info-row">
<span class="label">发布时间:</span>
<span class="value">{{ item.checkTime }}</span>
<span class="value">{{ item.enforcementTime }}</span>
</div>
<div class="info-row">
<span class="label">附件:</span>
<span class="value"></span>
<span class="value">
<template v-if="item.fileList && item.fileList.length > 0">
<span
v-for="(file, index) in item.fileList"
:key="file.guid || index"
class="attachment-link"
@click="downloadAttachment(file)"
>
{{ file.fileName || file.fileSaveName || '未知文件' }}
</span>
</template>
<span v-else>无</span>
</span>
</div>
</div>
</div>
@ -56,7 +68,7 @@ import { ref, onMounted } from 'vue';
import { useRouter } from 'vue-router';
import { showToast } from 'vant';
import 'vant/es/toast/style';
import { getLawNoticeList } from '@/api/enforcement/index';
import { queryListNoPermission } from '@/api/enforcement/index';
const router = useRouter();
@ -76,7 +88,7 @@ const fetchList = () => {
pageSize: pageSize.value,
queryParam: searchText.value || undefined,
};
getLawNoticeList(params, (res) => {
queryListNoPermission(params, (res) => {
if (res.code === 200) {
const rows = res.rows || [];
const total = res.total;
@ -143,6 +155,21 @@ const onClickLeft = () => {
router.back();
};
// ========== 下载附件 ==========
const downloadAttachment = (file) => {
if (!file || !file.guid) {
showToast('无法下载该附件');
return;
}
const downloadUrl = `/api/enf-ep/app-enf/common/file/download?guid=${file.guid}`;
const link = document.createElement('a');
link.href = downloadUrl;
link.download = file.fileName || file.fileSaveName;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
};
// ========== 组件挂载时加载数据 ==========
onMounted(() => {
// fetchList();
@ -259,6 +286,16 @@ onMounted(() => {
.value {
flex: 1;
color: #999;
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.attachment-link {
color: #2d94fa;
text-decoration: underline;
word-break: break-all;
cursor: pointer;
}
}

Loading…
Cancel
Save