Sfoglia il codice sorgente

bug-717: 西医诊断有两个或以上时,未显示完整

张田田 4 giorni fa
parent
commit
c4831196e2

+ 152 - 115
src/views/business/SuitableTech.vue

@@ -290,77 +290,55 @@
               <span style="opacity:0">*</span>
               <div class="name">中医病名:</div>
               <div class="input">
-                <el-select
+                <el-autocomplete
                   size="mini"
-                  v-model="editData.chineseDisease"
+                  v-model="editData.chineseDiseaseName"
+                  :fetch-suggestions="queryDisease"
+                  value-key="disname"
                   placeholder="请搜索选择"
                   clearable
-                  filterable
-                  :loading="diseaseLoading"
-                  loading-text="搜索中..."
-                  :filter-method="searchDisease"
-                  @change="onDiseaseChange"
-                  @focus="searchDisease('')"
+                  :trigger-on-focus="true"
+                  @select="onDiseaseSelect"
+                  @clear="onDiseaseClear"
                 >
-                  <el-option
-                    v-for="(item, idx) in diseaseOptions"
-                    :key="idx"
-                    :label="item.disname"
-                    :value="String(item.disid)"
-                  ></el-option>
-                </el-select>
+                  <template slot-scope="{ item }">
+                    <div :class="{ 'autocomplete-disabled': item._disabled }">
+                      {{ item.disname }}
+                    </div>
+                  </template>
+                </el-autocomplete>
               </div>
             </div>
             <div class="form-item flex flex-col-center">
               <span style="opacity:0">*</span>
-              <div class="name">证型:</div>
+              <div class="name">共享至:</div>
               <div class="input">
                 <el-select
                   size="mini"
-                  v-model="editData.symptomid"
-                  placeholder="请搜索选择"
-                  clearable
-                  filterable
-                  :loading="symptomLoading"
-                  loading-text="搜索中..."
-                  :filter-method="searchSymptom"
-                  @change="onSymptomChange"
-                  @focus="searchSymptom('')"
+                  v-model="editData.showType"
+                  placeholder="请选择"
                 >
                   <el-option
-                    v-for="(item, idx) in symptomOptions"
-                    :key="idx"
-                    :label="item.symname"
-                    :value="String(item.symid)"
+                    v-for="opt in shareOptions"
+                    :key="opt.value"
+                    :label="opt.label"
+                    :value="opt.value"
                   ></el-option>
                 </el-select>
               </div>
             </div>
             <div class="form-item flex flex-col-center">
               <span style="opacity:0">*</span>
-              <div class="name">治法:</div>
+              <div class="name">处方出处:</div>
               <div class="input">
-                <el-select
+                <el-input
                   size="mini"
-                  v-model="editData.therapyCode"
-                  placeholder="请搜索选择"
-                  clearable
-                  filterable
-                  :loading="therapyLoading"
-                  loading-text="搜索中..."
-                  :filter-method="searchTherapy"
-                  @focus="searchTherapy('')"
-                >
-                  <el-option
-                    v-for="(item, idx) in therapyOptions"
-                    :key="idx"
-                    :label="item.therapy"
-                    :value="String(item.therapyCode)"
-                  ></el-option>
-                </el-select>
+                  v-model="editData.source"
+                  placeholder="请输入"
+                ></el-input>
               </div>
             </div>
-            <div class="form-item flex flex-col-center">
+            <div class="form-item flex flex-col-center form-item-half">
               <span style="opacity:0">*</span>
               <div class="name">西医诊断:</div>
               <div class="input">
@@ -371,12 +349,11 @@
                   clearable
                   filterable
                   multiple
-                  collapse-tags
+                  remote
+                  :remote-method="searchWesternDisease"
                   :loading="westernDiseaseLoading"
                   loading-text="搜索中..."
-                  :filter-method="searchWesternDisease"
                   @change="onWesternDiseaseChange"
-                  @focus="searchWesternDisease('')"
                   popper-class="western-disease-select"
                   @visible-change="onWesternDiseaseVisible"
                 >
@@ -389,7 +366,7 @@
                 </el-select>
               </div>
             </div>
-            <div class="form-item flex flex-col-center">
+            <div class="form-item flex flex-col-center form-item-half">
               <span style="opacity:0">*</span>
               <div class="name">功效与适应症:</div>
               <div class="input">
@@ -402,59 +379,77 @@
             </div>
             <div class="form-item flex flex-col-center">
               <span style="opacity:0">*</span>
-              <div class="name">共享至:</div>
+              <div class="name">证型:</div>
               <div class="input">
                 <el-select
                   size="mini"
-                  v-model="editData.showType"
-                  placeholder="请选择"
+                  v-model="editData.symptomid"
+                  placeholder="请搜索选择"
+                  clearable
+                  filterable
+                  :loading="symptomLoading"
+                  loading-text="搜索中..."
+                  :filter-method="searchSymptom"
+                  @change="onSymptomChange"
+                  @focus="searchSymptom('')"
                 >
                   <el-option
-                    v-for="opt in shareOptions"
-                    :key="opt.value"
-                    :label="opt.label"
-                    :value="opt.value"
+                    v-for="(item, idx) in symptomOptions"
+                    :key="idx"
+                    :label="item.symname"
+                    :value="String(item.symid)"
                   ></el-option>
                 </el-select>
               </div>
             </div>
             <div class="form-item flex flex-col-center">
               <span style="opacity:0">*</span>
-              <div class="name">处方出处:</div>
+              <div class="name">治法:</div>
               <div class="input">
-                <el-input
+                <el-select
                   size="mini"
-                  v-model="editData.source"
-                  placeholder="请输入"
-                ></el-input>
+                  v-model="editData.therapyCode"
+                  placeholder="请搜索选择"
+                  clearable
+                  filterable
+                  :loading="therapyLoading"
+                  loading-text="搜索中..."
+                  :filter-method="searchTherapy"
+                  @focus="searchTherapy('')"
+                >
+                  <el-option
+                    v-for="(item, idx) in therapyOptions"
+                    :key="idx"
+                    :label="item.therapy"
+                    :value="String(item.therapyCode)"
+                  ></el-option>
+                </el-select>
               </div>
             </div>
             <div class="form-item flex flex-col-center">
               <span style="opacity:0">*</span>
               <el-checkbox v-model="editData.isUnified" class="unified-checkbox">统建处方</el-checkbox>
             </div>
-            <template v-if="editData.isUnified">
-              <div class="form-item flex flex-col-center">
-                <div class="name"><span style="color: red">*</span> 医派:</div>
-                <div class="input">
-                  <el-input
-                    size="mini"
-                    v-model="editData.medicalSchool"
-                    placeholder="请输入"
-                  ></el-input>
-                </div>
+            <div class="form-item flex flex-col-center" v-if="editData.isUnified">
+              <div class="name"><span style="color: red">*</span> 医派:</div>
+              <div class="input">
+                <el-input
+                  size="mini"
+                  v-model="editData.medicalSchool"
+                  placeholder="请输入"
+                ></el-input>
               </div>
-              <div class="form-item flex flex-col-center">
-                <div class="name"><span style="color: red">*</span> 科室:</div>
-                <div class="input">
-                  <el-input
-                    size="mini"
-                    v-model="editData.department"
-                    placeholder="请输入"
-                  ></el-input>
-                </div>
+            </div>
+            <div class="form-item flex flex-col-center" v-if="editData.isUnified">
+              <div class="name"><span style="color: red">*</span> 科室:</div>
+              <div class="input">
+                <el-input
+                  size="mini"
+                  v-model="editData.department"
+                  placeholder="请输入"
+                ></el-input>
               </div>
-            </template>
+            </div>
           </div>
 
           <!-- 配穴表格 -->
@@ -703,34 +698,45 @@ export default {
       if (has(0)) options.push({ label: "个人", value: "0" });
       if (has(1) || has(2)) options.push({ label: "科室", value: "1" });
       if (has(3)) options.push({ label: "医疗机构", value: "2" });
-         console.log("共享选项", options);
       return options;
     },
+    defaultShareType() {
+      const options = this.shareOptions;
+      return options.length ? options[0].value : "0";
+    },
   },
   created() {
     this.getList();
   },
   methods: {
     // 中医病名搜索 
-    async searchDisease(query) {
-      this.diseaseLoading = true;
+    async queryDisease(queryString, cb) {
+      this._prevDiseaseInput = queryString;
       try {
         const { list } = await getDiseaseListMethod(1, 9999, {
-          keyword: query || "",
+          keyword: queryString || "",
         });
-        this.diseaseOptions = list || [];
+        if (list && list.length > 0) {
+          cb(list);
+        } else {
+          cb([{ disname: "暂无数据", _disabled: true }]);
+        }
       } catch (e) {
         console.error("搜索中医病名失败", e);
-      } finally {
-        this.diseaseLoading = false;
+        cb([{ disname: "搜索失败,请重试", _disabled: true }]);
       }
     },
-    onDiseaseChange(disid) {
-      const selected = this.diseaseOptions.find((item) => item.disid === disid);
-      if (selected) {
-        this.editData.chineseDiseaseName = selected.disname;
-        this.editData.disCode = selected.disCode;
+    onDiseaseSelect(item) {
+      if (item._disabled) {
+        // 恢复为点击前的输入文字
+        this.$nextTick(() => {
+          this.editData.chineseDiseaseName = this._prevDiseaseInput || "";
+        });
+        return;
       }
+      this.editData.chineseDisease = String(item.disid);
+      this.editData.chineseDiseaseName = item.disname;
+      this.editData.disCode = item.disCode || "";
       // 联动加载证型
       this.editData.symptomid = "";
       this.editData.symptomName = "";
@@ -739,9 +745,18 @@ export default {
       this.editData.therapyCode = "";
       this.editData.therapyName = "";
       this.therapyOptions = [];
-      if (disid) {
-        this.searchSymptom("");
-      }
+      this.searchSymptom("");
+    },
+    onDiseaseClear() {
+      this.editData.chineseDisease = "";
+      this.editData.chineseDiseaseName = "";
+      this.editData.disCode = "";
+      this.editData.symptomid = "";
+      this.editData.symptomName = "";
+      this.symptomOptions = [];
+      this.editData.therapyCode = "";
+      this.editData.therapyName = "";
+      this.therapyOptions = [];
     },
     // 证型变更联动
     onSymptomChange(symid) {
@@ -865,22 +880,34 @@ export default {
       }
     },
     onWesternDiseaseVisible(show) {
-      const wrap = document.querySelector(
-        ".western-disease-select .el-scrollbar__wrap",
-      );
-      if (!wrap) return;
-      if (show) {
-        wrap.addEventListener(
-          "scroll",
-          (this._wdScroll = () => {
-            if (wrap.scrollHeight - wrap.scrollTop <= wrap.clientHeight + 5) {
-              this.loadMoreWesternDisease();
-            }
-          }),
+      if (!show) {
+        const wrap = document.querySelector(
+          ".western-disease-select .el-scrollbar__wrap",
         );
-      } else {
-        wrap.removeEventListener("scroll", this._wdScroll);
+        if (wrap && this._wdScroll) {
+          wrap.removeEventListener("scroll", this._wdScroll);
+        }
+        return;
+      }
+      // 首次打开且无数据时加载初始列表
+      if (this.westernDiseaseOptions.length === 0) {
+        this.searchWesternDisease("");
       }
+      this.$nextTick(() => {
+        const wrap = document.querySelector(
+          ".western-disease-select .el-scrollbar__wrap",
+        );
+        if (wrap) {
+          wrap.addEventListener(
+            "scroll",
+            (this._wdScroll = () => {
+              if (wrap.scrollHeight - wrap.scrollTop <= wrap.clientHeight + 5) {
+                this.loadMoreWesternDisease();
+              }
+            }),
+          );
+        }
+      });
     },
     onWesternDiseaseChange(codes) {
       const names = codes
@@ -1053,7 +1080,7 @@ export default {
 
         this.editData = {
           ...detail,
-          showType: detail.showType || "0",
+          showType: String(detail.showType ?? "0"),
           efficacy: detail.effect || "",
           source: detail.provenance || "",
           isUnified: String(detail.purposeType) === "1",
@@ -1099,7 +1126,7 @@ export default {
           westernDisease: [],
           westernDiseaseName: "",
           efficacy: "",
-          showType: "0",
+          showType: this.defaultShareType,
           source: "",
           isUnified: false,
           medicalSchool: "",
@@ -1228,6 +1255,7 @@ export default {
           const data = res.Data || {};
           this.viewData = {
             ...data,
+            showType: String(data.showType ?? "0"),
             isUnifiedChecked: data.purposeType || "0",
           };
         }
@@ -1446,6 +1474,10 @@ export default {
     padding: 0 10px;
     margin-bottom: 10px;
 
+    &.form-item-half {
+      width: 50%;
+    }
+
     .name {
       width: 110px;
       min-width: 110px;
@@ -1486,6 +1518,11 @@ export default {
   min-height: 0;
 }
 
+.autocomplete-disabled {
+  color: #999 !important;
+  cursor: not-allowed !important;
+}
+
 .dialog-scroll-area ::v-deep .recipe-acupoint {
   flex: 1;
   min-height: 0;

+ 17 - 3
src/views/business/components/AcupointTable.vue

@@ -16,7 +16,9 @@
         :key="index"
         @click="switchTab(index)"
       >
-        <span class="tab-name">{{ item.itemName }}</span>
+        <el-tooltip :content="item.itemName" placement="top" :open-delay="300">
+          <span class="tab-name">{{ item.itemName }}</span>
+        </el-tooltip>
         <span class="tab-close" @click.stop="removePrescription(index)">×</span>
       </div>
     </div>
@@ -80,7 +82,7 @@
         </div>
       </div>
       <div class="add-dialog-btns">
-        <div class="confirm-btn" @click="confirmAdd()">确定</div>
+        <div class="confirm-btn" :class="{ 'is-disabled': addLoading }" @click="confirmAdd()">确定</div>
       </div>
     </el-dialog>
 
@@ -715,6 +717,7 @@ export default {
         itemName: "",
         detailRequired: false,
       },
+      addLoading: false,
       prescriptions: [],
       // 详情弹窗
       showDetailDialog: false,
@@ -941,6 +944,7 @@ export default {
       }
     },
     async confirmAdd() {
+      if (this.addLoading) return;
       if (!this.addForm.itemId) {
         this.$message.warning("请选择项目名称");
         return;
@@ -955,6 +959,7 @@ export default {
         return;
       }
 
+      this.addLoading = true;
       // 调用详情接口获取项目完整信息
       let detailData = {};
       try {
@@ -1027,6 +1032,7 @@ export default {
       this.loadTabData(newIndex);
 
       this.showAddDialog = false;
+      this.addLoading = false;
       this.$emit("prescriptions-change", this.prescriptions);
     },
     removePrescription(index) {
@@ -1676,12 +1682,15 @@ export default {
   display: flex;
   margin-bottom: 10px;
   flex-shrink: 0;
+  overflow-x: auto;
+  white-space: nowrap;
 
   .tab-item {
     position: relative;
     display: flex;
     align-items: center;
     padding: 8px 20px;
+    flex-shrink: 0;
     font-size: 14px;
     color: #666;
     background: #f5f7fa;
@@ -1714,7 +1723,7 @@ export default {
     }
 
     .tab-name {
-      max-width: 120px;
+      max-width: 200px;
       overflow: hidden;
       text-overflow: ellipsis;
       white-space: nowrap;
@@ -2010,6 +2019,11 @@ export default {
       border-radius: 3px;
       font-size: 18px;
       cursor: pointer;
+
+      &.is-disabled {
+        opacity: 0.6;
+        cursor: not-allowed;
+      }
     }
   }
 }

+ 1 - 0
vue.config.js

@@ -19,6 +19,7 @@ module.exports = {
                 // target: `https://wx.hzliuzhi.com:4433/fz/`, // [测试] 测试环境的后端
                 // target: `https://tcm2.hzliuzhi.com/`, // @six 演示环境 2.0
                  target: `https://tcm.hzliuzhi.com/kd`, // @six kd演示环境
+                // target: `http://192.168.1.5:8091/`,
                 // target: `https://tcm.hzliuzhi.com/`, // @six 演示环境
                 // target: `http://www.hzxunmai.com/`, // 正式域名
                 // target: `http://10.250.11.48:8080/`, // 正式域名