From 4c79fa27b279066bb662390e6443646c127ae85a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E4=B8=8A=E5=AE=98=E5=B0=8F=E9=9B=A8?= <1792146564@qq.com>
Date: Sat, 13 Jun 2026 17:47:02 +0800
Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E4=BB=A3=E7=A0=81=E6=8F=90?=
=?UTF-8?q?=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../zdxt-admin-nos-plus-ui/.env.development | 2 +-
.../src/api/nos/type.ts | 2 +-
.../src/utils/request.ts | 2 +
.../src/views/nos/detail.vue | 147 ++++++-
.../src/views/nos/legalTech.vue | 27 +-
.../src/views/nos/legalTechEdit.vue | 21 +-
.../enforcement/nos/AttachmentTaskSource.vue | 64 ++-
.../nos/EnforcementInfoSection.vue | 85 +++-
.../src/http/http.js | 1 +
.../src/main.js | 2 +
.../src/router/nos/nos-base-router.js | 2 +-
.../src/util/fileUpload.js | 1 +
.../src/util/fileUrl.js | 13 +-
.../nos/components/NosDetailMaterialsTab.vue | 389 ++++++++----------
.../nos/components/NosDetailTaskTab.vue | 208 ++++++++--
.../nos/components/NosListPanel.vue | 12 +-
.../src/views/enforcement/nos/nosAdd.vue | 21 +-
.../views/enforcement/nos/nosCloudRecord.vue | 1 +
.../src/views/enforcement/nos/nosDetail.vue | 11 +-
.../views/enforcement/nos/nosEvaluateList.vue | 282 ++++++-------
.../src/views/enforcement/nos/nosList.vue | 21 +-
.../vite-env/.env.enforcement-dev | 2 +-
.../src/api/enterprise/index.js | 2 +-
.../src/api/nos/enfDemo.js | 4 +-
.../src/http/http.js | 1 +
.../src/router/nos/nos-base-router.js | 2 +-
.../nos/components/NosDetailMaterialsTab.vue | 69 +++-
.../nos/components/NosDetailTaskTab.vue | 176 +++++++-
.../nos/components/NosListPanel.vue | 12 +-
.../nos/message/nosEvaluationList.vue | 2 +-
.../views/enterprise/nos/nosCloudRecord.vue | 2 +
.../src/views/enterprise/nos/nosDetail.vue | 21 +-
.../src/views/enterprise/nos/nosList.vue | 20 +-
.../vite-env/.env.enterprise-dev | 2 +-
34 files changed, 1108 insertions(+), 521 deletions(-)
diff --git a/zdxt-web-client/zdxt-admin-nos-plus-ui/.env.development b/zdxt-web-client/zdxt-admin-nos-plus-ui/.env.development
index 55de834..cf3e768 100644
--- a/zdxt-web-client/zdxt-admin-nos-plus-ui/.env.development
+++ b/zdxt-web-client/zdxt-admin-nos-plus-ui/.env.development
@@ -1,5 +1,5 @@
# VITE_APP_PROXY_TARGET = 'http://139.186.148.21:8080'
-VITE_APP_PROXY_TARGET = 'http://192.168.1.11:28080'
+VITE_APP_PROXY_TARGET = 'http://192.168.1.9:28080'
# 页面标题
VITE_APP_TITLE = zdxt-Vue-Plus多租户管理系统
VITE_APP_LOGO_TITLE = 行政执法监督码
diff --git a/zdxt-web-client/zdxt-admin-nos-plus-ui/src/api/nos/type.ts b/zdxt-web-client/zdxt-admin-nos-plus-ui/src/api/nos/type.ts
index f0942fd..9da853b 100644
--- a/zdxt-web-client/zdxt-admin-nos-plus-ui/src/api/nos/type.ts
+++ b/zdxt-web-client/zdxt-admin-nos-plus-ui/src/api/nos/type.ts
@@ -333,7 +333,7 @@ export interface NosLawEnforcementTaskItem {
organId?: string;
params?: MapObject;
/**
- * 是否通过(0-有异议,1-通过)
+ * 是否通过(0-不通过,1-通过)
*/
pass?: number;
/**
diff --git a/zdxt-web-client/zdxt-admin-nos-plus-ui/src/utils/request.ts b/zdxt-web-client/zdxt-admin-nos-plus-ui/src/utils/request.ts
index d913b94..d82069d 100644
--- a/zdxt-web-client/zdxt-admin-nos-plus-ui/src/utils/request.ts
+++ b/zdxt-web-client/zdxt-admin-nos-plus-ui/src/utils/request.ts
@@ -97,6 +97,8 @@ service.interceptors.request.use(
if (config.data instanceof FormData) {
delete config.headers['Content-Type'];
}
+ console.log(111,config);
+
return config;
},
(error: any) => {
diff --git a/zdxt-web-client/zdxt-admin-nos-plus-ui/src/views/nos/detail.vue b/zdxt-web-client/zdxt-admin-nos-plus-ui/src/views/nos/detail.vue
index 328db38..3f367d8 100644
--- a/zdxt-web-client/zdxt-admin-nos-plus-ui/src/views/nos/detail.vue
+++ b/zdxt-web-client/zdxt-admin-nos-plus-ui/src/views/nos/detail.vue
@@ -43,11 +43,11 @@
检查对象
- {{detailData?.taskTypeId != 5 ? '执法单位' : '巡查单位'}}
+ {{detailData?.taskTypeId != 5 || detailData?.taskOriginalTypeId != 5 ? '执法单位' : '巡查单位'}}
{{ detailData?.lawEnforcementAgency || '--' }}
-
{{detailData?.taskTypeId != 5 ? '执法人员' : '参与人员'}}
+
{{detailData?.taskTypeId != 5 || detailData?.taskOriginalTypeId != 5 ? '执法人员' : '参与人员'}}
@@ -63,7 +63,7 @@
-
{{detailData?.taskTypeId != 5 ? '执法信息' : '巡查信息'}}
+
{{detailData?.taskTypeId != 5 || detailData?.taskOriginalTypeId != 5 ? '执法信息' : '巡查信息'}}
企业名称
@@ -77,8 +77,8 @@
类 别
{{ detailData?.taskTypeName || '--' }}
-
-
{{detailData?.taskTypeId != 5 ? '执法事项' : '巡查事项'}}
+
+ {{detailData?.taskTypeId != 5 || detailData?.taskOriginalTypeId != 5 ? '执法事项' : '巡查事项'}}
{{ detailData?.lawEnforcementMatters || '--' }}
@@ -94,7 +94,7 @@
-
{{detailData?.taskTypeId != 5 ? '执法依据' : '依 据'}}
+
{{detailData?.taskTypeId != 5 || detailData?.taskOriginalTypeId != 5 ? '执法依据' : '依 据'}}
+
+
+
+
+
+ 调查信息
+ 复制
+
+
+
+ 依据“{{ noticeFileName }}”通知/公告,{{ investigationParagraph1Body }}
+
+
{{ investigationParagraph2 }}
+
+ {{ investigationParagraph3 }}
+ 检查时间{{ formattedCheckTimeCn }}
+
+
+
+
@@ -184,7 +204,7 @@
检查时间:
-
{{ detailData?.checkTime || '--' }}
+
{{detailData?.taskStatus == 5 ? detailData?.deadline : detailData?.checkTime || '--' }}
@@ -296,6 +316,18 @@ const requirementLabel = computed(() => {
return CATEGORY_REQUIREMENT_LABEL_MAP[typeName] || '';
});
+const isCompletedTask = computed(() => detailData.value?.taskStatus === 4);
+
+const noticeFileName = computed(() => detailData.value?.proclamation?.[0]?.fileName || '');
+
+const enforcementPersonNames = computed(() => {
+ return detailData.value?.lawEnforcer?.map((person) => person.lawEnforcerName).filter(Boolean).join('、') || '';
+});
+
+const requirementItems = computed(() => {
+ return detailData.value?.taskItemList?.map((item) => item.itemName).filter(Boolean).join('、') || '';
+});
+
const onBack = () => {
router.back();
};
@@ -305,6 +337,73 @@ const formatDateTime = (time?: string) => {
return parseTime(time, '{y}-{m}-{d} {h}:{i}:{s}')?.replace(/:\d{2}$/, '') || '';
};
+const formatDateTimeCn = (time?: string) => {
+ if (!time) return '';
+ const parsed = parseTime(time, '{y}年{m}月{d}日{h}时{i}分{s}秒');
+ return parsed || time;
+};
+
+const formattedCreateTimeCn = computed(() => formatDateTimeCn(detailData.value?.createTime));
+const formattedCheckTimeCn = computed(() => formatDateTimeCn(detailData.value?.checkTime));
+
+const investigationParagraph1Body = computed(() => {
+ const detail = detailData.value;
+ if (!detail) return '';
+
+ const personType = detail.taskTypeId === 5 ? '巡查人员' : '执法人员';
+ const enforcementUnit = detail.lawEnforcementAgency || '深圳市执法局';
+ return `在${formattedCreateTimeCn.value}${enforcementUnit},${personType}${enforcementPersonNames.value},对${detail.enterpriseName || ''}进行了${detail.taskTypeName || ''}。`;
+});
+
+const investigationParagraph2 = computed(() => {
+ const detail = detailData.value;
+ if (!detail) return '';
+
+ let text = '';
+ if (detail.taskTypeId === 1 || detail.taskTypeId === 5) {
+ const matterType = detail.taskTypeId === 5 ? '巡查事项' : '执法事项';
+ text += `${matterType},${detail.lawEnforcementMatters || ''};`;
+ }
+
+ text += `${requirementLabel.value}有:${requirementItems.value}。`;
+ return text;
+});
+
+const investigationParagraph3 = computed(() => {
+ return `企业已提交材料,经核验,企业通过本次${detailData.value?.taskTypeName || ''}。`;
+});
+
+const investigationText = computed(() => {
+ return `${noticeFileName.value ? `依据“${noticeFileName.value}”通知/公告,` : ''}${investigationParagraph1Body.value}\n\n${investigationParagraph2.value}\n\n${investigationParagraph3.value}\n检查时间${formattedCheckTimeCn.value}`;
+});
+
+const copyInvestigationInfo = async () => {
+ try {
+ if (navigator.clipboard && window.isSecureContext) {
+ await navigator.clipboard.writeText(investigationText.value);
+ ElMessage.success('复制成功');
+ return;
+ }
+
+ const textArea = document.createElement('textarea');
+ textArea.value = investigationText.value;
+ textArea.style.position = 'absolute';
+ textArea.style.left = '-999999px';
+ document.body.prepend(textArea);
+ textArea.select();
+ try {
+ document.execCommand('copy');
+ ElMessage.success('复制成功');
+ } catch {
+ ElMessage.error('复制失败,请手动复制');
+ } finally {
+ textArea.remove();
+ }
+ } catch {
+ ElMessage.error('复制失败,请手动复制');
+ }
+};
+
const formatLawEnforcerName = (person: LawEnforcer) => {
return `${person.lawEnforcerName || ''}${person.lawEnforcerPhone ? ` ${person.lawEnforcerPhone}` : ''}`.trim() || '--';
};
@@ -318,7 +417,8 @@ const STATUS_OPTIONS = [
{ text: "退回企业补正", value: 2 },
{ text: "待审核", value: 3 },
{ text: "已办结", value: 4 },
- { text: "已办结(超期)", value: 5 }
+ { text: "已办结(超期)", value: 5 },
+ { text: "转为待核实处置案件", value: 6 },
]
// 使用上面的类型
const getCheckResultText = (taskStatus?: number) => {
@@ -328,7 +428,7 @@ const getCheckResultText = (taskStatus?: number) => {
const getItemAuditText = (pass?: number) => {
if (pass === 1) return '通过';
- if (pass === 0) return '有异议';
+ if (pass === 0) return '不通过';
return '待审核';
};
@@ -558,6 +658,13 @@ watch(
color: #303133;
}
+.title-with-btn {
+ display: flex;
+ align-items: center;
+ gap: 20px;
+ /* justify-content: space-between; */
+}
+
.detail-row {
display: flex;
align-items: flex-start;
@@ -594,6 +701,28 @@ watch(
word-break: break-all;
}
+.investigation-content {
+ padding: 12px;
+ background: #f8f9fa;
+ border-radius: 6px;
+ font-size: 14px;
+ color: #303133;
+ line-height: 1.6;
+ word-break: break-all;
+}
+
+.investigation-content p {
+ margin: 0 0 12px 0;
+}
+
+.investigation-content p:last-child {
+ margin-bottom: 0;
+}
+
+.text-nowrap {
+ white-space: nowrap;
+}
+
.detail-value--notice {
display: flex;
align-items: center;
diff --git a/zdxt-web-client/zdxt-admin-nos-plus-ui/src/views/nos/legalTech.vue b/zdxt-web-client/zdxt-admin-nos-plus-ui/src/views/nos/legalTech.vue
index afc9548..182bd9b 100644
--- a/zdxt-web-client/zdxt-admin-nos-plus-ui/src/views/nos/legalTech.vue
+++ b/zdxt-web-client/zdxt-admin-nos-plus-ui/src/views/nos/legalTech.vue
@@ -17,13 +17,7 @@
-
+
@@ -34,21 +28,12 @@
重置
-
-
-
-
新增
-
+
@@ -109,10 +94,7 @@ import { useRouter } from 'vue-router';
import { ElMessage } from 'element-plus';
import { Paperclip } from '@element-plus/icons-vue';
import { getLegalTechRecordsPage } from '@/api/nos/index';
-import type {
- NosLawEnforcementFilingPageVO,
- LegalTechRecordsPageResponse
-} from '@/api/nos/type';
+import type { NosLawEnforcementFilingPageVO, LegalTechRecordsPageResponse } from '@/api/nos/type';
import { parseTime } from '@/utils/ruoyi';
const router = useRouter();
@@ -216,7 +198,7 @@ const buildQueryParams = () => {
const getList = async () => {
loading.value = true;
try {
- const res = (await getLegalTechRecordsPage(buildQueryParams()) as unknown) as LegalTechRecordsPageResponse;
+ const res = (await getLegalTechRecordsPage(buildQueryParams())) as unknown as LegalTechRecordsPageResponse;
tableData.value = res.rows || [];
total.value = res.total || 0;
} catch (error) {
@@ -278,6 +260,7 @@ onMounted(() => {
}
.search-panel {
+ display: flex;
background: #fff;
padding: 16px 20px;
border-radius: 8px;
diff --git a/zdxt-web-client/zdxt-admin-nos-plus-ui/src/views/nos/legalTechEdit.vue b/zdxt-web-client/zdxt-admin-nos-plus-ui/src/views/nos/legalTechEdit.vue
index 2d43d32..c3935aa 100644
--- a/zdxt-web-client/zdxt-admin-nos-plus-ui/src/views/nos/legalTechEdit.vue
+++ b/zdxt-web-client/zdxt-admin-nos-plus-ui/src/views/nos/legalTechEdit.vue
@@ -32,6 +32,7 @@
:show-file-list="true"
:file-list="legalFileList"
:on-remove="(file) => handleFileRemove(file, 'legal')"
+ :before-upload="beforeUpload"
accept=".pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx"
:limit="1"
:on-exceed="handleExceed"
@@ -39,7 +40,7 @@
点击或将文件拖拽到这里上传
-
文件格式:word、excel、ppt、PDF等文档
+
文件格式:word、excel、ppt、PDF等文档,大小不超过200M
@@ -54,6 +55,7 @@
:show-file-list="true"
:file-list="technicalFileList"
:on-remove="(file) => handleFileRemove(file, 'technical')"
+ :before-upload="beforeUpload"
accept=".pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx"
:limit="1"
:on-exceed="handleExceed"
@@ -61,7 +63,7 @@
点击或将文件拖拽到这里上传
-
文件格式:word、excel、ppt、PDF等文档
+
文件格式:word、excel、ppt、PDF等文档,大小不超过200M
@@ -131,6 +133,21 @@ const loadDeptOptions = async () => {
}
};
+const MAX_FILE_SIZE = 200 * 1024 * 1024;
+const ALLOWED_FILE_EXT_RE = /\.(pdf|doc|docx|xls|xlsx|ppt|pptx)$/i;
+
+const beforeUpload = (file: File) => {
+ if (!ALLOWED_FILE_EXT_RE.test(file.name)) {
+ ElMessage.warning('仅支持上传 word、excel、ppt、PDF 格式文件');
+ return false;
+ }
+ if (file.size > MAX_FILE_SIZE) {
+ ElMessage.warning('文件大小不能超过 200M');
+ return false;
+ }
+ return true;
+};
+
const handleExceed = () => {
ElMessage.warning('只能上传一个文件,请先删除已上传的文件');
};
diff --git a/zdxt-web-client/zdxt-efcode-nos-enforcement-app/src/components/enforcement/nos/AttachmentTaskSource.vue b/zdxt-web-client/zdxt-efcode-nos-enforcement-app/src/components/enforcement/nos/AttachmentTaskSource.vue
index ac30450..b288a94 100644
--- a/zdxt-web-client/zdxt-efcode-nos-enforcement-app/src/components/enforcement/nos/AttachmentTaskSource.vue
+++ b/zdxt-web-client/zdxt-efcode-nos-enforcement-app/src/components/enforcement/nos/AttachmentTaskSource.vue
@@ -6,7 +6,17 @@
附 件 (仅限于PDF文档,50M以下,最多五个文件)
-
+
@@ -31,7 +41,8 @@
import { computed } from 'vue';
import { uploadFile } from '@/util/fileUpload';
import { toFullFileUrl } from '@/util/fileUrl';
-
+import { showToast } from 'vant';
+import 'vant/es/toast/style';
const props = defineProps({
formData: {
type: Object,
@@ -50,16 +61,51 @@ const taskSourceName = computed(() => {
const emit = defineEmits(['showTaskSourcePicker', 'open-picker']);
+const showUploadToast = (message) => {
+ showToast({
+ message,
+ className: 'attachment-upload-toast'
+ });
+};
+
+// 附件上传前校验
+const onBeforeRead = (file) => {
+ const files = Array.isArray(file) ? file : [file];
+ let isValid = true;
+ for (const item of files) {
+ const isPdf = item.name.toLowerCase().endsWith('.pdf');
+ const isTypeMatch = item.type === 'application/pdf';
+
+ if (!isPdf || !isTypeMatch) {
+ showUploadToast('仅支持上传 PDF 格式文件');
+ isValid = false;
+ break;
+ }
+ }
+ return isValid;
+};
+
+// 文件大小超出限制
+const onOversize = () => {
+ showUploadToast('文件大小不能超过 50MB');
+};
+
// 附件上传处理
const onAfterReadImage = (file) => {
const files = Array.isArray(file) ? file : [file];
files.forEach((f) => {
+ f.status = 'uploading';
+ f.message = '上传中...';
uploadFile(f, (res) => {
- const data = res && res.data ? res.data : res;
- const filePath = typeof data === 'string' ? data : (data && (data.url || data.fileUrl || data.path)) || '';
+ const filePath = res.url;
if (filePath) {
f.url = toFullFileUrl(filePath);
+ f.name = f.name || f.file?.name || '';
f.status = 'done';
+ f.message = '上传成功';
+ } else {
+ f.status = 'failed';
+ f.message = '上传失败';
}
});
});
@@ -129,4 +175,14 @@ const onAfterReadImage = (file) => {
padding-left: 8px; // 按需调整
box-sizing: border-box;
}
+
+:global(.attachment-upload-toast) {
+ color: #fff !important;
+ background: rgba(0, 0, 0, 0.75) !important;
+}
+
+:global(.attachment-upload-toast .van-toast__text) {
+ color: #fff !important;
+}
+
diff --git a/zdxt-web-client/zdxt-efcode-nos-enforcement-app/src/components/enforcement/nos/EnforcementInfoSection.vue b/zdxt-web-client/zdxt-efcode-nos-enforcement-app/src/components/enforcement/nos/EnforcementInfoSection.vue
index 963d683..e1856f1 100644
--- a/zdxt-web-client/zdxt-efcode-nos-enforcement-app/src/components/enforcement/nos/EnforcementInfoSection.vue
+++ b/zdxt-web-client/zdxt-efcode-nos-enforcement-app/src/components/enforcement/nos/EnforcementInfoSection.vue
@@ -30,14 +30,15 @@
+
+
-
-
+
+
+
+ v-if="formData.taskTypeId == 5"
+ v-model="formData.legalBasis[0]"
+ name="legalBasis"
+ label="依 据"
+ placeholder="请输入依据"
+ type="textarea"
+ class="usci-code-field"
+ rows="2"
+ autosize
+ maxlength="1000"
+ show-word-limit />
-
-
-
+
暂无资料上传
@@ -20,62 +20,32 @@
-
-
- *{{ item.itemName }}
-
+