浏览代码

Merge branch 'yb11.1'

jwyu 2 年之前
父节点
当前提交
228bfd0c0d
共有 6 个文件被更改,包括 502 次插入4 次删除
  1. 2 2
      src/api/common.js
  2. 19 0
      src/api/report.js
  3. 11 0
      src/router/index.js
  4. 10 2
      src/views/report/Classify.vue
  5. 2 0
      src/views/report/List.vue
  6. 458 0
      src/views/report/reportForVariety/List.vue

+ 2 - 2
src/api/common.js

@@ -165,6 +165,6 @@ export const apiGetTagTree = params=>{
 /**
  * 获取用户已绑定权限
  */
-export const apiUserBindPermission=()=>{
-    return get('/company/permission/bind',{})
+export const apiUserBindPermission=params=>{
+    return get('/company/permission/bind',params)
 }

+ 19 - 0
src/api/report.js

@@ -222,4 +222,23 @@ export const apiRddpShareImg=params=>{
  */
 export const apiReportPPtImgs=params=>{
     return get('/report/ppt_img',params)
+}
+
+/**
+ * 品种类型报告中品种筛选项
+ * @param classify_id 分类id
+ */
+export const apiGoodsPermissionList=params=>{
+    return get('/company/permission/commodities',params)
+}
+
+/**
+ * 按品种查询报告列表
+ * @param chart_permission_id 品种id
+ * @param classify_id 分类id
+ * @param current_index
+ * @param page_size
+ */
+export const apiReportListForVariety=params=>{
+    return get('/report/variety/list',params)
 }

+ 11 - 0
src/router/index.js

@@ -172,6 +172,17 @@ const routes=[
           hasBack:true
         },
       },
+      {
+        path: "varietyreportlist",
+        name: "VarietyReportList",
+        component: () => import("@/views/report/reportForVariety/List.vue"),
+        meta: {
+          title: "报告列表",
+          keepAlive:true,
+          isRoot:false,
+          hasBack:true
+        },
+      },
     ]
   },
   {

+ 10 - 2
src/views/report/Classify.vue

@@ -28,7 +28,7 @@ getClassifyList()
 
 // 跳转下一级
 const goNext=(item)=>{
-    // redirect_type : 跳转页面类型:1专栏列表,2报告列表,3专栏详情
+    // redirect_type : 跳转页面类型:1专栏列表,2报告列表,3专栏详情,4品种类型列表
     if(item.redirect_type===1){
         router.push({
             path:'/report/specialcolumnlist',
@@ -55,7 +55,15 @@ const goNext=(item)=>{
             }
         })
     }
-
+    if(item.redirect_type===4){
+        router.push({
+            path:'/report/varietyreportlist',
+            query:{
+                classifyId:item.classify_id_first,
+                classifyName:item.classify_name_first
+            }
+        })
+    }
 
 }
 

+ 2 - 0
src/views/report/List.vue

@@ -184,12 +184,14 @@ const posterParams=computed(()=>{
         obj.title_1=reportState.list[0].title 
         obj.abstract_1=reportState.list[0].classify_name_second
         obj.time_1=`${reportState.list[0].stage}期 | ${moment(reportState.list[0].publish_time).format('YYYY.MM.DD')}`
+        obj.abstract_1_style=reportState.list[0].classify_name_second?'':'display:none'
     }
     if(reportState.list[1]){
         obj.img_2=reportState.list[1].report_img_url
         obj.title_2=reportState.list[1].title 
         obj.abstract_2=reportState.list[1].classify_name_second
         obj.time_2=`${reportState.list[1].stage}期 | ${moment(reportState.list[1].publish_time).format('YYYY.MM.DD')}`
+        obj.abstract_2_style=reportState.list[1].classify_name_second?'':'display:none'
     }
     return obj
 })

+ 458 - 0
src/views/report/reportForVariety/List.vue

@@ -0,0 +1,458 @@
+<script setup>
+import {apiReportListForVariety,apiGoodsPermissionList} from '@/api/report'
+import SelfList from '@/components/SelfList.vue'
+import moment from 'moment';
+import { reactive,onMounted,onActivated,computed,ref } from 'vue'
+import { useRoute,useRouter } from 'vue-router';
+import { useStore } from 'vuex';
+import { ElMessage } from 'element-plus'
+
+const route=useRoute()
+const router=useRouter()
+const store=useStore()
+
+let classifyId=ref(route.query.classifyId||0) //一级分类id
+document.title=decodeURIComponent(route.query.classifyName)
+
+// 获取用户已绑定品种
+let permissionList=reactive({
+    list:[],
+    firstPerId:0,
+    secList:[],
+    secPerId:0,
+})
+const getPermissionList=async ()=>{
+    const res=await apiGoodsPermissionList({
+        classify_id:Number(classifyId.value),
+    })
+    if(res.code===200){
+        let arr=res.data.permission_list||[]
+        if(arr.length===0){
+            ElMessage.warning('暂无权限')
+            setTimeout(() => {
+                router.replace('/report/classify')
+            }, 2000);
+            return
+        }
+        permissionList.list=arr
+        handleSelectFirstVariety(res.data.permission_list[0])
+    }
+}
+getPermissionList()
+// 选择一级品种
+const handleSelectFirstVariety=(item)=>{
+    permissionList.firstPerId=item.id 
+    permissionList.secList=item.list
+    handleSelectSecVariety(item.list[0])
+}
+//选择二级品种
+const handleSelectSecVariety=(item)=>{
+    permissionList.secPerId=item.chart_permission_id
+    reportState.page=1
+    reportState.list=[]
+    reportState.finished=false
+    getReportList()
+}
+
+// 获取报告列表
+let reportState=reactive({
+    list:[],
+    page:1,
+    pageSize:20,
+    loading:false,
+    finished:false,
+})
+const getReportList=async ()=>{
+    reportState.loading=true
+    const res=await apiReportListForVariety({
+        chart_permission_id:Number(permissionList.secPerId),
+        classify_id:Number(classifyId.value),
+        current_index:reportState.page,
+        page_size:reportState.pageSize
+    })
+    reportState.loading=false
+    if(reportState.page==1){
+        document.body.scrollTop=document.documentElement.scrollTop=0
+    }
+    if(res.code===200){
+        let arr=res.data.list||[]
+        reportState.list=[...reportState.list,...arr]
+        reportState.finished=res.data.paging.is_end 
+    }
+}
+
+// 加载更多列表数据
+const onLoad=()=>{
+    reportState.page++
+    getReportList()
+}
+
+//跳转详情
+const goReportDetail=(item)=>{
+    if(['晨报','周报'].includes(item.classify_name_first)){
+        router.push({
+            path:'/report/chapterdetail',
+            query:{
+                chapterId:item.report_chapter_id
+            }
+        })
+    }else{
+        router.push({
+            path:'/report/detail',
+            query:{
+                reportId:item.report_id
+            }
+        })
+    }
+}
+
+//播放音频
+const handlePlayAudio=(item)=>{
+    if(item.video_list){
+        if(store.state.audioData.reportId==item.report_id){
+            if(store.state.audioData.paused){
+                store.state.audioData.INS.play()
+            }else{
+                store.state.audioData.INS.pause()
+            }
+            return
+        }
+        const arr=item.video_list.map(_item=>{
+            return {
+                name:_item.video_name,
+                url:_item.video_url,
+                time:_item.video_play_seconds
+            }
+        })
+        store.commit('addAudio',{
+            list:arr,
+            reportId:item.report_id,
+            index:0
+        })
+    }
+}
+
+// 向小程序发送数据
+const handleDataToXcx=()=>{
+    const postData={
+        path:'/pages-report/reportForVariety/list',
+        params:{
+            classifyId:classifyId.value,
+            classifyName:route.query.classifyName
+        },
+        title:`FICC【${route.query.classifyName}】`,
+        shareImg:''
+    }
+    wx.miniProgram.postMessage({ data: postData })
+}
+
+onMounted(()=>{
+    handleDataToXcx()
+})
+
+// 组件激活时
+onActivated(()=>{
+    const temClassifyId=route.query.classifyId||0
+    if(temClassifyId!=classifyId.value){
+        classifyId.value=temClassifyId
+        reportState.list=[]
+        reportState.page=1
+        reportState.finished=false
+        permissionList.list=[]
+        permissionList.firstPerId=0
+        permissionList.secList=[]
+        permissionList.secPerId=0
+        getPermissionList()
+    }
+    handleDataToXcx()
+})
+
+const code_scene=computed(()=>{
+    return JSON.stringify({classifyId:classifyId.value,classifyName:route.query.classifyName})
+})
+
+const posterParams=computed(()=>{
+    let obj={
+        list_title:route.query.classifyName,
+        stage_1:'',
+        avatar_1:'',
+        title_1:'',
+        author_1:'',
+        tag_1:'',
+        stage_2:'',
+        avatar_2:'',
+        title_2:'',
+        author_2:'',
+        tag_2:'',
+        abstract_2_style:'',
+        abstract_1_style:'',
+    }
+    if(reportState.list[0]){
+        obj.img_1=reportState.list[0].report_img_url
+        obj.title_1=reportState.list[0].title 
+        obj.abstract_1=reportState.list[0].classify_name_second
+        obj.time_1=`${reportState.list[0].stage}期 | ${moment(reportState.list[0].publish_time).format('YYYY.MM.DD')}`
+        obj.abstract_1_style=reportState.list[0].classify_name_second?'':'display:none'
+    }
+    if(reportState.list[1]){
+        obj.img_2=reportState.list[1].report_img_url
+        obj.title_2=reportState.list[1].title 
+        obj.abstract_2=reportState.list[1].classify_name_second
+        obj.time_2=`${reportState.list[1].stage}期 | ${moment(reportState.list[1].publish_time).format('YYYY.MM.DD')}`
+        obj.abstract_2_style=reportState.list[1].classify_name_second?'':'display:none'
+    }
+    return obj
+})
+</script>
+
+<template>
+    <div class="variety-report-list-page">
+        <div class="top-nav-warp">
+            <div class="flex first-nav-box">
+                <span 
+                    :class="['item',item.id===permissionList.firstPerId?'active':'']" 
+                    v-for="item in permissionList.list" 
+                    :key="item.id"
+                    @click="handleSelectFirstVariety(item)"
+                >{{item.classify_name}}</span>
+            </div>
+            <div class="sec-nav-box">
+                <span 
+                    :class="['item',item.chart_permission_id===permissionList.secPerId?'active':'']"
+                    v-for="item in permissionList.secList.slice(0,6)" 
+                    :key="item.chart_permission_id"
+                    @click="handleSelectSecVariety(item)"
+                >{{item.chart_permission_name}}</span>
+                <el-popover
+                    :width="500"
+                    trigger="click"
+                >
+                    <template #reference>
+                        <img v-if="permissionList.secList.length>6" style="width:16px;transform: rotate(90deg);cursor: pointer" src="@/assets/icon-more.png" alt="">
+                    </template>
+                    <template #default>
+                        <div class="flex top-nav-filter-box">
+                        <div 
+                            :class="['item',item.chart_permission_id == permissionList.secPerId&&'active']" 
+                            v-for="item in permissionList.secList.slice(6)" 
+                            :key="item.chart_permission_id"
+                            @click="handleSelectSecVariety(item)"
+                        >{{item.chart_permission_name}}</div>
+                        </div>
+                    </template>
+                </el-popover>
+            </div>
+        </div>
+        <SelfList 
+            :finished="reportState.finished" 
+            :isEmpty="reportState.list.length === 0 && reportState.finished" 
+            :loading="reportState.loading" 
+            :count="reportState.list.length"
+            @listOnload="onLoad"
+            emptyMsg="暂无报告"
+        >
+            <div class="flex list-wrap">
+                <div class="flex item" v-for="item in reportState.list" :key="item.report_id" @click="goReportDetail(item)">
+                    <el-image class="report-img" :src="item.report_img_url" fit="cover" lazy />
+                    <div class="con">
+                        <div class="top-name" v-html="item.title_info"></div>
+                        <div class="title" v-html="item.title"></div>
+                        <div class="des" v-html="item.abstract"></div>
+                        <div class="clear-float bot">
+                            <span class="time">{{moment(item.publish_time).format('YYYY.MM.DD HH:mm')}}</span>
+                            <div 
+                                class="btn" 
+                                v-if="item.auth_ok" 
+                                @click.stop="handlePlayAudio(item)"
+                            >{{$store.state.audioData.reportId==item.report_id?$store.state.audioData.paused?'已暂停':'播放中':'立即播放'}}</div>
+                        </div>  
+                    </div>
+                </div>
+                <div class="last-add-item"></div>
+                <div class="last-add-item"></div>
+            </div>
+        </SelfList>
+    </div>
+    <!-- 生成海报 -->
+    <SharePoster  
+        :shareData="{
+            type:'report_list',
+            code_page:'pages-report/reportForVariety/list',
+            code_scene:code_scene,
+            data:posterParams
+        }"
+    ></SharePoster>
+</template>
+
+<style lang="scss" scoped>
+.top-nav-filter-box{
+    flex-wrap: wrap;
+    .item{
+        margin: 5px 10px;
+        width: 113px;
+        height: 40px;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        background-color: #f6f6f6;
+        border-radius: 4px;
+        font-size: 16px;
+        cursor: pointer;
+        :hover{
+            color: #fff;
+            background-color: #F3A52F;
+        }
+    }
+    .active{
+        color: #fff;
+        background-color: #F3A52F;
+    }
+}
+
+.variety-report-list-page{
+    .top-nav-warp{
+        position: sticky;
+        top: 60px;
+        z-index: 50;
+        background: #FFFFFF;
+        box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.04);
+        padding: 30px 30px 12px 30px;
+        margin-bottom: 30px;
+        .first-nav-box{
+            .item{
+                width: 140px;
+                height: 40px;
+                flex-shrink: 0;
+                background: #F6F6F6;
+                border-radius: 20px;
+                text-align: center;
+                line-height: 40px;
+                font-size: 16px;
+                margin-right: 30px;
+                cursor: pointer;
+                &:hover {
+                    background: #FFFBF5;
+                    color: #F3A52F;
+                    border: 1px solid #F3A52F;
+                    box-shadow: 0px 6px 7px 1px #FFF7EB;
+                }
+            }
+            .active {
+                background: #FFFBF5;
+                color: #F3A52F;
+                border: 1px solid #F3A52F;
+                box-shadow: 0px 6px 7px 1px #FFF7EB;
+            }
+            @media screen and (max-width: 1350px){
+                .item{
+                    width: 90px;
+                    height: 30px;
+                    line-height: 30px;
+                    margin-right: 15px;
+                    font-size: 14px;
+                }
+            }
+        }
+        .sec-nav-box{
+            margin-top: 30px;
+            .item{
+                flex-shrink: 0;
+                margin-right: 30px;
+                font-size: 16px;
+                color: #666666;
+                cursor: pointer;
+            }
+            .active{
+                color: #F3A52F;
+            }
+        }
+    }
+    .list-wrap{
+        flex-wrap: wrap;
+        justify-content: center;
+        // &::after{
+        //     content:'';
+        //     display: block;
+        //     height:0;
+        //     flex-shrink: 0;
+        //     width: 380px;
+        //     margin-bottom: 20px;
+        //     margin-left: 10px;
+        //     margin-right: 10px;
+        // }
+
+        // 末尾补充的两个元素 为了整体能居中
+        .last-add-item{
+            height:0;
+            flex-shrink: 0;
+            width: 380px;
+            margin-left: 10px;
+            margin-right: 10px;
+        }
+        .item{
+            flex-shrink: 0;
+            width: 380px;
+            background: #FFFFFF;
+            box-shadow: 3px 3px 12px 1px rgba(184, 184, 184, 0.16);
+            border-radius: 8px;
+            border: 1px solid #F2F2F2;
+            padding: 20px;
+            margin-bottom: 20px;
+            margin-left: 10px;
+            margin-right: 10px;
+            overflow: hidden;
+            .report-img{
+                flex-shrink: 0;
+                width: 110px;
+                height: 160px;
+                border-radius: 8px;
+                margin-right: 15px;
+            }
+            .con{
+                flex: 1;
+                display: flex;
+                flex-direction: column;
+                justify-content: space-between;
+                overflow: hidden;
+            }
+            .top-name{
+                background-color: #FFFBF5;
+                // text-align: center;
+                font-size: 14px;
+                color: #F3A52F;
+                padding: 4px 0;
+            }
+            .title{
+                :deep(span){
+                    color:#F3A52F !important;
+                }
+            }
+            .des{
+                color: #999;
+            }
+            .bot{
+                display: flex;
+                align-items: flex-end;
+                justify-content: space-between;
+                .time{
+                    flex-shrink: 0;
+                    font-size: 14px;
+                    color: #999;
+                }
+                .btn{
+                    flex-shrink: 0;
+                    width: 88px;
+                    height: 30px;
+                    background: #F3A52F;
+                    border-radius: 15px;
+                    color: #fff;
+                    text-align: center;
+                    line-height: 30px;
+                    font-size: 14px;
+                    cursor: pointer;
+                }
+            }
+        }
+    }
+}
+</style>