You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

675 lines
26 KiB

<template>
<div>
<!-- 查询条件 -->
<div :style="`display: flex; flex-wrap: wrap; width: 100%;height:${divHeight}px;`">
<div v-if="winAbsolute" style="position: absolute;top:3px;right:0px;">
<el-tooltip content="关闭人员列表窗口" placement="bottom" effect="light">
<i class="el-icon-close"
@click="closePrList"
style="font-size: 24px;color: red;cursor:pointer;"></i>
</el-tooltip>
</div>
<div class="query" style="display: flex;padding-top: 2px;">
<el-input placeholder="请选择体检单位" v-model="cusOrgOCXdisp" style="width:288px;" size="small"
disabled>
</el-input>
<el-button icon="el-icon-search" @click="report.dialogCusOrgOCX = true"
style="font-size: 20px;height:30px;min-width:30px; padding: 5px 5px;" size="small"></el-button>
</div>
<div class="query">
<span>姓名:</span>
<el-input placeholder="姓名" v-model="local.query.patientName" size="small" clearable style="width: 130px" />
</div>
<div class="query">
<span>性别:</span>
<el-select v-model="local.query.sex" placeholder="请选择" clearable style="width: 120px" size="small">
<el-option v-for="item in dict.sex" :key="item.id" :label="item.displayName" :value="item.id">
</el-option>
</el-select>
</div>
<div class="query">
<el-select v-model="local.query.medicalTypeIds" placeholder="请选择体检类别" clearable filterable style="width: 170px"
size="small" multiple collapse-tags>
<el-option v-for="item in dict.medicalType" :key="item.id" :label="item.displayName" :value="item.id" />
</el-select>
<el-select v-model="local.query.personnelTypeIds" placeholder="请选择人员类别" clearable filterable style="width: 170px;margin-left: 2px;"
size="small" multiple collapse-tags >
<el-option v-for="item in dict.personnelType" :key="item.id" :label="item.displayName" :value="item.id" />
</el-select>
</div>
<div v-if="win == 'doctorCheck'" class="query">
<el-select v-model="local.query.checkDoctorIds" placeholder="请选择医生" size="small" filterable clearable
style="width:140px;text-align: left;" multiple collapse-tags>
<el-option v-for="item in users" :key="item.id" :value="item.id" :label="item.surname" />
</el-select>
<el-select v-model="local.query.checkAsbs" placeholder="请选择组合项目" size="small" filterable
:filter-method="filterMethod" clearable @clear="quickAsb = deepCopy(asbItemQuick)" default-first-option
ref="quickAsbOCX" style="width:200px;text-align: left;margin-left: 2px;" multiple collapse-tags>
<el-option v-for="item in quickAsb" :key="item.id" :value="item.id" :label="item.displayName" />
</el-select>
</div>
<div v-else class="query">
<span>总检医生:</span>
<el-select v-model="local.query.summaryDoctorIds" placeholder="请选择医生" size="small" filterable clearable
style="width:270px;text-align: left;" multiple collapse-tags>
<el-option v-for="item in users" :key="item.id" :value="item.id" :label="item.surname" />
</el-select>
</div>
<div class="query" v-if="win == 'doctorCheck'">
<span>检查状态:</span>
<el-select v-model="local.query.checkCompleteFlag" placeholder="请选择" clearable style="width: 110px" size="small">
<el-option v-for="item in dict.checkCompleteFlag" :key="item.id" :label="item.displayName" :value="item.id">
</el-option>
</el-select>
<el-select v-model="local.query.isAuditCheck" placeholder="请选择" clearable style="width: 95px;margin: 0 2px;"
size="small">
<el-option label="未审核" value="N" />
<el-option label="已审核" value="Y" />
</el-select>
<el-checkbox v-model="local.query.haveImage">有图</el-checkbox>
</div>
<div class="query">
<span>人员状态:</span>
<el-select v-model="local.query.completeFlag" placeholder="请选择" clearable style="width: 110px" size="small">
<el-option v-for="item in local.completeFlag" :key="item.id" :label="item.displayName" :value="item.id">
</el-option>
</el-select>
<el-select v-model="local.query.isAudit" placeholder="请选择" clearable style="width: 95px;margin: 0 2px;"
size="small">
<el-option label="未审核" value="N" />
<el-option label="已审核" value="Y" />
</el-select>
</div>
<div class="query">
<el-button class="commonbutton" type="primary" @click="btnQuery" size="small"
style="width:50px;height:26px;margin: 2px 0 2px -3px;">查询</el-button>
</div>
</div>
<!-- 人员列表 -->
<u-table :data="dataList" border width="100%" :height="tableHeight" row-key="id" size="small" highlight-current-row
@row-click="rowClick" @row-dblclick="rowDblclick" ref="info" id="info" style="border-radius:10px;"
:row-class-name="tableRowClassName" @table-body-scroll="scrollFull" use-virtual :row-height="23" big-data-checkbox :data-changes-scroll-top="false">
<u-table-column type="index" label="序号" width="50" align="center" />
<u-table-column prop="customerOrgParentName" label="单位" width="120" sortable show-overflow-tooltip>
<template slot-scope="scope">
<div>{{ scope.row.customerOrgParentName ? scope.row.customerOrgParentName :
scope.row.customerOrgName }}</div>
</template>
</u-table-column>
<u-table-column prop="patientName" label="姓名" width="80" sortable align="center" show-overflow-tooltip/>
<u-table-column prop="sexName" label="性别" width="50" sortable align="center" />
<u-table-column prop="age" label="年龄" width="50" align="center" sortable/>
<u-table-column prop="customerOrgName" label="部门" width="100" sortable show-overflow-tooltip>
<template slot-scope="scope">
<div>{{ scope.row.customerOrgParentName ? scope.row.customerOrgName : "" }}</div>
</template>
</u-table-column>
<u-table-column prop="patientRegisterNo" label="条码号" width="150" sortable align="center" show-overflow-tooltip/>
<u-table-column prop="patientNo" label="档案号" sortable align="center" show-overflow-tooltip/>
<u-table-column prop="medicalTimes" label="次数" align="center" />
<u-table-column label="分组/套餐" width="150" show-overflow-tooltip>
<template slot-scope="scope">
<div v-if="scope.row.medicalPackageId !== dict.personOrgId && scope.row.customerOrgId === dict.personOrgId">
{{ scope.row.medicalPackageName }}
</div>
<div v-if="scope.row.medicalPackageId !== dict.personOrgId && scope.row.customerOrgId !== dict.personOrgId">
{{ scope.row.customerOrgGroupName }}
</div>
</template>
</u-table-column>
<u-table-column prop="nationName" label="民族" sortable align="center" show-overflow-tooltip/>
<u-table-column prop="idNo" label="身份证" sortable width="160" align="center" show-overflow-tooltip/>
<u-table-column prop="birthDate" label="出生日期" align="center" width="100">
<template slot-scope="scope">
<div v-if="scope.row.birthDate">
{{ lmoment(scope.row.birthDate, "yyyy-MM-DD") }}
</div>
</template>
</u-table-column>
<u-table-column prop="email" label="邮箱" width="150" show-overflow-tooltip/>
<u-table-column prop="mobileTelephone" label="手机" width="130" show-overflow-tooltip/>
<u-table-column prop="telephone" label="电话" width="130" show-overflow-tooltip/>
<u-table-column prop="address" label="地址" width="400" sortable show-overflow-tooltip/>
<u-table-column prop="medicalCardNo" label="体检卡号" sortable show-overflow-tooltip/>
<u-table-column prop="jobCardNo" label="工卡号" sortable show-overflow-tooltip/>
<u-table-column prop="maritalStatusName" label="婚姻状况" align="center" sortable/>
<u-table-column prop="medicalTypeName" label="体检类别" sortable show-overflow-tooltip/>
<u-table-column prop="personnelTypeName" label="人员类别" sortable show-overflow-tooltip/>
<u-table-column prop="jobPost" label="职务" width="200" sortable />
<u-table-column prop="jobTitle" label="职称" sortable show-overflow-tooltip/>
<u-table-column prop="salesman" label="介绍人" sortable show-overflow-tooltip/>
<u-table-column prop="isVip" label="是否VIP" align="center" sortable>
<template slot-scope="scope">
<div>{{ scope.row.isVip == "Y" ? "是" : "否" }}</div>
</template>
</u-table-column>
<u-table-column prop="creatorName" label="登记人" sortable />
<u-table-column prop="creationTime" label="登记日期" width="100" align="center" sortable>
<template slot-scope="scope">
<div>{{ lmoment(scope.row.creationTime, "yyyy-MM-DD") }}</div>
</template>
</u-table-column>
<u-table-column prop="isUpload" label="是否上传" align="center" sortable>
<template slot-scope="scope">
<div>{{ scope.row.isUpload == "Y" ? "是" : "否" }}</div>
</template>
</u-table-column>
<u-table-column prop="completeFlag" label="体检进度" sortable>
<template slot-scope="scope">
<div>{{ dddw(dict.completeFlag, "id", scope.row.completeFlag, "displayName") }}</div>
</template>
</u-table-column>
<u-table-column prop="isLock" label="锁住" align="center" sortable>
<template slot-scope="scope">
<div>{{ scope.row.isLock == "Y" ? "是" : "否" }}</div>
</template>
</u-table-column>
<u-table-column prop="summaryDoctorName" label="总检医生" sortable align="center">
</u-table-column>
<u-table-column prop="auditDoctorName" label="审核医生" sortable align="center">
</u-table-column>
</u-table>
<div style="display: flex;justify-content:space-between;">
<div></div>
<div>
<span style="font-size:12px;">共:{{ loadOpts.totalCount }} 条记录,当前显示:{{ dataList.length }}
条。</span>
</div>
</div>
<el-table v-if="checkStatistics.length > 0 ? true:false" :data="checkStatistics" border height="105">
<el-table-column prop="checkStatus" label="检查" />
<el-table-column prop="maleCount" label="男" />
<el-table-column prop="femaleCount" label="女" />
<el-table-column prop="unknownCount" label="未知" />
</el-table>
<!--通用选单位、体检次数、分组的控件-->
<el-dialog title="体检单位选择" :visible.sync="report.dialogCusOrgOCX" :close-on-click-modal="false"
:append-to-body="true" width="880px" height="600px">
<CusOrgOCX :useCustomerOrg="false" :initDateType="'medicalStartDate'" @cusOrgOCXbak="cusOrgOCXbak"/>
</el-dialog>
</div>
</template>
<script>
import moment from "moment";
import { mapState, mapMutations } from "vuex";
import { getapi, postapi, putapi, deletapi } from "@/api/api";
import { dddw, objCopy, arrayReduce, deepCopy } from "../../utlis/proFunc"
import { UTable, UTableColumn } from "umy-ui";
import CusOrgOCX from "../../components/report/CusOrgOCX.vue"
export default {
components: {
CusOrgOCX,
UTable,
UTableColumn,
},
props: ['win', 'winAbsolute'],
data() {
return {
dataList: [], //列表数据
checkStatistics:[], //检查状态
multipleSelection: [], //选中的数据列表
dialogVisible: false,
dialogCamera: false,
cusOrgOCXdisp:'',
// 控件查询条件
ocxDatas:[],
// 本地查询条件
local: {
query: {
dateType: 'creationTime', //登记日期
dateRange: null, //日期范围
startDate: null,
endDate: null,
containRefuse: true, //包含弃检项目
times: 0, //触发查询次数
customerOrgId: "", //体检单位ID
CustomerOrgParentId: "", //单位父级ID
customerOrgFlag: true, //单位作为查询条件
customerOrgRegister: { id: '' }, //单位体检次数
checkAsbs: null,
patientName: '', //姓名
sex: '', //性别
idCardNo: '', //身份证号
haveImage: false,
checkCompleteFlag: '', //检查项目状态
isAuditCheck: '', //检查项目审核
medicalTypeIds: [],
personnelTypeIds: [],
checkDoctorIds: [],
summaryDoctorIds: [],
},
completeFlag: []
},
quickAsb: [],
asbItemQuick: [],
dom: null, //用于滚动加载数据
lazyLoading: false, //是否懒加载中
loadOpts: {
totalCount: 0,
skipCount: 0,
maxResultCount: 1000,
},
loadOptsInit: {},
oneClick: 0, // 1 表示行单击一次
DbClick: 0, // 1 表示行有单击第二次
users: [],
};
},
created() {
this.dictInit()
this.loadOptsInit = Object.assign({}, this.loadOpts)
},
//挂载完成
mounted() {
// this.$nextTick(() => {
// this.scrollFull()
// })
},
computed: {
...mapState(["window", "dialogWin","dataTransOpts", "dict", "customerOrg", "patientRegister", "doctorCheck", "sumDoctorCheck", "report"]),
divHeight() {
if (this.win == "doctorCheck") {
return 210
} else {
return 175
}
},
// 列表高度
tableHeight() {
let tableH = this.winAbsolute ? (this.window.pageHeight - 46 - 30 - this.divHeight) : (this.window.pageHeight - 46 - this.divHeight)
if(this.checkStatistics.length > 0) tableH = tableH - 105
return tableH
},
},
methods: {
...mapMutations(['doctorCheckPrBaseInit', 'sumPREditInit']),
dddw,
dictInit() {
// 默认 当天 体检日期
let today = moment(new Date()).format('yyyy-MM-DD');
this.ocxDatas = [{startDate: today, endDate: today, dateType: "medicalStartDate"}]
this.cusOrgOCXdisp = `(体检${today}~${today})`
/* 首次使用时,再调用
//分组,所有分组,不限单位,不限次数
postapi("/api/app/CustomerOrgGroup/GetBasicList").then((res) => {
if (res.code > -1) {
this.dict.customerOrgGroupAll = res.data;
}
});
*/
//性别(查询)
getapi("/api/app/for-sex").then((res) => {
if (res.code == 1) {
this.dict.forSex = res.data;
}
});
//性别(仅档案用)
getapi("/api/app/sex").then((res) => {
if (res.code == 1) {
this.dict.sex = res.data;
}
});
//体检类别
getapi("/api/app/medical-type/in-filter").then((res) => {
if (res.code == 1) {
this.dict.medicalType = res.data;
}
});
//人员类别
getapi("/api/app/personnel-type/in-filter").then((res) => {
if (res.code == 1) {
this.dict.personnelType = res.data;
}
});
// 获取组合项目
postapi('/api/app/asbitem/GetBasicList', { isFilterActive: 'Y' }).then(res => {
if (res.code != -1) {
this.asbItemQuick = res.data
this.quickAsb = res.data
}
});
// 用户
let operatorTypes = ["2", "3"] //总检医生
if (this.win == 'doctorCheck') operatorTypes = ["1", "3"]
postapi('/api/identity/users/GetListByOperatorType', { operatorTypes })
.then(res => {
if (res.code > -1) {
this.users = res.data
}
})
this.local.completeFlag = deepCopy(this.dict.completeFlag)
this.local.completeFlag.splice(0, 1) //预记选项去掉
this.local.completeFlag.splice(2, 0, { id: '5', displayName: '全部已检(未总检)' }) //插入
},
// 查询控件数据返回的查询条件
cusOrgOCXbak(cusOrgOCXdata){
console.log('cusOrgOCXbak.cusOrgOCXdata',cusOrgOCXdata,this.ocxDatas)
this.ocxDatas = []
if(Array.isArray(cusOrgOCXdata?.ocxDatas) && cusOrgOCXdata?.ocxDatas.length > 0){
cusOrgOCXdata.ocxDatas.forEach(e => {
this.ocxDatas.push(Object.assign({},e))
});
}
this.cusOrgOCXdisp = cusOrgOCXdata?.cusOrgOCXdisp //控件查询件显示
},
// 关闭显示窗口
closePrList(){
this.doctorCheck.doctorCheckDialogVisible = false;
this.sumDoctorCheck.sumDoctorCheckDialogVisible = false;
// 新的
if(this.win == 'doctorCheck'){
this.dialogWin.doctorPrList = false
}else{
this.dialogWin.sumPrList = false
}
},
//快速选择组合项目时,调整可按拼间简码及简称查找
filterMethod(keyWords) {
//console.log('filterMethod',this.asbItemQuick)
if (keyWords) {
this.quickAsb = [];
this.asbItemQuick.forEach(item => {
if (item.displayName.toLowerCase().indexOf(keyWords.toLowerCase()) > - 1
|| item.simpleCode.toLowerCase().indexOf(keyWords.toLowerCase()) > - 1
|| item.shortName.toLowerCase().indexOf(keyWords.toLowerCase()) > - 1) {
this.quickAsb.push(item);
}
});
} else {
this.quickAsb = deepCopy(this.asbItemQuick);
}
},
//点击体检次数行
rowClick(row) {
if (this.oneClick == 0) {
this.oneClick = 1;
} else {
this.DbClick = 1;
}
//双击事件
if (this.DbClick == 1) { //第一次点击的节点和第二次点击的节点id相同
this.rowClickRetrieve(row)
return;
}
setTimeout(() => { //300ms内没有第二次点击,执行单击事件
if (this.oneClick == 1 && this.DbClick == 0) this.rowClickRetrieve(row)
}, 300)
},
rowClickRetrieve(row) {
this.oneClick = 0;
this.DbClick = 0;
this.$emit("choosedBak",row)
//this.dataTransOpts.tableS.patient_register = deepCopy(row)
// setTimeout(() => {
//this.dataTransOpts.refresh.patient_register.S++ //人员体检登记信息刷新
// }, 10);
},
//双击选中客户记录后,并半闭列表
rowDblclick(row) {
// this.rowClick(row)
this.doctorCheck.doctorCheckDialogVisible = false
this.sumDoctorCheck.sumDoctorCheckDialogVisible = false
// console.log('rowDblclick', this.doctorCheck.doctorCheckDialogVisible, this.sumDoctorCheck.sumDoctorCheckDialogVisible)
},
lmoment(date, forMat) {
return moment(new Date(date)).format(forMat);
},
//查询
async btnQuery() {
this.loadOpts = Object.assign(this.loadOpts, this.loadOptsInit)
await this.getPrList()
},
async getPrList() {
if (this.loadOpts.skipCount != 0 && this.loadOpts.skipCount * this.loadOpts.maxResultCount >= this.loadOpts.totalCount) return
let body = {}, customerOrgs = []
//console.log('this.report.dataCusOrgOCX', this.report.dataCusOrgOCX)
if (this.ocxDatas.length > 0) {
this.ocxDatas.forEach(e => {
let dateType = '1'
switch (e.dateType) {
case 'medicalStartDate':
dateType = '2'
break;
case 'checkDate':
dateType = '4'
break;
case 'summaryDate':
dateType = '3'
break;
case 'sumCheckDate':
dateType = '5'
break;
default:
break;
}
let rd = {
startDate: moment(e.startDate).format('yyyy-MM-DD'),
endDate: moment(e.endDate).format('yyyy-MM-DD'),
dateType
}
if (e.customerOrgId) {
rd.customerOrgId = e.customerOrgId
if (e.customerOrgId == this.dict.personOrgId) {
rd.customerOrgRegisterId = null
rd.customerOrgGroupId = []
} else {
rd.customerOrgRegisterId = e.customerOrgRegister.id
rd.customerOrgGroupId = e.customerOrgGroupIds
}
}
customerOrgs.push(rd)
})
}
body.customerOrgs = customerOrgs
if (this.local.query.patientName) body.patientName = this.local.query.patientName
if (this.local.query.sex) body.sexId = this.local.query.sex
if (this.local.query.isAudit) body.isAudit = this.local.query.isAudit
if (this.local.query.completeFlag) body.completeFlag = this.local.query.completeFlag
if (Array.isArray(this.local.query.checkAsbs) && this.local.query.checkAsbs.length > 0) body.asbitems = this.local.query.checkAsbs
if (this.local.query.haveImage) body.isPicture = 'Y'
if (this.local.query.checkCompleteFlag) body.asbitemCompleteFlag = this.local.query.checkCompleteFlag
if (this.local.query.isAuditCheck) body.asbitemIsAudit = this.local.query.isAuditCheck
if (Array.isArray(this.local.query.medicalTypeIds) && this.local.query.medicalTypeIds.length > 0) {
body.medicalTypeIds = this.local.query.medicalTypeIds
}
if (Array.isArray(this.local.query.personnelTypeIds) && this.local.query.personnelTypeIds.length > 0) {
body.personnelTypeIds = this.local.query.personnelTypeIds
}
if (Array.isArray(this.local.query.checkDoctorIds) && this.local.query.checkDoctorIds.length > 0) {
body.checkDoctorIds = this.local.query.checkDoctorIds
}
if (Array.isArray(this.local.query.summaryDoctorIds) && this.local.query.summaryDoctorIds.length > 0) {
body.summaryDoctorIds = this.local.query.summaryDoctorIds
}
body.isFilterPreRegistration = 'Y' //是否需要过滤预登记数据 Y=过滤预登记数据 N=不过滤 默认为N (备注:只有CompleteFlag参数的值不为0的情况才有效,null值也有效)
// "patientName": "string",
// "sexId": "string",
// "isAudit": "string",
// "completeFlag": "string",
// "maxResultCount": 0
// console.log('/api/patientregister/getpeisrecordlist', Object.assign(body, this.loadOpts))
// const loading = this.$loading({
// lock: true,
// text: "Loading",
// spinner: "el-icon-loading",
// background: "rgba(0, 0, 0, 0.7)",
// });
body = Object.assign(body, this.loadOpts)
let url = '/api/app/PatientRegister/GetSumDoctorPeisRecordList'
if (this.win == "doctorCheck") url = '/api/app/PatientRegister/GetDoctorPeisRecordList'
postapi(url, body)
.then((res) => {
if (res.code > -1) {
// 刷新最大记录数
this.loadOpts.totalCount = res.data.totalCount
if (body.skipCount == 0){
this.dataList = []
this.checkStatistics = []
}
this.dataList = this.dataList.concat(res.data.items)
this.checkStatistics = res.data.checkStatistics||[]
}
})
// .finally(() =>{
// loading.close();
// })
;
},
//数据量多时,滚动加载
async load() {
this.loadOpts.skipCount++
await this.getPrList()
this.lazyLoading = false;
},
//滚动加载数据
async scrollFull(scroll, event) {
if (!scroll.judgeFlse) return;
// 正在加载时阻止重复触发
if (this.lazyLoading) return;
if (
(Number(this.loadOpts.skipCount) + 1) *
Number(this.loadOpts.maxResultCount) >=
Number(this.loadOpts.totalCount)
) {
return;
}
this.lazyLoading = true;
try {
await this.load();
} catch (e) {
console.error('scrollFull load error', e);
}
// this.dom = this.$refs['info'].bodyWrapper
// console.log('this.dom', this.dom)
// this.dom.addEventListener('scroll', async () => {
// // console.log('scrollTop',this.dom.scrollTop,'clientHeight',this.dom.clientHeight,'scrollHeight',this.dom.scrollHeight);
// if (this.dom.scrollTop + this.dom.clientHeight + 20 > this.dom.scrollHeight && !this.lazyLoading) {
// // 获取到的不是全部数据 当滚动到底部
// console.log('scrollTop', this.dom.scrollTop, 'clientHeight', this.dom.clientHeight, 'scrollHeight', this.dom.scrollHeight);
// if ((Number(this.loadOpts.skipCount) + 1) * Number(this.loadOpts.maxResultCount) >= Number(this.loadOpts.totalCount)) {
// this.lazyLoading = false
// } else {
// this.lazyLoading = true
// await this.load()
// this.lazyLoading = false
// // this.dom.scrollTop = this.dom.scrollTop - 100
// }
// }
// })
},
//关闭
close() {
//console.log('this.win',this.win)
if (this.win == 'doctorCheck') {
this.doctorCheck.doctorCheckDialogVisible = false
} else {
this.sumDoctorCheck.sumDoctorCheckDialogVisible = false
}
},
// 表格行底色样式
tableRowClassName({ row, rowIndex }) {
if(row.isAudit == 'Y' && row.completeFlag == '3'){
return 'complete4';
}else if(row.completeFlag == '3'){
return 'complete3';
}else if(row.completeFlag == '2'){
return 'complete2';
}
return '';
}
},
//监听事件
watch: {
},
};
</script>
<style scoped>
/* 部份已检 */
::v-deep .el-table .complete2 {
background: #ec7504 !important;
}
/* 总检 */
::v-deep .el-table .complete3 {
background: #ff80ff !important;
}
/* 总检已审核 */
::v-deep .el-table .complete4 {
background: #ffff80 !important;
}
.el-table .complete2 {
background: #51db06;
}
.box {
display: flex;
}
.query {
margin-left: 5px;
margin-bottom: 2px;
font-size: 14px;
}
.listBtn {
margin-top: 10px;
}
</style>