|
|
@@ -0,0 +1,343 @@
|
|
|
+<script setup lang="ts">
|
|
|
+import {onMounted, Ref, ref} from 'vue'
|
|
|
+import {useVModel} from "@vueuse/core";
|
|
|
+import type {OpRecord} from "@/ts-type/op-record";
|
|
|
+import {getFormatDatetime} from "@/utils/date";
|
|
|
+import XcElOption from "@/components/xiao-chan/xc-el-option/XcElOption.vue";
|
|
|
+import {shouShuDengJi, surgicalSituation} from "@/data/operation";
|
|
|
+import XcComboGridV2 from "@/components/xiao-chan/combo-grid/XcComboGridV2.vue";
|
|
|
+import {
|
|
|
+ applicationOpRecord,
|
|
|
+ huoQuShouShuBuWei,
|
|
|
+ preoperativeDiscussion
|
|
|
+} from "@/api/zhu-yuan-yi-sheng/shou-shu-shen-qing";
|
|
|
+import {getRenYuan, maZuiFangShi} from "@/api/public-api";
|
|
|
+import {useCompRef} from "@/utils/useCompRef";
|
|
|
+import {ElForm} from "element-plus";
|
|
|
+import moment from 'moment'
|
|
|
+import {CyMessageBox} from "@/components/cy/message-box";
|
|
|
+import {
|
|
|
+ huanZheXinXi
|
|
|
+} from "@/views/hospitalization/zhu-yuan-yi-sheng/public-js/zhu-yuan-yi-sheng";
|
|
|
+import {userInfoStore} from "@/utils/store-public";
|
|
|
+import XEUtils from "xe-utils";
|
|
|
+import {formatDateToStr} from "@/utils/moment-utils";
|
|
|
+import {ssMitt} from "@/views/hospitalization/zhu-yuan-yi-sheng/shou-shu-shen-qing/src/shou-shu";
|
|
|
+
|
|
|
+const props = defineProps<{
|
|
|
+ data: OpRecord,
|
|
|
+ designateASurgeonInChief: any[];
|
|
|
+ disabledOpScale: boolean
|
|
|
+}>()
|
|
|
+const emits = defineEmits(['update:data', 'clear'])
|
|
|
+const dataModel = useVModel(props, 'data', emits) as Ref<OpRecord>
|
|
|
+// 麻醉方式
|
|
|
+const anestheticMode = ref([])
|
|
|
+// 人员
|
|
|
+const personnelList = ref([])
|
|
|
+// 手术部位
|
|
|
+const surgicalSiteList = ref([])
|
|
|
+
|
|
|
+const personnel = [
|
|
|
+ {label: '编码', prop: 'code', width: 46},
|
|
|
+ {label: '名称', prop: 'name', width: 56},
|
|
|
+ {label: '科室', prop: 'deptName', width: 92},
|
|
|
+ {label: '级别', prop: 'empTitName', width: 105},
|
|
|
+]
|
|
|
+
|
|
|
+const buildOrderName = () => {
|
|
|
+ dataModel.value.orderName =
|
|
|
+ `拟于${getFormatDatetime(dataModel.value.opDatetime, 'YYYY-MM-DD HH:mm')}在${dataModel.value.hocusCodeName === null ? '' : dataModel.value.hocusCodeName}下行${dataModel.value.opName}`
|
|
|
+}
|
|
|
+
|
|
|
+// 时间校验
|
|
|
+const shenQingShiJian = (rule, value, callback) => {
|
|
|
+ const oDate1 = formatDateToStr(value)
|
|
|
+ const oDate2 = formatDateToStr(dataModel.value.applyDate)
|
|
|
+ if (moment(oDate1).isBefore(moment(oDate2))) {
|
|
|
+ callback(new Error('手术时间不能小于申请时间'))
|
|
|
+ } else {
|
|
|
+ callback()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 校验数据
|
|
|
+const rules = ref({
|
|
|
+ opCode: [{required: true, message: '项目编码不能为空', trigger: 'blur'}],
|
|
|
+ opName: [{required: true, message: '项目名称不能为空', trigger: 'blur'}],
|
|
|
+ applyDate: [{required: true, message: '申请时间不能为空', trigger: 'blur'}],
|
|
|
+ opDatetime: [
|
|
|
+ {required: true, message: '手术时间不能为空', trigger: 'blur'},
|
|
|
+ {validator: shenQingShiJian, trigger: 'blur'}],
|
|
|
+ diagBeforeCode: [{required: true, message: '术前诊断不能为空', trigger: 'blur'}],
|
|
|
+ partCode: [{required: true, message: '手术部位不能为空', trigger: 'blur'}],
|
|
|
+ doctorZd: [{required: true, message: '主刀医生不能为空', trigger: 'blur'}],
|
|
|
+ opScale: [{required: true, message: '手术等级不能为空', trigger: 'blur'}],
|
|
|
+ orderName: [{required: true, message: '手术等级不能为空', trigger: 'blur'}],
|
|
|
+})
|
|
|
+
|
|
|
+const formRef = useCompRef(ElForm)
|
|
|
+const loading = ref(false)
|
|
|
+const updateClick = async () => {
|
|
|
+ await formRef.value.validate()
|
|
|
+ const res = await preoperativeDiscussion(huanZheXinXi.value.inpatientNo, huanZheXinXi.value.admissTimes, 1) as boolean
|
|
|
+
|
|
|
+ const data = XEUtils.clone(huanZheXinXi.value, true) as any;
|
|
|
+ data.execDept = userInfoStore.value.deptCode
|
|
|
+ data.opRecord = dataModel.value
|
|
|
+
|
|
|
+ data.opCodeList = dataModel.value.opCodeList
|
|
|
+ data.diagList = dataModel.value.diagList
|
|
|
+
|
|
|
+ const str = res ? '<span style="color:teal;">仅提示:</span><span style="color: red">按照医务部要求手术申请前需要创建术前讨论病历 <br></span>' : ''
|
|
|
+ let next = true
|
|
|
+
|
|
|
+ await CyMessageBox.confirm({
|
|
|
+ type: "info",
|
|
|
+ message: str + '是否生成处置医嘱',
|
|
|
+ confirmButtonText: '处置医嘱',
|
|
|
+ cancelButtonText: '排斥医嘱',
|
|
|
+ dangerouslyUseHTMLString: true,
|
|
|
+ }).then(() => {
|
|
|
+ data.generateRejectedOrders = true
|
|
|
+ }).catch(({action}) => {
|
|
|
+ if (action === 'cancel') {
|
|
|
+ data.generateRejectedOrders = false
|
|
|
+ } else {
|
|
|
+ next = false
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ if (next) {
|
|
|
+ loading.value = true
|
|
|
+ await applicationOpRecord(data).then(() => {
|
|
|
+ delClick()
|
|
|
+ ssMitt.emit('query')
|
|
|
+ }).finally(() => {
|
|
|
+ loading.value = false
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+const delClick = () => {
|
|
|
+ emits('clear')
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+onMounted(() => {
|
|
|
+ maZuiFangShi().then(res => {
|
|
|
+ anestheticMode.value = res as any
|
|
|
+ })
|
|
|
+ getRenYuan('').then(res => {
|
|
|
+ personnelList.value = res as any
|
|
|
+ })
|
|
|
+ huoQuShouShuBuWei('').then(res => {
|
|
|
+ surgicalSiteList.value = res
|
|
|
+ })
|
|
|
+})
|
|
|
+
|
|
|
+defineExpose({
|
|
|
+ buildOrderName
|
|
|
+})
|
|
|
+</script>
|
|
|
+
|
|
|
+<template>
|
|
|
+ <el-form ref="formRef" :model="dataModel" :rules="rules" label-width="80px">
|
|
|
+ <el-row>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="手术时间" prop="opDatetime">
|
|
|
+ <el-date-picker v-model="dataModel.opDatetime"
|
|
|
+ @change="buildOrderName"
|
|
|
+ format="YYYY-MM-DD HH:mm:ss"
|
|
|
+ placeholder="time"
|
|
|
+ type="datetime"
|
|
|
+ value-format="YYYY-MM-DD HH:mm:ss"/>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="情况">
|
|
|
+ <el-select v-model="dataModel.urgentClinicFlag">
|
|
|
+ <XcElOption :data="surgicalSituation"/>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="班次">
|
|
|
+ <el-switch
|
|
|
+ v-model="dataModel.ssbc"
|
|
|
+ :active-value="1"
|
|
|
+ :inactive-value="2"
|
|
|
+ active-color="#13ce66"
|
|
|
+ active-text="正常"
|
|
|
+ inactive-color="#ff4949"
|
|
|
+ inactive-text="加班">
|
|
|
+ </el-switch>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="自费">
|
|
|
+ <el-switch
|
|
|
+ v-model="dataModel.ybSelfFlag"
|
|
|
+ :active-value="1"
|
|
|
+ :inactive-value="0"
|
|
|
+ active-color="#13ce66"
|
|
|
+ active-text="是"
|
|
|
+ inactive-color="#ff4949"
|
|
|
+ inactive-text="否">
|
|
|
+ </el-switch>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="手术部位" prop="partCode">
|
|
|
+ <xc-combo-grid-v2 v-model="dataModel"
|
|
|
+ code="partCode"
|
|
|
+ name="partCodeName"
|
|
|
+ :data="surgicalSiteList"
|
|
|
+ filterable/>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="手术等级" prop="opScale">
|
|
|
+ <div>
|
|
|
+ <div v-if="disabledOpScale" class="shou_shu-warning">医务部锁定等级</div>
|
|
|
+ <el-select v-model="dataModel.opScale"
|
|
|
+ :disabled="disabledOpScale">
|
|
|
+ <xc-el-option :data="shouShuDengJi"/>
|
|
|
+ </el-select>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="麻醉方式">
|
|
|
+ <xc-combo-grid-v2 v-model="dataModel"
|
|
|
+ @row-click="buildOrderName"
|
|
|
+ filterable
|
|
|
+ :data="anestheticMode"
|
|
|
+ code-name="hocusCode"/>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="主刀医生" prop="doctorZd">
|
|
|
+ <div>
|
|
|
+ <div v-if="designateASurgeonInChief.length > 0" class="shou_shu-warning">
|
|
|
+ 医务部锁定主刀医生
|
|
|
+ </div>
|
|
|
+ <xc-combo-grid-v2 v-model="dataModel"
|
|
|
+ code-name="doctorZd"
|
|
|
+ filterable
|
|
|
+ :table-header="personnel"
|
|
|
+ :data="designateASurgeonInChief.length > 0 ? designateASurgeonInChief : personnelList"/>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="第一助手">
|
|
|
+ <xc-combo-grid-v2 v-model="dataModel"
|
|
|
+ code="doctor1"
|
|
|
+ name="doctor1Name"
|
|
|
+ filterable
|
|
|
+ clearable
|
|
|
+ :table-header="personnel"
|
|
|
+ :data="personnelList"/>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="第二助手">
|
|
|
+ <xc-combo-grid-v2 v-model="dataModel"
|
|
|
+ code-name="doctor2"
|
|
|
+ filterable
|
|
|
+ clearable
|
|
|
+ :table-header="personnel"
|
|
|
+ :data="personnelList"/>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="第三助手">
|
|
|
+ <xc-combo-grid-v2 v-model="dataModel"
|
|
|
+ code-name="doctor3"
|
|
|
+ filterable
|
|
|
+ clearable
|
|
|
+ :table-header="personnel"
|
|
|
+ :data="personnelList"/>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="麻醉医生">
|
|
|
+ <xc-combo-grid-v2 v-model="dataModel"
|
|
|
+ code-name="doctorMz"
|
|
|
+ filterable
|
|
|
+ clearable
|
|
|
+ :table-header="personnel"
|
|
|
+ :data="personnelList"/>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="器械护士">
|
|
|
+ <xc-combo-grid-v2 v-model="dataModel"
|
|
|
+ code-name="nurseQx"
|
|
|
+ filterable
|
|
|
+ clearable
|
|
|
+ :table-header="personnel"
|
|
|
+ :data="personnelList"/>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="巡回护士">
|
|
|
+ <xc-combo-grid-v2 v-model="dataModel"
|
|
|
+ code-name="nurseXh"
|
|
|
+ filterable
|
|
|
+ clearable
|
|
|
+ :table-header="personnel"
|
|
|
+ :data="personnelList"/>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-form-item label="医嘱名:" prop="orderName">
|
|
|
+ <el-input style="width: 220px"
|
|
|
+ :rows="3"
|
|
|
+ type="textarea"
|
|
|
+ show-word-limit
|
|
|
+ maxlength="50"
|
|
|
+ v-model="dataModel.orderName"/>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-form-item label="附注说明">
|
|
|
+ <el-input v-model="dataModel.remark" :rows="6" maxlength="50" show-word-limit
|
|
|
+ style="width: 450px;"
|
|
|
+ type="textarea"/>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-form-item>
|
|
|
+ <el-button :loading="loading" type="primary" @click="updateClick">保存</el-button>
|
|
|
+ <el-button :loading="loading" type="danger" @click="delClick">删除</el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ </el-row>
|
|
|
+ </el-form>
|
|
|
+</template>
|
|
|
+
|
|
|
+<style lang="scss">
|
|
|
+.shou_shu-warning {
|
|
|
+ color: #eebe77;
|
|
|
+ font-size: 12px;
|
|
|
+}
|
|
|
+</style>
|