WXL (wul)
4 天以前 70e4d2c33cc2e3af590d1816c0c703da341538cf
测试完成
已删除3个文件
已修改35个文件
已添加1个文件
3193 ■■■■ 文件已修改
dist.zip 补丁 | 查看 | 原始文档 | blame | 历史
src/components/StatisticsCards/index.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/getters.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/user.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Satisfaction/configurationmyd/batch.vue 616 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Satisfaction/configurationmyd/components/DetailsAnomaly.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/Continue/index.vue 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/HistoricalFollow/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/OutpatientAgain/index.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/SpecificDisease/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/Tracking/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/again/index.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/beHospitalized/followUp.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/complaint/index.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/discharge/index copy.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/discharge/index.vue 161 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/discharge/index.vue.bak 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/discharge/outpatientService.vue 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/mzsatisfaction/index.vue 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/operation/index.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/outpatient/index.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/record/detailpage/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/record/index.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/technology/index.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/zbAgain/index.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/zysatisfaction/index.vue 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/knowledge/education/compilequer/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/physical/index.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/propaganda/Missioncreation.vue 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/propaganda/QuestionnaireTask.vue 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/propaganda/index.vue 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/propaganda/particty.vue 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/questionnaire/index.vue 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/shadow/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/subsequent/index.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/ycquestionnaire/index.vue 1298 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/sfstatistics/percentage/index.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
随访外链.zip 补丁 | 查看 | 原始文档 | blame | 历史
随访通用8.26.zip 补丁 | 查看 | 原始文档 | blame | 历史
dist.zip
Binary files differ
src/components/StatisticsCards/index.vue
@@ -106,6 +106,11 @@
        éœ€éšè®¿: "need-follow-card",
        å¾…随访: "pending-card",
        å·²å®Œæˆ: "completed-card",
        ä½é™¢æ€»é‡: "total-card",
        é—¨è¯Šæ€»é‡: "total-card",
        å‘送任务量: "need-follow-card",
        å¾…完成: "pending-card",
        å®Œæˆçއ: "completed-card",
        å¼‚常: "error-card",
        è­¦å‘Š: "warning-card",
      };
@@ -119,6 +124,11 @@
        éœ€éšè®¿: "需随访 = å¾…随访 + å·²å®Œæˆ",
        å¾…随访: "待随访:等待进行随访的患者数量",
        å·²å®Œæˆ: "已完成:已完成随访的患者数量",
        ä½é™¢æ€»é‡: "住院满意度患者总量",
        é—¨è¯Šæ€»é‡: "门诊满意度患者总量",
        å‘送任务量: "发送任务量 = æ‚£è€…服务总量",
        å¾…完成: "待完成:待随访的患者数量",
        å®Œæˆçއ: "完成率 = å·²å®Œæˆ Ã· (待完成 + å·²å®Œæˆ)",
        å¼‚常: "异常数据统计",
        è­¦å‘Š: "警告数据统计",
      };
src/store/getters.js
@@ -787,6 +787,14 @@
        listClass: "",
      },
    },
    {
      value: 20,
      label: "患者异常报告",
      raw: {
        cssClass: "",
        listClass: "",
      },
    },
  ],
};
src/store/modules/user.js
@@ -257,6 +257,12 @@
              localStorage.setItem("deptCode", "");
              localStorage.setItem("YongHuID", "1540295571200282624");
              localStorage.setItem("YongHuXM", "LSDERMYY");
            }else if (orgid == "1") {
              localStorage.setItem("orgname", "浙江省新华医院");
              localStorage.setItem("ZuHuID", "");
              localStorage.setItem("deptCode", "");
              localStorage.setItem("YongHuID", "");
              localStorage.setItem("YongHuXM", "");
            }
            resolve();
          })
src/views/Satisfaction/configurationmyd/batch.vue
@@ -211,7 +211,7 @@
                </div>
                <div class="info-item">
                  <span class="label">处理说明:</span>
                  <span class="value">{{ row.handledesc }}</span>
                  <span class="value">{{ formatHandledesc(row.handledesc) }}</span>
                </div>
              </div>
              <span v-else class="no-data">未处理</span>
@@ -238,7 +238,7 @@
                size="small"
                icon="el-icon-edit"
                @click="handleProcess(row)"
                :disabled="row.handleFlag === '1'"
                :disabled="row.handleresult === 'resolved'"
              >
                å¤„理
              </el-button>
@@ -266,88 +266,258 @@
    <el-dialog
      title="处理异常反馈"
      :visible.sync="processDialogVisible"
      width="600px"
      width="60%"
      top="6vh"
      center
    >
      <el-form
        :model="processForm"
        :rules="processRules"
        ref="processForm"
        label-width="100px"
        size="medium"
      >
        <el-form-item label="处理状态" prop="handleFlag">
          <el-select
            v-model="processForm.handleFlag"
            placeholder="请选择处理状态"
            style="width: 100%"
      <div class="flow-dialog-body">
        <!-- å·¦åŠéƒ¨åˆ†ï¼šå¤„理信息 -->
        <div class="flow-left">
          <el-form
            :model="processForm"
            :rules="processRules"
            ref="processForm"
            label-width="100px"
            size="medium"
          >
            <el-option label="已处理" :value="'1'" />
            <el-option label="取消处理" :value="'0'" />
          </el-select>
        </el-form-item>
            <el-form-item label="是否流转" prop="isFlow">
              <el-switch
                v-model="processForm.isFlow"
                active-value="1"
                inactive-value="0"
                active-text="流转"
                inactive-text="不流转"
              />
            </el-form-item>
        <el-form-item label="报备科室" prop="ccdepts">
          <el-select
            v-model="processForm.ccdepts"
            placeholder="请选择报备科室"
            multiple
            filterable
            collapse-tags
            style="width: 100%"
            :disabled="processForm.handleFlag !== '1'"
          >
            <el-option
              v-for="dept in deptList"
              :key="dept.deptCode"
              :label="dept.label"
              :value="dept.deptCode"
            />
          </el-select>
        </el-form-item>
            <el-form-item label="处理状态" prop="handleFlag">
              <el-select
                v-model="processForm.handleFlag"
                placeholder="请选择处理状态"
                style="width: 100%"
              >
                <el-option label="已处理" :value="'1'" />
                <el-option label="取消处理" :value="'0'" />
              </el-select>
            </el-form-item>
        <el-form-item label="处理结果" prop="handleresult">
          <el-select
            v-model="processForm.handleresult"
            placeholder="请选择处理结果"
            style="width: 100%"
            :disabled="processForm.handleFlag !== '1'"
          >
            <el-option label="已解决" value="resolved" />
            <el-option label="已解释" value="explained" />
            <el-option label="已转交" value="transferred" />
            <el-option label="需改进" value="improvement" />
            <el-option label="已驳回" value="rejected" />
          </el-select>
        </el-form-item>
            <el-form-item label="报备科室" prop="ccdepts">
              <el-select
                v-model="processForm.ccdepts"
                placeholder="请选择报备科室"
                multiple
                filterable
                collapse-tags
                style="width: 100%"
                :disabled="processForm.handleFlag !== '1'"
              >
                <el-option
                  v-for="dept in deptList"
                  :key="dept.deptCode"
                  :label="dept.label"
                  :value="dept.deptCode"
                />
              </el-select>
            </el-form-item>
        <el-form-item label="处理说明" prop="handledesc">
          <el-input
            v-model="processForm.handledesc"
            type="textarea"
            :rows="4"
            placeholder="请输入处理说明(最多500字)"
            maxlength="500"
            show-word-limit
            :disabled="processForm.handleFlag !== '1'"
          />
        </el-form-item>
            <el-form-item label="处理结果" prop="handleresult">
              <el-select
                v-model="processForm.handleresult"
                placeholder="请选择处理结果"
                style="width: 100%"
                :disabled="processForm.handleFlag !== '1'"
              >
                <el-option label="已解决" value="resolved" />
                <el-option label="已解释" value="explained" />
                <el-option label="已转交" value="transferred" />
                <el-option label="需改进" value="improvement" />
                <el-option label="已驳回" value="rejected" />
              </el-select>
            </el-form-item>
        <el-form-item
          label="最终意见"
          prop="finaloption"
          v-if="hasQualityPermission"
        >
          <el-input
            v-model="processForm.finaloption"
            type="textarea"
            :rows="3"
            placeholder="请输入最终处理意见(最多300字)"
            maxlength="300"
            show-word-limit
          />
        </el-form-item>
      </el-form>
            <el-form-item label="处理说明" prop="handledesc">
              <el-input
                v-model="processForm.handledesc"
                type="textarea"
                :rows="4"
                placeholder="请输入处理说明(最多500字)"
                maxlength="500"
                show-word-limit
                :disabled="processForm.handleFlag !== '1'"
              />
            </el-form-item>
            <el-form-item
              label="最终意见"
              prop="finaloption"
              v-if="hasQualityPermission"
            >
              <el-input
                v-model="processForm.finaloption"
                type="textarea"
                :rows="3"
                placeholder="请输入最终处理意见(最多300字)"
                maxlength="300"
                show-word-limit
              />
            </el-form-item>
          </el-form>
        </div>
        <!-- å³åŠéƒ¨åˆ†ï¼šæµè½¬æ—¶é—´çº¿ï¼ˆé€‰ä¸­æµè½¬åŽå±•开) -->
        <div class="flow-right" v-if="processForm.isFlow === '1'">
          <el-timeline>
            <el-timeline-item type="primary" placement="top" color="#5788fe">
              <div class="flow-step-title">第一步 Â· æµè½¬å‘èµ·</div>
              <el-form label-width="90px" size="small" class="flow-step-form">
                <el-form-item label="流转人">
                  <el-input
                    v-model="processForm.flowPerson"
                    placeholder="流转人(默认当前用户)"
                  />
                </el-form-item>
                <el-form-item label="流转人编号">
                  <el-input
                    v-model="processForm.flowPersonCode"
                    placeholder="流转人编号(默认当前用户工号)"
                  />
                </el-form-item>
                <el-form-item label="流转时间">
                  <el-date-picker
                    v-model="processForm.flowTime"
                    type="datetime"
                    value-format="yyyy-MM-dd HH:mm:ss"
                    placeholder="流转时间"
                    style="width: 100%"
                  />
                </el-form-item>
                <el-form-item label="流转说明">
                  <el-input
                    v-model="processForm.flowDesc"
                    type="textarea"
                    :rows="2"
                    placeholder="请输入流转说明"
                  />
                </el-form-item>
                <el-form-item label="流转科室">
                  <el-select
                    v-model="processForm.flowDepts"
                    multiple
                    filterable
                    collapse-tags
                    placeholder="请选择流转科室"
                    style="width: 100%"
                    @change="onFlowDeptChange"
                  >
                    <el-option
                      v-for="dept in deptList"
                      :key="dept.deptCode"
                      :label="dept.label"
                      :value="dept.deptCode"
                    />
                  </el-select>
                </el-form-item>
                <el-form-item label="流转科室code">
                  <el-select
                    v-model="processForm.flowDeptCodes"
                    multiple
                    disabled
                    placeholder="选择科室后自动生成"
                    style="width: 100%"
                  >
                    <el-option
                      v-for="code in processForm.flowDeptCodes"
                      :key="code"
                      :label="code"
                      :value="code"
                    />
                  </el-select>
                </el-form-item>
                <el-form-item label="推送负责人">
                  <el-select
                    v-model="processForm.pushUsers"
                    multiple
                    filterable
                    collapse-tags
                    placeholder="请选择推送负责人"
                    style="width: 100%"
                    @change="onPushUserChange"
                  >
                    <el-option
                      v-for="u in userList"
                      :key="u.userId"
                      :label="u.nickName || u.userName"
                      :value="u.userId"
                    />
                  </el-select>
                </el-form-item>
              </el-form>
            </el-timeline-item>
            <el-timeline-item type="primary" placement="top" color="#e6a23c">
              <div class="flow-step-title">第二步 Â· ç§‘室反馈</div>
              <el-table
                :data="processForm.flowFeedbacks"
                border
                size="mini"
                v-if="processForm.flowFeedbacks.length > 0"
              >
                <el-table-column
                  label="科室"
                  prop="deptName"
                  width="120"
                  align="center"
                />
                <el-table-column label="是否同意" width="130" align="center">
                  <template slot-scope="scope">
                    <el-select
                      v-model="scope.row.agree"
                      placeholder="请选择"
                      size="mini"
                    >
                      <el-option label="同意" value="1" />
                      <el-option label="不同意" value="0" />
                    </el-select>
                  </template>
                </el-table-column>
                <el-table-column label="具体说明" min-width="200" align="center">
                  <template slot-scope="scope">
                    <el-input
                      v-model="scope.row.desc"
                      placeholder="请输入具体说明"
                      size="mini"
                    />
                  </template>
                </el-table-column>
              </el-table>
              <div v-else class="flow-empty-tip">
                è¯·å…ˆåœ¨ç¬¬ä¸€æ­¥é€‰æ‹©æµè½¬ç§‘室
              </div>
            </el-timeline-item>
            <el-timeline-item type="primary" placement="top" color="#67c23a">
              <div class="flow-step-title">第三步 Â· å¤„理结果</div>
              <el-form label-width="90px" size="small" class="flow-step-form">
                <el-form-item label="处理人">
                  <el-input
                    v-model="processForm.handleBy"
                    placeholder="处理人"
                  />
                </el-form-item>
                <el-form-item label="处理时间">
                  <el-date-picker
                    v-model="processForm.handleTime"
                    type="datetime"
                    value-format="yyyy-MM-dd HH:mm:ss"
                    placeholder="处理时间"
                    style="width: 100%"
                  />
                </el-form-item>
              </el-form>
            </el-timeline-item>
          </el-timeline>
        </div>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="processDialogVisible = false">取消</el-button>
        <el-button type="primary" @click="submitProcess" :loading="processing">
@@ -483,7 +653,7 @@
import DetailsAnomaly from "./components/DetailsAnomaly.vue";
import { tracelist, traceedit } from "@/api/AiCentre/index";
import dayjs from "dayjs";
import { deptTreeSelect } from "@/api/system/user";
import { deptTreeSelect, listUser } from "@/api/system/user";
export default {
  name: "BatchProcess",
@@ -527,6 +697,8 @@
      // ç§‘室列表
      deptList: [],
      // ç”¨æˆ·åˆ—表(流转负责人候选)
      userList: [],
      // å¼‚常列表数据
      exceptionList: [],
@@ -540,6 +712,21 @@
        handleresult: "",
        handledesc: "",
        finaloption: "",
        // æµè½¬ç›¸å…³
        isFlow: "0",
        flowPerson: "",
        flowPersonCode: "",
        flowTime: "",
        flowDesc: "",
        flowDepts: [],
        flowDeptNames: [],
        flowDeptCodes: [],
        pushUsers: [],
        pushUserNames: [],
        pushUserNos: [],
        flowFeedbacks: [],
        handleBy: "",
        handleTime: "",
      },
      batchProgress: {
        visible: false,
@@ -616,6 +803,7 @@
  mounted() {
    this.loadExceptionList();
    this.getDeptOptions();
    this.getUserOptions();
  },
  methods: {
@@ -648,6 +836,19 @@
        .catch((error) => {
          console.error("获取科室列表失败:", error);
          this.$message.error("获取科室列表失败");
        });
    },
    /** æŸ¥è¯¢ç”¨æˆ·åˆ—表(流转负责人候选) */
    getUserOptions() {
      listUser({ pageNum: 1, pageSize: 999 })
        .then((res) => {
          if (res.code == 200) {
            this.userList = res.rows || [];
          }
        })
        .catch((error) => {
          console.error("获取用户列表失败:", error);
          this.$message.error("获取用户列表失败");
        });
    },
    flattenArray(multiArray) {
@@ -870,22 +1071,212 @@
    handleProcess(row) {
      this.currentExceptionId = row.id;
      const nickName = this.$store.state.user.nickName || "";
      const now = dayjs().format("YYYY-MM-DD HH:mm:ss");
      // æ˜¯å¦æµè½¬ï¼ˆåŽç«¯ circulationStatus:0 ä¸æµè½¬ / 1 æµè½¬ï¼‰
      const isFlow = String(row.circulationStatus) === "1" ? "1" : "0";
      // æŠ¥å¤‡ç§‘室(兼容数组或逗号分隔字符串)
      const ccdepts = Array.isArray(row.ccdepts)
        ? row.ccdepts
        : row.ccdepts
        ? row.ccdepts.split(",")
        : [];
      // æµè½¬ç§‘室 code / åç§°
      const flowDeptCodes = row.circulationDeptCode
        ? row.circulationDeptCode.split(",")
        : [];
      const flowDeptNames = row.circulationDeptName
        ? row.circulationDeptName.split(",")
        : [];
      // æŽ¨é€è´Ÿè´£äººï¼šåŽç«¯å­˜å·¥å·(userName),下拉 value ç”¨ userId,需回映
      const pushUserNos = row.circulationDeptPersonCode
        ? row.circulationDeptPersonCode.split(",")
        : [];
      const pushUserNames = row.circulationDeptPersonName
        ? row.circulationDeptPersonName.split(",")
        : [];
      const pushUsers = pushUserNos.map((no) => {
        const u = this.userList.find((item) => item.userName === no);
        return u ? u.userId : no;
      });
      // ç§‘室反馈:从 handledesc JSON ä¸­è¿˜åŽŸ
      let flowFeedbacks = [];
      try {
        const parsed =
          typeof row.handledesc === "string" &&
          row.handledesc.trim().startsWith("{")
            ? JSON.parse(row.handledesc)
            : null;
        if (parsed && parsed.flow && Array.isArray(parsed.flow.feedbacks)) {
          flowFeedbacks = parsed.flow.feedbacks;
        }
      } catch (e) {
        // handledesc éž JSON,忽略
      }
      // æµè½¬æ—¶é—´ï¼šåŽç«¯ Date å­—段,统一转成 yyyy-MM-dd HH:mm:ss ä¾›æ—¥æœŸé€‰æ‹©å™¨å›žæ˜¾
      let flowTime = now;
      if (row.circulationTime) {
        const d = new Date(
          typeof row.circulationTime === "number"
            ? row.circulationTime
            : String(row.circulationTime).replace(" ", "T")
        );
        if (!isNaN(d.getTime())) {
          const pad = (n) => String(n).padStart(2, "0");
          flowTime =
            d.getFullYear() +
            "-" +
            pad(d.getMonth() + 1) +
            "-" +
            pad(d.getDate()) +
            " " +
            pad(d.getHours()) +
            ":" +
            pad(d.getMinutes()) +
            ":" +
            pad(d.getSeconds());
        }
      }
      // åˆå§‹åŒ–表单数据
      this.processForm = {
        handleFlag: row.handleFlag === "0" ? "1" : "0",
        ccdepts: row.ccdepts ? row.ccdepts.split(",") : [],
        handleFlag: "1",
        ccdepts,
        handleresult: row.handleresult || "",
        handledesc: row.handledesc || "",
        handledesc: this.formatHandledesc(row.handledesc),
        finaloption: row.finaloption || "",
        // æµè½¬ç›¸å…³
        isFlow,
        flowPerson: row.circulationPersonName || nickName,
        flowPersonCode:
          row.circulationPersonCode || this.$store.state.user.userName || "",
        flowTime,
        flowDesc: row.circulationExplain || "",
        flowDepts: [...flowDeptCodes],
        flowDeptNames: [...flowDeptNames],
        flowDeptCodes: [...flowDeptCodes],
        pushUsers,
        pushUserNames: [...pushUserNames],
        pushUserNos: [...pushUserNos],
        flowFeedbacks,
        handleBy: nickName,
        handleTime: now,
      };
      this.processDialogVisible = true;
    },
    // æµè½¬ç§‘室变化:同步科室名称、科室code,并生成反馈表格
    onFlowDeptChange(codes) {
      this.processForm.flowDeptCodes = [...codes];
      this.processForm.flowDeptNames = codes.map((code) => {
        const dept = this.deptList.find((item) => item.deptCode === code);
        return dept ? dept.label : code;
      });
      // ç”Ÿæˆ/维护第二步反馈表格(保留已填写的反馈)
      this.processForm.flowFeedbacks = codes.map((code) => {
        const existing = this.processForm.flowFeedbacks.find(
          (item) => item.deptCode === code
        );
        if (existing) return existing;
        const dept = this.deptList.find((item) => item.deptCode === code);
        return {
          deptCode: code,
          deptName: dept ? dept.label : code,
          agree: "",
          desc: "",
        };
      });
    },
    // æŽ¨é€è´Ÿè´£äººå˜åŒ–:同步负责人昵称、工号
    onPushUserChange(ids) {
      this.processForm.pushUserNames = ids.map((id) => {
        const user = this.userList.find((u) => String(u.userId) === String(id));
        return user ? user.nickName || user.userName : "";
      });
      this.processForm.pushUserNos = ids.map((id) => {
        const user = this.userList.find((u) => String(u.userId) === String(id));
        return user ? user.userName || "" : "";
      });
    },
    // ç»„装 handledesc:流转时以 JSON å½¢å¼ä¿å­˜åŽŸå¤„ç†è¯´æ˜Žä¸Žæµè½¬è¯´æ˜Žã€ç§‘å®¤åé¦ˆ
    buildHandledesc() {
      if (this.processForm.isFlow !== "1") {
        return this.processForm.handledesc;
      }
      const flow = {
        feedbacks: this.processForm.flowFeedbacks.map((f) => ({
          deptCode: f.deptCode,
          deptName: f.deptName,
          agree: f.agree,
          desc: f.desc,
        })),
      };
      return JSON.stringify({
        desc: this.processForm.handledesc,
        flow,
      });
    },
    // è§£æž handledesc:若是流转 JSON åˆ™å–其中的处理说明,否则原样返回
    formatHandledesc(val) {
      if (!val) return "";
      if (typeof val !== "string") return val;
      const trimmed = val.trim();
      if (trimmed.startsWith("{")) {
        try {
          const obj = JSON.parse(trimmed);
          if (obj && obj.desc != null) return obj.desc;
        } catch (e) {
          // ä¸æ˜¯åˆæ³• JSON,按原文本返回
        }
      }
      return val;
    },
    // æµè½¬æ—¶é—´è½¬ä¸ºå¸¦æ—¶åŒºçš„ ISO æ ¼å¼ï¼Œä¾›åŽç«¯ Date ç±»åž‹å­—段反序列化
    toISODateTime(str) {
      if (!str) return null;
      const d = new Date(String(str).replace(" ", "T"));
      if (isNaN(d.getTime())) return null;
      const pad = (n) => String(n).padStart(2, "0");
      const offset = -d.getTimezoneOffset();
      const sign = offset >= 0 ? "+" : "-";
      const abs = Math.abs(offset);
      const tz = sign + pad(Math.floor(abs / 60)) + ":" + pad(abs % 60);
      return (
        d.getFullYear() +
        "-" + pad(d.getMonth() + 1) +
        "-" + pad(d.getDate()) +
        "T" + pad(d.getHours()) +
        ":" + pad(d.getMinutes()) +
        ":" + pad(d.getSeconds()) +
        "." + String(d.getMilliseconds()).padStart(3, "0") +
        tz
      );
    },
    // æäº¤å¤„理
    async submitProcess() {
      this.$refs.processForm.validate(async (valid) => {
        if (!valid) {
          return;
        }
        // æµè½¬æ—¶æ ¡éªŒå¿…须选择流转科室
        if (
          this.processForm.isFlow === "1" &&
          (!this.processForm.flowDepts || this.processForm.flowDepts.length === 0)
        ) {
          this.$message.warning("请先选择流转科室");
          return;
        }
@@ -897,14 +1288,30 @@
            id: this.currentExceptionId,
            handleFlag: this.processForm.handleFlag,
            handleresult: this.processForm.handleresult,
            handledesc: this.processForm.handledesc,
            handledesc: this.buildHandledesc(),
            finaloption: this.processForm.finaloption,
            handleBy: this.$store.state.user.nickName,
            handleTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
            handleBy:
              this.processForm.handleBy || this.$store.state.user.nickName,
            handleTime:
              this.processForm.handleTime ||
              dayjs().format("YYYY-MM-DD HH:mm:ss"),
            // å°†æ•°ç»„转换为逗号分隔的字符串
            ccdepts: Array.isArray(this.processForm.ccdepts)
              ? this.processForm.ccdepts.join(",")
              : this.processForm.ccdepts,
            // æµè½¬ç›¸å…³ä¸»è¡¨å­—段(后端已定稿)
            circulationPersonName: this.processForm.flowPerson,
            circulationPersonCode:
              this.processForm.flowPersonCode ||
              this.$store.state.user.userName ||
              "",
            circulationStatus: this.processForm.isFlow,
            circulationDeptName: this.processForm.flowDeptNames.join(","),
            circulationDeptCode: this.processForm.flowDeptCodes.join(","),
            circulationDeptPersonName: this.processForm.pushUserNames.join(","),
            circulationDeptPersonCode: this.processForm.pushUserNos.join(","),
            circulationExplain: this.processForm.flowDesc,
            circulationTime: this.toISODateTime(this.processForm.flowTime),
          };
          // TODO: è¿™é‡Œéœ€è¦è°ƒç”¨å®žé™…的处理接口
          await traceedit(submitData);
@@ -1227,6 +1634,47 @@
  }
}
// å¤„理弹框左右布局
.flow-dialog-body {
  display: flex;
  align-items: stretch;
  .flow-left {
    flex: 1;
    min-width: 320px;
    padding-right: 24px;
    border-right: 1px solid #ebeef5;
  }
  .flow-right {
    flex: 1;
    min-width: 320px;
    padding-left: 24px;
    max-height: 60vh;
    overflow-y: auto;
    .flow-step-title {
      font-weight: 600;
      color: #303133;
      margin-bottom: 12px;
      font-size: 14px;
    }
    .flow-step-form {
      ::v-deep .el-form-item {
        margin-bottom: 12px;
      }
    }
    .flow-empty-tip {
      padding: 20px;
      text-align: center;
      color: #909399;
      font-size: 13px;
    }
  }
}
@media (max-width: 768px) {
  .batch-process {
    padding: 10px;
src/views/Satisfaction/configurationmyd/components/DetailsAnomaly.vue
@@ -114,7 +114,12 @@
    </div>
    <!-- é—®å·/语音详情 -->
    <div class="content-container" v-if="templateData.length > 0">
    <div
      class="content-container"
      v-if="currentRecord.templateType"
      v-loading="contentLoading"
      element-loading-text="详情加载中..."
    >
      <el-tabs v-model="activeName" type="border-card">
        <!-- é—®å·éšè®¿è¯¦æƒ… -->
        <el-tab-pane name="wj" v-if="currentRecord.templateType === 2">
@@ -529,6 +534,8 @@
      // åŠ è½½çŠ¶æ€
      loading: false,
      // é—®å·/语音详情加载状态
      contentLoading: false,
      // æƒé™æŽ§åˆ¶
      hasQualityPermission: false
@@ -737,6 +744,7 @@
    // åŠ è½½é—®å·æ•°æ®
    async loadQuestionnaireData() {
      this.contentLoading = true;
      try {
        // è¿™é‡Œéœ€è¦æ ¹æ®å®žé™…情况调用接口获取问卷数据
        // å¦‚æžœrecordData中已经包含了问卷数据,可以直接使用
@@ -770,6 +778,8 @@
        }
      } catch (error) {
        console.error('加载问卷数据失败:', error);
      } finally {
        this.contentLoading = false;
      }
    },
@@ -788,6 +798,7 @@
    // åŠ è½½è¯­éŸ³æ•°æ®
    async loadVoiceData() {
      this.contentLoading = true;
      try {
        if (this.currentRecord.taskid && this.currentRecord.patid) {
          const params = {
@@ -814,6 +825,8 @@
        }
      } catch (error) {
        console.error('加载语音数据失败:', error);
      } finally {
        this.contentLoading = false;
      }
    },
src/views/followvisit/Continue/index.vue
@@ -1073,8 +1073,8 @@
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      Labelchange: false,
      ycvalue: "",
      jgvalue: "",
      ycvalue: 0,
      jgvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
@@ -2031,8 +2031,8 @@
<style lang="scss" scoped>
.el-button--primary.is-plain {
  color: #ffffff;
  background: #409eff;
  border-color: #4fabe9;
  background: #5b7cfa;
  border-color: #5b7cfa;
}
.document {
@@ -2234,4 +2234,75 @@
  flex-shrink: 0;
  margin-top: 2px;
}
/* ================= æ¸…新高级简约风 ================= */
.app-container {
  background: #f5f7fb;
  border-radius: 14px;
  padding: 20px;
}
/* æŸ¥è¯¢è¡¨å•:白色圆角卡片 */
::v-deep .el-form--inline {
  background: #ffffff;
  border-radius: 14px;
  padding: 22px 22px 8px;
  margin-bottom: 18px;
  box-shadow: 0 2px 12px rgba(31, 45, 61, 0.05);
}
/* éšè—åˆ†å‰²çº¿ */
::v-deep .el-divider {
  display: none;
}
/* å·¥å…·æ åº•部间距 */
.mb8 {
  margin-bottom: 18px;
}
/* æŒ‰é’®ï¼šåœ†è§’ + æŸ”和过渡 */
::v-deep .el-button {
  border-radius: 8px;
  font-weight: 500;
  transition: all 0.25s ease;
}
/* ä¸»æŒ‰é’®ï¼šæ¸…新靛蓝 */
::v-deep .el-button--primary:not(.is-plain) {
  background: #5b7cfa;
  border-color: #5b7cfa;
}
::v-deep .el-button--primary:not(.is-plain):hover,
::v-deep .el-button--primary:not(.is-plain):focus {
  background: #7593fb;
  border-color: #7593fb;
}
/* è¡¨æ ¼ï¼šç™½è‰²åœ†è§’卡片 + æŸ”和表头 */
::v-deep .el-table {
  border-radius: 14px;
  overflow: hidden;
  box-shadow: 0 2px 12px rgba(31, 45, 61, 0.05);
}
::v-deep .el-table::before {
  display: none;
}
::v-deep .el-table th {
  background: #f7f9fd !important;
  color: #3f4d63;
  font-weight: 600;
}
::v-deep .el-table td {
  padding: 12px 0;
}
/* æ ‡ç­¾åœ†è§’ */
::v-deep .el-tag {
  border-radius: 6px;
}
/* åˆ†é¡µé—´è· */
::v-deep .pagination-container {
  padding-top: 18px;
}
</style>
src/views/followvisit/HistoricalFollow/index.vue
@@ -605,7 +605,7 @@
      zcform: {},
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      ycvalue: "",
      ycvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
src/views/followvisit/OutpatientAgain/index.vue
@@ -876,7 +876,7 @@
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      Labelchange: false,
      ycvalue: "",
      ycvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
@@ -891,6 +891,7 @@
      },
      value: [],
      list: [],
      jgvalue: 0,
      sourcetype: [
        {
src/views/followvisit/SpecificDisease/index.vue
@@ -785,7 +785,7 @@
      zcform: {},
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      ycvalue: "",
      ycvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
src/views/followvisit/Tracking/index.vue
@@ -870,7 +870,7 @@
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      Labelchange: false,
      ycvalue: "",
      ycvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
src/views/followvisit/again/index.vue
@@ -880,7 +880,7 @@
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      Labelchange: false,
      ycvalue: "",
      ycvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
@@ -1113,6 +1113,7 @@
      },
      amendtag: false,
      errtype: "",
      jgvalue: 0,
      leavehospitaldistrictcode: "",
      serviceState: [],
      checkboxlist: [],
src/views/followvisit/beHospitalized/followUp.vue
@@ -1229,8 +1229,8 @@
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      Labelchange: false,
      ycvalue: "",
      jgvalue: "",
      ycvalue: 0,
      jgvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
src/views/followvisit/complaint/index.vue
@@ -950,6 +950,8 @@
      ids: [],
      // éžå•个禁用
      single: true,
      jgvalue: 0,
      // éžå¤šä¸ªç¦ç”¨
      multiple: true,
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
@@ -1015,7 +1017,7 @@
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      Labelchange: false,
      ycvalue: "",
      ycvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
src/views/followvisit/discharge/index copy.vue
@@ -799,7 +799,7 @@
      inputVisible: false,
      Labelchange: false,
      ycvalue: 0,
      jgvalue: "",
      jgvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
src/views/followvisit/discharge/index.vue
@@ -311,7 +311,55 @@
          :show-overflow-tooltip="true"
        >
        </el-table-column>
        <el-table-column
          v-if="orgname == '浙江省新华医院'"
          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>
              <div v-if="scope.row.sendstate == 7">
                <el-tag type="danger" :disable-transitions="false">超时</el-tag>
              </div>
            </el-tooltip>
          </template>
        </el-table-column>
        <el-table-column
          label="随访状态"
          align="center"
@@ -460,6 +508,7 @@
          width="120"
        />
        <el-table-column
          v-if="orgname != '浙江省新华医院'"
          label="任务状态"
          align="center"
          key="sendstate"
@@ -1124,7 +1173,7 @@
      inputVisible: false,
      Labelchange: false,
      ycvalue: 0,
      jgvalue: "",
      jgvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
@@ -1295,7 +1344,8 @@
        visitCount: 1,
        scopetype: [],
        managementDoctor:
          localStorage.getItem("orgname") == "缙云县人民医院"||localStorage.getItem("orgname") == "丽水市中医院"
          localStorage.getItem("orgname") == "缙云县人民医院" ||
          localStorage.getItem("orgname") == "丽水市中医院"
            ? store.getters.nickName
            : "",
        leaveldeptcodes: [],
@@ -1836,16 +1886,12 @@
      if (hasDept && hasWard) {
        if (this.lastScopeType == 1) {
          // ä¸Šæ¬¡é€‰äº†ç§‘室,这次新增病区 â†’ ä¿ç•™ç—…区
          this.topqueryParams.scopetype = value.filter(
            (item) => item[0] === 2
          );
          this.topqueryParams.scopetype = value.filter((item) => item[0] === 2);
          this.lastScopeType = 2;
          this.$message.warning("科室和病区不能同时选择,已切换为病区");
        } else {
          // ä¸Šæ¬¡é€‰äº†ç—…区,这次新增科室 â†’ ä¿ç•™ç§‘室
          this.topqueryParams.scopetype = value.filter(
            (item) => item[0] === 1
          );
          this.topqueryParams.scopetype = value.filter((item) => item[0] === 1);
          this.lastScopeType = 1;
          this.$message.warning("科室和病区不能同时选择,已切换为科室");
        }
@@ -2413,21 +2459,27 @@
      if (val && val.length) {
        this.transferForm.leavelDeptCode = val[val.length - 1];
        // ä»Žé€‰é¡¹æ ‘中查找对应名称
        const node = this.findCascaderNode(this.deptOptionsks, this.transferForm.leavelDeptCode);
        this.transferForm.leavelDeptName = node ? node.label : '';
        const node = this.findCascaderNode(
          this.deptOptionsks,
          this.transferForm.leavelDeptCode
        );
        this.transferForm.leavelDeptName = node ? node.label : "";
      } else {
        this.transferForm.leavelDeptCode = '';
        this.transferForm.leavelDeptName = '';
        this.transferForm.leavelDeptCode = "";
        this.transferForm.leavelDeptName = "";
      }
    },
    handleWardCascaderChange(val) {
      if (val && val.length) {
        this.transferForm.leavehospitaldistrictcode = val[val.length - 1];
        const node = this.findCascaderNode(this.deptOptionsbq, this.transferForm.leavehospitaldistrictcode);
        this.transferForm.leavehospitaldistrictname = node ? node.label : '';
        const node = this.findCascaderNode(
          this.deptOptionsbq,
          this.transferForm.leavehospitaldistrictcode
        );
        this.transferForm.leavehospitaldistrictname = node ? node.label : "";
      } else {
        this.transferForm.leavehospitaldistrictcode = '';
        this.transferForm.leavehospitaldistrictname = '';
        this.transferForm.leavehospitaldistrictcode = "";
        this.transferForm.leavehospitaldistrictname = "";
      }
    },
    findCascaderNode(options, code) {
@@ -2483,8 +2535,8 @@
<style lang="scss" scoped>
.el-button--primary.is-plain {
  color: #ffffff;
  background: #409eff;
  border-color: #4fabe9;
  background: #5b7cfa;
  border-color: #5b7cfa;
}
.document {
@@ -2717,4 +2769,75 @@
  font-size: 14px;
  color: #666;
}
/* ================= æ¸…新高级简约风 ================= */
.app-container {
  background: #f5f7fb;
  border-radius: 14px;
  padding: 20px;
}
/* æŸ¥è¯¢è¡¨å•:白色圆角卡片 */
::v-deep .el-form--inline {
  background: #ffffff;
  border-radius: 14px;
  padding: 22px 22px 8px;
  margin-bottom: 18px;
  box-shadow: 0 2px 12px rgba(31, 45, 61, 0.05);
}
/* éšè—åˆ†å‰²çº¿ */
::v-deep .el-divider {
  display: none;
}
/* å·¥å…·æ åº•部间距 */
.mb8 {
  margin-bottom: 18px;
}
/* æŒ‰é’®ï¼šåœ†è§’ + æŸ”和过渡 */
::v-deep .el-button {
  border-radius: 8px;
  font-weight: 500;
  transition: all 0.25s ease;
}
/* ä¸»æŒ‰é’®ï¼šæ¸…新靛蓝 */
::v-deep .el-button--primary:not(.is-plain) {
  background: #5b7cfa;
  border-color: #5b7cfa;
}
::v-deep .el-button--primary:not(.is-plain):hover,
::v-deep .el-button--primary:not(.is-plain):focus {
  background: #7593fb;
  border-color: #7593fb;
}
/* è¡¨æ ¼ï¼šç™½è‰²åœ†è§’卡片 + æŸ”和表头 */
::v-deep .el-table {
  border-radius: 14px;
  overflow: hidden;
  box-shadow: 0 2px 12px rgba(31, 45, 61, 0.05);
}
::v-deep .el-table::before {
  display: none;
}
::v-deep .el-table th {
  background: #f7f9fd !important;
  color: #3f4d63;
  font-weight: 600;
}
::v-deep .el-table td {
  padding: 12px 0;
}
/* æ ‡ç­¾åœ†è§’ */
::v-deep .el-tag {
  border-radius: 6px;
}
/* åˆ†é¡µé—´è· */
::v-deep .pagination-container {
  padding-top: 18px;
}
</style>
src/views/followvisit/discharge/index.vue.bak
@@ -1190,7 +1190,7 @@
      inputVisible: false,
      Labelchange: false,
      ycvalue: 0,
      jgvalue: "",
      jgvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
src/views/followvisit/discharge/outpatientService.vue
@@ -64,6 +64,12 @@
            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="status">
          <el-cascader
@@ -842,6 +848,8 @@
      total: 0,
      // ç”¨æˆ·è¡¨æ ¼æ•°æ®
      userList: null,
      jgvalue: 0,
      // å¼¹å‡ºå±‚标题
      title: "新增影像随访",
      // æ˜¯å¦æ˜¾ç¤ºä¿®æ”¹ã€æ·»åŠ å¼¹å‡ºå±‚
@@ -864,7 +872,7 @@
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      Labelchange: false,
      ycvalue: "",
      ycvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
@@ -1732,8 +1740,8 @@
<style lang="scss" scoped>
.el-button--primary.is-plain {
  color: #ffffff;
  background: #409eff;
  border-color: #4fabe9;
  background: #5b7cfa;
  border-color: #5b7cfa;
}
.document {
@@ -1908,4 +1916,75 @@
  flex-shrink: 0;
  margin-top: 2px;
}
/* ================= æ¸…新高级简约风 ================= */
.app-container {
  background: #f5f7fb;
  border-radius: 14px;
  padding: 20px;
}
/* æŸ¥è¯¢è¡¨å•:白色圆角卡片 */
::v-deep .el-form--inline {
  background: #ffffff;
  border-radius: 14px;
  padding: 22px 22px 8px;
  margin-bottom: 18px;
  box-shadow: 0 2px 12px rgba(31, 45, 61, 0.05);
}
/* éšè—åˆ†å‰²çº¿ */
::v-deep .el-divider {
  display: none;
}
/* å·¥å…·æ åº•部间距 */
.mb8 {
  margin-bottom: 18px;
}
/* æŒ‰é’®ï¼šåœ†è§’ + æŸ”和过渡 */
::v-deep .el-button {
  border-radius: 8px;
  font-weight: 500;
  transition: all 0.25s ease;
}
/* ä¸»æŒ‰é’®ï¼šæ¸…新靛蓝 */
::v-deep .el-button--primary:not(.is-plain) {
  background: #5b7cfa;
  border-color: #5b7cfa;
}
::v-deep .el-button--primary:not(.is-plain):hover,
::v-deep .el-button--primary:not(.is-plain):focus {
  background: #7593fb;
  border-color: #7593fb;
}
/* è¡¨æ ¼ï¼šç™½è‰²åœ†è§’卡片 + æŸ”和表头 */
::v-deep .el-table {
  border-radius: 14px;
  overflow: hidden;
  box-shadow: 0 2px 12px rgba(31, 45, 61, 0.05);
}
::v-deep .el-table::before {
  display: none;
}
::v-deep .el-table th {
  background: #f7f9fd !important;
  color: #3f4d63;
  font-weight: 600;
}
::v-deep .el-table td {
  padding: 12px 0;
}
/* æ ‡ç­¾åœ†è§’ */
::v-deep .el-tag {
  border-radius: 6px;
}
/* åˆ†é¡µé—´è· */
::v-deep .pagination-container {
  padding-top: 18px;
}
</style>
src/views/followvisit/mzsatisfaction/index.vue
@@ -2,9 +2,8 @@
  <div class="app-container">
    <statistics-cards
      :cardlist="cardlist"
      :ycvalue="ycvalue"
      :jgvalue="jgvalue"
      :show-warning-condition="orgname == '省立同德翠苑院区'"
      :show-extra="false"
      :show-warning-condition="false"
    />
    <el-row :gutter="20">
      <!--用户数据-->
@@ -16,13 +15,6 @@
        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"
@@ -41,31 +33,18 @@
            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-form-item label="处理人员" prop="updateBy">
          <el-input
            v-model="topqueryParams.updateBy"
            placeholder="请输入随访人员"
            placeholder="请输入处理人员"
          ></el-input>
        </el-form-item>
        <el-form-item label="主治医生" prop="drname">
        <el-form-item label="接诊医生" prop="drname">
          <el-input
            v-model="topqueryParams.drname"
            placeholder="请输入主治医生"
            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"
@@ -92,7 +71,7 @@
            </el-option>
          </el-select>
        </el-form-item> -->
        <el-form-item label="随访状态" prop="status">
        <el-form-item label="处理状态" prop="status">
          <el-cascader
            v-model="serviceStatusValue"
            placeholder="请选择"
@@ -225,15 +204,6 @@
        @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="姓名"
@@ -261,7 +231,7 @@
          </template>
        </el-table-column>
        <el-table-column
          label="随访状态"
          label="处理状态"
          align="center"
          key="sendstateView"
          prop="sendstateView"
@@ -338,20 +308,13 @@
          </template></el-table-column
        >
        <el-table-column
          label="主治医生"
          label="接诊医生"
          width="120"
          align="center"
          key="drname"
          prop="drname"
        />
        <el-table-column
          label="经管医生"
          align="center"
          key="managementDoctor"
          prop="managementDoctor"
          width="120"
        />
        <el-table-column
          label="出院天数"
          width="120"
@@ -415,16 +378,7 @@
        </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="随访人员"
          label="处理人员"
          align="center"
          key="updateBy"
          prop="updateBy"
@@ -1001,6 +955,8 @@
      multiple: true,
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      jgvalue: 0,
      dialogFormVisible: false,
      // æ€»æ¡æ•°
      total: 0,
@@ -1028,7 +984,7 @@
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      Labelchange: false,
      ycvalue: "",
      ycvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
@@ -1097,25 +1053,24 @@
      loading: false,
      cardlist: [
        {
          name: "患者服务总量",
          value: 0,
        },
        {
          name: "无需随访",
          name: "门诊总量",
          value: 0,
        },
        {
          name: "需随访",
          name: "发送任务量",
          value: 0,
        },
        {
          name: "待随访",
          name: "待完成",
          value: 0,
        },
        {
          name: "已完成",
          value: 0,
        },
        {
          name: "完成率",
          value: "0%",
        },
      ],
      zcrules: {
@@ -1258,6 +1213,8 @@
          },
        },
      },
      orgname: "",
      amendtag: false,
      errtype: "",
      leavehospitaldistrictcode: "",
@@ -1272,6 +1229,8 @@
    this.serviceState = store.getters.serviceState;
    this.checkboxlist = store.getters.checkboxlist;
    this.errtype = this.$route.query.errtype;
    this.orgname = localStorage.getItem("orgname");
    this.leavehospitaldistrictcode =
      this.$route.query.leavehospitaldistrictcode;
    this.sourcetype[0].children = store.getters.belongDepts.map((dept) => {
@@ -1335,14 +1294,19 @@
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
        if (refresh) {
          this.cardlist[0].value =
          // é—¨è¯Šæ€»é‡ï¼šæš‚无字段,保持 0
          // å‘送任务量 = æ‚£è€…服务总量(无需随访 + éœ€éšè®¿ï¼‰
          this.cardlist[1].value =
            Number(response.rows[0].wxsf) + Number(response.rows[0].xsf) || 0;
          // this.cardlist[1].value = response.rows[0].wzx;
          this.cardlist[1].value = response.rows[0].wxsf || 0;
          this.ycvalue = response.rows[0].yc;
          this.cardlist[2].value = response.rows[0].xsf || 0;
          this.cardlist[3].value = response.rows[0].dsf || 0;
          this.cardlist[4].value = response.rows[0].ywc || 0;
          this.cardlist[2].value = response.rows[0].dsf || 0; // å¾…完成 = å¾…随访
          this.cardlist[3].value = response.rows[0].ywc || 0; // å·²å®Œæˆ = å·²éšè®¿
          // å®Œæˆçއ = å·²å®Œæˆ / (待完成 + å·²å®Œæˆ)
          const dsf = Number(response.rows[0].dsf) || 0;
          const ywc = Number(response.rows[0].ywc) || 0;
          const doneTotal = dsf + ywc;
          this.cardlist[4].value =
            doneTotal > 0 ? ((ywc / doneTotal) * 100).toFixed(2) + "%" : "0%";
          this.yfsvalue = response.rows[0].yfs;
        }
        this.loading = false;
@@ -1496,7 +1460,7 @@
        this.options = [];
      }
    },
    // å½±åƒéšè®¿çŠ¶æ€ä¿®æ”¹
    // å½±åƒå¤„理状态修改
    handleStatusChange(row) {
      let text = row.status === "0" ? "启用" : "停用";
      this.$modal
@@ -1883,8 +1847,8 @@
<style lang="scss" scoped>
.el-button--primary.is-plain {
  color: #ffffff;
  background: #409eff;
  border-color: #4fabe9;
  background: #5b7cfa;
  border-color: #5b7cfa;
}
.document {
@@ -2077,4 +2041,75 @@
  flex-shrink: 0;
  margin-top: 2px;
}
/* ================= æ¸…新高级简约风 ================= */
.app-container {
  background: #f5f7fb;
  border-radius: 14px;
  padding: 20px;
}
/* æŸ¥è¯¢è¡¨å•:白色圆角卡片 */
::v-deep .el-form--inline {
  background: #ffffff;
  border-radius: 14px;
  padding: 22px 22px 8px;
  margin-bottom: 18px;
  box-shadow: 0 2px 12px rgba(31, 45, 61, 0.05);
}
/* éšè—åˆ†å‰²çº¿ */
::v-deep .el-divider {
  display: none;
}
/* å·¥å…·æ åº•部间距 */
.mb8 {
  margin-bottom: 18px;
}
/* æŒ‰é’®ï¼šåœ†è§’ + æŸ”和过渡 */
::v-deep .el-button {
  border-radius: 8px;
  font-weight: 500;
  transition: all 0.25s ease;
}
/* ä¸»æŒ‰é’®ï¼šæ¸…新靛蓝 */
::v-deep .el-button--primary:not(.is-plain) {
  background: #5b7cfa;
  border-color: #5b7cfa;
}
::v-deep .el-button--primary:not(.is-plain):hover,
::v-deep .el-button--primary:not(.is-plain):focus {
  background: #7593fb;
  border-color: #7593fb;
}
/* è¡¨æ ¼ï¼šç™½è‰²åœ†è§’卡片 + æŸ”和表头 */
::v-deep .el-table {
  border-radius: 14px;
  overflow: hidden;
  box-shadow: 0 2px 12px rgba(31, 45, 61, 0.05);
}
::v-deep .el-table::before {
  display: none;
}
::v-deep .el-table th {
  background: #f7f9fd !important;
  color: #3f4d63;
  font-weight: 600;
}
::v-deep .el-table td {
  padding: 12px 0;
}
/* æ ‡ç­¾åœ†è§’ */
::v-deep .el-tag {
  border-radius: 6px;
}
/* åˆ†é¡µé—´è· */
::v-deep .pagination-container {
  padding-top: 18px;
}
</style>
src/views/followvisit/operation/index.vue
@@ -1165,6 +1165,8 @@
      dialogFormVisible: false,
      // æ€»æ¡æ•°
      total: 0,
      jgvalue: 0,
      // ç”¨æˆ·è¡¨æ ¼æ•°æ®
      userList: null,
      // å¼¹å‡ºå±‚标题
@@ -1189,8 +1191,8 @@
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      Labelchange: false,
      ycvalue: "",
      jgvalue: "",
      ycvalue: 0,
      jgvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
src/views/followvisit/outpatient/index.vue
@@ -659,6 +659,9 @@
      single: true,
      // éžå¤šä¸ªç¦ç”¨
      multiple: true,
      jgvalue: 0,
      orgname: "",
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      // æ€»æ¡æ•°
@@ -684,7 +687,7 @@
      },
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      ycvalue: "",
      ycvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
@@ -846,6 +849,8 @@
    this.serviceState = store.getters.serviceState;
    this.checkboxlist = store.getters.checkboxlist;
    this.errtype = this.$route.query.errtype;
    this.orgname = localStorage.getItem("orgname");
    this.leavehospitaldistrictcode =
      this.$route.query.leavehospitaldistrictcode;
    this.sourcetype[0].children = store.getters.belongDepts.map((dept) => {
src/views/followvisit/record/detailpage/index.vue
@@ -337,6 +337,7 @@
              (orgname == '南华大学附属第一医院' ||
                orgname == '丽水市第二人民医院' ||
                orgname == '缙云县人民医院'||
                orgname == '丽水市妇幼保健院'||
                orgname == '松阳县中医医院') &&
              !Voicetype
            "
src/views/followvisit/record/index.vue
@@ -783,6 +783,8 @@
      single: true,
      // éžå¤šä¸ªç¦ç”¨
      multiple: true,
      jgvalue: 0,
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      dialogFormVisible: false,
@@ -843,7 +845,7 @@
      zcform: {},
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      ycvalue: "",
      ycvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
src/views/followvisit/technology/index.vue
@@ -719,6 +719,8 @@
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      dialogFormVisible: false,
      jgvalue: 0,
      // æ€»æ¡æ•°
      total: 0,
      // ç”¨æˆ·è¡¨æ ¼æ•°æ®
@@ -743,7 +745,7 @@
      zcform: {},
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      ycvalue: "",
      ycvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
src/views/followvisit/zbAgain/index.vue
@@ -839,6 +839,8 @@
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      dialogFormVisible: false,
      jgvalue: 0,
      // æ€»æ¡æ•°
      total: 0,
      // ç”¨æˆ·è¡¨æ ¼æ•°æ®
@@ -865,7 +867,7 @@
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      Labelchange: false,
      ycvalue: "",
      ycvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
src/views/followvisit/zysatisfaction/index.vue
@@ -2,9 +2,8 @@
  <div class="app-container">
    <statistics-cards
      :cardlist="cardlist"
      :ycvalue="ycvalue"
      :jgvalue="jgvalue"
      :show-warning-condition="orgname == '省立同德翠苑院区'"
      :show-extra="false"
      :show-warning-condition="false"
    />
    <el-row :gutter="20">
      <!--用户数据-->
@@ -16,13 +15,6 @@
        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"
@@ -41,31 +33,18 @@
            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-form-item label="处理人员" prop="updateBy">
          <el-input
            v-model="topqueryParams.updateBy"
            placeholder="请输入随访人员"
            placeholder="请输入处理人员"
          ></el-input>
        </el-form-item>
        <el-form-item label="主治医生" prop="drname">
        <el-form-item label="接诊医生" prop="drname">
          <el-input
            v-model="topqueryParams.drname"
            placeholder="请输入主治医生"
            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"
@@ -92,7 +71,7 @@
            </el-option>
          </el-select>
        </el-form-item> -->
        <el-form-item label="随访状态" prop="status">
        <el-form-item label="处理状态" prop="status">
          <el-cascader
            v-model="serviceStatusValue"
            placeholder="请选择"
@@ -225,15 +204,6 @@
        @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="姓名"
@@ -261,7 +231,7 @@
          </template>
        </el-table-column>
        <el-table-column
          label="随访状态"
          label="处理状态"
          align="center"
          key="sendstateView"
          prop="sendstateView"
@@ -338,20 +308,13 @@
          </template></el-table-column
        >
        <el-table-column
          label="主治医生"
          label="接诊医生"
          width="120"
          align="center"
          key="drname"
          prop="drname"
        />
        <el-table-column
          label="经管医生"
          align="center"
          key="managementDoctor"
          prop="managementDoctor"
          width="120"
        />
        <el-table-column
          label="出院天数"
          width="120"
@@ -415,16 +378,7 @@
        </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="随访人员"
          label="处理人员"
          align="center"
          key="updateBy"
          prop="updateBy"
@@ -959,6 +913,8 @@
      ids: [],
      // éžå•个禁用
      single: true,
      jgvalue: 0,
      // éžå¤šä¸ªç¦ç”¨
      multiple: true,
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
@@ -989,7 +945,7 @@
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      Labelchange: false,
      ycvalue: "",
      ycvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
@@ -1024,25 +980,24 @@
      loading: false,
      cardlist: [
        {
          name: "患者服务总量",
          value: 0,
        },
        {
          name: "无需随访",
          name: "住院总量",
          value: 0,
        },
        {
          name: "需随访",
          name: "发送任务量",
          value: 0,
        },
        {
          name: "待随访",
          name: "待完成",
          value: 0,
        },
        {
          name: "已完成",
          value: 0,
        },
        {
          name: "完成率",
          value: "0%",
        },
      ],
      // çº§è”选择器绑定值
@@ -1221,6 +1176,8 @@
          },
        },
      },
      orgname: "",
      amendtag: false,
      errtype: "",
      leavehospitaldistrictcode: "",
@@ -1235,6 +1192,8 @@
    this.serviceState = store.getters.serviceState;
    this.checkboxlist = store.getters.checkboxlist;
    this.errtype = this.$route.query.errtype;
    this.orgname = localStorage.getItem("orgname");
    this.leavehospitaldistrictcode =
      this.$route.query.leavehospitaldistrictcode;
    this.sourcetype[0].children = store.getters.belongDepts.map((dept) => {
@@ -1298,14 +1257,19 @@
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
        if (refresh) {
          this.cardlist[0].value =
          // ä½é™¢æ€»é‡ï¼šæš‚无字段,保持 0
          // å‘送任务量 = æ‚£è€…服务总量(无需随访 + éœ€éšè®¿ï¼‰
          this.cardlist[1].value =
            Number(response.rows[0].wxsf) + Number(response.rows[0].xsf) || 0;
          // this.cardlist[1].value = response.rows[0].wzx;
          this.cardlist[1].value = response.rows[0].wxsf || 0;
          this.ycvalue = response.rows[0].yc;
          this.cardlist[2].value = response.rows[0].xsf || 0;
          this.cardlist[3].value = response.rows[0].dsf || 0;
          this.cardlist[4].value = response.rows[0].ywc || 0;
          this.cardlist[2].value = response.rows[0].dsf || 0; // å¾…完成 = å¾…随访
          this.cardlist[3].value = response.rows[0].ywc || 0; // å·²å®Œæˆ = å·²éšè®¿
          // å®Œæˆçއ = å·²å®Œæˆ / (待完成 + å·²å®Œæˆ)
          const dsf = Number(response.rows[0].dsf) || 0;
          const ywc = Number(response.rows[0].ywc) || 0;
          const doneTotal = dsf + ywc;
          this.cardlist[4].value =
            doneTotal > 0 ? ((ywc / doneTotal) * 100).toFixed(2) + "%" : "0%";
          this.yfsvalue = response.rows[0].yfs;
        }
        this.loading = false;
@@ -1459,7 +1423,7 @@
        this.options = [];
      }
    },
    // å½±åƒéšè®¿çŠ¶æ€ä¿®æ”¹
    // å½±åƒå¤„理状态修改
    handleStatusChange(row) {
      let text = row.status === "0" ? "启用" : "停用";
      this.$modal
@@ -1874,8 +1838,8 @@
<style lang="scss" scoped>
.el-button--primary.is-plain {
  color: #ffffff;
  background: #409eff;
  border-color: #4fabe9;
  background: #5b7cfa;
  border-color: #5b7cfa;
}
.document {
@@ -2071,4 +2035,75 @@
//     font-size: 24px;
//   }
// }
/* ================= æ¸…新高级简约风 ================= */
.app-container {
  background: #f5f7fb;
  border-radius: 14px;
  padding: 20px;
}
/* æŸ¥è¯¢è¡¨å•:白色圆角卡片 */
::v-deep .el-form--inline {
  background: #ffffff;
  border-radius: 14px;
  padding: 22px 22px 8px;
  margin-bottom: 18px;
  box-shadow: 0 2px 12px rgba(31, 45, 61, 0.05);
}
/* éšè—åˆ†å‰²çº¿ */
::v-deep .el-divider {
  display: none;
}
/* å·¥å…·æ åº•部间距 */
.mb8 {
  margin-bottom: 18px;
}
/* æŒ‰é’®ï¼šåœ†è§’ + æŸ”和过渡 */
::v-deep .el-button {
  border-radius: 8px;
  font-weight: 500;
  transition: all 0.25s ease;
}
/* ä¸»æŒ‰é’®ï¼šæ¸…新靛蓝 */
::v-deep .el-button--primary:not(.is-plain) {
  background: #5b7cfa;
  border-color: #5b7cfa;
}
::v-deep .el-button--primary:not(.is-plain):hover,
::v-deep .el-button--primary:not(.is-plain):focus {
  background: #7593fb;
  border-color: #7593fb;
}
/* è¡¨æ ¼ï¼šç™½è‰²åœ†è§’卡片 + æŸ”和表头 */
::v-deep .el-table {
  border-radius: 14px;
  overflow: hidden;
  box-shadow: 0 2px 12px rgba(31, 45, 61, 0.05);
}
::v-deep .el-table::before {
  display: none;
}
::v-deep .el-table th {
  background: #f7f9fd !important;
  color: #3f4d63;
  font-weight: 600;
}
::v-deep .el-table td {
  padding: 12px 0;
}
/* æ ‡ç­¾åœ†è§’ */
::v-deep .el-tag {
  border-radius: 6px;
}
/* åˆ†é¡µé—´è· */
::v-deep .pagination-container {
  padding-top: 18px;
}
</style>
src/views/knowledge/education/compilequer/index.vue
@@ -353,7 +353,7 @@
      editorRef: null,
      // ç¼–辑器内容
      content: "<p>测试</p>",
      content: "",
      // ç¼–辑器模式
      mode: "default",
src/views/patient/physical/index.vue
@@ -659,6 +659,8 @@
      single: true,
      // éžå¤šä¸ªç¦ç”¨
      multiple: true,
      jgvalue: 0,
      orgname: "",
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      // æ€»æ¡æ•°
@@ -684,7 +686,7 @@
      },
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      ycvalue: "",
      ycvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
@@ -845,6 +847,7 @@
  created() {
    this.serviceState = store.getters.serviceState;
    this.checkboxlist = store.getters.checkboxlist;
    this.orgname = localStorage.getItem("orgname");
    this.errtype = this.$route.query.errtype;
    this.leavehospitaldistrictcode =
      this.$route.query.leavehospitaldistrictcode;
src/views/patient/propaganda/Missioncreation.vue
@@ -297,7 +297,7 @@
                      </div>
                      <el-tag
                        v-for="tag in diagglist"
                        @close="removediagg(tag.icd10code)"
                        @close="removediagg(tag)"
                        type="warning"
                        closable
                        :disable-transitions="false"
@@ -1761,20 +1761,23 @@
          });
        }
      });
      taskdiaggetlist(this.queryParamsdept).then((res) => {
        if (res.code == 200) {
          let arr = res.rows;
          arr.forEach((item) => {
            getillnesslist({
              icdcode: item.icd10code,
            }).then((res) => {
              item.icdname = res.rows[0].icdname;
              this.diagglist.push(item);
     taskdiaggetlist(this.queryParamsdept).then((res) => {
          if (res.code == 200) {
            let arr = res.rows;
            arr.forEach((item) => {
              if (localStorage.getItem("orgname") == "南华大学附属第一医院") {
                item.icdname = item.icd10name;
                this.diagglist.push(item);
              } else {
                getillnesslist({ icdcode: item.icd10code }).then((res) => {
                  item.icdname = res.rows[0].icdname;
                  this.diagglist.push(item);
                });
              }
              this.illnesscodes.push(item.icd10code);
            });
            this.illnesscodes.push(item.icd10code);
          });
        }
      });
          }
        });
      taskopergetlist(this.queryParamsdept).then((res) => {
        if (res.code == 200) {
          let arr = res.rows;
@@ -1966,22 +1969,26 @@
      }
    },
    // ç–¾ç—…删除触发
    removediagg(row) {
      console.log(row, "row");
      console.log(this.diagglist, "this.diagglist");
    removediagg(tag) {
      // ä»»åŠ¡ç»„ï¼šæœ¬åœ°åˆ é™¤å³å¯ï¼ŒåŽç«¯ä¿å­˜æ—¶ç»Ÿä¸€æ›´æ–°
      if (this.form.appltype == 5) {
        this.diagglist = this.diagglist.filter((item) => item != tag);
        return;
      }
      let result = this.diagglist
        .filter((item) => item.icd10code == row)
        .map((item) => item.id);
      if (result.length) {
        taskdiaghospgetsondel(result).then((res) => {
      // æ™®é€šç–¾ç—…关联:判断是否有 id(已保存的记录才有 id)
      if (tag.id) {
        // id å­˜åœ¨ï¼Œè°ƒåŽç«¯æŽ¥å£åˆ é™¤
        taskdiaghospgetsondel([tag.id]).then((res) => {
          if (res.code) {
            this.diagglist = this.diagglist.filter(
              (item) => item.icd10code != row
            );
            this.diagglist = this.diagglist.filter((item) => item != tag);
            this.$modal.msgSuccess("删除成功");
          }
        });
      } else {
        // id ä¸å­˜åœ¨ï¼ˆæœªä¿å­˜çš„æ–°è®°å½•),直接本地删除
        this.diagglist = this.diagglist.filter((item) => item != tag);
        this.$modal.msgSuccess("删除成功");
      }
    },
    /** å¯¼å…¥æŒ‰é’®æ“ä½œ */
src/views/patient/propaganda/QuestionnaireTask.vue
@@ -379,7 +379,7 @@
                      </div>
                      <el-tag
                        v-for="tag in diagglist"
                        @close="removediagg(tag.icd10code)"
                        @close="removediagg(tag)"
                        type="warning"
                        closable
                        :disable-transitions="false"
@@ -713,7 +713,7 @@
                        </div>
                        <el-tag
                          v-for="tag in diagglist"
                          @close="removediagg(tag.icd10code)"
                          @close="removediagg(tag)"
                          type="warning"
                          closable
                          :disable-transitions="false"
@@ -1745,6 +1745,7 @@
        this.form.serviceType == 8 ||
        this.form.serviceType == 12 ||
        this.form.serviceType == 13 ||
        this.form.serviceType == 20 ||
        this.form.serviceType == 9
      ) {
        this.checkboxlist = [
@@ -2170,7 +2171,7 @@
                ...item,
                itemCode: code,
                itemName: item.itemName || item.medicalName,
                manufacturerName: item.manufacturerName || item.medicalCompany
                manufacturerName: item.manufacturerName || item.medicalCompany,
              });
            });
          }
@@ -2183,7 +2184,7 @@
                item.icdname = item.icd10name;
                this.diagglist.push(item);
              } else {
                getillnesslist({ icdname: item.icd10name }).then((res) => {
                getillnesslist({ icdcode: item.icd10code }).then((res) => {
                  item.icdname = res.rows[0].icdname;
                  this.diagglist.push(item);
                });
@@ -2234,25 +2235,26 @@
        });
      }
    },
    removediagg(row) {
    removediagg(tag) {
      // ä»»åŠ¡ç»„ï¼šæœ¬åœ°åˆ é™¤å³å¯ï¼ŒåŽç«¯ä¿å­˜æ—¶ç»Ÿä¸€æ›´æ–°
      if (this.form.appltype == 5) {
        this.diagglist = this.diagglist.filter((item) => item.icd10code != row);
        this.diagglist = this.diagglist.filter((item) => item != tag);
        return;
      }
      // æ™®é€šç–¾ç—…关联:调后端接口逐条删除
      let result = this.diagglist
        .filter((item) => item.icd10code == row)
        .map((item) => item.id);
      if (result.length) {
        taskdiaghospgetsondel(result).then((res) => {
      // æ™®é€šç–¾ç—…关联:判断是否有 id(已保存的记录才有 id)
      if (tag.id) {
        // id å­˜åœ¨ï¼Œè°ƒåŽç«¯æŽ¥å£åˆ é™¤
        taskdiaghospgetsondel([tag.id]).then((res) => {
          if (res.code) {
            this.diagglist = this.diagglist.filter(
              (item) => item.icd10code != row
            );
            this.diagglist = this.diagglist.filter((item) => item != tag);
            this.$modal.msgSuccess("删除成功");
          }
        });
      } else {
        // id ä¸å­˜åœ¨ï¼ˆæœªä¿å­˜çš„æ–°è®°å½•),直接本地删除
        this.diagglist = this.diagglist.filter((item) => item != tag);
        this.$modal.msgSuccess("删除成功");
      }
    },
    remoteopcode(name) {
@@ -2272,12 +2274,14 @@
    },
    // åˆ é™¤å·²é€‰è¯å“ï¼ˆå•独接口)
    removeMedical(code) {
      taskmedicaldel({ medicalCode: code, taskId: this.form.taskid }).then((res) => {
        if (res.code == 200) {
          this.medicalCodes = this.medicalCodes.filter((c) => c !== code);
          this.$modal.msgSuccess("删除成功");
      taskmedicaldel({ medicalCode: code, taskId: this.form.taskid }).then(
        (res) => {
          if (res.code == 200) {
            this.medicalCodes = this.medicalCodes.filter((c) => c !== code);
            this.$modal.msgSuccess("删除成功");
          }
        }
      });
      );
    },
    // ---------- æ‚£è€…选择 ----------
src/views/patient/propaganda/index.vue
@@ -373,7 +373,6 @@
          </template>
        </el-table-column> -->
        <el-table-column
          fixed="right"
          label="任务结果记录"
          width="120"
          align="center"
@@ -394,7 +393,6 @@
          </template>
        </el-table-column>
        <el-table-column
          fixed="right"
          label="宣教时间"
          sortable
          align="center"
@@ -403,6 +401,17 @@
        >
          <template slot-scope="scope">
            <span>{{ parseTime(scope.row.finishtime) }}</span>
          </template>
        </el-table-column>
        <el-table-column fixed="right" label="操作" align="center" width="100">
          <template slot-scope="scope">
            <el-button
              size="medium"
              type="text"
              icon="el-icon-view"
              @click="previewTemplate(scope.row)"
              >预览</el-button
            >
          </template>
        </el-table-column>
        <!-- <el-table-column
@@ -557,6 +566,10 @@
        >
      </span>
    </el-dialog>
    <!-- å®£æ•™æ¨¡æ¿é¢„览 -->
    <el-dialog title="模板预览" :visible.sync="previewtf" width="60%">
      <div v-html="htmlRichText"></div>
    </el-dialog>
  </div>
</template>
@@ -570,10 +583,11 @@
  resetUserPwd,
  changeUserStatus,
} from "@/api/system/user";
import { getTaskservelist } from "@/api/AiCentre/index";
import { getTaskservelist, getlibrarylist } from "@/api/AiCentre/index";
import Treeselect from "@riophae/vue-treeselect";
import store from "@/store";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import axios from "axios";
export default {
  name: "Discharge",
@@ -632,6 +646,8 @@
      inputVisible: false,
      inputValue: "",
      previewVisible: false, //门诊宣教预览弹框
      previewtf: false, //宣教模板预览弹框
      htmlRichText: "", //宣教模板预览富文本
      radio: "",
      radios: [],
      previewtype: 2, //预览门诊宣教类型
@@ -847,8 +863,8 @@
          store.getters.belongWards.map((obj) => obj.districtCode);
      }
      this.loading = true;
      console.log(this.topqueryParams.leavehospitaldistrictcodes,'123');
      console.log(this.topqueryParams.leaveldeptcodes,'344');
      console.log(this.topqueryParams.leavehospitaldistrictcodes, "123");
      console.log(this.topqueryParams.leaveldeptcodes, "344");
      if (
        this.topqueryParams.leavehospitaldistrictcodes[0] &&
@@ -878,6 +894,48 @@
    // æŸ¥çœ‹é—¨è¯Šå®£æ•™è¯¦æƒ…
    Referencequestion(row) {
      this.previewVisible = true;
    },
    // é¢„览宣教模板(通过 libtemplateid æŸ¥è¯¢æ¨¡æ¿ä¿¡æ¯ï¼‰
    previewTemplate(row) {
      if (!row.libtemplateid) {
        this.$message.warning("该任务未关联宣教模板");
        return;
      }
      this.htmlRichText = null;
      this.previewtf = true;
      getlibrarylist({ id: row.libtemplateid })
        .then((res) => {
          const tpl = (res.rows && res.rows[0]) || null;
          if (!tpl || !tpl.htmlRichText) {
            this.$message.warning("该模板暂无预览内容");
            return;
          }
          axios
            .get(tpl.htmlRichText)
            .then((response) => {
              this.htmlRichText = response.data;
              this.htmlRichText = this.addStyleToImages(this.htmlRichText);
            })
            .catch(() => {
              this.$message.error("获取模板内容失败");
            });
        })
        .catch(() => {
          this.$message.error("查询模板信息失败");
        });
    },
    // ä¿®å¤å¯Œæ–‡æœ¬å›¾ç‰‡è·¯å¾„与样式
    addStyleToImages(html) {
      if (!html) return html;
      let processedHtml = html.replace(
        /\/aifollowup\/aifollowup\//g,
        "/aifollowup/"
      );
      processedHtml = processedHtml.replace(
        /<img([^>]*)style=(['"])(?:(?!\2).)*\2([^>]*)>/g,
        '<img$1style="width:100%;height:auto;"$3>'
      );
      return processedHtml;
    },
    // æ·»åŠ å¼¹æ¡†æœç´¢
    remoteMethod(query) {
@@ -1101,8 +1159,8 @@
<style lang="scss" scoped>
.el-button--primary.is-plain {
  color: #ffffff;
  background: #409eff;
  border-color: #4fabe9;
  background: #5b7cfa;
  border-color: #5b7cfa;
}
.document {
@@ -1227,4 +1285,75 @@
//     font-size: 24px;
//   }
// }
/* ================= æ¸…新高级简约风 ================= */
.app-container {
  background: #f5f7fb;
  border-radius: 14px;
  padding: 20px;
}
/* æŸ¥è¯¢è¡¨å•:白色圆角卡片 */
::v-deep .el-form--inline {
  background: #ffffff;
  border-radius: 14px;
  padding: 22px 22px 8px;
  margin-bottom: 18px;
  box-shadow: 0 2px 12px rgba(31, 45, 61, 0.05);
}
/* éšè—åˆ†å‰²çº¿ */
::v-deep .el-divider {
  display: none;
}
/* å·¥å…·æ åº•部间距 */
.mb8 {
  margin-bottom: 18px;
}
/* æŒ‰é’®ï¼šåœ†è§’ + æŸ”和过渡 */
::v-deep .el-button {
  border-radius: 8px;
  font-weight: 500;
  transition: all 0.25s ease;
}
/* ä¸»æŒ‰é’®ï¼šæ¸…新靛蓝 */
::v-deep .el-button--primary:not(.is-plain) {
  background: #5b7cfa;
  border-color: #5b7cfa;
}
::v-deep .el-button--primary:not(.is-plain):hover,
::v-deep .el-button--primary:not(.is-plain):focus {
  background: #7593fb;
  border-color: #7593fb;
}
/* è¡¨æ ¼ï¼šç™½è‰²åœ†è§’卡片 + æŸ”和表头 */
::v-deep .el-table {
  border-radius: 14px;
  overflow: hidden;
  box-shadow: 0 2px 12px rgba(31, 45, 61, 0.05);
}
::v-deep .el-table::before {
  display: none;
}
::v-deep .el-table th {
  background: #f7f9fd !important;
  color: #3f4d63;
  font-weight: 600;
}
::v-deep .el-table td {
  padding: 12px 0;
}
/* æ ‡ç­¾åœ†è§’ */
::v-deep .el-tag {
  border-radius: 6px;
}
/* åˆ†é¡µé—´è· */
::v-deep .pagination-container {
  padding-top: 18px;
}
</style>
src/views/patient/propaganda/particty.vue
@@ -228,7 +228,9 @@
                      <el-option
                        v-for="item in medicalOptions"
                        :key="item.id"
                        :label="item.itemName + ' (' + item.manufacturerName + ')'"
                        :label="
                          item.itemName + ' (' + item.manufacturerName + ')'
                        "
                        :value="item.itemCode"
                      />
                    </el-select>
@@ -377,7 +379,7 @@
                      <el-tag
                        v-for="tag in diagglist"
                        :key="tag.icdcode"
                        @close="removediagg(tag.icd10code)"
                        @close="removediagg(tag)"
                        type="warning"
                        closable
                        :disable-transitions="false"
@@ -710,7 +712,7 @@
                        </div>
                        <el-tag
                          v-for="tag in diagglist"
                          @close="removediagg(tag.icd10code)"
                          @close="removediagg(tag)"
                          type="warning"
                          closable
                          :disable-transitions="false"
@@ -1764,6 +1766,7 @@
        this.form.serviceType == 9 ||
        this.form.serviceType == 11 ||
        this.form.serviceType == 12 ||
        this.form.serviceType == 20 ||
        this.form.serviceType == 10
      ) {
        this.checkboxlist = [
@@ -2159,7 +2162,7 @@
                item.icdname = item.icd10name;
                this.diagglist.push(item);
              } else {
               this.diagglist.push(item);
                this.diagglist.push(item);
              }
              this.illnesscodes.push(item.icd10code);
            });
@@ -2181,7 +2184,7 @@
            });
          }
        });
        taskdiaggetlist(this.queryParamsdept).then((res) => {
         taskdiaggetlist(this.queryParamsdept).then((res) => {
          if (res.code == 200) {
            let arr = res.rows;
            arr.forEach((item) => {
@@ -2189,7 +2192,8 @@
                item.icdname = item.icd10name;
                this.diagglist.push(item);
              } else {
                getillnesslist({ icdname: item.icd10name }).then((res) => {
                getillnesslist({ icdcode: item.icd10code }).then((res) => {
                  item.icdname = res.rows[0].icdname;
                  this.diagglist.push(item);
                });
@@ -2209,7 +2213,7 @@
                ...item,
                itemCode: code,
                itemName: item.itemName || item.medicalName,
                manufacturerName: item.manufacturerName || item.medicalCompany
                manufacturerName: item.manufacturerName || item.medicalCompany,
              });
            });
          }
@@ -2255,43 +2259,51 @@
        });
      }
    },
    removediagg(row) {
    removediagg(tag) {
      // ä»»åŠ¡ç»„ï¼šæœ¬åœ°åˆ é™¤å³å¯ï¼ŒåŽç«¯ä¿å­˜æ—¶ç»Ÿä¸€æ›´æ–°
      if (this.form.appltype == 5) {
        this.diagglist = this.diagglist.filter((item) => item.icd10code != row);
        this.diagglist = this.diagglist.filter((item) => item != tag);
        return;
      }
      // æ™®é€šç–¾ç—…关联:调后端接口逐条删除
      let result = this.diagglist
        .filter((item) => item.icd10code == row)
        .map((item) => item.id);
      if (result.length) {
        taskdiaghospgetsondel(result).then((res) => {
      // æ™®é€šç–¾ç—…关联:判断是否有 id(已保存的记录才有 id)
      if (tag.id) {
        // id å­˜åœ¨ï¼Œè°ƒåŽç«¯æŽ¥å£åˆ é™¤
        taskdiaghospgetsondel([tag.id]).then((res) => {
          if (res.code) {
            this.diagglist = this.diagglist.filter(
              (item) => item.icd10code != row
            );
            this.diagglist = this.diagglist.filter((item) => item != tag);
            this.$modal.msgSuccess("删除成功");
          }
        });
      } else {
        // id ä¸å­˜åœ¨ï¼ˆæœªä¿å­˜çš„æ–°è®°å½•),直接本地删除
        this.diagglist = this.diagglist.filter((item) => item != tag);
        this.$modal.msgSuccess("删除成功");
      }
    },
    remoteopcode(name) {
      // å ä½
    },
    remoteSearchMedical(query) {
      if (!query) { this.medicalOptions = []; return; }
      listMedication({ itemName: query, pageNum: 1, pageSize: 20 }).then((res) => {
        this.medicalOptions = res.rows || [];
      });
      if (!query) {
        this.medicalOptions = [];
        return;
      }
      listMedication({ itemName: query, pageNum: 1, pageSize: 20 }).then(
        (res) => {
          this.medicalOptions = res.rows || [];
        }
      );
    },
    removeMedical(code) {
      taskmedicaldel({ itemCode: code, taskid: this.form.taskid }).then((res) => {
        if (res.code == 200) {
          this.medicalCodes = this.medicalCodes.filter((c) => c !== code);
          this.$modal.msgSuccess("删除成功");
      taskmedicaldel({ itemCode: code, taskid: this.form.taskid }).then(
        (res) => {
          if (res.code == 200) {
            this.medicalCodes = this.medicalCodes.filter((c) => c !== code);
            this.$modal.msgSuccess("删除成功");
          }
        }
      });
      );
    },
    // ---------- æ‚£è€…选择 ----------
@@ -2821,7 +2833,7 @@
          // å°†ä¸»å¯¹è±¡æ”¾å…¥ form æäº¤
        }
        if (this.form.appltype == 5) {
          console.log(this.form,'进入任务组配置');
          console.log(this.form, "进入任务组配置");
          this.form.serviceTaskScheduleVO.icd10codes = this.form.icd10code;
          this.form.serviceTaskScheduleVO.wardCodes =
@@ -2858,7 +2870,9 @@
          );
          this.form.medicalCode = this.medicalCodes.join(",");
          this.form.medicalName = selectedMeds.map((m) => m.itemName).join(",");
          this.form.medicalCompany = selectedMeds.map((m) => m.manufacturerName).join(",");
          this.form.medicalCompany = selectedMeds
            .map((m) => m.manufacturerName)
            .join(",");
        }
        this.form.serviceType = this.serviceType;
@@ -2871,7 +2885,11 @@
          .map((item) => item.icdname)
          .join(",");
        // ç–¾ç—…/手术/药品关联的科室/病区校验
        if (this.form.appltype == 3 || this.form.appltype == 4 || this.form.appltype == 6) {
        if (
          this.form.appltype == 3 ||
          this.form.appltype == 4 ||
          this.form.appltype == 6
        ) {
          const hasDept = this.diseaseDept?.deptCode;
          const hasWard = this.diseaseWard?.districtCode;
          if (!hasDept && !hasWard) {
src/views/patient/questionnaire/index.vue
@@ -1,6 +1,6 @@
<template>
  <div class="app-container">
    <div class="leftvlue" style="margin-bottom: 20px">
    <!-- <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
@@ -61,7 +61,13 @@
          </div>
        </el-col>
      </el-row>
    </div>
    </div> -->
    <statistics-cards
      :cardlist="cardlist"
      :ycvalue="ycvalue"
      :jgvalue="jgvalue"
      :show-warning-condition="orgname == '省立同德翠苑院区'"
    />
    <el-row :gutter="20">
      <!--用户数据-->
      <el-form
@@ -139,7 +145,7 @@
        <el-col :span="1.5">
          <el-button
            type="primary"
                        icon="el-icon-plus"
            icon="el-icon-plus"
            size="medium"
            @click="handleAdd"
            >新增</el-button
@@ -221,7 +227,7 @@
          width="120"
        >
          <template slot-scope="scope">
             <el-tooltip
            <el-tooltip
              class="item"
              effect="dark"
              :content="scope.row.remark"
@@ -393,7 +399,7 @@
          prop="templatename"
          width="200"
        />
         <el-table-column
        <el-table-column
          label="任务状态"
          align="center"
          key="sendstate"
@@ -681,13 +687,15 @@
} from "@/api/system/user";
import { getTaskservelist } from "@/api/AiCentre/index";
import Treeselect from "@riophae/vue-treeselect";
import StatisticsCards from "@/components/StatisticsCards";
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 },
  components: { Treeselect, StatisticsCards },
  data() {
    return {
      // é®ç½©å±‚
@@ -696,6 +704,8 @@
      ids: [],
      // éžå•个禁用
      single: true,
      jgvalue: 0,
      // éžå¤šä¸ªç¦ç”¨
      multiple: true,
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
@@ -723,7 +733,6 @@
      },
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      ycvalue: "",
      yfsvalue: "",
      inputValue: "",
      preachform: "",
@@ -739,6 +748,7 @@
      },
      value: [],
      list: [],
      orgname: "",
      sourcetype: [
        {
@@ -793,26 +803,39 @@
      ],
      cardlist: [
        {
          name: "患者服务总量",
          name: "出院服务总量",
          value: 0,
        },
        {
          name: "患者过滤",
          value: 0,
        },
        {
          name: "应随访",
          value: 0,
        },
        // {
        //   name: "异常",
        //   value: 0,
        // },
        {
          name: "无需随访",
          name: "发送失败",
          value: 0,
        },
        {
          name: "需随访",
          name: "待执行",
          value: 0,
        },
        {
          name: "待随访",
          value: 0,
        },
        {
          name: "已完成",
          value: 0,
        },
        // {
        //   name: "已发送",
        //   value: 0,
        // },
        // {
        //   name: "表单已发送",
        //   value: 0,
        // },
      ],
      // è¡¨å•参数
@@ -830,7 +853,7 @@
        pageSize: 10,
        serviceType: 7,
        searchscope: 3,
        sendstate:2,
        sendstate: 2,
        scopetype: [],
        leaveldeptcodes: [],
        leavehospitaldistrictcodes: [],
@@ -838,7 +861,7 @@
      propss: { multiple: true },
      options: [],
       topicoptions: [
      topicoptions: [
        {
          value: null,
          label: "全部",
@@ -875,6 +898,9 @@
        },
      ],
      errtype: "",
      ycvalue: 0,
      jgvalue: 0,
      leavehospitaldistrictcode: "",
      serviceState: [],
      checkboxlist: [],
@@ -889,6 +915,8 @@
    this.errtype = this.$route.query.errtype;
    this.leavehospitaldistrictcode =
      this.$route.query.leavehospitaldistrictcode;
    this.orgname = localStorage.getItem("orgname");
    this.sourcetype[0].children = store.getters.belongDepts.map((dept) => {
      return {
        label: dept.deptName,
@@ -915,48 +943,69 @@
  },
  methods: {
    /** æŸ¥è¯¢é—¨è¯Šéšè®¿æœåŠ¡åˆ—è¡¨ */
    getList(refresh) {
    async getList(refresh) {
      // é»˜è®¤å…¨éƒ¨
      if (this.topqueryParams.searchscope == 3) {
        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
          (obj) => obj.deptCode
      this.applyDeptWardScope();
      if (this.endOut == 0) {
        this.topqueryParams.endSendDateTime = this.formatDateToYYYYMMDDHHMMSS(
          this.getEndOfDay()
        );
        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;
      if (
        this.topqueryParams.leavehospitaldistrictcodes[0] &&
        this.topqueryParams.leaveldeptcodes[0]
      ) {
        this.topqueryParams.deptOrDistrict = 2;
      } else {
        this.topqueryParams.deptOrDistrict = 1;
      }
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        this.loading = false;
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
      try {
        const response = await getTaskservelist(this.topqueryParams);
        // âœ… ç¬¬ä¸€æ­¥ï¼šå…ˆé”å®šæ¢å¤çŠ¶æ€
        this.isRestoring = true;
        // âœ… ç¬¬äºŒæ­¥ï¼šå†æ›´æ–°æ•°æ®ï¼ˆè¿™ä¼šè§¦å‘ selection-change,但被锁住了)
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
        // âœ… ç¬¬ä¸‰æ­¥ï¼šæ¢å¤é€‰ä¸­çŠ¶æ€
        // this.restoreSelection();
        this.$nextTick(() => {
          this.restoreSelection();
        });
        // âœ… ç¬¬å››æ­¥ï¼šå¤„理其他数据
        if (refresh) {
          this.cardlist[0].value =
            Number(response.rows[0].wxsf) + Number(response.rows[0].xsf) || 0;
          // this.cardlist[1].value = response.rows[0].wzx;
          this.cardlist[1].value = response.rows[0].wxsf || 0;
          this.ycvalue = response.rows[0].yc;
          this.ycvalue = Number(response.rows[0].yc) || 0;
          this.jgvalue = response.rows[0].jg;
          this.cardlist[2].value = response.rows[0].xsf || 0;
          this.cardlist[3].value = response.rows[0].dsf || 0;
          this.cardlist[4].value = response.rows[0].ywc || 0;
          this.yfsvalue = response.rows[0].yfs;
        }
        this.loading = false;
        // âœ… ç¬¬äº”步:处理 preachform ç­‰å…¶ä»–数据
        this.userList.forEach((item) => {
          let idArray = null;
          if (item.endtime) {
@@ -964,23 +1013,36 @@
          }
          if (item.preachform) {
            if (item.endtime) {
              item.preachformson = item.preachform;
              idArray = item.preachform.split(",");
            }
            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;
            });
          }
          if (item.currentPreachform) {
            item.currentPreachform = this.checkboxlist.find(
              (item) => item.value == item.currentPreachform
            )?.value;
            console.log(item.currentPreachform, "mi");
          }
        });
        this.total = response.total;
      });
        this.loading = false;
        // âœ… ç¬¬å…­æ­¥ï¼šè§£é”
        this.$nextTick(() => {
          this.isRestoring = false;
        });
      } catch (error) {
        console.error("获取列表失败:", error);
        this.loading = false;
        this.isRestoring = false;
      }
    },
    // æŸ¥çœ‹å½±åƒéšè®¿è¯¦æƒ…
    Referencequestion(row) {
@@ -1111,7 +1173,7 @@
        pageSize: 10,
        serviceType: 7,
        searchscope: 2,
        sendstate:2,
        sendstate: 2,
      };
      this.handleQuery(1);
    },
@@ -1250,9 +1312,9 @@
    Seedetails(row) {
      let type = "";
      console.log(row, "rwo");
        if (row.type == 1) {
          type = 1;
        }
      if (row.type == 1) {
        type = 1;
      }
      this.$router.push({
        path: "/followvisit/record/detailpage/",
        query: {
@@ -1389,11 +1451,11 @@
  }
}
::v-deep.leftvlue .el-card__body {
  background: #F2F8FF;
  color: #324A9B;
  background: #f2f8ff;
  color: #324a9b;
}
::v-deep.leftvlue .el-card__body:hover {
  background: #3664D9;
  background: #3664d9;
  color: #fff;
  cursor: pointer; /* é¼ æ ‡æ‚¬æµ®æ—¶å˜ä¸ºæ‰‹å½¢ */
}
src/views/patient/shadow/index.vue
@@ -723,7 +723,7 @@
      },
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      ycvalue: "",
      ycvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
src/views/patient/subsequent/index.vue
@@ -661,6 +661,8 @@
      multiple: true,
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      jgvalue: 0,
      orgname: "",
      // æ€»æ¡æ•°
      total: 0,
      // ç”¨æˆ·è¡¨æ ¼æ•°æ®
@@ -684,7 +686,7 @@
      },
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      ycvalue: "",
      ycvalue: 0,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
@@ -846,6 +848,7 @@
    this.serviceState = store.getters.serviceState;
    this.checkboxlist = store.getters.checkboxlist;
    this.errtype = this.$route.query.errtype;
    this.orgname = localStorage.getItem("orgname");
    this.leavehospitaldistrictcode =
      this.$route.query.leavehospitaldistrictcode;
    this.sourcetype[0].children = store.getters.belongDepts.map((dept) => {
src/views/patient/ycquestionnaire/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1298 @@
<template>
  <div class="app-container">
    <statistics-cards
      :cardlist="cardlist"
      :ycvalue="ycvalue"
      :jgvalue="jgvalue"
      :show-warning-condition="orgname == '省立同德翠苑院区'"
    />
    <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="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>
          <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">
          <el-button
            type="primary"
            plain
            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-upload2"
                size="medium"
                @click="handleExport"
                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"
                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-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="任务名称"
          fixed
          align="center"
          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">
            <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>
          </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="随访人员"
          align="center"
          key="createBy"
          prop="createBy"
          width="120"
        />
        <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="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-tooltip
              class="item"
              effect="dark"
              content="重新随访"
              placement="top"
            >
              <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="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
            >
          </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="title"
      :visible.sync="addalteropen"
      width="700px"
      append-to-body
    >
      <el-form ref="form" :model="form" label-width="100px">
        <el-row :gutter="20">
          <el-col :span="12"
            ><el-form-item label="任务名称">
              <el-input v-model="form.name"></el-input> </el-form-item
          ></el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="24"
            ><el-form-item label="所属科室">
              <el-select v-model="form.region" placeholder="请选择科室">
                <el-option label="区域一" value="shanghai"></el-option>
                <el-option label="区域二" value="beijing"></el-option>
              </el-select> </el-form-item></el-col
        ></el-row>
        <el-row :gutter="20">
          <el-col :span="24"
            ><el-form-item label="随访类型">
              <el-select v-model="form.region" placeholder="请选择随访类型">
                <el-option label="区域一" value="shanghai"></el-option>
                <el-option label="区域二" value="beijing"></el-option>
              </el-select> </el-form-item
          ></el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="24">
            <el-form-item label="服务模块">
              <el-select v-model="form.region" placeholder="请选择模块">
                <el-option label="区域一" value="shanghai"></el-option>
                <el-option label="区域二" value="beijing"></el-option>
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="24">
            <el-form-item label="门诊随访要求">
              <el-input type="textarea" v-model="form.desc"></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 {
  listUser,
  getUser,
  delUser,
  addUser,
  updateUser,
  resetUserPwd,
  changeUserStatus,
} from "@/api/system/user";
import { getTaskservelist } from "@/api/AiCentre/index";
import Treeselect from "@riophae/vue-treeselect";
import store from "@/store";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import StatisticsCards from "@/components/StatisticsCards";
export default {
  name: "Discharge",
  dicts: ["sys_normal_disable", "sys_user_sex", "sys_yujing", "sys_suggest"],
  components: { Treeselect, StatisticsCards },
  data() {
    return {
      // é®ç½©å±‚
      loading: true,
      // é€‰ä¸­æ•°ç»„
      ids: [],
      // éžå•个禁用
      single: true,
      // éžå¤šä¸ªç¦ç”¨
      multiple: true,
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      jgvalue: 0,
      // æ€»æ¡æ•°
      total: 0,
      // ç”¨æˆ·è¡¨æ ¼æ•°æ®
      userList: null,
      // å¼¹å‡ºå±‚标题
      title: "新增门诊随访",
      // æ˜¯å¦æ˜¾ç¤ºä¿®æ”¹ã€æ·»åŠ å¼¹å‡ºå±‚
      addalteropen: false,
      // ä¿®æ”¹å‘送时间对话框
      modificationVisible: false,
      // éƒ¨é—¨åç§°
      deptName: undefined,
      // é»˜è®¤å¯†ç 
      initPassword: undefined,
      // æ—¥æœŸèŒƒå›´
      dateRange: [],
      // å²—位选项
      postOptions: [],
      ruleForm: {
        type: [],
      },
      ycvalue: 0,
      jgvalue: 0,
      dynamicTags: ["选项一", "选项二", "选项三"], //选项
      inputVisible: false,
      yfsvalue: "",
      inputValue: "",
      preachform: "",
      previewVisible: false, //门诊随访预览弹框
      radio: "",
      radios: [],
      previewtype: 2, //预览门诊随访类型
      total: 0, // æ€»æ¡æ•°
      ImportQuantity: 999, //导门诊随访数量
      //预览门诊随访信息
      previewvalue: {
        username: "这个医生对你怎么样",
      },
      value: [],
      list: [],
      orgname: "",
      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: "",
        totagid: "",
        types: "",
        nickName: "",
        qystatus: "",
        btstatus: "",
      },
      // æŸ¥è¯¢å‚æ•°
      topqueryParams: {
        pageNum: 1,
        pageSize: 10,
        serviceType: 20,
        searchscope: 3,
        scopetype: [],
        leaveldeptcodes: [],
        leavehospitaldistrictcodes: [],
      },
      propss: { multiple: true },
      options: [],
      topicoptions: [
        {
          value: 1,
          label: "表单已领取",
        },
        {
          value: 2,
          label: "待执行",
        },
        {
          value: 3,
          label: "表单已发送",
        },
        {
          value: 4,
          label: "不执行",
        },
        {
          value: 5,
          label: "发送失败",
        },
        {
          value: 6,
          label: "已完成",
        },
      ],
      topicoptionsyj: [
        {
          value: 1,
          label: "异常",
        },
        {
          value: 0,
          label: "正常",
        },
      ],
      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.orgname = localStorage.getItem("orgname");
    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;
      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;
      });
    },
    // æŸ¥çœ‹é—¨è¯Šéšè®¿è¯¦æƒ…
    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";
        });
    },
    // å–消按钮
    cancel() {
      this.addalteropen = false;
      this.reset();
    },
    // è¡¨å•重置
    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.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.topqueryParams = {
        pageNum: 1,
        pageSize: 10,
        serviceType: 20,
        searchscope: 2,
      };
      this.handleQuery(1);
    },
    // å¤šé€‰æ¡†é€‰ä¸­æ•°æ®
    handleSelectionChange(selection) {
      this.ids = selection.map((item) => item.userId);
      this.single = selection.length != 1;
      this.multiple = !selection.length;
    },
    //删除选项
    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: 20,
        },
      });
    },
    /** é‡ç½®å¯†ç æŒ‰é’®æ“ä½œ */
    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(() => {});
    },
    /** æäº¤æŒ‰é’® */
    submitForm: function () {
      this.$refs["form"].validate((valid) => {
        if (valid) {
          if (this.form.userId != undefined) {
            updateUser(this.form).then((response) => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.getList(1);
            });
          } else {
            addUser(this.form).then((response) => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.getList(1);
            });
          }
        }
      });
    },
    /** åˆ é™¤æŒ‰é’®æ“ä½œ */
    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;
          console.log(type, "rwo");
        }
      }
      this.$router.push({
        path: "/followvisit/record/detailpage/",
        query: {
          taskid: row.taskid,
          patid: row.patid,
          id: row.id,
          Voicetype: type,
        },
      });
    },
    // ä¾¿æ·æŒ‰é’®
    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/export",
        {
          ...this.topqueryParams,
        },
        `user_${new Date().getTime()}.xlsx`
      );
    },
    // å¼‚常列渲染
    tableRowClassName({ row, rowIndex }) {
      if (row.excep == 1) {
        return "warning-row";
      }
      return "";
    },
  },
};
</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: #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: #dd302a;
  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;
  }
}
// é€‰é¡¹å­—体放大
// ::v-deep.el-checkbox-group {
//   span {
//     font-size: 24px;
//   }
// }
</style>
src/views/sfstatistics/percentage/index.vue
@@ -397,7 +397,8 @@
    handleQuery() {
      if (!this.queryParams.dateRange) this.queryParams.dateRange = [];
      if (!this.queryParams.dateRangecy) this.queryParams.dateRange = [];
      if (!this.queryParams.dateRangecy) this.queryParams.dateRangecy = [];
      this.queryParams.startTime = this.parseTime(
        this.queryParams.dateRange[0]
      );
Ëæ·ÃÍâÁ´.zip
Binary files differ
Ëæ·ÃͨÓÃ8.26.zip
Binary files differ