浏览代码

v1.7.1_EDB

jwyu 1 年之前
父节点
当前提交
e68faf903f

+ 1 - 1
.env.development

@@ -1,5 +1,5 @@
 # 接口地址http://8.136.199.33:8610/v1   http://8.136.199.33:7778/adminapi
-VITE_APP_API_URL="http://8.136.199.33:8610/v1"
+VITE_APP_API_URL="http://8.136.199.33:7778/adminapi"
 # 路由根地址
 VITE_APP_BASE_URL="/"
 # 打包输入文件名

+ 28 - 0
src/api/dataEDB.js

@@ -270,5 +270,33 @@ export default{
      */
     getEDBSourceOpts(params){
         return get('/datamanage/edb_source/list',params)
+    },
+
+    /**
+     * 计算指标(指标运算新增)
+     * @param CalculateFormula 计算公式
+     * @param ClassifyId
+     * @param EdbName
+     * @param Frequency
+     * @param Unit
+     * @param EdbInfoIdArr eg:[{EdbInfoId:100,FromTag:A}]
+     */
+    addCalculateFormula(params){
+        return post('/datamanage/edb_info/calculate/save',params)
+    },
+
+    /**
+     * 计算指标(指标运算编辑)
+     * @param EdbInfoId
+     * @param CalculateFormula 计算公式
+     * @param ClassifyId
+     * @param EdbName
+     * @param Frequency
+     * @param Unit
+     * @param EdbInfoIdArr eg:[{EdbInfoId:100,FromTag:A}]
+     */
+    editCalculateFormula(params){
+        return post('/datamanage/edb_info/calculate/edit',params)
     }
+
 }

+ 3 - 1
src/views/dataEDB/calculate/Detail.vue

@@ -2,7 +2,7 @@
 import {ref} from 'vue'
 import { useRoute } from "vue-router";
 import FormulaCalculate from './components/FormulaCalculate.vue';
-
+import OtherCalculate from './components/OtherCalculate.vue';
 
 const route=useRoute()
 const type=ref(route.query.type||'')//计算类型
@@ -14,4 +14,6 @@ document.title=route.query.name||'指标运算'
 <template>
     <!-- 指标运算 -->
     <FormulaCalculate v-if="['4'].includes(type)"/>
+    <!-- 其他的运算 -->
+    <OtherCalculate v-if="['toMonthSeason','6','7','8','12','13','14','22','35','51','52','accumulate'].includes(type)"/>
 </template>

+ 82 - 18
src/views/dataEDB/calculate/components/FormulaCalculate.vue

@@ -1,12 +1,17 @@
 <script setup>
+import apiDataEDB from '@/api/dataEDB'
 import { showToast } from 'vant';
 import {reactive, ref} from 'vue'
 import SelectEDB from './SelectEDB.vue'
 import EDBHistory from '@/views/dataEDB/components/EDBHistory.vue'
+import SelectEDBClassify from '../../components/SelectEDBClassify.vue'
+import SelectEDBUnit from '../../components/SelectEDBUnit.vue'
+import SelectEDBFrequency from '../../components/SelectEDBFrequency.vue'
 import {calculateTypeTipsMap} from '../../util/config'
-import { useRoute } from 'vue-router';
+import { useRoute, useRouter } from 'vue-router';
 
 const route=useRoute()
+const router=useRouter()
 
 const letterOpts = [];//字母数据
 function initLetterOpt(){
@@ -70,7 +75,6 @@ function handleAddEdbList(){
 function handleDeleteEDBItem(index){
     edbList.value.splice(index, 1)
 }
-
 // 选择指标
 const showSelectEDB=ref(false)
 let whichIndex=0
@@ -105,6 +109,71 @@ const baseInfo=reactive({
     frequency:''
 })
 
+// 选择单位
+const showSelectUnit=ref(false)
+function onConfirmSelectUnit(value){
+    baseInfo.unit=value
+}
+
+//选择分类
+const showSelectClassify=ref(false)
+const classifyStr=ref('')
+function handleConfirmClassify({value,selectedOptions}){
+    baseInfo.classify=value
+    classifyStr.value=`${selectedOptions[0].ClassifyName}/${selectedOptions[1].ClassifyName}/${selectedOptions[2].ClassifyName}`
+}
+
+//选择频度
+const showSelectFrequency=ref(false)
+function handleConfirmFrequency(value){
+    baseInfo.frequency=value
+}
+
+// 提交计算
+async function handleSave(){
+    if(!formulaVal.value){
+        showToast('计算公式不能为空')
+        return
+    }
+    if(!baseInfo.name){
+        showToast('指标名称不能为空')
+        return
+    }
+    if(!baseInfo.unit){
+        showToast('指标单位不能为空')
+        return
+    }
+    if(!baseInfo.classify){
+        showToast('指标目录不能为空')
+        return
+    }
+    if(!baseInfo.frequency){
+        showToast('指标频度不能为空')
+        return
+    }
+    const arr=edbList.value.filter(item=>item.target).map(item=>{
+        return {
+            EdbInfoId: item.target,
+            FromTag: item.tag,
+        }
+    })
+    const params={
+        CalculateFormula:formulaVal.value,
+        ClassifyId:baseInfo.classify,
+        EdbName:baseInfo.name,
+        Frequency:baseInfo.frequency,
+        Unit:baseInfo.unit,
+        EdbInfoIdArr:arr
+    }
+    const edbInfoId=route.query.edbInfoId
+    const res=edbInfoId?await apiDataEDB.editCalculateFormula({...params,EdbInfoId:Number(edbInfoId)}):await apiDataEDB.addCalculateFormula(params)
+    if(res.Ret===200){
+        showToast(res.Msg)
+        setTimeout(() => {
+            router.back()
+        }, 1500);
+    }
+}
 
 </script>
 
@@ -182,7 +251,7 @@ const baseInfo=reactive({
                 @click-input="showSelectUnit=true"
             />
             <van-field 
-                :modelValue="selectClassifyNameStr"
+                :modelValue="classifyStr"
                 readonly
                 label="指标目录" 
                 placeholder="请选择指标目录"
@@ -199,7 +268,7 @@ const baseInfo=reactive({
                 input-align="right"
                 right-icon="arrow"
                 required
-                @click-input="showSelectClassify=true"
+                @click-input="showSelectFrequency=true"
             />
         </section>
         <div class="formula-intro-btn" @click="showTips=true">
@@ -208,7 +277,7 @@ const baseInfo=reactive({
         </div>
         <div class="opt-btns">
             <van-button class="primary2" @click="$router.back()">取消</van-button>
-            <van-button type="primary">生成计算指标</van-button>
+            <van-button type="primary" @click="handleSave">生成计算指标</van-button>
         </div>
     </div>
 
@@ -219,18 +288,13 @@ const baseInfo=reactive({
     <EDBHistory v-model:show="showEDBHistory" :edbInfoId="edbHistoryId"/>
 
     <!-- 选择单位 -->
-    <van-popup 
-        v-model:show="showSelectUnit" 
-        round 
-        position="bottom"
-    >
-        <van-picker
-            title="选择单位"
-            :columns="unitOpts"
-            @cancel="showSelectUnit=false"
-            @confirm="onConfirmSelectUnit"
-        />
-    </van-popup>
+    <SelectEDBUnit v-model:show="showSelectUnit" @select="onConfirmSelectUnit"/>
+
+    <!-- 选择分类 -->
+    <SelectEDBClassify v-model:show="showSelectClassify" @select="handleConfirmClassify" />
+
+    <!-- 选择频度 -->
+    <SelectEDBFrequency v-model:show="showSelectFrequency" @select="handleConfirmFrequency"/>
 
     <!-- 公式说明 -->
     <van-dialog 
@@ -246,7 +310,7 @@ const baseInfo=reactive({
 .formula-calculate-wrap{
     min-height: 90vh;
     background-color: $page-bg-grey;
-    padding-bottom: 190px ;
+    padding-bottom: 210px ;
 }
 .section{
     background-color: #fff;

+ 313 - 0
src/views/dataEDB/calculate/components/OtherCalculate.vue

@@ -0,0 +1,313 @@
+<script setup>
+import {ref,reactive} from 'vue'
+import { useRoute, useRouter } from "vue-router";
+import SelectEDB from './SelectEDB.vue'
+import SelectEDBClassify from '../../components/SelectEDBClassify.vue'
+import SelectEDBUnit from '../../components/SelectEDBUnit.vue'
+import SelectEDBFrequency from '../../components/SelectEDBFrequency.vue'
+import {calculateTypeTipsMap} from '../../util/config'
+
+const route=useRoute()
+const router=useRouter()
+
+//公式说明
+const showTips=ref(false)
+const tipsContent=ref(calculateTypeTipsMap.get(['toMonthSeason','accumulate'].includes(route.query.type)? route.query.type: Number(route.query.type))||'')
+
+let source=ref(0)//计算类型
+const tabsArr=ref([])
+// 初始化
+function init(){
+    // 累计值转月/季值
+    if(route.query.type==='toMonthSeason'){
+        tabsArr.value=[{ label: '累计值转月值',key: 5 },{ label: '累计值转季值',key: 61 }]
+        source.value=5
+    }else if(route.query.type==='accumulate'){//累计值
+        tabsArr.value=[{ label: '累计值',key: 62 },{ label: '年初至今累计值',key: 63 }]
+        source.value=62
+    }else{
+        tabsArr.value=[]
+        source.value=Number(route.query.type)
+    }
+}
+init()
+
+// 选择指标
+const showSelectEDB=ref(false)
+const selectEDBinfo=ref(null)
+function handleConfirmSelectEDB(e){
+    selectEDBinfo.value=e
+    updateBaseInfoData(e)
+}
+
+// 选择指标更新基础信息
+function updateBaseInfoData(data){
+    const tMap=new Map([
+		['日度','D'],
+		['周度','W'],
+		['旬度','T'],
+		['月度','M'],
+		['季度','Q'],
+		['年度','Y'],
+	])
+	const name_map = {
+		5: data.EdbName,
+		// 8: `${data.EdbName}/${this.formData.n_num}${tMap.get(data.Frequency)}MA`,
+		14: `${data.EdbName}/${data.Frequency}升频`,
+		6: `${data.EdbName}同比`,
+		7: `${data.EdbName}同差`,
+		// 12: `${data.EdbName}${this.formData.n_num}${data.Frequency.slice(0,1)}环比`,
+		// 13: `${data.EdbName}${this.formData.n_num}${data.Frequency.slice(0,1)}环差`,
+		// 35: `${data.EdbName}超季节性/${this.formData.n_num}年${this.formData.calendar_type==='公历'?'':'/'+this.formData.calendar_type}`,
+		52: `${data.EdbName}年化`,
+		51: `${data.EdbName}/${data.Frequency}降频`,
+		61:  data.EdbName,
+		62:  data.EdbName,
+		63:  data.EdbName,
+	}
+    baseInfo.name=name_map[source.value]||''
+    baseInfo.unit=data.Unit
+    baseInfo.frequency=source === 14 ? '日度' : source === 61 ? '季度' : source === 62 ? '' : data.Frequency
+}
+
+// 基础信息
+const edbNameInputFocus=ref(false)
+const baseInfo=reactive({
+    name:'',
+    unit:'',
+    classify:'',
+    frequency:''
+})
+
+// 选择单位
+const showSelectUnit=ref(false)
+function onConfirmSelectUnit(value){
+    baseInfo.unit=value
+}
+
+//选择分类
+const showSelectClassify=ref(false)
+const classifyStr=ref('')
+function handleConfirmClassify({value,selectedOptions}){
+    baseInfo.classify=value
+    classifyStr.value=`${selectedOptions[0].ClassifyName}/${selectedOptions[1].ClassifyName}/${selectedOptions[2].ClassifyName}`
+}
+
+//选择频度
+const showSelectFrequency=ref(false)
+function handleConfirmFrequency(value){
+    baseInfo.frequency=value
+}
+
+
+function handleSave(){
+
+}
+
+</script>
+
+<template>
+    <div class="other-calculate-wrap">
+        <van-tabs 
+            v-model:active="source" 
+            sticky 
+            border 
+            title-active-color="#0052D9" 
+            title-inactive-color="#333" 
+            line-width="16px" 
+            v-if="tabsArr.length"
+        >
+            <van-tab 
+                :title="tab.label" 
+                :name="tab.key" 
+                v-for="tab in tabsArr" 
+                :key="tab.key"
+            />
+        </van-tabs>
+        <section class="section select-edb-box">
+            <van-field
+                :modelValue="selectEDBinfo?.EdbName"
+                label="选择指标"
+                is-link
+                readonly
+                placeholder="请选择指标"
+                input-align="right"
+                @click-input="showSelectEDB=true"
+            >
+                <template #left-icon>
+                    <div class="left-icon" v-if="selectEDBinfo">
+                        <svg-icon name="edb-history-tag" size="24px"/>
+                    </div>
+                </template>
+            </van-field>
+        </section>
+        <section class="section edbinfo-box">
+            <div class="van-cell__title">已选指标</div>
+            <div v-if="!selectEDBinfo">
+                <img class="list-empty-img" src="https://hzstatic.hzinsights.com/static/ETA_mobile/empty_img.png" alt="">
+                <p style="text-align:center;color:#999">暂无指标</p>
+            </div>
+            <div class="info-box" v-else>
+                <h2 class="name">{{selectEDBinfo?.EdbName}}</h2>
+                <ul class="info-list">
+                    <li class="info-item">ID:{{selectEDBinfo.EdbCode}}</li>
+                    <li class="info-item">起始时间:{{selectEDBinfo.StartDate}}</li>
+                    <li class="info-item">频度:{{selectEDBinfo.Frequency}}</li>
+                    <li class="info-item">最新日期:{{selectEDBinfo.LatestDate}}</li>
+                    <li class="info-item">单位:{{selectEDBinfo.Unit}}</li>
+                    <li class="info-item">最新值:{{selectEDBinfo.LatestValue}}</li>
+                    <li class="info-item" style="width:100%">最近更新:{{selectEDBinfo.ModifyTime}}</li>
+                    <li class="info-item" style="width:100%">数据来源:{{selectEDBinfo.SourceName}}</li>
+                </ul>
+                <div style="text-align:right">
+                    <van-button color="#0052D9" size="small">查看数据</van-button>
+                    <van-button color="#D54941" size="small" style="color:#fff;margin-left:10px" @click="selectEDBinfo=null">删除</van-button>
+                </div>
+            </div>
+        </section>
+        <section class="section baseinfo-box">
+            <van-field 
+                v-model="baseInfo.name" 
+                label="指标名称" 
+                placeholder="指标名称"
+                input-align="right"
+                required
+                @focus="edbNameInputFocus=true"
+                @blur="edbNameInputFocus=false"
+            >
+                <template #right-icon>
+                    <svg-icon class="edit-icon" name="edit" :color="edbNameInputFocus?'#0052D9':'#333333'"/>
+                </template>
+            </van-field>
+            <van-field 
+                :modelValue="baseInfo.unit"
+                readonly
+                label="单位" 
+                placeholder="请选择单位"
+                input-align="right"
+                right-icon="arrow"
+                required
+                @click-input="showSelectUnit=true"
+                :disabled="[6,7].includes(source)"
+            />
+            <van-field 
+                :modelValue="classifyStr"
+                readonly
+                label="指标目录" 
+                placeholder="请选择指标目录"
+                input-align="right"
+                right-icon="arrow"
+                required
+                @click-input="showSelectClassify=true"
+            />
+            <van-field 
+                :modelValue="baseInfo.frequency"
+                readonly
+                label="频度" 
+                placeholder="请选择指标频度"
+                input-align="right"
+                right-icon="arrow"
+                required
+                @click-input="showSelectFrequency=true"
+            />
+        </section>
+
+        <div class="formula-intro-btn" @click="showTips=true">
+            <svg-icon class="icon" name="warning"></svg-icon>
+            <span>公式说明</span>
+        </div>
+        <div class="opt-btns">
+            <van-button class="primary2" @click="$router.back()">取消</van-button>
+            <van-button type="primary" @click="handleSave">生成计算指标</van-button>
+        </div>
+    </div>
+    
+    <!-- 选择指标 -->
+    <SelectEDB v-model:show="showSelectEDB" :source='source' @select="handleConfirmSelectEDB"/>
+
+    <!-- 选择单位 -->
+    <SelectEDBUnit v-model:show="showSelectUnit" @select="onConfirmSelectUnit"/>
+
+    <!-- 选择分类 -->
+    <SelectEDBClassify v-model:show="showSelectClassify" @select="handleConfirmClassify" />
+
+    <!-- 选择频度 -->
+    <SelectEDBFrequency v-model:show="showSelectFrequency" @select="handleConfirmFrequency"/>
+
+    <!-- 公式说明 -->
+    <van-dialog 
+        v-model:show="showTips" 
+        :title="$route.query.name"
+        confirmButtonText='知道啦'
+    >
+        <div class="edb-formula-tips-html-box" v-html="tipsContent"></div>
+    </van-dialog>
+</template>
+
+<style lang="scss" scoped>
+.other-calculate-wrap{
+    min-height: 90vh;
+    background-color: $page-bg-grey;
+    padding-bottom: 210px ;
+}
+.section{
+    background-color: #fff;
+    margin-bottom: 32px;
+}
+.edbinfo-box{
+    padding: var(--van-cell-horizontal-padding);
+    .info-box{
+        margin-top: 14px;
+        border-radius: 8px;
+        border: 1px solid $border-color;
+        box-shadow: $box-shadow;
+        padding: 20px;
+        .name{
+            font-size: 32px;
+            margin: 0 0 10px 0;
+        }
+        .info-list{
+            display: flex;
+            flex-wrap: wrap;
+            gap: 10px 0;
+            color: $font-grey;
+            margin-bottom: 10px;
+            .info-item{
+                width: 50%;
+            }
+        }
+    }
+}
+.formula-intro-btn{
+    width: 180px;
+    height: 60px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    gap: 5px;
+    color: $theme-color;
+    line-height: 1;
+    background-color: #fff;
+    border-radius: 32px;
+    margin-left: auto;
+    margin-right: var(--van-cell-horizontal-padding);
+    .icon{
+        width: 24px;
+        height: 24px;
+    }
+}
+.opt-btns{
+    position: fixed;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background-color: #fff;
+    z-index: 99;
+    padding: 48px;
+    display: flex;
+    justify-content: space-between;
+    .van-button{
+        width: 48%;
+    }
+}
+</style>

+ 15 - 1
src/views/dataEDB/calculate/components/SelectEDB.vue

@@ -8,6 +8,10 @@ const props=defineProps({
         type:Boolean,
         default:false
     },
+    source:{//计算类型
+        type:Number,
+        default:0
+    }
 })
 const emits=defineEmits(['update:show','select'])
 
@@ -24,10 +28,20 @@ const listState=reactive({
 })
 async function getEDBList(){
     listState.loading=true
+    const filterMap = {
+		5: 2,
+		14: 3,
+		63: 6
+	}
+    const params=props.source?{
+        FilterSource:filterMap[props.source] ? filterMap[props.source] : 1,
+        Frequency:props.source===61?'季度':''
+    }:{}
     const res=await apiDataEDB.edbSearchList({
         KeyWord:searchEDBTxt.value,
         CurrentIndex:listState.page,
-        PageSize:listState.pageSize
+        PageSize:listState.pageSize,
+        ...params
     })
     listState.loading=false
     if(res.Ret===200){

+ 53 - 0
src/views/dataEDB/components/SelectEDBClassify.vue

@@ -0,0 +1,53 @@
+<script setup>
+import {ref} from 'vue'
+import apiDataEDB from '@/api/dataEDB'
+
+const props=defineProps({
+    show:{
+        type:Boolean,
+        default:false
+    },
+})
+
+const emits=defineEmits(['update:show','select'])
+
+function handleClose(){
+    emits('update:show',false)
+}
+
+// 获取指标库分类
+const classify=ref('')
+const edbClassifyList=ref([])
+function getEdbClassifyList(){
+    apiDataEDB.edbClassifyList().then(res=>{
+        if(res.Ret===200){
+            edbClassifyList.value=res.Data.AllNodes||[]
+        }
+    })
+}
+getEdbClassifyList()
+
+function handleFinish({value,selectedOptions,tabIndex}){
+    emits('select',{value,selectedOptions})
+    handleClose()
+}
+
+
+</script>
+
+<template>
+    <van-popup 
+        :show="props.show" 
+        round
+        position="bottom"
+    >
+        <van-cascader
+            v-model="classify"
+            title="选择目录"
+            :options="edbClassifyList"
+            :field-names="{text:'ClassifyName',value:'ClassifyId',children:'Children'}"
+            @close="handleClose"
+            @finish="handleFinish"
+        />
+    </van-popup>
+</template>

+ 39 - 0
src/views/dataEDB/components/SelectEDBFrequency.vue

@@ -0,0 +1,39 @@
+<script setup>
+import {edbFrequencyOpts} from '../util/config'
+
+const frequencyOpts=edbFrequencyOpts.map(item=>{return{text:item,value:item}})
+
+const props=defineProps({
+    show:{
+        type:Boolean,
+        default:false
+    },
+})
+
+const emits=defineEmits(['update:show','select'])
+
+function handleClose(){
+    emits('update:show',false)
+}
+function onConfirmSelectFrequency(e){
+    const value=e.selectedValues[0]
+    emits('select',value)
+    handleClose()
+}
+
+</script>
+
+<template>
+    <van-popup 
+        :show="props.show" 
+        round 
+        position="bottom"
+    >
+        <van-picker
+            title="请选择频度"
+            :columns="frequencyOpts"
+            @cancel="handleClose"
+            @confirm="onConfirmSelectFrequency"
+        />
+    </van-popup>
+</template>

+ 39 - 0
src/views/dataEDB/components/SelectEDBUnit.vue

@@ -0,0 +1,39 @@
+<script setup>
+import {edbUnitOpts} from '../util/config'
+
+const unitOpts=edbUnitOpts.map(item=>{return{text:item,value:item}})
+
+const props=defineProps({
+    show:{
+        type:Boolean,
+        default:false
+    },
+})
+
+const emits=defineEmits(['update:show','select'])
+
+function handleClose(){
+    emits('update:show',false)
+}
+function onConfirmSelectUnit(e){
+    const value=e.selectedValues[0]
+    emits('select',value)
+    handleClose()
+}
+
+</script>
+
+<template>
+    <van-popup 
+        :show="props.show" 
+        round 
+        position="bottom"
+    >
+        <van-picker
+            title="选择单位"
+            :columns="unitOpts"
+            @cancel="handleClose"
+            @confirm="onConfirmSelectUnit"
+        />
+    </van-popup>
+</template>