diff --git a/index.html b/index.html index 8b996f31..a8d72024 100644 --- a/index.html +++ b/index.html @@ -8,12 +8,12 @@ - - - - - - + + + + + +
diff --git a/public/assets/luckysheet/iconfont.css b/public/static/luckysheet/iconfont.css similarity index 100% rename from public/assets/luckysheet/iconfont.css rename to public/static/luckysheet/iconfont.css diff --git a/public/assets/luckysheet/luckysheet.css b/public/static/luckysheet/luckysheet.css similarity index 100% rename from public/assets/luckysheet/luckysheet.css rename to public/static/luckysheet/luckysheet.css diff --git a/public/assets/luckysheet/luckysheet.umd.js b/public/static/luckysheet/luckysheet.umd.js similarity index 100% rename from public/assets/luckysheet/luckysheet.umd.js rename to public/static/luckysheet/luckysheet.umd.js diff --git a/public/assets/luckysheet/plugin.js b/public/static/luckysheet/plugin.js similarity index 100% rename from public/assets/luckysheet/plugin.js rename to public/static/luckysheet/plugin.js diff --git a/public/assets/luckysheet/plugins.css b/public/static/luckysheet/plugins.css similarity index 100% rename from public/assets/luckysheet/plugins.css rename to public/static/luckysheet/plugins.css diff --git a/public/assets/luckysheet/pluginsCss.css b/public/static/luckysheet/pluginsCss.css similarity index 100% rename from public/assets/luckysheet/pluginsCss.css rename to public/static/luckysheet/pluginsCss.css diff --git a/src/api/harmonic-boot/luckyexcel.ts b/src/api/harmonic-boot/luckyexcel.ts new file mode 100644 index 00000000..9b715632 --- /dev/null +++ b/src/api/harmonic-boot/luckyexcel.ts @@ -0,0 +1,166 @@ +import createAxios from '@/utils/request' + +// 获取参数指标 +export function getIndex() { + return createAxios({ + url: '/harmonic-boot/customReport/reportChooseTree', + method: 'get' + }) +} +//、查询数据激活报表模板 +export function updateTemplateActive(data) { + return createAxios({ + url: '/harmonic-boot/customReport/updateTemplateActive', + method: 'post', + data + }) +} + +//获取报表模板 //部门树查询 +export function getTemplateList(data) { + return createAxios({ + url: '/harmonic-boot/customReport/getTemplateList', + // url:'/api3/harmonic-boot/customReport/getTemplateList', + method: 'post', + data + }) +} +//删除报表模板 +export function delTemplate(data) { + return createAxios({ + url: '/harmonic-boot/customReport/delTemplate', + method: 'post', + data + }) +} + +//修改获取数据 +export function getCustomReportTemplateById(params) { + return createAxios({ + url: '/harmonic-boot/customReport/getCustomReportTemplateById', + method: 'get', + params + }) +} + +//修改获取数据 +export function viewCustomReportTemplateById(params) { + return createAxios({ + url: '/harmonic-boot/customReport/viewCustomReportTemplateById', + method: 'get', + params + }) +} +//修改模板 +export function dateTemplateup(data) { + return createAxios({ + url: '/harmonic-boot/customReport/updateTemplate', + method: 'POST', + data + }) +} + +//新增报表模板 +export function addTemplate(data) { + return createAxios({ + url: '/harmonic-boot/customReport/addTemplate', + method: 'post', + data: data + }) +} +//模板对应指标替换 +export function getCustomReport(data) { + return createAxios({ + url: '/harmonic-boot/customReport/getCustomReport', + method: 'post', + resposeType: 'blob', + data + }) +} +//绑定模板 +export function updateBindTemplate(data) { + return createAxios({ + url: '/harmonic-boot/customReport/updateBindTemplate', + method: 'post', + data + }) +} +//根据模板ID查询数据 +export function getDataByTempId(params) { + return createAxios({ + url: '/harmonic-boot/customReport/getDataByTempId', + method: 'get', + params + }) +} +//根据部门查询模板 +export function getTemplateByDept(params) { + return createAxios({ + url: '/harmonic-boot/customReport/getTemplateByDept', + method: 'get', + params + }) +} +//资源管理 查询数据 +export function queryData(data) { + return createAxios({ + url: '/system-boot/resourceAdministration/queryData', + method: 'post', + data + }) +} +//资源管理 查询数据 +export function uploadFile(data) { + return createAxios({ + url: '/system-boot/resourceAdministration/uploadFile', + method: 'post', + data + }) +} +//资源管理 删除资源 +export function deleteFile(params) { + return createAxios({ + url: '/system-boot/resourceAdministration/deleteFile', + method: 'get', + params + }) +} +//资源管理 下载资源 +export function downloadFile(params) { + return createAxios({ + url: '/system-boot/resourceAdministration/downloadFile', + method: 'get', + params, + responseType: 'blob' + }) +} +//资源管理 修改资源 +export function updateFile(data) { + return createAxios({ + url: '/system-boot/resourceAdministration/updateFile', + method: 'post', + data + }) +} +//合格率报告 +export function pageTable(data) { + return createAxios({ + url: '/harmonic-boot/qualifiedReport/pageTable', + method: 'post', + data + }) +} +//合格率报告 +export function targetLimitChooseTree() { + return createAxios({ + url: '/harmonic-boot/customReport/targetLimitChooseTree', + method: 'get' + }) +} +//监测点指标 +export function terminalChooseTree() { + return createAxios({ + url: '/harmonic-boot/customReport/terminalChooseTree', + method: 'get' + }) +} diff --git a/src/api/system-boot/dictTree.ts b/src/api/system-boot/dictTree.ts index 2c45b882..d9180803 100644 --- a/src/api/system-boot/dictTree.ts +++ b/src/api/system-boot/dictTree.ts @@ -54,10 +54,18 @@ export const addDictTree = (data: any) => { // 编辑统计指标配置项 -export const updateStatistical = (data) => { +export const updateStatistical = (data:any) => { return createAxios({ url: '/system-boot/dic/update', method: 'PUT', data: data }) } +// 单位绑定 +export function codeDicTree(data:any) { + return createAxios({ + url: "/system-boot/dic/codeDicTree", + method: "get", + params: data, + }); + } \ No newline at end of file diff --git a/src/components/form/area/index.vue b/src/components/form/area/index.vue index 3d91d974..312b1077 100644 --- a/src/components/form/area/index.vue +++ b/src/components/form/area/index.vue @@ -21,9 +21,9 @@ const dictData = useDictData() const options = dictData.state.area const areaName = ref(dictData.state.area[0].name) const change = (e: any) => { - if (cascader.value.getCheckedNodes()[0].pathLabels.length == 1) { + if (cascader.value.getCheckedNodes()[0]?.pathLabels.length == 1) { areaName.value = cascader.value.getCheckedNodes()[0].pathLabels[0] - } else if (cascader.value.getCheckedNodes()[0].pathLabels.length >= 2) { + } else if (cascader.value.getCheckedNodes()[0]?.pathLabels.length >= 2) { areaName.value = cascader.value.getCheckedNodes()[0].pathLabels[1] } } diff --git a/src/stores/dictData.ts b/src/stores/dictData.ts index 34d1524c..e0d26d77 100644 --- a/src/stores/dictData.ts +++ b/src/stores/dictData.ts @@ -22,8 +22,10 @@ export const useDictData = defineStore( } return list } - const areaSelect = () => { - return state.areaTree.filter(item => item.id == state.area[0]?.area) + const areaSelect = () => { + let list = state.areaTree.filter(item => item.id == state.area[0]?.area) + + return list.length == 0 ? state.areaTree : list } return { diff --git a/src/utils/request.ts b/src/utils/request.ts index 3ca32f04..34ac9800 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -55,9 +55,9 @@ function createAxios>( // 请求拦截 Axios.interceptors.request.use( config => { - if(config.url?.substring(0, 13)=='/advance-boot'){ - config.url=config.url?.slice(13) - config.baseURL='/hzj' + if (config.url?.substring(0, 13) == '/advance-boot') { + config.url = config.url?.slice(13) + config.baseURL = '/hzj' } // 取消重复请求 removePending(config) @@ -93,6 +93,7 @@ function createAxios>( options.loading && closeLoading(options) // 关闭loading if ( + Array.isArray(response.data) || response.data.code === 'A0000' || response.data.type === 'application/json' || response.data.type === 'application/octet-stream' || diff --git a/src/views/system/reportForms/bind.vue b/src/views/system/reportForms/bind.vue new file mode 100644 index 00000000..2cb568e2 --- /dev/null +++ b/src/views/system/reportForms/bind.vue @@ -0,0 +1,108 @@ + + + diff --git a/src/views/system/reportForms/department.vue b/src/views/system/reportForms/department.vue new file mode 100644 index 00000000..3004ada9 --- /dev/null +++ b/src/views/system/reportForms/department.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/src/views/system/reportForms/export.js b/src/views/system/reportForms/export.js new file mode 100644 index 00000000..624676d5 --- /dev/null +++ b/src/views/system/reportForms/export.js @@ -0,0 +1,349 @@ +// import { createCellPos } from './translateNumToLetter' +import Excel from 'exceljs' + +import FileSaver from 'file-saver' + +const exportExcel = function(luckysheet, value) { + // 参数为luckysheet.getluckysheetfile()获取的对象 + // 1.创建工作簿,可以为工作簿添加属性 + const workbook = new Excel.Workbook() + // 2.创建表格,第二个参数可以配置创建什么样的工作表 + if (Object.prototype.toString.call(luckysheet) === '[object Object]') { + luckysheet = [luckysheet] + } + luckysheet.forEach(function(table) { + if (table.data.length === 0) return true + // ws.getCell('B2').fill = fills. + const worksheet = workbook.addWorksheet(table.name) + const merge = (table.config && table.config.merge) || {} + const borderInfo = (table.config && table.config.borderInfo) || {} + // 3.设置单元格合并,设置单元格边框,设置单元格样式,设置值 + setStyleAndValue(table.data, worksheet) + setMerge(merge, worksheet) + setBorder(borderInfo, worksheet) + return true + }) + + // return + // 4.写入 buffer + const buffer = workbook.xlsx.writeBuffer().then(data => { + // console.log('data', data) + const blob = new Blob([data], { + type: 'application/vnd.ms-excel;charset=utf-8' + }) + console.log("导出成功!") + FileSaver.saveAs(blob, `${value}.xlsx`) + }) + return buffer +} + +var setMerge = function(luckyMerge = {}, worksheet) { + const mergearr = Object.values(luckyMerge) + mergearr.forEach(function(elem) { + // elem格式:{r: 0, c: 0, rs: 1, cs: 2} + // 按开始行,开始列,结束行,结束列合并(相当于 K10:M12) + worksheet.mergeCells( + elem.r + 1, + elem.c + 1, + elem.r + elem.rs, + elem.c + elem.cs + ) + }) +} + +var setBorder = function(luckyBorderInfo, worksheet) { + if (!Array.isArray(luckyBorderInfo)) return + // console.log('luckyBorderInfo', luckyBorderInfo) + luckyBorderInfo.forEach(function(elem) { + // 现在只兼容到borderType 为range的情况 + // console.log('ele', elem) + if (elem.rangeType === 'range') { + let border = borderConvert(elem.borderType, elem.style, elem.color) + let rang = elem.range[0] + // console.log('range', rang) + let row = rang.row + let column = rang.column + for (let i = row[0] + 1; i < row[1] + 2; i++) { + for (let y = column[0] + 1; y < column[1] + 2; y++) { + worksheet.getCell(i, y).border = border + } + } + } + if (elem.rangeType === 'cell') { + // col_index: 2 + // row_index: 1 + // b: { + // color: '#d0d4e3' + // style: 1 + // } + const { col_index, row_index } = elem.value + const borderData = Object.assign({}, elem.value) + delete borderData.col_index + delete borderData.row_index + let border = addborderToCell(borderData, row_index, col_index) + // console.log('bordre', border, borderData) + worksheet.getCell(row_index + 1, col_index + 1).border = border + } + // console.log(rang.column_focus + 1, rang.row_focus + 1) + // worksheet.getCell(rang.row_focus + 1, rang.column_focus + 1).border = border + }) +} +var setStyleAndValue = function(cellArr, worksheet) { + if (!Array.isArray(cellArr)) return + cellArr.forEach(function(row, rowid) { + row.every(function(cell, columnid) { + if (!cell) return true + let fill = fillConvert(cell.bg) + + let font = fontConvert( + cell.ff, + cell.fc, + cell.bl, + cell.it, + cell.fs, + cell.cl, + cell.ul + ) + let alignment = alignmentConvert(cell.vt, cell.ht, cell.tb, cell.tr) + let value = '' + + if (cell.f) { + value = { formula: cell.f, result: cell.v } + } else if (!cell.v && cell.ct && cell.ct.s) { + // xls转为xlsx之后,内部存在不同的格式,都会进到富文本里,即值不存在与cell.v,而是存在于cell.ct.s之后 + // value = cell.ct.s[0].v + cell.ct.s.forEach(arr => { + value += arr.v + }) + } else { + value = cell.v + } + // style 填入到_value中可以实现填充色 + let letter = createCellPos(columnid) + let target = worksheet.getCell(letter + (rowid + 1)) + // console.log('1233', letter + (rowid + 1)) + for (const key in fill) { + target.fill = fill + break + } + target.font = font + target.alignment = alignment + target.value = value + + return true + }) + }) +} + +var fillConvert = function(bg) { + if (!bg) { + return {} + } + // const bgc = bg.replace('#', '') + let fill = { + type: 'pattern', + pattern: 'solid', + fgColor: { argb: bg.replace('#', '') } + } + return fill +} + +var fontConvert = function( + ff = 0, + fc = '#000000', + bl = 0, + it = 0, + fs = 10, + cl = 0, + ul = 0 +) { + // luckysheet:ff(样式), fc(颜色), bl(粗体), it(斜体), fs(大小), cl(删除线), ul(下划线) + const luckyToExcel = { + 0: '微软雅黑', + 1: '宋体(Song)', + 2: '黑体(ST Heiti)', + 3: '楷体(ST Kaiti)', + 4: '仿宋(ST FangSong)', + 5: '新宋体(ST Song)', + 6: '华文新魏', + 7: '华文行楷', + 8: '华文隶书', + 9: 'Arial', + 10: 'Times New Roman ', + 11: 'Tahoma ', + 12: 'Verdana', + num2bl: function(num) { + return num === 0 ? false : true + } + } + // 出现Bug,导入的时候ff为luckyToExcel的val + + let font = { + name: typeof ff === 'number' ? luckyToExcel[ff] : ff, + family: 1, + size: fs, + color: { argb: fc.replace('#', '') }, + bold: luckyToExcel.num2bl(bl), + italic: luckyToExcel.num2bl(it), + underline: luckyToExcel.num2bl(ul), + strike: luckyToExcel.num2bl(cl) + } + + return font +} + +var alignmentConvert = function( + vt = 'default', + ht = 'default', + tb = 'default', + tr = 'default' +) { + // luckysheet:vt(垂直), ht(水平), tb(换行), tr(旋转) + const luckyToExcel = { + vertical: { + 0: 'middle', + 1: 'top', + 2: 'bottom', + default: 'top' + }, + horizontal: { + 0: 'center', + 1: 'left', + 2: 'right', + default: 'left' + }, + wrapText: { + 0: false, + 1: false, + 2: true, + default: false + }, + textRotation: { + 0: 0, + 1: 45, + 2: -45, + 3: 'vertical', + 4: 90, + 5: -90, + default: 0 + } + } + + let alignment = { + vertical: luckyToExcel.vertical[vt], + horizontal: luckyToExcel.horizontal[ht], + wrapText: luckyToExcel.wrapText[tb], + textRotation: luckyToExcel.textRotation[tr] + } + return alignment +} + +var borderConvert = function(borderType, style = 1, color = '#000') { + // 对应luckysheet的config中borderinfo的的参数 + if (!borderType) { + return {} + } + const luckyToExcel = { + type: { + 'border-all': 'all', + 'border-top': 'top', + 'border-right': 'right', + 'border-bottom': 'bottom', + 'border-left': 'left' + }, + style: { + 0: 'none', + 1: 'thin', + 2: 'hair', + 3: 'dotted', + 4: 'dashDot', // 'Dashed', + 5: 'dashDot', + 6: 'dashDotDot', + 7: 'double', + 8: 'medium', + 9: 'mediumDashed', + 10: 'mediumDashDot', + 11: 'mediumDashDotDot', + 12: 'slantDashDot', + 13: 'thick' + } + } + let template = { + style: luckyToExcel.style[style], + color: { argb: color.replace('#', '') } + } + let border = {} + if (luckyToExcel.type[borderType] === 'all') { + border['top'] = template + border['right'] = template + border['bottom'] = template + border['left'] = template + } else { + border[luckyToExcel.type[borderType]] = template + } + // console.log('border', border) + return border +} + +function addborderToCell(borders, row_index, col_index) { + let border = {} + const luckyExcel = { + type: { + l: 'left', + r: 'right', + b: 'bottom', + t: 'top' + }, + style: { + 0: 'none', + 1: 'thin', + 2: 'hair', + 3: 'dotted', + 4: 'dashDot', // 'Dashed', + 5: 'dashDot', + 6: 'dashDotDot', + 7: 'double', + 8: 'medium', + 9: 'mediumDashed', + 10: 'mediumDashDot', + 11: 'mediumDashDotDot', + 12: 'slantDashDot', + 13: 'thick' + } + } + // console.log('borders', borders) + for (const bor in borders) { + // console.log(bor) + if (borders[bor].color.indexOf('rgb') === -1) { + border[luckyExcel.type[bor]] = { + style: luckyExcel.style[borders[bor].style], + color: { argb: borders[bor].color.replace('#', '') } + } + } else { + border[luckyExcel.type[bor]] = { + style: luckyExcel.style[borders[bor].style], + color: { argb: borders[bor].color } + } + } + } + + return border +} + +function createCellPos(n) { + let ordA = 'A'.charCodeAt(0) + + let ordZ = 'Z'.charCodeAt(0) + let len = ordZ - ordA + 1 + let s = '' + while (n >= 0) { + s = String.fromCharCode((n % len) + ordA) + s + + n = Math.floor(n / len) - 1 + } + return s +} + +export { + exportExcel +} \ No newline at end of file diff --git a/src/views/system/reportForms/form.vue b/src/views/system/reportForms/form.vue new file mode 100644 index 00000000..62069378 --- /dev/null +++ b/src/views/system/reportForms/form.vue @@ -0,0 +1,116 @@ + + + diff --git a/src/views/system/reportForms/index.vue b/src/views/system/reportForms/index.vue index ecb4dc0b..262b4f73 100644 --- a/src/views/system/reportForms/index.vue +++ b/src/views/system/reportForms/index.vue @@ -1,29 +1,133 @@ - diff --git a/src/views/system/reportForms/look.vue b/src/views/system/reportForms/look.vue new file mode 100644 index 00000000..d34b70db --- /dev/null +++ b/src/views/system/reportForms/look.vue @@ -0,0 +1,100 @@ + + + diff --git a/src/views/system/reportForms/luckysheet.vue b/src/views/system/reportForms/luckysheet.vue new file mode 100644 index 00000000..dcb1b4e8 --- /dev/null +++ b/src/views/system/reportForms/luckysheet.vue @@ -0,0 +1,144 @@ + + +