Browse Source

page

master
pengjun 2 years ago
parent
commit
c25207fcfb
  1. 86
      package-lock.json
  2. 3
      package.json
  3. BIN
      public/files/单位体检人员名单导入模板.xlsx
  4. 839
      src/components/common/MedicalPackageAsbitem.vue
  5. 13
      src/router/index.js
  6. 4
      src/views/Home.vue
  7. 633
      src/views/common-settings/medicalPackage.vue
  8. 2
      src/views/customerOrg/customerOrgGroup.vue
  9. 350
      src/views/customerOrg/patientRegisterImport.vue
  10. 2
      src/views/doctorCheck/personnelBatch.vue

86
package-lock.json

@ -20,7 +20,8 @@
"vue-meta": "^2.4.0",
"vue-print-nb": "^1.7.5",
"vue-router": "^3.5.1",
"vuex": "^3.6.2"
"vuex": "^3.6.2",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@babel/core": "^7.12.16",
@ -3195,6 +3196,14 @@
"node": ">= 10.0.0"
}
},
"node_modules/adler-32": {
"version": "1.3.1",
"resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz",
"integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==",
"engines": {
"node": ">=0.8"
}
},
"node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
@ -3888,6 +3897,18 @@
"node": ">=4"
}
},
"node_modules/cfb": {
"version": "1.2.2",
"resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz",
"integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
"dependencies": {
"adler-32": "~1.3.0",
"crc-32": "~1.2.0"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/chainsaw": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz",
@ -4127,6 +4148,14 @@
"node": ">=6"
}
},
"node_modules/codepage": {
"version": "1.15.0",
"resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz",
"integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==",
"engines": {
"node": ">=0.8"
}
},
"node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz",
@ -6246,6 +6275,14 @@
"node": ">= 0.6"
}
},
"node_modules/frac": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz",
"integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==",
"engines": {
"node": ">=0.8"
}
},
"node_modules/fraction.js": {
"version": "4.2.0",
"resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.2.0.tgz",
@ -10092,6 +10129,17 @@
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
"dev": true
},
"node_modules/ssf": {
"version": "0.11.2",
"resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz",
"integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
"dependencies": {
"frac": "~1.1.2"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/ssri": {
"version": "8.0.1",
"resolved": "https://registry.npmmirror.com/ssri/-/ssri-8.0.1.tgz",
@ -11544,6 +11592,22 @@
"integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
"dev": true
},
"node_modules/wmf": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
"integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==",
"engines": {
"node": ">=0.8"
}
},
"node_modules/word": {
"version": "0.3.0",
"resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz",
"integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==",
"engines": {
"node": ">=0.8"
}
},
"node_modules/word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz",
@ -11623,6 +11687,26 @@
}
}
},
"node_modules/xlsx": {
"version": "0.18.5",
"resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz",
"integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==",
"dependencies": {
"adler-32": "~1.3.0",
"cfb": "~1.2.1",
"codepage": "~1.15.0",
"crc-32": "~1.2.1",
"ssf": "~0.11.2",
"wmf": "~1.0.1",
"word": "~0.3.0"
},
"bin": {
"xlsx": "bin/xlsx.njs"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/xmlchars": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",

3
package.json

@ -23,7 +23,8 @@
"vue-meta": "^2.4.0",
"vue-print-nb": "^1.7.5",
"vue-router": "^3.5.1",
"vuex": "^3.6.2"
"vuex": "^3.6.2",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@babel/core": "^7.12.16",

BIN
public/files/单位体检人员名单导入模板.xlsx

839
src/components/common/MedicalPackageAsbitem.vue

@ -0,0 +1,839 @@
<template>
<div style="display: flex;">
<div :style="'display: flex;width:' + (window.pageWidth - 45 - 110) + 'px;'">
<!--未选组合项目-->
<div style="display: block; width:230px;">
<div>
<span>项目类别</span>
<el-cascader :options="dict.itemTypeTree" v-model="itemTypeIds" style="margin-left: 3px;width:160px;"
:props="{ checkStrictly: true, expandTrigger: 'hover', ...customerOrg.treeprops, }" :show-all-levels="false"
clearable filterable @change="getAsbItemByItemType" size="small">
</el-cascader>
</div>
<div class="box">
<el-table :data="dict.asbItem" border size="small" highlight-current-row
:height="window.pageHeight < 635 ? 200:(window.pageHeight - 110 - 325)"
@row-dblclick="dbClickChoosedAsb" row-key="id"
@selection-change="handleSelectionChange" :row-class-name="handleRowClassName"
@row-click="chooseAsbItem">
<!--
<el-table-column type="selection" align="center" ></el-table-column>
-->
<el-table-column type="index" align="center" min-width="40"/>
<el-table-column
label="未选组合项目" min-width="170"
prop="displayName" align="center"
></el-table-column>
</el-table>
</div>
</div>
<!--中间操作按钮-->
<div style="display: block;margin: 40px 10px 0 10px;">
<div>
<el-button class="btnClass" @click="addAbs(asbItemChoosed,'choosed')" >添加 <i class="el-icon-arrow-right"></i></el-button>
</div>
<div>
<el-button class="btnClass" @click="addAbs(asbItemChoosed,'all')">全部添加</el-button>
</div>
<div>
<el-button class="btnClass"
@click="delAbs(patientRegisterAbsChoosed,'choosed')">移除 <i class="el-icon-arrow-left"></i
></el-button>
</div>
<div>
<el-button class="btnClass" @click="delAbs(patientRegisterAbsChoosed,'all')">全部移除</el-button>
</div>
</div>
<!--已选组合项目-->
<div :style="'display: block; width:' + (window.pageWidth - 230 - 120 - 45 - 110) + 'px;'">
<div style="height:32px;">
<span>快速选择</span>
<el-select v-model="asbItemId" placeholder="快速选择组合项目" size="small"
filterable default-first-option :filter-method="filterMethod"
clearable @clear="quickAsb = deepCopy(dict.asbItemQuick)"
@change="quickChoosedAsb" ref="quickAsbOCX"
style="margin-left: 3px;width:160px;">
<el-option v-for="item in quickAsb" :key="item.id" :value="item.id" :label="item.displayName" />
</el-select>
</div>
<div class="box">
<el-table :data="medicalPackageAsbitems" border size="small"
@selection-change="selecteditems" highlight-current-row
:height="window.pageHeight < 635 ? 200:(window.pageHeight - 110 - 325)"
:summary-method="getSummaries" show-summary
:row-class-name="handleRowClassName" @row-dblclick="removeAbs"
@row-click="removeAsbItem" ref="tablemedicalPackageAsbitems">
<!--
<el-table-column type="selection"></el-table-column>
-->
<el-table-column type="index" min-width="40" align="center"/>
<el-table-column
label="已选组合项目"
min-width="120"
prop="displayName"
></el-table-column>
<el-table-column label="标准价格" prop="price" min-width="60" align="center"/>
<el-table-column label="折扣" min-width="60" align="center">
<template slot-scope="scope">
<el-input
@input="changeDiscount(scope.$index)"
type="number" size="small"
v-model="scope.row.discount"
/>
</template>
</el-table-column>
<el-table-column label="应收价格" prop="customerOrgGroupDetailPrice" min-width="60" align="center">
<template slot-scope="scope">
<el-input
@input="changePrices(scope.$index)"
type="number" size="small"
v-model="scope.row.customerOrgGroupDetailPrice"
/>
</template>
</el-table-column>
<el-table-column label="数量" prop="customerOrgGroupDetailAmount" min-width="40" align="center">
<template slot-scope="scope">
<el-input
@input="changePrices(scope.$index)"
type="number" size="small"
v-model="scope.row.customerOrgGroupDetailAmount"
/>
</template>
</el-table-column>
<el-table-column label="标准金额" prop="asbitemMoney" min-width="60" align="center">
</el-table-column>
<el-table-column label="应收金额" prop="customerOrgGroupDetailMoney" min-width="60" align="center">
</el-table-column>
</el-table>
</div>
</div>
</div>
<!--批量操作按钮复制套餐与分组-->
<div style="display: block;margin-left: 10px;">
<div style="margin-top: 50px;">
<el-button class="btnClass" @click="btnCopyMedicalPackage">复制套餐</el-button>
</div>
<div>
<el-button class="btnClass" @click="btnSave">保存</el-button>
</div>
</div>
<!--复制套餐-->
<el-dialog title="体检套餐" :visible.sync="medicalPackageVisble" width="600px" height="400"
:show-close="false" :close-on-click-modal="false" :append-to-body="true">
<el-table :data="dict.medicalPackage" border height="350" row-key="id" size="small"
highlight-current-row @row-click="packageRowClick" @row-dblclick="rowDblclick" ref="patientList" >
<!-- "displayName": "健康体检套餐",
"price": 20.00,
"forSexId": "0",
"isActive": "Y",
"remark": "2",
"displayOrder": 1,
"simpleCode": "JKTJTC",
"creatorName": "admin",
"lastModifierName": "users",
"lastModificationTime": "2023-08-04T16:34:02.94408",
"lastModifierId": "3a0ca83b-3116-da05-3916-dfd4c0c548cb",
"creationTime": "2023-07-10T19:53:30.210553",
"creatorId": "3a0c4180-107c-0c89-b25b-0bd34666dcec",
"id": "3a0c51d3-2345-38df-ba0b-1862a3c3606f" -->
<el-table-column type="index" width="50" />
<el-table-column prop="displayName" label="套餐名称" width="180"/>
<el-table-column prop="price" label="价格" width="80"/>
<el-table-column prop="forSexId" label="适用性别" width="80">
<template slot-scope="scope">
<div>
{{ dddw(dict.forSex, "id", scope.row.forSexId, "displayName") }}
</div>
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" width="100"/>
<el-table-column prop="creatorName" label="创建人员" width="80"/>
<el-table-column prop="creationTime" label="创建日期" width="100">
<template slot-scope="scope">
<div v-if="scope.row.creationTime">
{{ moment(scope.row.creationTime).format("yyyy-MM-DD") }}
</div>
</template>
</el-table-column>
<el-table-column prop="lastModifierName" label="修改人员" width="80"/>
<el-table-column prop="lastModificationTime" label="修改日期" width="100">
<template slot-scope="scope">
<div v-if="scope.row.lastModificationTime">
{{ moment(scope.row.lastModificationTime).format("yyyy-MM-DD") }}
</div>
</template>
</el-table-column>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button @click="medicalPackageVisble = false" style="width:90px;">取消</el-button>
<el-button type="primary" @click="copyMedicalPackage" style="width:90px;">确定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import moment from 'moment';
import { mapState } from "vuex";
import { getapi, postapi, putapi } from "@/api/api";
import { arrayExistObj, tcdate, arrayFilter, arrayReduce, deepCopy,dddw } from "../../utlis/proFunc";
export default {
props:['formData','refreshMoney'],
data() {
return {
packagePrice:0, //
medicalPackageAsbitems:[], //
itemTypeIds:[], //
asbItemId:'', //ID
quickAsb:[], //
asbItemChoosed: [], //
startPoint:-1,
PstartPoint:-1,
medicalPackageVisble:false, //
curPackageId:'', //ID
packageAsbitems:[], //
selecteddata: [], //
unselecteddata: [], //
rightselctedata: [], //
options: [],
value: "",
dialogVisible: false,
copyGroupdialogVisible: false,
packagelist: [],
tabledata: [],
temporaryselection: [], //table
copegroupdata: [], //
addrulst: [], //Id
price: "", //
title: 1,
};
},
computed: {
...mapState(["window","dict","customerOrg"]),
},
created() {
this.dictInit()
},
updated () {
this.refreshTable('tablemedicalPackageAsbitems')
},
methods: {
moment,dddw,deepCopy,
//
refreshTable(tableRef){
this.$nextTick(() => {
this.$refs[tableRef].doLayout()
})
},
//
dictInit(){
//
getapi("/api/app/item-type/by-code-all").then((res) => {
if (res.code != -1) {
this.dict.itemTypeTree = res.data;
tcdate(this.dict.itemTypeTree);
}
});
//
getapi("/api/app/asbitem/in-filter?Filter").then((res) => {
if (res.code != -1) {
this.dict.asbItemAll = res.data.items;
this.dict.asbItemAll.forEach(e => {
e.choosed = false
})
this.dict.asbItem = deepCopy(this.dict.asbItemAll);
this.dict.asbItemQuick = deepCopy(res.data.items);
this.quickAsb = deepCopy(res.data.items);
}
});
//
getapi("/api/app/medical-package/in-filter").then((res) => {
if (res.code != -1) {
this.dict.medicalPackage = res.data.items;
}
});
},
handleRowClassName({ row, rowIndex }) {
// highLightBg 'selected'
//console.log(rowIndex, row)
//return row.highLightBg == 'selected' ? 'high-light-bg' : '';
if (row.choosed) {
return 'current-row';
} else {
return '';
}
},
//
getAsbItemByItemTypeAll() {
//console.log('getAsbItemByItemType', typeof this.itemTypeIds, this.itemTypeIds)
let lv = "";
if (typeof this.itemTypeIds === "object") {
lv = this.itemTypeIds[this.itemTypeIds.length - 1];
}
if (lv) {
this.dict.asbItem = arrayFilter(this.dict.asbItemAll, "itemTypeId", lv);
} else {
this.dict.asbItem = deepCopy(this.dict.asbItemAll);
}
//console.log('lv,this.dict.asbItem', lv, this.dict.asbItem)
this.dict.asbItemQuick = deepCopy(this.dict.asbItemAll);
},
//
getAsbItemByItemType() {
this.getAsbItemByItemTypeAll()
//
arrayReduce(this.dict.asbItem, [...this.medicalPackageAsbitems], "id=asbitemId");
arrayReduce(this.dict.asbItemQuick, [...this.medicalPackageAsbitems], "id=asbitemId");
},
//
filterMethod(keyWords) {
//console.log('filterMethod',this.dict.asbItemQuick)
if (keyWords) {
this.quickAsb = [];
this.dict.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.dict.asbItemQuick);
}
},
//
///api/app/register-asbitem/many/3fa85f64-5717-4562-b3fc-2c963f66afa6'
async addAbs(asbItemChoosed,oprType) {
// console.log('this.customerOrgGroup',this.customerOrgGroup)
// console.log('asbItemChoosed', asbItemChoosed)
if(!this.formData.id){
this.$message.warning("请先选中单位分组")
return
}
if(this.formData.isComplete && this.formData.isComplete.toUpperCase() == 'Y'){
this.$message.warning("体检次数已完成,不允许操作")
return
}
let message = []
let checked = true
let lfind = -1
//oprType
// start
if(oprType && oprType == 'all'){
asbItemChoosed = deepCopy(this.dict.asbItem)
}else if(oprType && oprType == 'choosed'){
asbItemChoosed = []
this.dict.asbItem.forEach(e =>{
if(e.choosed){
asbItemChoosed.push(e)
e.choosed = false
}
})
}
// end
if (asbItemChoosed.length < 1) {
this.$message.warning("请选择要添加的组合项目")
return
}
//
// "displayName": "",
// "shortName": "f",
// "forSexId": "F",
// "itemTypeId": "3a0b16de-75b9-c910-c61b-844709a88940",
// "price": 0,
// for (let i = 0; i < asbItemChoosed.length; i++) {
// if (this.formData.forSexId == 'A') break //
// if (asbItemChoosed[i].forSexId == 'A' || asbItemChoosed[i].forSexId == 'U') continue
// if (asbItemChoosed[i].forSexId != this.formData.sexId) {
// this.$message.warning(`${asbItemChoosed[i].displayName}`)
// checked = false
// break
// }
// }
// //console.log(222,checked)
// if (!checked) return
//
arrayReduce(asbItemChoosed, this.medicalPackageAsbitems, "id=asbitemId")
for (let i = asbItemChoosed.length - 1; i > - 1; i--) {
if (this.formData.forSexId == 'A') break //
if (asbItemChoosed[i].forSexId == 'A' || asbItemChoosed[i].forSexId == 'U') continue
if (asbItemChoosed[i].forSexId != this.formData.forSexId) {
message.push(asbItemChoosed[i].displayName) //.warning(`${asbItemChoosed[i].displayName}`)
checked = false
asbItemChoosed.splice(i,1)
}
}
//console.log(222,checked)
if (!checked) this.$message.warning(`所选项目【${JSON.stringify(message)}】不适合当前人员性别`)
for (let i = 0; i < asbItemChoosed.length; i++) {
let pojo = {
asbitemId: asbItemChoosed[i].id,
displayName:asbItemChoosed[i].displayName,
discount:100,
customerOrgGroupDetailAmount:1,
price:asbItemChoosed[i].price,
customerOrgGroupDetailPrice:asbItemChoosed[i].price,
customerOrgGroupDetailMoney: asbItemChoosed[i].price,
asbitemMoney: asbItemChoosed[i].price,
}
this.medicalPackageAsbitems.push(pojo)
//this.medicalPackageAsbitems.push({ ...pojo, asbitemName: asbItemChoosed[i].displayName })
lfind = arrayExistObj(this.dict.asbItem, 'id', asbItemChoosed[i].id)
if (lfind > -1) this.dict.asbItem.splice(lfind, 1)
lfind = arrayExistObj(this.dict.asbItemQuick, 'id', asbItemChoosed[i].id)
if (lfind > -1) this.dict.asbItemQuick.splice(lfind, 1)
}
},
//
dbClickChoosedAsb(row) {
this.addAbs([row]);
},
//
quickChoosedAsb(v) {
// value-key value console.log('quickChoosedAsb',v)
let lfind = -1
if (v) {
lfind = arrayExistObj(this.dict.asbItemQuick, 'id', v)
if (lfind > -1) {
this.addAbs([this.dict.asbItemQuick[lfind]])
}
}
this.$nextTick(() => {
this.$refs['quickAsbOCX'].blur(); //total asbItemId
this.asbItemId = ''
this.quickAsb = deepCopy(this.dict.asbItemQuick)
this.$refs['quickAsbOCX'].focus(); //total asbItemId
});
},
//
chooseAsbItem(row){
this.dict.asbItem.forEach((e,index) => {
e.index = index;
return e
});
// shift
if (this.window.shift) {
//
this.dict.asbItem.forEach(e => {
e.choosed = false;
return e
});
if (this.startPoint == - 1) {
this.dict.asbItem[row.index].choosed = true;
this.startPoint = row.index;
return
}
if (this.startPoint > row.index) {
for (let i = row.index; i <= this.startPoint; i++) {
this.dict.asbItem[i].choosed = true
}
} else if (this.startPoint <= row.index) {
for (let i = this.startPoint; i <= row.index; i++) {
this.dict.asbItem[i].choosed = true
}
}
return
}
// ctrl
if (this.window.ctrl) {
console.log('this.window.ctrl',this.window.ctrl,this.dict.asbItem)
this.dict.asbItem[row.index].choosed = true;
this.startPoint = row.index;
return
}
// ctrl shift
//
//console.log('')
this.dict.asbItem.forEach(e => {
e.choosed = false;
return e
});
this.dict.asbItem[row.index].choosed = true;
this.startPoint = row.index;
},
//
///api/app/register-asbitem/many?RegisterAsbitemIds=3fa85f64-5717-4562-b3fc-2c963f66afa6
delAbs(absForDel,oprType) {
if(!this.formData.id){
this.$message.warning("请先选中单位分组")
return
}
if(this.formData.isComplete && this.formData.isComplete.toUpperCase() == 'Y'){
this.$message.warning("体检次数已完成,不允许操作")
return
}
let lfind = -1
// start
if(oprType && oprType == 'all'){
absForDel = deepCopy(this.medicalPackageAsbitems)
}else if(oprType && oprType == 'choosed'){
absForDel = []
this.medicalPackageAsbitems.forEach(e =>{
if(e.choosed){
absForDel.push(deepCopy(e))
e.choosed = false
}
})
}
// end
if (absForDel.length < 1) {
this.$message.warning("请选择要移除的组合项目")
return
}
for (let i = 0; i < absForDel.length; i++) {
lfind = arrayExistObj(this.medicalPackageAsbitems, 'asbitemId', absForDel[i].asbitemId)
if (lfind > -1) this.medicalPackageAsbitems.splice(lfind, 1)
absForDel.splice(i, 1)
i--
continue
}
//
this.getAsbItemByItemType()
},
//
removeAbs(row) {
this.delAbs([row]);
},
//
removeAsbItem(row){
this.medicalPackageAsbitems.forEach((e,index) => {
e.index = index;
return e
});
// shift
if (this.window.shift) {
//
this.medicalPackageAsbitems.forEach(e => {
e.choosed = false;
return e
});
if (this.PstartPoint == - 1) {
this.medicalPackageAsbitems[row.index].choosed = true;
this.PstartPoint = row.index;
return
}
if (this.PstartPoint > row.index) {
for (let i = row.index; i <= this.PstartPoint; i++) {
this.medicalPackageAsbitems[i].choosed = true
}
} else if (this.PstartPoint <= row.index) {
for (let i = this.PstartPoint; i <= row.index; i++) {
this.medicalPackageAsbitems[i].choosed = true
}
}
return
}
// ctrl
if (this.window.ctrl) {
console.log('this.window.ctrl',this.window.ctrl,this.medicalPackageAsbitems)
this.medicalPackageAsbitems[row.index].choosed = true;
this.PstartPoint = row.index;
return
}
// ctrl shift
//
//console.log('')
this.medicalPackageAsbitems.forEach(e => {
e.choosed = false;
return e
});
this.medicalPackageAsbitems[row.index].choosed = true;
this.PstartPoint = row.index;
},
changeDiscount(index){
this.medicalPackageAsbitems[index].customerOrgGroupDetailPrice =
(this.medicalPackageAsbitems[index].discount * this.medicalPackageAsbitems[index].price/100).toFixed(2)
this.medicalPackageAsbitems[index].customerOrgGroupDetailMoney =
(this.medicalPackageAsbitems[index].customerOrgGroupDetailPrice * this.medicalPackageAsbitems[index].customerOrgGroupDetailAmount).toFixed(2)
//this.getSummaries()
},
//
changePrices(index){
this.medicalPackageAsbitems[index].customerOrgGroupDetailMoney =
(this.medicalPackageAsbitems[index].customerOrgGroupDetailPrice * this.medicalPackageAsbitems[index].customerOrgGroupDetailAmount).toFixed(2)
this.medicalPackageAsbitems[index].asbitemMoney =
(this.medicalPackageAsbitems[index].price * this.medicalPackageAsbitems[index].customerOrgGroupDetailAmount).toFixed(2)
this.medicalPackageAsbitems[index].discount = (this.medicalPackageAsbitems[index].customerOrgGroupDetailPrice * 100 / this.medicalPackageAsbitems[index].price).toFixed(2)
//this.getSummaries()
},
//
getSummaries(param) {
console.log('getSummaries param',param)
// if(!param){
// param = {
// columns:[{}, {}, {}, {}, {}, {}, {property: 'asbitemMoney'},{property: 'customerOrgGroupDetailMoney'}],
// data:this.medicalPackageAsbitems
// }
// }
const { columns, data } = param;
const sumCol = [6, 7] //
const sums = [];
columns.forEach((column, index) => {
//console.log('column, index,data',column, index,data)
//
if (index === 1) {
sums[index] = '合计';
return;
}
//
if (sumCol.indexOf(index) == -1) {
sums[index] = '';
return;
}
sums[index] = 0
data.forEach(e => {
if (!isNaN(e[column.property])) sums[index] += Number(e[column.property])// * e['amount']
})
sums[index] = sums[index].toFixed(2) //+ ' ';
});
this.packagePrice = sums[7];
// console.log('getSummaries',sums)
// if (!this.totalFoucs) this.total = sums[5];
// if (!this.discountFoucs) this.discount = Number(this.total * 100 / this.totalStand).toFixed(2);
return sums;
},
//
btnCopyMedicalPackage(){
if(!this.formData.id){
this.$message.warning("请先选中单位分组")
return
}
if(this.formData.isComplete && this.formData.isComplete.toUpperCase() == 'Y'){
this.$message.warning("体检次数已完成,不允许操作")
return
}
this.medicalPackageVisble = true
},
//
async packageRowClick(row){
this.curPackageId = row.id
this.packageAsbitems = []
try {
let res = await getapi(`/api/app/medical-package-detail/medical-package-in-asbitem?MedicalPackageId=${row.id}`)
this.packageAsbitems = res.data
} catch (error) {
console.log(error)
}
},
//
async rowDblclick(row){
await this.packageRowClick(row)
this.copyMedicalPackage()
},
//()
copyMedicalPackage(){
if(!this.curPackageId){
this.$message.warning("请先选择要复制的套餐!")
return
}
console.log('this.packageAsbitems',this.packageAsbitems)
this.addAbs(deepCopy(this.packageAsbitems))
this.medicalPackageVisble = false
},
//
btnSave() {
if(!this.formData.id){
this.$message.warning("请先选中单位分组")
return
}
if(this.formData.isComplete && this.formData.isComplete.toUpperCase() == 'Y'){
this.$message.warning("体检次数已完成,不允许操作")
return
}
let body = {
customerOrgGroupId:this.formData.id,
details:[]
}
// {
// "customerOrgGroupId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
// "details": [
// {
// "customerOrgGroupId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
// "asbitemId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
// "price": 0,
// "amount": 0
// }
// ]
// }
this.medicalPackageAsbitems.forEach(e =>{
body.details.push({
customerOrgGroupId:this.formData.id,
asbitemId:e.asbitemId,
price:e.customerOrgGroupDetailPrice,
amount:e.customerOrgGroupDetailAmount
})
})
let group = deepCopy(this.customerOrgGroup);
postapi('/api/app/customerorggroupdetail/createcustomerorggroupdetailmany',body
).then(res => {
if(res.code != -1){
delete group.id;
delete group.customerOrgId;
delete group.isComplete;
group.price = this.packagePrice
// console.log('this.customerOrgGroup',this.customerOrgGroup)
// console.log('group',group)
return putapi(`/api/app/customer-org-group/${this.formData.id}`, group)
}
}).then(res =>{
if(res.code != -1){
this.$message.success("操作成功");
group.id = this.formData.id
this.refreshMoney(group)
}
})
},
//
selecteditems(val) {
this.rightselctedata = val;
console.log(this.rightselctedata);
},
//
handleSelectionChange(val) {
// this.selecteddata = val;
this.unselecteddata = val;
console.log(this.unselecteddata);
},
//
getmedicalPackageAsbitems(customerOrgGroupId) {
if(customerOrgGroupId){
getapi(
`/api/app/customerorggroupdetail/getcustomerorggroupdetailinasbitem?CustomerOrgGroupId=${customerOrgGroupId}`
).then((res) => {
if(res.code != -1){
this.medicalPackageAsbitems = res.data;
this.getAsbItemByItemType()
}
});
}else{
this.medicalPackageAsbitems = []
this.getAsbItemByItemType()
}
},
},
//
watch: {
//
"formData.id"(newVal, oldVal) {
console.log("formData.id ",newVal,oldVal);
if (newVal != oldVal) {
this.getmedicalPackageAsbitems(newVal);
}
},
},
};
</script>
<style scoped>
.box {
margin-top: 5px;
border: 1px solid #000;
}
.btnClass {
width:100px;
margin-bottom: 5px
}
</style>

13
src/router/index.js

@ -193,6 +193,7 @@ const routes = [{
},
{
path: "/sample-group",
name:'条码分组',
component: () =>
import ("../views/common-settings/SampleGroup.vue"),
},
@ -240,12 +241,14 @@ const routes = [{
path: "/item-template",
component: () =>
import ("../views/fee-settings/ItemTemplate.vue"),
},
},
{
path: "/medical-package",
component: () =>
import ("../views/fee-settings/MedicalPackage.vue"),
path: "/medicalPackage", // medical-package
name:"套餐设置",
component: () =>
import ("../views/common-settings/medicalPackage.vue"), //../views/fee-settings/MedicalPackage.vue
},
{
path: "/sex-hormone-reference-range",
component: () =>
@ -290,7 +293,7 @@ const routes = [{
path: "/personnelBatch",
name: "人员批量登记",
component: () =>
import ("../views/doctorCheck/personnelBatch.vue"),
import ("../views/customerOrg/patientRegisterImport.vue"), //../views/doctorCheck/personnelBatch.vue
},
{
path: "/patientRegisterRecover",

4
src/views/Home.vue

@ -270,8 +270,8 @@
<el-dropdown-item command="item-template" class="dropdownmain"
>项目模板</el-dropdown-item
>
<el-dropdown-item command="medical-package" class="dropdownmain"
>套餐</el-dropdown-item
<el-dropdown-item command="medicalPackage" class="dropdownmain"
>套餐设置</el-dropdown-item
>
<el-dropdown-item command="sys-parm-type" class="dropdownmain"
>系统参数</el-dropdown-item

633
src/views/common-settings/medicalPackage.vue

@ -0,0 +1,633 @@
<template>
<div>
<el-card>
<div slot="header">套餐设置</div>
<!--套餐信息-->
<div style="display: flex;">
<div :style="'display: block;width:' + (window.pageWidth - 45 - 110) + 'px;'">
<div>
<el-table
:data="medicalPackages" ref="medicalPackages"
row-key="id"
border
height="240px"
size="small"
highlight-current-row :row-class-name="handleRowClassName"
@row-click="rowClick"
>
<el-table-column
type="index"
label="序号"
min-width="50"
align="center"
/>
<el-table-column prop="displayName" label="名称" min-width="150" />
<el-table-column
prop="price"
label="价格"
min-width="60"
align="center"
/>
<el-table-column
prop="forSexId"
label="适用性别"
min-width="60"
align="center"
>
<template slot-scope="scope">
{{ dddw(dict.forSex, "id", scope.row.forSexId, "displayName") }}
</template>
</el-table-column>
<!--
<el-table-column
prop="maritalStatusId"
label="适用婚姻状况"
min-width="80"
align="center"
>
<template slot-scope="scope">
{{
dddw(
dict.forMaritalStatus,
"id",
scope.row.maritalStatusId,
"displayName"
)
}}
</template>
</el-table-column>
-->
<el-table-column
prop="isActive"
label="启用"
min-width="60"
align="center"
>
<template slot-scope="scope">
{{ scope.row.isActive == 'Y' ? '是':'否' }}
</template>
</el-table-column>
<el-table-column
prop="creatorName"
label="创建者"
min-width="60"
align="center"
/>
<el-table-column label="创建时间" min-width="150" align="center">
<template slot-scope="scope">
{{
scope.row.creationTime
? moment(scope.row.creationTime).format("yyyy-MM-DD HH:mm:ss")
: ""
}}
</template>
</el-table-column>
<el-table-column label="操作" width="40">
<template>
<el-tag
class="move"
style="cursor: move;"
draggable="true"
>
<i class="el-icon-d-caret" style="font-size:14px;"></i>
</el-tag>
</template>
</el-table-column>
</el-table>
</div>
</div>
<!--按钮-->
<div style="display: block;margin-left: 10px;">
<div>
<el-button class="btnClass" @click="btnAdd">新增</el-button>
</div>
<div>
<el-button class="btnClass" @click="btnEdit" >编辑</el-button>
</div>
<div>
<el-button class="btnClass" @click="btnDel" >删除</el-button>
</div>
<div>
<el-button class="btnClass" @click="btnSetTop" >置顶</el-button>
</div>
<div>
<el-button class="btnClass" @click="btnSetBottom" >置低</el-button>
</div>
<div>
<el-button class="btnClass" @click="btnSort" :disabled="!isDrag" >保存排序</el-button>
</div>
</div>
</div>
<!--套餐项目信息-->
<div>
<MedicalPackageAsbitem :formData="form" :refreshMoney="refreshMoney"/>
</div>
</el-card>
<!-- 新增或者编辑弹框 -->
<el-dialog
:title="form.id ? '编辑' : '新增'"
:close-on-click-modal="false"
:visible.sync="dialogVisible"
width="800px"
>
<el-form :model="form" label-width="80px" :rules="rules" ref="form">
<el-row>
<el-col :span="8">
<el-form-item prop="displayName" label="套餐名称">
<el-input v-model="form.displayName" size="small" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="金额">
<el-input v-model="form.price" type="number" size="small" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="适用性别">
<el-select v-model="form.forSexId" placeholder="请选择" size="small" >
<el-option
v-for="item in dict.forSex"
:key="item.id"
:label="item.displayName"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
<!--
<el-col :span="8">
<el-form-item label="婚姻状况">
<el-select
v-model="form.maritalStatusId"
placeholder="请选择"
style="width: 100%" size="small" >
<el-option
v-for="item in dict.forMaritalStatus"
:key="item.id"
:label="item.displayName"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
-->
<el-col :span="8">
<el-form-item label="启用" prop="isActive">
<el-radio v-model="form.isActive" label="Y"></el-radio>
<el-radio v-model="form.isActive" label="N"></el-radio>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="备注">
<el-input v-model="form.remark" size="small" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="success" @click="computePrice">同比折算套餐项目价格</el-button>
<el-button type="primary" @click="onSubmit('form')">确定</el-button>
</span>
</el-dialog>
<!-- -->
</div>
</template>
<script>
import moment from "moment";
import Sortable from "sortablejs";
import { getapi, postapi, putapi, deletapi } from "@/api/api";
import { mapState } from "vuex";
import { dddw, deepCopy, objCopy, arrayExistObj } from "../../utlis/proFunc";
import MedicalPackageAsbitem from "../../components/common/MedicalPackageAsbitem.vue";
export default {
components: {
MedicalPackageAsbitem,
},
data() {
return {
medicalPackages: [{id:''}], //
medicalPackageId: "", //id
customerOrgRegisterList: [], //
customerOrgRegister: {}, //
isDrag: false,
form: {
//
medicalPackageId:'', //()
isComplete:'N', //
id: "",
displayName: "",
price: 0,
forSexId: "A",
maritalStatusId: "A",
isActive:'Y',
remark: "",
},
formInit: {},
rules: {
displayName: [
{ required: true, message: "请填写套餐名称", trigger: "blur" },
],
},
dialogVisible: false,
};
},
computed: {
...mapState(["personnelUnit", "window", "dict"]),
},
created() {
this.rowDrop();
this.formInit = deepCopy(this.form);
},
mounted() {
//
this.dictInit();
},
methods: {
moment,
dddw,deepCopy,
//
refreshMoney(formData){
//console.log('this is parent')
let lfind = arrayExistObj(this.medicalPackages,'id',formData.id)
if(lfind > -1) this.medicalPackages[lfind].price = formData.price
},
//
btnSort() {
const result = [];
this.medicalPackages.forEach((item, index) => {
result.push({ id: item.id, displayOrder: index });
});
putapi("/api/app/medicalpackage/updatesortmany", {
itemList: result,
}).then((res) => {
this.$message.success("操作成功");
this.isDrag = false;
});
},
//Sortable
rowDrop() {
this.$nextTick(() => {
const el = document.querySelector(".el-table__body-wrapper tbody");
//console.log('el0',el)
const that = this;
Sortable.create(el, {
handle: ".move",
animation: 300,
//
onEnd({ newIndex, oldIndex }) {
that.isDrag = true;
const currRow = that.medicalPackages.splice(oldIndex, 1)[0];
that.medicalPackages.splice(newIndex, 0, currRow);
console.log('el',el)
},
});
});
},
//
btnSetBottom() {
if (!this.form.id) {
this.$message.warning("请选择操作的数据");
return
}
let lfind = arrayExistObj(this.medicalPackages,'id',this.form.id)
let currentRow = {}
putapi(
`/api/app/medicalpackage/updatemanysort?id=${this.form.id}&SortType=2`
).then((res) => {
this.$message.success("操作成功");
currentRow = this.medicalPackages.splice(lfind,1)[0] //
this.medicalPackages.push(currentRow)
this.$refs['medicalPackages'].setCurrentRow(currentRow);
});
},
//
btnSetTop() {
if (!this.form.id) {
this.$message.warning("请选择操作的数据");
return
}
let lfind = arrayExistObj(this.medicalPackages,'id',this.form.id)
let currentRow = {}
putapi(
`/api/app/medicalpackage/updatemanysort?id=${this.form.id}&SortType=1`
).then((res) => {
this.$message.success("操作成功");
currentRow = this.medicalPackages.splice(lfind,1)[0]
this.medicalPackages.unshift(currentRow)
this.$refs['medicalPackages'].setCurrentRow(currentRow);
});
},
//
handleRowClassName({ row, rowIndex }) {
// highLightBg 'selected'
//console.log(rowIndex, row)
//return row.highLightBg == 'selected' ? 'high-light-bg' : '';
if (row.choosed) {
return 'current-row';
} else {
return '';
}
},
//
dictInit() {
//
getapi("/api/app/for-sex").then((res) => {
if (res.code != -1) {
this.dict.forSex = res.data;
}
});
this.getPackages()
},
getPackages(){
// /api/app/medical-package/in-filter?MaxResultCount=1000
getapi("/api/app/medical-package/in-filter?MaxResultCount=1000").then(res => {
if(res.code != -1){
this.medicalPackages = res.data.items
}
})
},
//
changeCustomerOrg(v) {
getapi(
`/api/app/customerorgregister/getlistinmedicalPackageId?medicalPackageId=${v}`
).then((res) => {
if (res.code != -1) {
this.customerOrgRegisterList = res.data;
if (res.data.length > 0) {
this.customerOrgRegister = res.data[res.data.length - 1];
this.getCustomerOrgGroup(this.customerOrgRegister.id);
} else {
this.customerOrgRegister = {};
this.medicalPackages = [];
this.isDrag = false
}
objCopy(this.formInit,this.form)
}
});
},
//
changeTimes(v) {
this.getCustomerOrgGroup(v.id);
},
//
rowClick(row) {
objCopy(row, this.form);
},
//
btnAdd() {
if (!this.customerOrgRegister.id) {
this.$message.warning("请选择体检次数");
return;
}
if(this.customerOrgRegister.isComplete.toUpperCase() == 'Y'){
this.$message.warning("该单位体检次数已完成,不允许新增套餐");
return;
}
if (this.customerOrgRegister.isComplete.toUpperCase() == "Y") {
this.$message.warning("该单位的该次体检次数已完成,不能再添加套餐!");
return;
}
this.form = deepCopy(this.formInit);
this.form.customerOrgRegisterId = this.customerOrgRegister.id;
this.form.medicalPackageId = this.medicalPackageId;
this.dialogVisible = true;
},
//
btnEdit() {
if (!this.form.id) {
this.$message.warning("请选择需要操作的数据");
return;
}
this.dialogVisible = true;
},
//
btnDel() {
if (!this.form.id) {
this.$message.warning("请选择需要操作的数据");
return;
}
if(this.customerOrgRegister.isComplete.toUpperCase() == 'Y'){
this.$message.warning("该单位体检次数已完成,不允许删除套餐");
return;
}
this.$confirm("此操作将永久删除该记录, 是否继续?", "提示", {
confirmButtonText: "是",
cancelButtonText: " 否 ",
type: "warning",
})
.then(() => {
return deletapi(`/api/app/customer-org-group/${this.form.id}`);
})
.then((res) => {
if (res.code != -1) {
this.$message.success("删除成功");
let lfind = arrayExistObj(
this.medicalPackages,
"id",
this.form.id
);
if (lfind > -1) this.medicalPackages.splice(lfind, 1);
objCopy(this.formInit,this.form)
this.isDrag = false
}
})
.catch((err) => {
if (err == "cancel") {
this.$message.info("已取消删除");
}
});
},
onSubmit(formName) {
this.$refs[formName].validate((valid, fields) => {
if (!valid) {
this.$message.warning(fields[Object.keys(fields)[0]][0].message);
return false;
}
if (!this.form.customerOrgRegisterId) {
this.$message.warning("请选择单位体检次数!");
return false;
}
let body = deepCopy(this.form);
delete body.id;
delete body.medicalPackageId;
delete body.isComplete;
if (this.form.id) {
//
putapi(`/api/app/customer-org-group/${this.form.id}`, body).then(
(res) => {
if (res.code != -1) {
this.$message.success("操作成功!");
let lfind = arrayExistObj(
this.medicalPackages,
"id",
this.form.id
);
if (lfind > -1)
objCopy(this.form, this.medicalPackages[lfind]);
this.dialogVisible = false;
}
}
);
} else {
//
postapi(
"/api/customerorggroup/createcustomerorggroupincustomerorgregister",
body
).then((res) => {
if (res.code != -1) {
this.$message.success("操作成功!");
this.form.id = res.data.id;
this.medicalPackages.push(deepCopy(res.data));
this.$refs['medicalPackages'].setCurrentRow(this.medicalPackages[this.medicalPackages.length - 1]);
this.dialogVisible = false;
}
});
}
});
},
computePrice(){
if(!this.form.id){
this.$message.warning("尚未保存信息,不可执行此操作!")
return
}
let customerOrgGroupId = this.form.id
let customerOrgGroupAsbitems = [] //
getapi(`/api/app/customerorggroupdetail/getcustomerorggroupdetailinasbitem?CustomerOrgGroupId=${customerOrgGroupId}
`).then(res => {
if(res.code != -1){
customerOrgGroupAsbitems = res.data;
if(customerOrgGroupAsbitems.length < 1){
this.$message.warning("当前套餐尚未设置组合项目,不可执行此操作!")
}else{
let body = {
customerOrgGroupId,
details:this.madeNewGroupAsbitems(customerOrgGroupAsbitems,this.form.price)
}
console.log('body',body)
return postapi('/api/app/customerorggroupdetail/createcustomerorggroupdetailmany',body)
}
}
}).then(res =>{
if(res.code != -1){
//this.$message.success("");
//
this.form.id = ''
//
setTimeout(() => {
this.form.id = customerOrgGroupId;
this.onSubmit('form')
}, 100)
}
})
},
madeNewGroupAsbitems(oldGroupAsbitems,newTotal){
newTotal = Number(newTotal).toFixed(2)
let newGroupAsbitems = []
let oldTotal = Number(0)
oldGroupAsbitems.forEach(e =>{
oldTotal += Number(e.asbitemMoney) //customerOrgGroupDetailMoney
})
oldTotal = Number(oldTotal).toFixed(2)
let discount = 0
if(oldTotal != 0) discount = (newTotal * 100 /oldTotal).toFixed(2)
oldTotal = Number(0)
oldGroupAsbitems.forEach(e =>{
e.customerOrgGroupDetailPrice = (e.price * discount/100).toFixed(2)
e.customerOrgGroupDetailMoney = (e.customerOrgGroupDetailPrice * e.customerOrgGroupDetailAmount).toFixed(2)
oldTotal += Number(e.customerOrgGroupDetailMoney)
})
oldTotal = Number(oldTotal).toFixed(2)
//console.log('discount,oldTotal',discount,oldTotal)
let didTotal = Number(newTotal - oldTotal).toFixed(2)
if(didTotal != 0){
for(let i = 0;i<oldGroupAsbitems.length;i++){
if(oldGroupAsbitems[i].customerOrgGroupDetailAmount == 1){
oldGroupAsbitems[i].customerOrgGroupDetailPrice = (Number(oldGroupAsbitems[i].customerOrgGroupDetailPrice) + Number(didTotal)).toFixed(2)
break
}
}
}
oldGroupAsbitems.forEach(e =>{
newGroupAsbitems.push({
customerOrgGroupId:e.customerOrgGroupId,
asbitemId:e.asbitemId,
price:e.customerOrgGroupDetailPrice,
amount:e.customerOrgGroupDetailAmount
})
})
return newGroupAsbitems
},
},
};
</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";
.btnClass {
width:100px;
margin-bottom: 5px
}
</style>

2
src/views/customerOrg/customerOrgGroup.vue

@ -382,7 +382,7 @@ export default {
).then((res) => {
this.$message.success("操作成功");
currentRow = this.customerOrgGroups.splice(lfind,1)[0] //
this.customerOrgGroups.unshift(currentRow)
this.customerOrgGroups.push(currentRow)
this.$refs['customerOrgGroups'].setCurrentRow(currentRow);
});

350
src/views/customerOrg/patientRegisterImport.vue

@ -1,26 +1,75 @@
<template>
<div>
<div>123</div>
<el-dialog title="选择文件" :visible.sync="dialogGroup[0]" width="400" height="800" :show-close="false"
<el-card>
<div slot="header">批量预登记</div>
<div style="display: flex;margin-bottom: 10px;">
<div>
<a :underline="false" href="/files/单位体检人员名单导入模板.xlsx"><el-button class="btnClass">下载导入模版</el-button></a>
</div>
<div>
<el-button class="btnClass" @click="seq = 0">导入</el-button>
</div>
</div>
<div>
<el-table :data="tableData" border
:height="window.pageHeight < 600 ? 405 : (window.pageHeight - 195)"
highlight-current-row size="small" >
<el-table-column type="index" label="序号" width="40" align="center"/>
</el-table>
</div>
</el-card>
<el-dialog title="请选择导入方式" :visible.sync="dialogGroup.mode" width="600px" :show-close="false"
:append-to-body="true" :close-on-click-modal="false">
<div style="height:300px;margin-left: 200px;">
<br/><el-radio v-model="mode" label="10">从Excle导入</el-radio>
<br/><br/>
<el-radio v-model="mode" label="20">从以往体检资料中导入</el-radio>
</div>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="btnNext">下一步</el-button>
<el-button type="primary" @click="btnFirst">下一步</el-button>
<el-button @click="seq = -1">关闭</el-button>
</span>
</el-dialog>
<el-dialog title="选择文件" :visible.sync="dialogGroup[1]" width="400" height="800" :show-close="false"
<el-dialog title="导入EXCEL注意事项" :visible.sync="dialogGroup.fileReadme" width="600px" :show-close="false"
:append-to-body="true" :close-on-click-modal="false">
<div style="height:300px;padding: 0 50px; ">
<br/>导入Excel时Excel的格式必须符合一定规范该格式的模板文件放在程序的执行目录下文件名为"单位体检人员名单导入模板.xls"
<br/>注意事项如下:
<br/>
<div style="margin-left: 28px;">1:姓名不能为空其余数据可根据实际情况选择是否填写
<br/>2:部门单位分组性别婚姻状况人员类别体检类别民族必须与本软件系统中的名称完全一致
<br/>3:年龄和出生日期可以只填一栏系统将自动对年龄和出生日期进行相互转换
<br/>4:Excel的实际列数不能超过20列
</div>
</div>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="btnPre">上一步</el-button>
<el-button type="primary" @click="btnNext">上一步</el-button>
<el-button type="primary" @click="seq--">上一步</el-button>
<el-button type="primary" @click="seq++">一步</el-button>
<el-button @click="seq = -1">关闭</el-button>
</span>
</el-dialog>
</el-dialog>
<el-dialog title="选择文件" :visible.sync="dialogGroup.fileChoose" width="600px" :show-close="false"
:append-to-body="true" :close-on-click-modal="false">
<div style="height:300px;padding: 0 50px; ">
<div><input type="file" accept=".xlsx,.xls" @change="changeFileChoose" /></div>
</div>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="seq--">上一步</el-button>
<el-button type="primary" @click="seq++">下一步</el-button>
<el-button @click="seq = -1">关闭</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { mapState, mapActions } from "vuex";
import ExcelJS from "exceljs";
import { read,readFile, utils } from "xlsx";
import { getapi, postapi, putapi, deletapi } from "@/api/api";
@ -30,10 +79,56 @@ export default {
},
data() {
return {
dialogGroup:[true,false,false],
dialogGroup:{
mode:true, // 10 20
fileReadme:false,
fileChoose:false,
fileDataChoose:false,
fileDataOption:false,
},
seq: 0, //
excelCol: [], //excel
mode: '10', // 10 20
excelCols: [{label:'',val:''}], //excel
excelData: [], //excel
dataCols:[
{label:'不设置',val:'noSet'},
{label:'工卡号',val:'noSet'},
{label:'部门',val:'noSet'},
{label:'姓名',val:'noSet'},
{label:'性别',val:'noSet'},
{label:'不设置',val:'noSet'},
{label:'工卡号',val:'noSet'},
{label:'部门',val:'noSet'},
{label:'姓名',val:'noSet'},
{label:'性别',val:'noSet'},
{label:'年龄',val:'noSet'},
{label:'出生日期',val:'noSet'},
{label:'婚姻状况',val:'noSet'},
{label:'民族',val:'noSet'},
{label:'身份证号',val:'noSet'},
{label:'电话',val:'noSet'},
{label:'手机',val:'noSet'},
{label:'电子邮件',val:'noSet'},
{label:'邮编',val:'noSet'},
{label:'地址',val:'noSet'},
{label:'人员类别',val:'noSet'},
{label:'体检类别',val:'noSet'},
{label:'支付方式',val:'noSet'},
],
tableData:[],
workBook:null, //EXCEL
sheetNames:[], //EXCEL
readDataOpts:{
sheetNameChoosed:'', //
titleRow:1, //
dataRow:2, //
}
};
},
@ -52,11 +147,10 @@ export default {
},
methods: {
//
btnPre() {
if(this.seq == 0) return;
this.seq--;
this.setDialogDisp();
//
btnFirst() {
this.seq = parseInt(this.mode)
},
//
@ -66,6 +160,61 @@ export default {
this.setDialogDisp();
},
btnImport(seq){
let keys = Object.keys(this.dialogGroup)
if(seq == 9){
this.workBook = null
this.sheetNameChoosed = ''
seq =0
}
if(seq == 19) seq =0
// console.log('keys',keys)
switch (seq) {
case -1:
//
keys.forEach(e =>{
this.dialogGroup[e] = false
})
break;
case 0:
//
keys.forEach(e =>{
if(e == 'mode'){
this.dialogGroup[e] = true
}else{
this.dialogGroup[e] = false
}
})
break;
case 10:
//
keys.forEach(e =>{
if(e == 'fileReadme'){
this.dialogGroup[e] = true
}else{
this.dialogGroup[e] = false
}
})
break;
case 11:
//
keys.forEach(e =>{
if(e == 'fileChoose'){
this.dialogGroup[e] = true
}else{
this.dialogGroup[e] = false
}
})
break;
default:
break;
}
},
//
setDialogDisp(){
this.dialogGroup.forEach((item,index) =>{
@ -78,71 +227,182 @@ export default {
});
},
onFileChange(event) {
//
const file = event.target.files[0];
changeFileChoose(e) {
//
let file = e.target.files[0];
// Excel
this.importExcelFile(file);
console.log('file',file,file.type)
this.readFile(file);
},
//sheetjs
readFile(file){
const reader = new FileReader();
reader.readAsBinaryString(file);
// reader.readAsArrayBuffer(file);
reader.onload = (e) => {
let data = e.target.result;
// let typedArray = new Uint8Array(data);
// var workBook = read(typedArray,{type:'array'})
this.workBook = read(data,{type:'binary',cellDates:true})
// var workBook = readFile(file); //
this.sheetNames = []
this.workBook.SheetNames.forEach(e =>{
this.sheetNames.push({sheetName:e})
})
this.sheetNames = this.workBook.SheetNames
console.log('workBook',workBook)
var sheet_name_list = workBook.SheetNames;
sheet_name_list.forEach(function(e,index) {
var worksheet = workBook.Sheets[e];
console.log(e,index,worksheet)
let jsonData = utils.sheet_to_json(worksheet,{header:1}) //raw:false,range:1
console.log('jsonData',jsonData)
utils.sheet_to_formulae()
/* DO SOMETHING WITH worksheet HERE */
});
}
},
//
readData(){
if(!this.workBook || !this.readDataOpts.sheetNameChoosed){
this.$message.warning("请选择文件及要导入的表格")
return
}
if(this.readDataOpts.titleRow <= 0){
this.$message.warning("标题行不能小于1")
return
}
if(this.readDataOpts.dataRowRow <= 0){
this.$message.warning("数据行不能小于2")
return
}
let worksheet = this.workBook.Sheets[this.readDataOpts.sheetNameChoosed];
let temp
// = utils.sheet_to_json(worksheet,{header:1}) //raw:false,range:1
},
//ExcelFile
importExcelFile(file) {
this.filepopupdialogVisible = true;
console.log("333");
// 簿
const workbook = new ExcelJS.Workbook();
console.log('workbook',workbook)
// Excel
const reader = new FileReader();
console.log(reader);
reader.onload = () => {
const buffer = reader.result;
const typedArray = new Uint8Array(buffer);
//application/vnd.ms-excel
const blob = new Blob([typedArray], {
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
//type xlsx:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, xls:application/vnd.ms-excel
type: file.type,
});
// BlobExcel
workbook.xlsx.load(blob).then((workbook) => {
workbook.xlsx.load(blob).then((wb) => {
console.log('wb',wb);
//
const worksheet = workbook.getWorksheet(1);
const worksheet = wb.getWorksheet(1);
console.log('worksheet',worksheet);
// Excel
worksheet.eachRow((row, rowNumber) => {
// const rowData = row.values;
// this.rowData = row.values;
// console.log(this.rowData,'rowdata');
// console.log(rowData);
//console.log('row,rowNumber',row,rowNumber);
this.importData.push(row.values);
console.log(row.values);
this.excelData.push(row.values);
// console.log(`${rowNumber}${rowData}`);
// console.log(`${row.rowNumber}${row.rowData}`);
});
});
};
reader.readAsArrayBuffer(file);
},
parseImportData(importData) {
console.log("importData", importData.length, importData);
importData.forEach((item) => {
item.forEach((item2) => {
// this.$set(item2[0], "name", true);
item2[0]['names'] = true
console.log(item2);
// console.log(item2);
});
// console.log(item,'item',item.length);
//
parseexcelData(startRow) {
if (!this.excelData || this.excelData.length == 0) return;
let cols = [];
let record = {};
this.excelData.forEach((item, index) => {
console.log(index, item);
if (index == startRow - 2) {
item.forEach((e, i) => {
console.log("e", i, e);
if (i > 0) {
if (e) {
this.tableDataCol.push({ excelCol: e, apiCol: "", label: e });
cols.push(e);
} else {
this.tableDataCol.push({
excelCol: `${Number(i) + 1}`,
apiCol: "",
lebel: `${Number(i) + 1}`,
});
cols.push(`${Number(i) + 1}`);
}
}
});
} else if (index > startRow - 2) {
for (let i = 0; i < item.length; i++) {
if (i > 0) {
console.log("cols[i]", i, cols[i - 1]);
if (item[i]) {
record[cols[i - 1]] = item[i];
} else {
record[cols[i - 1]] = null;
}
}
}
this.tableData.push({ ...record });
}
});
// console.log("tableDataCol", this.tableDataCol);
// console.log("tableData", this.tableData);
},
},
watch: {
"seq":{
immediate: true, //
// deep: true, //
handler(newVal,oldVal){
console.log('watch:seq:',newVal,oldVal)
if(newVal != oldVal){
this.btnImport(newVal);
}
}
},
},
};
</script>
<style scoped>
.box {
display: flex;
@import '../../assets/css/global_button.css';
@import '../../assets/css/global_card.css';
@import '../../assets/css/global_dialog.css';
@import '../../assets/css/global_form.css';
@import '../../assets/css/global_input.css';
@import '../../assets/css/global_table.css';
@import '../../assets/css/global.css';
.btnClass{
margin-right: 10px;
}
</style>

2
src/views/doctorCheck/personnelBatch.vue

@ -470,6 +470,7 @@ export default {
handleCurrentChange(val) {
this.currentRow = val;
},
onFileChange(event) {
//
const file = event.target.files[0];
@ -477,6 +478,7 @@ export default {
this.importExcelFile(file);
this.parseImportData();
},
importExcelFile(file) {
this.filepopupdialogVisible = true;
console.log("333");

Loading…
Cancel
Save