فهرست منبع

新增检验检查的查询字段,新增诊断的维护页面

xiaochan 1 هفته پیش
والد
کامیت
61b47413c1

+ 114 - 0
src/api/dictionary/diagnoseToJyJcReq.ts

@@ -0,0 +1,114 @@
+import requestV2 from "@/utils/request-v2";
+import { IPage, Page } from "@/ts-type/Page";
+
+export type searchParams = {
+  searchValue?: string;
+  searchId?: string;
+} & Page;
+
+export interface DiagnoseTemplate {
+  /**
+   * id
+   */
+  id?: string;
+
+  /**
+   * 诊断编码
+   */
+  diagnoseCode?: string;
+
+  /**
+   * 对应的是 diagnose_to_req 的id
+   */
+  templateId?: string;
+
+  /**
+   * 诊断名称 (not present in database)
+   */
+  diagnoseName?: string;
+}
+
+export interface DiagnoseReqTemplate {
+  /**
+   * id
+   */
+  id: string;
+
+  /**
+   * orderCode
+   */
+  orderCode: string;
+
+  /**
+   * orderName (not present in database)
+   */
+  orderName?: string;
+
+  /**
+   * 2-检验 -3检查
+   */
+  reqType: number; // or more specifically: 2 | -3 if these are the only possible values
+
+  /**
+   * 执行科室 (execution department)
+   */
+  execDept: string;
+
+  /**
+   * 部位或者标本 (part or sample)
+   */
+  partOrSample: string;
+
+  /**
+   * 对应的是 diagnose_to_req 的id (corresponds to diagnose_to_req's id)
+   */
+  templateId: string;
+}
+
+export function createTemplate(name: string) {
+  return requestV2({
+    url: "/diagnoseJyJcReqTemplate/createTemplate",
+    method: "get",
+    params: { name },
+  });
+}
+
+export function getDiagnoseReqTemplateList(data: searchParams) {
+  return requestV2<IPage>({
+    url: "/diagnoseJyJcReqTemplate/getDiagnoseReqTemplateList",
+    method: "post",
+    data,
+  });
+}
+
+export function getTemplateContentById(id: string) {
+  return requestV2<{
+    id: string;
+    diagnoseList: DiagnoseTemplate[];
+    reqTemplates: DiagnoseReqTemplate[];
+  }>({
+    url: "/diagnoseJyJcReqTemplate/getTemplateContentById",
+    method: "get",
+    params: { id },
+  });
+}
+
+export function saveTemplateContent(data: {
+  id: string;
+  diagnoseList: DiagnoseTemplate[];
+  reqTemplates: DiagnoseReqTemplate[];
+}) {
+  return requestV2({
+    url: "/diagnoseJyJcReqTemplate/saveTemplateContent",
+    method: "post",
+    data,
+  });
+}
+
+export function delTemplate(id) {
+  return requestV2({
+    url: "/diagnoseJyJcReqTemplate/delTemplate",
+    method: "get",
+    params: { id },
+  });
+}

+ 15 - 0
src/api/zhu-yuan-yi-sheng/jian-yan-jian-cha-shen-qing.ts

@@ -1,4 +1,5 @@
 import requestV2 from "../../utils/request-v2";
+import XEUtils from "xe-utils";
 
 let url = "/jianYanJianChaShenQing/";
 
@@ -251,3 +252,17 @@ export function printListReqNo(reqNos: number[]) {
     data: reqNos,
   });
 }
+
+export const getJcPartCode = XEUtils.once(async () => {
+  return await requestV2({
+    url: url + "getJcPartCode",
+    method: "get",
+  });
+});
+
+export const getJySample = XEUtils.once(async () => {
+  return await requestV2({
+    url: url + "getJySample",
+    method: "get",
+  });
+});

+ 26 - 7
src/components/cy/combo-grid/src/CyComboGrid.vue

@@ -247,8 +247,11 @@ defineExpose({
               show-overflow
               @cell-click="handleTableClick"
               :columnConfig="{ resizable: true }"
-              :row-config="{
+              size="small"
+              :cell-config="{
                 height: rowHeight,
+              }"
+              :row-config="{
                 isCurrent: true,
                 isHover: true,
                 useKey: true,
@@ -257,15 +260,25 @@ defineExpose({
               :scroll-y="{ enabled: true }"
               max-height="250px"
             >
-              <vxe-column field="value" title="编码" :width="125" />
-              <vxe-column field="label" title="名称" :width="135" />
+              <vxe-column
+                field="value"
+                title="编码"
+                width="125"
+                max-width="125"
+              />
+              <vxe-column
+                field="label"
+                title="名称"
+                width="135"
+                max-width="135"
+              />
             </vxe-table>
           </div>
           <!--     主要的table     -->
           <div :style="{ width: XEUtils.addUnit(props.tableWidth) }">
             <vxe-table
-              :class="nsSelect.e('table')"
               ref="tableRef"
+              :class="nsSelect.e('table')"
               :data="tableData"
               @cell-click="handleTableClick"
               show-overflow-tooltip
@@ -273,9 +286,12 @@ defineExpose({
               :row-class-name="rowClass"
               :showHeader="showTableHeader"
               max-height="250px"
+              size="small"
               :columnConfig="{ resizable: true }"
-              :row-config="{
+              :cell-config="{
                 height: rowHeight,
+              }"
+              :row-config="{
                 isCurrent: true,
                 isHover: true,
                 useKey: true,
@@ -290,7 +306,7 @@ defineExpose({
                 :key="item"
                 :title="item.name || item.title"
                 :field="item.code || item.field"
-                :min-width="item.width"
+                :width="item.width"
               >
                 <template #default="scope" v-if="item.render">
                   <Component :is="item.render(scope)" />
@@ -307,9 +323,12 @@ defineExpose({
               :columnConfig="{ resizable: true }"
               max-height="250px"
               show-overflow-tooltip
+              size="small"
               show-overflow
-              :row-config="{
+              :cell-config="{
                 height: 30,
+              }"
+              :row-config="{
                 isCurrent: true,
                 isHover: true,
                 useKey: true,

+ 71 - 0
src/components/cy/cy-el-table/CyElTable.vue

@@ -0,0 +1,71 @@
+<script setup lang="ts">
+import type { IPage, Page } from "@/ts-type/Page";
+
+const props = withDefaults(
+  defineProps<{
+    tableData?: IPage & {
+      data: any[];
+    };
+    dataKey?: string;
+    params?: any;
+    remoteMethod?: (value: any) => Promise<any>;
+  }>(),
+  {
+    dataKey: "records",
+  }
+);
+
+const store = reactive({
+  page: {
+    pageSize: 50,
+    currentPage: 1,
+    total: 0,
+  },
+
+  params: {},
+});
+
+function handleQuery(init = false) {
+  if (init) {
+    store.params = props.params;
+  }
+
+  props.remoteMethod({
+    ...store.params,
+    ...store.page,
+  });
+}
+
+function handleCurrent(value) {
+  store.page.currentPage = value;
+}
+
+const tmpData = computed(() => {
+  return props.tableData.records;
+});
+
+onMounted(() => {
+  handleQuery(true);
+});
+</script>
+
+<template>
+  <div class="layout-horizontal">
+    <div class="layout_main">
+      <el-table :data="tmpData">
+        <slot />
+      </el-table>
+    </div>
+    <div style="height: 8px"></div>
+    <div style="height: max-content">
+      <el-pagination
+        :page-size="props.params.pageSize"
+        :current-page="props.params.currentPage"
+        :total="props.tableData.total"
+        @current-change=""
+      />
+    </div>
+  </div>
+</template>
+
+<style lang="scss"></style>

+ 2 - 2
src/components/med-tec-mod/HuoQuMuBan.vue

@@ -86,10 +86,10 @@
       <el-pagination
         :current-page="templateData.currentPage"
         :page-size="templateData.pageSize"
-        :pager-count="5"
+        :pager-count="7"
         :total="templateData.total"
         layout=" prev, pager, next"
-        small
+        size="small"
         style="margin-top: 5px"
         @current-change="templatePaging"
       />

+ 41 - 0
src/components/system/JcPartSelect.vue

@@ -0,0 +1,41 @@
+<script setup lang="ts">
+import { getJcPartCode } from "@/api/zhu-yuan-yi-sheng/jian-yan-jian-cha-shen-qing";
+import CyComboGrid from "@/components/cy/combo-grid/src/CyComboGrid.vue";
+import { useVModel } from "@vueuse/core/index";
+import CyComboGridProps from "@/components/cy/combo-grid/src/CyComboGridProps";
+import XEUtils from "xe-utils";
+import { stringIsBlank } from "@/utils/blank-utils";
+
+const props = defineProps({ ...CyComboGridProps, codeType: String });
+
+const data = ref({});
+const emits = defineEmits(["update:modelValue"]);
+const mValue = useVModel(props, "modelValue", emits);
+
+const tmpData = computed(() => {
+  if (stringIsBlank(props.codeType)) {
+    return data.value["all"];
+  }
+  const key = props.codeType.trim();
+  return data.value["code" + key] || data.value.all;
+});
+
+onMounted(async () => {
+  const tmp = {};
+  XEUtils.arrayEach(await getJcPartCode(), item => {
+    const code = stringIsBlank(item.parentCode)
+      ? "all"
+      : "code" + item.parentCode;
+    if (tmp[code] && tmp[code].length > 0) {
+      tmp[code].push(item);
+    } else {
+      tmp[code] = [item];
+    }
+  });
+  data.value = tmp;
+});
+</script>
+
+<template>
+  <CyComboGrid v-bind="props" :data="tmpData" v-model="mValue" />
+</template>

+ 20 - 0
src/components/system/jy-sample/JySampleSelect.vue

@@ -0,0 +1,20 @@
+<script setup lang="ts">
+import { getJySample } from "@/api/zhu-yuan-yi-sheng/jian-yan-jian-cha-shen-qing";
+import CyComboGrid from "@/components/cy/combo-grid/src/CyComboGrid.vue";
+import { useVModel } from "@vueuse/core/index";
+import CyComboGridProps from "@/components/cy/combo-grid/src/CyComboGridProps";
+
+const props = defineProps({ ...CyComboGridProps });
+
+const data = ref([]);
+const emits = defineEmits(["update:modelValue"]);
+const mValue = useVModel(props, "modelValue", emits);
+
+onMounted(async () => {
+  data.value = await getJySample();
+});
+</script>
+
+<template>
+  <CyComboGrid v-bind="props" :data="data" v-model="mValue" />
+</template>

+ 19 - 2
src/components/xmlr/dialog/ScanCodeGun.vue

@@ -13,10 +13,26 @@ async function handleBlur() {
 
 function handleKeyDown() {
   codeList.value.push(searchCode.value);
-  console.log(searchCode.value);
   searchCode.value = "";
 }
 
+const keyList = ref([]);
+let tmpKey = "";
+
+function handleKeyUp(event) {
+  let text = event.key;
+  if (0x1d == event.keyCode || 119 == event.keyCode) {
+    text = "ñ";
+  } else if (13 == event.keyCode) {
+    keyList.value.push(tmpKey);
+    console.log(keyList.value);
+    // 回车事件
+    tmpKey = "";
+    return;
+  }
+  tmpKey += text;
+}
+
 onMounted(async () => {
   await nextTick();
   await handleBlur();
@@ -30,13 +46,14 @@ onMounted(async () => {
         ref="inputRef"
         style="width: 220px"
         v-model="searchCode"
+        @keyup="handleKeyUp"
         @blur="handleBlur"
         @keydown.enter.stop.prevent="handleKeyDown"
       />
     </header>
 
     <div class="layout_main">
-      <el-table max-height="55vh"></el-table>
+      {{ keyList }}
     </div>
   </div>
 </template>

+ 11 - 13
src/components/xmlr/index.ts

@@ -63,7 +63,7 @@ export const useXmlr = (props: XmlrProps, emits: UseDialogType.Emits) => {
       refundSymbol: 3,
       execDept: props.medicalTechnology ? (isDev ? "" : userInfo.deptCode) : "",
     },
-    tabsVal: isDev ? "费用" : "费用",
+    tabsVal: isDev ? "项目录入" : "费用",
 
     feeTotal: 0,
     feeData: [],
@@ -90,6 +90,15 @@ export const useXmlr = (props: XmlrProps, emits: UseDialogType.Emits) => {
 
   const mutation = {
     async getPatInfo(times: number = null) {
+      getServerDateApi()
+        .then(res => {
+          //@ts-ignore
+          store.chargeDate = res;
+        })
+        .catch(() => {
+          //@ts-ignore
+          store.chargeDate = dayjs(new Date()).format("YYYY-MM-DD hh:mm:ss");
+        });
       await api
         .getPatientInfo(store.searchPatNo, times)
         .then(res => {
@@ -97,17 +106,6 @@ export const useXmlr = (props: XmlrProps, emits: UseDialogType.Emits) => {
           mutation.getFee();
           store.queryWard = res?.admissDept;
           store.queryDept = res?.zkWard;
-          getServerDateApi()
-            .then(res => {
-              //@ts-ignore
-              store.chargeDate = res;
-            })
-            .catch(() => {
-              //@ts-ignore
-              store.chargeDate = dayjs(new Date()).format(
-                "YYYY-MM-DD hh:mm:ss"
-              );
-            });
           return res;
         })
         .catch(() => {
@@ -169,7 +167,7 @@ export const useXmlr = (props: XmlrProps, emits: UseDialogType.Emits) => {
         return;
       }
       const filter = XEUtils.filter(data, item => {
-        return item.orderNo === 6 && item.serial !== "00";
+        return item.serial !== "00";
       });
       if (filter.length === 0) {
         return;

+ 3 - 0
src/components/zhu-yuan-yi-sheng/jian-cha-shen-qing/TianJiaJianYan.vue

@@ -187,6 +187,9 @@ async function baoCunShuJu() {
 
   let data = XEUtils.clone(huanZheXinXi.value, true);
   data.list = jyList.value;
+  data.list.forEach(item => {
+    item.reqType = 2;
+  });
   data.reqType = 2;
   await baoCunJianYanJianCha(data);
   jyProxy.clear();

+ 65 - 53
src/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/jy-jc-tree/JyJcTree.vue

@@ -1,26 +1,31 @@
 <template>
-  <CyTreeInput :tree-ref="treeRef"
-               :init="false"
-               v-model:data="jcjyTree"
-               :remote-method="getJyJcZdTree">
-    <template #default="{handelFilter , treeData}">
+  <CyTreeInput
+    :tree-ref="treeRef"
+    :init="false"
+    v-model:data="jcjyTree"
+    :remote-method="getJyJcZdTree"
+  >
+    <template #default="{ handelFilter, treeData }">
       <el-tree
-          ref="treeRef"
-          style="width: max-content"
-          :data="props.yjyc === 'jc' ? treeData.jc : treeData.jy"
-          accordion
-          :filter-node-method="handelFilter"
-          @node-click="nodeClick"
-          :props="config">
-        <template #default="{node, data}">
+        ref="treeRef"
+        style="width: max-content"
+        :data="props.yjyc === 'jc' ? treeData.jc : treeData.jy"
+        accordion
+        :filter-node-method="handelFilter"
+        @node-click="nodeClick"
+        :props="config"
+      >
+        <template #default="{ node, data }">
           <div style="width: 100%">
             <el-icon>
-              <FolderOpened v-if="data?.code === null || data?.code.length < 5"/>
-              <Document v-else/>
+              <FolderOpened
+                v-if="data?.code === null || data?.code.length < 5"
+              />
+              <Document v-else />
             </el-icon>
             <span :title="showName(data)">
-         {{ showName(data) }}
-        </span>
+              {{ showName(data) }}
+            </span>
           </div>
         </template>
       </el-tree>
@@ -29,59 +34,66 @@
 </template>
 
 <script setup lang="ts">
-import {ref} from "vue";
-import {ElTree} from "element-plus";
-import {Document, FolderOpened} from "@element-plus/icons-vue";
-import {useCompRef} from "@/utils/useCompRef";
-import {getJyJcZdTree} from "@/api/zhu-yuan-yi-sheng/jian-yan-jian-cha-shen-qing";
+import { ref } from "vue";
+import { ElTree } from "element-plus";
+import { Document, FolderOpened } from "@element-plus/icons-vue";
+import { useCompRef } from "@/utils/useCompRef";
+import { getJyJcZdTree } from "@/api/zhu-yuan-yi-sheng/jian-yan-jian-cha-shen-qing";
 import CyTreeInput from "@/components/cy/tree-input/src/CyTreeInput.vue";
 
-const props = defineProps({
-  yjyc: {
-    type: String
-  }
-})
+const props = defineProps<{
+  yjyc: "jy" | "jc";
+  treeData?: {
+    jc: any[];
+    jy: any[];
+  };
+}>();
 
-const emit = defineEmits(['node-click'])
+const emit = defineEmits(["node-click"]);
 
 const config = {
-  value: 'code',
-  label: 'name',
-  children: 'children'
-}
+  value: "code",
+  label: "name",
+  children: "children",
+};
 
 interface Tree {
-  name: string,
-  code: string,
-  children?: Tree[]
+  name: string;
+  code: string;
+  children?: Tree[];
 }
 
-const treeRef = useCompRef(ElTree)
-
+const treeRef = useCompRef(ElTree);
 
 const nodeClick = (data: Tree) => {
-  if (!data.children) {
-    emit('node-click', data)
+  if (!data.children && data.id !== null) {
+    emit("node-click", data);
   }
-}
+};
 
-const showName = (data) => {
-  if (props.yjyc === 'jy') {
-    return data.name + ' ' + (data?.inspectStuffName === null ? '' : data?.inspectStuffName)
+const showName = data => {
+  if (props.yjyc === "jy") {
+    return (
+      data.name +
+      " " +
+      (data?.inspectStuffName === null ? "" : data?.inspectStuffName)
+    );
   }
   return data.name;
-}
-</script>
-<script lang="ts">
-import {ref} from 'vue'
-import {getJyJcZdTree} from "@/api/zhu-yuan-yi-sheng/jian-yan-jian-cha-shen-qing";
+};
 
 const jcjyTree = ref({
   jc: [],
-  jy: []
-})
+  jy: [],
+});
 
-getJyJcZdTree().then(res => {
-  jcjyTree.value = res
-})
+onMounted(() => {
+  if (typeof props.treeData !== "undefined") {
+    jcjyTree.value = props.treeData;
+  } else {
+    getJyJcZdTree().then(res => {
+      jcjyTree.value = res;
+    });
+  }
+});
 </script>

+ 13 - 0
src/ts-type/Page.d.ts

@@ -0,0 +1,13 @@
+export type Page = {
+  pageSize: number;
+  currentPage: number;
+  total: number;
+};
+
+export type IPage<T = any> = {
+  records: T;
+  current: number;
+  pages: number;
+  size: number;
+  total: number;
+};

+ 25 - 27
src/utils/CyCache.ts

@@ -1,38 +1,36 @@
 class CyCache {
+  #data = new Map<string, any>();
+  keyName = "cy";
+  maxSize = 1000;
 
-    #data = new Map<string, any>();
-    keyName = 'cy'
-    maxSize = 1000;
+  constructor(name: string) {
+    this.keyName = name;
+  }
 
-    constructor(name: string) {
-        this.keyName = name;
+  async get(key: string, cb: () => Promise<any>) {
+    if (this.#data.size > this.maxSize) {
+      this.#data.clear();
     }
 
-    async get(key: string, cb: Function) {
-        if (this.#data.size > this.maxSize) {
-            this.#data.clear()
-        }
-
-        const k = this.keyName + '_' + key
-        const temp = this.#data.get(k)
-        if (temp) {
-            return temp
-        }
-        const t = (await cb)(key)
-        if (t !== null) {
-            this.#data.set(k, t)
-        }
-        return t
+    const k = this.keyName + "_" + key;
+    const temp = this.#data.get(k);
+    if (temp) {
+      return temp;
     }
-
-    setMaxSize(size: number) {
-        this.maxSize = size;
+    const t = await cb();
+    if (t !== null) {
+      this.#data.set(k, t);
     }
+    return t;
+  }
 
-    clear() {
-        this.#data.clear()
-    }
+  setMaxSize(size: number) {
+    this.maxSize = size;
+  }
 
+  clear() {
+    this.#data.clear();
+  }
 }
 
-export default CyCache
+export default CyCache;

+ 3 - 4
src/utils/cy-message-box/index.tsx

@@ -13,7 +13,7 @@ export type CyMessageBoxOptions = ElMessageBoxOptions &
   Partial<{
     inputMaxLength: number;
     inputAllowEmpty: boolean;
-    type: ElMessageBoxOptions["type"] | "delete";
+    type: ElMessageBoxOptions["type"] & "delete";
     height: string | number;
     width: string | number;
     selectOption:
@@ -227,7 +227,7 @@ const analyzeConfiguration = (options: CyMessageBoxOptions) => {
     opt.boxType = "prompt";
     const oldInputValidator = opt.inputValidator;
     opt.inputValidator = value => {
-      if (inputAllowEmpty && value === null) {
+      if (inputAllowEmpty && stringIsBlank(value)) {
         return true;
       }
 
@@ -237,8 +237,7 @@ const analyzeConfiguration = (options: CyMessageBoxOptions) => {
         }
         return oldInputValidator ? oldInputValidator(value) : true;
       }
-
-      if (value === null || value.length > inputMaxLength) {
+      if (stringIsBlank(value) || value.length > inputMaxLength) {
         return `请填写,最大长度为【${inputMaxLength}】`;
       }
       return oldInputValidator ? oldInputValidator(value) : true;

+ 2 - 2
src/utils/list-utlis.ts

@@ -11,7 +11,7 @@ const isEnglish = (str: string) => {
 export const notNullAndLike = (
   data: any,
   likeValue: string,
-  keyName: string[] = ["pyCode", "dcode", "code", "name", "value", "label"]
+  keyName: string[] = ["pyCode", "wbCode", "code", "name", "value", "label"]
 ) => {
   for (let i = 0; i < keyName.length; i++) {
     let itemKey = keyName[i];
@@ -35,7 +35,7 @@ export const notNullAndLike = (
 export function listFilter(
   data: any[],
   likeValue: string,
-  keyName: string[] = ["pyCode", "dcode", "code", "name", "value", "label"]
+  keyName: string[] = ["pyCode", "wbCode", "code", "name", "value", "label"]
 ) {
   return XEUtils.filter(data, item => {
     return notNullAndLike(item, likeValue, keyName);

+ 193 - 0
src/views/dictionary/diagnose-req-template/AddTemplateDialog.vue

@@ -0,0 +1,193 @@
+<script setup lang="ts">
+import {
+  type DiagnoseTemplate,
+  type DiagnoseReqTemplate,
+  getTemplateContentById,
+  saveTemplateContent,
+} from "@/api/dictionary/diagnoseToJyJcReq";
+import {
+  biaoBenApi,
+  diagnosisInOurHospital,
+} from "@/api/zhu-yuan-yi-sheng/jian-yan-jian-cha-shen-qing";
+import CyComboGrid from "@/components/cy/combo-grid/src/CyComboGrid.vue";
+import { UseDialogType } from "@/components/cy/CyDialog/index";
+import { isDev } from "@/utils/public";
+import JyJcTree from "@/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/jy-jc-tree/JyJcTree.vue";
+import CyTabPane from "@/components/cy/tabs/src/CyTabPane.vue";
+import CyTabs from "@/components/cy/tabs/src/CyTabs";
+import XEUtils from "xe-utils";
+import { stringIsBlank } from "@/utils/blank-utils";
+import SystemDeptSelect from "@/components/system/dept-select/SystemDeptSelect.vue";
+import JcPartSelect from "@/components/system/JcPartSelect.vue";
+import JySampleSelect from "@/components/system/jy-sample/JySampleSelect.vue";
+
+const props = defineProps<{
+  id: string;
+  treeData: {
+    jy: any[];
+    jc: any[];
+  };
+}>();
+
+const store = reactive({
+  code: "",
+  name: "",
+  tabsValue: isDev ? "yjyc" : "诊断",
+
+  yjyc: "jc",
+
+  diagnoseList: [] as DiagnoseTemplate[],
+  reqTemplates: [] as DiagnoseReqTemplate[],
+});
+
+const buWeiShuJu = ref({});
+
+function handleTreeClick(val, type) {
+  console.log(val, type);
+
+  const tmp = {
+    orderCode: val.id,
+    orderName: val.name,
+    reqType: type,
+    execDept: val.execUnit,
+    execName: val.execUnitName,
+  };
+
+  if (type == 2) {
+    tmp.partOrSample = val.inspectStuff;
+    tmp.partOrSampleName = val.inspectStuffName;
+  } else {
+    tmp.partOrSample = val.partCode;
+    tmp.partOrSampleName = val.partName;
+    tmp.classes = val.classes;
+  }
+
+  // @ts-ignore
+  store.reqTemplates.push(tmp);
+  console.log(store.reqTemplates);
+}
+
+onMounted(() => {
+  getTemplateContentById(props.id).then(res => {
+    store.diagnoseList = res.diagnoseList;
+    store.reqTemplates = res.reqTemplates;
+  });
+});
+
+defineExpose<UseDialogType.Expose>({
+  confirm() {
+    return saveTemplateContent({
+      id: props.id,
+      diagnoseList: store.diagnoseList,
+      reqTemplates: store.reqTemplates,
+    });
+  },
+});
+</script>
+
+<template>
+  <el-tabs v-model="store.tabsValue" class="el-tabs__fill">
+    <el-tab-pane label="诊断" name="诊断">
+      <div class="layout_container">
+        <header>
+          临床诊断:
+          <CyComboGrid
+            v-model="store"
+            value="code"
+            @rowClick="
+              ({ row }) => {
+                store.diagnoseList.push({
+                  diagnoseCode: row.code,
+                  diagnoseName: row.name,
+                });
+              }
+            "
+            label="name"
+            :remote-method="diagnosisInOurHospital"
+          />
+        </header>
+        <el-table :data="store.diagnoseList" style="flex: 1">
+          <el-table-column label="编码" prop="diagnoseCode" />
+          <el-table-column label="名称" prop="diagnoseName" />
+          <el-table-column>
+            <template #default="{ row, $index }">
+              <el-button
+                type="danger"
+                @click="
+                  () => {
+                    store.diagnoseList.splice($index, 1);
+                  }
+                "
+                >删除
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </el-tab-pane>
+    <el-tab-pane label="检验、检查" name="yjyc">
+      <div class="layout_container layout-horizontal">
+        <aside style="width: 220px">
+          <cy-tabs v-model="store.yjyc" tabPosition="left">
+            <cy-tab-pane label="检查" name="jc">
+              <JyJcTree
+                :treeData="props.treeData"
+                yjyc="jc"
+                @node-click="val => handleTreeClick(val, 3)"
+              />
+            </cy-tab-pane>
+            <cy-tab-pane label="检验" name="jy">
+              <JyJcTree
+                :treeData="props.treeData"
+                yjyc="jy"
+                @node-click="val => handleTreeClick(val, 2)"
+              />
+            </cy-tab-pane>
+          </cy-tabs>
+        </aside>
+        <div class="layout_main">
+          <div style="height: 20px">检验的标本需要搜索</div>
+          <el-table :data="store.reqTemplates" height="calc(100% - 20px)">
+            <el-table-column prop="orderCode" label="编码" />
+            <el-table-column prop="orderName" label="名称" />
+            <el-table-column label="执行科室">
+              <template #default="scope">
+                <SystemDeptSelect
+                  v-model="scope.row"
+                  value="execDept"
+                  label="execName"
+                />
+              </template>
+            </el-table-column>
+            <el-table-column label="部位/标本" width="120">
+              <template #default="scope">
+                <JcPartSelect
+                  v-if="scope.row.reqType === 3"
+                  v-model="scope.row"
+                  value="partOrSample"
+                  label="partOrSampleName"
+                  style="width: 100%"
+                  :code-type="scope.row.classes"
+                />
+                <JySampleSelect
+                  v-else
+                  v-model="scope.row"
+                  value="partOrSample"
+                  label="partOrSampleName"
+                  style="width: 100%"
+                />
+              </template>
+            </el-table-column>
+            <el-table-column label="类型">
+              <template #default="{ row }">
+                {{ row.reqType == "2" ? "检验" : "检查" }}
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </div>
+    </el-tab-pane>
+  </el-tabs>
+</template>
+
+<style lang="scss"></style>

+ 108 - 0
src/views/dictionary/diagnose-req-template/index.tsx

@@ -0,0 +1,108 @@
+import {
+  delTemplate,
+  getDiagnoseReqTemplateList,
+} from "@/api/dictionary/diagnoseToJyJcReq";
+import { isDev } from "@/utils/public";
+import { IPage } from "@/ts-type/Page";
+import { useDialog } from "@/components/cy/CyDialog/index";
+import {
+  getJyJcZdTree,
+  selectBuWeiAll,
+} from "@/api/zhu-yuan-yi-sheng/jian-yan-jian-cha-shen-qing";
+import XEUtils from "xe-utils";
+import { CyMessageBox } from "@/utils/cy-message-box";
+
+const AddTemplateDialog = defineAsyncComponent(
+  () => import("./AddTemplateDialog.vue")
+);
+
+export function useStore() {
+  function initPage() {
+    return {
+      total: 0,
+      pageSize: isDev ? 1 : 50,
+      currentPage: 1,
+    };
+  }
+
+  const store = reactive({
+    searchValue: "",
+    oldSearchParms: "",
+
+    page: initPage(),
+
+    templateData: {
+      records: [],
+      total: 0,
+    },
+
+    jyjcTree: {
+      yj: [],
+      jc: [],
+    },
+  });
+  const mutation = {
+    async handleSearch(id: string = null) {
+      store.page = initPage();
+      mutation.queryData(
+        id != null ? { searchId: id } : { searchValue: store.searchValue }
+      );
+    },
+    setTemplateData(data: IPage) {},
+    async queryData(params: { searchValue?: string; searchId?: string }) {
+      store.templateData = await getDiagnoseReqTemplateList({
+        ...params,
+        ...store.page,
+      }).catch(() => {
+        return {
+          records: [],
+          total: 0,
+        };
+      });
+      store.page.total = store.templateData.total;
+      store.oldSearchParms = store.searchValue;
+    },
+    handleChangeCurrent(value) {
+      store.page.currentPage = value;
+      mutation.queryData({ searchValue: store.oldSearchParms });
+    },
+    async handleOpenAddDialog(row) {
+      useDialog(AddTemplateDialog, {
+        dialogProps: {
+          fullscreen: true,
+          title: "编辑检验检查",
+        },
+        params: {
+          id: row.id,
+          treeData: await mutation.selectJyJcData(),
+        },
+      });
+    },
+    async delTemplate(id) {
+      await CyMessageBox({
+        // @ts-ignore
+        type: "delete",
+      });
+      await delTemplate(id);
+      mutation.handleSearch();
+    },
+    selectJyJcData: XEUtils.once(async () => {
+      return await getJyJcZdTree();
+    }),
+  };
+
+  onMounted(() => {
+    mutation.handleSearch();
+    // if (isDev) {
+    //   mutation.handleOpenAddDialog({
+    //     id: "977723963855669248",
+    //   });
+    // }
+  });
+
+  return { store, mutation };
+}
+
+export const key = "DiagnoseToJcJyReq";
+
+export type DiagnoseToJcJyReqTye = ReturnType<typeof useStore>;

+ 64 - 0
src/views/dictionary/diagnose-req-template/index.vue

@@ -0,0 +1,64 @@
+<script setup lang="ts">
+import { createTemplate } from "@/api/dictionary/diagnoseToJyJcReq";
+import { CyMessageBox } from "@/utils/cy-message-box";
+import { key, useStore } from "@/views/dictionary/diagnose-req-template/index";
+
+const root = useStore();
+
+provide(key, root);
+
+async function handleAddTemplate() {
+  const { value } = await CyMessageBox.prompt({
+    message: "请输入模板名称",
+    inputMaxLength: 50,
+  });
+
+  const id = await createTemplate(value);
+  await root.mutation.handleSearch(id);
+}
+</script>
+
+<template>
+  <div class="layout_container">
+    <header>
+      <el-input
+        v-model="root.store.searchValue"
+        clearable
+        style="width: 120px"
+      />
+      <el-button @click="root.mutation.handleSearch()">查询</el-button>
+      <el-button @click="handleAddTemplate">新增模板</el-button>
+    </header>
+    <div class="layout_main">
+      <div class="layout_main layout_container">
+        <el-table :data="root.store.templateData.records" style="flex: 1">
+          <el-table-column prop="name" label="名字" />
+          <el-table-column prop="createName" label="创建人" />
+          <el-table-column prop="createTime" label="创建时间" />
+          <el-table-column label="编辑" width="220">
+            <template #default="{ row }">
+              <el-button
+                @click="root.mutation.handleOpenAddDialog(row)"
+                type="primary"
+                >编辑
+              </el-button>
+              <el-button
+                @click="root.mutation.delTemplate(row.id)"
+                type="danger"
+              >
+                删除
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <el-pagination
+          style="padding-top: 8px"
+          :current-page="root.store.page.currentPage"
+          :page-size="root.store.page.pageSize"
+          :total="root.store.page.total"
+          @current-change="root.mutation.handleChangeCurrent"
+        />
+      </div>
+    </div>
+  </div>
+</template>

+ 3 - 2
src/views/hospitalization/zhu-yuan-yi-sheng/jian-cha-jian-yan-shen-qing/JianChaShenQing.vue

@@ -202,8 +202,9 @@ async function baoCunShuJu() {
 
   let data = XEUtils.clone(huanZheXinXi.value, true);
   data.list = jcList.value;
-  data.reqType = 3;
-
+  data.list.forEach(item => {
+    item.reqType = 3;
+  });
   const reqs = await baoCunJianYanJianCha(data);
   ElMessageBox.confirm("是否打印申请单", "提示", {
     type: "success",

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 204
vite.config.js.timestamp-1753838900549-325b163593b9.mjs


برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است