|
|
|
@ -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, // 组id用于选中值(第一项的id) |
|
|
|
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) { |
|
|
|
|