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.
 
 
 

611 lines
23 KiB

<template>
<div class="box">
<div>
<div class="middlebox">
<div class="contenttitle">
客户报表 /
<span class="contenttitleBold">单位职业病汇总报表</span>
</div>
</div>
<div :style="'display: block;'">
<div style="
background-color: #fff;
padding: 15px;
border-radius: 8px;
display: flex;
flex-wrap: wrap;
margin-bottom: 10px;
height: 35px;
margin-top: 7px;
">
<div class="query">
<span>体检单位</span>
<el-input placeholder="请选择体检单位" v-model="patientRegister.query.cusOrgOCX" style="width: 240px" size="small"
disabled>
<el-button slot="append" icon="el-icon-search" @click="report.dialogCusOrgOCX = true"
style="font-size: 20px"></el-button>
</el-input>
</div>
<div class="query">
<span>报表格式:</span>
<el-select v-model="format" placeholder="请选择" style="width: 80px" @change="changeValue" size="small">
<el-option label="疾控汇报" value="0" />
<el-option label="单位格式" value="1" />
</el-select>
</div>
<div class="query">
<el-button @click="btnQuery(true)" size="small" class="commonbutton">预览</el-button>
<el-button @click="btnQuery(false)" size="small" class="commonbutton">打印</el-button>
</div>
<!--
<div class="query">
<el-button size="small" class="commonbutton" :disabled="format == 2" @click="handleExport">导出excel</el-button>
</div>
<div class="query">
<el-button size="small" class="commonbutton" :disabled="format == 2" @click="onPrint">打印</el-button>
</div>
-->
</div>
<div v-show="format == 3" ref="imageDom0">
<div style="background-color: #fff; padding: 15px; border-radius: 8px">
<el-table border :height="flag
? window.pageHeight < 600
? 415
: window.pageHeight - 185 - 20
: ''
" :data="tableData" id="standardTableData" ref="standardTableData" style="width: 100%"
:header-cell-class-name="headerStyle">
<el-table-column :label="reportTitle">
<el-table-column
:label="`单位: ${customerOrgName || ''} 体检次数 ${medicalTimes || ''} 开始月份: ${startMonth || ''} 结束月份: ${endMonth || ''}`">
<template slot-scope="scope">
<el-table :data="scope.row.patientRegisterPositiveReports" border show-summary
:summary-method="summarizeRegisterCounts" :header-cell-class-name="headerStyle">
<el-table-column label="人员阳性结果清单">
<el-table-column :label="`${startDate || ''}
${endDate || ''}
体检人员共计:
${sumMedicalNumber || ''}
其中男:
${maleMedicalNumber || ''}
女:
${femaleMedicalNumber || ''}
其他:
${otherMedicalNumber || ''}
`">
<el-table-column prop="patientNo" label="档案号" width="120" />
<el-table-column prop="patientName" label="姓名" width="120" />
<el-table-column prop="sexName" label="性别" width="50" />
<el-table-column prop="age" label="年龄" width="80" />
<el-table-column prop="medicalTimes" label="次数" width="50" />
<el-table-column prop="mobileTelephone" label="手机号码" width="120" />
<el-table-column prop="diagnosisNames" label="诊断名称" />
</el-table-column>
</el-table-column>
</el-table>
<el-table :data="scope.row.positivePatientRegisterReportStandards" border
:header-cell-class-name="headerStyle" style="margin-top: 15px">
<el-table-column label="阳性结果人员清单">
<el-table-column :label="`${startDate || ''}
${endDate || ''}
体检人员共计:
${sumMedicalNumber || ''}
其中男:
${maleMedicalNumber || ''}
女:
${femaleMedicalNumber || ''}
其他:
${otherMedicalNumber || ''}
`">
<template slot-scope="scopes">
<el-table :data="scopes.row.patientRegisters" border show-summary
:summary-method="summarizeRegisterCounts">
<el-table-column :label="scopes.row.diagnosisName">
<el-table-column label="部门名称" prop="departmentName"></el-table-column>
<el-table-column label="姓名" prop="patientName"></el-table-column>
<el-table-column label="性别" prop="sexName"></el-table-column>
<el-table-column prop="age" label="年龄">
</el-table-column>
<el-table-column prop="patientRegisterNo" label="条码号">
</el-table-column>
<el-table-column prop="patientNo" label="档案号">
</el-table-column>
<el-table-column prop="medicalTimes" label="体检次数">
</el-table-column>
<el-table-column prop="telephone" label="电话">
</el-table-column>
<el-table-column prop="mobileTelephone" label="手机号">
</el-table-column>
</el-table-column>
</el-table>
</template>
</el-table-column>
</el-table-column>
</el-table>
<el-table :data="scope.row.diseaseCountStatisticsReports" border
:header-cell-class-name="headerStyle" show-summary :summary-method="summarizeRegisterCount"
style="margin-top: 15px">
<el-table-column label="疾病人数统计">
<el-table-column :label="`${startDate || ''}
${endDate || ''}
体检人员共计:
${sumMedicalNumber || ''}
其中男:
${maleMedicalNumber || ''}
女:
${femaleMedicalNumber || ''}
其他:
${otherMedicalNumber || ''}
`">
<el-table-column label="序号" type="index">
</el-table-column>
<el-table-column prop="diagnosisName" label="疾病" />
<el-table-column prop="patientCount" label="人数" />
<el-table-column prop="percentage" label="占总检人员百分比" />
</el-table-column>
</el-table-column>
</el-table>
</template>
</el-table-column>
</el-table-column>
</el-table>
</div>
</div>
<div v-show="format == 4" ref="imageDom1">
<div style="background-color: #fff; padding: 15px; border-radius: 8px">
<el-table border :height="flag
? window.pageHeight < 600
? 415
: window.pageHeight - 185 - 20
: ''
" :data="reducetableData" id="reducetableData" ref="reducetableData" style="width: 100%"
:header-cell-class-name="headerStyle">
<el-table-column :label="reducereportTitle">
<el-table-column
:label="`单位: ${customerOrgName || ''} 体检次数 ${medicalTimes || ''} 开始月份: ${startMonth || ''} 结束月份: ${endMonth || ''}`">
<template slot-scope="scope">
<el-table :data="scope.row.patientRegisterPositiveReports" border show-summary
:summary-method="summarizeRegisterCounts" :header-cell-class-name="headerStyle">
<el-table-column label="人员阳性结果清单">
<el-table-column :label="`${reducestartDate || ''}
${reduceendDate || ''}
体检人员共计:
${reducesumMedicalNumber || ''}
其中男:
${reducemaleMedicalNumber || ''}
女:
${reducefemaleMedicalNumber || ''}
其他:
${reduceotherMedicalNumber || ''}
`">
<el-table-column prop="patientNo" label="档案号" width="120" />
<el-table-column prop="patientName" label="姓名" width="120" />
<el-table-column prop="sexName" label="性别" width="50" />
<el-table-column prop="age" label="年龄" width="80" />
<el-table-column prop="medicalTimes" label="次数" width="50" />
<el-table-column prop="mobileTelephone" label="手机号码" width="120" />
<el-table-column prop="diagnosisNames" label="诊断名称" />
</el-table-column>
</el-table-column>
</el-table>
<el-table :data="scope.row.positivePatientRegisterReportReduces" border
:header-cell-class-name="headerStyle" show-summary :summary-method="summarizeRegisterCount"
style="margin-top: 15px">
<el-table-column label="阳性结果人员清单">
<el-table-column :label="`${reducestartDate || ''}
${reduceendDate || ''}
体检人员共计:
${reducesumMedicalNumber || ''}
其中男:
${reducemaleMedicalNumber || ''}
女:
${reducefemaleMedicalNumber || ''}
其他:
${reduceotherMedicalNumber || ''}
`">
<el-table-column label="序号" type="index">
</el-table-column>
<el-table-column prop="diagnosisName" label="诊断" />
<el-table-column prop="patientCount" label="人数" />
<el-table-column prop="percentage" label="占总检人员百分比" />
</el-table-column>
</el-table-column>
</el-table>
<el-table :data="scope.row.diseaseCountStatisticsReports" border
:header-cell-class-name="headerStyle" show-summary :summary-method="summarizeRegisterCount"
style="margin-top: 15px">
<el-table-column label="疾病人数统计">
<el-table-column :label="`${reducestartDate || ''}
${reduceendDate || ''}
体检人员共计:
${reducesumMedicalNumber || ''}
其中男:
${reducemaleMedicalNumber || ''}
女:
${reducefemaleMedicalNumber || ''}
其他:
${reduceotherMedicalNumber || ''}
`">
<el-table-column label="序号" type="index">
</el-table-column>
<el-table-column prop="diagnosisName" label="疾病" />
<el-table-column prop="patientCount" label="人数" />
<el-table-column prop="percentage" label="占总检人员百分比" />
</el-table-column>
</el-table-column>
</el-table>
</template>
</el-table-column>
</el-table-column>
</el-table>
</div>
</div>
<div v-show="format == 0 || format == 1" ref="imageDom2">
<div style="background-color: #fff; padding: 15px; border-radius: 8px">
<div :style="'display: flex;justify-content: center;align-items: center;height:' +
(window.pageHeight < 600 ? 415 : window.pageHeight - 185 - 20) +
'px;'
">
<div v-show="reportUrl == ''">无数据</div>
<a :href="reportUrl" v-show="reportUrl != ''">
<el-button>下载Word报表</el-button>
</a>
</div>
</div>
</div>
</div>
</div>
<!--通用选单位、体检次数、分组的控件-->
<el-dialog title="体检单位选择" :visible.sync="report.dialogCusOrgOCX" :close-on-click-modal="false" width="880px"
height="600px">
<CusOrgOCX :useCustomerOrg="true" :initDateType="'creationTime'" :isUnit="true" />
</el-dialog>
</div>
</template>
<script>
import moment from "moment";
import { mapState, mapActions } from "vuex";
import { getapi, postapi, putapi, deletapi } from "@/api/api";
import {
dddw,
objCopy,
arrayReduce,
arrayExistObj,
tcdate,
} from "@/utlis/proFunc";
import CusOrgOCX from "../../components/report/CusOrgOCX.vue";
import { exportToExcel } from "../../utlis/Export2Excel";
import html2canvas from "html2canvas";
import printJs from "print-js";
export default {
components: {
CusOrgOCX,
},
data() {
return {
format: "0",
flag: true,
tableData: [],
reducetableData: [],
reportTitle: "",
customerOrgName: "",
medicalTimes: null,
startMonth: "",
endMonth: "",
startDate: "",
endDate: "",
sumMedicalNumber: null,
maleMedicalNumber: null,
femaleMedicalNumber: null,
otherMedicalNumber: null,
reducereportTitle: "",
reducecustomerOrgName: "",
reducemedicalTimes: null,
reducestartMonth: "",
reduceendMonth: "",
reducestartDate: "",
reduceendDate: "",
reducesumMedicalNumber: null,
reducemaleMedicalNumber: null,
reducefemaleMedicalNumber: null,
reduceotherMedicalNumber: null,
reportUrl: "",
};
},
created() {
// this.dictInit();
},
//挂载完成
mounted() {
// this.btnQuery();
},
computed: {
...mapState(["window", "dict", "patientRegister", "report"]),
},
methods: {
btnQuery(isPreview) {
let customerOrgs = [];
if (this.report.dataCusOrgOCX.length > 0) {
this.report.dataCusOrgOCX.forEach((e) => {
let rd = {
startDate: moment(e.startDate).format("yyyy-MM-DD"),
endDate: moment(e.endDate).format("yyyy-MM-DD"),
dateType:
e.dateType == "summaryDate"
? "3"
: e.dateType == "medicalStartDate"
? "2"
: "1",
};
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);
});
}
if (customerOrgs.length == 0) {
this.$message.warning({ showClose: true, message: "请选择单位" })
return
}
if (!this.$peisAPI) {
this.$message.info({ showClose: true, message: "此功能,需要在壳客户端才可运行!" })
return
}
//暂时未区分格式
// if (this.format == 0)
let ReportCode = this.format == 0 ? '0009':'0010';
let token = window.sessionStorage.getItem('token');
let user = window.sessionStorage.getItem('user');
let toOutShell = {
ReportCode,
token,
isBuildImage: 'N',
IsUploadPdf: 'N',
preViewCanPrint: "Y",
Parameters: [
{ Name: "printer", Value: user },
{ Name: "hisLog", Value: "pic/hisLog.jpg" },
{ Name: 'pageFooter', Value: 'pic/peisQrCode.jpg' },
{ Name: "picExtOne", Value: "pic/occGrant.jpg" },
],
BusinessCode:JSON.stringify(customerOrgs)
};
console.log('toOutShell', toOutShell)
if (isPreview) {
this.$peisAPI.printPre(JSON.stringify(toOutShell))
.then(res => {
let lres = JSON.parse(res)
if (lres.code < 0) {
this.$message.error({ showClose: true, message: lres.message })
}
})
.catch((err) => {
this.$message.error({ showClose: true, message: err })
});
} else {
this.$peisAPI.print(JSON.stringify(toOutShell))
.then(res => {
let lres = JSON.parse(res)
if (lres.code < 0) {
this.$message.error({ showClose: true, message: lres.message })
}
})
.catch((err) => {
this.$message.error({ showClose: true, message: err })
});
}
},
summarizeRegisterCounts(param) {
const { columns, data } = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = "合计";
return;
}
if (index === 1) {
sums[index] = data.length + "人";
return;
}
});
return sums;
},
summarizeRegisterCount(param) {
const { columns, data } = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = "合计";
return;
}
const values = data.map((item) => Number(item[column.property]));
if (index === 2) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return prev + curr;
} else {
return prev;
}
}, 0);
sums[index] += " 人";
}
});
return sums;
},
headerStyle({ row, column, rowIndex, columnIndex }) {
if (rowIndex === 1) {
return "left-align";
}
},
changeValue(value) {
if (value == 0) {
this.$nextTick(() => {
this.$refs.standardTableData.doLayout();
});
} else if (value == 1) {
this.$nextTick(() => {
this.$refs.reducetableData.doLayout();
});
}
},
handleExport() {
if (this.format == 0) {
let name = "北京神豚软件开发有限公司体检报告";
if (this.reportTitle != "") {
name = this.reportTitle;
}
let index = 3;
let list = [];
list.push(index);
index += this.tableData[0].patientRegisterPositiveReports.length + 7;
list.push(index);
for (
let i = 0;
i <
this.tableData[0].positivePatientRegisterReportStandards.length - 1;
i++
) {
index +=
this.tableData[0].positivePatientRegisterReportStandards[i]
.patientRegisters.length + 4;
list.push(index);
}
exportToExcel("#standardTableData", name, true, list);
} else if (this.format == 1) {
let name = "北京神豚软件开发有限公司体检报告";
if (this.reducereportTitle != "") {
name = this.reducereportTitle;
}
let index = 3;
let list = [];
list.push(index);
exportToExcel("#reducetableData", name, true, list);
}
},
onPrint() {
this.flag = false;
let index = "";
if (this.format == 0) {
index = "imageDom0";
} else if (this.format == 1) {
index = "imageDom1";
} else {
index = "imageDom2";
}
this.$nextTick(() => {
let width = this.$refs[index].style.width;
let cloneDom = this.$refs[index].cloneNode(true);
let imageDom = this.$refs[index];
cloneDom.style.position = "absolute";
cloneDom.style.top = "0px";
cloneDom.style.zIndex = "-1";
cloneDom.style.width = width;
imageDom.appendChild(cloneDom);
html2canvas(cloneDom).then((canvas) => {
// 转成图片,生成图片地址
const url = canvas.toDataURL("image/png");
printJs({
printable: url,
type: "image",
documentTitle: "", // 标题
style: `@media print { @page {size: auto; margin: 0 0 0 0; } body{margin:0 5px}canvas{page-break-after: always;page-break-inside: avoid;
page-break-after: avoid;
page-break-before: avoid;}}`, // 去除页眉页脚
});
});
cloneDom.style.display = "none";
this.flag = true;
});
},
},
};
</script>
<style scoped>
@import "../../assets/css/global_button.css";
@import "../../assets/css/global_dialog.css";
@import "../../assets/css/global_table.css";
@import "../../assets/css/global_form.css";
@import "../../assets/css/global_input.css";
@import "../../assets/css/global.css";
.query {
margin-right: 10px;
display: flex;
justify-content: center;
align-items: center;
font-size: 14px;
color: #232748;
font-size: 400;
font-family: "NotoSansSC-Regular";
}
.box {
display: flex;
flex-direction: column;
}
::v-deep .el-table__header-wrapper th.backcolor {
background-color: #f5f7fa;
}
:deep .left-align .cell {
text-align: left !important;
}
::v-deep .el-input__inner {
/*text-align: center;*/
padding-left: 5px;
padding-right: 15px;
}
::v-deep .el-input__icon {
width: 15px;
/* 输入框下拉箭头或清除图标 默认 25 */
}
::v-deep .el-input-group__append {
padding: 0 5px;
/* 控件默认 0 20px;*/
}
::v-deep .el-icon-search:before {
color: #00F;
}
.query:last-child {
margin-right: 0;
}
</style>