Browse Source

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

dev-v1.0.2
庄锐波 5 months ago
parent
commit
b2f7e001bb
  1. 14
      doc/打包命令/命令
  2. 21
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EnforcementInspectionProgramMapper.java
  3. 29
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnforcementInspectionProgramServiceImpl.java
  4. 4
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnforcementRegistrationServiceImpl.java
  5. 64
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EnforcementInspectionProgramMapper.xml
  6. 3
      zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/index.js
  7. 49
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/planNoticeList.vue
  8. 2
      zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/enforcement/enforcementEvaluateDetail.vue
  9. 9
      zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev.yml
  10. 9
      zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-prod.yml
  11. 4
      zdxt-web-server/zdxt-admin-web-server/src/main/resources/application.yml

14
doc/打包命令/命令

@ -0,0 +1,14 @@
后端
1、进入目录:cd /usr/local/project/
2、查看目录下文件:ls
3、查看系统运行java 进程:ps -ef | grep java
4、杀死进程:kill 9 31888
5、清空终端屏幕:clear
6、后台启动 Java 项目 + 关闭终端不退出 + 日志全部写入 app.log 文件:nohup java -jar zdxt-admin-web-server.jar > app.log 2>&1 &
7、实时盯紧 Java 程序的运行日志:tail -f app.log
前端
文件命名:监督端:admin-plus-dev 执法端:enforcement-dev 企业端:enterprise-dev
1、前端地址: /usr/local/nginx/html
2、解压:unzip xxx.zip
3、删除文件 rm -f admin-plus-dev.zip

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();

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

@ -645,8 +645,8 @@ public class EnforcementRegistrationServiceImpl implements IEnforcementRegistrat
district = extract(bo.getEnterpriseAddress(), "([^\\s市]+?区)");
street = extract(bo.getEnterpriseAddress(), "([^\\s区]+?街道)");
}
vo.setDistrict(district);
vo.setStreet(street);
bo.setDistrict(district);
bo.setStreet(street);
resNum = baseMapper.insertEnforcementRegistration(bo);
// unionNo 上来不等于null, 那么说明关联了联合检查, 则直接新增, 并且将之前的所有 uninoNo相同的 hasUnion更新为 1

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

@ -161,15 +161,63 @@
order by create_time desc
</select>
<!-- 分页查询计划列表(包含权限控制) -->
<!-- 分页查询计划列表(包含权限控制) - 优化版本 -->
<select id="selectPlanPage" resultType="com.zdxt.enforcementcode.domain.vo.EnforcementInspectionProgramVo">
<include refid="selectEnforcementInspectionProgramVo"/>
where (is_publish = 1 or enforcement_department_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = #{bo.deptId} or find_in_set( #{bo.deptId} , ancestors ) != 0 ))
<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>
order by create_time desc
<where>
<!-- 使用 UNION 替代 OR,提升查询性能 -->
id IN (
<!-- 已发布的计划 -->
SELECT id FROM enforcement_inspection_program WHERE is_publish = 1
UNION
<!-- 本部门及下级部门的计划 -->
SELECT id FROM enforcement_inspection_program
WHERE enforcement_department_id IN (
SELECT dept_id FROM sys_dept
WHERE dept_id = #{bo.deptId}
OR FIND_IN_SET(#{bo.deptId}, ancestors) != 0
)
)
<!-- 搜索条件 -->
<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>
<!-- 分页查询计划列表(包含权限控制) - 最优化版本 -->
<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;
}
}

2
zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/enforcement/enforcementEvaluateDetail.vue

@ -46,7 +46,7 @@
</div>
<div class="info-row">
<span class="info-label">执法事项</span>
<span class="info-value">{{ detail.lawEnforcementItem }}</span>
<span class="info-value">{{ detail.lawEnforcementItemText }}</span>
</div>
<div class="info-row">
<span class="info-label">执法时间</span>

9
zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev.yml

@ -342,3 +342,12 @@ srnwg:
# integrationKey: ENC(8RZtrfL4t5tsEk7lfrw00+4hSxbjxcVM)
# paasId: szsfj_zhifajianduma_001
# paasToken: ENC(0Cg8Vtpay+3hwRm+vJB0utikr4dXcEguwSaxlbTWkgQ4parB8pN2rL2xrhQ8eUd5)
--- # XSS过滤配置
xss:
# 开启XSS过滤
enabled: true
# 排除链接(不进行XSS过滤的URL,这些接口需要接收富文本HTML内容)
excludeUrls:
- /web/enforcementcode/educationServices/add
- /web/enforcementcode/educationServices/edit

9
zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-prod.yml

@ -274,3 +274,12 @@ justauth:
client-id: 10**********6
client-secret: 1f7d08**********5b7**********29e
redirect-uri: ${justauth.address}/social-callback?source=gitea
--- # XSS过滤配置
xss:
# 开启XSS过滤
enabled: true
# 排除链接(不进行XSS过滤的URL,这些接口需要接收富文本HTML内容)
excludeUrls:
- /web/enforcementcode/educationServices/add
- /web/enforcementcode/educationServices/edit

4
zdxt-web-server/zdxt-admin-web-server/src/main/resources/application.yml

@ -281,9 +281,11 @@ springdoc:
xss:
# 过滤开关
enabled: true
# 排除链接
# 排除链接(不进行XSS过滤的URL,这些接口需要接收富文本HTML内容)
excludeUrls:
- /system/notice
- /web/enforcementcode/educationServices/add
- /web/enforcementcode/educationServices/edit
--- # 分布式锁 lock4j 全局配置
lock4j:

Loading…
Cancel
Save