lighter 1 рік тому
батько
коміт
9102f82cca

+ 8 - 0
src/api/adverse-event/index.js

@@ -84,3 +84,11 @@ export function updatePrinted(pid) {
     params: { pid },
   })
 }
+
+export function updateFeedback(data) {
+  return request({
+    url: '/adverseEvent/updateFeedback',
+    method: 'post',
+    data,
+  })
+}

+ 0 - 187
src/components/ModifyAdverseEvent.vue

@@ -1,187 +0,0 @@
-<template>
-  <div>
-    <el-row :gutter="5">
-      <el-col :span="12">
-        <el-tag>事件信息</el-tag>
-        <el-row :gutter="5">
-          <el-col :span="8">
-            <el-tag type="info">事件类型</el-tag>
-            <div></div>
-            <el-select v-model="report.category" placeholder="请选择" style="width: 100%">
-              <el-option-group v-for="group in dict.categories" :key="group.id" :label="group.name">
-                <el-option v-for="item in group.children" :key="item.id" :label="item.name" :value="group.name + ' - ' + item.name"> </el-option>
-              </el-option-group>
-            </el-select>
-          </el-col>
-          <el-col :span="9">
-            <el-tag type="info">发生日期:</el-tag>
-            <div></div>
-            <el-date-picker v-model="report.occurDatetime" type="datetime" placeholder="选择日期时间" style="width: 100%"> </el-date-picker>
-          </el-col>
-          <el-col :span="7">
-            <el-tag type="info">发生科室:</el-tag>
-            <div></div>
-            <el-select v-model="report.deptCode" placeholder="请选择" style="width: 100%">
-              <el-option v-for="item in depts" :key="item.code" :label="item.name" :value="item.code"></el-option>
-            </el-select>
-          </el-col>
-        </el-row>
-      </el-col>
-      <el-col :span="12">
-        <el-tag>提交人信息</el-tag>
-        <el-row :gutter="5">
-          <el-col :span="8">
-            <el-tag type="info">姓名:</el-tag>
-            <div></div>
-            <el-input v-model="report.userName" style="width: 100%" readonly></el-input>
-          </el-col>
-          <el-col :span="8">
-            <el-tag type="info">职称:</el-tag>
-            <div></div>
-            <el-select v-model="report.userLevel" placeholder="请选择" style="width: 100%">
-              <el-option v-for="item in dict.positions" :key="item.id" :label="item.name" :value="item.name"></el-option>
-            </el-select>
-          </el-col>
-          <el-col :span="8">
-            <el-tag type="info">工作年限:</el-tag>
-            <div></div>
-            <el-input-number v-model="report.workYear" :min="0" :max="10" style="width: 100%"></el-input-number>
-          </el-col>
-        </el-row>
-      </el-col>
-    </el-row>
-    <div style="height: 10px"></div>
-    <el-row :gutter="5">
-      <el-col :span="12">
-        <el-tag>事件经过</el-tag>
-        <el-input type="textarea" :rows="5" placeholder="请输入内容" v-model="report.course" maxlength="200" show-word-limit style="width: 100%"> </el-input>
-      </el-col>
-      <el-col :span="12">
-        <el-tag>事件结果与补救措施</el-tag>
-        <el-input type="textarea" :rows="5" placeholder="请输入内容" v-model="report.result" maxlength="100" show-word-limit style="width: 100%"> </el-input>
-      </el-col>
-    </el-row>
-    <div style="height: 10px"></div>
-    <el-tag>原因分析</el-tag>
-    <el-row :gutter="5">
-      <el-col :span="6">
-        <el-tag type="info">护士因素:</el-tag>
-        <div></div>
-        <el-select v-model="report.nurseReasonArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
-          <el-option v-for="item in dict.nurseReasons" :key="item.id" :label="item.name" :value="item.name">
-            <span style="overflow: auto">{{ item.name }}</span>
-          </el-option>
-        </el-select>
-        <el-input v-model="report.nurseReasonElse" placeholder="其他护士因素" style="width: 100%"></el-input>
-      </el-col>
-      <el-col :span="6">
-        <el-tag type="info">病人因素:</el-tag>
-        <div></div>
-        <el-select v-model="report.patientReasonArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
-          <el-option v-for="item in dict.patientReasons" :key="item.id" :label="item.name" :value="item.name">
-            <span style="overflow: auto">{{ item.name }}</span>
-          </el-option>
-        </el-select>
-        <el-input v-model="report.patientReasonElse" placeholder="其他病人因素" style="width: 100%"></el-input>
-      </el-col>
-      <el-col :span="6">
-        <el-tag type="info">环境因素:</el-tag>
-        <div></div>
-        <el-select v-model="report.environReasonArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
-          <el-option v-for="item in dict.environReasons" :key="item.id" :label="item.name" :value="item.name">
-            <span style="overflow: auto">{{ item.name }}</span>
-          </el-option>
-        </el-select>
-        <el-input v-model="report.environReasonElse" placeholder="其他环境因素" style="width: 100%"></el-input>
-      </el-col>
-      <el-col :span="6">
-        <el-tag type="info">管理因素:</el-tag>
-        <div></div>
-        <el-select v-model="report.manageReasonArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
-          <el-option v-for="item in dict.manageReasons" :key="item.id" :label="item.name" :value="item.name">
-            <span style="overflow: auto">{{ item.name }}</span>
-          </el-option>
-        </el-select>
-        <el-input v-model="report.manageReasonElse" placeholder="其他管理因素" style="width: 100%"></el-input>
-      </el-col>
-    </el-row>
-    <div style="height: 10px"></div>
-    <el-tag>改进措施</el-tag>
-    <el-row :gutter="5">
-      <el-col :span="6">
-        <el-tag type="info">护士因素:</el-tag>
-        <div></div>
-        <el-select v-model="report.proNurseArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
-          <el-option v-for="item in dict.nursePros" :key="item.id" :label="item.name" :value="item.name">
-            <span style="overflow: auto">{{ item.name }}</span>
-          </el-option>
-        </el-select>
-        <el-input v-model="report.proNurseElse" placeholder="其他护士因素改进措施" style="width: 100%"></el-input>
-      </el-col>
-      <el-col :span="6">
-        <el-tag type="info">病人因素:</el-tag>
-        <div></div>
-        <el-select v-model="report.proPatientArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
-          <el-option v-for="item in dict.patientPros" :key="item.id" :label="item.name" :value="item.name">
-            <span style="overflow: auto">{{ item.name }}</span>
-          </el-option>
-        </el-select>
-        <el-input v-model="report.proPatientElse" placeholder="其他病人因素改进措施" style="width: 100%"></el-input>
-      </el-col>
-      <el-col :span="6">
-        <el-tag type="info">环境因素:</el-tag>
-        <div></div>
-        <el-select v-model="report.proEnvironArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
-          <el-option v-for="item in dict.environPros" :key="item.id" :label="item.name" :value="item.name">
-            <span style="overflow: auto">{{ item.name }}</span>
-          </el-option>
-        </el-select>
-        <el-input v-model="report.proEnvironElse" placeholder="其他环境因素改进措施" style="width: 100%"></el-input>
-      </el-col>
-      <el-col :span="6">
-        <el-tag type="info">管理因素:</el-tag>
-        <div></div>
-        <el-select v-model="report.proManageArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
-          <el-option v-for="item in dict.managePros" :key="item.id" :label="item.name" :value="item.name">
-            <span style="overflow: auto">{{ item.name }}</span>
-          </el-option>
-        </el-select>
-        <el-input v-model="report.proManageElse" placeholder="其他管理因素改进措施" style="width: 100%"></el-input>
-      </el-col>
-    </el-row>
-    <div style="width: 100%; text-align: right; margin: 20px 0 10px 0">
-      <el-button type="info" icon="Close" @click="cancelModify">取消</el-button>
-      <el-button type="primary" icon="Check" @click="confirmModify">提交</el-button>
-    </div>
-  </div>
-</template>
-
-<script>
-import { dict } from '@/data/adverse-event'
-import {getAllDepts} from '@/api/adverse-event'
-export default {
-  name: 'ModifyAdverseEvent',
-  props: {
-    report: {
-      type: Object,
-      required: false,
-      default: {},
-    },
-  },
-  setup(props, ctx) {
-    const depts = ref([])
-    const cancelModify = () => {
-      ctx.emit('cancel-modify')
-    }
-    const confirmModify = () => {
-      ctx.emit('confirm-modify', props.report)
-    }
-    onMounted(() => {
-      getAllDepts().then(res => {
-        depts.value = res
-      })
-    })
-    return { depts, dict, cancelModify, confirmModify }
-  },
-}
-</script>

+ 24 - 0
src/data/adverse-event.js

@@ -173,4 +173,28 @@ export const dict = {
     { id: 4, name: '主管护师' },
     { id: 5, name: '副主任护师' },
   ],
+  eventResult: [
+    {id: 0, name: 'A级:客观环境或条件可能引发不良事件隐患', label: 'A级'},
+    {id: 1, name: 'B级:不良事件发生但未累及患者', label: 'B级'},
+    {id: 2, name: 'C级:不良事件累及到患者但没有造成伤害', label: 'C级'},
+    {id: 3, name: 'D级:不良事件累及到患者需要进行监测以确保患者不被伤害,或需通过干预阻止伤害发生', label: 'E级'},
+    {id: 4, name: 'E级:不良事件造成患者暂时性伤害并需要进行治疗或干预', label: 'E级'},
+    {id: 5, name: 'F级:不良事件造成患者暂时性伤害并需要住院或延长住院时间', label: 'F级'},
+    {id: 6, name: 'G级:不良事件造成患者永久性伤害(不需要挽救生命的治疗抢救)', label: 'G级'},
+    {id: 7, name: 'H级:不良事件发生并导致患者处于需要持续治疗挽救生命的治疗之中', label: 'H级'},
+    {id: 8, name: 'I级:不良事件发生导致患者死亡', label: 'I级'},
+  ],
+  eventLevel: [
+    {id: 0, name: 'Ⅰ级事件(警讯事件:非预期死亡,或非疾病自然进程过程中造成永久性功能丧失)', label: 'Ⅰ级事件'},
+    {id: 1, name: 'Ⅱ级事件(不良后果事件:疾病医疗过程中,因诊疗活动而非疾病本身造成的机体与功能损害)', label: 'Ⅱ级事件'},
+    {id: 2, name: 'Ⅲ级事件(未造成后果事件:虽发生了错误事实,但未给病人机体和功能造成任何伤害,或有轻微后果而不需任何处理可以完全康复)', label: 'Ⅲ级事件'},
+    {id: 3, name: 'IV级事件(隐患事件:错误在实施之前被发现并得到纠正)', label: 'IV级事件'},
+  ],
+  eventFeedback: [
+    {id: '0', name: '未再发生类似事件'},
+    {id: '1', name: '更改了相关制度和流程'},
+    {id: '2', name: '科室护士对整改指施和修订的制度、流程及效果做到人人知晓'},
+    {id: '3', name: '培训、考核未到位,仍需持续整改'},
+    {id: '4', name: '再次发生类似事件'},
+  ],
 }

+ 25 - 24
src/views/hospitalization/adverse-event/AllAdverseEvent.vue

@@ -24,11 +24,6 @@
         <el-table-column prop="submitDatetime" label="提交时间"></el-table-column>
         <el-table-column prop="userName" label="提交人" width="80"></el-table-column>
         <el-table-column prop="department" label="科室" width="120"></el-table-column>
-        <el-table-column label="受理" width="60">
-          <template v-slot="scope">
-            <span v-html="filterAccepted(scope.row.accepted)"></span>
-          </template>
-        </el-table-column>
         <el-table-column label="处理" width="60">
           <template v-slot="scope">
             <span v-html="filterHandled(scope.row.handled)"></span>
@@ -59,23 +54,31 @@
       ></el-pagination>
     </div>
   </div>
-  <el-dialog v-model="showViewReport" title="报告详情" width="60%">
-    <view-adverse-event :report="report" :disableHlbDealing="disableHlbDealing"></view-adverse-event>
-    <div style="width: 100%; text-align: right; margin: 10px 0">
+  <el-dialog v-model="showViewReport" title="报告详情" fullscreen>
+    <EventViewer :report="report" :disableHlbDealing="disableHlbDealing"/>
+    <div style="width: 100%; text-align: right; margin: 50px 0 0 0">
       <el-button type="primary" icon="Edit" @click="showModifyReport = true" :disabled="disableHlbDealing">
         修改此报告
       </el-button>
       <el-button type="primary" icon="Upload" @click="submitHlbDealing" :disabled="disableHlbDealingBtn">提交处理
       </el-button>
       <el-button type="primary" icon="Printer" @click="toPrintPage">打印</el-button>
+      <el-button type="danger" icon="Close" @click="showViewReport = false">关闭</el-button>
     </div>
   </el-dialog>
-  <el-dialog v-model="showModifyReport" title="修改报告" width="70%">
-    <modify-adverse-event :report="report" @cancel-modify="cancelModify"
-                          @confirm-modify="confirmModify"></modify-adverse-event>
+  <el-dialog
+      v-model="showModifyReport"
+      title="修改报告"
+      width="70%"
+  >
+    <EventEditor :report="report"/>
+    <div style="width: 100%; text-align: right; margin: 20px 0 10px 0">
+      <el-button type="info" icon="Close" @click="cancelModify">取消</el-button>
+      <el-button type="primary" icon="Check" @click="confirmModify">提交</el-button>
+    </div>
   </el-dialog>
   <div id="printArea" style="opacity: 0; position: fixed">
-    <normal-event :report="report"/>
+    <EventPrinter :report="report"/>
   </div>
 </template>
 
@@ -88,17 +91,17 @@ import {
   getReportDetail,
   submitNewReport,
   updateDeleted,
-  updateFinalHandled
+  updateFinalHandled, updatePrinted
 } from '@/api/adverse-event'
-import ViewAdverseEvent from '@/components/ViewAdverseEvent.vue'
-import ModifyAdverseEvent from '@/components/ModifyAdverseEvent.vue'
+import EventViewer from "@/views/hospitalization/adverse-event/component/EventViewer.vue";
 import {ElMessage, ElMessageBox} from 'element-plus'
 import {formatDatetime} from '@/utils/date'
 import {downloadExcel} from '@/utils/excel'
-import NormalEvent from "@/components/inpatient/adverse-event-printpage/NormalEvent.vue";
 import {getLodop, initLodop} from '@/utils/c-lodop'
 import {useUserStore} from "@/pinia/user-store";
 import {startLoading} from "@/utils/loading";
+import EventEditor from "@/views/hospitalization/adverse-event/component/EventEditor.vue";
+import EventPrinter from "@/views/hospitalization/adverse-event/component/EventPrinter.vue";
 
 const dateRange = ref(null)
 const allWards = ref([])
@@ -188,9 +191,9 @@ const deleteReport = (pid) => {
 const cancelModify = () => {
   showModifyReport.value = false
 }
-const confirmModify = (val) => {
-  val.isModify = true
-  submitNewReport(val).then(() => {
+const confirmModify = () => {
+  report.value.isModify = true
+  submitNewReport(report.value).then(() => {
     ElMessage({
       message: '修改成功',
       type: 'success',
@@ -232,10 +235,12 @@ const toPrintPage = () => {
   let pagePrint = prntStyle + '<body>' + prntContent + '</body>'
   LODOP.PRINT_INIT('normaladverseevent')
   LODOP.SET_PRINT_PAGESIZE(1, '210mm', '297mm', '')
+  LODOP.SET_PRINT_MODE('FULL_HEIGHT_FOR_OVERFLOW', true) // 整宽不变形
   LODOP.SET_PRINT_MODE('FULL_WIDTH_FOR_OVERFLOW', true) // 整宽不变形
-  LODOP.ADD_PRINT_HTM('2mm', '5mm', '100%', '100%', pagePrint)
+  LODOP.ADD_PRINT_HTM('1mm', '1mm', '100%', '100%', pagePrint)
   LODOP.SET_PRINT_STYLE('ItemType', 3)
   LODOP.PREVIEW()
+  updatePrinted(report.value.pid)
 }
 const exportExcel = () => {
   startLoading()
@@ -264,10 +269,6 @@ onMounted(() => {
   })
 })
 
-function filterAccepted(val) {
-  return val === 1 ? '<span style="color:green">已受理</span>' : '<span style="color:red">未受理</span>'
-}
-
 function filterHandled(val) {
   return val === 1 ? '<span style="color:green">已处理</span>' : '<span style="color:red">未处理</span>'
 }

+ 28 - 138
src/views/hospitalization/adverse-event/DealAdverseEvent.vue

@@ -28,127 +28,31 @@
         <el-button type="primary" icon="Printer" @click="toPrintPage" :disabled="report.handled !== 1">打印</el-button>
       </header>
       <div class="layout_main">
-        <el-tag>事件信息</el-tag>
-        <div class="report-column-div">
-          事件类型:{{ report.category }} <span style="margin-left: 20px">发生时间:{{ report.occurDatetime }}</span>
-        </div>
-        <el-divider class="el-divider_shorter"></el-divider>
-        <el-tag>提交人信息</el-tag>
-        <div class="report-column-div">
-          姓名:{{ report.userName }}
-          <span style="margin-left: 20px">科室:{{ report.department }}</span>
-          <span style="margin-left: 20px">职称:{{ report.userLevel }}</span>
-          <span style="margin-left: 20px">工作年限:{{ report.workYear }}</span>
-        </div>
-        <el-divider class="el-divider_shorter"></el-divider>
-        <el-tag>事件经过</el-tag>
-        <div class="course-result-div">{{ report.course }}</div>
-        <el-tag>事件结果与补救措施</el-tag>
-        <div class="course-result-div">{{ report.result }}</div>
-        <el-divider class="el-divider_shorter"></el-divider>
-        <el-tag>原因分析</el-tag>
-        <el-row :gutter="0">
-          <el-col :span="6">
-            <el-tag type="info">护士因素</el-tag>
-            <div class="reason-pro-div">
-              <div v-for="(item, index) in report.nurseReasonArr" :key="index">{{ index + 1 }}、{{ item }}</div>
-              <div v-if="report.nurseReasonElse">{{ report.nurseReasonArr.length + 1 }}、{{ report.nurseReasonElse }}</div>
-            </div>
-          </el-col>
-          <el-col :span="6">
-            <el-tag type="info">病人因素</el-tag>
-            <div class="reason-pro-div">
-              <div v-for="(item, index) in report.patientReasonArr" :key="index">{{ index + 1 }}、{{ item }}</div>
-              <div v-if="report.patientReasonElse">{{ report.patientReasonArr.length + 1 }}、{{ report.patientReasonElse }}</div>
-            </div>
-          </el-col>
-          <el-col :span="6">
-            <el-tag type="info">环境因素</el-tag>
-            <div class="reason-pro-div">
-              <div v-for="(item, index) in report.environReasonArr" :key="index">{{ index + 1 }}、{{ item }}</div>
-              <div v-if="report.environReasonElse">{{ report.environReasonArr.length + 1 }}、{{ report.environReasonElse }}</div>
-            </div>
-          </el-col>
-          <el-col :span="6">
-            <el-tag type="info">管理因素</el-tag>
-            <div class="reason-pro-div">
-              <div v-for="(item, index) in report.manageReasonArr" :key="index">{{ index + 1 }}、{{ item }}</div>
-              <div v-if="report.manageReasonElse">{{ report.manageReasonArr.length + 1 }}、{{ report.manageReasonElse }}</div>
-            </div>
-          </el-col>
-        </el-row>
-        <el-divider class="el-divider_shorter"></el-divider>
-        <el-tag>改进措施</el-tag>
-        <el-row :gutter="0">
-          <el-col :span="6">
-            <el-tag type="info">护士因素</el-tag>
-            <div class="reason-pro-div">
-              <div v-for="(item, index) in report.proNurseArr" :key="index">{{ index + 1 }}、{{ item }}</div>
-              <div v-if="report.proNurseElse">{{ report.proNurseArr.length + 1 }}、{{ report.proNurseElse }}</div>
-            </div>
-          </el-col>
-          <el-col :span="6">
-            <el-tag type="info">病人因素</el-tag>
-            <div class="reason-pro-div">
-              <div v-for="(item, index) in report.proPatientArr" :key="index">{{ index + 1 }}、{{ item }}</div>
-              <div v-if="report.proPatientElse">{{ report.proPatientArr.length + 1 }}、{{ report.proPatientElse }}</div>
-            </div>
-          </el-col>
-          <el-col :span="6">
-            <el-tag type="info">环境因素</el-tag>
-            <div class="reason-pro-div">
-              <div v-for="(item, index) in report.proEnvironArr" :key="index">{{ index + 1 }}、{{ item }}</div>
-              <div v-if="report.proEnvironElse">{{ report.proEnvironArr.length + 1 }}、{{ report.proEnvironElse }}</div>
-            </div>
-          </el-col>
-          <el-col :span="6">
-            <el-tag type="info">管理因素</el-tag>
-            <div class="reason-pro-div">
-              <div v-for="(item, index) in report.proManageArr" :key="index">{{ index + 1 }}、{{ item }}</div>
-              <div v-if="report.proManageElse">{{ report.proManageArr.length + 1 }}、{{ report.proManageElse }}</div>
-            </div>
-          </el-col>
-        </el-row>
-        <el-divider class="el-divider_shorter"></el-divider>
-        <el-row :gutter="0">
-          <el-col :span="12">
-            <el-tag>科室处理意见</el-tag>
-            <el-input type="textarea" v-model="report.deptDealing" :rows="3" :disabled="report.handled === 1"></el-input>
-            <div style="width: 100%; text-align: right">
-              <el-tag type="danger"> 处理人:{{ report.deptDealerName }} </el-tag>
-              <el-divider direction="vertical"></el-divider>
-              <el-tag type="danger"> 处理时间:{{ report.deptDealTime }} </el-tag>
-            </div>
-          </el-col>
-          <el-col :span="12">
-            <el-tag>护理部处理意见</el-tag>
-            <el-input type="textarea" v-model="report.finalDealing" :rows="3" disabled></el-input>
-            <div style="width: 100%; text-align: right">
-              <el-tag type="danger"> 处理人:{{ report.finalDealerName }} </el-tag>
-              <el-divider direction="vertical"></el-divider>
-              <el-tag type="danger"> 处理时间:{{ report.finalDealTime }} </el-tag>
-            </div>
-          </el-col>
-        </el-row>
+        <EventViewer :report="report"/>
       </div>
     </div>
   </div>
 
   <el-dialog v-model="showModifyDialog" width="70%" title="修改报告">
-    <modify-adverse-event :report="report" @cancel-modify="cancelModify" @confirm-modify="confirmModify"></modify-adverse-event>
+    <EventEditor :report="report"/>
+    <div style="width: 100%; text-align: right; margin: 20px 0 10px 0">
+      <el-button type="info" icon="Close" @click="cancelModify">取消</el-button>
+      <el-button type="primary" icon="Check" @click="confirmModify">提交</el-button>
+    </div>
   </el-dialog>
   <div id="printArea" style="opacity: 0; position: fixed">
-    <normal-event :report="report" />
+    <EventPrinter :report="report" />
   </div>
 </template>
 
 <script setup>
 import { onActivated, ref } from 'vue'
 import { getReportDetail, getReportsForDept, submitNewReport, updateDeptHandled } from '@/api/adverse-event'
-import ModifyAdverseEvent from '@/components/ModifyAdverseEvent.vue'
-import { ElMessage } from 'element-plus'
 import {getLodop, initLodop} from '@/utils/c-lodop'
-import NormalEvent from "@/components/inpatient/adverse-event-printpage/NormalEvent.vue";
+import EventPrinter from "@/views/hospitalization/adverse-event/component/EventPrinter.vue";
+import EventEditor from "@/views/hospitalization/adverse-event/component/EventEditor.vue";
+import {xcMessage} from "@/utils/xiaochan-element-plus";
+import EventViewer from "@/views/hospitalization/adverse-event/component/EventViewer.vue";
 
 const reports = ref([])
 const report = ref({})
@@ -169,44 +73,34 @@ const modifyReport = () => {
 const cancelModify = () => {
   showModifyDialog.value = false
 }
-const confirmModify = (val) => {
-  val.isModify = true
-  submitNewReport(val).then(() => {
-    ElMessage({
-      message: '修改成功',
-      type: 'success',
-      duration: 2500,
-      showClose: true,
-    })
+const confirmModify = () => {
+  report.value.isModify = true
+  submitNewReport(report.value).then(() => {
+    xcMessage.success('修改成功')
   })
   showModifyDialog.value = false
 }
 const dealReport = () => {
-  if (report.value.deptDealing === '未处理') {
-    ElMessage({
-      message: '请填写处理内容!',
-      type: 'warning',
-      duration: 2500,
-      showClose: true,
-    })
+  if (report.value.deptDealing === '未处理' || !report.value.deptDealing) {
+    xcMessage.warning('请填写处理内容!')
+    return
+  }
+  if (!report.value.eventLevel) {
+    xcMessage.warning('请填写事件等级!')
     return
   }
-  const param = {
+  const params = {
     pid: report.value.pid,
     dealing: report.value.deptDealing,
-  }
-  updateDeptHandled(param).then(() => {
+    eventLevel: report.value.eventLevel
+  };
+  updateDeptHandled(params).then(() => {
     reports.value.forEach((item) => {
-      if (item.pid === param.pid) {
+      if (item.pid === params.pid) {
         item.handled = 1
       }
     })
-    ElMessage({
-      message: '处理成功',
-      type: 'success',
-      duration: 2500,
-      showClose: true,
-    })
+    xcMessage.success('处理成功')
   })
 }
 const toPrintPage = () => {
@@ -230,10 +124,6 @@ onMounted(() => {
   initLodop()
 })
 
-function filterAccepted(val) {
-  return val === 1 ? '<span style="color:green">已受理</span>' : '<span style="color:red">未受理</span>'
-}
-
 function filterHandled(val) {
   return val === 1 ? '<span style="color:green">已处理</span>' : '<span style="color:red">未处理</span>'
 }
@@ -245,7 +135,7 @@ function filterHandled(val) {
   padding-top: 5px;
 }
 .course-result-div {
-  margin: 5px 20px 10px 20px;
+  margin: 6px 20px 10px 20px;
 }
 .reason-pro-div {
   margin: 0 20px;

+ 10 - 174
src/views/hospitalization/adverse-event/FillAderverseEvent.vue

@@ -8,11 +8,6 @@
           @row-click="fetchReportDetail">
         <el-table-column prop="submitDatetime" label="提交时间" width="130"></el-table-column>
         <el-table-column prop="category" label="事件类型"></el-table-column>
-        <el-table-column label="受理" width="60">
-          <template v-slot="scope">
-            <span v-html="filterAccepted(scope.row.accepted)"></span>
-          </template>
-        </el-table-column>
         <el-table-column label="处理" width="60">
           <template v-slot="scope">
             <span v-html="filterHandled(scope.row.handled)"></span>
@@ -39,160 +34,7 @@
         </el-button>
       </header>
       <div class="layout_main">
-        <el-row style="margin: 0" :gutter="5">
-          <el-col :span="12">
-            <el-tag>事件信息</el-tag>
-            <el-row :gutter="5">
-              <el-col :span="8">
-                <el-tag type="info">事件类型</el-tag>
-                <div></div>
-                <el-select v-model="report.category" placeholder="请选择" style="width: 100%">
-                  <el-option-group v-for="group in dict.categories" :key="group.id" :label="group.name">
-                    <el-option v-for="item in group.children" :key="item.id" :label="item.name"
-                               :value="group.name + ' - ' + item.name"></el-option>
-                  </el-option-group>
-                </el-select>
-              </el-col>
-              <el-col :span="9">
-                <el-tag type="info">发生日期:</el-tag>
-                <div></div>
-                <el-date-picker v-model="report.occurDatetime" type="datetime" placeholder="选择日期时间"
-                                style="width: 100%"></el-date-picker>
-              </el-col>
-              <el-col :span="7">
-                <el-tag type="info">发生科室:</el-tag>
-                <div></div>
-                <el-select v-model="report.deptCode" placeholder="请选择" style="width: 100%">
-                  <el-option v-for="item in depts" :key="item.code" :label="item.name" :value="item.code"></el-option>
-                </el-select>
-              </el-col>
-            </el-row>
-          </el-col>
-          <el-col :span="12">
-            <el-tag>提交人信息</el-tag>
-            <el-row :gutter="5">
-              <el-col :span="8">
-                <el-tag type="info">姓名:</el-tag>
-                <div></div>
-                <el-input v-model="report.userName" style="width: 100%" readonly></el-input>
-              </el-col>
-              <el-col :span="8">
-                <el-tag type="info">职称:</el-tag>
-                <div></div>
-                <el-select v-model="report.userLevel" placeholder="请选择" style="width: 100%">
-                  <el-option v-for="item in dict.positions" :key="item.id" :label="item.name"
-                             :value="item.name"></el-option>
-                </el-select>
-              </el-col>
-              <el-col :span="8">
-                <el-tag type="info">工作年限:</el-tag>
-                <div></div>
-                <el-input-number v-model="report.workYear" :min="0" :max="10" style="width: 100%"></el-input-number>
-              </el-col>
-            </el-row>
-          </el-col>
-        </el-row>
-        <div style="height: 10px"></div>
-        <el-row :gutter="5" style="margin: 0">
-          <el-col :span="12">
-            <el-tag>事件经过</el-tag>
-            <el-input type="textarea" :rows="5" placeholder="请输入内容" v-model="report.course" maxlength="200"
-                      show-word-limit style="width: 100%"></el-input>
-          </el-col>
-          <el-col :span="12">
-            <el-tag>事件结果与补救措施</el-tag>
-            <el-input type="textarea" :rows="5" placeholder="请输入内容" v-model="report.result" maxlength="100"
-                      show-word-limit style="width: 100%"></el-input>
-          </el-col>
-        </el-row>
-        <div style="height: 10px"></div>
-        <el-tag>原因分析</el-tag>
-        <el-row :gutter="5" style="margin: 0">
-          <el-col :span="6">
-            <el-tag type="info">护士因素:</el-tag>
-            <div></div>
-            <el-select v-model="report.nurseReasonArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
-              <el-option v-for="item in dict.nurseReasons" :key="item.id" :label="item.name" :value="item.name">
-                <span style="overflow: auto">{{ item.name }}</span>
-              </el-option>
-            </el-select>
-            <el-input v-model="report.nurseReasonElse" placeholder="其他护士因素" style="width: 100%"></el-input>
-          </el-col>
-          <el-col :span="6">
-            <el-tag type="info">病人因素:</el-tag>
-            <div></div>
-            <el-select v-model="report.patientReasonArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
-              <el-option v-for="item in dict.patientReasons" :key="item.id" :label="item.name" :value="item.name">
-                <span style="overflow: auto">{{ item.name }}</span>
-              </el-option>
-            </el-select>
-            <el-input v-model="report.patientReasonElse" placeholder="其他病人因素" style="width: 100%"></el-input>
-          </el-col>
-          <el-col :span="6">
-            <el-tag type="info">环境因素:</el-tag>
-            <div></div>
-            <el-select v-model="report.environReasonArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
-              <el-option v-for="item in dict.environReasons" :key="item.id" :label="item.name" :value="item.name">
-                <span style="overflow: auto">{{ item.name }}</span>
-              </el-option>
-            </el-select>
-            <el-input v-model="report.environReasonElse" placeholder="其他环境因素" style="width: 100%"></el-input>
-          </el-col>
-          <el-col :span="6">
-            <el-tag type="info">管理因素:</el-tag>
-            <div></div>
-            <el-select v-model="report.manageReasonArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
-              <el-option v-for="item in dict.manageReasons" :key="item.id" :label="item.name" :value="item.name">
-                <span style="overflow: auto">{{ item.name }}</span>
-              </el-option>
-            </el-select>
-            <el-input v-model="report.manageReasonElse" placeholder="其他管理因素" style="width: 100%"></el-input>
-          </el-col>
-        </el-row>
-        <div style="height: 10px"></div>
-        <el-tag>改进措施</el-tag>
-        <el-row :gutter="5" style="margin: 0">
-          <el-col :span="6">
-            <el-tag type="info">护士因素:</el-tag>
-            <div></div>
-            <el-select v-model="report.proNurseArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
-              <el-option v-for="item in dict.nursePros" :key="item.id" :label="item.name" :value="item.name">
-                <span style="overflow: auto">{{ item.name }}</span>
-              </el-option>
-            </el-select>
-            <el-input v-model="report.proNurseElse" placeholder="其他护士因素改进措施" style="width: 100%"></el-input>
-          </el-col>
-          <el-col :span="6">
-            <el-tag type="info">病人因素:</el-tag>
-            <div></div>
-            <el-select v-model="report.proPatientArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
-              <el-option v-for="item in dict.patientPros" :key="item.id" :label="item.name" :value="item.name">
-                <span style="overflow: auto">{{ item.name }}</span>
-              </el-option>
-            </el-select>
-            <el-input v-model="report.proPatientElse" placeholder="其他病人因素改进措施" style="width: 100%"></el-input>
-          </el-col>
-          <el-col :span="6">
-            <el-tag type="info">环境因素:</el-tag>
-            <div></div>
-            <el-select v-model="report.proEnvironArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
-              <el-option v-for="item in dict.environPros" :key="item.id" :label="item.name" :value="item.name">
-                <span style="overflow: auto">{{ item.name }}</span>
-              </el-option>
-            </el-select>
-            <el-input v-model="report.proEnvironElse" placeholder="其他环境因素改进措施" style="width: 100%"></el-input>
-          </el-col>
-          <el-col :span="6">
-            <el-tag type="info">管理因素:</el-tag>
-            <div></div>
-            <el-select v-model="report.proManageArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
-              <el-option v-for="item in dict.managePros" :key="item.id" :label="item.name" :value="item.name">
-                <span style="overflow: auto">{{ item.name }}</span>
-              </el-option>
-            </el-select>
-            <el-input v-model="report.proManageElse" placeholder="其他管理因素改进措施" style="width: 100%"></el-input>
-          </el-col>
-        </el-row>
+        <EventEditor :report="report"/>
       </div>
     </div>
   </div>
@@ -200,14 +42,13 @@
 
 <script setup>
 import {computed, onMounted, ref} from 'vue'
-import {dict} from '@/data/adverse-event'
 import {ElMessage, ElMessageBox} from 'element-plus'
-import {getAllDepts, getHistories, getReportDetail, submitNewReport} from '@/api/adverse-event'
+import {getHistories, getReportDetail, submitNewReport} from '@/api/adverse-event'
 import {formatDatetime} from '@/utils/date'
 import {useUserStore} from "@/pinia/user-store";
+import EventEditor from "@/views/hospitalization/adverse-event/component/EventEditor.vue";
 
 const userInfo = useUserStore().userInfo
-const depts = ref([])
 const histories = ref([])
 const report = initReport()
 const isModify = ref(false)
@@ -256,9 +97,7 @@ const beforeSubmit = () => {
       fetchHistories()
       genNewReport()
     })
-  })
-      .catch(() => {
-      })
+  }).catch(() => {})
 }
 
 const disableSubmit = computed(() => {
@@ -266,10 +105,7 @@ const disableSubmit = computed(() => {
 })
 
 onMounted(() => {
-  getAllDepts().then(res => {
-    depts.value = res
-    fetchHistories()
-  })
+  fetchHistories()
 })
 
 
@@ -281,6 +117,7 @@ function initReport() {
     occurDatetime: null,
     userLevel: '护士',
     workYear: 1,
+    eventResult: null,
     course: null,
     result: null,
     nurseReasonArr: [],
@@ -312,8 +149,11 @@ function validateReport(val) {
   if (!val.deptCode) {
     return '请选择发生科室!'
   }
+  if (val.eventResult == null) {
+    return '请选择不良后果!'
+  }
   if (!val.course) {
-    return '请填写事件经过!'
+    return '请填写事件经过!';
   }
   if (!val.result) {
     return '请填写事件结果与补救措施!'
@@ -327,10 +167,6 @@ function validateReport(val) {
   return null
 }
 
-function filterAccepted(val) {
-  return val === 1 ? '<span style="color:green">已受理</span>' : '<span style="color:red">未受理</span>'
-}
-
 function filterHandled(val) {
   return val === 1 ? '<span style="color:green">已处理</span>' : '<span style="color:red">未处理</span>'
 }

+ 178 - 0
src/views/hospitalization/adverse-event/component/EventEditor.vue

@@ -0,0 +1,178 @@
+<template>
+  <el-row style="margin: 0" :gutter="5">
+    <el-col :span="12">
+      <el-tag>事件信息</el-tag>
+      <el-row :gutter="5" style="margin-top: 5px">
+        <el-col :span="8">
+          <el-tag type="info">事件类型</el-tag>
+          <el-select v-model="report.category" placeholder="请选择" style="width: 100%">
+            <el-option-group v-for="group in dict.categories" :key="group.id" :label="group.name">
+              <el-option v-for="item in group.children" :key="item.id" :label="item.name" :value="group.name + ' - ' + item.name"> </el-option>
+            </el-option-group>
+          </el-select>
+        </el-col>
+        <el-col :span="9">
+          <el-tag type="info">发生日期:</el-tag>
+          <el-date-picker v-model="report.occurDatetime" type="datetime" placeholder="选择日期时间" style="width: 100%"> </el-date-picker>
+        </el-col>
+        <el-col :span="7">
+          <el-tag type="info">发生科室:</el-tag>
+          <el-select v-model="report.deptCode" placeholder="请选择" style="width: 100%">
+            <el-option v-for="item in deptList" :key="item.code" :label="item.name" :value="item.code"></el-option>
+          </el-select>
+        </el-col>
+      </el-row>
+    </el-col>
+    <el-col :span="12">
+      <el-tag>提交人信息</el-tag>
+      <el-row :gutter="5">
+        <el-col :span="8">
+          <el-tag type="info">姓名:</el-tag>
+          <el-input v-model="report.userName" style="width: 100%" readonly></el-input>
+        </el-col>
+        <el-col :span="8">
+          <el-tag type="info">职称:</el-tag>
+          <el-select v-model="report.userLevel" placeholder="请选择" style="width: 100%">
+            <el-option v-for="item in dict.positions" :key="item.id" :label="item.name" :value="item.name"></el-option>
+          </el-select>
+        </el-col>
+        <el-col :span="8">
+          <el-tag type="info">工作年限:</el-tag>
+          <el-input-number v-model="report.workYear" :min="0" :max="10" style="width: 100%"></el-input-number>
+        </el-col>
+      </el-row>
+    </el-col>
+  </el-row>
+  <el-row style="margin: 5px 0 0 0" :gutter="5">
+    <el-col :span="12">
+      <el-row :gutter="5">
+        <el-col :span="24">
+          <el-tag type="info">不良后果:</el-tag>
+          <el-select v-model="report.eventResult" placeholder="请选择" style="width: 100%">
+            <el-option
+                v-for="item in dict.eventResult"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+            ></el-option>
+          </el-select>
+        </el-col>
+      </el-row>
+    </el-col>
+  </el-row>
+
+  <el-row style="margin:30px 0 0 0" :gutter="5" >
+    <el-col :span="12">
+      <el-tag>事件经过</el-tag>
+      <el-input type="textarea" :rows="5" placeholder="请输入内容" v-model="report.course" maxlength="200" show-word-limit style="width: 100%"> </el-input>
+    </el-col>
+    <el-col :span="12">
+      <el-tag>事件结果与补救措施</el-tag>
+      <el-input type="textarea" :rows="5" placeholder="请输入内容" v-model="report.result" maxlength="100" show-word-limit style="width: 100%"> </el-input>
+    </el-col>
+  </el-row>
+  <el-tag style="margin-top:30px">原因分析</el-tag>
+  <el-row style="margin: 0" :gutter="5">
+    <el-col :span="6">
+      <el-tag type="info">护士因素:</el-tag>
+      <div></div>
+      <el-select v-model="report.nurseReasonArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
+        <el-option v-for="item in dict.nurseReasons" :key="item.id" :label="item.name" :value="item.name">
+          <span style="overflow: auto">{{ item.name }}</span>
+        </el-option>
+      </el-select>
+      <el-input v-model="report.nurseReasonElse" placeholder="其他护士因素" style="width: 100%"></el-input>
+    </el-col>
+    <el-col :span="6">
+      <el-tag type="info">病人因素:</el-tag>
+      <div></div>
+      <el-select v-model="report.patientReasonArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
+        <el-option v-for="item in dict.patientReasons" :key="item.id" :label="item.name" :value="item.name">
+          <span style="overflow: auto">{{ item.name }}</span>
+        </el-option>
+      </el-select>
+      <el-input v-model="report.patientReasonElse" placeholder="其他病人因素" style="width: 100%"></el-input>
+    </el-col>
+    <el-col :span="6">
+      <el-tag type="info">环境因素:</el-tag>
+      <div></div>
+      <el-select v-model="report.environReasonArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
+        <el-option v-for="item in dict.environReasons" :key="item.id" :label="item.name" :value="item.name">
+          <span style="overflow: auto">{{ item.name }}</span>
+        </el-option>
+      </el-select>
+      <el-input v-model="report.environReasonElse" placeholder="其他环境因素" style="width: 100%"></el-input>
+    </el-col>
+    <el-col :span="6">
+      <el-tag type="info">管理因素:</el-tag>
+      <div></div>
+      <el-select v-model="report.manageReasonArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
+        <el-option v-for="item in dict.manageReasons" :key="item.id" :label="item.name" :value="item.name">
+          <span style="overflow: auto">{{ item.name }}</span>
+        </el-option>
+      </el-select>
+      <el-input v-model="report.manageReasonElse" placeholder="其他管理因素" style="width: 100%"></el-input>
+    </el-col>
+  </el-row>
+  <el-tag style="margin-top:30px">改进措施</el-tag>
+  <el-row style="margin: 0" :gutter="5">
+    <el-col :span="6">
+      <el-tag type="info">护士因素:</el-tag>
+      <div></div>
+      <el-select v-model="report.proNurseArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
+        <el-option v-for="item in dict.nursePros" :key="item.id" :label="item.name" :value="item.name">
+          <span style="overflow: auto">{{ item.name }}</span>
+        </el-option>
+      </el-select>
+      <el-input v-model="report.proNurseElse" placeholder="其他护士因素改进措施" style="width: 100%"></el-input>
+    </el-col>
+    <el-col :span="6">
+      <el-tag type="info">病人因素:</el-tag>
+      <div></div>
+      <el-select v-model="report.proPatientArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
+        <el-option v-for="item in dict.patientPros" :key="item.id" :label="item.name" :value="item.name">
+          <span style="overflow: auto">{{ item.name }}</span>
+        </el-option>
+      </el-select>
+      <el-input v-model="report.proPatientElse" placeholder="其他病人因素改进措施" style="width: 100%"></el-input>
+    </el-col>
+    <el-col :span="6">
+      <el-tag type="info">环境因素:</el-tag>
+      <div></div>
+      <el-select v-model="report.proEnvironArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
+        <el-option v-for="item in dict.environPros" :key="item.id" :label="item.name" :value="item.name">
+          <span style="overflow: auto">{{ item.name }}</span>
+        </el-option>
+      </el-select>
+      <el-input v-model="report.proEnvironElse" placeholder="其他环境因素改进措施" style="width: 100%"></el-input>
+    </el-col>
+    <el-col :span="6">
+      <el-tag type="info">管理因素:</el-tag>
+      <el-select v-model="report.proManageArr" multiple collapse-tags placeholder="请选择" style="width: 100%">
+        <el-option v-for="item in dict.managePros" :key="item.id" :label="item.name" :value="item.name">
+          <span style="overflow: auto">{{ item.name }}</span>
+        </el-option>
+      </el-select>
+      <el-input v-model="report.proManageElse" placeholder="其他管理因素改进措施" style="width: 100%"></el-input>
+    </el-col>
+  </el-row>
+</template>
+
+<script setup>
+import { dict } from '@/data/adverse-event'
+import {getAllDepts} from '@/api/adverse-event'
+const props = defineProps({
+  report: {
+    type: Object,
+    required: false,
+    default: {}
+  }
+})
+
+const deptList = ref([])
+onMounted(() => {
+  getAllDepts().then(res => {
+    deptList.value = res
+  })
+})
+</script>

+ 59 - 31
src/components/inpatient/adverse-event-printpage/NormalEvent.vue → src/views/hospitalization/adverse-event/component/EventPrinter.vue

@@ -6,19 +6,21 @@
       </th>
     </tr>
     <tr>
-      <td colspan="2" style="width: 240px">事件类型</td>
+      <th colspan="2" style="width: 240px">事件类型</th>
       <td colspan="2">{{ report.category }}</td>
-      <td style="width: 60px">发生时间</td>
+      <th style="width: 60px">发生时间</th>
       <td colspan="2">{{ report.occurDatetime }}</td>
-      <td style="width: 70px">发生科室</td>
+      <th style="width: 70px">发生科室</th>
       <td style="width: 120px">{{ report.department }}</td>
     </tr>
     <tr>
-      <th colspan="2">提交人姓名 / 工号</th>
-      <td colspan="2">{{ report.userName }} / {{ report.userId }}</td>
-      <th>提交人职称</th>
-      <td colspan="2">{{ report.userLevel }}</td>
-      <th>提交人工龄</th>
+      <th>不良后果</th>
+      <td>{{ dict.eventResult[report.eventResult]?.label }}</td>
+      <th colspan="2">姓名/工号</th>
+      <td>{{ report.userName }}/{{ report.userId }}</td>
+      <th>职称</th>
+      <td>{{ report.userLevel }}</td>
+      <th>工龄</th>
       <td>{{ report.workYear }}</td>
     </tr>
 
@@ -64,6 +66,11 @@
       <th>管理因素</th>
       <td colspan="7" style="text-align: left;padding-left: 10px;">{{ reasonAndProFilter(report.proManageArr) }}</td>
     </tr>
+
+    <tr>
+      <th colspan="2">事件等级</th>
+      <td colspan="7" style="text-align: left;padding-left: 10px;">{{ dict.eventLevel[report.eventLevel]?.label }}</td>
+    </tr>
     <tr>
       <th rowspan="2" colspan="2">科室处理意见</th>
       <td rowspan="2" colspan="5" style="text-align: left;padding-left: 10px;">{{ report.deptDealing }}</td>
@@ -72,6 +79,19 @@
     <tr>
       <td colspan="2">处理时间:{{ report.deptDealTime }}</td>
     </tr>
+
+<!--    <tr>-->
+<!--      <th rowspan="3" colspan="2">科室处理意见</th>-->
+<!--      <td rowspan="3" colspan="5" style="text-align: left;padding-left: 10px;">{{ report.deptDealing }}</td>-->
+<!--      <td colspan="2">事件等级:{{ dict.eventLevel[report.eventLevel]?.label }}</td>-->
+<!--    </tr>-->
+<!--    <tr>-->
+<!--      <td colspan="2">处理人:{{ report.deptDealerName }}</td>-->
+<!--    </tr>-->
+<!--    <tr>-->
+<!--      <td colspan="2">处理时间:{{ report.deptDealTime }}</td>-->
+<!--    </tr>-->
+
     <tr>
       <th rowspan="2" colspan="2">护理部处理意见</th>
       <td rowspan="2" colspan="5" style="text-align: left;padding-left: 10px;">{{ report.finalDealing }}</td>
@@ -80,32 +100,40 @@
     <tr>
       <td colspan="2">处理时间:{{ report.finalDealTime }}</td>
     </tr>
+
+    <tr>
+      <th rowspan="2" colspan="2">整改效果反馈</th>
+      <td rowspan="2" colspan="5" style="text-align: left;padding-left: 10px;">
+        <span v-for="item in report.feedbackList">
+          {{dict.eventFeedback[item]?.name}};
+        </span>
+      </td>
+      <td colspan="2">反馈人:{{ report.feedbackStaffName }}</td>
+    </tr>
+    <tr>
+      <td colspan="2">反馈时间:{{ report.feedbackTime }}</td>
+    </tr>
   </table>
 </template>
 
-<script>
-export default {
-  props: {
-    report: {
-      type: Object,
-      required: true
-    }
-  },
-  setup() {
-    const reasonAndProFilter = (arr) => {
-      if (!arr) {
-        return
-      }
-      let temp = ''
-      for (let i = 0; i < arr.length; i++) {
-        if (arr[i] !== '') temp += i + 1 + '. ' + arr[i] + ';'
-      }
-      return temp
-    }
-    return {
-      reasonAndProFilter,
-    }
-  },
+<script setup>
+import {dict} from "@/data/adverse-event";
+const props = defineProps({
+  report: {
+    type: Object,
+    required: true
+  }
+})
+
+const reasonAndProFilter = (arr) => {
+  if (!arr) {
+    return
+  }
+  let temp = ''
+  for (let i = 0; i < arr.length; i++) {
+    if (arr[i] !== '') temp += i + 1 + '. ' + arr[i] + ';'
+  }
+  return temp
 }
 </script>
 

+ 101 - 43
src/components/ViewAdverseEvent.vue → src/views/hospitalization/adverse-event/component/EventViewer.vue

@@ -1,25 +1,30 @@
 <template>
-  <div :style="reportBoxStyle">
     <el-tag>事件信息</el-tag>
-    <div class="report-column-div">
-      事件类型:{{ report.category }} <span style="margin-left: 20px">发生时间:{{ report.occurDatetime }}</span>
+    <div class="report-column-div" style="margin-top: 6px">
+      <span style="color: #8f8f8f">事件类型:</span>{{ report.category }}
+      <span style="margin-left: 20px;color: #8f8f8f">发生时间:</span>{{ report.occurDatetime }}
     </div>
-    <el-divider></el-divider>
-    <el-tag>提交人信息</el-tag>
     <div class="report-column-div">
-      姓名:{{ report.userName }}
-      <span style="margin-left: 20px">科室:{{ report.department }}</span>
-      <span style="margin-left: 20px">职称:{{ report.userLevel }}</span>
-      <span style="margin-left: 20px">工作年限:{{ report.workYear }}</span>
+      <span style="color: #8f8f8f">不良后果:</span>
+      {{dict.eventResult[report.eventResult]?.name}}
+    </div>
+    <el-tag style="margin-top: 12px">提交人信息</el-tag>
+    <div class="report-column-div" style="margin-top: 6px">
+      <span style="color: #8f8f8f">姓名:</span>
+      {{ report.userName }}
+      <span style="margin-left: 20px;color: #8f8f8f">科室:</span>
+      {{ report.department }}
+      <span style="margin-left: 20px;color: #8f8f8f">职称:</span>
+      {{ report.userLevel }}
+      <span style="margin-left: 20px;color: #8f8f8f">工作年限:</span>
+      {{ report.workYear }}
     </div>
-    <el-divider></el-divider>
-    <el-tag>事件经过</el-tag>
+    <el-tag style="margin-top: 12px">事件经过</el-tag>
     <div class="course-result-div">{{ report.course }}</div>
     <el-tag>事件结果与补救措施</el-tag>
     <div class="course-result-div">{{ report.result }}</div>
-    <el-divider></el-divider>
-    <el-tag>原因分析</el-tag>
-    <el-row :gutter="0">
+    <el-tag style="margin-top: 12px">原因分析</el-tag>
+    <el-row :gutter="0" style="margin-top: 6px">
       <el-col :span="6">
         <el-tag type="info">护士因素</el-tag>
         <div class="reason-pro-div">
@@ -49,9 +54,8 @@
         </div>
       </el-col>
     </el-row>
-    <el-divider></el-divider>
-    <el-tag>改进措施</el-tag>
-    <el-row :gutter="0">
+    <el-tag style="margin-top: 12px">改进措施</el-tag>
+    <el-row :gutter="0" style="margin-top: 6px">
       <el-col :span="6">
         <el-tag type="info">护士因素</el-tag>
         <div class="reason-pro-div">
@@ -81,11 +85,26 @@
         </div>
       </el-col>
     </el-row>
-    <el-divider></el-divider>
-    <el-row :gutter="0">
+    <el-row :gutter="0" style="margin-top: 12px">
       <el-col :span="12">
         <el-tag>科室处理意见</el-tag>
-        <el-input type="textarea" v-model="report.deptDealing" :rows="3" :disabled="report.handled === 1"></el-input>
+        <div style="margin-top: 6px">
+          <el-select v-model="report.eventLevel" placeholder="事件等级">
+            <el-option
+                v-for="item in dict.eventLevel"
+                :key="item.id"
+                :value="item.id"
+                :label="item.name"
+            ></el-option>
+          </el-select>
+        </div>
+        <el-input
+            style="margin-top: 12px"
+            type="textarea"
+            v-model="report.deptDealing"
+            :rows="3"
+            :disabled="report.handled === 1"
+        ></el-input>
         <div style="width: 100%; text-align: right">
           <el-tag type="danger"> 处理人:{{ report.deptDealerName }} </el-tag>
           <el-divider direction="vertical"></el-divider>
@@ -94,7 +113,13 @@
       </el-col>
       <el-col :span="12">
         <el-tag>护理部处理意见</el-tag>
-        <el-input type="textarea" v-model="report.finalDealing" :rows="3" :disabled="disableHlbDealing"></el-input>
+        <el-input
+            style="margin-top: 6px;"
+            type="textarea"
+            v-model="report.finalDealing"
+            :rows="5"
+            :disabled="disableHlbDealing"
+        ></el-input>
         <div style="width: 100%; text-align: right">
           <el-tag type="danger"> 处理人:{{ report.finalDealerName }} </el-tag>
           <el-divider direction="vertical"></el-divider>
@@ -102,33 +127,66 @@
         </div>
       </el-col>
     </el-row>
-    <el-divider></el-divider>
-  </div>
+  <el-divider class="el-divider_shorter" />
+  <el-row :gutter="0" style="margin-top: 20px">
+    <el-col :span="24">
+      <el-tag>科室整改效果反馈</el-tag>
+      <el-checkbox-group v-model="report.feedbackList">
+        <el-checkbox
+            v-for="item in dict.eventFeedback"
+            :label="item.name"
+            :value="item.id"
+        ></el-checkbox>
+      </el-checkbox-group>
+      <div style="width: 100%; text-align: right; margin-top: 6px">
+        <el-button
+            v-if="!disableFeedback"
+            type="success"
+            plain
+            @click="submitFeedback"
+            style="margin-right: 30px"
+            :disabled="disableFeedback"
+        >
+          提交反馈
+        </el-button>
+        <el-tag type="danger"> 反馈人:{{ report.feedbackStaffName }} </el-tag>
+        <el-divider direction="vertical"></el-divider>
+        <el-tag type="danger"> 反馈时间:{{ report.feedbackTime }} </el-tag>
+      </div>
+    </el-col>
+  </el-row>
+
 </template>
 
-<script>
-export default {
-  name: 'ViewAdverseEvent',
-  props: {
-    report: {
-      type: Object,
-      required: true,
-    },
-    disableHlbDealing: {
-      type: Boolean,
-      default: true,
-    },
+<script setup>
+import {dict} from "@/data/adverse-event";
+import {updateFeedback} from "@/api/adverse-event";
+import {xcMessage} from "@/utils/xiaochan-element-plus";
+
+const props = defineProps({
+  report: {
+    type: Object,
+    required: true,
   },
-  setup() {
-    const reportBoxStyle = {
-      height: window.innerHeight * 0.55 + 'px',
-      overflowY: 'auto',
-    }
-    return {
-      reportBoxStyle,
-    }
+  disableHlbDealing: {
+    type: Boolean,
+    default: true,
   },
+})
+
+const disableFeedback = computed(() => {
+  return props.report.feedbackTime
+})
+
+function submitFeedback() {
+  updateFeedback({
+    pid: props.report.pid,
+    feedbackList: props.report.feedbackList
+  }).then(res => {
+    xcMessage.success('反馈成功。')
+  })
 }
+
 </script>
 
 <style scoped>