Browse Source

feat(enterprise): 接入投诉建议/企业信息/普法服务接口并做响应格式兼容

dev-V1.0.1
wangmingyong 6 months ago
parent
commit
224a43581c
  1. 23
      zdxt-web-client/zdxt-efcode-enterprise-app/src/api/enterprise/index.js
  2. 118
      zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/enforcement/enforcementCaseInfo.vue
  3. 103
      zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/enforcement/enforcementRegistrationList.vue
  4. 58
      zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/enforcement/registrationDetail.vue
  5. 90
      zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/law/lawServiceList.vue
  6. 29
      zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/my/complaintDetail.vue
  7. 92
      zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/my/complaintList.vue
  8. 38
      zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/my/settings.vue
  9. 2
      zdxt-web-client/zdxt-efcode-enterprise-app/vite-config/index.js
  10. 3
      zdxt-web-client/zdxt-efcode-enterprise-app/vite-env/.env.enterprise-dev

23
zdxt-web-client/zdxt-efcode-enterprise-app/src/api/enterprise/index.js

@ -19,7 +19,28 @@ export const getEnterpriseMerchantAuthorization = (params, success, error) => _g
export const queryEnterpriseInformationQrCode = (enterpriseNumber, success, error) => _get(enterpriseAppBaseUrl+"/enterpriseInfo/getQrCode/"+enterpriseNumber,null,success,error)
//查询企业执法登记列表-企业端(含投诉标记、字典翻译、超时计算等)
export const getEnterpriseEnforcementRegistrationList = (params, success, error) => _get(enterpriseAppBaseUrl+"/enforcement_registration/getEnterpriseEnforcementRegistrationList",params,success,error)
export const getEnterpriseEnforcementRegistrationList = (params, success, error) => _get(enterpriseAppBaseUrl+"/lawEnforcementCase/list",params,success,error)
//执法登记列表
export const queryEnforcementRegistrationPageList = (params, success, error) => _get(enterpriseAppBaseUrl+"/enforcement_registration/queryEnforcementRegistrationPageList",params,success,error)
//执法信息详情
export const getLawDetail = (params, success, error) => _get(enterpriseAppBaseUrl+"/lawEnforcementCase/lawDetail",params,success,error)
//执法案件信息详情
export const getLawCaseDetail = (params, success, error) => _get(enterpriseAppBaseUrl+"/lawEnforcementCase/lawCasedetail",params,success,error)
//普法服务列表
export const getEducationServicesList = (params, success, error) => _get("/app/enterprise/todoitem/list",params,success,error)
//获取企业信息(我的)
export const getUserMine = (params, success, error) => _get(enterpriseAppBaseUrl+"/mine/userMine",params,success,error)
//投诉建议-查询列表
export const getComplaintList = (params, success, error) => _get(enterpriseAppBaseUrl+"/complaint/list",params,success,error)
//投诉建议-详情
export const getComplaintDetail = (params, success, error) => _get(enterpriseAppBaseUrl+"/complaint/detail",params,success,error)
//深i企登录-暂时没有环境调通
export const getSiqLoginAuth = (params, success, error) => _post(enterpriseAppBaseUrl +"/thirdLogin/siqLogin",params,success,error);

118
zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/enforcement/enforcementCaseInfo.vue

@ -1,12 +1,7 @@
<template>
<div class="case-info-page">
<!-- 顶部导航栏 -->
<van-nav-bar
title="执法案件信息"
left-text="关闭"
left-arrow
@click-left="onClickLeft"
>
<van-nav-bar title="执法案件信息" left-text="关闭" left-arrow @click-left="onClickLeft">
<template #right>
<van-icon name="filter-o" size="20" @click="onFilterClick" />
<van-icon name="search" size="20" style="margin-left: 12px;" @click="onSearchClick" />
@ -16,42 +11,32 @@
<!-- 可滚动列表区域 -->
<div class="list-container">
<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
<van-list
v-model:loading="loading"
:finished="finished"
finished-text="没有更多了"
@load="onLoad"
:offset="50"
>
<van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad"
:offset="50">
<!-- 空状态 -->
<van-empty v-if="finished && list.length === 0" description="暂无数据" />
<!-- 列表项 -->
<div
class="case-card"
v-for="item in list"
:key="item.id"
@click="toDetailView(item)"
>
<div class="case-card" v-for="item in list" :key="item.id" @click="toDetailView(item)">
<!-- 左上角标签 -->
<div class="card-tag" :class="getTagClass(item.lawEnforceCategory)">
{{ item.lawEnforceCategoryText || '-' }}
<div class="card-tag" :class="getTagClass(item.lawEnforcementType)">
{{ getCategoryText(item.lawEnforcementType) }}
</div>
<!-- 卡片内容 -->
<div class="card-content">
<div class="case-title">{{ item.lawEnforcementItemText || '-' }}</div>
<div class="case-title">{{ item.caseName || '-' }}</div>
<div class="case-row">
<span class="case-label">执法单位:</span>
<span class="case-value">{{ item.bureauDeptName || '-' }}</span>
<span class="case-value">{{ item.lawEnforcementUnit || '-' }}</span>
</div>
<div class="case-row">
<span class="case-label">执法类别:</span>
<span class="case-value">{{ item.lawEnforceCategoryText || '-' }}</span>
<span class="case-value">{{ getCategoryText(item.lawEnforcementType) }}</span>
</div>
<div class="case-row">
<span class="case-label">执法时间</span>
<span class="case-value case-time">{{ formatDateTime(item.enforcementTime) }}</span>
<span class="case-label">执法时间:</span>
<span class="case-value case-time">{{ formatDateTime(item.lawEnforcementTime) }}</span>
</div>
</div>
</div>
@ -81,9 +66,9 @@ const pageNum = ref(1);
const pageSize = ref(10);
// ========== 生成假数据 ==========
const generateMockData = () => {
return mockCaseList;
};
// const generateMockData = () => {
// return mockCaseList;
// };
// ========== 标签样式映射 ==========
const getTagClass = (category) => {
@ -92,7 +77,17 @@ const getTagClass = (category) => {
'2': 'tag-purple', // 行政处罚
'3': 'tag-orange', // 行政强制
};
return map[category] || 'tag-blue';
return map[String(category)] || 'tag-blue';
};
// ========== 执法类别文字映射 ==========
const getCategoryText = (category) => {
const map = {
'1': '行政检查',
'2': '行政处罚',
'4': '行政强制',
};
return map[String(category)] || '-';
};
// ========== 格式化日期时间 ==========
@ -113,19 +108,34 @@ const fetchList = () => {
const params = {
pageNum: pageNum.value,
pageSize: pageSize.value,
enterpriseNumber: useCommon.enterpriseNumber,
orderByColumn: "id",
isAsc: "asc"
};
getEnterpriseEnforcementRegistrationList(params, (res) => {
if (res.code === 200) {
let rows = res.rows || [];
const total = res.total || 0;
// 无真实数据时使用假数据展示样式效果
if (rows.length === 0 && pageNum.value === 1) {
rows = generateMockData();
// 兼容两种返回格式:
// 1. { code:200, rows:[], total:N }
// 2. 直接返回数组 [{...}]
// 3. { data: [{...}] }
let rows = [];
let total = 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) {
list.value = rows;
refreshing.value = false;
@ -133,36 +143,21 @@ const fetchList = () => {
list.value = [...list.value, ...rows];
}
// 假数据模式下加载两页后结束
if (rows.length === 0 || (pageNum.value >= 2 && rows[0]?.id <= 8)) {
if (rows.length === 0 || list.value.length >= total) {
finished.value = true;
} else {
pageNum.value++;
}
loading.value = false;
} else {
// 接口异常时使用假数据
const mockRows = generateMockData();
if (refreshing.value) {
list.value = mockRows;
refreshing.value = false;
} else {
list.value = [...list.value, ...mockRows];
}
finished.value = true;
loading.value = false;
showToast(res.msg || '加载失败,已展示模拟数据');
showToast(res.msg || '加载失败');
}
}, () => {
// 网络请求失败时使用假数据
const mockRows = generateMockData();
if (refreshing.value) {
list.value = mockRows;
refreshing.value = false;
} else {
list.value = [...list.value, ...mockRows];
}
finished.value = true;
loading.value = false;
showToast('网络请求失败,已展示模拟数据');
showToast('网络请求失败');
});
};
@ -170,16 +165,15 @@ const fetchList = () => {
const onLoad = () => {
if (refreshing.value) return;
fetchList();
pageNum.value++;
};
// ========== 下拉刷新 ==========
const onRefresh = () => {
pageNum.value = 1;
list.value = [];
finished.value = false;
loading.value = true;
fetchList();
pageNum.value++;
};
// ========== 返回上一页 ==========
@ -202,8 +196,8 @@ const toDetailView = (item) => {
router.push({
path: '/enterprise/registrationDetail',
query: {
id: item.id,
category: item.lawEnforceCategory
id: item.idNumber,
category: item.lawEnforcementType
}
});
};

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

@ -1,15 +1,8 @@
<template>
<div class="registration-list-page">
<!-- 搜索栏 -->
<van-search
v-model="searchText"
show-action
placeholder="请输入关键字查询"
clearable
clear-trigger="always"
@clear="onClear"
@search="onSearch"
>
<van-search v-model="searchText" show-action placeholder="请输入关键字查询" clearable clear-trigger="always"
@clear="onClear" @search="onSearch">
<template #action>
<div @click="onSearch">搜索</div>
</template>
@ -36,27 +29,15 @@
<!-- 月份选择器弹出层 -->
<van-popup v-model:show="showDatePicker" position="bottom">
<van-date-picker
title="选择月度"
v-model="currentDate"
:min-date="minDate"
:max-date="maxDate"
:columns-type="['year', 'month']"
@confirm="onDateConfirm"
@cancel="showDatePicker = false"
/>
<van-date-picker title="选择月度" v-model="currentDate" :min-date="minDate" :max-date="maxDate"
:columns-type="['year', 'month']" @confirm="onDateConfirm" @cancel="showDatePicker = false" />
</van-popup>
<!-- 可滚动列表区域 -->
<div class="list-container">
<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
<van-list
v-model:loading="loading"
:finished="finished"
finished-text="没有更多了"
@load="onLoad"
:offset="50"
>
<van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad"
:offset="50">
<!-- 空状态 -->
<van-empty v-if="finished && list.length === 0" description="暂无数据" />
@ -64,29 +45,28 @@
<div class="card-item" v-for="item in list" :key="item.id">
<div class="card-header">
<span class="card-time">执法时间:{{ formatDate(item.enforcementTime) }}</span>
<span class="joint-mark" v-if="item.hasUnion === 1">联</span>
<span class="card-status" v-if="item.isRealUnion === 1">联</span>
</div>
<div class="card-divider"></div>
<div class="card-body" @click="toDetailView(item.id)">
<div class="card-title">{{ item.lawEnforcementItemText || '-' }}</div>
<div class="card-row">
<span class="card-label">执法单位:</span>
<span>{{ item.bureauDeptName || '-' }}</span>
<span>{{ item.lawEnforcement || '-' }}</span>
</div>
<div class="card-row">
<span class="card-label">执法人员:</span>
<span class="enforcer-block">
<span>{{ item.lawEnforcerDisplay || item.lawEnforcer || '-' }}</span>
<span v-for="(name, idx) in (item.lawEnforcer2List || [])" :key="idx">{{ name }}</span>
<span>{{ getEnforcerDisplay(item) }}</span>
</span>
</div>
<div class="card-row">
<span class="card-label">执法类别:</span>
<span>{{ item.lawEnforceCategoryText || '-' }}</span>
<span class="card-label">企业名称:</span>
<span>{{ item.enterpriseName || '-' }}</span>
</div>
</div>
<!-- 评价按钮 -->
<div class="card-actions" v-if="item.outTimeDayNum != null && item.outTimeDayNum <= 5 && item.isEvaluate === 0">
<!-- 评价按钮:未评价时显示 -->
<div class="card-actions" v-if="item.hasEvaluate === 0">
<a @click.stop="toEvaluate(item.id, item.lawEnforcementItemText)">
<van-icon name="flower-o" /> 评价
</a>
@ -99,7 +79,7 @@
</template>
<script setup name="enforcementRegistrationList">
import { getEnterpriseEnforcementRegistrationList } from '@/api/enterprise';
import { queryEnforcementRegistrationPageList } from '@/api/enterprise';
import { showToast } from 'vant';
import 'vant/es/toast/style';
@ -130,13 +110,24 @@ const maxDate = new Date(2030, 11, 31);
// ========== 格式化日期 ==========
const formatDate = (dateStr) => {
if (!dateStr) return '-';
const d = new Date(dateStr);
const d = new Date(dateStr.replace ? dateStr.replace(/-/g, '/') : dateStr);
if (isNaN(d.getTime())) return dateStr;
const y = d.getFullYear();
const m = String(d.getMonth() + 1).padStart(2, '0');
const day = String(d.getDate()).padStart(2, '0');
return `${y}-${m}-${day}`;
};
// ========== 执法人员展示 ==========
const getEnforcerDisplay = (item) => {
if (item.lawEnforcerDisplay) return item.lawEnforcerDisplay;
const names = [];
if (item.lawEnforcer) names.push(item.lawEnforcer);
if (item.lawEnforcerTwo) names.push(item.lawEnforcerTwo);
if (Array.isArray(item.lawEnforcer2List)) names.push(...item.lawEnforcer2List);
return names.length ? names.join('、') : '-';
};
// ========== 加载数据 ==========
const fetchList = () => {
const params = {
@ -157,11 +148,27 @@ const fetchList = () => {
params.dateSearch = dateSearch.value;
}
getEnterpriseEnforcementRegistrationList(params, (res) => {
if (res.code === 200) {
const rows = res.rows || [];
const total = res.total || 0;
queryEnforcementRegistrationPageList(params, (res) => {
// 兼容数组 / 包裹格式
let rows = [];
let total = 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) {
list.value = rows;
refreshing.value = false;
@ -169,8 +176,10 @@ const fetchList = () => {
list.value = [...list.value, ...rows];
}
if (list.value.length >= total) {
if (rows.length === 0 || list.value.length >= total) {
finished.value = true;
} else {
pageNum.value++;
}
loading.value = false;
} else {
@ -190,16 +199,15 @@ const fetchList = () => {
const onLoad = () => {
if (refreshing.value) return;
fetchList();
pageNum.value++;
};
// ========== 下拉刷新 ==========
const onRefresh = () => {
pageNum.value = 1;
list.value = [];
finished.value = false;
loading.value = true;
fetchList();
pageNum.value++;
};
// ========== 搜索 ==========
@ -209,7 +217,6 @@ const onSearch = () => {
finished.value = false;
loading.value = true;
fetchList();
pageNum.value++;
};
// ========== 清空搜索 ==========
@ -305,6 +312,7 @@ const toEvaluate = (id, checkItem) => {
/* ===== 日期显示 ===== */
.search-date-display {
padding: 0.15rem 0.27rem 0;
.date-label {
color: #c1bfbf;
font-size: 0.4rem;
@ -324,10 +332,19 @@ const toEvaluate = (id, checkItem) => {
display: flex;
justify-content: space-between;
align-items: center;
.card-time {
color: #c1bfbf;
font-size: 0.32rem;
}
.card-status {
color: #fff;
font-size: 0.32rem;
background: #1367fe;
padding: 10px;
border-radius: 5px;
}
}
.joint-mark {

58
zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/enforcement/registrationDetail.vue

@ -148,25 +148,69 @@
</template>
<script setup name="registrationDetail">
import { mockCheckDetail, mockPenaltyDetail, mockForceDetail } from '@/mock/enforcement';
import { getLawDetail, getLawCaseDetail } from '@/api/enterprise';
import { showToast } from 'vant';
import 'vant/es/toast/style';
const router = useRouter();
const route = useRoute();
const category = route.query.category || '1';
const id = route.query.id;
const category = String(route.query.category || '1');
const pageTitle = computed(() => {
const map = { '1': '行政检查详情', '2': '行政处罚详情', '3': '行政强制详情' };
return map[category] || '执法详情';
});
const detailMap = {
'1': mockCheckDetail,
'2': mockPenaltyDetail,
'3': mockForceDetail
// 执法类别文字映射
const getCategoryText = (val) => {
const map = { '1': '行政检查', '2': '行政处罚', '3': '行政强制' };
return map[String(val)] || '-';
};
const detail = ref(detailMap[category] || mockCheckDetail);
// 详情数据(合并执法信息 + 案件信息)
const detail = ref({});
// 获取执法信息详情
const fetchLawDetail = () => {
getLawDetail({ id }, (res) => {
if (res.code === 200) {
const data = res.data || res.rows?.[0] || {};
detail.value = { ...detail.value, ...data };
if (!detail.value.lawEnforceCategoryText) {
detail.value.lawEnforceCategoryText = getCategoryText(data.lawEnforcementType || category);
}
} else {
showToast(res.msg || '执法信息加载失败');
}
}, () => {
showToast('执法信息网络异常');
});
};
// 获取执法案件信息详情
const fetchLawCaseDetail = () => {
getLawCaseDetail({ id }, (res) => {
if (res.code === 200) {
const data = res.data || res.rows?.[0] || {};
detail.value = { ...detail.value, ...data };
} else {
showToast(res.msg || '案件信息加载失败');
}
}, () => {
showToast('案件信息网络异常');
});
};
onMounted(() => {
if (!id) {
showToast('缺少详情id');
return;
}
fetchLawDetail();
fetchLawCaseDetail();
});
const onClickLeft = () => {
router.back();

90
zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/law/lawServiceList.vue

@ -38,15 +38,15 @@
<path d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.9 2 2 2zm6-6v-5c0-3.07-1.63-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.64 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2zm-2 1H8v-6c0-2.48 1.51-4.5 4-4.5s4 2.02 4 4.5v6z"/>
</svg>
</div>
<div class="item-title">{{ item.title }}</div>
<div class="item-title">{{ item.title || '-' }}</div>
</div>
<!-- 摘要 -->
<div class="item-summary">{{ item.summary }}</div>
<div class="item-summary">{{ item.summary || item.content || '' }}</div>
<!-- 底部信息 -->
<div class="item-footer">
<span class="item-time">{{ item.time }}</span>
<span class="item-time">{{ formatTime(item.createTime || item.time) }}</span>
<span class="item-action">
查看
<van-icon name="arrow" />
@ -60,6 +60,7 @@
</template>
<script setup name="lawServiceList">
import { getEducationServicesList } from '@/api/enterprise';
import { showToast } from 'vant';
import 'vant/es/toast/style';
@ -73,77 +74,70 @@ const refreshing = ref(false);
const pageNum = ref(1);
const pageSize = ref(10);
// ========== 生成假数据 ==========
const generateMockData = () => {
return [
{
id: 1,
title: '深圳市司法局联合检察院开展普法宣传活动',
summary: '为深入贯彻落实《中华人民共和国社区矫正法》(以下简称《社区矫正法》),进一步提升社区矫正工作规范化、法治化水平,深圳市司法局联合市检察院开展专题普法宣传活动。',
time: '2026-03-31 10:25:33',
},
{
id: 2,
title: '深圳市司法局联合检察院开展普法宣传活动',
summary: '为深入贯彻落实《中华人民共和国社区矫正法》(以下简称《社区矫正法》),进一步提升社区矫正工作规范化、法治化水平,深圳市司法局联合市检察院开展专题普法宣传活动。',
time: '2026-03-31 10:25:33',
},
{
id: 3,
title: '深圳市司法局联合检察院开展普法宣传活动',
summary: '为深入贯彻落实《中华人民共和国社区矫正法》(以下简称《社区矫正法》),进一步提升社区矫正工作规范化、法治化水平,深圳市司法局联合市检察院开展专题普法宣传活动。',
time: '2026-03-31 10:25:33',
},
{
id: 4,
title: '深圳市司法局联合检察院开展普法宣传活动',
summary: '为深入贯彻落实《中华人民共和国社区矫正法》(以下简称《社区矫正法》),进一步提升社区矫正工作规范化、法治化水平,深圳市司法局联合市检察院开展专题普法宣传活动。',
time: '2026-03-31 10:25:33',
},
{
id: 5,
title: '深圳市司法局联合检察院开展普法宣传活动',
summary: '为深入贯彻落实《中华人民共和国社区矫正法》(以下简称《社区矫正法》),进一步提升社区矫正工作规范化、法治化水平,深圳市司法局联合市检察院开展专题普法宣传活动。',
time: '2026-03-31 10:25:33',
},
{
id: 6,
title: '深圳市司法局联合检察院开展普法宣传活动',
summary: '为深入贯彻落实《中华人民共和国社区矫正法》(以下简称《社区矫正法》),进一步提升社区矫正工作规范化、法治化水平,深圳市司法局联合市检察院开展专题普法宣传活动。',
time: '2026-03-31 10:25:33',
},
];
// ========== 格式化时间 ==========
const formatTime = (val) => {
if (!val) return '';
const d = new Date(typeof val === 'string' ? val.replace(/-/g, '/') : val);
if (isNaN(d.getTime())) return val;
const y = d.getFullYear();
const m = String(d.getMonth() + 1).padStart(2, '0');
const day = String(d.getDate()).padStart(2, '0');
const h = String(d.getHours()).padStart(2, '0');
const mi = String(d.getMinutes()).padStart(2, '0');
const s = String(d.getSeconds()).padStart(2, '0');
return `${y}-${m}-${day} ${h}:${mi}:${s}`;
};
// ========== 加载数据 ==========
const fetchList = () => {
setTimeout(() => {
const rows = generateMockData();
const params = {
pageNum: pageNum.value,
pageSize: pageSize.value,
};
getEducationServicesList(params, (res) => {
if (res.code === 200) {
const rows = res.rows || res.data?.rows || [];
const total = res.total ?? res.data?.total ?? 0;
if (refreshing.value) {
list.value = rows;
refreshing.value = false;
} else {
list.value = [...list.value, ...rows];
}
if (rows.length === 0 || list.value.length >= total) {
finished.value = true;
} else {
pageNum.value++;
}
loading.value = false;
} else {
finished.value = true;
loading.value = false;
}, 500);
showToast(res.msg || '加载失败');
}
}, () => {
finished.value = true;
loading.value = false;
refreshing.value = false;
showToast('网络请求失败');
});
};
// ========== 触底加载 ==========
const onLoad = () => {
if (refreshing.value) return;
fetchList();
pageNum.value++;
};
// ========== 下拉刷新 ==========
const onRefresh = () => {
pageNum.value = 1;
list.value = [];
finished.value = false;
loading.value = true;
fetchList();
pageNum.value++;
};
// ========== 返回上一页 ==========

29
zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/my/complaintDetail.vue

@ -7,11 +7,11 @@
<div class="detail-card">
<div class="detail-row">
<span class="detail-label">投诉时间</span>
<span class="detail-value">{{ detail.time }}</span>
<span class="detail-value">{{ detail.enforcementTime }}</span>
</div>
<div class="detail-row">
<span class="detail-label">执法单位</span>
<span class="detail-value">{{ detail.bureauDept }}</span>
<span class="detail-value">{{ detail.complaintDepartments }}</span>
</div>
<div class="detail-row">
<span class="detail-label">投诉类型</span>
@ -27,7 +27,7 @@
<div class="detail-card">
<div class="detail-row">
<span class="detail-label">投诉内容</span>
<span class="detail-value">{{ detail.content }}</span>
<span class="detail-value">{{ detail.problemDescription }}</span>
</div>
</div>
@ -78,7 +78,7 @@
<script setup name="complaintDetail">
import { showToast } from 'vant';
import 'vant/es/toast/style';
import { mockComplaintDetailMap } from '@/mock/complaint';
import { getComplaintDetail } from '@/api/enterprise';
const router = useRouter();
const route = useRoute();
@ -102,14 +102,25 @@ onMounted(() => {
if (!id) {
showToast('缺少投诉ID');
return;
}else{
fetchList(id);
}
if (mockComplaintDetailMap[id]) {
detail.value = { ...mockComplaintDetailMap[id] };
} else {
showToast('未找到该投诉记录');
}
});
const fetchList = (id) => {
const params = {
id: id
};
getComplaintDetail(params, (res) => {
// const { rows} = res;
console.log(res);
if(res.code === 200){
detail.value = res.data; // 直接赋值数据
}
}, () => {
});
};
const onClickLeft = () => {
router.back();
};

92
zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/my/complaintList.vue

@ -12,10 +12,10 @@
>
<!-- 列表项 -->
<div class="complaint-card" v-for="item in list" :key="item.id" @click="toDetail(item)">
<div class="card-time">投诉时间:{{ item.time }}</div>
<div class="card-time">投诉时间:{{ formatTime(item.enforcementTime || item.time) }}</div>
<div class="card-row">
<span class="card-label">执法单位</span>
<span class="card-value">{{ item.bureauDept }}</span>
<span class="card-value">{{ item.complaintDepartments }}</span>
</div>
<div class="card-row">
<span class="card-label">投诉类型</span>
@ -23,7 +23,7 @@
</div>
<div class="card-row">
<span class="card-label">投诉内容</span>
<span class="card-value">{{ item.content }}</span>
<span class="card-value">{{ item.problemDescription }}</span>
</div>
</div>
@ -43,7 +43,9 @@
</template>
<script setup name="complaintList">
import { mockComplaintList } from '@/mock/complaint';
import { getComplaintList } from '@/api/enterprise';
import { showToast } from 'vant';
import 'vant/es/toast/style';
const router = useRouter();
@ -51,29 +53,89 @@ const list = ref([]);
const loading = ref(false);
const finished = ref(false);
const refreshing = ref(false);
const pageNum = ref(1);
const pageSize = ref(10);
// ========== 格式化时间 ==========
const formatTime = (val) => {
if (!val) return '-';
const d = new Date(typeof val === 'string' ? val.replace(/-/g, '/') : val);
if (isNaN(d.getTime())) return val;
const y = d.getFullYear();
const m = String(d.getMonth() + 1).padStart(2, '0');
const day = String(d.getDate()).padStart(2, '0');
const h = String(d.getHours()).padStart(2, '0');
const mi = String(d.getMinutes()).padStart(2, '0');
return `${y}-${m}-${day} ${h}:${mi}`;
};
const onLoad = () => {
setTimeout(() => {
// ========== 解析返回格式 ==========
const parseResp = (res) => {
let rows = [];
let total = 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;
}
return { rows, total, ok };
};
// ========== 加载数据 ==========
const fetchList = () => {
const params = {
pageNum: pageNum.value,
pageSize: pageSize.value,
};
getComplaintList(params, (res) => {
const { rows, total, ok } = parseResp(res);
if (ok) {
if (refreshing.value) {
list.value = [];
list.value = rows;
refreshing.value = false;
} else {
list.value = [...list.value, ...rows];
}
if (rows.length === 0 || list.value.length >= total) {
finished.value = true;
} else {
pageNum.value++;
}
const start = list.value.length;
const end = start + 3;
const pageData = mockComplaintList.slice(start, end);
list.value.push(...pageData);
loading.value = false;
if (list.value.length >= mockComplaintList.length) {
} else {
finished.value = true;
loading.value = false;
showToast(res?.msg || '加载失败');
}
}, 500);
}, () => {
finished.value = true;
loading.value = false;
refreshing.value = false;
showToast('网络请求失败');
});
};
const onLoad = () => {
if (refreshing.value) return;
fetchList();
};
const onRefresh = () => {
pageNum.value = 1;
list.value = [];
finished.value = false;
loading.value = true;
onLoad();
fetchList();
};
const onClickLeft = () => {

38
zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/my/settings.vue

@ -13,18 +13,18 @@
<div class="settings-item" @click="onItemClick('头像')">
<span class="item-text">头像</span>
<div class="item-right">
<img class="avatar-img" src="https://img.yzcdn.cn/vant/cat.jpeg" alt="头像" />
<img class="avatar-img" :src="avatar || defaultAvatar" alt="头像" />
<van-icon name="arrow" class="item-arrow" />
</div>
</div>
<div class="settings-item">
<span class="item-text">公司名称</span>
<span class="item-value">深圳市新粤云技术有限公司</span>
<span class="item-value">{{ companyName || '-' }}</span>
</div>
<div class="settings-item" @click="onEditPhone">
<span class="item-text">联系电话</span>
<div class="item-right">
<span class="item-value">{{ phone }}</span>
<span class="item-value">{{ phone || '-' }}</span>
<van-icon name="arrow" class="item-arrow" />
</div>
</div>
@ -50,17 +50,43 @@
</template>
<script setup name="settings">
import { ref } from 'vue';
import { ref, onMounted } from 'vue';
import { showToast } from 'vant';
import 'vant/es/toast/style';
import { getUserMine } from '@/api/enterprise';
const router = useRouter();
// ========== 联系电话 ==========
const phone = ref('18358047213');
// ========== 企业信息 ==========
const companyName = ref('');
const phone = ref('');
const avatar = ref('');
const defaultAvatar = 'https://img.yzcdn.cn/vant/cat.jpeg';
// ========== 电话编辑弹窗 ==========
const showPhoneDialog = ref(false);
const editPhone = ref('');
// ========== 获取企业信息 ==========
const fetchUserMine = () => {
getUserMine({}, (res) => {
if (res) {
companyName.value = res.deptName || '';
phone.value = res.phonenumber || '';
avatar.value = res.avatar || '';
} else {
showToast(res.msg || '企业信息加载失败');
}
}, () => {
showToast('企业信息网络异常');
});
};
onMounted(() => {
fetchUserMine();
});
// ========== 返回上一页 ==========
const onClickLeft = () => {
router.back();

2
zdxt-web-client/zdxt-efcode-enterprise-app/vite-config/index.js

@ -43,7 +43,7 @@ const baseCfg = (viteEnv = {}) => {
cors: true,
proxy: {
'/api': {
target: 'http://localhost:17000',
target: 'http://139.186.148.21:8080',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
}

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

@ -1,5 +1,6 @@
# 企业端开发环境
VITE_PORT = 12001
VITE_BASE_URL = '/api/ent-ep'
# VITE_BASE_URL = '/api/ent-ep'
VITE_BASE_URL = '/api'
VITE_DEFAULT_LOGIN = '/enterprise/login'
VITE_APP_ENV = 'dev'

Loading…
Cancel
Save