| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <div class="leftvlue" style="margin-bottom: 20px"> |
| | | <el-row :gutter="10"> |
| | | <el-col :span="2.5" v-for="(item, index) in cardlist" :key="index"> |
| | | <el-card |
| | | shadow="hover" |
| | | :body-style="item.router ? ' cursor: pointer' : 'cursor: default'" |
| | | > |
| | | <div style="padding: 8px" @click="$router.push(item.router)"> |
| | | <span>{{ item.name }}</span> |
| | | <div |
| | | style=" |
| | | text-align: center; |
| | | font-size: 18px; |
| | | margin-top: 10px; |
| | | font-weight: 600; |
| | | " |
| | | > |
| | | {{ item.value ? item.value : 0 }} |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="2.5"> |
| | | <div class="ysfleftvlue"> |
| | | <el-card shadow="hover"> |
| | | <div style="padding: 8px"> |
| | | <span>表单已发送</span> |
| | | <div |
| | | style=" |
| | | text-align: center; |
| | | font-size: 18px; |
| | | margin-top: 10px; |
| | | font-weight: 600; |
| | | " |
| | | > |
| | | {{ yfsvalue }} |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="2.5"> |
| | | <div class="errleftvlue"> |
| | | <el-card shadow="hover"> |
| | | <div style="padding: 8px"> |
| | | <span>异常</span> |
| | | <div |
| | | style=" |
| | | text-align: center; |
| | | font-size: 18px; |
| | | margin-top: 10px; |
| | | font-weight: 600; |
| | | " |
| | | > |
| | | {{ ycvalue }} |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="2.5" v-if="orgname == '省立同德翠苑院区'"> |
| | | <div class="jgleftvlue"> |
| | | <el-card shadow="hover "> |
| | | <div style="padding: 8px"> |
| | | <span>警告</span> |
| | | <div |
| | | style=" |
| | | text-align: center; |
| | | font-size: 18px; |
| | | margin-top: 10px; |
| | | font-weight: 600; |
| | | " |
| | | > |
| | | {{ jgvalue }} |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | <statistics-cards |
| | | :cardlist="cardlist" |
| | | :ycvalue="ycvalue" |
| | | :jgvalue="jgvalue" |
| | | :show-warning-condition="orgname == '省立同德翠苑院区'" |
| | | /> |
| | | <el-row :gutter="20"> |
| | | <!--用户数据--> |
| | | <el-form |
| | |
| | | :options="sourcetype" |
| | | :props="{ expandTrigger: 'hover' }" |
| | | @change="handleChange" |
| | | filterable |
| | | clearable |
| | | ></el-cascader> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="服务状态" prop="status"> |
| | | <el-select v-model="topqueryParams.sendstateView" placeholder="请选择"> |
| | | <el-option |
| | | v-for="item in topicoptions" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | <el-form-item label="随访状态" prop="status"> |
| | | <el-cascader |
| | | v-model="serviceStatusValue" |
| | | placeholder="请选择" |
| | | :options="serviceStatusOptions" |
| | | :props="cascaderProps" |
| | | @change="handleServiceStatusChange" |
| | | clearable |
| | | ></el-cascader> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="排序方式" prop="status"> |
| | |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <!-- <el-col :span="1.5"> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-plus" |
| | |
| | | @click="handleAdd" |
| | | >新增</el-button |
| | | > |
| | | </el-col> |
| | | </el-col> --> |
| | | |
| | | <el-col :span="1.5"> |
| | | <div class="documentf"> |
| | |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | | <div class="selected-info"> |
| | | 已选中 |
| | | <span style="color: #409eff; font-weight: bold">{{ |
| | | getSelectedCount() |
| | | }}</span> |
| | | 条数据 |
| | | <el-button |
| | | v-if="getSelectedCount() > 0" |
| | | type="text" |
| | | @click="clearAllSelection" |
| | | > |
| | | 清除选中 |
| | | </el-button> |
| | | </div> |
| | | <el-table |
| | | v-loading="loading" |
| | | ref="userform" |
| | | :data="userList" |
| | | :row-class-name="tableRowClassName" |
| | | @selection-change="handleSelectionChange" |
| | | @select-all="handleSelectAll" |
| | | > |
| | | <el-table-column type="selection" width="50" align="center" /> |
| | | <el-table-column |
| | |
| | | effect="dark" |
| | | :content="scope.row.remark" |
| | | placement="top-start" |
| | | popper-class="statistics-tooltip" |
| | | > |
| | | <div v-if="scope.row.sendstateView == 1"> |
| | | <el-tag type="primary" :disable-transitions="false" |
| | |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstateView == 2"> |
| | | <el-tag type="primary" :disable-transitions="false" |
| | | >随访中</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstateView == 3"> |
| | | <el-tag type="warning" :disable-transitions="false" |
| | | >未完成</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstateView == 4"> |
| | | <el-tag type="success" :disable-transitions="false" |
| | | >已完成</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstateView == 5"> |
| | | <el-tag type="danger" :disable-transitions="false" |
| | | <div v-if="scope.row.sendstateView == 3"> |
| | | <el-tag type="warning" :disable-transitions="false" |
| | | >无需随访</el-tag |
| | | > |
| | | </div> |
| | |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="任务执行方式" |
| | | align="center" |
| | |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="出院日期" |
| | | width="200" |
| | | width="146" |
| | | align="center" |
| | | key="endtime" |
| | | prop="endtime" |
| | |
| | | > |
| | | <el-table-column |
| | | label="应随访日期" |
| | | width="200" |
| | | width="146" |
| | | align="center" |
| | | key="visitTime" |
| | | prop="visitTime" |
| | |
| | | width="120" |
| | | /> |
| | | <el-table-column |
| | | v-if="orgname != '丽水市中医院'" |
| | | label="经管医生" |
| | | label="任务状态" |
| | | align="center" |
| | | key="managementDoctor" |
| | | prop="managementDoctor" |
| | | 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="出院天数" |
| | | width="120" |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="身份证号码" |
| | | width="200" |
| | | align="center" |
| | | key="sfzh" |
| | | prop="sfzh" |
| | | /> |
| | | <el-table-column |
| | | label="联系电话" |
| | | width="200" |
| | | align="center" |
| | |
| | | prop="phone" |
| | | /> |
| | | <el-table-column |
| | | label="身份证号码" |
| | | width="200" |
| | | align="center" |
| | | key="sfzh" |
| | | prop="sfzh" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="责任护士" |
| | | width="120" |
| | | align="center" |
| | | key="nurseName" |
| | | prop="nurseName" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="经管医生" |
| | | align="center" |
| | | key="managementDoctor" |
| | | prop="managementDoctor" |
| | | width="120" |
| | | /> |
| | | <!-- <el-table-column |
| | | label="病历号" |
| | | align="center" |
| | |
| | | </span> |
| | | </template> |
| | | </el-table-column> --> |
| | | |
| | | <el-table-column |
| | | label="任务结果说明" |
| | | width="220" |
| | |
| | | type="textarea" |
| | | placeholder="请输入过滤原因" |
| | | ></el-input> |
| | | <!-- 提醒文字 --> |
| | | <div class="filter-warning"> |
| | | <i class="el-icon-warning-outline"></i> |
| | | 该功能适用于死亡、列入医院黑名单、明确拒绝随访等患者的过滤排除,过滤后该患者所有进行中任务全部停止且无法匹配新的随访任务,请谨慎操作! |
| | | </div> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | } from "@/api/AiCentre/index"; |
| | | import { alterpatient, particularpatient } from "@/api/patient/homepage"; |
| | | 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 { |
| | | // 遮罩层 |
| | |
| | | dynamicTags: ["选项一", "选项二", "选项三"], //选项 |
| | | inputVisible: false, |
| | | Labelchange: false, |
| | | ycvalue: "", |
| | | ycvalue: 0, |
| | | jgvalue: "", |
| | | yfsvalue: "", |
| | | inputValue: "", |
| | | preachform: "", |
| | | previewVisible: false, //影像随访预览弹框 |
| | | isRestoring: false, |
| | | radio: "", |
| | | radios: [], |
| | | previewtype: 2, //预览影像随访类型 |
| | |
| | | // 满意度调查数据 |
| | | scoreDialogVisible: false, |
| | | selectedRows: [], |
| | | selectedRowMap: new Map(), // key: row.id, value: row 数据 |
| | | |
| | | // 级联选择器绑定值 |
| | | serviceStatusValue: 10, |
| | | cascaderProps: { |
| | | expandTrigger: "hover", // 悬停展开 |
| | | checkStrictly: true, // ✅ 关键:允许选中任意一级 |
| | | emitPath: false, // ✅ 只返回选中的值,不返回路径数组 |
| | | }, |
| | | // 服务状态选项(一级和二级值不冲突) |
| | | serviceStatusOptions: [ |
| | | { |
| | | value: null, |
| | | label: "全部", |
| | | }, |
| | | { |
| | | value: 10, // 一级:待随访 |
| | | label: "待随访", |
| | | children: [ |
| | | { value: 1, label: "被领取" }, |
| | | { value: 2, label: "待发送" }, |
| | | { value: 3, label: "已发送" }, |
| | | { value: 5, label: "发送失败" }, |
| | | { value: 7, label: "超时" }, |
| | | ], |
| | | }, |
| | | { |
| | | value: 20, // 一级:已完成 |
| | | label: "已完成", |
| | | children: [{ value: 6, label: "已完成" }], |
| | | }, |
| | | { |
| | | value: 30, // 一级:无需随访 |
| | | label: "无需随访", |
| | | children: [{ value: 4, label: "不执行" }], |
| | | }, |
| | | ], |
| | | value: [], |
| | | list: [], |
| | | |
| | |
| | | loading: false, |
| | | cardlist: [ |
| | | { |
| | | name: "出院服务总量", |
| | | name: "患者服务总量", |
| | | value: 0, |
| | | }, |
| | | // { |
| | | // name: "患者过滤", |
| | | // value: 0, |
| | | // }, |
| | | |
| | | { |
| | | name: "无需随访", |
| | | value: 0, |
| | | }, |
| | | { |
| | | name: "需随访", |
| | | value: 0, |
| | | }, |
| | | { |
| | | name: "发送失败", |
| | | value: 0, |
| | | }, |
| | | { |
| | | name: "待随访", |
| | | value: 0, |
| | | }, |
| | | // { |
| | | // name: "已发送", |
| | | // value: 0, |
| | | // }, |
| | | |
| | | // { |
| | | // name: "表单已发送", |
| | | // value: 0, |
| | | // }, |
| | | { |
| | | name: "已完成", |
| | | value: 0, |
| | | }, |
| | | ], |
| | | zcrules: { |
| | | date1: [ |
| | |
| | | btstatus: "", |
| | | }, |
| | | // endOut: 1, |
| | | endOut: localStorage.getItem("orgname") == "丽水市中医院" ? 0 : 1, //0 出院时间(正序) 1 出院时间(倒序) 2 发送时间(正序) 3 发送时间(倒序) 7应随访日期(倒序) 应随访日期(正序) |
| | | endOut: |
| | | localStorage.getItem("orgname") == "景宁畲族自治县人民医院" ? 0 : 1, //0 出院时间(正序) 1 出院时间(倒序) 2 发送时间(正序) 3 发送时间(倒序) 7应随访日期(倒序) 应随访日期(正序) |
| | | endOuts: [ |
| | | { |
| | | value: 0, |
| | |
| | | topqueryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | sendstateView: |
| | | localStorage.getItem("orgname") == "省立同德翠苑院区" ? null : 2, |
| | | sort: localStorage.getItem("orgname") == "丽水市中医院" ? 8 : 2, //0 出院时间(正序) 1 出院时间(倒序) 2 发送时间(正序) 3 发送时间(倒序) 7应随访日期(倒序) 应随访日期(正序) |
| | | sendstateView: 1, |
| | | sort: localStorage.getItem("orgname") == "丽水市中医院" ? 8 : 1, //0 出院时间(正序) 1 出院时间(倒序) 2 发送时间(正序) 3 发送时间(倒序) 7应随访日期(倒序) 应随访日期(正序) |
| | | serviceType: 2, |
| | | sendstate: null, |
| | | searchscope: 3, |
| | | visitCount: 1, |
| | | scopetype: [], |
| | |
| | | // 监听路由参数变化 |
| | | "$route.query": { |
| | | handler(newQuery, oldQuery) { |
| | | if (newQuery.errtype !== oldQuery.errtype) { |
| | | if (newQuery?.errtype !== oldQuery?.errtype) { |
| | | console.log(22); |
| | | |
| | | this.loadData(); // 重新加载数据 |
| | | this.loadData(); |
| | | } |
| | | }, |
| | | immediate: true, |
| | |
| | | }, |
| | | methods: { |
| | | /** 查询随访服务列表 */ |
| | | getList(refresh) { |
| | | async getList(refresh) { |
| | | // 默认全部 |
| | | if (this.topqueryParams.searchscope == 3) { |
| | | this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map( |
| | |
| | | this.topqueryParams.endSendDateTime = this.formatDateToYYYYMMDDHHMMSS( |
| | | this.getEndOfDay() |
| | | ); |
| | | } else { |
| | | // this.topqueryParams.endSendDateTime = null; |
| | | } |
| | | |
| | | // 接受异常跳转 |
| | | if (this.errtype) { |
| | | this.topqueryParams.leavehospitaldistrictcodes.push( |
| | | this.leavehospitaldistrictcode |
| | | ); |
| | | } |
| | | |
| | | this.loading = true; |
| | | |
| | | if ( |
| | | this.topqueryParams.leavehospitaldistrictcodes[0] && |
| | | this.topqueryParams.leaveldeptcodes[0] |
| | |
| | | } 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].wzx) + |
| | | Number(response.rows[0].ysf) + |
| | | Number(response.rows[0].fssb); |
| | | // this.cardlist[1].value = response.rows[0].wzx; |
| | | this.cardlist[1].value = response.rows[0].ysf; |
| | | this.ycvalue = response.rows[0].yc; |
| | | Number(response.rows[0].wxsf) + Number(response.rows[0].xsf) || 0; |
| | | this.cardlist[1].value = response.rows[0].wxsf || 0; |
| | | this.ycvalue = Number(response.rows[0].yc) || 0; |
| | | this.jgvalue = response.rows[0].jg; |
| | | this.cardlist[2].value = response.rows[0].fssb; |
| | | this.cardlist[3].value = response.rows[0].dsf; |
| | | // this.cardlist[4].value = response.rows[0].yfs2; |
| | | this.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) { |
| | |
| | | } |
| | | |
| | | 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; |
| | | }); |
| | | this.loading = false; |
| | | |
| | | // ✅ 第六步:解锁 |
| | | this.$nextTick(() => { |
| | | this.isRestoring = false; |
| | | }); |
| | | } catch (error) { |
| | | console.error("获取列表失败:", error); |
| | | this.loading = false; |
| | | this.isRestoring = false; |
| | | } |
| | | }, |
| | | loadData() { |
| | | this.errtype = this.$route.query.errtype; |
| | |
| | | this.userList = response.rows[0].serviceSubtaskList; |
| | | this.total = response.total; |
| | | this.cardlist[0].value = |
| | | Number(response.rows[0].wzx) + Number(response.rows[0].ysf); |
| | | Number(response.rows[0].wxsf) + Number(response.rows[0].xsf) || 0; |
| | | this.cardlist[1].value = response.rows[0].wzx; |
| | | this.cardlist[2].value = response.rows[0].ysf; |
| | | this.ycvalue = response.rows[0].yc; |
| | | this.ycvalue = Number(response.rows[0].yc) || 0; |
| | | this.jgvalue = response.rows[0].jg; |
| | | this.cardlist[3].value = response.rows[0].fssb; |
| | | this.cardlist[4].value = response.rows[0].dsf; |
| | |
| | | }, |
| | | // 患者范围处理 |
| | | handleChange(value) { |
| | | let type = value[0]; |
| | | let code = value.slice(-1)[0]; |
| | | console.log("选择的患者范围:", value); |
| | | |
| | | // 清空之前的查询参数 |
| | | this.topqueryParams.leavehospitaldistrictcodes = []; |
| | | this.topqueryParams.leaveldeptcodes = []; |
| | | this.topqueryParams.searchscope = null; |
| | | |
| | | if (!value || value.length === 0) { |
| | | return; |
| | | } |
| | | |
| | | let type = value[0]; |
| | | let code = value.slice(-1)[0]; |
| | | |
| | | if (type == 1) { |
| | | this.topqueryParams.leaveldeptcodes.push(code); |
| | | this.topqueryParams.leavehospitaldistrictcodes = []; |
| | |
| | | this.topqueryParams.searchscope = 3; |
| | | } |
| | | }, |
| | | // 服务状态变更处理 |
| | | handleServiceStatusChange(value) { |
| | | // 清空选择 |
| | | if (value === null || value === undefined || value === "") { |
| | | this.topqueryParams.sendstateView = null; |
| | | this.topqueryParams.sendstate = null; |
| | | return; |
| | | } |
| | | console.log(value, "value"); |
| | | |
| | | // 一级节点的值(大于等于10) |
| | | if (value >= 10) { |
| | | // 选中了一级 |
| | | switch (value) { |
| | | case 10: |
| | | this.topqueryParams.sendstateView = 1; // 待随访 |
| | | break; |
| | | case 20: |
| | | this.topqueryParams.sendstateView = 2; // 已完成 |
| | | break; |
| | | case 30: |
| | | this.topqueryParams.sendstateView = 3; // 无需随访 |
| | | break; |
| | | } |
| | | this.topqueryParams.sendstate = null; |
| | | } else { |
| | | // 选中了二级(具体状态) |
| | | this.topqueryParams.sendstateView = null; |
| | | this.topqueryParams.sendstate = value; |
| | | } |
| | | }, |
| | | /** 重置按钮操作 */ |
| | | resetQuery() { |
| | | this.dateRange = []; |
| | | this.dateRangefs = []; |
| | | this.serviceStatusValue = 10; |
| | | this.topqueryParams = { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | |
| | | this.handleQuery(1); |
| | | }, |
| | | handleSelectionChange(rows) { |
| | | this.selectedRows = rows.map((row) => { |
| | | // 初始化评分字段 |
| | | return { |
| | | // ✅ 如果是恢复选中状态触发的,直接返回 |
| | | if (this.isRestoring) { |
| | | console.log("正在恢复选中状态,跳过 handleSelectionChange"); |
| | | return; |
| | | } |
| | | |
| | | console.log("handleSelectionChange 被触发,选中行数:", rows.length); |
| | | |
| | | // 只做添加操作 |
| | | rows.forEach((row) => { |
| | | this.selectedRowMap.set(row.id, { |
| | | ...row, |
| | | authenticity: row.authenticity || 0, |
| | | weekFinish: row.weekFinish || 0, |
| | |
| | | environment: row.environment || 0, |
| | | doctorSatisfaction: row.doctorSatisfaction || 0, |
| | | nurseSatisfaction: row.nurseSatisfaction || 0, |
| | | }; |
| | | }); |
| | | }); |
| | | |
| | | if (this.selectedRows.length > 0) { |
| | | this.multiple = false; |
| | | } else { |
| | | this.multiple = true; |
| | | } |
| | | this.selectedRows = Array.from(this.selectedRowMap.values()); |
| | | this.multiple = this.selectedRows.length === 0; |
| | | }, |
| | | |
| | | // 计算总分 |
| | |
| | | const originalPageSize = this.topqueryParams.pageSize; |
| | | this.topqueryParams.pageNum = null; |
| | | this.topqueryParams.pageSize = null; |
| | | this.topqueryParams.subIdList = this.selectedRows.map((item) => item.id); |
| | | this.download( |
| | | "smartor/serviceSubtask/patItemExport", |
| | | { |
| | |
| | | return "remind-row"; |
| | | } |
| | | return ""; |
| | | }, |
| | | restoreSelection() { |
| | | if (!this.$refs.userform) { |
| | | console.log("表格引用不存在"); |
| | | return; |
| | | } |
| | | |
| | | console.log("执行 restoreSelection"); |
| | | |
| | | // 清除当前页的所有选中状态 |
| | | this.$refs.userform.clearSelection(); |
| | | |
| | | // 找出当前页中哪些行是被选中的 |
| | | const toBeSelected = this.userList.filter((row) => |
| | | this.selectedRowMap.has(row.id) |
| | | ); |
| | | |
| | | console.log("需要恢复的行数:", toBeSelected.length); |
| | | |
| | | // 重新选中这些行 |
| | | toBeSelected.forEach((row) => { |
| | | this.$refs.userform.toggleRowSelection(row, true); |
| | | }); |
| | | }, |
| | | // ✅ 处理表头全选事件 |
| | | handleSelectAll(selection) { |
| | | console.log("全选事件触发,选中行数:", selection.length); |
| | | |
| | | // 如果 selection 长度等于当前页行数,说明是全选 |
| | | if (selection.length === this.userList.length) { |
| | | // 全选当前页 |
| | | this.userList.forEach((row) => { |
| | | this.selectedRowMap.set(row.id, { |
| | | ...row, |
| | | authenticity: row.authenticity || 0, |
| | | weekFinish: row.weekFinish || 0, |
| | | standard: row.standard || 0, |
| | | timeliness: row.timeliness || 0, |
| | | library: row.library || 0, |
| | | environment: row.environment || 0, |
| | | doctorSatisfaction: row.doctorSatisfaction || 0, |
| | | nurseSatisfaction: row.nurseSatisfaction || 0, |
| | | }); |
| | | }); |
| | | } else { |
| | | // 取消全选:清除当前页的选中状态 |
| | | this.userList.forEach((row) => { |
| | | this.selectedRowMap.delete(row.id); |
| | | }); |
| | | } |
| | | |
| | | // 更新 selectedRows |
| | | this.selectedRows = Array.from(this.selectedRowMap.values()); |
| | | this.multiple = this.selectedRows.length === 0; |
| | | }, |
| | | |
| | | // 清除所有选中 |
| | | clearAllSelection() { |
| | | this.selectedRowMap.clear(); |
| | | this.selectedRows = []; |
| | | this.multiple = true; |
| | | |
| | | if (this.$refs.userform) { |
| | | this.$refs.userform.clearSelection(); |
| | | } |
| | | }, |
| | | |
| | | // 获取选中数量 |
| | | getSelectedCount() { |
| | | return this.selectedRowMap.size; |
| | | }, |
| | | // 创建再次随访服务 |
| | | setupsubtask() { |
| | |
| | | border-color: #d8b4fe; |
| | | opacity: 1; /* 保持禁用状态透明度 */ |
| | | } |
| | | .statistics-tooltip { |
| | | background: #ffffff !important; |
| | | color: #1976d2 !important; |
| | | border: 1px solid #bbdefb !important; |
| | | border-radius: 8px !important; |
| | | padding: 10px 14px !important; |
| | | font-size: 13px !important; |
| | | line-height: 1.6 !important; |
| | | box-shadow: 0 4px 12px rgba(25, 118, 210, 0.15) !important; |
| | | } |
| | | .statistics-tooltip .popper__arrow { |
| | | border-bottom-color: #bbdefb !important; |
| | | } |
| | | |
| | | .statistics-tooltip .popper__arrow::after { |
| | | border-bottom-color: #ffffff !important; |
| | | } |
| | | // 选项字体放大 |
| | | // ::v-deep.el-checkbox-group { |
| | | // span { |
| | | // font-size: 24px; |
| | | // } |
| | | // } |
| | | .filter-warning { |
| | | margin-top: 8px; |
| | | padding: 10px 14px; |
| | | background: #fff7e6; |
| | | border: 1px solid #ffe58f; |
| | | border-radius: 6px; |
| | | color: #d46b08; |
| | | font-size: 18px; |
| | | line-height: 1.6; |
| | | display: flex; |
| | | align-items: flex-start; |
| | | gap: 6px; |
| | | } |
| | | |
| | | .filter-warning .el-icon-warning-outline { |
| | | font-size: 16px; |
| | | color: #faad14; |
| | | flex-shrink: 0; |
| | | margin-top: 2px; |
| | | } |
| | | |
| | | ::v-deep .el-table__row.selected-row:hover > td { |
| | | background-color: #e6f7ff !important; |
| | | } |
| | | |
| | | /* 选中信息显示 */ |
| | | .selected-info { |
| | | padding: 10px 0; |
| | | font-size: 14px; |
| | | color: #666; |
| | | } |
| | | </style> |