WXL (wul)
17 小时以前 66cc734e81fe0497d88e0951b6aee9c9c8342f2c
电话更新
已添加10个文件
已修改53个文件
9803 ■■■■■ 文件已修改
dist.zip 补丁 | 查看 | 原始文档 | blame | 历史
src/api/AiCentre/index.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/AiCentre/satisfaction.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/order/BHostClient.exe 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/order/Xftp-8.0.0084p.exe 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/styles/element-variables.scss 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/styles/sidebar.scss 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/styles/variables.scss 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/CallButton/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/PatientSelection/index.vue 585 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/components/TagsView/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/permission.js 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/smartor/dataobject/dw_patouthosp_base.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/smartor/dataobject/dw_patouthosp_list.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/getters.js 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/user.js 350 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/sipService.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/complaint/complaintlist/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/complaint/complaintmy/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/SpecificDisease/index.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/again/index.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/complaint/index.vue 1968 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/discharge/index.vue 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/discharge/outpatientService.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/linem/index.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/mzsatisfaction/index.vue 1973 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/outpatient/index.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/record/detailpage/index.vue 443 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/record/index.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/record/physical/index.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/tasklist/index.vue 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/technology/index.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/zbAgain/index.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/zysatisfaction/index.vue 1969 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/knowledge/questionbank/particulars/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/knowledge/questionnaire/compilequer/index.vue 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/loginSSO.vue 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/outsideChainwtnew.vue 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/follow/index.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/medtechnician/PatientChart.vue 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/patient/ExternalPatient.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/patient/behospitalized.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/patient/hospital.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/patient/index.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/patient/operation.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/patient/outpatient.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/patient/physical.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/physical/index.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/propaganda/Missioncreation.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/propaganda/Missionotice.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/propaganda/QuestionnaireTask.vue 88 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/propaganda/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/propaganda/particty.vue 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/questionnaire/index.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/shadow/index.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/subsequent/index.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/satisfaction.vue 1188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/sfstatistics/percentage/index.vue 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/user/index.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/user/profile/index.vue 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vue.config.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dist.zip
Binary files differ
src/api/AiCentre/index.js
@@ -10,3 +10,5 @@
export * from './patientexternal'
export * from './EChartsdata'
export * from './satisfactionse'
export * from './satisfaction'
src/api/AiCentre/satisfaction.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
import request from "@/utils/request";
// å¤–链获取随访
export function getScriptByCondition(data) {
  return request({
    url: "/smartor/servicetask/getScriptByCondition",
    method: "post",
    data: data
  });
}
// ç¼“存问卷
export function saveMYDQuestionAnswer(data) {
  return request({
    url: "/smartor/subtaskAnswer/saveMYDQuestionAnswer",
    method: "post",
    data: data
  });
}
// ç¼“存问卷
export function WLgetDept(orgid) {
  return request({
    url: "/getDept/" + orgid,
    method: "get",
  });
}
src/assets/order/BHostClient.exe
Binary files differ
src/assets/order/Xftp-8.0.0084p.exe
Binary files differ
src/assets/styles/element-variables.scss
@@ -4,8 +4,8 @@
**/
/* theme color */
$--color-primary: #3ba2f7;
$--color-success: #13ce66;
$--color-primary: #3664D9;
$--color-success: #0ABC54;
$--color-warning: #ffba00;
$--color-danger: #ff4949;
// $--color-info: #1E1E1E;
src/assets/styles/sidebar.scss
@@ -15,7 +15,7 @@
    -webkit-transition: width .28s;
    transition: width 0.28s;
    width: $base-sidebar-width !important;
    background: -webkit-linear-gradient(bottom, #3d6df8, #5b8cff);
    // background: -webkit-linear-gradient(bottom, #3d6df8, #5b8cff);
    height: 100%;
    position: fixed;
src/assets/styles/variables.scss
@@ -13,15 +13,17 @@
// é»˜è®¤èœå•主题风格
$base-menu-color:#f7f8f8;
$base-menu-color-active:#f4f4f5;
$base-menu-background:#5788fe;
$base-menu-background:#1D42F5;
// $base-menu-background:linear-gradient(90deg, #1D42F5, #6BAEF5);
$base-logo-title-color: #ffffff;
$base-menu-light-color:rgba(0,0,0,.70);
$base-menu-light-background:#59f97f;
$base-logo-light-title-color: #001529;
$base-sub-menu-background:#99baed;
$base-sub-menu-hover:#001528;
$base-sub-menu-background:#aec6e8;
$base-sub-menu-hover:#6eb8fc;
// è‡ªå®šä¹‰æš—色菜单风格
/**
src/components/CallButton/index.vue
@@ -44,10 +44,11 @@
      sipStatus: "未连接",
      sipStatusClass: "status-disconnected",
      sipConfig: {
        wsUrl: "wss://192.169.129.198:7443",
        sipUri: `${randomNum}` + "@192.169.129.198",
        password: "heskj@1234",
        wsUrl: "wss://1192.170.66.107:7443",
        sipUri: `${randomNum}` + "@1192.170.66.107",
        password: "Smartor@2023",
        displayName: "Web å°é¾™",
        // realm: "9.208.5.18:8090",
      },
    };
  },
@@ -78,7 +79,7 @@
    },
  },
  mounted() {
    console.log("当前分机号", this.sipConfig);
    console.log('当前分机号',this.sipConfig);
    sipService.init(this.sipConfig);
    sipService.onStatusChange = (status) => {
src/components/PatientSelection/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,585 @@
<template>
  <div>
    <el-dialog
      title="派发患者选择"
      :visible.sync="dialogVisiblepatient"
      width="70%"
      :before-close="handleClosehz"
    >
      <div class="examine-jic">
        <div style="margin: 0 10px 20px 10px">
          <el-card class="box-card">
            <el-tag
              v-for="item in overallCase"
              :key="item.icdid"
              type="primary"
              closables
              @close="handleClose(item)"
            >
              {{ item.name }}
            </el-tag>
            <div style="margin-top: 20px; text-align: right">
              å…±é€‰æ‹©<span
                style="font-size: 18px; color: #409eff; margin: 0 10px"
                >{{ overallCase.length }}</span
              >位患者
            </div>
          </el-card>
        </div>
        <div class="jic-value">
          <el-row :gutter="20">
            <!--用户数据-->
            <el-form
              :model="patientqueryParams"
              ref="queryForm"
              size="small"
              :inline="true"
              label-width="98px"
            >
              <el-form-item label="患者:">
                <el-input
                  v-model="patientqueryParams.name"
                  @keyup.enter.native="handleQuery"
                ></el-input>
              </el-form-item>
              <el-form-item label="患者类型">
                <el-select
                  v-model="patientqueryParams.allhosp"
                  placeholder="请选择新增类型"
                >
                  <el-option
                    v-for="item in taskoptions"
                    :label="item.label"
                    :value="item.value"
                  >
                  </el-option>
                </el-select>
              </el-form-item>
              <el-form-item label="患者诊断:">
                <el-input
                  v-model="patientqueryParams.leavediagname"
                  @keyup.enter.native="handleQuery"
                ></el-input>
              </el-form-item>
              <el-form-item label="主治医生:">
                <el-input
                  v-model="patientqueryParams.drname"
                  @keyup.enter.native="handleQuery"
                ></el-input>
              </el-form-item>
              <el-form-item>
                <el-button
                  type="primary"
                  icon="el-icon-search"
                  size="medium"
                  @click="handleQuery"
                  >搜索</el-button
                >
                <el-button
                  icon="el-icon-refresh"
                  size="medium"
                  @click="resetQuery"
                  >重置</el-button
                >
              </el-form-item>
            </el-form>
            <!-- é€‰æ‹©æ‚£è€…列表 -->
            <el-table
              ref="multipleTable"
              :data="donorchargeList"
              tooltip-effect="dark"
              style="width: 100%"
              @selection-change="handleSelectionChange"
            >
              <el-table-column
                fixed="left"
                class="checkall"
                type="selection"
                width="55"
              >
              </el-table-column>
              <div v-for="(item, index) in tableLabel">
                <el-table-column
                  v-if="item.label == '出院日期'"
                  :key="index"
                  :prop="item.prop"
                  :width="item.width"
                  :label="item.label"
                  :formatter="formatData"
                >
                  <template slot-scope="scope">
                    <span>{{ formatTime(scope.row.endtime) }}</span>
                  </template>
                </el-table-column>
                <el-table-column
                  v-if="item.label == '性别'"
                  :key="index"
                  :prop="item.prop"
                  :width="item.width"
                  :label="item.label"
                  :formatter="formatData"
                >
                  <template slot-scope="scope">
                    <span>{{ scope.row.sex == 1 ? "男" : "女" }}</span>
                  </template>
                </el-table-column>
                <el-table-column
                  v-if="item.label != '性别' && item.label != '出院日期'"
                  :key="index"
                  :prop="item.prop"
                  :width="item.width"
                  :label="item.label"
                  :formatter="formatData"
                >
                </el-table-column>
              </div>
            </el-table>
          </el-row>
          <pagination
            v-show="patienttotal > 0"
            :total="patienttotal"
            :page.sync="patientqueryParams.pageNum"
            :limit.sync="patientqueryParams.pageSize"
            @pagination="handleQuery"
          />
        </div>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="$emit('addoption')">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="AddDispatchpatients"
          >确定添加</el-button
        >
      </span>
    </el-dialog>
  </div>
</template>
<script>
import {
  getillnesslist,
  deltargetillness,
  getTaskpatientQC,
  Questionnairetaskgetson,
  Externallist,
  Editsingletask,
} from "@/api/AiCentre/index";
export default {
  name: "Diseasetotality",
  data() {
    return {
      patienttotal: 0, //
      allpids: [],
      // å½“前页选中数据
      multipleSelection: [],
      overallpatin: [],
      form: {},
      patientqueryParams: {
        pageNum: 1,
        pageSize: 10,
        allhosp: "4",
        pids: null,
      },
      donorchargeList: [],
      donorchargeanlList: [], //案例列表
      taskoptions: [
        {
          value: "4",
          label: "出院病人",
        },
        {
          value: "1",
          label: "在院病人",
        },
        {
          value: "2",
          label: "门诊病人",
        },
        {
          value: "3",
          label: "体检病人",
        },
        {
          value: "6",
          label: "院外患者",
        },
        {
          value: "5",
          label: "手术病人",
        },
      ],
      overallCase:[],
      tableLabel: [
        { label: "出院日期", width: "150", prop: "inhosptime" },
        { label: "患者", width: "", prop: "name" },
        { label: "患者诊断", width: "", prop: "leavediagname" },
        { label: "身份证", width: "200", prop: "idcardno" },
        { label: "性别", width: "", prop: "sex" },
        { label: "年龄", width: "", prop: "age" },
        { label: "责任护士", width: "", prop: "nurseName" },
        { label: "主治医生", width: "", prop: "drname" },
        { label: "科室", width: "240", prop: "dept" },
        { label: "病区", width: "240", prop: "leavehospitaldistrictname" },
      ],
    };
  },
  props: {
    dialogVisiblepatient: {
      type: Boolean,
      default: () => {
        return false;
      },
    },
    // 5问卷模板、3随访模板、6宣教
    type: {
      type: Number,
      default: () => {
        return 5;
      },
    },
  },
  created() {},
  mounted() {
    // this.handleAddpatient();
  },
  watch: {},
  methods: {
    //   æ•°æ®è¿‡æ»¤
    formatData(row, column, cellValue) {
      if (column.property === "createType") {
        if (cellValue === 1) {
          return "自动";
        }
        return "手动";
      }
      if (
        column.property === "createTime" ||
        column.property === "inhosptime"
      ) {
        if (cellValue === null) {
          return "";
        }
        return dayjs(cellValue).format("YYYY-MM-DD ");
      }
      return cellValue;
    },
    handleClosehz() {
      this.$emit("addoption");
    },
    // é€‰æ‹©æ•°æ®æ ‡ç­¾åˆ é™¤äº‹ä»¶
    handleClose(item) {
      console.log(item);
      if (this.multipleSelection.indexOf(item) == -1 && !item.outid) {
        this.overallCase.splice(this.overallCase.indexOf(item), 1);
      } else if (item.outid) {
        this.$modal
          .confirm('是否确认删除名称为"' + item.icd10name + '"的数据项?')
          .then(() => {
            this.multipleSelection.splice(
              this.multipleSelection.indexOf(item),
              1
            );
            deltargetillness(item.id).then((res) => {
              if (res.code == 200) {
                this.$modal.msgSuccess("删除成功");
                this.overallCase.splice(this.overallCase.indexOf(item), 1);
              }
            });
            // å–消挂载状态
            this.$refs.multipleTable.toggleRowSelection(item, false);
          })
          .catch(() => {});
      } else {
        this.overallCase.splice(this.overallCase.indexOf(item), 1);
        this.multipleSelection.splice(this.multipleSelection.indexOf(item), 1);
        // å–消挂载状态
        this.$refs.multipleTable.toggleRowSelection(item, false);
      }
    },
    resetQuery() {
      this.patientqueryParams.name = null;
      this.handleAddpatient();
    },
    // è§¦å‘查询事件
    handleAddpatients() {
      this.$emit("kkoption");
      getillnesslist(this.patientqueryParams).then((res) => {
        this.donorchargeList = res.rows;
        this.patienttotal = res.total;
        this.Restorecheck();
      });
    },
    // è§¦å‘查询事件
    handleAddpatient(taskid) {
      this.$emit("kkoption");
      if (taskid != this.taskid) {
        this.recover();
      }
      if (taskid) {
        this.taskid = taskid;
        Questionnairetaskgetson({ taskid: this.taskid }).then((res) => {
          if (res.code == 200) {
            this.form = res.data;
            this.overallpatin = this.form.patTaskRelevances.concat();
            this.allpids = [];
            this.overallpatin.forEach((item) => {
              this.allpids.push(item.patid);
            });
            if (this.allpids[0]) {
              this.patientqueryParams.pids = this.allpids;
            } else {
              this.patientqueryParams.pids = null;
            }
            this.handleQuery();
          }
        });
      }
    },
    handleQuery() {
      // èŽ·å–å¤–éƒ¨æ‚£è€…
      if (this.patientqueryParams.allhosp == 6) {
        this.Externallist();
        return;
      }
      console.log(11);
      if (this.patientqueryParams.allhosp == 4) {
        this.tableLabel = [
          // { label: "入院日期", width: "170", prop: "starttime" },
          { label: "出院日期", width: "150", prop: "endtime" },
          { label: "患者", width: "", prop: "name" },
          { label: "患者诊断", width: "", prop: "leavediagname" },
          { label: "身份证", width: "200", prop: "idcardno" },
          { label: "性别", width: "", prop: "sex" },
          { label: "年龄", width: "", prop: "age" },
          { label: "出院天数", width: "", prop: "endDay" },
          { label: "责任护士", width: "", prop: "nurseName" },
          { label: "医生", width: "", prop: "drname" },
          { label: "科室", width: "180", prop: "dept" },
          { label: "病区", width: "150", prop: "leavehospitaldistrictname" },
        ];
      } else if (this.patientqueryParams.allhosp == 1) {
        this.tableLabel = [
          { label: "入院日期", width: "150", prop: "starttime" },
          { label: "患者", width: "", prop: "name" },
          { label: "患者诊断", width: "", prop: "leavediagname" },
          { label: "身份证", width: "200", prop: "idcardno" },
          { label: "性别", width: "", prop: "sex" },
          { label: "年龄", width: "", prop: "age" },
          { label: "出院天数", width: "", prop: "endDay" },
          { label: "责任护士", width: "", prop: "nurseName" },
          { label: "医生", width: "", prop: "drname" },
          { label: "科室", width: "180", prop: "dept" },
          { label: "病区", width: "150", prop: "leavehospitaldistrictname" },
        ];
      }
      console.log(this.patientqueryParams.allhosp);
      // èŽ·å–æ‚£è€…æ•°æ®
      getTaskpatientQC(this.patientqueryParams).then((response) => {
        this.donorchargeList = response.rows;
        this.donorchargeList.forEach((item) => {
          if (item.endtime) {
            item.endDay = this.daysBetween(item.endtime);
          }
        });
        this.Restorecheck();
        this.patienttotal = response.total;
      });
    },
    // èŽ·å–å¤–éƒ¨æ‚£è€…å¯¼å…¥åˆ—è¡¨
    Externallist() {
      this.tableLabel = [
        { label: "患者", width: "", prop: "name" },
        { label: "身份证", width: "200", prop: "idcardno" },
        { label: "性别", width: "", prop: "sex" },
        { label: "年龄", width: "", prop: "age" },
        { label: "出院天数", width: "", prop: "endDay" },
      ];
      this.patientqueryParams.pageSize = 1000;
      Externallist(this.patientqueryParams).then((response) => {
        this.donorchargeList = response.rows;
        this.donorchargeList.forEach((item) => {
          if (item.endtime) {
            item.endDay = this.daysBetween(item.endtime);
          }
        });
        // this.dialogVisiblepatient = true;
        this.patienttotal = response.total;
      });
    },
    // å¤šé€‰æ¡†é€‰ä¸­æ•°æ®
    handleSelectionChange(selection) {
      if (this.decision) return;
      // åˆ¤æ–­æ˜¯å¦æœ‰åˆ é™¤
      if (this.multipleSelection.length <= selection.length) {
        this.multipleSelection = selection;
      } else {
        this.multipleSelection.forEach((item) => {
          if (selection.includes(item)) {
          } else {
            if (this.multipleSelection.length == 1) {
              this.multipleSelection = [];
            } else {
              this.multipleSelection.splice(
                this.multipleSelection.indexOf(item),
                1
              );
            }
            if (this.overallCase.length == 1) {
              this.overallCase = [];
            } else {
              this.overallCase.splice(this.overallCase.indexOf(item), 1);
            }
          }
        });
      }
      // èµ‹å€¼ç»™æ•´ä½“选中数组
      this.multipleSelection.forEach((item) => {
        if (this.overallCase.every((obj) => obj.name != item.name)) {
          item.isoperation = 1;
          item.patid = item.id;
          item.hospType = this.patientqueryParams.allhosp;
          item.sfzh = item.idcardno;
          item.deptCode = item.deptcode;
          item.deptName = item.dept;
          item.admindate = item.inhosptime;
          item.diagname = item.leavediagname;
          item.sfzh = item.idcardno;
          if (this.patientqueryParams.allhosp == 6) {
            item.patfrom = 1;
          }
          this.overallCase.push(item);
        }
      });
      console.log(this.multipleSelection, "触发选择后multipleSelection");
    },
    // åˆ‡æ¢é¡µåŽæ¢å¤é€‰ä¸­
    Restorecheck() {
      console.log(this.overallCase, "this.overallCase");
      const allid = this.overallCase.map((item) => item.name);
      const overlap = this.donorchargeList.filter((value) => {
        return allid.includes(value.name);
      });
      // ä¿æŒids和当前页面的同步性
      this.multipleSelection = overlap;
      console.log(this.multipleSelection, "进入分页multipleSelection");
      this.toggleSelection(overlap);
    },
    // æŒ‚载选择状态
    toggleSelection(rows) {
      if (rows) {
        this.decision = true;
        this.$nextTick(() => {
          rows.forEach((row) => {
            this.$refs.multipleTable.toggleRowSelection(row, true);
          });
          this.decision = false;
        });
        console.log(123);
      } else {
        this.$refs.multipleTable.clearSelection();
      }
    },
    AddDispatchpatients() {
      console.log(this.overallCase);
      this.form.patTaskRelevances.push(...this.overallCase);
      console.log(this.form.patTaskRelevances);
      this.form.isoperation=2;
      Editsingletask(this.form).then((res) => {
        if (res.code == 200) {
          if (this.form.taskid) {
            this.$modal.msgSuccess("修改成功");
          } else {
            this.$modal.msgSuccess("新增成功");
          }
          this.recover();
      this.$emit("addoption");
        }
      });
      // this.dialogVisiblepatient = false;
      // this.$emit("addoption");
    },
    recover() {
      this.donorchargeList = [];
      this.donorchargeanlList = [];
      this.multipleSelection = [];
      this.allpids = [];
      this.overallpatin = [];
      this.form = {};
      this.patientqueryParams = {
        pageNum: 1,
        pageSize: 10,
        allhosp: "4",
        pids: null,
      };
      this.overallCase = [];
      // this.dialogVisiblepatient = false;
    },
  },
};
</script>
<style lang="scss" scoped>
.examine-jic {
  .headline {
    font-size: 24px;
    border-left: 5px solid #41a1be;
    padding-left: 5px;
    margin-bottom: 10px;
    display: flex;
    justify-content: space-between;
    .Add-details {
      font-size: 18px;
      color: #02a7f0;
      cursor: pointer;
    }
  }
  .jic-value {
    font-size: 20px;
    border-top: 1px solid #a7abac;
    padding: 10px;
    margin-bottom: 10px;
    .details-jic {
      padding: 10px 15px;
      border: 1px solid #dcdfe6;
      -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
        0 0 6px 0 rgba(0, 0, 0, 0.04);
      .details-title {
        display: flex;
        justify-content: space-between;
        margin-bottom: 10px;
        div:nth-child(2) {
          color: #02a7f0;
          cursor: pointer;
        }
      }
      .details-renw {
        background: #e4ebfc;
        padding: 15px 5px;
        border-radius: 5px;
        margin-bottom: 20px;
      }
    }
  }
}
::v-deep.el-table .el-table__header th:first-child .el-checkbox {
  display: none;
}
.el-tag + .el-tag {
  margin-left: 10px;
  margin-bottom: 10px;
}
</style>
src/layout/components/TagsView/index.vue
@@ -265,9 +265,9 @@
        margin-right: 15px;
      }
      &.active {
        background-color: #42b983;
        background-color: #3664D9;
        color: #fff;
        border-color: #42b983;
        border-color: #3664D9;
        &::before {
          content: '';
          background: #fff;
src/permission.js
@@ -1,55 +1,68 @@
import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { getToken } from '@/utils/auth'
import { isRelogin } from '@/utils/request'
import router from "./router";
import store from "./store";
import { Message } from "element-ui";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import { getToken } from "@/utils/auth";
import { isRelogin } from "@/utils/request";
NProgress.configure({ showSpinner: false })
NProgress.configure({ showSpinner: false });
const whiteList = ['/login', '/auth-redirect', '/bind', '/register','/wt','/xj','/sf', '/outsideChain','/outsideChainwt','/outsideChainxj']
const whiteList = [
  "/login",
  "/auth-redirect",
  "/bind",
  "/register",
  "/wt",
  "/xj",
  "/sf",
  "/satisfaction",
  "/loginSSO",
];
router.beforeEach((to, from, next) => {
  NProgress.start()
  NProgress.start();
  if (getToken()) {
    to.meta.title && store.dispatch('settings/setTitle', to.meta.title)
    to.meta.title && store.dispatch("settings/setTitle", to.meta.title);
    /* has token*/
    if (to.path === '/login') {
      next({ path: '/' })
      NProgress.done()
    if (to.path === "/login") {
      next({ path: "/" });
      NProgress.done();
    } else {
      if (store.getters.roles.length === 0) {
        isRelogin.show = true
        isRelogin.show = true;
        // åˆ¤æ–­å½“前用户是否已拉取完user_info信息
        store.dispatch('GetInfo').then(() => {
          isRelogin.show = false
          store.dispatch('GenerateRoutes').then(accessRoutes => {
            // æ ¹æ®roles权限生成可访问的路由表
            router.addRoutes(accessRoutes) // åŠ¨æ€æ·»åŠ å¯è®¿é—®è·¯ç”±è¡¨
            next({ ...to, replace: true }) // hack方法 ç¡®ä¿addRoutes已完成
        store
          .dispatch("GetInfo")
          .then(() => {
            isRelogin.show = false;
            store.dispatch("GenerateRoutes").then((accessRoutes) => {
              // æ ¹æ®roles权限生成可访问的路由表
              router.addRoutes(accessRoutes); // åŠ¨æ€æ·»åŠ å¯è®¿é—®è·¯ç”±è¡¨
              next({ ...to, replace: true }); // hack方法 ç¡®ä¿addRoutes已完成
            });
          })
        }).catch(err => {
            store.dispatch('LogOut').then(() => {
              Message.error(err)
              next({ path: '/' })
            })
          })
          .catch((err) => {
            store.dispatch("LogOut").then(() => {
              Message.error(err);
              next({ path: "/" });
            });
          });
      } else {
        next()
        next();
      }
    }
  } else {
    // æ²¡æœ‰token
    if (whiteList.indexOf(to.path) !== -1) {
      // åœ¨å…ç™»å½•白名单,直接进入
      next()
      next();
    } else {
      next(`/login?redirect=${to.fullPath}`) // å¦åˆ™å…¨éƒ¨é‡å®šå‘到登录页
      NProgress.done()
      next(`/login?redirect=${to.fullPath}`); // å¦åˆ™å…¨éƒ¨é‡å®šå‘到登录页
      NProgress.done();
    }
  }
})
});
router.afterEach(() => {
  NProgress.done()
})
  NProgress.done();
});
src/router/index.js
@@ -46,6 +46,11 @@
    component: () => import('@/views/login'),
    hidden: true
  },
    {
    path: '/loginSSO',
    component: () => import('@/views/loginSSO'),
    hidden: true
  },
  {
    path: '/sf',
    component: () => import('@/views/outsideChainnew'),
@@ -62,6 +67,11 @@
    hidden: true
  },
  {
    path: '/satisfaction',
    component: () => import('@/views/satisfaction'),
    hidden: true
  },
  {
    path: '/outsideChain',
    component: () => import('@/views/outsideChain'),
    hidden: true
src/smartor/dataobject/dw_patouthosp_base.vue
@@ -20,4 +20,4 @@
        </el-form-item>
     </el-form>
    </div>
</template>
</template>
src/smartor/dataobject/dw_patouthosp_list.vue
@@ -21,4 +21,4 @@
</template>
<script>
</script>
</script>
src/store/getters.js
@@ -637,6 +637,131 @@
      },
    },
  ],
  // éšè®¿ç±»åž‹
  tasktypes: (state) => [
    // {
    //   value: 16,
    //   label: "课题随访",
    //   raw: {
    //     cssClass: "",
    //     listClass: "",
    //   },
    // },
    {
      value: 2,
      label: "出院随访",
      raw: {
        cssClass: "",
        listClass: "",
      },
    },
    {
      value: 3,
      label: "门诊随访",
      raw: {
        cssClass: "",
        listClass: "",
      },
    },
    {
      value: 4,
      label: "宣教关怀",
      raw: {
        cssClass: "",
        listClass: "",
      },
    },
    {
      value: 5,
      label: "复诊管理",
      raw: {
        cssClass: "",
        listClass: "",
      },
    },
    {
      value: 6,
      label: "住院满意度",
      raw: {
        cssClass: "",
        listClass: "",
      },
    },
    {
      value: 1,
      label: "监测评估",
      raw: {
        cssClass: "",
        listClass: "",
      },
    },
    {
      value: 14,
      label: "门诊满意度",
      raw: {
        cssClass: "",
        listClass: "",
      },
    },
    {
      value: 15,
      label: "投诉建议",
      raw: {
        cssClass: "",
        listClass: "",
      },
    },
    {
      value: 7,
      label: "患者报告",
      raw: {
        cssClass: "",
        listClass: "",
      },
    },
    {
      value: 9,
      label: "体检随访",
      raw: {
        cssClass: "",
        listClass: "",
      },
    },
    // {
    //   value: 1",
    //   label: "医技随访",
    //   raw: {
    //   cssClass: "",
    //   listClass: "",
    // },
    // },
    // {
    //   value: 11,
    //   label: "影像随访",
    //   raw: {
    //     cssClass: "",
    //     listClass: "",
    //   },
    // },
    // {
    //   value: 12,
    //   label: "心电随访",
    //   raw: {
    //     cssClass: "",
    //     listClass: "",
    //   },
    // },
    // {
    //   value: "13",
    //   label: "专病随访",
    //   raw: {
    //   cssClass: "",
    //   listClass: "",
    // },
    // },
  ],
};
export default getters;
src/store/modules/user.js
@@ -1,226 +1,246 @@
import { login, logout, getInfo } from '@/api/login'
import { getToken, setToken, removeToken } from '@/utils/auth'
import { login, logout, getInfo } from "@/api/login";
import { getToken, setToken, removeToken } from "@/utils/auth";
const user = {
  state: {
    token: getToken(),
    name: '',
    nickName:'',
    Id: '',
    avatar: '',
    hisUserId:'',
    belongWards:[],
    belongDepts:[],
    name: "",
    nickName: "",
    Id: "",
    avatar: "",
    hisUserId: "",
    belongWards: [],
    belongDepts: [],
    roles: [],
    permissions: [],
    // æœåŠ¡ç±»åž‹
  Serviceauthority:  [
    {
      value: "1",
      label: "患者报告",
      route: "followvisit/QuestionnaireTask",
      raw: {
        cssClass: "",
        listClass: "",
    Serviceauthority: [
      {
        value: "1",
        label: "患者报告",
        route: "followvisit/QuestionnaireTask",
        raw: {
          cssClass: "",
          listClass: "",
        },
      },
    },
    {
      value: "2",
      label: "心电随访",
      route: "followvisit/QuestionnaireTask",
      raw: {
        cssClass: "",
        listClass: "",
      {
        value: "2",
        label: "心电随访",
        route: "followvisit/QuestionnaireTask",
        raw: {
          cssClass: "",
          listClass: "",
        },
      },
    },
    {
      value: "3",
      label: "体检随访",
      route: "followvisit/particty",
      raw: {
        cssClass: "",
        listClass: "",
      {
        value: "3",
        label: "体检随访",
        route: "followvisit/particty",
        raw: {
          cssClass: "",
          listClass: "",
        },
      },
    },
    {
      value: "4",
      label: "宣教关怀",
      route: "followvisit/Missioncreation",
      raw: {
        cssClass: "",
        listClass: "",
      {
        value: "4",
        label: "宣教关怀",
        route: "followvisit/Missioncreation",
        raw: {
          cssClass: "",
          listClass: "",
        },
      },
    },
    {
      value: "5",
      label: "出院随访",
      route: "followvisit/particty",
      raw: {
        cssClass: "",
        listClass: "",
      {
        value: "5",
        label: "出院随访",
        route: "followvisit/particty",
        raw: {
          cssClass: "",
          listClass: "",
        },
      },
    },
    {
      value: "6",
      label: "门诊随访",
      route: "followvisit/particty",
      raw: {
        cssClass: "",
        listClass: "",
      {
        value: "6",
        label: "门诊随访",
        route: "followvisit/particty",
        raw: {
          cssClass: "",
          listClass: "",
        },
      },
    },
    {
      value: "7",
      label: "通知服务",
      route: "followvisit/Missioncreation",
      raw: {
        cssClass: "",
        listClass: "",
      {
        value: "7",
        label: "通知服务",
        route: "followvisit/Missioncreation",
        raw: {
          cssClass: "",
          listClass: "",
        },
      },
    },
  ],
    ],
  },
  mutations: {
    SET_TOKEN: (state, token) => {
      state.token = token
      state.token = token;
    },
    SET_NAME: (state, name) => {
      state.name = name
      state.name = name;
    },
    SET_nickNAME: (state, name) => {
      state.nickName = name
      state.nickName = name;
    },
    SET_Id: (state, Id) => {
      state.Id = Id
      console.log(state.Id,'user2');
      state.Id = Id;
      console.log(state.Id, "user2");
    },
    SET_AVATAR: (state, avatar) => {
      state.avatar = avatar
      state.avatar = avatar;
    },
    SET_ROLES: (state, roles) => {
      state.roles = roles
      state.roles = roles;
    },
    SET_PERMISSIONS: (state, permissions) => {
      state.permissions = permissions
      state.permissions = permissions;
    },
    SET_Serviceauthority: (state, Serviceauthority) => {
      state.Serviceauthority = Serviceauthority
      state.Serviceauthority = Serviceauthority;
    },
    SET_leavehospitaldistrictcodes: (state, belongWards) => {
      state.belongWards = belongWards
      state.belongWards = belongWards;
    },
    SET_hisUserId: (state, hisUserId) => {
      state.hisUserId = hisUserId
      state.hisUserId = hisUserId;
    },
    SET_leaveldeptcodes: (state, belongDepts) => {
      state.belongDepts = belongDepts
    }
      state.belongDepts = belongDepts;
    },
  },
  actions: {
    // ç™»å½•
    Login({ commit }, userInfo) {
      console.log(userInfo,'user info');
      console.log(userInfo, "user info");
      const username = userInfo.username.trim()
      const password = userInfo.password
      const code = userInfo.code
      const username = userInfo.username.trim();
      const password = userInfo.password;
      const code = userInfo.code;
      const orgid = userInfo.orgid
      const orgid = userInfo.orgid;
      return new Promise((resolve, reject) => {
        login(username, password, code, orgid).then(res => {
          setToken(res.token)
          commit('SET_TOKEN', res.token)
          localStorage.setItem('orgid', orgid);
          if (orgid=='47255004333112711A1001') {
          localStorage.setItem('orgname', '景宁畲族自治县人民医院');
          localStorage.setItem('ZuHuID', '1400361376454545408');
          localStorage.setItem('deptCode', '1017');
          }else if (orgid=='47231022633110211A2101') {
          localStorage.setItem('orgname', '丽水市中医院');
          localStorage.setItem('ZuHuID', '1400360867068907520');
          localStorage.setItem('deptCode', '01040201');
          }else if (orgid=='47246102433112211A2101') {
          localStorage.setItem('orgname', '缙云县中医医院');
          localStorage.setItem('ZuHuID', '1429338802177000002');
          localStorage.setItem('deptCode', '');
          }else if (orgid=='47240018433118111A2101') {
          localStorage.setItem('orgname', '龙泉市中医医院');
          localStorage.setItem('ZuHuID', '1429338802177000003');
          localStorage.setItem('deptCode', '');
          }else if (orgid=='47243006833112611A2101') {
          localStorage.setItem('orgname', '庆元县中医医院');
          localStorage.setItem('ZuHuID', '1429338802177000004');
          localStorage.setItem('deptCode', '');
          }else if (orgid=='47234002X33112111A2101') {
          localStorage.setItem('orgname', '青田县中医医院');
          localStorage.setItem('ZuHuID', '1429338802177000005');
          localStorage.setItem('deptCode', '');
          }else if (orgid=='47240004533118111A1001') {
          localStorage.setItem('orgname', '龙泉市人民医院');
          localStorage.setItem('ZuHuID', '1429338802177000007');
          localStorage.setItem('deptCode', '');
          }
          resolve()
        }).catch(error => {
          reject(error)
        })
      })
        login(username, password, code, orgid)
          .then((res) => {
            setToken(res.token);
            commit("SET_TOKEN", res.token);
            localStorage.setItem("orgid", orgid);
            if (orgid == "H41010500003") {
              localStorage.setItem("orgname", "河南中医药大学第一附属医院");
              localStorage.setItem("ZuHuID", "1400361376454545408"); // è¯·æ›¿æ¢ä¸ºå®žé™…çš„ZuHuID
              localStorage.setItem("deptCode", "1017"); // è¯·æ›¿æ¢ä¸ºå®žé™…的科室代码
            } else if (orgid == "H41082200269") {
              localStorage.setItem("orgname", "博爱县人民医院");
              localStorage.setItem("ZuHuID", "1400360867068907520"); // è¯·æ›¿æ¢ä¸ºå®žé™…çš„ZuHuID
              localStorage.setItem("deptCode", "01040201"); // è¯·æ›¿æ¢ä¸ºå®žé™…的科室代码
            } else if (orgid == "H41078202417") {
              localStorage.setItem("orgname", "辉县市中医院");
              localStorage.setItem("ZuHuID", "1429338802177000002"); // è¯·æ›¿æ¢ä¸ºå®žé™…çš„ZuHuID
              localStorage.setItem("deptCode", ""); // è¯·æ›¿æ¢ä¸ºå®žé™…的科室代码
            } else if (orgid == "47255004333112711A1001") {
              localStorage.setItem("orgname", "景宁畲族自治县人民医院");
              localStorage.setItem("ZuHuID", "1400361376454545408");
              localStorage.setItem("deptCode", "1017");
            } else if (orgid == "47231022633110211A2101") {
              localStorage.setItem("orgname", "丽水市中医院");
              localStorage.setItem("ZuHuID", "1400360867068907520");
              localStorage.setItem("deptCode", "01040201");
            } else if (orgid == "47246102433112211A2101") {
              localStorage.setItem("orgname", "缙云县中医医院");
              localStorage.setItem("ZuHuID", "1429338802177000002");
              localStorage.setItem("deptCode", "");
            } else if (orgid == "47240018433118111A2101") {
              localStorage.setItem("orgname", "龙泉市中医医院");
              localStorage.setItem("ZuHuID", "1429338802177000003");
              localStorage.setItem("deptCode", "");
            } else if (orgid == "47243006833112611A2101") {
              localStorage.setItem("orgname", "庆元县中医医院");
              localStorage.setItem("ZuHuID", "1429338802177000004");
              localStorage.setItem("deptCode", "");
            } else if (orgid == "47234002X33112111A2101") {
              localStorage.setItem("orgname", "青田县中医医院");
              localStorage.setItem("ZuHuID", "1429338802177000005");
              localStorage.setItem("deptCode", "");
            } else if (orgid == "47240004533118111A1001") {
              localStorage.setItem("orgname", "龙泉市人民医院");
              localStorage.setItem("ZuHuID", "1429338802177000007");
              localStorage.setItem("deptCode", "");
            }
            resolve();
          })
          .catch((error) => {
            reject(error);
          });
      });
    },
    // èŽ·å–ç”¨æˆ·ä¿¡æ¯
    GetInfo({ commit, state }) {
      return new Promise((resolve, reject) => {
        getInfo().then(res => {
          const user = res.user
          const avatar = (user.avatar == "" || user.avatar == null) ? require("@/assets/images/profile.jpg") : process.env.VUE_APP_BASE_API + user.avatar;
          if (res.roles && res.roles.length > 0) { // éªŒè¯è¿”回的roles是否是一个非空数组
            commit('SET_ROLES', res.roles)
            commit('SET_PERMISSIONS', res.permissions)
          } else {
            commit('SET_ROLES', ['ROLE_DEFAULT'])
          }
          commit('SET_NAME', user.userName)
          commit('SET_nickNAME', user.nickName)
          commit('SET_Id', user.userId)
          commit('SET_hisUserId', user.hisUserId)
          commit('SET_leavehospitaldistrictcodes', user.belongWards)
          commit('SET_leaveldeptcodes', user.belongDepts)
          commit('SET_AVATAR', avatar)
          resolve(res)
        }).catch(error => {
          reject(error)
        })
      })
        getInfo()
          .then((res) => {
            const user = res.user;
            const avatar =
              user.avatar == "" || user.avatar == null
                ? require("@/assets/images/profile.jpg")
                : process.env.VUE_APP_BASE_API + user.avatar;
            if (res.roles && res.roles.length > 0) {
              // éªŒè¯è¿”回的roles是否是一个非空数组
              commit("SET_ROLES", res.roles);
              commit("SET_PERMISSIONS", res.permissions);
            } else {
              commit("SET_ROLES", ["ROLE_DEFAULT"]);
            }
            commit("SET_NAME", user.userName);
            commit("SET_nickNAME", user.nickName);
            commit("SET_Id", user.userId);
            commit("SET_hisUserId", user.hisUserId);
            commit("SET_leavehospitaldistrictcodes", user.belongWards);
            commit("SET_leaveldeptcodes", user.belongDepts);
            commit("SET_AVATAR", avatar);
            resolve(res);
          })
          .catch((error) => {
            reject(error);
          });
      });
    },
    // é€€å‡ºç³»ç»Ÿ
    LogOut({ commit, state }) {
      return new Promise((resolve, reject) => {
        logout(state.token).then(() => {
          commit('SET_TOKEN', '')
          commit('SET_ROLES', [])
          commit('SET_PERMISSIONS', [])
          removeToken()
          resolve()
        }).catch(error => {
          reject(error)
        })
      })
        logout(state.token)
          .then(() => {
            commit("SET_TOKEN", "");
            commit("SET_ROLES", []);
            commit("SET_PERMISSIONS", []);
            removeToken();
            resolve();
          })
          .catch((error) => {
            reject(error);
          });
      });
    },
    // å‰ç«¯ ç™»å‡º
    FedLogOut({ commit }) {
      return new Promise(resolve => {
        commit('SET_TOKEN', '')
        removeToken()
        resolve()
      })
    }
  }
}
      return new Promise((resolve) => {
        commit("SET_TOKEN", "");
        removeToken();
        resolve();
      });
    },
  },
};
export default user
export default user;
src/utils/sipService.js
@@ -121,7 +121,7 @@
        };
        this.currentSession = this.ua.call(
          `sip:${targetNumber}@192.169.129.198`,
          `sip:${targetNumber}@1192.170.66.107`,
          options
        );
src/views/complaint/complaintlist/index.vue
@@ -80,7 +80,6 @@
          <el-col :span="1.5">
            <el-button
              type="primary"
              plain
              icon="el-icon-plus"
              size="medium"
              @click="handleAdd"
@@ -91,7 +90,6 @@
          <el-col :span="1.5">
            <el-button
              type="success"
              plain
              icon="el-icon-edit"
              size="medium"
              :disabled="single"
src/views/complaint/complaintmy/index.vue
@@ -51,7 +51,6 @@
          <el-col :span="1.5">
            <el-button
              type="primary"
              plain
              icon="el-icon-plus"
              size="medium"
              @click="handleAdd"
src/views/followvisit/SpecificDisease/index.vue
@@ -138,8 +138,7 @@
        <el-col :span="1.5">
          <el-button
            type="primary"
            plain
            icon="el-icon-plus"
                        icon="el-icon-plus"
            size="medium"
            @click="handleAdd"
            >新增</el-button
@@ -826,7 +825,7 @@
        //   value: 0,
        // },
        {
          name: "应随访",
          name: "需随访",
          value: 0,
        },
@@ -1017,6 +1016,8 @@
    },
     //患者360跳转
     gettoken360(sfzh,drcode,drname) {
      this.$modal.msgWarning('360功能暂未开通');
  return; // é˜»æ­¢åŽç»­ä»£ç æ‰§è¡Œ
      this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh;
      if (this.postData.XiaoXiTou.ZuHuMC=='丽水市中医院') {
        this.postData.YeWuXX.YongHuXX.YongHuID = '1400398571877961728';
@@ -1445,10 +1446,12 @@
  }
}
::v-deep.leftvlue .el-card__body {
  background: #d0e9fd;
  background: #F2F8FF;
  color: #324A9B;
}
::v-deep.leftvlue .el-card__body:hover {
  background: #8dc8f8;
  background: #3664D9;
  color: #fff;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
::v-deep.errleftvlue .el-card__body {
src/views/followvisit/again/index.vue
@@ -180,8 +180,7 @@
        <el-col :span="1.5">
          <el-button
            type="primary"
            plain
            icon="el-icon-plus"
                        icon="el-icon-plus"
            size="medium"
            @click="handleAdd"
            >新增</el-button
@@ -928,7 +927,7 @@
        //   value: 0,
        // },
        {
          name: "应随访",
          name: "需随访",
          value: 0,
        },
        {
@@ -1427,6 +1426,8 @@
    },
    //患者360跳转
    gettoken360(sfzh, drcode, drname) {
      this.$modal.msgWarning('360功能暂未开通');
  return; // é˜»æ­¢åŽç»­ä»£ç æ‰§è¡Œ
      this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh;
      if (this.postData.XiaoXiTou.ZuHuMC == "丽水市中医院") {
        this.postData.YeWuXX.YongHuXX.YongHuID = "1400398571877961728";
@@ -1774,10 +1775,12 @@
  }
}
::v-deep.leftvlue .el-card__body {
  background: #d0e9fd;
  background: #F2F8FF;
  color: #324A9B;
}
::v-deep.leftvlue .el-card__body:hover {
  background: #8dc8f8;
  background: #3664D9;
  color: #fff;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
::v-deep.errleftvlue .el-card__body {
@@ -1822,7 +1825,9 @@
  border-radius: 1px;
  color: #ffffff;
}
.button-textxga {
  color: #de7897;
}
::v-deep.el-radio-group {
  span {
    font-size: 24px;
src/views/followvisit/complaint/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1968 @@
<template>
  <div class="app-container">
    <div class="leftvlue" style="margin-bottom: 20px">
      <el-row :gutter="10">
        <el-col :span="2.5" v-for="(item, index) in cardlist" :key="index">
          <el-card
            shadow="hover"
            :body-style="item.router ? ' cursor: pointer' : 'cursor: default'"
          >
            <div style="padding: 8px" @click="$router.push(item.router)">
              <span>{{ item.name }}</span>
              <div
                style="
                  text-align: center;
                  font-size: 18px;
                  margin-top: 10px;
                  font-weight: 600;
                "
              >
                {{ item.value ? item.value : 0 }}
              </div>
            </div>
          </el-card>
        </el-col>
        <el-col :span="2.5">
          <div class="ysfleftvlue">
            <el-card shadow="hover">
              <div style="padding: 8px">
                <span>表单已发送</span>
                <div
                  style="
                    text-align: center;
                    font-size: 18px;
                    margin-top: 10px;
                    font-weight: 600;
                  "
                >
                  {{ yfsvalue }}
                </div>
              </div>
            </el-card>
          </div>
        </el-col>
        <el-col :span="2.5">
          <div class="errleftvlue">
            <el-card shadow="hover">
              <div style="padding: 8px">
                <span>异常</span>
                <div
                  style="
                    text-align: center;
                    font-size: 18px;
                    margin-top: 10px;
                    font-weight: 600;
                  "
                >
                  {{ ycvalue }}
                </div>
              </div>
            </el-card>
          </div>
        </el-col>
      </el-row>
    </div>
    <el-row :gutter="20">
      <!--用户数据-->
      <el-form
        :model="topqueryParams"
        ref="queryForm"
        size="small"
        :inline="true"
        v-show="showSearch"
        label-width="98px"
      >
        <el-form-item label="任务名称">
          <el-input
            v-model="topqueryParams.taskName"
            placeholder="请选择任务名称"
          ></el-input>
        </el-form-item>
        <el-form-item label="出院时间">
          <el-date-picker
            v-model="dateRange"
            style="width: 240px"
            value-format="yyyy-MM-dd"
            type="daterange"
            range-separator="-"
            start-placeholder="开始日期"
            end-placeholder="结束日期"
          ></el-date-picker>
        </el-form-item>
        <el-form-item label="患者姓名" prop="sendname">
          <el-input
            v-model="topqueryParams.sendname"
            placeholder="请输入患者姓名"
          ></el-input>
        </el-form-item>
        <el-form-item label="诊断名称" prop="leavediagname">
          <el-input
            v-model="topqueryParams.leavediagname"
            placeholder="请输入诊断名称"
          ></el-input>
        </el-form-item>
        <el-form-item label="随访人员" prop="updateBy">
          <el-input
            v-model="topqueryParams.updateBy"
            placeholder="请输入随访人员"
          ></el-input>
        </el-form-item>
        <el-form-item label="主治医生" prop="drname">
          <el-input
            v-model="topqueryParams.drname"
            placeholder="请输入主治医生"
          ></el-input>
        </el-form-item>
        <el-form-item label="经管医生" prop="managementDoctor">
          <el-input
            v-model="topqueryParams.managementDoctor"
            placeholder="请输入主治医生"
          ></el-input>
        </el-form-item>
        <el-form-item label="患者范围" prop="status">
          <el-cascader
            v-model="topqueryParams.scopetype"
            placeholder="默认全部"
            :options="sourcetype"
            :props="{ expandTrigger: 'hover' }"
            @change="handleChange"
          ></el-cascader>
        </el-form-item>
        <el-form-item label="任务状态" prop="status">
          <el-select v-model="topqueryParams.sendstate" placeholder="请选择">
            <el-option
              v-for="item in topicoptions"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            >
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="排序方式" prop="status">
          <el-select v-model="topqueryParams.sort" placeholder="请选择">
            <el-option
              v-for="item in topicoptionssort"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            >
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item>
          <el-button
            type="primary"
            icon="el-icon-search"
            size="medium"
            @click="handleQuery(1)"
            >搜索</el-button
          >
          <el-button icon="el-icon-refresh" size="medium" @click="resetQuery"
            >重置</el-button
          >
        </el-form-item>
      </el-form>
      <el-divider></el-divider>
      <el-row :gutter="10" class="mb8">
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button
                type="warning"
                plain
                icon="el-icon-upload2"
                size="medium"
                @click="handleExport"
                >导出</el-button
              >
            </div>
          </div>
        </el-col>
        <el-col :span="1.5">
          <el-button
            type="primary"
                        icon="el-icon-plus"
            size="medium"
            @click="handleAdd"
            >新增</el-button
          >
        </el-col>
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button
                type="warning"
                plain
                icon="el-icon-warning-outline"
                size="medium"
                @click="toleadExport(1)"
                >执行失败</el-button
              >
            </div>
          </div>
        </el-col>
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button
                type="danger"
                plain
                icon="el-icon-warning"
                size="medium"
                @click="toleadExport(2)"
                >结果异常</el-button
              >
            </div>
          </div>
        </el-col>
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button
                type="success"
                plain
                size="medium"
                @click="buidegetTasklist()"
                >待办服务</el-button
              >
            </div>
          </div>
        </el-col>
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button
                type="primary"
                plain
                size="medium"
                @click="affiliation()"
                >本人所属服务</el-button
              >
            </div>
          </div>
        </el-col>
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button type="success" size="medium" @click="onthatday()"
                >当日服务</el-button
              >
            </div>
          </div>
        </el-col>
      </el-row>
      <el-table
        v-loading="loading"
        ref="userform"
        :data="userList"
        :row-class-name="tableRowClassName"
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="50" align="center" />
        <el-table-column
          label="任务名称"
          fixed
          width="150"
          show-overflow-tooltip
          align="center"
          key="taskName"
          prop="taskName"
        />
        <!-- <el-table-column label="序号" fixed align="center" key="id" prop="id" /> -->
        <el-table-column
          label="姓名"
          width="100"
          align="center"
          key="sendname"
          prop="sendname"
        >
          <template slot-scope="scope">
            <el-button
              size="medium"
              type="text"
              @click="
                gettoken360(scope.row.sfzh, scope.row.drcode, scope.row.drname)
              "
              ><span class="button-textsc">{{
                scope.row.sendname
              }}</span></el-button
            >
          </template>
        </el-table-column>
        <el-table-column
          label="任务状态"
          align="center"
          key="sendstate"
          prop="sendstate"
          width="120"
        >
          <template slot-scope="scope">
            <el-tooltip
              class="item"
              effect="dark"
              :content="scope.row.remark"
              placement="top-start"
            >
              <div v-if="scope.row.sendstate == 1">
                <el-tag type="primary" :disable-transitions="false"
                  >表单已领取</el-tag
                >
              </div>
              <div v-if="scope.row.sendstate == 2">
                <el-tag type="primary" :disable-transitions="false"
                  >待随访</el-tag
                >
              </div>
              <div v-if="scope.row.sendstate == 3">
                <el-tag type="success" :disable-transitions="false"
                  >表单已发送</el-tag
                >
              </div>
              <div v-if="scope.row.sendstate == 4">
                <el-tag type="info" :disable-transitions="false">不执行</el-tag>
              </div>
              <div v-if="scope.row.sendstate == 5">
                <el-tag type="danger" :disable-transitions="false"
                  >发送失败</el-tag
                >
              </div>
              <div v-if="scope.row.sendstate == 6">
                <el-tag type="success" :disable-transitions="false"
                  >已完成</el-tag
                >
              </div>
            </el-tooltip>
          </template>
        </el-table-column>
        <!-- <el-table-column
          label="任务异常说明"
          width="120"
          align="center"
          key="remark"
          prop="remark" -->
        />
        <el-table-column
          label="处理意见"
          align="center"
          key="suggest"
          prop="suggest"
          width="120"
        >
          <template slot-scope="scope">
            <dict-tag
              :options="dict.type.sys_suggest"
              :value="scope.row.suggest"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="随访完成时间"
          sortable
          align="center"
          prop="finishtime"
          width="160"
        >
          <template slot-scope="scope">
            <span>{{ parseTime(scope.row.finishtime) }}</span>
          </template>
        </el-table-column>
        <el-table-column
          label="出院日期"
          width="200"
          align="center"
          key="endtime"
          prop="endtime"
        >
          <template slot-scope="scope">
            <span>{{ formatTime(scope.row.endtime) }}</span>
          </template></el-table-column
        >
        <el-table-column
          label="主治医生"
          width="120"
          align="center"
          key="drname"
          prop="drname"
        />
        <el-table-column
          label="随访人员"
          align="center"
          key="updateBy"
          prop="updateBy"
          width="120"
        />
        <el-table-column
          label="经管医生"
          align="center"
          key="managementDoctor"
          prop="managementDoctor"
          width="120"
        />
        <el-table-column
          label="出院天数"
          width="120"
          align="center"
          key="endDay"
          prop="endDay"
        >
          <template slot-scope="scope">
            <span>{{ scope.row.endDay ? scope.row.endDay + "天" : "" }}</span>
          </template>
        </el-table-column>
        <el-table-column
          label="身份证号码"
          width="200"
          align="center"
          key="sfzh"
          prop="sfzh"
        />
        <el-table-column
          label="联系电话"
          width="200"
          align="center"
          key="phone"
          prop="phone"
        />
        <el-table-column
          label="责任护士"
          width="120"
          align="center"
          key="nurseName"
          prop="nurseName"
        />
        <!-- <el-table-column
          label="病历号"
          align="center"
          sortable
          key="medicalRecordNo"
          prop="medicalRecordNo"
          width="120"
        /> -->
        <!-- <el-table-column label="年龄" align="center" key="age" prop="age" /> -->
        <!-- <el-table-column label="性别"width="100" align="center" key="sex" prop="sex" /> -->
        <!-- <el-table-column label="床号" align="center" key="badNo" prop="badNo" /> -->
        <el-table-column
          label="科室"
          align="center"
          key="deptname"
          prop="deptname"
          width="120"
        >
        </el-table-column>
        <el-table-column
          label="病区"
          align="center"
          key="leavehospitaldistrictname"
          prop="leavehospitaldistrictname"
          width="120"
        >
        </el-table-column>
        <el-table-column
          label="诊断名称"
          align="center"
          key="leavediagname"
          prop="leavediagname"
          width="120"
          :show-overflow-tooltip="true"
        >
        </el-table-column>
        <el-table-column
          label="投诉建议模板名称"
          align="center"
          key="templatename"
          prop="templatename"
          width="200"
        />
        <el-table-column
          label="任务执行方式"
          align="center"
          key="preachform"
          prop="preachform"
          width="160"
          :show-overflow-tooltip="true"
        >
          <template slot-scope="scope">
            <span v-for="item in scope.row.preachform">{{ item }}、 </span>
          </template>
        </el-table-column>
        <!-- <el-table-column
          label="任务发送流程"
          align="center"
          key="serviceSubtaskRecordList"
          prop="serviceSubtaskRecordList"
          width="160"
          :show-overflow-tooltip="true"
        >
          <template slot-scope="scope">
            <span v-for="item in scope.row.serviceSubtaskRecordList"
              >{{ item.remark }}、
            </span>
          </template>
        </el-table-column> -->
        <el-table-column
          label="任务结果说明"
          width="220"
          align="center"
          key="remark"
          prop="remark"
        >
          <template slot-scope="scope" v-if="scope.row.remark">
            <el-tooltip
              :content="scope.row.remark"
              placement="top"
              effect="dark"
            >
              <el-tag
                type="warning"
                v-if="scope.row.sendstate != 5 && scope.row.sendstate != 4"
                >{{ scope.row.remark }}</el-tag
              >
              <el-tag type="warning" v-else>{{ scope.row.remark }}</el-tag>
            </el-tooltip>
          </template>
        </el-table-column>
        <el-table-column
          label="操作"
          align="center"
          fixed="right"
          width="300"
          class-name="small-padding fixed-width"
        >
          <template slot-scope="scope">
            <!-- <el-tooltip
              class="item"
              effect="dark"
              content="再次随访"
              placement="top"
            >
              <el-button
                size="medium"
                type="text"
                v-if="scope.row.isVisitAgain!=2"
                @click="followupvisit(scope.row)"
                ><span class="button-bb"
                  ><i class="el-icon-s-promotion"></i>再次随访</span
                ></el-button
              >
            </el-tooltip>
            <el-tooltip
              v-if="scope.row.sendstate == 1 || scope.row.sendstate == 2"
              class="item"
              effect="dark"
              content="暂停服务"
              placement="top"
            >
              <el-button
                size="medium"
                type="text"
                @click="handlestop(scope.row)"
                v-hasPermi="['system:user:edit']"
                ><span class="button-sc"
                  ><i class="el-icon-remove-outline"></i>暂停服务</span
                ></el-button
              >
            </el-tooltip> -->
            <el-button size="medium" type="text" @click="Seedetails(scope.row)"
              ><span class="button-zx"
                ><i class="el-icon-s-order"></i>查看详情</span
              ></el-button
            >
            <el-button
              size="medium"
              type="text"
              @click="handleUpdate(scope.row)"
              ><span class="button-textxga"
                ><i class="el-icon-edit"></i>患者过滤</span
              ></el-button
            >
          </template>
        </el-table-column>
      </el-table>
      <pagination
        v-show="total > 0"
        :total="total"
        :page.sync="topqueryParams.pageNum"
        :limit.sync="topqueryParams.pageSize"
        @pagination="getList"
      />
    </el-row>
    <!-- æ»¡æ„åº¦å¼¹æ¡† -->
    <el-dialog
      title="随访满意度评分"
      :visible.sync="scoreDialogVisible"
      width="80%"
      :close-on-click-modal="false"
    >
      <el-table :data="selectedRows" border style="width: 100%">
        <el-table-column
          label="姓名"
          width="100"
          align="center"
          prop="sendname"
        />
        <el-table-column
          label="任务名称"
          width="180"
          align="center"
          prop="taskName"
        />
        <!-- æ–°å¢žè¯„分列 -->
        <el-table-column
          label="真实性(20)"
          align="center"
          key="authenticity"
          prop="authenticity"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.authenticity"
              :min="0"
              :max="20"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="一周内完成(20)"
          align="center"
          key="weekFinish"
          prop="weekFinish"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.weekFinish"
              :min="0"
              :max="20"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="规范性(10)"
          align="center"
          key="standard"
          prop="standard"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.standard"
              :min="0"
              :max="10"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="及时性(10)"
          align="center"
          key="timeliness"
          prop="timeliness"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.timeliness"
              :min="0"
              :max="10"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="宣教情况(10)"
          align="center"
          key="library"
          prop="library"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.library"
              :min="0"
              :max="10"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="环境满意度(10)"
          align="center"
          key="environment"
          prop="environment"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.environment"
              :min="0"
              :max="10"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="医生满意度(10)"
          align="center"
          key="doctorSatisfaction"
          prop="doctorSatisfaction"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.doctorSatisfaction"
              :min="0"
              :max="10"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="护士满意度(10)"
          align="center"
          key="nurseSatisfaction"
          prop="nurseSatisfaction"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.nurseSatisfaction"
              :min="0"
              :max="10"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="总分"
          align="center"
          key="total"
          prop="total"
          fixed="right"
        >
          <template slot-scope="scope">
            <span>{{ calculateTotal(scope.row) }}</span>
          </template>
        </el-table-column>
      </el-table>
      <div slot="footer" class="dialog-footer">
        <el-button @click="scoreDialogVisible = false">取消</el-button>
        <el-button type="primary" @click="saveScores">保存</el-button>
      </div>
    </el-dialog>
    <!-- æ·»åŠ æˆ–ä¿®æ”¹å½±åƒéšè®¿å¯¹è¯æ¡† -->
    <el-dialog
      :title="amendtag ? '修改患者信息' : '新增患者'"
      :visible.sync="Labelchange"
      width="900px"
    >
      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
        <el-row>
          <el-col :span="8">
            <el-form-item label="姓名" width="100" prop="name">
              <el-input
                v-model="form.name"
                placeholder="请输入姓名"
                maxlength="30"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="性别" width="100" prop="sex">
              <el-select v-model="form.sex" placeholder="请选择性别">
                <el-option
                  v-for="dict in sextype"
                  :key="dict.value"
                  :label="dict.label"
                  :value="dict.value"
                ></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="年龄" prop="age">
              <el-input
                v-model="form.age"
                placeholder="请输入年龄"
                maxlength="30"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row >
          <el-col :span="8">
            <el-form-item label="过滤医生" width="100" prop="filterDrname">
              <el-input
                v-model="form.filterDrname"
                placeholder="请输入医生姓名"
                maxlength="30"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="24">
            <el-form-item label="过滤原因">
              <el-input
                v-model="form.notrequiredreason"
                type="textarea"
                placeholder="请输入过滤原因"
              ></el-input>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">ç¡® å®š</el-button>
        <el-button @click="cancel">取 æ¶ˆ</el-button>
      </div>
    </el-dialog>
    <!-- ä¿®æ”¹å‘送时间对话框 -->
    <el-dialog
      title="发送时间设置"
      :visible.sync="modificationVisible"
      width="45%"
    >
      <div style="margin-bottom: 20px; color: red">
        ç»Ÿä¸€ä¿®æ”¹å½“天未发送的任务时间
      </div>
      <el-form
        :model="ruleForm"
        :rules="rules"
        ref="ruleForm"
        label-width="120px"
        class="demo-ruleForm"
      >
        <el-form-item label="发送日期">
          <el-date-picker
            v-model="ruleForm.value1"
            type="date"
            placeholder="选择日期"
          >
          </el-date-picker>
        </el-form-item>
        <el-form-item label="时间段" prop="type">
          <el-checkbox-group v-model="ruleForm.type">
            <el-checkbox label="上午" name="type"></el-checkbox>
            <el-checkbox label="下午" name="type"></el-checkbox>
            <el-checkbox label="晚上" name="type"></el-checkbox>
          </el-checkbox-group>
        </el-form-item>
        <el-form-item label="上午时间区间" required>
          <el-time-picker
            is-range
            v-model="ruleForm.value2"
            range-separator="至"
            start-placeholder="开始时间"
            end-placeholder="结束时间"
            placeholder="选择时间范围"
          >
          </el-time-picker>
        </el-form-item>
        <el-form-item label="下午时间区间" required>
          <el-time-picker
            is-range
            v-model="ruleForm.value3"
            range-separator="至"
            start-placeholder="开始时间"
            end-placeholder="结束时间"
            placeholder="选择时间范围"
          >
          </el-time-picker>
        </el-form-item>
        <el-form-item label="晚上时间区间" required>
          <el-time-picker
            is-range
            v-model="ruleForm.value4"
            range-separator="至"
            start-placeholder="开始时间"
            end-placeholder="结束时间"
            placeholder="选择时间范围"
          >
          </el-time-picker>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="modificationVisible = false">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="modificationVisible = false"
          >ç¡® å®š</el-button
        >
      </span>
    </el-dialog>
    <!-- å†æ¬¡éšè®¿ -->
  </div>
</template>
<script>
import {
  delUser,
  addUser,
  updateUser,
  resetUserPwd,
  changeUserStatus,
} from "@/api/system/user";
import {
  getTaskservelist,
  buidegetTasklist,
  addserviceSubtask,
  query360PatInfo,
  addsatisfaction,
} from "@/api/AiCentre/index";
import { alterpatient, particularpatient } from "@/api/patient/homepage";
import Treeselect from "@riophae/vue-treeselect";
import store from "@/store";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
  name: "Discharge",
  dicts: ["sys_normal_disable", "sys_user_sex", "sys_yujing", "sys_suggest"],
  components: { Treeselect },
  data() {
    return {
      // é®ç½©å±‚
      loading: true,
      // é€‰ä¸­æ•°ç»„
      ids: [],
      // éžå•个禁用
      single: true,
      // éžå¤šä¸ªç¦ç”¨
      multiple: true,
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      // æ€»æ¡æ•°
      total: 0,
      // ç”¨æˆ·è¡¨æ ¼æ•°æ®
      userList: null,
      // å¼¹å‡ºå±‚标题
      title: "新增影像随访",
      // æ˜¯å¦æ˜¾ç¤ºä¿®æ”¹ã€æ·»åŠ å¼¹å‡ºå±‚
      addalteropen: false,
      // ä¿®æ”¹å‘送时间对话框
      modificationVisible: false,
      // éƒ¨é—¨åç§°
      deptName: undefined,
      // é»˜è®¤å¯†ç 
      initPassword: undefined,
      // æ—¥æœŸèŒƒå›´
      dateRange: [],
      dateRangefs: [],
      // å²—位选项
      postOptions: [],
      ruleForm: {
        type: [],
      },
      zcform: {},
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      Labelchange: false,
      ycvalue: "",
      yfsvalue: "",
      inputValue: "",
      preachform: "",
      previewVisible: false, //影像随访预览弹框
      radio: "",
      radios: [],
      previewtype: 2, //预览影像随访类型
      total: 0, // æ€»æ¡æ•°
      // æ»¡æ„åº¦è°ƒæŸ¥æ•°æ®
      scoreDialogVisible: false,
      selectedRows: [],
      value: [],
      list: [],
      sourcetype: [
        {
          value: 1,
          label: "科室",
          children: [],
        },
        {
          value: 2,
          label: "病区",
          children: [],
        },
        {
          value: 3,
          label: "全部",
        },
      ],
      loading: false,
      cardlist: [
        {
          name: "服务总量",
          value: 0,
        },
        // {
        //   name: "患者过滤",
        //   value: 0,
        // },
        {
          name: "需随访",
          value: 0,
        },
        {
          name: "发送失败",
          value: 0,
        },
        {
          name: "待随访",
          value: 0,
        },
        // {
        //   name: "已发送",
        //   value: 0,
        // },
        // {
        //   name: "表单已发送",
        //   value: 0,
        // },
      ],
      zcrules: {
        date1: [
          { required: true, message: "请选择随访方式", trigger: "change" },
        ],
        resource: [
          { required: true, message: "请选择随访时间", trigger: "blur" },
        ],
      },
      // è¡¨å•参数
      form: {
        phonenumber: "",
        totagid: "",
        types: "",
        nickName: "",
        qystatus: "",
        btstatus: "",
      },
      topicoptionssort: [
        {
          value: 0,
          label: "出院时间(正序)",
        },
        {
          value: 1,
          label: "出院时间(倒序)",
        },
        {
          value: 2,
          label: "发送时间(正序)",
        },
        {
          value: 3,
          label: "发送时间(倒序)",
        },
      ],
      // æŸ¥è¯¢å‚æ•°
      topqueryParams: {
        pageNum: 1,
        pageSize: 10,
        sendstate: 6,
        sort: 2, //0 å‡ºé™¢æ—¶é—´(正序)    1 å‡ºé™¢æ—¶é—´(倒序)   2 å‘送时间(正序)    3 å‘送时间(倒序)
        serviceType: 15,
        searchscope: 3,
        visitCount: 1,
        scopetype: [],
        leaveldeptcodes: [],
        leavehospitaldistrictcodes: [],
      },
      propss: { multiple: true },
      options: [],
      topicoptions: [
        {
          value: null,
          label: "全部",
        },
        {
          value: 1,
          label: "表单已领取",
        },
        {
          value: 2,
          label: "待随访",
        },
        {
          value: 3,
          label: "表单已发送",
        },
        {
          value: 4,
          label: "不执行",
        },
        {
          value: 5,
          label: "发送失败",
        },
        {
          value: 6,
          label: "已完成",
        },
      ],
      sextype: [
        {
          value: 1,
          label: "男",
        },
        {
          value: 2,
          label: "女",
        },
      ],
      topicoptionsyj: [
        {
          value: 1,
          label: "异常",
        },
        {
          value: 0,
          label: "正常",
        },
      ],
      url: "http://9.208.2.190:8090/smartor/serviceExternal/query360PatInfo",
      postData: {
        XiaoXiTou: {
          FaSongFCSJC: "ZJHES",
          FaSongJGID: localStorage.getItem("orgid"),
          FaSongJGMC: localStorage.getItem("orgname"),
          FaSongSJ: "2025-01-09 17:29:36",
          FaSongXTJC: "SUIFANGXT",
          FaSongXTMC: "随访系统",
          XiaoXiID: "5FA92AFB-9833-4608-87C7-F56A654AC171",
          XiaoXiLX: "SC_LC_360STCX",
          XiaoXiMC: "360 视图查询",
          ZuHuID: localStorage.getItem("ZuHuID"),
          ZuHuMC: localStorage.getItem("orgname"),
        },
        YeWuXX: {
          BingRenXX: {
            ZhengJianHM: "",
            ZhengJianLXDM: "01",
            ZhengJianLXMC: "居民身份证",
            ZuZhiJGID: localStorage.getItem("orgid"),
            ZuZhiJGMC: localStorage.getItem("orgname"),
          },
          YongHuXX: {
            XiTongID: "SUIFANGXT",
            XiTongMC: "随访系统",
            YongHuID: "1400466972205912064",
            YongHuXM: "JNRMYY",
            ZuZhiJGID: localStorage.getItem("orgid"),
            ZuZhiJGMC: localStorage.getItem("orgname"),
            idp: "lyra",
          },
        },
      },
      amendtag: false,
      errtype: "",
      leavehospitaldistrictcode: "",
      serviceState: [],
      checkboxlist: [],
      // è¡¨å•校验
      rules: {},
    };
  },
  watch: {},
  created() {
    this.serviceState = store.getters.serviceState;
    this.checkboxlist = store.getters.checkboxlist;
    this.errtype = this.$route.query.errtype;
    this.leavehospitaldistrictcode =
      this.$route.query.leavehospitaldistrictcode;
    this.sourcetype[0].children = store.getters.belongDepts.map((dept) => {
      return {
        label: dept.deptName,
        value: dept.deptCode,
      };
    });
    this.sourcetype[1].children = store.getters.belongWards.map((dept) => {
      return {
        label: dept.districtName,
        value: dept.districtCode,
      };
    });
    if (this.errtype) {
      this.toleadExport(2);
    } else {
      this.getList(1);
    }
    this.getConfigKey("sys.user.initPassword").then((response) => {
      this.initPassword = response.msg;
    });
  },
  activated() {
    this.getList(1);
  },
  methods: {
    /** æŸ¥è¯¢éšè®¿æœåŠ¡åˆ—è¡¨ */
    getList(refresh) {
      // é»˜è®¤å…¨éƒ¨
      if (this.topqueryParams.searchscope == 3) {
        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
          (obj) => obj.deptCode
        );
        this.topqueryParams.leavehospitaldistrictcodes =
          store.getters.belongWards.map((obj) => obj.districtCode);
      }
      // æŽ¥å—异常跳转
      if (this.errtype) {
        this.topqueryParams.leavehospitaldistrictcodes.push(
          this.leavehospitaldistrictcode
        );
        console.log(this.topqueryParams.leavehospitaldistrictcodes, "11");
      }
      this.loading = true;
      if (
        this.topqueryParams.leavehospitaldistrictcodes[0] &&
        this.topqueryParams.leaveldeptcodes[0]
      ) {
        this.topqueryParams.deptOrDistrict = 2;
      } else {
        this.topqueryParams.deptOrDistrict = 1;
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
        if (refresh) {
          this.cardlist[0].value =
            Number(response.rows[0].wzx) + Number(response.rows[0].ysf);
          // this.cardlist[1].value = response.rows[0].wzx;
          this.cardlist[1].value = response.rows[0].ysf;
          this.ycvalue = response.rows[0].yc;
          this.cardlist[2].value = response.rows[0].fssb;
          this.cardlist[3].value = response.rows[0].dsf;
          // this.cardlist[4].value = response.rows[0].yfs2;
          this.yfsvalue = response.rows[0].yfs;
        }
        this.loading = false;
        this.userList.forEach((item) => {
          let idArray = null;
          if (item.endtime) {
            item.endDay = this.daysBetween(item.endtime);
          }
          if (item.preachform) {
            if (item.endtime) {
              item.preachformson = item.preachform;
              idArray = item.preachform.split(",");
            }
            item.preachform = idArray.map((value) => {
              // æŸ¥æ‰¾id对应的对象
              const item = this.checkboxlist.find(
                (item) => item.value == value
              );
              // å¦‚果找到对应的id,返回label值,否则返回null
              return item ? item.label : null;
            });
          }
        });
        this.total = response.total;
      });
    },
    affiliation() {
      this.topqueryParams.drcode = store.getters.hisUserId;
      this.topqueryParams.nurseId = store.getters.hisUserId;
      this.topqueryParams.managementDoctor = store.getters.name;
      this.getList(1);
    },
    onthatday() {
      this.topqueryParams.startSendDateTime = this.getCurrentDate();
      this.topqueryParams.endSendDateTime = this.getCurrentDate();
      this.getList(1);
    },
    getCurrentDate() {
      const now = new Date();
      return now.toISOString().slice(0, 10); // æˆªå–前10个字符,即 YYYY-MM-DD
    },
    buidegetTasklist(type) {
      if (this.topqueryParams.searchscope == 3) {
        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
          (obj) => obj.deptCode
        );
        this.topqueryParams.leavehospitaldistrictcodes =
          store.getters.belongWards.map((obj) => obj.districtCode);
      }
      // æŽ¥å—异常跳转
      if (this.errtype) {
        this.topqueryParams.leavehospitaldistrictcodes.push(
          this.leavehospitaldistrictcode
        );
      }
      let obj = {
        pageNum: 1,
        pageSize: 10,
        leavehospitaldistrictcodes:
          this.topqueryParams.leavehospitaldistrictcodes,
        sendstates: [2, 3],
        leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
      };
      buidegetTasklist(obj).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
        if (refresh) {
          this.cardlist[0].value =
            Number(response.rows[0].wzx) + Number(response.rows[0].ysf);
          this.cardlist[1].value = response.rows[0].wzx;
          this.cardlist[2].value = response.rows[0].ysf;
          this.ycvalue = response.rows[0].yc;
          this.cardlist[3].value = response.rows[0].fssb;
          this.cardlist[4].value = response.rows[0].dsf;
          // this.cardlist[5].value = response.rows[0].yfs2;
          this.yfsvalue = response.rows[0].yfs;
        }
        this.loading = false;
        this.userList.forEach((item) => {
          let idArray = null;
          if (item.endtime) {
            item.endDay = this.daysBetween(item.endtime);
          }
          if (item.preachform) {
            if (item.endtime) {
              item.preachformson = item.preachform;
              idArray = item.preachform.split(",");
            }
            item.preachform = idArray.map((value) => {
              // æŸ¥æ‰¾id对应的对象
              const item = this.checkboxlist.find(
                (item) => item.value == value
              );
              // å¦‚果找到对应的id,返回label值,否则返回null
              return item ? item.label : null;
            });
          }
        });
        this.total = response.total;
      });
    },
    // æŸ¥çœ‹é—¨è¯Šéšè®¿è¯¦æƒ…
    Referencequestion(row) {
      this.previewVisible = true;
    },
    // æ·»åŠ å¼¹æ¡†æœç´¢
    remoteMethod(query) {
      if (query !== "") {
        this.loading = true;
        setTimeout(() => {
          this.loading = false;
          this.options = this.list.filter((item) => {
            return item.label.toLowerCase().indexOf(query.toLowerCase()) > -1;
          });
        }, 200);
      } else {
        this.options = [];
      }
    },
    // å½±åƒéšè®¿çŠ¶æ€ä¿®æ”¹
    handleStatusChange(row) {
      let text = row.status === "0" ? "启用" : "停用";
      this.$modal
        .confirm('确认要"' + text + '""' + row.userName + '"用户吗?')
        .then(function () {
          return changeUserStatus(row.userId, row.status);
        })
        .then(() => {
          this.$modal.msgSuccess(text + "成功");
        })
        .catch(function () {
          row.status = row.status === "0" ? "1" : "0";
        });
    },
    // è¡¨å•重置
    reset() {
      this.form = {
        userId: undefined,
        deptId: undefined,
        userName: undefined,
        nickName: undefined,
        password: undefined,
        phonenumber: undefined,
        email: undefined,
        sex: undefined,
        status: "0",
        remark: undefined,
        postIds: [],
        roleIds: [],
      };
      this.resetForm("form");
    },
    /** æœç´¢æŒ‰é’®æ“ä½œ */
    handleQuery(refresh) {
      if (this.topqueryParams.searchscope == 3) {
        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
          (obj) => obj.deptCode
        );
        this.topqueryParams.leavehospitaldistrictcodes =
          store.getters.belongWards.map((obj) => obj.districtCode);
      }
      this.topqueryParams.pageNum = 1;
      this.topqueryParams.startOutHospTime = this.dateRange[0];
      this.topqueryParams.endOutHospTime = this.dateRange[1];
      this.topqueryParams.startSendDateTime = this.dateRangefs[0];
      this.topqueryParams.endSendDateTime = this.dateRangefs[1];
      this.getList(refresh);
    },
    // æ‚£è€…范围处理
    handleChange(value) {
      let type = value[0];
      let code = value.slice(-1)[0];
      this.topqueryParams.leavehospitaldistrictcodes = [];
      this.topqueryParams.leaveldeptcodes = [];
      if (type == 1) {
        this.topqueryParams.leaveldeptcodes.push(code);
        this.topqueryParams.leavehospitaldistrictcodes = [];
        this.topqueryParams.searchscope = 1;
      } else if (type == 2) {
        this.topqueryParams.leavehospitaldistrictcodes.push(code);
        this.topqueryParams.leaveldeptcodes = [];
        this.topqueryParams.searchscope = 2;
      } else {
        this.topqueryParams.searchscope = 3;
      }
    },
    /** é‡ç½®æŒ‰é’®æ“ä½œ */
    resetQuery() {
      this.dateRange = [];
      this.dateRangefs = [];
      this.topqueryParams = {
        pageNum: 1,
        pageSize: 10,
        sendstate: 6,
        sort: 2, //0 å‡ºé™¢æ—¶é—´(正序)    1 å‡ºé™¢æ—¶é—´(倒序)   2 å‘送时间(正序)    3 å‘送时间(倒序)
        serviceType: 15,
        searchscope: 3,
        visitCount: 1,
        scopetype: [],
        leaveldeptcodes: [],
        leavehospitaldistrictcodes: [],
      };
      this.handleQuery(1);
    },
    handleSelectionChange(rows) {
      this.selectedRows = rows.map((row) => {
        // åˆå§‹åŒ–评分字段
        return {
          ...row,
          authenticity: row.authenticity || 0,
          weekFinish: row.weekFinish || 0,
          standard: row.standard || 0,
          timeliness: row.timeliness || 0,
          library: row.library || 0,
          environment: row.environment || 0,
          doctorSatisfaction: row.doctorSatisfaction || 0,
          nurseSatisfaction: row.nurseSatisfaction || 0,
        };
      });
      if (this.selectedRows.length > 0) {
        this.multiple = false;
      } else {
        this.multiple = true;
      }
    },
    // è®¡ç®—总分
    calculateTotal(row) {
      return (
        (row.authenticity || 0) +
        (row.weekFinish || 0) +
        (row.standard || 0) +
        (row.timeliness || 0) +
        (row.library || 0) +
        (row.environment || 0) +
        (row.doctorSatisfaction || 0) +
        (row.nurseSatisfaction || 0)
      );
    },
    // ä¿å­˜è¯„分
    saveScores() {
      this.selectedRows.forEach((item) => {
        item.createBy = null;
        item.patName = item.sendname;
        item.hospitaldistrictname = item.leavehospitaldistrictname;
      });
      addsatisfaction(this.selectedRows).then((res) => {
        if (res.code == 200) {
          this.$message.success("评分保存成功");
          this.scoreDialogVisible = false;
          this.selectedRows=[];
          this.$refs.userform.clearSelection()
        } else {
          this.$modal.msgWarning("评分保存失败");
          this.scoreDialogVisible = false;
          this.selectedRows=[];
          this.$refs.userform.clearSelection()
        }
      });
      // è¿™é‡Œå¯ä»¥æ·»åŠ ä¿å­˜é€»è¾‘ï¼Œå¦‚è°ƒç”¨API保存评分
    },
    //删除选项
    handleClose(tag) {
      this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
    },
    //触发新增输入
    showInput() {
      this.inputVisible = true;
      this.$nextTick((_) => {
        this.$refs.saveTagInput.$refs.input.focus();
      });
    },
    //获取失去焦点触发
    handleInputConfirm() {
      let inputValue = this.inputValue;
      if (inputValue) {
        this.dynamicTags.push(inputValue);
      }
      this.inputVisible = false;
      this.inputValue = "";
    },
    /** æ–°å¢žæŒ‰é’®æ“ä½œ */
    handleAdd() {
      this.$router.push({
        path: "/followvisit/QuestionnaireTask",
        query: {
          type: 2,
          serviceType: 15,
        },
      });
    },
    //患者360跳转
    gettoken360(sfzh, drcode, drname) {
      this.$modal.msgWarning('360功能暂未开通');
  return; // é˜»æ­¢åŽç»­ä»£ç æ‰§è¡Œ
      this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh;
      if (this.postData.XiaoXiTou.ZuHuMC == "丽水市中医院") {
        this.postData.YeWuXX.YongHuXX.YongHuID = "1400398571877961728";
        this.postData.YeWuXX.YongHuXX.YongHuXM = "LSZYY";
      }
      query360PatInfo(this.postData).then((res) => {
        if (res.data.url) {
          window.open(res.data.url, "_blank");
          // this.linkUrl = res.data.url;
        } else {
          this.$modal.msgWarning("360查询无结果");
        }
      });
    },
    /** é‡ç½®å¯†ç æŒ‰é’®æ“ä½œ */
    handleResetPwd(row) {
      this.$prompt('请输入"' + row.userName + '"的新密码', "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        closeOnClickModal: false,
        inputPattern: /^.{5,20}$/,
        inputErrorMessage: "用户密码长度必须介于 5 å’Œ 20 ä¹‹é—´",
      })
        .then(({ value }) => {
          resetUserPwd(row.userId, value).then((response) => {
            this.$modal.msgSuccess("修改成功,新密码是:" + value);
          });
        })
        .catch(() => {});
    },
    // å–消按钮
    cancel() {
      this.Labelchange = false;
      this.reset();
    },
    /** æäº¤æŒ‰é’® */
    submitForm: function () {
      this.$refs["form"].validate((valid) => {
        if (valid) {
          this.form.isoperation = 2;
          this.form.notrequiredFlag = 1;
          alterpatient(this.form)
            .then((response) => {
              console.log(response);
            })
            .then(() => {
              this.getList(1);
              this.$modal.msgSuccess("患者过滤成功");
            });
          this.reset();
          this.Labelchange = false;
        }
      });
    },
    /** åˆ é™¤æŒ‰é’®æ“ä½œ */
    handleDelete(row) {
      const userIds = row.userId || this.ids;
      this.$modal
        .confirm('是否确认删除用户编号为"' + userIds + '"的数据项?')
        .then(function () {
          return delUser(userIds);
        })
        .then(() => {
          this.getList(1);
          this.$modal.msgSuccess("删除成功");
        })
        .catch(() => {});
    },
    // å…¨éƒ¨åœæ­¢
    AllStop() {
      this.$modal
        .confirm("是否停止全部任务?")
        .then(function () {
          return console.log("停止成功");
        })
        .then(() => {
          this.getList(1);
          this.$modal.msgWarning("停止成功");
        })
        .catch(() => {});
    },
    // å…¨éƒ¨å¼€å§‹
    AllStarted() {
      this.$modal
        .confirm("是否开启全部任务?")
        .then(function () {
          return console.log("开启成功");
        })
        .then(() => {
          this.getList(1);
          this.$modal.msgSuccess("开启成功");
        })
        .catch(() => {});
    },
    // ä»»åŠ¡é‡ç½®
    TaskReset() {
      this.$modal
        .confirm("是否重置选中的任务项?")
        .then(function () {
          return console.log("选中成功");
        })
        .then(() => {
          this.getList(1);
          this.$modal.msgSuccess("重置成功");
        })
        .catch(() => {});
    },
    // è®¾ç½®å‘送时间
    Sendtimesetting() {
      this.modificationVisible = true;
    },
    // è·³è½¬è¯¦æƒ…页
    Seedetails(row) {
      let type = "";
      console.log(row, "rwo");
      if (row.preachformson) {
        if (row.preachformson.includes("3")) {
          type = 1;
        }
      }
      this.$router.push({
        path: "/followvisit/record/detailpage/",
        query: {
          taskid: row.taskid,
          patid: row.patid,
          id: row.id,
          Voicetype: type,
          visitCount: this.topqueryParams.visitCount,
        },
      });
    },
    onSubmit() {},
    // æš‚停服务
    handlestop(row) {
      let objson = row;
      this.$modal
        .confirm(
          '是否确认暂停任务名称为"' +
            row.taskName +
            '患者名称为"' +
            row.sendname +
            '"的数据项?'
        )
        .then(() => {
          getTaskservelist({
            patid: row.patid,
            taskid: row.taskid,
          }).then((res) => {
            if (res.code == 200) {
              objson.sendstate = 4;
              objson.remark = "服务暂停";
              Editsingletaskson(objson).then((res) => {
                if (res.code) {
                  this.$modal.msgSuccess("记录成功");
                  this.getList(1);
                }
              });
            }
          });
        })
        .catch(() => {});
    },
    // æ‚£è€…过滤触发
    handleUpdate(row) {
      particularpatient(row.patid).then((response) => {
        this.form = response.data;
        this.form.filterDrname = store.getters.nickName;
      });
      this.amendtag = true;
      this.Labelchange = true;
    },
    // ä¾¿æ·æŒ‰é’®
    toleadExport(too) {
      if (too == 1) {
        this.topqueryParams.sendstate = 4;
        this.topqueryParams.excep = null;
      } else if (too == 2) {
        this.topqueryParams.excep = 1;
      }
      this.handleQuery();
    },
    /** å¯¼å‡ºæŒ‰é’®æ“ä½œ */
    handleExport() {
      this.topqueryParams.pageNum = null;
      this.topqueryParams.pageSize = null;
      this.download(
        "smartor/serviceSubtask/patItemExport",
        {
          ...this.topqueryParams,
        },
        `user_${new Date().getTime()}.xlsx`
      );
    },
    // å¼‚常列渲染
    tableRowClassName({ row, rowIndex }) {
      if (row.excep == 1) {
        return "warning-row";
      }
      return "";
    },
    getCurrentTime() {
      const now = new Date();
      const year = now.getFullYear();
      const month = String(now.getMonth() + 1).padStart(2, "0");
      const day = String(now.getDate()).padStart(2, "0");
      const hours = String(now.getHours()).padStart(2, "0");
      const minutes = String(now.getMinutes()).padStart(2, "0");
      const seconds = String(now.getSeconds()).padStart(2, "0");
      return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
    },
  },
};
</script>
<style lang="scss" scoped>
.el-button--primary.is-plain {
  color: #ffffff;
  background: #409eff;
  border-color: #4fabe9;
}
.document {
  // width: 100px;
  height: 50px;
}
::v-deep.el-table .warning-row {
  background: #eec4c4;
}
.documentf {
  display: flex;
  justify-content: flex-end;
}
.download {
  text-align: center;
  .el-upload__tip {
    font-size: 23px;
  }
  .el-upload__text {
    font-size: 23px;
  }
}
.uploading {
  margin-top: 20px;
  margin: 20px;
  padding: 30px;
  background: #ffffff;
  border: 1px solid #dcdfe6;
  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
    0 0 6px 0 rgba(0, 0, 0, 0.04);
}
.el-tag + .el-tag {
  margin-left: 10px;
}
.button-new-tag {
  margin-left: 10px;
  height: 32px;
  line-height: 30px;
  padding-top: 0;
  padding-bottom: 0;
}
.input-new-tag {
  width: 90px;
  margin-left: 10px;
  vertical-align: bottom;
}
.drexamine {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 30px;
  background: #daeaf5;
  img {
    width: 100px;
    height: 100px;
  }
}
.qrcode-dialo {
  // text-align: center;
  //   display: flex;
  margin: 20px;
  padding: 30px;
  background: #edf1f7;
  border: 1px solid #dcdfe6;
  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
    0 0 6px 0 rgba(0, 0, 0, 0.04);
  .topic-dev {
    margin-bottom: 25px;
    font-size: 20px !important;
    .dev-text {
      margin-bottom: 10px;
    }
  }
}
::v-deep.leftvlue .el-card__body {
  background: #F2F8FF;
  color: #324A9B;
}
::v-deep.leftvlue .el-card__body:hover {
  background: #3664D9;
  color: #fff;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
::v-deep.errleftvlue .el-card__body {
  background: #fdd0d7;
}
::v-deep.errleftvlue .el-card__body:hover {
  background: #f88d96;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
::v-deep.ysfleftvlue .el-card__body {
  background: #d0fdd8;
}
::v-deep.ysfleftvlue .el-card__body:hover {
  background: #8df8a4;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
.button-bb {
  font-weight: 500;
  background-color: #2ba05c;
  padding: 5px;
  border-radius: 1px;
  color: #ffffff;
}
.button-xq {
  font-weight: 500;
  background-color: #409eff;
  padding: 5px;
  border-radius: 1px;
  color: #ffffff;
}
.button-sc {
  font-weight: 500;
  background-color: #b3a21f;
  padding: 5px;
  border-radius: 1px;
  color: #ffffff;
}
.button-zx {
  background: #4fabe9;
  padding: 5px;
  border-radius: 1px;
  color: #ffffff;
}
::v-deep.el-radio-group {
  span {
    font-size: 24px;
  }
}
.purple-button {
  background-color: #7e22ce;
  border-color: #7e22ce;
  color: #fff;
}
.purple-button:hover,
.purple-button:focus {
  background-color: #9333ea;
  border-color: #9333ea;
}
.purple-button:active {
  background-color: #6b21a8;
  border-color: #6b21a8;
}
.button-textxga {
  color: #de7897;
}
.purple-button.is-disabled {
  background-color: #d8b4fe;
  border-color: #d8b4fe;
  opacity: 1; /* ä¿æŒç¦ç”¨çŠ¶æ€é€æ˜Žåº¦ */
}
// é€‰é¡¹å­—体放大
// ::v-deep.el-checkbox-group {
//   span {
//     font-size: 24px;
//   }
// }
</style>
src/views/followvisit/discharge/index.vue
@@ -181,7 +181,7 @@
      </el-form>
      <el-divider></el-divider>
      <el-row :gutter="10" class="mb8">
        <el-col :span="1.5">
        <!-- <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button
@@ -194,11 +194,10 @@
              >
            </div>
          </div>
        </el-col>
        </el-col> -->
        <el-col :span="1.5">
          <el-button
            type="primary"
            plain
            icon="el-icon-plus"
            size="medium"
            @click="handleAdd"
@@ -252,7 +251,6 @@
            <div class="document">
              <el-button
                type="primary"
                plain
                size="medium"
                @click="affiliation()"
                >本人所属服务</el-button
@@ -269,7 +267,7 @@
            </div>
          </div>
        </el-col>
        <el-col :span="1.5">
        <!-- <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-tooltip
@@ -290,7 +288,7 @@
              </el-tooltip>
            </div>
          </div>
        </el-col>
        </el-col> -->
      </el-row>
      <el-table
        v-loading="loading"
@@ -859,7 +857,7 @@
            </el-form-item>
          </el-col>
        </el-row>
        <el-row >
        <el-row>
          <el-col :span="8">
            <el-form-item label="过滤医生" width="100" prop="filterDrname">
              <el-input
@@ -1143,7 +1141,7 @@
        //   value: 0,
        // },
        {
          name: "应随访",
          name: "需随访",
          value: 0,
        },
        {
@@ -1408,8 +1406,7 @@
      });
    },
    affiliation() {
      this.topqueryParams.managementDoctorCode= store.getters.hisUserId;
      this.topqueryParams.managementDoctor = store.getters.hisUserId;
      this.getList(1);
    },
    onthatday() {
@@ -1635,13 +1632,13 @@
        if (res.code == 200) {
          this.$message.success("评分保存成功");
          this.scoreDialogVisible = false;
          this.selectedRows=[];
          this.$refs.userform.clearSelection()
          this.selectedRows = [];
          this.$refs.userform.clearSelection();
        } else {
          this.$modal.msgWarning("评分保存失败");
          this.scoreDialogVisible = false;
          this.selectedRows=[];
          this.$refs.userform.clearSelection()
          this.selectedRows = [];
          this.$refs.userform.clearSelection();
        }
      });
      // è¿™é‡Œå¯ä»¥æ·»åŠ ä¿å­˜é€»è¾‘ï¼Œå¦‚è°ƒç”¨API保存评分
@@ -1678,6 +1675,8 @@
    },
    //患者360跳转
    gettoken360(sfzh, drcode, drname) {
      this.$modal.msgWarning("360功能暂未开通");
      return; // é˜»æ­¢åŽç»­ä»£ç æ‰§è¡Œ
      this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh;
      if (this.postData.XiaoXiTou.ZuHuMC == "丽水市中医院") {
        this.postData.YeWuXX.YongHuXX.YongHuID = "1400398571877961728";
@@ -1883,6 +1882,8 @@
    tableRowClassName({ row, rowIndex }) {
      if (row.excep == 1) {
        return "warning-row";
      } else if (row.excep == 2) {
        return "remind-row";
      }
      return "";
    },
@@ -1945,6 +1946,9 @@
}
::v-deep.el-table .warning-row {
  background: #eec4c4;
}
::v-deep.el-table .remind-row {
  background: #fcf5aa;
}
.documentf {
@@ -2025,10 +2029,12 @@
  }
}
::v-deep.leftvlue .el-card__body {
  background: #d0e9fd;
  background: #f2f8ff;
  color: #324a9b;
}
::v-deep.leftvlue .el-card__body:hover {
  background: #8dc8f8;
  background: #3664d9;
  color: #fff;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
::v-deep.errleftvlue .el-card__body {
@@ -2043,7 +2049,7 @@
  background: #d0fdd8;
}
::v-deep.ysfleftvlue .el-card__body:hover {
  background: #8df8a4;
  background: #0abc54;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
.button-bb {
@@ -2068,7 +2074,7 @@
  color: #ffffff;
}
.button-zx {
  background: #4fabe9;
  background: #324a9b;
  padding: 5px;
  border-radius: 1px;
  color: #ffffff;
@@ -2095,7 +2101,9 @@
  background-color: #6b21a8;
  border-color: #6b21a8;
}
.button-textxga {
  color: #de7897;
}
.purple-button.is-disabled {
  background-color: #d8b4fe;
  border-color: #d8b4fe;
src/views/followvisit/discharge/outpatientService.vue
@@ -186,8 +186,7 @@
        <el-col :span="1.5">
          <el-button
            type="primary"
            plain
            icon="el-icon-plus"
                        icon="el-icon-plus"
            size="medium"
            @click="handleAdd"
            >新增</el-button
@@ -917,7 +916,7 @@
        //   value: 0,
        // },
        {
          name: "应随访",
          name: "需随访",
          value: 0,
        },
        {
@@ -1399,6 +1398,8 @@
    },
    //患者360跳转
    gettoken360(sfzh, drcode, drname) {
      this.$modal.msgWarning('360功能暂未开通');
  return; // é˜»æ­¢åŽç»­ä»£ç æ‰§è¡Œ
      this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh;
      if (this.postData.XiaoXiTou.ZuHuMC == "丽水市中医院") {
        this.postData.YeWuXX.YongHuXX.YongHuID = "1400398571877961728";
@@ -1745,10 +1746,12 @@
  }
}
::v-deep.leftvlue .el-card__body {
  background: #d0e9fd;
  background: #F2F8FF;
  color: #324A9B;
}
::v-deep.leftvlue .el-card__body:hover {
  background: #8dc8f8;
  background: #3664D9;
  color: #fff;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
::v-deep.errleftvlue .el-card__body {
@@ -1766,6 +1769,9 @@
  background: #8df8a4;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
.button-textxga {
  color: #de7897;
}
.button-bb {
  font-weight: 500;
  background-color: #2ba05c;
src/views/followvisit/linem/index.vue
@@ -7,8 +7,7 @@
        <el-col :span="1.5">
          <el-button
            type="primary"
            plain
            icon="el-icon-plus"
                        icon="el-icon-plus"
            size="medium"
            @click="handleAdd"
            v-hasPermi="['system:user:add']"
src/views/followvisit/mzsatisfaction/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1973 @@
<template>
  <div class="app-container">
    <div class="leftvlue" style="margin-bottom: 20px">
      <el-row :gutter="10">
        <el-col :span="2.5" v-for="(item, index) in cardlist" :key="index">
          <el-card
            shadow="hover"
            :body-style="item.router ? ' cursor: pointer' : 'cursor: default'"
          >
            <div style="padding: 8px" @click="$router.push(item.router)">
              <span>{{ item.name }}</span>
              <div
                style="
                  text-align: center;
                  font-size: 18px;
                  margin-top: 10px;
                  font-weight: 600;
                "
              >
                {{ item.value ? item.value : 0 }}
              </div>
            </div>
          </el-card>
        </el-col>
        <el-col :span="2.5">
          <div class="ysfleftvlue">
            <el-card shadow="hover">
              <div style="padding: 8px">
                <span>表单已发送</span>
                <div
                  style="
                    text-align: center;
                    font-size: 18px;
                    margin-top: 10px;
                    font-weight: 600;
                  "
                >
                  {{ yfsvalue }}
                </div>
              </div>
            </el-card>
          </div>
        </el-col>
        <el-col :span="2.5">
          <div class="errleftvlue">
            <el-card shadow="hover">
              <div style="padding: 8px">
                <span>异常</span>
                <div
                  style="
                    text-align: center;
                    font-size: 18px;
                    margin-top: 10px;
                    font-weight: 600;
                  "
                >
                  {{ ycvalue }}
                </div>
              </div>
            </el-card>
          </div>
        </el-col>
      </el-row>
    </div>
    <el-row :gutter="20">
      <!--用户数据-->
      <el-form
        :model="topqueryParams"
        ref="queryForm"
        size="small"
        :inline="true"
        v-show="showSearch"
        label-width="98px"
      >
        <el-form-item label="任务名称">
          <el-input
            v-model="topqueryParams.taskName"
            placeholder="请选择任务名称"
          ></el-input>
        </el-form-item>
        <el-form-item label="出院时间">
          <el-date-picker
            v-model="dateRange"
            style="width: 240px"
            value-format="yyyy-MM-dd"
            type="daterange"
            range-separator="-"
            start-placeholder="开始日期"
            end-placeholder="结束日期"
          ></el-date-picker>
        </el-form-item>
        <el-form-item label="患者姓名" prop="sendname">
          <el-input
            v-model="topqueryParams.sendname"
            placeholder="请输入患者姓名"
          ></el-input>
        </el-form-item>
        <el-form-item label="诊断名称" prop="leavediagname">
          <el-input
            v-model="topqueryParams.leavediagname"
            placeholder="请输入诊断名称"
          ></el-input>
        </el-form-item>
        <el-form-item label="随访人员" prop="updateBy">
          <el-input
            v-model="topqueryParams.updateBy"
            placeholder="请输入随访人员"
          ></el-input>
        </el-form-item>
        <el-form-item label="主治医生" prop="drname">
          <el-input
            v-model="topqueryParams.drname"
            placeholder="请输入主治医生"
          ></el-input>
        </el-form-item>
        <el-form-item label="经管医生" prop="managementDoctor">
          <el-input
            v-model="topqueryParams.managementDoctor"
            placeholder="请输入主治医生"
          ></el-input>
        </el-form-item>
        <el-form-item label="患者范围" prop="status">
          <el-cascader
            v-model="topqueryParams.scopetype"
            placeholder="默认全部"
            :options="sourcetype"
            :props="{ expandTrigger: 'hover' }"
            @change="handleChange"
          ></el-cascader>
        </el-form-item>
        <el-form-item label="任务状态" prop="status">
          <el-select v-model="topqueryParams.sendstate" placeholder="请选择">
            <el-option
              v-for="item in topicoptions"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            >
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="排序方式" prop="status">
          <el-select v-model="topqueryParams.sort" placeholder="请选择">
            <el-option
              v-for="item in topicoptionssort"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            >
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item>
          <el-button
            type="primary"
            icon="el-icon-search"
            size="medium"
            @click="handleQuery(1)"
            >搜索</el-button
          >
          <el-button icon="el-icon-refresh" size="medium" @click="resetQuery"
            >重置</el-button
          >
        </el-form-item>
      </el-form>
      <el-divider></el-divider>
      <el-row :gutter="10" class="mb8">
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button
                type="warning"
                plain
                icon="el-icon-upload2"
                size="medium"
                @click="handleExport"
                >导出</el-button
              >
            </div>
          </div>
        </el-col>
        <el-col :span="1.5">
          <el-button
            type="primary"
                        icon="el-icon-plus"
            size="medium"
            @click="handleAdd"
            >新增</el-button
          >
        </el-col>
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button
                type="warning"
                plain
                icon="el-icon-warning-outline"
                size="medium"
                @click="toleadExport(1)"
                >执行失败</el-button
              >
            </div>
          </div>
        </el-col>
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button
                type="danger"
                plain
                icon="el-icon-warning"
                size="medium"
                @click="toleadExport(2)"
                >结果异常</el-button
              >
            </div>
          </div>
        </el-col>
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button
                type="success"
                plain
                size="medium"
                @click="buidegetTasklist()"
                >待办服务</el-button
              >
            </div>
          </div>
        </el-col>
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button
                type="primary"
                plain
                size="medium"
                @click="affiliation()"
                >本人所属服务</el-button
              >
            </div>
          </div>
        </el-col>
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button type="success" size="medium" @click="onthatday()"
                >当日服务</el-button
              >
            </div>
          </div>
        </el-col>
      </el-row>
      <el-table
        v-loading="loading"
        ref="userform"
        :data="userList"
        :row-class-name="tableRowClassName"
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="50" align="center" />
        <el-table-column
          label="任务名称"
          fixed
          width="150"
          show-overflow-tooltip
          align="center"
          key="taskName"
          prop="taskName"
        />
        <!-- <el-table-column label="序号" fixed align="center" key="id" prop="id" /> -->
        <el-table-column
          label="姓名"
          width="100"
          align="center"
          key="sendname"
          prop="sendname"
        >
          <template slot-scope="scope">
            <el-button
              size="medium"
              type="text"
              @click="
                gettoken360(scope.row.sfzh, scope.row.drcode, scope.row.drname)
              "
              ><span class="button-textsc">{{
                scope.row.sendname
              }}</span></el-button
            >
          </template>
        </el-table-column>
        <el-table-column
          label="任务状态"
          align="center"
          key="sendstate"
          prop="sendstate"
          width="120"
        >
          <template slot-scope="scope">
            <el-tooltip
              class="item"
              effect="dark"
              :content="scope.row.remark"
              placement="top-start"
            >
              <div v-if="scope.row.sendstate == 1">
                <el-tag type="primary" :disable-transitions="false"
                  >表单已领取</el-tag
                >
              </div>
              <div v-if="scope.row.sendstate == 2">
                <el-tag type="primary" :disable-transitions="false"
                  >待随访</el-tag
                >
              </div>
              <div v-if="scope.row.sendstate == 3">
                <el-tag type="success" :disable-transitions="false"
                  >表单已发送</el-tag
                >
              </div>
              <div v-if="scope.row.sendstate == 4">
                <el-tag type="info" :disable-transitions="false">不执行</el-tag>
              </div>
              <div v-if="scope.row.sendstate == 5">
                <el-tag type="danger" :disable-transitions="false"
                  >发送失败</el-tag
                >
              </div>
              <div v-if="scope.row.sendstate == 6">
                <el-tag type="success" :disable-transitions="false"
                  >已完成</el-tag
                >
              </div>
            </el-tooltip>
          </template>
        </el-table-column>
        <!-- <el-table-column
          label="任务异常说明"
          width="120"
          align="center"
          key="remark"
          prop="remark" -->
        />
        <el-table-column
          label="处理意见"
          align="center"
          key="suggest"
          prop="suggest"
          width="120"
        >
          <template slot-scope="scope">
            <dict-tag
              :options="dict.type.sys_suggest"
              :value="scope.row.suggest"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="随访完成时间"
          sortable
          align="center"
          prop="finishtime"
          width="160"
        >
          <template slot-scope="scope">
            <span>{{ parseTime(scope.row.finishtime) }}</span>
          </template>
        </el-table-column>
        <el-table-column
          label="出院日期"
          width="200"
          align="center"
          key="endtime"
          prop="endtime"
        >
          <template slot-scope="scope">
            <span>{{ formatTime(scope.row.endtime) }}</span>
          </template></el-table-column
        >
        <el-table-column
          label="主治医生"
          width="120"
          align="center"
          key="drname"
          prop="drname"
        />
        <el-table-column
          label="随访人员"
          align="center"
          key="updateBy"
          prop="updateBy"
          width="120"
        />
        <el-table-column
          label="经管医生"
          align="center"
          key="managementDoctor"
          prop="managementDoctor"
          width="120"
        />
        <el-table-column
          label="出院天数"
          width="120"
          align="center"
          key="endDay"
          prop="endDay"
        >
          <template slot-scope="scope">
            <span>{{ scope.row.endDay ? scope.row.endDay + "天" : "" }}</span>
          </template>
        </el-table-column>
        <el-table-column
          label="身份证号码"
          width="200"
          align="center"
          key="sfzh"
          prop="sfzh"
        />
        <el-table-column
          label="联系电话"
          width="200"
          align="center"
          key="phone"
          prop="phone"
        />
        <el-table-column
          label="责任护士"
          width="120"
          align="center"
          key="nurseName"
          prop="nurseName"
        />
        <!-- <el-table-column
          label="病历号"
          align="center"
          sortable
          key="medicalRecordNo"
          prop="medicalRecordNo"
          width="120"
        /> -->
        <!-- <el-table-column label="年龄" align="center" key="age" prop="age" /> -->
        <!-- <el-table-column label="性别"width="100" align="center" key="sex" prop="sex" /> -->
        <!-- <el-table-column label="床号" align="center" key="badNo" prop="badNo" /> -->
        <el-table-column
          label="科室"
          align="center"
          key="deptname"
          prop="deptname"
          width="120"
        >
        </el-table-column>
        <el-table-column
          label="病区"
          align="center"
          key="leavehospitaldistrictname"
          prop="leavehospitaldistrictname"
          width="120"
        >
        </el-table-column>
        <el-table-column
          label="诊断名称"
          align="center"
          key="leavediagname"
          prop="leavediagname"
          width="120"
          :show-overflow-tooltip="true"
        >
        </el-table-column>
        <el-table-column
          label="门诊满意度模板名称"
          align="center"
          key="templatename"
          prop="templatename"
          width="200"
        />
        <el-table-column
          label="任务执行方式"
          align="center"
          key="preachform"
          prop="preachform"
          width="160"
          :show-overflow-tooltip="true"
        >
          <template slot-scope="scope">
            <span v-for="item in scope.row.preachform">{{ item }}、 </span>
          </template>
        </el-table-column>
        <!-- <el-table-column
          label="任务发送流程"
          align="center"
          key="serviceSubtaskRecordList"
          prop="serviceSubtaskRecordList"
          width="160"
          :show-overflow-tooltip="true"
        >
          <template slot-scope="scope">
            <span v-for="item in scope.row.serviceSubtaskRecordList"
              >{{ item.remark }}、
            </span>
          </template>
        </el-table-column> -->
        <el-table-column
          label="任务结果说明"
          width="220"
          align="center"
          key="remark"
          prop="remark"
        >
          <template slot-scope="scope" v-if="scope.row.remark">
            <el-tooltip
              :content="scope.row.remark"
              placement="top"
              effect="dark"
            >
              <el-tag
                type="warning"
                v-if="scope.row.sendstate != 5 && scope.row.sendstate != 4"
                >{{ scope.row.remark }}</el-tag
              >
              <el-tag type="warning" v-else>{{ scope.row.remark }}</el-tag>
            </el-tooltip>
          </template>
        </el-table-column>
        <el-table-column
          label="操作"
          align="center"
          fixed="right"
          width="300"
          class-name="small-padding fixed-width"
        >
          <template slot-scope="scope">
            <el-button size="medium" type="text" @click="Seedetails(scope.row)"
              ><span class="button-zx"
                ><i class="el-icon-s-order"></i>查看详情</span
              ></el-button
            >
            <el-button
              size="medium"
              type="text"
              @click="handleUpdate(scope.row)"
              ><span class="button-textxga"
                ><i class="el-icon-edit"></i>患者过滤</span
              ></el-button
            >
          </template>
        </el-table-column>
      </el-table>
      <pagination
        v-show="total > 0"
        :total="total"
        :page.sync="topqueryParams.pageNum"
        :limit.sync="topqueryParams.pageSize"
        @pagination="getList"
      />
    </el-row>
    <!-- æ»¡æ„åº¦å¼¹æ¡† -->
    <el-dialog
      title="随访满意度评分"
      :visible.sync="scoreDialogVisible"
      width="80%"
      :close-on-click-modal="false"
    >
      <el-table :data="selectedRows" border style="width: 100%">
        <el-table-column
          label="姓名"
          width="100"
          align="center"
          prop="sendname"
        />
        <el-table-column
          label="任务名称"
          width="180"
          align="center"
          prop="taskName"
        />
        <!-- æ–°å¢žè¯„分列 -->
        <el-table-column
          label="真实性(20)"
          align="center"
          key="authenticity"
          prop="authenticity"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.authenticity"
              :min="0"
              :max="20"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="一周内完成(20)"
          align="center"
          key="weekFinish"
          prop="weekFinish"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.weekFinish"
              :min="0"
              :max="20"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="规范性(10)"
          align="center"
          key="standard"
          prop="standard"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.standard"
              :min="0"
              :max="10"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="及时性(10)"
          align="center"
          key="timeliness"
          prop="timeliness"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.timeliness"
              :min="0"
              :max="10"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="宣教情况(10)"
          align="center"
          key="library"
          prop="library"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.library"
              :min="0"
              :max="10"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="环境满意度(10)"
          align="center"
          key="environment"
          prop="environment"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.environment"
              :min="0"
              :max="10"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="医生满意度(10)"
          align="center"
          key="doctorSatisfaction"
          prop="doctorSatisfaction"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.doctorSatisfaction"
              :min="0"
              :max="10"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="护士满意度(10)"
          align="center"
          key="nurseSatisfaction"
          prop="nurseSatisfaction"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.nurseSatisfaction"
              :min="0"
              :max="10"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="总分"
          align="center"
          key="total"
          prop="total"
          fixed="right"
        >
          <template slot-scope="scope">
            <span>{{ calculateTotal(scope.row) }}</span>
          </template>
        </el-table-column>
      </el-table>
      <div slot="footer" class="dialog-footer">
        <el-button @click="scoreDialogVisible = false">取消</el-button>
        <el-button type="primary" @click="saveScores">保存</el-button>
      </div>
    </el-dialog>
    <!-- æ·»åŠ æˆ–ä¿®æ”¹å½±åƒéšè®¿å¯¹è¯æ¡† -->
    <el-dialog
      :title="amendtag ? '修改患者信息' : '新增患者'"
      :visible.sync="Labelchange"
      width="900px"
    >
      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
        <el-row>
          <el-col :span="8">
            <el-form-item label="姓名" width="100" prop="name">
              <el-input
                v-model="form.name"
                placeholder="请输入姓名"
                maxlength="30"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="性别" width="100" prop="sex">
              <el-select v-model="form.sex" placeholder="请选择性别">
                <el-option
                  v-for="dict in sextype"
                  :key="dict.value"
                  :label="dict.label"
                  :value="dict.value"
                ></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="年龄" prop="age">
              <el-input
                v-model="form.age"
                placeholder="请输入年龄"
                maxlength="30"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="8">
            <el-form-item label="过滤医生" width="100" prop="filterDrname">
              <el-input
                v-model="form.filterDrname"
                placeholder="请输入医生姓名"
                maxlength="30"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="24">
            <el-form-item label="过滤原因">
              <el-input
                v-model="form.notrequiredreason"
                type="textarea"
                placeholder="请输入过滤原因"
              ></el-input>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">ç¡® å®š</el-button>
        <el-button @click="cancel">取 æ¶ˆ</el-button>
      </div>
    </el-dialog>
    <!-- ä¿®æ”¹å‘送时间对话框 -->
    <el-dialog
      title="发送时间设置"
      :visible.sync="modificationVisible"
      width="45%"
    >
      <div style="margin-bottom: 20px; color: red">
        ç»Ÿä¸€ä¿®æ”¹å½“天未发送的任务时间
      </div>
      <el-form
        :model="ruleForm"
        :rules="rules"
        ref="ruleForm"
        label-width="120px"
        class="demo-ruleForm"
      >
        <el-form-item label="发送日期">
          <el-date-picker
            v-model="ruleForm.value1"
            type="date"
            placeholder="选择日期"
          >
          </el-date-picker>
        </el-form-item>
        <el-form-item label="时间段" prop="type">
          <el-checkbox-group v-model="ruleForm.type">
            <el-checkbox label="上午" name="type"></el-checkbox>
            <el-checkbox label="下午" name="type"></el-checkbox>
            <el-checkbox label="晚上" name="type"></el-checkbox>
          </el-checkbox-group>
        </el-form-item>
        <el-form-item label="上午时间区间" required>
          <el-time-picker
            is-range
            v-model="ruleForm.value2"
            range-separator="至"
            start-placeholder="开始时间"
            end-placeholder="结束时间"
            placeholder="选择时间范围"
          >
          </el-time-picker>
        </el-form-item>
        <el-form-item label="下午时间区间" required>
          <el-time-picker
            is-range
            v-model="ruleForm.value3"
            range-separator="至"
            start-placeholder="开始时间"
            end-placeholder="结束时间"
            placeholder="选择时间范围"
          >
          </el-time-picker>
        </el-form-item>
        <el-form-item label="晚上时间区间" required>
          <el-time-picker
            is-range
            v-model="ruleForm.value4"
            range-separator="至"
            start-placeholder="开始时间"
            end-placeholder="结束时间"
            placeholder="选择时间范围"
          >
          </el-time-picker>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="modificationVisible = false">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="modificationVisible = false"
          >ç¡® å®š</el-button
        >
      </span>
    </el-dialog>
    <!-- å†æ¬¡éšè®¿ -->
    <el-dialog title="患者再次随访" :visible.sync="dialogFormVisible">
      <el-form ref="zcform" :rules="zcrules" :model="zcform" label-width="80px">
        <el-form-item label="任务名称">
          <el-input
            style="width: 400px"
            disabled
            v-model="zcform.taskName"
          ></el-input>
        </el-form-item>
        <el-form-item label="患者名称">
          <el-input
            style="width: 400px"
            disabled
            v-model="zcform.sendname"
          ></el-input>
        </el-form-item>
        <el-form-item label="年龄">
          <el-input
            style="width: 400px"
            disabled
            v-model="zcform.age"
          ></el-input>
        </el-form-item>
        <el-form-item label="科室">
          <el-input
            style="width: 400px"
            disabled
            v-model="zcform.deptname"
          ></el-input>
        </el-form-item>
        <el-form-item label="病区">
          <el-input
            style="width: 400px"
            disabled
            v-model="zcform.leavehospitaldistrictname"
          ></el-input>
        </el-form-item>
        <el-form-item label="随访方式" prop="resource">
          <el-radio-group v-model="zcform.resource">
            <el-radio label="1">本病区随访</el-radio>
            <el-radio label="2">随访中心随访</el-radio>
          </el-radio-group>
        </el-form-item>
        <!-- <el-form-item label="即刻发送">
          <el-switch v-model="zcform.delivery"></el-switch>
        </el-form-item> -->
        <el-form-item label="出院时间">
          <el-input
            style="width: 400px"
            disabled
            v-model="zcform.endtime"
          ></el-input>
        </el-form-item>
        <el-form-item label="随访完成时间" prop="date1">
          <el-date-picker
            type="date"
            placeholder="选择日期"
            v-model="zcform.date1"
            style="width: 100%"
          ></el-date-picker>
        </el-form-item>
        <el-form-item label="随访记录">
          <el-input type="textarea" v-model="zcform.remark"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible = false">取 æ¶ˆ</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import {
  delUser,
  addUser,
  updateUser,
  resetUserPwd,
  changeUserStatus,
} from "@/api/system/user";
import {
  getTaskservelist,
  buidegetTasklist,
  addserviceSubtask,
  query360PatInfo,
  addsatisfaction,
} from "@/api/AiCentre/index";
import { alterpatient, particularpatient } from "@/api/patient/homepage";
import Treeselect from "@riophae/vue-treeselect";
import store from "@/store";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
  name: "Discharge",
  dicts: ["sys_normal_disable", "sys_user_sex", "sys_yujing", "sys_suggest"],
  components: { Treeselect },
  data() {
    return {
      // é®ç½©å±‚
      loading: true,
      // é€‰ä¸­æ•°ç»„
      ids: [],
      // éžå•个禁用
      single: true,
      // éžå¤šä¸ªç¦ç”¨
      multiple: true,
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      dialogFormVisible: false,
      // æ€»æ¡æ•°
      total: 0,
      // ç”¨æˆ·è¡¨æ ¼æ•°æ®
      userList: null,
      // å¼¹å‡ºå±‚标题
      title: "新增影像随访",
      // æ˜¯å¦æ˜¾ç¤ºä¿®æ”¹ã€æ·»åŠ å¼¹å‡ºå±‚
      addalteropen: false,
      // ä¿®æ”¹å‘送时间对话框
      modificationVisible: false,
      // éƒ¨é—¨åç§°
      deptName: undefined,
      // é»˜è®¤å¯†ç 
      initPassword: undefined,
      // æ—¥æœŸèŒƒå›´
      dateRange: [],
      dateRangefs: [],
      // å²—位选项
      postOptions: [],
      ruleForm: {
        type: [],
      },
      zcform: {},
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      Labelchange: false,
      ycvalue: "",
      yfsvalue: "",
      inputValue: "",
      preachform: "",
      previewVisible: false, //影像随访预览弹框
      radio: "",
      radios: [],
      previewtype: 2, //预览影像随访类型
      total: 0, // æ€»æ¡æ•°
      // æ»¡æ„åº¦è°ƒæŸ¥æ•°æ®
      scoreDialogVisible: false,
      selectedRows: [],
      value: [],
      list: [],
      sourcetype: [
        {
          value: 1,
          label: "科室",
          children: [],
        },
        {
          value: 2,
          label: "病区",
          children: [],
        },
        {
          value: 3,
          label: "全部",
        },
      ],
      loading: false,
      cardlist: [
        {
          name: "服务总量",
          value: 0,
        },
        // {
        //   name: "患者过滤",
        //   value: 0,
        // },
        {
          name: "需随访",
          value: 0,
        },
        {
          name: "发送失败",
          value: 0,
        },
        {
          name: "待随访",
          value: 0,
        },
        // {
        //   name: "已发送",
        //   value: 0,
        // },
        // {
        //   name: "表单已发送",
        //   value: 0,
        // },
      ],
      zcrules: {
        date1: [
          { required: true, message: "请选择随访方式", trigger: "change" },
        ],
        resource: [
          { required: true, message: "请选择随访时间", trigger: "blur" },
        ],
      },
      // è¡¨å•参数
      form: {
        phonenumber: "",
        totagid: "",
        types: "",
        nickName: "",
        qystatus: "",
        btstatus: "",
      },
      topicoptionssort: [
        {
          value: 0,
          label: "出院时间(正序)",
        },
        {
          value: 1,
          label: "出院时间(倒序)",
        },
        {
          value: 2,
          label: "发送时间(正序)",
        },
        {
          value: 3,
          label: "发送时间(倒序)",
        },
      ],
      // æŸ¥è¯¢å‚æ•°
      topqueryParams: {
        pageNum: 1,
        pageSize: 10,
        sendstate: 6,
        sort: 2, //0 å‡ºé™¢æ—¶é—´(正序)    1 å‡ºé™¢æ—¶é—´(倒序)   2 å‘送时间(正序)    3 å‘送时间(倒序)
        serviceType: 14,
        searchscope: 3,
        visitCount: 1,
        scopetype: [],
        leaveldeptcodes: [],
        leavehospitaldistrictcodes: [],
      },
      propss: { multiple: true },
      options: [],
      topicoptions: [
        {
          value: null,
          label: "全部",
        },
        {
          value: 1,
          label: "表单已领取",
        },
        {
          value: 2,
          label: "待随访",
        },
        {
          value: 3,
          label: "表单已发送",
        },
        {
          value: 4,
          label: "不执行",
        },
        {
          value: 5,
          label: "发送失败",
        },
        {
          value: 6,
          label: "已完成",
        },
      ],
      sextype: [
        {
          value: 1,
          label: "男",
        },
        {
          value: 2,
          label: "女",
        },
      ],
      topicoptionsyj: [
        {
          value: 1,
          label: "异常",
        },
        {
          value: 0,
          label: "正常",
        },
      ],
      url: "http://9.208.2.190:8090/smartor/serviceExternal/query360PatInfo",
      postData: {
        XiaoXiTou: {
          FaSongFCSJC: "ZJHES",
          FaSongJGID: localStorage.getItem("orgid"),
          FaSongJGMC: localStorage.getItem("orgname"),
          FaSongSJ: "2025-01-09 17:29:36",
          FaSongXTJC: "SUIFANGXT",
          FaSongXTMC: "随访系统",
          XiaoXiID: "5FA92AFB-9833-4608-87C7-F56A654AC171",
          XiaoXiLX: "SC_LC_360STCX",
          XiaoXiMC: "360 视图查询",
          ZuHuID: localStorage.getItem("ZuHuID"),
          ZuHuMC: localStorage.getItem("orgname"),
        },
        YeWuXX: {
          BingRenXX: {
            ZhengJianHM: "",
            ZhengJianLXDM: "01",
            ZhengJianLXMC: "居民身份证",
            ZuZhiJGID: localStorage.getItem("orgid"),
            ZuZhiJGMC: localStorage.getItem("orgname"),
          },
          YongHuXX: {
            XiTongID: "SUIFANGXT",
            XiTongMC: "随访系统",
            YongHuID: "1400466972205912064",
            YongHuXM: "JNRMYY",
            ZuZhiJGID: localStorage.getItem("orgid"),
            ZuZhiJGMC: localStorage.getItem("orgname"),
            idp: "lyra",
          },
        },
      },
      amendtag: false,
      errtype: "",
      leavehospitaldistrictcode: "",
      serviceState: [],
      checkboxlist: [],
      // è¡¨å•校验
      rules: {},
    };
  },
  watch: {},
  created() {
    this.serviceState = store.getters.serviceState;
    this.checkboxlist = store.getters.checkboxlist;
    this.errtype = this.$route.query.errtype;
    this.leavehospitaldistrictcode =
      this.$route.query.leavehospitaldistrictcode;
    this.sourcetype[0].children = store.getters.belongDepts.map((dept) => {
      return {
        label: dept.deptName,
        value: dept.deptCode,
      };
    });
    this.sourcetype[1].children = store.getters.belongWards.map((dept) => {
      return {
        label: dept.districtName,
        value: dept.districtCode,
      };
    });
    if (this.errtype) {
      this.toleadExport(2);
    } else {
      this.getList(1);
    }
    this.getConfigKey("sys.user.initPassword").then((response) => {
      this.initPassword = response.msg;
    });
  },
  activated() {
    this.getList(1);
  },
  methods: {
    /** æŸ¥è¯¢éšè®¿æœåŠ¡åˆ—è¡¨ */
    getList(refresh) {
      // é»˜è®¤å…¨éƒ¨
      if (this.topqueryParams.searchscope == 3) {
        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
          (obj) => obj.deptCode
        );
        this.topqueryParams.leavehospitaldistrictcodes =
          store.getters.belongWards.map((obj) => obj.districtCode);
      }
      // æŽ¥å—异常跳转
      if (this.errtype) {
        this.topqueryParams.leavehospitaldistrictcodes.push(
          this.leavehospitaldistrictcode
        );
        console.log(this.topqueryParams.leavehospitaldistrictcodes, "11");
      }
      this.loading = true;
      if (
        this.topqueryParams.leavehospitaldistrictcodes[0] &&
        this.topqueryParams.leaveldeptcodes[0]
      ) {
        this.topqueryParams.deptOrDistrict = 2;
      } else {
        this.topqueryParams.deptOrDistrict = 1;
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
        if (refresh) {
          this.cardlist[0].value =
            Number(response.rows[0].wzx) + Number(response.rows[0].ysf);
          // this.cardlist[1].value = response.rows[0].wzx;
          this.cardlist[1].value = response.rows[0].ysf;
          this.ycvalue = response.rows[0].yc;
          this.cardlist[2].value = response.rows[0].fssb;
          this.cardlist[3].value = response.rows[0].dsf;
          // this.cardlist[4].value = response.rows[0].yfs2;
          this.yfsvalue = response.rows[0].yfs;
        }
        this.loading = false;
        this.userList.forEach((item) => {
          let idArray = null;
          if (item.endtime) {
            item.endDay = this.daysBetween(item.endtime);
          }
          if (item.preachform) {
            if (item.endtime) {
              item.preachformson = item.preachform;
              idArray = item.preachform.split(",");
            }
            item.preachform = idArray.map((value) => {
              // æŸ¥æ‰¾id对应的对象
              const item = this.checkboxlist.find(
                (item) => item.value == value
              );
              // å¦‚果找到对应的id,返回label值,否则返回null
              return item ? item.label : null;
            });
          }
        });
        this.total = response.total;
      });
    },
    affiliation() {
      this.topqueryParams.drcode = store.getters.hisUserId;
      this.topqueryParams.nurseId = store.getters.hisUserId;
      this.topqueryParams.managementDoctor = store.getters.name;
      this.getList(1);
    },
    onthatday() {
      this.topqueryParams.startSendDateTime = this.getCurrentDate();
      this.topqueryParams.endSendDateTime = this.getCurrentDate();
      this.getList(1);
    },
    getCurrentDate() {
      const now = new Date();
      return now.toISOString().slice(0, 10); // æˆªå–前10个字符,即 YYYY-MM-DD
    },
    buidegetTasklist(type) {
      if (this.topqueryParams.searchscope == 3) {
        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
          (obj) => obj.deptCode
        );
        this.topqueryParams.leavehospitaldistrictcodes =
          store.getters.belongWards.map((obj) => obj.districtCode);
      }
      // æŽ¥å—异常跳转
      if (this.errtype) {
        this.topqueryParams.leavehospitaldistrictcodes.push(
          this.leavehospitaldistrictcode
        );
      }
      let obj = {
        pageNum: 1,
        pageSize: 10,
        leavehospitaldistrictcodes:
          this.topqueryParams.leavehospitaldistrictcodes,
        sendstates: [2, 3],
        leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
      };
      buidegetTasklist(obj).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
        if (refresh) {
          this.cardlist[0].value =
            Number(response.rows[0].wzx) + Number(response.rows[0].ysf);
          this.cardlist[1].value = response.rows[0].wzx;
          this.cardlist[2].value = response.rows[0].ysf;
          this.ycvalue = response.rows[0].yc;
          this.cardlist[3].value = response.rows[0].fssb;
          this.cardlist[4].value = response.rows[0].dsf;
          // this.cardlist[5].value = response.rows[0].yfs2;
          this.yfsvalue = response.rows[0].yfs;
        }
        this.loading = false;
        this.userList.forEach((item) => {
          let idArray = null;
          if (item.endtime) {
            item.endDay = this.daysBetween(item.endtime);
          }
          if (item.preachform) {
            if (item.endtime) {
              item.preachformson = item.preachform;
              idArray = item.preachform.split(",");
            }
            item.preachform = idArray.map((value) => {
              // æŸ¥æ‰¾id对应的对象
              const item = this.checkboxlist.find(
                (item) => item.value == value
              );
              // å¦‚果找到对应的id,返回label值,否则返回null
              return item ? item.label : null;
            });
          }
        });
        this.total = response.total;
      });
    },
    // æŸ¥çœ‹é—¨è¯Šéšè®¿è¯¦æƒ…
    Referencequestion(row) {
      this.previewVisible = true;
    },
    // æ·»åŠ å¼¹æ¡†æœç´¢
    remoteMethod(query) {
      if (query !== "") {
        this.loading = true;
        setTimeout(() => {
          this.loading = false;
          this.options = this.list.filter((item) => {
            return item.label.toLowerCase().indexOf(query.toLowerCase()) > -1;
          });
        }, 200);
      } else {
        this.options = [];
      }
    },
    // å½±åƒéšè®¿çŠ¶æ€ä¿®æ”¹
    handleStatusChange(row) {
      let text = row.status === "0" ? "启用" : "停用";
      this.$modal
        .confirm('确认要"' + text + '""' + row.userName + '"用户吗?')
        .then(function () {
          return changeUserStatus(row.userId, row.status);
        })
        .then(() => {
          this.$modal.msgSuccess(text + "成功");
        })
        .catch(function () {
          row.status = row.status === "0" ? "1" : "0";
        });
    },
    // è¡¨å•重置
    reset() {
      this.form = {
        userId: undefined,
        deptId: undefined,
        userName: undefined,
        nickName: undefined,
        password: undefined,
        phonenumber: undefined,
        email: undefined,
        sex: undefined,
        status: "0",
        remark: undefined,
        postIds: [],
        roleIds: [],
      };
      this.resetForm("form");
    },
    /** æœç´¢æŒ‰é’®æ“ä½œ */
    handleQuery(refresh) {
      if (this.topqueryParams.searchscope == 3) {
        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
          (obj) => obj.deptCode
        );
        this.topqueryParams.leavehospitaldistrictcodes =
          store.getters.belongWards.map((obj) => obj.districtCode);
      }
      this.topqueryParams.pageNum = 1;
      this.topqueryParams.startOutHospTime = this.dateRange[0];
      this.topqueryParams.endOutHospTime = this.dateRange[1];
      this.topqueryParams.startSendDateTime = this.dateRangefs[0];
      this.topqueryParams.endSendDateTime = this.dateRangefs[1];
      this.getList(refresh);
    },
    // æ‚£è€…范围处理
    handleChange(value) {
      let type = value[0];
      let code = value.slice(-1)[0];
      this.topqueryParams.leavehospitaldistrictcodes = [];
      this.topqueryParams.leaveldeptcodes = [];
      if (type == 1) {
        this.topqueryParams.leaveldeptcodes.push(code);
        this.topqueryParams.leavehospitaldistrictcodes = [];
        this.topqueryParams.searchscope = 1;
      } else if (type == 2) {
        this.topqueryParams.leavehospitaldistrictcodes.push(code);
        this.topqueryParams.leaveldeptcodes = [];
        this.topqueryParams.searchscope = 2;
      } else {
        this.topqueryParams.searchscope = 3;
      }
    },
    /** é‡ç½®æŒ‰é’®æ“ä½œ */
    resetQuery() {
      this.dateRange = [];
      this.dateRangefs = [];
      this.topqueryParams = {
        pageNum: 1,
        pageSize: 10,
        sendstate: 6,
        sort: 2, //0 å‡ºé™¢æ—¶é—´(正序)    1 å‡ºé™¢æ—¶é—´(倒序)   2 å‘送时间(正序)    3 å‘送时间(倒序)
        serviceType: 14,
        searchscope: 3,
        visitCount: 1,
        scopetype: [],
        leaveldeptcodes: [],
        leavehospitaldistrictcodes: [],
      };
      this.handleQuery(1);
    },
    handleSelectionChange(rows) {
      this.selectedRows = rows.map((row) => {
        // åˆå§‹åŒ–评分字段
        return {
          ...row,
          authenticity: row.authenticity || 0,
          weekFinish: row.weekFinish || 0,
          standard: row.standard || 0,
          timeliness: row.timeliness || 0,
          library: row.library || 0,
          environment: row.environment || 0,
          doctorSatisfaction: row.doctorSatisfaction || 0,
          nurseSatisfaction: row.nurseSatisfaction || 0,
        };
      });
      if (this.selectedRows.length > 0) {
        this.multiple = false;
      } else {
        this.multiple = true;
      }
    },
    // è®¡ç®—总分
    calculateTotal(row) {
      return (
        (row.authenticity || 0) +
        (row.weekFinish || 0) +
        (row.standard || 0) +
        (row.timeliness || 0) +
        (row.library || 0) +
        (row.environment || 0) +
        (row.doctorSatisfaction || 0) +
        (row.nurseSatisfaction || 0)
      );
    },
    // ä¿å­˜è¯„分
    saveScores() {
      this.selectedRows.forEach((item) => {
        item.createBy = null;
        item.patName = item.sendname;
        item.hospitaldistrictname = item.leavehospitaldistrictname;
      });
      addsatisfaction(this.selectedRows).then((res) => {
        if (res.code == 200) {
          this.$message.success("评分保存成功");
          this.scoreDialogVisible = false;
          this.selectedRows = [];
          this.$refs.userform.clearSelection();
        } else {
          this.$modal.msgWarning("评分保存失败");
          this.scoreDialogVisible = false;
          this.selectedRows = [];
          this.$refs.userform.clearSelection();
        }
      });
      // è¿™é‡Œå¯ä»¥æ·»åŠ ä¿å­˜é€»è¾‘ï¼Œå¦‚è°ƒç”¨API保存评分
    },
    //删除选项
    handleClose(tag) {
      this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
    },
    //触发新增输入
    showInput() {
      this.inputVisible = true;
      this.$nextTick((_) => {
        this.$refs.saveTagInput.$refs.input.focus();
      });
    },
    //获取失去焦点触发
    handleInputConfirm() {
      let inputValue = this.inputValue;
      if (inputValue) {
        this.dynamicTags.push(inputValue);
      }
      this.inputVisible = false;
      this.inputValue = "";
    },
    /** æ–°å¢žæŒ‰é’®æ“ä½œ */
    handleAdd() {
      this.$router.push({
        path: "/followvisit/QuestionnaireTask",
        query: {
          type: 2,
          serviceType: 14,
        },
      });
    },
    //患者360跳转
    gettoken360(sfzh, drcode, drname) {
      this.$modal.msgWarning("360功能暂未开通");
      return; // é˜»æ­¢åŽç»­ä»£ç æ‰§è¡Œ
      this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh;
      if (this.postData.XiaoXiTou.ZuHuMC == "丽水市中医院") {
        this.postData.YeWuXX.YongHuXX.YongHuID = "1400398571877961728";
        this.postData.YeWuXX.YongHuXX.YongHuXM = "LSZYY";
      }
      query360PatInfo(this.postData).then((res) => {
        if (res.data.url) {
          window.open(res.data.url, "_blank");
          // this.linkUrl = res.data.url;
        } else {
          this.$modal.msgWarning("360查询无结果");
        }
      });
    },
    /** é‡ç½®å¯†ç æŒ‰é’®æ“ä½œ */
    handleResetPwd(row) {
      this.$prompt('请输入"' + row.userName + '"的新密码', "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        closeOnClickModal: false,
        inputPattern: /^.{5,20}$/,
        inputErrorMessage: "用户密码长度必须介于 5 å’Œ 20 ä¹‹é—´",
      })
        .then(({ value }) => {
          resetUserPwd(row.userId, value).then((response) => {
            this.$modal.msgSuccess("修改成功,新密码是:" + value);
          });
        })
        .catch(() => {});
    },
    // å–消按钮
    cancel() {
      this.Labelchange = false;
      this.reset();
    },
    /** æäº¤æŒ‰é’® */
    submitForm: function () {
      this.$refs["form"].validate((valid) => {
        if (valid) {
          this.form.isoperation = 2;
          this.form.notrequiredFlag = 1;
          alterpatient(this.form)
            .then((response) => {
              console.log(response);
            })
            .then(() => {
              this.getList(1);
              this.$modal.msgSuccess("患者过滤成功");
            });
          this.reset();
          this.Labelchange = false;
        }
      });
    },
    /** åˆ é™¤æŒ‰é’®æ“ä½œ */
    handleDelete(row) {
      const userIds = row.userId || this.ids;
      this.$modal
        .confirm('是否确认删除用户编号为"' + userIds + '"的数据项?')
        .then(function () {
          return delUser(userIds);
        })
        .then(() => {
          this.getList(1);
          this.$modal.msgSuccess("删除成功");
        })
        .catch(() => {});
    },
    // å…¨éƒ¨åœæ­¢
    AllStop() {
      this.$modal
        .confirm("是否停止全部任务?")
        .then(function () {
          return console.log("停止成功");
        })
        .then(() => {
          this.getList(1);
          this.$modal.msgWarning("停止成功");
        })
        .catch(() => {});
    },
    // å…¨éƒ¨å¼€å§‹
    AllStarted() {
      this.$modal
        .confirm("是否开启全部任务?")
        .then(function () {
          return console.log("开启成功");
        })
        .then(() => {
          this.getList(1);
          this.$modal.msgSuccess("开启成功");
        })
        .catch(() => {});
    },
    // ä»»åŠ¡é‡ç½®
    TaskReset() {
      this.$modal
        .confirm("是否重置选中的任务项?")
        .then(function () {
          return console.log("选中成功");
        })
        .then(() => {
          this.getList(1);
          this.$modal.msgSuccess("重置成功");
        })
        .catch(() => {});
    },
    // è®¾ç½®å‘送时间
    Sendtimesetting() {
      this.modificationVisible = true;
    },
    // è·³è½¬è¯¦æƒ…页
    Seedetails(row) {
      let type = "";
      console.log(row, "rwo");
      if (row.preachformson) {
        if (row.preachformson.includes("3")) {
          type = 1;
        }
      }
      this.$router.push({
        path: "/followvisit/record/detailpage/",
        query: {
          taskid: row.taskid,
          patid: row.patid,
          id: row.id,
          Voicetype: type,
          visitCount: this.topqueryParams.visitCount,
        },
      });
    },
    onSubmit() {},
    // æ‚£è€…过滤触发
    handleUpdate(row) {
      particularpatient(row.patid).then((response) => {
        this.form = response.data;
        this.form.filterDrname = store.getters.nickName;
      });
      this.amendtag = true;
      this.Labelchange = true;
    },
    // ä¾¿æ·æŒ‰é’®
    toleadExport(too) {
      if (too == 1) {
        this.topqueryParams.sendstate = 4;
        this.topqueryParams.excep = null;
      } else if (too == 2) {
        this.topqueryParams.excep = 1;
      }
      this.handleQuery();
    },
    /** å¯¼å‡ºæŒ‰é’®æ“ä½œ */
    handleExport() {
      this.topqueryParams.pageNum = null;
      this.topqueryParams.pageSize = null;
      this.download(
        "smartor/serviceSubtask/patItemExport",
        {
          ...this.topqueryParams,
        },
        `user_${new Date().getTime()}.xlsx`
      );
    },
    // å¼‚常列渲染
    tableRowClassName({ row, rowIndex }) {
      if (row.excep == 1) {
        return "warning-row";
      }
      return "";
    },
    getCurrentTime() {
      const now = new Date();
      const year = now.getFullYear();
      const month = String(now.getMonth() + 1).padStart(2, "0");
      const day = String(now.getDate()).padStart(2, "0");
      const hours = String(now.getHours()).padStart(2, "0");
      const minutes = String(now.getMinutes()).padStart(2, "0");
      const seconds = String(now.getSeconds()).padStart(2, "0");
      return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
    },
  },
};
</script>
<style lang="scss" scoped>
.el-button--primary.is-plain {
  color: #ffffff;
  background: #409eff;
  border-color: #4fabe9;
}
.document {
  // width: 100px;
  height: 50px;
}
::v-deep.el-table .warning-row {
  background: #eec4c4;
}
.documentf {
  display: flex;
  justify-content: flex-end;
}
.download {
  text-align: center;
  .el-upload__tip {
    font-size: 23px;
  }
  .el-upload__text {
    font-size: 23px;
  }
}
.uploading {
  margin-top: 20px;
  margin: 20px;
  padding: 30px;
  background: #ffffff;
  border: 1px solid #dcdfe6;
  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
    0 0 6px 0 rgba(0, 0, 0, 0.04);
}
.el-tag + .el-tag {
  margin-left: 10px;
}
.button-new-tag {
  margin-left: 10px;
  height: 32px;
  line-height: 30px;
  padding-top: 0;
  padding-bottom: 0;
}
.input-new-tag {
  width: 90px;
  margin-left: 10px;
  vertical-align: bottom;
}
.drexamine {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 30px;
  background: #daeaf5;
  img {
    width: 100px;
    height: 100px;
  }
}
.button-textxga {
  color: #de7897;
}
.qrcode-dialo {
  // text-align: center;
  //   display: flex;
  margin: 20px;
  padding: 30px;
  background: #edf1f7;
  border: 1px solid #dcdfe6;
  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
    0 0 6px 0 rgba(0, 0, 0, 0.04);
  .topic-dev {
    margin-bottom: 25px;
    font-size: 20px !important;
    .dev-text {
      margin-bottom: 10px;
    }
  }
}
::v-deep.leftvlue .el-card__body {
  background: #d0e9fd;
}
::v-deep.leftvlue .el-card__body:hover {
  background: #8dc8f8;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
::v-deep.errleftvlue .el-card__body {
  background: #fdd0d7;
}
::v-deep.errleftvlue .el-card__body:hover {
  background: #f88d96;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
::v-deep.ysfleftvlue .el-card__body {
  background: #d0fdd8;
}
::v-deep.ysfleftvlue .el-card__body:hover {
  background: #8df8a4;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
.button-bb {
  font-weight: 500;
  background-color: #2ba05c;
  padding: 5px;
  border-radius: 1px;
  color: #ffffff;
}
.button-xq {
  font-weight: 500;
  background-color: #409eff;
  padding: 5px;
  border-radius: 1px;
  color: #ffffff;
}
.button-sc {
  font-weight: 500;
  background-color: #b3a21f;
  padding: 5px;
  border-radius: 1px;
  color: #ffffff;
}
.button-zx {
  background: #4fabe9;
  padding: 5px;
  border-radius: 1px;
  color: #ffffff;
}
::v-deep.el-radio-group {
  span {
    font-size: 24px;
  }
}
.purple-button {
  background-color: #7e22ce;
  border-color: #7e22ce;
  color: #fff;
}
.purple-button:hover,
.purple-button:focus {
  background-color: #9333ea;
  border-color: #9333ea;
}
.purple-button:active {
  background-color: #6b21a8;
  border-color: #6b21a8;
}
.purple-button.is-disabled {
  background-color: #d8b4fe;
  border-color: #d8b4fe;
  opacity: 1; /* ä¿æŒç¦ç”¨çŠ¶æ€é€æ˜Žåº¦ */
}
// é€‰é¡¹å­—体放大
// ::v-deep.el-checkbox-group {
//   span {
//     font-size: 24px;
//   }
// }
</style>
src/views/followvisit/outpatient/index.vue
@@ -138,8 +138,7 @@
        <el-col :span="1.5">
          <el-button
            type="primary"
            plain
            icon="el-icon-plus"
                        icon="el-icon-plus"
            size="medium"
            @click="handleAdd"
            >新增</el-button
@@ -739,7 +738,7 @@
        //   value: 0,
        // },
        {
          name: "应随访",
          name: "需随访",
          value: 0,
        },
@@ -1273,10 +1272,12 @@
  }
}
::v-deep.leftvlue .el-card__body {
  background: #d0e9fd;
  background: #F2F8FF;
  color: #324A9B;
}
::v-deep.leftvlue .el-card__body:hover {
  background: #8dc8f8;
  background: #3664D9;
  color: #fff;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
::v-deep.errleftvlue .el-card__body {
src/views/followvisit/record/detailpage/index.vue
@@ -18,7 +18,7 @@
                >只展示本次服务信息</el-button
              >
            </div>
            <div style="margin-left: 20px; color: #59a0f0">
            <!-- <div style="margin-left: 20px; color: #59a0f0">
              <el-link
                href="https://9.208.2.207:6060/search-homepage"
                target="_blank"
@@ -26,7 +26,7 @@
              >
                å‰å¾€CDSS查询
              </el-link>
            </div>
            </div> -->
            <div class="merge-controls" v-if="Whetherall">
              <el-button
                type="primary"
@@ -254,6 +254,7 @@
      />
    </el-dialog>
    <div class="action-container">
      <!-- éšè®¿å†…容 -->
      <div class="call-action">
        <div class="call-container">
          <!-- <div class="call-header">
@@ -381,8 +382,18 @@
                          {{ index + 1 }}、[问答]<span>{{
                            item.scriptContent
                          }}</span>
                          <span v-if="item.valueType == 3">(只能输入数字)</span>
                        </div>
                        <div class="dev-xx">
                        <div class="dev-xx" v-if="item.valueType == 3">
                          <el-input
                            type="text"
                            v-numeric-only
                            placeholder="请输入答案"
                            v-model="item.scriptResult"
                          >
                          </el-input>
                        </div>
                        <div class="dev-xx" v-else>
                          <el-input
                            type="textarea"
                            :rows="2"
@@ -437,15 +448,25 @@
                      <div class="scriptTopic-dev" :key="index" v-else>
                        <div class="dev-text">
                          {{ index + 1 }}、[问答]<span>{{
                            item.questiontext
                            item.scriptContent
                          }}</span>
                          <span v-if="item.valueType == 3">(只能输入数字)</span>
                        </div>
                        <div class="dev-xx">
                        <div class="dev-xx" v-if="item.valueType == 3">
                          <el-input
                            type="text"
                            v-numeric-only
                            placeholder="请输入答案"
                            v-model="item.scriptResult"
                          >
                          </el-input>
                        </div>
                        <div class="dev-xx" v-else>
                          <el-input
                            type="textarea"
                            :rows="2"
                            placeholder="请输入答案"
                            v-model="item.matchedtext"
                            v-model="item.scriptResult"
                            clearable
                          >
                          </el-input>
@@ -529,6 +550,7 @@
          </div>
        </div>
      </div>
      <!-- äººå·¥å¤„理 -->
      <div class="manual-action">
        <div class="Followuserinfos">
          <div>
@@ -556,6 +578,46 @@
                    @click="sendAgain()"
                    >再次随访</el-button
                  >
                </div>
                <div class="tag-selector-container">
                  <el-select
                    v-model="selectedTag"
                    placeholder="请选择异常状态"
                    clearable
                    style="width: 150px; margin-right: 10px"
                  >
                    <el-option
                      v-for="item in tagOptions"
                      :key="item.value"
                      :label="item.label"
                      :value="item.value"
                    >
                      <span style="display: flex; align-items: center">
                        <span
                          class="color-indicator"
                          :style="{ backgroundColor: item.color }"
                        ></span>
                        <span>{{ item.label }}</span>
                      </span>
                    </el-option>
                  </el-select>
                  <!-- å½“前选择的颜色指示器 -->
                  <div
                    v-if="selectedTag"
                    class="color-indicator selected-indicator"
                    :style="{ backgroundColor: getSelectedTagColor() }"
                  ></div>
                  <!-- æ ‡è®°è¯´æ˜Žæç¤º -->
                  <el-tooltip
                    v-if="selectedTag"
                    effect="light"
                    :content="getSelectedDescription()"
                    placement="top"
                  >
                    <i class="el-icon-info tag-info-icon"></i>
                  </el-tooltip>
                </div>
              </div>
              <el-row>
@@ -938,7 +1000,67 @@
    CallButton,
    MergeAndModify,
  },
  directives: {
    numericOnly: {
      bind(el, binding, vnode) {
        // å°è¯•获取实际的input元素
        const input = el.tagName === "INPUT" ? el : el.querySelector("input");
        if (!input) {
          console.warn("v-numeric-only: æœªæ‰¾åˆ°input元素");
          return;
        }
        const handleInput = function (event) {
          const oldValue = input.value;
          const newValue = oldValue.replace(/[^\d]/g, "");
          if (newValue !== oldValue) {
            input.value = newValue;
            // è§¦å‘input事件,通知v-model更新
            input.dispatchEvent(new Event("input", { bubbles: true })); // æ³¨æ„bubbles
          }
        };
        const handlePaste = function (event) {
          event.preventDefault();
          const clipboardData = event.clipboardData || window.clipboardData;
          const pastedData = clipboardData.getData("text");
          const numericValue = pastedData.replace(/[^\d]/g, "");
          // æ¨¡æ‹Ÿåœ¨å…‰æ ‡ä½ç½®æ’入纯数字文本
          const start = input.selectionStart;
          const end = input.selectionEnd;
          input.value =
            input.value.substring(0, start) +
            numericValue +
            input.value.substring(end);
          // è°ƒæ•´å…‰æ ‡ä½ç½®
          const newCursorPos = start + numericValue.length;
          input.setSelectionRange(newCursorPos, newCursorPos);
          // è§¦å‘input事件
          input.dispatchEvent(new Event("input", { bubbles: true }));
        };
        input.addEventListener("input", handleInput);
        input.addEventListener("paste", handlePaste);
        // å­˜å‚¨å¼•用以便解绑
        el._numericOnly = {
          inputHandle: handleInput,
          pasteHandle: handlePaste,
          inputEl: input,
        };
      },
      unbind(el) {
        if (el._numericOnly) {
          const { inputHandle, pasteHandle, inputEl } = el._numericOnly;
          inputEl.removeEventListener("input", inputHandle);
          inputEl.removeEventListener("paste", pasteHandle);
          delete el._numericOnly;
        }
      },
    },
  },
  dicts: ["sys_normal_disable", "sys_user_sex", "sys_yujing", "sys_suggest"],
  data() {
    const validatePhone = (rule, value, callback) => {
@@ -976,6 +1098,30 @@
      isMergeMode: false,
      mergeDialogVisible: false,
      selectedServices: [], // é€‰ä¸­çš„æœåŠ¡åˆ—è¡¨
      selectedTag: "",
      tagOptions: [
        {
          value: "0",
          label: "正常",
          type: "normal",
          color: "#7ff5e1",
          description: "患者情况正常,无需特别关注",
        },
        {
          value: "1",
          label: "异常",
          type: "abnormal",
          color: "#f75c5c",
          description: "患者存在异常情况,需要重点关注",
        },
        {
          value: "2",
          label: "警告",
          type: "warning",
          color: "#fbfb4a",
          description: "患者情况需要警告注意,可能存在风险",
        },
      ],
      zcrules: {
        resource: [
          { required: true, message: "请选择随访方式", trigger: "change" },
@@ -1193,6 +1339,8 @@
    },
    //患者360跳转
    gettoken360(sfzh, drcode, drname) {
      this.$modal.msgWarning("360功能暂未开通");
      return; // é˜»æ­¢åŽç»­ä»£ç æ‰§è¡Œ
      this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh;
      if (this.postData.XiaoXiTou.ZuHuMC == "丽水市中医院") {
        this.postData.YeWuXX.YongHuXX.YongHuID = "1400398571877961728";
@@ -1211,7 +1359,7 @@
    getuserinfo() {
      const queryParams = {
        pid: Number(this.patid),
        allhosp: "0",
        allhosp: "0", //1住院2门诊3体检4出院
      };
      // æ‚£è€…基础信息
      messagelistpatient(queryParams).then((response) => {
@@ -1318,6 +1466,13 @@
      let excep = "";
      const promises = [];
      this.tableDatatop.forEach((item) => {
        if (item.valueType == 3 && item.scriptResult) {
          // éªŒè¯æ˜¯å¦ä¸ºæœ‰æ•ˆæ•°å­—
          if (!/^\d+$/.test(item.scriptResult)) {
            this.$message.error(`问题 "${item.scriptContent}" å¿…须输入数字`);
            return;
          }
        }
        var objs = item.svyLibTemplateTargetoptions.find(
          (items) => items.optioncontent == item.scriptResult
        );
@@ -1348,6 +1503,7 @@
          promises.push(serviceSubtaskDetailadd(obj));
        }
      });
      // ä½¿ç”¨ Promise.all ç­‰å¾…所有异步操作完成
      Promise.all(promises)
        .then((results) => {
@@ -1591,6 +1747,7 @@
          this.logsheetlist = res.rows[0].serviceSubtaskList;
          this.templateid = this.logsheetlist[0].templateid;
          this.selectedTag = this.logsheetlist[0].excep;
          const targetDate = new Date(this.form.longSendTime); // ç›®æ ‡æ—¥æœŸ
          const now = new Date(); // å½“前时间
          if (now < targetDate && this.form.sendstate == 2) {
@@ -1668,6 +1825,7 @@
            (item) => item.id == this.id
          );
          objson.remark = this.form.remark;
          objson.excep = this.selectedTag;
          if (sendstate) objson.sendstate = sendstate;
          Editsingletaskson(objson).then((res) => {
            if (res.code) {
@@ -1692,6 +1850,30 @@
      }
      return "";
    },
    getSelectedTagType() {
      if (!this.selectedTag) return "";
      const tag = this.tagOptions.find(
        (item) => item.value === this.selectedTag
      );
      return tag ? tag.type : "";
    },
    getSelectedTagColor() {
      if (!this.selectedTag) return "";
      const tag = this.tagOptions.find(
        (item) => item.value === this.selectedTag
      );
      return tag ? tag.color : "";
    },
    getSelectedDescription() {
      if (!this.selectedTag) return "";
      const tag = this.tagOptions.find(
        (item) => item.value === this.selectedTag
      );
      return tag ? tag.description : "";
    },
    // è°ƒèµ·å†æ¬¡å‘送
    sendAgain() {
      document.querySelector("#app").scrollTo(0, 0);
@@ -1998,7 +2180,22 @@
    height: 100%; /* ç¡®ä¿é«˜åº¦ç»§æ‰¿ */
  }
}
.numeric-input {
  position: relative;
}
.numeric-input::after {
  content: "只能输入数字";
  position: absolute;
  right: 8px;
  top: 50%;
  transform: translateY(-50%);
  font-size: 12px;
  color: #999;
  background: #f5f5f5;
  padding: 2px 6px;
  border-radius: 4px;
}
.call-container {
  padding: 20px;
  background: #fff;
@@ -2241,7 +2438,54 @@
    top: 0;
  }
}
.tag-selector-container {
  display: flex;
  align-items: center;
  margin: 0 30px;
}
.color-indicator {
  width: 16px;
  height: 16px;
  border-radius: 3px;
  margin-right: 8px;
  display: inline-block;
}
.selected-indicator {
  margin-left: 10px;
  width: 20px;
  height: 20px;
}
.tag-info-icon {
  margin-left: 10px;
  color: #909399;
  cursor: pointer;
  font-size: 16px;
}
/* ç¡®ä¿é€‰æ‹©å™¨é€‰é¡¹ä¸­ä¹Ÿæ˜¾ç¤ºé¢œè‰²å— */
.el-select-dropdown__item {
  display: flex;
  align-items: center;
}
.tag-normal {
  background-color: #7ff5e1;
}
.tag-abnormal {
  background-color: #f75c5c;
}
.tag-warning {
  background-color: #fbfb4a;
}
.tag-info {
  margin-left: 10px;
  color: #909399;
  cursor: pointer;
}
::v-deep.offside-value .el-radio__label {
  color: #fff;
}
@@ -2291,4 +2535,189 @@
  color: #080808 !important;
  cursor: not-allowed;
}
/* åŽŸæœ‰çš„æ ·å¼ä¿æŒä¸å˜ï¼Œæ·»åŠ ä»¥ä¸‹å“åº”å¼ä»£ç  */
.Followupdetailspage {
  margin: 10px;
  display: flex;
  flex-direction: column;
  gap: 20px;
}
.action-container {
  display: flex;
  flex-direction: row; /* é»˜è®¤æ¨ªå‘排列 */
  gap: 20px;
  margin: 0 10px 20px 10px;
  /* å½“缩放比例大于100%或屏幕宽度较小时改为上下排列 */
  @media screen and (max-width: 1200px), (min-resolution: 1.1dppx) {
    flex-direction: column;
    .call-action, .manual-action {
      width: 100% !important;
    }
  }
}
.call-action {
  width: 65%;
  min-width: 0;
}
.manual-action {
  flex: 1;
  min-width: 0;
}
/* è°ƒæ•´å†…部元素的响应式布局 */
.Followuserinfos {
  .el-form {
    /* è¡¨å•响应式调整 */
    .el-row {
      margin: 0 -10px;
    }
    .el-col {
      padding: 0 10px;
    }
    @media screen and (max-width: 768px) {
      .el-col {
        width: 100%;
        margin-bottom: 15px;
        &:last-child {
          margin-bottom: 0;
        }
      }
    }
  }
}
/* è°ƒæ•´è¡¨æ ¼çš„响应式表现 */
.el-table {
  ::v-deep .el-table__body-wrapper {
    overflow-x: auto;
  }
  /* åœ¨å°å±å¹•上调整表格列宽 */
  @media screen and (max-width: 992px) {
    .el-table-column {
      min-width: 120px;
    }
  }
}
/* è°ƒæ•´æ ‡ç­¾é€‰æ‹©å™¨çš„响应式布局 */
.tag-selector-container {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 10px;
  @media screen and (max-width: 576px) {
    flex-direction: column;
    align-items: flex-start;
    .el-select {
      width: 100%;
      margin-right: 0 !important;
    }
  }
}
/* è°ƒæ•´æŒ‰é’®ç»„的响应式布局 */
.el-form-item.label-processing-opinion {
  .el-button-group {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    .el-button {
      flex: 1;
      min-width: 120px;
    }
  }
}
/* è°ƒæ•´é€‰é¡¹å¡çš„响应式表现 */
.el-tabs {
  ::v-deep .el-tabs__nav-wrap {
    overflow-x: auto;
    white-space: nowrap;
    &::after {
      display: none;
    }
  }
}
/* è°ƒæ•´é¢„览区域的响应式表现 */
.preview-left {
  @media screen and (max-width: 768px) {
    margin: 10px;
    padding: 15px;
    .topic-dev, .scriptTopic-dev {
      margin-bottom: 15px;
    }
  }
}
/* è°ƒæ•´å¯¹è¯æ¡†çš„响应式表现 */
.el-dialog {
  @media screen and (max-width: 992px) {
    width: 90% !important;
    margin-top: 5vh !important;
    .el-dialog__body {
      padding: 15px;
    }
  }
  @media screen and (max-width: 576px) {
    width: 95% !important;
    .el-form-item {
      margin-bottom: 15px;
    }
  }
}
/* ç¡®ä¿å†…容在缩放时保持可读性 */
.headline {
  font-size: clamp(18px, 2vw, 24px); /* ä½¿ç”¨clamp函数确保字体大小在合理范围内 */
}
/* ä¸ºç§»åŠ¨è®¾å¤‡ä¼˜åŒ–æ»šåŠ¨ä½“éªŒ */
@media screen and (max-width: 768px) {
  .Followuserinfo, .Followuserinfos {
    padding: 15px;
    margin: 5px;
  }
  .CONTENT {
    min-height: auto;
    padding: 5px;
  }
}
/* ç¼©æ”¾æ£€æµ‹æ ·å¼ */
@media screen and (min-resolution: 1.1dppx),
       screen and (-webkit-min-device-pixel-ratio: 1.1),
       screen and (max-width: 1200px) {
  .action-container {
    flex-direction: column;
  }
  .call-action, .manual-action {
    width: 100%;
  }
  /* è°ƒæ•´å†…部元素间距 */
  .call-container, .Followuserinfos {
    margin-bottom: 20px;
  }
}
</style>
src/views/followvisit/record/index.vue
@@ -149,8 +149,7 @@
        <el-col :span="1.5">
          <el-button
            type="primary"
            plain
            icon="el-icon-plus"
                        icon="el-icon-plus"
            size="medium"
            @click="handleAdd"
            >新增</el-button
@@ -863,7 +862,7 @@
        //   value: 0,
        // },
        {
          name: "应随访",
          name: "需随访",
          value: 0,
        },
@@ -1080,6 +1079,8 @@
    },
    //患者360跳转
    gettoken360(sfzh, drcode, drname) {
      this.$modal.msgWarning('360功能暂未开通');
  return; // é˜»æ­¢åŽç»­ä»£ç æ‰§è¡Œ
      this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh;
      if (this.postData.XiaoXiTou.ZuHuMC == "丽水市中医院") {
        this.postData.YeWuXX.YongHuXX.YongHuID = "1400398571877961728";
@@ -1585,10 +1586,12 @@
  }
}
::v-deep.leftvlue .el-card__body {
  background: #d0e9fd;
  background: #F2F8FF;
  color: #324A9B;
}
::v-deep.leftvlue .el-card__body:hover {
  background: #8dc8f8;
  background: #3664D9;
  color: #fff;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
::v-deep.errleftvlue .el-card__body {
src/views/followvisit/record/physical/index.vue
@@ -18,7 +18,7 @@
                >只展示本次服务信息</el-button
              >
            </div>
            <div style="margin-left: 20px; color: #59a0f0">
            <!-- <div style="margin-left: 20px; color: #59a0f0">
              <el-link
                href="https://9.208.2.207:6060/search-homepage"
                target="_blank"
@@ -26,7 +26,7 @@
              >
                å‰å¾€CDSS查询
              </el-link>
            </div>
            </div> -->
          </div>
          <!-- <el-button type="success">随访后短信</el-button> -->
        </div>
@@ -692,6 +692,8 @@
    //患者360跳转
    gettoken360(sfzh, drcode, drname) {
      this.$modal.msgWarning('360功能暂未开通');
  return; // é˜»æ­¢åŽç»­ä»£ç æ‰§è¡Œ
      this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh;
      if (this.postData.XiaoXiTou.ZuHuMC == "丽水市中医院") {
        this.postData.YeWuXX.YongHuXX.YongHuID = "1400398571877961728";
src/views/followvisit/tasklist/index.vue
@@ -250,8 +250,15 @@
              size="medium"
              type="text"
              @click="handleUpdate(scope.row, 1)"
              ><span class="button-xj"
                ><i class="el-icon-circle-plus-outline"></i>依照新增</span
              ><span class="button-xj">依照新增</span></el-button
            >
            <el-button
              v-if="scope.row.sendState != 5"
              size="medium"
              type="text"
              @click="handleAddpatient(scope.row.taskid, scope.row.type)"
              ><span class="button-hz"
                ><i class="el-icon-circle-plus-outline"></i>新增患者</span
              ></el-button
            >
            <el-button
@@ -259,9 +266,7 @@
              size="medium"
              type="text"
              @click="stop(scope.row)"
              ><span class="button-zt"
                ><i class="el-icon-circle-plus-outline"></i>暂停</span
              ></el-button
              ><span class="button-zt">暂停</span></el-button
            >
          </template>
        </el-table-column>
@@ -373,6 +378,13 @@
        >
      </div>
    </el-dialog>
    <!-- é€‰æ‹©æ‚£è€…弹框 -->
    <Patient-Selection
      ref="Patient"
      :dialogVisiblepatient="dialogVisiblepatient"
      @addoption="addoption"
      @kkoption="dialogVisiblepatient = true"
    />
  </div>
</template>
@@ -387,23 +399,19 @@
} from "@/api/system/user";
import {
  getTasklist,
  getTaskInfo,
  Editsingletask,
  delTaskInfo,
  Questionnairetasklist,
  Questionnairetaskget,
  Questionnairetasksponsor,
  TaskTemplateSendExecution,
} from "@/api/AiCentre/index";
import store from "@/store";
import PatientSelection from "@/components/PatientSelection"; //正则组件
import SFtable from "@/components/SFtable"; //表格组件
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
  name: "Tasklist",
  dicts: ["sys_normal_disable", "sys_user_sex", "task_status"],
  components: { Treeselect },
  components: { Treeselect, PatientSelection },
  data() {
    return {
      // é®ç½©å±‚
@@ -441,6 +449,8 @@
        showTimeNight: [],
        showTimeNoon: [],
      },
      dialogVisiblepatient: false,
      Patientlist: [],
      taskformVisible: false,
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
@@ -474,61 +484,8 @@
          label: "消息通知",
        },
      ],
      taskoptions: [
        {
          value: "1",
          label: "监测评估",
        },
        {
          value: "2",
          label: "出院随访",
        },
        {
          value: "3",
          label: "门诊随访",
        },
        {
          value: "4",
          label: "宣教关怀",
        },
        {
          value: "5",
          label: "复诊管理",
        },
        // {
        //   value: "5",
        //   label: "满意度调查",
        // },
        {
          value: "7",
          label: "患者报告",
        },
        // {
        //   value: "8",
        //   label: "其他通知",
        // },
        {
          value: "9",
          label: "体检随访",
        },
        // {
        //   value: "10",
        //   label: "医技随访",
        // },
        {
          value: "11",
          label: "影像随访",
        },
        {
          value: "12",
          label: "心电随访",
        },
        {
          value: "13",
          label: "专病随访",
        },
      ],
      tasktopic: "2", //新增类型
      taskoptions: store.getters.tasktypes,
      tasktopic: 2, //新增类型
      activname: "",
      value: [],
      list: [],
@@ -719,6 +676,7 @@
        this.tasktopic == 3 ||
        this.tasktopic == 1 ||
        this.tasktopic == 7 ||
        this.tasktopic == 5 ||
        this.tasktopic == 6
      ) {
        if (!this.topqueryParams.type) this.topqueryParams.type = "2";
@@ -732,7 +690,7 @@
            label: "问卷随访",
          },
        ];
        this.topqueryParams.type=2;
        this.topqueryParams.type = 2;
      } else if (this.tasktopic == 4 || this.tasktopic == 8) {
        if (!this.topqueryParams.type) this.topqueryParams.type = "3";
        this.longtermlist = [
@@ -741,9 +699,9 @@
            label: "宣教关怀",
          },
        ];
        this.topqueryParams.type=3;
      } else if (this.tasktopic == 5) {
        if (!this.topqueryParams.type) this.topqueryParams.type = "1";
        this.topqueryParams.type = 3;
      } else if (this.tasktopic == 16) {
        if (!this.topqueryParams.type) this.topqueryParams.type = "2";
        this.longtermlist = [
          {
            value: 1,
@@ -753,7 +711,12 @@
            value: 2,
            label: "问卷随访",
          },
          {
            value: 3,
            label: "宣教关怀",
          },
        ];
        this.topqueryParams.type = 2;
      }
      this.topqueryParams.beginTime = this.dateRange[0];
      this.topqueryParams.endTime = this.dateRange[1];
@@ -1088,6 +1051,14 @@
      const item = data.find((item) => item.value === value);
      return item ? item.label : null;
    },
    handleAddpatient(taskid) {
      this.$refs.Patient.handleAddpatient(taskid);
      this.dialogVisiblepatient = true; // æ‰‹åŠ¨æŽ§åˆ¶å¼¹çª—æ˜¾ç¤º
    },
    addoption() {
      this.dialogVisiblepatient = false; // æ‰‹åŠ¨æŽ§åˆ¶å¼¹çª—æ˜¾ç¤º
      this.handleQuery();
    },
  },
};
</script>
@@ -1217,6 +1188,12 @@
  border-radius: 1px;
  color: #ffffff;
}
.button-hz {
  background: #63d37b;
  padding: 5px;
  border-radius: 1px;
  color: #ffffff;
}
::v-deep.el-radio-group {
  span {
src/views/followvisit/technology/index.vue
@@ -138,8 +138,7 @@
        <el-col :span="1.5">
          <el-button
            type="primary"
            plain
            icon="el-icon-plus"
                        icon="el-icon-plus"
            size="medium"
            @click="handleAdd"
            >新增</el-button
@@ -807,7 +806,7 @@
        //   value: 0,
        // },
        {
          name: "应随访",
          name: "需随访",
          value: 0,
        },
@@ -1092,6 +1091,8 @@
    },
    //患者360跳转
    gettoken360(sfzh,drcode,drname) {
      this.$modal.msgWarning('360功能暂未开通');
  return; // é˜»æ­¢åŽç»­ä»£ç æ‰§è¡Œ
      this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh;
      if (this.postData.XiaoXiTou.ZuHuMC=='丽水市中医院') {
        this.postData.YeWuXX.YongHuXX.YongHuID = '1400398571877961728';
@@ -1521,10 +1522,12 @@
  }
}
::v-deep.leftvlue .el-card__body {
  background: #d0e9fd;
  background: #F2F8FF;
  color: #324A9B;
}
::v-deep.leftvlue .el-card__body:hover {
  background: #8dc8f8;
  background: #3664D9;
  color: #fff;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
::v-deep.errleftvlue .el-card__body {
src/views/followvisit/zbAgain/index.vue
@@ -180,8 +180,7 @@
        <el-col :span="1.5">
          <el-button
            type="primary"
            plain
            icon="el-icon-plus"
                        icon="el-icon-plus"
            size="medium"
            @click="handleAdd"
            >新增</el-button
@@ -918,7 +917,7 @@
        //   value: 0,
        // },
        {
          name: "应随访",
          name: "需随访",
          value: 0,
        },
        {
@@ -1416,6 +1415,8 @@
    },
    //患者360跳转
    gettoken360(sfzh, drcode, drname) {
      this.$modal.msgWarning('360功能暂未开通');
  return; // é˜»æ­¢åŽç»­ä»£ç æ‰§è¡Œ
      this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh;
      if (this.postData.XiaoXiTou.ZuHuMC == "丽水市中医院") {
        this.postData.YeWuXX.YongHuXX.YongHuID = "1400398571877961728";
@@ -1762,10 +1763,12 @@
  }
}
::v-deep.leftvlue .el-card__body {
  background: #d0e9fd;
  background: #F2F8FF;
  color: #324A9B;
}
::v-deep.leftvlue .el-card__body:hover {
  background: #8dc8f8;
  background: #3664D9;
  color: #fff;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
::v-deep.errleftvlue .el-card__body {
@@ -1810,7 +1813,9 @@
  border-radius: 1px;
  color: #ffffff;
}
.button-textxga {
  color: #de7897;
}
::v-deep.el-radio-group {
  span {
    font-size: 24px;
src/views/followvisit/zysatisfaction/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1969 @@
<template>
  <div class="app-container">
    <div class="leftvlue" style="margin-bottom: 20px">
      <el-row :gutter="10">
        <el-col :span="2.5" v-for="(item, index) in cardlist" :key="index">
          <el-card
            shadow="hover"
            :body-style="item.router ? ' cursor: pointer' : 'cursor: default'"
          >
            <div style="padding: 8px" @click="$router.push(item.router)">
              <span>{{ item.name }}</span>
              <div
                style="
                  text-align: center;
                  font-size: 18px;
                  margin-top: 10px;
                  font-weight: 600;
                "
              >
                {{ item.value ? item.value : 0 }}
              </div>
            </div>
          </el-card>
        </el-col>
        <el-col :span="2.5">
          <div class="ysfleftvlue">
            <el-card shadow="hover">
              <div style="padding: 8px">
                <span>表单已发送</span>
                <div
                  style="
                    text-align: center;
                    font-size: 18px;
                    margin-top: 10px;
                    font-weight: 600;
                  "
                >
                  {{ yfsvalue }}
                </div>
              </div>
            </el-card>
          </div>
        </el-col>
        <el-col :span="2.5">
          <div class="errleftvlue">
            <el-card shadow="hover">
              <div style="padding: 8px">
                <span>异常</span>
                <div
                  style="
                    text-align: center;
                    font-size: 18px;
                    margin-top: 10px;
                    font-weight: 600;
                  "
                >
                  {{ ycvalue }}
                </div>
              </div>
            </el-card>
          </div>
        </el-col>
      </el-row>
    </div>
    <el-row :gutter="20">
      <!--用户数据-->
      <el-form
        :model="topqueryParams"
        ref="queryForm"
        size="small"
        :inline="true"
        v-show="showSearch"
        label-width="98px"
      >
        <el-form-item label="任务名称">
          <el-input
            v-model="topqueryParams.taskName"
            placeholder="请选择任务名称"
          ></el-input>
        </el-form-item>
        <el-form-item label="出院时间">
          <el-date-picker
            v-model="dateRange"
            style="width: 240px"
            value-format="yyyy-MM-dd"
            type="daterange"
            range-separator="-"
            start-placeholder="开始日期"
            end-placeholder="结束日期"
          ></el-date-picker>
        </el-form-item>
        <el-form-item label="患者姓名" prop="sendname">
          <el-input
            v-model="topqueryParams.sendname"
            placeholder="请输入患者姓名"
          ></el-input>
        </el-form-item>
        <el-form-item label="诊断名称" prop="leavediagname">
          <el-input
            v-model="topqueryParams.leavediagname"
            placeholder="请输入诊断名称"
          ></el-input>
        </el-form-item>
        <el-form-item label="随访人员" prop="updateBy">
          <el-input
            v-model="topqueryParams.updateBy"
            placeholder="请输入随访人员"
          ></el-input>
        </el-form-item>
        <el-form-item label="主治医生" prop="drname">
          <el-input
            v-model="topqueryParams.drname"
            placeholder="请输入主治医生"
          ></el-input>
        </el-form-item>
        <el-form-item label="经管医生" prop="managementDoctor">
          <el-input
            v-model="topqueryParams.managementDoctor"
            placeholder="请输入主治医生"
          ></el-input>
        </el-form-item>
        <el-form-item label="患者范围" prop="status">
          <el-cascader
            v-model="topqueryParams.scopetype"
            placeholder="默认全部"
            :options="sourcetype"
            :props="{ expandTrigger: 'hover' }"
            @change="handleChange"
          ></el-cascader>
        </el-form-item>
        <el-form-item label="任务状态" prop="status">
          <el-select v-model="topqueryParams.sendstate" placeholder="请选择">
            <el-option
              v-for="item in topicoptions"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            >
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="排序方式" prop="status">
          <el-select v-model="topqueryParams.sort" placeholder="请选择">
            <el-option
              v-for="item in topicoptionssort"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            >
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item>
          <el-button
            type="primary"
            icon="el-icon-search"
            size="medium"
            @click="handleQuery(1)"
            >搜索</el-button
          >
          <el-button icon="el-icon-refresh" size="medium" @click="resetQuery"
            >重置</el-button
          >
        </el-form-item>
      </el-form>
      <el-divider></el-divider>
      <el-row :gutter="10" class="mb8">
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button
                type="warning"
                plain
                icon="el-icon-upload2"
                size="medium"
                @click="handleExport"
                >导出</el-button
              >
            </div>
          </div>
        </el-col>
        <el-col :span="1.5">
          <el-button
            type="primary"
                        icon="el-icon-plus"
            size="medium"
            @click="handleAdd"
            >新增</el-button
          >
        </el-col>
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button
                type="warning"
                plain
                icon="el-icon-warning-outline"
                size="medium"
                @click="toleadExport(1)"
                >执行失败</el-button
              >
            </div>
          </div>
        </el-col>
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button
                type="danger"
                plain
                icon="el-icon-warning"
                size="medium"
                @click="toleadExport(2)"
                >结果异常</el-button
              >
            </div>
          </div>
        </el-col>
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button
                type="success"
                plain
                size="medium"
                @click="buidegetTasklist()"
                >待办服务</el-button
              >
            </div>
          </div>
        </el-col>
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button
                type="primary"
                plain
                size="medium"
                @click="affiliation()"
                >本人所属服务</el-button
              >
            </div>
          </div>
        </el-col>
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button type="success" size="medium" @click="onthatday()"
                >当日服务</el-button
              >
            </div>
          </div>
        </el-col>
      </el-row>
      <el-table
        v-loading="loading"
        ref="userform"
        :data="userList"
        :row-class-name="tableRowClassName"
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="50" align="center" />
        <el-table-column
          label="任务名称"
          fixed
          width="150"
          show-overflow-tooltip
          align="center"
          key="taskName"
          prop="taskName"
        />
        <!-- <el-table-column label="序号" fixed align="center" key="id" prop="id" /> -->
        <el-table-column
          label="姓名"
          width="100"
          align="center"
          key="sendname"
          prop="sendname"
        >
          <template slot-scope="scope">
            <el-button
              size="medium"
              type="text"
              @click="
                gettoken360(scope.row.sfzh, scope.row.drcode, scope.row.drname)
              "
              ><span class="button-textsc">{{
                scope.row.sendname
              }}</span></el-button
            >
          </template>
        </el-table-column>
        <el-table-column
          label="任务状态"
          align="center"
          key="sendstate"
          prop="sendstate"
          width="120"
        >
          <template slot-scope="scope">
            <el-tooltip
              class="item"
              effect="dark"
              :content="scope.row.remark"
              placement="top-start"
            >
              <div v-if="scope.row.sendstate == 1">
                <el-tag type="primary" :disable-transitions="false"
                  >表单已领取</el-tag
                >
              </div>
              <div v-if="scope.row.sendstate == 2">
                <el-tag type="primary" :disable-transitions="false"
                  >待随访</el-tag
                >
              </div>
              <div v-if="scope.row.sendstate == 3">
                <el-tag type="success" :disable-transitions="false"
                  >表单已发送</el-tag
                >
              </div>
              <div v-if="scope.row.sendstate == 4">
                <el-tag type="info" :disable-transitions="false">不执行</el-tag>
              </div>
              <div v-if="scope.row.sendstate == 5">
                <el-tag type="danger" :disable-transitions="false"
                  >发送失败</el-tag
                >
              </div>
              <div v-if="scope.row.sendstate == 6">
                <el-tag type="success" :disable-transitions="false"
                  >已完成</el-tag
                >
              </div>
            </el-tooltip>
          </template>
        </el-table-column>
        <!-- <el-table-column
          label="任务异常说明"
          width="120"
          align="center"
          key="remark"
          prop="remark" -->
        />
        <el-table-column
          label="处理意见"
          align="center"
          key="suggest"
          prop="suggest"
          width="120"
        >
          <template slot-scope="scope">
            <dict-tag
              :options="dict.type.sys_suggest"
              :value="scope.row.suggest"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="随访完成时间"
          sortable
          align="center"
          prop="finishtime"
          width="160"
        >
          <template slot-scope="scope">
            <span>{{ parseTime(scope.row.finishtime) }}</span>
          </template>
        </el-table-column>
        <el-table-column
          label="出院日期"
          width="200"
          align="center"
          key="endtime"
          prop="endtime"
        >
          <template slot-scope="scope">
            <span>{{ formatTime(scope.row.endtime) }}</span>
          </template></el-table-column
        >
        <el-table-column
          label="主治医生"
          width="120"
          align="center"
          key="drname"
          prop="drname"
        />
        <el-table-column
          label="随访人员"
          align="center"
          key="updateBy"
          prop="updateBy"
          width="120"
        />
        <el-table-column
          label="经管医生"
          align="center"
          key="managementDoctor"
          prop="managementDoctor"
          width="120"
        />
        <el-table-column
          label="出院天数"
          width="120"
          align="center"
          key="endDay"
          prop="endDay"
        >
          <template slot-scope="scope">
            <span>{{ scope.row.endDay ? scope.row.endDay + "天" : "" }}</span>
          </template>
        </el-table-column>
        <el-table-column
          label="身份证号码"
          width="200"
          align="center"
          key="sfzh"
          prop="sfzh"
        />
        <el-table-column
          label="联系电话"
          width="200"
          align="center"
          key="phone"
          prop="phone"
        />
        <el-table-column
          label="责任护士"
          width="120"
          align="center"
          key="nurseName"
          prop="nurseName"
        />
        <!-- <el-table-column
          label="病历号"
          align="center"
          sortable
          key="medicalRecordNo"
          prop="medicalRecordNo"
          width="120"
        /> -->
        <!-- <el-table-column label="年龄" align="center" key="age" prop="age" /> -->
        <!-- <el-table-column label="性别"width="100" align="center" key="sex" prop="sex" /> -->
        <!-- <el-table-column label="床号" align="center" key="badNo" prop="badNo" /> -->
        <el-table-column
          label="科室"
          align="center"
          key="deptname"
          prop="deptname"
          width="120"
        >
        </el-table-column>
        <el-table-column
          label="病区"
          align="center"
          key="leavehospitaldistrictname"
          prop="leavehospitaldistrictname"
          width="120"
        >
        </el-table-column>
        <el-table-column
          label="诊断名称"
          align="center"
          key="leavediagname"
          prop="leavediagname"
          width="120"
          :show-overflow-tooltip="true"
        >
        </el-table-column>
        <el-table-column
          label="住院满意度模板名称"
          align="center"
          key="templatename"
          prop="templatename"
          width="200"
        />
        <el-table-column
          label="任务执行方式"
          align="center"
          key="preachform"
          prop="preachform"
          width="160"
          :show-overflow-tooltip="true"
        >
          <template slot-scope="scope">
            <span v-for="item in scope.row.preachform">{{ item }}、 </span>
          </template>
        </el-table-column>
        <!-- <el-table-column
          label="任务发送流程"
          align="center"
          key="serviceSubtaskRecordList"
          prop="serviceSubtaskRecordList"
          width="160"
          :show-overflow-tooltip="true"
        >
          <template slot-scope="scope">
            <span v-for="item in scope.row.serviceSubtaskRecordList"
              >{{ item.remark }}、
            </span>
          </template>
        </el-table-column> -->
        <el-table-column
          label="任务结果说明"
          width="220"
          align="center"
          key="remark"
          prop="remark"
        >
          <template slot-scope="scope" v-if="scope.row.remark">
            <el-tooltip
              :content="scope.row.remark"
              placement="top"
              effect="dark"
            >
              <el-tag
                type="warning"
                v-if="scope.row.sendstate != 5 && scope.row.sendstate != 4"
                >{{ scope.row.remark }}</el-tag
              >
              <el-tag type="warning" v-else>{{ scope.row.remark }}</el-tag>
            </el-tooltip>
          </template>
        </el-table-column>
        <el-table-column
          label="操作"
          align="center"
          fixed="right"
          width="300"
          class-name="small-padding fixed-width"
        >
          <template slot-scope="scope">
            <!-- <el-tooltip
              class="item"
              effect="dark"
              content="再次随访"
              placement="top"
            >
              <el-button
                size="medium"
                type="text"
                v-if="scope.row.isVisitAgain!=2"
                @click="followupvisit(scope.row)"
                ><span class="button-bb"
                  ><i class="el-icon-s-promotion"></i>再次随访</span
                ></el-button
              >
            </el-tooltip>
            <el-tooltip
              v-if="scope.row.sendstate == 1 || scope.row.sendstate == 2"
              class="item"
              effect="dark"
              content="暂停服务"
              placement="top"
            >
              <el-button
                size="medium"
                type="text"
                @click="handlestop(scope.row)"
                v-hasPermi="['system:user:edit']"
                ><span class="button-sc"
                  ><i class="el-icon-remove-outline"></i>暂停服务</span
                ></el-button
              >
            </el-tooltip> -->
            <el-button size="medium" type="text" @click="Seedetails(scope.row)"
              ><span class="button-zx"
                ><i class="el-icon-s-order"></i>查看详情</span
              ></el-button
            >
            <el-button
              size="medium"
              type="text"
              @click="handleUpdate(scope.row)"
              ><span class="button-textxga"
                ><i class="el-icon-edit"></i>患者过滤</span
              ></el-button
            >
          </template>
        </el-table-column>
      </el-table>
      <pagination
        v-show="total > 0"
        :total="total"
        :page.sync="topqueryParams.pageNum"
        :limit.sync="topqueryParams.pageSize"
        @pagination="getList"
      />
    </el-row>
    <!-- æ»¡æ„åº¦å¼¹æ¡† -->
    <el-dialog
      title="随访满意度评分"
      :visible.sync="scoreDialogVisible"
      width="80%"
      :close-on-click-modal="false"
    >
      <el-table :data="selectedRows" border style="width: 100%">
        <el-table-column
          label="姓名"
          width="100"
          align="center"
          prop="sendname"
        />
        <el-table-column
          label="任务名称"
          width="180"
          align="center"
          prop="taskName"
        />
        <!-- æ–°å¢žè¯„分列 -->
        <el-table-column
          label="真实性(20)"
          align="center"
          key="authenticity"
          prop="authenticity"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.authenticity"
              :min="0"
              :max="20"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="一周内完成(20)"
          align="center"
          key="weekFinish"
          prop="weekFinish"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.weekFinish"
              :min="0"
              :max="20"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="规范性(10)"
          align="center"
          key="standard"
          prop="standard"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.standard"
              :min="0"
              :max="10"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="及时性(10)"
          align="center"
          key="timeliness"
          prop="timeliness"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.timeliness"
              :min="0"
              :max="10"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="宣教情况(10)"
          align="center"
          key="library"
          prop="library"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.library"
              :min="0"
              :max="10"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="环境满意度(10)"
          align="center"
          key="environment"
          prop="environment"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.environment"
              :min="0"
              :max="10"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="医生满意度(10)"
          align="center"
          key="doctorSatisfaction"
          prop="doctorSatisfaction"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.doctorSatisfaction"
              :min="0"
              :max="10"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="护士满意度(10)"
          align="center"
          key="nurseSatisfaction"
          prop="nurseSatisfaction"
          width="150"
        >
          <template slot-scope="scope">
            <el-input-number
              v-model="scope.row.nurseSatisfaction"
              :min="0"
              :max="10"
              :step="1"
              size="small"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="总分"
          align="center"
          key="total"
          prop="total"
          fixed="right"
        >
          <template slot-scope="scope">
            <span>{{ calculateTotal(scope.row) }}</span>
          </template>
        </el-table-column>
      </el-table>
      <div slot="footer" class="dialog-footer">
        <el-button @click="scoreDialogVisible = false">取消</el-button>
        <el-button type="primary" @click="saveScores">保存</el-button>
      </div>
    </el-dialog>
    <!-- æ·»åŠ æˆ–ä¿®æ”¹å½±åƒéšè®¿å¯¹è¯æ¡† -->
    <el-dialog
      :title="amendtag ? '修改患者信息' : '新增患者'"
      :visible.sync="Labelchange"
      width="900px"
    >
      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
        <el-row>
          <el-col :span="8">
            <el-form-item label="姓名" width="100" prop="name">
              <el-input
                v-model="form.name"
                placeholder="请输入姓名"
                maxlength="30"
              />
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="性别" width="100" prop="sex">
              <el-select v-model="form.sex" placeholder="请选择性别">
                <el-option
                  v-for="dict in sextype"
                  :key="dict.value"
                  :label="dict.label"
                  :value="dict.value"
                ></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="年龄" prop="age">
              <el-input
                v-model="form.age"
                placeholder="请输入年龄"
                maxlength="30"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row >
          <el-col :span="8">
            <el-form-item label="过滤医生" width="100" prop="filterDrname">
              <el-input
                v-model="form.filterDrname"
                placeholder="请输入医生姓名"
                maxlength="30"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="24">
            <el-form-item label="过滤原因">
              <el-input
                v-model="form.notrequiredreason"
                type="textarea"
                placeholder="请输入过滤原因"
              ></el-input>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">ç¡® å®š</el-button>
        <el-button @click="cancel">取 æ¶ˆ</el-button>
      </div>
    </el-dialog>
    <!-- ä¿®æ”¹å‘送时间对话框 -->
    <el-dialog
      title="发送时间设置"
      :visible.sync="modificationVisible"
      width="45%"
    >
      <div style="margin-bottom: 20px; color: red">
        ç»Ÿä¸€ä¿®æ”¹å½“天未发送的任务时间
      </div>
      <el-form
        :model="ruleForm"
        :rules="rules"
        ref="ruleForm"
        label-width="120px"
        class="demo-ruleForm"
      >
        <el-form-item label="发送日期">
          <el-date-picker
            v-model="ruleForm.value1"
            type="date"
            placeholder="选择日期"
          >
          </el-date-picker>
        </el-form-item>
        <el-form-item label="时间段" prop="type">
          <el-checkbox-group v-model="ruleForm.type">
            <el-checkbox label="上午" name="type"></el-checkbox>
            <el-checkbox label="下午" name="type"></el-checkbox>
            <el-checkbox label="晚上" name="type"></el-checkbox>
          </el-checkbox-group>
        </el-form-item>
        <el-form-item label="上午时间区间" required>
          <el-time-picker
            is-range
            v-model="ruleForm.value2"
            range-separator="至"
            start-placeholder="开始时间"
            end-placeholder="结束时间"
            placeholder="选择时间范围"
          >
          </el-time-picker>
        </el-form-item>
        <el-form-item label="下午时间区间" required>
          <el-time-picker
            is-range
            v-model="ruleForm.value3"
            range-separator="至"
            start-placeholder="开始时间"
            end-placeholder="结束时间"
            placeholder="选择时间范围"
          >
          </el-time-picker>
        </el-form-item>
        <el-form-item label="晚上时间区间" required>
          <el-time-picker
            is-range
            v-model="ruleForm.value4"
            range-separator="至"
            start-placeholder="开始时间"
            end-placeholder="结束时间"
            placeholder="选择时间范围"
          >
          </el-time-picker>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="modificationVisible = false">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="modificationVisible = false"
          >ç¡® å®š</el-button
        >
      </span>
    </el-dialog>
    <!-- å†æ¬¡éšè®¿ -->
  </div>
</template>
<script>
import {
  delUser,
  addUser,
  updateUser,
  resetUserPwd,
  changeUserStatus,
} from "@/api/system/user";
import {
  getTaskservelist,
  buidegetTasklist,
  addserviceSubtask,
  query360PatInfo,
  addsatisfaction,
} from "@/api/AiCentre/index";
import { alterpatient, particularpatient } from "@/api/patient/homepage";
import Treeselect from "@riophae/vue-treeselect";
import store from "@/store";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
  name: "Discharge",
  dicts: ["sys_normal_disable", "sys_user_sex", "sys_yujing", "sys_suggest"],
  components: { Treeselect },
  data() {
    return {
      // é®ç½©å±‚
      loading: true,
      // é€‰ä¸­æ•°ç»„
      ids: [],
      // éžå•个禁用
      single: true,
      // éžå¤šä¸ªç¦ç”¨
      multiple: true,
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      // æ€»æ¡æ•°
      total: 0,
      // ç”¨æˆ·è¡¨æ ¼æ•°æ®
      userList: null,
      // å¼¹å‡ºå±‚标题
      title: "新增影像随访",
      // æ˜¯å¦æ˜¾ç¤ºä¿®æ”¹ã€æ·»åŠ å¼¹å‡ºå±‚
      addalteropen: false,
      // ä¿®æ”¹å‘送时间对话框
      modificationVisible: false,
      // éƒ¨é—¨åç§°
      deptName: undefined,
      // é»˜è®¤å¯†ç 
      initPassword: undefined,
      // æ—¥æœŸèŒƒå›´
      dateRange: [],
      dateRangefs: [],
      // å²—位选项
      postOptions: [],
      ruleForm: {
        type: [],
      },
      zcform: {},
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      Labelchange: false,
      ycvalue: "",
      yfsvalue: "",
      inputValue: "",
      preachform: "",
      previewVisible: false, //影像随访预览弹框
      radio: "",
      radios: [],
      previewtype: 2, //预览影像随访类型
      total: 0, // æ€»æ¡æ•°
      // æ»¡æ„åº¦è°ƒæŸ¥æ•°æ®
      scoreDialogVisible: false,
      selectedRows: [],
      value: [],
      list: [],
      sourcetype: [
        {
          value: 1,
          label: "科室",
          children: [],
        },
        {
          value: 2,
          label: "病区",
          children: [],
        },
        {
          value: 3,
          label: "全部",
        },
      ],
      loading: false,
      cardlist: [
        {
          name: "服务总量",
          value: 0,
        },
        // {
        //   name: "患者过滤",
        //   value: 0,
        // },
        {
          name: "需随访",
          value: 0,
        },
        {
          name: "发送失败",
          value: 0,
        },
        {
          name: "待随访",
          value: 0,
        },
        // {
        //   name: "已发送",
        //   value: 0,
        // },
        // {
        //   name: "表单已发送",
        //   value: 0,
        // },
      ],
      zcrules: {
        date1: [
          { required: true, message: "请选择随访方式", trigger: "change" },
        ],
        resource: [
          { required: true, message: "请选择随访时间", trigger: "blur" },
        ],
      },
      // è¡¨å•参数
      form: {
        phonenumber: "",
        totagid: "",
        types: "",
        nickName: "",
        qystatus: "",
        btstatus: "",
      },
      topicoptionssort: [
        {
          value: 0,
          label: "出院时间(正序)",
        },
        {
          value: 1,
          label: "出院时间(倒序)",
        },
        {
          value: 2,
          label: "发送时间(正序)",
        },
        {
          value: 3,
          label: "发送时间(倒序)",
        },
      ],
      // æŸ¥è¯¢å‚æ•°
      topqueryParams: {
        pageNum: 1,
        pageSize: 10,
        sendstate: 6,
        sort: 2, //0 å‡ºé™¢æ—¶é—´(正序)    1 å‡ºé™¢æ—¶é—´(倒序)   2 å‘送时间(正序)    3 å‘送时间(倒序)
        serviceType: 6,
        searchscope: 3,
        visitCount: 1,
        scopetype: [],
        leaveldeptcodes: [],
        leavehospitaldistrictcodes: [],
      },
      propss: { multiple: true },
      options: [],
      topicoptions: [
        {
          value: null,
          label: "全部",
        },
        {
          value: 1,
          label: "表单已领取",
        },
        {
          value: 2,
          label: "待随访",
        },
        {
          value: 3,
          label: "表单已发送",
        },
        {
          value: 4,
          label: "不执行",
        },
        {
          value: 5,
          label: "发送失败",
        },
        {
          value: 6,
          label: "已完成",
        },
      ],
      sextype: [
        {
          value: 1,
          label: "男",
        },
        {
          value: 2,
          label: "女",
        },
      ],
      topicoptionsyj: [
        {
          value: 1,
          label: "异常",
        },
        {
          value: 0,
          label: "正常",
        },
      ],
      url: "http://9.208.2.190:8090/smartor/serviceExternal/query360PatInfo",
      postData: {
        XiaoXiTou: {
          FaSongFCSJC: "ZJHES",
          FaSongJGID: localStorage.getItem("orgid"),
          FaSongJGMC: localStorage.getItem("orgname"),
          FaSongSJ: "2025-01-09 17:29:36",
          FaSongXTJC: "SUIFANGXT",
          FaSongXTMC: "随访系统",
          XiaoXiID: "5FA92AFB-9833-4608-87C7-F56A654AC171",
          XiaoXiLX: "SC_LC_360STCX",
          XiaoXiMC: "360 视图查询",
          ZuHuID: localStorage.getItem("ZuHuID"),
          ZuHuMC: localStorage.getItem("orgname"),
        },
        YeWuXX: {
          BingRenXX: {
            ZhengJianHM: "",
            ZhengJianLXDM: "01",
            ZhengJianLXMC: "居民身份证",
            ZuZhiJGID: localStorage.getItem("orgid"),
            ZuZhiJGMC: localStorage.getItem("orgname"),
          },
          YongHuXX: {
            XiTongID: "SUIFANGXT",
            XiTongMC: "随访系统",
            YongHuID: "1400466972205912064",
            YongHuXM: "JNRMYY",
            ZuZhiJGID: localStorage.getItem("orgid"),
            ZuZhiJGMC: localStorage.getItem("orgname"),
            idp: "lyra",
          },
        },
      },
      amendtag: false,
      errtype: "",
      leavehospitaldistrictcode: "",
      serviceState: [],
      checkboxlist: [],
      // è¡¨å•校验
      rules: {},
    };
  },
  watch: {},
  created() {
    this.serviceState = store.getters.serviceState;
    this.checkboxlist = store.getters.checkboxlist;
    this.errtype = this.$route.query.errtype;
    this.leavehospitaldistrictcode =
      this.$route.query.leavehospitaldistrictcode;
    this.sourcetype[0].children = store.getters.belongDepts.map((dept) => {
      return {
        label: dept.deptName,
        value: dept.deptCode,
      };
    });
    this.sourcetype[1].children = store.getters.belongWards.map((dept) => {
      return {
        label: dept.districtName,
        value: dept.districtCode,
      };
    });
    if (this.errtype) {
      this.toleadExport(2);
    } else {
      this.getList(1);
    }
    this.getConfigKey("sys.user.initPassword").then((response) => {
      this.initPassword = response.msg;
    });
  },
  activated() {
    this.getList(1);
  },
  methods: {
    /** æŸ¥è¯¢éšè®¿æœåŠ¡åˆ—è¡¨ */
    getList(refresh) {
      // é»˜è®¤å…¨éƒ¨
      if (this.topqueryParams.searchscope == 3) {
        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
          (obj) => obj.deptCode
        );
        this.topqueryParams.leavehospitaldistrictcodes =
          store.getters.belongWards.map((obj) => obj.districtCode);
      }
      // æŽ¥å—异常跳转
      if (this.errtype) {
        this.topqueryParams.leavehospitaldistrictcodes.push(
          this.leavehospitaldistrictcode
        );
        console.log(this.topqueryParams.leavehospitaldistrictcodes, "11");
      }
      this.loading = true;
      if (
        this.topqueryParams.leavehospitaldistrictcodes[0] &&
        this.topqueryParams.leaveldeptcodes[0]
      ) {
        this.topqueryParams.deptOrDistrict = 2;
      } else {
        this.topqueryParams.deptOrDistrict = 1;
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
        if (refresh) {
          this.cardlist[0].value =
            Number(response.rows[0].wzx) + Number(response.rows[0].ysf);
          // this.cardlist[1].value = response.rows[0].wzx;
          this.cardlist[1].value = response.rows[0].ysf;
          this.ycvalue = response.rows[0].yc;
          this.cardlist[2].value = response.rows[0].fssb;
          this.cardlist[3].value = response.rows[0].dsf;
          // this.cardlist[4].value = response.rows[0].yfs2;
          this.yfsvalue = response.rows[0].yfs;
        }
        this.loading = false;
        this.userList.forEach((item) => {
          let idArray = null;
          if (item.endtime) {
            item.endDay = this.daysBetween(item.endtime);
          }
          if (item.preachform) {
            if (item.endtime) {
              item.preachformson = item.preachform;
              idArray = item.preachform.split(",");
            }
            item.preachform = idArray.map((value) => {
              // æŸ¥æ‰¾id对应的对象
              const item = this.checkboxlist.find(
                (item) => item.value == value
              );
              // å¦‚果找到对应的id,返回label值,否则返回null
              return item ? item.label : null;
            });
          }
        });
        this.total = response.total;
      });
    },
    affiliation() {
      this.topqueryParams.drcode = store.getters.hisUserId;
      this.topqueryParams.nurseId = store.getters.hisUserId;
      this.topqueryParams.managementDoctor = store.getters.name;
      this.getList(1);
    },
    onthatday() {
      this.topqueryParams.startSendDateTime = this.getCurrentDate();
      this.topqueryParams.endSendDateTime = this.getCurrentDate();
      this.getList(1);
    },
    getCurrentDate() {
      const now = new Date();
      return now.toISOString().slice(0, 10); // æˆªå–前10个字符,即 YYYY-MM-DD
    },
    buidegetTasklist(type) {
      if (this.topqueryParams.searchscope == 3) {
        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
          (obj) => obj.deptCode
        );
        this.topqueryParams.leavehospitaldistrictcodes =
          store.getters.belongWards.map((obj) => obj.districtCode);
      }
      // æŽ¥å—异常跳转
      if (this.errtype) {
        this.topqueryParams.leavehospitaldistrictcodes.push(
          this.leavehospitaldistrictcode
        );
      }
      let obj = {
        pageNum: 1,
        pageSize: 10,
        leavehospitaldistrictcodes:
          this.topqueryParams.leavehospitaldistrictcodes,
        sendstates: [2, 3],
        leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
      };
      buidegetTasklist(obj).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
        if (refresh) {
          this.cardlist[0].value =
            Number(response.rows[0].wzx) + Number(response.rows[0].ysf);
          this.cardlist[1].value = response.rows[0].wzx;
          this.cardlist[2].value = response.rows[0].ysf;
          this.ycvalue = response.rows[0].yc;
          this.cardlist[3].value = response.rows[0].fssb;
          this.cardlist[4].value = response.rows[0].dsf;
          // this.cardlist[5].value = response.rows[0].yfs2;
          this.yfsvalue = response.rows[0].yfs;
        }
        this.loading = false;
        this.userList.forEach((item) => {
          let idArray = null;
          if (item.endtime) {
            item.endDay = this.daysBetween(item.endtime);
          }
          if (item.preachform) {
            if (item.endtime) {
              item.preachformson = item.preachform;
              idArray = item.preachform.split(",");
            }
            item.preachform = idArray.map((value) => {
              // æŸ¥æ‰¾id对应的对象
              const item = this.checkboxlist.find(
                (item) => item.value == value
              );
              // å¦‚果找到对应的id,返回label值,否则返回null
              return item ? item.label : null;
            });
          }
        });
        this.total = response.total;
      });
    },
    // æŸ¥çœ‹é—¨è¯Šéšè®¿è¯¦æƒ…
    Referencequestion(row) {
      this.previewVisible = true;
    },
    // æ·»åŠ å¼¹æ¡†æœç´¢
    remoteMethod(query) {
      if (query !== "") {
        this.loading = true;
        setTimeout(() => {
          this.loading = false;
          this.options = this.list.filter((item) => {
            return item.label.toLowerCase().indexOf(query.toLowerCase()) > -1;
          });
        }, 200);
      } else {
        this.options = [];
      }
    },
    // å½±åƒéšè®¿çŠ¶æ€ä¿®æ”¹
    handleStatusChange(row) {
      let text = row.status === "0" ? "启用" : "停用";
      this.$modal
        .confirm('确认要"' + text + '""' + row.userName + '"用户吗?')
        .then(function () {
          return changeUserStatus(row.userId, row.status);
        })
        .then(() => {
          this.$modal.msgSuccess(text + "成功");
        })
        .catch(function () {
          row.status = row.status === "0" ? "1" : "0";
        });
    },
    // è¡¨å•重置
    reset() {
      this.form = {
        userId: undefined,
        deptId: undefined,
        userName: undefined,
        nickName: undefined,
        password: undefined,
        phonenumber: undefined,
        email: undefined,
        sex: undefined,
        status: "0",
        remark: undefined,
        postIds: [],
        roleIds: [],
      };
      this.resetForm("form");
    },
    /** æœç´¢æŒ‰é’®æ“ä½œ */
    handleQuery(refresh) {
      if (this.topqueryParams.searchscope == 3) {
        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
          (obj) => obj.deptCode
        );
        this.topqueryParams.leavehospitaldistrictcodes =
          store.getters.belongWards.map((obj) => obj.districtCode);
      }
      this.topqueryParams.pageNum = 1;
      this.topqueryParams.startOutHospTime = this.dateRange[0];
      this.topqueryParams.endOutHospTime = this.dateRange[1];
      this.topqueryParams.startSendDateTime = this.dateRangefs[0];
      this.topqueryParams.endSendDateTime = this.dateRangefs[1];
      this.getList(refresh);
    },
    // æ‚£è€…范围处理
    handleChange(value) {
      let type = value[0];
      let code = value.slice(-1)[0];
      this.topqueryParams.leavehospitaldistrictcodes = [];
      this.topqueryParams.leaveldeptcodes = [];
      if (type == 1) {
        this.topqueryParams.leaveldeptcodes.push(code);
        this.topqueryParams.leavehospitaldistrictcodes = [];
        this.topqueryParams.searchscope = 1;
      } else if (type == 2) {
        this.topqueryParams.leavehospitaldistrictcodes.push(code);
        this.topqueryParams.leaveldeptcodes = [];
        this.topqueryParams.searchscope = 2;
      } else {
        this.topqueryParams.searchscope = 3;
      }
    },
    /** é‡ç½®æŒ‰é’®æ“ä½œ */
    resetQuery() {
      this.dateRange = [];
      this.dateRangefs = [];
      this.topqueryParams = {
        pageNum: 1,
        pageSize: 10,
        sendstate: 6,
        sort: 2, //0 å‡ºé™¢æ—¶é—´(正序)    1 å‡ºé™¢æ—¶é—´(倒序)   2 å‘送时间(正序)    3 å‘送时间(倒序)
        serviceType: 6,
        searchscope: 3,
        visitCount: 1,
        scopetype: [],
        leaveldeptcodes: [],
        leavehospitaldistrictcodes: [],
      };
      this.handleQuery(1);
    },
    handleSelectionChange(rows) {
      this.selectedRows = rows.map((row) => {
        // åˆå§‹åŒ–评分字段
        return {
          ...row,
          authenticity: row.authenticity || 0,
          weekFinish: row.weekFinish || 0,
          standard: row.standard || 0,
          timeliness: row.timeliness || 0,
          library: row.library || 0,
          environment: row.environment || 0,
          doctorSatisfaction: row.doctorSatisfaction || 0,
          nurseSatisfaction: row.nurseSatisfaction || 0,
        };
      });
      if (this.selectedRows.length > 0) {
        this.multiple = false;
      } else {
        this.multiple = true;
      }
    },
    // è®¡ç®—总分
    calculateTotal(row) {
      return (
        (row.authenticity || 0) +
        (row.weekFinish || 0) +
        (row.standard || 0) +
        (row.timeliness || 0) +
        (row.library || 0) +
        (row.environment || 0) +
        (row.doctorSatisfaction || 0) +
        (row.nurseSatisfaction || 0)
      );
    },
    // ä¿å­˜è¯„分
    saveScores() {
      this.selectedRows.forEach((item) => {
        item.createBy = null;
        item.patName = item.sendname;
        item.hospitaldistrictname = item.leavehospitaldistrictname;
      });
      addsatisfaction(this.selectedRows).then((res) => {
        if (res.code == 200) {
          this.$message.success("评分保存成功");
          this.scoreDialogVisible = false;
          this.selectedRows=[];
          this.$refs.userform.clearSelection()
        } else {
          this.$modal.msgWarning("评分保存失败");
          this.scoreDialogVisible = false;
          this.selectedRows=[];
          this.$refs.userform.clearSelection()
        }
      });
      // è¿™é‡Œå¯ä»¥æ·»åŠ ä¿å­˜é€»è¾‘ï¼Œå¦‚è°ƒç”¨API保存评分
    },
    //删除选项
    handleClose(tag) {
      this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
    },
    //触发新增输入
    showInput() {
      this.inputVisible = true;
      this.$nextTick((_) => {
        this.$refs.saveTagInput.$refs.input.focus();
      });
    },
    //获取失去焦点触发
    handleInputConfirm() {
      let inputValue = this.inputValue;
      if (inputValue) {
        this.dynamicTags.push(inputValue);
      }
      this.inputVisible = false;
      this.inputValue = "";
    },
    /** æ–°å¢žæŒ‰é’®æ“ä½œ */
    handleAdd() {
      this.$router.push({
        path: "/followvisit/QuestionnaireTask",
        query: {
          type: 2,
          serviceType: 6,
        },
      });
    },
    //患者360跳转
    gettoken360(sfzh, drcode, drname) {
      this.$modal.msgWarning('360功能暂未开通');
  return; // é˜»æ­¢åŽç»­ä»£ç æ‰§è¡Œ
      this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh;
      if (this.postData.XiaoXiTou.ZuHuMC == "丽水市中医院") {
        this.postData.YeWuXX.YongHuXX.YongHuID = "1400398571877961728";
        this.postData.YeWuXX.YongHuXX.YongHuXM = "LSZYY";
      }
      query360PatInfo(this.postData).then((res) => {
        if (res.data.url) {
          window.open(res.data.url, "_blank");
          // this.linkUrl = res.data.url;
        } else {
          this.$modal.msgWarning("360查询无结果");
        }
      });
    },
    /** é‡ç½®å¯†ç æŒ‰é’®æ“ä½œ */
    handleResetPwd(row) {
      this.$prompt('请输入"' + row.userName + '"的新密码', "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        closeOnClickModal: false,
        inputPattern: /^.{5,20}$/,
        inputErrorMessage: "用户密码长度必须介于 5 å’Œ 20 ä¹‹é—´",
      })
        .then(({ value }) => {
          resetUserPwd(row.userId, value).then((response) => {
            this.$modal.msgSuccess("修改成功,新密码是:" + value);
          });
        })
        .catch(() => {});
    },
    // å–消按钮
    cancel() {
      this.Labelchange = false;
      this.reset();
    },
    /** æäº¤æŒ‰é’® */
    submitForm: function () {
      this.$refs["form"].validate((valid) => {
        if (valid) {
          this.form.isoperation = 2;
          this.form.notrequiredFlag = 1;
          alterpatient(this.form)
            .then((response) => {
              console.log(response);
            })
            .then(() => {
              this.getList(1);
              this.$modal.msgSuccess("患者过滤成功");
            });
          this.reset();
          this.Labelchange = false;
        }
      });
    },
    /** åˆ é™¤æŒ‰é’®æ“ä½œ */
    handleDelete(row) {
      const userIds = row.userId || this.ids;
      this.$modal
        .confirm('是否确认删除用户编号为"' + userIds + '"的数据项?')
        .then(function () {
          return delUser(userIds);
        })
        .then(() => {
          this.getList(1);
          this.$modal.msgSuccess("删除成功");
        })
        .catch(() => {});
    },
    // å…¨éƒ¨åœæ­¢
    AllStop() {
      this.$modal
        .confirm("是否停止全部任务?")
        .then(function () {
          return console.log("停止成功");
        })
        .then(() => {
          this.getList(1);
          this.$modal.msgWarning("停止成功");
        })
        .catch(() => {});
    },
    // å…¨éƒ¨å¼€å§‹
    AllStarted() {
      this.$modal
        .confirm("是否开启全部任务?")
        .then(function () {
          return console.log("开启成功");
        })
        .then(() => {
          this.getList(1);
          this.$modal.msgSuccess("开启成功");
        })
        .catch(() => {});
    },
    // ä»»åŠ¡é‡ç½®
    TaskReset() {
      this.$modal
        .confirm("是否重置选中的任务项?")
        .then(function () {
          return console.log("选中成功");
        })
        .then(() => {
          this.getList(1);
          this.$modal.msgSuccess("重置成功");
        })
        .catch(() => {});
    },
    // è®¾ç½®å‘送时间
    Sendtimesetting() {
      this.modificationVisible = true;
    },
    // è·³è½¬è¯¦æƒ…页
    Seedetails(row) {
      let type = "";
      console.log(row, "rwo");
      if (row.preachformson) {
        if (row.preachformson.includes("3")) {
          type = 1;
        }
      }
      this.$router.push({
        path: "/followvisit/record/detailpage/",
        query: {
          taskid: row.taskid,
          patid: row.patid,
          id: row.id,
          Voicetype: type,
          visitCount: this.topqueryParams.visitCount,
        },
      });
    },
    onSubmit() {},
    // æš‚停服务
    handlestop(row) {
      let objson = row;
      this.$modal
        .confirm(
          '是否确认暂停任务名称为"' +
            row.taskName +
            '患者名称为"' +
            row.sendname +
            '"的数据项?'
        )
        .then(() => {
          getTaskservelist({
            patid: row.patid,
            taskid: row.taskid,
          }).then((res) => {
            if (res.code == 200) {
              objson.sendstate = 4;
              objson.remark = "服务暂停";
              Editsingletaskson(objson).then((res) => {
                if (res.code) {
                  this.$modal.msgSuccess("记录成功");
                  this.getList(1);
                }
              });
            }
          });
        })
        .catch(() => {});
    },
    // æ‚£è€…过滤触发
    handleUpdate(row) {
      particularpatient(row.patid).then((response) => {
        this.form = response.data;
        this.form.filterDrname = store.getters.nickName;
      });
      this.amendtag = true;
      this.Labelchange = true;
    },
    // ä¾¿æ·æŒ‰é’®
    toleadExport(too) {
      if (too == 1) {
        this.topqueryParams.sendstate = 4;
        this.topqueryParams.excep = null;
      } else if (too == 2) {
        this.topqueryParams.excep = 1;
      }
      this.handleQuery();
    },
    /** å¯¼å‡ºæŒ‰é’®æ“ä½œ */
    handleExport() {
      this.topqueryParams.pageNum = null;
      this.topqueryParams.pageSize = null;
      this.download(
        "smartor/serviceSubtask/patItemExport",
        {
          ...this.topqueryParams,
        },
        `user_${new Date().getTime()}.xlsx`
      );
    },
    // å¼‚常列渲染
    tableRowClassName({ row, rowIndex }) {
      if (row.excep == 1) {
        return "warning-row";
      }
      return "";
    },
    getCurrentTime() {
      const now = new Date();
      const year = now.getFullYear();
      const month = String(now.getMonth() + 1).padStart(2, "0");
      const day = String(now.getDate()).padStart(2, "0");
      const hours = String(now.getHours()).padStart(2, "0");
      const minutes = String(now.getMinutes()).padStart(2, "0");
      const seconds = String(now.getSeconds()).padStart(2, "0");
      return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
    },
  },
};
</script>
<style lang="scss" scoped>
.el-button--primary.is-plain {
  color: #ffffff;
  background: #409eff;
  border-color: #4fabe9;
}
.document {
  // width: 100px;
  height: 50px;
}
::v-deep.el-table .warning-row {
  background: #eec4c4;
}
.documentf {
  display: flex;
  justify-content: flex-end;
}
.download {
  text-align: center;
  .el-upload__tip {
    font-size: 23px;
  }
  .el-upload__text {
    font-size: 23px;
  }
}
.uploading {
  margin-top: 20px;
  margin: 20px;
  padding: 30px;
  background: #ffffff;
  border: 1px solid #dcdfe6;
  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
    0 0 6px 0 rgba(0, 0, 0, 0.04);
}
.el-tag + .el-tag {
  margin-left: 10px;
}
.button-new-tag {
  margin-left: 10px;
  height: 32px;
  line-height: 30px;
  padding-top: 0;
  padding-bottom: 0;
}
.input-new-tag {
  width: 90px;
  margin-left: 10px;
  vertical-align: bottom;
}
.drexamine {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 30px;
  background: #daeaf5;
  img {
    width: 100px;
    height: 100px;
  }
}
.qrcode-dialo {
  // text-align: center;
  //   display: flex;
  margin: 20px;
  padding: 30px;
  background: #edf1f7;
  border: 1px solid #dcdfe6;
  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
    0 0 6px 0 rgba(0, 0, 0, 0.04);
  .topic-dev {
    margin-bottom: 25px;
    font-size: 20px !important;
    .dev-text {
      margin-bottom: 10px;
    }
  }
}
::v-deep.leftvlue .el-card__body {
  background: #F2F8FF;
  color: #324A9B;
}
::v-deep.leftvlue .el-card__body:hover {
  background: #3664D9;
  color: #fff;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
.button-textxga {
  color: #de7897;
}
::v-deep.errleftvlue .el-card__body {
  background: #fdd0d7;
}
::v-deep.errleftvlue .el-card__body:hover {
  background: #f88d96;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
::v-deep.ysfleftvlue .el-card__body {
  background: #d0fdd8;
}
::v-deep.ysfleftvlue .el-card__body:hover {
  background: #8df8a4;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
.button-bb {
  font-weight: 500;
  background-color: #2ba05c;
  padding: 5px;
  border-radius: 1px;
  color: #ffffff;
}
.button-xq {
  font-weight: 500;
  background-color: #409eff;
  padding: 5px;
  border-radius: 1px;
  color: #ffffff;
}
.button-sc {
  font-weight: 500;
  background-color: #b3a21f;
  padding: 5px;
  border-radius: 1px;
  color: #ffffff;
}
.button-zx {
  background: #4fabe9;
  padding: 5px;
  border-radius: 1px;
  color: #ffffff;
}
::v-deep.el-radio-group {
  span {
    font-size: 24px;
  }
}
.purple-button {
  background-color: #7e22ce;
  border-color: #7e22ce;
  color: #fff;
}
.purple-button:hover,
.purple-button:focus {
  background-color: #9333ea;
  border-color: #9333ea;
}
.purple-button:active {
  background-color: #6b21a8;
  border-color: #6b21a8;
}
.purple-button.is-disabled {
  background-color: #d8b4fe;
  border-color: #d8b4fe;
  opacity: 1; /* ä¿æŒç¦ç”¨çŠ¶æ€é€æ˜Žåº¦ */
}
// é€‰é¡¹å­—体放大
// ::v-deep.el-checkbox-group {
//   span {
//     font-size: 24px;
//   }
// }
</style>
src/views/knowledge/questionbank/particulars/index.vue
@@ -1092,10 +1092,10 @@
        )
        .then(() => {
          console.log(row);
          this.topicobj.scriptTopic = row.targetname;
          // this.topicobj.scriptTopic = row.targetname;
          this.topicobj.valueType = row.valueType;
          this.topicobj.scriptType = row.scriptType;
          this.topicobj.scriptContent = row.targetdesc;
          // this.topicobj.scriptContent = row.targetdesc;
          this.topicobj.targetid = row.id;
          this.topicobj.targetname = row.targetname;
          this.topicobj.svyLibScriptOptions = [];
src/views/knowledge/questionnaire/compilequer/index.vue
@@ -550,6 +550,26 @@
                        placeholder="请输入题号"
                      ></el-input>
                    </el-form-item>
                    <el-form-item prop="valueType">
                      <template #label>
                        ç»“果类型
                        <el-tooltip
                          class="item"
                          effect="light"
                          content="本类型为结果收集类型;选项用于指向性题目如是否等;文本适用复杂情况;数值用于收集数值型数据"
                          placement="top-start"
                        >
                          <i class="el-icon-warning-outline"></i>
                        </el-tooltip>
                        <!-- åœ¨æ ‡ç­¾åŽæ’入红色星号 -->
                      </template>
                      <el-radio-group v-model="topicobj.valueType">
                        <el-radio :label="1">选项</el-radio>
                        <el-radio :label="2">文本</el-radio>
                        <el-radio :label="3">数值</el-radio>
                      </el-radio-group>
                    </el-form-item>
                  </el-col>
                </el-row>
@@ -2397,7 +2417,10 @@
  display: flex;
  .presentation-left {
    width: 45%;
    // height: 500px;
    max-height: 80vh;
    padding: 0 20px;
    font-size: 18px;
    overflow: auto;
    .button-textxg {
      color: #024df0;
    }
@@ -2417,7 +2440,7 @@
  }
  .presentation-right {
    width: 55%;
    max-height: 688px;
    max-height: 80vh;
    padding: 0 20px;
    font-size: 18px;
    overflow: auto;
src/views/login.vue
@@ -116,16 +116,9 @@
        password: "",
        rememberMe: false,
        code: "",
        orgid: "47255004333112711A1001",
        orgid: "H41010500003",
      },
      options: [
        { value: "47255004333112711A1001", label: "景宁畲族自治县人民医院" },
        { value: "47231022633110211A2101", label: "丽水市中医院" },
        { value: "47246102433112211A2101", label: "缙云县中医医院 " },
        { value: "47240018433118111A2101", label: "龙泉市中医医院 " },
        { value: "47240004533118111A1001", label: "龙泉市人民医院 " },
        { value: "47243006833112611A2101", label: "庆元县中医医院 " },
        { value: "47234002X33112111A2101", label: "青田县中医医院 " },
      ],
      loginRules: {
        username: [
src/views/loginSSO.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,160 @@
<template>
  <div class="sso-redirect">
    <div class="loading-container">
      <el-alert
        v-if="errorMessage"
        :title="errorMessage"
        type="error"
        :closable="false"
        show-icon
      ></el-alert>
      <div v-else class="loading-content">
        <i class="el-icon-loading"></i>
        <p>单点登录中,请稍候...</p>
      </div>
    </div>
  </div>
</template>
<script>
import { setToken } from "@/utils/auth";
export default {
  name: "SSORedirect",
  data() {
    return {
      errorMessage: "",
      loading: true,
    };
  },
  created() {
    this.handleSSORedirect();
  },
  methods: {
    // åŒ¹é…orgid
    mateOrgid(orgid) {
      if (orgid == "30001002") {
        localStorage.setItem("orgname", "浙江省立同德医院翠苑院区");
        localStorage.setItem("ZuHuID", "1400361376454545408");
        localStorage.setItem("deptCode", "1017");
      } else if (orgid == "30001003") {
        localStorage.setItem("orgname", "浙江省立同德医院之江院区");
        localStorage.setItem("ZuHuID", "1400360867068907520");
        localStorage.setItem("deptCode", "01040201");
      } else if (orgid == "30001004") {
        localStorage.setItem("orgname", "浙江省立同德医院闲林院区");
        localStorage.setItem("ZuHuID", "1429338802177000002");
        localStorage.setItem("deptCode", "");
      } else if (orgid == "30001005") {
        localStorage.setItem("orgname", "浙江省立同德医院天目山路院区");
        localStorage.setItem("ZuHuID", "1429338802177000003");
        localStorage.setItem("deptCode", "");
      } else if (orgid == "30001006") {
        localStorage.setItem("orgname", "浙江省立同德医院青山湖院区");
        localStorage.setItem("ZuHuID", "1429338802177000004");
        localStorage.setItem("deptCode", "");
      } else if (orgid == "30001007") {
        localStorage.setItem("orgname", "测试院区");
        localStorage.setItem("ZuHuID", "1429338802177000005");
        localStorage.setItem("deptCode", "");
      }
    },
    async handleSSORedirect() {
      try {
        console.log(11);
        // ä»ŽURL参数中获取token和机构信息
        let { token, orgid, orgname, ZuHuID, deptCode } = this.$route.query;
        // token =
        //   "eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6Ijc5MWVkODNlLWE2MWYtNDI2MS05ZDZlLTNhOTVjYTU2YjZhMiJ9.q6jrRj8fwtb3FOqqwaxIFDr824hf85DW8heCj4qWYgRE55Pn0vkmcujFsYMrz9qqo047Gl7lv3rnok8pk7SKYQ"; // éªŒè¯å¿…要参数
        // orgid = "30001002";
        if (!token) {
          throw new Error("缺少认证令牌(token)");
        }
        console.log(token);
        console.log(orgid);
        console.log(orgname);
        // console.log(redirect,'redirect');
        this.mateOrgid(orgid);
        setToken(token);
        this.$store.commit("SET_TOKEN", token);
        // å­˜å‚¨æœºæž„信息到localStorage
        if (orgid) {
          localStorage.setItem("orgid", orgid);
          this.$store.dispatch("UpdateOrgId", orgid);
        }
        if (orgname) localStorage.setItem("orgname", orgname);
        if (ZuHuID) localStorage.setItem("ZuHuID", ZuHuID);
        if (deptCode) localStorage.setItem("deptCode", deptCode);
        // èŽ·å–ç”¨æˆ·ä¿¡æ¯
        await this.$store.dispatch("GetInfo");
        // ç¡®å®šé‡å®šå‘路径
        let redirectPath = "/index";
        // if (redirect) {
        //   console.log(redirect,'888');
        //   redirectPath = decodeURIComponent(redirect);
        // } else {
        // æ ¹æ®ç”¨æˆ·è§’色决定默认跳转页面
        const roles = this.$store.state.user.roles;
        const username = this.$store.state.user.name;
        if (roles.includes("admin") || username === "admin") {
          redirectPath = "/index";
        } else {
          redirectPath = "/followvisit/discharge";
        }
        // }
        // è·³è½¬åˆ°ç›®æ ‡é¡µé¢
        this.$router.replace({ path: redirectPath });
      } catch (error) {
        console.error("SSO登录失败:", error);
        this.errorMessage = `单点登录失败: ${error.message || "未知错误"}`;
        this.loading = false;
        // 5秒后跳转到普通登录页
        setTimeout(() => {
          this.$router.replace("/login");
        }, 5000);
      }
    },
  },
};
</script>
<style scoped>
.sso-redirect {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  background-color: #f5f7fa;
}
.loading-container {
  text-align: center;
  padding: 20px;
  background: white;
  border-radius: 4px;
  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
.loading-content {
  padding: 20px;
}
.el-icon-loading {
  font-size: 40px;
  color: #409eff;
  margin-bottom: 10px;
}
p {
  margin: 0;
  color: #606266;
}
</style>
src/views/outsideChainwtnew.vue
@@ -8,7 +8,9 @@
            {{
              kcb
                ? kcb
                : "亲爱的患者-家属,我们是"+localStorage.getItem("orgname")+"的医护人员,为了更好地了解您的康复情况,请您抽一点宝贵时间,完成这份随访问卷。"
                : "亲爱的患者-家属,我们是" +
                  localStorage.getItem("orgname") +
                  "的医护人员,为了更好地了解您的康复情况,请您抽一点宝贵时间,完成这份随访问卷。"
            }}
            <!-- äº²çˆ±çš„æ‚£è€…/家属您好,为了更好的了解您出院后的康复情况,给您适当及时的健康指导,请您抽一点宝贵时间,完成这份出院随访问卷调查。 -->
          </div>
@@ -19,6 +21,7 @@
          class="topic-dev"
          v-for="(item, index) in questionList"
          :key="item.aaa"
          v-if="!item.ishide"
        >
          <div class="scriptTopic-dev" :key="index" v-if="item.scriptType == 1">
            <div class="dev-text">
@@ -276,31 +279,36 @@
  methods: {
    // è§£æžurlid
    geturlinfo() {
       // let url = window.location.href;
       let url = this.$route.query.p;
       console.log(url,"url");
      // let url = window.location.href;
      let url = this.$route.query.p;
      console.log(url, "url");
      // let url = 'http://218.108.11.22:8093/sf/003';
      // let urlid = this.extractLastSegmentFromUrl(url);
      geturlinfo( url ).then((res) => {
       if (res.code==200) {
         this.getQuestionnaire(res.data.param1,res.data.param2,res.data.param3,res.data.param5,)
       }
      geturlinfo(url).then((res) => {
        if (res.code == 200) {
          this.getQuestionnaire(
            res.data.param1,
            res.data.param2,
            res.data.param3,
            res.data.param5
          );
        }
      });
    },
//     extractLastSegmentFromUrl(url) {
//     // æ‰¾åˆ°æœ€åŽä¸€ä¸ª'/'的位置
//     const lastSlashIndex = url.lastIndexOf('/');
//     // å¦‚果找到了'/',截取其后的所有字符
//     if (lastSlashIndex !== -1) {
//         return url.substring(lastSlashIndex + 1);
//     }
//     // å¦‚果没有找到'/',返回空字符串
//     return '';
// },
    //     extractLastSegmentFromUrl(url) {
    //     // æ‰¾åˆ°æœ€åŽä¸€ä¸ª'/'的位置
    //     const lastSlashIndex = url.lastIndexOf('/');
    //     // å¦‚果找到了'/',截取其后的所有字符
    //     if (lastSlashIndex !== -1) {
    //         return url.substring(lastSlashIndex + 1);
    //     }
    //     // å¦‚果没有找到'/',返回空字符串
    //     return '';
    // },
    // èŽ·å–æ•°æ®
    getQuestionnaire(param1,param2,param3) {
    getQuestionnaire(param1, param2, param3) {
      this.taskid = decodeURIComponent(param1);
      this.patid = decodeURIComponent(param2);
      this.taskname = decodeURIComponent(param3);
@@ -408,7 +416,7 @@
        var obj = item.svyLibTemplateTargetoptions.find(
          (items) => items.optioncontent == item.scriptResult
        );
        console.log(obj,'obj');
        console.log(obj, "obj");
        if (obj) {
          if (obj.isabnormal) {
src/views/patient/follow/index.vue
@@ -619,7 +619,10 @@
    height: 100px;
  }
}
.button-textxga {
  color: #de7897;
}
.button-textsc {
  color: #28cfe6;
  color: #3664D9;
}
</style>
src/views/patient/medtechnician/PatientChart.vue
@@ -472,60 +472,7 @@
          label: "消息通知",
        },
      ],
      taskoptions: [
        {
          value: "1",
          label: "监测评估",
        },
        {
          value: "2",
          label: "出院随访",
        },
        {
          value: "3",
          label: "门诊随访",
        },
        {
          value: "4",
          label: "宣教关怀",
        },
        {
          value: "5",
          label: "复诊管理",
        },
        // {
        //   value: "5",
        //   label: "满意度调查",
        // },
        {
          value: "7",
          label: "患者报告",
        },
        // {
        //   value: "8",
        //   label: "其他通知",
        // },
        {
          value: "9",
          label: "体检随访",
        },
        // {
        //   value: "10",
        //   label: "医技随访",
        // },
        {
          value: "11",
          label: "影像随访",
        },
        {
          value: "12",
          label: "心电随访",
        },
        // {
        //   value: "13",
        //   label: "专病随访",
        // },
      ],
      taskoptions: store.getters.tasktypes,
      tasktopic: "2", //新增类型
      activname: "",
      value: [],
src/views/patient/patient/ExternalPatient.vue
@@ -1178,10 +1178,12 @@
  font-size: 20px;
}
::v-deep.leftvlue .el-card__body {
  background: #d0e9fd;
  background: #F2F8FF;
  color: #324A9B;
}
::v-deep.leftvlue .el-card__body:hover {
  background: #8dc8f8;
  background: #3664D9;
  color: #fff;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
.leftvlue {
@@ -1245,7 +1247,7 @@
  }
}
.button-textsc {
  color: #28cfe6;
  color: #3664D9;
}
.button-textxg {
  color: #de7897;
src/views/patient/patient/behospitalized.vue
@@ -718,6 +718,8 @@
    },
    //患者360跳转
    gettoken360(sfzh, drcode, drname) {
      this.$modal.msgWarning('360功能暂未开通');
  return; // é˜»æ­¢åŽç»­ä»£ç æ‰§è¡Œ
      this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh;
      if (this.postData.XiaoXiTou.ZuHuMC == "丽水市中医院") {
        this.postData.YeWuXX.YongHuXX.YongHuID = "1400398571877961728";
@@ -949,6 +951,6 @@
  }
}
.button-textsc {
  color: #28cfe6;
  color: #3664D9;
}
</style>
src/views/patient/patient/hospital.vue
@@ -653,6 +653,8 @@
    },
    //患者360跳转
    gettoken360(sfzh, drcode, drname) {
      this.$modal.msgWarning('360功能暂未开通');
  return; // é˜»æ­¢åŽç»­ä»£ç æ‰§è¡Œ
      this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh;
      if (this.postData.XiaoXiTou.ZuHuMC == "丽水市中医院") {
        this.postData.YeWuXX.YongHuXX.YongHuID = "1400398571877961728";
@@ -947,6 +949,6 @@
  }
}
.button-textsc {
  color: #28cfe6;
  color: #3664D9;
}
</style>
src/views/patient/patient/index.vue
@@ -185,7 +185,6 @@
              <el-col :span="1.5">
                <el-button
                  type="primary"
                  plain
                  icon="el-icon-s-promotion"
                  size="medium"
                  @click="distribute"
@@ -1209,6 +1208,8 @@
    },
    //患者360跳转
    gettoken360(sfzh,drcode,drname) {
      this.$modal.msgWarning('360功能暂未开通');
  return; // é˜»æ­¢åŽç»­ä»£ç æ‰§è¡Œ
      this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh;
      if (this.postData.XiaoXiTou.ZuHuMC=='丽水市中医院') {
        this.postData.YeWuXX.YongHuXX.YongHuID = '1400398571877961728';
@@ -1547,10 +1548,12 @@
  font-size: 20px;
}
::v-deep.leftvlue .el-card__body {
  background: #d0e9fd;
  background: #F2F8FF;
  color: #324A9B;
}
::v-deep.leftvlue .el-card__body:hover {
  background: #8dc8f8;
  background: #3664D9;
  color: #fff;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
.leftvlue {
@@ -1615,7 +1618,10 @@
  }
}
.button-textsc {
  color: #28cfe6;
  color: #3664D9;
}
.button-textxga {
  color: #de7897;
}
.button-textxg {
  color: #de7897;
src/views/patient/patient/operation.vue
@@ -743,6 +743,6 @@
  }
}
.button-textsc {
  color: #28cfe6;
  color: #3664D9;
}
</style>
src/views/patient/patient/outpatient.vue
@@ -880,7 +880,9 @@
      });
    },
    //患者360跳转
    gettoken360(sfzh, drcode, drname) {
    gettoken360(sfzh,drcode,drname) {
      this.$modal.msgWarning('360功能暂未开通');
  return; // é˜»æ­¢åŽç»­ä»£ç æ‰§è¡Œ
      this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh;
      if (this.postData.XiaoXiTou.ZuHuMC == "丽水市中医院") {
        this.postData.YeWuXX.YongHuXX.YongHuID = "1400398571877961728";
@@ -1227,7 +1229,7 @@
  }
}
.button-textsc {
  color: #28cfe6;
  color: #3664D9;
}
.batch-patient-section,
.batch-task-section {
src/views/patient/patient/physical.vue
@@ -953,6 +953,6 @@
  }
}
.button-textsc {
  color: #28cfe6;
  color: #3664D9;
}
</style>
src/views/patient/physical/index.vue
@@ -138,8 +138,7 @@
        <el-col :span="1.5">
          <el-button
            type="primary"
            plain
            icon="el-icon-plus"
                        icon="el-icon-plus"
            size="medium"
            @click="handleAdd"
            >新增</el-button
@@ -739,7 +738,7 @@
        //   value: 0,
        // },
        {
          name: "应随访",
          name: "需随访",
          value: 0,
        },
@@ -1273,10 +1272,12 @@
  }
}
::v-deep.leftvlue .el-card__body {
  background: #d0e9fd;
  background: #F2F8FF;
  color: #324A9B;
}
::v-deep.leftvlue .el-card__body:hover {
  background: #8dc8f8;
  background: #3664D9;
  color: #fff;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
::v-deep.errleftvlue .el-card__body {
src/views/patient/propaganda/Missioncreation.vue
@@ -1839,7 +1839,7 @@
  }
}
.button-textsc {
  color: #28cfe6;
  color: #3664D9;
}
.button-textxg {
  color: #de7897;
src/views/patient/propaganda/Missionotice.vue
@@ -78,8 +78,7 @@
        <el-col :span="1.5">
          <el-button
            type="primary"
            plain
            icon="el-icon-plus"
                        icon="el-icon-plus"
            size="medium"
            @click="handleAdd"
            v-hasPermi="['system:user:add']"
src/views/patient/propaganda/QuestionnaireTask.vue
@@ -432,8 +432,11 @@
            </div>
          </div>
        </div>
        <el-button type="success" @click="nextstep('ruleForm')">{{
          quote ? "立即创建" : "任务详情配置"
        <el-button type="primary" @click="nextstep('ruleForm')">{{
          quote ? "立即创建" : "派发患者配置"
        }}</el-button>
        <el-button type="success" @click="submitForm('ruleForm')">{{
          quote ? "立即创建" : "确认服务配置"
        }}</el-button>
        <el-button @click="resetForm('ruleForm')">重置</el-button>
      </div>
@@ -517,7 +520,7 @@
        </div>
        <el-button type="primary" @click="laststep()">上一步</el-button>
        <el-button type="success" @click="submitForm('ruleForm')">{{
          quote ? "立即创建" : "确认任务配置"
          quote ? "立即创建" : "确认服务配置"
        }}</el-button>
        <el-button @click="resetForm('ruleForm')">重置</el-button>
      </div>
@@ -911,7 +914,7 @@
  taskdiaggetlist,
  taskopergetlist,
} from "@/api/AiCentre/index";
import OptionalForm from "@/components/OptionalForm"; //正则组件
import OptionalForm from "@/components/OptionalForm"; //疾病添加组件
import SFtable from "@/components/SFtable"; //表格组件
import { MessageBox } from "element-ui";
@@ -1154,60 +1157,7 @@
        },
      ],
      tasktypes: [
        {
          value: 1,
          label: "监测评估",
        },
        {
          value: 2,
          label: "出院随访",
        },
        {
          value: 3,
          label: "门诊随访",
        },
        {
          value: 4,
          label: "宣教关怀",
        },
        {
          value: 5,
          label: "复诊管理",
        },
        // {
        //   value: 5,
        //   label: "满意度调查",
        // },
        {
          value: 7,
          label: "患者报告",
        },
        // {
        //   value: 8,
        //   label: "其他通知",
        // },
        {
          value: 9,
          label: "体检随访",
        },
        // {
        //   value: 1",
        //   label: "医技随访",
        // },
        {
          value: 11,
          label: "影像随访",
        },
        {
          value: 12,
          label: "心电随访",
        },
        // {
        //   value: "13",
        //   label: "专病随访",
        // },
      ],
      tasktypes: store.getters.tasktypes,
      // ç§‘室/病区
      belongWards: [],
      deptlist: [],
@@ -1337,9 +1287,13 @@
            value: "5",
            label: "微信公众号",
          },
          { label: "微信小程序", value: 6 },
          { label: "微信小程序", value: "6" },
        ];
      } else if (this.form.serviceType == 6) {
      } else if (
        this.form.serviceType == 6 ||
        this.form.serviceType == 14 ||
        this.form.serviceType == 15
      ) {
        this.checkboxlist = [
          {
            value: "3",
@@ -1406,6 +1360,7 @@
        this.form.serviceType == 2 ||
        this.form.serviceType == 3 ||
        this.form.serviceType == 5 ||
        this.form.serviceType == 16 ||
        this.form.serviceType == 4
      ) {
        this.checkboxlist = [
@@ -1493,17 +1448,18 @@
        this.deptcodesWards[0] ||
        this.leavehospitaldistrictcodes[0] ||
        this.diagglist[0] ||
        this.operationcodes[0]
        this.operationcodes[0] ||
        this.form.longTask == 2
      ) {
      } else {
        this.$modal.msgError("请选择任务关联条件");
        return;
      }
      if (!this.form.patTaskRelevances[0] && !this.form.longTask) {
        this.$modal.msgError("请选择病人");
        return;
      }
      //暂停任务患者限制
      // if (!this.form.patTaskRelevances[0] && !this.form.longTask) {
      //   this.$modal.msgError("请选择病人");
      //   return;
      // }
      if (!this.form.templatename && !this.templateor) {
        this.$modal.msgError("未选择模板");
src/views/patient/propaganda/index.vue
@@ -101,7 +101,6 @@
        <el-col :span="1.5">
          <el-button
            type="primary"
            plain
            icon="el-icon-plus"
            size="medium"
            @click="handleAdd"
@@ -754,6 +753,8 @@
        serviceType: 4,
        searchscope: 2,
        sendstate: 2,
         leaveldeptcodes: [],
        leavehospitaldistrictcodes: [],
      },
      propss: { multiple: true },
      options: [],
@@ -832,7 +833,7 @@
  methods: {
    /** æŸ¥è¯¢é—¨è¯Šå®£æ•™æœåŠ¡åˆ—è¡¨ */
    getList() {
       if (this.topqueryParams.searchscope == 3) {
      if (this.topqueryParams.searchscope == 3) {
        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
          (obj) => obj.deptCode
        );
@@ -840,6 +841,8 @@
          store.getters.belongWards.map((obj) => obj.districtCode);
      }
      this.loading = true;
      console.log(this.topqueryParams.leavehospitaldistrictcodes);
      console.log(this.topqueryParams.leaveldeptcodes);
      if (
        this.topqueryParams.leavehospitaldistrictcodes[0] &&
@@ -849,6 +852,7 @@
      } else {
        this.topqueryParams.deptOrDistrict = 1;
      }
      console.log(55);
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.userList.forEach((item) => {
src/views/patient/propaganda/particty.vue
@@ -1157,60 +1157,7 @@
        },
      ],
      tasktypes: [
        {
          value: "1",
          label: "监测评估",
        },
        {
          value: "2",
          label: "出院随访",
        },
        {
          value: "3",
          label: "门诊随访",
        },
        {
          value: "4",
          label: "宣教关怀",
        },
        {
          value: "5",
          label: "复诊管理",
        },
        // {
        //   value: "5",
        //   label: "满意度调查",
        // },
        {
          value: "7",
          label: "患者报告",
        },
        // {
        //   value: "8",
        //   label: "其他通知",
        // },
        {
          value: "9",
          label: "体检随访",
        },
        // {
        //   value: "10",
        //   label: "医技随访",
        // },
        {
          value: "11",
          label: "影像随访",
        },
        {
          value: "12",
          label: "心电随访",
        },
        // {
        //   value: "13",
        //   label: "专病随访",
        // },
      ],
      tasktypes: store.getters.tasktypes,
      // ç§‘室/病区
      belongWards: [],
      deptlist: [],
@@ -1427,6 +1374,7 @@
      } else if (
        this.form.serviceType == 2 ||
        this.form.serviceType == 3 ||
        this.form.serviceType == 16 ||
        this.form.serviceType == 4
      ) {
        this.checkboxlist = [
src/views/patient/questionnaire/index.vue
@@ -138,8 +138,7 @@
        <el-col :span="1.5">
          <el-button
            type="primary"
            plain
            icon="el-icon-plus"
                        icon="el-icon-plus"
            size="medium"
            @click="handleAdd"
            >新增</el-button
@@ -723,7 +722,7 @@
        //   value: 0,
        // },
        {
          name: "应随访",
          name: "需随访",
          value: 0,
        },
@@ -1291,10 +1290,12 @@
  }
}
::v-deep.leftvlue .el-card__body {
  background: #d0e9fd;
  background: #F2F8FF;
  color: #324A9B;
}
::v-deep.leftvlue .el-card__body:hover {
  background: #8dc8f8;
  background: #3664D9;
  color: #fff;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
::v-deep.errleftvlue .el-card__body {
src/views/patient/shadow/index.vue
@@ -138,8 +138,7 @@
        <el-col :span="1.5">
          <el-button
            type="primary"
            plain
            icon="el-icon-plus"
                        icon="el-icon-plus"
            size="medium"
            @click="handleAdd"
            >新增</el-button
@@ -723,7 +722,7 @@
        //   value: 0,
        // },
        {
          name: "应随访",
          name: "需随访",
          value: 0,
        },
@@ -1291,10 +1290,12 @@
  }
}
::v-deep.leftvlue .el-card__body {
  background: #d0e9fd;
  background: #F2F8FF;
  color: #324A9B;
}
::v-deep.leftvlue .el-card__body:hover {
  background: #8dc8f8;
  background: #3664D9;
  color: #fff;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
::v-deep.errleftvlue .el-card__body {
src/views/patient/subsequent/index.vue
@@ -138,8 +138,7 @@
        <el-col :span="1.5">
          <el-button
            type="primary"
            plain
            icon="el-icon-plus"
                        icon="el-icon-plus"
            size="medium"
            @click="handleAdd"
            >新增</el-button
@@ -739,7 +738,7 @@
        //   value: 0,
        // },
        {
          name: "应随访",
          name: "需随访",
          value: 0,
        },
@@ -1273,10 +1272,12 @@
  }
}
::v-deep.leftvlue .el-card__body {
  background: #d0e9fd;
  background: #F2F8FF;
  color: #324A9B;
}
::v-deep.leftvlue .el-card__body:hover {
  background: #8dc8f8;
  background: #3664D9;
  color: #fff;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
::v-deep.errleftvlue .el-card__body {
src/views/satisfaction.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1188 @@
<template>
  <div class="questionnaire" :class="'survey-type-' + surveyType">
    <!-- åŠ è½½çŠ¶æ€ -->
    <div v-if="loading" class="loading-state">
      <div class="loading-spinner">
        <i class="el-icon-loading"></i>
        <p>问卷加载中...</p>
      </div>
    </div>
    <!-- æ— æ•°æ®çŠ¶æ€ -->
    <div v-else-if="isEmptyData" class="empty-state">
      <div class="empty-content">
        <i class="el-icon-document" style="font-size: 64px; color: #909399"></i>
        <h3>暂无问卷数据</h3>
        <p>当前没有可用的问卷,请联系管理员或稍后重试</p>
        <el-button
          type="primary"
          @click="loadSurveyData"
          icon="el-icon-refresh"
        >
          é‡æ–°åŠ è½½
        </el-button>
      </div>
    </div>
    <!-- é”™è¯¯çŠ¶æ€ -->
    <div v-else-if="hasError" class="error-state">
      <div class="error-content">
        <i class="el-icon-warning" style="font-size: 64px; color: #f56c6c"></i>
        <h3>数据加载失败</h3>
        <p>{{ errorMessage }}</p>
        <el-button
          type="primary"
          @click="loadSurveyData"
          icon="el-icon-refresh"
        >
          é‡æ–°å°è¯•
        </el-button>
      </div>
    </div>
    <div class="CONTENT" v-if="!accomplish">
      <div class="preview-left">
        <div class="toptitle">
          <div class="title">{{ surveyTitle }}</div>
          <div style="font-size: 22px; margin-bottom: 20px; line-height: 1.5">
            {{ surveyDescription }}
          </div>
        </div>
        <div v-if="showDeptSelect" class="dept-select-container">
          <el-form>
            <el-form>
              <el-form-item label="选择科室">
                <el-select
                  v-model="selectedDept"
                  filterable
                  clearable
                  placeholder="请选择科室或输入关键词搜索"
                  @change="handleDeptChange"
                  popper-class="dept-select-dropdown"
                >
                  <el-option
                    v-for="dept in filteredDeptList"
                    :key="dept.code"
                    :label="`${dept.name} (${dept.code})`"
                    :value="dept.name"
                  >
                    <span>{{ dept.name }}</span>
                  </el-option>
                </el-select>
              </el-form-item>
            </el-form>
          </el-form>
        </div>
        <el-divider></el-divider>
        <!-- å•选题 -->
        <div
          class="topic-dev"
          v-for="(item, index) in questionList"
          :key="item.scriptId"
        >
          <div class="scriptTopic-dev" :key="index" v-if="item.scriptType == 1">
            <div class="dev-text">
              {{ index + 1 }}、<span style="line-height: 1.5"
                >{{ item.scriptContent }}
                <span style="color: #3ba2f7">[单选]</span></span
              >
            </div>
            <div class="dev-xx">
              <el-radio-group
                class="custom-radio"
                v-model="item.scriptResult"
                @change="handleOptionChange($event, index, item)"
              >
                <el-radio
                  border
                  v-for="(option, optIndex) in item.svyLibTemplateTargetoptions"
                  :class="
                    option.isabnormal &&
                    item.scriptResult == option.optioncontent
                      ? 'red-star'
                      : ''
                  "
                  :key="optIndex"
                  :label="option.optioncontent"
                  >{{ option.optioncontent }}</el-radio
                >
              </el-radio-group>
            </div>
            <div v-show="item.prompt">
              <el-alert :title="item.prompt" type="warning"> </el-alert>
            </div>
          </div>
          <!-- å¤šé€‰é¢˜ -->
          <div class="scriptTopic-dev" :key="index" v-if="item.scriptType == 2">
            <div class="dev-text">
              {{ index + 1 }}、<span style="line-height: 1.5"
                >{{ item.scriptContent }}
                <span style="color: #3ba2f7">[多选]</span></span
              >
            </div>
            <div class="dev-xx">
              <el-checkbox-group
                class="custom-radio"
                v-model="item.scriptResult"
              >
                <el-checkbox
                  border
                  @change="$forceUpdate()"
                  v-for="(option, optIndex) in item.svyLibTemplateTargetoptions"
                  :key="optIndex"
                  :label="option.optioncontent"
                >
                  {{ option.optioncontent }}
                </el-checkbox>
              </el-checkbox-group>
            </div>
            <div v-show="item.prompt && item.scriptResult[0]">
              <el-alert :title="item.prompt" type="warning"> </el-alert>
            </div>
          </div>
          <!-- å¡«ç©ºé¢˜ -->
          <div class="scriptTopic-dev" :key="index" v-if="item.scriptType == 4">
            <div class="dev-text">
              {{ index + 1 }}、<span style="line-height: 1.5"
                >{{ item.scriptContent
                }}<span style="color: #3ba2f7">[问答]</span></span
              >
            </div>
            <div class="dev-xx">
              <el-input
                type="textarea"
                :rows="3"
                placeholder="请输入"
                v-model="item.scriptResult"
                clearable
              >
              </el-input>
            </div>
          </div>
        </div>
        <div class="bottom-fixed">
          <el-button
            type="primary"
            style="width: 80%; font-size: 20px"
            @click="submitSurvey"
            >提交问卷</el-button
          >
        </div>
      </div>
    </div>
    <div class="CONTENT" v-else>
      <div class="preview-lefts">
        <div class="completion-message">
          <div class="thank-you">{{ this.accomplish || "感谢您的配合!" }}</div>
          <div class="feedback-message">{{ completionMessage }}</div>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import {
  getScriptByCondition,
  saveMYDQuestionAnswer,
  WLgetDept,
} from "@/api/AiCentre/index";
export default {
  data() {
    return {
      surveyType: null, // 'outpatient', 'inpatient'
      surveyTitle: "",
      surveyDescription: "",
      questionList: [],
      deptList: [],
      completionMessage: "",
      accomplish: false,
      showDeptSelect: false,
      selectedDept: null,
      deptSearchText: "", // ä¿ç•™ç”¨äºŽæœ¬åœ°è¿‡æ»¤
      deptList: [],
      filteredDeptList: [],
      // åŠ å¯†åŽçš„å‚æ•°
      encryptedParams: {
        param1: "",
        param2: "",
        param3: "",
        param4: "",
        param5: "",
        param6: "30001002",
      },
      isEmptyData: false, // æ–°å¢žï¼šæ— æ•°æ®çŠ¶æ€
      hasError: false, // æ–°å¢žï¼šé”™è¯¯çŠ¶æ€
      loading: false, // æ–°å¢žï¼šåŠ è½½çŠ¶æ€
      errorMessage: "", // æ–°å¢žï¼šé”™è¯¯ä¿¡æ¯
      // æµ‹è¯•数据
      testData: {
        1: {
          title: "门诊满意度调查",
          description:
            "亲爱的患者,感谢您选择我们的医疗服务。为了不断提升服务质量,请您花几分钟时间填写此问卷。",
          questions: [
            {
              scriptId: 1,
              scriptType: 1,
              scriptContent: "您对门诊医生的诊疗水平是否满意?",
              scriptResult: null,
              svyLibTemplateTargetoptions: [
                { optioncontent: "非常满意", value: "5", isabnormal: false },
                { optioncontent: "满意", value: "4", isabnormal: false },
                { optioncontent: "一般", value: "3", isabnormal: true },
                { optioncontent: "不满意", value: "2", isabnormal: true },
                { optioncontent: "非常不满意", value: "1", isabnormal: true },
              ],
            },
            {
              scriptId: 2,
              scriptType: 1,
              scriptContent: "您对门诊护士的服务态度是否满意?",
              scriptResult: null,
              svyLibTemplateTargetoptions: [
                { optioncontent: "非常满意", value: "5", isabnormal: false },
                { optioncontent: "满意", value: "4", isabnormal: false },
                { optioncontent: "一般", value: "3", isabnormal: true },
                { optioncontent: "不满意", value: "2", isabnormal: true },
                { optioncontent: "非常不满意", value: "1", isabnormal: true },
              ],
            },
            {
              scriptId: 3,
              scriptType: 2,
              scriptContent: "您认为门诊哪些方面需要改进?(可多选)",
              scriptResult: [],
              svyLibTemplateTargetoptions: [
                {
                  optioncontent: "排队等候时间",
                  value: "waiting_time",
                  isabnormal: false,
                },
                {
                  optioncontent: "医生沟通方式",
                  value: "communication",
                  isabnormal: false,
                },
                {
                  optioncontent: "就诊环境",
                  value: "environment",
                  isabnormal: false,
                },
                {
                  optioncontent: "医疗设备",
                  value: "equipment",
                  isabnormal: false,
                },
                { optioncontent: "其他", value: "other", isabnormal: false },
              ],
            },
            {
              scriptId: 4,
              scriptType: 4,
              scriptContent: "您对门诊服务还有什么其他建议?",
              scriptResult: null,
            },
          ],
          completionMessage:
            "感谢您宝贵的意见!我们将不断改进门诊服务质量,为您提供更好的医疗服务体验。",
        },
        2: {
          title: "住院满意度调查",
          description:
            "亲爱的患者及家属,感谢您选择在我院住院治疗。为了提升住院服务质量,请您填写此问卷。",
          questions: [
            {
              scriptId: 1,
              scriptType: 1,
              scriptContent: "您对住院期间医生的诊疗水平是否满意?",
              scriptResult: null,
              svyLibTemplateTargetoptions: [
                { optioncontent: "非常满意", value: "5", isabnormal: false },
                { optioncontent: "满意", value: "4", isabnormal: false },
                { optioncontent: "一般", value: "3", isabnormal: true },
                { optioncontent: "不满意", value: "2", isabnormal: true },
                { optioncontent: "非常不满意", value: "1", isabnormal: true },
              ],
            },
            {
              scriptId: 2,
              scriptType: 1,
              scriptContent: "您对住院期间护士的护理服务是否满意?",
              scriptResult: null,
              svyLibTemplateTargetoptions: [
                { optioncontent: "非常满意", value: "5", isabnormal: false },
                { optioncontent: "满意", value: "4", isabnormal: false },
                { optioncontent: "一般", value: "3", isabnormal: true },
                { optioncontent: "不满意", value: "2", isabnormal: true },
                { optioncontent: "非常不满意", value: "1", isabnormal: true },
              ],
            },
            {
              scriptId: 3,
              scriptType: 1,
              scriptContent: "您对住院病房的环境和卫生是否满意?",
              scriptResult: null,
              svyLibTemplateTargetoptions: [
                { optioncontent: "非常满意", value: "5", isabnormal: false },
                { optioncontent: "满意", value: "4", isabnormal: false },
                { optioncontent: "一般", value: "3", isabnormal: true },
                { optioncontent: "不满意", value: "2", isabnormal: true },
                { optioncontent: "非常不满意", value: "1", isabnormal: true },
              ],
            },
            {
              scriptId: 4,
              scriptType: 4,
              scriptContent: "您对住院服务还有什么其他建议?",
              scriptResult: null,
            },
          ],
          completionMessage:
            "感谢您对我们工作的支持!我们将根据您的反馈持续改进住院服务质量,祝您早日康复!",
        },
      },
    };
  },
  created() {
    this.initSurveyData();
  },
  methods: {
    // åˆå§‹åŒ–调查数据
    initSurveyData() {
      // ä»Žè·¯ç”±å‚数获取加密后的参数
      this.encryptedParams.param1 =
        this.$route.query.param1 ||
        "WOAq2QZd43E-qg-96SvuIFsn-sdRVxQNH4M82XhpXp_Ux4PFrPaqSFXcKaeA6oxEgNhPisA86LvU9kTAEz4xvQ==";
      this.encryptedParams.param2 =
        this.$route.query.param2 ||
        "XWeBh42RLYlNsMcomgw9UXhUPySkRP5EneWSueSq8F84qwYznU9heXuSx4tUMUtDvRnuJ86moJivy-kWQX12Rg==";
      this.encryptedParams.param5 = this.$route.query.param3 || "2"; //  1=住院, 2=门诊, 3=投诉建议
      this.encryptedParams.param6 = this.$route.query.param4 || "30001002";
      this.surveyType = parseInt(this.encryptedParams.param5) || 2;
      // åŠ è½½é—®å·æ•°æ®
      this.loadSurveyData();
      // èŽ·å–ç§‘å®¤åˆ—è¡¨
      this.WLgetDept();
    },
    WLgetDept() {
      // è°ƒç”¨æŽ¥å£èŽ·å–ç§‘å®¤æ•°æ®
      WLgetDept(this.encryptedParams.param6).then((res) => {
        this.deptList = Object.entries(res.data).map(([code, name]) => ({
          code,
          name,
        }));
        this.filteredDeptList = [...this.deptList];
        if (this.surveyType === 3) {
          this.showDeptSelect = true;
        }
      });
    },
    filterDeptList() {
      if (!this.deptSearchText) {
        this.filteredDeptList = [...this.deptList];
        return;
      }
      const searchText = this.deptSearchText.toLowerCase();
      this.filteredDeptList = this.deptList.filter(
        (dept) =>
          dept.name.toLowerCase().includes(searchText) ||
          dept.code.toLowerCase().includes(searchText)
      );
    },
    // åŠ è½½è°ƒæŸ¥æ•°æ®
    loadSurveyData() {
      this.loading = true;
      this.isEmptyData = false;
      this.hasError = false;
      this.errorMessage = "";
      // è°ƒç”¨æŽ¥å£èŽ·å–é—®å·æ•°æ®
      // æ ¹æ®é—®å·ç±»åž‹è®¾ç½®ä¸åŒçš„参数
      let encryptedParams = {
        param1: this.encryptedParams.param1,
      };
      // æ ¹æ®surveyType设置不同的参数
      switch (this.surveyType) {
        case 1: // ä½é™¢
          encryptedParams.param2 = this.encryptedParams.param2;
          break;
        case 2: // é—¨è¯Š
          encryptedParams.param3 = this.encryptedParams.param2;
          break;
        case 3: // æŠ•诉建议
          encryptedParams.param4 = this.encryptedParams.param2;
          break;
        default:
          encryptedParams.param3 = this.encryptedParams.param2;
      }
      getScriptByCondition(encryptedParams)
        .then((res) => {
          if (res.code === 200) {
            if (res.data.result) {
              this.accomplish = res.data.result;
              return;
            }
            if (
              !res.data.svyLibTemplateScriptVOS ||
              res.data.svyLibTemplateScriptVOS.length === 0
            ) {
              this.isEmptyData = true;
              this.$message.warning("暂无问卷数据");
              return;
            }
            // å¤„理接口返回的数据
            this.questionList = res.data.svyLibTemplateScriptVOS.map((item) => {
              return {
                ...item,
                scriptResult: item.scriptType === 2 ? [] : null,
              };
            });
            // æ ¹æ®surveyType设置标题和描述
            switch (this.surveyType) {
              case 2: // é—¨è¯Š
                this.surveyTitle = "门诊满意度调查";
                this.surveyDescription =
                  "亲爱的患者,感谢您选择我们的医疗服务。为了不断提升服务质量,请您花几分钟时间填写此问卷。";
                this.completionMessage =
                  "感谢您宝贵的意见!我们将不断改进门诊服务质量,为您提供更好的医疗服务体验。";
                break;
              case 1: // ä½é™¢
                this.surveyTitle = "住院满意度调查";
                this.surveyDescription =
                  "亲爱的患者及家属,感谢您选择在我院住院治疗。为了提升住院服务质量,请您填写此问卷。";
                this.completionMessage =
                  "感谢您对我们工作的支持!我们将根据您的反馈持续改进住院服务质量,祝您早日康复!";
                break;
              case 3: // æŠ•诉建议
                this.surveyTitle = "投诉建议反馈";
                this.surveyDescription =
                  "尊敬的客户,感谢您抽出宝贵时间提供反馈。您的意见对我们改进服务非常重要。";
                this.completionMessage =
                  "感谢您的反馈!我们已收到您的投诉/建议,将尽快处理并与您联系。";
                break;
              default:
                this.useTestData(1); // é»˜è®¤ä½¿ç”¨é—¨è¯Šæ•°æ®
            }
          } else {
            // æŽ¥å£æ— æ•°æ®æˆ–失败,使用测试数据
            // this.useTestData(this.surveyType);
          }
        })
        .catch(() => {
          console.error("数据获取失败:", error);
          this.hasError = true;
          this.errorMessage =
            error.message || "问卷数据加载失败,请检查网络连接后重试";
          this.$message.error("数据加载失败");
          // æŽ¥å£è°ƒç”¨å¤±è´¥ï¼Œä½¿ç”¨æµ‹è¯•数据
          // this.useTestData(this.surveyType);
        })
        .finally(() => {
          this.loading = false;
        });
    },
    handleDeptChange(value) {
      this.selectedDept = value;
      // å¯ä»¥åœ¨è¿™é‡Œæ·»åŠ å…¶ä»–å¤„ç†é€»è¾‘
    },
    // ä½¿ç”¨æµ‹è¯•数据
    useTestData(surveyType) {
      const type = [1, 2, 3].includes(surveyType) ? surveyType : 1;
      const testData = this.testData[type];
      this.surveyTitle = testData.title;
      this.surveyDescription = testData.description;
      this.questionList = testData.questions;
      this.completionMessage = testData.completionMessage;
    },
    // æäº¤è°ƒæŸ¥é—®å·ï¼ˆç›´æŽ¥æäº¤ï¼Œä¸ç»è¿‡ç¼“存)
    async submitSurvey() {
      // éªŒè¯å¿…填项
      if (this.hasUnansweredRequiredQuestions()) {
        this.$message.error("请完成所有必填问题后再提交");
        return;
      }
      try {
        const submitData = this.prepareSubmitData();
        const res = await saveMYDQuestionAnswer(submitData);
        if (res.code === 200) {
          this.accomplish = "问卷已提交";
          this.$message.success("提交成功!感谢您的反馈。");
        } else {
          this.$message.error(res.msg || "提交失败,请稍后再试");
        }
      } catch (error) {
        this.$message.error("网络错误,提交失败");
        console.error("提交失败:", error);
      }
    },
    // æ£€æŸ¥æ˜¯å¦æœ‰æœªå›žç­”的必填问题
    hasUnansweredRequiredQuestions() {
      return this.questionList.some((question) => {
        return (
          question.required &&
          (question.scriptResult === null ||
            question.scriptResult === "" ||
            (Array.isArray(question.scriptResult) &&
              question.scriptResult.length === 0))
        );
      });
    },
    // å‡†å¤‡æäº¤æ•°æ®
    prepareSubmitData() {
      // åˆ›å»ºç§‘室选择问题对象
      const deptQuestion = {
        scriptId: "dept_selection", // è‡ªå®šä¹‰ID
        scriptType: 4, // 4表示问答类型
        scriptContent: "选择的科室",
        scriptResult: this.selectedDept || "", // å­˜å‚¨é€‰æ‹©çš„科室名称
        required: false, // éžå¿…å¡«
        sort: 999,
        nextScriptno: "1",
      };
      return {
        taskId: this.encryptedParams.param1,
        serialnum: this.encryptedParams.param2 || this.encryptedParams.param3,
        mzzy: this.surveyType,
        svyLibTemplateScriptVOS: [
          deptQuestion, // å°†ç§‘室选择作为第一个问题
          ...this.questionList.map((item) => {
            return {
              scriptId: item.scriptId,
              scriptType: item.scriptType,
              scriptResult:
                item.scriptType === 2
                  ? (item.scriptResult || []).join("&")
                  : item.scriptResult || "",
              nextScriptno: item.nextScriptno,
              score: item.score,
              prompt: item.prompt,
              ...item,
            };
          }),
        ],
        excep: this.checkAbnormalOptions() ? 1 : 0,
      };
    },
    // æ£€æŸ¥å¼‚常选项
    checkAbnormalOptions() {
      return this.questionList.some((question) => {
        if (!question.scriptResult) return false;
        if (question.scriptType === 1) {
          // å•选题异常检查
          const selectedOption = question.svyLibTemplateTargetoptions.find(
            (opt) => opt.optioncontent === question.scriptResult
          );
          return selectedOption?.isabnormal;
        } else if (question.scriptType === 2) {
          // å¤šé€‰é¢˜å¼‚常检查
          return question.scriptResult.some((answer) => {
            const option = question.svyLibTemplateTargetoptions.find(
              (opt) => opt.optioncontent === answer
            );
            return option?.isabnormal;
          });
        }
        return false;
      });
    },
    // å¤„理单选选项变化
    handleOptionChange(selectedValue, index, question) {
      const selectedOption = question.svyLibTemplateTargetoptions.find(
        (option) => option.optioncontent === selectedValue
      );
      if (selectedOption) {
        this.questionList[index].nextScriptno = selectedOption.nextQuestion;
        this.questionList[index].score = selectedOption.score;
        this.questionList[index].prompt = selectedOption.prompt;
      }
    },
  },
};
</script>
<style lang="scss" scoped>
/* åŸºç¡€æ ·å¼å˜é‡ */
:root {
  --primary-color: #1a73e8; /* é»˜è®¤è“è‰² */
  --secondary-color: #34d399; /* é»˜è®¤ç»¿è‰² */
  --alert-color: #ed8936; /* é»˜è®¤æ©™è‰² */
}
/* é—¨è¯Šæ ·å¼å˜é‡ */
.survey-type-1 {
  --primary-color: #1a73e8; /* åŒ»ç–—蓝 */
  --secondary-color: #34d399; /* å¥åº·ç»¿ */
  --alert-color: #ed8936; /* è­¦ç¤ºæ©™ */
}
/* ä½é™¢æ ·å¼å˜é‡ */
.survey-type-2 {
  --primary-color: #5a67d8; /* æ·±è“ç´« */
  --secondary-color: #667eea; /* æµ…蓝紫 */
  --alert-color: #f56565; /* è­¦ç¤ºçº¢ */
}
/* æŠ•诉建议样式变量 */
.survey-type-3 {
  --primary-color: #e53e3e; /* ç´§æ€¥çº¢ */
  --secondary-color: #f6ad55; /* è­¦ç¤ºé»„ */
  --alert-color: #f56565; /* è­¦ç¤ºçº¢ */
}
.questionnaire {
  font-family: "PingFang SC", "Helvetica Neue", Arial, sans-serif;
  min-height: 100vh;
  margin: 0;
  padding: 0;
  color: #333;
  transition: all 0.3s ease;
  /* æ ¹æ®surveyType应用不同的主题 */
  &.survey-type-1 {
    background-color: #f5f9fc;
    --theme-gradient: linear-gradient(135deg, #1a73e8, #34d399);
  }
  &.survey-type-2 {
    background-color: #f8f9ff;
    --theme-gradient: linear-gradient(135deg, #5a67d8, #667eea);
  }
  &.survey-type-3 {
    background-color: #fff5f5;
    --theme-gradient: linear-gradient(135deg, #e53e3e, #f6ad55);
  }
}
.dept-select-container {
  margin: 20px 0;
  padding: 20px;
  background-color: #f8fafc;
  border-radius: 8px;
  border: 1px solid #e2e8f0;
}
/* è°ƒæ•´ä¸‹æ‹‰é€‰é¡¹æ ·å¼ */
.el-select-dropdown__item {
  display: flex;
  justify-content: space-between;
}
/* ä¸‹æ‹‰æ¡†æ ·å¼è°ƒæ•´ */
::v-deep .dept-select-dropdown {
  max-height: 400px; /* é™åˆ¶æœ€å¤§é«˜åº¦ */
  overflow-y: auto; /* æ·»åŠ æ»šåŠ¨æ¡ */
  .el-select-dropdown__item {
    display: flex;
    justify-content: space-between;
    padding: 0 20px;
    height: auto;
    line-height: 36px;
    span {
      display: inline-block;
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
    }
    /* åç§°éƒ¨åˆ† */
    span:first-child {
      width: 60%;
      text-align: left;
    }
    /* ç¼–码部分 */
    span:last-child {
      width: 40%;
      text-align: right;
    }
  }
}
/* ç§»åŠ¨ç«¯é€‚é… */
@media (max-width: 768px) {
  ::v-deep .dept-select-dropdown {
    max-width: 100vw; /* é™åˆ¶æœ€å¤§å®½åº¦ä¸ºè§†å£å®½åº¦ */
    width: auto !important;
    left: 10px !important;
    right: 10px !important;
    .el-select-dropdown__item {
      span:first-child {
        width: 50%;
      }
      span:last-child {
        width: 50%;
      }
    }
  }
}
.CONTENT {
  max-width: 900px;
  margin: 0 auto;
  padding: 20px;
  .title {
    color: var(--primary-color);
    font-size: 28px;
    font-weight: 600;
    margin-bottom: 15px;
    text-align: center;
    letter-spacing: 0.5px;
    position: relative;
    &::after {
      content: "";
      position: absolute;
      bottom: -8px;
      left: 50%;
      transform: translateX(-50%);
      width: 60px;
      height: 3px;
      background: var(--theme-gradient);
      border-radius: 3px;
    }
  }
}
.preview-left {
  margin: 20px 0;
  margin-bottom: 100px;
  background-color: #fff;
  border-radius: 12px;
  padding: 30px;
  border: none;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
  transition: all 0.3s ease;
  &:hover {
    box-shadow: 0 6px 16px rgba(0, 0, 0, 0.1);
  }
  .toptitle {
    margin-bottom: 25px;
    div {
      color: #4a5568;
      font-size: 18px;
      line-height: 1.6;
      text-align: center;
    }
  }
  .el-divider {
    background-color: #e2e8f0;
    margin: 25px 0;
  }
  .topic-dev {
    margin-bottom: 30px;
    font-size: 17px;
    background-color: #f8fafc;
    border-radius: 10px;
    padding: 20px;
    transition: all 0.3s ease;
    position: relative;
    overflow: hidden;
    &:hover {
      background-color: #f1f5f9;
    }
    /* æ·»åŠ ç±»åž‹æ ‡è¯†å°æ ‡ç­¾ */
    &::before {
      content: "";
      position: absolute;
      top: 0;
      left: 0;
      width: 4px;
      height: 100%;
      background: var(--primary-color);
    }
    .dev-text {
      margin-bottom: 18px;
      font-weight: 500;
      color: #2d3748;
      font-size: 18px;
      line-height: 1.6;
      span[style*="color: #3ba2f7"] {
        font-size: 14px;
        margin-left: 8px;
        color: var(--primary-color) !important;
      }
    }
  }
}
.preview-lefts {
  margin: 20px 0;
  background-color: #fff;
  border-radius: 12px;
  padding: 40px;
  min-height: 400px;
  border: none;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  .completion-message {
    padding: 40px;
    max-width: 600px;
    .thank-you {
      font-size: 32px;
      color: var(--primary-color);
      font-weight: 600;
      margin-bottom: 25px;
      position: relative;
      display: inline-block;
      &::after {
        content: "";
        position: absolute;
        bottom: -10px;
        left: 50%;
        transform: translateX(-50%);
        width: 80px;
        height: 3px;
        background: var(--theme-gradient);
        border-radius: 3px;
      }
    }
    .feedback-message {
      font-size: 20px;
      line-height: 1.7;
      color: #4a5568;
      margin: 0 auto;
    }
  }
}
.red-star {
  ::v-deep .el-radio__label,
  ::v-deep .el-checkbox__label {
    position: relative;
    padding-right: 20px;
    &::after {
      content: "*";
      color: #ef4444;
      position: absolute;
      right: 0;
      top: 0;
      font-size: 16px;
    }
  }
}
.loading-state {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 60vh;
  padding: 40px;
  .loading-spinner {
    text-align: center;
    .el-icon-loading {
      font-size: 48px;
      color: var(--primary-color);
      margin-bottom: 16px;
      animation: rotating 2s linear infinite;
    }
    p {
      color: #666;
      font-size: 16px;
    }
  }
}
.empty-state,
.error-state {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 60vh;
  padding: 40px;
  .empty-content,
  .error-content {
    text-align: center;
    max-width: 400px;
    h3 {
      color: #666;
      font-size: 20px;
      margin: 16px 0 12px;
      font-weight: 500;
    }
    p {
      color: #999;
      font-size: 14px;
      margin-bottom: 24px;
      line-height: 1.6;
    }
  }
}
.error-state {
  .error-content {
    h3 {
      color: #f56c6c;
    }
  }
}
@keyframes rotating {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}
/* å“åº”式调整 */
@media (max-width: 768px) {
  .loading-state,
  .empty-state,
  .error-state {
    padding: 20px;
    min-height: 50vh;
    .el-icon-loading,
    .el-icon-document,
    .el-icon-warning {
      font-size: 40px !important;
    }
    h3 {
      font-size: 18px !important;
    }
    p {
      font-size: 13px !important;
    }
  }
}
::v-deep {
  .el-checkbox-group {
    display: flex;
    flex-direction: column;
    margin: 15px 0;
    gap: 12px;
  }
  .el-radio-group {
    display: flex;
    flex-direction: column;
    margin: 15px 0;
    gap: 12px;
  }
  .el-radio.is-bordered,
  .el-checkbox.is-bordered {
    width: 100%;
    margin-right: 0;
    margin-bottom: 10px;
    max-width: 400px;
    padding: 14px 20px 14px 15px;
    border-radius: 8px;
    height: auto;
    min-height: 50px;
    border: 1px solid #e2e8f0;
    transition: all 0.3s ease;
    margin-left: 0 !important;
    margin-top: 0 !important;
    .el-radio-group,
    .el-checkbox-group {
      align-items: center;
    }
    &:hover {
      border-color: var(--primary-color);
      box-shadow: 0 2px 8px rgba(var(--primary-color), 0.15);
    }
    &.is-checked {
      border-color: var(--primary-color);
      background-color: rgba(var(--primary-color), 0.05);
    }
  }
  .el-radio__label,
  .el-checkbox__label {
    font-size: 16px;
    color: #2d3748;
  }
  .el-alert--warning.is-light {
    background-color: #fff8f0;
    color: var(--alert-color);
    margin-top: 15px;
    border-radius: 8px;
    border-left: 4px solid var(--alert-color);
    .el-alert__title {
      font-size: 15px;
      line-height: 1.6;
      color: var(--alert-color);
    }
    .el-alert__closebtn {
      color: var(--alert-color);
    }
  }
  .el-textarea__inner {
    font-size: 16px;
    border-radius: 8px;
    border: 1px solid #e2e8f0;
    padding: 12px 15px;
    transition: all 0.3s ease;
    min-height: 100px;
    &:focus {
      border-color: var(--primary-color);
      box-shadow: 0 0 0 2px rgba(var(--primary-color), 0.2);
    }
    &::placeholder {
      color: #a0aec0;
    }
  }
  .el-radio__input.is-checked .el-radio__inner {
    background-color: var(--primary-color);
    border-color: var(--primary-color);
  }
  .el-checkbox__input.is-checked .el-checkbox__inner {
    background-color: var(--primary-color);
    border-color: var(--primary-color);
  }
  .el-radio__inner,
  .el-checkbox__inner {
    width: 18px;
    height: 18px;
  }
}
.bottom-fixed {
  position: fixed;
  bottom: 0;
  left: 0;
  width: 100%;
  text-align: center;
  padding: 10px 0;
  background: var(--theme-gradient);
  box-shadow: 0 -4px 12px rgba(0, 0, 0, 0.1);
  z-index: 1000;
  transition: all 0.3s ease;
  .el-button {
    height: 56px;
    font-size: 18px;
    font-weight: 500;
    letter-spacing: 0.5px;
    border-radius: 8px;
    background-color: #fff;
    color: var(--primary-color);
    border: none;
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
    transition: all 0.3s ease;
    width: 80%;
    max-width: 400px;
    position: relative;
    overflow: hidden;
    &::before {
      content: "";
      position: absolute;
      top: 0;
      left: -100%;
      width: 100%;
      height: 100%;
      background: linear-gradient(
        90deg,
        transparent,
        rgba(255, 255, 255, 0.4),
        transparent
      );
      transition: all 0.5s ease;
    }
    &:hover {
      transform: translateY(-2px);
      box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2);
      &::before {
        left: 100%;
      }
    }
    &:active {
      transform: translateY(0);
    }
  }
}
/* å“åº”式设计 */
@media (max-width: 768px) {
  .questionnaire {
    .CONTENT {
      padding: 15px;
    }
    .preview-left,
    .preview-lefts {
      padding: 20px;
      margin-bottom: 80px;
    }
    .title {
      font-size: 24px !important;
    }
    .dev-text {
      font-size: 16px !important;
    }
    .bottom-fixed .el-button {
      height: 50px;
      font-size: 16px;
      width: 90%;
    }
  }
}
</style>
src/views/sfstatistics/percentage/index.vue
@@ -187,7 +187,7 @@
                    </el-table-column>
                    <el-table-column align="center" label="首次出院随访">
                      <el-table-column
                        label="应随访"
                        label="需随访"
                        align="center"
                        key="needFollowUp"
                        prop="needFollowUp"
@@ -273,7 +273,7 @@
                    </el-table-column>
                    <el-table-column align="center" label="再次出院随访">
                      <el-table-column
                        label="应随访"
                        label="需随访"
                        align="center"
                        key="needFollowUpAgain"
                        prop="needFollowUpAgain"
@@ -382,7 +382,7 @@
              </el-table-column>
              <el-table-column align="center" label="首次出院随访">
                <el-table-column
                  label="应随访"
                  label="需随访"
                  align="center"
                  key="needFollowUp"
                  prop="needFollowUp"
@@ -466,7 +466,7 @@
              </el-table-column>
              <el-table-column align="center" label="再次出院随访">
                <el-table-column
                  label="应随访"
                  label="需随访"
                  align="center"
                  key="needFollowUpAgain"
                  prop="needFollowUpAgain"
@@ -917,51 +917,7 @@
      sidecolumnval: "", //类别搜索
      propss: { multiple: true },
      SeedetailsVisible: false,
      options: [
        {
          value: 1,
          label: "监测评估",
        },
        {
          value: 2,
          label: "出院随访",
        },
        {
          value: 3,
          label: "门诊随访",
        },
        {
          value: 4,
          label: "宣教关怀",
        },
        {
          value: 5,
          label: "复诊管理",
        },
        {
          value: 7,
          label: "患者报告",
        },
        {
          value: 9,
          label: "体检随访",
        },
        {
          value: 11,
          label: "影像随访",
        },
        {
          value: 12,
          label: "心电随访",
        },
        {
          value: 13,
          label: "专病随访",
        },
      ],
      options: store.getters.tasktypes,
      pickerOptions: {
        disabledDate(time) {
          return time.getTime() < Date.now() - 3600 * 1000 * 24;
src/views/system/user/index.vue
@@ -846,7 +846,6 @@
        }
        console.log(this.form.wardCodes, "wardCodes");
        console.log(this.form.deptCodes, "deptCodes");
        this.postOptions = response.posts;
        this.roleOptions = response.roles;
        this.$set(this.form, "postIds", response.postIds);
@@ -927,7 +926,7 @@
    adduserdept() {
      if (this.form.wardCodes[0]) {
        this.form.wardCodes.forEach((dept) => {
          const containsId8 = null;
          let containsId8 = null;
          if (this.belongWards) {
            containsId8 = this.belongWards.some(
              (item) => item.deptCode == dept
@@ -948,7 +947,7 @@
      }
      if (this.form.deptCodes[0]) {
        this.form.deptCodes.forEach((dept) => {
          const containsId8 = null;
          let containsId8 = null;
          if (this.belongDepts) {
            containsId8 = this.belongDepts.some(
              (item) => item.deptCode == dept
src/views/system/user/profile/index.vue
@@ -24,20 +24,93 @@
                <div class="pull-right">{{ user.email }}</div>
              </li>
              <li class="list-group-item" v-if="user.belongWards[0]">
                <svg-icon icon-class="tree" />所属院区
                <div class="pull-right" >{{ user.belongWards[0].districtName }}</div>
                <svg-icon icon-class="tree" />所属病区
                <div class="pull-right">
                  <el-popover
                    v-model="showAllWardsPopover"
                    placement="right-start"
                    :width="300"
                    trigger="manual"
                    popper-class="ward-popover"
                  >
                    <div class="popover-content">
                      <p
                        v-for="ward in user.belongWards"
                        :key="ward.districtId"
                        class="popover-item"
                      >
                        {{ ward.districtName }}
                      </p>
                    </div>
                    <!-- éœ€è¦ä¸€ä¸ªç©ºå…ƒç´ ä½œä¸ºè§¦å‘器的引用 -->
                    <!-- <div style="display: none" slot="reference"></div> -->
                    <div slot="reference">
                      <el-tag
                        v-for="(ward, index) in displayWards"
                        :key="ward.districtId"
                        size="small"
                        class="ward-tag"
                        >{{ ward.districtName }}</el-tag
                      >
                      <!-- æ˜¾ç¤ºéšè—æ•°é‡çš„æ ‡ç­¾ï¼Œç‚¹å‡»è§¦å‘Popover -->
                      <el-tag
                        v-if="user.belongWards.length > maxTagCount"
                        size="small"
                        class="more-tag"
                        @click="showAllWardsPopover = !showAllWardsPopover"
                        >+{{ user.belongWards.length - maxTagCount }}</el-tag
                      >
                    </div>
                  </el-popover>
                </div>
              </li>
              <li class="list-group-item" v-else>
                <svg-icon icon-class="tree" />所属院区
                <div class="pull-right" >未配置</div>
                <div class="pull-right">未配置</div>
              </li>
              <li class="list-group-item" v-if="user.belongDepts[0]">
                <svg-icon icon-class="tree" />所属科室
                <div class="pull-right" >{{ user.belongDepts[0].deptName }}</div>
                <div class="pull-right">
                  <el-popover
                    v-model="showAllDeptsPopover"
                    placement="right-start"
                    :width="300"
                    style="top: 130px; left: 0px"
                    trigger="manual"
                    popper-class="dept-popover"
                  >
                    <div class="popover-content">
                      <p
                        v-for="dept in user.belongDepts"
                        :key="dept.deptId"
                        class="popover-item"
                      >
                        {{ dept.deptName }}
                      </p>
                    </div>
                    <!-- <div style="display: none" slot="reference"></div> -->
                    <div slot="reference">
                      <el-tag
                        v-for="(dept, index) in displayDepts"
                        :key="dept.deptId"
                        size="small"
                        class="dept-tag"
                        >{{ dept.deptName }}</el-tag
                      >
                      <el-tag
                        v-if="user.belongDepts.length > maxTagCount"
                        size="small"
                        class="more-tag"
                        @click="showAllDeptsPopover = !showAllDeptsPopover"
                        >+{{ user.belongDepts.length - maxTagCount }}</el-tag
                      >
                    </div>
                  </el-popover>
                </div>
              </li>
              <li class="list-group-item" v-else>
                <svg-icon icon-class="tree" />所属科室
                <div class="pull-right" >未配置</div>
                <div class="pull-right">未配置</div>
              </li>
              <li class="list-group-item">
                <svg-icon icon-class="peoples" />所属角色
@@ -84,20 +157,83 @@
      user: {},
      roleGroup: {},
      postGroup: {},
      activeTab: "userinfo"
      activeTab: "userinfo",
      maxTagCount: 3, // æŽ§åˆ¶é»˜è®¤æ˜¾ç¤ºçš„æ ‡ç­¾æ•°é‡
      showAllWardsPopover: false, // æŽ§åˆ¶ç—…区Popover的显示
      showAllDeptsPopover: false, // æŽ§åˆ¶ç§‘室Popover的显示
    };
  },
  computed: {
    // è®¡ç®—要显示的病区标签(前maxTagCount个)
    displayWards() {
      if (!this.user.belongWards) return [];
      return this.user.belongWards.slice(0, this.maxTagCount);
    },
    // è®¡ç®—要显示的科室标签(前maxTagCount个)
    displayDepts() {
      if (!this.user.belongDepts) return [];
      return this.user.belongDepts.slice(0, this.maxTagCount);
    },
  },
  created() {
    this.getUser();
  },
  methods: {
    getUser() {
      getUserProfile().then(response => {
      getUserProfile().then((response) => {
        this.user = response.data;
        this.roleGroup = response.roleGroup;
        this.postGroup = response.postGroup;
      });
    }
  }
    },
  },
};
</script>
<style scoped>
/* ä¸ºæ ‡ç­¾æ·»åŠ ä¸€äº›å³è¾¹è·ï¼Œä½¿å…¶ä¸ç´§è´´åœ¨ä¸€èµ· */
.ward-tag,
.dept-tag,
.more-tag {
  margin-right: 6px;
  margin-bottom: 4px;
}
/* è®¾ç½®"更多"标签的样式,使其看起来可点击 */
.more-tag {
  cursor: pointer;
  background-color: #f0f0f0;
  border-color: #ddd;
  color: #999;
}
.list-group-item {
  display: flex;
  align-items: center;
}
.pull-right {
  flex: 1;
  text-align: right;
}
</style>
<style>
/* Popover内容区域样式 */
.popover-content {
  max-height: 200px;
  overflow-y: auto;
  padding: 10px;
}
.popover-item {
  margin: 8px 0;
  line-height: 1.4;
}
/* ç—…区Popover样式 */
.ward-popover.el-popover,
.dept-popover.el-popover {
  max-width: 300px;
}
/* è°ƒæ•´Popover箭头位置 */
.ward-popover[x-placement^="right"],
.dept-popover[x-placement^="right"] {
  margin-left: 10px;
}
</style>
vue.config.js
@@ -36,9 +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://10.202.20.185:8095`,
        // target: `http://192.168.100.195:8095`,
        target:`http://localhost:8095`,
        target: `http://192.168.100.158:8095`,
        // target: `http://192.168.100.10:8096`,
        // target:`http://localhost:8095`,
        // target:`http://35z1t16164.qicp.vip`,
        // target: `http://192.168.100.193:8095`,
        // target: `http://192.168.101.166:8093`,
        // target: `http://192.168.191.181:8095`,