Merge branch 'master' of http://101.42.27.146:5001/r/ltkj_peisweb_region
| | |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | export function noticeToday() { |
| | | return request({ |
| | | url: '/system/notice/noticeToday', |
| | | method: 'get', |
| | | }) |
| | | } |
| | | // 查询公告详细 |
| | | export function getNotice(noticeId) { |
| | | return request({ |
| | |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | // 查询用户列表 |
| | | export function listUser1(query) { |
| | | return request({ |
| | | url: '/system/user/userListByDeptId', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | export function getlistUser() { |
| | | return request({ |
| | | url: '/system/user/getList', |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | size="small" |
| | | :inline="true" |
| | | label-width="68px" |
| | | @submit.native.prevent |
| | | > |
| | | <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="68px" @submit.native.prevent> |
| | | <el-form-item label="体检号" prop="reportDoctorCode"> |
| | | <el-input |
| | | ref="inputName" |
| | | v-model="queryParams.tjNum" |
| | | placeholder="请输入体检号" |
| | | clearable |
| | | @keyup.enter.native="handleQuery" |
| | | style="width: 170px" |
| | | /> |
| | | <el-input ref="inputName" v-model="queryParams.tjNum" placeholder="请输入体检号" clearable |
| | | @keyup.enter.native="handleQuery" style="width: 170px" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | size="mini" |
| | | @click="handleQuery" |
| | | style="margin-right: 15px" |
| | | >查询</el-button |
| | | > |
| | | <el-button |
| | | icon="el-icon-refresh" |
| | | type="primary" |
| | | size="mini" |
| | | @click="resetQuery" |
| | | >重置</el-button |
| | | > |
| | | <el-button |
| | | icon="el-icon-check" |
| | | type="primary" |
| | | size="mini" |
| | | style="margin-right: 15px" |
| | | @click="tongbu" |
| | | :disabled="!selectedFirstTable" |
| | | >同步</el-button |
| | | > |
| | | <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery" style="margin-right: 15px"> |
| | | 查询 |
| | | </el-button> |
| | | <el-button icon="el-icon-refresh" type="primary" size="mini" @click="resetQuery"> |
| | | 重置 |
| | | </el-button> |
| | | <el-button icon="el-icon-check" type="primary" size="mini" style="margin-right: 15px" @click="tongbu"> |
| | | 同步 |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <div class="table-title"> |
| | | <h3>检验记录</h3> |
| | | <div class="box"> |
| | | <div class="table-header"> |
| | | 检验记录 |
| | | </div> |
| | | <div> |
| | | <el-table :data="exaLists" border style="width: 100%" @selection-change="handleSelectionChange" |
| | | :header-cell-style="{ background: '#aad8df', fontSize: '14px', color: '#333' }" height="350" ref="firstTable"> |
| | | <el-table-column fixed type="selection" align="center" label="选择" width="50" /> |
| | | <el-table-column label="姓名" align="center" prop="name" width="80" /> |
| | | <el-table-column label="性别" align="center" prop="gender" width="80" /> |
| | | <el-table-column label="年龄" align="center" prop="patientAge" width="80" /> |
| | | <el-table-column label="送检科室" align="center" prop="deptName" width="100" /> |
| | | <el-table-column label="检验项目" align="center" prop="checkParts" width="350" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="项目编号" align="center" prop="jcxmid" width="150" /> |
| | | <el-table-column label="审核医师" align="center" prop="shys" width="150" /> |
| | | <el-table-column label="报告时间" align="center" prop="examinationDate" width="150" /> |
| | | <el-table-column label="门诊号" align="center" prop="mzh" width="140" /> |
| | | <el-table-column label="申请单号" align="center" prop="brid" width="145" /> |
| | | <el-table-column label="报告医师" align="center" prop="reportDoctorName" width="120" /> |
| | | <el-table-column label="检验医师名" align="center" prop="checkDoctorName" width="120" /> |
| | | <el-table-column align="center" label="检测项目" width="100"> |
| | | <template slot-scope="scope"> |
| | | <div>{{ scope.row.proName }}</div> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column align="center" prop="proResult" label="检测结果" width="180" /> |
| | | <el-table-column align="center" prop="company" label="单位" width="80" /> |
| | | <el-table-column align="center" prop="conclusion" label="异常" width="180" /> |
| | | <el-table-column align="center" prop="tjStandardGtValue" label="参考范围" width="120" /> |
| | | </el-table> |
| | | </div> |
| | | </div> |
| | | <el-table |
| | | id="ta" |
| | | ref="tb" |
| | | :data="exaLists" |
| | | v-loading="loading" |
| | | border |
| | | style="width: 100%" |
| | | height="350" |
| | | @selection-change="handleCurrentChange" |
| | | :header-cell-style="{ background: '#aad8df' }" |
| | | > |
| | | <!-- @selection-change="handleSelectionChange" :row-class-name="tableRowClassName" --> |
| | | <el-table-column |
| | | fixed |
| | | type="selection" |
| | | align="center" |
| | | label="选择" |
| | | width="40" |
| | | > |
| | | <!-- :selectable="isSelectable" --> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="姓名" align="center" prop="name" width="80px" /> |
| | | <el-table-column label="性别" align="center" prop="gender" width="80px" /> |
| | | <el-table-column |
| | | label="年龄" |
| | | align="center" |
| | | prop="patientAge" |
| | | width="80px" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="送检科室" |
| | | align="center" |
| | | prop="deptName" |
| | | width="100px" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="检查项目" |
| | | align="center" |
| | | prop="checkParts" |
| | | width="150px" |
| | | /> |
| | | <el-table-column |
| | | label="报告时间" |
| | | align="center" |
| | | prop="examinationDate" |
| | | width="150px" |
| | | :formatter="formatDate" |
| | | /> |
| | | |
| | | <el-table-column label="门诊号" align="center" prop="mzh" width="140px" /> |
| | | <el-table-column |
| | | label="申请单号" |
| | | align="center" |
| | | prop="brid" |
| | | width="145px" |
| | | /> |
| | | <el-table-column |
| | | label="结果状态" |
| | | align="center" |
| | | prop="diagnosis" |
| | | width="150" |
| | | :show-overflow-tooltip="true" |
| | | /> |
| | | <el-table-column |
| | | label="报告医师" |
| | | align="center" |
| | | prop="reportDoctorName" |
| | | width="120px" |
| | | /> |
| | | <el-table-column |
| | | label="检查医师名" |
| | | align="center" |
| | | prop="checkDoctorName" |
| | | width="120px" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="结果表现" |
| | | align="center" |
| | | prop="examination" |
| | | :show-overflow-tooltip="true" |
| | | /> |
| | | </el-table> |
| | | |
| | | <div class="table-title"> |
| | | <h3>体检记录</h3> |
| | | </div> |
| | | <el-table |
| | | border |
| | | max-height="280" |
| | | ref="tab1" |
| | | :data="checkList" |
| | | v-loading="loading" |
| | | <h3> |
| | | 体检记录: |
| | | <span class="highlight">姓名:{{ infoList.tjCustomerName || "暂无" }}</span> |
| | | <span class="highlight">性别:{{ infoList.tjCustomerSex == 0 ? "男" : infoList.tjCustomerSex == 1 ? "女" : "暂无" }}</span> |
| | | <span class="highlight">年龄:{{ infoList.tjCustomerAge || "暂无" }}</span> |
| | | </h3> |
| | | </div> |
| | | <el-table border height="350" ref="tab1" :data="checkList" v-loading="loading" style="width: 100%" |
| | | @selection-change="handleSelectionChangeSecond" |
| | | > |
| | | <el-table-column type="selection" width="55"> </el-table-column> |
| | | <el-table-column |
| | | label="状态" |
| | | align="center" |
| | | prop="type" |
| | | :show-overflow-tooltip="true" |
| | | min-width="60" |
| | | > |
| | | :header-cell-style="{ background: '#aad8df', fontSize: '14px', color: '#333' }"> |
| | | <el-table-column type="selection" width="60" /> |
| | | <el-table-column label="状态" align="center" prop="type" :show-overflow-tooltip="true" min-width="60"> |
| | | <template slot-scope="scope"> |
| | | <span v-if="scope.row.type == '0'">未检</span> |
| | | <span v-if="scope.row.type == '1'">已检</span> |
| | |
| | | <span v-if="scope.row.type == '3'">延期</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="科室" |
| | | align="center" |
| | | prop="deptName" |
| | | min-width="115" |
| | | /> |
| | | <el-table-column |
| | | label="项目" |
| | | align="center" |
| | | prop="proName" |
| | | min-width="160" |
| | | /> |
| | | <el-table-column |
| | | label="收费方式" |
| | | align="center" |
| | | prop="sffs" |
| | | min-width="80" |
| | | /> |
| | | <el-table-column |
| | | label="是否收费" |
| | | align="center" |
| | | prop="isPay" |
| | | min-width="80" |
| | | /> |
| | | <el-table-column |
| | | label="检查时间" |
| | | align="center" |
| | | prop="bcupdateTime" |
| | | min-width="160" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="最后修改时间" |
| | | align="center" |
| | | prop="zhupdateTime" |
| | | min-width="160" |
| | | /> |
| | | <el-table-column label="科室" align="center" prop="deptName" min-width="115" /> |
| | | <el-table-column label="项目" align="center" prop="proName" min-width="160" /> |
| | | <el-table-column label="收费方式" align="center" prop="sffs" min-width="80" /> |
| | | <el-table-column label="是否收费" align="center" prop="isPay" min-width="80" /> |
| | | <el-table-column label="检验时间" align="center" prop="bcupdateTime" min-width="160" /> |
| | | <el-table-column label="最后修改时间" align="center" prop="zhupdateTime" min-width="160" /> |
| | | </el-table> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | <script> |
| | | import { getlisList, getJyTjList, asyncPacs } from "@/api/doctor/pacsCheck"; |
| | | import { getOrderList } from "@/api/hosp/order"; |
| | | import moment from "moment"; |
| | | |
| | | export default { |
| | | dicts: ["dict_tj_status"], |
| | | data() { |
| | | return { |
| | | isProcessing: false, // 防止死循环 |
| | | isDeselection: false, // 标记是否为取消选中 |
| | | infoList: {}, |
| | | dis: false, |
| | | code: null, |
| | | createTimeList: "", |
| | | total: 0, |
| | | loading: false, |
| | | isSyncing: false, |
| | | // 查询参数 |
| | | isFetchingRightTableData: false, |
| | | queryParams: { |
| | | // page: 1, |
| | | // pageSize: 20, |
| | | name: null, |
| | | start: null, |
| | | end: null, |
| | | tjNum: null, |
| | | }, |
| | | // 绑定单选按钮 |
| | | checkStatus: "0", |
| | | exaLists: [], |
| | | selectedFirstTable: null, // 第一个表格选中行 |
| | | selectedSecondTable: [], // 第二个表格选中行 |
| | | // 表单参数 |
| | | selectedFirstTable: null, |
| | | selectedSecondTable: [], |
| | | form: {}, |
| | | clearTimeSet: null, |
| | | tjNumbers: "", |
| | |
| | | this.$refs.inputName.focus(); |
| | | }); |
| | | }, |
| | | |
| | | methods: { |
| | | handleDateChange(val) { |
| | | if (val && val.length === 2) { |
| | | this.queryParams.start = val[0]; // 设置开始时间 |
| | | this.queryParams.end = val[1]; // 设置结束时间 |
| | | this.queryParams.start = val[0]; |
| | | this.queryParams.end = val[1]; |
| | | } else { |
| | | this.queryParams.start = null; |
| | | this.queryParams.end = null; |
| | | } |
| | | console.log("Query Params:", this.queryParams); |
| | | }, |
| | | // isSelectable(row) { |
| | | // return !!row.mzh; |
| | | // }, |
| | | |
| | | tableRowClassName({ row }) { |
| | | return !row.mzh ? "row-disabled" : ""; |
| | | return !row.brid ? "row-disabled" : ""; |
| | | }, |
| | | |
| | | handleSelectionChange(val) { |
| | | console.log(val); |
| | | /* if (val.length > 1) { |
| | | let del_row = val.shift(); |
| | | this.$refs.tb.toggleRowSelection(del_row, false); //设置这一行取消选中 |
| | | handleSelectionChange(val) { |
| | | // 防止重复触发 |
| | | if (this.isProcessingSelection) { |
| | | return; |
| | | } |
| | | this.isProcessingSelection = true; |
| | | |
| | | // 如果没有选中行,清空所有选择并跳过接口调用 |
| | | if (val.length === 0) { |
| | | this.$refs.firstTable.clearSelection(); |
| | | this.selectedFirstTable = null; |
| | | this.checkList = []; |
| | | this.isDeselection = true; |
| | | this.$nextTick(() => { |
| | | this.isProcessingSelection = false; |
| | | this.$refs.firstTable.$forceUpdate(); // 强制刷新表格 |
| | | }); |
| | | return; |
| | | } |
| | | |
| | | // 检查是否点击了全选按钮(val 长度等于表格总行数) |
| | | if (val.length === this.exaLists.length) { |
| | | this.selectedFirstTable = [...this.exaLists]; // 选中所有行 |
| | | this.$refs.firstTable.clearSelection(); |
| | | this.exaLists.forEach(row => { |
| | | if (!row.brid) { |
| | | return; |
| | | } |
| | | console.log(val, 999); */ |
| | | this.$refs.firstTable.toggleRowSelection(row, true, false); |
| | | }); |
| | | } else { |
| | | // 获取最新选中的行 |
| | | const latestSelectedRow = val[val.length - 1]; |
| | | |
| | | if (val.length > 0) { |
| | | // const selectedRow = val[0]; |
| | | // console.log(val[0], 555); |
| | | |
| | | this.selectedFirstTable = val; |
| | | console.log("当前选中的行数据:", this.selectedFirstTable); |
| | | // this.fetchRightTableData(selectedRow); |
| | | } else { |
| | | this.selectedFirstTable = null; |
| | | this.checkList = []; |
| | | } |
| | | }, |
| | | |
| | | handleSelectionChange(val) { |
| | | console.log(val); |
| | | if (val.length > 1) { |
| | | let del_row = val.shift(); |
| | | this.$refs.tb.toggleRowSelection(del_row, false); //设置这一行取消选中 |
| | | } |
| | | console.log(val, 999); |
| | | |
| | | if (val.length > 0) { |
| | | const selectedRow = val[0]; |
| | | console.log(val[0], 555); |
| | | |
| | | this.selectedFirstTable = selectedRow; |
| | | console.log("当前选中的行数据:", this.selectedFirstTable); |
| | | this.fetchRightTableData(selectedRow); |
| | | } else { |
| | | this.selectedFirstTable = null; |
| | | this.checkList = []; |
| | | } |
| | | }, |
| | | // 根据选中的行数据请求右边表格数据 |
| | | fetchRightTableData(selectedRow) { |
| | | const code = selectedRow.mzh; |
| | | if (!code) return; |
| | | this.loading = true; |
| | | getJyTjList(code).then((response) => { |
| | | this.checkList = response.data; |
| | | this.loading = false; |
| | | // 检查是否点击了已选中的行(取消所有选中) |
| | | const isTogglingSelectedRow = this.selectedFirstTable && this.selectedFirstTable.some(row => row.tempId === latestSelectedRow.tempId); |
| | | if (isTogglingSelectedRow) { |
| | | this.$refs.firstTable.clearSelection(); |
| | | this.selectedFirstTable = null; |
| | | this.checkList = []; |
| | | this.isDeselection = true; |
| | | this.$nextTick(() => { |
| | | this.isProcessingSelection = false; |
| | | this.$refs.firstTable.$forceUpdate(); // 强制刷新表格 |
| | | }); |
| | | }, |
| | | return; |
| | | } |
| | | |
| | | formatDate(row) { |
| | | if (!row.examinationDate) return ""; |
| | | // 正常选中逻辑:根据 brid 筛选 |
| | | const filterKey = 'brid'; |
| | | const filterValue = latestSelectedRow.brid; |
| | | |
| | | // 使用 moment 解析指定格式的日期字符串 |
| | | const date = moment(row.examinationDate, "MM DD YYYY hh:mmA"); |
| | | // 清空所有选中状态 |
| | | this.$refs.firstTable.clearSelection(); |
| | | |
| | | if (!date.isValid()) return "无效日期"; |
| | | // 选中与 brid 匹配的行 |
| | | const rowsToSelect = this.exaLists.filter(row => row.brid === filterValue); |
| | | rowsToSelect.forEach(row => { |
| | | if (!row.brid) { |
| | | console.warn(`名称为 ${row.name} 的行没有申请单号,跳过选择`); |
| | | return; |
| | | } |
| | | this.$refs.firstTable.toggleRowSelection(row, true, false); |
| | | }); |
| | | |
| | | // 格式化为所需格式 |
| | | return date.format("YYYY-MM-DD HH:mm"); |
| | | // 更新 selectedFirstTable 为 brid 匹配的行 |
| | | this.selectedFirstTable = rowsToSelect; |
| | | } |
| | | |
| | | // 调用右侧表格数据 |
| | | if (!this.isFetchingRightTableData && this.selectedFirstTable.length > 0) { |
| | | this.isFetchingRightTableData = true; |
| | | this.fetchRightTableData().finally(() => { |
| | | this.isFetchingRightTableData = false; |
| | | this.$nextTick(() => { |
| | | // 仅更新样式,不触发新事件 |
| | | this.$refs.firstTable.$forceUpdate(); |
| | | this.isProcessingSelection = false; |
| | | }); |
| | | }); |
| | | } else { |
| | | this.isProcessingSelection = false; |
| | | } |
| | | |
| | | // 重置 isDeselection 状态 |
| | | this.isDeselection = false; |
| | | }, |
| | | fetchRightTableData() { |
| | | const code = this.queryParams.tjNum; |
| | | if (!code) { |
| | | console.warn('未提供体检号,跳过 fetchRightTableData'); |
| | | this.checkList = []; |
| | | this.loading = false; |
| | | return Promise.resolve(); |
| | | } |
| | | this.loading = true; |
| | | return getJyTjList(code) |
| | | .then((response) => { |
| | | this.checkList = response.data || []; |
| | | this.loading = false; |
| | | }) |
| | | .catch((error) => { |
| | | console.error('获取 checkList 失败:', error); |
| | | this.checkList = []; |
| | | this.loading = false; |
| | | throw error; |
| | | }); |
| | | }, |
| | | |
| | | handleSelectionChangeSecond(selectedRows) { |
| | | this.selectedSecondTable = selectedRows; |
| | | console.log("当前选中的行数据:", this.selectedSecondTable); |
| | | if (selectedRows.length > 1) { |
| | | let del_row = selectedRows.shift(); |
| | | this.$refs.tab1.toggleRowSelection(del_row, false); |
| | | } |
| | | }, |
| | | getList() { |
| | | |
| | | async handleQuery() { |
| | | if (!this.queryParams.tjNum) { |
| | | this.$message.error("体检号不能为空"); |
| | | return; |
| | | } |
| | | |
| | | this.loading = true; |
| | | try { |
| | | // 并行执行两个查询 |
| | | const [orderResponse, lisResponse] = await Promise.all([ |
| | | getOrderList(this.queryParams).catch((error) => { |
| | | console.error('获取 orderList 失败:', error); |
| | | return { data: { list: [] } }; // 返回空数据以继续执行 |
| | | }), |
| | | getlisList(this.queryParams), |
| | | ]); |
| | | |
| | | // 处理 getOrderList 结果 |
| | | if (orderResponse.data?.list?.length > 0) { |
| | | this.infoList = orderResponse.data.list[0]; |
| | | } else { |
| | | this.infoList = {}; |
| | | console.warn('getOrderList 返回空列表'); |
| | | } |
| | | |
| | | // 处理 getlisList 结果 |
| | | if (lisResponse.code === 200) { |
| | | this.exaLists = lisResponse.data.map((item, index) => ({ |
| | | ...item, |
| | | brid: item.brid?.trim(), // 清理空格 |
| | | mzh: item.mzh?.trim(), |
| | | tempId: index, |
| | | })); |
| | | |
| | | // 获取右侧表格数据 |
| | | await this.fetchRightTableData(); |
| | | } else { |
| | | this.exaLists = []; |
| | | this.$message.error(lisResponse.msg || "查询检验记录失败"); |
| | | } |
| | | } catch (error) { |
| | | console.error('查询失败:', error); |
| | | this.$message.error(error?.msg || "查询失败,请稍后重试"); |
| | | this.exaLists = []; |
| | | this.checkList = []; |
| | | this.infoList = {}; |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | |
| | | // 处理时间范围 |
| | | if (this.createTimeList) { |
| | | this.queryParams.start = this.createTimeList[0]; |
| | | this.queryParams.end = this.createTimeList[1]; |
| | | } else if (this.createTimeList == null) { |
| | | } else { |
| | | this.queryParams.start = null; |
| | | this.queryParams.end = null; |
| | | } |
| | | }, |
| | | |
| | | /** 搜索按钮操作 */ |
| | | handleQuery() { |
| | | // this.queryParams.page = 1; |
| | | this.loading = true; |
| | | getlisList(this.queryParams) |
| | | .then((res) => { |
| | | console.log(res, 1111); |
| | | if (res.code == 200) { |
| | | this.loading = false; |
| | | this.exaLists = res.data; |
| | | this.code = this.exaLists.mzh; |
| | | } |
| | | }) |
| | | .catch((error) => { |
| | | this.loading = false; |
| | | this.$message.error(res.msg || "查询失败,请稍后重试"); |
| | | }); |
| | | this.getList(); |
| | | }, |
| | | |
| | | /** 重置按钮操作 */ |
| | | resetQuery() { |
| | | this.createTimeList = []; |
| | | this.resetForm("queryForm"); |
| | |
| | | end: null, |
| | | tjNum: null, |
| | | }; |
| | | |
| | | // 清空其他依赖数据 |
| | | this.checkList = []; |
| | | this.exaLists = []; |
| | | this.infoList = {}; |
| | | }, |
| | | |
| | | handleCurrentChange(row) { |
| | | this.currentRow = row; |
| | | // console.log('当前选中的行:', row); |
| | | }, |
| | | |
| | | setTime() { |
| | | //设置定时器 |
| | | this.clearTimeSet = setInterval(() => { |
| | | this.$modal.closeLoading(); |
| | | }, 300000); |
| | | }, |
| | | tongbu(row) { |
| | | |
| | | tongbu() { |
| | | this.$modal.loading("正在同步,请稍候..."); |
| | | this.setTime(); |
| | | const requestData = { |
| | | pacs: this.selectedFirstTable, // 左侧表格选中数据 |
| | | tj: this.selectedSecondTable[0], // 右侧表格选中数据 |
| | | lis: this.selectedFirstTable ? this.selectedFirstTable.map((item) => ({ |
| | | ...item, |
| | | tjNum: this.queryParams.tjNum, |
| | | })) : [], |
| | | jcxmid: this.selectedFirstTable && this.selectedFirstTable.length > 0 ? this.selectedFirstTable[0].jcxmid : null, |
| | | shys: this.selectedFirstTable && this.selectedFirstTable.length > 0 ? this.selectedFirstTable[0].shys : null, |
| | | tj: this.selectedSecondTable[0], |
| | | }; |
| | | |
| | | if (!this.selectedSecondTable || this.selectedSecondTable.length === 0) { |
| | | this.$message.error("至少选一条数据!"); |
| | | return; |
| | | } |
| | | |
| | | asyncPacs(requestData) |
| | | .then((res) => { |
| | | if (res.code == 200) { |
| | | this.fetchRightTableData(this.selectedFirstTable); |
| | | if (res.code === 200) { |
| | | this.fetchRightTableData(); |
| | | clearInterval(this.clearTimeSet); |
| | | this.clearTimeSet = null; |
| | | this.$modal.closeLoading(); |
| | |
| | | }); |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | #ta .el-table__header-wrapper .el-checkbox { |
| | | display: none; |
| | | };</script> |
| | | <style lang="scss" scoped> |
| | | .app-container { |
| | | padding: 20px; |
| | | background: #f5f7fa; |
| | | } |
| | | |
| | | .table-header { |
| | | text-align: center; |
| | | background-color: #aad8df; |
| | | padding: 10px; |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | color: #333; |
| | | margin-top: 10px; |
| | | border-radius: 4px 4px 0 0; |
| | | } |
| | | |
| | | .table-title { |
| | | text-align: left; |
| | | margin: 20px 0; |
| | | padding: 10px 0; |
| | | } |
| | | |
| | | .table-title h3 { |
| | | font-size: 16px; |
| | | color: #333; |
| | | margin: 0; |
| | | line-height: 1.5; |
| | | display: flex; |
| | | align-items: center; |
| | | flex-wrap: wrap; |
| | | gap: 20px; |
| | | } |
| | | |
| | | .table-title .highlight { |
| | | font-weight: bold; |
| | | color: #2c3e50; |
| | | } |
| | | |
| | | .el-table { |
| | | border-radius: 4px; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .el-table .warning-row { |
| | | background: #e5f3ff !important; |
| | | } |
| | | |
| | | ::v-deep .el-table__body tr.current-row > td { |
| | | background: #edf2fa !important; |
| | | } |
| | | |
| | | .table-title { |
| | | text-align: center; |
| | | margin-bottom: 15px; |
| | | } |
| | | .row-disabled { |
| | | color: #ccc; /* 设置禁用行的字体颜色 */ |
| | | pointer-events: none; /* 禁止鼠标操作 */ |
| | | background-color: #f5f5f5; /* 设置禁用行的背景色 */ |
| | | } |
| | | |
| | | .pag { |
| | | width: 100%; |
| | | display: flex; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .pag1 { |
| | | width: 30%; |
| | | color: #999; |
| | | background-color: #f5f5f5; |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | size="small" |
| | | :inline="true" |
| | | label-width="68px" |
| | | @submit.native.prevent |
| | | > |
| | | <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="68px" @submit.native.prevent> |
| | | <el-form-item label="体检号" prop="reportDoctorCode"> |
| | | <el-input |
| | | ref="inputName" |
| | | v-model="queryParams.tjNum" |
| | | placeholder="请输入体检号" |
| | | clearable |
| | | @keyup.enter.native="handleQuery" |
| | | style="width: 170px" |
| | | @input="onInput" |
| | | /> |
| | | <el-input ref="inputName" v-model="queryParams.tjNum" placeholder="请输入体检号" clearable |
| | | @keyup.enter.native="handleQuery" @input="onInput" style="width: 170px" /> |
| | | </el-form-item> |
| | | <!-- <el-form-item label="姓名" prop="name"> |
| | | <el-input |
| | | v-model="queryParams.name" |
| | | placeholder="请输入姓名" |
| | | clearable |
| | | @keyup.enter.native="handleQuery" |
| | | style="width: 110px" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="登记时间" prop="createTimeList"> |
| | | <el-date-picker |
| | | v-model="createTimeList" |
| | | type="datetimerange" |
| | | align="right" |
| | | :picker-options="pickerOptions" |
| | | style="width: 310px" |
| | | start-placeholder="开始日期" |
| | | end-placeholder="结束日期" |
| | | format="yyyy.MM.dd" |
| | | value-format="yyyy.MM.dd " |
| | | @change="handleDateChange" |
| | | > |
| | | </el-date-picker> |
| | | </el-form-item> --> |
| | | <el-form-item> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | size="mini" |
| | | @click="handleQuery" |
| | | style="margin-right: 15px" |
| | | >查询</el-button |
| | | > |
| | | <!-- <el-button size="mini" @click="tongbu(scope.row)" |
| | | >同步</el-button |
| | | > --> |
| | | <el-button |
| | | icon="el-icon-refresh" |
| | | type="primary" |
| | | size="mini" |
| | | @click="resetQuery" |
| | | >重置</el-button |
| | | > |
| | | <el-button |
| | | icon="el-icon-check" |
| | | type="primary" |
| | | size="mini" |
| | | style="margin-right: 15px" |
| | | @click="tongbu" |
| | | :disabled="!selectedFirstTable" |
| | | >同步</el-button |
| | | > |
| | | <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery" style="margin-right: 15px"> |
| | | 查询 |
| | | </el-button> |
| | | <el-button icon="el-icon-refresh" type="primary" size="mini" @click="resetQuery"> |
| | | 重置 |
| | | </el-button> |
| | | <el-button icon="el-icon-check" type="primary" size="mini" style="margin-right: 15px" @click="tongbu" |
| | | :disabled="!selectedFirstTable"> |
| | | 同步 |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <!-- <el-radio-group |
| | | v-model="checkStatus" |
| | | @input="radioChange" |
| | | style="margin: 10px 15px" |
| | | > |
| | | </el-radio-group> --> |
| | | |
| | | <div class="table-title"> |
| | | <h3>检查记录</h3> |
| | | <div class="table-title table-header"> |
| | | <div style="text-align: center;">检查记录</div> |
| | | </div> |
| | | <!-- v-loading="loading" :row-class-name="tableRowClassName" @current-change="handleCurrentChange" --> |
| | | <el-table |
| | | id="ta" |
| | | ref="tb" |
| | | :data="exaLists" |
| | | v-loading="loading" |
| | | border |
| | | height="350" |
| | | @current-change="handleCurrentChange" |
| | | @selection-change="handleSelectionChange" |
| | | <el-table ref="tb" :data="exaLists" v-loading="loading" border style="width: 100%" height="350" |
| | | @current-change="handleCurrentChange" @selection-change="handleSelectionChange" |
| | | :row-class-name="tableRowClassName" |
| | | > |
| | | <el-table-column |
| | | fixed |
| | | type="selection" |
| | | align="center" |
| | | label="选择" |
| | | width="40" |
| | | > |
| | | <!-- :selectable="isSelectable" --> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="姓名" align="center" prop="name" width="80px" /> |
| | | <el-table-column label="性别" align="center" prop="gender" width="80px" /> |
| | | <el-table-column |
| | | label="年龄" |
| | | align="center" |
| | | prop="patientAge" |
| | | width="80px" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="送检科室" |
| | | align="center" |
| | | prop="deptName" |
| | | width="100px" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="检查项目" |
| | | align="center" |
| | | prop="checkParts" |
| | | width="150px" |
| | | /> |
| | | <!-- :formatter="formatDate" --> |
| | | <el-table-column |
| | | label="报告时间" |
| | | align="center" |
| | | prop="examinationDate" |
| | | width="150px" |
| | | /> |
| | | |
| | | <el-table-column label="门诊号" align="center" prop="mzh" width="140px" /> |
| | | <el-table-column |
| | | label="申请单号" |
| | | align="center" |
| | | prop="brid" |
| | | width="145px" |
| | | /> |
| | | <el-table-column |
| | | label="结果状态" |
| | | align="center" |
| | | prop="diagnosis" |
| | | width="150" |
| | | :show-overflow-tooltip="true" |
| | | /> |
| | | <!-- :show-overflow-tooltip="true" --> |
| | | <el-table-column |
| | | label="报告医师" |
| | | align="center" |
| | | prop="reportDoctorName" |
| | | width="120px" |
| | | /> |
| | | <el-table-column |
| | | label="检查医师名" |
| | | align="center" |
| | | prop="checkDoctorName" |
| | | width="120px" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="结果表现" |
| | | align="center" |
| | | prop="examination" |
| | | :show-overflow-tooltip="true" |
| | | /> |
| | | :header-cell-style="{ background: '#aad8df', fontSize: '14px', color: '#333' }"> |
| | | <el-table-column fixed type="selection" align="center" label="选择" width="50" /> |
| | | <el-table-column label="姓名" align="center" prop="name" width="80" /> |
| | | <el-table-column label="性别" align="center" prop="gender" width="80" /> |
| | | <el-table-column label="年龄" align="center" prop="patientAge" width="80" /> |
| | | <el-table-column label="送检科室" align="center" prop="deptName" width="100" /> |
| | | <el-table-column label="检查项目" align="center" prop="checkParts" width="150" /> |
| | | <el-table-column label="报告时间" align="center" prop="examinationDate" width="153" :formatter="formatDate" /> |
| | | <el-table-column label="门诊号" align="center" prop="mzh" width="140" /> |
| | | <el-table-column label="申请单号" align="center" prop="brid" width="145" /> |
| | | <el-table-column label="结果状态" align="center" prop="diagnosis" width="150" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="报告医师" align="center" prop="reportDoctorName" width="120" /> |
| | | <el-table-column label="检查医师名" align="center" prop="checkDoctorName" width="120" /> |
| | | <el-table-column label="结果表现" align="center" prop="examination" :show-overflow-tooltip="true" /> |
| | | </el-table> |
| | | |
| | | <div class="table-title"> |
| | | <h3>体检记录</h3> |
| | | <h3> |
| | | 体检记录: |
| | | <span class="highlight">姓名:{{ infoList.tjCustomerName || "暂无" }}</span> |
| | | <span class="highlight">性别:{{ infoList.tjCustomerSex == 0 ? "男" : infoList.tjCustomerSex == 1 ? "女" : "暂无" |
| | | }}</span> |
| | | <span class="highlight">年龄:{{ infoList.tjCustomerAge || "暂无" }}</span> |
| | | </h3> |
| | | </div> |
| | | <el-table |
| | | border |
| | | max-height="280" |
| | | ref="tab1" |
| | | :data="checkList" |
| | | v-loading="loading" |
| | | <el-table border max-height="280" ref="tab1" :data="checkList" v-loading="loading" style="width: 100%" |
| | | @selection-change="handleSelectionChangeSecond" |
| | | > |
| | | <el-table-column type="selection" width="55"> </el-table-column> |
| | | <el-table-column |
| | | label="状态" |
| | | align="center" |
| | | prop="type" |
| | | :show-overflow-tooltip="true" |
| | | min-width="60" |
| | | > |
| | | :header-cell-style="{ background: '#aad8df', fontSize: '14px', color: '#333' }"> |
| | | <el-table-column type="selection" width="60" /> |
| | | <el-table-column label="状态" align="center" prop="type" :show-overflow-tooltip="true" min-width="60"> |
| | | <template slot-scope="scope"> |
| | | <span v-if="scope.row.type == '0'">未检</span> |
| | | <span v-if="scope.row.type == '1'">已检</span> |
| | |
| | | <span v-if="scope.row.type == '3'">延期</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="科室" |
| | | align="center" |
| | | prop="deptName" |
| | | min-width="115" |
| | | /> |
| | | <el-table-column |
| | | label="项目" |
| | | align="center" |
| | | prop="proName" |
| | | min-width="160" |
| | | /> |
| | | <el-table-column |
| | | label="收费方式" |
| | | align="center" |
| | | prop="sffs" |
| | | min-width="80" |
| | | /> |
| | | <el-table-column |
| | | label="是否收费" |
| | | align="center" |
| | | prop="isPay" |
| | | min-width="80" |
| | | /> |
| | | <el-table-column |
| | | label="检查时间" |
| | | align="center" |
| | | prop="bcupdateTime" |
| | | min-width="160" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="最后修改时间" |
| | | align="center" |
| | | prop="zhupdateTime" |
| | | min-width="160" |
| | | /> |
| | | <el-table-column label="科室" align="center" prop="deptName" min-width="115" /> |
| | | <el-table-column label="项目" align="center" prop="proName" min-width="160" /> |
| | | <el-table-column label="收费方式" align="center" prop="sffs" min-width="80" /> |
| | | <el-table-column label="是否收费" align="center" prop="isPay" min-width="80" /> |
| | | <el-table-column label="检查时间" align="center" prop="bcupdateTime" min-width="160" /> |
| | | <el-table-column label="最后修改时间" align="center" prop="zhupdateTime" min-width="160" /> |
| | | </el-table> |
| | | |
| | | <div class="pag"> |
| | | <div class="pag1"> |
| | | <!-- <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :pager-count="5" :current-page.sync="currentPage1" :current-page="page" |
| | | :page-sizes="pageSize" :page-size="size" layout="total, sizes, prev, pager, next, jumper" :total="total"> |
| | | </el-pagination> --> |
| | | <!-- <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | :pager-count="5" |
| | | :page.sync="queryParams.page" |
| | | :limit.sync="queryParams.pageSize" |
| | | @pagination="getList" |
| | | /> --> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | <script> |
| | | import { getLeftList, getRightList, asyncPacs } from "@/api/doctor/pacsCheck"; |
| | | import { getOrderList } from "@/api/hosp/order"; |
| | | import moment from "moment"; |
| | | |
| | | export default { |
| | | dicts: ["dict_tj_status"], |
| | | data() { |
| | | return { |
| | | infoList: {}, |
| | | dis: false, |
| | | code: null, |
| | | createTimeList: "", |
| | | total: 0, |
| | | loading: false, |
| | | isSyncing: false, |
| | | // 查询参数 |
| | | isFetchingRightTableData: false, |
| | | queryParams: { |
| | | // page: 1, |
| | | // pageSize: 20, |
| | | name: null, |
| | | start: null, |
| | | end: null, |
| | | tjNum: null, |
| | | }, |
| | | // 绑定单选按钮 |
| | | checkStatus: "0", |
| | | exaLists: [], |
| | | selectedFirstTable: null, // 第一个表格选中行 |
| | | selectedSecondTable: [], // 第二个表格选中行 |
| | | // 表单参数 |
| | | selectedFirstTable: null, |
| | | selectedSecondTable: [], |
| | | form: {}, |
| | | clearTimeSet: null, |
| | | tjNumbers: "", |
| | |
| | | this.$refs.inputName.focus(); |
| | | }); |
| | | }, |
| | | |
| | | methods: { |
| | | onInput(val) { |
| | | this.inputVal = val.replace(/\s+/g, ""); // 清除所有空格 |
| | | this.queryParams.tjNum = val.replace(/\s+/g, ""); |
| | | }, |
| | | |
| | | handleDateChange(val) { |
| | | if (val && val.length === 2) { |
| | | this.queryParams.start = val[0]; // 设置开始时间 |
| | | this.queryParams.end = val[1]; // 设置结束时间 |
| | | this.queryParams.start = val[0]; |
| | | this.queryParams.end = val[1]; |
| | | } else { |
| | | this.queryParams.start = null; |
| | | this.queryParams.end = null; |
| | | } |
| | | console.log("Query Params:", this.queryParams); |
| | | }, |
| | | // isSelectable(row) { |
| | | // return !!row.mzh; |
| | | // }, |
| | | |
| | | tableRowClassName({ row }) { |
| | | return !row.mzh ? "row-disabled" : ""; |
| | | return !row.brid ? "row-disabled" : ""; |
| | | }, |
| | | |
| | | formatDate(row) { |
| | | if (!row.examinationDate) return ""; |
| | | |
| | | // 使用 moment 解析指定格式的日期字符串 |
| | | const date = moment(row.examinationDate, "MM DD YYYY hh:mmA"); |
| | | |
| | | if (!date.isValid()) return "无效日期"; |
| | | |
| | | // 格式化为所需格式 |
| | | return date.format("YYYY-MM-DD HH:mm"); |
| | | const date = moment(row.examinationDate, "YYYY-MM-DD HH:mm:ss"); |
| | | return date.isValid() ? date.format("YYYY-MM-DD HH:mm") : "无效日期"; |
| | | }, |
| | | |
| | | handleSelectionChange(val) { |
| | | console.log(val); |
| | | if (val.length > 1) { |
| | | let del_row = val.shift(); |
| | | this.$refs.tb.toggleRowSelection(del_row, false); //设置这一行取消选中 |
| | | } |
| | | // console.log(val, 999); |
| | | |
| | | |
| | | if (val.length > 0) { |
| | | const selectedRow = val[0]; |
| | | // console.log(val[0], 555); |
| | | /* if (!selectedRow.mzh) { |
| | | this.$refs.tb.toggleRowSelection(selectedRow, false); |
| | | this.$message.warning("当前行无有效门诊号,不能选中"); |
| | | return; |
| | | } */ |
| | | |
| | | this.selectedFirstTable = selectedRow; |
| | | console.log("当前选中的行数据:", this.selectedFirstTable); |
| | | |
| | | this.selectedFirstTable = val; |
| | | |
| | | const code = this.queryParams.tjNum; |
| | | if (!code) { |
| | | this.$message.warning("体检号不能为空!"); |
| | | return; // 直接返回,避免继续执行请求 |
| | | return; |
| | | } |
| | | this.loading = true; |
| | | getRightList(code).then((response) => { |
| | | this.checkList = response.data; |
| | | this.loading = false; |
| | | }); |
| | | // this.fetchRightTableData(selectedRow); |
| | | } else { |
| | | this.selectedFirstTable = null; |
| | | this.checkList = []; |
| | | } |
| | | }, |
| | | // 根据选中的行数据请求右边表格数据 |
| | | |
| | | fetchRightTableData(selectedRow) { |
| | | const code = this.queryParams.tjNum; |
| | | // const code = selectedRow.mzh; |
| | | // if (!code) return; |
| | | |
| | | this.loading = true; |
| | | getRightList(code).then((response) => { |
| | | this.checkList = response.data; |
| | |
| | | }); |
| | | }, |
| | | |
| | | fetchRightTableData() { |
| | | const code = this.queryParams.tjNum; |
| | | if (!code) { |
| | | console.warn('未提供体检号,跳过 fetchRightTableData'); |
| | | this.checkList = []; |
| | | this.loading = false; |
| | | return Promise.resolve(); |
| | | } |
| | | this.loading = true; |
| | | return getRightList(code) |
| | | .then((response) => { |
| | | this.checkList = response.data || []; |
| | | this.loading = false; |
| | | }) |
| | | .catch((error) => { |
| | | console.error('获取 checkList 失败:', error); |
| | | this.checkList = []; |
| | | this.loading = false; |
| | | throw error; |
| | | }); |
| | | }, |
| | | |
| | | handleSelectionChangeSecond(selectedRows) { |
| | | this.selectedSecondTable = selectedRows; |
| | | if (selectedRows.length > 1) { |
| | | let del_row = selectedRows.shift(); |
| | | this.$refs.tab1.toggleRowSelection(del_row, false); //设置这一行取消选中 |
| | | this.$refs.tab1.toggleRowSelection(del_row, false); |
| | | } |
| | | console.log("当前选中的行数据:", this.selectedSecondTable); |
| | | |
| | | }, |
| | | getList() { |
| | | |
| | | async handleQuery() { |
| | | if (!this.queryParams.tjNum) { |
| | | this.$message.error("体检号不能为空"); |
| | | return; |
| | | } |
| | | |
| | | this.loading = true; |
| | | try { |
| | | const [orderResponse, leftResponse] = await Promise.all([ |
| | | getOrderList(this.queryParams).catch((error) => { |
| | | console.error('获取 orderList 失败:', error); |
| | | return { data: { list: [] } }; |
| | | }), |
| | | getLeftList(this.queryParams), |
| | | ]); |
| | | |
| | | if (orderResponse.data?.list?.length > 0) { |
| | | this.infoList = orderResponse.data.list[0]; |
| | | } else { |
| | | this.infoList = {}; |
| | | console.warn('getOrderList 返回空列表'); |
| | | } |
| | | |
| | | if (leftResponse.code === 200) { |
| | | this.exaLists = leftResponse.data.map((item, index) => ({ |
| | | ...item, |
| | | brid: item.brid?.trim(), |
| | | mzh: item.mzh?.trim(), |
| | | tempId: index, |
| | | })); |
| | | |
| | | await this.fetchRightTableData(); |
| | | } else { |
| | | this.exaLists = []; |
| | | this.$message.error(leftResponse.msg || "查询检查记录失败"); |
| | | } |
| | | } catch (error) { |
| | | console.error('查询失败:', error); |
| | | this.$message.error(error?.msg || "查询失败,请稍后重试"); |
| | | this.exaLists = []; |
| | | this.checkList = []; |
| | | this.infoList = {}; |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | |
| | | if (this.createTimeList) { |
| | | this.queryParams.start = this.createTimeList[0]; |
| | | this.queryParams.end = this.createTimeList[1]; |
| | | } else if (this.createTimeList == null) { |
| | | } else { |
| | | this.queryParams.start = null; |
| | | this.queryParams.end = null; |
| | | } |
| | | }, |
| | | |
| | | /** 搜索按钮操作 */ |
| | | handleQuery() { |
| | | // this.queryParams.page = 1; |
| | | this.loading = true; |
| | | getLeftList(this.queryParams) |
| | | .then((res) => { |
| | | console.log(res, 1111); |
| | | if (res.code == 200) { |
| | | this.loading = false; |
| | | this.exaLists = res.data; |
| | | // this.code = this.exaLists.mzh; |
| | | } |
| | | }) |
| | | .catch((error) => { |
| | | this.loading = false; |
| | | this.$message.error(res.msg || "查询失败,请稍后重试"); |
| | | }); |
| | | this.getList(); |
| | | }, |
| | | |
| | | /** 重置按钮操作 */ |
| | | resetQuery() { |
| | | this.createTimeList = []; |
| | | this.resetForm("queryForm"); |
| | |
| | | end: null, |
| | | tjNum: null, |
| | | }; |
| | | |
| | | // 清空其他依赖数据 |
| | | this.checkList = []; |
| | | this.exaLists = []; |
| | | this.infoList = {}; |
| | | }, |
| | | |
| | | handleCurrentChange(row) { |
| | | this.currentRow = row; |
| | | // console.log('当前选中的行:', row); |
| | | }, |
| | | |
| | | setTime() { |
| | | //设置定时器 |
| | | this.clearTimeSet = setInterval(() => { |
| | | this.$modal.closeLoading(); |
| | | }, 300000); |
| | |
| | | tongbu(row) { |
| | | this.$modal.loading("正在同步,请稍候..."); |
| | | this.setTime(); |
| | | // console.log(val, 66); |
| | | this.selectedFirstTable.tjnum = this.queryParams.tjNum; |
| | | |
| | | const requestData = { |
| | | pacs: this.selectedFirstTable, // 左侧表格选中数据 |
| | | pacs: this.selectedFirstTable.map((item) => ({ |
| | | ...item, |
| | | tjNum: this.queryParams.tjNum, |
| | | })),// 左侧表格选中数据 |
| | | tj: this.selectedSecondTable[0], // 右侧表格选中数据 |
| | | }; |
| | | |
| | | if (!this.selectedSecondTable || this.selectedSecondTable.length === 0) { |
| | | this.$message.error("至少选一条数据!"); |
| | | return; |
| | | } |
| | | |
| | | asyncPacs(requestData) |
| | | .then((res) => { |
| | | if (res.code == 200) { |
| | | this.fetchRightTableData(this.selectedFirstTable); |
| | | if (res.code === 200) { |
| | | this.fetchRightTableData(); |
| | | clearInterval(this.clearTimeSet); |
| | | this.clearTimeSet = null; |
| | | this.$modal.closeLoading(); |
| | |
| | | clearInterval(this.clearTimeSet); |
| | | this.clearTimeSet = null; |
| | | this.$modal.closeLoading(); |
| | | // this.$modal.error("操作失败,请稍后重试"); |
| | | this.$message.error("同步失败,请稍后重试"); |
| | | }); |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | #ta .el-table__header-wrapper .el-checkbox { |
| | | display: none; |
| | | <style lang="scss" scoped> |
| | | .app-container { |
| | | padding: 20px; |
| | | background: #f5f7fa; |
| | | } |
| | | |
| | | .table-header { |
| | | text-align: center; |
| | | background-color: #aad8df; |
| | | padding: 10px; |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | color: #333; |
| | | border-radius: 4px 4px 0 0; |
| | | margin: 10px 0 0 0; |
| | | /* 顶部间距保留,底部间距移除 */ |
| | | } |
| | | |
| | | .table-title { |
| | | text-align: center; |
| | | padding: 10px 0; |
| | | } |
| | | |
| | | .table-title.table-header h3 { |
| | | margin: 0; |
| | | font-weight: bold; |
| | | color: #333; |
| | | } |
| | | |
| | | .table-title h3 { |
| | | font-size: 16px; |
| | | color: #333; |
| | | margin: 0; |
| | | line-height: 1.5; |
| | | display: flex; |
| | | align-items: center; |
| | | flex-wrap: wrap; |
| | | gap: 20px; |
| | | } |
| | | |
| | | .table-title .highlight { |
| | | font-weight: bold; |
| | | color: #2c3e50; |
| | | } |
| | | |
| | | .el-table { |
| | | border-radius: 4px; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .el-table .warning-row { |
| | | background: #e5f3ff !important; |
| | | } |
| | | ::v-deep .el-table__body tr.current-row > td { |
| | | |
| | | ::v-deep .el-table__body tr.current-row>td { |
| | | background: #edf2fa !important; |
| | | } |
| | | |
| | | .table-title { |
| | | text-align: center; |
| | | margin-bottom: 15px; |
| | | } |
| | | .row-disabled { |
| | | color: #ccc; /* 设置禁用行的字体颜色 */ |
| | | pointer-events: none; /* 禁止鼠标操作 */ |
| | | background-color: #f5f5f5; /* 设置禁用行的背景色 */ |
| | | } |
| | | |
| | | .pag { |
| | | width: 100%; |
| | | display: flex; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .pag1 { |
| | | width: 30%; |
| | | color: #999; |
| | | background-color: #f5f5f5; |
| | | } |
| | | </style> |
| | |
| | | this.DataList3 = []; |
| | | this.Datalists = []; |
| | | this.TotalPrice1 = 0; |
| | | this.filterText = "", |
| | | this.filterage = "", |
| | | this.orderId = row.orderId; |
| | | this.cusId = row.tjCusIdCard; |
| | | this.userId = row.userId; |
| | |
| | | this.DataList = []; |
| | | this.DataList3 = []; |
| | | this.Datalists = []; |
| | | this.filterText = "", |
| | | this.filterage = "", |
| | | this.TotalPrice1 = 0; |
| | | this.orderId = this.ids; |
| | | this.cusId = this.cusIds; |
| | |
| | | <template> |
| | | <div class="centre"> |
| | | <div style="display:flex;justify-content: center;align-items: center;"> |
| | | <!-- 今日通知 --> |
| | | <div style="display: flex; justify-content: center; align-items: center;"> |
| | | <h4>今日通知</h4> |
| | | </div> |
| | | <div class="notice-area"> |
| | | <el-carousel :interval="2000" direction="vertical" :autoplay="true" :loop="true" height="120px" |
| | | v-if="groupedNoticeList.length > 0" class="carousel"> |
| | | <el-carousel-item v-for="(group, index) in groupedNoticeList" :key="index"> |
| | | <div class="notice-group"> |
| | | <div class="notice-item" v-for="notice in group" :key="notice.noticeId" |
| | | @click="goToNotice(notice.noticeId)"> |
| | | <el-tag size="small" :type="notice.noticeType === '1' ? 'info' : 'warning'"> |
| | | {{ notice.noticeType === '1' ? '通知' : '公告' }} |
| | | </el-tag> |
| | | <span class="notice-title">{{ notice.noticeTitle || '无标题' }}</span> |
| | | <span class="notice-time">{{ parseTime(notice.createTime, '{y}-{m}-{d}') || '无时间' }}</span> |
| | | </div> |
| | | </div> |
| | | </el-carousel-item> |
| | | </el-carousel> |
| | | <div v-else class="no-notice">暂无通知</div> |
| | | </div> |
| | | |
| | | <!-- 今日统计 --> |
| | | <div style="display: flex; justify-content: center; align-items: center;"> |
| | | <h4>今日统计</h4> |
| | | </div> |
| | | <div class="top"> |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div style="display:flex;justify-content: center;align-items: center;"> |
| | | |
| | | <!-- 近一月统计 --> |
| | | <div style="display: flex; justify-content: center; align-items: center;"> |
| | | <h4>近一月统计</h4> |
| | | </div> |
| | | <div class="data-view"> |
| | | <div id="main"></div> |
| | | <div id="main" style="width: 95%; height: 330px"></div> |
| | | </div> |
| | | <div class="view"> |
| | | <div id="main2"></div> |
| | |
| | | |
| | | <script> |
| | | import { getCustomer, getOrder, getReportToday, getTobeToday, getPieChart, getChart } from "@/api/home"; |
| | | import { noticeToday } from "@/api/system/notice"; |
| | | const echarts = require('echarts/lib/echarts'); |
| | | require('echarts/lib/component/title'); |
| | | require('echarts/lib/component/tooltip'); |
| | | require('echarts/lib/component/legend'); |
| | | require('echarts/lib/chart/pie'); |
| | | require('echarts/lib/chart/line'); |
| | | |
| | | export default { |
| | | data() { |
| | |
| | | teamYYNum: [], |
| | | PieChart: [], |
| | | PieChart2: [], |
| | | } |
| | | noticeList: [], |
| | | groupedNoticeList: [], // 分组后的通知列表 |
| | | loading: false |
| | | }; |
| | | }, |
| | | |
| | | created() { |
| | | this.getList(); |
| | | |
| | | }, |
| | | |
| | | watch: { |
| | | $route(to, from) { |
| | | window.location.reload(); //监测到路由发生跳转时刷新一次页面 |
| | | // this.$router.go(0); |
| | | }, |
| | | $route(to, from) { |
| | | window.location.reload(); |
| | | }, |
| | | |
| | | noticeList: { |
| | | handler(newList) { |
| | | // 将通知按每组三条分组 |
| | | this.groupedNoticeList = this.chunkArray(newList, 3); |
| | | console.log('groupedNoticeList:', this.groupedNoticeList); // 调试 |
| | | }, |
| | | deep: true |
| | | } |
| | | }, |
| | | |
| | | methods: { |
| | | |
| | | goToNotice(noticeId) { |
| | | this.$router.push({ |
| | | path: '/notice', |
| | | query: { noticeId } |
| | | }); |
| | | }, |
| | | getList() { |
| | | this.loading = true; |
| | | |
| | | // 修改API调用的错误处理 |
| | | getCustomer().then((response) => { |
| | | this.Customer = response || 0; // 添加默认值 |
| | | |
| | | // 查询所有公告 |
| | | noticeToday().then(response => { |
| | | console.log('Notice API response:', response); |
| | | this.noticeList = response.rows || response.data || []; |
| | | console.log('noticeList:', this.noticeList); |
| | | this.loading = false; |
| | | this.$nextTick(() => { |
| | | console.log('Carousel updated'); |
| | | }); |
| | | }).catch(error => { |
| | | console.error('获取今日登记数据失败:', error); |
| | | this.Customer = 0; |
| | | console.error('Notice API error:', error); |
| | | this.$message.error("获取通知失败:" + error.message); |
| | | this.loading = false; |
| | | }); |
| | | |
| | | getOrder().then((response) => { |
| | | this.Order = response || 0; |
| | | }).catch(error => { |
| | | console.error('获取今日已检数据失败:', error); |
| | | this.Order = 0; |
| | | // 查询今日登记 |
| | | getCustomer().then(response => { |
| | | this.Customer = response.data || response; |
| | | this.loading = false; |
| | | }); |
| | | |
| | | getReportToday().then((response) => { |
| | | this.ReportToday = response || 0; |
| | | }).catch(error => { |
| | | console.error('获取今日报告数据失败:', error); |
| | | this.ReportToday = 0; |
| | | // 查询今日已检 |
| | | getOrder().then(response => { |
| | | this.Order = response.data || response; |
| | | this.loading = false; |
| | | }); |
| | | |
| | | getTobeToday().then((response) => { |
| | | this.TobeToday = response || 0; |
| | | }).catch(error => { |
| | | console.error('获取今日待检数据失败:', error); |
| | | this.TobeToday = 0; |
| | | // 查询今日报告 |
| | | getReportToday().then(response => { |
| | | this.ReportToday = response.data || response; |
| | | this.loading = false; |
| | | }); |
| | | |
| | | // 修改折线图数据处理 |
| | | getChart().then((response) => { |
| | | if (response && response.data) { |
| | | this.LineChart = []; |
| | | this.reportNum = []; |
| | | this.personYYNum = []; |
| | | this.teamYYNum = []; |
| | | |
| | | response.data.forEach(item => { |
| | | this.LineChart.push(item.date); |
| | | this.reportNum.push(item.tdcoun || 0); |
| | | this.personYYNum.push(item.grcoun || 0); |
| | | this.teamYYNum.push(item.bgcoun || 0); |
| | | }); |
| | | let myChart = this.$echarts.init(document.getElementById('main')); |
| | | // 查询今日待检 |
| | | getTobeToday().then(response => { |
| | | this.TobeToday = response.data || response; |
| | | this.loading = false; |
| | | }); |
| | | |
| | | myChart.setOption({ |
| | | tooltip: { |
| | | trigger: 'axis' |
| | | }, |
| | | legend: { |
| | | data: ['每日体检登记数', '每日团体登记数', '每日发布报告数'] |
| | | }, |
| | | grid: { |
| | | left: '3%', |
| | | right: '4%', |
| | | bottom: '3%', |
| | | containLabel: true |
| | | }, |
| | | toolbox: { |
| | | feature: { |
| | | saveAsImage: {} |
| | | } |
| | | }, |
| | | xAxis: { |
| | | type: 'category', |
| | | boundaryGap: false, |
| | | axisLine: { |
| | | show: true, |
| | | lineStyle: { |
| | | color: "blue", |
| | | size: 12, |
| | | width: 0, |
| | | tyle: "solid" |
| | | } |
| | | }, |
| | | data: this.LineChart |
| | | }, |
| | | yAxis: { |
| | | type: 'value', |
| | | min: 0, |
| | | max: 100, |
| | | interval: 5 |
| | | }, |
| | | series: [ |
| | | { |
| | | name: '每日体检登记数', |
| | | type: 'line', |
| | | stack: 'Total', |
| | | data: this.personYYNum |
| | | }, |
| | | { |
| | | name: '每日团体登记数', |
| | | type: 'line', |
| | | stack: 'Total', |
| | | data: this.reportNum |
| | | }, |
| | | { |
| | | name: '每日发布报告数', |
| | | type: 'line', |
| | | stack: 'Total', |
| | | data: this.teamYYNum |
| | | }, |
| | | ] |
| | | // 折线图 |
| | | getChart().then(response => { |
| | | response.data.forEach(item => { |
| | | this.LineChart.push(item.date); |
| | | this.reportNum.push(item.tdcoun); |
| | | this.personYYNum.push(item.grcoun); |
| | | this.teamYYNum.push(item.bgcoun); |
| | | }); |
| | | |
| | | }) |
| | | let sizeFun = ()=> { |
| | | myChart.resize() |
| | | } |
| | | window.addEventListener("resize", sizeFun) |
| | | let myChart = this.$echarts.init(document.getElementById('main')); |
| | | myChart.setOption({ |
| | | tooltip: { trigger: 'axis' }, |
| | | legend: { data: ['每日体检登记数', '每日团体登记数', '每日发布报告数'] }, |
| | | grid: { left: '3%', right: '4%', bottom: '3%', containLabel: true }, |
| | | toolbox: { feature: { saveAsImage: {} } }, |
| | | xAxis: { |
| | | type: 'category', |
| | | boundaryGap: false, |
| | | axisLine: { |
| | | show: true, |
| | | lineStyle: { width: 0, color: 'blue', type: 'solid' } |
| | | }, |
| | | data: this.LineChart |
| | | }, |
| | | yAxis: { type: 'value', min: 0, max: 400, interval: 20 }, |
| | | series: [ |
| | | { name: '每日体检登记数', type: 'line', stack: 'Total', data: this.personYYNum }, |
| | | { name: '每日团体登记数', type: 'line', stack: 'Total', data: this.reportNum }, |
| | | { name: '每日发布报告数', type: 'line', stack: 'Total', data: this.teamYYNum } |
| | | ] |
| | | }); |
| | | |
| | | this.loading = false; |
| | | } |
| | | }).catch(error => { |
| | | console.error('获取图表数据失败:', error); |
| | | const sizeFun = () => myChart.resize(); |
| | | window.addEventListener('resize', sizeFun); |
| | | this.loading = false; |
| | | }); |
| | | |
| | | // 饼状图 |
| | | getPieChart().then((response) => { |
| | | getPieChart().then(response => { |
| | | if (response.data) { |
| | | |
| | | if(response.data.tjdj == 0){ |
| | | this.PieChart = [] |
| | | this.PieChart = [ |
| | | { |
| | | "name": "体检登记人数分布", |
| | | "count": 1, |
| | | "value": 10 |
| | | }, |
| | | |
| | | ] |
| | | }else if (response.data.tjdj.length === 0) { |
| | | |
| | | this.PieChart = [] |
| | | this.PieChart = [ |
| | | { |
| | | "name": "体检登记人数分布", |
| | | "count": 1, |
| | | "value": 10 |
| | | }, |
| | | |
| | | ] |
| | | if (response.data.tjdj == 0 || !response.data.tjdj?.length) { |
| | | this.PieChart = [{ name: '体检登记人数分布', count: 1, value: 10 }]; |
| | | } else { |
| | | this.PieChart = response.data.tjdj |
| | | this.PieChart.forEach(item => { |
| | | item.value = item.count |
| | | }) |
| | | this.PieChart.reverse() |
| | | this.PieChart.push(this.PieChart[0]) |
| | | this.PieChart.splice(0, 1) |
| | | |
| | | this.PieChart = response.data.tjdj; |
| | | this.PieChart.forEach(item => { item.value = item.count; }); |
| | | this.PieChart.reverse(); |
| | | this.PieChart.push(this.PieChart[0]); |
| | | this.PieChart.splice(0, 1); |
| | | } |
| | | |
| | | let myChart2 = this.$echarts.init(document.getElementById('main2')); |
| | | myChart2.setOption({ |
| | | title: { |
| | | text: '体检登记人数分布', |
| | | top: '5' |
| | | title: { text: '体检登记人数分布', top: '5' }, |
| | | tooltip: { trigger: 'item' }, |
| | | legend: { top: '80%', left: 'center' }, |
| | | series: [{ |
| | | type: 'pie', |
| | | radius: ['16%', '54%'], |
| | | center: ['50%', '43%'], |
| | | avoidLabelOverlap: false, |
| | | startAngle: 180, |
| | | minAngle: 10, |
| | | data: this.PieChart, |
| | | emphasis: { |
| | | itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)' } |
| | | } |
| | | }] |
| | | }); |
| | | |
| | | }, |
| | | |
| | | tooltip: { |
| | | trigger: 'item' |
| | | }, |
| | | legend: { |
| | | top: '80%', |
| | | left: 'center' |
| | | }, |
| | | series: [ |
| | | { |
| | | // name: 'Access From', |
| | | type: 'pie', |
| | | radius: ['16%', '54%'], |
| | | center: ["50%", "43%"], |
| | | avoidLabelOveralap:false, |
| | | startAngle:180, |
| | | minAngle:10, |
| | | data: this.PieChart, |
| | | emphasis: { |
| | | itemStyle: { |
| | | shadowBlur: 10, |
| | | shadowOffsetX: 0, |
| | | shadowColor: 'rgba(0, 0, 0, 0.5)' |
| | | } |
| | | } |
| | | }] |
| | | }) |
| | | |
| | | if(response.data.tjyc == 0){ |
| | | this.PieChart2 = [] |
| | | this.PieChart2 = [ |
| | | { |
| | | "name": "体检结果异常人数分布", |
| | | "count": 1, |
| | | "value": 0 |
| | | }, |
| | | |
| | | ] |
| | | }else if (response.data.tjyc.length === 0) { |
| | | this.PieChart2 = [] |
| | | this.PieChart2 = [ |
| | | { |
| | | "name": "体检结果异常人数分布", |
| | | "count": 1, |
| | | "value": 0 |
| | | }, |
| | | |
| | | ] |
| | | if (response.data.tjyc == 0 || !response.data.tjyc?.length) { |
| | | this.PieChart2 = [{ name: '体检结果异常人数分布', count: 1, value: 0 }]; |
| | | } else { |
| | | this.PieChart2 = response.data.tjyc |
| | | this.PieChart2.reverse() |
| | | this.PieChart2.push(this.PieChart2[0]) |
| | | this.PieChart2.splice(0, 1) |
| | | this.PieChart2.forEach(item => { |
| | | item.value = item.count |
| | | }) |
| | | // this.TobeToday = response |
| | | this.PieChart2 = response.data.tjyc; |
| | | this.PieChart2.reverse(); |
| | | this.PieChart2.push(this.PieChart2[0]); |
| | | this.PieChart2.splice(0, 1); |
| | | this.PieChart2.forEach(item => { item.value = item.count; }); |
| | | } |
| | | |
| | | let myChart3 = this.$echarts.init(document.getElementById('main3')); |
| | | |
| | | myChart3.setOption({ |
| | | title: { |
| | | text: '体检结果异常人数分布', |
| | | top: '5' |
| | | title: { text: '体检结果异常人数分布', top: '5' }, |
| | | tooltip: { trigger: 'item' }, |
| | | legend: { top: '80%', left: 'center' }, |
| | | series: [{ |
| | | type: 'pie', |
| | | radius: ['16%', '54%'], |
| | | center: ['50%', '43%'], |
| | | avoidLabelOverlap: false, |
| | | startAngle: 180, |
| | | minAngle: 10, |
| | | data: this.PieChart2, |
| | | emphasis: { |
| | | itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)' } |
| | | } |
| | | }] |
| | | }); |
| | | |
| | | }, |
| | | tooltip: { |
| | | trigger: 'item' |
| | | }, |
| | | legend: { |
| | | top: '80%', |
| | | left: 'center' |
| | | }, |
| | | series: [ |
| | | { |
| | | // name: 'Access From', |
| | | type: 'pie', |
| | | radius: ['16%', '54%'], |
| | | center: ["50%", "43%"], |
| | | avoidLabelOveralap:false, |
| | | startAngle:180, |
| | | minAngle:10, |
| | | data: this.PieChart2, |
| | | emphasis: { |
| | | itemStyle: { |
| | | shadowBlur: 10, |
| | | shadowOffsetX: 0, |
| | | shadowColor: 'rgba(0, 0, 0, 0.5)' |
| | | } |
| | | } |
| | | }] |
| | | }) |
| | | window.onresize = () =>{ |
| | | myChart2.resize() |
| | | myChart3.resize() |
| | | window.onresize = () => { |
| | | myChart2.resize(); |
| | | myChart3.resize(); |
| | | }; |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | this.loading = false; |
| | | }); |
| | | }, |
| | | |
| | | // 数组分组方法 |
| | | chunkArray(array, size) { |
| | | if (!array || array.length === 0) return []; |
| | | const result = []; |
| | | for (let i = 0; i < array.length; i += size) { |
| | | result.push(array.slice(i, i + size)); |
| | | } |
| | | // 确保循环滚动平滑,若不足 size 条,补齐 |
| | | if (array.length % size !== 0 && array.length > size) { |
| | | const lastGroup = result[result.length - 1]; |
| | | while (lastGroup.length < size) { |
| | | lastGroup.push(array[lastGroup.length % array.length]); |
| | | } |
| | | } |
| | | return result; |
| | | }, |
| | | |
| | | parseTime(time, cFormat) { |
| | | if (!time) return ''; |
| | | try { |
| | | const date = new Date(time); |
| | | if (isNaN(date.getTime())) return ''; |
| | | const formatObj = { |
| | | y: date.getFullYear(), |
| | | m: String(date.getMonth() + 1).padStart(2, '0'), |
| | | d: String(date.getDate()).padStart(2, '0'), |
| | | h: String(date.getHours()).padStart(2, '0'), |
| | | i: String(date.getMinutes()).padStart(2, '0'), |
| | | s: String(date.getSeconds()).padStart(2, '0') |
| | | }; |
| | | return cFormat.replace(/{([ymdhis]+)}/g, (result, key) => formatObj[key] || ''); |
| | | } catch (error) { |
| | | console.error('parseTime error:', error, 'time:', time); |
| | | return ''; |
| | | } |
| | | } |
| | | }, |
| | | |
| | | |
| | | mounted() { |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | }; |
| | | </script> |
| | | |
| | | <style> |
| | | .centre { |
| | | min-height: 820px; |
| | | margin: 15px 15px; |
| | | margin: 15px; |
| | | background-color: #f3f3f3; |
| | | padding: 10px 10px 10px 10px; |
| | | padding: 10px; |
| | | } |
| | | |
| | | .notice-area { |
| | | width: 100%; |
| | | min-height: 120px; |
| | | /* 调整为三条通知高度 */ |
| | | background-color: #fff; |
| | | margin: 10px 0; |
| | | padding: 0 20px; |
| | | } |
| | | |
| | | .carousel { |
| | | width: 100% !important; |
| | | } |
| | | |
| | | .notice-group { |
| | | display: flex; |
| | | flex-direction: column; |
| | | height: 120px; |
| | | /* 确保包含三条通知 */ |
| | | } |
| | | |
| | | .notice-item { |
| | | display: flex; |
| | | align-items: center; |
| | | width: 100%; |
| | | height: 40px; |
| | | line-height: 40px; |
| | | font-size: 14px; |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .notice-title { |
| | | margin-left: 10px; |
| | | font-size: 14px; |
| | | color: #333; |
| | | flex-grow: 1; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | white-space: nowrap; |
| | | } |
| | | |
| | | .notice-time { |
| | | font-size: 12px; |
| | | color: #999; |
| | | margin-left: 20px; |
| | | } |
| | | |
| | | .no-notice { |
| | | width: 100%; |
| | | height: 120px; |
| | | /* 与轮播高度一致 */ |
| | | line-height: 120px; |
| | | text-align: center; |
| | | color: #999; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .top { |
| | | width: 100%; |
| | | display: flex; |
| | | height: 120px; |
| | | |
| | | } |
| | | |
| | | .add { |
| | | width: 380px; |
| | | width: 320px; |
| | | height: 75px; |
| | | margin-top: 30px; |
| | | margin-top: 20px; |
| | | margin-left: 20px; |
| | | margin-right: 20px; |
| | | background-color: #fff; |
| | | display: flex |
| | | display: flex; |
| | | } |
| | | |
| | | .img { |
| | |
| | | .image { |
| | | width: 60px; |
| | | height: 60px; |
| | | |
| | | } |
| | | |
| | | .txt { |
| | |
| | | .day { |
| | | height: 40px; |
| | | line-height: 40px; |
| | | font-size: 14px; |
| | | font-size: 12px; |
| | | } |
| | | |
| | | .data-view { |
| | | margin: 0 15px; |
| | | height: 323px !important |
| | | height: 323px !important; |
| | | } |
| | | |
| | | #main { |
| | | padding: 10px; |
| | | width:95%; |
| | | height:330px |
| | | } |
| | | |
| | | .view { |
| | | margin: 0px 15px; |
| | | margin: 0 15px; |
| | | padding-top: 15px; |
| | | min-height: 350px; |
| | | display: flex; |
| | | } |
| | | |
| | | #main2 { |
| | | width: 820px; |
| | | height: 350px; |
| | | background-color: #fff; |
| | | margin-right: 20px; |
| | | } |
| | | |
| | | #main2, |
| | | #main3 { |
| | | width: 820px; |
| | | height: 350px; |
| | |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | <script> |
| | | |
| | | import { getCodeImg, getconfigKey } from "@/api/login"; |
| | | import Cookies from "js-cookie"; |
| | |
| | | case '8097': |
| | | this.loginForm.hospId = "wbzxyy"; |
| | | break; |
| | | case '8098': |
| | | case '8098': |
| | | this.loginForm.hospId = "bjxjyy"; |
| | | break; |
| | | case '8099': |
| | | this.loginForm.hospId = "bjfhyy"; |
| | | break; |
| | | } |
| | | Cookies.set("hospId", this.loginForm.hospId); |
| | |
| | | case '9016': |
| | | this.loginForm.hospId = "wbzxyy"; |
| | | break; |
| | | case '9017': |
| | | case '9017': |
| | | this.loginForm.hospId = "bjxjyy"; |
| | | break; |
| | | } |
| | |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="公告标题" prop="noticeTitle"> |
| | | <el-input |
| | | v-model="queryParams.noticeTitle" |
| | | placeholder="请输入公告标题" |
| | | clearable |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | <el-input v-model="queryParams.noticeTitle" placeholder="请输入公告标题" clearable @keyup.enter.native="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="操作人员" prop="createBy"> |
| | | <el-input |
| | | v-model="queryParams.createBy" |
| | | placeholder="请输入操作人员" |
| | | clearable |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | <el-input v-model="queryParams.createBy" placeholder="请输入操作人员" clearable @keyup.enter.native="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="类型" prop="noticeType"> |
| | | <el-select v-model="queryParams.noticeType" placeholder="公告类型" clearable> |
| | | <el-option |
| | | v-for="dict in dict.type.sys_notice_type" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | <el-option v-for="dict in dict.type.sys_notice_type" :key="dict.value" :label="dict.label" |
| | | :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | |
| | | |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" |
| | | icon="el-icon-plus" |
| | | size="mini" |
| | | @click="handleAdd" |
| | | v-hasPermi="['system:notice:add']" |
| | | >新增</el-button> |
| | | <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd" |
| | | v-hasPermi="['system:notice:add']">新增</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" |
| | | icon="el-icon-edit" |
| | | size="mini" |
| | | :disabled="single" |
| | | @click="handleUpdate" |
| | | v-hasPermi="['system:notice:edit']" |
| | | >修改</el-button> |
| | | <el-button type="primary" icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate" |
| | | v-hasPermi="['system:notice:edit']">修改</el-button> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" |
| | | icon="el-icon-delete" |
| | | size="mini" |
| | | :disabled="multiple" |
| | | @click="handleDelete" |
| | | v-hasPermi="['system:notice:remove']" |
| | | >删除</el-button> |
| | | <el-button type="primary" icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete" |
| | | v-hasPermi="['system:notice:remove']">删除</el-button> |
| | | </el-col> |
| | | <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | |
| | | <el-table v-loading="loading" :data="noticeList" @selection-change="handleSelectionChange"> |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="noticeList" |
| | | @selection-change="handleSelectionChange" |
| | | :row-class-name="tableRowClassName" |
| | | ref="table" |
| | | > |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="序号" align="center" prop="noticeId" width="100" /> |
| | | <el-table-column |
| | | label="公告标题" |
| | | align="center" |
| | | prop="noticeTitle" |
| | | :show-overflow-tooltip="true" |
| | | /> |
| | | <el-table-column label="公告标题" align="center" prop="noticeTitle" :show-overflow-tooltip="true" /> |
| | | <el-table-column label="公告类型" align="center" prop="noticeType" width="100"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag :options="dict.type.sys_notice_type" :value="scope.row.noticeType"/> |
| | | <dict-tag :options="dict.type.sys_notice_type" :value="scope.row.noticeType" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="状态" align="center" prop="status" width="100"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag :options="dict.type.sys_notice_status" :value="scope.row.status"/> |
| | | <dict-tag :options="dict.type.sys_notice_status" :value="scope.row.status" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="接收科室" align="center" prop="deptId" width="150"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ getDeptNames(scope.row.deptId) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="接收用户" align="center" prop="userIds" width="200" :show-overflow-tooltip="true"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ getUserNames(scope.row.userIds) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="创建者" align="center" prop="createBy" width="100" /> |
| | |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-edit" |
| | | @click="handleUpdate(scope.row)" |
| | | v-hasPermi="['system:notice:edit']" |
| | | >修改</el-button> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-delete" |
| | | @click="handleDelete(scope.row)" |
| | | v-hasPermi="['system:notice:remove']" |
| | | >删除</el-button> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-share" |
| | | @click="handledetails(scope.row)" |
| | | v-hasPermi="['system:notice:remove']" |
| | | >详情</el-button> |
| | | <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" |
| | | v-hasPermi="['system:notice:edit']">修改</el-button> |
| | | <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" |
| | | v-hasPermi="['system:notice:remove']">删除</el-button> |
| | | <el-button size="mini" type="text" icon="el-icon-share" @click="handledetails(scope.row)" |
| | | v-hasPermi="['system:notice:query']">详情</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <div class="pag"> |
| | | <div class="pag1"> |
| | | <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" @pagination="getList" /> |
| | | </div> |
| | | </div> |
| | | <div class="pagination-container"> |
| | | <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" @pagination="getList" /> |
| | | </div> |
| | | |
| | | <!-- 添加或修改公告对话框 --> |
| | | <el-dialog :title="title" :visible.sync="open" width="780px" append-to-body> |
| | |
| | | <el-col :span="12"> |
| | | <el-form-item label="公告类型" prop="noticeType"> |
| | | <el-select v-model="form.noticeType" placeholder="请选择公告类型"> |
| | | <el-option |
| | | v-for="dict in dict.type.sys_notice_type" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | ></el-option> |
| | | <el-option v-for="dict in dict.type.sys_notice_type" :key="dict.value" :label="dict.label" |
| | | :value="dict.value"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12" v-if="form.noticeType == 1"> |
| | | <el-form-item label="通知人员" prop="noticeType"> |
| | | <el-input v-model="form.noticeTitle" placeholder="请输入通知人员" /> |
| | | <el-col :span="12"> |
| | | <el-form-item label="接收科室" prop="deptId"> |
| | | <el-select v-model="form.deptId" filterable placeholder="请选择接收科室" @change="handleDeptChange"> |
| | | <el-option v-for="dept in deptList" :key="dept.id" :label="dept.label" :value="dept.id"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="接收用户" prop="userIds"> |
| | | <el-select v-model="form.userIds" multiple filterable placeholder="请选择接收用户"> |
| | | <el-option v-for="user in editUserList" :key="user.userId" :label="user.nickName || user.userName" |
| | | :value="user.userId"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="状态"> |
| | | <el-radio-group v-model="form.status"> |
| | | <el-radio |
| | | v-for="dict in dict.type.sys_notice_status" |
| | | :key="dict.value" |
| | | :label="dict.value" |
| | | >{{dict.label}}</el-radio> |
| | | <el-radio v-for="dict in dict.type.sys_notice_status" :key="dict.value" |
| | | :label="dict.value">{{ dict.label }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="24"> |
| | | <el-form-item label="内容"> |
| | | <editor v-model="form.noticeContent" :min-height="192"/> |
| | | <editor v-model="form.noticeContent" :min-height="192" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | </div> |
| | | </el-dialog> |
| | | |
| | | <!--通知公告详情 --> |
| | | <!-- 通知公告详情 --> |
| | | <el-dialog :title="formIn.noticeTitle" :visible.sync="openDetail" width="800px" append-to-body> |
| | | <div style="margin-top:-20px;margin-bottom:10px;"> |
| | | <el-tag size="mini" effect="dark" type="warning" v-if="form.noticeType==2">公告</el-tag> |
| | | <div class="detail-header"> |
| | | <el-tag size="mini" effect="dark" type="warning" v-if="formIn.noticeType === '2'">公告</el-tag> |
| | | <el-tag size="mini" effect="dark" v-else>通知</el-tag> |
| | | <span style="margin-left:20px;">{{formIn.createTime}}</span> |
| | | <span class="time">{{ parseTime(formIn.createTime, '{y}-{m}-{d} {h}:{i}:{s}') || '无' }}</span> |
| | | </div> |
| | | <div class="content"> |
| | | <div v-html="formIn.noticeContent" style="margin-left:0px;margin-right:76px" class="ql-editor"></div> |
| | | <div class="detail-item"> |
| | | <span class="label">接收科室:</span> |
| | | <span>{{ getDeptNames(formIn.deptId) }}</span> |
| | | </div> |
| | | <div class="detail-item"> |
| | | <span class="label">接收用户:</span> |
| | | <span>{{ getUserNames(formIn.userIds) }}</span> |
| | | </div> |
| | | <div class="detail-content"> |
| | | <div v-html="formIn.noticeContent" class="ql-editor"></div> |
| | | </div> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="cancel"> 关 闭 </el-button> |
| | | <el-button type="primary" @click="cancel">关闭</el-button> |
| | | </div> |
| | | </el-dialog> |
| | | |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { listNotice, getNotice, delNotice, addNotice, updateNotice } from "@/api/system/notice"; |
| | | import { deptTreeSelect } from "@/api/system/dept"; |
| | | import { listUser1 } from "@/api/system/user"; |
| | | |
| | | export default { |
| | | name: "Notice", |
| | | dicts: ['sys_notice_status', 'sys_notice_type'], |
| | | dicts: ["sys_notice_status", "sys_notice_type"], |
| | | data() { |
| | | let checkPhoneNum = (rule, value, callback) => { |
| | | console.log( value) |
| | | let patter = new RegExp(/^1\s*[3456789]\s*(\d\s*){9}$/); |
| | | if (value == "" && value == undefined && !value) { |
| | | return callback(''); |
| | | } else if(value != undefined && value != ""){ |
| | | return callback(); |
| | | }else if (!patter.test(value)) { |
| | | return callback(''); |
| | | } |
| | | }; |
| | | return { |
| | | // 遮罩层 |
| | | loading: true, |
| | | openDetail:false, |
| | | openDetail: false, |
| | | // 选中数组 |
| | | ids: [], |
| | | // 非单个禁用 |
| | |
| | | total: 0, |
| | | // 公告表格数据 |
| | | noticeList: [], |
| | | // 科室列表 |
| | | deptList: [], |
| | | // 用户列表(全局,用于表格和详情) |
| | | userList: [], |
| | | // 用户列表(用于编辑对话框) |
| | | editUserList: [], |
| | | // 弹出层标题 |
| | | title: "", |
| | | // 是否显示弹出层 |
| | | open: false, |
| | | // 是否为初次加载 |
| | | isInitialLoad: true, |
| | | // 查询参数 |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | noticeTitle: undefined, |
| | | createBy: undefined, |
| | | status: undefined |
| | | noticeType: undefined, |
| | | }, |
| | | formIn:{}, |
| | | formIn: {}, |
| | | // 表单参数 |
| | | form: {}, |
| | | form: { |
| | | noticeId: undefined, |
| | | noticeTitle: undefined, |
| | | noticeType: undefined, |
| | | noticeContent: undefined, |
| | | status: "0", |
| | | deptId: undefined, |
| | | userIds: [], |
| | | }, |
| | | // 表单校验 |
| | | rules: { |
| | | noticeTitle: [ |
| | | { required: true, validator: checkPhoneNum, trigger: "blur" } |
| | | noticeTitle: [{ required: true, message: "公告标题不能为空", trigger: "blur" }], |
| | | noticeType: [{ required: true, message: "公告类型不能为空", trigger: "change" }], |
| | | deptId: [ |
| | | { |
| | | required: false, |
| | | message: "请选择接收科室", |
| | | trigger: "change", |
| | | validator: (rule, value, callback) => { |
| | | callback(); // 非必填 |
| | | }, |
| | | }, |
| | | ], |
| | | noticeType: [ |
| | | { required: true, validator: checkPhoneNum, trigger: "change" } |
| | | ] |
| | | } |
| | | userIds: [ |
| | | { |
| | | required: false, |
| | | message: "请选择接收用户", |
| | | trigger: "change", |
| | | validator: (rule, value, callback) => { |
| | | callback(); // 非必填 |
| | | }, |
| | | }, |
| | | ], |
| | | }, |
| | | }; |
| | | }, |
| | | created() { |
| | | this.getList(); |
| | | // 获取科室列表 |
| | | deptTreeSelect() |
| | | .then((response) => { |
| | | this.deptList = response.data || []; |
| | | this.deptList = this.flattenDeptList(this.deptList); |
| | | console.log("Flattened deptList:", this.deptList); |
| | | }) |
| | | .catch((error) => { |
| | | this.$modal.msgError("获取科室列表失败:" + error.message); |
| | | }); |
| | | // 预加载所有用户列表(用于表格和详情) |
| | | listUser1({}) |
| | | .then((response) => { |
| | | this.userList = (response.rows || response.data || []).map(user => ({ |
| | | ...user, |
| | | userId: String(user.userId), |
| | | })); |
| | | this.editUserList = [...this.userList]; // 初始化编辑用户列表 |
| | | console.log("Preloaded userList:", this.userList); |
| | | }) |
| | | .catch((error) => { |
| | | this.$modal.msgError("获取用户列表失败:" + error.message); |
| | | }); |
| | | // 处理跳转参数 |
| | | this.handleRouteParams(); |
| | | }, |
| | | methods: { |
| | | /** 查询公告列表 */ |
| | | getList() { |
| | | this.loading = true; |
| | | listNotice(this.queryParams).then(response => { |
| | | listNotice(this.queryParams).then((response) => { |
| | | this.noticeList = response.rows; |
| | | this.total = response.total; |
| | | this.loading = false; |
| | | // 高亮或打开详情(仅初次加载时触发详情) |
| | | this.$nextTick(() => { |
| | | this.highlightNotice(this.isInitialLoad); |
| | | this.isInitialLoad = false; // 标记为非初次加载 |
| | | }); |
| | | }).catch((error) => { |
| | | console.error("listNotice error:", error); |
| | | this.$modal.msgError("获取公告列表失败:" + error.message); |
| | | this.loading = false; |
| | | }); |
| | | }, |
| | | /** 处理路由参数 */ |
| | | handleRouteParams() { |
| | | const { noticeId } = this.$route.query; |
| | | if (noticeId) { |
| | | this.queryParams.noticeId = noticeId; |
| | | this.getList(); |
| | | } |
| | | }, |
| | | /** 高亮或打开公告详情 */ |
| | | highlightNotice(isInitialLoad) { |
| | | const { noticeId } = this.$route.query; |
| | | if (noticeId) { |
| | | const notice = this.noticeList.find(item => item.noticeId === noticeId); |
| | | if (notice) { |
| | | this.$refs.table.setCurrentRow(notice); |
| | | if (isInitialLoad) { |
| | | this.handledetails(notice); // 仅初次加载时打开详情 |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | /** 表格行类名 */ |
| | | tableRowClassName({ row }) { |
| | | const { noticeId } = this.$route.query; |
| | | return noticeId && row.noticeId === noticeId ? 'highlight-row' : ''; |
| | | }, |
| | | /** 将科室ID转换为科室名称 */ |
| | | getDeptNames(deptId) { |
| | | if (!deptId) return "无"; |
| | | const dept = this.deptList.find((dept) => dept.id === deptId); |
| | | return dept ? dept.label : "未知科室"; |
| | | }, |
| | | /** 将用户ID转换为用户名 */ |
| | | getUserNames(userIds) { |
| | | if (!userIds) return "无"; |
| | | const ids = typeof userIds === "string" ? userIds.split(",") : userIds; |
| | | const names = this.userList |
| | | .filter((user) => ids.includes(user.userId)) |
| | | .map((user) => user.nickName || user.userName) |
| | | .join(", "); |
| | | return names || ids.join(", "); |
| | | }, |
| | | /** 展平部门树形结构 */ |
| | | flattenDeptList(depts, result = []) { |
| | | depts.forEach((dept) => { |
| | | result.push({ id: String(dept.id), label: dept.label }); |
| | | if (dept.children && dept.children.length) { |
| | | this.flattenDeptList(dept.children, result); |
| | | } |
| | | }); |
| | | return result; |
| | | }, |
| | | /** 科室选择变化时调用 */ |
| | | handleDeptChange(deptId) { |
| | | if (deptId) { |
| | | this.editUserList = []; |
| | | return listUser1({ deptId }) |
| | | .then((response) => { |
| | | this.editUserList = (response.rows || response.data || []).map(user => ({ |
| | | ...user, |
| | | userId: String(user.userId), |
| | | })); |
| | | console.log("Fetched editUserList for deptId", deptId, ":", this.editUserList); |
| | | }) |
| | | .catch((error) => { |
| | | this.$modal.msgError("获取用户列表失败:" + error.message); |
| | | this.editUserList = [...this.userList]; // 回退到全局用户列表 |
| | | }); |
| | | } else { |
| | | console.log("No deptId, retained form.userIds:", this.form.userIds); |
| | | this.editUserList = [...this.userList]; // 恢复为全局用户列表 |
| | | return Promise.resolve(); |
| | | } |
| | | }, |
| | | // 取消按钮 |
| | | cancel() { |
| | | console.log("Cancel triggered, resetting form and closing dialogs"); |
| | | this.open = false; |
| | | this.openDetail = false, |
| | | this.openDetail = false; |
| | | this.reset(); |
| | | }, |
| | | // 表单重置 |
| | |
| | | noticeTitle: undefined, |
| | | noticeType: undefined, |
| | | noticeContent: undefined, |
| | | status: "0" |
| | | status: "0", |
| | | deptId: undefined, |
| | | userIds: [], |
| | | }; |
| | | this.editUserList = [...this.userList]; // 重置为全局用户列表 |
| | | this.resetForm("form"); |
| | | }, |
| | | /** 搜索按钮操作 */ |
| | |
| | | }, |
| | | // 多选框选中数据 |
| | | handleSelectionChange(selection) { |
| | | this.ids = selection.map(item => item.noticeId) |
| | | this.single = selection.length!=1 |
| | | this.multiple = !selection.length |
| | | this.ids = selection.map((item) => item.noticeId); |
| | | this.single = selection.length !== 1; |
| | | this.multiple = !selection.length; |
| | | }, |
| | | /** 新增按钮操作 */ |
| | | handleAdd() { |
| | | console.log("handleAdd triggered"); |
| | | this.reset(); |
| | | this.open = true; |
| | | this.title = "添加公告"; |
| | | }, |
| | | /** 修改按钮操作 */ |
| | | handleUpdate(row) { |
| | | console.log("handleUpdate triggered for noticeId:", row.noticeId); |
| | | this.reset(); |
| | | const noticeId = row.noticeId || this.ids |
| | | getNotice(noticeId).then(response => { |
| | | this.form = response.data; |
| | | this.open = true; |
| | | this.title = "修改公告"; |
| | | }); |
| | | const noticeId = row.noticeId || this.ids; |
| | | getNotice(noticeId) |
| | | .then((response) => { |
| | | console.log("getNotice response:", response.data); |
| | | const data = response.data; |
| | | this.form = { |
| | | noticeId: data.noticeId, |
| | | noticeTitle: data.noticeTitle, |
| | | noticeType: data.noticeType, |
| | | noticeContent: data.noticeContent, |
| | | status: data.status, |
| | | deptId: data.deptId ? String(data.deptId) : undefined, |
| | | userIds: data.userIds ? (typeof data.userIds === 'string' ? data.userIds.split(',') : data.userIds) : [], |
| | | }; |
| | | if (this.form.deptId) { |
| | | return this.handleDeptChange(this.form.deptId).then(() => { |
| | | this.open = true; |
| | | this.title = "修改公告"; |
| | | console.log("Modification dialog opened, form:", this.form, "editUserList:", this.editUserList); |
| | | }); |
| | | } else { |
| | | this.editUserList = [...this.userList]; |
| | | console.log("No deptId, retained form.userIds:", this.form.userIds, "editUserList:", this.editUserList); |
| | | this.open = true; |
| | | this.title = "修改公告"; |
| | | console.log("Modification dialog opened, form:", this.form); |
| | | return Promise.resolve(); |
| | | } |
| | | }) |
| | | .catch((error) => { |
| | | console.error("getNotice error:", error); |
| | | this.$modal.msgError("获取公告详情失败:" + error.message); |
| | | }); |
| | | }, |
| | | |
| | | handledetails(row){ |
| | | /** 详情按钮操作 */ |
| | | handledetails(row) { |
| | | console.log("handledetails triggered for noticeId:", row.noticeId); |
| | | this.formIn = row; |
| | | this.openDetail = true; |
| | | console.log("Detail dialog opened, formIn:", this.formIn); |
| | | }, |
| | | /** 提交按钮 */ |
| | | submitForm: function() { |
| | | this.$refs["form"].validate(valid => { |
| | | submitForm() { |
| | | console.log("submitForm triggered, form:", this.form); |
| | | this.$refs["form"].validate((valid) => { |
| | | if (valid) { |
| | | if (this.form.noticeId != undefined) { |
| | | updateNotice(this.form).then(response => { |
| | | const formData = { |
| | | ...this.form, |
| | | deptId: this.form.deptId ? String(this.form.deptId) : "", |
| | | userIds: this.form.userIds || [], |
| | | }; |
| | | console.log("Submitting formData:", formData); |
| | | if (formData.noticeId != undefined) { |
| | | updateNotice(formData).then((response) => { |
| | | this.$modal.msgSuccess("修改成功"); |
| | | this.open = false; |
| | | this.getList(); |
| | | }).catch((error) => { |
| | | console.error("updateNotice error:", error); |
| | | this.$modal.msgError("修改失败:" + error.message); |
| | | }); |
| | | } else { |
| | | addNotice(this.form).then(response => { |
| | | addNotice(formData).then((response) => { |
| | | this.$modal.msgSuccess("新增成功"); |
| | | this.open = false; |
| | | this.getList(); |
| | | }).catch((error) => { |
| | | console.error("addNotice error:", error); |
| | | this.$modal.msgError("新增失败:" + error.message); |
| | | }); |
| | | } |
| | | } |
| | |
| | | }, |
| | | /** 删除按钮操作 */ |
| | | handleDelete(row) { |
| | | const noticeIds = row.noticeId || this.ids |
| | | this.$modal.confirm('是否确认删除公告编号为"' + noticeIds + '"的数据项?').then(function() { |
| | | return delNotice(noticeIds); |
| | | }).then(() => { |
| | | this.getList(); |
| | | this.$modal.msgSuccess("删除成功"); |
| | | }).catch(() => {}); |
| | | console.log("handleDelete triggered for noticeId:", row.noticeId); |
| | | const noticeIds = row.noticeId || this.ids; |
| | | this.$modal |
| | | .confirm('是否确认删除公告编号为"' + noticeIds + '"的数据项?') |
| | | .then(() => delNotice(noticeIds)) |
| | | .then(() => { |
| | | this.getList(); |
| | | this.$modal.msgSuccess("删除成功"); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | /** 时间格式化 */ |
| | | parseTime(time, cFormat = '{y}-{m}-{d} {h}:{i}:{s}') { |
| | | if (!time) return ''; |
| | | try { |
| | | const date = new Date(time); |
| | | if (isNaN(date.getTime())) return ''; |
| | | const formatObj = { |
| | | y: date.getFullYear(), |
| | | m: String(date.getMonth() + 1).padStart(2, '0'), |
| | | d: String(date.getDate()).padStart(2, '0'), |
| | | h: String(date.getHours()).padStart(2, '0'), |
| | | i: String(date.getMinutes()).padStart(2, '0'), |
| | | s: String(date.getSeconds()).padStart(2, '0') |
| | | }; |
| | | return cFormat.replace(/{([ymdhis]+)}/g, (result, key) => formatObj[key] || ''); |
| | | } catch (error) { |
| | | console.error('parseTime error:', error, 'time:', time); |
| | | return ''; |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .pag { |
| | | width: 100%; |
| | | /* 容器样式,确保内容有适当内边距 */ |
| | | .app-container { |
| | | padding: 20px; |
| | | } |
| | | |
| | | /* 分页容器,替换原 .pag 和 .pag1,居中显示 */ |
| | | .pagination-container { |
| | | display: flex; |
| | | justify-content: center; |
| | | margin-top: 20px; |
| | | } |
| | | .pag1{ |
| | | width: 30%; |
| | | |
| | | /* 高亮行样式,突出显示路由指定的公告 */ |
| | | .highlight-row { |
| | | background-color: #e6f7ff; |
| | | } |
| | | </style> |
| | | |
| | | /* 对话框底部按钮居中 */ |
| | | .dialog-footer { |
| | | text-align: center; |
| | | padding: 10px 0; |
| | | } |
| | | |
| | | /* 详情对话框头部(类型标签和时间) */ |
| | | .detail-header { |
| | | margin: -20px 0 10px; |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .detail-header .time { |
| | | margin-left: 20px; |
| | | color: #606266; |
| | | } |
| | | |
| | | /* 详情对话框信息项(接收科室、接收用户) */ |
| | | .detail-item { |
| | | margin-bottom: 10px; |
| | | } |
| | | |
| | | .detail-item .label { |
| | | font-weight: bold; |
| | | color: #303133; |
| | | } |
| | | |
| | | /* 详情对话框内容区域,限制富文本高度 */ |
| | | .detail-content .ql-editor { |
| | | max-height: 300px; |
| | | overflow-y: auto; |
| | | padding: 10px; |
| | | color: #303133; |
| | | } |
| | | |
| | | /* 表格操作列,优化按钮间距 */ |
| | | .small-padding { |
| | | padding: 0 10px; |
| | | } |
| | | |
| | | /* 搜索表单顶部间距 */ |
| | | .mb8 { |
| | | margin-bottom: 8px; |
| | | } |
| | | </style> |
| | |
| | | tuantiSelect, |
| | | deptTreeSelect, |
| | | projectGetList, |
| | | getOrderzhiye, |
| | | getOrder, |
| | | getProParentIdDxList, |
| | | getProSonDxList, |
| | | getCusIdcard, |
| | |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | Package() { |
| | | Package() { |
| | | this.activeNames = "first"; |
| | | if (this.form.cusSex == "男") { |
| | | this.form.cusSex = 0; |
| | |
| | | let cusSex = this.form.cusSex; |
| | | this.datekey = Date.now(); |
| | | //全部套餐 |
| | | this.taocan = true; |
| | | this.loading = true; |
| | | deptTreeSelect(cusSex).then((response) => { |
| | | this.newpacName = response.rows; |
| | | try { |
| | | if (this.tableData1.length >= 1) { |
| | | this.newpacName.forEach((item3) => { |
| | | this.tableData1.forEach((item4) => { |
| | | item4.list.forEach((item6) => { |
| | | if (item6.pacName === item3.pacName) { |
| | | this.$nextTick(() => { |
| | | this.$refs.tb.toggleRowSelection(item3, true); |
| | | |
| | | let param = { |
| | | sex: cusSex, |
| | | dwId: this.form.firmId || "", |
| | | }; |
| | | if (this.form.tjType == 6) { |
| | | if (!this.form.firmId && !this.form.firmName) { |
| | | this.$message({ |
| | | type: "warning", |
| | | message: "请先维护单位!", |
| | | }); |
| | | } else if (!this.form.firmId && this.form.firmName) { |
| | | this.taocan = true; |
| | | this.loading = true; |
| | | deptTreeSelect(cusSex).then((response) => { |
| | | this.newpacName = response.rows; |
| | | try { |
| | | if (this.tableData1.length >= 1) { |
| | | this.newpacName.forEach((item3) => { |
| | | this.tableData1.forEach((item4) => { |
| | | item4.list.forEach((item6) => { |
| | | if (item6.pacName === item3.pacName) { |
| | | this.$nextTick(() => { |
| | | this.$refs.tb.toggleRowSelection(item3, true); |
| | | }); |
| | | throw Error(); |
| | | } |
| | | }); |
| | | throw Error(); |
| | | } |
| | | }); |
| | | }); |
| | | } |
| | | } catch (error) { } |
| | | this.loading = false; |
| | | }); |
| | | } else { |
| | | this.taocan = true; |
| | | this.loading = true; |
| | | tuantiSelect(param).then((res) => { |
| | | this.newpacName = res.data; |
| | | try { |
| | | if (this.tableData1.length >= 1) { |
| | | this.newpacName.forEach((item3) => { |
| | | this.tableData1.forEach((item4) => { |
| | | item4.list.forEach((item6) => { |
| | | if (item6.pacName === item3.pacName) { |
| | | this.$nextTick(() => { |
| | | this.$refs.tb.toggleRowSelection(item3, true); |
| | | }); |
| | | throw Error(); |
| | | } |
| | | }); |
| | | }); |
| | | }); |
| | | } |
| | | } catch (error) { } |
| | | this.loading = false; |
| | | }); |
| | | } |
| | | } else { |
| | | this.taocan = true; |
| | | this.loading = true; |
| | | deptTreeSelect(cusSex).then((response) => { |
| | | this.newpacName = response.rows; |
| | | try { |
| | | if (this.tableData1.length >= 1) { |
| | | this.newpacName.forEach((item3) => { |
| | | this.tableData1.forEach((item4) => { |
| | | item4.list.forEach((item6) => { |
| | | if (item6.pacName === item3.pacName) { |
| | | this.$nextTick(() => { |
| | | this.$refs.tb.toggleRowSelection(item3, true); |
| | | }); |
| | | throw Error(); |
| | | } |
| | | }); |
| | | }); |
| | | }); |
| | | }); |
| | | } |
| | | } catch (error) { } |
| | | this.loading = false; |
| | | }); |
| | | |
| | | } |
| | | } catch (error) { } |
| | | this.loading = false; |
| | | }); |
| | | } |
| | | }, |
| | | |
| | | // 点击多选框获取选中数据 |
| | | handleSelectionChange(selection, row) { |
| | | console.log(selection) |
| | | this.tableData = selection; |
| | | if (selection.length > 1) { |
| | | let del_row = selection.shift(); |
| | |
| | | }); |
| | | } |
| | | if (selection[0]) { |
| | | // this.DataList = []; |
| | | // this.data = JSON.parse(JSON.stringify(this.dXData)); |
| | | // selection[0].tjProjectList.forEach((selectionitem) => { |
| | | // this.Treedata.forEach((item) => { |
| | | // if (selectionitem.proName == item.proName) { |
| | | // item.disabled = true; |
| | | // item.tjProjectList = []; |
| | | // } |
| | | // if (item.tjProjectList) { |
| | | // item.tjProjectList.forEach((item1) => { |
| | | // if (selectionitem.proName == item1.proName) { |
| | | // item1.disabled = true; |
| | | // item1.tjProjectList = []; |
| | | // } |
| | | // if (item1.tjProjectList) { |
| | | // item1.tjProjectList.forEach((item2) => { |
| | | // if (selectionitem.proName == item2.proName) { |
| | | // item2.disabled = true; |
| | | // item2.tjProjectList = []; |
| | | // } |
| | | // }); |
| | | // } |
| | | // }); |
| | | // } |
| | | // }); |
| | | // this.TreedataList.forEach((item3) => { |
| | | // if (item3.proParentId == selectionitem.proId) { |
| | | // item.disabled = true; |
| | | // } |
| | | // }); |
| | | // }); |
| | | } else { |
| | | this.treedataList = JSON.parse(JSON.stringify(this.dXData)); |
| | | return; |
| | |
| | | |
| | | // 项目提交 |
| | | submit() { |
| | | |
| | | if (this.form.cusIdcard) { |
| | | var cusId = this.form.cusIdcard; |
| | | } else { |
| | |
| | | }; |
| | | } |
| | | |
| | | getOrderzhiye(data).then((res) => { |
| | | getOrder(data).then((res) => { |
| | | this.$modal.msgSuccess("提交成功"); |
| | | this.tjNumbers = res.msg; |
| | | this.charge = true; |
| | |
| | | }, |
| | | |
| | | listgetOrder(data) { |
| | | getOrderzhiye(data).then((res) => { |
| | | const loading = this.$loading({ |
| | | lock: true, |
| | | text: '正在加载中,请稍等!', |
| | | spinner: 'el-icon-loading', |
| | | background: 'rgba(0, 0, 0, 0.7)' |
| | | }); |
| | | getOrder(data).then((res) => { |
| | | loading.close(); |
| | | this.$modal.msgSuccess("提交成功"); |
| | | //调接口显示导检单 |
| | | const tjNumber = res.msg; |
| | |
| | | this.$tab.refreshPage(); |
| | | }, |
| | | |
| | | // 最后提交按钮 |
| | | submitPrice() { |
| | | submitPrice() { |
| | | let _this = this; |
| | | this.loadingSubmit = true; |
| | | if (_this.tjCategory !== "") { |
| | |
| | | discount: item.discount, |
| | | parentProId: item.parentProId, |
| | | cusIdCard: item.cusId, |
| | | yhj: item.nowPrice |
| | | yhj: item.nowPrice, |
| | | })); // 创建新的对象,包含 discount 和 id |
| | | gaibianzhekou(newArray).then((res) => { |
| | | this.loadingSubmit = false; |
| | | if (res.code === 200) { |
| | | |
| | | let data; |
| | | |
| | | if (pacId || this.tjOrderList.length > 0) { |
| | |
| | | firmId: this.form.firmId, |
| | | firmName: this.form.firmName, |
| | | firmDeptName: this.form.firmDeptName, |
| | | zhiyeJhgly: this.form.zhiyeJhgly, |
| | | zhiyeKsjhrq: this.form.zhiyeKsjhrq, |
| | | zhiyeGh: this.form.zhiyeGh, |
| | | zhiyeCj: this.form.zhiyeCj |
| | | }; |
| | | |
| | | this.listgetOrder(data); |
| | |
| | | firmId: this.form.firmId, |
| | | firmName: this.form.firmName, |
| | | firmDeptName: this.form.firmDeptName, |
| | | zhiyeJhgly: this.form.zhiyeJhgly, |
| | | zhiyeKsjhrq: this.form.zhiyeKsjhrq, |
| | | zhiyeGh: this.form.zhiyeGh, |
| | | zhiyeCj: this.form.zhiyeCj |
| | | |
| | | |
| | | }; |
| | | this.listgetOrder(data); |
| | | } else { |