|
@@ -1,6 +1,17 @@
|
|
|
<template>
|
|
|
<div class="table-wrapper">
|
|
|
<template v-if="config.data.length">
|
|
|
+
|
|
|
+ <!-- 公式显示区 -->
|
|
|
+ <div class="formula-wrapper" v-if="!disabled">
|
|
|
+ <span style="flex-shrink: 0;color:#C0C4CC">公式</span>
|
|
|
+ <el-input
|
|
|
+ v-if="selectCell&&selectCell.DataType===6"
|
|
|
+ v-model="selectCell.Value"
|
|
|
+ @change="updateValueByFormula"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
<table
|
|
|
width="auto"
|
|
|
border="0"
|
|
@@ -47,6 +58,8 @@
|
|
|
@click="clickCell($event, cell)"
|
|
|
@contextmenu.prevent="rightClickHandle($event,cell)"
|
|
|
@mouseenter="getRelationEdbInfo(cell)"
|
|
|
+ @copy="copyHandle"
|
|
|
+ @paste="pasteHandle"
|
|
|
>
|
|
|
|
|
|
<!-- 插入单元格禁止编辑 -->
|
|
@@ -129,6 +142,10 @@
|
|
|
@insert="insertSelectData"
|
|
|
ref="selectTargetValueRef"
|
|
|
/>
|
|
|
+
|
|
|
+ <insertDateDia
|
|
|
+ :isShow.sync="isInsertDateDialog"
|
|
|
+ />
|
|
|
</div>
|
|
|
</template>
|
|
|
<script>
|
|
@@ -143,12 +160,15 @@ import {
|
|
|
setFocus,
|
|
|
findCellByKey,
|
|
|
resetRelationStyle,
|
|
|
- resetDialogCellStyle
|
|
|
+ resetDialogCellStyle,
|
|
|
+ extractFactorsFromFormula,
|
|
|
+ findCellByFactor
|
|
|
} from "../common/customTable";
|
|
|
import * as sheetInterface from "@/api/modules/sheetApi.js";
|
|
|
import { dataBaseInterface } from '@/api/api.js';
|
|
|
import md5 from '@/utils/md5.js';
|
|
|
import selectTargetValueDia from './selectTargetValueDia.vue';
|
|
|
+import insertDateDia from './insertDateDia.vue';
|
|
|
export default {
|
|
|
props: {
|
|
|
disabled: { //是否只预览
|
|
@@ -156,7 +176,7 @@ export default {
|
|
|
default: false,
|
|
|
}
|
|
|
},
|
|
|
- components: { selectTargetValueDia },
|
|
|
+ components: { selectTargetValueDia,insertDateDia },
|
|
|
computed: {
|
|
|
//列头
|
|
|
columnHeader() {
|
|
@@ -174,7 +194,17 @@ export default {
|
|
|
data() {
|
|
|
return {
|
|
|
config: {
|
|
|
- data: [], //单元格类型 1日期格 2指标格 3自定义输入 4插入值 有关联的日期和指标格 5弹窗里的插入值 有关联日期格
|
|
|
+ /* 单元格类型
|
|
|
+ 1手动日期格
|
|
|
+ 2指标格
|
|
|
+ 3自定义输入
|
|
|
+ 4插入值 表格里有关联的日期和指标格
|
|
|
+ 5弹窗里的插入值 有关联日期格
|
|
|
+ 6公式计算单元格
|
|
|
+ 7系统日期导入格
|
|
|
+ 8指标日期导入格
|
|
|
+ */
|
|
|
+ data: [],
|
|
|
contextMenuOption: [],
|
|
|
},
|
|
|
|
|
@@ -188,7 +218,9 @@ export default {
|
|
|
|
|
|
isSelectTargetValueDialog: false,
|
|
|
|
|
|
- cellrelationEdbInfo: {}
|
|
|
+ cellrelationEdbInfo: {},
|
|
|
+
|
|
|
+ isInsertDateDialog: false,//导入日期弹窗
|
|
|
};
|
|
|
},
|
|
|
mounted() {
|
|
@@ -196,8 +228,15 @@ export default {
|
|
|
},
|
|
|
methods: {
|
|
|
|
|
|
+ /* 输入时实时搜索 满足日期格式不搜索 有=视为输入公式不搜索 */
|
|
|
async searchTarget(query,cb) {
|
|
|
- if(!query||checkDateFormat(query)) return cb([])
|
|
|
+ //又要过滤掉2020-05-这样的奇葩其他格式 不让检索
|
|
|
+ let dateOtherRegex = /^(?:(?:19|20)\d\d)([-])(0[1-9]|1[0-2])(-?)$/
|
|
|
+ if(!query
|
|
|
+ ||checkDateFormat(query)
|
|
|
+ ||dateOtherRegex.test(query)
|
|
|
+ ||query.includes('=')
|
|
|
+ ) return cb([])
|
|
|
|
|
|
const { DataType,EdbInfoId } = this.selectCell;
|
|
|
|
|
@@ -223,7 +262,7 @@ export default {
|
|
|
|
|
|
setFocus(e);
|
|
|
|
|
|
- //插入值时寻找关联依赖的单元格 设置选框
|
|
|
+ //是插值单元格时寻找关联依赖的单元格 设置选框
|
|
|
if([4,5].includes(cell.DataType)) {
|
|
|
const { key } = e.target.dataset;
|
|
|
if(!this.insertRelationArr.find(_ => _.key===key)) return
|
|
@@ -364,12 +403,14 @@ export default {
|
|
|
this.checkCellRelation(cell)
|
|
|
},
|
|
|
|
|
|
- /* 输入框失焦 */
|
|
|
+ /* 输入框失焦 设置单元格类型 处理关联关系 */
|
|
|
async changeVal(e, cell) {
|
|
|
//非得搞一个要回车失焦
|
|
|
e.target.blur();
|
|
|
+
|
|
|
// 是日期格式 DataType为1
|
|
|
- // 否则是3
|
|
|
+ // 自定义内容 DataType 3
|
|
|
+ //有=号为输入公式 DataType 6
|
|
|
|
|
|
const {value} = e.target;
|
|
|
if(!value){ //无值重置单元格
|
|
@@ -389,7 +430,12 @@ export default {
|
|
|
cell.ShowValue = checkDateFormat(value);
|
|
|
cell.Value = checkDateFormat(value);
|
|
|
}else if(cell.EdbInfoId&&!cell.DataTime&&cell.Value===value) {//指标
|
|
|
-
|
|
|
+ }else if(value.includes('=')) {
|
|
|
+ // cell.DataType = 6;
|
|
|
+ // let calculateVal = await this.getValueByFormula(value);
|
|
|
+ // cell.ShowValue = calculateVal;
|
|
|
+ // console.log(cell)
|
|
|
+
|
|
|
}else {//自定义值
|
|
|
cell.DataType = 3;
|
|
|
cell.ShowValue = value;
|
|
@@ -480,11 +526,46 @@ export default {
|
|
|
this.insertRelationArr.splice(relationIndex,1)
|
|
|
},
|
|
|
|
|
|
+ /* 输入公式的计算值 */
|
|
|
+ async getValueByFormula(val) {
|
|
|
+
|
|
|
+ // 提取因数数组
|
|
|
+ let factors = extractFactorsFromFormula(val)
|
|
|
+ console.log(factors)
|
|
|
+
|
|
|
+ //根据因数找单元格
|
|
|
+ let isAllCell = factors.some(_ => findCellByFactor(_)=== null)
|
|
|
+ if(isAllCell) {
|
|
|
+ this.$message.warning('公式有误,参数不存在')
|
|
|
+ return '';
|
|
|
+ }
|
|
|
+
|
|
|
+ let TagMap = {};
|
|
|
+ factors.forEach(_ => {
|
|
|
+ if(!TagMap[_]) {
|
|
|
+ TagMap[_] = Number(findCellByFactor(_))
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ const res = await sheetInterface.calculateCustomCellData({
|
|
|
+ CalculateFormula: val,
|
|
|
+ TagMap
|
|
|
+ })
|
|
|
+ if(res.Ret !== 200) return
|
|
|
+ return res.Data
|
|
|
+ },
|
|
|
+
|
|
|
+ /* 顶部公式改变 */
|
|
|
+ async updateValueByFormula(value) {
|
|
|
+ this.changeVal({target: {value}},this.selectCell)
|
|
|
+ },
|
|
|
+
|
|
|
/* 右键 */
|
|
|
rightClickHandle(e,cell) {
|
|
|
if(this.disabled) return
|
|
|
|
|
|
const { rindex,cindex,key } = e.target.dataset;
|
|
|
+ console.log(rindex,cindex,key)
|
|
|
this.rightClickCell = {
|
|
|
rindex,
|
|
|
cindex,
|
|
@@ -501,6 +582,7 @@ export default {
|
|
|
}else {//单元格
|
|
|
pos = 'cell'
|
|
|
}
|
|
|
+ console.log(pos)
|
|
|
this.config.contextMenuOption = getRightClickMenu(pos)
|
|
|
|
|
|
|
|
@@ -522,14 +604,16 @@ export default {
|
|
|
/* 右键事件 */
|
|
|
async handleContext(key) {
|
|
|
const keyMap = {
|
|
|
- 'del': this.delColOrRow,
|
|
|
- 'insert-col-left': this.insertCol,
|
|
|
- 'insert-col-right': this.insertCol,
|
|
|
- 'insert-row-up': this.insertRow,
|
|
|
- 'insert-row-down': this.insertRow,
|
|
|
- 'insert-value': this.insertValue,
|
|
|
- 'choose-target': this.selectTargetOpen,
|
|
|
- 'reset': this.clearCell
|
|
|
+ 'del': this.delColOrRow,//删除
|
|
|
+ 'insert-col-left': this.insertCol,//向左插入列
|
|
|
+ 'insert-col-right': this.insertCol,//向右插入列
|
|
|
+ 'insert-row-up': this.insertRow,//向上插入行
|
|
|
+ 'insert-row-down': this.insertRow,//向下插入行
|
|
|
+ 'insert-value': this.insertValue,//插入值
|
|
|
+ 'choose-target': this.selectTargetOpen,//选择指标插入值
|
|
|
+ 'insert-sys-date': this.insertDateOpen,//导入系统日期
|
|
|
+ 'insert-edb-date': this.insertDateOpen,//导入指标日期
|
|
|
+ 'reset': this.clearCell //清空
|
|
|
}
|
|
|
keyMap[key] && keyMap[key](key)
|
|
|
|
|
@@ -537,7 +621,7 @@ export default {
|
|
|
},
|
|
|
|
|
|
/* 打开选择指标弹窗
|
|
|
- 打开弹窗后仍可以在页面上点击 多存一个选择指标时的信息 */
|
|
|
+ 打开弹窗后仍可以在页面上点击 多存一个选择指标时的当前单元格信息 */
|
|
|
selectTargetOpen() {
|
|
|
this.insertTargetCell = this.selectCell;
|
|
|
resetDialogCellStyle();
|
|
@@ -685,6 +769,13 @@ export default {
|
|
|
this.cellrelationEdbInfo = res.Data;
|
|
|
},
|
|
|
|
|
|
+ /* 导入系统/指标日期弹窗 */
|
|
|
+ insertDateOpen() {
|
|
|
+ this.insertTargetCell = this.selectCell;
|
|
|
+ resetDialogCellStyle();
|
|
|
+ this.isInsertDateDialog = true;
|
|
|
+ },
|
|
|
+
|
|
|
/* 初始化8行5列 */
|
|
|
initData(initData=null) {
|
|
|
if(initData) {
|
|
@@ -705,6 +796,14 @@ export default {
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
+
|
|
|
+ copyHandle(e) {
|
|
|
+ console.log(e)
|
|
|
+ },
|
|
|
+
|
|
|
+ pasteHandle(e) {
|
|
|
+ console.log(e)
|
|
|
+ }
|
|
|
},
|
|
|
};
|
|
|
</script>
|
|
@@ -718,6 +817,18 @@ export default {
|
|
|
.table-wrapper {
|
|
|
width: 100%;
|
|
|
overflow: auto;
|
|
|
+
|
|
|
+ .formula-wrapper {
|
|
|
+ height: 42px;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ background: #fff;
|
|
|
+ border-radius: 4px;
|
|
|
+ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
|
|
|
+ border: 1px solid #DCDFE6;
|
|
|
+ margin-bottom: 15px;
|
|
|
+ padding: 0 15px;
|
|
|
+ }
|
|
|
.table td,th {
|
|
|
width: 104px;
|
|
|
min-width: 104px;
|
|
@@ -859,6 +970,7 @@ export default {
|
|
|
background-color: #fff;
|
|
|
}
|
|
|
}
|
|
|
+.formula-wrapper .el-input__inner { border: none; outline: none; }
|
|
|
.edb-select-popover {
|
|
|
width: 300px !important;
|
|
|
.edb-item {
|