hujunwei 2 年之前
父節點
當前提交
3430ddb71f

+ 2 - 2
public/index.html

@@ -25,8 +25,8 @@
   <div id="app"></div>
   <!-- built files will be auto injected -->
   <script type="text/javascript">
-    window.staticHost = 'http://10.230.26.15:8000/mkt'; // 正式
-    // window.staticHost = 'http://10.149.85.90:8000/spfm'; // 测试
+    // window.staticHost = 'http://10.230.26.15:8000/mkt'; // 正式
+    window.staticHost = 'http://10.149.85.91:8000/spfm'; // 测试
     // window.staticHost = 'http://192.168.0.103:9600/';
     // window.staticHost = 'http://192.168.2.142:9600/';
     

File diff suppressed because it is too large
+ 526 - 0
public/static/views/onlineShareExcel.html


File diff suppressed because it is too large
+ 604 - 0
public/static/views/stockHandle.html


File diff suppressed because it is too large
+ 1276 - 0
src/pages/main/apkTestMain/index.vue


+ 360 - 0
src/pages/main/competitor/components/export.js

@@ -0,0 +1,360 @@
+// import { createCellPos } from './translateNumToLetter'
+
+
+function colorRGBtoHex(color) {
+	var rgb = color.split(',');
+	var r = parseInt(rgb[0].split('(')[1]);
+	var g = parseInt(rgb[1]);
+	var b = parseInt(rgb[2].split(')')[0]);
+	var hex = "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
+	return hex;
+}
+const ExcelJS =require("exceljs" )  
+const saveAs = require('file-saver')
+function exportExcel(luckysheet, value) {
+	// 参数为luckysheet.getluckysheetfile()获取的对象
+	// 1.创建工作簿,可以为工作簿添加属性
+	var workbook = new ExcelJS.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.
+		var worksheet = workbook.addWorksheet(table.name)
+		var merge = (table.config && table.config.merge) || {}
+		var borderInfo = (table.config && table.config.borderInfo) || {}
+		// 3.设置单元格合并,设置单元格边框,设置单元格样式,设置值
+		setStyleAndValue(table.data, worksheet)
+		setMerge(merge, worksheet)
+		setBorder(borderInfo, worksheet)
+		return true
+	})
+
+	// return
+	// 4.写入 buffer
+	var buffer = workbook.xlsx.writeBuffer().then(function(data) {
+		var blob = new Blob([data], {
+			type: 'application/vnd.ms-excel;charset=utf-8'
+		})
+		saveAs(blob, value + '.xlsx')
+	})
+	return buffer
+}
+var setMerge = function(luckyMerge, worksheet) {
+	var 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
+	luckyBorderInfo.forEach(function(elem) {
+		// 现在只兼容到borderType 为range的情况
+		if (elem.rangeType === 'range') {
+			let border = borderConvert(elem.borderType, elem.style, elem.color)
+			let rang = elem.range[0]
+			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
+			// }
+			var col_index = elem.value.col_index
+			var row_index = elem.value.row_index
+			var borderData = Object.assign({}, elem.value)
+			delete borderData.col_index
+			delete borderData.row_index
+			let border = addborderToCell(borderData, row_index, col_index)
+			worksheet.getCell(row_index + 1, col_index + 1).border = border
+		}
+		// 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(function(arr) {
+					value += arr.v
+				})
+			} else {
+				value = cell.m //
+				console.log(value)
+			}
+			//  style 填入到_value中可以实现填充色
+			let letter = createCellPos(columnid)
+			let target = worksheet.getCell(letter + (rowid + 1))
+			for (var 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 {}
+	}
+	// var bgc = bg.replace('#', '')
+	if (bg.indexOf('#') == -1) {
+		bg = colorRGBtoHex(bg)
+	}
+	let fill = {
+		type: 'pattern',
+		pattern: 'solid',
+		fgColor: {
+			argb: bg.replace('#', '')
+		}
+	}
+	return fill
+}
+
+var fontConvert = function(
+	ff,
+	fc,
+	bl,
+	it,
+	fs,
+	cl,
+	ul
+) {
+	// luckysheet:ff(样式), fc(颜色), bl(粗体), it(斜体), fs(大小), cl(删除线), ul(下划线)
+	var 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 || 0] : ff || 0,
+		family: 1,
+		size: fs || 10,
+		color: {
+			argb: (fc || '#000000').replace('#', '')
+		},
+		bold: luckyToExcel.num2bl(bl || 0),
+		italic: luckyToExcel.num2bl(it || 0),
+		underline: luckyToExcel.num2bl(ul || 0),
+		strike: luckyToExcel.num2bl(cl || 0)
+	}
+
+	return font
+}
+
+var alignmentConvert = function(
+	vt,
+	ht,
+	tb,
+	tr
+) {
+	// luckysheet:vt(垂直), ht(水平), tb(换行), tr(旋转)
+	var 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 || 'default'],
+		horizontal: luckyToExcel.horizontal[ht || 'default'],
+		wrapText: luckyToExcel.wrapText[tb || 'default'],
+		textRotation: luckyToExcel.textRotation[tr || 'default']
+	}
+	return alignment
+}
+
+var borderConvert = function(borderType, style, color) {
+	// 对应luckysheet的config中borderinfo的的参数
+	if (!borderType) {
+		return {}
+	}
+	var 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 || 1],
+		color: {
+			argb: (color || '#000').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
+	}
+	return border
+}
+
+function addborderToCell(borders, row_index, col_index) {
+	let border = {}
+	var 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'
+		}
+	}
+	for (var bor in borders) {
+		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}

File diff suppressed because it is too large
+ 1012 - 0
src/pages/main/competitor/components/sheet.vue


File diff suppressed because it is too large
+ 1522 - 1208
src/pages/main/competitor/index.vue


File diff suppressed because it is too large
+ 1553 - 0
src/pages/main/competitors/company.vue


+ 363 - 0
src/pages/main/competitors/components/export.js

@@ -0,0 +1,363 @@
+// import { createCellPos } from './translateNumToLetter'
+
+
+function colorRGBtoHex(color) {
+	var rgb = color.split(',');
+	var r = parseInt(rgb[0].split('(')[1]);
+	var g = parseInt(rgb[1]);
+	var b = parseInt(rgb[2].split(')')[0]);
+	var hex = "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
+	return hex;
+}
+const ExcelJS =require("exceljs" )  
+const saveAs = require('file-saver')
+function exportExcel(luckysheet, value) {
+	// 参数为luckysheet.getluckysheetfile()获取的对象
+	// 1.创建工作簿,可以为工作簿添加属性
+	var workbook = new ExcelJS.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.
+		var worksheet = workbook.addWorksheet(table.name)
+		var merge = (table.config && table.config.merge) || {}
+		var borderInfo = (table.config && table.config.borderInfo) || {}
+		// 3.设置单元格合并,设置单元格边框,设置单元格样式,设置值
+		setStyleAndValue(table.data, worksheet)
+		setMerge(merge, worksheet)
+		setBorder(borderInfo, worksheet)
+		return true
+	})
+
+	// return
+	// 4.写入 buffer
+	var buffer = workbook.xlsx.writeBuffer().then(function(data) {
+		var blob = new Blob([data], {
+			type: 'application/vnd.ms-excel;charset=utf-8'
+		})
+		saveAs(blob, value + '.xlsx')
+	})
+	return buffer
+}
+var setMerge = function(luckyMerge, worksheet) {
+	var 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
+	luckyBorderInfo.forEach(function(elem) {
+		// 现在只兼容到borderType 为range的情况
+		if (elem.rangeType === 'range') {
+			let border = borderConvert(elem.borderType, elem.style, elem.color)
+			let rang = elem.range[0]
+			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
+			// }
+			var col_index = elem.value.col_index
+			var row_index = elem.value.row_index
+			var borderData = Object.assign({}, elem.value)
+			delete borderData.col_index
+			delete borderData.row_index
+			let border = addborderToCell(borderData, row_index, col_index)
+			worksheet.getCell(row_index + 1, col_index + 1).border = border
+		}
+		// worksheet.getCell(rang.row_focus + 1, rang.column_focus + 1).border = border
+	})
+}
+var setStyleAndValue = function(cellArr, worksheet) {
+	console.log(cellArr);
+	if (!Array.isArray(cellArr)) return
+	cellArr.forEach(function(row, rowid) {
+		row.every(function(cell, columnid) {
+			console.log(cell);
+			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,
+				cell.ct
+			)
+			let alignment = alignmentConvert(cell.vt, cell.ht, cell.tb, cell.tr)
+			let value = ''
+
+			if (cell.f) {
+				value = {
+					formula: cell.f,
+					result: cell.m
+				}
+			} 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(function(arr) {
+					value += arr.v
+				})
+			} else {
+				value = cell.m //
+				
+			}
+			//  style 填入到_value中可以实现填充色
+			let letter = createCellPos(columnid)
+			let target = worksheet.getCell(letter + (rowid + 1))
+			for (var 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 {}
+	}
+	// var bgc = bg.replace('#', '')
+	if (bg.indexOf('#') == -1) {
+		bg = colorRGBtoHex(bg)
+	}
+	let fill = {
+		type: 'pattern',
+		pattern: 'solid',
+		fgColor: {
+			argb: bg.replace('#', '')
+		}
+	}
+	return fill
+}
+
+var fontConvert = function(
+	ff,
+	fc,
+	bl,
+	it,
+	fs,
+	cl,
+	ul
+) {
+	// luckysheet:ff(样式), fc(颜色), bl(粗体), it(斜体), fs(大小), cl(删除线), ul(下划线)
+	var 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 || 0] : ff || 0,
+		family: 1,
+		size: fs || 10,
+		color: {
+			argb: (fc || '#000000').replace('#', '')
+		},
+		bold: luckyToExcel.num2bl(bl || 0),
+		italic: luckyToExcel.num2bl(it || 0),
+		underline: luckyToExcel.num2bl(ul || 0),
+		strike: luckyToExcel.num2bl(cl || 0)
+	}
+
+	return font
+}
+
+var alignmentConvert = function(
+	vt,
+	ht,
+	tb,
+	tr
+) {
+	// luckysheet:vt(垂直), ht(水平), tb(换行), tr(旋转)
+	var 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 || 'default'],
+		horizontal: luckyToExcel.horizontal[ht || 'default'],
+		wrapText: luckyToExcel.wrapText[tb || 'default'],
+		textRotation: luckyToExcel.textRotation[tr || 'default']
+	}
+	return alignment
+}
+
+var borderConvert = function(borderType, style, color) {
+	// 对应luckysheet的config中borderinfo的的参数
+	if (!borderType) {
+		return {}
+	}
+	var 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 || 1],
+		color: {
+			argb: (color || '#000').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
+	}
+	return border
+}
+
+function addborderToCell(borders, row_index, col_index) {
+	let border = {}
+	var 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'
+		}
+	}
+	for (var bor in borders) {
+		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}

File diff suppressed because it is too large
+ 1494 - 0
src/pages/main/competitors/components/sheet.vue


File diff suppressed because it is too large
+ 1938 - 0
src/pages/main/competitors/home.vue


+ 81 - 0
src/pages/main/competitors/index.vue

@@ -0,0 +1,81 @@
+<template>
+  <div class="inner-container">
+    <el-col :span="3"
+      ><el-tabs
+        tab-position="left"
+        v-model="activeName"
+        @tab-click="handleClick"
+      >
+        <el-tab-pane
+          v-for="(item, index) in routerList"
+          :key="index"
+          :name="item.path"
+          :label="item.label"
+        ></el-tab-pane>
+      </el-tabs>
+    </el-col>
+    <el-col :span="21" style="background: #f4f4f4;">
+      <div style="height: 100%">
+        <router-view />
+      </div>
+    </el-col>
+  </div>
+</template>
+<script>
+import { userInfo } from 'os';
+
+export default {
+  data() {
+    return {
+      activeName: "",
+      showList: [],
+      routerList: [
+        { label: "地市", path: "/competitors", name: "competitors" },
+        // { label: "省公司", path: "/company", name: "company" }
+      ],
+    };
+  },
+  computed: {
+    menuList: function () {
+      let arr = [];
+      this.routerList.map((item) => {
+        this.showList.map((row) => {
+          if (item.path == row) {
+            arr.push(item);
+          }
+        });
+      });
+      return arr;
+    },
+  },
+  methods: {
+    handleClick(val) {
+      console.log(val);
+      if (this.$route.path != this.activeName) {
+        this.$router.push(this.activeName);
+      }
+    },
+  },
+  mounted() {
+    if(!JSON.parse(window.sessionStorage.getItem('userInfo')).cityName){
+     this.routerList.push({ label: "省公司", path: "/company", name: "company" })
+    }
+    this.activeName = this.$route.path;
+  },
+  created() {
+    JSON.parse(sessionStorage.childrenMenus).map((item) => {
+      this.showList.push(item.jspUrl);
+    });
+  },
+  watch: {
+    $route(to, from) {
+      this.activeName = this.$route.path;
+    },
+  },
+};
+</script>
+<style>
+.el-tabs__content {
+  display: none;
+}
+</style>

+ 66 - 0
src/pages/main/departWorkLists/dialog.vue

@@ -0,0 +1,66 @@
+<template>
+  <el-dialog
+    :modal="modal"
+    :title="title"
+    :visible.sync="visible"
+    :fullscreen="fullscreen"
+    :key="reload"
+    :before-close="handleCancel"
+    :modal-append-to-body="false"
+    :width="width"
+    :show-close="false"
+    :destroy-on-close="destroy"
+  >
+    <!-- 表格主体部分 -->
+    <slot></slot>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  props: {
+    visible: {
+      type: Boolean,
+      default: false,
+    },
+    title: {
+      type: String,
+      default: "",
+    },
+    reload: {
+      type: Number,
+      default: 0,
+    },
+    width: {
+      type: String,
+      default: "500px",
+    },
+    fullscreen: {
+      type: Boolean,
+      default: false,
+    },
+    modal: {
+      type: Boolean,
+      default: true,
+    },
+    destroy: {
+      type: Boolean,
+      default: false
+    }
+  },
+  mounted() {
+  },
+  methods: {
+    //   确定的回调
+    handleConfirm() {
+      this.$emit("confirm", false);
+    },
+    //   取消的回调
+    handleCancel() {
+      this.$emit("cancel", false);
+    },
+  },
+};
+</script>
+
+<style></style>

+ 364 - 0
src/pages/main/departWorkLists/export.js

@@ -0,0 +1,364 @@
+// import { createCellPos } from './translateNumToLetter'
+const Excel = require("exceljs");
+import FileSaver from "file-saver";
+export var 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, table);
+        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("导出成功!2");
+        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, table) {
+    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.m ? arr.m : arr.v);
+                });
+            } else {
+                value = cell.m ? cell.m : cell.v;
+            }
+            //  style 填入到_value中可以实现填充色
+            let letter = createCellPos(columnid);
+            let target = worksheet.getCell(letter + (rowid + 1));
+            // console.log('1233', letter + (rowid + 1))
+            // eslint-disable-next-line no-unused-vars
+            for (const key in fill) {
+                target.fill = fill;
+                break;
+            }
+            target.font = font;
+            target.alignment = alignment;
+            target.value = value;
+            return true;
+        });
+
+    });
+    let columnWidth = table.visibledatacolumn;
+    let rowHeight = table.visibledatarow;
+    for (let i = 0; i < cellArr.length; i++) {
+        let row1 = worksheet.getRow(i+1);
+        row1.height = i > 0 ? rowHeight[i] - rowHeight[i-1] : rowHeight[i]
+    }
+    for (let i = 0; i < cellArr[0].length; i++) {
+        let dobCol = worksheet.getColumn(createCellPos(i));
+        dobCol.width = i > 0 ? (columnWidth[i] - columnWidth[i - 1]) / 6.5 : columnWidth[i] / 6.5
+    }
+
+};
+
+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) {
+    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",
+        },
+    };
+    for (const bor in borders) {
+        if (borders[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 },
+                };
+            }
+        } else {
+            border[luckyExcel.type[bor]] = {
+                color: "#000000",
+                style: 1,
+            };
+        }
+    }
+    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;
+}

+ 941 - 0
src/pages/main/departWorkLists/index.vue

@@ -0,0 +1,941 @@
+<template>
+    <div class="container">
+        <div class="main-box" :key="simpleSheetKey">
+            <div class="inner-left">
+                <div class="button-list">
+                    <el-button size="mini" type="" @click="addMenu('root')"  :disabled="!authData" >
+                        添加根目录</el-button
+                    >
+                    <el-button size="mini" type="" @click="addMenu('detail')" :disabled="!authData">
+                        添加清单目录</el-button
+                    >
+                    <el-button size="medium" type="" @click="delMenu" :disabled="!authData"> 删除 </el-button>
+                </div>
+                <el-alert type="warning" :closable="false">
+                    <template slot="title">
+                        <span style="word-break: break-all">
+                            {{
+                        checkedNode && checkedNode.length > 0
+                        ? "当前选择节点名称:" + checkedNode[0].name
+                        : "当前无选择节点"
+                        }}
+                        </span>
+                    </template>
+                </el-alert>
+                <div style="margin: 10px 0">
+                    <el-input
+                        size="medium"
+                        placeholder="请输入内容"
+                        v-model="filterText"
+                        class="input-with-select"
+                        clearable
+                        @change="
+                                () => {
+                                  if (!filterText) {
+                                    searchMenu();
+                                  }
+                                }
+                            "
+                    >
+                        <el-button
+                            slot="append"
+                            @click="searchMenu"
+                            icon="el-icon-search"
+                        ></el-button>
+                    </el-input>
+                </div>
+                <div
+                    style="
+                          height: calc(100% - 182px);
+                          overflow-y: auto;
+                          margin-top: 20px;
+                        "
+                >
+                    <el-tree
+                        ref="catalogTree"
+                        :expand-on-click-node="true"
+                        :auto-expand-parent="true"
+                        :default-expand-all="true"
+                        :props="defaultProps"
+                        @node-click="nodeClick"
+                        :filter-node-method="filterNode"
+                        :data="menuList"
+                        node-key="id"
+                    >
+                        <span class="custom-tree-node" slot-scope="{ node }">
+                                <el-tooltip effect="light" :content="node.label" placement="right">
+                                    <span class="item-tit">
+                                        <span :style="
+                                            node.data.parentCode===0
+                                            ? 'font-size:14px;padding-left:5px'
+                                            : 'font-size:12px;padding-left:5px'
+                                        "
+                                        >
+                                             {{node.data.name}}
+                                        </span>
+                                    </span>
+                                </el-tooltip>
+                        </span>
+                    </el-tree>
+                </div>
+            </div>
+            <div  class="inner-right" v-if="addOnlineWordFlag">
+                <simple-dialog
+                    v-if="fullscreen"
+                    :fullscreen="fullscreen"
+                    :visible="addOnlineWordFlag"
+                    width="1200px"
+                >
+                    <simple-sheet ref="simpleSheet" :type="type"
+                                  :fullscreen="fullscreen"
+                                  @saveData="handleSaveData"
+                                  @handleFullscreen="handleFullscreen"
+                                  @save="handleSave"
+                                  :workName="workName"
+                                  :work-data="workData"
+                                  :id="tmpId" :mkdirId="params.mkdirId" :isCreater="isCreater"/>
+                </simple-dialog>
+                <simple-sheet v-else :type="type"
+                              :fullscreen="fullscreen"
+                              @saveData="handleSaveData"
+                              @handleFullscreen="handleFullscreen"
+                              :workName="workName"
+                              :work-data="workData"
+                              @save="handleSave"
+                              :id="tmpId" :mkdirId="params.mkdirId" :isCreater="isCreater"/>
+            </div>
+
+            <div class="inner-right" v-if="workListFlag">
+                <div class="search">
+                    <span>{{ catalogueName }}</span>
+                </div>
+                <div style="margin-bottom: 10px;margin-top: 10px;">
+                    <el-button
+                        v-if="checkedNode && checkedNode.length === 2"
+                        type="primary"
+                        size="mini"
+                        @click="addFile('add',{delFlag:'1'})"
+                        style="width: 80px"
+                    >
+                        新建
+                    </el-button>
+                </div>
+                <div class="tabBoxClass">
+                    <el-table
+                        height="calc(100% )"
+                        class="com-table"
+                        ref="multipleTable"
+                        :data="tableData"
+                        tooltip-effect="dark"
+                        :key="tableData.id"
+                        border
+                        size="small"
+                        style="width: 100%"
+                        v-loading="loading"
+                    >
+                        <el-table-column
+                            prop="templateName"
+                            show-overflow-tooltip
+                            label="名称"
+                            align="center"
+                        >
+                        </el-table-column>
+                        <el-table-column
+                            prop="createTime"
+                            show-overflow-tooltip
+                            label="创建时间"
+                            width="150"
+                            align="center"
+                        />
+                        <el-table-column
+                            prop="createCity"
+                            show-overflow-tooltip
+                            label="创建科室"
+                            align="center"
+                        >
+                        </el-table-column>
+                        <el-table-column
+                            prop="createBy"
+                            show-overflow-tooltip
+                            label="创建人"
+                            width="150"
+                            align="center"
+                        >
+                        </el-table-column>
+                        <el-table-column
+                            prop="stateNm"
+                            show-overflow-tooltip
+                            label="状态"
+                            width="150"
+                            align="center"
+                        >
+                        </el-table-column>
+                        <el-table-column label="操作" align="center" width="150">
+                            <template slot-scope="scope">
+                                <el-button
+                                    :disabled="scope.row.editFlag=='1'?false:true"
+                                    class="font-btn"
+                                    size="mini"
+                                    type="text"
+                                    plain
+                                    @click="addFile('edit',scope.row)"
+                                >编辑
+                                </el-button>
+                                <el-button
+                                    class="font-btn"
+                                    size="mini"
+                                    type="text"
+                                    plain
+                                    @click="addFile('view',scope.row)"
+                                >查看
+                                </el-button>
+                                <el-button
+                                    v-show="scope.row.delFlag=='1'?true:false"
+                                    class="font-btn"
+                                    size="mini"
+                                    type="text"
+                                    plain
+                                    @click="deleteOne(scope.row)"
+                                >删除
+                                </el-button>
+                            </template>
+                        </el-table-column>
+                    </el-table>
+                                            <el-pagination
+                                                class="pageBox"
+                                                @current-change="currchange"
+                                                layout="total, prev, pager, next"
+                                                background
+                                                :total="total"
+                                            >
+                                            </el-pagination>
+                </div>
+            </div>
+        </div>
+        <el-dialog
+            class="p-new-box"
+            size="50%"
+            title="新增目录"
+            :append-to-body="true"
+            :visible.sync="addDialogStatus"
+            :close-on-click-modal="false"
+        >
+            <el-form
+                :model="formData"
+                :rules="rules"
+                ref="ruleForm"
+                label-width="100px"
+                class="demo-ruleForm"
+                style="width: 90%; margin: 30px auto"
+            >
+                <el-form-item label="目录名称:" prop="name">
+                    <el-input
+                        v-model="formData.name"
+                        placeholder="请输入目录名称"
+                    ></el-input>
+                </el-form-item>
+                <el-form-item
+                    label="父级目录:"
+                    prop="parentName"
+                >
+                    <el-input
+                        disabled
+                        v-model="formData.parentName"
+                        placeholder="请输入父级名称"
+                    ></el-input>
+                </el-form-item>
+                <el-form-item label="操作人:" prop="createName">
+                    <el-input
+                        v-model="formData.createId"
+                        disabled
+                    ></el-input>
+                </el-form-item>
+                <div class="drawer-footer" style="text-align: right">
+                    <el-button
+                        type="primary"
+                        size="medium"
+                        @click="submitForm('ruleForm')"
+                    >确认</el-button
+                    >
+                    <el-button
+                        style="margin-right: 40px"
+                        size="medium"
+                        @click="resetForm('ruleForm')"
+                    >取消</el-button
+                    >
+                </div>
+            </el-form>
+        </el-dialog>
+    </div>
+</template>
+<script>
+import Vue from 'vue';
+import simpleSheet from "./sheet.vue";
+import simpleDialog from "./dialog.vue";
+export default {
+    components: {
+        simpleSheet,
+        simpleDialog
+    },
+    data() {
+        return {
+            catalogueName:"部门工作清单",
+            isCreater:"0",//1:创建者 0:非创建者
+            addDialogStatus: false,
+            tooltit: "部门工作清单",
+            filterText: "", // tree搜索value
+            menuList: [], // tree数据源
+            checkedNode: [], // 选中节点信息
+            authData: false, //是否有权限 false无全权限
+            fullscreen: false,
+            formData: {
+                name: "",
+                parentCode: "",
+                parentName: "",
+                createId: JSON.parse(sessionStorage.userInfo).loginNo,
+            },
+            defaultProps: {
+                children: "children",
+                label: "name",
+            },
+            rules: {
+                name: [
+                    {
+                        required: true,
+                        message: "请输入目录名称",
+                        trigger: "change",
+                    },
+                ],
+            },
+
+            tmpId:'',
+            rowData:{},
+            type:'add',
+            workListFlag:true,
+            addOnlineWordFlag:false,
+            loading: false,
+            tableData: [
+                // {
+                //     templateName:"测试",
+                //     createTime:"2022-6-12",
+                //     createCity:"规划开发室",
+                //     createBy:"范岩",
+                //     state:"开",
+                //     delFlag:"1",//1:代表创建人有删除权限 0:不显示
+                //     editFlag:"0"//1:不置灰(状态state字段为开时);0:置灰(状态state字段为关时且不是创建人时)
+                // }
+            ], // 表格数据源
+            infolist: {
+                isFile: "1",
+                title: "", // 材料名称
+                meeting: "", // 会议名称
+                titleBg: "", // 材料背景
+                auth: "1", // 查看权限
+                mkFileShareAttachList: [], // 附件数据
+                parentId: "",
+            }, // 提交表单数据源
+            filerules: {
+                title: [
+                    {
+                        required: true,
+                        message: "请输入材料名称",
+                        trigger: "change",
+                    },
+                ],
+                meeting: [
+                    {
+                        required: true,
+                        message: "请输入会议名称",
+                        trigger: "change",
+                    },
+                ],
+                titleBg: [
+                    {
+                        required: true,
+                        message: "请输入材料背景",
+                        trigger: "change",
+                    },
+                ],
+            },
+            subType: "",
+            total: 0,
+            pageSize: 1,
+            params: {
+                id: "",
+                mkdirId:"3"
+            },
+            paramsSearch: {
+                isFile: "1",
+                id: "",
+            },
+            fileInfo: {
+                type: "bt1n",
+                typename: "上传文件",
+                limit: 5,
+                url: "/market/cmkFileShareNet/upload",
+                fileList: [],
+            },
+            titname: "新增",
+            dialogStatus: false,
+            attList: [],
+            simpleSheetKey:0,
+            workName:'',
+            workData:null,
+        };
+    },
+    methods: {
+        handleSaveData(workName, workData){
+            this.workName = workName;
+            this.workData = workData;
+        },
+        handleFullscreen(fullscreen){
+            if (fullscreen){
+                Vue.set(this, 'fullscreen', fullscreen)
+                /*this.$nextTick(()=>{
+                    this.$refs.simpleSheet.handleFullscreenOption()
+                })*/
+            }else {
+                this.$nextTick(()=>{
+                    this.$refs.simpleSheet.handleFullscreenOption()
+                })
+                Vue.set(this, 'fullscreen', fullscreen)
+            }
+
+        },
+        saveData(workName, workData){
+            this.workName = workName;
+            this.workData = workData;
+        },
+        // 搜索按钮事件
+        searchMenu() {
+            this.$refs.catalogTree.filter(this.filterText);
+        },
+        // 新增目录-表单提交
+        async submitForm(formName) {
+            let valid = await this.$refs[formName].validate().catch((err) => err);
+            if (valid) {
+                this.$http({
+                    url:"/market/mkWorkListCatalogue/add",
+                    method: "post",
+                    headers: {
+                        "Content-Type": "application/json",
+                    },
+                    data: this.formData,
+                }).then((res) => {
+                    if (res.data.result === 0) {
+                        this.$message({
+                            type: "success",
+                            message: res.data.desc,
+                        });
+                        this.getData();
+                        this.$refs[formName].resetFields();
+                        this.addDialogStatus = false;
+                    }else {
+                        this.$message({
+                            type: "error",
+                            message: res.data.desc,
+                        });
+                    }
+                });
+            }
+        },
+        // 取消新增目录
+        resetForm(formName) {
+            this.$refs[formName].resetFields();
+            this.addDialogStatus = false;
+        },
+        // 新增目录
+        addMenu(flag) {
+            if (flag === 'detail'){
+                if (!this.checkedNode || this.checkedNode.length !== 1){
+                    this.$message({
+                        type: "warning",
+                        message: "请先选择根目录",
+                    });
+                    return;
+                }
+                this.formData.parentCode = this.checkedNode[0].id
+                this.formData.parentName = this.checkedNode[0].name
+            }else if (flag === 'root'){
+                this.formData.parentCode = 0;
+                this.formData.parentName = ''
+            }
+            this.addDialogStatus = true
+        },
+        // 删除目录
+        delMenu() {
+            if (!this.checkedNode || this.checkedNode.length === 0) {
+                this.$message("请先选中要删除的目录");
+            } else {
+                this.$confirm("即将删除此条数据, 是否删除?", "提示", {
+                    confirmButtonText: "确定",
+                    cancelButtonText: "取消",
+                    type: "warning",
+                })
+                    .then(() => {
+                        this.$http({
+                            url: "/market/mkWorkListCatalogue/del",
+                            method: "post",
+                            headers: {
+                                "Content-Type": "application/json",
+                            },
+                            data: {
+                                id: this.checkedNode[0].id,
+                                parentCode: this.checkedNode[0].parentCode
+                            },
+                        }).then((res) => {
+                            if (res.data.result === 0) {
+                                this.$notify({
+                                    title: "成功",
+                                    message: res.data.desc,
+                                    type: "success",
+                                });
+                                this.checkedNode = [];
+                                //删除成功后渲染右边目录和表格数据
+                                this.catalogueName="部门工作清单";
+                                this.params.mkdirId='-1';//确保查不到数据
+                                this.getList(this.params, this.pageSize);
+                                this.getData();
+                            }else if(res.data.result === 1) {
+                                this.$notify({
+                                    title: "失败",
+                                    message: res.data.desc,
+                                    type: "error",
+                                });
+                            }
+                        });
+                    })
+                    .catch(() => {});
+            }
+        },
+        // tree过滤方法
+        filterNode(value, data) {
+            if (!value) return true;
+            return data.name.indexOf(value) !== -1;
+        },
+        // 点击树节点事件
+        nodeClick(data, node) {
+            this.formData.parentCode = data.parentCode;
+            let clickNode = []
+            this.getParent(node, clickNode)
+            this.checkedNode = clickNode
+            if (clickNode.length === 2){
+                this.catalogueName = clickNode[1].name + '-' + clickNode[0].name
+                this.params.mkdirId = clickNode[0].id + ''
+                this.getList(this.params, this.pageSize);
+            }else if(clickNode.length === 1){
+                //父目录,则显示新建按钮只显示表头
+                this.catalogueName =data.name
+                this.params.mkdirId=data.id;
+                this.getList(this.params, this.pageSize);
+            }
+            //返回列表页面
+            this.addOnlineWordFlag=false;
+            this.workListFlag=true;
+        },
+        getParent(node, list){
+            if (node.level > 0){
+                list.push(node.data)
+                this.getParent(node.parent, list);
+            }
+        },
+        // 获取目录
+        getData() {
+            this.$http({
+                url: "/market/mkWorkListCatalogue/queryList",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: { isFile: "0" },
+            }).then((res) => {
+                if (res.data.result === 0) {
+                    this.menuList = res.data.body;
+                }else {
+                    this.$message({
+                        message: res.data.desc,
+                        type: "error",
+                    });
+                }
+            });
+        },
+        // 获取权限
+        getAuthData() {
+            let menus = JSON.parse(window.sessionStorage.childrenMenus);
+            for(let n=0;n<menus.length;n++){
+                if (menus[n].jspUrl === "/workListCatalogueAuth") {
+                   this.authData = true
+                }
+            }
+        },
+
+
+        handleSave() {
+            // switch (type) {
+            //     case "add":
+            console.log("************")
+            this.addOnlineWordFlag=false;
+            this.workListFlag=true;
+                //     break;
+                // case "edit":
+                //     this.handleVisible("edit");
+                //     break;
+            // }
+            //调用list列表接口根据目录ID
+            // this.handleInit();
+            this.getList(this.params, this.pageSize);
+        },
+        //搜索数据
+        searchInfo(v) {
+            this.paramsSearch = {};
+            v[0] ? this.paramsSearch.title = v[0] : '';
+            this.paramsSearch.isFile = "1";
+            // this.paramsSearch.parentId = this.infolist.parentId;
+            this.pageSize = 1;//重置分页
+            this.getList(this.paramsSearch, this.pageSize);
+        },
+        // 新增在线文档
+        addFile(type,data) {
+            // this.titname = "新增";
+            this.workName = ""
+            this.workData = null
+            this.workListFlag = false;
+            this.addOnlineWordFlag = true;
+            this.type=type;
+            this.isCreater = data.delFlag;
+            this.tmpId=data.id
+            // switch (type) {
+            //     case "add":
+            //         break;
+            //     case "edit":
+            //
+            //         this.rowData=data;
+            //         break;
+            //     case "view":
+            //         this.rowData=data;
+            //         break;
+            // }
+        },
+        // 上传回调
+        uploadBack(v) {
+            this.attList = v;
+        },
+        deleteOne(val) {
+            this.$confirm("即将删除此条数据, 是否删除?", "提示", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning",
+            })
+                .then(() => {
+                    this.pageSize = 1;
+                    this.$http({
+                        url: "/market/workLists/del",
+                        method: "post",
+                        headers: {
+                            "Content-Type": "application/json",
+                        },
+                        data: {
+                            id: val.id,
+                        },
+                    }).then((res) => {
+                        if (res.data.result == 0) {
+                            this.$message({
+                                message: "删除成功",
+                                type: "success",
+                            });
+                            this.getList(this.params, this.pageSize);
+                        }else if(res.data.result == 1) {
+                            this.$message({
+                                message: res.data.body,
+                                type: "error",
+                            });
+                        }
+                    });
+                })
+                .catch(() => {});
+        },
+        //功能栏
+        iconCli(v) {
+            if (v === 1) {
+                this.getList(this.params, this.pageSize);
+            }
+            if (v === 2) {
+                this.fullscreen = !this.fullscreen;
+            }
+        },
+        // 分页
+        currchange(v) {
+            this.pageSize = v;
+            this.getList(this.params, this.pageSize);
+        },
+        //获取列表
+        getList(v, n) {
+            this.pageSize = n;
+            this.loading = true;
+            this.tableData = [];
+            this.$http({
+                url: "/market/workLists/list",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                    page: '{"pageNo":"' + n + '","pageSize":"10"}',
+                },
+                data: v,
+            }).then((res) => {
+                if(res.data.result==0){
+                    this.tableData=res.data.body.data
+                    this.tableData.forEach(item=>{
+                        item.stateNm=item.state=='1'?'开启':'关闭';
+                    });
+                }else{
+                    this.$message({
+                        message: "获取失败",
+                        type: "error",
+                    });
+                }
+                this.total = res.data.body.totalRecord;
+                this.loading = false;
+            });
+        },
+    },
+    mounted() {
+        this.getData();
+        this.getAuthData();
+    },
+};
+</script>
+<style scoped lang="scss">
+.radviv div {
+    width: 80% !important;
+}
+.pageBox {
+    text-align: right;
+    margin-top: 5px;
+}
+
+.info-line {
+    width: 100%;
+    display: block;
+    // padding-left: 20px;
+
+    div {
+        width: 50%;
+        display: inline-block;
+    }
+
+    span {
+        width: 100px;
+        display: inline-block;
+        text-align: right;
+        font-weight: bold;
+        font-size: 14px;
+        padding-right: 15px;
+
+        i {
+            color: red;
+            display: inline-block;
+            padding-right: 5px;
+        }
+    }
+
+    .el-select,
+    .el-input {
+        width: calc(100% - 100px);
+    }
+
+    .tree {
+        width: calc(100% - 100px);
+    }
+}
+
+.online {
+    width: 100%;
+
+    .el-select {
+        width: calc(100% - 100px);
+    }
+
+    span {
+        vertical-align: top;
+    }
+
+    .el-textarea {
+        width: calc(100% - 100px);
+    }
+}
+</style>
+
+<style lang="scss" scoped>
+.titbox {
+    div {
+        float: right;
+
+        i {
+            font-size: 22px;
+            margin-left: 20px;
+            cursor: pointer;
+        }
+    }
+}
+.container {
+    background-color: #f0f2f5;
+    .clearStyle {
+        cursor: pointer;
+        color: #0b82ff;
+    }
+    .el-col {
+        background-color: white;
+        padding: 0 20px;
+    }
+
+    .container-box {
+        padding: 0;
+        margin-top: 0;
+        height: 100%;
+        background-color: white;
+        padding: 20px;
+    }
+
+    .main-box {
+        overflow: hidden;
+        display: flex;
+        background-color: white;
+        padding: 20px 0;
+
+        > div {
+            background-color: white;
+        }
+
+        .inner-left {
+            width: 320px;
+            padding: 0 20px;
+            border: 1px solid #ddd;
+            border-radius: 5px;
+            height: calc(100vh - 220px);
+
+             .canel-style {
+             	color: #1890ff;
+             	cursor: pointer;
+             	padding-left: 10px;
+             }
+        }
+
+        .inner-right {
+            flex: 1;
+            margin: 0 2%;
+            //overflow-y: auto;
+            //   border-left: 1px solid #ddd;
+            height: calc(100vh - 220px);
+            .tabBoxClass {
+                height: calc(100% - 120px);
+            }
+        }
+    }
+}
+
+.button-list {
+    padding: 30px 0 10px 0;
+    display: flex;
+    //   justify-content: space-between;
+}
+
+.choice-style {
+    background: rgb(255, 255, 255);
+}
+
+.tree-action {
+    bottom: 0;
+    width: 100%;
+    // border-top: 1px solid #e8e8e8;
+    padding: 10px 16px;
+    text-align: left;
+    left: 0;
+    background: #fff;
+    border-radius: 0 0 2px 2px;
+}
+
+.tree-line {
+    // .el-tree-node__content {
+    //   padding-left: 0 !important;
+    // }
+
+    .el-tree-node__expand-icon.is-leaf {
+        display: none !important;
+    }
+
+    .el-tree-node {
+        position: relative;
+        padding-left: 16px; // 缩进量
+    }
+
+    .el-tree-node__children {
+        padding-left: 16px; // 缩进量
+    }
+
+    // 竖线
+    .el-tree-node::before {
+        content: "";
+        height: 100%;
+        width: 1px;
+        position: absolute;
+        left: -3px;
+        top: -17px;
+        border-width: 1px;
+        border-left: 1px dashed #52627c;
+    }
+
+    // 当前层最后一个节点的竖线高度固定
+    .el-tree-node:last-child::before {
+        height: 38px; // 可以自己调节到合适数值
+    }
+
+    // 横线
+    .el-tree-node::after {
+        content: "";
+        width: 24px;
+        height: 20px;
+        position: absolute;
+        left: -3px;
+        top: 20px;
+        border-width: 1px;
+        border-top: 1px dashed #52627c;
+    }
+
+    // 去掉最顶层的虚线,放最下面样式才不会被上面的覆盖了
+    & > .el-tree-node::after {
+        border-top: none;
+    }
+
+    & > .el-tree-node::before {
+        border-left: none;
+    }
+
+    // 展开关闭的icon
+    .el-tree-node__expand-icon {
+        font-size: 16px;
+
+        // 叶子节点(无子节点)
+        &.is-leaf {
+            color: transparent;
+            // display: none; // 也可以去掉
+        }
+    }
+}
+.custom-tree-node {
+    flex: 1;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    font-size: 14px;
+    padding-right: 8px;
+    // .item-tit{
+    //     color: #ffffff;
+    // }
+}
+.el-tree ::v-deep .custom-tree-node,
+.el-tree ::v-deep .custom-tree-node .item-tit{
+    overflow: hidden!important;
+    text-overflow:ellipsis!important;
+    white-space: nowrap!important;
+}
+</style>

+ 619 - 0
src/pages/main/departWorkLists/sheet.vue

@@ -0,0 +1,619 @@
+<!--
+ * @Author       : yuanrunwei
+ * @Date         : 2021-12-04 14:23:58
+ * @LastEditors: daiqisheng
+ * @LastEditTime: 2022-05-10 11:24:05
+ * @FilePath     : \spfm-market-front\src\pages\main\performance\components\sheet.vue
+-->
+<template>
+    <fullscreen id="containerClass" :fullscreen.sync="fullscreen" class="containerClass" style=" background-color: #ffffff">
+        <div class="sheet-container" id="full-container">
+            <div style="    margin-top: 20px; margin-left: 30px;" >
+                <span style="  font-size: small;margin-right: 10px;">控制权限</span>
+                <el-select v-model="state" placeholder="请选择" :disabled="this.type=='view'|| (this.type=='edit' && this.isCreater !='1') ?true:false " size="mini">
+                    <el-option
+                        v-for="item in options"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value">
+                    </el-option>
+                </el-select>
+            </div>
+            <div class="flex-justify-align-end margin-bottom-20">
+                <!--      <span-->
+                <!--        v-if="['template'].includes(attribute)"-->
+                <!--        ><span class="sheet-container-require">*</span>模板类型:</span-->
+                <!--      >-->
+                <div style="display: flex;
+                        margin-right: 20px;
+                        background: rgb(2, 135, 251);
+                        padding: 2px;
+                        border-radius: 4px;">
+                    <el-upload
+                        action
+                        :http-request="request"
+                        :on-change="handleChange"
+                        :show-file-list="false"
+                        :disabled="this.type=='view'?true:false"
+                    >
+                        <el-button :disabled="this.type=='view'?true:false" size="mini">选择文件</el-button>
+                    </el-upload>
+                    <span style="font-size: 12px;margin-right: 5px;line-height: 2;color: white;">{{ fileListName }}</span>
+                </div>
+                <el-button
+                    type="danger"
+                    @click="handleResave"
+                    size="mini"
+                    :disabled="this.type=='view'?true:false"
+                >保存</el-button
+                >
+                <!--            :disabled="handleForbid()"-->
+
+                <el-button  size="mini" type="danger" @click="handleDownload">导出</el-button>
+                <el-button size="mini" type="primary" @click="returnList">返回</el-button>
+                <el-button size="mini" type="primary" @click="handleFullscreen">{{ showName }}</el-button>
+            </div>
+            <div id="luckysheet" class="sheet-container-block_class" ></div>
+        </div>
+    </fullscreen>
+</template>
+
+<script>
+import luckyexcel from "luckyexcel";
+import { exportExcel } from "./export";
+export default {
+    components: {
+    },
+    props: {
+        isCreater: {
+            type: String,
+            default: "",
+        },
+        type: {
+            type: String,
+            default: "view", // view 查看 edit 编辑
+        },
+        attribute: {
+            type: String,
+            default: "template", // template 模板 order 工单 file 文件
+        },
+        id: {
+            default: null,
+        },
+        // 接收人
+        receiver: {
+            type: String,
+            default: "",
+        },
+        // 模板状态按钮判断
+        status: { type: String, default: "" },
+        mkdirId:{
+            type: String,
+            default:'',
+        },
+        fullscreen:{
+            type:Boolean,
+            default:false
+        },
+        workName:{
+            type:String
+        },
+        workData:{
+            type:Object
+        }
+    },
+    data() {
+        return {
+            options: [{
+                value: '1',
+                label: '开启'
+            },{
+                value: '0',
+                label: '关闭'
+            }],
+            state:'1',
+            form: {
+                charge: [
+                    {
+                        person: [],
+                        col_start: "",
+                        col_end: "",
+                        row_start: "",
+                        row_end: "",
+                    },
+                ],
+                array: [],
+                type: null,
+                permission_type: null,
+                col_start: "",
+                col_end: "",
+                row_start: "",
+                row_end: "",
+            },
+            approveForm: {
+                type: "",
+                comments: "",
+                list: [
+                    {
+                        label: "同意",
+                        value: "同意",
+                    },
+                    {
+                        label: "不同意",
+                        value: "不同意",
+                    },
+                    {
+                        label: "其他",
+                        value: "3",
+                    },
+                ],
+            },
+            superviserules: {
+                distribute: [
+                    { required: true, message: "请选择派发周期", trigger: "change" },
+                ],
+                write: [
+                    { required: true, message: "请选择填报周期", trigger: "change" },
+                ],
+                endTime: [
+                    { required: true, message: "请选择截止时间", trigger: "change" },
+                ],
+            },
+            superviseForm: {
+                distribute: "", // 派单周期
+                write: "", // 填写周期
+                endTime: "", // 截止时间
+            },
+            originSuperviseForm: {},
+            pickOptions: {
+                disabledDate(time) {
+                    return time.getTime() < new Date().getTime() - 8.64e7;
+                },
+            },
+            pickWrite: {
+                disabledDate(time) {
+                    return time.getTime() < new Date().getTime() - 8.64e7;
+                },
+            },
+            // 可提交标志
+            addFlag: "0",
+            // 督办标志
+            superviseFlag: null,
+            rowList: [],
+            isDisable: true,
+            issued_id: null,
+            template_id: null,
+            visible: false,
+            templateType: "",
+            // 督办
+            supervise: false,
+            manager_approve: false,
+            row_list: [],
+            column_list: [],
+            charge_list: [],
+            type_options: [
+                {
+                    value: 1,
+                    label: "按行",
+                },
+                // {
+                //     value: 2,
+                //     label: "按列",
+                // },
+            ],
+            fileListName:'未选择任何文件',
+            showName: '全屏显示'
+        };
+    },
+    methods: {
+        request(){},
+        handleInit() {
+            if (this.id) {
+                if (this.workName){
+                    this.handleCreate({
+                        json: this.workData,
+                        name: this.workName,
+                        type: "json",
+                    });
+                }else {
+                    this.handleQuery();
+                }
+            } else {
+                if (this.workName){
+                    this.handleCreate({
+                        json: this.workData,
+                        name: this.workName,
+                        type: "json",
+                    });
+                }else {
+                    this.handleCreate();
+                }
+            }
+            if (this.fullscreen){
+                this.$nextTick(()=>{
+                    this.handleFullscreenOption();
+                    this.showName = '退出全屏'
+                })
+            }
+        },
+        returnList(){
+            if (this.fullscreen){
+                this.handleFullscreenOption()
+                this.$emit("handleFullscreen", false)
+            }
+            this.$emit("save");
+        },
+        handleAllow() {
+            //查看无法编辑
+            return this.type=="view"?false:true;
+        },
+        addInputPlace(){
+            this.$nextTick(()=>{
+                let element = document.getElementById('luckysheet_info_detail_input');
+                element.placeholder = '请输入标题'
+                element.style['min-width'] = '120px'
+            })
+        },
+        async handleQuery() {
+            const {
+                data: {
+                    templateContent,
+                    templateName,
+                    state,
+                },
+            } = await this.$http({
+                url: "/market/workLists/getWorkById",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {id:this.id},
+            });
+            this.state=state;
+            this.handleCreate({
+                json: templateContent ? JSON.parse(templateContent) : {},
+                name: templateName,
+                type: "json",
+            });
+        },
+        async handleCreate({ file, json, type, name } = {}) {
+            let that = this;
+            if('add'== this.type){
+                window.luckysheet.destroy();
+                window.luckysheet.create({
+                    container: "luckysheet",
+                    lang: "zh",
+                    showsheetbar: false,
+                    data:[{}],
+                    userInfo:undefined,
+                    title:""
+                })
+                this.addInputPlace();
+                if (!this.fullscreen){
+                    let interval = setInterval(()=>{
+                        let elementById = document.getElementById("luckysheet-icon-morebtn-div");
+                        if (elementById){
+                            elementById.style.width = '55%'
+                            clearInterval(interval)
+                        }
+                    },300)
+                }
+            }
+            switch (type) {
+                case "file":
+                    if (file) {
+                        await new Promise((resolve) => {
+                            luckyexcel.transformExcelToLucky(file, (export_json) => {
+                                let name = export_json.info.name;
+                                if(!name.endsWith(".xlsx")){
+                                    this.$message({
+                                        type: "error",
+                                        message: '导入失败!只支持.xlsx格式文件',
+                                    });
+                                }else {
+                                    this.fileListName = name;
+                                    let lastIndexOf = export_json.info.name.lastIndexOf('.');
+                                    name = name.substring(0, lastIndexOf);
+                                    window.luckysheet.destroy();
+                                    window.luckysheet.create({
+                                        container: "luckysheet",
+                                        lang: "zh",
+                                        showsheetbar: false,
+                                        data:export_json.sheets,
+                                        title:name,
+                                        userInfo:export_json.info.name.creater
+
+                                    })
+                                    this.addInputPlace();
+                                    if (!this.fullscreen){
+                                        let interval = setInterval(()=>{
+                                            let elementById = document.getElementById("luckysheet-icon-morebtn-div");
+                                            if (elementById){
+                                                elementById.style.width = '55%'
+                                                clearInterval(interval)
+                                            }
+                                        },300)
+                                    }
+                                }
+                                resolve();
+                            });
+                        });
+                    }
+                    break;
+                case "json":
+                    if (json) {
+                        window.luckysheet.destroy();
+                        let data=[];
+                        data[0]=json;
+                        if('view'==this.type){
+                            window.luckysheet.create({
+                                container: "luckysheet",
+                                lang: "zh",
+                                showsheetbar: false,
+                                data:data,
+                                title:name,
+                                userInfo:name.creater,
+                                hook: {
+                                    cellEditBefore: function ([
+                                                                  { row_focus: row, column_focus: column },
+                                                              ]) {
+                                        if (!that.handleAllow({ row, column })) {
+                                            that.$message.error("当前为【查看】状态,无法编辑!");
+                                        }
+                                    },
+                                    // cellUpdated: function (row, column) {
+                                    //   that.rowList.push(row);
+                                    // },
+                                    cellUpdateBefore: function (row, column) {
+                                        console.log(row, column);
+                                        if (!that.handleAllow({ row, column })) {
+                                            return false;
+                                        }
+                                    },
+                                    rangePasteBefore: function ([
+                                                                    { row_focus: row, column_focus: column },
+                                                                ]) {
+                                        if (!that.handleAllow({ row, column })) {
+                                            that.$message.error("当前为【查看】状态,无法编辑!");
+                                            return false;
+                                        }
+                                    },
+                                    updated: function ({ range }) {
+                                        const middle = range.map((el) => {
+                                            return that.paramsArr(el.row[0], el.row[1]);
+                                        });
+                                        let changedList = middle.join(",").split(",");
+                                        that.rowList.push(...changedList);
+                                    },
+                                }
+                            });
+                        }else{
+                            window.luckysheet.create({
+                                container: "luckysheet",
+                                lang: "zh",
+                                showsheetbar: false,
+                                data:data,
+                                title:name,
+                                userInfo:name.creater
+                            });
+                            this.addInputPlace();
+                            if (!this.fullscreen){
+                                let interval = setInterval(()=>{
+                                    let elementById = document.getElementById("luckysheet-icon-morebtn-div");
+                                    if (elementById){
+                                        elementById.style.width = '55%'
+                                        clearInterval(interval)
+                                    }
+                                },300)
+                            }
+                        }
+                    }
+                    break;
+            }
+        },
+        async handleChange(response, fileList) {
+            this.handleCreate({ file: response.raw, type: "file" });
+        },
+        handleDownload() {
+            exportExcel(
+                window.luckysheet.getAllSheets(),
+                window.luckysheet.getWorkbookName()
+            );
+        },
+        // 判断数组是否有值
+        confirmArrayData(data) {
+            if (data instanceof Array) {
+                if (data.length) {
+                    for (let i = 0; i < data.length; i++) {
+                        if (data[i] instanceof  Array){
+                            for (let j = 0; j < data[i].length; j++) {
+                                if ((data[i][j] && data[i][j].v) || (data[i][j] && data[i][j].ct && data[i][j].ct.s && data[i][j].ct.s.length > 0 && data[i][j].ct.s[0].v)) {
+                                    return true;
+                                }
+                            }
+                        }else {
+                            return false;
+                        }
+                    }
+                    return false;
+                } else {
+                    return false;
+                }
+            } else {
+                return false;
+            }
+        },
+        // 通用方法用于转化全局
+        paramsArr(start, end) {
+            const arr = [];
+            console.log(start, end);
+            for (let i = Number(start); i <= Number(end); i++) {
+                arr.push(i);
+            }
+            return arr.join(",");
+        },
+        handleFullscreen() {
+            const sheet_name = window.luckysheet.getSheet().name;
+            const data = window.luckysheet.getSheet(sheet_name);
+            const workbook_name = window.luckysheet.getWorkbookName();
+            this.$emit('saveData', workbook_name, data)
+            if (this.fullscreen === false){
+                this.$emit("handleFullscreen", true)
+            }
+            if (this.fullscreen === true){
+                this.$emit("handleFullscreen", false)
+            }
+        },
+        handleFullscreenOption(){
+            const element = document.body;
+            const is_fullscreen =
+                document.fullScreen ||
+                document.mozFullScreen ||
+                document.webkitIsFullScreen;
+            if (!is_fullscreen) {
+                let elementById = document.getElementById("containerClass");
+                elementById.style.height = 'calc(100vh - 100px)';
+                //进入全屏,多重短路表达式
+                (element.requestFullscreen && element.requestFullscreen()) ||
+                (element.mozRequestFullScreen && element.mozRequestFullScreen()) ||
+                (element.webkitRequestFullscreen &&
+                    element.webkitRequestFullscreen()) ||
+                (element.msRequestFullscreen && element.msRequestFullscreen());
+            }else {
+                let elementById = document.getElementById("containerClass");
+                elementById.style.height = 'calc(100vh - 220px)';
+               //退出全屏,三目运算符
+               document.exitFullscreen
+                 ? document.exitFullscreen()
+                 : document.mozCancelFullScreen
+                 ? document.mozCancelFullScreen()
+                 : document.webkitExitFullscreen
+                 ? document.webkitExitFullscreen()
+                 : "";
+            }
+        },
+        handleResave() {
+            const sheet_name = window.luckysheet.getSheet().name;
+            const data = window.luckysheet.getSheet(sheet_name);
+            const workbook_name = window.luckysheet.getWorkbookName();
+            let empty = this.confirmArrayData(data.data);
+            if (!empty){
+                this.$message({
+                    type: "error",
+                    message: '文档内容为空',
+                });
+                return;
+            }
+            if('请输入标题'== workbook_name || !workbook_name){
+                this.$message({
+                    type: "error",
+                    message: '请输入标题',
+                });
+                return;
+            }
+            let value = {
+                // templateId: this.id,
+                templateContent: JSON.stringify(data), //文件内容
+                templateName: workbook_name, //模板名称
+                templateUrl: "", //文件链接
+                state: this.state,
+                mkdirId: this.mkdirId
+            };
+            if("edit" ==this.type){
+                value.id=this.id;
+            }
+            this.$http({
+                url: "/market/workLists/saveOrUpdate",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: value,
+            }).then((res) => {
+                console.log("----res",res);
+                if(res.data.result==0){
+                    this.$message({
+                        type: "success",
+                        message: "保存成功",
+                    });
+                }else{
+                    this.$message({
+                        type: "error",
+                        message: res.data.body,
+                    });
+                }
+                if (this.fullscreen){
+                    this.handleFullscreenOption()
+                    this.$emit("handleFullscreen", false)
+                }
+                this.$emit("save");
+            });
+        },
+    },
+    mounted() {
+        this.handleInit();
+        // this.handleChargeList();
+    },
+    destroyed() {
+        window.luckysheet.destroy();
+    },
+};
+</script>
+
+<style lang="scss" scope>
+.sheet-container {
+    position: relative;
+    width: 100%;
+    height: 100%;
+    &-block {
+        overflow: hidden;
+        position: absolute;
+        width: 100%;
+        height: 85%;
+    }
+    &-require {
+        color: red;
+    }
+    .el-input {
+        width: 200px;
+        margin-right: 10px;
+    }
+}
+.form {
+    &-input {
+        margin-top: 5px;
+        .el-input {
+            width: 150px;
+            .el-input__inner {
+                height: 30px !important;
+                line-height: 30px !important;
+            }
+        }
+    }
+    &-content {
+        margin: 0px 10px;
+    }
+    //&-select {
+    //  .el-input {
+    //    width: 100px;
+    //    .el-input__inner {
+    //      height: 30px !important;
+    //      line-height: 30px !important;
+    //    }
+    //  }
+    //}
+}
+.containerClass{
+    background: #fff;
+    border-radius: 5px;
+    height: calc(100vh - 220px);
+    width: calc(100% - 6px);
+    float: left;
+    display: inline-block;
+    overflow: hidden;
+}
+.sheet-container-block_class{
+    height: calc(100% - 96px);
+    width: 100%;
+}
+</style>

+ 99 - 99
src/pages/main/file/flieList.vue

@@ -134,7 +134,7 @@
               class="btn-check"
               size="medium"
               @click="addFile"
-              :disabled="uploadStatus === false"
+              :disabled="uploadStatus ===false"
             >
               上传附件
             </el-button>
@@ -376,7 +376,7 @@ export default {
   },
   data() {
     return {
-      uploadStatus: true,
+        uploadStatus:true,
       jurisdiction: {}, //权限列表
       isSuper: "", //是否为超级管理员
       loadinged: false,
@@ -477,7 +477,7 @@ export default {
       paramsSearch: {
         isFile: "1",
         id: "",
-        auth: "",
+        auth:''
       },
 
       fileInfo: {
@@ -848,30 +848,28 @@ export default {
       this.formData.id = nodeData.id;
       delete Object["children"];
       this.actionName = nodeData.title;
-      if (
-        this.actionName === "C市场" ||
-        this.actionName === "H市场" ||
-        this.actionName === "N市场+线上" ||
-        this.actionName === "业务综合" ||
-        this.actionName === "渠道"
-      ) {
-        this.isSuper = "2"; //权限
-        this.uploadStatus = false;
-      } else {
-        this.uploadStatus = true;
-        if (this.jurisdiction.isSuper === "1") {
-          this.isSuper = "1";
-        }
+      if(this.actionName ==='C市场' ||this.actionName === 'H市场'||this.actionName ==='N市场+线上' || this.actionName === '业务综合'||this.actionName ==='渠道'){
+          this.isSuper = '2'//权限
+          this.uploadStatus = false;
+      }else{
+          this.uploadStatus = true;
+          if(this.jurisdiction.isSuper === '1'){
+              this.isSuper ='1'
+          }
       }
-      this.subType = "修改";
-      this.params.type = "";
-      this.params.title = "";
-      this.params.collection = "";
-      this.params.catalogId = nodeData.id;
-      this.params.id = nodeData.id;
-      this.infolist.parentId = nodeData.id;
-      this.pageSize = 1; //切换树重置分页
-      this.getList(this.params, this.pageSize);
+        this.subType = "修改";
+        this.params.type = "";
+        this.params.title = "";
+        this.params.collection = "";
+        this.params.catalogId = nodeData.id;
+        this.params.id = nodeData.id;
+        this.infolist.parentId = nodeData.id;
+        this.pageSize = 1; //切换树重置分页
+        // if(this.jurisdiction.isSuper === '1'){
+        //     this.params.auth = '2';
+        // }
+            this.getList(this.params, this.pageSize);
+
     },
     //获取权限
     async getQuan() {
@@ -883,27 +881,23 @@ export default {
         },
         data: {},
       }).then((res) => {
-        if (res.data) {
-          this.isSuper = res.data[0].isSuper || "";
-          this.jurisdiction = res.data[0];
-          if (this.jurisdiction.isSuper === "1") {
-            this.params.auth = "";
-          } else {
+        if(res.data){
+            this.isSuper = res.data[0].isSuper || "";
+            this.jurisdiction = res.data[0];
             switch (this.jurisdiction.roleDuty) {
-              case "二级经理":
-                this.params.auth = 2;
-                this.paramsSearch = 2;
-                break;
-              case "三级经理":
-                this.params.auth = 3;
-                this.paramsSearch.auth = 3;
-                break;
-              case "员工":
-                this.params.auth = 1;
-                this.paramsSearch = 1;
-                break;
+                case "二级经理":
+                    this.params.auth = 2;
+                    this.paramsSearch =2
+                    break;
+                case "三级经理":
+                    this.params.auth = 3;
+                    this.paramsSearch.auth =3
+                    break;
+                case "员工":
+                    this.params.auth = 1;
+                    this.paramsSearch =1
+                    break;
             }
-          }
         }
       });
       await this.getData();
@@ -913,7 +907,7 @@ export default {
       this.actionName = "";
       this.params.id = "";
       this.getList(this.params, this.pageSize);
-      this.$router.go(0);
+      this.$router.go(0)
     },
     // 获取目录
     async getData() {
@@ -926,63 +920,69 @@ export default {
         data: { isFile: "0" },
       }).then((res) => {
         if (res.data && res.data.length > 0) {
-          res.data.map((item) => {
-            if (this.jurisdiction.isSuper === "1") {
-              //全部加入list
-              this.menuList = res.data;
-              console.log(this.menuList);
-            } else {
-              //不是超级管理员
-              if (item.powerSwitch === 0) {
-                //不是固定文件夹
-                this.menuList.push(item);
-              }
-              if (this.jurisdiction.roleType === "省公司") {
-                if (item.powerSwitch === 1) {
-                  //是固定文件夹
-                  if (
-                    this.jurisdiction.roleId === item.id ||
-                    this.jurisdiction.parentId === item.id
-                  ) {
-                    this.menuList.push(item);
-                    if (
-                      this.jurisdiction.roleDuty === "三级经理" ||
-                      this.jurisdiction.roleDuty === "员工"
-                    ) {
-                      //小弟
-                      // this.menuList.push(res.data[i]);
-                      this.menuList.map((item) => {
-                        if (
-                          item.id === this.jurisdiction.roleId ||
-                          this.jurisdiction.parentId === item.id
-                        ) {
-                          item.childDept.map((items) => {
-                            if (items.id === this.jurisdiction.roleId) {
-                              item.childDept = [];
-                              item.childDept.push(items);
+            res.data.map((item) =>{
+                if (this.jurisdiction.isSuper === "1"){//全部加入list
+                    this.menuList = res.data;
+                }else{ //不是超级管理员
+                    if(item.powerSwitch === 0){ //不是固定文件夹
+                        this.menuList.push(item)
+                    }
+                    if(this.jurisdiction.roleType ==='省公司') {
+                            if(item.powerSwitch === 1){ //是固定文件夹
+                                if (
+                                    this.jurisdiction.roleId === item.id ||
+                                    this.jurisdiction.parentId === item.id
+                                ) {
+                                    this.menuList.push(item);
+                                    if (
+                                        this.jurisdiction.roleDuty === "三级经理" ||
+                                        this.jurisdiction.roleDuty === "员工"
+                                    ) {
+                                        //小弟
+                                        // this.menuList.push(res.data[i]);
+                                        this.menuList.map((item) =>{
+                                            if(item.id === this.jurisdiction.roleId ||this.jurisdiction.parentId===item.id){
+                                                item.childDept.map((items) =>{
+                                                    if(items.id === this.jurisdiction.roleId){
+                                                        item.childDept = [];
+                                                        item.childDept.push(items)
+                                                    }
+                                                })
+                                            }
+                                        })
+
+                                    }
+                                }
                             }
-                          });
-                        }
-                      });
+                    }else if(this.jurisdiction.roleType ==='地市公司'){
+
+                        //地市公司权限
+                       if(item.id === '66666666666666666'){
+
+                           this.menuList = []
+                           this.menuList.push((item))
+                       }
                     }
-                  }
+
+
                 }
-              }
+
+
+            })
+            // if (this.jurisdiction.isSuper == "1") {
+            //   this.menuList = res.data;
+            // }else{
+            //     for (let i = 0; i < res.data.length ; i++) {
+            //         if(this.jurisdiction.roleType ==='省公司' && res.data[i].id === '99999999999999999'){
+            //             this.menuList.push(res.data[i])
+            //         }
+            //         else {
+            //
+            //         }
+            //     }
+            // }
             }
-          });
-          // if (this.jurisdiction.isSuper == "1") {
-          //   this.menuList = res.data;
-          // }else{
-          //     for (let i = 0; i < res.data.length ; i++) {
-          //         if(this.jurisdiction.roleType ==='省公司' && res.data[i].id === '99999999999999999'){
-          //             this.menuList.push(res.data[i])
-          //         }
-          //         else {
-          //
-          //         }
-          //     }
-          // }
-        }
+
       });
     },
     // 获取权限

+ 55 - 6
src/pages/main/iptv/planApproval.vue

@@ -12,7 +12,7 @@
                         :row-style="tableRowClassName"
                         tooltip-effect="dark" size="small" border style="width: 100%" v-loading="loading">
                     <el-table-column prop="itemName" label="申请事项" width="200"></el-table-column>
-                    <el-table-column prop="planPurpose" label="策划目的" ></el-table-column>
+                    <el-table-column prop="planPurpose" label="策划目的" :formatter="formatter" ></el-table-column>
                     <el-table-column prop="createTime" label="申请时间" width="150"></el-table-column>
                     <el-table-column prop="createName" label="申请人" width="100"></el-table-column>
                     <el-table-column prop="queryStatus" label="状态" width="100">
@@ -52,7 +52,7 @@
                             <el-form-item prop="itemName" class="form-item">
                                 <el-input v-if="this.formStatus!=2 && '06'.includes(infolist.status)"
                                 v-model.trim="infolist.itemName" placeholder="请输入申请事项内容"
-                                          :disabled="disableStatus" >
+                                          :disabled="disableStatus" maxlength="61">
                                 </el-input>
                                 <div v-if="this.formStatus===2 || !'06'.includes(infolist.status)"
                                  class="el-descriptions">{{infolist.itemName}}</div>
@@ -75,7 +75,7 @@
                             <el-form-item prop="otherName" class="form-item">
                                 <el-input v-if="this.formStatus!=2 && '06'.includes(infolist.status)"
                                  v-model.trim="infolist.otherName"
-                                :disabled="disableStatus" placeholder="请输入其他频道名称"  ></el-input>
+                                :disabled="disableStatus" placeholder="请输入其他频道名称"  maxlength="17" ></el-input>
                                 <div v-if="this.formStatus===2 || !'06'.includes(infolist.status)"
                                  class="el-descriptions">{{infolist.otherName}}</div>
                             </el-form-item>
@@ -244,6 +244,39 @@ export default {
             }
 
         }
+
+        const itemNameRule = (rule, value, callback) => {
+            if(value) {
+                let  trimValue = value.replace(/^\s+|\s+$/gm,'');
+                if (!trimValue) {
+                    callback(new Error('不能为空'))
+                } else {
+                    if (value.length>60){
+                        callback(new Error('不能超过60个字'))
+                    }
+                    callback()
+                }
+            }else{
+                callback(new Error('不能为空'))
+            }
+        }
+
+        const otherNameRule = (rule, value, callback) => {
+            if(value) {
+                let  trimValue = value.replace(/^\s+|\s+$/gm,'');
+                if (!trimValue) {
+                    callback(new Error('不能为空'))
+                } else {
+                    if (value.length>16){
+                        callback(new Error('不能超过16个字'))
+                    }
+                    callback()
+                }
+            }else{
+                callback(new Error('不能为空'))
+            }
+        }
+
         const urls = {
             uploadUrl:'/market/iptv/upload',
             downfileUrl:'/market/iptv/downfile'
@@ -300,7 +333,7 @@ export default {
                 itemName: [{
                     required: true,
                     trigger: 'change',
-                    validator: nullRule
+                    validator: itemNameRule
                 }],
                 channelName: [{
                     required: true,
@@ -310,7 +343,7 @@ export default {
                 otherName: [{
                     required: true,
                     trigger: 'change',
-                    validator: nullRule
+                    validator: otherNameRule
                 }],
                 planPurpose: [{
                     required: true,
@@ -525,7 +558,11 @@ export default {
                 }
                 if(this.infolist.status==='2') this.nextStep="[分管副总]";
                 if(this.infolist.status==='6') this.nextStep="[频道负责人]";
-
+                if (this.infolist.channelName==='其他'){
+                    this.isOther = true;
+                }else{
+                    this.isOther = false;
+                }
                 this.loading = false;
             });
         },
@@ -700,6 +737,18 @@ export default {
                 return stylejson;
             }
             return ''
+        },
+        formatter(row, column) {
+            if (row.planPurpose){
+                if (row.planPurpose.length>100){
+                    return row.planPurpose.slice(1,100)+"......";
+                }else{
+                    return row.planPurpose;
+                }
+            }else{
+                return row.planPurpose;
+            }
+
         }
     },
     mounted() {

+ 2 - 0
src/pages/main/keyChannelCoop/appendix.vue

@@ -48,6 +48,8 @@
                             </el-table-column>
                             <el-table-column prop="townName" label="区县">
                             </el-table-column>
+                            <el-table-column prop="agentName" label="渠道名称">
+                            </el-table-column>
                             <el-table-column prop="uploadUserName" label="上报人">
                             </el-table-column>
                             <el-table-column prop="opTime" label="创建时间">

+ 969 - 0
src/pages/main/onlineExcel/index.vue

@@ -0,0 +1,969 @@
+<template>
+    <fullscreen :fullscreen.sync="fullscreen" class="container">
+    <div class="container">
+        <div class="main-box container-box">
+            <input type="hidden" id="excelId"/>
+            <div class="inner-left" style="overflow: hidden">
+                <!--                <div class="button-list">-->
+                <!--                    <el-button type="primary" @click="showExcel = true" plain>excel</el-button>-->
+                <!--                    <el-button type="primary" @click="showExcel = false" plain>不excel</el-button>-->
+                <!--                </div>-->
+                <div style="margin: 10px 0">
+                    <el-input placeholder="请输入内容" v-model="filterText" class="input-with-select" clearable
+                              @change="() => {if (!filterText) {searchMenu();}}">
+                        <el-button slot="append" @click="searchMenu" icon="el-icon-search"></el-button>
+                    </el-input>
+                </div>
+                <div v-loading="loading" style="height: calc(100% - 100px);overflow-y: scroll;overflow-x: scroll">
+                    <el-tree ref="tree" class="tree-line" :expand-on-click-node="false" :auto-expand-parent="true"
+                             :default-expand-all="true" :default-checked-keys="checkedMenu" :data="menuList"
+                             @check="checkChange"
+                             @node-click="nodeClick" :filter-node-method="filterNode" node-key="functionCode" style="width: 300px">
+                        <span class="custom-tree-node" slot-scope="{ node }">
+                            <span>
+                                <span v-if="node.data.type == 4"
+                                      style="color: #009cff" class="iconfont icon-wenjianjia"></span>
+                                <span v-else style="color: #fdb441" class="iconfont icon-wenjian"></span>
+                                <span
+                                    :style="node.data.hasOwnProperty('parent')? 'font-size:14px;padding-left:5px':'font-size:12px;padding-left:5px'">{{
+                                        node.data.functionName
+                                    }}</span>
+                            </span>
+                        </span>
+                    </el-tree>
+                </div>
+                <div class="tree-action"></div>
+            </div>
+            <div class="inner-right">
+                <div style="overflow: hidden;" v-if="showExcel == false">
+                    <toolList @iconCli='iconCli' :tooltit='tooltit' style="margin: 10px"></toolList>
+                    <div style="margin-top: 20px;float: left;" class="bigbtns">
+                        <el-button style="margin-left: 20px;" class="btn-check" size="medium" type="primary"
+                                   @click="addNewStatus = true">新建
+                        </el-button>
+                    </div>
+                    <div style="margin-top: 20px;float: right;margin-right: 20px" class="bigbtns"
+                         v-if="selectionSize != 0">
+                        <el-button style="margin-left: 5px;" class="btn-check" size="small" type="primary"
+                                   @click="delExcel()">删除
+                        </el-button>
+                        <el-button style="margin-left: 5px;" class="btn-check" size="small" type="primary"
+                                   @click="cancelSelection()">取消
+                        </el-button>
+                        <el-button style="margin-left: 5px;" class="btn-check" size="small" type="primary"
+                                   @click="moveStatus = true">移动到
+                        </el-button>
+                    </div>
+                </div>
+                <div class="tabbox" v-if="showExcel == false">
+                    <div id="selectionList" style="height: 30px">
+                        <span v-if="selectionSize != 0">已选{{ selectionSize }}项</span>
+                    </div>
+                    <el-table height="calc(100% - 60px)" class="com-table" ref="multipleTable" :data="tableData"
+                              tooltip-effect="dark" size="small" border style="width: 100%" v-loading="loading"
+                              @selection-change="handleSelectionChange">
+                        <el-table-column type="selection" width="45"></el-table-column>
+                        <el-table-column prop="fileName" label="名称">
+                        </el-table-column>
+                        <el-table-column prop="opTime" label="创建时间">
+                        </el-table-column>
+                        <el-table-column prop="addUserDept" label="创建科室">
+                        </el-table-column>
+                        <el-table-column prop="addUserName" label="创建人">
+                        </el-table-column>
+                        <el-table-column prop="shareEditStatus" label="权限状态">
+                            <template slot-scope="scope">
+                                <span v-if="scope.row.editStatus == 0">开</span>
+                                <span v-if="scope.row.editStatus == 1">关</span>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="操作" width="180px" align="center" fixed="right">
+                            <template slot-scope="scope">
+                                <el-button size="mini" type="primary" @click="moveToEdit(scope.row)"
+                                           :disabled="scope.row.shareEditStatus==1">编辑
+                                </el-button>
+                            </template>
+                        </el-table-column>
+                    </el-table>
+                    <el-pagination class="pageBox" @current-change="currchange" layout="prev, pager, next" background
+                                   :total="total">
+                    </el-pagination>
+                </div>
+                <div class="container" id="container" v-else>
+                    <iframe id="excelIframe" height="100%" width="100%" src="/marketfront/static/views/onlineShareExcel.html"
+                            frameborder="0"></iframe>
+                </div>
+            </div>
+        </div>
+        <el-dialog :title="'新建'" :visible.sync="addNewStatus" width="300px" :destroy-on-close="true"
+                   :modal-append-to-body="false" :close-on-click-modal="false">
+            <div>
+<!--                <el-button type="primary" @click="addExcel()" plain class="iconfont icon-wenjian">在线文档</el-button>-->
+<!--                <el-button type="primary" @click="addFolderStatus = true" plain class="iconfont icon-wenjianjia">文件夹</el-button>-->
+                <div style="padding-bottom: 30px">
+                    <div style="width: 85px;display: inline-block;cursor: pointer" @click="addExcel()">
+                        <span class="iconfont icon-wenjian" style="font-size: 80px;color: dodgerblue"></span>
+                        <p style="margin-left: 20px;margin-top: 10px">在线文档</p>
+                    </div>
+                    <div style="width: 85px;display: inline-block;margin-left: 70px;cursor: pointer" @click="addFolderStatus = true">
+                        <span class="iconfont icon-wenjianjia" style="font-size: 80px;color: dodgerblue"></span>
+                        <p style="margin-left: 20px;margin-top: 10px">文件夹</p>
+                    </div>
+                </div>
+            </div>
+        </el-dialog>
+        <el-dialog :title="'新增文件夹'" :visible.sync="addFolderStatus" width="50%" :destroy-on-close="true"
+                   :modal-append-to-body="false" :close-on-click-modal="false">
+            <div v-loading="loading">
+                <el-form :model="infolist" ref="infolist">
+                    <div class="online">
+                        <el-form-item prop="name">
+                            <span>文件夹名称</span>
+                            <el-input v-model="infolist.name" placeholder="文件夹名称" :disabled="disableStatus"></el-input>
+                        </el-form-item>
+                    </div>
+                </el-form>
+                <div slot="footer" class="dialog-footer myfooter">
+                    <el-button type="primary" @click="addNewFolder()">确 定</el-button>
+                    <el-button @click="addFolderStatus = false">取 消</el-button>
+                </div>
+            </div>
+        </el-dialog>
+        <el-dialog :title="'分享选项'" :visible.sync="shareStatus" width="500px" :destroy-on-close="true"
+                   :modal-append-to-body="false" :close-on-click-modal="false">
+            <div style="margin-left: 30px;padding-bottom: 20px" v-loading = 'shareLoading'>
+                <el-button type="primary" @click="processExcelShare(1)" plain>仅我可编辑</el-button>
+                <el-button type="primary" @click="openOADialog(2)" plain>所有人可编辑</el-button>
+                <el-button type="primary" @click="checkexa = true" plain>指定人可编辑</el-button>
+            </div>
+        </el-dialog>
+        <el-dialog title="选择填报人" :visible.sync="checkexa" width="50%" :destroy-on-close="true"
+                   :modal-append-to-body="false" :close-on-click-modal="false">
+            <div>
+                <el-form :model="exaList" ref="addInfoList">
+                    <el-form-item prop="processUserId" class="info-line online">
+                        <span style="width: 80px;margin-right: 20px">审批人员</span>
+                        <deptTreeUserNew class="tree" @treeCheck="treeCheckonly" :defaultList="defaultList"
+                                         :type="depttype" :closeList="closeList"></deptTreeUserNew>
+                        <div class="tree treeUser">
+                            <p v-for="(item,index) in treeList" :key="index">{{ item.receiveName }}
+                                <i @click="deletes(item,index)" class="el-icon-error"></i>
+                            </p>
+                        </div>
+                    </el-form-item>
+                </el-form>
+
+                <div slot="footer" style="text-align: right;padding-bottom: 20px">
+                    <el-button type="primary" @click="checkProcessUser(3)">确 定</el-button>
+                    <el-button @click="checkexa = false">取 消</el-button>
+                </div>
+            </div>
+        </el-dialog>
+        <el-dialog title="移动到" :visible.sync="moveStatus" width="500px" :destroy-on-close="true"
+                   :modal-append-to-body="false" :close-on-click-modal="false">
+            <div>
+                <el-tree ref="tree" class="tree-line" :expand-on-click-node="false" :auto-expand-parent="true"
+                         :default-expand-all="true" :default-checked-keys="checkedMenu" :data="moveMenuList"
+                         @check="checkChange"
+                         @node-click="folderNodeClick" node-key="functionCode" @expand-on-click-node="false">
+                        <span class="custom-tree-node" slot-scope="{ node }">
+                            <span>
+                                <span v-if="node.data.type == 4"
+                                      style="color: #009cff" class="iconfont icon-wenjianjia"></span>
+                                <span v-else style="color: #fdb441" class="iconfont icon-wenjian"></span>
+                                <span
+                                    :style="node.data.hasOwnProperty('parent')? 'font-size:14px;padding-left:5px':'font-size:12px;padding-left:5px'">{{
+                                        node.data.functionName
+                                    }}</span>
+                            </span>
+                        </span>
+                </el-tree>
+                <div slot="footer" style="text-align: right;padding-bottom: 20px">
+                    <el-button type="primary" @click="addFolderStatus = true" style="margin-right: 150px">+新建文件夹
+                    </el-button>
+                    <el-button type="primary" @click="moveExcel()">确 定</el-button>
+                    <el-button @click="moveStatus = false">取 消</el-button>
+                </div>
+            </div>
+        </el-dialog>
+        <myMessage :messTit='messTit' @closeMessage="processDel" :centerDialogVisible="delVisible"
+                   v-if="delVisible"></myMessage>
+        <myMessage :messTit='oaTitle' @closeMessage="processOa" :centerDialogVisible="oaVisible"
+                   v-if="oaVisible"></myMessage>
+    </div>
+    </fullscreen>
+</template>
+
+<script>
+import pForm from "../../../components/p-form";
+import toolList from "../../../components/toolList";
+import myMessage from "../../../components/myMessage.vue";
+import deptTreeUserNew from "../../../components/deptTreeUserNew.vue"
+
+export default {
+    components: {
+        pForm,
+        toolList,
+        myMessage,
+        deptTreeUserNew,
+    },
+    data() {
+        return {
+            fullscreen: false,
+            filterText: "", // tree搜索value
+            actionName: "", // 当前选择节点名称
+            menuList: [], // tree数据源
+            checkedMenu: [], // 选中节点的functionCode
+            checkedNodes: [], // 选中节点的node值
+            roleData: "", // 某一条数据
+            showExcel: false,
+            tableData: [],
+            loading: false,
+            total: 0,
+            pageSize: 1,
+            addNewStatus: false,
+            tooltit: '在线文档-文件管理',
+            addFolderStatus: false,
+            addExcelStatus: false,
+            infolist: {},
+            disableStatus: false,
+            nowFolder: {},
+            selectionList: [],
+            selectionSize: 0,
+            delVisible: false,
+            messTit: '',
+            shareStatus: false,
+            excelJson: '',
+            editFrom: '',
+            editTo: '',
+            editStatus: '',
+            excelName: '',
+            excelId: '',
+            checkexa: false,
+            exaList: {},
+            //审批人用到的
+            treeListonly: {},
+            defaultList: [],
+            treeList: [],
+            closeList: false,
+            depttype: 0,
+            shareType: '',
+            oaVisible: false,
+            oaTitle: '',
+            oaType: '',
+            moveStatus: false,
+            //移动文件夹tree相关
+            nowMoveFolder: {},
+            shareLoading : false,
+            woNo: '',
+            moveMenuList: [],
+        }
+    },
+    methods: {
+        processWoNo() {
+            console.log(this.woNo);
+            var _this = this;
+            this.$http({
+                url: '/market/cOnlineExcel/processWoNo',
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    id: _this.woNo,
+                },
+            }).then((res) => {
+                if (res.data.result === 1) {
+                    if (res.data.result != 'WONOEMPTY') {
+                        _this.$message({
+                            message: res.data.desc,
+                            type: 'error'
+                        });
+                    }
+                } else {
+                    _this.$message({
+                        message: '成功',
+                        type: 'success'
+                    });
+                    var id = res.data.desc;
+                    //放入id,切换到excel模式
+                    document.getElementById('excelId').setAttribute("value", id);
+                    _this.showExcel = true;
+                }
+            });
+        },
+        moveExcel() {
+            var _this = this;
+            var folderId = "";
+            if (this.nowFolder.type == '4') {
+                folderId = this.nowFolder.functionCode;
+            }
+            var arr = [];
+            this.selectionList.map((o) => {
+                arr.push(o.id);
+            });
+            this.$http({
+                url: '/market/cOnlineExcel/moveExcel',
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    moveIds: arr,
+                    moveFolderId: folderId
+                },
+            }).then((res) => {
+                if (res.data.result === 1) {
+                    _this.$message({
+                        message: res.data.desc,
+                        type: 'error'
+                    });
+                } else {
+                    _this.$message({
+                        message: res.data.desc,
+                        type: 'success'
+                    });
+                    _this.moveStatus = false;
+                    _this.tooltit = '在线文档-' + _this.nowFolder.functionName;
+                    _this.getList({}, this.pageSize);
+                }
+            });
+        },
+        // 点击树节点事件
+        folderNodeClick(a, b, c, d) {
+            this.nowFolder = a;
+        },
+        //检查是否选了填报人
+        checkProcessUser(v) {
+            let _this = this;
+            if (_this.treeList.length == 0) {
+                _this.$message({
+                    message: '请选择填报人',
+                    type: 'error'
+                });
+            } else {
+                _this.openOADialog(v);
+            }
+        },
+        //判断是否提交oa待办
+        processOa(v) {
+            if (v == 1) {
+                this.oaType = 1;
+            } else {
+                this.oaType = 0;
+            }
+            this.oaVisible = false;
+            this.processExcelShare(this.shareType);
+        },
+        //打开oa待办选项框
+        openOADialog(shareType) {
+            this.shareType = shareType;
+            this.oaTitle = '是否要推送OA待办?';
+            this.oaVisible = true;
+        },
+        //提交分享
+        processExcelShare(shareType) {
+            var deptList = [];
+            var _this = this;
+            _this.shareLoading = true;
+            if (shareType == 3) {
+                this.treeList.map((o) => {
+                    deptList.push(o.receiveNo);
+                });
+            }
+            if (shareType == 1) {
+                _this.shareType = 1;
+            }
+            console.log(deptList);
+            console.log('oa:' + this.oaType);
+            console.log('share:' + shareType);
+            //提交
+            this.$http({
+                url: '/market/cOnlineExcel/saveExcelShare',
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    data: _this.excelJson,
+                    id: _this.excelId,
+                    editConStart: _this.editFrom,
+                    editConEnd: _this.editTo,
+                    excelName: _this.excelName,
+                    editStatus: _this.editStatus,
+                    deptIds: deptList,
+                    oaType: _this.oaType,
+                    shareType: _this.shareType
+                },
+            }).then((res) => {
+                _this.shareLoading = false;
+                if (res.data.result === 1) {
+                    _this.$message({
+                        message: res.data.desc,
+                        type: 'error'
+                    });
+                } else {
+                    _this.$message({
+                        message: '分享成功',
+                        type: 'success'
+                    });
+                    _this.oaVisible = false;
+                    _this.checkexa = false;
+                    _this.shareStatus = false;
+                    _this.showExcel = false;
+                    _this.getList({}, this.pageSize);
+                }
+            });
+        },
+        //删除填报人
+        deletes(val, index) {
+            this.treeList.splice(index, 1);
+            this.closeList = this.treeList;
+        },
+        treeCheckonly(v) {
+            this.treeList = v;
+        },
+        //从excel页面调用来打开分享框
+        shareExcel(excelJson, editFrom, editTo, editStatus, excelName, excelId) {
+            console.log(excelJson, editFrom, editTo, editStatus, excelName, excelId);
+            this.excelJson = excelJson;
+            this.editFrom = editFrom;
+            this.editTo = editTo;
+            this.editStatus = editStatus;
+            this.excelName = excelName;
+            this.excelId = excelId;
+            this.shareStatus = true;
+        },
+        //从excel页面调用来关闭excel
+        closeExcel() {
+            this.showExcel = false;
+            this.getList({}, this.pageSize);
+        },
+        //打开excel
+        moveToEdit(row) {
+            //放入id,切换到excel模式
+            document.getElementById('excelId').setAttribute("value", row.id);
+            this.showExcel = true;
+        },
+        //新建excel
+        addExcel() {
+            var _this = this;
+            var folderId = "";
+            if (this.nowFolder.type == '4') {
+                folderId = this.nowFolder.functionCode;
+            }
+            this.$http({
+                url: '/market/cOnlineExcel/addExcel',
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    folderId: folderId,
+                },
+            }).then((res) => {
+                if (res.data.result === 1) {
+                    _this.$message({
+                        message: res.data.desc,
+                        type: 'error'
+                    });
+                } else {
+                    _this.$message({
+                        message: '成功',
+                        type: 'success'
+                    });
+                    var id = res.data.desc;
+                    _this.addNewStatus = false;
+                    //放入id,切换到excel模式
+                    document.getElementById('excelId').setAttribute("value", id);
+                    _this.showExcel = true;
+                }
+            });
+        },
+        //处理删除
+        processDel(v) {
+            this.delVisible = false;
+            if (v === 1) {
+                console.log(this.selectionList);
+                var arr = [];
+                this.selectionList.map((o) => {
+                    arr.push(o.id);
+                });
+                let _this = this;
+                //整理list并且执行删除
+                this.$http({
+                    url: "/market/cOnlineExcel/delExcel",
+                    method: "post",
+                    headers: {
+                        "Content-Type": "application/json",
+                    },
+                    data: {
+                        delIds: arr
+                    },
+                }).then((res) => {
+                    if (res.data.result === 1) {
+                        _this.$message({
+                            message: res.data.desc,
+                            type: 'error'
+                        });
+                    } else {
+                        _this.$message({
+                            message: '删除成功',
+                            type: 'success'
+                        });
+                        _this.getList({}, this.pageSize);
+                    }
+                });
+            }
+        },
+        //删除确认框
+        delExcel() {
+            this.delVisible = true;
+            this.messTit = '该文件删除后将无法找回,确认删除吗?';
+        },
+        handleSelectionChange(val) {
+            this.selectionList = val;
+            this.selectionSize = val.length;
+            console.log(this.selectionSize);
+        },
+        cancelSelection() {
+            this.selectionList = [];
+            this.selectionSize = 0;
+            this.$refs.multipleTable.clearSelection();
+        },
+        getList(v, n) {
+            var queryListType = "1";
+            var queryFolderId = "";
+            if (this.nowFolder.type) {
+                queryListType = this.nowFolder.type;
+                queryFolderId = this.nowFolder.functionCode;
+            }
+            this.pageSize = n;
+            this.loading = true;
+            this.tableData = [];
+            let _this = this;
+            this.$http({
+                url: "/market/cOnlineExcel/getExcelList",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                    "page": '{"pageNo":"' + n + '","pageSize":"10"}'
+                },
+                data: {
+                    queryListType: queryListType,
+                    queryFolderId: queryFolderId
+                },
+            }).then((res) => {
+                this.tableData = res.data.data;
+                this.total = res.data.totalRecord;
+                this.loading = false;
+            });
+        },
+        addNewFolder() {
+            console.log(this.nowFolder);
+            var _this = this;
+            if (!_this.infolist.name) {
+                _this.$message({
+                    message: '文件夹名称不能为空',
+                    type: 'error'
+                });
+                return;
+            }
+            var upFolderId = '';
+            if (this.nowFolder.type == "4") {
+                upFolderId = this.nowFolder.functionCode;
+            }
+            this.$http({
+                url: '/market/cOnlineExcel/addNewFolder',
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: {
+                    name: _this.infolist.name,
+                    upFolderId: upFolderId
+                },
+            }).then((res) => {
+                if (res.data.result === 1) {
+                    _this.$message({
+                        message: res.data.desc,
+                        type: 'error'
+                    });
+                } else {
+                    _this.$message({
+                        message: '成功',
+                        type: 'success'
+                    });
+                    _this.getTreeData();
+                    _this.addFolderStatus = false;
+                    _this.addNewStatus = false;
+                    _this.infolist = {};
+                }
+            });
+        },
+        //功能栏
+        iconCli(v) {
+            if (v === 1) {
+                this.getList(this.params, this.pageSize);
+            }
+            if (v === 2) {
+                this.fullscreen = !this.fullscreen
+            }
+        },
+        testExcel() {
+            document.getElementById("excelIframe").src = "";
+        },
+
+        // 搜索按钮事件
+        searchMenu() {
+            this.$refs.tree.filter(this.filterText);
+        },
+        // 树形图 复选框监听事件
+        checkChange(a, b, c, d) {
+            this.checkedNodes = b.checkedNodes;
+        },
+        // 点击树节点事件
+        nodeClick(a, b, c, d) {
+            console.log(a);
+            this.showExcel = false;
+            this.nowFolder = a;
+            this.tooltit = '在线文档-' + a.functionName;
+            this.getList({}, 1);
+        },
+        // tree过滤方法
+        filterNode(value, data) {
+            if (!value) return true;
+            return data.functionName.indexOf(value) !== -1;
+        },
+        // 分页
+        currchange(v) {
+            this.pageSize = v;
+            this.getList({}, this.pageSize);
+        },
+        getTreeData(data) {
+            this.loading = true;
+            this.$http({
+                url: "/market/cOnlineExcel/getFolderList",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: data,
+            }).then((res) => {
+                this.formatterData(res.data);
+            });
+        },
+        // 格式化树形图数据
+        formatterData(data) {
+            var arr = [];
+            var _this = this;
+            data.map((o) => {
+                var obj1 = {};
+                if (o.systemflag !== "1") {
+                    if (o.parentCode) {
+                        var cvTag = o.parentCode == "Top";
+                    } else {
+                        cvTag = false;
+                    }
+                    if (cvTag) {
+                        //判断是否是第一层
+                        obj1 = o;
+                        obj1.icon = o.icon || "layui-icon layui-icon-ok-circle";
+                        obj1.target = "_self";
+                        obj1.checked = o.checked;
+                        obj1.parent = "1";
+                        obj1.children = menuSon(o.functionCode);
+                        arr.push(obj1);
+                    }
+                }
+            });
+
+            function menuSon(id) {
+                var arr1 = [];
+                data.map((o) => {
+                    var obj1 = {};
+                    var myId = o.functionCode;
+                    if (o.parentCode == id) {
+                        //找到是父亲的儿子数据
+                        obj1 = o;
+                        obj1.target = "_self";
+                        var tag = sonIs(myId); //判断是否有儿子
+                        if (tag) {
+                            //有儿子
+                            obj1.children = menuSon(myId); //调用孙生成节点函数
+                        } else {
+                            obj1.children = "";
+                        }
+                        arr1.push(obj1);
+                    }
+                });
+                return arr1;
+            }
+
+            function sonIs(id) {
+                //查找是否有儿子
+                var tag = false;
+                data.map((o) => {
+                    if (o.parentCode == id) {
+                        tag = true;
+                    }
+                });
+                return tag;
+            }
+
+            this.menuList = arr;
+            //复制一份给移动文件夹用
+            this.moveMenuList = [];
+            arr.map((o) =>{
+                if (o.type == '4') {
+                    this.moveMenuList.push(o);
+                }
+            })
+            this.menuStatus = true;
+            this.loading = false;
+        },
+    },
+    mounted() {
+        this.woNo = this.$route.query.woNo
+        if (this.woNo != null) {
+            this.processWoNo();
+        }
+        this.getList({}, 1);
+        this.getTreeData();
+    },
+    created() {
+        window['backToExcelList'] = (rp) => {
+            this.closeExcel(rp);
+        }
+        window['shareExcel'] = (a, b, c, d, e, f) => {
+            this.shareExcel(a, b, c, d, e, f);
+        }
+    },
+    name: "index"
+}
+</script>
+
+<style lang="scss" scoped>
+.container {
+    background-color: #f0f2f5;
+
+    .el-col {
+        background-color: white;
+        padding: 0 20px;
+    }
+
+    .container-box {
+        padding: 0;
+        margin-top: 0;
+        height: 100%;
+    }
+
+    .main-box {
+        overflow: hidden;
+        display: flex;
+
+        > div {
+            background-color: white;
+        }
+
+        .inner-left {
+            width: 20%;
+            padding: 0 20px;
+
+            .canel-style {
+                color: #1890ff;
+                cursor: pointer;
+                padding-left: 10px;
+            }
+        }
+
+        .inner-right {
+            width: 80%;
+            margin-left: 1%;
+        }
+    }
+}
+
+.el-button + .el-button {
+    margin-left: 20px;
+}
+
+.button-list {
+    padding: 30px 0 10px 0;
+}
+
+.choice-style {
+    background: rgb(255, 255, 255);
+}
+
+.tree-action {
+    bottom: 0;
+    width: 100%;
+    // border-top: 1px solid #e8e8e8;
+    padding: 10px 16px;
+    text-align: left;
+    left: 0;
+    background: #fff;
+    border-radius: 0 0 2px 2px;
+}
+
+.tree-line {
+    .el-tree-node__content {
+        padding-left: 0 !important;
+    }
+
+    .el-tree-node__expand-icon.is-leaf {
+        display: none !important;
+    }
+
+    .el-tree-node {
+        position: relative;
+        padding-left: 16px; // 缩进量
+    }
+
+    .el-tree-node__children {
+        padding-left: 16px; // 缩进量
+    }
+
+    // 竖线
+    .el-tree-node::before {
+        content: "";
+        height: 100%;
+        width: 1px;
+        position: absolute;
+        left: -3px;
+        top: -17px;
+        border-width: 1px;
+        border-left: 1px dashed #52627c;
+    }
+
+    // 当前层最后一个节点的竖线高度固定
+    .el-tree-node:last-child::before {
+        height: 38px; // 可以自己调节到合适数值
+    }
+
+    // 横线
+    .el-tree-node::after {
+        content: "";
+        width: 24px;
+        height: 20px;
+        position: absolute;
+        left: -3px;
+        top: 20px;
+        border-width: 1px;
+        border-top: 1px dashed #52627c;
+    }
+
+    // 去掉最顶层的虚线,放最下面样式才不会被上面的覆盖了
+    & > .el-tree-node::after {
+        border-top: none;
+    }
+
+    & > .el-tree-node::before {
+        border-left: none;
+    }
+
+    // 展开关闭的icon
+    .el-tree-node__expand-icon {
+        font-size: 16px;
+
+        // 叶子节点(无子节点)
+        &.is-leaf {
+            color: transparent;
+            // display: none; // 也可以去掉
+        }
+    }
+}
+
+.ant-alert-info {
+    background-color: #e6f7ff;
+    border: 1px solid #91d5ff;
+}
+
+.ant-alert {
+    box-sizing: border-box;
+    margin: 0;
+    padding: 0;
+    color: rgb(0, 0, 0);
+    font-size: 14px;
+    font-variant: tabular-nums;
+    line-height: 1.5;
+    list-style: none;
+    font-feature-settings: "tnum";
+    position: relative;
+    padding: 8px 15px 8px 37px;
+    word-wrap: break-word;
+    border-radius: 4px;
+}
+
+.containerr {
+    background: #fff;
+    height: calc(100vh);
+    width: calc(100vw);
+    position: fixed;
+    left: 0;
+    top: 0;
+    overflow: hidden;
+}
+
+.tabbox {
+    margin: 15px;
+}
+
+.online {
+    width: 100%;
+
+    .el-select {
+        width: calc(100% - 100px);
+    }
+
+    span {
+        vertical-align: top;
+    }
+
+    .el-textarea {
+        width: calc(100% - 100px);
+    }
+
+    .tree {
+        width: calc(50% - 60px);
+        display: inline-block;
+        margin-right: 20px;
+        height: 300px;
+        overflow-y: scroll;
+
+        .el-icon-error {
+            float: right;
+            font-size: 20px;
+            margin-top: 9px;
+            cursor: pointer;
+        }
+    }
+
+    .treeUser {
+        margin: 0;
+        border: 1px solid #ddd;
+
+        p {
+            background: #f4f4f4;
+            padding: 0 20px;
+            margin-bottom: 5px;
+        }
+    }
+
+    .treeUserb {
+        width: calc(100% - 100px);
+        border: 1px solid #ddd;
+        background: #f4f4f4;
+        border-radius: 3px;
+        height: auto;
+        overflow: hidden;
+
+        p {
+            display: inline-block;
+            padding: 0 20px;
+            margin-bottom: 5px;
+        }
+    }
+}
+</style>

+ 3 - 3
src/pages/main/performance/components/sheet.vue

@@ -222,11 +222,11 @@
       </el-form>
       <template v-slot:footer>
         <div>
-          <el-button @click.prevent="handleApprove('1')">结束</el-button>
-          <el-button @click.prevent="handleApprove('4')" type="primary"
+          <el-button @click.prevent="handleApprove('1')" type="primary">结束</el-button>
+          <el-button @click.prevent="handleApprove('4')"
             >转副总审批</el-button
           >
-          <el-button @click.prevent="handleApprove('3')" type="primary"
+          <el-button @click.prevent="handleApprove('3')"
             >转总经理审批</el-button
           >
         </div>

+ 7 - 7
src/pages/main/performance/department.vue

@@ -126,19 +126,19 @@
       <template v-slot:footer
         ><div>
           <div v-if="type === '1'">
-            <el-button @click="handleTurn('finish')">结束</el-button>
-            <el-button @click="handleTurn('transfer')" type="primary"
+            <el-button @click="handleTurn('finish')" type="primary">结束</el-button>
+            <el-button @click="handleTurn('transfer')" 
               >转副总审批</el-button
             >
-            <el-button @click="handleTurn('transfermanger')" type="primary"
+            <el-button @click="handleTurn('transfermanger')"
               >转总经理审批</el-button
             >
           </div>
           <div v-else-if="type === '2'">
-            <el-button @click="handleTurn('finish')">结束</el-button>
-            <el-button @click="handleTurn('return')">退回</el-button>
-            <el-button @click="handleTurn('back')">打回</el-button>
-            <el-button @click="handleTurn('transfer')" type="primary"
+            <el-button @click="handleTurn('finish')" type="primary">结束</el-button>
+            <el-button @click="handleTurn('return')" type="primary">退回</el-button>
+            <el-button @click="handleTurn('back')" type="primary">打回</el-button>
+            <el-button @click="handleTurn('transfer')" 
               >转总经理审批</el-button
             >
           </div>

+ 73 - 0
src/pages/main/stockOperate/stockHandle.vue

@@ -0,0 +1,73 @@
+<template>
+    <div class="container" id="container">
+        <iframe
+            height="100%"
+            width="100%"
+            src="/marketfront/static/views/stockHandle.html"
+            frameborder="0"
+			:strategyid="strategyId"
+			:usrname="usrName"
+			:sts="sts"
+            :countyFlag="countyFlag"
+            :fillFlag = "fillFlag"
+            :regionName = "regionName"
+            :woName = "woName"
+			id="iframeBox"
+        ></iframe>
+    </div>
+    <!-- <div class="container" id="container">
+        <iframe
+            height="100%"
+            width="100%"
+            src="/static/views/stockHandle.html"
+            frameborder="0"
+			:strategyid="strategyId"
+			:usrname="usrName"
+			:sts="sts"
+            :countyFlag="countyFlag"
+            :fillFlag = "fillFlag"
+            :regionName = "regionName"
+            :woName = "woName"
+			id="iframeBox"
+        ></iframe>
+    </div> -->
+</template>
+<script>
+export default {
+	data() {
+		return {
+			strategyId: '',
+			usrName:'',
+			sts:'',
+			query: {},
+            countyFlag: '',
+            fillFlag:'',
+            regionName: '',
+            woName: ''
+		}
+	},
+    mounted() {
+        if (JSON.stringify(this.$route.query) != "{}") {
+			this.strategyId = this.$route.query.strategyId;
+			this.usrName = this.$route.query.usrName;
+			this.sts = this.$route.query.sts;
+            this.countyFlag = this.$route.query.countyFlag;
+            this.fillFlag = this.$route.query.fillFlag;
+            this.regionName = this.$route.query.regionName;
+            this.woName = this.$route.query.woName;
+			// this.query = this.$route.query
+        }
+    }
+};
+</script>
+<style scoped>
+.containerr {
+    background: #fff;
+    height: calc(100vh);
+    width: calc(100vw);
+    position: fixed;
+    left: 0;
+    top: 0;
+    overflow: hidden;
+}
+</style>

+ 930 - 0
src/pages/main/stockOperate/stockOperate.vue

@@ -0,0 +1,930 @@
+<template>
+    <fullscreen :fullscreen.sync="fullscreen" class="container">
+        <div class="container-box">
+            <toolList @iconCli="iconCli" :tooltit="tooltit"></toolList>
+            <div class="search">
+                <mySearch
+                    :searchList="searchList"
+                    @searchInfo="searchInfo"
+                ></mySearch>
+                <div>
+                    <el-button
+                        class="btn-check"
+                        size="medium"
+                        type="primary"
+                        @click="jumpadd"
+                        v-if="isFuncBtnShow"
+                    >新建
+                    </el-button>
+                    <!-- <el-button class="btn-check" size="medium" type="primary"
+                               @click="getTemple"
+                    >下载模板
+                    </el-button> -->
+                </div>
+            </div>
+
+            <div class="tabbox">
+                <el-table
+                    height="calc(100% - 40px)"
+                    class="com-table"
+                    ref="multipleTable"
+                    :data="tableData"
+                    tooltip-effect="dark"
+                    size="small"
+                    border
+                    style="width: 100%"
+                    v-loading="loading"
+                >
+                    <el-table-column prop="woName" label="模板名称">
+                    </el-table-column>
+                    <el-table-column prop="opTime" label="创建时间">
+                    </el-table-column>
+                    <el-table-column prop="sts" label="状态">
+                        <template slot-scope="scope">
+                            {{ stsArr[scope.row.sts] }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="reCode" label="分发范围">
+                    </el-table-column>
+                    <!-- <el-table-column prop="opName" label="分发范围">
+                        <template slot-scope="scope">
+                            <span
+                                :style="{color:'#606266'}"
+                                style="cursor:pointer"
+                                v-for="(item, index) in scope.row.groupNameList"
+                                :key="index"
+                            >
+                              {{
+                                    item + ","
+                                }}
+                            </span>
+                        </template>
+                    </el-table-column> -->
+                    <el-table-column label="操作" width="300px" align="center">
+                        <template slot-scope="scope">
+                            <!-- <el-button
+                                size="mini"
+                                type="primary"
+                                @click="jump(2, scope.row)"
+                                >查看</el-button
+                            > -->
+                            <el-button
+                                size="mini"
+                                type="primary"
+                                @click="jump(1, scope.row)"
+                                >{{
+                                    scope.row.fillFlag == 1 ? "处理" : "查看"
+                                }}</el-button
+                            >
+                            <el-button
+                                size="mini"
+                                type="primary"
+                                @click="jump(2, scope.row)"
+                                v-if="scope.row.fillFlag == 0"
+                                >办结</el-button
+                            >
+                            <!-- <el-button size="mini" type="primary" @click="jump(3, scope.row)" v-if="(loginNoStr == scope.row.nextOpNo && ((scope.row.provinceCity == 1 && scope.row.nextStep ==7) || (scope.row.provinceCity == 1 && scope.row.nextStep ==11) || (scope.row.provinceCity == 2 && scope.row.nextStep == 9) || (scope.row.provinceCity == 3 && scope.row.nextStep == 10))) && (scope.row.sts != 3)">子任务列表</el-button>
+                            <el-button size="mini" type="danger" @click="delLine(scope.row)" v-if="(loginNoStr == scope.row.opNo && ((scope.row.provinceCity == 1 && scope.row.nextStep <= 7) || (scope.row.provinceCity == 2 && scope.row.nextStep <= 10) || (scope.row.provinceCity == 3 && scope.row.nextStep <= 11)) && (scope.row.sts != 3))">删除</el-button>
+                            <el-button size="mini" type="primary" @click="jump(4, scope.row)" v-if="((scope.row.provinceCity == 1 && scope.row.nextStep == 12) || (scope.row.provinceCity == 2 && scope.row.nextStep == 10) || (scope.row.provinceCity == 3 && scope.row.nextStep == 11)) && (scope.row.countrySts == 0 || scope.row.countrySts == 2)">验收</el-button> -->
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <el-pagination
+                    class="pageBox"
+                    @current-change="currchange"
+                    layout="prev, pager, next"
+                    background
+                    :total="total"
+                >
+                </el-pagination>
+            </div>
+        </div>
+
+        <!-- 添加 -->
+        <el-dialog
+            title="添加"
+            :visible.sync="dialogStatus"
+            width="50%"
+            :destroy-on-close="true"
+            :modal-append-to-body="false"
+            :close-on-click-modal="false"
+            :fullscreen="true"
+        >
+            <el-form
+                :model="infolist"
+                ref="infolist"
+                :rules="rules"
+                style="height: calc(100vh - 180px);"
+            >
+                <el-form-item prop="woName" class="info-line online">
+                    <span>模板名称</span>
+                    <el-input
+                        v-model="infolist.woName"
+                        placeholder="模板名称"
+                    ></el-input>
+                </el-form-item>
+                <!-- <el-form-item prop="opTime" class="info-line online" v-if="regionFlag != '1'">
+                    <span>创建时间</span>
+                    <el-input
+                        v-model="infolist.opTime"
+                        placeholder="创建时间"
+                    ></el-input>
+                </el-form-item> -->
+                <!-- <el-form-item prop="modelName" class="info-line online"  v-if="regionFlag == '1'"> -->
+                <!-- 20220523功能取消 -->
+                <!-- <el-form-item prop="modelName" class="info-line online"  v-if="regionFlag == '1'">
+                    <span>模板选择</span>
+                    <el-select
+                        clearable
+                        v-model="infolist.modelName"
+                        placeholder="模板选择"
+                    >
+                        <el-option
+                            v-for="item in modelList"
+                            :key="item.woNo"
+                            :label="item.woName"
+                            :value="item.woNo"
+                        >
+                        </el-option>
+                    </el-select>
+                </el-form-item> -->
+
+                <!-- <el-form-item prop="time" class="info-line online">
+                    <span>统计周期</span>
+                    <el-date-picker
+                        v-model="infolist.time"
+                        type="daterange"
+                    ></el-date-picker>
+                </el-form-item> -->
+
+                <!-- <el-form-item class="info-line online">
+                    <span>填报人</span>
+                    <deptTree
+                        v-if="!disableStatus"
+                        :closeList="closeList"
+                        class="tree"
+                        @treeCheck="treeCheck"
+                    >
+                    </deptTree>
+                    <div
+                        :class="
+                            !disableStatus ? 'tree treeUser' : 'tree treeUserb'
+                        "
+                    >
+                        <p v-for="(item, index) in treeList" :key="index">
+                            {{ item.receiveName }}
+                            <i
+                                @click="deletess(item, index)"
+                                class="el-icon-error"
+                            ></i>
+                        </p>
+                    </div>
+                </el-form-item> -->
+                <!-- 20220523修改-取消功能 -->
+                <!-- <el-form-item class="info-line online" v-loading="loadinged">
+                    <span>地市选择</span>
+                    <div
+                        class="tree treeUser"
+                        style="width: 30%;margin-right: 1%;"
+                    >
+                        <p
+                            v-for="(item, index) in deptList"
+                            :key="index"
+                            @click="choseDepta(item)"
+                        >
+                            {{ item.ou }}
+                        </p>
+                    </div>
+                    <div
+                        :class="
+                            !disableStatus ? 'tree treeUser' : 'tree treeUserb'
+                        "
+                        style="width: 30%;"
+                    >
+                        <p v-for="(item, index) in treeListp" :key="index">
+                            <span>{{ item.ou }}</span>
+                            <i
+                                @click="deletes(item, index)"
+                                class="el-icon-error"
+                            ></i>
+                        </p>
+                    </div>
+                </el-form-item> -->
+            </el-form>
+            <div style="text-align: right;margin-top: 20px">
+                <el-button @click="dialogCli(1)" type="primary"
+                    >确 定</el-button
+                >
+                <el-button @click="dialogCli(2)">取 消</el-button>
+            </div>
+        </el-dialog>
+
+        <myMessage
+            :messTit="messTit"
+            @closeMessage="closeMessage"
+            :centerDialogVisible="centerDialogVisible"
+            v-if="centerDialogVisible"
+        ></myMessage>
+    </fullscreen>
+</template>
+<script>
+import mySearch from "../../../components/search.vue";
+import myMessage from "../../../components/myMessage.vue";
+import toolList from "../../../components/toolList";
+import myUpload from "../../../components/upload";
+import deptTree from "../../../components/deptTreeUser.vue";
+import deptTreep from "../../../components/deptTreeP.vue";
+
+export default {
+    components: {
+        mySearch,
+        myMessage,
+        toolList,
+        myUpload,
+        deptTree,
+        deptTreep
+    },
+    data() {
+        const woName = (rule, value, callback) => {
+            if (!this.infolist.woName) {
+                callback(new Error("不能为空"));
+            } else {
+                callback();
+            }
+        };
+        // const time = (rule, value, callback) => {
+        //     if (!this.infolist.time) {
+        //         callback(new Error("不能为空"));
+        //     } else {
+        //         callback();
+        //     }
+        // };
+        return {
+            rules: {
+                woName: [
+                    {
+                        required: true,
+                        trigger: "blur",
+                        validator: woName
+                    }
+                ]
+
+            },
+            searchList: [
+
+                {
+                    type: "sel",
+                    tit: "状态",
+                    value: "",
+                    width: "100%",
+                    options: [
+                        {
+                            dataCode: "0",
+                            dataName: "待上传模板"
+                        },
+                        {
+                            dataCode: "1",
+                            dataName: "填写中"
+                        },
+                        {
+                            dataCode: "2",
+                            dataName: "已锁定"
+                        },
+                        {
+                            dataCode: "3",
+                            dataName: "已办结"
+                        }
+                    ]
+                }
+
+            ],
+            tooltit: "存量运营策略征集",
+            fullscreen: false,
+            total: 0,
+            pageSize: 1,
+            tableData: [],
+            dialogStatus: false,
+            disableStatus: false,
+            titname: "",
+            infolist: {},
+            // treeList: [],
+            treeListp: [],
+            treeListponly: [],
+            closeList: [],
+            defaultList: [],
+            depttype: 0,
+            fadept: {},
+            deptList: [],
+            userInfo: {},
+            params: {},
+            centerDialogVisible: false,
+            messTit: "",
+            delid: "",
+            loading: false,
+            loadinged: false,
+
+            stsArr: ["待上传模板", "填写中", "已锁定","已办结"],
+            provinceCityArr: ["省", "地市", "区县"],
+            loginNoStr: "",
+            cityWoId: "",
+            menus: JSON.parse(window.sessionStorage.childrenMenus),
+            isFuncBtnShow: false,
+            countyFlag: "0",
+            regionList: [],
+            currentData: {},
+            regionFlag: "", //地区 0 省 1 地市 2 区
+            modelList: [], //模板列表
+            modelName: "", //模板名称
+        };
+    },
+
+    methods: {
+        jumpadd() {
+            this.dialogStatus = true;
+            this.getModelList();
+            this.advadd();
+        },
+        jump(v, n) {
+            if (v === 1) {
+                this.$router.push({
+
+                    path: "/stockHandle",
+                    query: {
+                        strategyId: n.woNo,
+                        usrName: n.fillName,
+                        sts: n.sts,
+                        countyFlag: this.countyFlag,
+                        fillFlag: n.fillFlag,
+                        regionName:'',
+                        woName: n.woName
+                    }
+                });
+            } else if (v === 2) {
+                this.centerDialogVisible = true;
+                this.messTit = "是否确定办结?";
+                this.currentData = n;
+            }
+        },
+        jumpjd(v, item) {
+            this.$router.push({
+                path: "/stockOperateCityList",
+                query: {
+                    regionCode: item,
+                    parentWoNo: v.woNo,
+                    woName: v.woName
+                }
+            });
+            // this.setabList("进度跟踪", "/stockOperateCityList?groupName=" + v.receiverGroupName);
+        },
+        dialogCli(v) {
+            let _this = this;
+            if (v === 1) {
+                let param = {};
+                param.mkStrategyBic = { fillName: this.userInfo.loginName };
+                param.mkStrategyBic.woName = this.infolist.woName;
+
+                if(this.regionFlag == '0'){
+                    param.mkStrategyBic.groupName = this.userInfo.areaName
+                }else if(this.regionFlag == '1'){
+                    param.mkStrategyBic.groupName = this.userInfo.cityName
+                }
+                param.mkStrategyBic.parentWoNo = this.infolist.modelName;
+                // 20220523取消功能
+                // param.regionList = [];
+                // for (let i = 0; i < this.treeListp.length; i++) {
+                //     param.regionList.push(
+                //         // dutyNo: this.treeListp[i].loginNoStr,
+                //         // dutyName: this.treeListp[i].loginNameStr,
+                //         // groupId: this.treeListp[i].o,
+                //         // groupName: this.treeListp[i].ou
+                //         this.treeListp[i].ou
+                //     );
+                // }
+                param.countyFlag = this.countyFlag;
+                this.$refs.infolist.validate(valid => {
+                    if (valid) {
+                        this.$http({
+                            url: "/market/cStrategyBic/add",
+                            method: "post",
+                            headers: {
+                                "Content-Type": "application/json"
+                            },
+                            data: param
+                        }).then(res => {
+                            if (res.data.result === 1) {
+                                _this.$message({
+                                    message: res.data.desc,
+                                    type: "error"
+                                });
+                            } else {
+                                _this.$message({
+                                    message: "成功",
+                                    type: "success"
+                                });
+                                _this.infolist = {};
+                                // _this.treeList = [];
+                                _this.treeListp = [];
+                                _this.dialogStatus = false;
+                                this.getList({}, 1);
+                                // location.reload();
+                            }
+                        });
+                    }
+                });
+            } else if (v === 2) {
+                this.infolist = {};
+                // this.treeList = [];
+                this.treeListp = [];
+                this.dialogStatus = false;
+            }
+        },
+
+        deletes(val, index) {
+            this.treeListp.splice(index, 1);
+        },
+        choseDepta(v) {
+            let x = "no";
+            for (let i = 0; i < this.treeListp.length; i++) {
+                if (this.treeListp[i].o == v.o) {
+                    x = i;
+                }
+            }
+            if (x != "no") {
+                this.treeListp.splice(x, 1);
+            } else {
+                this.treeListp.push(v);
+            }
+        },
+        advadd() {
+            this.dialogStatus = true;
+            this.loadinged = true;
+            if (
+                this.userInfo.cityName != null &&
+                this.userInfo.countyName == null
+            ) {
+                //地市
+                this.$http({
+                    url: "/sysmgr/csysdept/queryListByoO",
+                    method: "post",
+                    async: false,
+                    headers: {
+                        "Content-Type": "application/json"
+                    },
+                    data: {
+                        o: this.userInfo.groupId
+                    }
+                }).then(res => {
+                    // this.loadinged = false;
+                    // this.deptList = res.data;
+                    this.$http({
+                        url: "/sysmgr/csysdept/queryListByParent",
+                        method: "post",
+                        async: false,
+                        headers: {
+                            "Content-Type": "application/json"
+                        },
+                        data: {
+                            parentorgid: res.data[0].parentorgid
+                        }
+                    }).then(res => {
+                        this.loadinged = false;
+                        this.deptList = res.data;
+                    });
+                });
+            } else if (
+                this.userInfo.cityName == null &&
+                this.userInfo.countyName == null
+            ) {
+                this.$http({
+                    url: "/sysmgr/csysdept/queryRegionDeptList",
+                    method: "post",
+                    headers: {
+                        "Content-Type": "application/json"
+                    },
+                    data: {}
+                }).then(res => {
+                    this.loadinged = false;
+                    this.deptList = res.data[0].children;
+                });
+            } else {
+                this.isFuncBtnShow = false;
+            }
+        },
+        setabList(n, p) {
+            let params = {
+                children: "",
+                name: n,
+                rountPath: p,
+                target: "_self"
+            };
+            for (let i = 0; i < this.$store.state.tabList.length; i++) {
+                if (this.$store.state.tabList[i].name === params.name) {
+                    this.$store.state.tabList[i] = params;
+                }
+            }
+            let set = new Set([...this.$store.state.tabList, params]);
+            set.add(params);
+            this.$store.commit("setDefaultActive", params.rountPath);
+            this.$store.commit("setTabList", Array.from(set));
+        },
+        closedia() {
+            this.infolist = {};
+            this.dialogStatus = false;
+        },
+        //搜索数据
+        searchInfo(v) {
+            this.params = {};
+            v[0] ? (this.params.sts = v[0]) : "";
+
+            this.getList(this.params, this.pageSize);
+        },
+        //获取列表
+        getList(v, n) {
+            this.pageSize = n;
+            let _this = this;
+            this.loading = true;
+            // let regionList = [];
+
+            if (
+                this.userInfo.cityName != null &&
+                this.userInfo.countyName == null
+            ) {
+                //地市
+                this.regionList.push(this.userInfo.cityName);
+            } else if (this.userInfo.countyName != null) {
+                this.regionList.push(this.userInfo.countyName);
+            }
+
+            this.tableData = [];
+            this.$http({
+                url: "/market/cStrategyBic/queryMemeberWoInfo",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                    page: '{"pageNo":"' + n + '","pageSize":"10"}'
+                },
+                data: {
+                    mkStrategyBic: {
+                        fillName: this.userInfo.loginName, //登陆用户名
+                        sts: v.sts
+                    },
+                    regionList: this.regionList //用户区域
+                }
+            }).then(res => {
+                this.tableData = res.data.data;
+                this.total = res.data.totalRecord;
+                this.loading = false;
+            });
+        },
+        getModelList() {
+            this.loading = true;
+            this.$http({
+                url: "/market/cStrategyBic/queryByRegionCode",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json"
+                },
+                data: {
+                    param: { regionCode: this.userInfo.cityName }
+                }
+            }).then(res => {
+                this.modelList = res.data;
+                this.loading = false;
+            });
+        },
+        // 分页
+        currchange(v) {
+            this.pageSize = v;
+            this.getList({}, this.pageSize);
+        },
+
+        closeMessage(v) {
+            this.centerDialogVisible = false;
+            let _this = this;
+            if (v === 1) {
+                _this
+                    .$http({
+                        url: "/market/cStrategyBic/update",
+                        method: "post",
+                        headers: {
+                            "Content-Type": "application/json"
+                        },
+                        data: {
+                            fillName: this.userInfo.loginName,
+                            woNo: this.currentData.woNo,
+                            sts: 3
+                        }
+                    })
+                    .then(res => {
+                        if (res.data.result === 1) {
+                            _this.$message({
+                                message: res.data.desc,
+                                type: "error"
+                            });
+                        } else {
+                            _this.$message({
+                                message: "办结成功",
+                                type: "success"
+                            });
+                            _this.getList({}, this.pageSize);
+                        }
+                    });
+            }
+        },
+        //删除
+        delLine(v) {
+            this.centerDialogVisible = true;
+            this.messTit = "即将删除此条数据, 是否删除?";
+            this.delid = v.id;
+        },
+        //文件返回值
+        uploadBack(v) {
+            console.log(v);
+        },
+        //功能栏
+        iconCli(v) {
+            if (v === 1) {
+                this.getList({}, this.pageSize);
+            }
+            if (v === 2) {
+                this.fullscreen = !this.fullscreen;
+            }
+        },
+        getUser() {
+            this.userInfo = JSON.parse(window.sessionStorage.userInfo);
+            this.loginNoStr = this.userInfo.loginNoStr;
+        },
+        getTemple() {
+            let param = new FormData();
+            param.append("type", 'channel');
+            this.$http({
+                url: '/market/cAdvStrategy/downTemple',
+                method: "post",
+                responseType: 'blob',
+                headers: {
+                    "Content-Type": "application/json",
+                },
+                data: param,
+            }).then((response) => {
+                if (window.navigator && window.navigator.msSaveOrOpenBlob) {
+                    let blob = new Blob([response.data], {
+                        type: response.data.type
+                    });
+                    window.navigator.msSaveOrOpenBlob(blob, '存量运营策略征集模板.xlsx');
+                } else {
+                    /* 火狐谷歌的文件下载方式 */
+                    var blob = new Blob([response.data])
+                    var downloadElement = document.createElement('a')
+                    var href = window.URL.createObjectURL(blob);
+                    downloadElement.href = href;
+                    downloadElement.download = '存量运营策略征集模板.xlsx';
+                    document.body.appendChild(downloadElement);
+                    downloadElement.click();
+                    document.body.removeChild(downloadElement);
+                    window.URL.revokeObjectURL(href);
+                }
+            })
+        }
+    },
+    mounted() {
+        this.getUser();
+        this.getList({}, 1);
+        for (var i = 0; i < this.menus.length; i++) {
+            if (this.menus[i].jspUrl == "/stockOperate") {
+                this.isFuncBtnShow = true;
+                break;
+            }
+        }
+
+        if (this.userInfo.countyName != null) {
+            this.countyFlag = "0";
+            this.isFuncBtnShow = false;
+            this.regionFlag = "2";
+        } else if (
+            this.userInfo.cityName != null &&
+            this.userInfo.countyName == null
+        ) {
+            this.countyFlag = "1";
+            this.isFuncBtnShow = true;
+            this.regionFlag = "1";
+        } else if (
+            this.userInfo.cityName == null &&
+            this.userInfo.countyName == null
+        ) {
+            this.countyFlag = "1";
+            this.isFuncBtnShow = true;
+            this.regionFlag = "0";
+        }
+        this.userInfo.countyName != null
+            ? (this.countyFlag = "0")
+            : (this.countyFlag = "1");
+    },
+
+    created() {}
+};
+</script>
+<style scoped lang="scss">
+.onetab {
+    margin-bottom: 20px;
+    padding: 0 20px;
+}
+
+.titbox {
+    div {
+        float: right;
+
+        i {
+            font-size: 22px;
+            margin-left: 20px;
+            cursor: pointer;
+        }
+    }
+}
+
+.tabbox {
+    margin-top: 15px;
+}
+
+.pageBox {
+    text-align: right;
+    margin-top: 10px;
+}
+
+.info-line {
+    width: 100%;
+    display: block;
+    padding-left: 20px;
+
+    div {
+        width: 50%;
+        display: inline-block;
+    }
+
+    span {
+        width: 80px;
+        display: inline-block;
+        text-align: left;
+
+        i {
+            color: red;
+            display: inline-block;
+            padding-right: 5px;
+        }
+    }
+
+    .el-select,
+    .el-input {
+        width: calc(100% - 100px);
+    }
+}
+
+.online::v-deep {
+    width: 100%;
+
+    .el-select {
+        width: calc(100% - 120px);
+    }
+
+    span {
+        // vertical-align: top;
+    }
+
+    .el-textarea,
+    .el-date-editor {
+        width: calc(100% - 100px);
+        display: inline-flex;
+    }
+    .el-form-item__content {
+        display: flex;
+    }
+}
+.adv-type {
+    margin-top: 20px;
+    display: flex;
+    justify-content: space-between;
+    flex-wrap: wrap;
+    // border: 1px solid #ddd;
+    border-radius: 5px;
+    padding: 20px;
+    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+    div {
+        width: 33%;
+        text-align: center;
+        height: 80px;
+        overflow: hidden;
+        min-width: 100px;
+        cursor: pointer;
+        padding-top: 10px;
+        margin: 10px 0;
+    }
+    div:hover {
+        background: #cfe8fc;
+        border-radius: 5px;
+    }
+    span {
+        width: 100%;
+        display: inline-block;
+        height: 40px;
+        // line-height: 40px;
+        i {
+            color: #0074d9;
+            font-size: 36px;
+        }
+    }
+}
+
+.boximgc {
+    display: flex;
+    flex-wrap: wrap;
+    width: 100% !important;
+    margin-top: 20px;
+
+    div {
+        display: inline-block;
+        width: 18% !important;
+        margin-right: 2%;
+        margin-bottom: 20px;
+        overflow: hidden;
+        border: 1px solid #ddd;
+        border-radius: 3px;
+        background: #fff;
+        position: relative;
+        height: 100px;
+
+        img {
+            width: 100%;
+            position: absolute;
+            top: 0;
+            bottom: 0;
+            margin: auto;
+            // height: 100%;
+        }
+    }
+}
+.tree {
+    width: calc(50% - 60px);
+    display: inline-block;
+    margin-right: 20px;
+    height: 300px;
+    overflow-y: scroll;
+    flex: 1;
+    p {
+        overflow: hidden;
+        display: flex;
+        justify-content: space-between;
+    }
+    .p-btn {
+        width: 50px !important;
+        cursor: pointer;
+        color: #0074da;
+    }
+    span {
+        display: inline-block;
+        width: calc(100% - 100px);
+    }
+
+    .el-icon-error {
+        float: right;
+        font-size: 20px;
+        margin-top: 9px;
+        cursor: pointer;
+    }
+}
+
+.treeUser {
+    // margin: 0;
+    border: 1px solid #ddd;
+
+    p {
+        background: #f4f4f4;
+        padding: 0 20px;
+        margin-bottom: 5px;
+    }
+}
+
+.treeUserb {
+    width: calc(100% - 100px);
+    border: 1px solid #ddd;
+    background: #f4f4f4;
+    border-radius: 3px;
+    height: auto;
+    overflow: hidden;
+
+    p {
+        display: inline-block;
+        padding: 0 20px;
+        margin-bottom: 5px;
+    }
+}
+
+.treeUserp {
+    p {
+        padding: 5px;
+    }
+    p:hover {
+        background: #01bef0;
+        color: #fff;
+        cursor: pointer;
+    }
+}
+</style>

+ 559 - 0
src/pages/main/stockOperate/stockOperateCityList.vue

@@ -0,0 +1,559 @@
+<template>
+    <fullscreen :fullscreen.sync="fullscreen" class="container">
+        <div class="container-box">
+            <toolList @iconCli="iconCli" :tooltit="tooltit"></toolList>
+            <!-- <div class="search">
+                <mySearch
+                    :searchList="searchList"
+                    @searchInfo="searchInfo"
+                ></mySearch>
+                <el-button
+                    class="btn-check"
+                    size="medium"
+                    type="primary"
+                    @click="jumpadd"
+                    v-if="isFuncBtnShow"
+                    >新建
+                </el-button>
+            </div> -->
+            <div class="tabbox">
+                <el-table
+                    height="calc(100% - 40px)"
+                    class="com-table"
+                    ref="multipleTable"
+                    :data="tableData"
+                    tooltip-effect="dark"
+                    size="small"
+                    border
+                    style="width: 100%"
+                    v-loading="loading"
+                >
+                    <el-table-column prop="regionName" label="模板名称">
+                    </el-table-column>
+                    <el-table-column label="操作" width="300px" align="center">
+                        <template slot-scope="scope">
+                            <!-- <el-button
+                                size="mini"
+                                type="primary"
+                                @click="jump(2, scope.row)"
+                                >查看</el-button
+                            > -->
+                            <el-button
+                                size="mini"
+                                type="primary"
+                                @click="jump(1, scope.row)"
+                                >查看</el-button
+                            >
+                            <!-- <el-button
+                                size="mini"
+                                type="primary"
+                                @click="jump(2, scope.row)"
+                                v-if="scope.row.fillFlag == 0"
+                                >办结</el-button
+                            > -->
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <el-pagination
+                    class="pageBox"
+                    @current-change="currchange"
+                    layout="prev, pager, next"
+                    background
+                    :total="total"
+                >
+                </el-pagination>
+            </div>
+        </div>
+
+        <myMessage
+            :messTit="messTit"
+            @closeMessage="closeMessage(1)"
+            :centerDialogVisible="centerDialogVisible"
+            v-if="centerDialogVisible"
+        ></myMessage>
+    </fullscreen>
+</template>
+<script>
+import mySearch from "../../../components/search.vue";
+import myMessage from "../../../components/myMessage.vue";
+import toolList from "../../../components/toolList";
+import myUpload from "../../../components/upload";
+import deptTree from "../../../components/deptTreeUser.vue";
+import deptTreep from "../../../components/deptTreeP.vue";
+
+export default {
+    components: {
+        mySearch,
+        myMessage,
+        toolList,
+        myUpload,
+        deptTree,
+        deptTreep
+    },
+    data() {
+        const woName = (rule, value, callback) => {
+            if (!this.infolist.woName) {
+                callback(new Error("不能为空"));
+            } else {
+                callback();
+            }
+        };
+        // const time = (rule, value, callback) => {
+        //     if (!this.infolist.time) {
+        //         callback(new Error("不能为空"));
+        //     } else {
+        //         callback();
+        //     }
+        // };
+        return {
+            rules: {
+                woName: [
+                    {
+                        required: true,
+                        trigger: "blur",
+                        validator: woName
+                    }
+                ]
+                // time: [
+                //     {
+                //         required: true,
+                //         trigger: "change",
+                //         validator: time
+                //     }
+                // ]
+            },
+            searchList: [
+                // {
+                //     type: 'input',
+                //     tit: '业务名称',
+                //     value: '',
+                //     width: '32%',
+                // },
+                {
+                    type: "sel",
+                    tit: "状态",
+                    value: "",
+                    width: "100%",
+                    options: [
+                        {
+                            dataCode: "0",
+                            dataName: "待上传模板"
+                        },
+                        {
+                            dataCode: "1",
+                            dataName: "填写中"
+                        },
+                        {
+                            dataCode: "2",
+                            dataName: "已锁定"
+                        }
+                    ]
+                }
+                // {
+                //     type: 'date',
+                //     tit: '申请时间',
+                //     value: '',
+                //     width: '32%',
+                // },
+            ],
+            tooltit: "存量运营策略征集",
+            fullscreen: false,
+            total: 0,
+            pageSize: 1,
+            tableData: [],
+            dialogStatus: false,
+            disableStatus: false,
+            titname: "",
+            infolist: {},
+            // treeList: [],
+            treeListp: [],
+            treeListponly: [],
+            closeList: [],
+            defaultList: [],
+            depttype: 0,
+            fadept: {},
+            deptList: [],
+            userInfo: {},
+            params: {},
+            centerDialogVisible: false,
+            messTit: "",
+            delid: "",
+            loading: false,
+            loadinged: false,
+            fileInfo: {
+                limit: 10,
+                url: "/market/cwo/upload",
+                fileList: []
+            },
+            infoApply: {},
+            rovaList: [],
+            applicationDialogStatus: false,
+
+            stsArr: ["待上传模板", "填写中", "已锁定"],
+            provinceCityArr: ["省", "地市", "区县"],
+            loginNoStr: "",
+            cityWoId: "",
+            menus: JSON.parse(window.sessionStorage.childrenMenus),
+            isFuncBtnShow: false,
+            countyFlag: "0",
+            regionList: [],
+            currentData: {},
+            regionFlag: "0", //地区 0 省 1 地市 2 区
+            regionCode: "", //地市名称
+            parentWoNo: "", //工单id
+            woName: "" //模板名称
+        };
+    },
+    methods: {
+        jump(v, n) {
+            if (v === 1) {
+                this.$router.push({
+                    path: "/stockHandle",
+                    query: {
+                        strategyId: n.strategyId,
+                        usrName: this.userInfo.loginName,
+                        sts:'2',
+                        countyFlag: '2',
+                        fillFlag:'0',
+                        regionName: n.regionName,
+                        woName: this.woName
+                    }
+                });
+            }
+        },
+        //搜索数据
+        // searchInfo(v) {
+        //     this.params = {};
+        //     v[0] ? (this.params.sts = v[0]) : "";
+
+        //     this.getList(this.params, this.pageSize);
+        // },
+        //获取列表
+        getList(v, n) {
+            this.pageSize = n;
+            this.loading = true;
+            this.tableData = [];
+            this.$http({
+                url: "/market/cAdvStrategy/queryMkAdvStrategyByPWoNo",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json",
+                    page: '{"pageNo":"' + n + '","pageSize":"10"}'
+                },
+                data: {
+                    mkStrategyBic: {
+                        parentWoNo: this.parentWoNo
+                    },
+                    regionList: [this.regionCode]
+                }
+            }).then(res => {
+                this.tableData = res.data.data;
+                this.total = res.data.totalRecord;
+                this.loading = false;
+            });
+        },
+        // 分页
+        currchange(v) {
+            this.pageSize = v;
+            this.getList({}, this.pageSize);
+        },
+
+        closeMessage(v) {
+            this.centerDialogVisible = false;
+            let _this = this;
+            if (v === 1) {
+                _this
+                    .$http({
+                        url: "/market/cStrategyBic/update",
+                        method: "post",
+                        headers: {
+                            "Content-Type": "application/json"
+                        },
+                        data: {
+                            fillName: this.userInfo.loginName,
+                            woNo: this.currentData.woNo,
+                            sts: this.currentData.sts
+                        }
+                    })
+                    .then(res => {
+                        if (res.data.result === 1) {
+                            _this.$message({
+                                message: res.data.desc,
+                                type: "error"
+                            });
+                        } else {
+                            _this.$message({
+                                message: "办结成功",
+                                type: "success"
+                            });
+                            _this.getList({}, this.pageSize);
+                        }
+                    });
+            }
+        },
+        //删除
+        delLine(v) {
+            this.centerDialogVisible = true;
+            this.messTit = "即将删除此条数据, 是否删除?";
+            this.delid = v.id;
+        },
+        //功能栏
+        iconCli(v) {
+            if (v === 1) {
+                this.getList({}, this.pageSize);
+            }
+            if (v === 2) {
+                this.fullscreen = !this.fullscreen;
+            }
+        },
+        getUser() {
+            this.userInfo = JSON.parse(window.sessionStorage.userInfo);
+            this.loginNoStr = this.userInfo.loginNoStr;
+        }
+    },
+    mounted() {
+        if (JSON.stringify(this.$route.query) != "{}") {
+            this.regionCode = this.$route.query.regionCode;
+            this.parentWoNo = this.$route.query.parentWoNo;
+            this.woName = this.$route.query.woName;
+        }
+        this.getUser();
+        this.getList({}, 1);
+        // for (var i = 0; i < this.menus.length; i++) {
+        //     if (this.menus[i].jspUrl == "/stockOperate") {
+        //         this.isFuncBtnShow = true;
+        //         break;
+        //     }
+        // }
+
+        // if (this.userInfo.countyName != null) {
+        //     this.countyFlag = "0";
+        //     this.isFuncBtnShow = false;
+        //     this.regionFlag = "2";
+        // } else if (
+        //     this.userInfo.cityName != null &&
+        //     this.userInfo.countyName == null
+        // ) {
+        //     this.countyFlag = "1";
+        //     this.isFuncBtnShow = true;
+        //     this.regionFlag = "1";
+        // } else if (
+        //     this.userInfo.cityName == null &&
+        //     this.userInfo.countyName == null
+        // ) {
+        //     this.countyFlag = "1";
+        //     this.isFuncBtnShow = true;
+        //     this.regionFlag = "0";
+        // }
+        // this.userInfo.countyName != null
+        //     ? (this.countyFlag = "0")
+        //     : (this.countyFlag = "1");
+    },
+    created() {}
+};
+</script>
+<style scoped lang="scss">
+.onetab {
+    margin-bottom: 20px;
+    padding: 0 20px;
+}
+
+.titbox {
+    div {
+        float: right;
+
+        i {
+            font-size: 22px;
+            margin-left: 20px;
+            cursor: pointer;
+        }
+    }
+}
+
+.tabbox {
+    margin-top: 15px;
+}
+
+.pageBox {
+    text-align: right;
+    margin-top: 10px;
+}
+
+.info-line {
+    width: 100%;
+    display: block;
+    padding-left: 20px;
+
+    div {
+        width: 50%;
+        display: inline-block;
+    }
+
+    span {
+        width: 80px;
+        display: inline-block;
+        text-align: left;
+
+        i {
+            color: red;
+            display: inline-block;
+            padding-right: 5px;
+        }
+    }
+
+    .el-select,
+    .el-input {
+        width: calc(100% - 100px);
+    }
+}
+
+.online::v-deep {
+    width: 100%;
+
+    .el-select {
+        width: calc(100% - 120px);
+    }
+
+    span {
+        // vertical-align: top;
+    }
+
+    .el-textarea,
+    .el-date-editor {
+        width: calc(100% - 100px);
+        display: inline-flex;
+    }
+    .el-form-item__content {
+        display: flex;
+    }
+}
+.adv-type {
+    margin-top: 20px;
+    display: flex;
+    justify-content: space-between;
+    flex-wrap: wrap;
+    // border: 1px solid #ddd;
+    border-radius: 5px;
+    padding: 20px;
+    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+    div {
+        width: 33%;
+        text-align: center;
+        height: 80px;
+        overflow: hidden;
+        min-width: 100px;
+        cursor: pointer;
+        padding-top: 10px;
+        margin: 10px 0;
+    }
+    div:hover {
+        background: #cfe8fc;
+        border-radius: 5px;
+    }
+    span {
+        width: 100%;
+        display: inline-block;
+        height: 40px;
+        // line-height: 40px;
+        i {
+            color: #0074d9;
+            font-size: 36px;
+        }
+    }
+}
+
+.boximgc {
+    display: flex;
+    flex-wrap: wrap;
+    width: 100% !important;
+    margin-top: 20px;
+
+    div {
+        display: inline-block;
+        width: 18% !important;
+        margin-right: 2%;
+        margin-bottom: 20px;
+        overflow: hidden;
+        border: 1px solid #ddd;
+        border-radius: 3px;
+        background: #fff;
+        position: relative;
+        height: 100px;
+
+        img {
+            width: 100%;
+            position: absolute;
+            top: 0;
+            bottom: 0;
+            margin: auto;
+            // height: 100%;
+        }
+    }
+}
+.tree {
+    width: calc(50% - 60px);
+    display: inline-block;
+    margin-right: 20px;
+    height: 300px;
+    overflow-y: scroll;
+    flex: 1;
+    p {
+        overflow: hidden;
+        display: flex;
+        justify-content: space-between;
+    }
+    .p-btn {
+        width: 50px !important;
+        cursor: pointer;
+        color: #0074da;
+    }
+    span {
+        display: inline-block;
+        width: calc(100% - 100px);
+    }
+
+    .el-icon-error {
+        float: right;
+        font-size: 20px;
+        margin-top: 9px;
+        cursor: pointer;
+    }
+}
+
+.treeUser {
+    // margin: 0;
+    border: 1px solid #ddd;
+
+    p {
+        background: #f4f4f4;
+        padding: 0 20px;
+        margin-bottom: 5px;
+    }
+}
+
+.treeUserb {
+    width: calc(100% - 100px);
+    border: 1px solid #ddd;
+    background: #f4f4f4;
+    border-radius: 3px;
+    height: auto;
+    overflow: hidden;
+
+    p {
+        display: inline-block;
+        padding: 0 20px;
+        margin-bottom: 5px;
+    }
+}
+
+.treeUserp {
+    p {
+        padding: 5px;
+    }
+    p:hover {
+        background: #01bef0;
+        color: #fff;
+        cursor: pointer;
+    }
+}
+</style>

+ 4 - 4
src/pages/main/terminal/components/advert.vue

@@ -39,10 +39,10 @@
                 </div>
                 <div class="info-line">
                      <el-form-item>
-                        <span>工单编号</span>
-                        <el-date-picker disabled v-model="infoApply.num" type="date"
-                            placeholder="工单编号">
-                        </el-date-picker>
+                        <span>文件编号</span>
+                        <el-input disabled v-model="infoApply.num"
+                            placeholder="文件编号">
+                        </el-input>
                     </el-form-item>
                     <el-form-item>
                         <span>完成时间</span>

+ 74 - 1
src/router/index.js

@@ -22,6 +22,12 @@ const routes = [{
             component: (resolve) => require( /* webpackChunkName: "system" */['../pages/main/performance/index.vue'], resolve)
         },
         {
+            meta: { name:  '部门工作清单', keepAlive: false },
+            path: '/departWorkLists',
+            name: 'departWorkLists',
+            component: (resolve) => require( /* webpackChunkName: "system" */['../pages/main/departWorkLists/index.vue'], resolve)
+        },
+        {
             meta: { name:  '宣传稿件下发', keepAlive: false,type: 1 },
             path: '/infotechgj',
             name: 'infotechgj',
@@ -949,6 +955,28 @@ const routes = [{
             ]
         },
         {
+            meta: { name: '外呼调研', keepAlive: false },
+            path: '/compets',
+            name: 'compets',
+            redirect: 'competitors',
+            component: (resolve) => require( /* webpackChunkName: "system" */
+                ['../pages/main/competitors/index.vue'], resolve),
+            children: [
+                {
+                    meta: { name: '地市', keepAlive: false },
+                    path: '/competitors',
+                    name: 'competitors',
+                    component: (resolve) => require( /* webpackChunkName: "system" */['../pages/main/competitors/home'], resolve)
+                },
+                {
+                    meta: { name: '省公司', keepAlive: false },
+                    path: '/company',
+                    name: 'company',
+                    component: (resolve) => require( /* webpackChunkName: "system" */['../pages/main/competitors/company'], resolve)
+                }
+            ]
+        },
+        {
             meta: { name:  '测试终端管理', keepAlive: false },
             path: '/terminalhome',
             name: 'terminalhome',
@@ -1922,6 +1950,22 @@ const routes = [{
             path: '/CMkMagicBoxTop1',
             name: 'CMkMagicBoxTop1',
             component: (resolve) => require( /* webpackChunkName: "system" */ ['../pages/main/mbh/CMkMagicBoxTop'], resolve)
+        }, {
+            meta: {
+                name: '存量运营列表',
+                keepAlive: false
+            },
+            path: '/stockOperate',
+            name: 'stockOperate',
+            component: (resolve) => require( /* webpackChunkName: "system" */ ['../pages/main/stockOperate/stockOperate'], resolve)
+        }, {
+            meta: {
+                name: '存量运营办结',
+                keepAlive: false
+            },
+            path: '/stockHandle',
+            name: 'stockHandle',
+            component: (resolve) => require( /* webpackChunkName: "system" */ ['../pages/main/stockOperate/stockHandle'], resolve)
         },
         {
             meta: {
@@ -1932,6 +1976,17 @@ const routes = [{
             name: 'collect',
             component: (resolve) => require( /* webpackChunkName: "system" */ ['../pages/main/collect/index'], resolve)
         },
+
+        {
+            meta: {
+                name: '存量运营地市列表',
+                keepAlive: false
+            },
+            path: '/stockOperateCityList',
+            name: 'stockOperateCityList',
+            component: (resolve) => require( /* webpackChunkName: "system" */ ['../pages/main/stockOperate/stockOperateCityList'], resolve)
+        },
+
         {
             meta: { name: '版权事件备案', keepAlive: false },
             path: '/iptv',
@@ -1943,7 +1998,25 @@ const routes = [{
             path: '/planApproval',
             name: 'planApproval',
             component: (resolve) => require( /* webpackChunkName: "system" */['../pages/main/iptv/planApproval.vue'], resolve)
-        }
+        },
+        {
+            meta: {
+                name: '魔百和APK版本升级和应用上线测试',
+                keepAlive: false
+            },
+            path: '/apkTestMain',
+            name: 'apkTestMain',
+            component: (resolve) => require( /* webpackChunkName: "system" */ ['../pages/main/apkTestMain/index'], resolve)
+        },
+        {
+            meta: {
+                name: '在线文档',
+                keepAlive: false
+            },
+            path: '/onlineShareExcel',
+            name: 'onlineShareExcel',
+            component: (resolve) => require( /* webpackChunkName: "system" */ ['../pages/main/onlineExcel/index'], resolve)
+        },
     ]
 },
 {