瀏覽代碼

Merge branch 'v1.6_myETA'

jwyu 1 年之前
父節點
當前提交
8d7e7161ac

+ 1 - 1
.env.development

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

+ 1 - 1
.env.production

@@ -5,4 +5,4 @@ VITE_APP_BASE_URL="/"
 # 打包输入文件名
 VITE_APP_OUTDIR="hongze_ETA_mobile"
 #分享图表地址
-VITE_CHART_LINK="https://chartlib.hzinsights.com/chartshow"
+VITE_CHART_LINK="https://chartlib.hzinsights.com/chartshow"

+ 2 - 1
package.json

@@ -31,7 +31,8 @@
     "vant": "^4.1.2",
     "vconsole": "^3.15.0",
     "vue": "^3.2.47",
-    "vue-router": "^4.1.6"
+    "vue-router": "^4.1.6",
+    "vuedraggable": "^4.1.0"
   },
   "devDependencies": {
     "@vitejs/plugin-vue": "^4.1.0",

+ 2 - 1
src/api/common.js

@@ -12,7 +12,8 @@ export function apiReportingErrInfo(params){
         ...params,
         timestamp:new Date().toLocaleString(),
         agent:'ETA移动端',
-        page:window.location.href
+        page:window.location.href,
+        token:localStorage.getItem('token')
     }
     return post('/resource/public/wechat_warning',{content:JSON.stringify(obj)})
 }

+ 15 - 0
src/api/correlationChart.js

@@ -69,4 +69,19 @@ export default {
     searchChartList(params){
         return get('/correlation/chart_info/search_by_es',params)
     },
+    /**
+     * 刷新图表
+     * @param ChartInfoId
+     */
+    refreshChart(params){
+        return get('/correlation/chart_info/refresh',params)
+    },
+    /**
+     * 编辑英文信息
+     * @param ChartInfoId
+     * @param ChartNameEn
+     */
+    chartInfoEditEn(params){
+        return post('/correlation/chart_info/en/edit',params)
+    }
 }

+ 19 - 0
src/api/futureChart.js

@@ -54,5 +54,24 @@ export default{
      */
     chartSaveOther(params){
         return post('/future_good/chart_info/copy',params)
+    },
+    /**
+     * 刷新图表
+     * @param ChartInfoId
+     */
+    refreshChart(params){
+        return get('/future_good/chart_info/refresh',params)
+    },
+    /**
+     * 编辑英文信息
+     * @param ChartInfoId
+     * @param ChartNameEn
+     * @param UnitEn
+     * @param EdbNameEn
+     * @param FutureGoodNameEn
+     * @param ProfitNameEn
+     */
+    chartInfoEditEn(params){
+        return post('/future_good/chart_info/en/edit',params)
     }
 }

+ 37 - 0
src/api/lineEquationChart.js

@@ -12,4 +12,41 @@ export default {
     searchChartList(params){
         return get('/line_equation/chart_info/search_by_es',params)
     },
+    /**
+     * 刷新图表
+     * @param ChartInfoId
+     */
+    refreshChart(params){
+        return get('/line_equation/chart_info/refresh',params)
+    },
+    /**
+     * 编辑英文信息
+     * @param ChartInfoId
+     * @param ChartNameEn
+     */
+    chartInfoEditEn(params){
+        return post('/line_equation/chart_info/en/edit',params)
+    },
+    /**
+     * 分类列表
+     */
+    chartClassifyList(params){
+        return get('/line_equation/chart_classify/list')
+    },
+    /**
+     * 图表另存为
+     * @param ChartInfoId
+     * @param ChartClassifyId
+     * @param ChartName
+     */
+    chartSaveOther(params){
+        return post('/line_equation/chart_info/copy',params)
+    },
+    /**
+     * 拟合方程曲线图列表
+     */
+    chartList(params){
+        return get('/line_equation/chart_info/list',params)
+    }
+
 }

+ 9 - 0
src/api/myETA.js

@@ -226,5 +226,14 @@ export default{
      */
     myETAChartSearch(params){
         return get('/my_chart/search_by_es',params)
+    },
+    /**
+     * 我的图库分类排序
+     * @param MyChartClassifyId
+     * @param NextClassifyId
+     * @param PrevClassifyId
+     */
+    myETAClassifySort(params){
+        return post('/my_chart/classify/move',params)
     }
 }

+ 41 - 0
src/api/statisticFeatureChart.js

@@ -0,0 +1,41 @@
+//统计特征曲线
+import { get,post } from "./index";
+
+export default {
+    /**
+     * 刷新图表
+     * @param ChartInfoId
+     */
+    refreshChart(params){
+        return get('/line_feature/chart_info/refresh',params)
+    },
+    /**
+     * 编辑英文信息
+     * @param ChartInfoId
+     * @param ChartNameEn
+     */
+    chartInfoEditEn(params){
+        return post('/line_feature/chart_info/en/edit',params)
+    },
+    /**
+     * 分类列表
+     */
+    chartClassifyList(params){
+        return get('/line_feature/chart_classify/list')
+    },
+    /**
+     * 图表另存为
+     * @param ChartInfoId
+     * @param ChartClassifyId
+     * @param ChartName
+     */
+    chartSaveOther(params){
+        return post('/line_feature/chart_info/copy',params)
+    },
+    /**
+     * 拟合方程曲线图列表
+     */
+    chartList(params){
+        return get('/line_feature/chart_info/list',params)
+    }
+}

二進制
src/assets/imgs/icon_drag.png


二進制
src/assets/imgs/myETA/icon_limit2.png


二進制
src/assets/imgs/myETA/icon_menu2.png


二進制
src/assets/imgs/myETA/icon_opt.png


二進制
src/assets/imgs/myETA/icon_select.png


+ 570 - 0
src/components/SetChartEnName.vue

@@ -0,0 +1,570 @@
+<script setup>
+//设置图表英文名称
+import {ref,watch} from 'vue'
+import apiChart from '@/api/chart'
+import apiFutureChart from '@/api/futureChart'
+import apiCorrelationChart from '@/api/correlationChart'
+import apiLineEquationChart from '@/api/lineEquationChart'
+import apiStatisticFeatureChart from '@/api/statisticFeatureChart'
+import { showToast } from 'vant';
+const props = defineProps({
+    isShow:{
+        type:Boolean,
+        default:false
+    },
+    chartInfo:{
+        type:Object,
+        default:{}
+    },
+    chartType:{
+        type:Number,
+        default:0
+    }
+})
+const emits = defineEmits(['cancel','success'])
+
+
+//折叠面板的展开项
+const activeGroup = ref([])
+//表格组
+const formGroup = ref([
+    /* {
+        groupName:'图表名称',//分组名称
+        formList:[{
+            label:'图表名称',
+            cnValue:'测试截面散点图',//中文值
+            enValue:'',//英文值
+            Value:'',//v-model的值,为cnValue/Value
+            noEdit:false,//是否允许编辑
+        }],//需要填写的项
+    } */
+])
+//截面图的其他参数
+const _ExtraConfig = ref({})
+watch(
+    ()=>props.isShow,
+    ()=>{
+        if(props.isShow){
+            initForm()
+        }else{
+            formGroup.value = []
+        }
+    },
+    {immediate:true}
+)
+
+function initForm(){
+    const {EdbInfoList} = props.chartInfo
+    const {ChartName,ChartNameEn,ExtraConfig} = props.chartInfo.ChartInfo
+    //第一项固定为图表名称
+    formGroup.value.push({
+        groupName:'图表名称',
+        formList:[{
+            label:'图表中文名称',
+            cnValue:ChartName,
+            enValue:ChartNameEn,
+            Value:ChartName,
+            noEdit:true
+        },{
+            label:'英文图表名称',
+            cnValue:ChartName,
+            enValue:ChartNameEn,
+            Value:ChartNameEn,
+            placeholder:'请输入英文图表名称'
+        }]
+    })
+    //截面散点图 chartType===10 与其他图格式不一样
+    if(Number(props.chartInfo.ChartInfo.ChartType)===10){
+        _ExtraConfig.value = JSON.parse(ExtraConfig)
+        const {XName,XNameEn,XUnitName,XUnitNameEn} = JSON.parse(ExtraConfig)
+        const {YName,YNameEn,YUnitName,YUnitNameEn} = JSON.parse(ExtraConfig)
+        let suppleFormList = [{
+            label:`X轴名称:${XName}`,
+            cnValue:XName,
+            enValue:XNameEn,
+            Value:XNameEn,
+            key:'XNameEn',
+            placeholder:'请输入X轴英文名称'
+        },{
+            label:`X轴单位:${XUnitName}`,
+            cnValue:XUnitName,
+            enValue:XUnitNameEn,
+            Value:XUnitNameEn,
+            key:'XUnitNameEn',
+            placeholder:'请输入X轴英文单位'
+        },{
+            label:`Y轴名称:${YName}`,
+            cnValue:YName,
+            enValue:YNameEn,
+            Value:YNameEn,
+            key:'YNameEn',
+            placeholder:'请输入Y轴英文名称'
+        },{
+            label:`Y轴单位:${YUnitName}`,
+            cnValue:YUnitName,
+            enValue:YUnitNameEn,
+            Value:YUnitNameEn,
+            key:'YUnitNameEn',
+            placeholder:'请输入Y轴英文单位'
+        }]
+        //补充第一项
+        formGroup.value[0].formList = formGroup.value[0].formList.concat(suppleFormList)
+        const {SeriesList} = JSON.parse(ExtraConfig)
+        const seriesEdbInfoList = SeriesList[0].EdbInfoList //每一项的EdbInfoList是一样的,取第一项就行
+        
+        let formSeriesList = []
+        let formEdbInfoList = []
+        SeriesList.forEach((serise,index)=>{
+            formSeriesList.push({
+                label:`系列${index+1}:${serise.Name}`,
+                cnValue:serise.Name,
+                enValue:serise.NameEn,
+                Value:serise.NameEn,
+                placeholder:'请输入系列英文名称'
+            })
+        })
+        seriesEdbInfoList.forEach((edb,index)=>{
+            formEdbInfoList.push({
+                label:`标签${index+1}:${edb.Name}`,
+                cnValue:edb.Name,
+                enValue:edb.NameEn,
+                Value:edb.NameEn,
+                placeholder:'请输入标签英文名称'
+            })
+        })
+        //第二项
+        formGroup.value.push({
+            groupName:'标签,系列名称',
+            SeriesListLength:formSeriesList.length,
+            formList:[...formSeriesList,...formEdbInfoList]
+        })
+        let formEdbList = []
+        for(const edb of EdbInfoList){
+            formEdbList.push({
+                EdbInfoId:edb.EdbInfoId,
+                label:edb.EdbName,
+                cnValue:edb.EdbName,
+                enValue:edb.EdbNameEn,
+                Value:edb.EdbNameEn,
+                placeholder:'请输入英文指标名称'
+            })
+        }
+        //第三项
+        formGroup.value.push({
+            groupName:'指标名称',
+            formList:formEdbList
+        })
+        activeGroup.value = formGroup.value.map(i=>i.groupName)
+        return
+    }
+
+    // 价格曲线
+    if(props.chartInfo.ChartInfo.Source===2){
+        //补充第一项
+        let forwardFormList=[
+            {
+                label:'期货名称',
+                cnValue:props.chartInfo.EdbInfoList[1].EdbName,
+                enValue:props.chartInfo.EdbInfoList[1].EdbNameEn,
+                Value:props.chartInfo.EdbInfoList[1].EdbName,
+                noEdit:true
+            },
+            {
+                label:'英文期货名称',
+                cnValue:props.chartInfo.EdbInfoList[1].EdbName,
+                enValue:props.chartInfo.EdbInfoList[1].EdbNameEn,
+                Value:props.chartInfo.EdbInfoList[1].EdbNameEn,
+                placeholder:'请输入英文期货名称'
+            }
+        ]
+        formGroup.value[0].formList = formGroup.value[0].formList.concat(forwardFormList)
+        
+       for(const edb of [EdbInfoList[0]]){
+            formGroup.value.push({
+                groupName:`${edb.EdbName}`,
+                EdbInfoId:edb.EdbInfoId,
+                formList:[
+                    {
+                        label:'指标名称',
+                        cnValue:edb.EdbName,
+                        enValue:edb.EdbNameEn,
+                        Value:edb.EdbName,
+                        noEdit:true,
+                    },
+                    {
+                        label:'单位',
+                        cnValue:edb.Unit,
+                        enValue:edb.UnitEn,
+                        Value:edb.Unit,
+                        noEdit:true
+                    },
+                    {
+                        label:'英文指标名称',
+                        cnValue:edb.EdbName,
+                        enValue:edb.EdbNameEn,
+                        Value:edb.EdbNameEn,
+                        placeholder:'请输入英文指标名称'
+                    },
+                    {
+                        label:'英文单位',
+                        cnValue:edb.Unit,
+                        enValue:edb.UnitEn,
+                        Value:edb.UnitEn,
+                        placeholder:'请输入英文单位'
+                    }
+                ]
+            })
+        }
+        activeGroup.value = formGroup.value.map(i=>i.groupName)
+        return
+    }
+
+    // 利润曲线
+    if(props.chartInfo.ChartInfo.Source===5){
+        //补充第一项
+        let forwardFormList=[
+            {
+                label:'盘面利润名称',
+                cnValue:props.chartInfo.DataResp.ProfitName,
+                enValue:props.chartInfo.DataResp.ProfitNameEn,
+                Value:props.chartInfo.DataResp.ProfitName,
+                noEdit:true
+            },
+            {
+                label:'英文盘面利润名称',
+                cnValue:props.chartInfo.DataResp.ProfitName,
+                enValue:props.chartInfo.DataResp.ProfitNameEn,
+                Value:props.chartInfo.DataResp.ProfitNameEn,
+                placeholder:'请输入英文盘面利润名称'
+            }
+        ]
+        formGroup.value[0].formList = formGroup.value[0].formList.concat(forwardFormList)
+        
+       for(const edb of [EdbInfoList[0]]){
+            formGroup.value.push({
+                groupName:`${edb.EdbName}`,
+                EdbInfoId:edb.EdbInfoId,
+                formList:[
+                    {
+                        label:'指标名称',
+                        cnValue:edb.EdbName,
+                        enValue:edb.EdbNameEn,
+                        Value:edb.EdbName,
+                        noEdit:true,
+                    },
+                    {
+                        label:'单位',
+                        cnValue:edb.Unit,
+                        enValue:edb.UnitEn,
+                        Value:edb.Unit,
+                        noEdit:true
+                    },
+                    {
+                        label:'英文指标名称',
+                        cnValue:edb.EdbName,
+                        enValue:edb.EdbNameEn,
+                        Value:edb.EdbNameEn,
+                        placeholder:'请输入英文指标名称'
+                    },
+                    {
+                        label:'英文单位',
+                        cnValue:edb.Unit,
+                        enValue:edb.UnitEn,
+                        Value:edb.UnitEn,
+                        placeholder:'请输入英文单位'
+                    }
+                ]
+            })
+        }
+        activeGroup.value = formGroup.value.map(i=>i.groupName)
+        return
+    }
+
+    // 相关性-3;拟合方程-6;统计特征-7,8,9
+    if([3,6,7,8,9].includes(props.chartInfo.ChartInfo.Source)){
+        activeGroup.value = formGroup.value.map(i=>i.groupName)
+        return
+    }
+
+    //普通图
+    for(const edb of EdbInfoList){
+        formGroup.value.push({
+            groupName:`${edb.EdbName}`,
+            EdbInfoId:edb.EdbInfoId,
+            formList:[
+                {
+                    label:'指标名称',
+                    cnValue:edb.EdbName,
+                    enValue:edb.EdbNameEn,
+                    Value:edb.EdbName,
+                    noEdit:true,
+                },
+                {
+                    label:'单位',
+                    cnValue:edb.Unit,
+                    enValue:edb.UnitEn,
+                    Value:edb.Unit,
+                    noEdit:true
+                },
+                {
+                    label:'英文指标名称',
+                    cnValue:edb.EdbName,
+                    enValue:edb.EdbNameEn,
+                    Value:edb.EdbNameEn,
+                    placeholder:'请输入英文指标名称'
+                },
+                {
+                    label:'英文单位',
+                    cnValue:edb.Unit,
+                    enValue:edb.UnitEn,
+                    Value:edb.UnitEn,
+                    placeholder:'请输入英文单位'
+                }
+            ]
+        })
+    }
+    //默认全部展开
+    activeGroup.value = formGroup.value.map(i=>i.groupName)
+}
+
+const showCellEditDialog = ref(false)
+const currentCell = ref({})
+let tempValue=''
+function handleCellClick(cell){
+    if(cell.noEdit) return
+    currentCell.value = cell
+    tempValue = cell.Value
+    showCellEditDialog.value = true
+}
+function handleConfirmEditCell(){
+    //console.log('check',currentCell.value)
+}
+function handleCancelEditCell(){
+    currentCell.value.Value = tempValue
+}
+function handleSave(){
+    let params = {
+        ChartInfoId:props.chartInfo.ChartInfo.ChartInfoId,
+        ChartNameEn:formGroup.value[0].formList[1].Value,
+        ChartEdbInfoList:[],
+    }
+    if(Number(props.chartInfo.ChartInfo.ChartType)===10){
+        //指标数据
+        let ChartEdbInfoList = []
+        formGroup.value[2].formList.forEach(item=>{
+            ChartEdbInfoList.push({
+                EdbInfoId:item.EdbInfoId,
+                EdbNameEn:item.Value.trim(),
+                UnitEn:''
+            })
+        })
+        params.ChartEdbInfoList = ChartEdbInfoList
+        //额外数据
+        _ExtraConfig.value.SeriesList.forEach((item,index)=>{
+            const {SeriesListLength} = formGroup.value[1]
+            item.NameEn = formGroup.value[1].formList[index].Value.trim()
+            item.EdbInfoList.forEach((edb,edb_index) => {
+                edb.NameEn= formGroup.value[1].formList[edb_index+SeriesListLength].Value.trim();
+            })
+        })
+        let suppleConfig = {}
+        let suppleList = formGroup.value[0].formList
+        for(let suppleIndex = 2;suppleIndex<suppleList.length;suppleIndex++){
+            const key = suppleList[suppleIndex].key
+            suppleConfig[key] = suppleList[suppleIndex].Value.trim()
+        }
+        _ExtraConfig.value = {..._ExtraConfig.value,...suppleConfig}
+        params.ExtraConfig = JSON.stringify(_ExtraConfig.value)
+    }else{
+        let ChartEdbInfoList = []
+        for(let index = 1;index<formGroup.value.length;index++){
+            ChartEdbInfoList.push({
+                EdbInfoId:formGroup.value[index].EdbInfoId,
+                EdbNameEn:formGroup.value[index].formList[2].Value.trim(),
+                UnitEn:formGroup.value[index].formList[3].Value.trim()
+            })
+        }
+        params.ChartEdbInfoList = ChartEdbInfoList
+    }
+    saveChartEn(params)
+}
+
+async function saveChartEn(params){
+    console.log(params);
+    let res=null
+    if([2,5].includes(props.chartInfo.ChartInfo.Source)){//商品价格
+        res=await apiFutureChart.chartInfoEditEn({
+            ChartInfoId: params.ChartInfoId,
+            ChartNameEn: params.ChartNameEn,
+            UnitEn: formGroup.value[1].formList[3].enValue || '',
+            EdbNameEn: formGroup.value[1].formList[2].enValue || '',
+            FutureGoodNameEn: props.chartInfo.ChartInfo.Source==2?formGroup.value[0].formList[3].enValue : '',
+            ProfitNameEn: props.chartInfo.ChartInfo.Source==5?formGroup.value[0].formList[3].enValue : '',
+        })
+    }else if(props.chartInfo.ChartInfo.Source===3){//相关性
+        res=await apiCorrelationChart.chartInfoEditEn({
+            ChartInfoId: params.ChartInfoId,
+            ChartNameEn: params.ChartNameEn,
+        })
+    }else if(props.chartInfo.ChartInfo.Source===6){//拟合方程
+        res=await apiLineEquationChart.chartInfoEditEn({
+            ChartInfoId: params.ChartInfoId,
+            ChartNameEn: params.ChartNameEn,
+        })
+    }else if([7,8,9].includes(props.chartInfo.ChartInfo.Source)){//统计特征
+        res=await apiStatisticFeatureChart.chartInfoEditEn({
+            ChartInfoId: params.ChartInfoId,
+            ChartNameEn: params.ChartNameEn,
+        })
+    }else{
+        res  = await apiChart.chartInfoEditEn(params)
+    }
+
+    
+    if(res.Ret!==200) return 
+    showToast({message:'设置英文名称成功',type:'success'})
+    emits('success')
+}
+</script>
+
+<template>
+    <div class="set-name-pop-wrap">
+        <van-collapse v-model="activeGroup">
+            <van-collapse-item
+                v-for="node in formGroup"
+                :key="node.groupName"
+                :name="node.groupName"
+                :title="node.groupName"
+                :is-link="true"
+            >
+                <van-cell
+                    v-for="cell in node.formList"
+                    :key="cell.label"
+                    :title="cell.label"
+                    :label="cell.Value.length?cell.Value:cell.placeholder"
+                    :is-link="!cell.noEdit"
+                    @click.stop="handleCellClick(cell,node)"
+                >
+                </van-cell>
+            </van-collapse-item>
+        </van-collapse>
+        <div class="tool-box">
+            <div class="btn cancel" @click="emits('cancel')">取消</div>
+            <div class="btn" @click="handleSave">保存</div>
+        </div>
+        <van-dialog 
+            v-model:show="showCellEditDialog" 
+            title="设置英文名称" 
+            show-cancel-button
+            confirmButtonText="确定"
+            @cancel="handleCancelEditCell"
+            @confirm="handleConfirmEditCell"
+        >
+            <div class="name">{{ currentCell.cnValue||'无'}}</div>
+            <div class="rename-wrap">
+                <input type="text" :placeholder="currentCell.placeholder" v-model="currentCell.Value">
+            </div>
+        </van-dialog>
+    </div>
+</template>
+
+<style lang="scss">
+.set-name-pop-wrap{
+    .van-collapse{
+        flex: 1;
+        background-color:#F6F6F6;
+    }
+    .van-collapse-item{
+        padding-bottom:20px;
+        &:last-child{
+            padding-bottom: 0;
+        }
+    }
+    .van-badge__wrapper{
+        align-self: center;
+    }
+    .van-collapse-item__content{
+        padding:0;
+    }
+    .name{
+        text-align: center;
+        margin-top:32px;
+        color: #666;
+    }
+    .rename-wrap{
+        padding:48px;
+        input{
+            padding: 24px 32px;
+            border-radius: 12px;
+            background-color: #F6F6F6;
+            width: 100%;
+        }
+        .label{
+            color: #666666;
+            margin-bottom: 32px;
+            text-align: center;
+        }
+    }
+    @media screen and (min-width:$media-width){
+        .van-collapse-item{
+            padding-bottom:10px;
+        }
+        .name{
+            margin-top:16px;
+        }
+        .rename-wrap{
+            padding:24px;
+            input{
+                padding: 12px 16px;
+                border-radius: 6px;
+                background-color: #F6F6F6;
+                width: 100%;
+            }
+            .label{
+                margin-bottom: 16px;
+            }
+        }
+    }
+}
+</style>
+<style scoped lang="scss">
+.set-name-pop-wrap{
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+    .tool-box{
+        position:sticky;
+        z-index: 99;
+        bottom: 0;
+        left:0;
+        right:0;
+        background-color: #fff;
+        padding:48px;
+        display: flex;
+        gap: 24px;
+        .btn{
+            flex: 1;
+            border:1px solid $theme-color;
+            border-radius: 12px;
+            background-color: $theme-color;
+            color:#fff;
+            text-align: center;
+            padding:16px;
+            &.cancel{
+                background-color: #fff;
+                color: $theme-color;
+            }
+        }
+    }
+    @media screen and (min-width:$media-width){
+        .tool-box{
+            padding:24px;
+            gap:12px;
+            .btn{
+                border-radius: 6px;
+                padding:8px;
+            }
+        }
+    }
+}
+</style>

+ 133 - 16
src/hooks/chart/render.js

@@ -80,26 +80,50 @@ export function chartRender({data,renderId,lang='zh',changeLangIsCheck,showChart
     RenderDomId.value=renderId
     chartData.value=data
 
-    if([1,3,4,5,6].includes(data.ChartInfo.ChartType)){
+    // if([1,3,4,5,6].includes(data.ChartInfo.ChartType)){
+    //     const chartSetMap = {
+    //         1: setSplineOpt,
+    //         3: setStackOrCombinChart,
+    //         4: setStackOrCombinChart,
+    //         5: setScatterOptions,
+    //         6: setStackOrCombinChart
+    //     };
+    //     chartOpt=chartSetMap[data.ChartInfo.ChartType](data)
+    // }else if(data.ChartInfo.ChartType ===2 ) {
+    //     chartOpt=setSeasonOpt(data)
+    // }else if(data.ChartInfo.ChartType ===7){//奇怪柱形图依赖数据
+    //     chartOpt=initBarData(data);
+    // }else if(data.ChartInfo.ChartType ===8){//商品价格曲线
+    //     chartOpt=initCommodityData(data);
+    // }else if(data.ChartInfo.ChartType ===9){//相关性图
+    //     chartOpt=initRelevanceChart(data);
+    // }else if(data.ChartInfo.ChartType ===10){//截面散点图
+    //     chartOpt=setSectionScatterChart(data);
+    // }
+    if(data.ChartInfo.Source===1){
         const chartSetMap = {
             1: setSplineOpt,
+            2: setSeasonOpt,
             3: setStackOrCombinChart,
             4: setStackOrCombinChart,
             5: setScatterOptions,
-            6: setStackOrCombinChart
+            6: setStackOrCombinChart,
+            7: initBarData,
+            10: setSectionScatterChart
         };
         chartOpt=chartSetMap[data.ChartInfo.ChartType](data)
-    }else if(data.ChartInfo.ChartType ===2 ) {
-        chartOpt=setSeasonOpt(data)
-    }else if(data.ChartInfo.ChartType ===7){//奇怪柱形图依赖数据
-        chartOpt=initBarData(data);
-    }else if(data.ChartInfo.ChartType ===8){//商品价格曲线
+    }else if([2,5].includes(data.ChartInfo.Source)){//商品价格曲线
         chartOpt=initCommodityData(data);
-    }else if(data.ChartInfo.ChartType ===9){//相关性图
+    }else if([3,4].includes(data.ChartInfo.Source)){//相关性 滚动相关性
         chartOpt=initRelevanceChart(data);
-    }else if(data.ChartInfo.ChartType ===10){//截面散点图
-        chartOpt=setSectionScatterChart(data);
+    }else if([6,7,8].includes(data.ChartInfo.Source)){//拟合方程 标准差 百分比
+        chartOpt=setSplineOpt(data);
+    }else if([9].includes(data.ChartInfo.Source)){//统计频率
+        chartOpt=setStatisticFrequency(data);
     }
+
+
+
     options.value={...chartDefaultOpts,...chartOpt}
     // 设置图标题
     setChartTitle(showChartTitle)
@@ -343,9 +367,92 @@ function setChartTitle(showChartTitle){
     }
 }
 
+//统计频率图
+function setStatisticFrequency(e){
+    axisLimitState.leftIndex=-1
+    axisLimitState.rightIndex=-1
+    axisLimitState.rightTwoIndex=-1
+
+    const { DataList,LeftMaxValue,LeftMinValue,RightMaxValue,RightMinValue } = e.DataResp;
+
+    const xAxis = {
+        ...scatterXAxis,
+        tickWidth: 1,
+        title: {
+          text:  ``,
+          align: 'high',
+          rotation: 0,
+          x: 0,
+          offset: 20,
+        }
+    }
+
+    //y和系列
+    let yAxis = [],series = [];
+    DataList.forEach((item,index) => {
+      let y_item = {
+        ...basicYAxis,
+        title: {
+          text: item.Unit,
+          textCh:item.Unit,// 中文
+          textEn:item.UnitEn||item.Unit,
+          align: 'high',
+          rotation: 0,
+          y: -15,
+          offset: 0,
+        },
+        opposite: item.IsAxis===1?false:true,
+        min: index===0? Number(LeftMinValue):Number(RightMinValue),
+        max: index===0? Number(LeftMaxValue):Number(RightMaxValue),
+        tickWidth: 1,
+      }
+
+      let series_item = {
+        data: item.Value.map(_ =>[_.X,_.Y]),
+        type: 'spline',
+        yAxis: index,
+        name: item.Name,
+        nameCh: item.Name,
+        nameEn: item.NameEn||item.Name,
+        color: item.Color,
+        lineWidth: 3,
+        chartType: 'linear',
+        zIndex:1
+      }
+
+      series.push(series_item);
+      yAxis.push(y_item)
+    })
+
+    let tooltip = {
+        formatter: function() {
+          let xList = DataList[0].Value.map(_ =>_.X);
+          let step = xList[1]-xList[0];
+          let data_interval = `[${this.x},${this.x+step}]`;
+
+          let str=`<b>${ data_interval }</b>`;
+          this.points.forEach(item => {
+            str += `<br><span style="color:${item.color}">\u25CF</span>${item.series.name}: ${item.y}%<br>`
+          })
+          return str
+        },
+        shared: true
+    }
+
+    return {
+        title: {
+            text:''
+          },
+        tooltip,
+        series,
+        yAxis,
+        xAxis
+    }
+}
+
 //曲线图
 function setSplineOpt(e){
-    const data=e.ChartInfo.Source===6?[e.DataResp]:e.EdbInfoList
+    const data=[6,7,8].includes(e.ChartInfo.Source)?[e.DataResp]:e.EdbInfoList
     let series=[]
     let yAxis=[]
     let xAxis = {}
@@ -985,6 +1092,13 @@ function setScatterOptions(data){
     const dataList=data.EdbInfoList
     const { ChartInfo } = data;
 
+    axisLimitState.hasLeftAxis=true
+    axisLimitState.leftMin=Number(dataList[0].MinData)
+    axisLimitState.leftMax=Number(dataList[0].MaxData)
+
+    axisLimitData.leftMin=Number(dataList[0].MinData)
+    axisLimitData.leftMax=Number(dataList[0].MaxData)
+
     // 取2个指标中日期相同的数据
     const real_data = [];
     let tmpData_date = {};//用来取点对应的日期
@@ -1410,7 +1524,7 @@ function initRelevanceChart(data){
     axisLimitState.rightTwoIndex=-1
     // 处理X轴
     let xAxis={
-        categories: data.XEdbIdValue,
+        categories: data.ChartInfo.Source===3?data.XEdbIdValue:data.DataResp.XDateTimeValue,
         tickWidth: 1,
         title: {
           text: data.ChartInfo.Source===3 ?`期数(${data.CorrelationChartInfo.LeadUnit})` : null,
@@ -1492,11 +1606,14 @@ function initRelevanceChart(data){
     }
     
     nextTick(()=>{
-        const hEl=document.getElementById(RenderDomId.value)
-        // console.log(hEl.offsetHeight);
-        xAxis.offset=-(hEl.offsetHeight-98)/2
+        if(data.ChartInfo.Source===3){
+            const hEl=document.getElementById(RenderDomId.value)
+            // console.log(hEl.offsetHeight);
+            xAxis.offset=-(hEl.offsetHeight-98)/2
+        }
+        
         options.value = {
-            isRelevanceChart:true,
+            isRelevanceChart:data.ChartInfo.Source===3,
             title: {
                 text:''
             },

+ 27 - 0
src/hooks/common.js

@@ -1,5 +1,6 @@
 import {Base64} from 'js-base64'
 import {ref} from 'vue'
+import { showToast } from 'vant'
 
 
 // 导出静态图片资源
@@ -52,4 +53,30 @@ export function transfImgTobase64(url) {
         };
         image.src = url;
     })
+}
+
+/**
+ * 设置剪切板
+ * @param text 文本
+ */
+export async function setClipboardData(text){
+    if(navigator.clipboard&&window.isSecureContext){
+        try{
+           await navigator.clipboard.writeText(text)
+           showToast({message:'复制链接成功',type:'success'})
+       }catch(err){
+           console.log(err);
+           throw new Error(JSON.stringify(err)) 
+           showToast({message:'复制链接失败',type:'fail'})
+       }
+   }else{
+       const input = document.createElement('input')
+       input.setAttribute('readonly','readonly')
+       input.value = text
+       document.body.appendChild(input)
+       input.select();
+       document.execCommand('copy');
+       document.body.removeChild(input);
+       showToast({message:'复制链接成功',type:'success'})
+   }
 }

+ 2 - 11
src/router/myETA.js

@@ -10,16 +10,7 @@
         component: () => import("@/views/myETA/Index.vue"),
         meta: { 
             title: "My ETA",
-            keepAlive:false
-        },
-    },
-    {
-        path:"/myETA/chartlist",
-        name:"MyETAChartList",
-        component: () => import("@/views/myETA/ChartList.vue"),
-        meta: { 
-            title: "My ETA",
-            keepAlive:false
+            keepAlive:true
         },
     },
     {
@@ -28,7 +19,7 @@
         component: () => import("@/views/myETA/SearchList.vue"),
         meta: { 
             title: "My ETA",
-            keepAlive:false
+            keepAlive:true
         },
     },
     {

+ 2 - 2
src/views/chartETA/ChartDetail.vue

@@ -548,7 +548,7 @@ function initChartState(data){
         <!-- 指标模块 -->
         <div class="edb-list-box">
             <!-- pad 设置上下限按钮 -->
-            <div class="pad-limit-set-btn" @click="handleShowAxisLimitOpt" v-if="chartInfo.Source!=3&&chartInfo.ChartType!=8">设置上下限</div>
+            <div class="pad-limit-set-btn" @click="handleShowAxisLimitOpt" v-if="![3,4,6,7,8,9].includes(chartInfo.Source)">设置上下限</div>
             <!-- <div class="list-lable">指标信息</div> -->
             <div class="list-box">
                 <div class="list-item" v-for="item in edbList" :key="item.EdbInfoId" @click="handleShowEDBInfo(item)">
@@ -568,7 +568,7 @@ function initChartState(data){
                 <img class="icon" style="transform: rotate(180deg);" src="@/assets/imgs/icon_arrow.png" alt="">
                 <div>下一张</div>
             </div>
-            <div class="item" @click="handleShowAxisLimitOpt" v-if="chartInfo.Source!=3&&chartInfo.ChartType!=8">
+            <div class="item" @click="handleShowAxisLimitOpt" v-if="![3,4,6,7,8,9].includes(chartInfo.Source)">
                 <img class="icon" src="@/assets/imgs/myETA/icon_limit.png" alt="">
                 <div>上下限</div>
             </div>

+ 219 - 133
src/views/myETA/ChartDetail.vue

@@ -1,14 +1,11 @@
 <script setup>
 import {ref,nextTick, reactive} from 'vue'
 import apiETAChart from '@/api/chart'
-import {
-    apiMyChartList,
-    apiMyClassifyList,
-    apiChartInMyClassifyList,
-    apiChartAddToClassify,
-    apiMyChartRemove,
-    apiChartDel
-} from '@/api/myETA'
+import apiFutureChart from '@/api/futureChart'
+import apiCorrelationChart from '@/api/correlationChart'
+import apiLineEquationChart from '@/api/lineEquationChart'
+import apiStatisticFeatureChart from '@/api/statisticFeatureChart'
+import apiMyETAChart from '@/api/myETA'
 import { useRoute, useRouter } from 'vue-router'
 import {useChartRender} from '@/hooks/chart/render'
 import {yearSelectOpt,sameOptionType} from '@/hooks/chart/config'
@@ -18,21 +15,25 @@ import { showToast,showDialog} from 'vant'
 import ChartSaveOther from './components/ChartSaveOther.vue'
 import _ from 'lodash';
 import { useWindowSize } from '@vueuse/core'
+import {setClipboardData} from '@/hooks/common'
+import SetChartEnName from '@/components/SetChartEnName.vue'
+import {useCachedViewsStore} from '@/store/modules/cachedViews'
 
 const { width, height } = useWindowSize()
-
+const cachedViewsStore=useCachedViewsStore()
 const {options,axisLimitState,chartRender}=useChartRender()
 
 
 const route=useRoute()
 const router=useRouter()
 let chartCode=route.query.code
+let CHARTINS=null//图表实例
 
 // 获取当前图表所在分类下的所有图表数据 用于上一张下一张切换
 let allChartList=ref([])
 async function getAllChartList(){
     if(!route.query.cid) return
-    const res=await apiMyChartList({
+    const res=await apiMyETAChart.myChartList({
         CurrentIndex:1,
         PageSize:1000000,
         MyChartClassifyId:Number(route.query.cid)
@@ -65,17 +66,26 @@ async function getChartInfo(){
     chartInfoData=res.Data
 
     chartInfo.value=res.Data.ChartInfo
-    if(res.Data.ChartInfo.Source===2){
+    if([2,5].includes(res.Data.ChartInfo.Source)){
         edbList.value=[res.Data.EdbInfoList[0]]
     }else{
         edbList.value=res.Data.EdbInfoList
     }
 
     chartState.yearVal=res.Data.ChartInfo.DateType
-
+    if(res.Data.ChartInfo.DateType===5){
+        chartState.startTime=res.Data.ChartInfo.StartDate
+        chartState.endTime=res.Data.ChartInfo.EndDate
+        temStartTime.value=res.Data.ChartInfo.StartDate.split('-')
+        temEndTime.value=res.Data.ChartInfo.EndDate.split('-')
+    }
+    if(res.Data.ChartInfo.DateType===6){
+        chartState.startTime=res.Data.ChartInfo.StartDate
+        temStartTime.value=res.Data.ChartInfo.StartDate.split('-')
+    }
 
     nextTick(()=>{
-        chartRender({
+        CHARTINS=chartRender({
             data:res.Data,
             renderId:'chart-box',
             lang:'zh',
@@ -103,29 +113,13 @@ async function reloadChartInfo(){
     if(res.Ret!==200) return
     chartInfo.value=res.Data.ChartInfo
 
-    // const beforeOptions = sessionStorage.getItem('myChartbeforeOptions')
-    //       ? JSON.parse(sessionStorage.getItem('myChartbeforeOptions'))
-    //       : '';
-    // //合并缓存配置和新的数据
-    // const newarr = res.Data.EdbInfoList.map((item, index) => {
-    //     if (beforeOptions) {
-    //         const DataList = item.DataList;
-    //         return {
-    //           ...beforeOptions[index],
-    //           DataList,
-    //         };
-    //     } else {
-    //         return item;
-    //     }
-    // })
-    chartRender({
+    CHARTINS=chartRender({
         data:{
             ...res.Data,
             ChartInfo:{
                 ...res.Data.ChartInfo,
                 Calendar:chartState.calendarType||'公历'
-            },
-            // EdbInfoList:newarr
+            }
         },
         renderId:'chart-box',
         lang:'zh',
@@ -254,7 +248,7 @@ function handleConfirmLimitChange(){
         }
     }
 
-    chartRender({
+    CHARTINS=chartRender({
         data:data,
         renderId:'chart-box',
         lang:'zh',
@@ -310,7 +304,7 @@ async function handleUpdateRender(val,isEdit){
         edbList.value[index]=val
     }
 
-    chartRender({
+    CHARTINS=chartRender({
         data:{
             ...chartInfoData,
             EdbInfoList:edbList.value
@@ -331,7 +325,7 @@ let showMoreAction=ref(false)
 // 复制到
 let myChartClassifyList=[]//我的图库中的所有分类
 async function getMyChartClassifyList(){
-    const res=await apiMyClassifyList()
+    const res=await apiMyETAChart.myClassifyList()
     if(res.Ret===200){
         myChartClassifyList=res.Data.List||[]
     }
@@ -340,7 +334,7 @@ getMyChartClassifyList()
 let showCopyTo=ref(false)
 let copyToOpt=ref([])
 async function handleShowCopyTo(){
-    const res=await apiChartInMyClassifyList({ChartInfoId:chartInfo.value.ChartInfoId})
+    const res=await apiMyETAChart.chartInMyClassifyList({ChartInfoId:chartInfo.value.ChartInfoId})
     if(res.Ret===200){
         const arr=res.Data||[]
         copyToOpt.value=myChartClassifyList.map(e=>{
@@ -363,7 +357,7 @@ async function handleConfirmCopy(){
         showToast('请选择分类')
         return
     }
-    const res=await apiChartAddToClassify({
+    const res=await apiMyETAChart.chartAddToClassify({
         ChartInfoId:chartInfo.value.ChartInfoId,
         MyChartClassifyId:arr
     })
@@ -385,12 +379,14 @@ function handleRemoveChart(){
         showCancelButton:true
     }).then(() => {
         // on close
-        apiMyChartRemove({
+        apiMyETAChart.myChartRemove({
             MyChartClassifyId:Number(route.query.cid),
             MyChartId:chartInfo.value.MyChartId
         }).then(res=>{
             if(res.Ret===200){
                 showToast('移出成功')
+                cachedViewsStore.removeCaches('MyETAIndex')
+                cachedViewsStore.removeCaches('MyETASearchList')
                 setTimeout(() => {
                     router.back()
                 }, 1500)
@@ -407,11 +403,13 @@ function handleDeleteChart(){
         showCancelButton:true
     }).then(() => {
         // on close
-        apiChartDel({
+        apiMyETAChart.chartDel({
             ChartInfoId:chartInfo.value.ChartInfoId
         }).then(res=>{
             if(res.Ret===200){
                 showToast('删除成功')
+                cachedViewsStore.removeCaches('MyETAIndex')
+                cachedViewsStore.removeCaches('MyETASearchList')
                 setTimeout(() => {
                     router.back()
                 }, 1500)
@@ -423,6 +421,67 @@ function handleDeleteChart(){
 // 另存为
 let showSaveChartOther=ref(false)
 
+// 刷新
+async function handleChartRefresh(){
+    const { Source,ChartInfoId,UniqueCode } = chartInfo.value
+    let res=null
+    if(Source===1){
+        res= await apiETAChart.chartRefresh({ ChartInfoId })
+    }else if([2,5].includes(Source)){
+        res=await apiFutureChart.refreshChart({ ChartInfoId })
+    }else if([3,4].includes(Source)){
+        res=await apiCorrelationChart.refreshChart({ ChartInfoId })
+    }else if(Source===6){
+        res=await apiLineEquationChart.refreshChart({ ChartInfoId })
+    }else if([7,8,9].includes(Source)) {
+        res=await apiStatisticFeatureChart.refreshChart({ ChartInfoId })
+    }
+    if(res.Ret!==200)return
+    showToast('刷新成功')
+    showMoreAction.value=false
+    Source===1?reloadChartInfo():getChartInfo()
+}
+
+//分享
+function handleChartShare(){
+    const url=import.meta.env.VITE_CHART_LINK+`?code=${chartInfo.value.UniqueCode}&fromType=share&lang=ch`
+    setClipboardData(url)
+}
+
+//保存图片
+let savePicDialogShow = ref(false)
+let savePicSrc = ref('')
+function handleChartSavePicture(){
+    const {chartWidth,chartHeight} = CHARTINS
+    const svgData = CHARTINS.getSVG({
+        chart: {
+            width: chartWidth,
+            height: chartHeight,
+        }
+    })
+    console.log(chartWidth,chartHeight);
+    const canvas = document.createElement('canvas')
+    const ctx = canvas.getContext('2d')
+    canvas.width = chartWidth*2
+    canvas.height = chartHeight*2
+    const image = new Image()
+    image.src = 'data:image/svg+xml;charset=utf-8,'+encodeURIComponent(svgData)
+    image.onload = ()=>{
+        ctx.drawImage(image, 0, 0,chartWidth*2,chartHeight*2);
+        savePicSrc.value = canvas.toDataURL('image/png');
+        savePicDialogShow.value = true
+    }
+}
+
+// 显示修改英文名称弹窗
+let showEidtEnName=ref(false)
+function handleShowEditEnName(){
+    showEidtEnName.value=true
+}
+function handleEditEnNameSuccess(){
+    reloadChartInfo()
+}
+
 </script>
 
 <template>
@@ -431,18 +490,18 @@ let showSaveChartOther=ref(false)
         <!-- 一般曲线图选择时间区间或者季节图选择日期 -->
         <div 
             class="select-time-box" 
-            v-if="sameOptionType.includes(chartInfo.ChartType)||chartInfo.ChartType===2" 
+            v-if="(sameOptionType.includes(chartInfo.ChartType)&& chartInfo.Source===1)||chartInfo.ChartType===2" 
             @click="chartState.showTimePop=true"
         >
             <img class="left-icon" src="@/assets/imgs/icon_calendar.png" alt="">
-            <span :class="['val-box',!chartState.startTime?'val-box_grey':'']">{{chartState.startTime||'开始日期'}} ~ {{chartState.endTime||'结束日期'}}</span>
+            <span :class="['val-box',!chartState.startTime?'val-box_grey':'']">{{chartState.startTime||'开始日期'}} ~ {{chartState.startTime&&!chartState.endTime?'至今':chartState.endTime||'结束日期'}}</span>
             <van-icon class="right-icon" name="arrow" />
         </div>
 
         <!-- pad端时间和操作按钮模块 -->
         <div class="pad-time-action-wrap">
-            <div class="left-time-box">
-                <template v-if="sameOptionType.includes(chartInfo.ChartType)">
+            <div class="left-time-box" >
+                <template v-if="sameOptionType.includes(chartInfo.ChartType)&& chartInfo.Source===1">
                     <span :class="['item',chartState.yearVal==''?'active':'']" @click="handleYearChange({value:''})">全部</span>
                     <span 
                         :class="['item',chartState.yearVal==item.value?'active':'']"
@@ -452,27 +511,19 @@ let showSaveChartOther=ref(false)
                     >{{item.name}}</span>
                 </template>
                 <span 
-                    class="time-box" 
-                    v-if="sameOptionType.includes(chartInfo.ChartType)||chartInfo.ChartType===2"
+                    class="time-box"
+                    v-if="(sameOptionType.includes(chartInfo.ChartType)&& chartInfo.Source===1)||chartInfo.ChartType===2"
                     @click="chartState.showTimePop=true"
-                >{{chartState.startTime?chartState.startTime+'~'+chartState.endTime:'请选择时间段'}}</span>
+                >{{chartState.startTime?chartState.startTime+'~'+(chartState.endTime?chartState.endTime:'至今'):'请选择时间段'}}</span>
             </div>
             <div class="right-action-box">
-                <div class="item red" @click.stop="handleRemoveChart" v-if="$route.query.iscommon!='true'">
-                    <img src="@/assets/imgs/myETA/icon_remove2.png" alt="">
-                    <span>移出</span>
-                </div>
-                <div class="item" @click.stop="handleShowCopyTo" v-if="$route.query.iscommon!='true'">
-                    <img src="@/assets/imgs/myETA/icon_copy2.png" alt="">
-                    <span>复制到</span>
+                <div class="item" @click="handleShowAxisLimitOpt" v-if="![3,4,6,7,8,9].includes(chartInfo.Source)">
+                    <img src="@/assets/imgs/myETA/icon_limit2.png" alt="">
+                    <span>上下限设置</span>
                 </div>
-                <div class="item" @click.stop="showSaveChartOther=true">
-                    <img src="@/assets/imgs/myETA/icon_save2.png" alt="">
-                    <span>另存为</span>
-                </div>
-                <div class="item red" @click.stop="handleDeleteChart" v-if="chartInfo.IsEdit">
-                    <img src="@/assets/imgs/icon_del.png" alt="">
-                    <span>删除</span>
+                <div class="item" @click="showMoreAction=true">
+                    <img src="@/assets/imgs/chartETA/more-icon.png" alt="">
+                    <span>更多设置</span>
                 </div>
             </div>
         </div>
@@ -486,7 +537,7 @@ let showSaveChartOther=ref(false)
         </div>
 
         <!-- 一般曲线图选择时间区间 -->
-        <div class="select-year-box" v-if="sameOptionType.includes(chartInfo.ChartType)">
+        <div class="select-year-box" v-if="sameOptionType.includes(chartInfo.ChartType)&& chartInfo.Source===1">
             <span :class="['item',chartState.yearVal==''?'active':'']" @click="handleYearChange({value:''})">全部</span>
             <span 
                 :class="['item',chartState.yearVal==item.value?'active':'']"
@@ -509,17 +560,12 @@ let showSaveChartOther=ref(false)
 
         <!-- 指标模块 -->
         <div class="edb-list-box">
-            <!-- pad 设置上下限按钮 -->
-            <span class="pad-limit-set-btn" @click="handleShowAxisLimitOpt" v-if="chartInfo.Source!=3&&chartInfo.ChartType!=8">设置上下限</span>
-            <div class="list-lable">指标信息</div>
-            <div class="list-box">
-                <van-cell 
-                    :title="item.EdbName" 
-                    is-link
-                    v-for="item in edbList" 
-                    :key="item.EdbInfoId" 
-                    @click="handleShowEDBInfo(item)"
-                />
+           <div class="list-box">
+                <div class="list-item" v-for="item in edbList" :key="item.EdbInfoId" @click="handleShowEDBInfo(item)">
+                    <span class="date">{{item.LatestDate}}</span>
+                    <span class="edb-name van-ellipsis" :style="{color:item.ChartColor}">{{item.EdbName}}</span>
+                    <span class="value">{{item.LatestValue}}</span>
+                </div>
             </div>
         </div>
 
@@ -533,7 +579,7 @@ let showSaveChartOther=ref(false)
                 <img class="icon" style="transform: rotate(180deg);" src="@/assets/imgs/icon_arrow.png" alt="">
                 <div>下一张</div>
             </div>
-            <div class="item" @click="handleShowAxisLimitOpt" v-if="chartInfo.Source!=3&&chartInfo.ChartType!=8">
+            <div class="item" @click="handleShowAxisLimitOpt" v-if="![3,4,6,7,8,9].includes(chartInfo.Source)">
                 <img class="icon" src="@/assets/imgs/myETA/icon_limit.png" alt="">
                 <div>上下限</div>
             </div>
@@ -577,7 +623,7 @@ let showSaveChartOther=ref(false)
     <van-popup 
         v-model:show="showEDB"
         :position="width>650?'right':'bottom'"
-        round
+        :round="width>650?false:true"
         closeable
         :style="width>650?{ width: '400px', height: '100%' }:''"
     >
@@ -683,25 +729,35 @@ let showSaveChartOther=ref(false)
     <!-- 更多操作弹窗 -->
     <van-popup 
         v-model:show="showMoreAction"
-        position="bottom"
+        :position="width>650?'center':'bottom'"
+        :style="width>650?{ width: '400px'}:''"
         round
     >
         <div class="more-action-wrap">
-            <div class="item" @click.stop="handleShowCopyTo" v-if="$route.query.iscommon!='true'">
-                <img src="@/assets/imgs/myETA/icon_copy.png" alt="">
-                <span>复制到</span>
+            <div class="van-ellipsis title-box">{{chartInfo.ChartName}}</div>
+            <div class="item" @click.stop="handleChartRefresh">
+                刷新
             </div>
-            <div class="item" @click.stop="showSaveChartOther=true">
-                <img src="@/assets/imgs/myETA/icon_save.png" alt="">
-                <span>另存为</span>
+            <div class="item" @click.stop="handleChartShare" v-if="!chartInfo.Disabled">
+                分享
             </div>
             <div class="item" @click.stop="handleRemoveChart" v-if="$route.query.iscommon!='true'">
-                <img src="@/assets/imgs/myETA/icon_remove.png" alt="">
-                <span>移出</span>
+                移出
+            </div>
+            <div class="item" @click.stop="handleShowCopyTo" v-if="$route.query.iscommon!='true'">
+                复制到
+            </div>
+            <div class="item" @click.stop="showSaveChartOther=true" v-if="chartInfo.Button.IsCopy">
+                另存为
+            </div>
+            <div class="item" @click.stop="handleChartSavePicture" v-if="!chartInfo.Disabled">
+                保存图片
+            </div>
+            <div class="item" @click.stop="handleShowEditEnName">
+                设置英文名称
             </div>
             <div class="item" @click.stop="handleDeleteChart" v-if="chartInfo.IsEdit">
-                <img src="@/assets/imgs/myETA/icon_del.png" alt="">
-                <span>删除</span>
+                删除
             </div>
         </div>
     </van-popup>
@@ -710,7 +766,7 @@ let showSaveChartOther=ref(false)
     <van-popup 
         v-model:show="showCopyTo"
         :position="width>650?'center':'bottom'"
-        round
+        :round="width>650?true:false"
         closeable
     >
         <div class="global-pop-wrap_mobile chart-copyto-wrap">
@@ -726,9 +782,9 @@ let showSaveChartOther=ref(false)
                         @click="item.select=!item.select"
                     >{{item.MyChartClassifyName}}</li>
                 </ul>
-                <div v-if="copyToOpt.length===0" style="padding:50px 0;text-align:center">无数据</div>
+                <div v-if="copyToOpt.length===0" style="padding:50px 0;text-align:center">暂无分类,快去创建我的分类吧~</div>
             </div>
-            <div class="bot-btn-box" @click="handleConfirmCopy">确定</div>
+            <div class="bot-btn-box" @click="handleConfirmCopy" v-if="copyToOpt.length>0">确定</div>
         </div>
     </van-popup>
 
@@ -739,6 +795,32 @@ let showSaveChartOther=ref(false)
         :show="showSaveChartOther"
         @close="showSaveChartOther=false"
     />
+
+    <!--保存图片弹窗 -->
+    <van-popup 
+        v-model:show="savePicDialogShow"
+        position="center"
+        round
+    >
+        <div class="chart-picture-box">
+            <img :src="savePicSrc" alt="">
+            <p style="text-align: center;color:#999;margin-top: 10px;">长按保存图片</p>
+        </div>
+    </van-popup>
+
+    <!-- 修改英文名称 -->
+    <van-popup 
+        v-model:show="showEidtEnName"
+        position="bottom"
+        :style="{height:'100%'}"
+    >
+        <set-chart-en-name
+            :isShow="showEidtEnName"
+            :chartInfo="chartInfoData"
+            @cancel="showEidtEnName=false"
+            @success="handleEditEnNameSuccess"
+        />
+    </van-popup>
 </template>
 
 <style lang="scss" scoped>
@@ -846,23 +928,18 @@ let showSaveChartOther=ref(false)
     }
 
     .edb-list-box{
-        .pad-limit-set-btn{
-            display: none;
-        }
-        .list-lable{
-            font-size: 36px;
-            color: #000;
-            margin-bottom: 20px;
-            margin-top: 40px;
-        }
-        :deep(.van-cell){
-            padding-left: 0;
-            padding-right: 0;
-            font-size: 32px;
-        }
-        :deep(.van-cell:after){
-            right: 0;
-            left: 0;
+        margin-top: 20px;
+        .list-item{
+            padding:18px;
+            display: flex;
+            gap:0 20px;
+            border-bottom: 1px solid #DCDFE6;
+            &:last-child{
+                border-bottom: none;
+            }
+            .edb-name{
+                flex: 1;
+            }
         }
     }
 
@@ -940,17 +1017,19 @@ let showSaveChartOther=ref(false)
     
 }
 .more-action-wrap{
+    .title-box{
+        font-size: 36px;
+        font-weight: 600;
+        text-align: center;
+        padding: $page-padding;
+    }
     .item{
         display: flex;
         align-items: center;
+        justify-content: center;
         padding: 32px 34px;
-        border-bottom: 1px solid $border-color;
+        border-top: 1px solid $border-color;
         font-size: 32px;
-        img{
-            width: 48px;
-            height: 48px;
-            margin-right: 20px;
-        }
     }
 }
 
@@ -995,6 +1074,17 @@ let showSaveChartOther=ref(false)
     }
 }
 
+.chart-picture-box{
+    width: 300PX;
+    border-radius: 6PX;
+    padding: 10PX;
+    background-color: #fff;
+    img{
+        width: 100%;
+        display: block;
+    }
+}
+
 @media screen and (min-width:$media-width){
     .chart-detail-page{
         padding: 30px;
@@ -1045,29 +1135,9 @@ let showSaveChartOther=ref(false)
         }
 
         .edb-list-box{
-            position: relative;
-            left: -30px;
-            border-top: 1px solid $border-color;
-            width: 100vw;
-            padding: 0 30px;
-            .pad-limit-set-btn{
-                display: block;
-                position: absolute;
-                right: 30px;
-                top: 20px;
-                color: $theme-color;
-            }
-            .list-lable{
-                margin-top: 20px;
-                font-size: 16px;
-                margin-bottom: 14px;
-            }
-            :deep(.van-cell){
-                font-size: 14px;
-                padding: 10px 20px;
-            }
-            .list-box{
-                border: 1px solid $border-color;
+            margin-top: 30px;
+            .list-item{
+                padding: 10px 0;
             }
         }
         .fix-bot-action-box{
@@ -1091,6 +1161,7 @@ let showSaveChartOther=ref(false)
                     border: 1px solid $theme-color;
                     margin-right: 10px;
                     border-radius: 3px;
+                    color: $theme-color;
                     &.active{
                         color: #fff;
                         background-color: $theme-color;
@@ -1157,6 +1228,17 @@ let showSaveChartOther=ref(false)
             }
         }
     }
+    .more-action-wrap{
+        .title-box{
+            font-size: 18px;
+            padding: 20px $page-padding;
+        }
+        .item{
+            padding: 20px $page-padding;
+            font-size: 16px;
+        }
+    }
+
     .chart-copyto-wrap{
         width: 375px;
         .head-box{
@@ -1187,5 +1269,9 @@ let showSaveChartOther=ref(false)
             }
         }
     }
+
+    .chart-picture-box{
+        width: 500PX;
+    }
 }
 </style>

+ 0 - 149
src/views/myETA/ChartList.vue

@@ -1,149 +0,0 @@
-<script setup>
-import {ref,reactive} from 'vue'
-import {apiMyChartList,apiMyChartRemove} from '@/api/myETA'
-import { useRoute, useRouter } from "vue-router";
-import { showConfirmDialog, showToast } from 'vant';
-
-
-const router=useRouter()
-const route=useRoute()
-document.title=route.query.cname
-
-const isCommon=ref(route.query.iscommon=='true'?true:false)
-const cid=ref(route.query.cid||0)
-const listState = reactive({
-    list:[],
-    page:0,
-    pageSize:20,
-    finished:false,
-    loading:false
-})
-async function getList(){
-    const res=await apiMyChartList({
-        CurrentIndex:listState.page,
-        PageSize:listState.pageSize,
-        MyChartClassifyId:Number(cid.value)
-    })
-    if(res.Ret===200){
-        listState.loading=false
-        if(!res.Data){
-            listState.finished=true
-            return
-        }
-        
-        listState.finished=res.Data.Paging.IsEnd
-        const arr=res.Data.List||[]
-        listState.list=[...listState.list,...arr]
-    }
-}
-function onLoad(){
-    listState.page++
-    getList()
-}
-
-// 移除图表
-function handleRemove(item,index){
-    showConfirmDialog({
-        title: '提示',
-        message:'是否确认移出?',
-    }).then(()=>{
-        apiMyChartRemove({
-            MyChartClassifyId:Number(cid.value),
-            MyChartId:item.MyChartId
-        }).then(res=>{
-            if(res.Ret===200){
-                setTimeout(() => {
-                    showToast('移出成功')
-                }, 100);
-                listState.list.splice(index,1)
-            }
-        })
-    }).catch(()=>{})
-}
-
-// 跳转图详情
-function goChartDetail(item){
-    router.push({
-        path:"/myETA/chartdetail",
-        query:{
-            code:item.UniqueCode,
-            cid:cid.value,
-            iscommon:isCommon.value
-        }
-    })
-}
-
-</script>
-
-<template>
-    <div class="chart-list-page">
-        <van-list
-            v-model:loading="listState.loading"
-            :finished="listState.finished"
-            :finished-text="listState.list.length>0?'没有更多了':'暂无图表'"
-            @load="onLoad"
-        >
-            <img v-if="listState.list.length==0&&listState.finished" class="list-empty-img" src="https://hzstatic.hzinsights.com/static/ETA_mobile/empty_img.png" alt="">
-            <template v-for="item,index in listState.list" :key="item.ChartInfoId">
-                <van-swipe-cell :disabled="isCommon">
-                    <div class="list-item" @click="goChartDetail(item)">
-                        <img class="img" :src="item.ChartImage" alt="">
-                        <div class="con-box">
-                            <div class="van-ellipsis name">{{item.ChartName}}</div>
-                            <div class="time">创建时间:{{item.CreateTime.slice(0,10)}}</div>
-                        </div>
-                    </div>
-                    <template #right>
-                        <div class="del-btn" @click="handleRemove(item,index)">移除</div>
-                    </template>
-                </van-swipe-cell>
-            </template>
-        </van-list>
-    </div>
-</template>
-
-<style lang="scss" scoped>
-.search-box{
-    position: sticky;
-    top: 0;
-    background-color: #fff;
-    z-index: 99;
-}
-.list-item{
-    display: flex;
-    padding-top: 20px;
-    padding-left: $page-padding;
-    .img{
-        width: 160px;
-        height: 108px;
-        object-fit: contain;
-        margin-right: 20px;
-        border: 1px solid $border-color;
-        border-radius: 4px;
-        overflow: hidden;
-    }
-    .con-box{
-        padding-bottom: 20px;
-        padding-right: $page-padding;
-        flex: 1;
-        // display: flex;
-        // flex-direction: column;
-        // justify-content: space-between;
-        border-bottom: 1px solid $border-color;
-        overflow: hidden;
-        .time{
-            color: $font-grey_999;
-            margin-top: 30px;
-        }
-    }
-}
-.del-btn{
-        width: 137px;
-        height: 100%;
-        background-color: $theme-red;
-        color: #fff;
-        display: flex;
-        justify-content: center;
-        align-items: center;
-}
-</style>

+ 23 - 1
src/views/myETA/ChooseChart.vue

@@ -3,6 +3,8 @@ import {reactive, ref} from 'vue'
 import apiChart from '@/api/chart'
 import apiFuture from '@/api/futureChart'
 import apiCorrelation from '@/api/correlationChart'
+import apiLineEquationChart from '@/api/lineEquationChart'
+import apiStatisticFeatureChart from '@/api/statisticFeatureChart'
 import {apiMyClassifyList,apiMyChartAdd,apiAddClassify} from '@/api/myETA'
 import { showToast } from 'vant';
 import { useWindowSize } from '@vueuse/core'
@@ -22,7 +24,16 @@ const typeOpt=[
     {
         name:"相关性图表",
         type:3,
+    },
+    {
+        name:"拟合方程曲线",
+        type:4,
+    },
+    {
+        name:"统计特征",
+        type:5,
     }
+
 ]
 let type=ref(1)
 const isShowMe=ref(false)
@@ -50,6 +61,10 @@ async function getChartList(){
         res=await apiFuture.searchChartList(params)
     }else if(type.value==3){
         res=await apiCorrelation.chartList(params)
+    }else if(type.value==4){
+        res=await apiLineEquationChart.chartList(params)
+    }else if(type.value==5){
+        res=await apiStatisticFeatureChart.chartList(params)
     }
     
     if(res.Ret==200){
@@ -215,7 +230,7 @@ async function handleConfirmEditClassify(){
                 />
                 <div>
                     <span class="time">{{item.ModifyTime.substr(0,10)}}</span>
-                    <img class="add-icon" src="@/assets/imgs/icon01.png" alt="" @click="handleAdd(item)">
+                    <img class="add-icon" src="@/assets/imgs/myETA/icon_add.png" alt="" @click="handleAdd(item)">
                     <div class="pad-add-box" @click="handleAdd(item)">
                         <img src="@/assets/imgs/myETA/icon_add.png" alt="">
                         <span>加入我的图库</span>
@@ -279,10 +294,17 @@ async function handleConfirmEditClassify(){
 .type-box{
     padding: 60px 40px 26px 40px;
     box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.08);
+    overflow-x: auto;
+    display: flex;
+    flex-wrap: nowrap;
+    &::-webkit-scrollbar{
+        display: none;
+    }
     .opt{
         display: inline-block;
         margin-right: 40px;
         color: $font-grey_999;
+        flex-shrink: 0;
         &.active{
             color: #333;
             position: relative;

+ 585 - 13
src/views/myETA/Index.vue

@@ -1,30 +1,602 @@
 <script setup name="MyETAIndex">
-import MobileClassifyWrap from './components/MobileClassifyWrap.vue'
-import PadClasssifyWrap from './components/PadClasssifyWrap.vue'
+import {ref,reactive,computed} from 'vue'
+import { useRouter } from 'vue-router'
+import {useClassify} from './hooks/useClassify'
+import apiMyETA  from '@/api/myETA'
+import { showConfirmDialog, showToast } from 'vant';
+import { useWindowSize } from '@vueuse/core'
+import draggable from 'vuedraggable'
+import {useCachedViewsStore} from '@/store/modules/cachedViews'
+
+const cachedViewsStore=useCachedViewsStore()
+const { width, height } = useWindowSize()
+
+const router=useRouter()
+
+const {
+    classifyTypeOpt,
+    classifyState,
+    getMyClassify,
+    getPubClassify,
+    classifyTypeChange,
+    handleAddClassify,
+    handleConfirmEditClassify,
+
+    handleShowOpt,
+    handleClassifyShare,
+    handleCopyClassify,
+    handleClassifyDel,
+    handleAddClassifyBeforeClose
+}=useClassify()
+
+const curChartClassifyList=computed(()=>{
+    return classifyState.classifyTypeAct==1?classifyState.myClassifyList:classifyState.pubClassifyList
+})
+// 拖动排序结束
+function onClassifySortEnd(e){
+    console.log(e);
+    const index=e.item.__draggable_context.index
+    const aitem=e.item.__draggable_context.element
+    const params={
+        MyChartClassifyId:aitem.MyChartClassifyId,
+        NextClassifyId:curChartClassifyList.value[index+1]?.MyChartClassifyId||0,
+        PrevClassifyId:curChartClassifyList.value[index-1]?.MyChartClassifyId||0,
+    }
+    console.log(params);
+    apiMyETA.myETAClassifySort(params).then(res=>{
+
+    })
+}
+
+const showClassifyPop=ref(false)
+
+async function initPage(){
+    getPubClassify()
+    await getMyClassify()
+    listState.cid=classifyState.myClassifyList[0]?.MyChartClassifyId
+    listState.cname=classifyState.myClassifyList[0]?.MyChartClassifyName
+    listState.ctype='我的图库'
+    if(!listState.cid){
+        listState.finished=true
+        return
+    }
+    getChartList()
+}
+initPage()
+
+
+const listState = reactive({
+    ctype:'我的图库',
+    cname:'',
+    cid:0,
+    list:[],
+    page:1,
+    pageSize:20,
+    finished:false,
+    loading:false,
+    total:0,
+})
+async function getChartList(){
+    const res=await apiMyETA.myChartList({
+        CurrentIndex:listState.page,
+        PageSize:listState.pageSize,
+        MyChartClassifyId:listState.cid
+    })
+    if(res.Ret===200){
+        listState.loading=false
+        if(!res.Data){
+            listState.finished=true
+            listState.total=0
+            return
+        }
+        
+        listState.finished=res.Data.Paging.IsEnd
+        const arr=res.Data.List||[]
+        listState.list=[...listState.list,...arr]
+        listState.total=res.Data.Paging.Totals
+    }
+}
+function onLoad(){
+    listState.page++
+    getChartList()
+}
+
+// 切换分类
+function handleSwitchClassify(item){
+    listState.ctype=classifyState.classifyTypeAct==1?'我的图库':'公共图库'
+    listState.cid=item.MyChartClassifyId
+    listState.cname=item.MyChartClassifyName
+    listState.list=[]
+    listState.page=1
+    listState.finished=false
+    listState.total=0
+    getChartList()
+    showClassifyPop.value=false
+}
+
+//跳转选择图表
+function goChooseChart(){
+    router.push({
+        path:'/myETA/choosechart'
+    })
+}
+
+//移除图表
+function handleRemoveChart(item,index){
+    showConfirmDialog({
+        title: '提示',
+        message:'是否确认移出?',
+    }).then(()=>{
+        apiMyETA.myChartRemove({
+            MyChartClassifyId:Number(listState.cid),
+            MyChartId:item.MyChartId
+        }).then(res=>{
+            if(res.Ret===200){
+                setTimeout(() => {
+                    showToast('移出成功')
+                }, 100);
+                listState.list.splice(index,1)
+            }
+        })
+    }).catch(()=>{})
+}
+
+// 跳转详情
+function goDetail(item){
+    router.push({
+        path:"/myETA/chartdetail",
+        query:{
+            code:item.UniqueCode,
+            cid:listState.cid,
+            iscommon:listState.ctype=='我的图库'?false:true
+        }
+    })
+}
+
+async function goSearch(){
+    // 删除报告搜索页的缓存
+    await cachedViewsStore.removeCaches('MyETASearchList')
+    router.push('/myETA/searchlist')
+}
+
 
 </script>
 
 <template>
     <div class="myETA-index-page">
-        <div class="myETA-index-page_mobile">
-            <MobileClassifyWrap />
-        </div>
-        <div class="myETA-index-page_pad">
-            <PadClasssifyWrap/>
+        <div class="top-sticky-wrap">
+            <div class="search-wrap">
+                <van-search 
+                    shape="round" 
+                    readonly 
+                    placeholder="请输入图表名称"
+                    @click="goSearch"
+                />
+                <img @click="goChooseChart" class="icon" src="@/assets/imgs/myETA/icon_select.png" alt="icon">
+                <img @click="showClassifyPop=true" class="icon" src="@/assets/imgs/myETA/icon_menu2.png" alt="icon">
+            </div>
+            <p style="margin-top:10px;font-weight:bold">{{listState.ctype}}{{listState.cname?'/'+listState.cname:''}}</p>
+            <p class="des">共{{listState.total}}张图表</p>
         </div>
+        <van-list
+            v-model:loading="listState.loading"
+            :finished="listState.finished"
+            :finished-text="listState.list.length>0?'没有更多了':'暂无图表'"
+            :immediate-check="false"
+            @load="onLoad"
+        >
+            <img v-if="listState.list.length==0&&listState.finished" class="list-empty-img" src="https://hzstatic.hzinsights.com/static/ETA_mobile/empty_img.png" alt="">
+            <ul class="chart-list-wrap">
+                <li 
+                    class="chart-list-item" 
+                     v-for="item,index in listState.list" 
+                    :key="item.ChartInfoId"
+                    @click="goDetail(item)"
+                >
+                    <div class="van-multi-ellipsis--l2 name">{{item.ChartName}}</div>
+                    <img class="img" :src="item.ChartImage" alt="">   
+                    <div class="time">
+                        <span>{{item.CreateTime.slice(0,10)}}</span>
+                        <img v-if="listState.ctype==='我的图库'" class="remove-box" @click.stop="handleRemoveChart(item,index)" src="@/assets/imgs/myETA/icon_remove2.png" alt="">
+                    </div>
+                </li>
+            </ul>
+        </van-list>
     </div>
+
+    <!-- 分类 -->
+    <van-popup 
+        v-model:show="showClassifyPop"
+        position="right"
+        :style="{ height: '100%',width:width>650?'400px':'80%' }"
+    >
+        <div class="classify-wrap">
+            <div class="type-box">
+                <span
+                    :class="['item',item.type===classifyState.classifyTypeAct?'active':'']"
+                    v-for="item in classifyTypeOpt" 
+                    :key="item.id"
+                    @click="classifyTypeChange(item)"
+                >{{item.name}}</span>
+            </div>
+            <draggable 
+                class="list-box"
+                :list="curChartClassifyList" 
+                item-key="MyChartClassifyId"
+                animation="300"
+                @end="onClassifySortEnd"
+                :disabled="classifyState.classifyTypeAct!=1"
+                tag="ul"
+            >
+                <template #item="{element}">
+                    <li 
+                        class="item"
+                        @click="handleSwitchClassify(element)"
+                    >
+                        <div :class="['van-ellipsis name',element.MyChartClassifyId===listState.cid&&'active-name']">{{element.MyChartClassifyName}}</div>
+                        <div class="icon-drag-box" v-if="classifyState.classifyTypeAct==1">
+                            <img src="@/assets/imgs/icon_drag.png" alt="">
+                        </div>
+                        <div class="icon-menu-box" @click.stop="handleShowOpt(element)">
+                            <img src="@/assets/imgs/myETA/icon_opt.png" alt="">
+                        </div>
+                    </li>
+                </template>
+            </draggable>
+            <div class="bot-btns">
+                <van-button type="primary" block @click="handleAddClassify('')">添加我的分类</van-button>
+            </div>
+        </div>
+    </van-popup>
+
+    <!-- 添加我的分类弹窗 -->
+    <van-dialog 
+        v-model:show="classifyState.showEidtClassifyName" 
+        :title="classifyState.isAddClassifyName?'添加分类':'重命名'" 
+        show-cancel-button
+        confirmButtonText="确定"
+        @confirm="handleConfirmEditClassify"
+        :before-close="handleAddClassifyBeforeClose"
+    >
+        <div class="rename-wrap">
+            <input type="text" placeholder="请输入分类名称!" v-model="classifyState.classifyNameVal">
+        </div>
+    </van-dialog>
+
+    <!-- 分类操作弹窗 -->
+    <van-popup 
+        v-model:show="classifyState.showClassifyOpt" 
+        round
+        position="bottom"
+    >
+        <div class="classify-opt-wrap">
+            <!-- <div class="item border">
+                <img src="@/assets/imgs/ppt/ppt_icon_file.png" alt="">
+                <span>{{classifyState.activeClassifyVal.MyChartClassifyName}}</span>
+            </div> -->
+            <!-- 我的图库分类操作 -->
+            <template v-if="classifyState.classifyTypeAct==1">
+            <div class="item border" @click="handleAddClassify(classifyState.activeClassifyVal)">
+                <!-- <img src="@/assets/imgs/ppt/ppt_icon_write.png" alt=""> -->
+                <span>重命名</span>
+            </div>
+            <div class="item border">
+                <!-- <img src="@/assets/imgs/icon_user.png" alt=""> -->
+                <span style="display:inline-block;margin-right:10px">所有人可见</span>
+                <van-switch
+                    class="switch-box"
+                    size="22px" 
+                    :model-value="classifyState.activeClassifyVal.IsPublic?true:false"
+                    @update:model-value="handleClassifyShare"
+                />
+            </div>
+            <div class="item border red" @click="handleClassifyDel(classifyState.activeClassifyVal)">
+                <!-- <img src="@/assets/imgs/icon_del.png" alt=""> -->
+                <span>删除</span>
+            </div>
+            </template>
+            <!-- 公共图库分类操作 -->
+            <template v-if="classifyState.classifyTypeAct==2">
+            <div class="item border" @click="handleCopyClassify(classifyState.activeClassifyVal)">
+                <!-- <img src="@/assets/imgs/ppt/ppt_icon_copy.png" alt=""> -->
+                <span>复制</span>
+            </div>
+            </template>
+        </div>
+    </van-popup>
 </template>
 
 <style lang="scss" scoped>
-.myETA-index-page_pad{
-    display: none;
+.myETA-index-page{
+    padding: 0 $page-padding;
+}
+.top-sticky-wrap{
+    position: sticky;
+    top: 0;
+    z-index: 99;
+    background-color: #fff;
+    padding-bottom: 20px;
+    padding-top: 30px;
+    .search-wrap{
+        display: flex;
+        align-items: center;
+        .van-search{
+            padding: 0;
+            flex: 1;
+        }
+        .icon{
+            width: 70px;
+            height: 70px;
+            margin-left: 30px;
+        }
+    }
+    .des{
+        margin-top: 30px;
+        color: $font-grey;
+    }
+}
+
+.chart-list-wrap{
+    display: flex;
+    flex-wrap: wrap;
+    box-sizing: border-box;
+    justify-content: space-between;
+    gap: 30px 0;
+    .chart-list-item{
+        box-sizing: border-box;
+        width: 330px;
+        padding: 10px 14px;
+        border: 1px solid $border-color;
+        border-radius: 12px;
+        .name{
+            min-height: 70px;
+        }
+        .img{
+            width: 100%;
+            height: 220px;
+            display: block;
+            margin: 10px 0;
+        }
+        .time{
+            font-size: 28px;
+            color: $font-grey_999;
+            position: relative;
+            .remove-box{
+                position: absolute;
+                top: 0;
+                right: 0;
+                width: 32px;
+                height: 32px;
+            }       
+        }
+    }
+}
+
+.classify-wrap{
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+    .type-box{
+        padding: $page-padding;
+        box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.08);
+        .item{
+            margin-right: 40px;
+            font-size: 32px;
+            color: $font-grey_999;
+        }
+        .active{
+            font-weight: 600;
+            color: #333;
+            position: relative;
+            &::after{
+                content: '';
+                position: absolute;
+                bottom: -$page-padding;
+                left: 50%;
+                transform: translateX(-50%);
+                display: block;
+                width: 50px;
+                height: 6px;
+                background-color: $theme-color;
+                border-radius: 3px;
+            }
+        }
+    }
+    .list-box{
+        flex: 1;
+        overflow-y: auto;
+        padding: $page-padding;
+        .item{
+            padding: 23px 0;
+            display: flex;
+            align-items: center;
+            .name{
+                flex: 1;
+            }
+            .active-name{
+                color: $theme-color;
+            }
+            .icon-drag-box{
+                width: 48px;
+                height: 48px;
+                img{
+                    width: 100%;
+                    height: 100%;
+                }
+            }
+            .icon-menu-box{
+                margin-left: 20px;
+                width: 48px;
+                height: 48px;
+                img{
+                    width: 100%;
+                    height: 100%;
+                }
+            }
+        }
+    }
+    .bot-btns{
+        padding: $page-padding;
+    }
+}
+
+.rename-wrap{
+    display: flex;
+    align-items: center;
+    padding: 50px 30px;
+    span{
+        flex-shrink: 0;
+        margin-right: 20px;
+    }
+    input{
+        flex: 1;
+        line-height: 70px;
+        padding: 0 30px;
+        border-radius: 70px;
+        border: 1px solid $border-color;
+        width: 150px;
+    }
+}
+
+.classify-opt-wrap{
+    .item{
+        padding: 42px;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        position: relative;
+        img{
+            width: 36px;
+            height: 36px;
+            margin-right: 20px;
+        }
+        // .switch-box{
+        //     position: absolute;
+        //     right: 42px;
+        //     top: 50%;
+        //     transform: translateY(-50%);
+        // }
+    }
+    .border{
+        border-bottom: 1px solid $border-color;
+    }
+    .blue{
+        color: $theme-color;
+    }
+    .red{
+        color: $theme-red;
+    }
 }
+
+
+
 @media screen and (min-width:$media-width){
-    .myETA-index-page_mobile{
-        display: none;
+    .myETA-index-page{
+        padding: 0 $page-padding;
+    }
+    .top-sticky-wrap{
+        top: 60px;
+        padding-bottom: 10px;
+        padding-top: 15px;
+        .search-wrap{
+            .icon{
+                width: 35px;
+                height: 35px;
+                margin-left: 15px;
+            }
+        }
+        .des{
+            margin-top: 15px;
+        }
+    }
+    .chart-list-wrap{
+        gap: 20px 4%;
+        justify-content: flex-start;
+        .chart-list-item{
+            width: 22%;
+            padding: 10px 14px;
+            border-radius: 6px;
+            .name{
+                min-height: 35px;
+            }
+            .img{
+                width: 100%;
+                height: auto;
+                display: block;
+                margin: 10px 0;
+            }
+            .time{
+                font-size: 14px;
+                .remove-box{
+                    width: 16px;
+                    height: 16px;
+                }
+            }
+        }
     }
-    .myETA-index-page_pad{
-        display: block;
+    .classify-wrap{
+        .type-box{
+            padding: $page-padding;
+            box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.08);
+            .item{
+                margin-right: 20px;
+                font-size: 16px;
+            }
+            .active{
+                &::after{
+                    bottom: -$page-padding;
+                    width: 25px;
+                    height: 3px;
+                    border-radius: 2px;
+                }
+            }
+        }
+        .list-box{
+            padding: $page-padding;
+            .item{
+                padding: 12px 0;
+                .icon-drag-box{
+                    width: 24px;
+                    height: 24px;
+                }
+                .icon-menu-box{
+                    margin-left: 10px;
+                    width: 24px;
+                    height: 24px;
+                }
+            }
+        }
+        .bot-btns{
+            padding: $page-padding;
+        }
+    }
+
+    .rename-wrap{
+        padding: 25px 15px;
+        span{
+            margin-right: 10px;
+        }
+        input{
+            line-height: 35px;
+            padding: 0 15px;
+            border-radius: 35px;
+            width: 75px;
+        }
+    }
+
+    .classify-opt-wrap{
+        .item{
+            padding: 21px;
+            img{
+                width: 18px;
+                height: 18px;
+                margin-right: 10px;
+            }
+            // .switch-box{
+                // right: 21px;
+            // }
+            
+        }
     }
 }
 </style>

+ 45 - 24
src/views/myETA/SearchList.vue

@@ -1,4 +1,4 @@
-<script setup>
+<script setup name="MyETASearchList">
 import {ref,reactive} from 'vue'
 import {apiMyETAChartSearch} from '@/api/myETA'
 import { showToast } from 'vant'
@@ -50,15 +50,13 @@ function handleSearch(){
 }
 
 function goDetail(item){
-
-    const routerEl=router.resolve({
+    router.push({
         path:"/myETA/chartdetail",
         query:{
             code:item.UniqueCode,
             iscommon:true
         }
     })
-    window.open(routerEl.href,'_blank')
 }
 
 </script>
@@ -83,10 +81,10 @@ function goDetail(item){
         >
             <ul class="list-wrap">
                 <li class="item" v-for="item in listState.list" :key="item.ChartInfoId" @click="goDetail(item)">
-                    <div class="van-ellipsis name">{{item.ChartName}}</div>
+                    <div class="van-multi-ellipsis--l2 name">{{item.ChartName}}</div>
+                    <img class="img" :src="item.ChartImage" alt="">   
                     <div class="time">
-                        <span>创建人:{{item.SysUserRealName}}</span>
-                        <span>创建时间:{{moment(item.CreateTime).format('YYYY-MM-DD')}}</span>
+                        <span>{{item.CreateTime.slice(0,10)}}</span>
                     </div>
                 </li>
             </ul>
@@ -95,41 +93,64 @@ function goDetail(item){
 </template>
 
 <style lang="scss" scoped>
+.search-box{
+    position: sticky;
+    top: 0;
+    background-color: #fff;
+    z-index: 99;
+}
 .list-wrap{
     padding: $page-padding;
+    display: flex;
+    flex-wrap: wrap;
+    box-sizing: border-box;
+    justify-content: space-between;
     .item{
-        padding: 30px 0;
-        border-bottom: 1px solid $border-color;
+        box-sizing: border-box;
+        width: 326px;
+        padding: 10px 14px;
+        border: 1px solid $border-color;
+        margin-bottom: 20px;
+        border-radius: 12px;
         .name{
-            margin-bottom: 20px;
+            min-height: 70px;
+        }
+        .img{
+            width: 100%;
+            height: 220px;
+            display: block;
+            margin: 10px 0;
         }
         .time{
-            display: flex;
-            justify-content: space-between;
-            color: $font-grey_999;
             font-size: 28px;
+            color: $font-grey_999;
+            position: relative;     
         }
     }
 }
 @media screen and (min-width:$media-width){
-    .chart-search-list-page{
-        max-width: 820px;
-        margin: 0 auto;
-        padding-top: 10px;
+    .search-box{
+        top: 60px;
     }
     .list-wrap{
-        padding: 10px 30px;
+        padding: var(--van-search-padding);
+        justify-content: flex-start;
         .item{
-            padding: 10px 0;
+            width: 326px;
+            padding: 5px 7px;
+            margin-bottom: 10px;
+            border-radius: 6px;
+            margin-left: 5px;
+            margin-right: 5px;
             .name{
-                margin-bottom: 10px;
+                min-height: 35px;
+            }
+            .img{
+                height: 220px;
+                margin: 5px 0;
             }
             .time{
                 font-size: 14px;
-                justify-content: flex-start;
-                span{
-                    margin-right: 20px;
-                }
             }
         }
         

+ 16 - 6
src/views/myETA/components/ChartSaveOther.vue

@@ -3,6 +3,8 @@ import {watch,ref} from 'vue'
 import apiETAChart from '@/api/chart'
 import apiCorrelation from '@/api/correlationChart'
 import apiFuture from '@/api/futureChart'
+import apiLineEquationChart from '@/api/lineEquationChart'
+import apiStatisticFeatureChart from '@/api/statisticFeatureChart'
 import { showToast } from 'vant'
 import { useWindowSize } from '@vueuse/core'
 
@@ -43,16 +45,20 @@ watch(showPop,()=>{
 let opts=ref([])
 async function getOpts(){
     let res
-    if(props.source==2){
+    if([2,5].includes(props.source)){
         res=await apiFuture.chartClassifyList({})
-    }else if(props.source==3){
+    }else if([3,4].includes(props.source)){
         res=await apiCorrelation.chartClassifyList({})
+    }else if(props.source==6){
+        res=await apiLineEquationChart.chartClassifyList({})
+    }else if([7,8,9].includes(props.source)){
+        res=await apiStatisticFeatureChart.chartClassifyList({})
     }else{
         res=await apiETAChart.ETAChartClassifyList({})
     }
     if(res.Ret!=200) return
     const arr=res.Data.AllNodes||[]
-    if([2,3].includes(props.source)){
+    if([2,5,3,6,7,8,9].includes(props.source)){
         opts.value=arr
     }else{
         opts.value=arr.map(item=>{
@@ -83,10 +89,14 @@ async function handleConfirmSave(){
         ChartClassifyId:activeIds.value
     }
     let res
-    if(props.source==2){
+    if([2,5].includes(props.source)){
         res=await apiFuture.chartSaveOther(params)
-    }else if(props.source==3){
+    }else if([3,4].includes(props.source)){
         res=await apiCorrelation.chartSaveOther(params)
+    }else if(props.source==6){
+        res=await apiLineEquationChart.chartSaveOther(params)
+    }else if([7,8,9].includes(props.source)){
+        res=await apiStatisticFeatureChart.chartSaveOther(params)
     }else{
         res=await apiETAChart.ETAChartSaveOther(params)
     }
@@ -110,7 +120,7 @@ async function handleConfirmSave(){
                 <div class="title">另存为</div>
             </div>
             <div class="content">
-                <template v-if="[2,3].includes(source)">
+                <template v-if="[2,3,5,6,7,8,9].includes(source)">
                     <ul class="list-box">
                         <li 
                             :class="['item',activeIds==item.ChartClassifyId?'active':'']"

+ 21 - 2
src/views/myETA/components/EDBInfo.vue

@@ -3,6 +3,8 @@ import {ref,onMounted,watch,computed} from 'vue'
 import { V3ColorPicker } from "v3-color-picker-teleport"
 import {sameOptionType} from '@/hooks/chart/config'
 import _ from 'lodash'
+// import apiChart from '@/api/chart'
+import SourceDetail from '@/views/chartETA/components/SourceDetail.vue'
 
 const leadUnitOpt=[{text:'年'}, {text:'季'}, {text:'月'}, {text:'周'}, {text:'天'}]//领先指标频度配置
 
@@ -88,8 +90,8 @@ const showYOptionsHandle=computed(()=>{
     if([3,4].includes(props.chartInfo.ChartType) && index !== 0) {
         isShowOptions = false
     } else if(props.chartInfo.ChartType ===6 
-        && ['areaspline','column'].includes(item.ChartStyle) 
-        && index !== props.tableData.findIndex(_ => _.ChartStyle === item.ChartStyle)) {
+        && ['areaspline','column'].includes(props.data.ChartStyle) 
+        && index !== props.tableData.findIndex(_ => _.ChartStyle === props.data.ChartStyle)) {
         isShowOptions = false
     }
 
@@ -123,6 +125,9 @@ function handleLeadUnitChange(e){
     temData.value.LeadUnit=e.text
 }
 
+// 显示数据来源历史
+const showSourceDetail=ref(false)
+
 </script>
 
 <template>
@@ -135,6 +140,7 @@ function handleLeadUnitChange(e){
                 <li class="item" v-for="item in list" :key="item.key">
                     <span class="lable">{{item.name}}</span>
                     <span class="text">{{data[item.key]}}</span>
+                    <van-icon name="arrow" v-if="item.key==='SourceName'&&data.EdbType===2" @click="showSourceDetail=true" />
                 </li>
             </ul>
             <div class="opt-box" v-if="sameOptionType.includes(chartInfo.ChartType) && chartInfo.ChartType!==5 && chartInfo.Source===1">
@@ -228,6 +234,19 @@ function handleLeadUnitChange(e){
         </div>
         <div class="confirm-btn" @click="handleConfirmChange" v-if="sameOptionType.includes(chartInfo.ChartType) && chartInfo.ChartType!==5">确定</div>
     </div>
+    <!--  数据来源弹窗-->
+    <van-popup
+        v-model:show="showSourceDetail"
+        position="center"
+        round
+        closeable
+        :style="{ width: '400px'}"
+    >
+        <SourceDetail
+            :show="showSourceDetail"
+            :EdbInfoId="data.EdbInfoId"
+        />
+    </van-popup> 
 </template>
 
 <style lang="scss" scoped>

+ 0 - 290
src/views/myETA/components/MobileClassifyWrap.vue

@@ -1,290 +0,0 @@
-<script setup>
-import { useRouter } from 'vue-router'
-import {useClassify} from '../hooks/useClassify'
-
-const router=useRouter()
-
-const {
-    classifyTypeOpt,
-    classifyState,
-    getMyClassify,
-    getPubClassify,
-    classifyTypeChange,
-    handleAddClassify,
-    handleConfirmEditClassify,
-
-    handleShowOpt,
-    handleClassifyShare,
-    handleCopyClassify,
-    handleClassifyDel,
-    handleAddClassifyBeforeClose
-}=useClassify()
-
-getMyClassify()
-getPubClassify()
-
-function goMobileSearch() {
-    router.push({
-        path:'/myETA/searchlist'
-    })
-}
-
-
-function goChartList(item){
-    router.push({
-        path:"/myETA/chartlist",
-        query:{
-            cid:item.MyChartClassifyId,
-            cname:item.MyChartClassifyName,
-            iscommon:classifyState.classifyTypeAct==1?false:true
-        }
-    })
-}
-
-function goChooseChart(){
-    router.push({
-        path:'/myETA/choosechart'
-    })
-}
-</script>
-
-<template>
-    <div class="myETA-mobile-classify-wrap">
-        <div class="sticky-top">
-        <div class="search-box">
-            <van-search 
-                shape="round" 
-                readonly 
-                placeholder="请输入图表名称" 
-                @click="goMobileSearch"
-            />
-        </div>
-        <div class="classify-type-box">
-            <span
-                :class="['item',item.type===classifyState.classifyTypeAct?'active':'']"
-                v-for="item in classifyTypeOpt" 
-                :key="item.id"
-                @click="classifyTypeChange(item)"
-            >{{item.name}}</span>
-        </div>
-        </div>
-        <ul class="list-box">
-            <li 
-                class="item"
-                v-for="item in classifyState.classifyTypeAct==1?classifyState.myClassifyList:classifyState.pubClassifyList"
-                :key="item.MyChartClassifyId"
-                @click="goChartList(item)"
-            >
-                <img class="left-icon" src="@/assets/imgs/ppt/ppt_icon_file.png" alt="">
-                <div style="flex:1">
-                    <div class="van-ellipsis name">{{item.MyChartClassifyName}}</div>
-                    <div class="share-user" v-if="classifyState.classifyTypeAct==2">分享人: {{item.RealName}}</div>
-                </div>
-                <img class="right-icon" src="@/assets/imgs/ppt/ppt_icon_menu.png" alt="" @click.stop="handleShowOpt(item)">
-            </li>
-        </ul>
-        <!-- 底部操作栏 -->
-        <div class="fix-bot-box">
-            <div class="item" @click="handleAddClassify('')">
-                <img class="icon" src="@/assets/imgs/icon_file.png" alt="">
-                <span>添加分类</span>
-            </div>
-            <div class="item" @click="goChooseChart">
-                <img class="icon" src="@/assets/imgs/icon_select.png" alt="">
-                <span>选择图表</span>
-            </div>
-        </div>
-    </div>
-    <!-- 添加我的分类弹窗 -->
-    <van-dialog 
-        v-model:show="classifyState.showEidtClassifyName" 
-        :title="classifyState.isAddClassifyName?'添加分类':'重命名'" 
-        show-cancel-button
-        confirmButtonText="确定"
-        @confirm="handleConfirmEditClassify"
-        :before-close="handleAddClassifyBeforeClose"
-    >
-        <div class="rename-wrap">
-            <input type="text" placeholder="请输入分类名称!" v-model="classifyState.classifyNameVal">
-        </div>
-    </van-dialog>
-
-    <!-- 分类操作弹窗 -->
-    <van-popup 
-        v-model:show="classifyState.showClassifyOpt" 
-        round
-        position="bottom"
-    >
-        <div class="classify-opt-wrap">
-            <div class="item border">
-                <img src="@/assets/imgs/ppt/ppt_icon_file.png" alt="">
-                <span>{{classifyState.activeClassifyVal.MyChartClassifyName}}</span>
-            </div>
-            <!-- 我的图库分类操作 -->
-            <template v-if="classifyState.classifyTypeAct==1">
-            <div class="item border blue" @click="handleAddClassify(classifyState.activeClassifyVal)">
-                <img src="@/assets/imgs/ppt/ppt_icon_write.png" alt="">
-                <span>重命名</span>
-            </div>
-            <div class="item border blue">
-                <img src="@/assets/imgs/icon_user.png" alt="">
-                <span>所有人可见</span>
-                <van-switch
-                    class="switch-box"
-                    size="22px" 
-                    :model-value="classifyState.activeClassifyVal.IsPublic?true:false"
-                    @update:model-value="handleClassifyShare"
-                />
-            </div>
-            <div class="item border red" @click="handleClassifyDel(classifyState.activeClassifyVal)">
-                <img src="@/assets/imgs/icon_del.png" alt="">
-                <span>删除</span>
-            </div>
-            </template>
-            <!-- 公共图库分类操作 -->
-            <template v-if="classifyState.classifyTypeAct==2">
-            <div class="item border blue" @click="handleCopyClassify(classifyState.activeClassifyVal)">
-                <img src="@/assets/imgs/ppt/ppt_icon_copy.png" alt="">
-                <span>复制</span>
-            </div>
-            </template>
-        </div>
-
-    </van-popup>
-</template>
-
-<style lang="scss" scoped>
-.sticky-top{
-    position: sticky;
-    top: 0;
-    z-index: 99;
-    background-color: #fff;
-}
-.classify-type-box{
-    padding: $page-padding;
-    box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.08);
-    .item{
-        display: inline-block;
-        font-size: 32px;
-        color: $font-grey_999;
-        margin-right: 40px;
-        position: relative;
-    }
-    .active{
-        color: #333;
-        &::after{
-            content: '';
-            position: absolute;
-            bottom: -$page-padding;
-            left: 50%;
-            transform: translateX(-50%);
-            display: block;
-            width: 50px;
-            height: 6px;
-            background-color: $theme-color;
-            border-radius: 3px;
-        }
-    }
-}
-.list-box{
-    padding: $page-padding;
-    padding-bottom: 130px;
-    .item{
-        padding: 20px 0;
-        display: flex;
-        .left-icon{
-            width: 32px;
-            height: 32px;
-            margin-right: 20px;
-            flex-shrink: 0;
-        }
-        .right-icon{
-            flex-shrink: 0;
-            width: 4px;
-            height: 20px;
-            margin-left: 20px;
-        }
-        .name{
-            flex: 1;
-        }
-        .share-user{
-            color: $font-grey_999;
-            margin-top: 15px;
-        }
-    }
-}
-.fix-bot-box{
-    position: fixed;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    height: 120px;
-    background-color: #fff;
-    display: flex;
-    justify-content: space-around;
-    align-items: center;
-    z-index: 99;
-    .item{
-        width: 304px;
-        height: 80px;
-        display: flex;
-        align-items: center;
-        justify-content: center;
-        color: #fff;
-        font-size: 32px;
-        box-shadow: 0px 3px 14px 2px rgba(0, 0, 0, 0.05), 0px 8px 10px 1px rgba(0, 0, 0, 0.06), 0px 5px 5px -3px rgba(0, 0, 0, 0.1);
-        border-radius: 12px;
-        background-color: $theme-color;
-        .icon{
-            width: 40px;
-            height: 40px;
-            margin-right: 10px;
-        }
-    }
-}
-.rename-wrap{
-    display: flex;
-    align-items: center;
-    padding: 50px 30px;
-    span{
-        flex-shrink: 0;
-        margin-right: 20px;
-    }
-    input{
-        flex: 1;
-        line-height: 70px;
-        padding: 0 30px;
-        border-radius: 70px;
-        border: 1px solid $border-color;
-        width: 150px;
-    }
-}
-.classify-opt-wrap{
-    .item{
-        padding: 42px;
-        display: flex;
-        align-items: center;
-        position: relative;
-        img{
-            width: 36px;
-            height: 36px;
-            margin-right: 20px;
-        }
-        .switch-box{
-            position: absolute;
-            right: 42px;
-            top: 50%;
-            transform: translateY(-50%);
-        }
-    }
-    .border{
-        border-bottom: 1px solid $border-color;
-    }
-    .blue{
-        color: $theme-color;
-    }
-    .red{
-        color: $theme-red;
-    }
-}
-</style>

+ 0 - 451
src/views/myETA/components/PadClasssifyWrap.vue

@@ -1,451 +0,0 @@
-<script setup>
-import {ref,reactive} from 'vue'
-import { useRouter } from 'vue-router'
-import {useClassify} from '../hooks/useClassify'
-import openShareIcon from '@/assets/imgs/ppt/ppt_icon_user1.png'
-import closeShareIcon from '@/assets/imgs/ppt/ppt_icon_user2.png'
-import {apiMyChartList,apiMyChartRemove} from '@/api/myETA'
-import { showConfirmDialog, showToast } from 'vant';
-
-const router=useRouter()
-
-const {
-    classifyTypeOpt,
-    classifyState,
-    getMyClassify,
-    getPubClassify,
-    classifyTypeChange,
-    handleAddClassify,
-    handleConfirmEditClassify,
-
-    handleShowOpt,
-    handleClassifyShare,
-    handleCopyClassify,
-    handleClassifyDel,
-    handleAddClassifyBeforeClose
-}=useClassify()
-
-
-async function initPage(){
-    getPubClassify()
-    await getMyClassify()
-    listState.cid=classifyState.myClassifyList[0]?.MyChartClassifyId
-    if(!listState.cid){
-        listState.finished=true
-        return
-    }
-    getList()
-}
-initPage()
-
-const activeType=ref('my')//my 我的 pub公共的
-
-// 设置共享
-function handleChangeShareStatus(type,item){
-    if(type==1&&!item.IsPublic) return
-    if(type==2&&item.IsPublic) return
-    handleClassifyShare()
-}
-
-function goMobileSearch() {
-
-    router.push({
-        path:'/myETA/searchlist'
-    })
-}
-
-const listState = reactive({
-    cid:0,
-    list:[],
-    page:1,
-    pageSize:20,
-    finished:false,
-    loading:false,
-    total:0,
-})
-async function getList(){
-    const res=await apiMyChartList({
-        CurrentIndex:listState.page,
-        PageSize:listState.pageSize,
-        MyChartClassifyId:listState.cid
-    })
-    if(res.Ret===200){
-        listState.loading=false
-        if(!res.Data){
-            listState.finished=true
-            listState.total=0
-            return
-        }
-        
-        listState.finished=res.Data.Paging.IsEnd
-        const arr=res.Data.List||[]
-        listState.list=[...listState.list,...arr]
-        listState.total=res.Data.Paging.Totals
-    }
-}
-function onLoad(){
-    listState.page++
-    getList()
-}
-
-// 点击分类获取列表
-function goChartList(item){
-    listState.cid=item.MyChartClassifyId
-    listState.page=1
-    listState.list=[]
-    listState.finished=false
-    getList()
-}
-
-//移除图表
-function handleRemoveChart(item,index){
-    showConfirmDialog({
-        title: '提示',
-        message:'是否确认移出?',
-    }).then(()=>{
-        apiMyChartRemove({
-            MyChartClassifyId:Number(listState.cid),
-            MyChartId:item.MyChartId
-        }).then(res=>{
-            if(res.Ret===200){
-                setTimeout(() => {
-                    showToast('移出成功')
-                }, 100);
-                listState.list.splice(index,1)
-            }
-        })
-    }).catch(()=>{})
-}
-
-// 跳转详情
-function goDetail(item){
-    router.push({
-        path:"/myETA/chartdetail",
-        query:{
-            code:item.UniqueCode,
-            cid:listState.cid,
-            iscommon:classifyState.classifyTypeAct==1?false:true
-        }
-    })
-}
-
-function goChooseChart(){
-    router.push({
-        path:'/myETA/choosechart'
-    })
-}
-
-</script>
-
-<template>
-    <div class="pad-myETA-classify-wrap">
-        <div class="left-classify-wrap">
-            <div class="sticky-box">
-                <div class="classify-type-box">
-                    <span
-                        :class="['item',item.type===classifyState.classifyTypeAct?'active':'']"
-                        v-for="item in classifyTypeOpt" 
-                        :key="item.id"
-                        @click="classifyTypeChange(item)"
-                    >{{item.name}}</span>
-                </div>
-                <ul class="list-box">
-                    <li 
-                        class="item"
-                        v-for="item in classifyState.classifyTypeAct==1?classifyState.myClassifyList:classifyState.pubClassifyList"
-                        :key="item.MyChartClassifyId"
-                        @click="goChartList(item)"
-                    >
-                        <img class="left-icon" src="@/assets/imgs/ppt/ppt_icon_file.png" alt="">
-                        <div style="flex:1">
-                            <div class="van-ellipsis name">{{item.MyChartClassifyName}}</div>
-                            <div class="share-user" v-if="classifyState.classifyTypeAct==2">分享人: {{item.RealName}}</div>
-                        </div>
-                        <div @click.stop="handleShowOpt(item)" v-if="classifyState.classifyTypeAct!=2">
-                            <van-popover position="bottom-start">
-                                <template #reference>
-                                    <img 
-                                        class="share-icon" 
-                                        :src="item.IsPublic?openShareIcon:closeShareIcon" alt=""
-                                    >
-                                </template>
-                                <div class="pad-classify-file-opt-box">
-                                    <div class="item" @click="handleChangeShareStatus(1,item)">
-                                        <img :src="closeShareIcon" alt="">
-                                        <span>仅自己可见</span>
-                                    </div>
-                                    <div class="item" @click="handleChangeShareStatus(2,item)">
-                                        <img :src="openShareIcon" alt="">
-                                        <span>所有人可见</span>
-                                    </div>
-                                </div>
-                            </van-popover>
-                        </div>
-                        <div @click.stop="handleShowOpt(item)">
-                            <van-popover position="bottom-start">
-                                <template #reference>
-                                    <div class="menu-icon">
-                                        <img class="icon" src="@/assets/imgs/ppt/ppt_icon_menu.png" alt="">
-                                    </div>
-                                </template>
-                                <div class="pad-classify-file-opt-box">
-                                    <div class="item" v-if="classifyState.classifyTypeAct!=2" @click="handleAddClassify(item)">
-                                        <img src="@/assets/imgs/ppt/icon_action_copy.png" alt="">
-                                        <span>重命名</span>
-                                    </div>
-                                    <div class="item del" v-if="classifyState.classifyTypeAct!=2" @click="handleClassifyDel(item)">
-                                        <img src="@/assets/imgs/icon_del.png" alt="">
-                                        <span>删除</span>
-                                    </div>
-                                    <div class="item" v-if="classifyState.classifyTypeAct==2" @click="handleCopyClassify(classifyState.activeClassifyVal)">
-                                        <img src="@/assets/imgs/ppt/ppt_icon_copy.png" alt="">
-                                        <span>复制</span>
-                                    </div>
-                                </div>
-                            </van-popover>
-                        </div>
-                    </li>
-                </ul>
-            </div>
-        </div>
-        <div class="right-list-wrap">
-            <div class="top-search-box">
-                <van-search 
-                    shape="round" 
-                    readonly 
-                    placeholder="请输入图表名称"
-                    style="flex:1"
-                    @click-input="goMobileSearch"
-                />
-                <div class="btn" @click="goChooseChart">选择图表</div>
-                <div class="btn" @click="handleAddClassify('')">添加分类</div>
-                <div class="list-total">共{{listState.total}}张图表</div>
-                <div 
-                    v-if="classifyState.classifyTypeAct!=1"
-                    class="list-share-people"
-                >分享人: {{ classifyState.pubClassifyList.find(item => item.MyChartClassifyId === listState.cid)?.RealName}}</div>
-            </div>
-            <van-list
-                v-model:loading="listState.loading"
-                :finished="listState.finished"
-                :finished-text="listState.list.length>0?'没有更多了':'暂无图表'"
-                :immediate-check="false"
-                @load="onLoad"
-            >
-                <img v-if="listState.list.length==0&&listState.finished" class="list-empty-img" src="https://hzstatic.hzinsights.com/static/ETA_mobile/empty_img.png" alt="">
-                <ul class="chart-list">
-                    <li 
-                        class="chart-list-item" 
-                        v-for="item,index in listState.list" 
-                        :key="item.ChartInfoId"
-                        @click="goDetail(item)"
-                    >
-                        <div class="van-ellipsis name">{{item.ChartName}}</div>
-                        <img class="img" :src="item.ChartImage" alt="">   
-                        <div class="time">
-                            <span>{{item.CreateTime.slice(0,10)}}</span>
-                            <div class="remove-box" @click.stop="handleRemoveChart(item,index)" v-if="classifyState.classifyTypeAct==1">
-                                <img src="@/assets/imgs/myETA/icon_remove2.png" alt="">
-                                <span>移出</span>
-                            </div>
-                        </div>
-                    </li>
-                </ul>
-            </van-list>
-        </div>
-    </div>
-
-    <!-- 添加我的分类弹窗 -->
-    <van-dialog 
-        v-model:show="classifyState.showEidtClassifyName" 
-        :title="classifyState.isAddClassifyName?'添加分类':'重命名'" 
-        show-cancel-button
-        confirmButtonText="确定"
-        @confirm="handleConfirmEditClassify"
-        :before-close="handleAddClassifyBeforeClose"
-    >
-        <div class="rename-wrap">
-            <input type="text" placeholder="请输入分类名称!" v-model="classifyState.classifyNameVal">
-        </div>
-    </van-dialog>
-</template>
-
-<style lang="scss">
-@media screen and (min-width:$media-width){
-    .pad-classify-file-opt-box{
-        border: 1px solid $border-color;
-        padding: 10px 0;
-        .item{
-            padding: 10px 20px;
-            display: flex;
-            align-items: center;
-            img{
-                width: 20px;
-                margin-right: 8px;
-            }
-        }
-        .del{
-            color: $theme-red;
-        }
-    }
-            
-}
-</style>
-
-<style lang="scss" scoped>
-@media screen and (min-width:$media-width){
-    .pad-myETA-classify-wrap{
-        display: flex;
-        .left-classify-wrap{
-            width: 300px;
-            min-height: 100vh;
-            border-right: 1px solid $border-color;
-            padding: 30px;
-            .sticky-box{
-                position: sticky;
-                top: 90px;
-            }
-            .classify-type-box{
-                span{
-                    display: inline-block;
-                    padding-bottom: 5px;
-                    margin-right: 30px;
-                    color: $font-grey_999;
-                }
-                .active{
-                    color: $theme-color;
-                    font-weight: bold;
-                    border-bottom: 2px solid $theme-color;
-                }
-            }
-            .list-box{
-                padding-top: 30px;
-                height: 80vh;
-                overflow-y: auto;
-                &::-webkit-scrollbar{
-                    width: 0;
-                }
-                .item{
-                    padding: 10px 0;
-                    display: flex;
-                    position: relative;
-                    .left-icon{
-                        width: 20px;
-                        height: 20px;
-                        margin-right: 8px;
-                        flex-shrink: 0;
-                        position: relative;
-                        top: -2px;
-                    }
-                    .name{
-                        flex: 1;
-                    }
-                    .share-user{
-                        font-size: 12px;
-                        color: $font-grey_999;
-                        margin-top: 10px;
-                    }
-                    .menu-icon{
-                        margin-left: 20px;
-                        width: 15px;
-                        text-align: center;
-                        .icon{
-                            width: 3px;
-                        }
-                    }
-                    .share-icon{
-                        width: 16px;
-                        height: 16px;
-                    }
-                }
-            }
-        }
-        .right-list-wrap{
-            flex: 1;
-            .top-search-box{
-                display: flex;
-                align-items: center;
-                position: sticky;
-                top: 60px;
-                background-color: #fff;
-                padding: 30px;
-                .btn{
-                    width: 112px;
-                    height: 40px;
-                    background-color: $theme-color;
-                    color: #fff;
-                    text-align: center;
-                    line-height: 40px;
-                    border-radius: 3px;
-                    margin-left: 20px;
-                }
-                .list-total{
-                    position: absolute;
-                    bottom: 10px;
-                }
-                .list-share-people{
-                    position: absolute;
-                    right: 30px;
-                    bottom: 10px;
-                }
-            }
-            .chart-list{
-                padding: 0 30px;
-                display: flex;
-                flex-wrap: wrap;
-                box-sizing: border-box;
-                .chart-list-item{
-                    box-sizing: border-box;
-                    width: 250px;
-                    padding: 10px 14px;
-                    border: 1px solid $border-color;
-                    margin-bottom: 20px;
-                    margin-left: 10px;
-                    margin-right: 10px;
-                    .img{
-                        width: 100%;
-                        height: 150px;
-                        display: block;
-                        margin: 10px 0;
-                    }
-                    .time{
-                        font-size: 14px;
-                        color: $font-grey_999;
-                        position: relative;
-                        .remove-box{
-                            position: absolute;
-                            top: 0;
-                            right: 0;
-                            color: $theme-red;
-                            display: flex;
-                            align-items: center;
-                            img{
-                                width: 18px;
-                                height: 18px;
-                                margin-right: 5px;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-    .rename-wrap{
-        display: flex;
-        align-items: center;
-        padding: 50px 30px;
-        span{
-            flex-shrink: 0;
-            margin-right: 20px;
-        }
-        input{
-            flex: 1;
-            line-height: 35px;
-            padding: 0 30px;
-            border-radius: 35px;
-            border: 1px solid $border-color;
-            width: 150px;
-        }
-    }
-}
-</style>