Browse Source

企业端新增

dev-V1.10.0
wangmingyong@163.com 3 weeks ago
parent
commit
48a61b6173
  1. 3
      zdxt-web-client/zdxt-efcode-enforcement-app/src/api/nos/index.js
  2. 32
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/nos/nosDetail.vue
  3. 4
      zdxt-web-client/zdxt-efcode-enforcement-app/vite-env/.env.enforcement-dev-wmy
  4. 2
      zdxt-web-client/zdxt-efcode-enterprise-app/src/components/enterprise/footerNav.vue
  5. 7
      zdxt-web-client/zdxt-efcode-enterprise-app/src/router/enterprise-app/ent-main-router.js
  6. 54
      zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/enforcement/enforcementRegistrationList.vue
  7. 368
      zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/law/lawQuery.vue
  8. 3
      zdxt-web-client/zdxt-efcode-enterprise-app/vite-env/.env.enterprise-dev-wmy

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

@ -15,6 +15,9 @@ export const nosListPageApi = (params, success, error) => _post("/app-enf/nos-la
export const nosInfoApi = (params, success, error) => _get("/app-enf/nos-law-enforcement-task/detail", params, success, error);
// 审核非现场执法任务
export const nosApproveApi = (params, success, error) => _post("/app-enf/nos-law-enforcement-task/approve", params, success, error);
// 核实案件(待核实状态)
export const nosVerifyCaseApi = (params, success, error) => _post("/app-enf/nos-law-enforcement-task/verify-case", params, success, error);
// 查询非现场执法项目任务类别
export const nosTypeApi = (params, success, error) => _post("/app-enf/nos-law-enforcement-task/type", params, success, error);
//查询非现场执法项目任务来源列表

32
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/nos/nosDetail.vue

@ -39,10 +39,14 @@
</van-tab>
</van-tabs>
<div v-if="activeTab === 'materials' && Number(taskDetail.taskStatus) === 3" class="detail-footer">
<van-button class="btn-cancel" @click="onCloudRecord">云笔录</van-button>
<van-button class="btn-cancel" @click="onCancel">取消</van-button>
<van-button class="btn-submit" type="primary" native-type="submit">提交</van-button>
<div v-if="activeTab === 'materials' && (Number(taskDetail.taskStatus) === 3 || (Number(taskDetail.taskStatus) === 6 && showVerifyBtn))" class="detail-footer">
<template v-if="Number(taskDetail.taskStatus) === 3">
<van-button class="btn-cancel" @click="onCloudRecord">云笔录</van-button>
<van-button class="btn-cancel" @click="onCancel">取消</van-button>
<van-button class="btn-submit" type="primary" native-type="submit">提交</van-button>
<van-button class="btn-cancel">转办案</van-button>
</template>
<van-button v-else class="btn-submit" type="primary">核实</van-button>
</div>
</van-form>
</div>
@ -52,7 +56,7 @@
import { showConfirmDialog, showSuccessToast, showToast } from 'vant'
import NosDetailTaskTab from './components/NosDetailTaskTab.vue'
import NosDetailMaterialsTab from './components/NosDetailMaterialsTab.vue'
import { nosInfoApi, nosApproveApi, cloudRecordStartApi } from '@/api/nos/index'
import { nosInfoApi, nosApproveApi, cloudRecordStartApi, nosVerifyCaseApi } from '@/api/nos/index'
import { toFullFileUrl } from '@/util/fileUrl'
const router = useRouter()
@ -73,6 +77,7 @@ const taskTabTitle = computed(() => TAB_TASK_TITLE_MAP[route.query.tab] || '行
const taskDetail = ref({})
const taskItemList = ref([])
const evaluateData = ref(null)
const showVerifyBtn = ref(false)
const inspectResult = ref({
checkResult: '',
@ -143,6 +148,20 @@ const fetchTaskDetail = async () => {
const res = await nosInfoApi({ taskId })
if (res && res.code === 200 && res.data) {
applyDetailData(res.data)
// 待核实状态下,调用 verify-case 接口判断是否显示核实按钮
if (Number(res.data.taskStatus) === 6) {
try {
const verifyRes = await nosVerifyCaseApi({ taskId })
if (verifyRes && verifyRes.code === 200) {
showVerifyBtn.value = true
} else {
showVerifyBtn.value = false
}
} catch (verifyErr) {
console.error('verify-case error:', verifyErr)
showVerifyBtn.value = false
}
}
}
} catch (err) {
console.error(err)
@ -341,6 +360,7 @@ const onSubmit = async () => {
.detail-footer {
flex-shrink: 0;
display: flex;
flex-direction: column;
gap: 12px;
padding: 12px 16px;
background: #fff;
@ -348,7 +368,7 @@ const onSubmit = async () => {
.btn-cancel,
.btn-submit {
flex: 1;
width: 100%;
height: 44px;
border-radius: 22px;
font-size: 16px;

4
zdxt-web-client/zdxt-efcode-enforcement-app/vite-env/.env.enforcement-dev-wmy

@ -5,8 +5,8 @@ VITE_CONTEXT_PATH = '/efcode20-enf-app/'
# VITE_PROXY_TARGET = 'http://139.186.148.21:8080'
# VITE_API_URL = 'http://192.168.1.17:8080'
# VITE_PROXY_TARGET = 'http://172.16.21.213:8080'
VITE_PROXY_TARGET = 'http://172.16.21.93:8080'
# VITE_PROXY_TARGET = 'http://172.16.20.72:8080'
# VITE_PROXY_TARGET = 'http://172.16.21.93:8080'
VITE_PROXY_TARGET = 'http://172.16.20.72:8080'
VITE_DEFAULT_LOGIN = '/enforcement/loginByPassword'
VITE_APP_ENV = 'dev'
VITE_FILE_URL = ''

2
zdxt-web-client/zdxt-efcode-enterprise-app/src/components/enterprise/footerNav.vue

@ -7,7 +7,7 @@
<!-- <van-tabbar-item name="Classify" replace icon="bell" to="/enterprise/lawQuery">
法律查询
</van-tabbar-item> -->
<van-tabbar-item name="Classify" replace icon="notes-o" to="">
<van-tabbar-item name="Classify" replace icon="notes-o" to="/enterprise/lawQuery">
法律查询
</van-tabbar-item>
<van-tabbar-item name="Classify" push to="/enterprise/nos">

7
zdxt-web-client/zdxt-efcode-enterprise-app/src/router/enterprise-app/ent-main-router.js

@ -93,6 +93,13 @@ const routes = [
meta: { title: "法律查询" },
component: () => import("@/views/enterprise/law/lawQuery.vue"),
},
// 法律详情
{
path: "/enterprise/lawDetail",
name: "lawDetail",
meta: { title: "法律详情" },
component: () => import("@/views/enterprise/law/lawDetail.vue"),
},
// 普法服务列表
{
path: "/enterprise/lawServiceList",

54
zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/enforcement/enforcementRegistrationList.vue

@ -2,6 +2,18 @@
<div class="registration-list-page">
<SearchFilterBar ref="searchFilterBarRef" @search="onSearchFilter" />
<!-- Tab 切换:行政 / 非行政 -->
<van-tabs
v-model:active="activeTab"
class="reg-tabs"
sticky
swipeable
@change="onTabChange"
>
<van-tab title="行政" name="1"></van-tab>
<van-tab title="非行政" name="2"></van-tab>
</van-tabs>
<!-- 可滚动列表区域 -->
<div class="list-container">
<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
@ -66,6 +78,9 @@ const router = useRouter();
const searchFilterBarRef = ref(null);
// ========== Tab 切换:1=行政,2=非行政 ==========
const activeTab = ref('1');
// ========== 列表状态 ==========
const list = ref([]);
const loading = ref(false);
@ -116,6 +131,7 @@ const fetchList = () => {
const params = {
pageNum: pageNum.value,
pageSize: pageSize.value,
lawType: activeTab.value,
// enterpriseNumber: useCommon.enterpriseNumber,
};
if (searchText.value) {
@ -181,6 +197,15 @@ const onLoad = () => {
fetchList();
};
// ========== Tab 切换 ==========
const onTabChange = () => {
pageNum.value = 1;
list.value = [];
finished.value = false;
loading.value = true;
fetchList();
};
// ========== 下拉刷新 ==========
const onRefresh = () => {
pageNum.value = 1;
@ -230,6 +255,35 @@ const toEvaluate = (id, checkItem) => {
height: 100%;
background-color: #fbfdff;
.reg-tabs {
flex-shrink: 0;
:deep(.van-tabs__wrap) {
background: #fff;
border-radius: 12px 12px 0 0;
border-top-left-radius: 12px;
border-top-right-radius: 12px;
}
:deep(.van-tab) {
font-size: 15px;
color: #999;
width: 100%;
}
:deep(.van-tab--active) {
font-weight: 600;
color: #333;
}
:deep(.van-tabs__line) {
background: #2b7de9;
width: 40%;
height: 2px;
border-radius: 2px;
}
}
.list-container {
flex: 1;
overflow-y: auto;

368
zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/law/lawQuery.vue

@ -1,8 +1,8 @@
<template>
<div class="law-query-page">
<!-- 顶部导航栏 -->
<van-nav-bar title="法律查询" left-text="关闭" left-arrow @click-left="onClickLeft">
</van-nav-bar>
<!-- <van-nav-bar title="法律查询" left-arrow @click-left="onClickLeft">
</van-nav-bar> -->
<!-- 内容区域 -->
<div class="content-area">
@ -11,63 +11,46 @@
<van-search
v-model="searchKeyword"
placeholder="请输入关键词搜索"
show-action
shape="round"
@search="onSearch"
>
<template #action>
<van-button size="small" type="primary" @click="onSearch">搜索</van-button>
</template>
</van-search>
/>
</div>
<!-- 法律分类 -->
<div class="category-section">
<div class="section-title">法律分类</div>
<div class="category-grid">
<div
class="category-item"
v-for="(item, index) in categoryList"
<!-- 法律法规列表 -->
<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
<van-list
v-model:loading="loading"
:finished="finished"
finished-text="没有更多了"
@load="onLoad"
:offset="50"
>
<van-empty v-if="finished && lawList.length === 0" description="暂无数据" />
<div
class="law-item"
v-for="(item, index) in lawList"
:key="index"
@click="onCategoryClick(item)"
@click="onLawClick(item)"
>
<div class="category-icon" :class="item.iconBg">
<img :src="item.icon" alt="" />
<!-- 标题行 -->
<div class="item-title-row">
<div class="item-title">{{ item.title }}</div>
<span
class="status-tag"
:class="item.status === '有效' ? 'status--active' : 'status--pending'"
>{{ item.status }}</span>
</div>
<div class="category-name">{{ item.name }}</div>
</div>
</div>
</div>
<!-- 常用法律 -->
<div class="law-section">
<div class="section-title">常用法律</div>
<van-cell-group>
<van-cell
v-for="(law, index) in lawList"
:key="index"
:title="law.title"
:label="law.desc"
is-link
@click="onLawClick(law)"
/>
</van-cell-group>
</div>
<!-- 法律知识问答 -->
<div class="qa-section">
<div class="section-title">法律知识问答</div>
<div class="qa-list">
<div
class="qa-item"
v-for="(qa, index) in qaList"
:key="index"
@click="onQaClick(qa)"
>
<div class="qa-question">{{ qa.question }}</div>
<div class="qa-answer">{{ qa.answer }}</div>
<!-- 元信息行 -->
<div class="item-meta">
<span class="meta-text">公布日期: {{ item.publishDate }}</span>
<span class="meta-text">施行日期: {{ item.implementDate }}</span>
<span class="meta-text">{{ item.department }}</span>
</div>
</div>
</div>
</div>
</van-list>
</van-pull-refresh>
</div>
<!-- 底部导航栏 -->
@ -87,70 +70,82 @@ const router = useRouter();
// 搜索关键词
const searchKeyword = ref('');
// 法律分类列表
const categoryList = ref([
{ name: '宪法', icon: '', iconBg: 'icon-red' },
{ name: '民法', icon: '', iconBg: 'icon-blue' },
{ name: '刑法', icon: '', iconBg: 'icon-green' },
{ name: '行政法', icon: '', iconBg: 'icon-orange' },
{ name: '经济法', icon: '', iconBg: 'icon-purple' },
{ name: '劳动法', icon: '', iconBg: 'icon-yellow' },
{ name: '商法', icon: '', iconBg: 'icon-pink' },
{ name: '诉讼法', icon: '', iconBg: 'icon-cyan' },
]);
// 常用法律列表
const lawList = ref([
{ title: '中华人民共和国宪法', desc: '国家根本大法' },
{ title: '中华人民共和国民法典', desc: '社会生活的百科全书' },
{ title: '中华人民共和国刑法', desc: '规定犯罪与刑罚' },
{ title: '中华人民共和国行政法', desc: '规范行政行为' },
{ title: '中华人民共和国劳动法', desc: '保护劳动者权益' },
]);
// 法律知识问答列表
const qaList = ref([
{
question: '什么是行政处罚?',
answer: '行政处罚是指行政机关依法对违反行政管理秩序的公民、法人或者其他组织,以减损权益或者增加义务的方式予以惩戒的行为。'
},
{
question: '企业需要遵守哪些法律法规?',
answer: '企业需要遵守公司法、劳动法、税法、环境保护法、安全生产法等相关法律法规。'
},
{
question: '什么是行政复议?',
answer: '行政复议是指公民、法人或者其他组织认为具体行政行为侵犯其合法权益,向行政机关提出行政复议申请,行政机关受理并作出决定的活动。'
},
]);
// 列表状态
const lawList = ref([]);
const loading = ref(false);
const finished = ref(false);
const refreshing = ref(false);
const pageNum = ref(1);
const pageSize = ref(10);
// 模拟数据(与截图一致)
const mockData = [
{ title: '渔业行政处罚规定', status: '有效', publishDate: '2026-08-08', implementDate: '2026-08-18', department: '农业农村部' },
{ title: '渔业行政处罚规定', status: '尚未生效', publishDate: '2026-08-08', implementDate: '2026-08-18', department: '农业农村部' },
{ title: '渔业行政处罚规定', status: '有效', publishDate: '2026-08-08', implementDate: '2026-08-18', department: '农业农村部' },
{ title: '渔业行政处罚规定', status: '有效', publishDate: '2026-08-08', implementDate: '2026-08-18', department: '农业农村部' },
{ title: '渔业行政处罚规定', status: '有效', publishDate: '2026-08-08', implementDate: '2026-08-18', department: '农业农村部' },
{ title: '渔业行政处罚规定', status: '有效', publishDate: '2026-08-08', implementDate: '2026-08-18', department: '农业农村部' },
];
// 加载数据
const fetchList = () => {
// TODO: 替换为真实接口调用
// const params = { pageNum: pageNum.value, pageSize: pageSize.value, searchValue: searchKeyword.value };
// 模拟异步请求
setTimeout(() => {
if (refreshing.value) {
lawList.value = [];
refreshing.value = false;
}
lawList.value = [...lawList.value, ...mockData];
// 模拟只有一页数据
finished.value = true;
loading.value = false;
}, 300);
};
// 返回上一页
const onClickLeft = () => {
router.back();
// 触底加载
const onLoad = () => {
if (refreshing.value) return;
fetchList();
};
// 搜索
const onSearch = () => {
if (!searchKeyword.value.trim()) {
showToast('请输入搜索关键词');
return;
}
showToast(`搜索:${searchKeyword.value}`);
// 下拉刷新
const onRefresh = () => {
pageNum.value = 1;
lawList.value = [];
finished.value = false;
loading.value = true;
fetchList();
};
// 点击分类
const onCategoryClick = (item) => {
showToast(`选择分类:${item.name}`);
// 搜索
const onSearch = () => {
pageNum.value = 1;
lawList.value = [];
finished.value = false;
loading.value = true;
fetchList();
};
// 点击法律
const onLawClick = (law) => {
showToast(`查看:${law.title}`);
// 返回上一页
const onClickLeft = () => {
router.back();
};
// 点击问答
const onQaClick = (qa) => {
showToast('查看详情');
// 点击法律 — 跳转详情页
const onLawClick = (item) => {
router.push({
path: '/enterprise/lawDetail',
query: {
title: item.title,
publishDate: item.publishDate,
implementDate: item.implementDate,
department: item.department,
},
});
};
</script>
@ -165,8 +160,8 @@ const onQaClick = (qa) => {
.content-area {
flex: 1;
overflow-y: auto;
padding: 0.27rem;
padding-bottom: 1.5rem;
-webkit-overflow-scrolling: touch;
padding: 0 0.27rem;
}
/* ===== 搜索区域 ===== */
@ -176,137 +171,88 @@ const onQaClick = (qa) => {
padding: 0.2rem;
margin-bottom: 0.27rem;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
}
/* ===== 分类区域 ===== */
.category-section {
background: #fff;
border-radius: 0.2rem;
padding: 0.3rem;
margin-bottom: 0.27rem;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
}
.section-title {
font-size: 0.37rem;
font-weight: 600;
color: #333;
margin-bottom: 0.25rem;
padding-left: 0.1rem;
}
.category-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 0.2rem;
}
.category-item {
display: flex;
flex-direction: column;
align-items: center;
padding: 0.25rem 0;
}
.category-icon {
width: 1.2rem;
height: 1.2rem;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 0.15rem;
background: #f0f0f0;
}
.category-icon img {
width: 0.6rem;
height: 0.6rem;
}
.icon-red { background: #ffebee; }
.icon-blue { background: #e3f2fd; }
.icon-green { background: #e8f5e9; }
.icon-orange { background: #fff3e0; }
.icon-purple { background: #f3e5f5; }
.icon-yellow { background: #fffde7; }
.icon-pink { background: #fce4ec; }
.icon-cyan { background: #e0f7fa; }
:deep(.van-search) {
padding: 0;
}
.category-name {
font-size: 0.28rem;
color: #666;
text-align: center;
:deep(.van-search__content) {
background: #f2f3f5;
border-radius: 0.5rem;
}
}
/* ===== 法律列表 ===== */
.law-section {
/* ===== 列表项 ===== */
.law-item {
background: #fff;
border-radius: 0.2rem;
padding: 0.3rem;
padding: 0.35rem 0.3rem;
margin-bottom: 0.27rem;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
}
:deep(.van-cell) {
font-size: 0.32rem;
padding: 0.25rem 0;
border-bottom: 1px solid #f5f5f5;
&:last-child {
border-bottom: none;
}
.item-title-row {
display: flex;
align-items: center;
margin-bottom: 0.2rem;
}
:deep(.van-cell__title) {
font-size: 0.34rem;
color: #333;
.item-title {
flex: 1;
font-size: 0.4rem;
font-weight: bold;
color: #1a1a1a;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
:deep(.van-cell__label) {
font-size: 0.28rem;
color: #999;
/* ===== 状态标签 ===== */
.status-tag {
flex-shrink: 0;
font-size: 0.24rem;
color: #fff;
padding: 0.04rem 0.16rem;
border-radius: 0.06rem;
margin-left: 0.15rem;
white-space: nowrap;
}
/* ===== 问答区域 ===== */
.qa-section {
background: #fff;
border-radius: 0.2rem;
padding: 0.3rem;
margin-bottom: 0.27rem;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
.status--active {
background: #52c41a;
}
.qa-list {
.qa-item {
padding: 0.25rem 0;
border-bottom: 1px solid #f5f5f5;
&:last-child {
border-bottom: none;
}
}
.status--pending {
background: #faad14;
}
.qa-question {
font-size: 0.34rem;
color: #333;
font-weight: 500;
margin-bottom: 0.1rem;
/* ===== 元信息行 ===== */
.item-meta {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.2rem;
}
.qa-answer {
.meta-text {
font-size: 0.3rem;
color: #999;
line-height: 1.6;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
/* ===== 底部导航 ===== */
.footer_body {
flex-shrink: 0;
}
/* ===== 空状态 ===== */
:deep(.van-empty) {
padding-top: 1.5rem;
}
/* ===== 列表加载完成提示 ===== */
:deep(.van-list__finished-text) {
font-size: 0.28rem;
color: #c0c4cc;
padding: 0.2rem 0;
}
</style>

3
zdxt-web-client/zdxt-efcode-enterprise-app/vite-env/.env.enterprise-dev-wmy

@ -2,7 +2,8 @@
VITE_PORT = 12001
# VITE_PROXY_TARGET = 'http://139.186.148.21:8080'
# VITE_PROXY_TARGET = 'http://172.16.21.213:8080'
VITE_PROXY_TARGET = 'http://172.16.21.93:8080'
# VITE_PROXY_TARGET = 'http://172.16.21.93:8080'
VITE_PROXY_TARGET = 'http://172.16.20.72:8080'
VITE_BASE_URL = '/efcode20-ent-app/api'
VITE_CONTEXT_PATH = '/efcode20-ent-app/'
VITE_DEFAULT_LOGIN = '/enterprise/loginByPassword'

Loading…
Cancel
Save