|
|
@@ -6,6 +6,7 @@ import SegmentTabs from '@/components/SegmentTabs.vue'
|
|
|
import FormField from '@/components/FormField.vue'
|
|
|
import UploadPanel from '@/components/UploadPanel.vue'
|
|
|
import PhotoPreview from '@/components/PhotoPreview.vue'
|
|
|
+import DepartmentUserPicker, { type DepartmentUserOption } from '@/components/DepartmentUserPicker.vue'
|
|
|
import { hasUserPermission, useUserStore } from '@/stores/user'
|
|
|
import { eventStatusCode, eventStatusText, eventStatusTone, getEmergencyDict, getEmergencyEvent, getEmergencyHandlerOptions, getEmergencyVerifierOptions, auditEmergencyEvent, reportEmergencyEvent, resolveEmergencyAttachment, splitEmergencyAttachments, startEmergencyEvent, submitVerifyEmergencyEvent, trackEmergencyEvent, transferEmergencyEvent, uploadEmergencyFile, verifyEmergencyEvent, type EmergencyEvent, type EmergencyLog, type EmergencyOption, type UserOption } from '@/services/emergency'
|
|
|
|
|
|
@@ -17,6 +18,7 @@ const releaseReason = ref(''), releaseNote = ref(''), targets = ref<string[]>([]
|
|
|
const visitDate = ref(''), visitTime = ref('')
|
|
|
const categories = ref<EmergencyOption[]>([]), levels = ref<EmergencyOption[]>([]), releaseReasons = ref<EmergencyOption[]>([]), transferDepts = ref<EmergencyOption[]>([]), trends = ref<EmergencyOption[]>([]), yesNo = ref<EmergencyOption[]>([])
|
|
|
const handlerOptions = ref<UserOption[]>([]), verifierOptions = ref<UserOption[]>([])
|
|
|
+const userPickerOpen = ref(false), userPickerTarget = ref<'handler' | 'reviewer'>('handler')
|
|
|
const photoPreview = ref<InstanceType<typeof PhotoPreview>>()
|
|
|
const hasPerm = hasUserPermission
|
|
|
const currentUserId = computed(() => Number(userStore.profile?.userId || 0))
|
|
|
@@ -80,8 +82,19 @@ function openAction(value: Action) {
|
|
|
}
|
|
|
function toggleTarget(target: string) { targets.value = targets.value.includes(target) ? targets.value.filter(item => item !== target) : [...targets.value, target] }
|
|
|
function chooseTarget() { pick('选择部门', transferDepts.value, undefined, value => toggleTarget(transferDepts.value.find(item => item.value === value)?.label || value)) }
|
|
|
-function chooseHandler() { pick('选择处置人', handlerOptions.value.map(item => ({ value: item.userId, label: item.deptName ? `${item.nickName}(${item.deptName})` : item.nickName })), handlerId.value, value => { handlerId.value = Number(value) }) }
|
|
|
-function chooseReviewer() { pick('选择核验人', verifierOptions.value.map(item => ({ value: item.userId, label: item.deptName ? `${item.nickName}(${item.deptName})` : item.nickName })), reviewerId.value, value => { reviewerId.value = Number(value) }) }
|
|
|
+function chooseHandler() {
|
|
|
+ if (!handlerOptions.value.length) return uni.showToast({ title: '暂无符合条件的处置人', icon: 'none' })
|
|
|
+ userPickerTarget.value = 'handler'; userPickerOpen.value = true
|
|
|
+}
|
|
|
+function chooseReviewer() {
|
|
|
+ if (!verifierOptions.value.length) return uni.showToast({ title: '暂无符合条件的核验人', icon: 'none' })
|
|
|
+ userPickerTarget.value = 'reviewer'; userPickerOpen.value = true
|
|
|
+}
|
|
|
+function selectUser(person: DepartmentUserOption) {
|
|
|
+ if (userPickerTarget.value === 'handler') handlerId.value = person.userId
|
|
|
+ else reviewerId.value = person.userId
|
|
|
+}
|
|
|
+function userLabel(person?: UserOption) { return person ? (person.deptName ? `${person.nickName}(${person.deptName})` : person.nickName) : '' }
|
|
|
function chooseCategory() { pick('选择事件类别', categories.value, category.value, value => { category.value = value }) }
|
|
|
function chooseLevel() { pick('选择事件等级', levels.value, level.value, value => { level.value = value }) }
|
|
|
function chooseReleaseReason() { pick('选择解除原因', releaseReasons.value, releaseReason.value, value => { releaseReason.value = value }) }
|
|
|
@@ -160,8 +173,8 @@ async function submit() {
|
|
|
<view v-if="verifyResult === '0'" class="verification-fields">
|
|
|
<FormField :model-value="categories.find(item=>item.value===category)?.label || ''" label="事件类别" type="select" required placeholder="请选择事件类别" @select="chooseCategory" />
|
|
|
<FormField :model-value="levels.find(item=>item.value===level)?.label || ''" label="事件等级" type="select" required placeholder="请选择事件等级" @select="chooseLevel" />
|
|
|
- <FormField :model-value="handlerOptions.find(item=>item.userId===handlerId)?.nickName || ''" label="处置人" type="select" required placeholder="请选择处置人" @select="chooseHandler" />
|
|
|
- <FormField :model-value="verifierOptions.find(item=>item.userId===reviewerId)?.nickName || ''" label="核验人" type="select" required placeholder="请选择核验人" @select="chooseReviewer" />
|
|
|
+ <FormField :model-value="userLabel(handlerOptions.find(item=>item.userId===handlerId))" label="处置人" type="select" required placeholder="请选择处置人" @select="chooseHandler" />
|
|
|
+ <FormField :model-value="userLabel(verifierOptions.find(item=>item.userId===reviewerId))" label="核验人" type="select" required placeholder="请选择核验人" @select="chooseReviewer" />
|
|
|
</view>
|
|
|
<FormField v-model="description" label="核实意见" type="textarea" placeholder="请输入核实意见" />
|
|
|
</view>
|
|
|
@@ -170,6 +183,13 @@ async function submit() {
|
|
|
<template v-else-if="action === '核验'"><view class="form-row"><text class="field-label"><text class="required">*</text>核验结果</text><view class="choices"><button :class="{active:verifyResult==='0'}" @tap="verifyResult='0'">已解除</button><button :class="{active:verifyResult==='1'}" @tap="verifyResult='1'">未解除</button></view></view><FormField v-model="description" label="核验意见" type="textarea" required placeholder="请输入核验意见" /></template>
|
|
|
<template v-else><FormField v-model="description" label="备注" type="textarea" required placeholder="请输入备注" /><template v-if="action === '处置跟踪'"><FormField :model-value="trends.find(item=>item.value===trend)?.label || ''" label="态势评估" type="select" placeholder="请选择" @select="chooseTrend" /><FormField :model-value="yesNo.find(item=>item.value===upgrade)?.label || ''" label="是否需要升级" type="select" placeholder="请选择" @select="chooseUpgrade" /><view class="form-row"><text class="field-label">下次回访时间</text><view class="datetime-pickers"><picker mode="date" :value="visitDate" @change="visitDate=String($event.detail.value);updateVisitTime()"><view class="pick-button">{{ visitDate || '选择日期' }}</view></picker><picker mode="time" :value="visitTime" @change="visitTime=String($event.detail.value);updateVisitTime()"><view class="pick-button">{{ visitTime || '选择时间' }}</view></picker></view></view></template><view class="upload-field"><text class="field-label">附件</text><UploadPanel v-model="files" :max-count="5" /></view></template>
|
|
|
</scroll-view><view class="drawer-actions"><button v-if="action !== '核实'" class="cancel" :disabled="submitting" @tap="drawer=false">取消</button><button class="submit" :class="{ 'single-submit': action === '核实' }" :disabled="submitting" @tap="submit">{{ submitting ? '正在提交...' : '确认提交' }}</button></view></view></view>
|
|
|
+ <DepartmentUserPicker
|
|
|
+ v-model="userPickerOpen"
|
|
|
+ :title="userPickerTarget === 'handler' ? '选择处置人' : '选择核验人'"
|
|
|
+ :options="userPickerTarget === 'handler' ? handlerOptions : verifierOptions"
|
|
|
+ :selected-id="userPickerTarget === 'handler' ? handlerId : reviewerId"
|
|
|
+ @select="selectUser"
|
|
|
+ />
|
|
|
</view>
|
|
|
</template>
|
|
|
|