qx
6 天以前 955a8eeb4a139783dea7ce656026e7916b0b4801
src/views/reservation/reservations/index.vue
@@ -99,81 +99,126 @@
      v-show="showSearch"
      label-width="68px"
    >
      <el-form-item label="姓名" prop="name">
        <el-input
          style="width: 120px"
          v-model="queryParams.name"
          placeholder="请输入姓名"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item label="身份证号" prop="idCard">
        <el-input
          v-model="queryParams.idCard"
          placeholder="请输入身份证号"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item label="联系电话" prop="phoe">
        <el-input
          v-model="queryParams.phoe"
          placeholder="请输入联系电话"
          clearable
          @keyup.enter.native="handleQuery"
          style="width: 140px"
        />
      </el-form-item>
      <el-form-item label="单位名称" prop="company">
        <el-select
          :remote-method="getRemoteData"
          v-model="queryParams.company"
          remote
          default-first-option
          allow-create
          filterable
          style="width: 200px"
          placeholder="请选择单位名称"
          clearable
          @change="idFn1"
        >
          <el-option
            v-for="dict in CompanyList"
            :key="dict.cnName"
            :label="dict.cnName"
            :value="dict.drugManufacturerId"
          />
        </el-select>
        <i class="el-icon-circle-plus-outline" @click="handleAdd1"></i>
      </el-form-item>
      <el-form-item label="预约超期" prop="isExpire">
        <el-select
          v-model="queryParams.isExpire"
          placeholder="请选择是否超期"
          clearable
          style="width: 140px"
        >
          <el-option
            v-for="dict in options"
            :key="dict.value"
            :label="dict.label"
            :value="dict.value"
          />
        </el-select>
      </el-form-item>
      <el-form-item>
        <el-button
          type="primary"
          icon="el-icon-search"
          size="mini"
          @click="handleQuery"
          >搜索</el-button
        >
        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
          >重置</el-button
        >
      </el-form-item>
      <el-row>
        <el-col>
          <el-form-item label="姓名" prop="name">
            <el-input
              style="width: 120px"
              v-model="queryParams.name"
              placeholder="请输入姓名"
              clearable
              @keyup.enter.native="handleQuery"
            />
          </el-form-item>
          <el-form-item label="身份证号" prop="idCard">
            <el-input
              v-model="queryParams.idCard"
              placeholder="请输入身份证号"
              clearable
              @keyup.enter.native="handleQuery"
            />
          </el-form-item>
          <el-form-item label="单位名称" prop="company">
            <el-select
              :remote-method="getRemoteData"
              v-model="queryParams.company"
              remote
              default-first-option
              allow-create
              filterable
              style="width: 200px"
              placeholder="请选择单位名称"
              clearable
              @change="idFn1"
            >
              <el-option
                v-for="dict in CompanyList"
                :key="dict.cnName"
                :label="dict.cnName"
                :value="dict.drugManufacturerId"
              />
            </el-select>
            <i class="el-icon-circle-plus-outline" @click="handleAdd1"></i>
          </el-form-item>
           <el-form-item label="套餐名称" prop="dwDeptName">
            <el-select v-model="queryParams.dwDeptName" placeholder="请选择套餐名称" clearable style="width: 100%"
              @change="idFn2">
              <el-option v-for="dict in deptList" :key="dict.id" :label="dict.dwDeptName" :value="dict.id" />
            </el-select>
          </el-form-item>
          <el-form-item label="分组名称" prop="groupingName">
            <el-select v-model="queryParams.groupingName" placeholder="请选择分组名称" clearable style="width: 100%">
              <el-option v-for="dict in groupingList" :key="dict.id" :label="dict.pacName" :value="dict.id" />
            </el-select>
          </el-form-item>
          <el-form-item label="预约时间">
            <el-date-picker
              clearable
              v-model="createTimeList"
              @change="dateChangebirthday2"
              type="daterange"
              range-separator="-"
              start-placeholder="开始日期"
              end-placeholder="结束日期"
              :picker-options="pickerOptions"
              value-format="yyyy-MM-dd"
              placeholder="请选择出预约时间"
              style="width: 300px"
            >
            </el-date-picker>
          </el-form-item>
        </el-col>
        <el-col>
          <el-form-item label="联系电话" prop="phoe">
            <el-input
              v-model="queryParams.phoe"
              placeholder="请输入联系电话"
              clearable
              @keyup.enter.native="handleQuery"
              style="width: 140px"
            />
          </el-form-item>
          <el-form-item label="所在地" prop="szd">
            <el-input
              style="width: 120px"
              v-model="queryParams.szd"
              placeholder="请输入所在地"
              clearable
              @keyup.enter.native="handleQuery"
            />
          </el-form-item>
          <el-form-item label="预约超期" prop="isExpire">
            <el-select
              v-model="queryParams.isExpire"
              placeholder="请选择是否超期"
              clearable
              style="width: 140px"
            >
              <el-option
                v-for="dict in options"
                :key="dict.value"
                :label="dict.label"
                :value="dict.value"
              />
            </el-select>
          </el-form-item>
          <el-form-item>
            <el-button
              type="primary"
              icon="el-icon-search"
              size="mini"
              @click="handleQuery"
              >搜索</el-button
            >
            <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
              >重置</el-button
            >
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
    <el-row :gutter="10" style="margin: 10px 15px">
      <el-col :span="1.5">
@@ -194,6 +239,16 @@
          :disabled="single"
          @click="receipt"
          >补打小票</el-button
        >
        <!-- v-hasPermi="['reservation:reservation:remove']" -->
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="primary"
          size="mini"
          :disabled="multiple"
          @click="Groupsignin"
          >团体签到</el-button
        >
        <!-- v-hasPermi="['reservation:reservation:remove']" -->
      </el-col>
@@ -285,7 +340,7 @@
          <span>{{ parseTime(scope.row.reservationTime, "{y}-{m}-{d}") }}</span>
        </template>
      </el-table-column>
      <el-table-column
      <!-- <el-table-column
        label="体检类型"
        align="center"
        prop="tjType"
@@ -295,7 +350,7 @@
        <template slot-scope="scope">
          <dict-tag :options="dict.type.dict_team" :value="scope.row.tjType" />
        </template>
      </el-table-column>
      </el-table-column> -->
      <el-table-column
        label="婚姻"
        align="center"
@@ -344,10 +399,24 @@
        prop="company"
        :show-overflow-tooltip="true"
      />
      <el-table-column
      <!-- <el-table-column
        label="邮箱"
        align="center"
        prop="email"
        :show-overflow-tooltip="true"
        width="160px"
      /> -->
      <el-table-column
        label="套餐名称"
        align="center"
        prop="tcmc"
        :show-overflow-tooltip="true"
        width="160px"
      />
      <el-table-column
        label="分组名称"
        align="center"
        prop="fzmc"
        :show-overflow-tooltip="true"
        width="160px"
      />
@@ -355,6 +424,13 @@
        label="地址"
        align="center"
        prop="address"
        :show-overflow-tooltip="true"
        width="160px"
      />
      <el-table-column
        label="所在地"
        align="center"
        prop="szd"
        :show-overflow-tooltip="true"
        width="160px"
      />
@@ -847,9 +923,19 @@
                  "
                >
                  <el-table :data="tableData1" border style="width: 100%">
                    <el-table-column prop="proName" label="项目" width="180" align="center">
                    <el-table-column
                      prop="proName"
                      label="项目"
                      width="180"
                      align="center"
                    >
                    </el-table-column>
                    <el-table-column prop="proType" label="性别" width="50" align="center">
                    <el-table-column
                      prop="proType"
                      label="性别"
                      width="50"
                      align="center"
                    >
                      <template slot-scope="scope">
                        <template v-if="isAll(scope.row.proType)">
                          全部
@@ -863,7 +949,11 @@
                      </template>
                    </el-table-column>
                    <el-table-column prop="ordPrice" label="应收金额" align="center">
                    <el-table-column
                      prop="ordPrice"
                      label="应收金额"
                      align="center"
                    >
                    </el-table-column>
                    <el-table-column label="折扣" width="160px" align="center">
                      <template slot-scope="scope">
@@ -877,14 +967,22 @@
                          :step="0.1"
                          :max="10"
                          :min="0"
                          :disabled="true"
                          :disabled="true"
                        >
                        </el-input-number>
                      </template>
                    </el-table-column>
                    <el-table-column prop="nowPrice" label="实收金额" align="center">
                    <el-table-column
                      prop="nowPrice"
                      label="实收金额"
                      align="center"
                    >
                    </el-table-column>
                    <el-table-column prop="proCheckMethod" label="是否空腹" align="center">
                    <el-table-column
                      prop="proCheckMethod"
                      label="是否空腹"
                      align="center"
                    >
                      <template slot-scope="scope">
                        <dict-tag
                          :options="dict.type.sys_yes_no"
@@ -1087,6 +1185,49 @@
        </div>
      </template>
    </el-drawer>
    <el-dialog
      title="PDF 预览"
      :visible.sync="dialogVisible"
      :close-on-click-modal="false"
    >
      <div class="main">
        <iframe
          id="printIframe"
          :src="url"
          frameborder="0"
          style="width: 100%; height: 100%"
        ></iframe>
      </div>
    </el-dialog>
    <el-dialog
      :title="title"
      :visible.sync="open2"
      width="800px"
      append-to-body
    >
      <el-form ref="form" :model="forms" label-width="100px" :inline="true">
        <el-form-item label="体检类别">
          <el-select
            style="width: 150px"
            v-model="forms.tjCategory"
            placeholder="请选择体检类别"
          >
            <el-option
              v-for="dict in dict.type.dict_tjtype"
              :key="dict.value"
              :label="dict.label"
              :value="dict.value"
            ></el-option>
          </el-select>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer2">
        <el-button type="primary" @click="submitType">确 定</el-button>
        <el-button @click="cancel">取 消</el-button>
      </div>
    </el-dialog>
    <div
      style="
@@ -1557,9 +1698,19 @@
                  "
                >
                  <el-table :data="tableData1" border style="width: 100%">
                    <el-table-column prop="proName" label="项目" width="180" align="center">
                    <el-table-column
                      prop="proName"
                      label="项目"
                      width="180"
                      align="center"
                    >
                    </el-table-column>
                    <el-table-column prop="proType" label="性别" width="50" align="center">
                    <el-table-column
                      prop="proType"
                      label="性别"
                      width="50"
                      align="center"
                    >
                      <template slot-scope="scope">
                        <template v-if="isAll(scope.row.proType)">
                          全部
@@ -1573,7 +1724,11 @@
                      </template>
                    </el-table-column>
                    <el-table-column prop="ordPrice" label="应收金额" align="center">
                    <el-table-column
                      prop="ordPrice"
                      label="应收金额"
                      align="center"
                    >
                    </el-table-column>
                    <el-table-column label="折扣" width="160px" align="center">
                      <template slot-scope="scope">
@@ -1587,14 +1742,22 @@
                          :step="0.1"
                          :max="10"
                          :min="0"
                          :disabled="true"
                          :disabled="true"
                        >
                        </el-input-number>
                      </template>
                    </el-table-column>
                    <el-table-column prop="nowPrice" label="实收金额" align="center">
                    <el-table-column
                      prop="nowPrice"
                      label="实收金额"
                      align="center"
                    >
                    </el-table-column>
                    <el-table-column prop="proCheckMethod" label="是否空腹" align="center">
                    <el-table-column
                      prop="proCheckMethod"
                      label="是否空腹"
                      align="center"
                    >
                      <template slot-scope="scope">
                        <dict-tag
                          :options="dict.type.sys_yes_no"
@@ -1799,8 +1962,10 @@
</template>
<script>
import { addComp } from "@/api/system/comp";
import { addComp, addPlOrderAndDetail, Deptlist,
  getDwAndDwDept, } from "@/api/system/comp";
import Big from "big.js";
import { Loading } from "element-ui";
import {
  listReservation,
  gettjCancel,
@@ -1842,7 +2007,6 @@
  ],
  data() {
    let checkPhoneNum = (rule, value, callback) => {
      console.log(value);
      let patter = new RegExp(/^1\s*[3456789]\s*(\d\s*){9}$/);
      if (value == "" && value == undefined && !value) {
        return callback("");
@@ -1866,7 +2030,10 @@
      },
      discount: 10,
      taocan: false,
      webSocket: null,
      defaultKeys: [],
      deptList: [],
      groupingList: [],
      value1: "",
      pacName: "",
      hides: false,
@@ -1876,6 +2043,10 @@
      dialogVisibles: false,
      src: "",
      url: "",
      open2: false,
      forms: {
        tjCategory: "12",
      },
      dialogVisible: false,
      /** 照相机弹窗模块-start */
      videoWidth: 200,
@@ -1933,6 +2104,7 @@
      // 是否显示弹出层
      pacId: "",
      cusIds: [],
      // 结果
      result: "",
      proIds: [],
@@ -1945,6 +2117,8 @@
        label: "proName",
      },
      formPacId: "",
      createTimeList: "",
      startTime: "",
      dXData: [],
      // 查询参数
      queryParam: {
@@ -1962,6 +2136,7 @@
        pageNum: 1,
        pageSize: 10,
        cusName: null,
        szd: null,
        cusSex: null,
        cusBrithday: null,
        cusAddr: null,
@@ -2067,6 +2242,7 @@
      reservationList: [],
      // 弹出层标题
      title: "",
      valueUrls: "ws://127.0.0.1:6789/websocket",
      drawer: false,
      drawer1: false,
      // 查询参数
@@ -2116,6 +2292,37 @@
        //     trigger: "blur",
        //   },
        // ],
      },
        pickerOptions: {
        shortcuts: [
          {
            text: "最近一周",
            onClick(picker) {
              const end = new Date();
              const start = new Date(new Date().setHours(0, 0, 0, 0));
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
              picker.$emit("pick", [start, end]);
            },
          },
          {
            text: "最近一个月",
            onClick(picker) {
              const end = new Date();
              const start = new Date(new Date().setHours(0, 0, 0, 0));
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
              picker.$emit("pick", [start, end]);
            },
          },
          {
            text: "最近三个月",
            onClick(picker) {
              const end = new Date();
              const start = new Date(new Date().setHours(0, 0, 0, 0));
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
              picker.$emit("pick", [start, end]);
            },
          },
        ],
      },
    };
  },
@@ -2223,7 +2430,8 @@
      this.open1 = true;
      this.title = "添加体检单位信息维护";
    },
    idFn1(value) {
     idFn1(value) {
      console.log(value)
      if (value) {
        this.form.dictCompId = value;
        this.CompanyList.forEach((item) => {
@@ -2232,11 +2440,38 @@
            this.queryParams.company = item.cnName;
          }
        });
        Deptlist(value).then((response) => {
          this.deptList = response.data;
        });
      }
    },
      idFn2(value) {
      let data = {
        deptId: value,
        dwId: this.form.dictCompId,
      };
      getDwAndDwDept(data).then((response) => {
        // 部门名称
        this.groupingList = response.data;
      });
    },
    dateChangebirthday2(val) {
      this.startTime = val;
    },
    /** 查询体检预约列表 */
    getList() {
      this.loading = true;
      if (this.startTime) {
        this.queryParams.yykssj = this.startTime[0];
        this.queryParams.yyjssj = this.startTime[1];
      } else if (this.createTimeList) {
        this.queryParams.yykssj = this.createTimeList[0];
        this.queryParams.yyjssj = this.createTimeList[1];
      } else if (this.createTimeList == null) {
        this.queryParams.yykssj = null;
        this.queryParams.yyjssj = null;
      }
      listReservation(this.queryParams).then((response) => {
        this.reservationList = response.rows;
        //  response.rows.forEach((item, index) =>
@@ -2253,6 +2488,7 @@
    // 取消按钮
    cancel() {
      this.open = false;
      this.open2 = false;
      this.reset();
    },
@@ -2269,6 +2505,8 @@
        });
      }
    },
    // 表单重置
    reset() {
      this.form = {
@@ -2316,10 +2554,10 @@
    },
    // 多选框选中数据
    handleSelectionChange(selection) {
      this.cusIds = selection.map((item) => item.idCard);
      selection.forEach((item) => {
        this.fmobj = item;
      });
      console.log(this.fmobj);
      this.ids = selection.map((item) => item.id);
      this.single = selection.length !== 1;
      this.multiple = !selection.length;
@@ -2334,7 +2572,6 @@
    /** 修改按钮操作 */
    handleUpdate(row) {
      console.log(row);
      this.title = "修改体检预约";
      this.formIn = row;
      this.form.tjType = this.formIn.tjType;
@@ -2405,7 +2642,6 @@
                    this.TotalPrice1 = 0;
                    this.tableData1.forEach((item) => {
                      this.TotalPrice1 += item.nowPrice;
                      console.log(this.discount);
                      this.TotalPrice = (
                        this.TotalPrice1 *
                        (this.discount / 10)
@@ -2617,6 +2853,141 @@
      }
    },
    Groupsignin() {
      this.open2 = true;
    },
    submitType() {
      // let cusIds = [];
      // this.selectList.forEach((item) => {
      //   cusIds.push(item.idCard);
      // });
      let loadingInstance1 = Loading.service({
        fullscreen: true,
        text: "签到中",
      });
      let data = {
        cusIds: this.cusIds,
        tjCategory: this.forms.tjCategory,
      };
      this.open2 = false;
      addPlOrderAndDetail(data).then((res) => {
        if (res.code == 200) {
          this.open2 = false;
          this.$modal.msgSuccess("签到成功");
          if (res.file) {
            let base64 = res.file;
            this.base64ToBlob({
              b64data: base64,
              contentType: "application/pdf",
            }).then((res) => {
              this.dialogVisible = true;
              // 转后后的blob对象
              try {
                this.url = res.preview;
              } catch (error) {
                this.url = window.webkitURL.createObjectURL(res.preview);
              }
            });
          } else {
            let _this = this;
            this.$nextTick(() => {
              // 以服务的方式调用的 Loading 需要异步关闭
              loadingInstance1.close();
            });
            var websocket = null;
            var url = _this.valueUrls;
            if ("WebSocket" in window) {
              websocket = new WebSocket(url);
            } else if ("MozWebSocket" in window) {
              websocket = new MozWebSocket(url);
            } else {
            }
            if (websocket == null) {
              alert("11111");
            }
            websocket.onopen = function () {
              try {
                // 连接设备
                var jsonObjs = {
                  type: 4,
                  data: res,
                };
                var jStrs = JSON.stringify(jsonObjs);
                websocket.send(jStrs);
              } catch (err) {
                var tryTime = 0;
                // 重试10次,每次之间间隔3秒
                if (tryTime < 1) {
                  var t1 = setTimeout(function () {
                    tryTime++;
                    var jsonObjs = {
                      type: 4,
                      data: res,
                    };
                    var jStrs = JSON.stringify(jsonObjs);
                    websocket.send(jStrs);
                  }, 1 * 1000);
                } else {
                  console.error("重连失败.");
                }
              }
            };
            websocket.onclose = function () {
              alert("连接关闭");
            };
            websocket.onmessage = function (event) {
              var resultObj = JSON.parse(event.data);
              _this.cardreader = false;
            };
            //连接发生错误的回调方法
            websocket.onerror = function () {
              alert("请检查连接是否正常");
            };
            this.getList();
          }
        } else {
          this.$nextTick(() => {
            // 以服务的方式调用的 Loading 需要异步关闭
            loadingInstance1.close();
          });
        }
      });
    },
    base64ToBlob({ b64data = "", contentType = "", sliceSize = 512 } = {}) {
      return new Promise((resolve, reject) => {
        // 使用 atob() 方法将数据解码
        let byteCharacters = atob(b64data);
        let byteArrays = [];
        for (
          let offset = 0;
          offset < byteCharacters.length;
          offset += sliceSize
        ) {
          let slice = byteCharacters.slice(offset, offset + sliceSize);
          let byteNumbers = [];
          for (let i = 0; i < slice.length; i++) {
            byteNumbers.push(slice.charCodeAt(i));
          }
          // 8 位无符号整数值的类型化数组。内容将初始化为 0。
          // 如果无法分配请求数目的字节,则将引发异常。
          byteArrays.push(new Uint8Array(byteNumbers));
        }
        let result = new Blob(byteArrays, {
          type: contentType,
        });
        result = Object.assign(result, {
          // jartto: 这里一定要处理一下 URL.createObjectURL
          preview: URL.createObjectURL(result),
          // name: `图片示例.png`,
        });
        resolve(result);
      });
    },
    // 点击获取每个树节点
    handleCurrentChecked(data, checked, checkedNodes) {
      if (checked === true) {