WXL (wul)
6 天以前 5319d5b95497b5b546947ac340c14c71e5b54ca6
src/views/followvisit/discharge/index.vue
@@ -1,5 +1,67 @@
<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 }}
              </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
@@ -11,12 +73,13 @@
        label-width="98px"
      >
        <el-form-item label="任务名称">
          <el-input v-model="topqueryParams.name"></el-input>
          <el-input
            v-model="topqueryParams.taskName"
            placeholder="请选择任务名称"
          ></el-input>
        </el-form-item>
        <el-form-item label="审核人">
          <el-input v-model="topqueryParams.name"></el-input>
        </el-form-item>
        <el-form-item label="审核时间">
        <el-form-item label="出院时间">
          <el-date-picker
            v-model="dateRange"
            style="width: 240px"
@@ -27,8 +90,27 @@
            end-placeholder="结束日期"
          ></el-date-picker>
        </el-form-item>
        <el-form-item label="随访类型" prop="status">
          <el-select v-model="topqueryParams.topic" placeholder="请选择">
        <el-form-item label="患者姓名" prop="sendname">
          <el-input
            v-model="topqueryParams.sendname"
            placeholder="请输入患者姓名"
            @keyup.enter.native="handleQuery"
          ></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"
@@ -38,34 +120,21 @@
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="模版" prop="status">
          <el-select v-model="topqueryParams.topic" placeholder="请选择">
            <el-option
              v-for="item in topicoptions"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            >
            </el-option>
          </el-select>
        <el-form-item label="患者标签" prop="tagname">
          <el-input
            v-model="topqueryParams.tagname"
            placeholder="输入进行模糊查询"
            maxlength="30"
            @keyup.enter.native="handleQuery"
          />
        </el-form-item>
        <el-form-item label="门诊随访状态" prop="status">
          <el-select v-model="topqueryParams.topic" 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>
          <el-button
            type="primary"
            icon="el-icon-search"
            size="medium"
            @click="handleQuery"
            @click="handleQuery(1)"
            >搜索</el-button
          >
          <el-button icon="el-icon-refresh" size="medium" @click="resetQuery"
@@ -82,7 +151,6 @@
            icon="el-icon-plus"
            size="medium"
            @click="handleAdd"
            v-hasPermi="['system:user:add']"
            >新增</el-button
          >
        </el-col>
@@ -105,238 +173,368 @@
          <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
                icon="el-icon-download"
                size="medium"
                @click="toleadExport"
                v-hasPermi="['system:user:export']"
                >导入</el-button
                @click="buidegetTasklist()"
                >待办服务</el-button
              >
            </div>
          </div>
        </el-col>
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button
                type="info"
                icon="el-icon-refresh"
                size="medium"
                @click="TaskReset"
                v-hasPermi="['system:user:export']"
                >任务重置</el-button
              >
            </div>
          </div>
        </el-col>
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button
                type="success"
                icon="el-icon-position"
                size="medium"
                @click="AllStarted"
                v-hasPermi="['system:user:export']"
                >全部开始</el-button
              >
            </div>
          </div>
        </el-col>
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button
                type="warning"
                icon="el-icon-remove"
                size="medium"
                @click="AllStop"
                v-hasPermi="['system:user:export']"
                >全部停止</el-button
              >
            </div>
          </div>
        </el-col>
        <el-col :span="1.5">
          <div class="documentf">
            <div class="document">
              <el-button
                type="primary"
                icon="el-icon-remove"
                size="medium"
                @click="Sendtimesetting"
                v-hasPermi="['system:user:export']"
                >发送时间设置</el-button
              >
            </div>
          </div>
        </el-col>
        <!-- <el-col :span="1.5"> </el-col> -->
      </el-row>
      <el-table
        v-loading="loading"
        :data="userList"
        height="660"
        :row-class-name="tableRowClassName"
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="50" align="center" />
        <el-table-column
          label="序号"
          label="任务名称"
          fixed
          align="center"
          key="userId"
          prop="userId"
          key="taskName"
          prop="taskName"
          width="180"
        />
        <!-- <el-table-column label="序号" fixed align="center" key="id" prop="id" /> -->
        <el-table-column
          label="姓名"
          fixed
          align="center"
          key="sendname"
          prop="sendname"
        />
        <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="danger" :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="病历号"
          label="人工处理意见"
          align="center"
          sortable
          key="userName"
          prop="userName"
          key="suggest"
          prop="suggest"
          width="120"
        />
        <el-table-column label="姓名" align="center" key="types" prop="types" />
        <el-table-column
          label="年龄"
          align="center"
          key="nickName"
          prop="nickName"
        />
        <el-table-column
          label="床号"
          align="center"
          key="nickName"
          prop="nickName"
        />
        <el-table-column
          label="病区"
          align="center"
          key="phonenumber"
          prop="phonenumber"
          width="120"
        >
        </el-table-column>
        <el-table-column
          label="疾病名称"
          align="center"
          key="topicnumber"
          prop="topicnumber"
          width="120"
          :show-overflow-tooltip="true"
        >
          <template slot-scope="scope">
            <div>轻度骨裂</div>
            <dict-tag
              :options="dict.type.sys_suggest"
              :value="scope.row.suggest"
            />
          </template>
        </el-table-column>
        <el-table-column
          label="随访状态"
          label="标签"
          align="center"
          key="topicnumber"
          prop="topicnumber"
          width="120"
          :show-overflow-tooltip="true"
        >
          <template slot-scope="scope">
            <div>未完成</div>
          </template>
        </el-table-column>
        <el-table-column
          label="随访方案"
          align="center"
          key="topicnumberaa"
          prop="topicnumberaa"
          width="120"
        />
        <el-table-column
          label="宣教材料"
          align="center"
          key="topicnumberaa"
          prop="topicnumberaa"
          width="120"
        />
        <el-table-column
          label="随访方式"
          align="center"
          key="topicnumberaa"
          prop="topicnumberaa"
          width="120"
          key="tagname"
          prop="tagname"
          show-overflow-tooltip
          width="180"
        />
        <el-table-column
          label="随访人员"
          align="center"
          key="topicnumberaa"
          prop="topicnumberaa"
          key="createBy"
          prop="createBy"
          width="120"
        />
        <el-table-column
          label="就诊时间"
          sortable
          align="center"
          prop="createTime"
          width="160"
        >
          <template slot-scope="scope">
            <span>{{ parseTime(scope.row.createTime) }}</span>
          </template>
        </el-table-column>
        <el-table-column
          label="随访时间"
          sortable
          align="center"
          prop="createTime"
          prop="visitTime"
          width="160"
        >
          <template slot-scope="scope">
            <span>{{ parseTime(scope.row.createTime) }}</span>
            <span>{{ parseTime(scope.row.visitTime) }}</span>
          </template>
        </el-table-column>
        <el-table-column
          label="回复时间"
          label="完成时间"
          sortable
          align="center"
          prop="createTime"
          prop="finishtime"
          width="160"
        >
          <template slot-scope="scope">
            <span>{{ parseTime(scope.row.createTime) }}</span>
            <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="200"
          align="center"
          key="longSendTime"
          prop="longSendTime"
        >
          <template slot-scope="scope">
            <span>{{ formatTime(scope.row.longSendTime) }}</span>
          </template></el-table-column
        >
        <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="主治医生"
          width="120"
          align="center"
          key="drname"
          prop="drname"
        />
        <!-- <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="性别" 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="icdName"
          prop="icdName"
          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="200"
          align="center"
          key="remark"
          prop="remark"
        >
          <template slot-scope="scope" v-if="scope.row.remark">
            <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>
          </template>
        </el-table-column>
        <el-table-column
          label="操作"
          align="center"
          fixed="right"
          width="200"
          class-name="small-padding fixed-width"
        >
          <template slot-scope="scope">
            <el-button
              size="medium"
              type="text"
              @click="followupvisit(scope.row)"
              v-hasPermi="['system:user:edit']"
              ><span class="button-bb"
                ><i class="el-icon-s-promotion"></i>重新随访</span
              ></el-button
            <!-- <el-tooltip
              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-delete"></i>停止</span
              ></el-button
              <el-button
                size="medium"
                type="text"
                @click="followupvisit(scope.row)"
                v-hasPermi="['system:user:edit']"
                ><span class="button-bb"
                  ><i class="el-icon-s-promotion"></i></span
              ></el-button>
            </el-tooltip> -->
            <!-- <el-tooltip
              class="item"
              effect="dark"
              content="停止"
              placement="top"
            >
            <el-button
              size="medium"
              type="text"
              @click="Seedetails(scope.row)"
              v-hasPermi="['system:user:edit']"
              <el-button
                size="medium"
                type="text"
                @click="handlestop(scope.row)"
                v-hasPermi="['system:user:edit']"
                ><span class="button-sc"><i class="el-icon-delete"></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="outPathQr(scope.row)"
              ><span class="button-qr"
                ><i class="el-icon-view"></i>二维码</span
              ></el-button
            >
          </template>
@@ -480,6 +678,55 @@
        >
      </span>
    </el-dialog>
    <!-- 二维码 -->
    <el-dialog
    :title="qrDialog.title"
    :visible.sync="qrDialog.visible"
    width="400px"
    center
    @close="handleQrClose"
  >
    <div class="qrcode-container">
      <!-- 加载状态 -->
      <div v-if="qrLoading" class="qrcode-loading">
        <i class="el-icon-loading"></i>
        <span>二维码生成中...</span>
      </div>
      <!-- 有有效数据时显示二维码 -->
      <div v-else-if="safeQrUrl" class="qrcode-content">
        <vue-qr
          :text="safeQrUrl"
          :size="280"
          :margin="10"
          :logoSrc="qrDialog.logo"
          :logoScale="0.2"
          colorDark="#191a23"
          colorLight="#ffffff"
        ></vue-qr>
        <div class="qrcode-info">
          <p><strong>患者姓名:</strong>{{ qrDialog.patientName }}</p>
          <p><strong>任务名称:</strong>{{ qrDialog.taskName }}</p>
        </div>
        <div class="qrcode-actions">
          <el-button type="primary" size="small" @click="downloadQrCode">
            <i class="el-icon-download"></i> 下载二维码
          </el-button>
          <el-button type="success" size="small" @click="copyQrUrl">
            <i class="el-icon-document-copy"></i> 复制链接
          </el-button>
        </div>
      </div>
      <!-- 无数据提示 -->
      <div v-else class="qrcode-empty">
        <i class="el-icon-warning"></i>
        <span>暂无有效的二维码链接</span>
      </div>
    </div>
  </el-dialog>
  </div>
</template>
@@ -493,13 +740,16 @@
  resetUserPwd,
  changeUserStatus,
} from "@/api/system/user";
import { getTaskservelist, buidegetTasklist } from "@/api/AiCentre/index";
import Treeselect from "@riophae/vue-treeselect";
import store from "@/store";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import VueQr from "vue-qr";
import Clipboard from "clipboard";
export default {
  name: "User",
  dicts: ["sys_normal_disable", "sys_user_sex"],
  components: { Treeselect },
  name: "Discharge",
  dicts: ["sys_normal_disable", "sys_user_sex", "sys_yujing", "sys_suggest"],
  components: { Treeselect, VueQr },
  data() {
    return {
      // 遮罩层
@@ -522,6 +772,7 @@
      addalteropen: false,
      // 修改发送时间对话框
      modificationVisible: false,
      resetQrurl: "",
      // 部门名称
      deptName: undefined,
      // 默认密码
@@ -535,7 +786,10 @@
      },
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      ycvalue: "",
      yfsvalue: "",
      inputValue: "",
      preachform: "",
      previewVisible: false, //门诊随访预览弹框
      radio: "",
      radios: [],
@@ -548,88 +802,69 @@
      },
      value: [],
      list: [],
      loading: false,
      states: [
        "Alabama",
        "Alaska",
        "Arizona",
        "Arkansas",
        "California",
        "Colorado",
        "Connecticut",
        "Delaware",
        "Florida",
        "Georgia",
        "Hawaii",
        "Idaho",
        "Illinois",
        "Indiana",
        "Iowa",
        "Kansas",
        "Kentucky",
        "Louisiana",
        "Maine",
        "Maryland",
        "Massachusetts",
        "Michigan",
        "Minnesota",
        "Mississippi",
        "Missouri",
        "Montana",
        "Nebraska",
        "Nevada",
        "New Hampshire",
        "New Jersey",
        "New Mexico",
        "New York",
        "North Carolina",
        "North Dakota",
        "Ohio",
        "Oklahoma",
        "Oregon",
        "Pennsylvania",
        "Rhode Island",
        "South Carolina",
        "South Dakota",
        "Tennessee",
        "Texas",
        "Utah",
        "Vermont",
        "Virginia",
        "Washington",
        "West Virginia",
        "Wisconsin",
        "Wyoming",
      ],
      pickerOptions: {
        disabledDate(time) {
          return time.getTime() > Date.now();
        },
        shortcuts: [
          {
            text: "今天",
            onClick(picker) {
              picker.$emit("pick", new Date());
            },
          },
          {
            text: "昨天",
            onClick(picker) {
              const date = new Date();
              date.setTime(date.getTime() - 3600 * 1000 * 24);
              picker.$emit("pick", date);
            },
          },
          {
            text: "一周前",
            onClick(picker) {
              const date = new Date();
              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
              picker.$emit("pick", date);
            },
          },
        ],
      qrDialog: {
        visible: false,
        title: "随访二维码",
        url: "",
        patientName: "",
        taskName: "",
        logo: require("@/assets/logo/logoxh.png"), // 可选的Logo,请确保路径正确
      },
      qrLoading: false,
      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,
        // },
        // {
        //   name: "表单已发送",
        //   value: 0,
        // },
      ],
      // 表单参数
      form: {
        phonenumber: "",
@@ -643,9 +878,11 @@
      topqueryParams: {
        pageNum: 1,
        pageSize: 10,
        userName: undefined,
        tagid: undefined,
        topic: undefined,
        serviceType: 2,
        searchscope: 3,
        scopetype: [],
        leaveldeptcodes: [],
        leavehospitaldistrictcodes: [],
      },
      propss: { multiple: true },
      options: [],
@@ -653,93 +890,223 @@
      topicoptions: [
        {
          value: 1,
          label: "待审核",
          label: "表单已领取",
        },
        {
          value: 2,
          label: "执行中",
          label: "待执行",
        },
        {
          value: 3,
          label: "执行完成",
          label: "表单已发送",
        },
        {
          value: 4,
          label: "已停止",
          label: "不执行",
        },
        {
          value: 5,
          label: "发送失败",
        },
        {
          value: 6,
          label: "已完成",
        },
      ],
      topicoptionsyj: [
        {
          value: 1,
          label: "异常",
        },
        {
          value: 0,
          label: "正常",
        },
      ],
      errtype: "",
      leavehospitaldistrictcode: "",
      serviceState: [],
      checkboxlist: [],
      // 表单校验
      rules: {
        userName: [
          { required: true, message: "用户名称不能为空", trigger: "blur" },
          {
            min: 2,
            max: 20,
            message: "用户名称长度必须介于 2 和 20 之间",
            trigger: "blur",
          },
        ],
        nickName: [
          { required: true, message: "用户昵称不能为空", trigger: "blur" },
        ],
        password: [
          { required: true, message: "用户密码不能为空", trigger: "blur" },
          {
            min: 5,
            max: 20,
            message: "用户密码长度必须介于 5 和 20 之间",
            trigger: "blur",
          },
        ],
        email: [
          {
            type: "email",
            message: "请输入正确的邮箱地址",
            trigger: ["blur", "change"],
          },
        ],
        phonenumber: [
          {
            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
            message: "请输入正确的手机号码",
            trigger: "blur",
          },
        ],
        IDnumber: [
          {
            pattern:
              /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/,
            message: "请输入正确的身份证号码",
            trigger: "blur",
          },
        ],
      },
      rules: {},
    };
  },
  watch: {},
  created() {
    this.getList();
    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 (store.getters.belongWards.length) {
      this.topqueryParams.leavehospitaldistrictcodes = [
        store.getters.belongWards[0].districtCode,
      ];
      this.topqueryParams.scopetype = [
        2,
        store.getters.belongWards[0].districtCode,
      ];
    }
    if (this.errtype) {
      this.toleadExport(2);
    } else {
      this.getList(1);
    }
    this.getConfigKey("sys.user.initPassword").then((response) => {
      this.initPassword = response.msg;
    });
  },
  // 搜索
  mounted() {
    this.list = this.states.map((item) => {
      return { value: `value:${item}`, label: `label:${item}` };
    });
  activated() {
    this.getList(1);
  },
  computed: {
    safeQrUrl() {
      return this.qrDialog.url && this.qrDialog.url !== 'undefined'
        ? this.qrDialog.url.toString()
        : ''
    }
  },
  methods: {
    /** 查询门诊随访列表 */
    getList() {
    /** 查询门诊随访服务列表 */
    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;
      listUser(this.addDateRange(this.topqueryParams, this.dateRange)).then(
        (response) => {
          this.userList = response.rows;
          this.total = response.total;
          this.loading = false;
      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[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;
      });
    },
    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].dfs;
          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) {
@@ -798,17 +1165,49 @@
      this.resetForm("form");
    },
    /** 搜索按钮操作 */
    handleQuery() {
    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.getList();
      this.topqueryParams.startOutHospTime = this.dateRange[0];
      this.topqueryParams.endOutHospTime = this.dateRange[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.resetForm("queryForm");
      this.topqueryParams.deptId = undefined;
      this.$refs.tree.setCurrentKey(null);
      this.handleQuery();
      this.topqueryParams = {
        pageNum: 1,
        pageSize: 10,
        serviceType: 2,
        searchscope: 2,
      };
      this.handleQuery(1);
    },
    // 多选框选中数据
    handleSelectionChange(selection) {
@@ -839,11 +1238,14 @@
    /** 新增按钮操作 */
    handleAdd() {
      this.$router.push({
        path: "/followvisit/particty",
        query: { type: 3, },
        path: "/followvisit/QuestionnaireTask",
        query: {
          type: 2,
          serviceType: 2,
        },
      });
    },
    /** 重置密码按钮操作 */
    handleResetPwd(row) {
      this.$prompt('请输入"' + row.userName + '"的新密码', "提示", {
@@ -869,13 +1271,13 @@
            updateUser(this.form).then((response) => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.getList();
              this.getList(1);
            });
          } else {
            addUser(this.form).then((response) => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.getList();
              this.getList(1);
            });
          }
        }
@@ -890,7 +1292,7 @@
          return delUser(userIds);
        })
        .then(() => {
          this.getList();
          this.getList(1);
          this.$modal.msgSuccess("删除成功");
        })
        .catch(() => {});
@@ -903,7 +1305,7 @@
          return console.log("停止成功");
        })
        .then(() => {
          this.getList();
          this.getList(1);
          this.$modal.msgWarning("停止成功");
        })
        .catch(() => {});
@@ -916,7 +1318,7 @@
          return console.log("开启成功");
        })
        .then(() => {
          this.getList();
          this.getList(1);
          this.$modal.msgSuccess("开启成功");
        })
        .catch(() => {});
@@ -929,7 +1331,7 @@
          return console.log("选中成功");
        })
        .then(() => {
          this.getList();
          this.getList(1);
          this.$modal.msgSuccess("重置成功");
        })
        .catch(() => {});
@@ -939,23 +1341,169 @@
      this.modificationVisible = true;
    },
    // 跳转详情页
    Seedetails() {
    Seedetails(row) {
      let type = "";
      console.log(row, "rwo");
      if (row.preachformson) {
        if (row.preachformson.includes("3")) {
          type = 1;
          console.log(type, "rwo");
        }
      }
      this.$router.push({
        path: "/followvisit/record/detailpage/",
        query: { id: "1" },
        query: {
          taskid: row.taskid,
          patid: row.patid,
          id: row.id,
          Voicetype: type,
        },
      });
    },
    // 导入按钮
    toleadExport() {},
    // 便捷按钮
    toleadExport(too) {
      if (too == 1) {
        this.topqueryParams.sendstate = 4;
        this.topqueryParams.excep = null;
      } else if (too == 2) {
        this.topqueryParams.excep = 1;
      }
      this.handleQuery();
    },
    // 显示二维码弹框
    outPathQr(row) {
      console.log(row);
      if (!row || !row.outPath || row.outPath === 'undefined') {
        this.$message.warning('该记录暂无有效的二维码链接')
        return
      }
      this.qrLoading = true
      this.qrDialog = {
        visible: true,
        title: `${row.sendname || '患者'}的随访二维码`,
        url: row.outPath,
        patientName: row.sendname || '未知',
        taskName: row.taskName || '未知任务',
        logo: require("@/assets/logo/logoxh.png"),
      };
      // 确保组件有足够时间渲染
      this.$nextTick(() => {
        this.qrLoading = false
      })
    },
    // 二维码生成回调
    qrCodeCallback(dataUrl, id) {
      console.log("二维码生成成功:", id);
      // 这里可以保存dataUrl用于后续操作
    },
    // 下载二维码
    downloadQrCode() {
      try {
        const qrComponent = this.$refs.vueQr;
        // 获取二维码图片的URL
        const qrImageUrl = qrComponent.$el.src;
        const downloadLink = document.createElement("a");
        downloadLink.href = qrImageUrl;
        downloadLink.download = `随访二维码_${
          this.qrDialog.patientName
        }_${new Date().getTime()}.png`;
        document.body.appendChild(downloadLink);
        downloadLink.click();
        document.body.removeChild(downloadLink);
        this.$message.success("二维码下载成功");
      } catch (error) {
        console.error("下载失败:", error);
        this.$message.error("下载失败,请重试");
      }
    },
    // 复制链接
    copyQrUrl() {
      if (!this.qrDialog.url) {
        this.$message.warning("无有效链接可复制");
        return;
      }
      // 方法1: 使用clipboard库(如果安装了)
      // this.copyWithClipboard()
      // 方法2: 使用现代浏览器的Clipboard API
      this.copyWithModernAPI();
    },
    // 使用现代Clipboard API复制
    async copyWithModernAPI() {
      try {
        await navigator.clipboard.writeText(this.qrDialog.url);
        this.$message.success("链接已复制到剪贴板");
      } catch (error) {
        // 降级方案
        this.copyWithFallback();
      }
    },
    // 兼容性降级方案
    copyWithFallback() {
      const textArea = document.createElement("textarea");
      textArea.value = this.qrDialog.url;
      textArea.style.position = "fixed";
      textArea.style.left = "-999999px";
      textArea.style.top = "-999999px";
      document.body.appendChild(textArea);
      textArea.focus();
      textArea.select();
      try {
        document.execCommand("copy");
        this.$message.success("链接已复制到剪贴板");
      } catch (error) {
        this.$message.warning("浏览器不支持自动复制,请手动复制链接");
      } finally {
        document.body.removeChild(textArea);
      }
    },
    // 关闭二维码弹框
    handleQrClose() {
      this.qrDialog.visible = false;
            this.qrLoading = false
      // 重置数据
      setTimeout(() => {
        this.qrDialog = {
          visible: false,
          title: "随访二维码",
          url: "",
          patientName: "",
          taskName: "",
          logo: require("@/assets/logo/logoxh.png"),
        };
      }, 300);
    },
    /** 导出按钮操作 */
    handleExport() {
      this.topqueryParams.pageNum = null;
      this.topqueryParams.pageSize = null;
      this.download(
        "system/user/export",
        "smartor/serviceSubtask/export",
        {
          ...this.topqueryParams,
        },
        `user_${new Date().getTime()}.xlsx`
      );
    },
    // 异常列渲染
    tableRowClassName({ row, rowIndex }) {
      if (row.excep == 1) {
        return "warning-row";
      }
      return "";
    },
  },
};
@@ -971,6 +1519,9 @@
.document {
  // width: 100px;
  height: 50px;
}
::v-deep.el-table .warning-row {
  background: #eec4c4;
}
.documentf {
@@ -1050,6 +1601,28 @@
    }
  }
}
::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;
@@ -1077,6 +1650,12 @@
  border-radius: 1px;
  color: #ffffff;
}
.button-qr {
  background: #6c14a2;
  padding: 5px;
  border-radius: 1px;
  color: #ffffff;
}
::v-deep.el-radio-group {
  span {
@@ -1084,10 +1663,49 @@
  }
}
// 选项字体放大
// ::v-deep.el-checkbox-group {
//   span {
//     font-size: 24px;
//   }
// }
/* 二维码弹框样式 */
.qrcode-container {
  text-align: center;
  padding: 10px;
}
.qrcode-wrapper {
  margin: 0 auto 20px;
  padding: 15px;
  background: #f8f9fa;
  border-radius: 8px;
  display: inline-block;
}
.qrcode-info {
  margin: 15px 0;
  padding: 12px;
  background: #f0f2f5;
  border-radius: 6px;
  text-align: left;
}
.qrcode-info p {
  margin: 8px 0;
  font-size: 14px;
}
.qrcode-actions {
  display: flex;
  justify-content: center;
  gap: 12px;
  margin-top: 20px;
}
/* 响应式设计 */
@media (max-width: 480px) {
  .qrcode-actions {
    flex-direction: column;
    align-items: center;
  }
  .qrcode-actions .el-button {
    width: 200px;
  }
}
</style>