| @@ -1,6 +1,24 @@ | |||||
| <template> | <template> | ||||
| <div> | <div> | ||||
| <div> | |||||
| <v-dialog | |||||
| v-model="progress" | |||||
| persistent | |||||
| width="300" | |||||
| > | |||||
| <v-card | |||||
| color="primary" | |||||
| dark | |||||
| > | |||||
| <v-card-text> | |||||
| 查詢中... | |||||
| <v-progress-linear | |||||
| indeterminate | |||||
| color="white" | |||||
| class="mb-0" | |||||
| ></v-progress-linear> | |||||
| </v-card-text> | |||||
| </v-card> | |||||
| </v-dialog> | |||||
| <v-tabs | <v-tabs | ||||
| v-model='currentTab' | v-model='currentTab' | ||||
| centered | centered | ||||
| @@ -469,7 +487,6 @@ | |||||
| </v-card> | </v-card> | ||||
| </v-dialog> | </v-dialog> | ||||
| </v-tabs> | </v-tabs> | ||||
| </div> | |||||
| </div> | </div> | ||||
| </template> | </template> | ||||
| <script> | <script> | ||||
| @@ -486,6 +503,7 @@ | |||||
| dialogInsert: false, | dialogInsert: false, | ||||
| dialogModify: false, | dialogModify: false, | ||||
| dialogNewAssertGroup: false, | dialogNewAssertGroup: false, | ||||
| progress: false, | |||||
| // dialogSearch: false, | // dialogSearch: false, | ||||
| title: '資訊資產群組', | title: '資訊資產群組', | ||||
| headers: [ | headers: [ | ||||
| @@ -555,6 +573,7 @@ | |||||
| }, | }, | ||||
| async mounted() { | async mounted() { | ||||
| // this.getSelectItem(); | // this.getSelectItem(); | ||||
| this.progress = true; | |||||
| this.getTabs(); | this.getTabs(); | ||||
| this.getTypes(); | this.getTypes(); | ||||
| this.inventoryItems = []; | this.inventoryItems = []; | ||||
| @@ -569,6 +588,7 @@ | |||||
| computed: {}, | computed: {}, | ||||
| watch: { | watch: { | ||||
| currentTab() { | currentTab() { | ||||
| this.progress = true; | |||||
| this.getTypes(); | this.getTypes(); | ||||
| this.getCols(); | this.getCols(); | ||||
| }, | }, | ||||
| @@ -665,6 +685,7 @@ | |||||
| const tablename = this.assertGroup[this.currentTab] ? this.assertGroup[this.currentTab].value : 'hardware'; | const tablename = this.assertGroup[this.currentTab] ? this.assertGroup[this.currentTab].value : 'hardware'; | ||||
| this.$axios.get(`/assert/allCols?tablename=${tablename}`).then((resp) => { | this.$axios.get(`/assert/allCols?tablename=${tablename}`).then((resp) => { | ||||
| this.allCols = resp.data.data; | this.allCols = resp.data.data; | ||||
| this.progress = false; | |||||
| }); | }); | ||||
| }, | }, | ||||
| insertCol() { | insertCol() { | ||||
| @@ -741,16 +762,6 @@ | |||||
| }); | }); | ||||
| } | } | ||||
| }, | }, | ||||
| exportFile() { | |||||
| let yes = confirm('確定匯出'); | |||||
| if (yes) { | |||||
| // this.$axios.delete(`/deleteOne?tablename=${this.tablename}&&id=${item.id}`).then(() => { | |||||
| // this.getInventories(); | |||||
| // }); | |||||
| } | |||||
| }, | |||||
| async insertAssertGroup() { | async insertAssertGroup() { | ||||
| await this.$axios.post(`/assert/assertGroups`, { | await this.$axios.post(`/assert/assertGroups`, { | ||||
| assertGroupDescript: this.insertAssertGroupDescript, | assertGroupDescript: this.insertAssertGroupDescript, | ||||
| @@ -1,5 +1,24 @@ | |||||
| <template> | <template> | ||||
| <div> | <div> | ||||
| <v-dialog | |||||
| v-model="progress" | |||||
| persistent | |||||
| width="300" | |||||
| > | |||||
| <v-card | |||||
| color="primary" | |||||
| dark | |||||
| > | |||||
| <v-card-text> | |||||
| 載入中... | |||||
| <v-progress-linear | |||||
| indeterminate | |||||
| color="white" | |||||
| class="mb-0" | |||||
| ></v-progress-linear> | |||||
| </v-card-text> | |||||
| </v-card> | |||||
| </v-dialog> | |||||
| <v-data-table class="" :headers="headers" :items="items" | <v-data-table class="" :headers="headers" :items="items" | ||||
| disable-sort | disable-sort | ||||
| fixed-header | fixed-header | ||||
| @@ -48,6 +67,9 @@ | |||||
| </v-card-title> | </v-card-title> | ||||
| <v-card-text> | <v-card-text> | ||||
| <v-container> | <v-container> | ||||
| <div class="red--text text--lighten-3 d-flex">1.請確認<p class="font-weight-bold red--text text--lighten-1 mb-0">匯入之類別</p>相符</div> | |||||
| <div class="red--text text--lighten-3 d-flex">1.請確認<p class="font-weight-bold red--text text--lighten-1 mb-0">欄位名稱</p>一致</div> | |||||
| <div class="red--text text--lighten-3 d-flex">3.<p class="font-weight-bold red--text text--lighten-1">欄位順序</p>不影響匯入</div> | |||||
| <input id="file" type="file" @change="onFileChange" /> | <input id="file" type="file" @change="onFileChange" /> | ||||
| </v-container> | </v-container> | ||||
| </v-card-text> | </v-card-text> | ||||
| @@ -332,9 +354,6 @@ | |||||
| </div> | </div> | ||||
| </template> | </template> | ||||
| <script> | <script> | ||||
| let cancel; | |||||
| let CancelToken; | |||||
| let cancel2; | |||||
| export default { | export default { | ||||
| name: '', | name: '', | ||||
| data() { | data() { | ||||
| @@ -358,10 +377,11 @@ | |||||
| haveSearch:false, | haveSearch:false, | ||||
| dialogImport: false, | dialogImport: false, | ||||
| file: null, | file: null, | ||||
| progress: false, | |||||
| } | } | ||||
| }, | }, | ||||
| async mounted() { | async mounted() { | ||||
| CancelToken = this.$axios.CancelToken; | |||||
| this.progress = true; | |||||
| this.getHeaders(); | this.getHeaders(); | ||||
| this.getInventories(); | this.getInventories(); | ||||
| this.getTitle(); | this.getTitle(); | ||||
| @@ -377,17 +397,14 @@ | |||||
| }, | }, | ||||
| }, | }, | ||||
| watch: { | watch: { | ||||
| tablename() { | |||||
| async tablename() { | |||||
| if (this.$route.params.tablename) { | if (this.$route.params.tablename) { | ||||
| this.headers = []; | |||||
| this.items = []; | |||||
| this.progress = true; | |||||
| this.title = ''; | this.title = ''; | ||||
| this.selectItem = {}; | |||||
| this.insertItem = {}; | |||||
| this.getHeaders(); | |||||
| this.getInventories(); | |||||
| this.getTitle(); | |||||
| this.getSelectItem(); | |||||
| await this.getHeaders(); | |||||
| await this.getInventories(); | |||||
| await this.getTitle(); | |||||
| await this.getSelectItem(); | |||||
| } | } | ||||
| }, | }, | ||||
| }, | }, | ||||
| @@ -402,21 +419,17 @@ | |||||
| oninput(item, key, val) { | oninput(item, key, val) { | ||||
| this.$set(item, key, val); | this.$set(item, key, val); | ||||
| }, | }, | ||||
| getTitle() { | |||||
| this.$axios.get(`/title?tablename=${this.tablename}`).then((resp) => { | |||||
| async getTitle() { | |||||
| await this.$axios.get(`/title?tablename=${this.tablename}`).then((resp) => { | |||||
| this.title = `${resp.data.data}類`; | this.title = `${resp.data.data}類`; | ||||
| }); | }); | ||||
| }, | }, | ||||
| getHeaders() { | |||||
| this.headers.push({'text': '', 'value': 'actions', sortable: false}); | |||||
| if (cancel) { | |||||
| cancel(); | |||||
| } | |||||
| this.$axios.get(`/headers?tablename=${this.tablename}`,{ | |||||
| cancelToken: new CancelToken(((c) => { | |||||
| cancel = c; | |||||
| })), | |||||
| }).then((resp) => { | |||||
| async getHeaders() { | |||||
| await this.$axios.get(`/headers?tablename=${this.tablename}`) | |||||
| .then((resp) => { | |||||
| this.headers = []; | |||||
| this.headers.push({'text': '', 'value': 'actions', sortable: false}); | |||||
| this.insertItem = {}; | |||||
| this.cols = resp.data.data; | this.cols = resp.data.data; | ||||
| resp.data.data.forEach((item) => { | resp.data.data.forEach((item) => { | ||||
| let header = {'text': null, 'value': null}; | let header = {'text': null, 'value': null}; | ||||
| @@ -435,16 +448,20 @@ | |||||
| }); | }); | ||||
| }); | }); | ||||
| }, | }, | ||||
| getInventories() { | |||||
| if (cancel2) { | |||||
| cancel2(); | |||||
| } | |||||
| this.$axios.get(`/inventory?tablename=${this.tablename}`,{ | |||||
| cancelToken: new CancelToken(((c) => { | |||||
| cancel = c; | |||||
| })), | |||||
| }).then((resp) => { | |||||
| async getInventories() { | |||||
| await this.$axios.get(`/inventory?tablename=${this.tablename}`) | |||||
| .then((resp) => { | |||||
| this.items = []; | |||||
| this.items = resp.data.data; | this.items = resp.data.data; | ||||
| this.progress = false; | |||||
| }); | |||||
| }, | |||||
| async getSelectItem() { | |||||
| await this.$axios.get(`/selectItem?tablename=${this.tablename}`).then((resp) => { | |||||
| this.selectItem = {}; | |||||
| this.selectItem = resp.data.data; | |||||
| }); | }); | ||||
| }, | }, | ||||
| insertOne() { | insertOne() { | ||||
| @@ -475,11 +492,6 @@ | |||||
| isRequire(key) { | isRequire(key) { | ||||
| return this.isrequired.indexOf(key) >= 0; | return this.isrequired.indexOf(key) >= 0; | ||||
| }, | }, | ||||
| getSelectItem() { | |||||
| this.$axios.get(`/selectItem?tablename=${this.tablename}`).then((resp) => { | |||||
| this.selectItem = resp.data.data; | |||||
| }); | |||||
| }, | |||||
| modifyOne(item) { | modifyOne(item) { | ||||
| item.tablename = this.tablename; | item.tablename = this.tablename; | ||||
| this.$axios.put(`/inventory?`, item).then(() => { | this.$axios.put(`/inventory?`, item).then(() => { | ||||
| @@ -523,11 +535,6 @@ | |||||
| self.searchItem[key] = null; | self.searchItem[key] = null; | ||||
| }); | }); | ||||
| this.getInventories(); | this.getInventories(); | ||||
| // this.searchItem = {}; | |||||
| // await this.cols.forEach((item) => { | |||||
| // this.searchItem[item.colname] = null; | |||||
| // | |||||
| // }); | |||||
| this.haveSearch = false; | this.haveSearch = false; | ||||
| }, | }, | ||||
| onFileChange(e) { | onFileChange(e) { | ||||
| @@ -540,6 +547,7 @@ | |||||
| }, | }, | ||||
| importFile() { | importFile() { | ||||
| const formData = new FormData(); | const formData = new FormData(); | ||||
| formData.append('tablename', this.tablename); | |||||
| formData.append('file', this.file); | formData.append('file', this.file); | ||||
| this.$axios.post(`/importFile`, formData).then(() => { | this.$axios.post(`/importFile`, formData).then(() => { | ||||
| document.getElementById('file').value = null; | document.getElementById('file').value = null; | ||||
| @@ -552,12 +560,23 @@ | |||||
| exportFile() { | exportFile() { | ||||
| let yes = confirm('確定匯出'); | let yes = confirm('確定匯出'); | ||||
| if (yes) { | if (yes) { | ||||
| // this.$axios.delete(`/deleteOne?tablename=${this.tablename}&&id=${item.id}`).then(() => { | |||||
| // this.getInventories(); | |||||
| // }); | |||||
| this.$axios.post(`/exportFile`, {items: this.items, info: {tablename: this.tablename}}, {responseType: 'blob'}) | |||||
| .then((resp) => { | |||||
| console.log(resp.headers['filename']); | |||||
| const blob = new Blob([resp.data], {type: "application/vnd.ms-excel;charset=utf-8"}); | |||||
| const reader = new FileReader(); | |||||
| reader.readAsDataURL(blob); | |||||
| reader.onload = (e) => { | |||||
| const a = document.createElement('a'); | |||||
| a.download = resp.headers['filename']; | |||||
| a.href = e.target.result; | |||||
| document.body.appendChild(a); | |||||
| a.click(); | |||||
| document.body.removeChild(a); | |||||
| }; | |||||
| } | |||||
| ); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -1,13 +1,30 @@ | |||||
| <template> | <template> | ||||
| <v-container fluid> | <v-container fluid> | ||||
| <v-row justify="center" dense class="mt-1"> | |||||
| <v-dialog | |||||
| v-model="progress" | |||||
| persistent | |||||
| width="300" | |||||
| > | |||||
| <v-card | |||||
| color="primary" | |||||
| dark | |||||
| > | |||||
| <v-card-text> | |||||
| 查詢中... | |||||
| <v-progress-linear | |||||
| indeterminate | |||||
| color="white" | |||||
| class="mb-0" | |||||
| ></v-progress-linear> | |||||
| </v-card-text> | |||||
| </v-card> | |||||
| </v-dialog> | |||||
| <v-row justify="center" dense class="ma-0 pa-0"> | |||||
| <v-col cols="4"> | <v-col cols="4"> | ||||
| <v-text-field outlined prepend-inner-icon="mdi-magnify" rounded /> | |||||
| <v-text-field v-model="text" dense outlined prepend-inner-icon="mdi-magnify" hide-details rounded v-on:keyup.enter="search"/> | |||||
| </v-col> | </v-col> | ||||
| </v-row> | </v-row> | ||||
| <v-data-table class="pa-3 pt-5" :headers="headers" :items="items"> | |||||
| <template v-slot:top> | |||||
| <v-toolbar flat> | |||||
| <v-toolbar flat v-if="result !== null"> | |||||
| <v-toolbar-title class="title font-weight-bold">搜尋結果</v-toolbar-title> | <v-toolbar-title class="title font-weight-bold">搜尋結果</v-toolbar-title> | ||||
| <v-divider | <v-divider | ||||
| class="mx-4" | class="mx-4" | ||||
| @@ -24,8 +41,47 @@ | |||||
| <v-icon >mdi-file-export-outline</v-icon> | <v-icon >mdi-file-export-outline</v-icon> | ||||
| </v-btn> | </v-btn> | ||||
| </v-toolbar> | </v-toolbar> | ||||
| </template> | |||||
| </v-data-table> | |||||
| <v-tabs | |||||
| v-if="result !== null" | |||||
| v-model='currentTab' | |||||
| centered | |||||
| fixed-tabs | |||||
| background-color='grey lighten-4' | |||||
| show-arrows | |||||
| > | |||||
| <!-- <v-tab--> | |||||
| <!-- v-for='(item, index) in assertGroup'--> | |||||
| <!-- :key='index'--> | |||||
| <!-- class=' font-weight-bold'--> | |||||
| <!-- >--> | |||||
| <!-- <v-icon small>{{ item.text }}</v-icon>--> | |||||
| <!-- </v-tab>--> | |||||
| <div | |||||
| v-for='(item, index) in assertGroup' | |||||
| :key='index' | |||||
| class="d-flex"> | |||||
| <v-tab | |||||
| v-if="result[item.value]" | |||||
| class=' font-weight-bold' | |||||
| > | |||||
| <v-icon small>{{ item.text }}</v-icon> | |||||
| </v-tab> | |||||
| </div> | |||||
| <v-tabs-items v-model='currentTab'> | |||||
| <div | |||||
| v-for='(item, index) in assertGroup' | |||||
| :key='index' | |||||
| class="flex-fill"> | |||||
| <v-tab-item | |||||
| v-if="result[item.value]" | |||||
| > | |||||
| <v-data-table v-if="result[item.value]" :headers="allHeaders[item.value]" :items="result[item.value]" > | |||||
| </v-data-table> | |||||
| </v-tab-item> | |||||
| </div> | |||||
| </v-tabs-items> | |||||
| </v-tabs> | |||||
| </v-container> | </v-container> | ||||
| </template> | </template> | ||||
| @@ -34,145 +90,92 @@ | |||||
| name: '', | name: '', | ||||
| data() { | data() { | ||||
| return { | return { | ||||
| dialogInsert: false, | |||||
| dialogModify: false, | |||||
| dialogSearch: false, | |||||
| title: '', | |||||
| headers: [], | |||||
| cols: {}, | |||||
| items: [], | |||||
| select: [], | |||||
| required: [], | |||||
| insertItem: {}, | |||||
| modifyItem: {}, | |||||
| selectItem: {}, | |||||
| searchItem: {}, | |||||
| text: '', | |||||
| result: null, | |||||
| headers: {}, | |||||
| currentTab: 0, | |||||
| assertGroup: [], | |||||
| allHeaders: {}, | |||||
| progress: false | |||||
| } | } | ||||
| }, | }, | ||||
| async mounted() { | |||||
| this.getHeaders(); | |||||
| this.getInventories(); | |||||
| this.getTitle(); | |||||
| this.getSelectItem(); | |||||
| }, | |||||
| computed: { | |||||
| tablename() { | |||||
| return 'hardware'; | |||||
| }, | |||||
| mounted() { | |||||
| this.getTabs(); | |||||
| }, | }, | ||||
| watch: { | watch: { | ||||
| async tablename() { | |||||
| if (this.$route.params.tablename) { | |||||
| this.headers = []; | |||||
| this.items = []; | |||||
| this.title = ''; | |||||
| this.selectItem = {}; | |||||
| this.insertItem = {}; | |||||
| this.getHeaders(); | |||||
| this.getInventories(); | |||||
| this.getTitle(); | |||||
| this.getSelectItem(); | |||||
| } | |||||
| }, | |||||
| currentTab() { | |||||
| // this.tablename = this.assertGroup[this.currentTab].value; | |||||
| // console.log(this.tablename); | |||||
| // this.getHeaders(); | |||||
| }, | |||||
| result() { | |||||
| Object.keys(this.result).forEach((key) => { | |||||
| this.getHeaders(key); | |||||
| }) | |||||
| }, | |||||
| allHeaders() { | |||||
| this.$forceUpdate(); | |||||
| } | |||||
| }, | }, | ||||
| methods: { | methods: { | ||||
| log() { | |||||
| alert('as'); | |||||
| }, | |||||
| oninput(item, key, val) { | |||||
| this.$set(item, key, val); | |||||
| }, | |||||
| getTitle() { | |||||
| this.$axios.get(`/title?tablename=${this.tablename}`).then((resp) => { | |||||
| this.title = `${resp.data.data}類`; | |||||
| }); | |||||
| }, | |||||
| getHeaders() { | |||||
| this.$axios.get(`/headers?tablename=${this.tablename}`).then((resp) => { | |||||
| this.cols = resp.data.data; | |||||
| async getTabs() { | |||||
| await this.$axios.get(`/assert/assertGroups`).then((resp) => { | |||||
| this.assertGroup = []; | |||||
| resp.data.data.forEach((item) => { | resp.data.data.forEach((item) => { | ||||
| let header = {'text': null, 'value': null}; | let header = {'text': null, 'value': null}; | ||||
| header.text = item.descript; | |||||
| header.value = item.colname; | |||||
| this.headers.push(header); | |||||
| if (item.select === 'true') { | |||||
| this.select.push(item.colname); | |||||
| } | |||||
| if (item.require === 'true') { | |||||
| this.required.push(item.colname); | |||||
| } | |||||
| this.insertItem[item.colname] = null; | |||||
| this.searchItem[item.colname] = null; | |||||
| header.text = item.descript; | |||||
| header.value = item.tablename; | |||||
| this.assertGroup.push(header); | |||||
| }); | }); | ||||
| this.headers.push({'text': '', 'value': 'actions', sortable: false}); | |||||
| }); | |||||
| }, | |||||
| getInventories() { | |||||
| this.$axios.get(`/inventory?tablename=${this.tablename}`).then((resp) => { | |||||
| this.items = resp.data.data; | |||||
| }); | |||||
| }, | |||||
| insertOne() { | |||||
| this.insertItem.tablename = this.tablename; | |||||
| this.$axios.post(`/inventory?`, this.insertItem).then(() => { | |||||
| delete this.insertItem.tablename; | |||||
| this.getInventories(); | |||||
| this.close(); | |||||
| } | |||||
| ); | |||||
| }, | |||||
| close() { | |||||
| this.dialogInsert = false; | |||||
| this.dialogModify = false; | |||||
| this.dialogSearch = false; | |||||
| }, | |||||
| isDisabled(key) { | |||||
| const disabledKey = ['id']; | |||||
| return disabledKey.indexOf(key) >= 0; | |||||
| }, | |||||
| isTextField(key) { | |||||
| return this.select.indexOf(key) < 0; | |||||
| }, | |||||
| isSelect(key) { | |||||
| return this.select.indexOf(key) >= 0; | |||||
| }, | |||||
| isRequire(key) { | |||||
| return this.required.indexOf(key) >= 0; | |||||
| }, | |||||
| getSelectItem() { | |||||
| this.$axios.get(`/selectItem?tablename=${this.tablename}`).then((resp) => { | |||||
| this.selectItem = resp.data.data; | |||||
| }); | }); | ||||
| }, | }, | ||||
| modifyOne(item) { | |||||
| item.tablename = this.tablename; | |||||
| this.$axios.put(`/inventory?`, item).then(() => { | |||||
| this.getInventories(); | |||||
| this.close(); | |||||
| } | |||||
| ); | |||||
| }, | |||||
| deleteOne(item) { | |||||
| let yes = confirm('確定刪除'); | |||||
| if (yes) { | |||||
| this.$axios.delete(`/deleteOne?tablename=${this.tablename}&&id=${item.id}`).then(() => { | |||||
| this.getInventories(); | |||||
| alert('已刪除'); | |||||
| async getHeaders(key) { | |||||
| await this.$axios.get(`/headers?tablename=${key}`) | |||||
| .then(async (resp) => { | |||||
| const headers = []; | |||||
| await resp.data.data.forEach((item) => { | |||||
| let header = {'text': null, 'value': null}; | |||||
| header.text = item.descript; | |||||
| header.value = item.colname; | |||||
| headers.push(header); | |||||
| }); | |||||
| this.allHeaders[key] = headers; | |||||
| }); | }); | ||||
| } | |||||
| console.log(item); | |||||
| }, | }, | ||||
| search() { | |||||
| this.progress = true; | |||||
| this.$axios.get(`/search/search?text=${this.text}`).then((resp) => { | |||||
| Object.keys(resp.data.data).forEach(async (key) => { | |||||
| await this.getHeaders(key); | |||||
| }); | |||||
| setTimeout(() => {this.result = resp.data.data; this.progress = false;}, 500); | |||||
| // this.result = resp.data.data; | |||||
| }); | |||||
| }, | |||||
| exportFile() { | exportFile() { | ||||
| let yes = confirm('確定匯出'); | let yes = confirm('確定匯出'); | ||||
| if (yes) { | if (yes) { | ||||
| // this.$axios.delete(`/deleteOne?tablename=${this.tablename}&&id=${item.id}`).then(() => { | |||||
| // this.getInventories(); | |||||
| // }); | |||||
| this.$axios.post(`/search/exportFileAllGroup`, this.result, {responseType: 'blob'}) | |||||
| .then((resp) => { | |||||
| console.log(resp.headers['filename']); | |||||
| const blob = new Blob([resp.data], {type: "application/vnd.ms-excel;charset=utf-8"}); | |||||
| const reader = new FileReader(); | |||||
| reader.readAsDataURL(blob); | |||||
| reader.onload = (e) => { | |||||
| const a = document.createElement('a'); | |||||
| a.download = resp.headers['filename']; | |||||
| a.href = e.target.result; | |||||
| document.body.appendChild(a); | |||||
| a.click(); | |||||
| document.body.removeChild(a); | |||||
| }; | |||||
| } | |||||
| ); | |||||
| } | } | ||||
| } | |||||
| } | |||||
| }, | |||||
| }, | |||||
| } | } | ||||
| </script> | </script> | ||||
| @@ -75,5 +75,9 @@ public class JdbiFactory { | |||||
| return jdbi.onDemand(AssertDAO.class); | return jdbi.onDemand(AssertDAO.class); | ||||
| } | } | ||||
| @Bean | |||||
| public SearchDAO searchDAO(Jdbi jdbi) { | |||||
| return jdbi.onDemand(SearchDAO.class); | |||||
| } | |||||
| } | } | ||||
| @@ -4,13 +4,18 @@ package com.moze.rms.controller; | |||||
| import com.moze.rms.dao.InventoryDAO; | import com.moze.rms.dao.InventoryDAO; | ||||
| import com.moze.rms.dao.MappingColDAO; | import com.moze.rms.dao.MappingColDAO; | ||||
| import com.moze.rms.dao.MappingTableDAO; | import com.moze.rms.dao.MappingTableDAO; | ||||
| import com.moze.rms.dao.SearchDAO; | |||||
| import com.moze.rms.entity.dto.SelectItemDTO; | import com.moze.rms.entity.dto.SelectItemDTO; | ||||
| import com.moze.rms.entity.model.MappingCol; | |||||
| import com.moze.rms.utils.ExcelExpoter; | |||||
| import com.moze.rms.utils.ExcelImporter; | import com.moze.rms.utils.ExcelImporter; | ||||
| import org.apache.poi.openxml4j.exceptions.InvalidFormatException; | import org.apache.poi.openxml4j.exceptions.InvalidFormatException; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.beans.factory.support.ManagedMap; | |||||
| import org.springframework.web.bind.annotation.*; | import org.springframework.web.bind.annotation.*; | ||||
| import org.springframework.web.multipart.MultipartFile; | import org.springframework.web.multipart.MultipartFile; | ||||
| import javax.servlet.http.HttpServletResponse; | |||||
| import java.io.*; | import java.io.*; | ||||
| import java.util.*; | import java.util.*; | ||||
| import java.util.function.Function; | import java.util.function.Function; | ||||
| @@ -29,6 +34,9 @@ public class InventoryController { | |||||
| @Autowired | @Autowired | ||||
| InventoryDAO inventoryDAO; | InventoryDAO inventoryDAO; | ||||
| @Autowired | |||||
| SearchDAO searchDAO; | |||||
| @GetMapping("/routes") | @GetMapping("/routes") | ||||
| public JsonResult getRoutes() { | public JsonResult getRoutes() { | ||||
| @@ -56,6 +64,8 @@ public class InventoryController { | |||||
| public JsonResult insertInventory(@RequestBody Map<String, Object> data) { | public JsonResult insertInventory(@RequestBody Map<String, Object> data) { | ||||
| System.out.println(data); | System.out.println(data); | ||||
| inventoryDAO.insertOne(data); | inventoryDAO.insertOne(data); | ||||
| Integer id = inventoryDAO.findId(data); | |||||
| searchDAO.insertSearch(id, data); | |||||
| return new JsonResult(StatusCode.SUCCESS, null); | return new JsonResult(StatusCode.SUCCESS, null); | ||||
| } | } | ||||
| @@ -63,6 +73,7 @@ public class InventoryController { | |||||
| public JsonResult modifyInventory(@RequestBody Map<String, Object> data) { | public JsonResult modifyInventory(@RequestBody Map<String, Object> data) { | ||||
| try { | try { | ||||
| inventoryDAO.modifyInventory(data); | inventoryDAO.modifyInventory(data); | ||||
| searchDAO.modifySearch(data); | |||||
| return new JsonResult(StatusCode.SUCCESS, null); | return new JsonResult(StatusCode.SUCCESS, null); | ||||
| } catch (Exception e) { | } catch (Exception e) { | ||||
| return new JsonResult(StatusCode.SYS_ERROR, e.getMessage()); | return new JsonResult(StatusCode.SYS_ERROR, e.getMessage()); | ||||
| @@ -81,6 +92,7 @@ public class InventoryController { | |||||
| System.out.println(tablename); | System.out.println(tablename); | ||||
| System.out.println(id); | System.out.println(id); | ||||
| inventoryDAO.deleteByTablenameAndId(tablename, id); | inventoryDAO.deleteByTablenameAndId(tablename, id); | ||||
| searchDAO.deleteFromSearch(tablename, id); | |||||
| return new JsonResult(StatusCode.SUCCESS, null); | return new JsonResult(StatusCode.SUCCESS, null); | ||||
| } | } | ||||
| @@ -93,22 +105,52 @@ public class InventoryController { | |||||
| } | } | ||||
| @PostMapping("/importFile") | @PostMapping("/importFile") | ||||
| public JsonResult importFile(@RequestParam(required = false) MultipartFile file) throws IOException, InvalidFormatException { | |||||
| public JsonResult importFile(String tablename, @RequestParam(required = false) MultipartFile file) throws IOException, InvalidFormatException { | |||||
| File f = File.createTempFile(file.getOriginalFilename().split("\\.")[0], file.getOriginalFilename().split("\\.")[1]); | File f = File.createTempFile(file.getOriginalFilename().split("\\.")[0], file.getOriginalFilename().split("\\.")[1]); | ||||
| System.out.println(f.getName()); | |||||
| file.transferTo(f); | file.transferTo(f); | ||||
| ExcelImporter excelImporter = new ExcelImporter(f); | |||||
| List<Map<String, String>> data = excelImporter.readAll().get("工作表1"); | |||||
| ExcelImporter excelImporter2 = new ExcelImporter(f); | |||||
| System.out.println(excelImporter2.readAll()); | |||||
| List<MappingCol> mappingCols = mappingColDAO.findByTable(tablename); | |||||
| inventoryDAO.importInventories(tablename, mappingCols, data, searchDAO); | |||||
| f.deleteOnExit(); | f.deleteOnExit(); | ||||
| return new JsonResult(StatusCode.SUCCESS, null); | |||||
| } | |||||
| @PostMapping("/exportFile") | |||||
| public void exportFile(@RequestBody Map<String, Object> data, HttpServletResponse resp) throws IOException, InvalidFormatException { | |||||
| List<Map<String, Object>> items = (List<Map<String, Object>>) data.get("items"); | |||||
| Map<String, String> info = (Map<String, String>) data.get("info"); | |||||
| return new JsonResult(StatusCode.SUCCESS, null); | |||||
| List<MappingCol> mappingCols = mappingColDAO.findByTable(info.get("tablename")); | |||||
| ArrayList<String> titleKeyList= new ArrayList<>(); | |||||
| Map<String, String> titleMap = new ManagedMap<>(); | |||||
| for(MappingCol m: mappingCols) { | |||||
| titleKeyList.add(m.getColname()); | |||||
| titleMap.put(m.getColname(), m.getDescript()); | |||||
| } | |||||
| ExcelExpoter excelExpoter = new ExcelExpoter(""); | |||||
| excelExpoter.expoerDataExcel(resp, titleKeyList, titleMap, items, info.get("tablename")); | |||||
| } | } | ||||
| @GetMapping("/allHeaders") | |||||
| public JsonResult getAllHeaders() { | |||||
| List<MappingCol> mappingCols = mappingColDAO.findAll(); | |||||
| mappingCols.stream().collect(Collectors.groupingBy(MappingCol::getTablename)); | |||||
| System.out.println(mappingCols.stream().collect(Collectors.groupingBy(MappingCol::getTablename))); | |||||
| return new JsonResult(StatusCode.SUCCESS, mappingCols.stream().collect(Collectors.groupingBy(MappingCol::getTablename))); | |||||
| } | |||||
| } | } | ||||
| @@ -0,0 +1,81 @@ | |||||
| package com.moze.rms.controller; | |||||
| import com.moze.rms.dao.MappingColDAO; | |||||
| import com.moze.rms.dao.MappingTableDAO; | |||||
| import com.moze.rms.dao.SearchDAO; | |||||
| import com.moze.rms.entity.model.MappingCol; | |||||
| import com.moze.rms.entity.model.MappingTable; | |||||
| import com.moze.rms.utils.ExcelExpoter; | |||||
| import org.apache.poi.openxml4j.exceptions.InvalidFormatException; | |||||
| import org.springframework.beans.factory.annotation.Autowired; | |||||
| import org.springframework.beans.factory.support.ManagedMap; | |||||
| import org.springframework.web.bind.annotation.*; | |||||
| import javax.servlet.http.HttpServletResponse; | |||||
| import java.io.IOException; | |||||
| import java.util.*; | |||||
| @RequestMapping("/api/search") | |||||
| @RestController | |||||
| public class SearchController { | |||||
| @Autowired | |||||
| SearchDAO searchDAO; | |||||
| @Autowired | |||||
| MappingTableDAO mappingTableDAO; | |||||
| @Autowired | |||||
| MappingColDAO mappingColDAO; | |||||
| @GetMapping("/search") | |||||
| public JsonResult search(@RequestParam String text) { | |||||
| System.out.println(text); | |||||
| List<MappingTable> tables = mappingTableDAO.findAll(); | |||||
| Map<String, List<Map<String, Object>>> result = new HashMap<>(); | |||||
| for(MappingTable m : tables) { | |||||
| if (searchDAO.searchFromTable(m.getTablename(), text).size() > 0) { | |||||
| result.put(m.getTablename(), searchDAO.searchFromTable(m.getTablename(), text)); | |||||
| } | |||||
| } | |||||
| return new JsonResult(StatusCode.SUCCESS, result); | |||||
| } | |||||
| @PostMapping("/exportFileAllGroup") | |||||
| public void exportFileAllGroup(@RequestBody Map<String, List<Map<String, Object>>> data, HttpServletResponse resp) throws IOException, InvalidFormatException { | |||||
| Iterator<Map.Entry<String, List<Map<String, Object>>>> iterator = data.entrySet().iterator(); | |||||
| Map<String, ArrayList<String>>titleKeyLists = new ManagedMap<>(); | |||||
| Map<String, Map<String, String>> titleMaps = new ManagedMap<>(); | |||||
| while (iterator.hasNext()) { | |||||
| Map.Entry<String, List<Map<String, Object>>> next = iterator.next(); | |||||
| String key = next.getKey(); | |||||
| List<MappingCol> mappingCols = mappingColDAO.findByTable(key); | |||||
| ArrayList<String> titleKeyList= new ArrayList<>(); | |||||
| Map<String, String> titleMap = new ManagedMap<>(); | |||||
| for(MappingCol m: mappingCols) { | |||||
| titleKeyList.add(m.getColname()); | |||||
| titleMap.put(m.getColname(), m.getDescript()); | |||||
| } | |||||
| titleKeyLists.put(key, titleKeyList); | |||||
| titleMaps.put(key, titleMap); | |||||
| } | |||||
| ExcelExpoter excelExpoter = new ExcelExpoter(""); | |||||
| excelExpoter.expoerDataExcelMultiSheet(resp, titleKeyLists, titleMaps, data, ""); | |||||
| } | |||||
| } | |||||
| @@ -2,19 +2,21 @@ package com.moze.rms.dao; | |||||
| import com.moze.rms.entity.dto.SelectItemDTO; | import com.moze.rms.entity.dto.SelectItemDTO; | ||||
| import com.moze.rms.entity.model.MappingCol; | |||||
| import org.jdbi.v3.core.Handle; | import org.jdbi.v3.core.Handle; | ||||
| import org.jdbi.v3.sqlobject.SqlObject; | import org.jdbi.v3.sqlobject.SqlObject; | ||||
| import org.jdbi.v3.sqlobject.config.RegisterBeanMapper; | import org.jdbi.v3.sqlobject.config.RegisterBeanMapper; | ||||
| import org.jdbi.v3.sqlobject.statement.SqlQuery; | import org.jdbi.v3.sqlobject.statement.SqlQuery; | ||||
| import org.jdbi.v3.sqlobject.statement.SqlUpdate; | import org.jdbi.v3.sqlobject.statement.SqlUpdate; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | |||||
| import java.util.HashMap; | |||||
| import java.util.Iterator; | import java.util.Iterator; | ||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | import java.util.Map; | ||||
| public interface InventoryDAO extends SqlObject { | public interface InventoryDAO extends SqlObject { | ||||
| @RegisterBeanMapper(Object.class) | @RegisterBeanMapper(Object.class) | ||||
| default List<Map<String, Object>> getInventoryByTablename(String tablename) { | default List<Map<String, Object>> getInventoryByTablename(String tablename) { | ||||
| Handle handle = this.getHandle(); | Handle handle = this.getHandle(); | ||||
| @@ -72,6 +74,55 @@ public interface InventoryDAO extends SqlObject { | |||||
| handle.execute(sql); | handle.execute(sql); | ||||
| } | } | ||||
| default Integer findId(Map<String, Object> data) { | |||||
| Handle handle = this.getHandle(); | |||||
| String sql = "select id from " + data.get("tablename") + " where "; | |||||
| Iterator<Map.Entry<String, Object>> iterator = data.entrySet().iterator(); | |||||
| while (iterator.hasNext()) { | |||||
| Map.Entry<String, Object> next = iterator.next(); | |||||
| String key = next.getKey(); | |||||
| Object value = next.getValue().toString(); | |||||
| if (key != "tablename" && key != "id") { | |||||
| if (value != null) { | |||||
| sql += key + " = '" + value + "' and "; | |||||
| } else { | |||||
| sql += key + " = " + value + " and "; | |||||
| } | |||||
| } | |||||
| } | |||||
| sql = sql.substring(0, sql.length() - 4); | |||||
| return handle.createQuery(sql).mapTo(Integer.class).one(); | |||||
| } | |||||
| default Integer findId2(Map<String, String> data) { | |||||
| Handle handle = this.getHandle(); | |||||
| String sql = "select top 1 id from " + data.get("tablename") + " where "; | |||||
| Iterator<Map.Entry<String, String>> iterator = data.entrySet().iterator(); | |||||
| while (iterator.hasNext()) { | |||||
| Map.Entry<String, String> next = iterator.next(); | |||||
| String key = next.getKey(); | |||||
| Object value = next.getValue(); | |||||
| if (key != "tablename" && key != "id") { | |||||
| if (value != null) { | |||||
| sql += key + " = '" + value + "' and "; | |||||
| } else { | |||||
| sql += key + " = '' and "; | |||||
| } | |||||
| } | |||||
| } | |||||
| sql = sql.substring(0, sql.length() - 4); | |||||
| return handle.createQuery(sql).mapTo(Integer.class).one(); | |||||
| } | |||||
| @RegisterBeanMapper(Object.class) | @RegisterBeanMapper(Object.class) | ||||
| default List<Map<String, Object>> search(Map<String, Object> data) { | default List<Map<String, Object>> search(Map<String, Object> data) { | ||||
| @@ -83,7 +134,6 @@ public interface InventoryDAO extends SqlObject { | |||||
| Map.Entry<String, Object> next = iterator.next(); | Map.Entry<String, Object> next = iterator.next(); | ||||
| String key = next.getKey(); | String key = next.getKey(); | ||||
| Object value = next.getValue(); | Object value = next.getValue(); | ||||
| System.out.println(key); | |||||
| if (key != "tablename" && key != "id" && value != null) { | if (key != "tablename" && key != "id" && value != null) { | ||||
| sql += " " + key + " like '%" + value + "%' and"; | sql += " " + key + " like '%" + value + "%' and"; | ||||
| } | } | ||||
| @@ -92,4 +142,43 @@ public interface InventoryDAO extends SqlObject { | |||||
| System.out.println(sql); | System.out.println(sql); | ||||
| return handle.createQuery(sql).mapToMap().list(); | return handle.createQuery(sql).mapToMap().list(); | ||||
| } | } | ||||
| default void importInventories(String tablename, List<MappingCol> mappingCols, List<Map<String, String>> datas, SearchDAO searchDAO) { | |||||
| Handle handle = this.getHandle(); | |||||
| for (Map<String, String> data : datas) { | |||||
| String cols = ""; | |||||
| String values = ""; | |||||
| Map<String, String> tmpData = new HashMap<>(); | |||||
| for(MappingCol m : mappingCols) { | |||||
| if (!m.getColname().equals("id")) { | |||||
| if (data.get(m.getDescript()) != null) { | |||||
| cols += " " + m.getColname() + ","; | |||||
| values += " '" + data.get(m.getDescript()).replace("'", "`") + "',"; | |||||
| tmpData.put(m.getColname(), data.get(m.getDescript()).replace("'", "`")); | |||||
| } else { | |||||
| cols += " " + m.getColname() + ","; | |||||
| values += " '',"; | |||||
| tmpData.put(m.getColname(), data.get(m.getDescript())); | |||||
| } | |||||
| } | |||||
| } | |||||
| cols = cols.substring(0, cols.length() - 1); | |||||
| values = values.substring(0, values.length() - 1); | |||||
| String sql = "insert into " + tablename + "(" + cols + ") values (" + values + ")"; | |||||
| System.out.println(sql); | |||||
| handle.createUpdate(sql).execute(); | |||||
| tmpData.put("tablename", tablename); | |||||
| Integer id = findId2(tmpData); | |||||
| searchDAO.insertSearch2(id, tmpData); | |||||
| } | |||||
| } | |||||
| } | } | ||||
| @@ -6,6 +6,7 @@ import org.jdbi.v3.sqlobject.config.RegisterBeanMapper; | |||||
| import org.jdbi.v3.sqlobject.statement.SqlQuery; | import org.jdbi.v3.sqlobject.statement.SqlQuery; | ||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | |||||
| @RegisterBeanMapper(MappingCol.class) | @RegisterBeanMapper(MappingCol.class) | ||||
| public interface MappingColDAO { | public interface MappingColDAO { | ||||
| @@ -13,4 +14,8 @@ public interface MappingColDAO { | |||||
| @SqlQuery("select * from mapping.mapping_col where tablename = ? order by convert(int, [index]);") | @SqlQuery("select * from mapping.mapping_col where tablename = ? order by convert(int, [index]);") | ||||
| List<MappingCol> findByTable(String tablename); | List<MappingCol> findByTable(String tablename); | ||||
| @SqlQuery("select * from mapping.mapping_col order by convert(int, [index]);") | |||||
| List<MappingCol> findAll(); | |||||
| } | } | ||||
| @@ -0,0 +1,120 @@ | |||||
| package com.moze.rms.dao; | |||||
| import org.jdbi.v3.core.Handle; | |||||
| import org.jdbi.v3.sqlobject.SqlObject; | |||||
| import org.jdbi.v3.sqlobject.config.RegisterBeanMapper; | |||||
| import org.jdbi.v3.sqlobject.statement.SqlUpdate; | |||||
| import java.util.Iterator; | |||||
| import java.util.List; | |||||
| import java.util.Map; | |||||
| public interface SearchDAO extends SqlObject { | |||||
| // @RegisterBeanMapper(Object.class) | |||||
| // default List<Map<String, Object>> search(Map<String, Object> data) { | |||||
| // Handle handle = this.getHandle(); | |||||
| // String sql = "select * from " + data.get("tablename") + " where"; | |||||
| // data.remove("tablename"); | |||||
| // Iterator<Map.Entry<String, Object>> iterator = data.entrySet().iterator(); | |||||
| // while (iterator.hasNext()) { | |||||
| // Map.Entry<String, Object> next = iterator.next(); | |||||
| // String key = next.getKey(); | |||||
| // Object value = next.getValue(); | |||||
| // if (key != "tablename" && key != "id" && value != null) { | |||||
| // sql += " " + key + " like '%" + value + "%' and"; | |||||
| // } | |||||
| // } | |||||
| // sql = sql.substring(0, sql.length() - 3); | |||||
| // System.out.println(sql); | |||||
| // return handle.createQuery(sql).mapToMap().list(); | |||||
| // } | |||||
| @RegisterBeanMapper(Object.class) | |||||
| default List<Map<String, Object>> searchFromTable(String tablename, String text) { | |||||
| Handle handle = this.getHandle(); | |||||
| String sql = "select "; | |||||
| sql += tablename + ".*"; | |||||
| sql += "from search "; | |||||
| sql += "join " + tablename + " on search.id = " + tablename + ".id "; | |||||
| sql += " and search.tablename = '" + tablename + "' "; | |||||
| sql += "where text like '%' + '" + text + "' + '%' order by id"; | |||||
| return handle.createQuery(sql).mapToMap().list(); | |||||
| } | |||||
| default void insertSearch(Integer id, Map<String, Object> data) { | |||||
| Handle handle = this.getHandle(); | |||||
| String text = ""; | |||||
| Iterator<Map.Entry<String, Object>> iterator = data.entrySet().iterator(); | |||||
| while (iterator.hasNext()) { | |||||
| Map.Entry<String, Object> next = iterator.next(); | |||||
| String key = next.getKey(); | |||||
| Object value = next.getValue().toString(); | |||||
| if (key != "id" && key != "tablename" && value != null) { | |||||
| text += value + " "; | |||||
| } | |||||
| } | |||||
| String sql = "insert into search values ("; | |||||
| sql += "'" + data.get("tablename") + "',"; | |||||
| sql += "'" + id + "',"; | |||||
| sql += "'" + text + "'"; | |||||
| sql += ")"; | |||||
| handle.createUpdate(sql).execute(); | |||||
| } | |||||
| default void insertSearch2(Integer id, Map<String, String> data) { | |||||
| Handle handle = this.getHandle(); | |||||
| String text = ""; | |||||
| Iterator<Map.Entry<String, String>> iterator = data.entrySet().iterator(); | |||||
| while (iterator.hasNext()) { | |||||
| Map.Entry<String, String> next = iterator.next(); | |||||
| String key = next.getKey(); | |||||
| Object value = next.getValue(); | |||||
| if (key != "id" && key != "tablename" && value != null) { | |||||
| text += value.toString() + " "; | |||||
| } | |||||
| } | |||||
| String sql = "insert into search values ("; | |||||
| sql += "'" + data.get("tablename") + "',"; | |||||
| sql += "'" + id + "',"; | |||||
| sql += "'" + text + "'"; | |||||
| sql += ")"; | |||||
| handle.createUpdate(sql).execute(); | |||||
| } | |||||
| default void modifySearch( Map<String, Object> data) { | |||||
| Handle handle = this.getHandle(); | |||||
| String text = ""; | |||||
| Iterator<Map.Entry<String, Object>> iterator = data.entrySet().iterator(); | |||||
| while (iterator.hasNext()) { | |||||
| Map.Entry<String, Object> next = iterator.next(); | |||||
| String key = next.getKey(); | |||||
| Object value = next.getValue(); | |||||
| if (key != "id" && key != "tablename" && value != null) { | |||||
| text += value.toString() + " "; | |||||
| } | |||||
| } | |||||
| String sql = "update search set text = "; | |||||
| sql += "'" + text + "'"; | |||||
| sql += "where tablename = ''" + data.get("tablename") + "' and id = '" + data.get("id").toString() + "'"; | |||||
| handle.createUpdate(sql).execute(); | |||||
| } | |||||
| @SqlUpdate("delete from search where tablename = ? and id = ?") | |||||
| void deleteFromSearch(String tablename, String id); | |||||
| // default void bulkinsertSearch(String tablename, String id , List<Map<String, Object>> datas) { | |||||
| // Handle handle = this.getHandle(); | |||||
| // } | |||||
| } | |||||
| @@ -1,40 +1,31 @@ | |||||
| package com.moze.rms.utils; | package com.moze.rms.utils; | ||||
| import java.io.FileNotFoundException; | |||||
| import java.io.FileOutputStream; | |||||
| import java.io.IOException; | |||||
| import java.util.HashSet; | |||||
| import java.util.LinkedHashMap; | |||||
| import java.util.LinkedList; | |||||
| import java.util.List; | |||||
| import java.util.Map; | |||||
| import java.util.Set; | |||||
| import org.apache.poi.ss.usermodel.Cell; | |||||
| import org.apache.poi.ss.usermodel.CellStyle; | |||||
| import org.apache.poi.ss.usermodel.Font; | |||||
| import org.apache.poi.ss.usermodel.IndexedColors; | |||||
| import org.apache.poi.ss.usermodel.Row; | |||||
| import org.apache.poi.ss.usermodel.VerticalAlignment; | |||||
| import java.io.*; | |||||
| import java.util.*; | |||||
| import org.apache.poi.ss.usermodel.*; | |||||
| import org.apache.poi.xssf.streaming.SXSSFWorkbook; | |||||
| import org.apache.poi.xssf.usermodel.XSSFSheet; | import org.apache.poi.xssf.usermodel.XSSFSheet; | ||||
| import org.apache.poi.xssf.usermodel.XSSFWorkbook; | import org.apache.poi.xssf.usermodel.XSSFWorkbook; | ||||
| import javax.servlet.http.HttpServletResponse; | |||||
| public class ExcelExpoter { | public class ExcelExpoter { | ||||
| private String outputPath; | |||||
| private String nullString; | |||||
| private Set<String> columnAutoSized = new HashSet<>(); | |||||
| List<SheetInfo> sheets = new LinkedList<>(); | |||||
| private String outputPath; | |||||
| private String nullString; | |||||
| private Set<String> columnAutoSized = new HashSet<>(); | |||||
| List<SheetInfo> sheets = new LinkedList<>(); | |||||
| public ExcelExpoter(String outputPath) { | |||||
| this.outputPath = outputPath; | |||||
| this.nullString = "<NULL>"; | |||||
| } | |||||
| public ExcelExpoter(String outputPath) { | |||||
| this.outputPath = outputPath; | |||||
| this.nullString = "<NULL>"; | |||||
| } | |||||
| public ExcelExpoter(String outputPath, String nullString) { | |||||
| this.outputPath = outputPath; | |||||
| this.nullString = nullString; | |||||
| } | |||||
| public ExcelExpoter(String outputPath, String nullString) { | |||||
| this.outputPath = outputPath; | |||||
| this.nullString = nullString; | |||||
| } | |||||
| // public void export() throws FileNotFoundException, IOException { | // public void export() throws FileNotFoundException, IOException { | ||||
| // try (FileOutputStream outputStream = new FileOutputStream(outputPath); | // try (FileOutputStream outputStream = new FileOutputStream(outputPath); | ||||
| @@ -48,9 +39,9 @@ public class ExcelExpoter { | |||||
| // } | // } | ||||
| // } | // } | ||||
| public void addSheet(String sheetName, Map<String, String> headerMap, List<?> data) { | |||||
| sheets.add(new SheetInfo(sheetName, headerMap, data)); | |||||
| } | |||||
| public void addSheet(String sheetName, Map<String, String> headerMap, List<?> data) { | |||||
| sheets.add(new SheetInfo(sheetName, headerMap, data)); | |||||
| } | |||||
| // public void export(String sheetName, Map<String, String> headerMap, List<?> data) throws FileNotFoundException, IOException { | // public void export(String sheetName, Map<String, String> headerMap, List<?> data) throws FileNotFoundException, IOException { | ||||
| // try (FileOutputStream outputStream = new FileOutputStream(outputPath); | // try (FileOutputStream outputStream = new FileOutputStream(outputPath); | ||||
| @@ -62,8 +53,8 @@ public class ExcelExpoter { | |||||
| // } | // } | ||||
| // } | // } | ||||
| private void exportSheet(XSSFWorkbook workbook, String sheetName, Map<String, String> headerMap, List<?> data) { | |||||
| XSSFSheet sheet = workbook.createSheet(sheetName); | |||||
| private void exportSheet(XSSFWorkbook workbook, String sheetName, Map<String, String> headerMap, List<?> data) { | |||||
| XSSFSheet sheet = workbook.createSheet(sheetName); | |||||
| int rowCount = 0; | int rowCount = 0; | ||||
| @@ -71,7 +62,7 @@ public class ExcelExpoter { | |||||
| if (headerMap == null) { | if (headerMap == null) { | ||||
| headerMap = new LinkedHashMap<>(); | headerMap = new LinkedHashMap<>(); | ||||
| if (!data.isEmpty()) { | if (!data.isEmpty()) { | ||||
| for(String k: JsonUtil.pojo2Map(data.get(0)).keySet()) { | |||||
| for (String k : JsonUtil.pojo2Map(data.get(0)).keySet()) { | |||||
| headerMap.put(k, k); | headerMap.put(k, k); | ||||
| } | } | ||||
| } | } | ||||
| @@ -88,7 +79,7 @@ public class ExcelExpoter { | |||||
| Row row = sheet.createRow(rowCount++); | Row row = sheet.createRow(rowCount++); | ||||
| int columnCount = 0; | int columnCount = 0; | ||||
| for(String v: headerMap.values()) { | |||||
| for (String v : headerMap.values()) { | |||||
| Cell cell = row.createCell(columnCount++); | Cell cell = row.createCell(columnCount++); | ||||
| cell.setCellValue(v); | cell.setCellValue(v); | ||||
| cell.setCellStyle(headerCellStyle); | cell.setCellStyle(headerCellStyle); | ||||
| @@ -101,11 +92,11 @@ public class ExcelExpoter { | |||||
| for (Object item : data) { | for (Object item : data) { | ||||
| @SuppressWarnings("unchecked") | @SuppressWarnings("unchecked") | ||||
| Map<String, Object> obj = item instanceof Map ? (Map<String, Object>)item: JsonUtil.pojo2Map(item); | |||||
| Map<String, Object> obj = item instanceof Map ? (Map<String, Object>) item : JsonUtil.pojo2Map(item); | |||||
| row = sheet.createRow(rowCount++); | row = sheet.createRow(rowCount++); | ||||
| columnCount = 0; | columnCount = 0; | ||||
| for(String k: headerMap.keySet()) { | |||||
| for (String k : headerMap.keySet()) { | |||||
| Object v = obj.get(k); | Object v = obj.get(k); | ||||
| Cell cell = row.createCell(columnCount++); | Cell cell = row.createCell(columnCount++); | ||||
| String value = v == null ? nullString : v.toString(); | String value = v == null ? nullString : v.toString(); | ||||
| @@ -120,57 +111,190 @@ public class ExcelExpoter { | |||||
| } | } | ||||
| System.out.println("[" + sheetName + "] Created all row " + rowCount); | System.out.println("[" + sheetName + "] Created all row " + rowCount); | ||||
| autoSizeColumn(sheet); | autoSizeColumn(sheet); | ||||
| } | |||||
| private void autoSizeColumn(XSSFSheet sheet) { | |||||
| if (columnAutoSized.contains(sheet.getSheetName())) | |||||
| return; | |||||
| System.out.println("Start auto size columns"); | |||||
| int maxWidth = 256 * 120; | |||||
| int minWidth = 256 * 16; | |||||
| int rowCount = sheet.getRow(0).getLastCellNum(); | |||||
| System.out.println(rowCount); | |||||
| for (int j = 0; j < rowCount; j++) { | |||||
| sheet.autoSizeColumn(j); | |||||
| if (sheet.getColumnWidth(j) > maxWidth) { | |||||
| sheet.setColumnWidth(j, maxWidth); | |||||
| } | |||||
| if (sheet.getColumnWidth(j) < minWidth) { | |||||
| sheet.setColumnWidth(j, minWidth); | |||||
| } | |||||
| } | |||||
| columnAutoSized.add(sheet.getSheetName()); | |||||
| System.out.println("End auto size columns"); | |||||
| } | |||||
| private static class SheetInfo { | |||||
| private String sheetName; | |||||
| private Map<String, String> headerMap; | |||||
| private List<?> data; | |||||
| } | |||||
| private void autoSizeColumn(XSSFSheet sheet) { | |||||
| if (columnAutoSized.contains(sheet.getSheetName())) | |||||
| return; | |||||
| System.out.println("Start auto size columns"); | |||||
| int maxWidth = 256 * 120; | |||||
| int minWidth = 256 * 16; | |||||
| int rowCount = sheet.getRow(0).getLastCellNum(); | |||||
| System.out.println(rowCount); | |||||
| for (int j = 0; j < rowCount; j++) { | |||||
| sheet.autoSizeColumn(j); | |||||
| if (sheet.getColumnWidth(j) > maxWidth) { | |||||
| sheet.setColumnWidth(j, maxWidth); | |||||
| } | |||||
| if (sheet.getColumnWidth(j) < minWidth) { | |||||
| sheet.setColumnWidth(j, minWidth); | |||||
| } | |||||
| } | |||||
| columnAutoSized.add(sheet.getSheetName()); | |||||
| System.out.println("End auto size columns"); | |||||
| } | |||||
| private static class SheetInfo { | |||||
| private String sheetName; | |||||
| private Map<String, String> headerMap; | |||||
| private List<?> data; | |||||
| public SheetInfo(String sheetName, Map<String, String> headerMap, List<?> data) { | public SheetInfo(String sheetName, Map<String, String> headerMap, List<?> data) { | ||||
| super(); | super(); | ||||
| this.sheetName = sheetName; | this.sheetName = sheetName; | ||||
| this.headerMap = headerMap; | this.headerMap = headerMap; | ||||
| this.data = data; | this.data = data; | ||||
| } | } | ||||
| public String getSheetName() { | public String getSheetName() { | ||||
| return sheetName; | return sheetName; | ||||
| } | } | ||||
| public void setSheetName(String sheetName) { | public void setSheetName(String sheetName) { | ||||
| this.sheetName = sheetName; | this.sheetName = sheetName; | ||||
| } | } | ||||
| public Map<String, String> getHeaderMap() { | public Map<String, String> getHeaderMap() { | ||||
| return headerMap; | return headerMap; | ||||
| } | } | ||||
| public void setHeaderMap(Map<String, String> headerMap) { | public void setHeaderMap(Map<String, String> headerMap) { | ||||
| this.headerMap = headerMap; | this.headerMap = headerMap; | ||||
| } | } | ||||
| public List<?> getData() { | public List<?> getData() { | ||||
| return data; | return data; | ||||
| } | } | ||||
| public void setData(List<?> data) { | public void setData(List<?> data) { | ||||
| this.data = data; | this.data = data; | ||||
| } | } | ||||
| } | |||||
| } | |||||
| public void expoerDataExcel(HttpServletResponse response, ArrayList<String> titleKeyList, Map<String, String> titleMap, List<Map<String, Object>> src_list, String filename) throws IOException { | |||||
| String xlsFile_name = filename + ".xls"; //輸出xls檔名稱 | |||||
| //記憶體中只建立100個物件 | |||||
| Workbook wb = new SXSSFWorkbook(100); //關鍵語句 | |||||
| Sheet sheet = null; //工作表物件 | |||||
| Row nRow = null; //行物件 | |||||
| Cell nCell = null; //列物件 | |||||
| int rowNo = 0; //總行號 | |||||
| int pageRowNo = 0; //頁行號 | |||||
| for (int k = 0; k < src_list.size(); k++) { | |||||
| Map<String, Object> srcMap = src_list.get(k); | |||||
| //寫入300000條後切換到下個工作表 | |||||
| if (rowNo % 300000 == 0) { | |||||
| System.out.println("Current Sheet:" + rowNo / 300000); | |||||
| sheet = wb.createSheet("工作簿" + (rowNo / 300000));//建立新的sheet物件 | |||||
| sheet = wb.getSheetAt(rowNo / 300000); //動態指定當前的工作表 | |||||
| pageRowNo = 0; //新建了工作表,重置工作表的行號為0 | |||||
| // -----------定義表頭----------- | |||||
| nRow = sheet.createRow(pageRowNo++); | |||||
| // 列數 titleKeyList.size() | |||||
| for (int i = 0; i < titleKeyList.size(); i++) { | |||||
| Cell cell_tem = nRow.createCell(i); | |||||
| cell_tem.setCellValue(titleMap.get(titleKeyList.get(i))); | |||||
| } | |||||
| rowNo++; | |||||
| // --------------------------- | |||||
| } | |||||
| rowNo++; | |||||
| nRow = sheet.createRow(pageRowNo++); //新建行物件 | |||||
| // 行,獲取cell值 | |||||
| for (int j = 0; j < titleKeyList.size(); j++) { | |||||
| nCell = nRow.createCell(j); | |||||
| if (srcMap.get(titleKeyList.get(j)) != null) { | |||||
| nCell.setCellValue(srcMap.get(titleKeyList.get(j)).toString()); | |||||
| } else { | |||||
| nCell.setCellValue(""); | |||||
| } | |||||
| } | |||||
| } | |||||
| System.out.println(wb.getSheet("工作簿0").getRow(1)); | |||||
| response.setContentType("application/vnd.ms-excel;charset=utf-8"); | |||||
| response.setHeader("filename" , xlsFile_name); | |||||
| response.setHeader("Content-disposition" , "attachment;filename=" + xlsFile_name); | |||||
| response.flushBuffer(); | |||||
| OutputStream outputStream = response.getOutputStream(); | |||||
| wb.write(response.getOutputStream()); | |||||
| wb.close(); | |||||
| outputStream.flush(); | |||||
| outputStream.close(); | |||||
| } | |||||
| public void expoerDataExcelMultiSheet(HttpServletResponse response, Map<String, ArrayList<String>> titleKeyLists, Map<String, Map<String, String>> titleMaps, Map<String, List<Map<String, Object>>> src_lists, String filename) throws IOException { | |||||
| String xlsFile_name = "資產清冊.xls"; //輸出xls檔名稱 | |||||
| //記憶體中只建立100個物件 | |||||
| Workbook wb = new SXSSFWorkbook(100); //關鍵語句 | |||||
| Iterator<Map.Entry<String, List<Map<String, Object>>>> iterator = src_lists.entrySet().iterator(); | |||||
| while (iterator.hasNext()) { | |||||
| Sheet sheet = null; //工作表物件 | |||||
| Row nRow = null; //行物件 | |||||
| Cell nCell = null; //列物件 | |||||
| int rowNo = 0; //總行號 | |||||
| int pageRowNo = 0; //頁行號 | |||||
| Map.Entry<String, List<Map<String, Object>>> next = iterator.next(); | |||||
| String key = next.getKey(); | |||||
| List<Map<String, Object>> src_list = next.getValue(); | |||||
| for (int k = 0; k < src_list.size(); k++) { | |||||
| Map<String, Object> srcMap = src_list.get(k); | |||||
| //寫入300000條後切換到下個工作表 | |||||
| if (rowNo % 300000 == 0) { | |||||
| System.out.println("Current Sheet:" + key); | |||||
| sheet = wb.createSheet(key);//建立新的sheet物件 | |||||
| // sheet = wb.getSheetAt(k); //動態指定當前的工作表 | |||||
| pageRowNo = 0; //新建了工作表,重置工作表的行號為0 | |||||
| // -----------定義表頭----------- | |||||
| nRow = sheet.createRow(pageRowNo++); | |||||
| // 列數 titleKeyList.size() | |||||
| for (int i = 0; i < titleKeyLists.get(key).size(); i++) { | |||||
| Cell cell_tem = nRow.createCell(i); | |||||
| cell_tem.setCellValue(titleMaps.get(key).get(titleKeyLists.get(key).get(i))); | |||||
| } | |||||
| rowNo++; | |||||
| // --------------------------- | |||||
| } | |||||
| rowNo++; | |||||
| nRow = sheet.createRow(pageRowNo++); //新建行物件 | |||||
| // 行,獲取cell值 | |||||
| for (int j = 0; j < titleKeyLists.get(key).size(); j++) { | |||||
| nCell = nRow.createCell(j); | |||||
| if (srcMap.get(titleKeyLists.get(key).get(j)) != null) { | |||||
| nCell.setCellValue(srcMap.get(titleKeyLists.get(key).get(j)).toString()); | |||||
| } else { | |||||
| nCell.setCellValue(""); | |||||
| } | |||||
| } | |||||
| if (k == src_list.size() - 1) { | |||||
| rowNo = 0; | |||||
| pageRowNo = 0; | |||||
| } | |||||
| } | |||||
| } | |||||
| response.setContentType("application/vnd.ms-excel;charset=utf-8"); | |||||
| response.setHeader("filename" ,xlsFile_name); | |||||
| response.setHeader("Content-disposition" ,"attachment;filename="+xlsFile_name); | |||||
| response.flushBuffer(); | |||||
| OutputStream outputStream = response.getOutputStream(); | |||||
| wb.write(response.getOutputStream()); | |||||
| wb.close(); | |||||
| outputStream.flush(); | |||||
| outputStream.close(); | |||||
| } | |||||
| } | } | ||||