| package.json | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/api/Excel.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/components/UploadExcel/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/router/index.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/basicSettings/personList.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/basicSettings/roleList.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/systemSetting/dataImport.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/workOrder/workOrderClose.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
package.json
@@ -42,7 +42,8 @@ "vue-print-nb": "^1.7.5", "vue-router": "3.0.6", "vue-splitpane": "^1.0.6", "vuedraggable": "^2.24.3" "vuedraggable": "^2.24.3", "xlsx": "0.14.1" }, "devDependencies": { "@aspnet/signalr": "^1.0.27", src/api/Excel.js
@@ -1,6 +1,15 @@ import request from '@/utils/request' // Excelå¯¼å ¥æ¨¡æ¿ä¸è½½ // æ¥è¯¢excelæ¨¡æ¿ export function ExcelModelData(data) { return request({ url: 'ImportExcel/ExcelModelData', method: 'get', params: data }) } // ä¸è½½excelæ¨¡æ¿ export function DownLoadExcel(data) { return request({ url: 'ImportExcel/DownLoadExcel', @@ -9,29 +18,38 @@ }) } // Excelå¯¼å ¥æä»¶ä¸ä¼ ãæ¨¡æ¿éªè¯ãæ°æ®éãéªè¯ // Excelå¯¼å ¥æ°æ®æäº¤ã模æ¿éªè¯ export function ExcelModelCheck(data) { return request({ url: 'ImportExcel/ExcelModelCheck', method: 'post', params: data data }) } // Excelå¯¼å ¥æ°æ®éªè¯ export function ExcelCheckData(data) { return request({ url: 'ImportExcel/ExcelCheckData', method: 'post', params: data }) } // Excelå¯¼å ¥æ°æ® export function ExcelImportSubmit(data) { return request({ url: 'ImportExcel/ExcelImportSubmit', method: 'POST', params: data }) } // Excelå¯¼å ¥æä»¶ä¸ä¼ ãæ¨¡æ¿éªè¯ãæ°æ®éãéªè¯ // export function ExcelModelCheck(data) { // return request({ // url: 'ImportExcel/ExcelModelCheck', // method: 'post', // params: data // }) // } // // // Excelå¯¼å ¥æ°æ®éªè¯ // export function ExcelCheckData(data) { // return request({ // url: 'ImportExcel/ExcelCheckData', // method: 'post', // params: data // }) // } // // // Excelå¯¼å ¥æ°æ® // export function ExcelImportSubmit(data) { // return request({ // url: 'ImportExcel/ExcelImportSubmit', // method: 'POST', // params: data // }) // } src/components/UploadExcel/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,158 @@ <template> <div> <input ref="excel-upload-input" class="excel-upload-input" type="file" accept=".xlsx, .xls" @change="handleClick" > <el-button :loading="loading" style="margin-left:16px;" :disabled="disabled" type="primary" @click="handleUpload" > æä»¶ä¸ä¼ </el-button> </div> </template> <script> import XLSX from 'xlsx' export default { props: { disabled: Boolean, beforeUpload: Function, // eslint-disable-line onSuccess: Function// eslint-disable-line }, data() { return { loading: false, excelData: { header: null, results: null, sheetName: null } } }, methods: { generateData({ header, results }) { this.excelData.header = header // ç¨åel-table表头 this.excelData.results = results // ç¨åel-tableè¡¨ä½ this.onSuccess && this.onSuccess(this.excelData) // æ°ç»å¯¹è±¡æ´æ¢é®å // const aaa = JSON.parse(JSON.stringify(results)) // const bb = aaa.map(({ // åºå·, å§å // }) => ({ // index: åºå·, // name: å§å // })) // console.log(bb, 321) }, handleUpload() { this.$refs['excel-upload-input'].click() }, handleClick(e) { const files = e.target.files const rawFile = files[0] // only use files[0] if (!rawFile) return this.upload(rawFile) }, upload(rawFile) { this.$refs['excel-upload-input'].value = null // fix can't select the same excel if (!this.beforeUpload) { this.readerData(rawFile) return } const before = this.beforeUpload(rawFile) if (before) { // æ§è¡äº this.readerData(rawFile) } }, readerData(rawFile) { this.loading = true return new Promise((resolve, reject) => { const reader = new FileReader() reader.onload = e => { const data = e.target.result const workbook = XLSX.read(data, { type: 'array' }) let worksheet = [] const header = [] const results = [] workbook.SheetNames.forEach((item, index) => { worksheet = workbook.Sheets[item] header.push(this.getHeaderRow(worksheet)) results.push(XLSX.utils.sheet_to_json(worksheet)) }) this.excelData.sheetName = workbook.SheetNames // console.log(header) // console.log(results) // const firstSheetName = workbook.SheetNames[0] // const worksheet = workbook.Sheets[firstSheetName] // const header = this.getHeaderRow(worksheet) // const results = XLSX.utils.sheet_to_json(worksheet) this.generateData({ header, results }) this.loading = false resolve() } reader.readAsArrayBuffer(rawFile) }) }, getHeaderRow(sheet) { const headers = [] const range = XLSX.utils.decode_range(sheet['!ref']) let C const R = range.s.r /* start in the first row */ for (C = range.s.c; C <= range.e.c; ++C) { /* walk every column in the range */ const cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })] /* find the cell in the first row */ let hdr = 'UNKNOWN ' + C // <-- replace with your desired default if (cell && cell.t) hdr = XLSX.utils.format_cell(cell) headers.push(hdr) } return headers }, isExcel(file) { return /\.(xlsx|xls|csv)$/.test(file.name) } } } </script> <style scoped> .excel-upload-input { display: none; z-index: -9999; } .drop { border: 2px dashed #bbb; width: 600px; height: 160px; line-height: 160px; margin: 0 auto; font-size: 24px; border-radius: 5px; text-align: center; color: #bbb; position: relative; } </style> <style> /*.has-gutter{*/ /* color: #34bfa3 !important;*/ /*}*/ /*.is-leaf{*/ /* background-color: #34bfa3 !important;*/ /*}*/ </style> src/router/index.js
@@ -450,6 +450,13 @@ code: '0802', component: () => import('@/views/systemSetting/encodingRules'), meta: { code: '0802', title: 'ç¼ç è§å', icon: '', keepAlive: true } }, { path: 'dataImport', name: 'dataImportCancel', code: '0803', component: () => import('@/views/systemSetting/dataImport'), meta: { code: '0803', title: 'æ°æ®å¯¼å ¥', icon: '', keepAlive: true } } ] } src/views/basicSettings/personList.vue
@@ -149,8 +149,8 @@ sortable="custom" > <template slot-scope="{row}"> <el-tag v-if="row.status==='Y'" size="small" type="success">æ£å¸¸</el-tag> <el-tag v-if="row.status==='N'" size="small" type="danger">åç¨</el-tag> <el-tag v-if="row.status==='Y'" size="small" type="success">å¨è</el-tag> <el-tag v-if="row.status==='N'" size="small" type="danger">离è</el-tag> </template> </el-table-column> <el-table-column @@ -300,8 +300,8 @@ <el-form-item required label="ç¨æ·ç¶æ"> <el-radio-group v-model="dialogForm.status" style="width: 200px;"> <el-radio label="Y">æ£å¸¸</el-radio> <el-radio label="N">åç¨</el-radio> <el-radio label="Y">å¨è</el-radio> <el-radio label="N">离è</el-radio> </el-radio-group> </el-form-item> src/views/basicSettings/roleList.vue
@@ -190,55 +190,55 @@ <el-input v-model="dialogForm.rolename" style="width: 200px" /> </el-form-item> <!-- <el-form-item required label="æ°æ®èå´">--> <!-- <el-select--> <!-- v-model="dialogForm.datacode"--> <!-- style="width:200px"--> <!-- placeholder="è¯·éæ©"--> <!-- :popper-append-to-body="false"--> <!-- >--> <!-- <el-option--> <!-- v-for="item in datacodeArr"--> <!-- :key="item.datacode"--> <!-- :label="item.dataname"--> <!-- :value="item.datacode"--> <!-- />--> <!-- </el-select>--> <!-- </el-form-item>--> <!-- <el-form-item required label="æ°æ®èå´">--> <!-- <el-select--> <!-- v-model="dialogForm.datacode"--> <!-- style="width:200px"--> <!-- placeholder="è¯·éæ©"--> <!-- :popper-append-to-body="false"--> <!-- >--> <!-- <el-option--> <!-- v-for="item in datacodeArr"--> <!-- :key="item.datacode"--> <!-- :label="item.dataname"--> <!-- :value="item.datacode"--> <!-- />--> <!-- </el-select>--> <!-- </el-form-item>--> <el-form-item required label="ç¶æ"> <el-radio-group v-model="dialogForm.status" style="width: 200px"> <el-radio label="Y">æ£å¸¸</el-radio> <el-radio label="N">åç¨</el-radio> </el-radio-group> </el-form-item> <el-form-item v-if="dialogForm.datacode==='CUSTOM'" label="æ°æ®æé" style="margin: 0"> <el-checkbox-group v-model="checkboxGroupSelected" @change="checkboxGroupChange"> <el-checkbox v-for="item in checkboxGroup" :key="item" :label="item"> {{ item }} <el-tooltip class="item" effect="dark" content="å¾éç¶èç¹æ¯å¦åæ¶éä¸åèç¹" placement="top"> <i v-if="item==='ç¶åèå¨'" class="el-icon-question" /> </el-tooltip> </el-checkbox> </el-checkbox-group> </el-form-item> <el-card v-if="dialogForm.datacode==='CUSTOM'" class="box-card" shadow="never" style="margin-bottom: 30px;width: 78%;margin-left: 12%;" > <!-- <el-form-item v-if="dialogForm.datacode==='CUSTOM'" label="æ°æ®æé" style="margin: 0">--> <!-- <el-checkbox-group v-model="checkboxGroupSelected" @change="checkboxGroupChange">--> <!-- <el-checkbox v-for="item in checkboxGroup" :key="item" :label="item">--> <!-- {{ item }}--> <!-- <el-tooltip class="item" effect="dark" content="å¾éç¶èç¹æ¯å¦åæ¶éä¸åèç¹" placement="top">--> <!-- <i v-if="item==='ç¶åèå¨'" class="el-icon-question" />--> <!-- </el-tooltip>--> <!-- </el-checkbox>--> <!-- </el-checkbox-group>--> <!-- </el-form-item>--> <!-- <el-card--> <!-- v-if="dialogForm.datacode==='CUSTOM'"--> <!-- class="box-card"--> <!-- shadow="never"--> <!-- style="margin-bottom: 30px;width: 78%;margin-left: 12%;"--> <!-- >--> <el-tree ref="tree" :key="checkboxGroupSelected.toString()" :data="treeData" show-checkbox :check-strictly="!checkboxGroupSelected.includes('ç¶åèå¨')" :default-expand-all="checkboxGroupSelected.includes('å±å¼/æå ')" node-key="torg_code" :props="defaultProps" /> </el-card> <!-- <el-tree--> <!-- ref="tree"--> <!-- :key="checkboxGroupSelected.toString()"--> <!-- :data="treeData"--> <!-- show-checkbox--> <!-- :check-strictly="!checkboxGroupSelected.includes('ç¶åèå¨')"--> <!-- :default-expand-all="checkboxGroupSelected.includes('å±å¼/æå ')"--> <!-- node-key="torg_code"--> <!-- :props="defaultProps"--> <!-- />--> <!-- </el-card>--> <el-form-item label="夿³¨"> <el-input v-model="dialogForm.description" type="textarea" style="width:500px" /> src/views/systemSetting/dataImport.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,452 @@ <template> <div class="" :style="{height:mainHeight+'px'}"> <div style="display: flex;margin: 20px 10px;"> <el-select v-model="excelCode" style="width:200px" placeholder="è¯·éæ©æ¨¡æ¿æä»¶" :popper-append-to-body="false" clearable > <el-option v-for="item in excelArr" :key="item.fileCode" :label="item.fileName" :value="item.fileCode" /> </el-select> <el-button type="primary" style="margin-left: 20px" :disabled="excelCode===''" @click="getExcel" >ä¸è½½æ¨¡æ¿ </el-button> <upload-excel-component :on-success="handleSuccess" :before-upload="beforeUpload" :disabled="excelCode===''" /> <el-button type="info" style="margin-left: 20px" :disabled="excelCode===''" @click="reset" >éç½® </el-button> <el-button type="primary" style="margin-left: 20px" :disabled="excelCode===''" @click="submit" >æäº¤ </el-button> </div> <div v-if="sheetName.length>0" style="margin: 10px" > <el-tabs type="border-card"> <el-tab-pane v-for="(i,j) in sheetName" :key="i+j" :label="i" > <!-- height:(mainHeight-180)+'px',--> <el-table ref="tableDataRef" :data="tableData[j]" border :height="(mainHeight-180)+'px'" :header-cell-style="headerCellStyle" :cell-style="cellStyle" :style="{width: 100+'%',height:(mainHeight-180)+'px',zIndex:10}" style="overflow-y: scroll;" highlight-current-row > <!-- <el-table-column--> <!-- type="selection"--> <!-- width="55"--> <!-- />--> <el-table-column type="index" label="åºå·" width="55" fixed align="center" /> <el-table-column v-for="item of tableHeader[j]" :key="item" :prop="item" :label="item" align="center" :render-header="addRedStar" width="220" > <template slot-scope="{row}"> <div v-if="item.indexOf('ç¨æ·ç¼å·(å¯ä¸)')!==-1|| item.indexOf('ç¨æ·å§å')!==-1|| item.indexOf('å¯ç ')!==-1|| item.indexOf('ææºå·')!==-1|| item.indexOf('é®ç®±')!==-1 " > <el-input v-model="row[item]" placeholder="请è¾å ¥" /> </div> <div v-else-if="item.indexOf('å¨èç¶æ')!==-1"> <el-select v-model="row[item]" placeholder="è¯·éæ©" filterable clearable > <el-option v-for="item in statusArr" :key="item.code" :label="item.name" :value="item.code" /> </el-select> </div> <div v-else-if="item.indexOf('æå±å²ä½ç¼ç ')!==-1"> <el-select v-model="row[item]" style="width: 100%;" placeholder="è¯·éæ©" multiple filterable collapse-tags clearable > <el-option v-for="item in postArr" :key="item.postcode" :label="item.postname" :value="item.postcode" /> </el-select> </div> <div v-else-if="item.indexOf('æå±è§è²ç¼ç ')!==-1"> <el-select v-model="row[item]" style="width: 100%;" placeholder="è¯·éæ©" multiple filterable collapse-tags clearable > <el-option v-for="item in roleArr" :key="item.rolecode" :label="item.rolename" :value="item.rolecode" /> </el-select> </div> <div v-else-if="item.indexOf('æå±çç»ç¼ç ')!==-1"> <el-select v-model="row[item]" style="width: 100%;" placeholder="è¯·éæ©" collapse-tags multiple filterable clearable > <el-option v-for="item in groupArr" :key="item.usergroupcode" :label="item.usergroupname" :value="item.usergroupcode" /> </el-select> </div> <div v-else-if="item.indexOf('æå±ç»ç»ç¼ç ')!==-1"> <el-select v-model="row[item]" style="width: 100%;" placeholder="è¯·éæ©" filterable clearable > <el-option v-for="item in orgArr" :key="item.torg_code" :label="item.torg_name" :value="item.torg_code" /> </el-select> </div> <div v-else> {{ row[item] }}</div> </template> </el-table-column> <el-table-column label="æä½" width="120" fixed="right" /> </el-table> </el-tab-pane> </el-tabs> </div> <!-- <div v-for="(i,j) in tableHeader" :key="i">--> <!-- <el-table :data="tableData[j]" border highlight-current-row style="width: 100%;margin-top:20px;">--> <!-- <el-table-column v-for="item of tableHeader[j]" :key="item" :prop="item" :label="item" />--> <!-- </el-table>--> <!-- </div>--> </div> </template> <script> import UploadExcelComponent from '@/components/UploadExcel/index.vue' import { DownLoadExcel, ExcelModelCheck, ExcelModelData } from '@/api/Excel' import { GroupsPermissions, PostPermissions, PrentOrganization, RolePermissions } from '@/api/GeneralBasicData' export default { name: 'UploadExcel', components: { UploadExcelComponent }, data() { return { mainHeight: window.innerHeight - 85, tableData: [], tableHeader: [], sheetName: [], excelCode: '', excelArr: [], statusArr: [ { code: 'Y', name: 'å¨è' }, { code: 'N', name: '离è' } ], orgArr: [], // ç»ç» postArr: [], // å²ä½ roleArr: [], // è§è² groupArr: []// çç» } }, mounted() { this.getExcelModelData() this.getSelectArr() window.addEventListener('resize', this.getHeight) }, methods: { // è·å页é¢é«åº¦ getHeight() { this.$nextTick(() => { this.mainHeight = window.innerHeight - 85 // this.$nextTick(() => { // this.$refs.tableDataRef.doLayout() // }) }) }, async beforeUpload(file) { const isLt1M = file.size / 1024 / 1024 < 1 if (isLt1M) { return true } this.$message({ message: 'Please do not upload files larger than 1m in size.', type: 'warning' }) return false }, async handleSuccess({ results, header, sheetName }) { this.tableData = results this.tableHeader = header this.sheetName = sheetName // ç¨æ·æ¸ åå¯¼å ¥å¤æ if (this.sheetName.indexOf('ç¨æ·æ¸ å') !== -1) { const postArr = this.postArr.map(i => i.postcode) const roleArr = this.roleArr.map(i => i.rolecode) const groupArr = this.groupArr.map(i => i.usergroupcode) const orgArr = this.orgArr.map(i => i.torg_code) this.tableData[this.sheetName.indexOf('ç¨æ·æ¸ å')].forEach(j => { j.æå±å²ä½ç¼ç = j.æå±å²ä½ç¼ç .split(',').filter(e => postArr.includes(e)) j.æå±è§è²ç¼ç = j.æå±è§è²ç¼ç .split(',').filter(e => roleArr.includes(e)) j.æå±çç»ç¼ç = j.æå±çç»ç¼ç .split(',').filter(e => groupArr.includes(e)) j['*æå±ç»ç»ç¼ç '] = orgArr.includes(j['*æå±ç»ç»ç¼ç ']) ? j['*æå±ç»ç»ç¼ç '] : '' j['*å¨èç¶æ'] = this.statusArr.find(e => e.name === j['*å¨èç¶æ']).code }) } }, async getExcelModelData() { const { data: res } = await ExcelModelData() this.excelArr = res }, async getExcel() { const res = await DownLoadExcel({ FileCode: this.excelCode }) window.location.href = res.data }, submit() { // console.log(this.excelCode) // console.log(JSON.stringify(this.sheetName)) // console.log(JSON.stringify(this.tableHeader)) // console.log(JSON.stringify(this.tableData)) this.$confirm('æ¯å¦ç¡®è®¤æäº¤?', 'æç¤º', { confirmButtonText: 'ç¡®å®', cancelButtonText: 'åæ¶', type: 'warning' }).then(() => { let flag = true let msg = '' if (this.sheetName.indexOf('ç¨æ·æ¸ å') !== -1) { // if ([...new Set(this.tableData[0].filter(i => i['*ç¨æ·ç¼å·(å¯ä¸)'] !== '').map(i => i['*ç¨æ·ç¼å·(å¯ä¸)']))].length !== this.tableData[0].length) { if ([...new Set(this.tableData[0].map(i => i['*ç¨æ·ç¼å·(å¯ä¸)']))].length !== this.tableData[0].length) { return this.$message.info('ç¼ç ä¸è½éå¤ï¼') } this.tableData[0].forEach(j => { if (j['*ç¨æ·ç¼å·(å¯ä¸)'].trim() === '') { flag = false msg = '*ç¨æ·ç¼å·(å¯ä¸)' } if (j['*ç¨æ·å§å'].trim() === '') { flag = false msg = '*ç¨æ·å§å' } if (j['*å¯ç '].trim() === '') { flag = false msg = '*å¯ç ' } if (j['*å¨èç¶æ'].trim() === '') { flag = false msg = '*å¨èç¶æ' } if (j['*æå±ç»ç»ç¼ç '].trim() === '') { flag = false msg = '*æå±ç»ç»ç¼ç ' } }) if (!flag) { return this.$message.info(msg + 'ä¸è½ä¸ºç©ºï¼') } this.tableData[0].forEach(j => { j.æå±å²ä½ç¼ç = j.æå±å²ä½ç¼ç .join(',') j.æå±çç»ç¼ç = j.æå±çç»ç¼ç .join(',') j.æå±è§è²ç¼ç = j.æå±è§è²ç¼ç .join(',') }) } const data = { fileCode: this.excelCode, tableData: this.tableData } // console.log(JSON.stringify(this.tableData)) ExcelModelCheck(data).then(res => { if (res.code === '200') { this.$notify.success('æäº¤æå!') this.tableData = [] this.tableHeader = [] this.sheetName = [] this.excelCode = '' } }) }).catch(() => { this.$notify.info('已忶æäº¤ï¼') }) }, reset() { this.tableData = [] this.tableHeader = [] this.sheetName = [] this.excelCode = '' }, async getSelectArr() { await this.getPrentOrganization() await this.getPostPermissions() await this.getRolePermissions() await this.getGroupsPermissions() }, // ç»ç»æ¶æçº§èéæ©å¨ async getPrentOrganization() { const { data: res } = await PrentOrganization() this.orgArr = res // this.cascaderOptions = arrayToTree(res, { // parentProperty: 'parent_id', // customID: 'torg_code', // childrenProperty: 'children' // }) }, // è·åå²ä½ä¸ææ°ç» async getPostPermissions() { const { data: res } = await PostPermissions() this.postArr = res }, // è·åè§è²ä¸ææ°ç» async getRolePermissions() { const { data: res } = await RolePermissions() this.roleArr = res }, // è·åçç»ä¸ææ°ç» async getGroupsPermissions() { const { data: res } = await GroupsPermissions() this.groupArr = res }, headerCellStyle({ row, column, rowIndex, columnIndex }) { let string = '' if (column.label.indexOf('*') !== -1 && rowIndex === 0) { string = 'background:#ffc000;' } else if (column.label.indexOf('*') === -1 && rowIndex === 0) { string = 'background:#00b0f0;' } return string + 'padding: 5px 0; fontWeight: 500;' }, cellStyle() { const option = { padding: '5px 0' } return option }, addRedStar(h, { column }) { if (column.label.indexOf('*') !== -1) { // å¿ å¡«åæ®µ return [ h('span', { style: 'color:#F56C6C' }, ' * '), h('span', { style: 'color:#FFF' }, column.label.substring(1)) ] } else { // éå¿ å¡«åæ®µ return [ // h('span', { style: 'color:#F56C6C' }, ' * '), h('span', { style: 'color:#FFF' }, column.label) ] } } } } </script> <style scoped lang="scss"> //::v-deep .el-table__body-wrapper { //overflow-y: auto; //overflow-x: scroll !important; //height: calc(100% - 34px); //width: 100% !important; //} </style> src/views/workOrder/workOrderClose.vue
@@ -1,11 +0,0 @@ <template /> <script> export default { name: 'WorkOrderClose' } </script> <style scoped> </style>