123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554 |
- <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 SeeEDBDataList from './SeeEDBDataList.vue'
- import {calculateTypeTipsMap} from '../../util/config'
- import { showToast } from 'vant';
- import apiDataEDB from '@/api/dataEDB'
- const route=useRoute()
- const router=useRouter()
- const moveTypeOpts=[{name:'领先',key:1},{name:'滞后',key:2}]
- const moveUnitOpts=[
- {name:'天',key:'天'},
- {name:'周',key:'周'},
- {name:'月',key:'月'},
- {name:'季',key:'季'},
- {name:'年',key:'年'},
- ]
- //公式说明
- const showTips=ref(false)
- const tipsContent=ref(calculateTypeTipsMap.get(['toMonthSeason','accumulate'].includes(route.query.source)? route.query.source: Number(route.query.source))||'')
- //提交计算按钮文字
- function getCalculateBtnText(){
- let str='生成计算指标'
- const btnTextMap=new Map([
- [5,'转月值计算'],
- [6,'同比值计算'],
- [7,'同差值计算'],
- [8,'移动平均计算'],
- [12,'环比值计算'],
- [13,'环差值计算'],
- [14,'升频计算'],
- [22,'保存'],
- [35,'超季节性计算'],
- [52,'年化计算'],
- [51,'降频计算'],
- [61,'转季值计算'],
- [62,'累计值计算'],
- [63,'年初至今计算'],
- ])
- str=btnTextMap.get(source.value)
- return str
- }
- const editEdbInfoId=ref(route.query.edbInfoId||0)//编辑时的指标id
- const source=ref(0)//计算类型
- const tabsArr=ref([])
- // 初始化
- function init(){
- // 累计值转月/季值
- if(route.query.source==='toMonthSeason'){
- tabsArr.value=[{ label: '累计值转月值',key: 5 },{ label: '累计值转季值',key: 61 }]
- source.value=5
- }else if(route.query.source==='accumulate'){//累计值
- tabsArr.value=[{ label: '累计值',key: 62 },{ label: '年初至今累计值',key: 63 }]
- source.value=62
- }else{
- tabsArr.value=[]
- source.value=Number(route.query.source)
- }
- }
- 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}/${baseInfo.numberN}${tMap.get(data.Frequency)}MA`,
- 14: `${data.EdbName}/${data.Frequency}升频`,
- 6: `${data.EdbName}同比`,
- 7: `${data.EdbName}同差`,
- 12: `${data.EdbName}${baseInfo.numberN}${data.Frequency.slice(0,1)}环比`,
- 13: `${data.EdbName}${baseInfo.numberN}${data.Frequency.slice(0,1)}环差`,
- 35: `${data.EdbName}超季节性/${baseInfo.numberN}年${baseInfo.calendarType==='公历'?'':'/'+baseInfo.calendarType}`,
- 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=[5,8,14,7,35].includes(source.value) ? data.Unit : '无',
- baseInfo.frequency=source.value === 14 ? '日度' : source.value === 61 ? '季度' : source.value === 62 ? '' : data.Frequency
- // baseInfo.classify=data.ClassifyId
- // selectEDBClassifyINS.value?.getSelectClassifyOpt(data.ClassifyId)//获取选择的分类目录
- }
- // 基础信息
- const edbNameInputFocus=ref(false)
- const numberNInputFocus=ref(false)
- const baseInfo=reactive({
- name:'',
- unit:'',
- classify:'',
- frequency:'',
- numberN:1,//N值
- moveVal:'',
- moveType:1,
- moveUnit:'天',
- calendarType:'公历',
- valueType:'期末值'
- })
- // 选择单位
- const showSelectUnit=ref(false)
- function onConfirmSelectUnit(value){
- baseInfo.unit=value
- }
- //选择分类
- const showSelectClassify=ref(false)
- const classifyStr=ref('')
- const selectEDBClassifyINS=ref(null)
- 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
- }
- //移动方式类型选择
- const showMoveType=ref(false)
- function onSelectMoveType(e){
- baseInfo.moveType=e.key
- }
- function getMoveTypeName(e){
- return moveTypeOpts.filter(item=>item.key===e)[0].name
- }
- //移动方式单位选择
- const showMoveUnit=ref(false)
- function onSelectMoveUnit(e){
- baseInfo.moveUnit=e.key
- }
- //超季节性日历选择
- const showSelectCalendar=ref(false)
- //降频数据取值选择
- const showDataValSelect=ref(false)
- //查看指标数据详情
- const showSeeEDBDataList=ref(false)
- // 提交计算
- const saveBtnLoading=ref(false)
- async function handleSave(){
- if(!selectEDBinfo.value){
- showToast('指标不能为空')
- return
- }
- if(!baseInfo.name){
- showToast('指标名称不能为空')
- return
- }
- if(!baseInfo.unit){
- showToast('指标单位不能为空')
- return
- }
- if(!baseInfo.classify){
- showToast('指标目录不能为空')
- return
- }
- if(!baseInfo.frequency){
- showToast('指标频度不能为空')
- return
- }
- const valueMap = {
- 22: 'moveVal',
- 51: 'valueType'
- }
- const params={
- FromEdbInfoId: selectEDBinfo.value.EdbInfoId,
- Source: source.value,
- EdbName: baseInfo.name,
- Unit: baseInfo.unit,
- ClassifyId: baseInfo.classify,
- Frequency: baseInfo.frequency,
- Formula: valueMap[source.value] ? String(baseInfo[valueMap[source.value]]) : String(baseInfo.numberN),
- MoveFrequency: baseInfo.moveUnit,
- MoveType: baseInfo.moveType,
- Calendar: baseInfo.calendarType,
- }
- saveBtnLoading.value=true
- const res=await apiDataEDB.addCalculateEDB(params)
- saveBtnLoading.value=false
- if(res.Ret===200){
- showToast(res.Msg)
- setTimeout(() => {
- router.back()
- }, 1500);
- }
- }
- // tab切换重置表单
- function handleTabChange(){
- selectEDBinfo.value=null
- baseInfo.name=''
- baseInfo.unit=''
- baseInfo.classify=''
- baseInfo.frequency=''
- baseInfo.numberN=1
- baseInfo.moveVal=''
- baseInfo.moveType=1
- baseInfo.moveUnit='天'
- baseInfo.calendarType='公历'
- baseInfo.valueType='期末值'
- classifyStr.value=''
- }
- </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"
- @change="handleTabChange"
- 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" @click="showSeeEDBDataList=true">查看数据</van-button>
- </div>
- </div>
- </section>
- <section class="section baseinfo-box">
- <!-- 时间位移(移动方式) -->
- <van-field
- label="移动方式"
- required
- v-if="source===22"
- >
- <template #input>
- <div class="move-type-box">
- <div class="btn" @click="showMoveType=true">
- <svg-icon name="swap"></svg-icon>
- <span>{{getMoveTypeName(baseInfo.moveType)}}</span>
- </div>
- <input class="input" type="number" :min="0" v-model="baseInfo.moveVal">
- <div class="btn" @click="showMoveUnit=true">
- <svg-icon name="swap"></svg-icon>
- <span>{{baseInfo.moveUnit}}</span>
- </div>
- </div>
- </template>
- </van-field>
- <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="!editEdbInfoId&&[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"
- :disabled="[5,14,61,63].includes(source)||(!editEdbInfoId&&[6,7].includes(source))"
- />
- <van-field
- v-if="[8,12,13,35].includes(source)"
- v-model.number="baseInfo.numberN"
- label="N等于"
- placeholder="请输入N数值"
- input-align="right"
- required
- @focus="numberNInputFocus=true"
- @blur="numberNInputFocus=false"
- >
- <template #right-icon>
- <svg-icon class="edit-icon" name="edit" :color="numberNInputFocus?'#0052D9':'#333333'"/>
- </template>
- </van-field>
- <!-- 超季节性日历 -->
- <van-field
- v-if="source===35"
- :modelValue="baseInfo.calendarType"
- readonly
- label="日历"
- placeholder="请选择日历"
- input-align="right"
- right-icon="arrow"
- required
- @click-input="showSelectCalendar=true"
- />
- <!-- 降频数据取值 -->
- <van-field
- v-if="source===51"
- :modelValue="baseInfo.valueType"
- readonly
- label="数据取值"
- placeholder="请选择"
- input-align="right"
- right-icon="arrow"
- @click-input="showDataValSelect=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"
- :loading="saveBtnLoading"
- loading-text="计算中..."
- @click="handleSave"
- >{{getCalculateBtnText()}}</van-button>
- </div>
- </div>
-
- <!-- 选择指标 -->
- <SelectEDB v-model:show="showSelectEDB" :source='source' @select="handleConfirmSelectEDB"/>
- <!-- 选择单位 -->
- <SelectEDBUnit v-model:show="showSelectUnit" @select="onConfirmSelectUnit"/>
- <!-- 选择分类 -->
- <SelectEDBClassify ref="selectEDBClassifyINS" v-model:show="showSelectClassify" :defaultId="baseInfo.classify" @select="handleConfirmClassify" />
- <!-- 选择频度 -->
- <SelectEDBFrequency v-model:show="showSelectFrequency" @select="handleConfirmFrequency"/>
- <!-- 查看指标数据 -->
- <SeeEDBDataList v-model:show="showSeeEDBDataList" :edbInfoId="selectEDBinfo?.EdbInfoId" />
- <!-- 移动方式类型选择 -->
- <van-action-sheet v-model:show="showMoveType" close-on-click-action :actions="moveTypeOpts" @select="onSelectMoveType" />
-
- <!-- 移动方式单位选择 -->
- <van-action-sheet v-model:show="showMoveUnit" close-on-click-action :actions="moveUnitOpts" @select="onSelectMoveUnit" />
- <!-- 超季节性日历选择 -->
- <van-action-sheet v-model:show="showSelectCalendar" close-on-click-action :actions="[{name:'公历'},{name:'农历'}]" @select="e=>baseInfo.calendarType=e.name" />
- <!-- 降频数据取值 -->
- <van-action-sheet v-model:show="showDataValSelect" close-on-click-action :actions="[{name:'期末值'},{name:'平均值'}]" @select="e=>baseInfo.valueType=e.name" />
-
- <!-- 公式说明 -->
- <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%;
- }
- }
- }
- }
- .move-type-box{
- width: 100%;
- display: flex;
- align-items: center;
- justify-content: flex-end;
- gap: 20px;
- .input{
- box-sizing: border-box;
- display: block;
- border-radius: 12px;
- width: 150px;
- height: 72px;
- padding: 0 32px;
- background-color: #f6f6f6;
- }
- .btn{
- flex-shrink: 0;
- display: flex;
- align-items: center;
- justify-content: center;
- width: 130px;
- height: 72px;
- border-radius: 12px;
- background-color: #F2F3FF;
- color: $theme-color;
- }
- }
- .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>
|