WXL (wul)
2026-02-02 7c71fcb61dd0bfc6a179a973f9cab5ef979ad5f2
测试完成
已修改5个文件
已添加3个文件
898 ■■■■ 文件已修改
lishui.zip 补丁 | 查看 | 原始文档 | blame | 历史
shiyi.zip 补丁 | 查看 | 原始文档 | blame | 历史
src/api/smartor/patouthosp.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/sipService.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login-sy.vue 322 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/patient/AwaitingAdmission.vue 224 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/sfstatistics/percentage/index.vue 339 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vue.config.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lishui.zip
Binary files differ
shiyi.zip
Binary files differ
src/api/smartor/patouthosp.js
@@ -8,6 +8,14 @@
    data: query
  })
}
// æŸ¥è¯¢å¾…入院记录列表
export function listPatMedInhosp(query) {
  return request({
    url: '/smartor/patinhosp/selectPatMedInhospList',
    method: 'post',
    data: query
  })
}
// æŸ¥è¯¢æ‚£è€…门诊记录详细
export function getPatouthosp(id) {
src/utils/sipService.js
@@ -1,6 +1,7 @@
import JsSIP from "jssip";
import { Notification, MessageBox, Message, Loading } from "element-ui";
// åŒ»é™¢æœºæž„与SIP服务器映射配置
// å…¬å¸æœåС噍192.168.100.6
const HOSPITAL_CONFIG = {
  ä¸½æ°´å¸‚中医院: {
    wsUrl: "wss://192.168.10.124:7443",
src/views/login-sy.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,322 @@
<template>
  <div class="login">
    <el-form
      ref="loginForm"
      :model="loginForm"
      :rules="loginRules"
      class="login-form"
    >
      <h3 class="title">智慧随访系统</h3>
      <el-form-item prop="username">
        <el-input
          v-model="loginForm.username"
          type="text"
          auto-complete="off"
          placeholder="账号"
        >
          <svg-icon
            slot="prefix"
            icon-class="user"
            class="el-input__icon input-icon"
          />
        </el-input>
      </el-form-item>
      <el-form-item prop="password">
        <el-input
          v-model="loginForm.password"
          type="password"
          auto-complete="off"
          placeholder="密码"
          @keyup.enter.native="handleLogin"
        >
          <svg-icon
            slot="prefix"
            icon-class="password"
            class="el-input__icon input-icon"
          />
        </el-input>
      </el-form-item>
      <!-- ä¸½===================æ°´ -->
      <el-form-item prop="medicalCode">
        <el-select
          style="width: 100%"
          v-model="loginForm.medicalCode"
          placeholder="请选择院区"
        >
          <el-option
            v-for="item in options"
            :label="item.label"
            :value="item.value"
          >
          </el-option>
          <i slot="prefix" class="el-icon-mobile"></i>
        </el-select>
      </el-form-item>
      <!-- <el-form-item prop="code" v-if="captchaEnabled">
        <el-input
          v-model="loginForm.code"
          auto-complete="off"
          placeholder="验证码"
          style="width: 63%"
          @keyup.enter.native="handleLogin"
        >
          <svg-icon
            slot="prefix"
            icon-class="validCode"
            class="el-input__icon input-icon"
          />
        </el-input>
        <div class="login-code">
          <img :src="codeUrl" @click="getCode" class="login-code-img" />
        </div>
      </el-form-item> -->
      <el-checkbox
        v-model="loginForm.rememberMe"
        style="margin: 0px 0px 25px 0px"
        >记住密码</el-checkbox
      >
      <el-form-item style="width: 100%">
        <el-button
          :loading="loading"
          size="medium"
          type="primary"
          style="width: 100%"
          @click.native.prevent="handleLogin"
        >
          <span v-if="!loading">登 å½•</span>
          <span v-else>登 å½• ä¸­...</span>
        </el-button>
        <div style="float: right" v-if="register">
          <router-link class="link-type" :to="'/register'"
            >立即注册1</router-link
          >
        </div>
      </el-form-item>
    </el-form>
    <!--  åº•部  -->
    <!-- <div class="el-login-footer">
      <span style="color: #568FBD; font-size: 25px;">Copyright Â© 2018-2022 ruoyi.vip All Rights Reserved.</span>
    </div> -->
  </div>
</template>
<script>
import { getCodeImg } from "@/api/login";
import Cookies from "js-cookie";
import { encrypt, decrypt } from "@/utils/jsencrypt";
import { getorganization } from "@/api/AiCentre/index";
export default {
  name: "Login",
  data() {
    return {
      codeUrl: "",
      loginForm: {
        username: "",
        password: "",
        rememberMe: false,
        code: "",
        orgid: "H41010500003",
      },
      options: [
      ],
      loginRules: {
        username: [
          { required: true, trigger: "blur", message: "请输入您的账号" },
        ],
        password: [
          { required: true, trigger: "blur", message: "请输入您的密码" },
        ],
        orgid: [{ required: true, trigger: "blur", message: "请选择院区" }],
      },
      loading: false,
      // éªŒè¯ç å¼€å…³
      captchaEnabled: true,
      // æ³¨å†Œå¼€å…³
      register: false,
      redirect: undefined,
    };
  },
  watch: {
    $route: {
      handler: function (route) {
        this.redirect = route.query && route.query.redirect;
      },
      immediate: true,
    },
  },
  created() {
    this.getorganization();
    this.getCode();
    this.getCookie();
    // if (localStorage.getItem('orgid')) {
    //   this.loginForm.orgid = localStorage.getItem('orgid');
    // }
  },
  methods: {
    getCode() {
      getCodeImg().then((res) => {
        this.captchaEnabled =
          res.captchaEnabled === undefined ? true : res.captchaEnabled;
        if (this.captchaEnabled) {
          this.codeUrl = "data:image/gif;base64," + res.img;
          this.loginForm.uuid = res.uuid;
        }
      });
    },
    getorganization() {
      getorganization().then((res) => {
        if (res.code == 200) {
          this.options = res.rows.map((item) => ({
            value: item.medicalCode,
            // value: item.medicalCode,
            label: item.organizationName,
          }));
        }
      });
    },
    getCookie() {
      const username = Cookies.get("username");
      const password = Cookies.get("password");
      const rememberMe = Cookies.get("rememberMe");
      this.loginForm = {
        username: username === undefined ? this.loginForm.username : username,
        password:
          password === undefined ? this.loginForm.password : decrypt(password),
        rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
      };
    },
    handleLogin() {
  this.$refs.loginForm.validate((valid) => {
    if (valid) {
      this.loading = true;
      if (this.loginForm.rememberMe) {
        Cookies.set("username", this.loginForm.username, { expires: 30 });
        Cookies.set("password", encrypt(this.loginForm.password), {
          expires: 30,
        });
        Cookies.set("rememberMe", this.loginForm.rememberMe, {
          expires: 30,
        });
      } else {
        Cookies.remove("username");
        Cookies.remove("password");
        Cookies.remove("rememberMe");
      }
      // åŠ¨æ€è®¾ç½® campusid å‚æ•°
      const selectedOrg = this.options.find(item => item.value === this.loginForm.medicalCode);
      console.log(selectedOrg);
      if (selectedOrg) {
        if (selectedOrg.label.includes('湖滨')) {
          this.loginForm.campusid = 1;
          this.loginForm.orgid = 1;
        } else if (selectedOrg.label.includes('吴山')) {
          this.loginForm.campusid = 2;
          this.loginForm.orgid = 1;
        } else {
          this.loginForm.campusid = 1; // é»˜è®¤å€¼æˆ–其他处理
          this.loginForm.orgid = 1;
        }
      }
      this.$store
        .dispatch("Login", this.loginForm)
        .then((res) => {
          if (this.loginForm.username == "admin") {
            this.$router.push({ path: "/index" }).catch(() => {});
          } else {
            this.$router
              .push({ path: "/followvisit/discharge" })
              .catch(() => {});
          }
        })
        .catch(() => {
          this.loading = false;
          if (this.captchaEnabled) {
            this.getCode();
          }
        });
    }
  });
}
  },
};
</script>
<style rel="stylesheet/scss" lang="scss">
.login {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100%;
  overflow: hidden !important;
  background-position: center center;
  /* èƒŒæ™¯å›¾ä¸å¹³é“º */
  background-repeat: no-repeat;
  /* å½“内容高度大于图片高度时,背景图像的位置相对于viewport固定 */
  background-attachment: fixed;
  /* è®©èƒŒæ™¯å›¾åŸºäºŽå®¹å™¨å¤§å°ä¼¸ç¼© */
  background-size: cover;
  /* è®¾ç½®èƒŒæ™¯é¢œè‰²ï¼ŒèƒŒæ™¯å›¾åŠ è½½è¿‡ç¨‹ä¸­ä¼šæ˜¾ç¤ºèƒŒæ™¯è‰² */
  background-color: #464646;
  background-image: url("../assets/images/login-background.jpg");
  background-size: cover;
}
.title {
  margin: 0px auto 30px auto;
  text-align: center;
  color: #707070;
}
.login-form {
  border-radius: 6px;
  background: #ffffff;
  width: 400px;
  padding: 25px 25px 5px 25px;
  .el-input {
    height: 38px;
    input {
      height: 38px;
    }
  }
  .input-icon {
    height: 39px;
    width: 14px;
    margin-left: 2px;
  }
}
.login-tip {
  font-size: 13px;
  text-align: center;
  color: #bfbfbf;
}
.login-code {
  width: 33%;
  height: 38px;
  float: right;
  img {
    cursor: pointer;
    vertical-align: middle;
  }
}
.el-login-footer {
  height: 40px;
  line-height: 40px;
  position: fixed;
  bottom: 0;
  width: 100%;
  text-align: center;
  color: #fff;
  font-family: Arial;
  font-size: 12px;
  letter-spacing: 1px;
}
.login-code-img {
  height: 38px;
}
</style>
src/views/patient/patient/AwaitingAdmission.vue
@@ -11,42 +11,6 @@
          v-show="showSearch"
          label-width="98px"
        >
          <el-form-item label="姓名" width="100" prop="name">
            <el-input
              v-model="queryParams.patname"
              placeholder="请输入姓名"
              clearable
              style="width: 200px"
              @keyup.enter.native="handleQuery"
            />
          </el-form-item>
          <el-form-item label="诊断" width="100" prop="name">
            <el-input
              v-model="queryParams.diagname"
              placeholder="请输入诊断"
              clearable
              style="width: 200px"
              @keyup.enter.native="handleQuery"
            />
          </el-form-item>
          <el-form-item label="科室" width="100" prop="name">
            <el-input
              v-model="queryParams.deptname"
              placeholder="请输入科室名称"
              clearable
              style="width: 200px"
              @keyup.enter.native="handleQuery"
            />
          </el-form-item>
          <el-form-item label="医生" width="100" prop="name">
            <el-input
              v-model="queryParams.drname"
              placeholder="请输入医生姓名"
              clearable
              style="width: 200px"
              @keyup.enter.native="handleQuery"
            />
          </el-form-item>
          <el-form-item label="病案号" prop="outhospno">
            <el-input
              v-model="queryParams.outhospno"
@@ -56,17 +20,7 @@
              @keyup.enter.native="handleQuery"
            />
          </el-form-item>
          <el-form-item label="患者范围" prop="status">
            <el-cascader
              v-model="queryParams.scopetype"
              placeholder="默认全部"
              :options="sourcetype"
              :props="{ expandTrigger: 'hover' }"
              @change="handleChange"
            ></el-cascader>
          </el-form-item>
          <el-form-item label="就诊日期">
          <el-form-item label="预约住院日期">
            <el-date-picker
              v-model="dateRange"
              style="width: 240px"
@@ -76,28 +30,31 @@
              start-placeholder="开始日期"
              end-placeholder="结束日期"
            ></el-date-picker>
            <!-- <el-date-picker
                v-model="dateRange"
                type="datetimerange"
                value-format="yyyy-MM-dd HH:mm:ss"
                start-placeholder="开始日期"
                end-placeholder="结束日期"
                :default-time="['12:00:00']"
          </el-form-item>
          <el-form-item label="有无院前检查" prop="status">
            <el-select v-model="queryParams.examine" placeholder="请选择">
              <el-option label="有" :value="1"> </el-option>
              <el-option label="无" :value="2"> </el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="收治类型" prop="status">
            <el-select v-model="queryParams.cureType" placeholder="请选择">
              <el-option
                v-for="item in dict.type.receive_and_cure"
                :key="item.value"
                :label="item.label"
                :value="item.value"
              >
              </el-date-picker> -->
              </el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="安排状态" prop="status">
            <el-select v-model="queryParams.arrange" placeholder="请选择">
              <el-option label="已安排" :value="1"> </el-option>
              <el-option label="未安排" :value="2"> </el-option>
            </el-select>
          </el-form-item>
          <el-row>
            <!-- <el-form-item label=" å°±è¯Šæ—¥æœŸ " prop="admitdate">
              <el-date-picker
                clearable
                v-model="queryParams.admitdate"
                type="date"
                value-format="yyyy-MM-dd"
                placeholder="请选择 å°±è¯Šæ—¥æœŸ "
              >
              </el-date-picker>
            </el-form-item> -->
            <el-form-item>
              <el-button
                type="primary"
@@ -207,6 +164,12 @@
            prop="id"
          /> -->
          <el-table-column
            label="病案号"
            align="center"
            key="outhospno"
            prop="outhospno"
          />
          <el-table-column
            label="就诊时间"
            align="center"
            key="admitdate"
@@ -217,18 +180,29 @@
              <span>{{ formatTime(scope.row.admitdate) }}</span>
            </template>
          </el-table-column>
          <!-- <el-table-column
            label="病案号"
            align="center"
            key="patno"
            prop="patno"
          /> -->
          <el-table-column
            label="病案号"
            label="预约住院日期"
            align="center"
            key="outhospno"
            prop="outhospno"
          />
            key="admitdate"
            prop="admitdate"
            width="160"
          >
            <template slot-scope="scope">
              <span>{{ formatTime(scope.row.admitdate) }}</span>
            </template>
          </el-table-column>
          <el-table-column
            label="预约诊断日期"
            align="center"
            key="admitdate"
            prop="admitdate"
            width="160"
          >
            <template slot-scope="scope">
              <span>{{ formatTime(scope.row.admitdate) }}</span>
            </template>
          </el-table-column>
          <el-table-column
            label="姓名"
            width="100"
@@ -272,48 +246,49 @@
            width="120"
          />
          <el-table-column
            label="身份证号"
            align="center"
            key="idcardno"
            prop="idcardno"
            width="220"
          />
          <el-table-column
            label="联系电话"
            align="center"
            key="telcode"
            prop="telcode"
            width="120"
          />
          <!-- <el-table-column
            label="患者标签(缺)"
            align="center"
            key="tagList"
            prop="tagList"
            width="160"
            :show-overflow-tooltip="true"
          >
            <template slot-scope="scope">
              <span v-for="item in scope.row.tagList">{{ item }} </span>
            </template>
          </el-table-column> -->
          <el-table-column
            label="诊断"
            align="center"
            key="diagname"
            prop="diagname"
            width="190"
          />
          <!-- <el-table-column
            label="主述"
            align="center"
            key="mainsuit"
            prop="mainsuit"
            width="120"
          /> -->
          <el-table-column
            label="就诊科室"
            label="科室"
            align="center"
            key="deptname"
            prop="deptname"
            width="120"
          />
          <el-table-column
            label="接诊医生"
            label="有无院前检查"
            align="center"
            key="deptname"
            prop="deptname"
            width="120"
          />
          <el-table-column
            label="收治类型"
            align="center"
            key="deptname"
            prop="deptname"
            width="120"
          >
            <template slot-scope="scope">
              <dict-tag
                :options="dict.type.receive_and_cure"
                :value="scope.row.sendState"
              /> </template
          ></el-table-column>
          <el-table-column
            label="安排状态"
            align="center"
            key="drname"
            prop="drname"
@@ -559,7 +534,7 @@
import { delUser } from "@/api/system/user";
import {
  listPatouthosp,
  listPatMedInhosp,
  getPatouthosp,
  addPatouthosp,
  updatePatouthosp,
@@ -577,7 +552,7 @@
export default {
  name: "Userhuanze",
  dicts: ["sys_normal_disable", "sys_user_sex"],
  dicts: ["sys_normal_disable", "sys_user_sex", "receive_and_cure"],
  components: { Treeselect },
  data() {
    return {
@@ -722,9 +697,7 @@
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        searchscope: 3,
        scopetype: [],
        deptcodes: [],
      },
      // è¡¨å•校验
      rules: {
@@ -800,13 +773,6 @@
    /** æŸ¥è¯¢æ‚£è€…列表 */
    getList() {
      this.loading = true;
      if (this.queryParams.searchscope == 3) {
        this.queryParams.deptcodes = store.getters.belongDepts.map(
          (obj) => obj.deptCode
        );
        // this.queryParams.leavehospitaldistrictcodes =
        //   store.getters.belongWards.map((obj) => obj.districtCode);
      }
      if (this.dateRange) {
        this.queryParams.beginTime = this.dateRange[0];
        this.queryParams.endTime = this.dateRange[1];
@@ -814,7 +780,9 @@
        this.queryParams.beginTime = "";
        this.queryParams.endTime = "";
      }
      listPatouthosp(this.queryParams).then((response) => {
        this.loading = false;
      listPatMedInhosp(this.queryParams).then((response) => {
        this.userList = response.rows;
        this.total = response.total;
        this.loading = false;
@@ -834,25 +802,7 @@
        this.optionstag = response.rows;
      });
    },
    // æ‚£è€…范围处理
    handleChange(value) {
      let type = value[0];
      let code = value.slice(-1)[0];
      // this.queryParams.leavehospitaldistrictcodes = [];
      this.queryParams.deptcodes = [];
      if (type == 1) {
        this.queryParams.deptcodes.push(code);
        // this.queryParams.leavehospitaldistrictcodes = [];
        this.queryParams.searchscope = 1;
      } else if (type == 2) {
        // this.queryParams.leavehospitaldistrictcodes.push(code);
        this.queryParams.deptcodes = [];
        this.queryParams.searchscope = 2;
      } else {
        this.queryParams.searchscope = 3;
      }
    },
    // æŸ¥è¯¢å¯¼å…¥å±•示列表
    geterryList() {
      this.loading = true;
@@ -919,9 +869,7 @@
      this.queryParams = {
        pageNum: 1,
        pageSize: 10,
        searchscope: 3,
        scopetype: [],
        deptcodes: [],
        // leavehospitaldistrictcodes: [],
      };
      this.handleQuery();
src/views/sfstatistics/percentage/index.vue
@@ -395,6 +395,21 @@
                    key="needFollowUp"
                    prop="needFollowUp"
                  >
                    <template slot-scope="scope">
                      <el-button
                        size="medium"
                        type="text"
                        @click="
                          viewDetails(
                            scope.row.needFollowUpInfo,
                            scope.row.leavehospitaldistrictname + '需随访列表'
                          )
                        "
                        ><span class="button-zx">{{
                          scope.row.needFollowUp
                        }}</span></el-button
                      >
                    </template>
                  </el-table-column>
                  <el-table-column
                    label="待随访"
@@ -424,6 +439,21 @@
                    key="followUpSuccess"
                    prop="followUpSuccess"
                  >
                    <template slot-scope="scope">
                      <el-button
                        size="medium"
                        type="text"
                        @click="
                          viewDetails(
                            scope.row.followUpSuccessInfo,
                            scope.row.leavehospitaldistrictname + '随访成功列表'
                          )
                        "
                        ><span class="button-zx">{{
                          scope.row.followUpSuccess
                        }}</span></el-button
                      >
                    </template>
                  </el-table-column>
                  <el-table-column
                    label="随访失败"
@@ -488,6 +518,21 @@
                    key="manual"
                    prop="manual"
                  >
                    <template slot-scope="scope">
                      <el-button
                        size="medium"
                        type="text"
                        @click="
                          viewDetails(
                            scope.row.manualInfo,
                            scope.row.leavehospitaldistrictname + '人工随访列表'
                          )
                        "
                        ><span class="button-zx">{{
                          scope.row.manual
                        }}</span></el-button
                      >
                    </template>
                  </el-table-column>
                  <el-table-column
                    label="短信"
@@ -495,6 +540,21 @@
                    key="sms"
                    prop="sms"
                  >
                    <template slot-scope="scope">
                      <el-button
                        size="medium"
                        type="text"
                        @click="
                          viewDetails(
                            scope.row.smsInfo,
                            scope.row.leavehospitaldistrictname + '短信随访列表'
                          )
                        "
                        ><span class="button-zx">{{
                          scope.row.sms
                        }}</span></el-button
                      >
                    </template>
                  </el-table-column>
                  <el-table-column
                    label="微信"
@@ -502,6 +562,21 @@
                    key="weChat"
                    prop="weChat"
                  >
                    <template slot-scope="scope">
                      <el-button
                        size="medium"
                        type="text"
                        @click="
                          viewDetails(
                            scope.row.weChatInfo,
                            scope.row.leavehospitaldistrictname + '微信随访列表'
                          )
                        "
                        ><span class="button-zx">{{
                          scope.row.weChat
                        }}</span></el-button
                      >
                    </template>
                  </el-table-column>
                </el-table-column>
                <el-table-column align="center" label="再次出院随访">
@@ -511,6 +586,22 @@
                    key="needFollowUpAgain"
                    prop="needFollowUpAgain"
                  >
                    <template slot-scope="scope">
                      <el-button
                        size="medium"
                        type="text"
                        @click="
                          viewDetails(
                            scope.row.needFollowUpAgainInfo,
                            scope.row.leavehospitaldistrictname +
                              '再次随访需随访列表'
                          )
                        "
                        ><span class="button-zx">{{
                          scope.row.needFollowUpAgain
                        }}</span></el-button
                      >
                    </template>
                  </el-table-column>
                  <el-table-column
                    label="待随访"
@@ -518,6 +609,22 @@
                    key="pendingFollowUpAgain"
                    prop="pendingFollowUpAgain"
                  >
                    <template slot-scope="scope">
                      <el-button
                        size="medium"
                        type="text"
                        @click="
                          viewDetails(
                            scope.row.pendingFollowUpAgainInfo,
                            scope.row.leavehospitaldistrictname +
                              '再次随访待随访列表'
                          )
                        "
                        ><span class="button-zx">{{
                          scope.row.pendingFollowUpAgain
                        }}</span></el-button
                      >
                    </template>
                  </el-table-column>
                  <el-table-column
                    label="随访成功"
@@ -525,6 +632,22 @@
                    key="followUpSuccessAgain"
                    prop="followUpSuccessAgain"
                  >
                    <template slot-scope="scope">
                      <el-button
                        size="medium"
                        type="text"
                        @click="
                          viewDetails(
                            scope.row.followUpSuccessAgainInfo,
                            scope.row.leavehospitaldistrictname +
                              '再次随访随访成功列表'
                          )
                        "
                        ><span class="button-zx">{{
                          scope.row.followUpSuccessAgain
                        }}</span></el-button
                      >
                    </template>
                  </el-table-column>
                  <el-table-column
                    label="随访失败"
@@ -532,6 +655,22 @@
                    key="followUpFailAgain"
                    prop="followUpFailAgain"
                  >
                    <template slot-scope="scope">
                      <el-button
                        size="medium"
                        type="text"
                        @click="
                          viewDetails(
                            scope.row.followUpFailAgainInfo,
                            scope.row.leavehospitaldistrictname +
                              '再次随访随访失败列表'
                          )
                        "
                        ><span class="button-zx">{{
                          scope.row.followUpFailAgain
                        }}</span></el-button
                      >
                    </template>
                  </el-table-column>
                  <el-table-column
                    label="随访率"
@@ -554,6 +693,22 @@
                    key="manualAgain"
                    prop="manualAgain"
                  >
                    <template slot-scope="scope">
                      <el-button
                        size="medium"
                        type="text"
                        @click="
                          viewDetails(
                            scope.row.manualAgainInfo,
                            scope.row.leavehospitaldistrictname +
                              '再次随访人工随访列表'
                          )
                        "
                        ><span class="button-zx">{{
                          scope.row.manualAgain
                        }}</span></el-button
                      >
                    </template>
                  </el-table-column>
                  <el-table-column
                    label="短信"
@@ -561,6 +716,22 @@
                    key="smsAgain"
                    prop="smsAgain"
                  >
                    <template slot-scope="scope">
                      <el-button
                        size="medium"
                        type="text"
                        @click="
                          viewDetails(
                            scope.row.smsAgainInfo,
                            scope.row.leavehospitaldistrictname +
                              '再次随访短信随访列表'
                          )
                        "
                        ><span class="button-zx">{{
                          scope.row.smsAgain
                        }}</span></el-button
                      >
                    </template>
                  </el-table-column>
                  <el-table-column
                    label="微信"
@@ -568,6 +739,22 @@
                    key="weChatAgain"
                    prop="weChatAgain"
                  >
                    <template slot-scope="scope">
                      <el-button
                        size="medium"
                        type="text"
                        @click="
                          viewDetails(
                            scope.row.weChatAgainInfo,
                            scope.row.leavehospitaldistrictname +
                              '再次随访微信随访列表'
                          )
                        "
                        ><span class="button-zx">{{
                          scope.row.weChatAgain
                        }}</span></el-button
                      >
                    </template>
                  </el-table-column>
                </el-table-column>
                <el-table-column
@@ -894,11 +1081,38 @@
      width="70%"
      :close-on-click-modal="false"
    >
      <div style="margin-bottom: 16px; display: flex; align-items: center">
        <span style="margin-right: 10px; font-weight: bold">患者姓名查询:</span>
        <el-input
          v-model="searchName"
          placeholder="请输入患者姓名进行筛选"
          clearable
          style="width: 300px"
          @input="handleSearch"
          @clear="handleSearch"
        >
        </el-input>
        <span
          style="margin-left: 10px; color: rgb(35, 81, 233); font-size: 16px"
        >
          å…± {{ infotitlelist.length }} æ¡è®°å½•
        </span>
      </div>
      <div class="examine-jic">
        <div class="jic-value">
          <el-row :gutter="20">
            <!-- é€‰æ‹©æ‚£è€…列表 -->
            <el-table :data="infotitlelist" height="660" style="width: 100%">
            <div
              class="data-list"
              ref="dataList"
              @scroll="handleScroll"
              v-loading="infotitloading"
            >
              <el-table
                :data="currentDisplayList"
                height="660"
                style="width: 100%"
              >
              <el-table-column
                prop="sendname"
                align="center"
@@ -1067,6 +1281,7 @@
                </template>
              </el-table-column>
            </el-table>
            </div>
          </el-row>
          <pagination
            v-show="patienttotal > 0 && this.patientqueryParams.allhosp != 6"
@@ -1131,11 +1346,16 @@
      orgname: "",
      expands: [],
      infotitlelist: [],
      currentDisplayList: [], // å½“前显示的数据
      loadIndex: 0, // å½“前已加载的数据索引
      pageSize: 100, // æ¯æ¬¡åŠ è½½çš„æ•°æ®é‡
      isLoading: false, // é˜²æ­¢æ»šåŠ¨æ—¶é‡å¤åŠ è½½
      // é®ç½©å±‚
      loading: false,
      Seedloading: false,
      chartDialogVisible: false,
      infotitleVisible: false,
      searchName: "", // æœç´¢å…³é”®è¯
      infotitloading: false,
      infotitle: "",
      pieChart: null,
@@ -1274,7 +1494,72 @@
      getSfStatistics(params).then((response) => {
        console.log(response);
        // this.total = response.total;
        this.userList = response.data;
        this.userList = this.customSort(response.data);
      });
    },
    // æœç´¢å¤„理函数
    handleSearch() {
      if (!this.searchName.trim()) {
        // å¦‚果搜索框为空,显示所有数据
        this.currentDisplayList = [...this.infotitlelist];
      } else {
        // æ ¹æ®æ‚£è€…姓名进行筛选(不区分大小写)
        const keyword = this.searchName.toLowerCase();
        this.currentDisplayList = this.infotitlelist.filter((item) => {
          return item.sendname && item.sendname.toLowerCase().includes(keyword);
        });
      }
    },
    customSort(data) {
      // å®šä¹‰æ‚¨æœŸæœ›çš„病区顺序(扩展到三十)
      const order = [
        "二",
        "三",
        "四",
        "五",
        "六",
        "七",
        "八",
        "九",
        "十",
        "十一",
        "十二",
        "十三",
        "十四",
        "十五",
        "十六",
        "十七",
        "十八",
        "十九",
        "二十",
        "二十一",
        "二十二",
        "二十三",
        "二十四",
        "二十五",
        "二十六",
        "二十七",
        "二十八",
        "二十九",
        "三十",
      ];
      return data.sort((a, b) => {
        // æå–病区名称中的中文数字部分[6](@ref)
        const getIndex = (name) => {
          const numStr = name.match(
            /^(二|三|四|五|六|七|八|九|十|十一|十二|十三|十四|十五|十六|十七|十八|十九|二十|二十一|二十二|二十三|二十四|二十五|二十六|二十七|二十八|二十九|三十)/
          )?.[1];
          return order.indexOf(numStr);
        };
        const indexA = getIndex(a.leavehospitaldistrictname);
        const indexB = getIndex(b.leavehospitaldistrictname);
        // å¦‚果都在定义的顺序中,按定义顺序排;否则,未定义的排在后面[2](@ref)
        if (indexA === -1) return 1;
        if (indexB === -1) return -1;
        return indexA - indexB;
      });
    },
    getRowKey(row) {
@@ -1296,9 +1581,16 @@
      const params = {
        ...this.queryParams,
        // å¦‚果选择了"全部",则传所有病区/科室代码
        deptcodes: this.queryParams.deptcodes.includes("all")
          ? this.allDeptCodes
          : this.queryParams.deptcodes,
        leavehospitaldistrictcodes: [row.leavehospitaldistrictcode],
        drcode: "1",
      };
      // ç§»é™¤å¯èƒ½å­˜åœ¨çš„"all"值
      delete params.leavehospitaldistrictcodes.all;
      delete params.deptcodes.all;
      // å¦‚果该行还没有加载医生数据,则加载
      if (!row.doctorStats) {
        this.loading = true;
@@ -1558,7 +1850,44 @@
    viewDetails(row, title) {
      this.infotitleVisible = true;
      this.infotitle = title;
      this.infotitlelist = row;
      this.infotitlelist = row; // å‡è®¾row就是需要展示的详细数组
      // åˆå§‹åŒ–加载
      this.loadIndex = 0;
      this.currentDisplayList = [];
      this.$nextTick(() => {
        this.loadMoreData();
      });
    },
    loadMoreData() {
      if (this.isLoading) return;
      this.isLoading = true;
      // æ¨¡æ‹Ÿå¼‚步加载,实际可能是直接切片本地数据
      setTimeout(() => {
        const nextChunk = this.infotitlelist.slice(
          this.loadIndex,
          this.loadIndex + this.pageSize
        );
        this.currentDisplayList = this.currentDisplayList.concat(nextChunk);
        this.loadIndex += this.pageSize;
        this.isLoading = false;
      }, 200);
    },
    handleScroll(event) {
      const scrollContainer = event.target;
      // åˆ¤æ–­æ˜¯å¦æ»šåŠ¨åˆ°åº•éƒ¨
      const isAtBottom =
        scrollContainer.scrollTop + scrollContainer.clientHeight >=
        scrollContainer.scrollHeight - 10;
      if (
        isAtBottom &&
        !this.isLoading &&
        this.loadIndex < this.infotitlelist.length
      ) {
        this.loadMoreData();
      }
    },
    SeedetailsgGo(row) {
      this.SeedetailsVisible = false;
@@ -2588,6 +2917,10 @@
  width: 100px;
  height: 50px;
}
.data-list {
  max-height: 800px;
  overflow-y: auto;
}
.documentf {
  display: flex;
  justify-content: flex-end;
vue.config.js
@@ -36,10 +36,10 @@
      // detail: https://cli.vuejs.org/config/#devserver-proxy
      [process.env.VUE_APP_BASE_API]: {
        // target: `https://www.health-y.cn/lssf`,
        target: `http://192.168.100.10:8096`,
        // target: `http://192.168.100.10:8096`,
        // target: `http://192.168.100.10:8094`,//省立同德
        // target: `http://192.168.100.10:8095`,//新华
        // target:`http://localhost:8095`,
        target:`http://localhost:8095`,
        // target:`http://35z1t16164.qicp.vip`,
        // target: `http://192.168.100.172:8095`,
        // target: `http://192.168.101.166:8093`,