HandleWarningDialog.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. <template>
  2. <el-dialog
  3. v-model="visible"
  4. title="处理告警"
  5. width="520px"
  6. append-to-body
  7. center
  8. class="large-screen-dialog"
  9. >
  10. <div class="handle-warning-content">
  11. <div class="elderly-info-section" v-if="!isReportOnly">
  12. <p><strong>长者姓名:</strong>{{ currentElderly?.name || '' }}</p>
  13. </div>
  14. <el-form ref="handleWarningFormRef" :model="form" label-width="120px">
  15. <!-- 处理方式:当为 reportOnly 模式时只显示固定文案 -->
  16. <el-form-item
  17. v-if="!isReportOnly"
  18. label="处理方式"
  19. :rules="[{ required: true, message: '请选择处理方式', trigger: 'change' }]"
  20. >
  21. <el-radio-group v-model="form.handleType" size="large">
  22. <el-radio label="phone">电话回访</el-radio>
  23. <el-radio label="report">上报告警情况</el-radio>
  24. </el-radio-group>
  25. </el-form-item>
  26. <el-form-item v-else label="处理方式">
  27. <div class="fixed-mode">上报告警情况</div>
  28. </el-form-item>
  29. <!-- 电话回访时,展示电话信息 -->
  30. <el-form-item v-if="form.handleType === 'phone' && !isReportOnly" label="联系电话">
  31. <div class="phone-block">
  32. <div class="phone-line">
  33. <span class="label">长者电话:</span>
  34. <a
  35. v-if="currentElderly?.elderPhone"
  36. :href="`tel:${currentElderly?.elderPhone}`"
  37. class="tel-link"
  38. >{{ currentElderly?.elderPhone }}</a
  39. >
  40. <span v-else class="muted">暂无</span>
  41. </div>
  42. <div class="phone-line">
  43. <span class="label">家属电话:</span>
  44. <a
  45. v-if="currentElderly?.relativePhone"
  46. :href="`tel:${currentElderly?.relativePhone}`"
  47. class="tel-link"
  48. >{{ currentElderly?.relativePhone }}</a
  49. >
  50. <span v-else class="muted">暂无</span>
  51. </div>
  52. <div class="tip">请拨打回访并在必要时补充上报信息。</div>
  53. </div>
  54. </el-form-item>
  55. <!-- 上报信息 - 电话回访和上报模式都显示 -->
  56. <el-form-item
  57. label="上报信息"
  58. prop="message"
  59. :rules="[{ required: form.handleType === 'report' || isReportOnly, message: '请输入上报信息', trigger: 'blur' }]"
  60. >
  61. <el-input
  62. v-model="form.message"
  63. type="textarea"
  64. :rows="4"
  65. :placeholder="form.handleType === 'phone' ? '选填:补充上报信息(如有需要)' : '请输入上报信息'"
  66. maxlength="200"
  67. show-word-limit
  68. />
  69. </el-form-item>
  70. </el-form>
  71. </div>
  72. <template #footer>
  73. <el-button @click="closeDialog" size="large">取消</el-button>
  74. <el-button type="primary" @click="submit" size="large">确认处理</el-button>
  75. </template>
  76. </el-dialog>
  77. </template>
  78. <script lang="ts" setup>
  79. import { ref, reactive, computed, nextTick, watch } from 'vue'
  80. interface Elderly {
  81. id: number
  82. name: string
  83. elderPhone?: string
  84. relativePhone?: string
  85. }
  86. interface Props {
  87. visible: boolean
  88. currentElderly: Elderly | null
  89. mode?: 'default' | 'reportOnly'
  90. }
  91. const props = defineProps<Props>()
  92. const emit = defineEmits<{
  93. 'update:visible': [value: boolean]
  94. submit: [data: any]
  95. }>()
  96. const handleWarningFormRef = ref()
  97. const form = reactive({
  98. handleType: 'phone' as 'phone' | 'report',
  99. // eventType: '',
  100. message: ''
  101. })
  102. const visible = computed({
  103. get: () => props.visible,
  104. set: (value) => emit('update:visible', value)
  105. })
  106. const isReportOnly = computed(() => props.mode === 'reportOnly')
  107. // 每次打开对话框时重置表单,并根据模式设置默认处理方式
  108. watch(
  109. () => props.visible,
  110. (val) => {
  111. if (val) {
  112. // form.eventType = ''
  113. form.message = '已沟通,已解决'
  114. form.handleType = isReportOnly.value ? 'report' : 'phone'
  115. nextTick(() => {
  116. if (handleWarningFormRef.value) {
  117. handleWarningFormRef.value.clearValidate()
  118. }
  119. })
  120. }
  121. }
  122. )
  123. const closeDialog = () => {
  124. visible.value = false
  125. }
  126. const submit = async () => {
  127. if (!handleWarningFormRef.value) return
  128. try {
  129. // 验证表单
  130. const valid = await handleWarningFormRef.value.validate()
  131. if (!valid) return
  132. emit('submit', {
  133. elderId: props.currentElderly?.id,
  134. handleType: isReportOnly.value ? 'report' : form.handleType,
  135. message: form.message
  136. })
  137. closeDialog()
  138. } catch (error) {
  139. console.error('表单验证失败:', error)
  140. }
  141. }
  142. const initForm = () => {
  143. form.handleType = 'phone'
  144. // form.eventType = ''
  145. form.message = ''
  146. nextTick(() => {
  147. if (handleWarningFormRef.value) {
  148. handleWarningFormRef.value.clearValidate()
  149. }
  150. })
  151. }
  152. defineExpose({
  153. initForm
  154. })
  155. </script>
  156. <style lang="scss" scoped>
  157. .handle-warning-content {
  158. .elderly-info-section {
  159. padding: 15px;
  160. margin-bottom: 20px;
  161. background: rgb(255 255 255 / 5%);
  162. border-radius: 8px;
  163. p {
  164. margin: 0;
  165. font-size: 16px;
  166. color: #fff;
  167. strong {
  168. color: #1a73e8;
  169. }
  170. }
  171. }
  172. .fixed-mode {
  173. color: #fff;
  174. font-size: 16px;
  175. }
  176. .phone-block {
  177. display: flex;
  178. flex-direction: column;
  179. gap: 8px;
  180. .phone-line {
  181. display: flex;
  182. align-items: center;
  183. gap: 6px;
  184. .label {
  185. color: #cfd3dc;
  186. }
  187. .tel-link {
  188. color: var(--el-color-primary);
  189. text-decoration: none;
  190. }
  191. .muted {
  192. color: #909399;
  193. }
  194. }
  195. .tip {
  196. margin-top: 4px;
  197. font-size: 12px;
  198. color: #909399;
  199. }
  200. }
  201. }
  202. </style>