qx
qx
2025-02-14 32472073d74347c90928f3eaea52fb8c5fda9fdc
src/views/system/tijian/index.vue
@@ -303,14 +303,9 @@
          </div>
        </el-tab-pane>
        <el-tab-pane label="组合" name="third">
          <!-- <div class="tab3"> -->
          <el-row :gutter="20" style="width: 100%">
            <el-col :span="6">
              <div style="
                  text-align: center;
                  margin-bottom: 10px;
                  margin-top: 10px;
                ">
            <el-col :span="6" style="min-width: 200px">
              <div style="text-align: center; margin-bottom: 10px; margin-top: 10px;">
                项目列表
              </div>
              <el-input placeholder="输入关键字进行过滤" v-model="filterage">
@@ -322,12 +317,8 @@
                </el-tree>
              </div>
            </el-col>
            <el-col :span="6">
              <div style="
                  text-align: center;
                  margin-bottom: 10px;
                  margin-top: 10px;
                ">
            <el-col :span="6" style="min-width: 200px">
              <div style="text-align: center; margin-bottom: 10px; margin-top: 10px;">
                明细项目列表
              </div>
              <div class="tab3">
@@ -345,13 +336,16 @@
                    margin-top: 10px;
                  ">
                  已选项目列表
                </div>
                <el-table :data="DataLists" border style="width: 100%" height="400" :span-method="objectspanmethod">
                  <el-table-column prop="propinName" label="检查项目">
                  </el-table-column>
                  <el-table-column prop="proName" label="明细项目" width="260px">
                  </el-table-column>
                  <el-table-column prop="sl" label="数量" width="56px">
                  </el-table-column>
                  <el-table-column prop="proPrice" label="原价" width="56px">
                  </el-table-column>
@@ -368,84 +362,60 @@
              </div>
            </el-col>
          </el-row>
          <!-- </div> -->
        </el-tab-pane>
        <el-tab-pane label="单项" name="second">
          <div class="tab8">
            <el-row :gutter="20">
              <el-col :span="6">
                <div style="
                    text-align: center;
                    margin-bottom: 10px;
                    margin-top: 10px;
                  ">
                  项目列表
          <el-row :gutter="20" style="width: 100%">
            <el-col :span="6" style="min-width: 200px">
              <div style="text-align: center; margin-bottom: 10px; margin-top: 10px;">
                项目列表
              </div>
              <el-input placeholder="输入关键字进行过滤" v-model="filterText" style="margin-bottom: 10px;">
              </el-input>
              <div class="tab3">
                <el-tree class="filter-tree" v-loading="loading" :data="Treedata" :props="defaultProps" show-checkbox
                  node-key="proId" @check="handleCurrentChecked" :default-checked-keys="checkedkey"
                  :filter-node-method="filterNode" ref="tree" :render-content="renderContent">
                </el-tree>
              </div>
            </el-col>
            <el-col :span="6" style="min-width: 200px">
              <div style="text-align: center; margin-bottom: 10px; margin-top: 10px;">
                明细项目列表
              </div>
              <div class="tab3">
                <el-tree class="filter-tree" v-loading="loading" :data="TreedataList" node-key="proId"
                  :props="defaultProps" :filter-node-method="filterNode" show-checkbox
                  @check-change="handleCurrentChecked1" :default-checked-keys="checkedListkey"
                  :render-content="renderContent">
                </el-tree>
              </div>
            </el-col>
            <el-col :span="11">
              <div class="grid-content bg-purple">
                <div style="text-align: center; margin-bottom: 10px; margin-top: 10px;">
                  已选项目列表
                </div>
                <!-- @input="gaibian" -->
                <el-input placeholder="输入关键字进行过滤" v-model="filterText">
                </el-input>
                <div class="tab3">
                  <el-tree class="filter-tree" v-loading="loading" :data="Treedata" :props="defaultProps" show-checkbox
                    node-key="proId" @check="handleCurrentChecked" :default-checked-keys="checkedkey"
                    :filter-node-method="filterNode" ref="tree" :render-content="renderContent">
                  </el-tree>
                </div>
              </el-col>
              <el-col :span="6">
                <div style="
                    text-align: center;
                    margin-bottom: 10px;
                    margin-top: 10px;
                  ">
                  明细项目列表
                </div>
                <div class="tab3">
                  <el-tree class="filter-tree" v-loading="loading" :data="TreedataList" node-key="proId"
                    :props="defaultProps" :filter-node-method="filterNode" show-checkbox
                    @check-change="handleCurrentChecked1" :default-checked-keys="checkedListkey"
                    :render-content="renderContent">
                  </el-tree>
                </div>
              </el-col>
              <el-col :span="11">
                <div class="grid-content bg-purple">
                  <div style="
                      text-align: center;
                      margin-bottom: 10px;
                      margin-top: 10px;
                    ">
                    已选项目列表
                  </div>
                  <el-table :data="DataList" border style="width: 100%" height="400" :span-method="objectSpanMethod">
                    <el-table-column prop="propinName" label="检查项目">
                    </el-table-column>
                    <el-table-column prop="sl" label="数量" width="56px">
                    </el-table-column>
                    <el-table-column
                      prop="proPrice"
                      label="原价"
                      width="56px"
                    ></el-table-column>
                    <el-table-column
                      prop="proName"
                      label="明细项目"
                      width="260px"
                    >
                    </el-table-column>
                    <el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width"
                      width="50px">
                      <template slot-scope="scope">
                        <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
                          title="删除"></el-button>
                      </template>
                    </el-table-column>
                  </el-table>
                  <h3 style="font-weight: 600">合计:{{ marryall }}元</h3>
                </div>
              </el-col>
            </el-row>
          </div>
                <el-table :data="DataList" border style="width: 100%" height="400" :span-method="objectSpanMethod">
                  <el-table-column prop="propinName" label="检查项目">
                  </el-table-column>
                  <el-table-column prop="proName" label="明细项目" width="260px">
                  </el-table-column>
                  <el-table-column prop="sl" label="数量" width="56px">
                  </el-table-column>
                  <el-table-column prop="proPrice" label="原价" width="56px">
                  </el-table-column>
                  <el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width"
                    width="50px">
                    <template slot-scope="scope">
                      <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
                        title="删除"></el-button>
                    </template>
                  </el-table-column>
                </el-table>
                <h3 style="font-weight: 600">合计:{{ marryall }}元</h3>
              </div>
            </el-col>
          </el-row>
        </el-tab-pane>
      </el-tabs>
      <span slot="footer" class="dialog-footer">
@@ -485,7 +455,7 @@
              <el-form-item label="体检类型">
                <el-select v-model="form.tjType" placeholder="请选择体检类型">
                  <el-option v-for="dict in dict.type.dict_team" :key="dict.value" :label="dict.label"
                    :value="dict.value" :disabled="!form.firmId && dict.value === '1'"></el-option>
                    :value="dict.value"></el-option>
                </el-select>
              </el-form-item>
              <el-form-item label="体检类别">
@@ -513,8 +483,8 @@
              <el-form-item style="margin-left: 149px">
                <el-button type="primary" @click="Package" size="mini" style="margin-right: 20px">选择套餐</el-button>
                <el-button type="primary" @click="resetpackage" size="mini" style="margin-right: 20px">重置套餐</el-button>
                <el-button type="primary" @click="submitPrice" :loading="loadingSubmit"
                  :disabled="confirm || loadingSubmit" v-if="showHidden.has_charge == 'N'" size="mini">签到登记</el-button>
                <el-button type="primary" @click="submitPrice" :loading="loadingSubmit" :disabled="loadingSubmit"
                  v-if="showHidden.has_charge == 'N'" size="mini">签到登记</el-button>
                <el-button type="primary" @click="submitCheckinfee" :disabled="confirm"
                  v-if="showHidden.has_charge == 'Y'" size="mini">登记收费</el-button>
              </el-form-item>
@@ -588,8 +558,9 @@
              <el-table-column label="折扣">
                <template slot-scope="scope">
                  <!-- 只输入纯数字折扣 -->
                  <el-input-number v-model.number="scope.row.discount" @input="validateDiscount(scope.row)"  @change="handleManualChange(scope.row)"
                    placeholder="输入折扣" size="small" type="number" :precision="1" :step="0.1" :max="10" :min="0">
                  <el-input-number v-model.number="scope.row.discount" @input="validateDiscount(scope.row)"
                    @change="handleManualChange(scope.row)" placeholder="输入折扣" size="small" type="number" :precision="1"
                    :step="0.1" :max="10" :min="0">
                  </el-input-number>
                </template>
              </el-table-column>
@@ -1081,6 +1052,7 @@
    };
  },
  watch: {
    filterText(val) {
      this.$refs.tree.filter(val);
    },
@@ -1097,8 +1069,11 @@
    // this.getData();
  },
  mounted() { },
  mounted() {
    this.TreedataList = [];
    this.DataList = [];
    this.marryall = 0;
  },
  methods: {
    debounceNumberChange(currentValue, oldValue) {
      clearTimeout(this.debounceTimer);
@@ -1654,6 +1629,10 @@
        });
    },
    numberChangeXianPrice(currentValue, oldValue) {
      // 如果现价没有变化,直接返回
      if (this.TotalPrice === this.lastXianPrice || !this.TotalPrice) {
        return;
      }
      this.$confirm("确定修改所有子项的折扣吗?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
@@ -1692,6 +1671,7 @@
              );
            }
          }
          this.lastXianPrice = this.TotalPrice;
        })
        .catch(() => {
          this.discount = oldValue;
@@ -1840,6 +1820,7 @@
        let configKey = "getInfoFromSqlData";
        getconfigKey(configKey).then((res) => {
          if (res.code == 200) {
            console.log(res.msg, 'res.msg');
            if (res.msg == "N") {
              var websocket = null;
              var url = this.valueUrl;
@@ -1879,16 +1860,16 @@
              //接收到消息的回调方法
              websocket.onmessage = (event) => {
                var resultObj = eval("(" + event.data + ")");
                var resultObj = eval("(" + event.data + ")");  // 注意:eval存在安全隐患,建议用JSON.parse
                this.readCardWebSocket(resultObj);
              };
              websocket.onclose = function () {
                alert("读卡器连接关闭");
              };
            } else if (res.msg == "Y") {
              this.$refs.aaa.open = true;
              /* this.$refs.aaa.open = true;
              this.$refs.aaa.getAllList();
              this.$refs.aaa.title = "证件字典";
              this.$refs.aaa.title = "证件字典"; */
            } else if (res.msg == "S") {
              this.cardreader = true;
              _this.cardreaderradio = 3;
@@ -1902,8 +1883,8 @@
    // 最新使用webSocket通信
    readCardWebSocket(resultObj) {
      let _this = this;
      if (resultObj.code === 200 && resultObj.data.name != null) {
      console.log(resultObj, 'resultObj');
      if (resultObj.code === 200 && resultObj.data.name && resultObj.data.name != null) {
        //回显相关数据
        _this.form.cusName = resultObj.data.name;
        _this.form.cusSex = resultObj.data.sex == "0" ? "女" : "男";
@@ -2047,9 +2028,9 @@
            }
          }
        };
        websocket.onclose = function () {
          alert("读卡器连接关闭");
        };
        // websocket.onclose = function () {
        //   alert("读卡器连接关闭");
        // };
        websocket.onmessage = function (event) {
          var resultObj = JSON.parse(event.data);
          _this.form.cusName = resultObj.data.name;
@@ -2141,9 +2122,9 @@
            }
          }
        };
        websocket.onclose = function () {
          alert("读卡器连接关闭");
        };
        // websocket.onclose = function () {
        //   alert("读卡器连接关闭");
        // };
        websocket.onmessage = function (event) {
          var resultObj = JSON.parse(event.data);
          _this.form.cusName = resultObj.data.name;
@@ -2230,11 +2211,15 @@
    // 取消按钮
    cancel() {
      this.TreedataList = [];
      this.DataList = [];
      this.marryall = 0; // 重置合计
      this.Seachopen = false;
      this.taocan = false;
      this.malldisble = false;
      this.defaultKeys = [];
      this.DataLists = [];
    },
    cancell() {
@@ -2288,8 +2273,7 @@
      this.DataList = []; // 清空已选项目列表
      this.checkedkey = []; // 清空树的选中状态
      this.checkedListkey = [];
      this.TreedataList = [];
      this.$refs.tree.setCheckedKeys([]); // 重置树选中状态
      this.TreedataList = []
      let data = {
        cusId,
@@ -2327,12 +2311,37 @@
        dwId: this.form.firmId || "",
      };
      if (this.form.tjType == 1) {
        if (!this.form.firmId) {
        if (!this.form.firmId && !this.form.firmName) {
          this.$message({
            type: "warning",
            message: "请先维护单位!",
          });
        } else {
        } else if (!this.form.firmId && this.form.firmName) {
          this.taocan = true;
          this.loading = true;
          deptTreeSelect(cusSex).then((response) => {
            this.newpacName = response.rows;
            try {
              if (this.tableData1.length >= 1) {
                this.newpacName.forEach((item3) => {
                  this.tableData1.forEach((item4) => {
                    item4.list.forEach((item6) => {
                      if (item6.pacName === item3.pacName) {
                        this.$nextTick(() => {
                          this.$refs.tb.toggleRowSelection(item3, true);
                        });
                        throw Error();
                      }
                    });
                  });
                });
              }
            } catch (error) { }
            this.loading = false;
          });
        }
        else {
          this.taocan = true;
          this.loading = true;
          tuantiSelect(param).then((res) => {
@@ -2468,10 +2477,14 @@
      if (this.activeNames == "second") {
        this.DataList = [];
        this.checkedkey = [];
        this.TreedataList = [];
        this.marryall = 0; // 重置合计
        this.getDataList();
      } else if (this.activeNames == "third") {
        this.DataLists = [];
        this.checkedkeys = [];
        this.TreedataList = [];
        this.marryall = 0; // 重置合计
        getZhList().then((response) => {
          if (response.data) {
            this.packageList = response.data;
@@ -2491,6 +2504,16 @@
      getProParentIdDxList().then((response) => {
        this.Treedata = response.data.list;
        // 回显 TreedataList 到 DataList
        if (this.TreedataList && this.TreedataList.length > 0) {
          this.DataList = this.TreedataList;
          this.marryall = this.DataList.reduce((sum, item) => sum + (item.proPrice || 0) * (item.sl || 1), 0);
          this.checkedListkey = this.DataList.map(item => item.proId);
          this.$nextTick(() => {
            this.$refs.tree.setCheckedKeys(this.checkedListkey);
          });
        }
        if (this.tableData[0]) {
          this.tableData[0].tjProjectList.forEach((selectionitem) => {
            this.Treedata.forEach((item) => {
@@ -2500,8 +2523,63 @@
            });
          });
        }
        // 回显 packageList 的选中态
        this.handlePackageSelection();
        this.loading = false;
      });
    },
    handlePackageSelection() {
      // 假设你有之前保存的选中状态或从某个地方获取这些数据
      let selectedPackageIds = this.getPreviouslySelectedPackages(); // 这是一个假设的函数,实际使用时替换为实际的逻辑
      // 设置 packageList 的选中状态
      this.$nextTick(() => {
        if (this.$refs.treas) { // 确保 treas 引用已经存在
          this.$refs.treas.setCheckedKeys(selectedPackageIds, true);
        }
        // 更新 checkedkeys 以反映当前选中的包
        this.checkedkeys = selectedPackageIds;
      });
      // 根据选中状态更新 DataLists 或其他需要更新的内容
      this.updateDataListsBasedOnSelection(selectedPackageIds);
    },
    getPreviouslySelectedPackages() {
      // 返回之前保存的选中包ID数组
      // 例如,从 localStorage 或者 Vuex store 获取
      return []; // 这里是示例,替换为实际获取数据的逻辑
    },
    updateDataListsBasedOnSelection(selectedPackageIds) {
      // 根据选中的包ID更新 DataLists
      this.DataLists = [];
      selectedPackageIds.forEach(id => {
        let packageItem = this.packageList.find(item => item.id === id);
        if (packageItem) {
          // 这里假设每个包项目都有一个 proId 数组或者类似的结构,用来获取包中的项目
          if (packageItem.proIds) { // 假设 packageItem 包含一个 proId 数组
            packageItem.proIds.forEach(proId => {
              let project = this.findProjectById(proId); // 假设有一个函数来找到项目
              if (project) {
                this.DataLists.push(project);
              }
            });
          }
        }
      });
      // 计算合计
      this.marryalls = this.DataLists.reduce((sum, item) => sum + item.proPrice, 0);
    },
    findProjectById(proId) {
      // 此函数假设你有一个全局的项目列表或者可以从某个API获取
      // 这里只是一个示例,实际应用中应该根据你的数据结构来实现
      return this.allpackageList.find(item => item.proId === proId) || null;
    },
    handlepackage(data, checked, checkedNodes) {
@@ -2531,7 +2609,7 @@
                if (this.DataLists.length >= 1) {
                  this.marryalls = 0;
                  this.DataLists.forEach((item1) => {
                    this.marryalls += item1.proPrice;
                    this.marryalls += item1.proPrice * item1.sl;
                    this.packagedataList.forEach((item3) => {
                      if (item1.proParentId == item3.proId) {
@@ -2569,16 +2647,6 @@
          }
        }
      }
      // if (columnIndex == 3) {
      //   let rowspan = 0;
      //   this.DataLists.forEach((element) => {
      //     if (element.propinName === row.propinName) {
      //       rowspan++;
      //     }
      //   });
      //   return [rowspan, 1];
      // }
    },
    handlePackageChecked(data, checked, checkedNodes) {
      if (checked == false) {
@@ -2605,32 +2673,36 @@
        });
      }
    },
    // 点击获取每个树节点
    handleCurrentChecked(data, checked, checkedNodes) {
      this.dataObj = data;
      if (checked.checkedNodes.length != 0) {
        this.$refs.tree.setCheckedKeys([data.proId]);
      if (checked.checkedNodes.length > 0) {
        const promises = checked.checkedNodes.map(node => getProSonDxList(node.proId));
        Promise.all(promises).then(results => {
          this.TreedataList = results.flatMap(res => res.data.list);
          this.checkedListkey = [];
          this.DataList = [];
        let proId = data.proId;
        getProSonDxList(proId).then((res) => {
          this.TreedataList = res.data.list;
          this.TreedataList.forEach((item) => {
            this.checkedListkey.push(item.proId);
            this.DataList.push(item);
            this.spliceData();
            this.DataList.forEach((item1) => {
              if (item1.proParentId == data.proId) {
                item1.propinName = data.proName;
              }
            });
          });
          this.spliceData(); // 假设这个方法是你定义的其他地方处理数据的
          // 更新名称和计算总价
          this.DataList.forEach((item1) => {
            const parent = checked.checkedNodes.find(node => node.proId === item1.proParentId);
            if (parent) {
              item1.propinName = parent.proName;
            }
          });
          this.TotalPrice1 = 0;
          this.marryall = 0;
          if (this.DataList.length != 0) {
            this.list1 = false;
            this.DataList.forEach((item) => {
              this.marryall = item.proPrice * item.sl;
              this.marryall += Number(item.proPrice) * Number(item.sl);
            });
          }
        });
@@ -2785,9 +2857,8 @@
        pacId: _this.pacId,
        proIds: this.proIds,
      };
      // 根据体检类型选择不同的处理方法
      if (this.form.tjType == 1) {
      if (this.form.firmId) {
        tuantiqueren(data).then((response) => {
          if (response.code == 200) {
            this.processOrderItems(cusId);
@@ -3098,8 +3169,8 @@
    // 最后提交按钮
    submitPrice() {
      let _this = this;
      this.loadingSubmit = true;
      if (_this.tjCategory !== "") {
        this.loadingSubmit = true;
        let List = _this.tableData1; //单个项目信息
        if (this.responseList.cusId) {
          var userId = this.responseList.cusId;
@@ -3149,8 +3220,9 @@
            cusIdCard: item.cusId,
          })); // 创建新的对象,包含 discount 和 id
        gaibianzhekou(newArray).then((res) => {
          this.loadingSubmit = false;
          if (res.code === 200) {
            this.loadingSubmit = false;
            let data;
            if (pacId || this.tjOrderList.length > 0) {
@@ -3182,6 +3254,7 @@
              };
              this.listgetOrder(data);
            } else {
              this.loadingSubmit = false;
              this.$message({
                type: "warning ",
                message: "请选择套餐!",
@@ -3251,11 +3324,8 @@
}
.filter-tree {
  /* max-height: 360px;
  overflow-y: auto;
  border: 1px solid #d9d9d9; */
  overflow: auto;
  flex: 1;
  overflow-y: auto; /* 保留纵向滚动条 */
  overflow-x: hidden; /* 隐藏横向滚动条 */
  height: 350px;
}
@@ -3366,4 +3436,16 @@
  width: 100%;
  display: flex;
}
/* .tab3 {
  overflow-y: auto;
}
.tab3::-webkit-scrollbar {
  width: 0px;
  background: transparent;
}
.tab3::-webkit-scrollbar-thumb {
  background: transparent;
} */
</style>