Browse Source

bug修复

dev-V1.10.2-temp
wangmingyong 4 months ago
parent
commit
34a916d823
  1. 32
      zdxt-web-client/zdxt-efcode-enforcement-app/src/components/enforcement/register/EnforcementInfoSection.vue
  2. 2
      zdxt-web-client/zdxt-efcode-enforcement-app/src/components/enforcement/register/RegisterPopups.vue
  3. 68
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/enforcementRegister.vue
  4. 1
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/outOfCityEnterprise.vue
  5. 9
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enterpriseScanPreview.vue
  6. 8
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/home/enforcementHome.vue
  7. 8
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/messageCenter.vue
  8. 10
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/scanEntQRCode.vue
  9. 2
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/statistics/statisticsAnalysis.vue
  10. 64
      zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/enforcement/enforcementEvaluateDetail.vue

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

@ -64,11 +64,18 @@
</div>
<!-- 原因 -->
<van-field v-model="formData.reason" name="reason" label="原因" placeholder="请输入原因" readonly />
<van-field v-model="formData.reason" name="reason" label="原因" :placeholder="formData.reason || '请选择'" readonly
:clickable="canSelectReason" :is-link="canSelectReason" @click="canSelectReason && (showReasonPicker = true)" />
<!-- 原因选择弹窗 -->
<van-popup v-model:show="showReasonPicker" round position="bottom">
<van-picker :columns="reasonOptions" title="选择原因" @confirm="selectReason"
@cancel="showReasonPicker = false" />
</van-popup>
<!-- 执法时间(可选,近10天内) -->
<van-field v-model="formData.enforcementTime" name="enforcementTime" label="执法时间" placeholder="请选择执法时间"
readonly is-link clearable @click="openTimePicker" />
readonly :is-link="canEditTime" :clearable="canEditTime" @click="canEditTime && openTimePicker()" />
<van-popup v-model:show="showTimePicker" position="bottom" round>
<van-date-picker v-model="datePickerValue" title="选择执法时间" :min-date="minDate" :max-date="maxDate"
@confirm="onTimeConfirm" @cancel="showTimePicker = false" />
@ -173,6 +180,14 @@ const props = defineProps({
enterpriseNumber: {
type: String,
default: ''
},
canSelectReason: {
type: Boolean,
default: false
},
canEditTime: {
type: Boolean,
default: true
}
});
@ -198,6 +213,14 @@ let defaultPickerValue = [];
const unionList = ref([]);
const unionLoading = ref(false);
const showReasonPicker = ref(false);
const reasonOptions = [
{ text: '企业拒绝出示监管码', value: '企业拒绝出示监管码' },
{ text: '系统未能有效生成监管码', value: '系统未能有效生成监管码' },
{ text: '扫码未能显示企业信息', value: '扫码未能显示企业信息' },
{ text: '其他', value: '其他' }
];
onMounted(() => {
const range = getEnforcementTimeDateRange(7);
minDate.value = range.minDate;
@ -264,6 +287,11 @@ const onTimeConfirm = ({ selectedValues }) => {
showTimePicker.value = false;
};
const selectReason = ({ selectedOptions }) => {
props.formData.reason = selectedOptions[0]?.text || '';
showReasonPicker.value = false;
};
// 计算属性:是否有执法人员(转换为字符串用于表单验证)
const hasPerson = computed(() => {
return props.defaultPerson?.name || props.additionalPersons.some(p => p.name) ? '1' : '';

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

@ -225,7 +225,7 @@ const initPersonList = () => {
const loadPersonList = () => {
personLoading.value = true;
const selectedIds = props.selectedPersons.map(p => p.id).filter(Boolean);
const selectedIds = props.selectedPersons.map(p => p.userId).filter(Boolean);
const notUserId = selectedIds.length > 0 ? selectedIds.join(',') : undefined;
const params = {
pageNum: personPageNum.value,

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

@ -15,7 +15,8 @@
<!-- 执法信息组件(行政执法模式) -->
<EnforcementInfoSection v-if="!isNonEnforcement" :form-data="formData"
:default-person="enforcementPersons[0]" :additional-persons="additionalPersons"
:enterprise-number="enterpriseData.enterpriseNumber"
:enterprise-number="enterpriseData.enterpriseNumber" :can-select-reason="canSelectReason"
:can-edit-time="isSignMode"
@show-notice-picker="showPopups.notice = true" @open-person-picker="handleOpenPersonPicker"
@remove-person="handleRemovePerson" @show-category-picker="showPopups.category = true"
@show-task-source-picker="showPopups.taskSource = true" @open-basis-picker="handleOpenBasisPicker"
@ -64,6 +65,14 @@ const route = useRoute();
// 补录模式
const isSignMode = ref(false);
// 扫码登记模式
const isScanMode = ref(false);
// 是否可以选择原因(补录和扫码登记模式不可选择,手动搜索企业可选择)
const canSelectReason = computed(() => {
return !isSignMode.value && !isScanMode.value;
});
// 是否为非行政执法模式
const isNonEnforcement = ref(false);
@ -86,7 +95,7 @@ const formData = reactive({
lawEnforcementItemText: '',
enforcementBases: [''],
enforcementBasesIds: [''],
reason: '系统未能有效生成监管码',
reason: '',
enforcementTime: '',
jointEnforcement: '0',
isNewJoint: false,
@ -140,12 +149,12 @@ const selectedPersonsList = computed(() => {
const list = [];
// 添加默认执法人员
if (enforcementPersons.value[0]) {
list.push({ id: enforcementPersons.value[0].id, name: enforcementPersons.value[0].name });
list.push({ id: enforcementPersons.value[0].id, name: enforcementPersons.value[0].name, userId: enforcementPersons.value[0].userId });
}
// 添加额外执法人员
additionalPersons.value.forEach(p => {
if (p.id || p.name) {
list.push({ id: p.id, name: p.name, });
list.push({ id: p.id, name: p.name, userId: p.userId });
}
});
return list;
@ -231,6 +240,8 @@ const handleSelectEnterprise = (enterprise) => {
enterpriseName: enterprise.enterpriseName,
enterpriseNumber: enterprise.enterpriseNumber,
};
isScanMode.value = false;
sessionStorage.removeItem('enterpriseScanData');
showPopups.enterprise = false;
};
@ -592,10 +603,18 @@ onMounted(() => {
return; // 编辑模式下不执行后续初始化逻辑
}
// 默认从缓存获取企业信息
if (!isSignMode.value) {
// URL 参数可以覆盖缓存(用于直接跳转场景)
const urlEnterpriseName = route.query.enterpriseName;
const urlEnterpriseNumber = route.query.enterpriseNumber;
// 默认从缓存获取企业信息(仅在非补录模式且没有URL参数时)
if (!isSignMode.value && !urlEnterpriseName) {
const cached = sessionStorage.getItem('enterpriseScanData');
if (cached) {
// 如果是手动搜索模式,不设置 isScanMode
if (route.query.isManualSearch !== 'true') {
isScanMode.value = true;
}
try {
const data = JSON.parse(cached);
enterpriseData.value = data;
@ -605,14 +624,14 @@ onMounted(() => {
}
}
// URL 参数可以覆盖缓存(用于直接跳转场景)
const urlEnterpriseName = route.query.enterpriseName;
const urlEnterpriseNumber = route.query.enterpriseNumber;
// URL 参数覆盖缓存(视为手动搜索模式)
if (urlEnterpriseName) {
enterpriseData.value.enterpriseName = urlEnterpriseName;
isScanMode.value = false;
}
if (urlEnterpriseNumber) {
enterpriseData.value.enterpriseNumber = urlEnterpriseNumber;
isScanMode.value = false;
}
// 设置默认执法人员为当前登录人员
const useCommonStr = sessionStorage.getItem('useCommon');
@ -620,16 +639,35 @@ onMounted(() => {
const name = useCommon.userName || '';
const phonenumber = useCommon.phonenumber || '';
if (name || phonenumber) {
enforcementPersons.value = [{ name, phonenumber, id: phonenumber }];
enforcementPersons.value = [{ name, phonenumber, userId: useCommon.userId || '' }];
}
formData.enforcementUnit = useCommon.bureauUnitName || '';
// 获取保存的扫码原因,如果没有则使用默认值
const savedReason = sessionStorage.getItem('scanReason');
if (savedReason) {
formData.reason = savedReason;
// 根据不同模式设置原因
if (isSignMode.value) {
// 补录模式:默认值为"补录",不可选择
formData.reason = '补录';
} else if (isScanMode.value) {
// 扫码登记模式:原因为空,不可选择
formData.reason = '';
} else {
formData.reason = '系统未能有效生成监管码';
// 手动搜索企业:读取选择的原因作为初始值,可选择
const savedReason = sessionStorage.getItem('scanReason');
if (savedReason) {
formData.reason = savedReason;
}
}
// 扫码和手动搜索进入登记时执法时间默认为当前时间
if (!isSignMode.value) {
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
const hour = String(now.getHours()).padStart(2, '0');
const minute = String(now.getMinutes()).padStart(2, '0');
const second = String(now.getSeconds()).padStart(2, '0');
formData.enforcementTime = `${year}-${month}-${day} ${hour}:${minute}:${second}`;
}
// 加载执法类别字典

1
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/outOfCityEnterprise.vue

@ -243,6 +243,7 @@ const handleSave = () => {
isOutOfCity: true,
enterpriseName: formData.enterpriseName,
enterpriseNumber: formData.enterpriseNumber,
isManualSearch: 'true',
},
});
} else {

9
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enterpriseScanPreview.vue

@ -286,9 +286,16 @@ const toSign = () => {
// 缓存企业数据到 sessionStorage
const enterpriseScanData = enterpriseData.value || {};
sessionStorage.setItem('enterpriseScanData', JSON.stringify(enterpriseScanData));
// 从 URL 参数中获取手动搜索标识
const isManualSearch = route.query.isManualSearch === 'true';
router.push({
path: '/enforcement/enforcementRegister',
query: { type: isNonEnforcement.value ? 'non-enforcement' : undefined }
query: {
type: isNonEnforcement.value ? 'non-enforcement' : undefined,
isManualSearch: isManualSearch ? 'true' : undefined
}
});
};
</script>

8
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/home/enforcementHome.vue

@ -35,10 +35,10 @@
<div class="function-card enforcement-card" @click="toScanEntQRCode('enforcement')">
<div class="card-label-wrap">
<img src="@/assets/images/bg_label_xzzf.png" class="card-label" />
<div class="card-title">行政执法</div>
<div class="card-title">扫码入企</div>
</div>
<div class="card-content">
<div class="card-text">扫码入企</div>
<div class="card-text">行政执法</div>
<img src="@/assets/images/icon_xzrq.jpg" class="card-icon" />
</div>
@ -49,10 +49,10 @@
<div class="function-card other-card" @click="toScanEntQRCode('non-enforcement')">
<div class="card-label-wrap">
<img src="@/assets/images/bg_label_fxzzf.png" class="card-label" />
<div class="card-title">非行政执法</div>
<div class="card-title">扫码入企</div>
</div>
<div class="card-content">
<div class="card-text">扫码入企</div>
<div class="card-text">非行政执法</div>
<img src="@/assets/images/icon_fxzrq.jpg" class="card-icon" />
</div>
</div>

8
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/messageCenter.vue

@ -176,7 +176,7 @@ const initTodoList = () => {
},
{
id: 103,
title: '执法预约',
title: '联合执法预约',
desc: '',
time: '',
icon: 'check',
@ -260,8 +260,8 @@ const fetchTodoList = () => {
},
{
id: 103,
title: '执法预约',
desc: zfyyCount.value > 0 ? `您有${zfyyCount.value}条执法预约,请及时查看` : '暂无执法预约',
title: '联合执法预约',
desc: zfyyCount.value > 0 ? `您有${zfyyCount.value}条联合执法预约,请及时查看` : '暂无联合执法预约',
time: '2026-04-15 09:30',
icon: 'check',
iconBg: 'icon-red',
@ -346,7 +346,7 @@ const onTodoClick = (item) => {
router.push({
path: '/enforcement/enforcementTaskList',
});
} else if (item.title === '执法预约') {
} else if (item.title === '联合执法预约') {
sessionStorage.setItem('messageReturnTab', '1');
router.push({
path: '/enforcement/enforcementReserveList',

10
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/scanEntQRCode.vue

@ -8,7 +8,7 @@
<div class="box-qr-code" @click="toScanPageView">
</div>
</div>
<div class="scan-note">扫一扫企业二维码,即可查看企业信息</div>
<div class="scan-note">点击识别企业二维码</div>
<div class="nocode" @click="showSearchPopup()">手动登记,请输入关键字搜索企业 >></div>
</div>
@ -326,7 +326,7 @@ const isHttpLink = (url) => {
// ========== 手动搜索企业弹窗 ==========
const showSearchModal = ref(false);
const selectedReason = ref(4); // 默认选中"其他"
const selectedReason = ref(3); // 默认选中"其他"
const searchKeyword = ref('');
const enterpriseList = ref([]);
const loading = ref(false);
@ -337,7 +337,6 @@ const reasonOptions = [
'企业拒绝出示监管码',
'系统未能有效生成监管码',
'扫码未能显示企业信息',
'补录',
'其他'
];
@ -423,19 +422,20 @@ const selectEnterprise = (item) => {
path: '/enforcement/enterpriseScanPreview',
query: {
enterpriseNumber: item.enterpriseNumber,
type: enforceType
type: enforceType,
isManualSearch: 'true'
}
});
};
// 市外注册企业信息录入
const handleOutOfCityEnterprise = () => {
// 保存无法扫码原因到 sessionStorage
const selectedReasonText = reasonOptions[selectedReason.value];
sessionStorage.setItem('scanReason', selectedReasonText);
showSearchModal.value = false;
router.push({
path: '/enforcement/outOfCityEnterprise',
query: { isManualSearch: 'true' }
});
};

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

@ -27,7 +27,7 @@
</div>
<div class="period-btn" :class="dateType === 'year' ? 'active' : ''" @click="showYearPeriodPicker">年度
</div>
<div class="period-btn" :class="dateType === 'day' ? 'active' : ''" @click="showFilterPopup">筛选
<div class="period-btn" :class="dateType === 'day' ? 'active' : ''" @click="showFilterPopup">自定义
</div>
</div>
</div>

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

@ -88,10 +88,10 @@
<!-- 评价卡片(已评价:仅当后端返回 enterpriseEvaluateInfoVo 有数据时显示;待评价:始终显示) -->
<div class="evaluate-card" v-if="showEvaluateCard">
<div class="card-title">评价</div>
<div class="card-title">反馈</div>
<!-- 表情选择 -->
<div class="emoji-section">
<!-- <div class="emoji-section">
<div class="emoji-item" :class="{ active: evaluateForm.satisfactionLevel === 3, disabled: readonly }"
@click="!readonly && (evaluateForm.satisfactionLevel = 3)">
<img class="emoji-img" :src="evaluateForm.satisfactionLevel === 3 ? veryGoodImg : veryGoodDisImg"
@ -110,10 +110,10 @@
alt="不满意" />
<span class="emoji-label">不满意</span>
</div>
</div>
</div> -->
<!-- 星级评分 -->
<div class="rating-section">
<!-- <div class="rating-section">
<div class="rating-row">
<span class="rating-label">执法文明</span>
<van-rate v-model="evaluateForm.civility" :size="20" color="#ffd21e" void-icon="star"
@ -138,7 +138,7 @@
void-color="#eee" :readonly="readonly" />
<span class="rating-text">{{ getRatingText(evaluateForm.legality) }}</span>
</div>
</div>
</div> -->
<!-- 其他问题开关 -->
<div class="switch-section">
@ -149,16 +149,16 @@
<!-- 问题列表 -->
<div class="question-list" v-if="evaluateForm.hasOtherIssues">
<div class="question-item" v-for="(q, idx) in questionList" :key="idx">
<div class="question-item" v-for="(q, idx) in questionList" :key="idx" v-show="!q.isOther">
<div class="question-text">{{ idx + 1 }}、{{ q.text }}</div>
<div class="question-options">
<div class="option-btn" :class="{ active: q.answer === '是', disabled: readonly }"
@click="!readonly && (q.answer = '是')">
@click="!readonly && setAnswer(q, '是')">
<img :src="q.answer === '是' ? badUnselectImg : badSelectImg" alt="是" />
<span>是</span>
</div>
<div class="option-btn" :class="{ active: q.answer === '否', disabled: readonly }"
@click="!readonly && (q.answer = '否')">
@click="!readonly && setAnswer(q, '否')">
<img :src="q.answer === '否' ? goodUnselectImg : goodSelectImg" alt="否" />
<span>否</span>
</div>
@ -249,11 +249,12 @@ const evaluateForm = ref({
// ========== 问题列表(默认模板)==========
const questionList = ref([
{ text: '是否存在和执法,接受被执法企业的馈赠、报酬、福利等?', answer: '否' },
{ text: '是否存在要求被执法企业提供宴请、娱乐、旅游等活动?', answer: '否' },
{ text: '是否存在干扰企业正常生产经营、刻意要求企业法人到场的行为?', answer: '否' },
{ text: '是否存在任性处罚企业、乱查封、乱扣押、乱冻结、违规责令停产停业的行为?', answer: '否' },
{ text: '是否存在变相执法,以咨询、培训、考核等名义行执法之实?', answer: '否' },
{ text: '是否存在和执法,接受被执法企业的馈赠、报酬、福利等?', answer: '否', inputText: '', isOther: false },
{ text: '是否存在要求被执法企业提供宴请、娱乐、旅游等活动?', answer: '否', inputText: '', isOther: false },
{ text: '是否存在干扰企业正常生产经营、刻意要求企业法人到场的行为?', answer: '否', inputText: '', isOther: false },
{ text: '是否存在任性处罚企业、乱查封、乱扣押、乱冻结、违规责令停产停业的行为?', answer: '否', inputText: '', isOther: false },
{ text: '是否存在变相执法,以咨询、培训、考核等名义行执法之实?', answer: '否', inputText: '', isOther: false },
{ text: '其他', answer: '否', inputText: '', isOther: true },
]);
// ========== 字段映射工具:对后端多种字段名容错 ==========
@ -313,6 +314,7 @@ const fillEvaluateFormFromInfo = (info) => {
questionList.value = questionList.value.map((q, idx) => ({
...q,
answer: String(info['problem' + (idx + 1)]) === '1' ? '是' : '否',
inputText: q.isOther ? (info.otherProblemText || '') : '',
}));
};
@ -326,6 +328,14 @@ const getRatingText = (score) => {
return map[score] || '';
};
// ========== 设置问题答案 ==========
const setAnswer = (q, answer) => {
q.answer = answer;
if (q.isOther && answer === '否') {
q.inputText = '';
}
};
// ========== 返回上一页 ==========
const onClickLeft = () => {
router.back();
@ -339,6 +349,11 @@ const onViewCaseDetail = () => {
// ========== 提交评价 ==========
const onSubmit = () => {
if (readonly.value) return;
const otherQuestion = questionList.value.find(q => q.isOther);
if (otherQuestion && otherQuestion.answer === '是' && !otherQuestion.inputText.trim()) {
showToast('请输入其他问题的具体内容');
return;
}
showConfirmDialog({
title: '确认提交',
message: '确认提交本次评价吗?提交后将无法修改。',
@ -356,6 +371,9 @@ const onSubmit = () => {
questionList.value.forEach((q, idx) => {
const val = evaluateForm.value.hasOtherIssues ? (q.answer === '是' ? 1 : 0) : 0;
params['problem' + (idx + 1)] = val;
if (q.isOther) {
params.otherProblemText = q.inputText;
}
});
submitEvaluate(params, () => {
showToast('评价提交成功');
@ -420,7 +438,7 @@ const onSubmit = () => {
color: #333;
margin-bottom: 0.25rem;
padding-bottom: 0.15rem;
border-bottom: 1px solid #f0f0f0;
// border-bottom: 1px solid #f0f0f0;
display: flex;
align-items: baseline;
.union-tag {
@ -599,6 +617,7 @@ const onSubmit = () => {
padding: 0.25rem 0;
padding-right: 2.2rem;
border-bottom: 1px solid #f5f5f5;
min-height: 0.8rem;
&:last-child {
border-bottom: none;
@ -615,10 +634,10 @@ const onSubmit = () => {
.question-options {
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
top: 0.25rem;
display: flex;
gap: 0.2rem;
z-index: 10;
}
.option-btn {
@ -645,6 +664,19 @@ const onSubmit = () => {
}
}
}
.question-input-wrap {
margin-top: 0.15rem;
padding-left: 0.6rem;
:deep(.van-field__control) {
font-size: 0.3rem;
}
:deep(.van-field) {
margin: 0;
}
}
}
/* ===== 底部提交栏 ===== */

Loading…
Cancel
Save