123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573 |
- <template>
- <div class="execution">
- <basic-container>
- <avue-crud
- ref="crud"
- :page="page"
- v-model="form"
- :data="tableData"
- :permission="permissionList"
- :table-loading="tableLoading"
- :option="tableOption"
- @on-load="getList"
- @search-change="searchChange"
- @refresh-change="refreshChange"
- @size-change="sizeChange"
- @current-change="currentChange"
- @row-del="rowDel"
- >
- <template slot="menuLeft">
- <el-button v-if="permissionList.addBtn" type="primary" @click="addFn" :loading="infoExportAllLoading">新增<i class="el-icon-plus el-icon--right"></i></el-button>
- <!-- <el-button type="primary" @click="exportTaskInfoAll()" :loading="infoExportAllLoading">批量转换经纬度<i class="el-icon-download el-icon--right"></i></el-button> -->
- <el-button v-if="permissionList.addBtn" class="filter-item" type="primary" size="small" icon="el-icon-upload" @click="importUserOpen">批量导入 </el-button>
- </template>
- <template slot="menu" slot-scope="scope">
- <el-button v-if="permissionList.editBtn" type="text" size="small" icon="el-icon-edit" @click="editFn(scope.row, scope.index)">编辑 </el-button>
- </template>
- </avue-crud>
- </basic-container>
- <!-- 新增/编辑 -->
- <el-dialog v-if="showAddDialog" :visible.sync="showAddDialog" :before-close="closeFn" :title="dialogType === 'add' ? '新增' : '编辑'">
- <el-form ref="formRef" :model="form" :rules="formRules" label-width="120px">
- <el-form-item label="医院名称:" prop="yymc">
- <el-input v-model="form.yymc" placeholder="请输入医院名称" />
- </el-form-item>
- <el-form-item label="医院城市:" prop="city">
- <span class="cityColor" @click="toAddress">{{ city }}</span>
- </el-form-item>
- <el-form-item label="地址:" prop="address">
- <div class="map" style="overflow: hidden">
- <el-input v-model="addressKeyword" placeholder="请输入地址来直接查找相关位置" clearable style="margin-bottom: 20px">
- <el-button slot="append" icon="el-icon-search" @click="getAddressKeyword"></el-button>
- </el-input>
- <div id="container" style="width: 100%; height: 300px"></div>
- </div>
- </el-form-item>
- <el-row>
- <el-col :span="12">
- <el-form-item label="纬度:" prop="latitude">
- <el-input v-model="form.latitude" placeholder="请输入纬度" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="经度:" prop="longitude">
- <el-input v-model="form.longitude" placeholder="请输入经度" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="12">
- <el-form-item label="医院规模:" prop="yygm">
- <el-select style="width: 100%" v-model="form.yygm" placeholder="请选择医院规模">
- <el-option v-for="item in yygmOptions" :key="item.value" :label="item.label" :value="item.value"> </el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="医院性质:" prop="yyxz">
- <el-select style="width: 100%" v-model="form.yyxz" placeholder="请选择医院性质">
- <el-option v-for="item in yyxzOptions" :key="item.value" :label="item.label" :value="item.value"> </el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="12">
- <el-form-item label="医院官网:" prop="website">
- <el-input v-model="form.website" placeholder="请输入医院官网" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="院病床总数(张):" prop="ybczs">
- <el-select style="width: 100%" v-model="form.ybczs" placeholder="请选择院病床总数(张)">
- <el-option v-for="item in ybczsOptions" :key="item.value" :label="item.label" :value="item.value"> </el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <div slot="footer" class="dialog-footer">
- <el-button type="primary" size="small" @click="saveFn">保 存</el-button>
- <el-button type="default" size="small" @click="closeFn">取 消</el-button>
- </div>
- </el-dialog>
- <el-dialog :visible.sync="addInp" :close-on-click-modal="true" title="请选择区域">
- <v-distpicker type="mobile" @selected="selected" v-show="addInp"> </v-distpicker>
- <div slot="footer" class="dialog-footer">
- <el-button type="default" size="small" @click="addInp === false">取消</el-button>
- </div>
- </el-dialog>
- <!-- 批量导入 -->
- <el-dialog title="批量导入医院" :visible.sync="importUserShow" width="400px" :before-close="importUserClose">
- <div class="tc" v-loading="importLoading">
- <el-upload
- class="upload-demo"
- :action="uploadUrl"
- :headers="headers"
- :before-upload="importUserBefore"
- :on-preview="handleUserPreview"
- :on-remove="handleUserRemove"
- :before-remove="beforeUserRemove"
- :limit="1"
- :on-exceed="handleUserExceed"
- :on-success="handleUserSuccess"
- :on-error="handleUserError"
- accept=".xls,.xlsx"
- :file-list="userFileList"
- :show-file-list="false"
- >
- <el-button size="small" type="primary">批量导入(*.xlsx,*.xls)</el-button>
- </el-upload>
- <br />
- <el-button type="text" @click="handleDown">下载模板</el-button>
- </div>
- </el-dialog>
- <el-dialog title="上传失败!" width="600px" :close-on-click-modal="false" @close="importErrorDialogClose" :visible.sync="importErrorDialogShow" center>
- <avue-crud style="width: 100%" :data="importErrorTableData" :option="option1"> </avue-crud>
- </el-dialog>
- </div>
- </template>
- <script>
- import { fetchList, getObj, addObj, putObj, delObj, parseAddress } from '@/api/wmdahospital';
- import { tableOption } from '@/const/crud/wmdahospital';
- import { mapGetters } from 'vuex';
- import VDistpicker from 'v-distpicker';
- import maps from 'qqmap';
- import { getDictType } from '@/api/common';
- import { importErrorTableOption } from '@/const/crud/admin/user';
- import { templateDownload } from '@/api/assignPoints/currency/manList';
- import store from '@/store';
- export default {
- name: 'wmdahospital',
- data() {
- return {
- map: null,
- markerLayer: null, // 标记
- geocoder: null, // 正逆地址解析类
- getAddress: null,
- getAddCode: null,
- addressKeyword: '', // 地址
- infoExportAllLoading: false,
- shopInfo: {
- lng: null,
- lat: null
- },
- city: '请选择区域',
- addInp: false,
- mask: false,
- form: {
- yymc: '',
- address: '',
- latitude: '',
- longitude: '',
- yygm: '',
- yyxz: '',
- website: '',
- ybczs: ''
- },
- searchForm: {},
- tableData: [],
- page: {
- total: 0, // 总页数
- currentPage: 1, // 当前页数
- pageSize: 20 // 每页显示多少条
- },
- tableLoading: false,
- tableOption: tableOption,
- showAddDialog: false,
- dialogType: 'add',
- formRules: {
- yymc: [{ required: true, message: '请输入医院名称', trigger: 'blur' }],
- latitude: [{ required: true, message: '请输入纬度', trigger: 'blur' }],
- longitude: [{ required: true, message: '请输入经度', trigger: 'blur' }],
- yygm: [{ required: true, message: '请选择医院规模', trigger: 'blur' }],
- yyxz: [{ required: true, message: '请选择医院性质', trigger: 'blur' }]
- },
- yygmOptions: [],
- yyxzOptions: [],
- ybczsOptions: [],
- headers: {
- Authorization: 'Bearer ' + store.getters.access_token
- },
- importUserShow: false,
- importLoading: false,
- userFileList: [],
- importErrorDialogShow: false,
- uploadUrl: '',
- importErrorTableData: [],
- option1: importErrorTableOption
- };
- },
- computed: {
- ...mapGetters(['permissions', 'userInfo']),
- permissionList() {
- return {
- addBtn: this.vaildData(this.permissions.admin_wmdahospital_add, false),
- delBtn: this.userInfo.roles.includes(2),
- editBtn: this.vaildData(this.permissions.admin_wmdahospital_edit, false)
- };
- }
- },
- components: {
- VDistpicker
- },
- mounted() {
- this.loadMapScript();
- },
- destroyed() {
- if (this.map) {
- this.map.destroy();
- this.map = null;
- }
- },
- methods: {
- getDict() {
- getDictType({ type: 'hospital_level' }).then((res) => {
- this.yygmOptions = res.data.data;
- });
- getDictType({ type: 'hospital_xz' }).then((res) => {
- this.yyxzOptions = res.data.data;
- });
- getDictType({ type: 'hospital_cw' }).then((res) => {
- this.ybczsOptions = res.data.data;
- });
- },
- addFn() {
- this.getDict();
- this.addressKeyword = '';
- this.city = '请选择区域';
- this.dialogType = 'add';
- this.showAddDialog = true;
- this.$nextTick(() => {
- this.init();
- });
- },
- editFn(row, index) {
- this.getDict();
- this.addressKeyword = row.address || '';
- this.city = (row.province || '') + ' ' + (row.city || '') + ' ' + (row.area || '');
- this.form = Object.assign({}, row);
- this.dialogType = 'edit';
- this.showAddDialog = true;
- this.$nextTick(() => {
- this.init();
- });
- },
- saveFn() {
- this.form.address = this.addressKeyword;
- if (!this.addressKeyword) {
- this.$message.error('地址不能为空');
- return;
- }
- if (!this.city) {
- this.$message.error('区域不能为空');
- return;
- }
- if (this.dialogType === 'add') {
- addObj(this.form)
- .then((res) => {
- this.$message.success('添加成功');
- this.showAddDialog = false;
- this.form = {
- yymc: '',
- address: '',
- latitude: '',
- longitude: '',
- yygm: '',
- yyxz: '',
- website: '',
- ybczs: ''
- };
- this.getList(this.page);
- })
- .catch(() => {});
- } else {
- putObj(this.form)
- .then((res) => {
- this.$message.success('修改成功');
- this.showAddDialog = false;
- this.form = {
- yymc: '',
- address: '',
- latitude: '',
- longitude: '',
- yygm: '',
- yyxz: '',
- website: '',
- ybczs: ''
- };
- this.getList(this.page);
- })
- .catch(() => {});
- }
- },
- closeFn() {
- this.map.off('click', this.clickHandler);
- this.map = null;
- this.markerLayer = null; // 标记
- this.geocoder = null; // 正逆地址解析类
- this.showAddDialog = false;
- this.form = {
- yymc: '',
- address: '',
- latitude: '',
- longitude: '',
- yygm: '',
- yyxz: '',
- website: '',
- ybczs: ''
- };
- },
- // https://lbs.qq.com/webApi/javascriptGL/glGuide/glBasic
- loadMapScript() {
- var script = document.createElement('script');
- script.type = 'text/javascript';
- script.src = 'https://map.qq.com/api/gljs?v=1.exp&libraries=service&key=C4ABZ-HWE3X-5DW4J-ZO4GH-IQBWK-TXF2X';
- document.body.appendChild(script);
- },
- init() {
- //定义地图中心点坐标
- var center = new TMap.LatLng(22.547931568083015, 114.1306221485138);
- //定义map变量,调用 TMap.Map() 构造函数创建地图
- this.map = new TMap.Map(document.getElementById('container'), {
- center: center, //设置地图中心点坐标
- zoom: 16, //设置地图缩放级别
- viewMode: '2D' // 可选 2D 3D
- });
- // 新建一个正逆地址解析类
- this.geocoder = new TMap.service.Geocoder();
- //初始化marker图层
- this.markerLayer = new TMap.MultiMarker({
- id: 'marker-layer',
- map: this.map
- });
- this.map.on('click', this.clickHandler);
- this.getAddressKeyword();
- },
- clickHandler(event) {
- // 获取点击后的地图坐标
- this.shopInfo.lng = event.latLng.getLng();
- this.shopInfo.lat = event.latLng.getLat();
- this.getAddressCode();
- this.removeMarker();
- this.markerLayer.add({
- position: event.latLng
- });
- },
- //移除marker事件
- removeMarker() {
- const markList = this.markerLayer.getGeometries();
- if (this.markerLayer && markList.length > 0) {
- this.markerLayer.remove(markList[0].id);
- }
- },
- getAddressKeyword() {
- const convert = () => {
- // 将给定的地址转换为坐标位置
- const cityText = this.city === '请选择区域' ? '' : this.city.replace(/\s*/g, '') || '';
- const address = cityText + this.addressKeyword;
- this.geocoder.getLocation({ address }).then((result) => {
- this.removeMarker();
- this.$nextTick(() => {
- this.markerLayer.updateGeometries([
- {
- position: result.result.location // 将得到的坐标位置用点标记标注在地图上
- }
- ]);
- });
- this.map.setCenter(result.result.location);
- this.form.longitude = result.result.location.lng;
- this.form.latitude = result.result.location.lat;
- });
- };
- if (this.addressKeyword) {
- convert();
- }
- },
- // 通过坐标获得地址
- getAddressCode() {
- var lat = parseFloat(this.shopInfo.lat);
- var lng = parseFloat(this.shopInfo.lng);
- var location = new TMap.LatLng(lat, lng);
- this.geocoder
- .getAddress({ location: location }) // 将给定的坐标位置转换为地址
- .then((result) => {
- this.addressKeyword = result.result.address || '';
- });
- this.form.longitude = lng;
- this.form.latitude = lat;
- },
- toAddress() {
- this.mask = true;
- this.addInp = true;
- },
- // 省市区三级联动
- selected(data) {
- this.mask = false;
- this.addInp = false;
- this.city = data.province.value + ' ' + data.city.value + ' ' + data.area.value;
- this.form.province = data.province.value;
- this.form.city = data.city.value;
- this.form.area = data.area.value;
- //this.city = data.area.value
- this.addressKeyword = data.province.value + data.city.value + data.area.value;
- this.getAddressKeyword();
- },
- getList(page, params) {
- this.tableLoading = true;
- fetchList(
- Object.assign(
- {
- current: page.currentPage,
- size: page.pageSize
- },
- params,
- this.searchForm
- )
- )
- .then((response) => {
- this.tableData = response.data.data.records;
- this.page.total = response.data.data.total;
- this.tableLoading = false;
- })
- .catch(() => {
- this.tableLoading = false;
- });
- },
- rowDel: function (row, index) {
- this.$confirm('是否确认删除ID为' + row.id, '提示', {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning'
- })
- .then(function () {
- return delObj(row.id);
- })
- .then((data) => {
- this.$message.success('删除成功');
- this.getList(this.page);
- });
- },
- sizeChange(pageSize) {
- this.page.pageSize = pageSize;
- },
- currentChange(current) {
- this.page.currentPage = current;
- },
- searchChange(form, done) {
- this.searchForm = form;
- this.page.currentPage = 1;
- this.getList(this.page, form);
- done();
- },
- refreshChange() {
- this.getList(this.page);
- },
- exportTaskInfoAll() {
- this.infoExportAllLoading = true;
- parseAddress()
- .then((data) => {
- this.$message.success('地址转换成功');
- this.infoExportAllLoading = false;
- })
- .catch(() => {
- loading();
- });
- },
- // 以下为批量导入功能
- importUserClose() {
- this.importUserShow = false;
- this.userFileList = [];
- },
- importUserBefore() {
- this.importLoading = true;
- },
- beforeUserRemove(file, fileList) {
- return this.$confirm(`确定移除 ${file.name}?`);
- },
- handleUserRemove(file, fileList) {
- console.log(file, fileList);
- },
- handleUserPreview(file) {
- console.log(file);
- },
- handleUserExceed(files, fileList) {
- this.$message.warning('最多上传一个文件');
- },
- handleUserSuccess(res, file) {
- this.importLoading = false;
- if (res.code === 1) {
- this.userFileList = [];
- if (res.data && res.data.code === 'FAILURE') {
- // 上传有错误
- this.importErrorTableData = [];
- const errorData = res.data.data;
- if (Object.keys(errorData).length > 0) {
- Object.keys(errorData).forEach((ele) => {
- this.importErrorTableData.push({ reason: ele, index: errorData[ele] });
- });
- }
- console.log(this.importErrorTableData);
- this.importErrorDialogShow = true;
- } else {
- // 上传失败
- this.$message.error(res.msg);
- }
- } else {
- this.$message.success('上传成功!');
- this.importUserClose();
- this.getList(this.page);
- }
- },
- handleUserError(err) {
- this.$message.error('上传失败!');
- this.importLoading = false;
- },
- handleDown() {
- this.importLoading = true;
- templateDownload({
- fileName: 'batch_create_hospital_template.xlsx'
- })
- .then((response) => {
- this.importLoading = false;
- let url = window.URL.createObjectURL(new Blob([response.data]));
- let link = document.createElement('a');
- link.style.display = 'none';
- link.href = url;
- link.setAttribute('download', '批量导入医院模板.xlsx');
- document.body.appendChild(link);
- link.click();
- document.body.removeChild(link);
- })
- .catch(() => {
- this.importLoading = false;
- });
- },
- importErrorDialogClose() {
- this.importErrorDialogShow = false;
- },
- // 导入用户
- importUserOpen() {
- this.uploadUrl = 'admin/wmdahospital/batch';
- this.importUserShow = true;
- }
- }
- };
- </script>
- <style lang="less">
- .distpicker-address-wrapper {
- color: #000000 !important;
- }
- .distpicker-address-wrapper .address-header ul li.active {
- color: #000000 !important;
- }
- .cityColor {
- color: #2d8cf0;
- }
- </style>
|