diff --git a/epmet-oper-web/package.json b/epmet-oper-web/package.json index 0e923ff..0e962f9 100644 --- a/epmet-oper-web/package.json +++ b/epmet-oper-web/package.json @@ -20,6 +20,7 @@ "babel-plugin-component": "^1.1.1", "element-theme": "^2.0.1", "element-ui": "^2.13.0", + "file-saver": "^2.0.5", "gulp-autoprefixer": "^6.1.0", "gulp-clean-css": "^4.2.0", "gulp-load-plugins": "^2.0.0", @@ -41,7 +42,8 @@ "vue-i18n": "^8.12.0", "vue-quill-editor": "^3.0.6", "vue-router": "^3.0.7", - "vuex": "^3.1.1" + "vuex": "^3.1.1", + "xlsx": "^0.17.1" }, "devDependencies": { "@vue/cli-plugin-babel": "^3.10.0", @@ -51,6 +53,7 @@ "dai-js": "^0.0.12", "element-theme-chalk": "^2.13.0", "natives": "^1.1.6", + "script-loader": "^0.7.2", "vue-template-compiler": "^2.6.11" }, "eslintConfig": { diff --git a/epmet-oper-web/src/js/ajax.js b/epmet-oper-web/src/js/ajax.js index ddde10e..1982261 100644 --- a/epmet-oper-web/src/js/ajax.js +++ b/epmet-oper-web/src/js/ajax.js @@ -394,21 +394,22 @@ export default { responseType: 'blob', }) .then((res) => { + if (res) { if (res.status === 200) { var data = res.data //直接返回blob - if (data.code == 0) { + // if (data.code == 0) { //业务成功 if (typeof cb_su === 'function') { - cb_su(data.data, data.msg) + cb_su(data) } - } else { + else { //业务失败 - if (typeof cb_err === 'function') cb_err(errorMsg) - } - } else { - if (typeof cb_err === 'function') cb_err(errorMsg) + if (typeof cb_err === 'function') cb_err(errorMsg) + } + // } else { + // if (typeof cb_err === 'function') cb_err(errorMsg) } } else { if (typeof cb_err === 'function') cb_err(errorMsg) diff --git a/epmet-oper-web/src/js/columns/columns.js b/epmet-oper-web/src/js/columns/columns.js index 10e218e..b087050 100644 --- a/epmet-oper-web/src/js/columns/columns.js +++ b/epmet-oper-web/src/js/columns/columns.js @@ -22,6 +22,9 @@ import partnerApp from './miniPro/partnerApp' // pcWork import GuidanceList from './pcWork/guidanceList' +//数据统计 +import OperStaticList from './dataReport/operStatic' + export default { CustomerList: CustomerList['list'], // 客户管理——客户管理——客户列表 ConfigForm: CustomerList['configForm'], // 客户管理——客户管理——配置 @@ -47,5 +50,8 @@ export default { partner, // 外部客户应用 //pcWork - guidanceList:GuidanceList + guidanceList:GuidanceList, + + //数据统计 + operStaticList:OperStaticList } diff --git a/epmet-oper-web/src/js/columns/dataReport/operStatic.js b/epmet-oper-web/src/js/columns/dataReport/operStatic.js new file mode 100644 index 0000000..06a037f --- /dev/null +++ b/epmet-oper-web/src/js/columns/dataReport/operStatic.js @@ -0,0 +1,75 @@ +const width=80 +export default [ + { + key: 'orgName', + title: '组织', + display: ['formA', 'formU', 'table', 'model'], + width: width + }, + { + key: 'userCount', + title: '用户数', + display: ['formA', 'formU', 'table', 'model'], + width: width + }, + { + key: 'resiCount', + title: '居民数', + display: ['formA', 'formU', 'table', 'model'], + width: width + }, + { + key: 'partyCount', + title: '党员数', + display: ['formA', 'formU', 'table', 'model'], + width: width + }, + { + key: 'groupCount', + title: '小组数', + display: ['formA', 'formU', 'table', 'model'], + width: width + }, + { + key: 'topicCount', + title: '话题数', + display: ['formA', 'formU', 'table', 'model'], + width: width + }, + { + key: 'issueCount', + title: '议题数', + display: ['formA', 'formU', 'table', 'model'], + width: width + }, + { + key: 'projectCount', + title: '项目数', + display: ['formA', 'formU', 'table', 'model'], + width: width + }, + { + key: 'closedProjectCount', + title: '结案项目数', + display: ['formA', 'formU', 'table', 'model'], + width: width + }, + { + key: 'patrolPeopleCount', + title: '巡查人数', + display: ['formA', 'formU', 'table', 'model'], + width: width + }, + { + key: 'patrolCount', + title: '巡查次数', + display: ['formA', 'formU', 'table', 'model'], + width: width + }, + { + key: 'patrolDuration', + title: '巡查时长', + display: ['formA', 'formU', 'table', 'model'], + width: width + } +] diff --git a/epmet-oper-web/src/js/util.js b/epmet-oper-web/src/js/util.js index c4a66f1..333f035 100644 --- a/epmet-oper-web/src/js/util.js +++ b/epmet-oper-web/src/js/util.js @@ -123,7 +123,7 @@ export default { }, //日期时间格式转化工具类 - dateFormatter(str) { + dateFormatter(str,type) { //默认返回yyyy-MM-dd HH-mm-ss var hasTime = arguments[1] != false ? true : false //可传第二个参数false,返回yyyy-MM-dd var d = new Date(str) @@ -134,7 +134,7 @@ export default { var hour = d.getHours() < 10 ? '0' + d.getHours() : d.getHours() var minute = d.getMinutes() < 10 ? '0' + d.getMinutes() : d.getMinutes() var second = d.getSeconds() < 10 ? '0' + d.getSeconds() : d.getSeconds() - if (hasTime) { + if (type==='time' && hasTime) { return ( [year, month, day].join('-') + ' ' + [hour, minute, second].join(':') ) diff --git a/epmet-oper-web/src/vendor/Blob.js b/epmet-oper-web/src/vendor/Blob.js new file mode 100644 index 0000000..62d8d06 --- /dev/null +++ b/epmet-oper-web/src/vendor/Blob.js @@ -0,0 +1,211 @@ +/* eslint-disable */ +/* Blob.js*/ + +/*global self, unescape */ +/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true, + plusplus: true */ + +/*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */ + +(function (view) { + "use strict"; + + view.URL = view.URL || view.webkitURL; + + if (view.Blob && view.URL) { + try { + new Blob; + return; + } catch (e) { + } + } + + // Internally we use a BlobBuilder implementation to base Blob off of + // in order to support older browsers that only have BlobBuilder + var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function (view) { + var + get_class = function (object) { + return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1]; + } + , FakeBlobBuilder = function BlobBuilder() { + this.data = []; + } + , FakeBlob = function Blob(data, type, encoding) { + this.data = data; + this.size = data.length; + this.type = type; + this.encoding = encoding; + } + , FBB_proto = FakeBlobBuilder.prototype + , FB_proto = FakeBlob.prototype + , FileReaderSync = view.FileReaderSync + , FileException = function (type) { + this.code = this[this.name = type]; + } + , file_ex_codes = ( + "NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR " + + "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR" + ).split(" ") + , file_ex_code = file_ex_codes.length + , real_URL = view.URL || view.webkitURL || view + , real_create_object_URL = real_URL.createObjectURL + , real_revoke_object_URL = real_URL.revokeObjectURL + , URL = real_URL + , btoa = view.btoa + , atob = view.atob + + , ArrayBuffer = view.ArrayBuffer + , Uint8Array = view.Uint8Array + + , origin = /^[\w-]+:\/*\[?[\w\.:-]+\]?(?::[0-9]+)?/ + ; + FakeBlob.fake = FB_proto.fake = true; + while (file_ex_code--) { + FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1; + } + // Polyfill URL + if (!real_URL.createObjectURL) { + URL = view.URL = function (uri) { + var + uri_info = document.createElementNS("http://www.w3.org/1999/xhtml", "a") + , uri_origin + ; + uri_info.href = uri; + if (!("origin" in uri_info)) { + if (uri_info.protocol.toLowerCase() === "data:") { + uri_info.origin = null; + } else { + uri_origin = uri.match(origin); + uri_info.origin = uri_origin && uri_origin[1]; + } + } + return uri_info; + }; + } + URL.createObjectURL = function (blob) { + var + type = blob.type + , data_URI_header + ; + if (type === null) { + type = "application/octet-stream"; + } + if (blob instanceof FakeBlob) { + data_URI_header = "data:" + type; + if (blob.encoding === "base64") { + return data_URI_header + ";base64," + blob.data; + } else if (blob.encoding === "URI") { + return data_URI_header + "," + decodeURIComponent(blob.data); + } + if (btoa) { + return data_URI_header + ";base64," + btoa(blob.data); + } else { + return data_URI_header + "," + encodeURIComponent(blob.data); + } + } else if (real_create_object_URL) { + return real_create_object_URL.call(real_URL, blob); + } + }; + URL.revokeObjectURL = function (object_URL) { + if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) { + real_revoke_object_URL.call(real_URL, object_URL); + } + }; + FBB_proto.append = function (data/*, endings*/) { + var bb = this.data; + // decode data to a binary string + if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) { + var + str = "" + , buf = new Uint8Array(data) + , i = 0 + , buf_len = buf.length + ; + for (; i < buf_len; i++) { + str += String.fromCharCode(buf[i]); + } + bb.push(str); + } else if (get_class(data) === "Blob" || get_class(data) === "File") { + if (FileReaderSync) { + var fr = new FileReaderSync; + bb.push(fr.readAsBinaryString(data)); + } else { + // async FileReader won't work as BlobBuilder is sync + throw new FileException("NOT_READABLE_ERR"); + } + } else if (data instanceof FakeBlob) { + if (data.encoding === "base64" && atob) { + bb.push(atob(data.data)); + } else if (data.encoding === "URI") { + bb.push(decodeURIComponent(data.data)); + } else if (data.encoding === "raw") { + bb.push(data.data); + } + } else { + if (typeof data !== "string") { + data += ""; // convert unsupported types to strings + } + // decode UTF-16 to binary string + bb.push(unescape(encodeURIComponent(data))); + } + }; + FBB_proto.getBlob = function (type) { + if (!arguments.length) { + type = null; + } + return new FakeBlob(this.data.join(""), type, "raw"); + }; + FBB_proto.toString = function () { + return "[object BlobBuilder]"; + }; + FB_proto.slice = function (start, end, type) { + var args = arguments.length; + if (args < 3) { + type = null; + } + return new FakeBlob( + this.data.slice(start, args > 1 ? end : this.data.length) + , type + , this.encoding + ); + }; + FB_proto.toString = function () { + return "[object Blob]"; + }; + FB_proto.close = function () { + this.size = 0; + delete this.data; + }; + return FakeBlobBuilder; + }(view)); + + view.Blob = function (blobParts, options) { + var type = options ? (options.type || "") : ""; + var builder = new BlobBuilder(); + if (blobParts) { + for (var i = 0, len = blobParts.length; i < len; i++) { + if (Uint8Array && blobParts[i] instanceof Uint8Array) { + builder.append(blobParts[i].buffer); + } + else { + builder.append(blobParts[i]); + } + } + } + var blob = builder.getBlob(type); + if (!blob.slice && blob.webkitSlice) { + blob.slice = blob.webkitSlice; + } + return blob; + }; + + var getPrototypeOf = Object.getPrototypeOf || function (object) { + return object.__proto__; + }; + view.Blob.prototype = getPrototypeOf(new view.Blob()); +}( + typeof self !== "undefined" && self + || typeof window !== "undefined" && window + || this +)); + diff --git a/epmet-oper-web/src/vendor/Export2Excel.js b/epmet-oper-web/src/vendor/Export2Excel.js new file mode 100644 index 0000000..6ce026c --- /dev/null +++ b/epmet-oper-web/src/vendor/Export2Excel.js @@ -0,0 +1,158 @@ +/* eslint-disable */ +require('script-loader!file-saver'); +// 注意,更改vendor目录此处导入需修改!!!!!!!!!!!!!!!!!!!! +/* eslint-disable */ +require('script-loader!@/vendor/Blob'); +/* eslint-disable */ +require('script-loader!xlsx/dist/xlsx.core.min'); + +function generateArray(table) { + var out = []; + var rows = table.querySelectorAll('tr'); + var ranges = []; + for (var R = 0; R < rows.length; ++R) { + var outRow = []; + var row = rows[R]; + var columns = row.querySelectorAll('td'); + for (var C = 0; C < columns.length; ++C) { + var cell = columns[C]; + var colspan = cell.getAttribute('colspan'); + var rowspan = cell.getAttribute('rowspan'); + var cellValue = cell.innerText; + if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue; + + //Skip ranges + ranges.forEach(function (range) { + if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) { + for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null); + } + }); + + //Handle Row Span + if (rowspan || colspan) { + rowspan = rowspan || 1; + colspan = colspan || 1; + ranges.push({s: {r: R, c: outRow.length}, e: {r: R + rowspan - 1, c: outRow.length + colspan - 1}}); + } + ; + + //Handle Value + outRow.push(cellValue !== "" ? cellValue : null); + + //Handle Colspan + if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null); + } + out.push(outRow); + } + return [out, ranges]; +}; + +function datenum(v, date1904) { + if (date1904) v += 1462; + var epoch = Date.parse(v); + return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000); +} + +function sheet_from_array_of_arrays(data, opts) { + var ws = {}; + var range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0}}; + for (var R = 0; R != data.length; ++R) { + for (var C = 0; C != data[R].length; ++C) { + if (range.s.r > R) range.s.r = R; + if (range.s.c > C) range.s.c = C; + if (range.e.r < R) range.e.r = R; + if (range.e.c < C) range.e.c = C; + var cell = {v: data[R][C]}; + if (cell.v == null) continue; + var cell_ref = XLSX.utils.encode_cell({c: C, r: R}); + + if (typeof cell.v === 'number') cell.t = 'n'; + else if (typeof cell.v === 'boolean') cell.t = 'b'; + else if (cell.v instanceof Date) { + cell.t = 'n'; + cell.z = XLSX.SSF._table[14]; + cell.v = datenum(cell.v); + } + else cell.t = 's'; + + ws[cell_ref] = cell; + } + } + if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range); + return ws; +} + +function Workbook() { + if (!(this instanceof Workbook)) return new Workbook(); + this.SheetNames = []; + this.Sheets = {}; +} + +function s2ab(s) { + var buf = new ArrayBuffer(s.length); + var view = new Uint8Array(buf); + for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; + return buf; +} + +export function export_table_to_excel(id) { + var theTable = document.getElementById(id); + console.log('a') + var oo = generateArray(theTable); + var ranges = oo[1]; + + /* original data */ + var data = oo[0]; + var ws_name = "SheetJS"; + console.log(data); + + var wb = new Workbook(), ws = sheet_from_array_of_arrays(data); + + /* add ranges to worksheet */ + // ws['!cols'] = ['apple', 'banan']; + ws['!merges'] = ranges; + + /* add worksheet to workbook */ + wb.SheetNames.push(ws_name); + wb.Sheets[ws_name] = ws; + + var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'}); + + saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), "test.xlsx") +} + +function formatJson(jsonData) { + console.log(jsonData) +} + +export function export_json_to_excel(th1, th, jsonData, defaultTitle) { + + /* original data */ + + var data = jsonData; + // 第二行表头 + data.unshift(th); + // 第一行表头 + data.unshift(th1) + // 这个地方定义sheet名,可更改 + var ws_name = "SheetJS"; + + var wb = new Workbook(), ws = sheet_from_array_of_arrays(data); + + + /* add worksheet to workbook */ + wb.SheetNames.push(ws_name); + wb.Sheets[ws_name] = ws; + + // 设置合并单元格,注意预留空值,否则合并后值会被覆盖 + ws['!merges'] = [ + // 设置A3-A9的单元格合并 + {s: {r: 0, c: 0}, e: {r: 0, c: 11}} + ]; + + var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'}); + var title = defaultTitle || '列表' + saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), title + ".xlsx") +} + + diff --git a/epmet-oper-web/src/views/modules/dataExport/operStatic.vue b/epmet-oper-web/src/views/modules/dataExport/operStatic.vue new file mode 100644 index 0000000..905a92a --- /dev/null +++ b/epmet-oper-web/src/views/modules/dataExport/operStatic.vue @@ -0,0 +1,433 @@ + + + + + diff --git a/epmet-oper-web/src/views/modules/workPc/guidance/DetailForm.vue b/epmet-oper-web/src/views/modules/workPc/guidance/DetailForm.vue index af5b3ec..6171502 100644 --- a/epmet-oper-web/src/views/modules/workPc/guidance/DetailForm.vue +++ b/epmet-oper-web/src/views/modules/workPc/guidance/DetailForm.vue @@ -63,6 +63,7 @@ :label="item.moduleName" :name="item.moduleId"> 0) { + this.externalLink = data.externalLinks[0] + } + if (data.attachmentList) { + this.fileList = data.attachmentList + } + + if (data.moduleList && data.moduleList.length > 0) { + this.moduleArray = data.moduleList + } + + console.log(this.moduleArray) } else { this.$message.error(msg) @@ -328,22 +348,22 @@ export default { console.log(this.dataForm) + // return false + this.$refs['dataForm'].validate((valid, messageObj) => { if (!valid) { app.util.validateRule(messageObj) } else { let url = '' - - if (this.type === 'U') { - url = '/gov/voice/guide/update' - // url = 'http://yapi.elinkservice.cn/mock/102/gov/voice/guide/update' + if (this.formType === 'U') { + url = '/gov/voice/guide/edit' + // url = 'http://yapi.elinkservice.cn/mock/102/gov/voice/guide/edit' } else { url = "/gov/voice/guide/add" // url = "http://yapi.elinkservice.cn/mock/102/gov/voice/guide/add" - - } + window.app.ajax.post(url, this.dataForm, (data, rspMsg) => { this.$message({ @@ -363,6 +383,17 @@ export default { resetData () { + this.moduleArray = [] + // this.moduleArray.forEach(element => { + // if (element.moduleContent) { + // element.moduleContent = '' + // } + // }); + this.externalLink = { + externalLink: "", + description: "" + } + this.fileList = [] this.dataForm = { guideId: '', title: '', @@ -395,6 +426,8 @@ export default { return false } + + // if (!isLt2M) { // this.$message.warning('上传模板大小不能超过 5MB!') // return @@ -411,9 +444,13 @@ export default { }, handleFileSuccess (res, file) { - // debugger + if (res.code === 0 && res.msg === 'success') { + const array = file.name.split('.') + const fileType = array[array.length - 1] + file.url = res.data.url + file.type = fileType this.fileList.push(file) console.log(this.fileList) } else this.$message.error(res.msg) @@ -448,7 +485,6 @@ export default { ], orgId: [ { required: true, message: '发布单位不能为空', trigger: 'blur' } - ], title: [ { required: true, message: '标题不能为空', trigger: 'blur' } diff --git a/epmet-oper-web/src/views/modules/workPc/guidance/guidanceList.vue b/epmet-oper-web/src/views/modules/workPc/guidance/guidanceList.vue index ef7dfd2..fd9e816 100644 --- a/epmet-oper-web/src/views/modules/workPc/guidance/guidanceList.vue +++ b/epmet-oper-web/src/views/modules/workPc/guidance/guidanceList.vue @@ -319,12 +319,12 @@ export default { plain: false, methodName: 'edit', // 回调方法名称 isShow: (row) => { - return true - // if (row.initState === 1) { - // return true - // } else { - // return false - // } + // return true + if (row.createdId === this.userId) { + return true + } else { + return false + } } }, { @@ -336,7 +336,11 @@ export default { plain: false, methodName: 'confirmDel', // 回调方法名称 isShow: (row) => { - return true + if (row.createdId === this.userId) { + return true + } else { + return false + } } } ],