Просмотр исходного кода

医嘱录入中授权的医嘱会直接变成另外一个医生开的医嘱

xiaochan 2 лет назад
Родитель
Сommit
5676ee4231

+ 79 - 36
src/api/zhu-yuan-yi-sheng/yi-zhu-lu-ru.js → src/api/zhu-yuan-yi-sheng/yi-zhu-lu-ru.ts

@@ -1,24 +1,24 @@
-import request from '@/utils/request'
+import requestV2 from "../../utils/request-v2";
 
 const url = '/yiZhuLuRu'
 
 // 下面是 api 请求
 export function getMyPatient() {
-    return request({
+    return requestV2({
         url: url + '/getMyPatient',
         method: 'get',
     })
 }
 
 export function getOrderNo() {
-    return request({
+    return requestV2<string>({
         url: url + '/getOrderNo',
         method: 'get',
     })
 }
 
 export function enterOrders(data) {
-    return request({
+    return requestV2({
         url: url + '/enterOrders',
         method: 'post',
         data
@@ -26,7 +26,7 @@ export function enterOrders(data) {
 }
 
 export function insertTemplateOrder(data) {
-    return request({
+    return requestV2({
         url: url + '/insertTemplateOrder',
         method: 'post',
         data
@@ -34,7 +34,7 @@ export function insertTemplateOrder(data) {
 }
 
 export function stopOrder(data) {
-    return request({
+    return requestV2({
         url: url + '/stopOrder',
         method: 'post',
         data
@@ -42,7 +42,7 @@ export function stopOrder(data) {
 }
 
 export function toDeleteAnOrder(orderNo) {
-    return request({
+    return requestV2({
         url: url + '/toDeleteAnOrder',
         method: 'get',
         params: {orderNo}
@@ -50,7 +50,7 @@ export function toDeleteAnOrder(orderNo) {
 }
 
 export function deleteMultipleOrders(data) {
-    return request({
+    return requestV2({
         url: url + '/deleteMultipleOrders',
         method: 'post',
         data
@@ -59,7 +59,7 @@ export function deleteMultipleOrders(data) {
 
 
 export function confirmOrders(data) {
-    return request({
+    return requestV2({
         url: url + '/confirmOrders',
         method: 'post',
         data
@@ -68,7 +68,7 @@ export function confirmOrders(data) {
 
 
 export function getParentOrders(patNo, times) {
-    return request({
+    return requestV2({
         url: url + '/getParentOrders',
         method: 'get',
         params: {patNo, times},
@@ -77,7 +77,7 @@ export function getParentOrders(patNo, times) {
 
 
 export function huoQuHuanZheXinXi(inpatientNo) {
-    return request({
+    return requestV2({
         url: url + '/huoQuHuanZheXinXi',
         method: 'get',
         params: {inpatientNo},
@@ -85,7 +85,7 @@ export function huoQuHuanZheXinXi(inpatientNo) {
 }
 
 export function huoQuYiZhuShuJu(data) {
-    return request({
+    return requestV2({
         url: url + '/huoQuYiZhuShuJu',
         method: 'post',
         data,
@@ -93,15 +93,58 @@ export function huoQuYiZhuShuJu(data) {
 }
 
 export function huoQuXiangMu(code, groupNo) {
-    return request({
+    return requestV2({
         url: url + '/huoQuXiangMu',
         method: 'get',
         params: {code, groupNo},
     })
 }
 
-export function huoQuFeiYongXinXi(queryCode) {
-    return request({
+export interface YaoPingJiLiang {
+    code: string
+    name: string
+    value: number
+}
+
+interface YaoPinXinXi {
+    orderCode: string;
+    orderName: string;
+    drugFlag: string;
+    selfFlagYb?: number;
+    weight?: number;
+    weighUnit: string;
+    weighUnitName: string;
+    volum?: number;
+    volUnit: string;
+    volUnitName: string;
+    packSize?: number;
+    packUnit: string;
+    packUnitName: string;
+    miniUnit: string;
+    miniUnitName: string;
+    ypLevel?: number;
+    psFlag?: number;
+    frequCode: string;
+    frequCodeName: string;
+    kssFlag?: number;
+    kjywFlag?: number;
+    supplyCode: string;
+    supplyCodeName: string;
+    nationalCode: string;
+    stockAmount?: number;
+    visibleFlagZy?: number;
+    categoriesFlag: string;
+}
+
+interface FeeInfo {
+    permissionPrompt: boolean
+    prompt: string[]
+    data: YaoPinXinXi
+    yaoPingJiLiang: YaoPingJiLiang[]
+}
+
+export function huoQuFeiYongXinXi(queryCode: string) {
+    return requestV2<FeeInfo>({
         url: url + '/huoQuFeiYongXinXi',
         method: 'get',
         params: {queryCode},
@@ -109,21 +152,21 @@ export function huoQuFeiYongXinXi(queryCode) {
 }
 
 export function getFrequency() {
-    return request({
+    return requestV2({
         url: '/yiZhuLuRu/getFrequency',
         method: 'get',
     })
 }
 
 export function getSupplyType() {
-    return request({
+    return requestV2({
         url: '/yiZhuLuRu/getSupplyType',
         method: 'get',
     })
 }
 
 export function huoQuZhiXinKeShi(code) {
-    return request({
+    return requestV2({
         url: url + '/huoQuZhiXinKeShi',
         method: 'get',
         params: {code},
@@ -131,7 +174,7 @@ export function huoQuZhiXinKeShi(code) {
 }
 
 export function huoQuYiZhuMuBan(code, deptCode, muBanLeiXing, currentPage, total) {
-    return request({
+    return requestV2({
         url: url + '/huoQuYiZhuMuBan',
         method: 'get',
         params: {code, deptCode, muBanLeiXing, currentPage, total},
@@ -139,14 +182,14 @@ export function huoQuYiZhuMuBan(code, deptCode, muBanLeiXing, currentPage, total
 }
 
 export function getDoctorSOrderTemplateMaxSortNo() {
-    return request({
+    return requestV2({
         url: url + '/getDoctorSOrderTemplateMaxSortNo',
         method: 'get',
     })
 }
 
 export function huoQuMuBanShuJu(code) {
-    return request({
+    return requestV2({
         url: url + '/huoQuMuBanShuJu',
         method: 'get',
         params: {code},
@@ -155,7 +198,7 @@ export function huoQuMuBanShuJu(code) {
 
 
 export function deleteADoctorSOrderTemplate(patternCode) {
-    return request({
+    return requestV2({
         url: url + '/deleteADoctorSOrderTemplate',
         method: 'delete',
         params: {patternCode}
@@ -163,7 +206,7 @@ export function deleteADoctorSOrderTemplate(patternCode) {
 }
 
 export function collectDoctorSOrderTemplate(patternCode) {
-    return request({
+    return requestV2({
         url: url + '/collectDoctorSOrderTemplate',
         method: 'get',
         params: {patternCode}
@@ -171,7 +214,7 @@ export function collectDoctorSOrderTemplate(patternCode) {
 }
 
 export function muBanCaoZuo(patternCode, patternName, deptCode, sortNo, flag) {
-    return request({
+    return requestV2({
         url: url + '/muBanCaoZuo',
         method: 'get',
         params: {patternCode, patternName, deptCode, sortNo, flag},
@@ -179,7 +222,7 @@ export function muBanCaoZuo(patternCode, patternName, deptCode, sortNo, flag) {
 }
 
 export function singleDataCheck(data) {
-    return request({
+    return requestV2({
         url: url + '/singleDataCheck',
         method: 'post',
         data: data
@@ -188,7 +231,7 @@ export function singleDataCheck(data) {
 
 
 export function saveTemplate(data) {
-    return request({
+    return requestV2({
         url: url + '/saveTemplate',
         method: 'post',
         data: data
@@ -197,7 +240,7 @@ export function saveTemplate(data) {
 
 
 export function doesTheTemplateExist(name) {
-    return request({
+    return requestV2({
         url: url + '/doesTheTemplateExist',
         method: 'get',
         params: {name}
@@ -205,7 +248,7 @@ export function doesTheTemplateExist(name) {
 }
 
 export function saveTheThirdLevelDoctor(data) {
-    return request({
+    return requestV2({
         url: url + '/saveTheThirdLevelDoctor',
         method: 'post',
         data: data
@@ -213,7 +256,7 @@ export function saveTheThirdLevelDoctor(data) {
 }
 
 export function associateOrdersApi(data) {
-    return request({
+    return requestV2({
         url: url + '/associateOrders',
         method: 'post',
         data: data
@@ -221,7 +264,7 @@ export function associateOrdersApi(data) {
 }
 
 export function confirmTheDoctorSOrderWithMedicine(patNo, times) {
-    return request({
+    return requestV2({
         url: url + '/confirmTheDoctorSOrderWithMedicine',
         method: 'get',
         params: {patNo, times}
@@ -229,7 +272,7 @@ export function confirmTheDoctorSOrderWithMedicine(patNo, times) {
 }
 
 export function copyOrder(data) {
-    return request({
+    return requestV2({
         url: url + '/copyOrder',
         method: 'post',
         data
@@ -237,7 +280,7 @@ export function copyOrder(data) {
 }
 
 export function queryFeeByOrderNoApi(actOrderNo) {
-    return request({
+    return requestV2({
         url: url + '/queryFeeByOrderNo',
         method: 'get',
         params: {actOrderNo}
@@ -245,7 +288,7 @@ export function queryFeeByOrderNoApi(actOrderNo) {
 }
 
 export function oneClickStopOrder(data) {
-    return request({
+    return requestV2({
         url: url + '/oneClickStopOrder',
         method: 'post',
         data
@@ -253,7 +296,7 @@ export function oneClickStopOrder(data) {
 }
 
 export function doctorAuthorizationLogin(data) {
-    return request({
+    return requestV2({
         url: url + '/doctorAuthorizationLogin',
         method: 'post',
         data
@@ -262,7 +305,7 @@ export function doctorAuthorizationLogin(data) {
 
 
 export function updateOrderInstruction(orderNo, str) {
-    return request({
+    return requestV2({
         url: url + '/updateOrderInstruction',
         method: 'get',
         params: {orderNo, str}
@@ -271,7 +314,7 @@ export function updateOrderInstruction(orderNo, str) {
 
 
 export function copyTableOrder(data) {
-    return request({
+    return requestV2({
         url: url + '/copyTableOrder',
         method: 'post',
         data

+ 0 - 181
src/components/xiao-chan/sd-table/SdTable.vue

@@ -1,181 +0,0 @@
-<template>
-  <div class="sd-table__inner-wrapper" ref="sdTableRef">
-    <div class="hidden-columns">
-      <slot/>
-    </div>
-    <sd-table-header v-bind="props"
-                     :temp-columns="tempColumns"
-                     :is-child="isChild"
-                     :sd-mitt="sdMitt"/>
-    <sd-table-body v-bind="props"
-                   ref="tableRef"
-                   :temp-columns="tempColumns"
-                   :sd-mitt="sdMitt"/>
-  </div>
-</template>
-
-
-<script name='SdTable' setup lang="tsx">
-import {defineProps, onMounted, watch, ref, nextTick} from 'vue'
-import SdTableHeader from "../sd-table/table-header/SdTableHeader.vue";
-import SdTableBody from "./table-body/SdTableBody.vue";
-import XEUtils from 'xe-utils'
-import Mitt from "../../../utils/mitt";
-import {useIntersectionObserver} from "@vueuse/core";
-
-const props = defineProps({
-  data: {
-    type: Array,
-    default: []
-  },
-  height: {
-    type: Number,
-    default: null
-  },
-  rowHeight: {
-    type: Number,
-  },
-  columns: {
-    type: Array,
-    default: []
-  },
-  scrollConfig: {
-    type: Object,
-    default: {
-      x: '15px',
-      y: '15px'
-    }
-  }
-})
-
-const sdMitt = new Mitt()
-const tableRef = ref()
-
-const pushColumns = (id, val) => {
-  for (let i = 0, len = props.columns.length; i < len; i++) {
-    let item = props.columns[i]
-    if (item.code === id) {
-      XEUtils.assign(item, val)
-      return
-    }
-  }
-}
-
-const selected = (item) => {
-  item.headerSelectRender = () => {
-    return <ElCheckbox/>
-  }
-}
-
-const sdTableRef = ref(null)
-const isChild = ref(false)
-
-const tempColumns = ref([])
-const fixedStyle = (item, index, location, val) => {
-  let str = item.fixedStyle
-
-  let tempList = []
-  if (location === 'right') {
-    tempList = XEUtils.slice(val, index, props.data.length - 1)
-  } else {
-    tempList = XEUtils.slice(val, 0, index)
-  }
-
-  let px = 0
-  tempList.forEach(item => {
-    px += item.width
-  })
-
-  str['position'] = 'sticky!important';
-  str[location] = px + 'pt'
-  str['background'] = '#fff'
-}
-
-const setStyle = () => {
-
-  tempColumns.value = XEUtils.clone(props.columns, true)
-
-  let left = {
-    fixedStyle: null
-  }
-  let right = {
-    fixedStyle: null
-  }
-
-  XEUtils.arrayEach(tempColumns.value, (item, index) => {
-
-    if (item.child) {
-      isChild.value = true
-    }
-
-    item.fixedStyle = {}
-
-    if (XEUtils.isString(item.width)) {
-      item.fixedStyle.width = item.width;
-    } else {
-      item.fixedStyle.width = item.width + 'pt';
-    }
-
-
-    if (item.fixed && item.fixed === 'left') {
-      fixedStyle(item, index, 'left', tempColumns.value)
-      left = item
-    } else if (item.fixed && item.fixed === 'right') {
-      fixedStyle(item, index, 'right', tempColumns.value)
-      if (right.fixedStyle === null) {
-        right = item
-        item.fixedStyle['border-left'] = '1px solid #ebeef5'
-        item.fixedStyle['box-shadow'] = 'inset 10px 0 10px -10px rgba(0, 0, 0, .15)'
-      }
-    }
-  })
-
-  if (left.fixedStyle != null) {
-    left.fixedStyle['border-right'] = '1px solid #ebeef5' as any;
-    left.fixedStyle['box-shadow'] = 'inset -10px 0 10px -10px rgba(0, 0, 0, .15)' as any
-  }
-
-}
-
-watch(() => props.columns, () => {
-  setStyle()
-}, {immediate: true, deep: true})
-
-onMounted(async () => {
-
-  watch(() => props.data.length, () => {
-    tableRef.value.changeData(props.data)
-  })
-
-  await nextTick()
-
-  useIntersectionObserver(
-      sdTableRef,
-      ([{isIntersecting}], observerElement) => {
-        if (isIntersecting) {
-          sdMitt.emit('setScrollTop')
-        }
-      },
-  )
-
-})
-
-defineExpose({
-  pushColumns
-})
-
-</script>
-
-<style scoped lang="scss">
-.hidden-columns {
-  visibility: hidden;
-  position: absolute;
-  z-index: -1;
-}
-
-.sd-table__inner-wrapper {
-  background-color: white;
-  padding: 5px;
-  border-radius: 5px;
-}
-</style>

+ 39 - 0
src/components/xiao-chan/sd-table/VlTable.vue

@@ -0,0 +1,39 @@
+<script setup lang="ts">
+import {computed, onMounted, toRefs} from "vue";
+import {VlTableConfig} from "@/components/xiao-chan/sd-table/VlTableType";
+import VlHeader from "@/components/xiao-chan/sd-table/header/VlHeader.vue";
+
+const props = withDefaults(
+    defineProps<{
+      data?: any[],
+      height?: number,
+      width?: number
+      config: VlTableConfig[]
+    }>(), {
+      height: 400,
+      width: 500
+    }
+)
+
+const {data, width, height, config} = toRefs(props)
+
+const tableSize = computed(() => {
+  return {
+    width: width.value + 'px',
+    height: height.value + 'px'
+  }
+})
+
+</script>
+
+<template>
+  <div :style="tableSize" class="vl_table_main">
+    <VlHeader :config="config"/>
+  </div>
+</template>
+
+<style lang="scss">
+.vl_table_main {
+  background-color: white;
+}
+</style>

+ 28 - 0
src/components/xiao-chan/sd-table/VlTableType.ts

@@ -0,0 +1,28 @@
+import {VNode} from "@vue/runtime-core";
+
+
+type ExtractKeys<T> = keyof T;
+
+export declare type VlTableConfig<T = any> = {
+    /**
+     * 表格的标题
+     */
+    title: string,
+
+    /**
+     * 表格的 key 值
+     */
+    key: ExtractKeys<T>
+
+    /**
+     *
+     * @param row 当前数据
+     * @param index 当前下标
+     */
+    cellRenderer?: (row: T, index: number) => VNode;
+
+    /**
+     * 表格宽
+     */
+    width: number
+}

+ 38 - 0
src/components/xiao-chan/sd-table/header/VlHeader.vue

@@ -0,0 +1,38 @@
+<script setup lang="ts">
+import {VlTableConfig} from "@/components/xiao-chan/sd-table/VlTableType";
+import vue from 'vue';
+
+const props = defineProps<{
+  config: VlTableConfig[]
+}>()
+
+
+</script>
+
+<template>
+  <div class="vl_header-main">
+    <div v-for="item in props.config"
+         class="vl_header_item"
+         :style="{width : item.width + 'px'}">
+      {{ item.title }}
+    </div>
+  </div>
+</template>
+
+<style lang="scss">
+.vl_header-main {
+  display: flex;
+  box-sizing: border-box;
+  width: 100%;
+  flex-wrap: wrap;
+  height: 20px;
+  align-content: center;
+  border-bottom: 1px solid #000;
+
+  .vl_header_item {
+    display: flex;
+    box-sizing: border-box;
+  }
+
+}
+</style>

+ 0 - 198
src/components/xiao-chan/sd-table/table-body/SdTableBody.vue

@@ -1,198 +0,0 @@
-<template>
-  <div v-bind="containerProps"
-       :style="{height: height + 'px'}"
-       class="sd-body">
-    <div v-bind="wrapperProps">
-      <div v-for="item in list"
-           :key="item.index"
-           class="row"
-           :class="rowClass(item)"
-           @mouseenter="isHoverIndex = item.index"
-           @mouseleave="isHoverIndex = -1"
-           @click="rowClick(item)"
-           :style="{height: rowHeight + 'px'}">
-        <template v-for="(he,heindex) in tempColumns">
-          <div class="cell"
-               :style="he.fixedStyle"
-               :title="getTitle(item,he)">
-
-            <template v-if="he.type">
-              <template v-if="he.type === 'selected'">
-                <el-checkbox v-model="item.data.$selected"/>
-              </template>
-
-              <template v-else-if="he.type === 'index'">
-                {{ item.index + 1 }}
-              </template>
-
-            </template>
-
-
-            <template v-else>
-              <component :is="createTd(item,he)"/>
-            </template>
-
-          </div>
-        </template>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup name='SdTableBody' lang="tsx">
-import {defineProps, ref, onMounted, nextTick, computed} from 'vue'
-import {useVirtualList} from "@vueuse/core";
-
-const {data, tempColumns, columns, sdMitt, height, rowHeight} = defineProps({
-  data: {
-    type: Array,
-    default: []
-  },
-  height: {
-    type: Number,
-    default: null
-  },
-  rowHeight: {
-    type: Number,
-    default: 23
-  },
-  tempColumns: {
-    type: Array,
-    default: []
-  },
-  columns: {
-    type: Array,
-    default: []
-  },
-  sdMitt: {
-    type: Object
-  },
-  scrollConfig: {
-    type: Object,
-    default: {
-      x: '9px',
-      y: '9px'
-    }
-  }
-})
-
-const tempData = ref([])
-
-const {list, containerProps, wrapperProps, scrollTo} = useVirtualList(
-    tempData,
-    {
-      itemHeight: rowHeight,
-    },
-)
-
-
-const createTd = (row, columnRow): any => {
-  let {data, index} = row
-
-  if (columnRow.editCell) {
-    try {
-      return <div>{columnRow.renderCell(data, index)}</div>;
-    } catch {
-      return <div>{data[columnRow.code]}</div>
-    }
-  } else {
-    return <div>{data[columnRow.code]}</div>
-  }
-}
-
-const getTitle = ({data, index}, columnRow) => {
-  try {
-    return data[columnRow.code];
-  } catch {
-    return '';
-  }
-}
-
-let oldRow = {
-  data: {$edit: false}
-}
-const rowClick = (item) => {
-  oldRow.data.$edit = false
-  item.data.$edit = true
-  oldRow = item
-}
-
-const isHoverIndex = ref(0)
-const rowClass = ({data, index}) => {
-  if (isHoverIndex.value === index) {
-    return 'is-hovered'
-  }
-}
-
-let scrollTop = 0;
-
-onMounted(async () => {
-  await nextTick()
-
-  sdMitt.on('setScrollTop', () => {
-    containerProps.ref.value.scrollTop = scrollTop
-  })
-
-
-  containerProps.ref.value.addEventListener('scroll', (val) => {
-    scrollTop = containerProps.ref.value.scrollTop
-    sdMitt.emit('changeScrollX', containerProps.ref.value.scrollLeft)
-  })
-
-})
-
-const changeData = async (data) => {
-  await nextTick()
-  tempData.value = data
-  sdMitt.emit('changeScrollY', containerProps.ref.value.scrollHeight > containerProps.ref.value.clientHeight)
-}
-
-defineExpose({
-  changeData
-})
-
-</script>
-
-<style lang="scss" scoped>
-.sd-body {
-  position: relative;
-  background-color: white;
-
-  &::-webkit-scrollbar {
-    height: v-bind('scrollConfig.x') !important;
-    width: 15px !important;
-    cursor: pointer;
-  }
-
-  .is-hovered {
-    .cell {
-      background-color: #f5f7fa !important;
-    }
-  }
-
-  .row {
-    height: 22px;
-    display: flex;
-    align-items: center;
-
-    .cell {
-      box-sizing: border-box;
-      overflow: hidden;
-      display: flex;
-      align-items: center;
-      text-overflow: ellipsis;
-      white-space: nowrap;
-      height: 100%;
-      flex-grow: 0;
-      flex-shrink: 0;
-      background-color: inherit;
-      color: inherit;
-      border-bottom: 1px solid #ebeef5;
-      padding: 0 5px;
-    }
-  }
-
-}
-
-
-</style>

+ 0 - 41
src/components/xiao-chan/sd-table/table-column/sd-column.ts

@@ -1,41 +0,0 @@
-import {computed, defineComponent, getCurrentInstance, h} from 'vue'
-
-export default defineComponent({
-    name: 'SdColumn',
-    props: {
-        prop: String,
-    },
-    setup(props, {slots}) {
-        const renderCell = (data, index) => {
-            return slots.default({
-                $index: index,
-                row: data
-            })
-        }
-
-        const editCell = (data, index) => {
-            try {
-                return slots.edit({
-                    $index: index,
-                    row: data
-                })
-            } catch {
-                return renderCell(data, index)
-            }
-        }
-
-        const instance = getCurrentInstance()
-        let parent = instance.parent
-        let data = {
-            renderCell: renderCell,
-            editCell: editCell,
-            slots: slots.default,
-            editSlots: slots.edit,
-        }
-
-        parent.exposed.pushColumns(props.prop, data)
-    },
-    render() {
-        return h('div', null, [])
-    },
-})

+ 0 - 135
src/components/xiao-chan/sd-table/table-header/SdTableHeader.vue

@@ -1,135 +0,0 @@
-<template>
-  <div class="sd-table-header"
-       ref="sdHeaderRef">
-    <div v-for="item in tempColumns"
-         class="sd-th"
-         :class="isChild ? 'show_border' : ''"
-         :style="item.fixedStyle">
-      <template v-if="item.type">
-        <template v-if="item.type === 'selected'">
-          <el-checkbox v-model="selectedAll"
-                       @click="clickSelectedAll($event,!selectedAll)"
-                       :indeterminate="intermediate"/>
-        </template>
-        <template v-else-if="item.type ==='index'">
-          #
-        </template>
-      </template>
-      <template v-else>
-        <div>
-          {{ item.name }}
-        </div>
-      </template>
-    </div>
-  </div>
-</template>
-
-<script setup lang="tsx">
-import {computed, defineProps, onMounted, ref} from "vue";
-import {ElCheckbox} from "element-plus";
-import {useElementSize} from "@vueuse/core";
-
-const {data, columns, sdMitt, scrollConfig, isChild, tempColumns} = defineProps({
-  data: {
-    type: Array,
-    default: []
-  },
-  columns: {
-    type: Array,
-    default: []
-  },
-  tempColumns: {
-    type: Array,
-    default: []
-  },
-  sdMitt: {
-    type: Object
-  },
-
-  scrollConfig: {
-    type: Object,
-    default: {
-      x: '9px',
-      y: '9px'
-    }
-  },
-  isChild: {
-    type: Boolean,
-    default: false
-  }
-})
-
-const sdHeaderRef = ref<HTMLHtmlElement>(null)
-
-const scrollY = ref('0px')
-
-const selectedAll = ref(false)
-const intermediate = computed(() => {
-  let len = data.length
-  let tempLen = 0;
-  for (let i = 0; i < len; i++) {
-    let item = data[i]
-    if (item.$selected) {
-      tempLen += 1
-    }
-  }
-  if (tempLen === 0) {
-    selectedAll.value = false
-    return false
-  }
-  if (tempLen === len) {
-    selectedAll.value = true
-    return false
-  }
-  return true
-})
-const clickSelectedAll = (e: Event, val: boolean) => {
-  e.stopImmediatePropagation()
-  e.preventDefault();
-  for (let i = 0, len = data.length; i < len; i++) {
-    let item = data[i]
-    item.$selected = val
-  }
-}
-
-const {width: elWidth, height: elHeight} = useElementSize(sdHeaderRef)
-
-
-onMounted(() => {
-  sdMitt.on('changeScrollX', (val) => {
-    sdHeaderRef.value.scrollLeft = val
-  })
-  scrollY.value = scrollConfig.y
-  sdMitt.on('changeScrollY', (showScroll) => {
-    scrollY.value = showScroll ? scrollConfig.y : '0px'
-  })
-})
-
-</script>
-
-<style lang="scss">
-.sd-table-header {
-  height: v-bind(elHeight + 'px');
-  display: flex;
-  border-bottom: 1px solid #ebeef5;
-  overflow-x: hidden;
-  padding-right: v-bind(scrollY);
-  align-items: center;
-
-  div {
-    box-sizing: border-box;
-  }
-
-  .sd-th {
-    height: 100%;
-    box-sizing: border-box;
-    overflow: hidden;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-    flex-grow: 0;
-    flex-shrink: 0;
-    padding: 0 5px;
-
-  }
-}
-</style>

+ 0 - 119
src/components/xiao-chan/sd-table/use-namespace/index.ts

@@ -1,119 +0,0 @@
-import type {InjectionKey, Ref} from 'vue'
-import {computed, inject, ref, unref} from 'vue'
-
-export const defaultNamespace = 'sd'
-const statePrefix = 'is-'
-
-const _bem = (
-    namespace: string,
-    block: string,
-    blockSuffix: string,
-    element: string,
-    modifier: string
-) => {
-    let cls = `${namespace}-${block}`
-    if (blockSuffix) {
-        cls += `-${blockSuffix}`
-    }
-    if (element) {
-        cls += `__${element}`
-    }
-    if (modifier) {
-        cls += `--${modifier}`
-    }
-    return cls
-}
-
-export const namespaceContextKey: InjectionKey<Ref<string | undefined>> =
-    Symbol('namespaceContextKey')
-
-export const useGetDerivedNamespace = (
-    namespaceOverrides?: Ref<string | undefined>
-) => {
-    const derivedNamespace =
-        namespaceOverrides || inject(namespaceContextKey, ref(defaultNamespace))
-    return computed(() => {
-        return unref(derivedNamespace) || defaultNamespace
-    })
-}
-
-export const useNamespace = (
-    block: string,
-    namespaceOverrides?: Ref<string | undefined>
-) => {
-    const namespace = useGetDerivedNamespace(namespaceOverrides)
-    const b = (blockSuffix = '') =>
-        _bem(namespace.value, block, blockSuffix, '', '')
-    const e = (element?: string) =>
-        element ? _bem(namespace.value, block, '', element, '') : ''
-    const m = (modifier?: string) =>
-        modifier ? _bem(namespace.value, block, '', '', modifier) : ''
-    const be = (blockSuffix?: string, element?: string) =>
-        blockSuffix && element
-            ? _bem(namespace.value, block, blockSuffix, element, '')
-            : ''
-    const em = (element?: string, modifier?: string) =>
-        element && modifier
-            ? _bem(namespace.value, block, '', element, modifier)
-            : ''
-    const bm = (blockSuffix?: string, modifier?: string) =>
-        blockSuffix && modifier
-            ? _bem(namespace.value, block, blockSuffix, '', modifier)
-            : ''
-    const bem = (blockSuffix?: string, element?: string, modifier?: string) =>
-        blockSuffix && element && modifier
-            ? _bem(namespace.value, block, blockSuffix, element, modifier)
-            : ''
-    const is: {
-        (name: string, state: boolean | undefined): string
-        (name: string): string
-    } = (name: string, ...args: [boolean | undefined] | []) => {
-        const state = args.length >= 1 ? args[0]! : true
-        return name && state ? `${statePrefix}${name}` : ''
-    }
-
-    // for css var
-    // --el-xxx: value;
-    const cssVar = (object: Record<string, string>) => {
-        const styles: Record<string, string> = {}
-        for (const key in object) {
-            if (object[key]) {
-                styles[`--${namespace.value}-${key}`] = object[key]
-            }
-        }
-        return styles
-    }
-    // with block
-    const cssVarBlock = (object: Record<string, string>) => {
-        const styles: Record<string, string> = {}
-        for (const key in object) {
-            if (object[key]) {
-                styles[`--${namespace.value}-${block}-${key}`] = object[key]
-            }
-        }
-        return styles
-    }
-
-    const cssVarName = (name: string) => `--${namespace.value}-${name}`
-    const cssVarBlockName = (name: string) =>
-        `--${namespace.value}-${block}-${name}`
-
-    return {
-        namespace,
-        b,
-        e,
-        m,
-        be,
-        em,
-        bm,
-        bem,
-        is,
-        // css
-        cssVar,
-        cssVarName,
-        cssVarBlock,
-        cssVarBlockName,
-    }
-}
-
-export type UseNamespaceReturn = ReturnType<typeof useNamespace>

+ 135 - 44
src/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/yz-edit/YzEditor.vue

@@ -110,7 +110,6 @@
               type="datetime"
               format="YYYY-MM-DD HH:mm:ss"
               value-format="YYYY-MM-DD HH:mm:ss"
-              @change="cydyDrugQuan(false)"
           ></el-date-picker>
         </div>
         <div>
@@ -118,7 +117,6 @@
           <el-date-picker
               style="width: 160px"
               v-model="yiZhuData.endTime"
-              @change="cydyDrugQuan(false)"
               id="yz_endTime"
               :disabled="yiZhuData.frequCode === 'ONCE'"
               :disabled-date="disabledDate"
@@ -128,7 +126,7 @@
           ></el-date-picker>
         </div>
         <div class="input__style" style="width: 120px">
-          医生: {{ yiZhuData.enterOperName ? yiZhuData.enterOperName : store.state.user.info.name }}
+          医生: {{ yiZhuData.enterOperName ? yiZhuData.enterOperName : userInfoStore.name }}
         </div>
         <div>
           执行科室:
@@ -158,8 +156,7 @@
                          @focus="fuYiZhuClick"
                          @rowClick="modifyDosingMethod"
                          :table-header="parentOrder"
-                         :data="fuYiZhuData">
-          </xc-combo-grid>
+                         :data="fuYiZhuData"/>
         </div>
         <div :title="yiZhuData.discription" class="div_center__box">
           描述:
@@ -245,7 +242,7 @@
   </div>
 </template>
 
-<script setup name='YzEditor'>
+<script setup lang="ts">
 import {
   confirmOrders, copyOrder,
   enterOrders,
@@ -253,16 +250,14 @@ import {
   huoQuFeiYongXinXi,
   huoQuXiangMu,
   huoQuZhiXinKeShi,
-  toDeleteAnOrder
+  toDeleteAnOrder, YaoPingJiLiang
 } from '@/api/zhu-yuan-yi-sheng/yi-zhu-lu-ru'
 import {listNotBlank, listToStr, stringIsBlank, stringNotBlank} from '@/utils/blank-utils'
-import {getServerDateApi} from '@/api/public-api'
 import Sleep from '@/utils/sleep'
 import XcComboGrid from "@/components/xiao-chan/combo-grid/XcComboGrid";
 import XcSelectV3 from "@/components/xiao-chan/select-v3/XcSelectV3";
 import XcOption from "@/components/xiao-chan/select/XcOption";
 import XcSelect from "@/components/xiao-chan/select/XcSelect";
-import store from "@/store"
 import XcCheckbox from "@/components/xiao-chan/checkbox/XcCheckbox";
 import {BizException, ExceptionEnum} from "@/utils/BizException";
 import BaoCunXinXi from "@/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/BaoCunXinXi";
@@ -282,7 +277,7 @@ import {
   frequencyConfig,
   addTempOrderNo,
   yiZhuDataInit,
-  setOrderDataAndTwinkle, feeKey
+  setOrderDataAndTwinkle, feeKey, YzType, SearchOrdersType, RefFillingValue
 } from "@/views/hospitalization/zhu-yuan-yi-sheng/public-js/zhu-yuan-yi-sheng";
 import {ElMessageBox} from "element-plus";
 import YzDialog from "@/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/dialog/YzDialog";
@@ -294,13 +289,29 @@ import DoctorAuthorization
   from "@/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/components/DoctorAuthorization.vue";
 import sleep from "@/utils/sleep";
 import XEUtils from 'xe-utils'
-
-const props = defineProps({
+import {
+  ref,
+  computed,
+  nextTick,
+  onDeactivated,
+  onActivated,
+  watch,
+  onMounted
+} from 'vue'
+import {userInfoStore} from "@/utils/store-public";
+import {getServerDate} from "@/utils/moment-utils";
+
+const props = withDefaults(defineProps<{
   patientInfo: {
-    type: Object,
-    default: null
+    inpatientNo: string,
+    admissTimes: number,
+    zkWard: string,
+    zkWardName: string
+    admissDate: Date
   },
-  openGroupOrderTemplate: Function,
+  openGroupOrderTemplate: (val: string) => void
+}>(), {
+  patientInfo: null,
 })
 
 let parentOrder = [
@@ -313,6 +324,78 @@ const searchOrders = (val) => {
   return huoQuXiangMu(val, queryParam.value.groupNo)
 }
 
+const searchClickFunc = async (row: SearchOrdersType): Promise<void> => {
+  // 这个是选择了医嘱弹窗的
+  if (row.serial === '0000' && row.groupNo === '0000') {
+    props.openGroupOrderTemplate(row.orderCode)
+    return
+  }
+
+  // 在出院带药的页面中选择数据
+  if (row.serial === '00' && isCydy()) {
+    qingKong()
+    BizException(ExceptionEnum.LOGICAL_ERROR, '出院带药不能开项目')
+    return
+  }
+
+  // 医嘱号是空的,或者是临时医嘱号的就需要一个新的医嘱号
+  if (stringIsBlank(yiZhuData.value.actOrderNo) || yiZhuData.value.actOrderNo === addTempOrderNo) {
+    setYzData('actOrderNo', parseInt(await getOrderNo()));
+  }
+
+  // 清空数据但是保留原来的医嘱号
+  qingKong(false)
+
+  // 设置医嘱的一些默认值
+  const setYz = new RefFillingValue(yiZhuData, row);
+  setYz.setValue('orderCode')
+      .setValue('orderName')
+      .setValue('serial')
+      .setValue('discription')
+      .setValue('groupNo')
+      .setValue('groupName')
+      .setValue('infusionFlag')
+      .setValue('drugFlag')
+      .setValue('packSize')
+      .setValue('packSizeName')
+      .setValue('orderClass')
+      .setValue('dosage')
+      .setValue('ybType')
+      .setValue('execDept')
+      .setValue('execDeptName')
+      .setDefaultValueByName('newOrderFlag', 1)
+      .setDefaultValueByName('statusFlag', '1');
+
+  // 查询一下父医嘱
+  fuYiZhuClick()
+
+  // 药品
+  if (row.serial !== '00') {
+    const queryKey = feeKey(row.orderCode, row.serial, props.patientInfo.zkWard, queryParam.value.groupNo, yiZhuData.value.superiorDoctor, yiZhuData.value.statusFlag)
+    const {permissionPrompt, prompt, data, yaoPingJiLiang} = await huoQuFeiYongXinXi(queryKey)
+
+    // 医生没有权限
+    if (permissionPrompt) {
+      let authorization = await yzMitt.emit('openDoctorAuthoriztion', row.orderCode + '_' + row.serial)
+      setYz.setDefaultValueByName('superiorDoctor', authorization.code)
+    }
+
+    // 加载药品的计量
+    yaoPinJiLiangData.value = yaoPingJiLiang
+
+
+  } else {
+
+  }
+
+
+}
+
+const setYzData = (name: keyof YzType, value: any): void => {
+  yiZhuData.value[name] = value
+}
+
+
 /*提示信息*/
 const tiShiBiaoTi = ref([])
 // 填充数据
@@ -327,8 +410,13 @@ const xuanZhongFeiYong = async (row, laiyuan = 1) => {
     return BizException(ExceptionEnum.LOGICAL_ERROR, '出院带药不能开项目')
   }
 
-  if (typeof row.actOrderNo === 'undefined' && laiyuan === 1) {
-    yiZhuData.value.actOrderNo = await getOrderNo()
+  // 如果是搜索的医嘱的话就需要给一个新的医嘱号
+  if (laiyuan === 1) {
+    // 如果是在原来有的医嘱上搜索的话就不要给医嘱号了。
+    if (stringIsBlank(yiZhuData.value.actOrderNo) || yiZhuData.value.actOrderNo === addTempOrderNo) {
+      yiZhuData.value.actOrderNo = parseInt(await getOrderNo())
+      yiZhuData.value.newOrderFlag = 1
+    }
   }
 
   let tempOrderNo = null
@@ -337,11 +425,11 @@ const xuanZhongFeiYong = async (row, laiyuan = 1) => {
   if (laiyuan === 1) {
     tempOrderNo = yiZhuData.value.actOrderNo
   }
-  await fuYiZhuClick()
+  fuYiZhuClick()
   qingKong()
   await Sleep(200)
   // 克隆一下数据防止有问题
-  yiZhuData.value = clone(row)
+  yiZhuData.value = clone(row) as YzType
   if (tempOrderNo !== null) {
     yiZhuData.value.actOrderNo = tempOrderNo;
     yiZhuData.value.statusFlag = '1'
@@ -355,13 +443,10 @@ const xuanZhongFeiYong = async (row, laiyuan = 1) => {
       if (res.permissionPrompt) {
         let authorization = await yzMitt.emit('openDoctorAuthoriztion', row.orderCode + '_' + row.serial)
         yiZhuData.value.superiorDoctor = authorization.code
-        yiZhuData.value.instruction = `由【${authorization.name}】医生授权。`
       }
       // 加载药品计量
       yaoPinJiLiangData.value = res.yaoPingJiLiang;
       if (newData) {
-        // 判断是否 是皮试的药 如果是就只能有这些 给药方式
-        // geiYaoFangShiData.value = res.piShi
         // 是否是 抗菌药物
         yiZhuData.value.kjywFlag = res.data.kjywFlag
         // 提示信息
@@ -427,7 +512,7 @@ const xuanZhongFeiYong = async (row, laiyuan = 1) => {
       let res = await huoQuFeiYongXinXi(queryKey2)
       tiShiBiaoTi.value = res.prompt
       if (newData) {
-        openTheOrderPopUpWindow('请输入处置医嘱名')
+        openTheOrderPopUpWindow()
         if (stringNotBlank(res.prompt)) {
           tiShiBiaoTi.value = res.prompt
         }
@@ -447,7 +532,7 @@ const xuanZhongFeiYong = async (row, laiyuan = 1) => {
   }
   if (newData) {
     // 判断这个是不是 新添加的数据 如果是空的就是 新数据
-    let serverDate = await getServerDateApi();
+    let serverDate = await getServerDate();
     if (!yiZhuData.value.orderTime) {
       yiZhuData.value.orderTime = serverDate
     }
@@ -535,7 +620,7 @@ const jiSuanLingLiang = async (val) => {
   yiZhuData.value.drugQuan = drugQuanA;
 }
 /* 选择剂量 */
-const yaoPinJiLiangData = ref([])
+const yaoPinJiLiangData = ref<YaoPingJiLiang[]>([])
 const jiLiangValue = ref(0)
 const xuanZheJiLiang = (val) => {
   jiLiangValue.value = val.value
@@ -543,7 +628,6 @@ const xuanZheJiLiang = (val) => {
   jiSuanLingLiang(yiZhuData.value.dose)
 }
 
-const userInfo = store.state.user.info
 // 医嘱限制时间不能在之前
 const disabledDate = (time) => {
   if (props.patientInfo?.admissDate) {
@@ -562,7 +646,7 @@ const metZhiXingKeShi = (val) => {
 
 /* 父医嘱 */
 const fuYiZhuData = ref([])
-const fuYiZhuClick = async () => {
+const fuYiZhuClick = () => {
   fuYiZhuData.value = []
 
   XEUtils.lastArrayEach(yzData.value, (item) => {
@@ -612,12 +696,12 @@ const setTheTemporaryVariableMedicalOrder = () => {
   openSearch()
 }
 
-const qingKong = () => {
+const qingKong = (clearOrderNo: boolean = true) => {
   yaoPinJiLiangData.value = [];
   jiLiangValue.value = 0;
   tiShiBiaoTi.value = [];
   tempData = null;
-  yiZhuDataInit();
+  yiZhuDataInit(clearOrderNo);
 }
 
 // 判断是否可以编辑
@@ -743,7 +827,7 @@ const clickError = (orderNo) => {
  */
 let tempData = null
 const fillData = async (data) => {
-  await fuYiZhuClick()
+  fuYiZhuClick()
   await xuanZhongFeiYong(data, 2)
   tempData = JSON.stringify(yiZhuData.value)
 }
@@ -778,7 +862,13 @@ const dosePrecision = computed(() => {
   return yiZhuData.value.serial === '00' ? 2 : 3
 })
 
-let copyOrderNo = $ref({
+let copyOrderNo = ref<{
+  actOrderNo: number | null,
+  frequCode: string
+  deptCode: string
+  inpatientNo: string
+  admissTimes: number
+}>({
   actOrderNo: null,
   frequCode: '',
 
@@ -788,23 +878,23 @@ let copyOrderNo = $ref({
 })
 
 const copy = (actOrderNo, frequCode) => {
-  copyOrderNo.actOrderNo = actOrderNo
-  copyOrderNo.frequCode = frequCode
+  copyOrderNo.value.actOrderNo = actOrderNo
+  copyOrderNo.value.frequCode = frequCode
   xcMessage.success('复制成功。')
 }
 
 const pasteClick = () => {
-  if (queryParam.value.frequCode === frequCodeEnum.temporary && copyOrderNo.frequCode !== 'ONCE') {
-    copyOrderNo.frequCode = 'ONCE'
-  } else if (queryParam.value.frequCode === frequCodeEnum.longTerm && copyOrderNo.frequCode === 'ONCE') {
-    copyOrderNo.frequCode = frequencyConfig
+  if (queryParam.value.frequCode === frequCodeEnum.temporary && copyOrderNo.value.frequCode !== 'ONCE') {
+    copyOrderNo.value.frequCode = 'ONCE'
+  } else if (queryParam.value.frequCode === frequCodeEnum.longTerm && copyOrderNo.value.frequCode === 'ONCE') {
+    copyOrderNo.value.frequCode = frequencyConfig
   } else if (queryParam.value.frequCode === frequCodeEnum.takeMedicine) {
-    copyOrderNo.frequCode = 'ONCE'
+    copyOrderNo.value.frequCode = 'ONCE'
   }
 
-  copyOrderNo.deptCode = props.patientInfo.zkWard
-  copyOrderNo.inpatientNo = props.patientInfo.inpatientNo
-  copyOrderNo.admissTimes = props.patientInfo.admissTimes
+  copyOrderNo.value.deptCode = props.patientInfo.zkWard
+  copyOrderNo.value.inpatientNo = props.patientInfo.inpatientNo
+  copyOrderNo.value.admissTimes = props.patientInfo.admissTimes
 
   copyFuncApi()
 }
@@ -817,7 +907,7 @@ const copyFuncApi = async () => {
   })
   yzData.value.push(...data)
   yzMitt.emit('scrollEndAndTwinkle', temp)
-  copyOrderNo.actOrderNo = null
+  copyOrderNo.value.actOrderNo = null
 }
 
 /**
@@ -828,9 +918,10 @@ const duplicateAndPaste = () => {
   if (stringIsBlank(yiZhuData.value.actOrderNo) || yiZhuData.value.actOrderNo === addTempOrderNo) {
     BizException(ExceptionEnum.MESSAGE_ERROR, '请先选择医嘱')
   }
-  copyOrderNo = {
+  copyOrderNo.value = {
     actOrderNo: yiZhuData.value.actOrderNo,
     frequCode: yiZhuData.value.frequCode,
+
     deptCode: props.patientInfo.zkWard,
     inpatientNo: props.patientInfo.inpatientNo,
     admissTimes: props.patientInfo.admissTimes
@@ -862,7 +953,7 @@ onMounted(() => {
   yzMitt.on('copy', copy)
   yzMitt.on('paste', pasteClick)
   yzMitt.on('allowReplication', () => {
-    return copyOrderNo.actOrderNo !== null
+    return copyOrderNo.value.actOrderNo !== null
   })
 
   yzMitt.on('deleteAnOrderByOrderNo', ({actOrderNo, orderName}, clearOrNot = true) => {

+ 8 - 0
src/utils/moment-utils.ts

@@ -1,6 +1,7 @@
 import XEUtils from "xe-utils";
 // @ts-ignore
 import moment from 'moment'
+import RequestV2 from "./request-v2";
 
 export enum DATEFORMAT {
     DATE = 'YYYY-MM-DD',
@@ -50,3 +51,10 @@ export const elDateRangeNotTime = (val: string[] | Date[]): dateRange => {
 export const elDateRangeAddTime = (val: string[] | Date[]): dateRange => {
     return elDateRange(val, true)
 }
+
+export const getServerDate = () => {
+    return RequestV2<string>({
+        url: '/publicApi/getDate',
+        method: 'get',
+    })
+}

+ 3 - 1
src/utils/request-v2.ts

@@ -5,7 +5,9 @@ interface AxiosRequestConfigV2 extends AxiosRequestConfig {
     showLoading?: boolean
 }
 
-const requestV2 = (options: AxiosRequestConfigV2): Promise<any> => {
+const requestV2 = <D = any>(options: AxiosRequestConfigV2): Promise<D> => {
+    // @ts-ignore
     return request(options)
 }
+
 export default requestV2

+ 101 - 16
src/views/hospitalization/zhu-yuan-yi-sheng/public-js/zhu-yuan-yi-sheng.ts

@@ -23,7 +23,10 @@ export const huanZheXinXi = ref<{
     groupInfoBl: string
     setGroupInfoProfit: string
     groupInfoFeeStand: string
-}>({groupInfoBl: "", groupInfoFeeStand: "", groupInfoName: "", groupInfoWeight: "", setGroupInfoProfit: "", ledgerSn: 0, admissTimes: 0, inpatientNo: null, admissDate: ''})
+    referPhysician: string
+    consultPhysician: string
+    deptDirector: string
+}>({consultPhysician: "", deptDirector: "", referPhysician: "", groupInfoBl: "", groupInfoFeeStand: "", groupInfoName: "", groupInfoWeight: "", setGroupInfoProfit: "", ledgerSn: 0, admissTimes: 0, inpatientNo: null, admissDate: ''})
 // 是否点击了修改整个模板
 export const muBanMing = ref({})
 // 错误信息
@@ -72,7 +75,7 @@ export const frequCodeEnum = {
 export const frequencyConfig = 'QD'
 export const addTempOrderNo: number = -1
 
-export interface yzType {
+export interface YzType {
     id: string;
     inpatientNo: string;
     admissTimes: number;
@@ -177,8 +180,56 @@ export interface yzType {
     doctorName: string
 }
 
+
+export interface SearchOrdersType {
+    id: string;
+    pyCode: string;
+    patternCode: string | null;
+    patternName: string | null;
+    orderCode: string;
+    orderName: string;
+    specification: string | null;
+    orderType: string | null;
+    parentCode: string | null;
+    excluGroupType: string | null;
+    discription: string;
+    serial: string;
+    groupNo: string;
+    groupName: string;
+    infusionFlag: string;
+    drugFlag: string;
+    packSize: number;
+    packSizeName: string;
+    orderClass: string;
+    specPack: string | null;
+    jsyFlag: string | null;
+    xnhFlag: string | null;
+    ybComment: string | null;
+    dosage: string;
+    ybType: string;
+    fatherFlag: string | null;
+    manuName: string;
+    nationalCode: string;
+    nationalName: string;
+    execDept: string | null;
+    execDeptName: string | null;
+    chargeCode: string | null;
+    chargeCodeName: string | null;
+    retprice: number | null;
+    quantity: number | null;
+    selfFlag: string | null;
+    supriceFlag: string | null;
+    instruction: string | null;
+    stockAmount: string;
+    ybFlagNew: string;
+    drugSpecification: string;
+    dcode: string;
+    drugFlagName: string;
+    infusionFlagName: string;
+}
+
 // 医嘱数据
-export const yiZhuData = ref<yzType>({
+export const yiZhuData = ref<YzType>({
     actOrderNo: addTempOrderNo,
     admissTimes: 0,
     confirmTime: "",
@@ -254,10 +305,11 @@ export const yiZhuData = ref<yzType>({
     drugOcc: '',
     packSize: 0
 });
-export const yiZhuDataInit = () => {
+
+export const yiZhuDataInit = (clearOrderNo: boolean = true): void => {
     yiZhuData.value = {
         id: '',
-        actOrderNo: addTempOrderNo,
+        actOrderNo: clearOrderNo ? addTempOrderNo : yiZhuData.value.actOrderNo,
         admissTimes: 0,
         confirmTime: "",
         deptCode: "",
@@ -333,7 +385,7 @@ export const yiZhuDataInit = () => {
     }
 }
 // 保存医嘱数据
-export const yzData = ref<Array<yzType>>([])
+export const yzData = ref<Array<YzType>>([])
 
 export const jsQueryYzData = async () => {
     if (stringNotBlank(huanZheXinXi.value.inpatientNo)) {
@@ -365,19 +417,19 @@ export function setYzOrderGroup(): void {
 }
 
 // yzData 转成树状图
-export function yzDataToTree(data: yzType[]): yzType[] {
+export function yzDataToTree(data: YzType[]): YzType[] {
     if (data.length === 0) {
         return []
     }
     // 没有匹配到父级的子节点
-    let noParent: Map<number, yzType> = new Map();
+    let noParent: Map<number, YzType> = new Map();
     // 克隆一下原来的数据
-    let cloneData: yzType[] = JSON.parse(JSON.stringify(data))
+    let cloneData: YzType[] = JSON.parse(JSON.stringify(data))
     // 转 map
-    let tempMap: Map<number, yzType> = new Map();
-    let tree: yzType[] = [];
+    let tempMap: Map<number, YzType> = new Map();
+    let tree: YzType[] = [];
     // 保存子元素的数据
-    let children: yzType[] = [];
+    let children: YzType[] = [];
     XEUtils.arrayEach(cloneData, (item) => {
         let key: number = item.actOrderNo
         noParent.set(key, item);
@@ -413,7 +465,7 @@ export function yzDataToTree(data: yzType[]): yzType[] {
         tree.push(...a)
     }
 
-    let list: yzType[] = []
+    let list: YzType[] = []
 
     //循环 tree 节点,设置结尾的 orderGroup 为 "└" 并且清空children数组
     XEUtils.arrayEach(tree, (item) => {
@@ -432,7 +484,7 @@ export function yzDataToTree(data: yzType[]): yzType[] {
     return list
 }
 
-export const setOrderDataAndTwinkle = async (order, data: yzType[]) => {
+export const setOrderDataAndTwinkle = async (order, data: YzType[]) => {
     let temp = data;
     let tempMap = new Map();
 
@@ -498,7 +550,7 @@ function setSerialName(item: any) {
 
 
 // 数据筛选
-export const tempYzData = computed<yzType[]>(() => {
+export const tempYzData = computed<YzType[]>(() => {
     let temp = XEUtils.filter(yzData.value, (item) => {
         let flag: boolean = queryParam.value.displayRange === 0
         let frequFlag: boolean = queryParam.value.frequCode === frequCodeEnum.all
@@ -712,7 +764,7 @@ export const clearAssociate = () => {
 export const drugManual = ref({
     dialog: false,
     code: '',
-    open: (code, serial) => {
+    open: (code: string, serial: string) => {
         drugManual.value.dialog = true
         drugManual.value.code = code + '_' + serial
     }
@@ -772,3 +824,36 @@ export const confirmLoading = ref<boolean>(false)
 export function feeKey(...val: string[]) {
     return val.join("_")
 }
+
+/**
+ * 两个数据中把 右边的数据根据 name 赋值给左边的数据
+ */
+export class RefFillingValue<R, F> {
+    private refData: Ref<R>;
+    private readonly FillingData: F;
+
+    constructor(refData: Ref<R>, FillingData: F) {
+        this.refData = refData
+        this.FillingData = FillingData
+    }
+
+    /**
+     * 把左边的值填充到右边
+     * @param name 根据名称填充
+     */
+    setValue(name: keyof F) {
+        // @ts-ignore
+        this.refData.value[name] = this.FillingData[name]
+        return this
+    }
+
+    /**
+     * 为第一个数据填充默认值
+     * @param name ref 中的 key
+     * @param value 要赋的值
+     */
+    setDefaultValueByName(name: keyof R, value: any) {
+        this.refData.value[name] = value
+        return this
+    }
+}

+ 1 - 0
src/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/YiZhuLuRu.vue

@@ -5,6 +5,7 @@
                           @batchDeleteOrdersClick="batchDeleteOrdersClick"
                           :click-on-the-order-template="clickOnTheOrderTemplate"
                           :confirm-orders-click="confirmOrdersClick"/>
+
       <yz-editor :patient-info="huanZheXinXi"
                  ref="yzEditorRef"
                  :open-group-order-template="openGroupOrderTemplate"/>

+ 1 - 1
src/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/components/DoctorAuthorization.vue

@@ -65,7 +65,7 @@ onMounted(() => {
                 @cancel="cancel">
 
     <el-alert type="warning">
-      药品分为限制等级,可通过上级医生授权的方式开出大于自身等级的药品,输入上级医生的工号和密码后,点击确认即可。
+      药品分为限制等级,可通过上级医生授权的方式开出大于自身等级的药品,输入上级医生的工号和密码后,点击确认即可,请注意电子确认后该医嘱会变成这个医生开的,请不要在此医嘱上进行修改不然这条医嘱会变成另外一个医生的,如果开错了,删除重新开。
     </el-alert>
     <hr>
     <el-form>

+ 12 - 12
src/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/components/table/YzTableV3.vue

@@ -5,7 +5,7 @@ import {
   clearAssociate, drugManual,
   tempYzData, yiZhuData, yzMitt,
   yzSize,
-  yzType
+  YzType
 } from "../../../../../../views/hospitalization/zhu-yuan-yi-sheng/public-js/zhu-yuan-yi-sheng";
 import {ref, h, reactive, onMounted, nextTick} from 'vue'
 import {VxeTableInstance, VxeTablePropTypes} from 'vxe-table'
@@ -38,7 +38,7 @@ const toggleCheckboxEvent = (row) => {
 
 interface MenuClick {
   $event: Event,
-  row: yzType,
+  row: YzType,
   menu: { code: string, name: string, disabled?: boolean },
   column: any
 }
@@ -81,22 +81,22 @@ const menuConfig = reactive<VxeTablePropTypes.MenuConfig>({
 })
 // 鼠标右键执行的函数
 const rightFunc = {
-  "fee": (data: yzType) => {
+  "fee": (data: YzType) => {
     yzMitt.emit('queryFeeByOrderNo', data)
   },
-  "copy": (data: yzType) => {
+  "copy": (data: YzType) => {
     yzMitt.emit('copy', data.actOrderNo, data.frequCode)
   },
-  "paste": (data: yzType) => {
+  "paste": (data: YzType) => {
     yzMitt.emit('paste')
   },
-  "relevancy": (data: yzType) => {
+  "relevancy": (data: YzType) => {
     yzMitt.emit('clickAssociate', data)
   },
-  "exitTheAssociation": (data: yzType) => {
+  "exitTheAssociation": (data: YzType) => {
     clearAssociate()
   },
-  "instructions": (data: yzType) => {
+  "instructions": (data: YzType) => {
     if (data.groupNo !== '00') {
       drugManual.value.open(data.orderCode, data.serial);
     }
@@ -113,7 +113,7 @@ const tableRightClick = (val: MenuClick) => {
 
 const twinkleList = ref({})
 const rowClassName = ({row, rowIndex}) => {
-  let data = row as yzType
+  let data = row as YzType
   if (typeof twinkleList.value[data.actOrderNo] !== 'undefined') {
     sleep(3000).then(() => {
       delete twinkleList.value[data.actOrderNo]
@@ -160,7 +160,7 @@ const cancelStopTime = (row) => {
   tableRef.value.setCheckboxRow(row, false)
 }
 
-const instructionEnter = (row: yzType) => {
+const instructionEnter = (row: YzType) => {
   updateOrderInstruction(row.actOrderNo, row.instruction)
 }
 
@@ -191,7 +191,7 @@ const timeFomat = (val) => {
   return getFormatDatetime(val, 'YY-MM-DD HH:mm')
 }
 
-const showEndTime = (data: yzType) => {
+const showEndTime = (data: YzType) => {
   return stringIsBlank(data.endTime) && stringIsBlank(data.parentNo) && data.frequCode !== 'ONCE';
 }
 
@@ -233,7 +233,7 @@ onMounted(() => {
     await tableRef.value.scrollToRow(endRow, 'actOrderNo')
   })
 
-  yzMitt.on('setOrderNoTwinkle', async (val: yzType) => {
+  yzMitt.on('setOrderNoTwinkle', async (val: YzType) => {
     twinkleList.value[val] = true;
     let endRow = tempYzData.value[tempYzData.value.length - 1]
     // await nextTick()

+ 69 - 4
src/views/settings/Test.vue

@@ -1,9 +1,74 @@
 <template>
-  <EmrTestV2 pat-no="0420929"/>
+
 </template>
 
-<script setup>
-import EmrTestV2 from "@/components/zhu-yuan-yi-sheng/emr/auxiliary-tools/EmrTestV2.vue";
-import {onMounted} from "vue";
+<script setup lang="ts">
+
+import {ref} from "vue";
+import {RefFillingValue, YzType} from "@/views/hospitalization/zhu-yuan-yi-sheng/public-js/zhu-yuan-yi-sheng";
+
+const row = {
+  "id": "0120001",
+  "pyCode": "PTTLHNZS",
+  "patternCode": null,
+  "patternName": null,
+  "orderCode": "01200",
+  "orderName": "葡萄糖氯化钠注射液(湖南科伦)",
+  "specification": null,
+  "orderType": null,
+  "parentCode": null,
+  "excluGroupType": null,
+  "discription": "大输液4.400     元(医保类别:甲类;报销比例:100%;医保说明:)",
+  "serial": "01",
+  "groupNo": "73",
+  "groupName": "住院药房",
+  "infusionFlag": "1",
+  "drugFlag": "i",
+  "packSize": 1,
+  "packSizeName": "袋",
+  "orderClass": "Y",
+  "specPack": null,
+  "jsyFlag": null,
+  "xnhFlag": null,
+  "ybComment": null,
+  "dosage": "03",
+  "ybType": "a",
+  "fatherFlag": null,
+  "manuName": "湖南科伦制药有限公司",
+  "nationalCode": "XB05BBP075B002040704948",
+  "nationalName": "葡萄糖氯化钠注射液",
+  "execDept": null,
+  "execDeptName": null,
+  "chargeCode": null,
+  "chargeCodeName": null,
+  "retprice": null,
+  "quantity": null,
+  "selfFlag": null,
+  "supriceFlag": null,
+  "instruction": null,
+  "stockAmount": "747.0",
+  "ybFlagNew": "甲类",
+  "drugSpecification": "500ml /袋",
+  "dcode": "AAORWQIT",
+  "drugFlagName": "未知",
+  "infusionFlagName": "是"
+}
+
+const YzOrder = ref<YzType>({actOrderNo: 0, admissTimes: 0, confirmTime: "", deptCode: "", deptName: "", doctorFlag: "", doctorName: "", drugFlag: "", enterOper: "", enterOperName: "", enterTime: "", excluType: "", execUnit: "", execUnitName: "", frequCode: "", frequCodeName: "", groupNo: "", groupNoName: "", id: "", infantFlag: "", inpatientNo: "", newFlag: "", newOrderFlag: 0, orderCode: "", orderName: "", orderTime: "", packSize: 0, packSizeName: "", paySelf: "", physician: "", physicianName: "", psFlag: false, regFlag: "", selfBuy: "", selfBuyName: "", serial: "", serialName: "", signer: "", signerName: "", startTime: "", statusFlag: "", statusFlagName: "", wardCode: "", wardName: "", zkObj: ""})
+
+
+const te = () => {
+  console.log(JSON.stringify(YzOrder.value))
+  let a = new RefFillingValue(YzOrder, row)
+  a.setValue('orderName')
+      .setValue('orderCode')
+      .setValue('ybFlagNew')
+      .setValue('drugFlag')
+
+  console.log(YzOrder.value)
+}
+
+te()
+
 
 </script>