浏览代码

switch branch

Karsa 1 年之前
父节点
当前提交
218860204f

+ 2 - 0
src/views/datasheet_manage/common/customTable.js

@@ -151,6 +151,8 @@ export function getRightClickMenu(pos) {
     'cell': [
       { label: "根据表格中日期选择指标值", key: "choose-target" },
       { label: "插入指标值", key: "insert-value" },
+      { label: "导入系统日期", key: "insert-sys-date" },
+      { label: "导入指标日期", key: "insert-edb-date" },
       { label: "清空", key: "reset" },
     ]
   }

+ 130 - 18
src/views/datasheet_manage/components/MixedTable.vue

@@ -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 {

+ 133 - 0
src/views/datasheet_manage/components/insertDateDia.vue

@@ -0,0 +1,133 @@
+<template>
+  <el-dialog
+		:visible.sync="isShow"
+		:close-on-click-modal="false"
+		:modal-append-to-body='false'
+    :title="title"
+		@close="cancelHandle"
+		custom-class="dialog"
+		center
+		width="560px"
+		v-dialogDrag>
+			<div class="dialog-main">
+          <!-- 导入系统日期 -->
+          <template>
+            <ul>
+              <li class="form-item">
+                <label>导入方式</label>
+                <el-select
+                    style="max-width: 120px;"
+                    v-model="formData.way"
+                    placeholder="请选择导入方式"
+                >
+                  <el-option
+                      v-for="item in wayOptions"
+                      :key="item.value"
+                      :label="item.name"
+                      :value="item.value"
+                  />
+                </el-select>
+  
+                <el-select
+                    style="max-width: 120px;margin:0 10px"
+                    v-model="formData.frequency"
+                    placeholder="请选择频度"
+                >
+                  <el-option
+                      v-for="item in wayOptions"
+                      :key="item.value"
+                      :label="item.name"
+                      :value="item.value"
+                  />
+                </el-select>
+
+                <el-select
+                    style="max-width: 120px;"
+                    v-model="formData.frequency_day"
+                    placeholder="请选择"
+                >
+                  <el-option
+                      v-for="item in wayOptions"
+                      :key="item.value"
+                      :label="item.name"
+                      :value="item.value"
+                  />
+                </el-select>
+
+                <el-tooltip effect="dark" :content="tips">
+                  <i class="el-icon-question"/>
+                </el-tooltip>
+              </li>
+              <li class="form-item">
+                <label>天数</label>
+                <el-input
+                  v-model="formData.num"
+                  type="number"
+                />
+                天
+              </li>
+            </ul>
+          </template>
+
+          <!-- 导入指标日期 -->
+          <template>
+            <div>
+            </div>
+          </template>
+			</div>
+			<div class="dia-bot">
+				<el-button type="primary" style="margin-right:20px" @click="saveHandle">保存</el-button>
+				<el-button type="primary" plain @click="cancelHandle">取消</el-button>
+			</div>
+	</el-dialog>
+</template>
+<script>
+export default {
+  props: {
+    isShow: {
+      type: Boolean
+    }
+  },
+  data() {
+    return {
+      formData: {
+        way: 1,
+        frequence: '',
+        frequency_day: '',
+        num: 0
+      },
+
+      wayOptions: [
+        { name: '直接导入', value: 1 },
+        { name: '日期计算', value: 2 },
+        { name: '指定频率', value: 3 },
+      ],
+
+    }
+  },
+  mounted(){
+
+  },
+  methods:{
+    cancelHandle() {
+      this.$emit('update:isShow',false)
+    }
+  },
+}
+</script>
+<style scoped lang='scss'>
+.dialog-main {
+  padding: 20px;
+  .form-item { 
+    margin: 10px 0; 
+    display: flex;
+    align-items: center;
+    label { width: 80px; }
+  }
+}
+.dia-bot {
+  margin: 30px 0;
+  display: flex;
+  justify-content: center;
+}
+</style>

+ 8 - 6
src/views/datasheet_manage/components/selectTargetValueDia.vue

@@ -64,16 +64,18 @@ export default {
 
       this.edbInfo = edb;
       
-      if(this.$parent.selectCell.DataType !== 1){
+      // if(this.$parent.selectCell.DataType !== 1){
 
-        this.$message.warning('请在表格中选择日期')
-        this.initData();
-        return
-      }
+      //   this.$message.warning('请在表格中选择日期')
+      //   this.initData();
+      //   return
+      // }
+
+      let Date = this.$parent.selectCell.DataType === 1 ? this.$parent.selectCell.ShowValue : ''
 
       const res = await sheetInterface.getDateLatelyData({ 
         EdbInfoId: edb.EdbInfoId,
-        Date: this.$parent.selectCell.ShowValue
+        Date
       })
       if(res.Ret !== 200) return