Browse Source

Merge branch 'ETA_1.4.4'

hbchen 1 year ago
parent
commit
5121f48d3a

+ 15 - 2
src/api/dataEDB.js

@@ -388,7 +388,20 @@ export default{
      */
      */
     replaceEDB(params){
     replaceEDB(params){
         return post('/datamanage/edb_info/replace',params)
         return post('/datamanage/edb_info/replace',params)
-    }
-
+    },
+    /**
+	 * 新增指标 检验指标是否存在接口
+	 * @param {*} params Source SubSource EdbCode StockCode
+	 */
+	existEDBCheck: params => {
+		return get('/datamanage/edb_info/exist/check',params)
+	},
+	/**
+	 * 批量新增指标
+	 * @param {*} params BatchList[{Source,EdbName,Frequency,Unit,ClassifyId,StockCode,EdbCode}]
+	 */
+	addBatchEDB: params => {
+		return post('/datamanage/edb_info/batch/add',params)
+	},
 
 
 }
 }

BIN
src/assets/imgs/dataEDB/close_outline_black.png


+ 429 - 58
src/views/dataEDB/AddBaseEDB.vue

@@ -1,9 +1,11 @@
 <script setup name="DataEDBAddBaseEDB">
 <script setup name="DataEDBAddBaseEDB">
-import {ref} from 'vue'
+import {ref,computed} from 'vue'
 import apiDataEDB from '@/api/dataEDB'
 import apiDataEDB from '@/api/dataEDB'
 import { showToast } from 'vant'
 import { showToast } from 'vant'
 import EditBaseEDB from './components/EditBaseEDB.vue'
 import EditBaseEDB from './components/EditBaseEDB.vue'
+import AddDateSequenceEdb from './components/AddDateSequenceEdb.vue'
 import { useRouter } from 'vue-router'
 import { useRouter } from 'vue-router'
+import {windCommonIndexCodeArr,THSCommonIndexStockCodeArr,THSCommonIndexFuturesCodeArr} from './util/config'
 
 
 const router=useRouter()
 const router=useRouter()
 
 
@@ -15,6 +17,86 @@ function getClassifyName(data){
     return str
     return str
 }
 }
 
 
+const hasDateSequence = computed(() => {
+    return [1,2].includes(dataSourceVal.value)
+})
+const isComplete = computed(() => {
+    return StockCode.value && (EdbCodeArr.value.length>0 || EdbCodeCommonChecked.value.length>0)
+})
+const EdbCodeCommonArr = computed(() => {
+    if(dataSourceVal.value==2){
+        return windCommonIndexCodeArr
+    }else if(dataSourceVal.value==1){
+        if(codeTypeVal.value==1){
+            // 期货
+            return THSCommonIndexFuturesCodeArr
+        }else{
+            // 股票
+            return THSCommonIndexStockCodeArr
+        }
+    }
+})
+
+const EdbCodeCommonHintText = computed(() => {
+    if(dataSourceVal.value==2){
+        return '提示:Wind金融终端输入“CG”会弹出代码生成器,可在代码生成器上获取其他指标的代码'
+    }else if(dataSourceVal.value==1){
+        return '提示:可用Excel同花顺插件/日期序列功能,根据所选指标获取指标代码,期货和股票常用代码可在下方勾选'
+    }
+})
+
+
+
+// 数据库
+const showSelectDatabase=ref(false)
+const edbDatabaseOpts=[{value:'0',label:'经济数据库'},{value:'1',label:'日期序列'}]
+const databaseText=ref('经济数据库')
+const databaseVal=ref('0')
+
+const onConfirmDatabase=(e)=>{
+    databaseText.value=e.selectedOptions[0].label
+    databaseVal.value=e.selectedOptions[0].value
+    showSelectDatabase.value=false
+}
+
+// 证券代码
+const StockCode=ref('')
+// 指标代码
+const EdbCode=ref('')
+const EdbCodeArr=ref([])
+
+const EdbCodeCommonChecked=ref([])
+
+const codeFormatter=(e)=>{
+    return (e+'').replaceAll(' ','')
+}
+const codeInputBlur=()=>{
+    EdbCodeArr.value = Array.from(new Set([...EdbCodeArr.value,...EdbCode.value.split(',')])).filter(Boolean)
+    EdbCode.value=''
+}
+
+const delEdbCode=(index)=>{
+    EdbCodeArr.value.splice(index,1)
+}
+// 同花顺常用指标类型
+const showSelectCodeType=ref(false)
+const edbCodeTypeOpts=[{value:1,label:'期货常用指标'},{value:2,label:'股票常用指标'}]
+const codeTypeText=ref('期货常用指标')
+const codeTypeVal=ref(1)
+
+const onConfirmCodeType=(e)=>{
+    codeTypeText.value=e.selectedOptions[0].label
+    codeTypeVal.value=e.selectedOptions[0].value
+    EdbCodeCommonChecked.value=[]
+    showSelectCodeType.value=false
+}
+
+// 检验重复弹窗
+const showRepeatDialog=ref(false)
+const queryLoading=ref(false)
+const repeatEdbs=ref([])
+
+
 // 数据来源
 // 数据来源
 const showSelectDataSource=ref(false)
 const showSelectDataSource=ref(false)
 const edbSourceOpts=ref([])
 const edbSourceOpts=ref([])
@@ -34,8 +116,20 @@ function onConfirmDataSource(e){
     dataSourceText.value=e.selectedOptions[0].SourceName
     dataSourceText.value=e.selectedOptions[0].SourceName
     dataSourceVal.value=e.selectedOptions[0].EdbSourceId
     dataSourceVal.value=e.selectedOptions[0].EdbSourceId
     showSelectDataSource.value=false
     showSelectDataSource.value=false
+
+    databaseText.value='经济数据库'
+    databaseVal.value='0'
+    StockCode.value=''
+    EdbCode.value=''
+    EdbCodeArr.value=[]
+    EdbCodeCommonChecked.value=[]
+    codeTypeText.value='期货常用指标'
+    codeTypeVal.value=1
 }
 }
 
 
+
+
+
 // 指标名称/ID
 // 指标名称/ID
 const searchEDBTxt=ref('')
 const searchEDBTxt=ref('')
 // 公司ID
 // 公司ID
@@ -104,78 +198,187 @@ function handleClearPage(){
     result.value=null
     result.value=null
 }
 }
 
 
+// ----------------日期序列
+// 检查是否指标重复
+const indexExsitCheck=()=>{
+    setTimeout(()=>{
+        if(isComplete.value){
+            let params={
+                Source:dataSourceVal.value,
+                SubSource:databaseVal.value,
+                EdbCode:Array.from(new Set([...EdbCodeArr.value,...EdbCodeCommonChecked.value])).join(','),
+                StockCode:StockCode.value
+            }
+            apiDataEDB.existEDBCheck(params).then(res=>{
+                if(res.Ret == 200){
+                    // console.log(res,'res');
+                    // return 
+                    if(res.Data.IndexExist){
+                        // 有重复
+                        repeatEdbs.value=[]
+                        let existEdbInfo=res.Data.ExistEdbInfo || []
+                        let text=''
+                        existEdbInfo.map(item =>{
+                            text=`${item.EdbName}(${item.EdbCode})`
+                            repeatEdbs.value.push({text,id:item.EdbInfoId})
+                        })
+                        showRepeatDialog.value=true
+                    }else{
+                        // 没有重复
+                        queryLoading.value=true
+
+                        apiDataEDB.edbSearch(params).then(res => {
+                            if(res.Ret == 200){
+                                // console.log(res,'res');
+                                // return 
+                                let stockList = res.Data.SearchItem.StockList || []
+                                edbIndexDatas.value=[]
+                                stockList.map((item,index) =>{
+                                    let isCommon = EdbCodeCommonArr.value.find(it => it.value == item.EdbCode)
+                                    let params={
+                                        Source:dataSourceVal.value,
+                                        ClassifyId:0,
+                                        Unit:'',
+                                        Frequency:'日度',
+                                        EdbName:isCommon?`${item.StockCode}${isCommon.label}`:`${item.StockCode}${item.EdbCode}`,
+                                        EdbCode:item.EdbCode,
+                                        StockCode:item.StockCode,
+                                        DataList:item.DataList
+                                    }
+                                    edbIndexDatas.value.push(params)
+                                })
+                                showAddDateSequence.value=true
+                            }
+                        }).finally(()=>{
+                            queryLoading.value=false
+                        })
+                    }
+                }
+            })
+        }
+    },50)
+}
+
+const edbNavigator=({id})=>{
+    const { href } = router.resolve({ path: '/dataEDB/detail',query:{edbInfoId:id}});
+    window.open(href, '_blank');
+}
+
+// 日期序列指标 下一步
+const edbIndexDatas=ref([])
+const showAddDateSequence=ref(false)
+
+
 </script>
 </script>
 
 
 <template>
 <template>
     <div class="add-baseEDB-page">
     <div class="add-baseEDB-page">
         <van-cell title="数据来源" is-link :value="dataSourceText" @click="showSelectDataSource=true"/>
         <van-cell title="数据来源" is-link :value="dataSourceText" @click="showSelectDataSource=true"/>
-        <div class="search-box">
-            <van-search
-                v-model="searchEDBTxt"
-                show-action
-                shape="round"
-                placeholder="指标ID/指标名称"
-                @clear="searchEDBTxt=''"
-                @search="onSearch"
-            >
-                <template #action>
-                    <span class="right-btn" @click="onSearch">查询</span>
-                </template>
-            </van-search>
-        </div>
-        <div class="search-box" style="padding-top:0" v-if="dataSourceText==='彭博财务'">
-            <van-search
-                v-model="searchCompanyTxt"
-                show-action
-                shape="round"
-                placeholder="公司ID"
-                @clear="searchCompanyTxt=''"
-                @search="onSearch"
-            >
-                <template #action>
-                    <span class="right-btn" @click="onSearch">查询</span>
-                </template>
-            </van-search>
-        </div>
+        <van-cell title="数据库" is-link :value="databaseText" @click="showSelectDatabase=true" v-if="hasDateSequence"/>
+        <template v-if="databaseVal == '0'">
+            <div class="search-box">
+                <van-search
+                    v-model="searchEDBTxt"
+                    show-action
+                    shape="round"
+                    placeholder="指标ID/指标名称"
+                    @clear="searchEDBTxt=''"
+                    @search="onSearch"
+                >
+                    <template #action>
+                        <span class="right-btn" @click="onSearch">查询</span>
+                    </template>
+                </van-search>
+            </div>
+            <div class="search-box" style="padding-top:0" v-if="dataSourceText==='彭博财务'">
+                <van-search
+                    v-model="searchCompanyTxt"
+                    show-action
+                    shape="round"
+                    placeholder="公司ID"
+                    @clear="searchCompanyTxt=''"
+                    @search="onSearch"
+                >
+                    <template #action>
+                        <span class="right-btn" @click="onSearch">查询</span>
+                    </template>
+                </van-search>
+            </div>
 
 
-        <div class="warn_txt" v-if="result?.Status===1">
-            该数据已存在数据库,名称为:{{result.SearchItem.EdbName}},目录为:{{ getClassifyName(result.ClassifyList) }},如需重新添加,请删除原指标
-        </div>
-        <div class="warn_txt" v-if="result?.Status===3">
-            该数据已存在数据库,名称为:{{result.SearchItem.EdbName}},目录为:{{ getClassifyName(result.ClassifyList) }}
-        </div>
+            <div class="warn_txt" v-if="result?.Status===1">
+                该数据已存在数据库,名称为:{{result.SearchItem.EdbName}},目录为:{{ getClassifyName(result.ClassifyList) }},如需重新添加,请删除原指标
+            </div>
+            <div class="warn_txt" v-if="result?.Status===3">
+                该数据已存在数据库,名称为:{{result.SearchItem.EdbName}},目录为:{{ getClassifyName(result.ClassifyList) }}
+            </div>
 
 
-        <div class="no-auth" v-if="result?.Status===3">您当前暂无权限查看该指标,如需查看,请联系管理员</div>
-        <template v-else>
-            <template v-if="result?.Status===1||result?.SearchItem.DataList?.length">
-                <van-cell title="指标ID" :value="result?.SearchItem.EdbCode" />
-                <van-cell title="起始时间" :value="result?.SearchItem.StartDate" />
-                <van-cell title="终止时间" :value="result?.SearchItem.EndDate"/>
-                <ul class="data-value-wrap">
-                    <li class="item" style="font-weight:bold">时间</li>
-                    <li class="item" style="font-weight:bold">值</li>
-                    <template v-if="result?.SearchItem.DataList">
-                        <template v-for="item,index in result?.SearchItem.DataList" :key="index">
-                            <li class="item">{{item.DataTime}}</li>
-                            <li class="item"><span class="val-box">{{item.Value}}</span></li>
+            <div class="no-auth" v-if="result?.Status===3">您当前暂无权限查看该指标,如需查看,请联系管理员</div>
+            <template v-else>
+                <template v-if="result?.Status===1||result?.SearchItem.DataList?.length">
+                    <van-cell title="指标ID" :value="result?.SearchItem.EdbCode" />
+                    <van-cell title="起始时间" :value="result?.SearchItem.StartDate" />
+                    <van-cell title="终止时间" :value="result?.SearchItem.EndDate"/>
+                    <ul class="data-value-wrap">
+                        <li class="item" style="font-weight:bold">时间</li>
+                        <li class="item" style="font-weight:bold">值</li>
+                        <template v-if="result?.SearchItem.DataList">
+                            <template v-for="item,index in result?.SearchItem.DataList" :key="index">
+                                <li class="item">{{item.DataTime}}</li>
+                                <li class="item"><span class="val-box">{{item.Value}}</span></li>
+                            </template>
                         </template>
                         </template>
-                    </template>
-                    <div class="data-empty" v-else>
-                        <img src="https://hzstatic.hzinsights.com/static/ETA_mobile/empty_img.png" alt="">
-                        <p>暂无对应的数据</p>
-                    </div>
-                </ul>
-            </template>
+                        <div class="data-empty" v-else>
+                            <img src="https://hzstatic.hzinsights.com/static/ETA_mobile/empty_img.png" alt="">
+                            <p>暂无对应的数据</p>
+                        </div>
+                    </ul>
+                </template>
 
 
-            <div class="search-empty-wrap" v-else>
-                <img src="https://hzstatic.hzinsights.com/static/ETA_mobile/empty_img.png" alt="">
-                <p>未搜索到该指标</p>
+                <div class="search-empty-wrap" v-else>
+                    <img src="https://hzstatic.hzinsights.com/static/ETA_mobile/empty_img.png" alt="">
+                    <p>未搜索到该指标</p>
+                </div>
+            </template>
+        </template>
+        <template v-else>
+            <van-field 
+                v-model="StockCode" 
+                label="证券代码" 
+                placeholder="每次只查询一个证券代码"
+                input-align="right"
+                :formatter="codeFormatter"
+                format-trigger="onBlur">
+            </van-field>
+            <van-field 
+                v-model="EdbCode" 
+                label="指标代码" 
+                placeholder="多个指标代码用英文逗号分隔"
+                input-align="right"
+                :formatter="codeFormatter"
+                format-trigger="onBlur"
+                @blur="codeInputBlur">
+            </van-field>
+            <div class="edb-code-hint" :style="{marginBottom:dataSourceVal==2?'20px':''}">{{ EdbCodeCommonHintText }}</div>
+            <van-cell :title="codeTypeText" is-link @click="showSelectCodeType=true" style="margin-bottom: 20px;"
+            v-if="dataSourceVal==1"/>
+            <van-checkbox-group v-model="EdbCodeCommonChecked" shape="square" icon-size="12px"
+            direction="horizontal" class="ebd-code-checkbox-group" style="margin:0 16Px;">
+                <van-checkbox :name="item.value" v-for="item in EdbCodeCommonArr" :key="item.value" 
+                style="" class="ebd-code-checkbox">{{ item.label }}</van-checkbox>
+            </van-checkbox-group>
+            <div class="edb-code-tags-box">
+                <div class="edb-code-tags-item" v-for="(item,index) in EdbCodeArr" :key="item">
+                    <span class="edb-code-item-text">{{ item }}</span>
+                    <img name="cross" class="edb-code-item-icon" src="@/assets/imgs/dataEDB/close_outline_black.png" @click="delEdbCode(index)"/>
+                </div>
             </div>
             </div>
         </template>
         </template>
 
 
         <div class="btns-wrap">
         <div class="btns-wrap">
             <van-button block type="primary" style="max-width:300px;margin: 0 auto" v-if="result?.Status===2" :disabled="!result?.SearchItem.DataList?.length" @click="handleShowEditBaseEDB">下一步</van-button>
             <van-button block type="primary" style="max-width:300px;margin: 0 auto" v-if="result?.Status===2" :disabled="!result?.SearchItem.DataList?.length" @click="handleShowEditBaseEDB">下一步</van-button>
             <van-button block type="primary" style="max-width:300px;margin: 0 auto" v-else-if="[1,3].includes(result?.Status)" @click="handleClearPage">知道了</van-button>
             <van-button block type="primary" style="max-width:300px;margin: 0 auto" v-else-if="[1,3].includes(result?.Status)" @click="handleClearPage">知道了</van-button>
+            <van-button block type="primary" style="max-width:300px;margin: 0 auto" v-else-if="databaseVal=='1'" 
+            @click="indexExsitCheck" :disabled="!isComplete" :loading="queryLoading" loading-text="查询中">查询数据</van-button>
         </div>
         </div>
     </div>
     </div>
 
 
@@ -193,6 +396,54 @@ function handleClearPage(){
             @cancel="showSelectDataSource=false"
             @cancel="showSelectDataSource=false"
         />
         />
     </van-popup>
     </van-popup>
+    <!-- 选择数据库 -->
+    <van-popup 
+        v-model:show="showSelectDatabase"
+        round
+        position="bottom"
+    >
+        <van-picker
+            title="数据库"
+            :columns="edbDatabaseOpts"
+            :columns-field-names="{text:'label',value:'value'}"
+            @confirm="onConfirmDatabase"
+            @cancel="showSelectDatabase=false"
+        />
+    </van-popup>
+    <!-- 选择常用指标类型 -->
+    <van-popup 
+        v-model:show="showSelectCodeType"
+        round
+        position="bottom"
+    >
+        <van-picker
+            title="常用指标"
+            :columns="edbCodeTypeOpts"
+            :columns-field-names="{text:'label',value:'value'}"
+            @confirm="onConfirmCodeType"
+            @cancel="showSelectCodeType=false"
+        />
+    </van-popup>
+    <!-- 检验重复弹窗 -->
+    <van-dialog 
+        v-model:show="showRepeatDialog" 
+        title="指标库中已存在以下指标,请勿重复录入!" 
+        confirmButtonText="知道了"
+        id="repeat-dialog"
+    >
+        <div class="repeated-box">
+            <!-- <div class="repeated-text"></div> -->
+            <div class="repeated-row">
+                <div class="repeated-item" v-for="(item,index) in repeatEdbs" :key="item.id"
+                @click="edbNavigator(item)">
+                    {{ index+1 }}、
+                    <span>{{ item.text }}</span>
+                </div>
+            </div>
+
+        </div>
+
+    </van-dialog>
 
 
     <!-- 新增基础指标 -->
     <!-- 新增基础指标 -->
     <EditBaseEDB 
     <EditBaseEDB 
@@ -200,6 +451,14 @@ function handleClearPage(){
         :baseInfo="baseInfo"
         :baseInfo="baseInfo"
         @addSuccess="handleEditBaseEdbSuccess"
         @addSuccess="handleEditBaseEdbSuccess"
     />
     />
+
+    <!-- 新增日期序列指标 -->
+    <AddDateSequenceEdb 
+        v-model="showAddDateSequence" 
+        :dateSequenceEdbList="edbIndexDatas"
+        @addDateSequenceSuccess="handleEditBaseEdbSuccess"
+    />
+
 </template>
 </template>
 
 
 <style lang="scss" scoped>
 <style lang="scss" scoped>
@@ -288,6 +547,54 @@ function handleClearPage(){
 	color: #FF4E00;
 	color: #FF4E00;
 	border: 1px dashed #FF4E00;
 	border: 1px dashed #FF4E00;
 }
 }
+
+.edb-code-hint{
+    padding:0 16PX;
+    color: #B1B1B1;
+    font-size: 24px;
+    margin: 20px 0 0 0;
+}
+.ebd-code-checkbox-group{
+    .ebd-code-checkbox{
+        margin-bottom: 8PX;
+        margin-right: 0;
+        padding-right: 12PX;
+        min-width: 33.33%;
+    }
+}
+
+.edb-code-tags-box{
+    display: flex;
+    align-items: center;
+    padding: 0 16PX;
+    margin-top: 40px;
+    flex-wrap: wrap;
+
+    .edb-code-tags-item{
+        display: flex;
+        align-items: center;
+        height: 56px;
+        padding: 0 16px;
+        margin-right: 20px;
+        background-color: #F6F6F6;
+        margin-bottom: 8px;
+        max-width: calc(100vw - 32PX);
+        .edb-code-item-text{
+            font-size: 28px;
+            color: #333;
+            margin-right: 8px;
+            overflow: hidden;
+            text-overflow: ellipsis;
+        }
+        .edb-code-item-icon{
+            cursor: pointer;
+            height: 36px;
+            width: 36px;
+        }
+    }
+}
+
+
 .btns-wrap{
 .btns-wrap{
     position: fixed;
     position: fixed;
     left: 0;
     left: 0;
@@ -299,6 +606,33 @@ function handleClearPage(){
     text-align: center;
     text-align: center;
 }
 }
 
 
+.repeated-box{
+    padding: 20PX;
+    .repeated-text{
+        font-size: 16PX;
+        color: #000;
+    }
+    .repeated-row{
+        max-height: 400px;
+        overflow-y: auto;
+        .repeated-item{
+            margin-top: 16PX;
+            &:first-child{
+                margin-top: 0;
+            }
+            span{
+                word-break: break-all;
+                cursor: pointer;
+                text-decoration: underline;
+                color: #0052D9;
+            }
+        }
+    }
+
+}
+
+
+
 @media screen and (min-width:$media-width){
 @media screen and (min-width:$media-width){
     .search-box{
     .search-box{
         .van-search{
         .van-search{
@@ -321,5 +655,42 @@ function handleClearPage(){
             }
             }
         }
         }
     }
     }
+    .edb-code-hint{
+        font-size: 16px;
+        margin: 20px 0 0 0;
+    }
+    .ebd-code-checkbox-group{
+        justify-content: flex-start;
+        .ebd-code-checkbox{
+            margin-right: 0;
+            min-width: 0;
+        }
+    }
+    .edb-code-tags-box{
+        margin-top: 40px;
+        .edb-code-tags-item{
+            height: 36px;
+            padding: 0 8px;
+            margin-right: 20px;
+            margin-bottom: 8px;
+            max-width: calc(100vw - 32PX);
+            .edb-code-item-text{
+                font-size: 18px;
+                margin-right: 8px;
+            }
+            .edb-code-item-icon{
+                height: 28px;
+                width: 28px;
+            }
+        }
+    }
+}
+</style>
+<style lang="scss">
+#repeat-dialog{
+    .van-dialog__header{
+        padding: 24PX 24PX 0;
+        font-size: 18PX;
+    }
 }
 }
 </style>
 </style>

+ 369 - 0
src/views/dataEDB/components/AddDateSequenceEdb.vue

@@ -0,0 +1,369 @@
+<script setup>
+import {watch,ref, reactive, computed} from 'vue'
+import apiDataEDB from '@/api/dataEDB'
+import {edbFrequencyOpts,edbUnitOpts} from '../util/config'
+import {deleteClassifyItemEmpty,findItemWithIdAndParents} from '../util/util'
+import { showToast } from 'vant'
+
+const props=defineProps({
+    modelValue:{
+        type:Boolean,
+        default:false
+    },
+    dateSequenceEdbList:{
+        type:Array,
+        default:() => []
+    },
+})
+const emits=defineEmits(['update:modelValue','addDateSequenceSuccess'])
+
+const BatchList=ref([])
+const edbIndex=ref(0)
+const edbsLength=ref(1)
+
+watch(
+  ()=>props.modelValue,
+  ()=>{
+    if(props.modelValue){
+      edbIndex.value = 0
+      edbsLength.value = props.dateSequenceEdbList.length
+      BatchList.value=[]
+      props.dateSequenceEdbList.map(edb =>{
+        BatchList.value.push({
+          Source:edb.Source,
+          ClassifyId:0,
+          Unit:'',
+          Frequency:'日度',
+          EdbName:edb.EdbName,
+          EdbCode:edb.EdbCode,
+          StockCode:edb.StockCode
+        })
+      })
+      getEdbClassifyList()
+    }
+  }
+)
+
+function handleClose(){
+    emits('update:modelValue',false)
+}
+
+// 获取指标库分类
+const edbClassifyList=ref([])
+function getEdbClassifyList(){
+  apiDataEDB.edbClassifyList().then(res=>{
+    if(res.Ret===200){
+      deleteClassifyItemEmpty(res.Data.AllNodes||[])
+      edbClassifyList.value=res.Data.AllNodes||[]
+    }
+  })
+}
+const showSelectClassify=ref(false)
+
+const selectClassifyNameStr=computed(()=>{
+    if(!BatchList.value[edbIndex.value].ClassifyId) return ''
+
+    let arr=[]
+    arr=findItemWithIdAndParents(edbClassifyList.value,BatchList.value[edbIndex.value].ClassifyId)
+    if(arr?.length){
+        const textArr=arr.map(item=>item.ClassifyName)
+        return `${textArr.join('/')}`
+    }
+})
+
+// 选择频率
+const showSelectFrequency=ref(false)
+const frequencyOpts=edbFrequencyOpts.map(item=>{
+    return {
+        text:item,
+        value:item
+    }
+})
+function onConfirmSelectFrequency(e){
+  BatchList.value[edbIndex.value].Frequency=e.selectedValues[0]
+  showSelectFrequency.value=false
+}
+
+// 选择单位
+const showSelectUnit=ref(false)
+const unitOpts=edbUnitOpts.map(item=>{return{text:item,value:item}})
+function onConfirmSelectUnit(e){
+  BatchList.value[edbIndex.value].Unit=e.selectedValues[0]
+  showSelectUnit.value=false
+}
+// 切换上一个
+const lastToggle=()=>{
+  if(!(edbIndex.value > 0)) return 
+  edbIndex.value--
+}
+
+// 保存
+async function handleSave(){
+
+    let item = BatchList.value[edbIndex.value]
+    if(!item.ClassifyId){
+      showToast('所属目录不能为空')
+      return
+    }
+    if(!item.Frequency){
+      showToast('频度不能为空')
+      return
+    }
+    if(!item.Unit){
+      showToast('单位不能为空')
+      return
+    }
+    if(!item.EdbName){
+      showToast('指标名称不能为空')
+      return
+    }
+
+    if(edbIndex.value+1 < edbsLength.value){
+      edbIndex.value++
+    }else{
+      const res=await apiDataEDB.addBatchEDB({BatchList:BatchList.value})
+      if(res.Ret===200){
+        showToast('新增指标成功!')
+        emits('addDateSequenceSuccess')
+      }else if(res.Ret == 403){
+        let repetitiveText=res.Data?res.Data.ExistEdbName[0] || '':''
+        let repetitiveIndex = BatchList.value.findIndex(it => it.EdbName == repetitiveText)
+        if(repetitiveIndex!=-1){
+          edbIndex.value = repetitiveIndex
+        }
+      }
+    }
+
+}
+</script>
+  
+<template>
+  <van-popup 
+    :show="props.modelValue"
+    position="bottom"
+    style="width:100%;height:100%"
+  >
+    <div class="add-dateSequence-EDB">
+        <van-field 
+          :modelValue="selectClassifyNameStr"
+          readonly
+          label="所属目录" 
+          placeholder="请选择所属目录"
+          input-align="right"
+          right-icon="arrow"
+          @click-input="showSelectClassify=true"
+        />
+        <van-field 
+          :modelValue="BatchList[edbIndex].Unit"
+          readonly
+          label="单位" 
+          placeholder="请选择单位"
+          input-align="right"
+          right-icon="arrow"
+          @click-input="showSelectUnit=true"
+        />
+        <van-field 
+          :modelValue="BatchList[edbIndex].Frequency"
+          readonly
+          label="频度" 
+          placeholder="请选择频度"
+          input-align="right"
+          right-icon="arrow"
+          @click-input="showSelectFrequency=true"
+        />
+        <van-field 
+          v-model="BatchList[edbIndex].EdbName" 
+          label="指标名称" 
+          placeholder="请输入指标名称"
+          input-align="right"
+        >
+        </van-field>
+        <van-field 
+          v-model="BatchList[edbIndex].EdbCode" 
+          label="证券代码" 
+          input-align="right"
+          readonly
+        >
+        </van-field>
+        <van-field 
+          v-model="BatchList[edbIndex].StockCode" 
+          label="指标代码" 
+          input-align="right"
+          readonly
+        >
+        </van-field>
+        <div class="separation"></div>
+        <ul class="data-value-wrap">
+          <li class="item" style="font-weight:bold">时间</li>
+          <li class="item" style="font-weight:bold">值</li>
+          <template v-if="props.dateSequenceEdbList[edbIndex].DataList && props.dateSequenceEdbList[edbIndex].DataList.length>0">
+            <template v-for="(item,index) in props.dateSequenceEdbList[edbIndex].DataList" :key="index">
+              <li class="item">{{item.DataTime}}</li>
+              <li class="item"><span class="val-box">{{item.Value}}</span></li>
+            </template>
+          </template>
+          <div class="data-empty" v-else>
+              <img src="https://hzstatic.hzinsights.com/static/ETA_mobile/empty_img.png" alt="">
+              <p>暂无对应的数据</p>
+          </div>
+        </ul>
+        <div class="edb-toggle-zone">
+          <div class="edb-toggle-progress">
+            <van-progress :show-pivot="false" style="border-radius: 0;flex-grow: 1;height: 100%;"
+            :percentage="((edbIndex+1)/edbsLength)*100" color="#0052D9" track-color="#ECF2FE"></van-progress>
+            <div class="edb-toggle-count">
+              <span>{{ edbIndex+1 }}</span>/{{ edbsLength }}
+            </div>
+          </div>
+          <div class="edb-toggle-buttons">
+            <van-button type="primary" class="toggle-button" :disabled="edbIndex==0" @click="lastToggle">上一个</van-button>
+            <van-button class="toggle-button" @click="handleClose">取消</van-button>
+            <van-button type="primary" class="toggle-button" @click="handleSave">
+              {{ edbIndex+1 < edbsLength?'下一个':'保存' }}
+            </van-button>
+          </div>
+        </div>
+    </div>
+  </van-popup>
+
+  <!-- 选择分类 -->
+  <van-popup 
+    v-model:show="showSelectClassify" 
+    round 
+    position="bottom"
+  >
+      <van-cascader
+          v-model="BatchList[edbIndex].ClassifyId"
+          title="选择目录"
+          :options="edbClassifyList"
+          :field-names="{text:'ClassifyName',value:'ClassifyId',children:'Children'}"
+          @close="showSelectClassify = false"
+      />
+      <div style="width:300px;margin:0 auto;padding:20px 0">
+          <van-button type="primary" round block @click="showSelectClassify = false">确定</van-button>
+      </div>
+  </van-popup>
+
+  <!-- 选择频率 -->
+  <van-popup 
+      v-model:show="showSelectFrequency" 
+      round 
+      position="bottom"
+  >
+      <van-picker
+          title="请选择频率"
+          :columns="frequencyOpts"
+          @cancel="showSelectFrequency=false"
+          @confirm="onConfirmSelectFrequency"
+      />
+  </van-popup>
+
+  <!-- 选择单位 -->
+  <van-popup 
+    v-model:show="showSelectUnit" 
+    round 
+    position="bottom"
+  >
+    <van-picker
+      title="选择单位"
+      :columns="unitOpts"
+      @cancel="showSelectUnit=false"
+      @confirm="onConfirmSelectUnit"
+    />
+  </van-popup>
+</template>
+
+<style lang="scss" scoped>
+.add-dateSequence-EDB{
+  padding-bottom: 112PX;
+  .separation{
+    width: 100%;
+    height: 10PX;
+    background-color: #F3F3F3;
+  }
+  .data-value-wrap{
+    display: flex;
+    flex-wrap: wrap;
+    .item{
+      width: 50%;
+      padding: 32px;
+      border-bottom: 1px solid $border-color;
+      display: flex;
+      align-items: center;
+      &:nth-child(odd){
+        border-right: 1px solid $border-color;
+      }
+      .val-box{
+        display: inline-block;
+        background-color: #F2F3FF;
+        color: $theme-color;
+        text-align: center;
+        padding: 0 30px;
+        line-height: 48px;
+        border-radius: 8px;
+      }
+    }
+    .data-empty{
+      width: 100%;
+      text-align: center;
+      color: $font-grey;
+      img{
+          width: 200PX;
+      }
+    }
+  }
+  .edb-toggle-zone{
+    position: fixed;
+    bottom: 0;
+    background-color: white;
+    width: 100%;
+    .edb-toggle-progress{
+      display: flex;
+      align-items: center;
+      height: 24PX;
+      .edb-toggle-count{
+        color: #333333;
+        font-weight: 600;
+        font-size: 16PX;
+        height: 100%;
+        width: 65PX;
+        background-color: #F4F8FE;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        span{
+          color: #0052D9;
+        }
+      }
+    }
+    .edb-toggle-buttons{
+      padding: 24PX;
+      box-sizing: border-box;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      .toggle-button{
+        min-width: 100PX;
+        height: 40PX;
+        border-radius: 6PX;
+        font-weight: 600;
+      }
+    }
+  }
+}
+@media screen and (min-width:$media-width){
+  .add-dateSequence-EDB{
+    .data-value-wrap{
+      .item{
+        padding: 16px;
+        .val-box{
+            padding: 0 15px;
+            line-height: 28px;
+            border-radius: 4px;
+        }
+      }
+    }
+  }
+
+}
+</style>

+ 46 - 0
src/views/dataEDB/util/config.js

@@ -349,3 +349,49 @@ export const calculateBatchType=[
 		type: 75
 		type: 75
 	},
 	},
 ]
 ]
+
+// wind 日期序列常见指标代码
+export const windCommonIndexCodeArr=[
+	{value:'pre_close',label:"前收盘价"},
+	{value:'open',label:"开盘价"},
+	{value:'high',label:"最高价"},
+	{value:'low',label:"最低价"},
+	{value:'close',label:"收盘价"},
+	{value:'settle',label:"结算价"},
+	{value:'volume',label:"成交量"},
+	{value:'amt',label:"成交额"},
+	{value:'pct_chg',label:"涨跌幅"},
+	{value:'swing',label:"振幅"},
+	{value:'turn',label:"换手率"},
+	{value:'oi',label:"持仓量"},
+	{value:'oiamount',label:"持仓额"}
+]
+
+// 同花顺 日期序列常见 股票指标代码
+export const THSCommonIndexStockCodeArr=[
+	{value:'ths_pre_close_stock',label:"前收盘价"},
+	{value:'ths_open_price_stock',label:"开盘价"},
+	{value:'ths_high_price_stock',label:"最高价"},
+	{value:'ths_low_stock',label:"最低价"},
+	{value:'ths_close_price_stock',label:"收盘价"},
+	{value:'ths_vol_stock',label:"成交量"},
+	{value:'ths_amt_stock',label:"成交额"},
+	{value:'ths_chg_ratio_stock',label:"涨跌幅"},
+	{value:'ths_swing_stock',label:"振幅"},
+	{value:'ths_turnover_ratio_stock',label:"换手率"},
+]
+
+// 同花顺 日期序列常见 指标代码
+export const THSCommonIndexFuturesCodeArr=[
+	{value:'ths_pre_close_future',label:"前收盘价"},
+	{value:'ths_open_price_future',label:"开盘价"},
+	{value:'ths_high_price_future',label:"最高价"},
+	{value:'ths_low_future',label:"最低价"},
+	{value:'ths_close_price_future',label:"收盘价"},
+	{value:'ths_settle_future',label:"结算价"},
+	{value:'ths_vol_future',label:"成交量"},
+	{value:'ths_amt_future',label:"成交额"},
+	{value:'ths_chg_ratio_future',label:"涨跌幅"},
+	{value:'ths_swing_d_future',label:"日振幅"},
+	{value:'ths_open_interest_future',label:"持仓量"},
+]