WXL (wul)
2 天以前 23f74bc3f782d183f66a08bd8ce4790cc61f4e61
src/views/patient/patient/outpatient.vue
@@ -11,7 +11,7 @@
          v-show="showSearch"
          label-width="98px"
        >
          <el-form-item label="姓名" prop="name">
          <el-form-item label="姓名" width="100" prop="name">
            <el-input
              v-model="queryParams.patname"
              placeholder="请输入姓名"
@@ -20,38 +20,84 @@
              @keyup.enter.native="handleQuery"
            />
          </el-form-item>
          <el-form-item label="患者编号" prop="patid">
          <el-form-item label="诊断" width="100" prop="name">
            <el-input
              v-model="queryParams.patid"
              placeholder="请输入患者编号"
              v-model="queryParams.diagname"
              placeholder="请输入诊断"
              clearable
              style="width: 200px"
              @keyup.enter.native="handleQuery"
            />
          </el-form-item>
          <el-form-item label="科室" width="100" prop="name">
            <el-input
              v-model="queryParams.deptname"
              placeholder="请输入科室名称"
              clearable
              style="width: 200px"
              @keyup.enter.native="handleQuery"
            />
          </el-form-item>
          <el-form-item label="医生" width="100" prop="name">
            <el-input
              v-model="queryParams.drname"
              placeholder="请输入医生姓名"
              clearable
              style="width: 200px"
              @keyup.enter.native="handleQuery"
            />
          </el-form-item>
          <el-form-item label="病案号" prop="outhospno">
            <el-input
              v-model="queryParams.outhospno"
              placeholder="请输入病案号"
              clearable
              style="width: 250px"
              @keyup.enter.native="handleQuery"
            />
          </el-form-item>
          <el-form-item label="患者范围" prop="tagId">
            <el-select v-model="queryParams.Patientid" placeholder="请选择">
              <el-option
                v-for="item in Patientrange"
                :key="item.id"
                :label="item.name"
                :value="item.id"
          <el-form-item label="患者范围" prop="status">
            <el-cascader
              v-model="queryParams.scopetype"
              placeholder="默认全部"
              :options="sourcetype"
              :props="{ expandTrigger: 'hover' }"
              @change="handleChange"
            ></el-cascader>
          </el-form-item>
          <el-form-item label="就诊日期">
            <el-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-date-picker
                v-model="dateRange"
                type="datetimerange"
                value-format="yyyy-MM-dd HH:mm:ss"
                start-placeholder="开始日期"
                end-placeholder="结束日期"
                :default-time="['12:00:00']"
              >
              </el-option>
            </el-select>
              </el-date-picker> -->
          </el-form-item>
          <el-row>
            <el-form-item label=" 就诊日期 " prop="createTime">
            <!-- <el-form-item label=" 就诊日期 " prop="admitdate">
              <el-date-picker
                clearable
                v-model="queryParams.createTime"
                v-model="queryParams.admitdate"
                type="date"
                value-format="yyyy-MM-dd"
                placeholder="请选择 就诊日期 "
              >
              </el-date-picker>
            </el-form-item>
            </el-form-item> -->
            <el-form-item>
              <el-button
                type="primary"
@@ -106,6 +152,18 @@
              >删除</el-button
            >
          </el-col>
          <el-col :span="1.5">
            <el-button
              type="warning"
              plain
              icon="el-icon-plus"
              size="medium"
              :disabled="multiple"
              @click="handleBatchAddTask"
            >
              批量添加任务</el-button
            >
          </el-col>
          <el-col :span="19">
            <div class="documentf">
              <div class="document">
@@ -151,28 +209,57 @@
          <el-table-column
            label="就诊时间"
            align="center"
            key="createTime"
            prop="createTime"
            key="admitdate"
            prop="admitdate"
            width="160"
          >
            <template slot-scope="scope">
              <span>{{ formatTime(scope.row.createTime) }}</span>
              <span>{{ formatTime(scope.row.admitdate) }}</span>
            </template>
          </el-table-column>
          <el-table-column
            label="门诊号"
          <!-- <el-table-column
            label="病案号"
            align="center"
            key="patid"
            prop="patid"
            key="patno"
            prop="patno"
          /> -->
          <el-table-column
            label="病案号"
            align="center"
            key="outhospno"
            prop="outhospno"
          />
          <el-table-column
            label="姓名"
            width="100"
            align="center"
            key="patname"
            prop="patname"
          />
          <el-table-column label="性别" align="center" key="sex" prop="sex">
          >
            <template slot-scope="scope">
              <el-button
                size="medium"
                type="text"
                @click="
                  gettoken360(
                    scope.row.idcardno,
                    scope.row.drcode,
                    scope.row.drname
                  )
                "
                ><span class="button-textsc">{{
                  scope.row.patname
                }}</span></el-button
              >
            </template>
          </el-table-column>
          <el-table-column
            label="性别"
            width="100"
            align="center"
            key="sex"
            prop="sex"
          >
            <template slot-scope="scope">
              <span>{{ scope.row.sex == 1 ? "男" : "女" }}</span>
            </template>
@@ -232,7 +319,23 @@
            prop="drname"
            width="120"
          />
          <el-table-column
            label="是否存在任务"
            align="center"
            key="serverState"
            prop="serverState"
            width="100"
          >
            <template slot-scope="scope">
              <span
                :style="{
                  color: scope.row.serverState == 1 ? 'green' : 'gray',
                }"
              >
                {{ scope.row.serverState == 1 ? "是" : "无" }}
              </span>
            </template>
          </el-table-column>
          <el-table-column
            label="操作"
            fixed="right"
@@ -268,7 +371,113 @@
        />
      </el-col>
    </el-row>
    <el-dialog
      title="批量添加任务"
      :visible.sync="batchTaskVisible"
      width="90%"
      append-to-body
    >
      <el-row :gutter="20">
        <!-- 左侧:选中患者列表 -->
        <el-col :span="12">
          <div class="batch-patient-section">
            <h4>选中患者({{ selectedPatients.length }}人)</h4>
            <el-table
              :data="selectedPatients"
              border
              style="width: 100%"
              size="small"
            >
              <el-table-column prop="patname" label="姓名" width="100" />
              <el-table-column prop="sex" label="性别" width="80">
                <template slot-scope="scope">
                  {{ scope.row.sex === 1 ? "男" : "女" }}
                </template>
              </el-table-column>
              <el-table-column
                label="就诊时间"
                align="center"
                key="admitdate"
                prop="admitdate"
              >
                <template slot-scope="scope">
                  <span>{{ formatTime(scope.row.admitdate) }}</span>
                </template>
              </el-table-column>
              <el-table-column prop="outhospno" label="病案号" />
              <el-table-column prop="deptname" label="科室" />
            </el-table>
          </div>
        </el-col>
        <!-- 右侧:任务列表 -->
        <el-col :span="12">
          <div class="batch-task-section">
            <h4>任务列表(请选择1个任务)</h4>
            <el-table
              :data="taskList"
              border
              style="width: 100%"
              size="small"
              @current-change="handleTaskSelectionChange"
              highlight-current-row
            >
              <el-table-column
                label="任务名称"
                fixed
                align="center"
                key="taskName"
                prop="taskName"
                :show-overflow-tooltip="true"
              />
              <el-table-column
                label="服务项目"
                align="center"
                key="templatename"
                prop="templatename"
                :show-overflow-tooltip="true"
              />
              <el-table-column
                label="创建人"
                align="center"
                key="createBy"
                prop="createBy"
                :show-overflow-tooltip="true"
              />
              <el-table-column
                label="创建时间"
                sortable
                align="center"
                prop="createTime"
              >
                <template slot-scope="scope">
                  <span>{{ formatTime(scope.row.createTime) }}</span>
                </template>
              </el-table-column>
              <template #empty>
                <div class="empty-message">
                  <i class="el-icon-warning"></i>
                  <span>患者科室无匹配服务</span>
                </div>
              </template>
            </el-table>
          </div>
        </el-col>
      </el-row>
      <!-- 底部按钮 -->
      <div slot="footer" class="dialog-footer">
        <el-button @click="batchTaskVisible = false">取 消</el-button>
        <el-button
          type="primary"
          :loading="batchLoading"
          @click="submitBatchTask"
          >创建任务</el-button
        >
      </div>
    </el-dialog>
    <!-- 用户导入对话框 -->
    <el-dialog
      :title="upload.title"
@@ -314,12 +523,15 @@
          </div>
        </el-upload>
      </div>
      <!-- 导入检查 -->
      <div class="uploading" v-else-if="dractive == 2">
        <el-table :data="uploadingData" style="width: 100%">
          <el-table-column prop="serial" label="序号"> </el-table-column>
          <el-table-column prop="name" label="姓名"> </el-table-column>
          <el-table-column prop="sex" label="性别"> </el-table-column>
          <el-table-column prop="name" label="姓名" width="100">
          </el-table-column>
          <el-table-column prop="sex" label="性别" width="100">
          </el-table-column>
          <el-table-column prop="certificate" label="证件类型">
          </el-table-column>
          <el-table-column prop="certificatenum" label="证件号码">
@@ -370,10 +582,14 @@
  updatePatouthosp,
  delPatouthosp,
} from "@/api/smartor/patouthosp";
import { particularpatient } from "@/api/patient/homepage";
import { listtag } from "@/api/system/label";
import { getToken } from "@/utils/auth";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import { query360PatInfo, getTasklist, addSubtask } from "@/api/AiCentre/index";
import store from "@/store";
export default {
  name: "Userhuanze",
@@ -434,6 +650,12 @@
      Labelchange: false, //修改新增弹窗
      propss: { multiple: true },
      optionstag: [], //标签列表
      batchTaskVisible: false, // 弹窗可见性
      selectedPatients: [], // 选中的患者列表
      taskList: [], // 任务列表
      selectedTask: null, // 选中的任务列表
      batchLoading: false, // 批量提交加载状态
      deptcode: "",
      Patientrange: [
        {
          name: "全部",
@@ -444,10 +666,59 @@
          id: 1,
        },
      ],
      postData: {
        XiaoXiTou: {
          FaSongFCSJC: "ZJHES",
          FaSongJGID: localStorage.getItem("orgid"),
          FaSongJGMC: localStorage.getItem("orgname"),
          FaSongSJ: "2025-01-09 17:29:36",
          FaSongXTJC: "SUIFANGXT",
          FaSongXTMC: "随访系统",
          XiaoXiID: "5FA92AFB-9833-4608-87C7-F56A654AC171",
          XiaoXiLX: "SC_LC_360STCX",
          XiaoXiMC: "360 视图查询",
          ZuHuID: localStorage.getItem("ZuHuID"),
          ZuHuMC: localStorage.getItem("orgname"),
        },
        YeWuXX: {
          BingRenXX: {
            ZhengJianHM: "",
            ZhengJianLXDM: "01",
            ZhengJianLXMC: "居民身份证",
            ZuZhiJGID: localStorage.getItem("orgid"),
            ZuZhiJGMC: localStorage.getItem("orgname"),
          },
          YongHuXX: {
            XiTongID: "SUIFANGXT",
            XiTongMC: "随访系统",
            YongHuID: "1400466972205912064",
            YongHuXM: "JNRMYY",
            ZuZhiJGID: localStorage.getItem("orgid"),
            ZuZhiJGMC: localStorage.getItem("orgname"),
            idp: "lyra",
          },
        },
      },
      defaultProps: {
        children: "children",
        label: "label",
      },
      sourcetype: [
        {
          value: 1,
          label: "科室",
          children: [],
        },
        {
          value: 2,
          label: "病区",
          children: [],
        },
        {
          value: 3,
          label: "全部",
        },
      ],
      // 用户导入参数
      upload: {
        // 是否显示弹出层(用户导入)
@@ -467,6 +738,10 @@
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        searchscope: 3,
        scopetype: [],
        leaveldeptcodes: [],
        leavehospitaldistrictcodes: [],
      },
      // 表单校验
      rules: {
@@ -523,6 +798,18 @@
    },
  },
  created() {
    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,
      };
    });
    this.getList();
    this.gettabList();
  },
@@ -530,8 +817,21 @@
    /** 查询患者列表 */
    getList() {
      this.loading = true;
      if (this.queryParams.searchscope == 3) {
        this.queryParams.leaveldeptcodes = store.getters.belongDepts.map(
          (obj) => obj.deptCode
        );
        this.queryParams.leavehospitaldistrictcodes =
          store.getters.belongWards.map((obj) => obj.districtCode);
      }
      if (this.dateRange) {
        this.queryParams.beginTime = this.dateRange[0];
        this.queryParams.endTime = this.dateRange[1];
      } else {
        this.queryParams.beginTime = "";
        this.queryParams.endTime = "";
      }
      listPatouthosp(this.queryParams).then((response) => {
        console.log(response);
        this.userList = response.rows;
        this.total = response.total;
        this.loading = false;
@@ -551,6 +851,25 @@
        this.optionstag = response.rows;
      });
    },
    // 患者范围处理
    handleChange(value) {
      let type = value[0];
      let code = value.slice(-1)[0];
      this.queryParams.leavehospitaldistrictcodes = [];
      this.queryParams.leaveldeptcodes = [];
      if (type == 1) {
        this.queryParams.leaveldeptcodes.push(code);
        this.queryParams.leavehospitaldistrictcodes = [];
        this.queryParams.searchscope = 1;
      } else if (type == 2) {
        this.queryParams.leavehospitaldistrictcodes.push(code);
        this.queryParams.leaveldeptcodes = [];
        this.queryParams.searchscope = 2;
      } else {
        this.queryParams.searchscope = 3;
      }
    },
    // 查询导入展示列表
    geterryList() {
      this.loading = true;
@@ -560,7 +879,23 @@
        this.loading = false;
      });
    },
    //患者360跳转
    gettoken360(sfzh, drcode, drname) {
      this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh;
      if (this.postData.XiaoXiTou.ZuHuMC == "丽水市中医院") {
        this.postData.YeWuXX.YongHuXX.YongHuID = "1400398571877961728";
        this.postData.YeWuXX.YongHuXX.YongHuXM = "LSZYY";
      }
      query360PatInfo(this.postData).then((res) => {
        if (res.data.url) {
          window.open(res.data.url, "_blank");
          // this.linkUrl = res.data.url;
        } else {
          this.$modal.msgWarning("360查询无结果");
        }
      });
    },
    // 筛选节点
    filterNode(value, data) {
      if (!value) return true;
@@ -600,7 +935,14 @@
    resetQuery() {
      this.dateRange = [];
      this.resetForm("queryForm");
      this.$refs.tree.setCurrentKey(null);
      this.queryParams = {
        pageNum: 1,
        pageSize: 10,
        searchscope: 3,
        scopetype: [],
        leaveldeptcodes: [],
        leavehospitaldistrictcodes: [],
      };
      this.handleQuery();
    },
    // 多选框选中数据
@@ -718,6 +1060,125 @@
      this.upload.open = false;
      this.dractive = 1;
    },
    /** 批量添加任务按钮点击 */
    handleBatchAddTask() {
      // 校验是否选中患者
      if (this.ids.length === 0) {
        this.$modal.msgWarning("请至少选中1名患者");
        return;
      }
      // 检查选中的患者中是否有已有任务的
      const hasTaskPatients = this.userList.filter(
        (item) => this.ids.includes(item.patid) && item.serverState == 1
      );
      if (hasTaskPatients.length > 0) {
        const patientNames = hasTaskPatients.map((p) => p.patname).join("、");
        this.$modal.msgError(
          `选中的患者 ${patientNames} 已有任务,无法重复添加`
        );
        return;
      }
      // 获取选中患者的科室信息(用于校验同一科室)
      const patientDepts = new Set();
      let deptcode = "";
      this.ids.forEach((patId) => {
        const patient = this.userList.find((item) => item.patid === patId);
        if (patient) {
          patientDepts.add(patient.deptname);
          deptcode = patient.deptcode;
        }
      });
      // 校验是否同一科室
      if (patientDepts.size > 1) {
        this.$modal.msgError("选中的患者不属于同一科室,无法批量添加任务");
        return;
      }
      // 获取选中患者列表
      this.selectedPatients = this.userList.filter((item) =>
        this.ids.includes(item.patid)
      );
      // 显示弹窗
      this.batchTaskVisible = true;
      // 获取任务列表
      this.loadTaskList(deptcode);
    },
    /** 加载任务列表 */
    loadTaskList(deptcode) {
      this.batchLoading = true;
      let topqueryParams = {
        pageNum: 1,
        pageSize: 10,
        serviceType: 3,
        type: 2,
        deptcode: deptcode,
      };
      getTasklist(topqueryParams).then((response) => {
        this.taskList = response.rows;
        this.batchLoading = false;
      });
    },
    /** 处理任务选择变化 */
    handleTaskSelectionChange(currentRow) {
      this.selectedTask = currentRow;
    },
    // 重写批量提交方法
    async submitBatchTask() {
      // 校验是否选中任务
      if (!this.selectedTask) {
        this.$modal.msgWarning("请选择1个任务");
        return;
      }
      this.batchLoading = true;
      const successPatients = [];
      const failedPatients = [];
      try {
        // 遍历选中的患者,逐个调用接口
        for (const patient of this.selectedPatients) {
          const params = {
            taskid: this.selectedTask.taskid,
            taskName: this.selectedTask.taskName,
            serviceType: this.selectedTask.serviceType,
            sendstate:2,
            ...patient,
            age: "",
          };
          try {
            await addSubtask(params);
            successPatients.push(patient.patname);
          } catch (error) {
            failedPatients.push(patient.patname);
          }
        }
        // 显示处理结果
        let message = `成功为 ${successPatients.length} 名患者添加任务`;
        if (failedPatients.length > 0) {
          message += `,${failedPatients.length} 名患者添加失败`;
        }
        this.$modal.msgSuccess(message);
        this.batchTaskVisible = false;
        this.getList(); // 刷新患者列表
      } catch (error) {
        this.$modal.msgError("批量添加任务过程中出错");
      } finally {
        this.batchLoading = false;
      }
    },
    /** 批量添加患者任务接口 */
    batchAddPatientTask(params) {},
  },
};
</script>
@@ -768,4 +1229,41 @@
.button-textsc {
  color: #28cfe6;
}
.batch-patient-section,
.batch-task-section {
  padding: 15px;
  border: 1px solid #ebeef5;
  border-radius: 4px;
  margin-bottom: 15px;
}
.el-table--enable-row-hover .el-table__body tr:hover > td {
  background-color: #f5f7fa;
}
.el-table__body tr.current-row > td {
  background-color: #e6f7ff;
}
/* 禁用状态下按钮样式 */
.el-button.is-disabled {
  cursor: not-allowed;
}
.batch-patient-section h4,
.batch-task-section h4 {
  margin-top: 0;
  margin-bottom: 15px;
  color: #303133;
  font-size: 16px;
}
/* 表格样式优化 */
.el-table {
  margin-bottom: 10px;
}
/* 弹窗底部按钮间距 */
.dialog-footer {
  text-align: right;
  padding: 10px 20px 20px;
}
</style>