Browse Source

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

dev-V1.0.1
niujiyi 5 months ago
parent
commit
38d809db2f
  1. 16
      zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/index.js
  2. 4
      zdxt-web-client/zdxt-efcode-enforcement-app/src/components/enforcement/register/EnforcementInfoSection.vue
  3. 179
      zdxt-web-client/zdxt-efcode-enforcement-app/src/components/enforcement/register/RegisterPopups.vue
  4. 14
      zdxt-web-client/zdxt-efcode-enforcement-app/src/util/fileUpload.js
  5. 34
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/enforcementList.vue
  6. 18
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/enforcementRegister.vue
  7. 84
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/statistics/statisticsAnalysis.vue
  8. 6
      zdxt-web-client/zdxt-efcode-enforcement-app/vite.config.js

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

@ -26,9 +26,9 @@ export const submitEvaluate = (params, success, error) => _post(baseUrl + "/ente
// region 执法登记模块 // region 执法登记模块
export const queryEnforcementRegistrationPageList = (params, success, error) => _get(baseUrl + "/enforcement_registration/queryEnforcementRegistrationPageList", params, success, error); export const queryEnforcementRegistrationPageList = (params, success, error) => _get(baseUrl + "/enfRegistration/list", params, success, error);
export const getEnforcementRegistrationDetailById = (params, success, error) => _get(baseUrl + "/enforcement_registration/queryDetailById", params, success, error); export const getEnforcementRegistrationDetailById = (params, success, error) => _get(baseUrl + "/enfRegistration/enfLawCasedetail", params, success, error);
export const getEducationServicesList = (params, success, error) => _get(baseUrl + "/enforcementcode/educationServices/list", params, success, error); export const getEducationServicesList = (params, success, error) => _get(baseUrl + "/enforcementcode/educationServices/list", params, success, error);
@ -45,7 +45,7 @@ export const queryXzcfList = (enterpriseNumber, success, error) => _get(baseUrl
export const queryXzqzList = (enterpriseNumber, success, error) => _get(baseUrl + "/caseInfo/queryXzqzList", { c301010: enterpriseNumber }, success, error); export const queryXzqzList = (enterpriseNumber, success, error) => _get(baseUrl + "/caseInfo/queryXzqzList", { c301010: enterpriseNumber }, success, error);
// 执法依据列表 // 执法依据列表
export const queryAccordingList = (params, success, error) => _get(baseUrl + "/according//list", params, success, error); export const queryAccordingList = (params, success, error) => _get(baseUrl + "/according/list", params, success, error);
export const queryEnfRegistrationList = (params, success, error) => _get(baseUrl + "/enfRegistration/queryList", params, success, error); export const queryEnfRegistrationList = (params, success, error) => _get(baseUrl + "/enfRegistration/queryList", params, success, error);
@ -65,6 +65,9 @@ export const queryEnforcementNoticeList = (params, success, error) => _post(base
export const queryUsersByPage = (params, success, error) => _post(baseUrl + "/system/queryUsersByPage", params, success, error); export const queryUsersByPage = (params, success, error) => _post(baseUrl + "/system/queryUsersByPage", params, success, error);
// 获取部门列表
export const queryDeptList = (params, success, error) => _post("/app-enf/system/dept", params, success, error);
// endregion // endregion
// region 首页模块 // region 首页模块
@ -75,6 +78,13 @@ export const getCarouselBannerList = (params, success, error) => _get(baseUrl +
// endregion // endregion
// region 统计分析模块
// 综合分析数据
export const getComprehensiveAnalysis = (params, success, error) => _get(baseUrl + "/appComprehensiveAnalysis/whole", params, success, error);
// endregion
// region 公共模块 // region 公共模块
// 查询字典数据(公共) // 查询字典数据(公共)

4
zdxt-web-client/zdxt-efcode-enforcement-app/src/components/enforcement/register/EnforcementInfoSection.vue

@ -19,11 +19,11 @@
</div> </div>
<div v-for="(person, index) in additionalPersons" :key="index" class="person-item-add"> <div v-for="(person, index) in additionalPersons" :key="index" class="person-item-add">
<span @click="$emit('openPersonPicker', index)" :class="{ placeholder: !person.name }"> <span @click="$emit('openPersonPicker', index)" :class="{ placeholder: !person.name }">
{{ person.name || '请选择' }} {{ person.name || '请选择' }}{{ person.id || '' }}
</span> </span>
<van-icon name="close" class="remove-icon" @click="$emit('removePerson', index)" /> <van-icon name="close" class="remove-icon" @click="$emit('removePerson', index)" />
</div> </div>
<div class="person-add"> <div class="person-add" v-if="additionalPersons.length < 2">
<span @click="$emit('openPersonPicker', -1)">请选择</span> <span @click="$emit('openPersonPicker', -1)">请选择</span>
<van-icon name="add-o" class="add-circle-icon" @click="$emit('addPerson')" /> <van-icon name="add-o" class="add-circle-icon" @click="$emit('addPerson')" />
</div> </div>

179
zdxt-web-client/zdxt-efcode-enforcement-app/src/components/enforcement/register/RegisterPopups.vue

@ -30,7 +30,8 @@
<span class="popup-title">预告查询</span> <span class="popup-title">预告查询</span>
<van-icon name="cross" class="close-icon" @click="localNoticePopup = false" /> <van-icon name="cross" class="close-icon" @click="localNoticePopup = false" />
</div> </div>
<van-list v-model:loading="loading" :finished="finished" :immediate-check="false" finished-text="没有更多了" @load="loadNotices" class="popup-content"> <van-list v-model:loading="loading" :finished="finished" :immediate-check="false" finished-text="没有更多了"
@load="loadNotices" class="popup-content">
<div v-for="(notice, index) in noticeList" :key="index" class="notice-item"> <div v-for="(notice, index) in noticeList" :key="index" class="notice-item">
<div class="notice-info"> <div class="notice-info">
<div class="notice-matter">执法事项:{{ notice.checkItem }}</div> <div class="notice-matter">执法事项:{{ notice.checkItem }}</div>
@ -68,14 +69,14 @@
@clear="clearPersonSearch" /> @clear="clearPersonSearch" />
<van-button class="search-btn" type="primary" @click="handlePersonSearch">搜索</van-button> <van-button class="search-btn" type="primary" @click="handlePersonSearch">搜索</van-button>
</div> </div>
<div class="person-list"> <van-list v-model:loading="personLoading" :finished="personFinished" :immediate-check="false" finished-text="没有更多了" @load="loadPersonList" class="person-list">
<div v-for="(person, index) in personList" :key="index" class="person-list-item" <div v-for="(person, index) in personList" :key="index" class="person-list-item"
@click="$emit('selectPerson', person)"> @click="handleSelectPerson(person)">
<div class="person-name">{{ person.userName }}</div> <div class="person-name">{{ person.userName }}</div>
<div class="person-id">执法证件号:{{ person.isShowCardId }}</div> <div class="person-id">执法证件号:{{ person.phonenumber }}</div>
</div> </div>
<van-empty v-if="personList.length === 0" description="暂无数据" /> <van-empty v-if="personList.length === 0 && !personLoading" description="暂无数据" />
</div> </van-list>
</div> </div>
</van-popup> </van-popup>
@ -91,9 +92,10 @@
@clear="clearBasisSearch" /> @clear="clearBasisSearch" />
<van-button class="search-btn" type="primary" @click="handleBasisSearch">搜索</van-button> <van-button class="search-btn" type="primary" @click="handleBasisSearch">搜索</van-button>
</div> </div>
<van-list v-model:loading="basisLoading" :finished="basisFinished" :immediate-check="false" finished-text="没有更多了" @load="loadBasisList" class="enforcement-basis-list"> <van-list v-model:loading="basisLoading" :finished="basisFinished" :immediate-check="false"
finished-text="没有更多了" @load="loadBasisList" class="enforcement-basis-list">
<div v-for="(item, index) in enforcementBasisList" :key="index" class="basis-list-item" <div v-for="(item, index) in enforcementBasisList" :key="index" class="basis-list-item"
@click="$emit('selectBasis', item)"> @click="handleSelectBasis(item)">
<div class="basis-name">{{ item.name || item.lawName }}</div> <div class="basis-name">{{ item.name || item.lawName }}</div>
</div> </div>
<van-empty v-if="enforcementBasisList.length === 0 && !basisLoading" description="暂无数据" /> <van-empty v-if="enforcementBasisList.length === 0 && !basisLoading" description="暂无数据" />
@ -109,12 +111,13 @@
<van-icon name="cross" class="close-icon" @click="localEntrustedAgencyPopup = false" /> <van-icon name="cross" class="close-icon" @click="localEntrustedAgencyPopup = false" />
</div> </div>
<div class="search-bar"> <div class="search-bar">
<van-search v-model="agencySearchKeyword" placeholder="请输入单位名称" <van-search v-model="agencySearchKeyword" placeholder="请输入单位名称" @search="handleAgencySearch"
@search="handleAgencySearch" @clear="clearAgencySearch" /> @clear="clearAgencySearch" />
<van-button class="search-btn" type="primary" @click="handleAgencySearch">搜索</van-button> <van-button class="search-btn" type="primary" @click="handleAgencySearch">搜索</van-button>
</div> </div>
<div class="agency-list"> <div class="agency-list">
<div v-for="(item, index) in agencyList" :key="index" class="agency-list-item" @click="handleSelectAgency(item.name)"> <div v-for="(item, index) in agencyList" :key="index" class="agency-list-item"
@click="handleSelectAgency(item.name)">
<van-radio v-model="selectedAgency" :name="item.name" /> <van-radio v-model="selectedAgency" :name="item.name" />
<span class="agency-name">{{ item.name }}</span> <span class="agency-name">{{ item.name }}</span>
</div> </div>
@ -128,7 +131,7 @@
<script setup name="RegisterPopups"> <script setup name="RegisterPopups">
import { ref, reactive, watch, computed, onMounted } from 'vue'; import { ref, reactive, watch, computed, onMounted } from 'vue';
import { showToast } from 'vant'; import { showToast } from 'vant';
import { queryEnforcementNoticeList, queryUsersByPage, queryAccordingList } from '@/api/enforcement/index'; import { queryEnforcementNoticeList, queryUsersByPage, queryAccordingList, queryDeptList } from '@/api/enforcement/index';
import { loadDict } from '@/util/dictUtil'; import { loadDict } from '@/util/dictUtil';
const props = defineProps({ const props = defineProps({
@ -258,21 +261,21 @@ const personSearchKeyword = ref('');
const personList = ref([]); const personList = ref([]);
const personPageNum = ref(1); const personPageNum = ref(1);
const personPageSize = ref(10); const personPageSize = ref(10);
const personHasMore = ref(true);
const personLoading = ref(false); const personLoading = ref(false);
const personFinished = ref(false);
const initPersonList = () => { const initPersonList = () => {
personFinished.value = false;
personPageNum.value = 1; personPageNum.value = 1;
personHasMore.value = true;
personList.value = []; personList.value = [];
personLoading.value = false;
loadPersonList(); loadPersonList();
}; };
const loadPersonList = () => { const loadPersonList = () => {
if (personLoading.value || !personHasMore.value) return; if (personLoading.value || personFinished.value) return;
personLoading.value = true; personLoading.value = true;
// 获取已选人员的 userId,用逗号拼接 // 获取已选人员的 userId,用逗号拼接
const selectedIds = props.selectedPersons.map(p => p.id).filter(Boolean); const selectedIds = props.selectedPersons.map(p => p.id).filter(Boolean);
const notUserId = selectedIds.length > 0 ? selectedIds.join(',') : undefined; const notUserId = selectedIds.length > 0 ? selectedIds.join(',') : undefined;
@ -281,47 +284,56 @@ const loadPersonList = () => {
pageSize: personPageSize.value, pageSize: personPageSize.value,
notUserId notUserId
}; };
queryUsersByPage(params, (res) => { queryUsersByPage(params, (res) => {
if (res.code === 200 && res.rows) { if (res.code === 200 || res.code === 0) {
const data = res.rows; const data = res.data || res.rows || [];
if (Array.isArray(data)) { const total = res.total || res.count || 0;
// 转换数据格式,确保 id 和 name 字段存在
if (personPageNum.value === 1) { if (personPageNum.value === 1) {
personList.value = data; personList.value = data;
} else {
personList.value = [...personList.value, ...data];
}
// 判断是否还有更多数据
personHasMore.value = data.length >= personPageSize.value;
} else { } else {
personHasMore.value = false; personList.value = [...personList.value, ...data];
}
if (total <= personPageSize.value * personPageNum.value) {
personFinished.value = true;
} else {
personPageNum.value++;
} }
} else { } else {
personHasMore.value = false; personFinished.value = true;
} }
personLoading.value = false; personLoading.value = false;
}, () => { }, () => {
personLoading.value = false; personLoading.value = false;
personFinished.value = true;
}); });
}; };
const handlePersonSearch = () => { const handlePersonSearch = () => {
personFinished.value = false;
personPageNum.value = 1; personPageNum.value = 1;
personHasMore.value = true;
personList.value = []; personList.value = [];
loadPersonList(); loadPersonList();
}; };
const clearPersonSearch = () => { const clearPersonSearch = () => {
personSearchKeyword.value = ''; personSearchKeyword.value = '';
personFinished.value = false;
personPageNum.value = 1; personPageNum.value = 1;
personHasMore.value = true;
personList.value = []; personList.value = [];
loadPersonList(); loadPersonList();
}; };
const handleSelectPerson = (person) => {
// 转换字段名称,将接口返回的 userName 转换为 name,phonenumber 转换为 id
emit('selectPerson', {
name: person.userName || person.name || '',
id: person.phonenumber || person.id || ''
});
localPersonPopup.value = false;
};
watch(localPersonPopup, (val) => { watch(localPersonPopup, (val) => {
if (val) { if (val) {
personSearchKeyword.value = ''; personSearchKeyword.value = '';
@ -332,8 +344,8 @@ watch(localPersonPopup, (val) => {
// 监听已选人员变化,重新加载列表 // 监听已选人员变化,重新加载列表
watch(() => props.selectedPersons, () => { watch(() => props.selectedPersons, () => {
if (localPersonPopup.value) { if (localPersonPopup.value) {
personFinished.value = false;
personPageNum.value = 1; personPageNum.value = 1;
personHasMore.value = true;
personList.value = []; personList.value = [];
loadPersonList(); loadPersonList();
} }
@ -348,7 +360,7 @@ const basisPageNum = ref(1);
const basisPageSize = ref(10); const basisPageSize = ref(10);
const loadBasisList = () => { const loadBasisList = () => {
if (basisFinished.value) return; basisLoading.value = true;
const params = { const params = {
pageNum: basisPageNum.value, pageNum: basisPageNum.value,
pageSize: basisPageSize.value, pageSize: basisPageSize.value,
@ -358,13 +370,15 @@ const loadBasisList = () => {
queryAccordingList(params, (res) => { queryAccordingList(params, (res) => {
if (res.code === 200 || res.code === 0) { if (res.code === 200 || res.code === 0) {
const list = res.data || res.rows || []; const list = res.data || res.rows || [];
const total = res.total || res.count || 0;
if (basisPageNum.value === 1) { if (basisPageNum.value === 1) {
enforcementBasisList.value = list; enforcementBasisList.value = list;
} else { } else {
enforcementBasisList.value = [...enforcementBasisList.value, ...list]; enforcementBasisList.value = [...enforcementBasisList.value, ...list];
} }
basisFinished.value = list.length < basisPageSize.value; if (total <= basisPageSize.value * basisPageNum.value) {
if (!basisFinished.value) { basisFinished.value = true;
} else {
basisPageNum.value++; basisPageNum.value++;
} }
} else { } else {
@ -372,6 +386,7 @@ const loadBasisList = () => {
showToast(res.msg || '获取执法依据失败'); showToast(res.msg || '获取执法依据失败');
basisFinished.value = true; basisFinished.value = true;
} }
basisLoading.value = false; basisLoading.value = false;
}, (err) => { }, (err) => {
basisLoading.value = false; basisLoading.value = false;
@ -382,14 +397,22 @@ const loadBasisList = () => {
}; };
const initBasisList = async () => { const initBasisList = async () => {
basisLoading.value = false;
basisFinished.value = false; basisFinished.value = false;
basisPageNum.value = 1; basisPageNum.value = 1;
enforcementBasisList.value = []; enforcementBasisList.value = [];
basisLoading.value = false;
await nextTick(); await nextTick();
loadBasisList(); loadBasisList();
}; };
const handleSelectBasis = (basis) => {
// 转换字段名称,确保 name 字段存在
emit('selectBasis', {
name: basis.name || basis.lawName || ''
});
localBasisPopup.value = false;
};
const handleBasisSearch = () => { const handleBasisSearch = () => {
initBasisList(); initBasisList();
}; };
@ -412,31 +435,28 @@ const agencyList = ref([]);
const selectedAgency = ref(''); const selectedAgency = ref('');
const initAgencyList = () => { const initAgencyList = () => {
agencyList.value = [ const params = {
{ name: '深圳市人民检察院' }, deptName: agencySearchKeyword.value || undefined
{ name: '深圳市发展和改革委员会' }, };
{ name: '深圳市人力资源和社会保障局' },
{ name: '深圳市文化广电旅游体育局' }, queryDeptList(params, (res) => {
{ name: '深圳市宝安区发展和改革局' }, if (res.code === 200 || res.code === 0) {
{ name: '深圳市宝安区教育局' }, const data = res.data || res.rows || [];
{ name: '深圳市宝安区民政局' }, agencyList.value = data.map(item => ({
{ name: '深圳市宝安区西乡街道办事处' }, name: item.deptName || item.name || ''
{ name: '深圳市宝安区福永街道办事处' }, }));
{ name: '中共深圳市南山区委统一战线工作部' }, } else {
{ name: '深圳市龙岗区教育局' }, console.error('获取部门列表失败:', res.msg);
{ name: '深圳市南山区司法局' }, agencyList.value = [];
{ name: '深圳市南山区人力资源局' }, }
]; }, (err) => {
console.error('获取部门列表接口失败', err);
agencyList.value = [];
});
}; };
const handleAgencySearch = () => { const handleAgencySearch = () => {
initAgencyList(); initAgencyList();
if (agencySearchKeyword.value.trim()) {
const keyword = agencySearchKeyword.value.toLowerCase();
agencyList.value = agencyList.value.filter(item =>
item.name.toLowerCase().includes(keyword)
);
}
}; };
const clearAgencySearch = () => { const clearAgencySearch = () => {
@ -466,9 +486,7 @@ const loading = ref(false);
const finished = ref(false); const finished = ref(false);
const loadNotices = () => { const loadNotices = () => {
if (finished.value) return; loading.value = true;
// 从缓存中获取企业统一信用代码
let enterpriseNumber = ''; let enterpriseNumber = '';
try { try {
const cached = sessionStorage.getItem('enterpriseScanData'); const cached = sessionStorage.getItem('enterpriseScanData');
@ -489,20 +507,23 @@ const loadNotices = () => {
queryEnforcementNoticeList(params, (res) => { queryEnforcementNoticeList(params, (res) => {
if (res.code === 200) { if (res.code === 200) {
const data = res.rows || []; const data = res.rows || [];
const total = res.total || 0;
if (noticePage.value === 1) { if (noticePage.value === 1) {
noticeList.value = data; noticeList.value = data;
} else { } else {
noticeList.value = [...noticeList.value, ...data]; noticeList.value = [...noticeList.value, ...data];
} }
console.log('获取预告列表成功:', data);
finished.value = data.length < noticePageSize.value; if (total <= noticePage.value * noticePageSize.value) {
if (!finished.value) { finished.value = true;
} else {
noticePage.value++; noticePage.value++;
} }
} else { } else {
console.error('获取预告列表失败:', res.msg); console.error('获取预告列表失败:', res.msg);
finished.value = true; finished.value = true;
} }
loading.value = false;
}, (err) => { }, (err) => {
loading.value = false; loading.value = false;
finished.value = true; finished.value = true;
@ -510,14 +531,17 @@ const loadNotices = () => {
}); });
}; };
const initNoticesList = async () => {
finished.value = false;
noticePage.value = 1;
noticeList.value = [];
loading.value = false;
loadNotices();
};
watch(localNoticePopup, async (newVal) => { watch(localNoticePopup, async (newVal) => {
if (newVal) { if (newVal) {
noticePage.value = 1; initNoticesList();
noticeList.value = [];
loading.value = false;
finished.value = false;
await nextTick();
loadNotices();
} }
}); });
</script> </script>
@ -568,7 +592,7 @@ watch(localNoticePopup, async (newVal) => {
.person-search-popup, .person-search-popup,
.enforcement-basis-popup, .enforcement-basis-popup,
.entrusted-agency-popup { .entrusted-agency-popup {
height: 100%; height: 99%;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
} }
@ -580,6 +604,13 @@ watch(localNoticePopup, async (newVal) => {
flex: 1; flex: 1;
overflow-y: auto; overflow-y: auto;
padding: 0 0.3rem; padding: 0 0.3rem;
min-height: 0;
}
.enforcement-basis-list {
:deep(.van-list) {
height: 100%;
}
} }
@ -587,7 +618,7 @@ watch(localNoticePopup, async (newVal) => {
.enterprise-list-item, .enterprise-list-item,
.person-list-item, .person-list-item,
.basis-list-item { .basis-list-item {
padding:20px 20px 14px 14px; padding: 20px 20px 14px 14px;
border-bottom: 1px solid #f5f5f5; border-bottom: 1px solid #f5f5f5;
&:active { &:active {

14
zdxt-web-client/zdxt-efcode-enforcement-app/src/util/fileUpload.js

@ -10,18 +10,22 @@ const uploadFile = (files,callback) => {
files.status = "uploading"; files.status = "uploading";
files.message = "上传中..."; files.message = "上传中...";
files.status = "uploading"; files.status = "uploading";
// files.message = "上传中...";
// 需要使用 FormData 进行文件上传 // 需要使用 FormData 进行文件上传
let form = new FormData(); let form = new FormData();
form.append("file", files.file); form.append("file", files.file);
// 获取 token(从 localStorage 或 sessionStorage 中获取)
const token = $globalStore.useCommon.token;
console.log(token);
axios({ axios({
method: "post", method: "post",
url: baseUrl+ "/common/upload", url: baseUrl+ "/app-enf/common/file/upload",
data: form, data: form,
// headers: { headers: {
// 'Content-Type': 'multipart/form-data' 'clientid': 'f0535c2a32ab4d0496ab9a699b2a7d36',
// } 'Authorization': 'Bearer ' + token
}
}) })
.then((res) => { .then((res) => {
files.status = "done"; files.status = "done";

34
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/enforcementList.vue

@ -131,6 +131,7 @@ const getEnforcerDisplay = (item) => {
// ========== 加载数据 ========== // ========== 加载数据 ==========
const fetchList = () => { const fetchList = () => {
loading.value = true;
const params = { const params = {
pageNum: pageNum.value, pageNum: pageNum.value,
pageSize: pageSize.value, pageSize: pageSize.value,
@ -149,44 +150,27 @@ const fetchList = () => {
} }
queryEnforcementRegistrationPageList(params, (res) => { queryEnforcementRegistrationPageList(params, (res) => {
// 兼容数组 / 包裹格式 if (res.code === 200 || res.code === 0) {
let rows = []; const rows = res.data || res.rows || [];
let total = 0; const total = res.total || res.count || 0;
let ok = true;
if (Array.isArray(res)) {
rows = res;
total = res.length;
} else if (res && Array.isArray(res.rows)) {
rows = res.rows;
total = res.total || rows.length;
ok = res.code ? res.code === 200 : true;
} else if (res && Array.isArray(res.data)) {
rows = res.data;
total = res.total || rows.length;
ok = res.code ? res.code === 200 : true;
} else if (res && res.code && res.code !== 200) {
ok = false;
}
if (ok) {
if (refreshing.value) { if (refreshing.value) {
list.value = rows; list.value = rows;
refreshing.value = false; refreshing.value = false;
} else { } else {
list.value = [...list.value, ...rows]; list.value = [...list.value, ...rows];
} }
if (rows.length === 0 || list.value.length >= total) { if (total <= pageSize.value * pageNum.value) {
finished.value = true; finished.value = true;
} else { } else {
pageNum.value++; pageNum.value++;
} }
loading.value = false;
} else { } else {
loading.value = false;
finished.value = true;
showToast(res.msg || '加载失败'); showToast(res.msg || '加载失败');
finished.value = true;
} }
loading.value = false;
}, () => { }, () => {
loading.value = false; loading.value = false;
finished.value = true; finished.value = true;

18
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/enforcementRegister.vue

@ -146,7 +146,7 @@ const selectedPersonsList = computed(() => {
// 添加额外执法人员 // 添加额外执法人员
additionalPersons.value.forEach(p => { additionalPersons.value.forEach(p => {
if (p.id || p.name) { if (p.id || p.name) {
list.push({ id: p.id, name: p.name }); list.push({ id: p.id, name: p.name, });
} }
}); });
return list; return list;
@ -311,6 +311,14 @@ const buildSubmitPayload = () => {
.map(p => p.id) .map(p => p.id)
.join(','); .join(',');
// 任务来源:数字和中文名称
const lawEnforceCategory = categoryOptions.value.find(item => item.text === formData.category)?.value || '';
const lawEnforceCategoryText = formData.category || '';
// 执法类型:数字和中文名称
const checkCategory = taskSourceOptions.find(item => item.text === formData.taskSource)?.value || '';
const checkCategoryText = formData.taskSource || '';
return { return {
enterpriseName: enterpriseData.value.enterpriseName || '', enterpriseName: enterpriseData.value.enterpriseName || '',
enterpriseNumber: enterpriseData.value.enterpriseNumber || '', enterpriseNumber: enterpriseData.value.enterpriseNumber || '',
@ -319,7 +327,10 @@ const buildSubmitPayload = () => {
lawCertificateNumText: lawCertificateNumText, lawCertificateNumText: lawCertificateNumText,
lawEnforcerTwo: lawEnforcerTwo, lawEnforcerTwo: lawEnforcerTwo,
lawEnforcerIdTwo: lawEnforcerIdTwo, lawEnforcerIdTwo: lawEnforcerIdTwo,
lawEnforceCategory: formData.category || '', lawEnforceCategory: lawEnforceCategory,
lawEnforceCategoryText: lawEnforceCategoryText,
checkCategory: checkCategory,
checkCategoryText: checkCategoryText,
hasUnion: formData.jointEnforcement || 0, hasUnion: formData.jointEnforcement || 0,
hasAuto: formData.entrustedEnforcement || 0, hasAuto: formData.entrustedEnforcement || 0,
lawEnforcement: useCommon.deptName || '', lawEnforcement: useCommon.deptName || '',
@ -347,6 +358,7 @@ const handleSave = () => {
saveEnfRegistration(payload, (res) => { saveEnfRegistration(payload, (res) => {
if (res.code === 200 || res.code === 0) { if (res.code === 200 || res.code === 0) {
showSuccessToast('保存成功'); showSuccessToast('保存成功');
router.push('/enforcement/enforcementList');
} else { } else {
showToast(res.msg || '保存失败'); showToast(res.msg || '保存失败');
} }
@ -388,7 +400,7 @@ const onSubmit = () => {
submitEnfRegistration(payload, (res) => { submitEnfRegistration(payload, (res) => {
if (res.code === 200 || res.code === 0) { if (res.code === 200 || res.code === 0) {
showSuccessToast('提交成功'); showSuccessToast('提交成功');
router.back(); router.push('/enforcement/enforcementList');
} else { } else {
showToast(res.msg || '提交失败'); showToast(res.msg || '提交失败');
} }

84
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/statistics/statisticsAnalysis.vue

@ -121,6 +121,7 @@ import { ref, computed, shallowRef, watch } from 'vue';
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import { showToast } from 'vant'; import { showToast } from 'vant';
import 'vant/es/toast/style'; import 'vant/es/toast/style';
import { getComprehensiveAnalysis } from '@/api/enforcement/index';
const router = useRouter(); const router = useRouter();
const maxDate = ref(new Date()); const maxDate = ref(new Date());
@ -330,16 +331,72 @@ const yearColumns = computed(() => {
// ========== 数据加载与动画 ========== // ========== 数据加载与动画 ==========
const loadStatistics = () => { const loadStatistics = () => {
isLoading.value = true; isLoading.value = true;
setTimeout(() => {
statistics.value = { // 构建请求参数
totalCount: 11, const params = {
monthOverMonth: 266.67, userType: userType.value, // 'personal' 或 'company'
yearOverYear: 266.66, period: period.value, // 'month', 'quarter', 'year', 'other'
jointLaw: { noticeCount: 8, entrustedCount: 0, evaluateCount: 8, complaintCount: 5 }, };
// 根据周期类型添加具体参数
if (period.value === 'month') {
params.year = selectedMonth.value[0];
params.month = selectedMonth.value[1];
} else if (period.value === 'quarter') {
params.year = selectedQuarter.value[0];
params.quarter = selectedQuarter.value[1];
} else if (period.value === 'year') {
params.year = currentYear.value;
} else if (period.value === 'other' && selectedDateRange.value) {
const formatDate = (date) => {
const d = new Date(date);
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
}; };
startNumberAnimation(); params.startDate = formatDate(selectedDateRange.value[0]);
params.endDate = formatDate(selectedDateRange.value[1]);
}
getComprehensiveAnalysis(params, (res) => {
if (res.code === 200 || res.code === 0) {
const data = res.data || {};
statistics.value = {
totalCount: data.totalCount || 0,
monthOverMonth: data.monthOverMonth || 0,
yearOverYear: data.yearOverYear || 0,
jointLaw: {
noticeCount: data.jointLaw?.noticeCount || 0,
entrustedCount: data.jointLaw?.entrustedCount || 0,
evaluateCount: data.jointLaw?.evaluateCount || 0,
complaintCount: data.jointLaw?.complaintCount || 0,
},
};
// 更新执法类别数据
if (data.lawCategoryList && Array.isArray(data.lawCategoryList)) {
lawCategoryList.value = data.lawCategoryList;
}
// 更新企业类别数据
if (data.enterpriseCategoryList && Array.isArray(data.enterpriseCategoryList)) {
enterpriseCategoryList.value = data.enterpriseCategoryList;
}
// 更新投诉类别数据
if (data.complaintCategoryList && Array.isArray(data.complaintCategoryList)) {
complaintCategoryList.value = data.complaintCategoryList;
}
startNumberAnimation();
} else {
showToast(res.msg || '加载失败');
}
isLoading.value = false;
}, (err) => {
console.error('获取综合分析数据失败', err);
showToast('网络请求失败');
isLoading.value = false; isLoading.value = false;
}, 500); });
}; };
const startNumberAnimation = () => { const startNumberAnimation = () => {
@ -440,19 +497,19 @@ const onMonthConfirm = (value) => {
selectedMonth.value = value; selectedMonth.value = value;
showToast(`已选择${periodDisplayText.value}`); showToast(`已选择${periodDisplayText.value}`);
showMonthSelector.value = false; showMonthSelector.value = false;
loadStatistics();
}; };
const onQuarterConfirm = ({ selectedValues }) => { const onQuarterConfirm = ({ selectedValues }) => {
// van-picker 多列模式下,confirm 回调参数是对象,包含 selectedValues 数组
if (Array.isArray(selectedValues)) { if (Array.isArray(selectedValues)) {
selectedQuarter.value = selectedValues; selectedQuarter.value = selectedValues;
} }
showToast(`已选择${periodDisplayText.value}`); showToast(`已选择${periodDisplayText.value}`);
showQuarterSelector.value = false; showQuarterSelector.value = false;
loadStatistics();
}; };
const onYearConfirm = (value) => { const onYearConfirm = (value) => {
// van-picker 单列模式下confirm回调参数是对象,包含selectedValues数组
const selectedValues = value.selectedValues || value; const selectedValues = value.selectedValues || value;
if (typeof selectedValues === 'string') { if (typeof selectedValues === 'string') {
@ -464,6 +521,7 @@ const onYearConfirm = (value) => {
} }
showToast(`已选择${periodDisplayText.value}`); showToast(`已选择${periodDisplayText.value}`);
showYearSelector.value = false; showYearSelector.value = false;
loadStatistics();
}; };
const onConfirm = (dates) => { const onConfirm = (dates) => {
if (dates && dates.length === 2) { if (dates && dates.length === 2) {
@ -471,6 +529,7 @@ const onConfirm = (dates) => {
isFilterMode.value = true; isFilterMode.value = true;
} }
showFilterSelector.value = false; showFilterSelector.value = false;
loadStatistics();
}; };
// 筛选切换(使用通用函数) // 筛选切换(使用通用函数)
const toggleFilterType = (type) => toggleFilter(selectedFilterType, type); const toggleFilterType = (type) => toggleFilter(selectedFilterType, type);
@ -486,6 +545,11 @@ import { onMounted } from 'vue';
onMounted(() => { onMounted(() => {
loadStatistics(); loadStatistics();
}); });
// 监听用户类型和周期变化,重新加载数据
watch([userType, period], () => {
loadStatistics();
});
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>

6
zdxt-web-client/zdxt-efcode-enforcement-app/vite.config.js

@ -4,12 +4,12 @@ import { baseCfg, pluginCfg } from "./vite-config";
import basicSsl from '@vitejs/plugin-basic-ssl' import basicSsl from '@vitejs/plugin-basic-ssl'
// ,basicSsl() // ,basicSsl()
export default async ({ mode }) => { export default async ({ mode }) => {
const { VITE_BASE_URL, VITE_PORT } = loadEnv(mode, `${process.cwd()}/vite-env`); const viteEnv = loadEnv(mode, `${process.cwd()}/vite-env`);
return defineConfig({ return defineConfig({
...baseCfg({ VITE_BASE_URL, VITE_PORT }), ...baseCfg(viteEnv),
plugins: [ plugins: [
vue(), vue(),
...await pluginCfg({ VITE_BASE_URL })], ...await pluginCfg(viteEnv)],
define: {'process.env':{}} define: {'process.env':{}}
}); });
}; };

Loading…
Cancel
Save