Browse Source

代码提交

master
wangmingyong@163.com 4 weeks ago
parent
commit
84ef8393fd
  1. 2
      zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/index.js
  2. 141
      zdxt-web-client/zdxt-efcode-enforcement-app/src/components/enforcement/register/EnforcementInfoSection.vue
  3. 16
      zdxt-web-client/zdxt-efcode-enforcement-app/src/components/enforcement/register/NonEnforcementInfoSection.vue
  4. 49
      zdxt-web-client/zdxt-efcode-enforcement-app/src/components/enforcement/register/RegisterPopups.vue
  5. 2
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/components/EnforcementRecordList.vue
  6. 76
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/enforcementRegister.vue

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

@ -74,7 +74,7 @@ export const queryNonRegistrationDetail = (params, success, error) => _get(baseU
// 非行政执法提交
export const addNonRegistration = (params, success, error) => _post(baseUrl + "/nonRegistration/add", params, success, error);
export const queryEnforcementNoticeList = (params, success, error) => _post(baseUrl + "/enforcement/queryList", params, success, error);
export const queryEnforcementNoticeList = (params, success, error) => _get(baseUrl + "/cpNotice/myList", params, success, error);
// 执法预告列表
export const getLawNoticeList = (params, success, error) => _get(baseUrl + "/cpNotice/myList", params, success, error);

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

@ -8,7 +8,7 @@
<!-- 执法单位 -->
<van-field v-model="formData.enforcementUnit" name="enforcementUnit" label="执法单位" placeholder="请输入执法单位"
:rules="[{ required: true, message: '请填写执法单位' }]" required />
readonly :rules="[{ required: true, message: '请填写执法单位' }]" required />
<!-- 执法人员 -->
<div class="form-row required">
@ -27,7 +27,7 @@
</div>
<van-icon name="close" class="remove-icon" @click="$emit('removePerson', index)" />
</div>
<div class="person-add" v-if="additionalPersons.length < 2">
<div class="person-add">
<span class="person_item" @click="$emit('openPersonPicker', -1)">请选择</span>
<van-icon name="add-o" class="add-circle-icon" @click="$emit('addPerson')" />
</div>
@ -88,8 +88,8 @@
</template>
<!-- 执法时间可选近10天内 -->
<van-field v-model="formData.enforcementTime" name="enforcementTime" label="执法时间" placeholder="请选择执法时间" readonly
:is-link="canEditTime" :clearable="canEditTime" @click="canEditTime && openTimePicker()" />
<van-field :model-value="enforcementTimeDisplay" name="enforcementTime" label="执法时间" placeholder="请选择执法时间"
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" />
@ -108,21 +108,41 @@
</van-field>
<!-- 联合执法选择"是"时显示的内容 -->
<div v-if="formData.jointEnforcement === '1'" class="joint-enforcement-options">
<van-checkbox v-model="formData.isNewJoint">创建新的联合执法</van-checkbox>
<!-- 联合执法列表未选择创建新的联合执法时显示 -->
<div v-if="!formData.isNewJoint" class="union-list-container">
<!-- 联合执法列表 -->
<div class="union-list-container">
<van-loading v-if="unionLoading" size="20" />
<div v-else-if="unionList.length === 0" class="empty-tip">暂无联合执法数据</div>
<van-radio-group v-else v-model="formData.uniteCheck" direction="vertical" class="union-list"
@change="onUnionChange">
<van-radio v-for="item in unionList" :key="item.id" :name="String(item.id)" class="union-item">
<div v-else-if="groupedUnionList.length === 0" class="empty-tip">暂无联合执法数据</div>
<div v-else class="union-list">
<div v-for="group in groupedUnionList" :key="group.key" class="union-item"
:class="{ 'union-item-group': group.isGroup }" @click="selectUnion(group)">
<van-radio :model-value="formData.uniteCheck" :name="String(group.groupId)" class="union-radio" />
<div class="union-item-content">
<div class="union-item-title">{{ item.bureauDeptName || '联合执法' }}</div>
<div class="union-item-desc">{{ item.deptTexts || item.lawText || '' }}</div>
<template v-if="group.items.length === 1">
<!-- <div class="union-item-title">{{ group.items[0].bureauDeptName || '联合执法' }}</div> -->
<div v-if="group.items[0].deptTexts || group.items[0].lawText"
class="union-item-desc">{{ group.items[0].deptTexts || group.items[0].lawText }}</div>
</template>
<template v-else>
<!-- <div class="union-item-title">{{ group.items[0].bureauDeptName || '联合执法' }}</div> -->
<div v-for="(sub, idx) in group.items" :key="sub.id" class="union-item-desc">
{{ sub.deptTexts || sub.lawText || sub.bureauDeptName || '' }}
</div>
</template>
</div>
</van-radio>
</van-radio-group>
</div>
<!-- <div class="union-item" @click="selectUnion({ groupId: '0', unionNo: '' })">
<van-radio :model-value="formData.uniteCheck" name="0" class="union-radio" />
<div class="union-item-content">
<div class="union-item-title">创建新的联合执法</div>
</div>
</div> -->
</div>
<div class="union-item" @click="selectUnion({ groupId: '0', unionNo: '' })">
<van-radio :model-value="formData.uniteCheck" name="0" class="union-radio" />
<div class="union-item-content">
<div class="union-item-title">创建新的联合执法</div>
</div>
</div>
</div>
</div>
<!-- 隐藏字段用于验证联合执法 -->
@ -270,20 +290,48 @@ const fetchUnionList = () => {
});
};
const selectUnion = (item) => {
if (props.formData.uniteCheck === item.id) {
// hasUnion==1 unionNo
const groupedUnionList = computed(() => {
if (!unionList.value || unionList.value.length === 0) return [];
const groups = [];
const unionNoMap = new Map(); // unionNo -> group index
unionList.value.forEach((item) => {
const isGroupable = item.hasUnion == 1 && item.unionNo;
if (isGroupable) {
const existingIdx = unionNoMap.get(item.unionNo);
if (existingIdx !== undefined) {
groups[existingIdx].items.push(item);
} else {
unionNoMap.set(item.unionNo, groups.length);
groups.push({
key: `group-${item.unionNo}`,
groupId: item.id, // idid
unionNo: item.unionNo,
isGroup: true,
items: [item],
});
}
} else {
groups.push({
key: `single-${item.id}`,
groupId: item.id,
unionNo: item.unionNo || '',
isGroup: false,
items: [item],
});
}
});
return groups;
});
const selectUnion = (group) => {
if (props.formData.uniteCheck === group.groupId) {
props.formData.unionNo = '';
props.formData.uniteCheck = '';
} else {
props.formData.unionNo = item.unionNo || '';
props.formData.uniteCheck = item.id || '';
}
};
const onUnionChange = (id) => {
const item = unionList.value.find(item => String(item.id) === id);
if (item) {
props.formData.unionNo = item.unionNo || '';
props.formData.unionNo = group.unionNo || '';
props.formData.uniteCheck = group.groupId || '';
}
};
@ -296,11 +344,21 @@ const openTimePicker = () => {
const onTimeConfirm = ({ selectedValues }) => {
const value = buildEnforcementTimeFromPicker(selectedValues);
if (value) {
props.formData.enforcementTime = value;
// canEditTime 00:00:00
const datePart = value.split(' ')[0];
props.formData.enforcementTime = `${datePart} 00:00:00`;
}
showTimePicker.value = false;
};
//
const enforcementTimeDisplay = computed(() => {
if (!props.formData.enforcementTime) return '';
return props.canEditTime
? props.formData.enforcementTime.split(' ')[0]
: props.formData.enforcementTime;
});
const selectReason = ({ selectedOptions }) => {
props.formData.reason = selectedOptions[0]?.text || '';
const selectedValue = selectedOptions[0]?.value || '';
@ -531,12 +589,15 @@ const onAfterReadImage = (file) => {
.joint-enforcement-options {
padding: 0.32rem;
padding-bottom: 30px;
display: flex;
flex-direction: column;
.union-list-container {
margin-top: 0.24rem;
padding: 0.24rem;
background: #fbfdff;
border-radius: 0.1rem;
flex: 1;
.empty-tip {
text-align: center;
@ -557,16 +618,25 @@ const onAfterReadImage = (file) => {
padding: 0.2rem;
background: #fff;
border-radius: 0.08rem;
border: 1px solid #e8e8e8;
// border: 1px solid #e8e8e8;
transition: all 0.2s;
display: flex;
align-items: center;
gap: 0.2rem;
&:active {
background: #f5f5f5;
}
.union-radio {
flex-shrink: 0;
padding-top: 2px;
}
.union-item-content {
flex: 1;
min-width: 0;
height: 100%;
.union-item-title {
font-size: 14px;
color: #333;
@ -574,12 +644,19 @@ const onAfterReadImage = (file) => {
}
.union-item-desc {
font-size: 12px;
color: #999;
font-size: 14px;
color: #333;
margin-top: 0.08rem;
}
}
}
.union-item-group {
padding: 0.2rem;
display: flex;
align-items: center;
flex-wrap: wrap;
}
}
:deep(.van-field__value) {

16
zdxt-web-client/zdxt-efcode-enforcement-app/src/components/enforcement/register/NonEnforcementInfoSection.vue

@ -4,7 +4,7 @@
<!-- 入企单位 -->
<van-field v-model="formData.enforcementUnit" name="enforcementUnit" label="入企单位" placeholder="请输入入企单位"
:rules="[{ required: true, message: '请填写入企单位' }]" required />
readonly :rules="[{ required: true, message: '请填写入企单位' }]" required />
<!-- 入企人员 -->
<div class="form-row required">
@ -83,7 +83,7 @@
</template>
<!-- 入企时间可选近10天内仅补录模式可编辑 -->
<van-field v-model="formData.enforcementTime" name="enforcementTime" label="入企时间" placeholder="请选择入企时间"
<van-field :model-value="enforcementTimeDisplay" name="enforcementTime" label="入企时间" placeholder="请选择入企时间"
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"
@ -166,11 +166,21 @@ const openTimePicker = () => {
const onTimeConfirm = ({ selectedValues }) => {
const value = buildEnforcementTimeFromPicker(selectedValues);
if (value) {
props.formData.enforcementTime = value;
// canEditTime 00:00:00
const datePart = value.split(' ')[0];
props.formData.enforcementTime = `${datePart} 00:00:00`;
}
showTimePicker.value = false;
};
//
const enforcementTimeDisplay = computed(() => {
if (!props.formData.enforcementTime) return '';
return props.canEditTime
? props.formData.enforcementTime.split(' ')[0]
: props.formData.enforcementTime;
});
const props = defineProps({
formData: {
type: Object,

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

@ -18,8 +18,8 @@
@load="loadNotices" class="popup-content">
<div v-for="(notice, index) in noticeList" :key="index" class="notice-item">
<div class="notice-info">
<div class="notice-matter">执法事项{{ notice.checkItem }}</div>
<div class="notice-time">执法时间{{ notice.checkTime }}</div>
<div class="notice-matter">执法事项{{ notice.enforceContent }}</div>
<div class="notice-time">执法时间{{ formatTime(notice.enforceDate) }}{{ getTimeText(notice.enforceTime) }}</div>
</div>
<van-button class="link-btn" type="primary" @click="$emit('linkNotice', notice)">
一键关联
@ -119,6 +119,7 @@ import { ref, reactive, watch, computed, onMounted } from 'vue';
import { showToast } from 'vant';
import { queryEnforcementNoticeList, getBureauUnitUsers, queryAccordingList, queryDeptList } from '@/api/enforcement/index';
import { loadDict } from '@/util/dictUtil';
import { formatTime } from '@/util/util';
import EnterpriseSelector from './EnterpriseSelector.vue';
const { useCommon } = $globalStore;
@ -132,6 +133,11 @@ const props = defineProps({
selectedPersons: {
type: Array,
default: () => []
},
currentEnforcementUnit: {
type: String,
default: ''
}
});
@ -159,7 +165,10 @@ const loadCategoryDict = () => {
categoryOptions.value = columns;
});
};
const getTimeText = (time) => {
const map = { 1: '上午(9:00-12:00)', 2: '下午(14:00-18:00)', 3: '其他(18:00-21:00)' };
return map[time] || '';
};
//
const loadTaskSourceDict = () => {
loadDict('check_category', (columns) => {
@ -244,10 +253,13 @@ const loadPersonList = () => {
if (res.code === 200 || res.code === 0) {
let data = res.data || res.rows || [];
//
const selectedIds = props.selectedPersons.map(p => p.userId || p.id).filter(Boolean);
console.log(props.selectedPersons);
const selectedIds = props.selectedPersons.map(p => Number( p.userId || p.id)).filter(Boolean);
console.log(selectedIds);
if (selectedIds.length > 0) {
data = data.filter(item => {
const id = item.userId || '';
console.log(id,selectedIds.includes(id),'333');
return !selectedIds.includes(id);
});
}
@ -420,19 +432,25 @@ const loadAgencyList = () => {
queryDeptList(params, (res) => {
if (res.code === 200 || res.code === 0) {
const data = res.data || res.rows || [];
const rawData = res.data || res.rows || [];
const total = res.total || res.count || 0;
//
const filteredData = rawData.filter(item => {
const itemName = item.deptName || item.name || '';
return itemName != props.currentEnforcementUnit
});
const mapped = filteredData.map(item => ({
id: item.deptId || item.id || '',
name: item.deptName || item.name || ''
}));
if (agencyPageNum.value === 1) {
agencyList.value = data.map(item => ({
id: item.deptId || item.id || '',
name: item.deptName || item.name || ''
}));
agencyList.value = mapped;
} else {
agencyList.value = [...agencyList.value, ...data.map(item => ({
id: item.deptId || item.id || '',
name: item.deptName || item.name || ''
}))];
agencyList.value = [...agencyList.value, ...mapped];
}
if (total <= agencyPageSize.value * agencyPageNum.value) {
@ -498,7 +516,8 @@ const loadNotices = () => {
const params = {
pageNum: noticePage.value,
pageSize: noticePageSize.value,
enterpriseNumber: enterpriseNumber
enterpriseNumber: enterpriseNumber,
status: 1
};
queryEnforcementNoticeList(params, (res) => {
@ -515,7 +534,7 @@ const loadNotices = () => {
finished.value = true;
} else {
noticePage.value++;
}
}
} else {
console.error('获取预告列表失败:', res.msg);
finished.value = true;

2
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/components/EnforcementRecordList.vue

@ -19,7 +19,7 @@
<div class="record-card-header">
<div class="header-time">{{ cityRecords[0].createTime }}</div>
<div class="header-company">{{ enterpriseName }}</div>
<div class="header-count">被执法次数{{ listCount }}</div>
<!-- <div class="header-count">被执法次数{{ listCount }}</div> -->
</div>
<!-- 时间轴记录 -->
<div class="record-card-body" v-if="isExpanded">

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

@ -42,7 +42,8 @@
</van-form>
<!-- 弹窗组件 -->
<RegisterPopups :visible="showPopups" :selected-persons="selectedPersonsList" @close-popup="handleClosePopup"
<RegisterPopups :visible="showPopups" :selected-persons="selectedPersonsList"
:current-enforcement-unit="formData.enforcementUnit" @close-popup="handleClosePopup"
@select-enterprise="handleSelectEnterprise" @link-notice="handleLinkNotice"
@confirm-category="handleCategoryConfirm" @confirm-task-source="handleTaskSourceConfirm"
@select-person="handleSelectPerson" @select-basis="handleSelectBasis"
@ -56,7 +57,7 @@ import { ref, reactive, computed, onMounted } from 'vue';
import { useRouter, useRoute } from 'vue-router';
import { showConfirmDialog, showSuccessToast, showToast } from 'vant';
import { loadDict } from '@/util/dictUtil';
import { maskPhone } from '@/util/util';
import { maskPhone, parseEnforcer } from '@/util/util';
import { saveEnfRegistration, submitEnfRegistration, addNonRegistration, getEnforcementRegistrationDetailById, getSystemConfig } from '@/api/enforcement/index';
import EnterpriseInfoSection from '@/components/enforcement/register/EnterpriseInfoSection.vue';
import EnforcementInfoSection from '@/components/enforcement/register/EnforcementInfoSection.vue';
@ -75,7 +76,6 @@ const isSignMode = ref(false);
const isScanMode = ref(false);
//
const showReason = computed(() => {
console.log(isScanMode.value,'isScanMode.value');
return !isScanMode.value;
});
@ -219,11 +219,11 @@ const handleRemovePerson = (index) => {
// 3
const handleAddPerson = () => {
const total = enforcementPersons.value.length + additionalPersons.value.length;
if (total >= 2) {
showToast('最多选择3名执法人员');
return;
}
// const total = enforcementPersons.value.length + additionalPersons.value.length;
// if (total >= 2) {
// showToast('3');
// return;
// }
additionalPersons.value.push({});
}
@ -277,9 +277,53 @@ const handleOutOfCityEnterprise = () => {
//
const handleLinkNotice = (notice) => {
formData.relatedNotice = `${notice.checkItem}`;
formData.checkCss = notice.id;
formData.relatedNotice = `${notice.enforceContent}`;
formData.noticeId = notice.id;
formData.lawEnforcementItemText = notice.checkItem || '';
formData.lawEnforcementItem = notice.id || '';
formData.enforce = notice.enforceContent || '';
formData.enforceReason = notice.enforceRequirement || '';
formData.remark = notice.remark || '';
formData.enforcementTime = notice.enforceDate || '';
//
if (notice.bureauDeptName) {
formData.enforcementUnit = notice.bureauDeptName;
}
//
if (notice.enterpriseName) {
enterpriseData.value.enterpriseName = notice.enterpriseName;
}
if (notice.enterpriseNumber) {
enterpriseData.value.enterpriseNumber = notice.enterpriseNumber;
}
//
const userNames = notice.enforceUserNames ? notice.enforceUserNames.split(',').map(s => s.trim()).filter(Boolean) : [];
const userIds = notice.enforceUserIds ? notice.enforceUserIds.split(',').map(s => s.trim()).filter(Boolean) : [];
const userTels = notice.enforceUserTels ? notice.enforceUserTels.split(',').map(s => s.trim()).filter(Boolean) : [];
if (userNames.length > 0) {
enforcementPersons.value = [{
name: userNames[0],
userId: userIds[0] || '',
phonenumber: userTels[0] || ''
}];
additionalPersons.value = userNames.slice(1).map((name, i) => ({
name,
id: userIds[i + 1] || '',
phonenumber: userTels[i + 1] || ''
}));
}
//
if (notice.deptName) {
formData.lawText = notice.deptName;
}
if (notice.deptId) {
formData.lawId = notice.deptId;
}
showPopups.notice = false;
// showSuccessToast('');
};
@ -641,10 +685,12 @@ const fetchDetail = (id) => {
//
if (data.lawEnforcer) {
const enforcerTel = data.lawEnforcerTel || '';
enforcementPersons.value = [{
name: data.lawEnforcer,
id: data.lawEnforcerId || '',
phonenumber: data.lawEnforcerId || ''
name: parseEnforcer(data.lawEnforcer).name,
userId: data.lawEnforcerId || '',
phonenumber: enforcerTel,
lawCertificateNum: enforcerTel
}];
}
@ -652,7 +698,7 @@ const fetchDetail = (id) => {
additionalPersons.value = [];
const extraNames = data.lawEnforcerTwo || data.lawEnforcerOther || '';
const extraIds = data.lawEnforcerIdTwo || data.lawEnforcerIdOther || '';
const extraTels = data.lawEnforcerTelOther || '';
const extraTels = data.lawEnforcerTelTwo || '';
if (extraNames) {
const nameArr = extraNames.split(',').map(s => s.trim()).filter(Boolean);
const idArr = extraIds ? extraIds.split(',').map(s => s.trim()).filter(Boolean) : [];
@ -661,7 +707,7 @@ const fetchDetail = (id) => {
additionalPersons.value.push({
name: name,
id: idArr[i] || '',
phonenumber: telArr[i] || idArr[i] || ''
phonenumber: telArr[i] || ''
});
});
}

Loading…
Cancel
Save