Browse Source

merge master

bding 1 year ago
parent
commit
f12619aee2

+ 11 - 1
components/modalDialog.vue

@@ -277,10 +277,20 @@ export default {
       if (this.jurisdictionList.IsResearchSpecial) {
       } else {
         // isAudioVideo -- 3 产业视频
+        let type =
+          this.jurisdictionList.isAudioVideo == 1 ? "MicroAudio" : this.jurisdictionList.isAudioVideo == 2 ? "ActivityVideo" : this.jurisdictionList.isAudioVideo == 3 ? "MicroVideo" : "Activity";
         const res = await User.applyTry({
-          TryType: this.jurisdictionList.isAudioVideo == 1 ? "MicroAudio" : this.jurisdictionList.isAudioVideo == 2 || this.jurisdictionList.isAudioVideo == 3 ? "MicroVideo" : "Activity",
+          TryType: type,
           DetailId: this.jurisdictionList.ActivityId,
         });
+        if (res.Ret === 200) {
+          uni.showModal({
+            title: "",
+            content: "提交申请成功,请耐心等待",
+            showCancel: false,
+            confirmColor: "#3385FF",
+          });
+        }
       }
       this.showhasPermission = false;
       this.$parent.isShowhasPermission = false;

+ 1 - 1
components/report/timeLine.vue

@@ -154,7 +154,7 @@ export default {
 <style scoped lang="scss">
 .time-line {
   padding: 30rpx 40rpx 20rpx 40rpx;
-  min-height: calc(100vh - 190rpx);
+  min-height: calc(100vh - 390rpx);
   background-color: #ffffff;
   position: relative;
   .texe-color {

+ 22 - 3
config/modules/Reports.js

@@ -73,7 +73,7 @@ export const Reports = {
   },
   /* 获取是否展示绝密内参接口*/
   reportIsShow: (params) => {
-    return getHttp("/report/isShow", params,0);
+    return getHttp("/report/isShow", params, 0);
   },
   /* 获取报告精选、本周研究汇总、上周纪要汇总列表接口*/
   reportListByType: (params) => {
@@ -151,5 +151,24 @@ export const Reports = {
   hetReport_selectionList: (params) => {
     return getHttp("/report_selection/list", params, 0);
   },
-  
-};
+  // 报告精选申请路演
+  report_selection_logApply: (params) => {
+    return postHttp("/report_selection/report_selection_log/apply", params, 0);
+  },
+  /* 路演banner列表接口 */
+  collectionBannerList: (params) => {
+    return getHttp("/collection/banner/list", params, 0);
+  },
+  // 精选看板跳转详情地址
+  getCollectionDetail: (params) => {
+    return getHttp("/collection/detail", params, 0);
+  },
+  // 精选看板跳转详情地址
+  collectionApplyAdd: (params) => {
+    return postHttp("/collection/apply/add", params, 0);
+  },
+  // 获取申请详情接口
+  collectionApplyDetail: (params) => {
+    return getHttp("/collection/apply/detail", params, 0);
+  },
+};

+ 21 - 0
pages.json

@@ -241,6 +241,27 @@
             "navigationBarTitleText": "重点公司",
             "enablePullDownRefresh": false
           }
+        },
+        {
+          "path": "selectedBulletin/selectedBulletin",
+          "style": {
+            "navigationBarTitleText": "专题看板",
+            "enablePullDownRefresh": false
+          }
+        },
+        {
+          "path": "bulletinMessage/bulletinMessage",
+          "style": {
+            "navigationBarTitleText": "专题看板",
+            "enablePullDownRefresh": false
+          }
+        },
+        {
+          "path": "bulletinDetail/bulletinDetail",
+          "style": {
+            "navigationBarTitleText": "申请详情",
+            "enablePullDownRefresh": false
+          }
         }
       ]
     },

+ 8 - 1
pages/index/components/ItemContent.vue

@@ -15,7 +15,10 @@
       <view class="item-title" v-if="list.Title">
         <mp-html :content="richTextClamp(3) + list.Title + '</div>'" />
       </view>
-      <view class="item-rich-text" v-if="list.Source == 'productinterior'">
+      <view class="item-rich-text" v-if="list.MarketStrategy">
+        <mp-html :content="richTextClamp(10) + list.MarketStrategy + '</div>'" />
+      </view>
+      <view class="item-rich-text" v-else-if="list.Source == 'productinterior'">
         <mp-html :content="richTextClamp(10) + list.Body + '</div>'" />
       </view>
       <view class="item-rich-text" v-else>
@@ -56,6 +59,10 @@ export default {
         uni.navigateTo({
           url: "/reportPages/internalDetials/internalDetials?id=" + item.ProductInteriorId,
         });
+      } else if (item.Source == "reportselection") {
+        uni.navigateTo({
+          url: "/reportPages/keyCompany/keyCompany?id=" + item.ArticleId,
+        });
       } else {
         let isType = item.Source == "researchsummary" ? 2 : 3;
         this.$store.dispatch("checkHandle", "/reportPages/reportSecretDetail/reportSecretDetail?type=" + isType + "&id=" + item.ArticleId);

+ 56 - 9
pages/index/index.vue

@@ -57,7 +57,7 @@
                 <block v-if="item.Source === 'activity' || item.Source === 'activityspecial'">
                   <ActivityItem :list="item.Activity" />
                 </block>
-                <block v-if="['researchsummary', 'minutessummary', 'meetingreviewchapt', 'productinterior'].includes(item.Source)">
+                <block v-if="['researchsummary', 'minutessummary', 'meetingreviewchapt', 'productinterior', 'reportselection'].includes(item.Source)">
                   <item-content :list="dataListItem(item)" @showMorningDialog="showMorningDialog" />
                 </block>
               </view>
@@ -76,7 +76,7 @@
                 <block v-if="item.Source === 'activity' || item.Source === 'activityspecial'">
                   <ActivityItem :list="item.Activity" />
                 </block>
-                <block v-if="['researchsummary', 'minutessummary', 'meetingreviewchapt', 'productinterior'].includes(item.Source)">
+                <block v-if="['researchsummary', 'minutessummary', 'meetingreviewchapt', 'productinterior', 'reportselection'].includes(item.Source)">
                   <item-content :list="dataListItem(item)" @showMorningDialog="showMorningDialog" />
                 </block>
               </view>
@@ -144,6 +144,7 @@ export default {
       dataListLable: [], // 标签的数据
       actIdLable: "", // 标签选择后的ID
       isTopHeight: "",
+      lableArrList: [],
     };
   },
   computed: {
@@ -204,7 +205,7 @@ export default {
               Newchart: item.Newchart,
               Activity: item.Activity || item.Activityspecial,
               Roadshow: item.Roadshow || item.Activityvideo || item.Activityvoice,
-              ThreeSummary: item.Researchsummary || item.Minutessummary || item.Meetingreviewchapt || item.ProductInterior,
+              ThreeSummary: item.Researchsummary || item.Minutessummary || item.Meetingreviewchapt || item.ProductInterior || item.ReportSelection,
             };
             listArr.push({ ...obj, IsShowData: obj.Article || obj.Newchart || obj.Roadshow || obj.Activity || obj.ThreeSummary });
           });
@@ -326,8 +327,52 @@ export default {
       }
     },
     async lableKeysHandler(item) {
+      const checkList = item.CheckList;
+      if (item.isAct) {
+        item.isAct = false;
+        this.lableArrList = this.lableArrList.filter((key) => checkList.includes(key));
+        this.getLableDataList();
+        return;
+      }
+      let isFlag = false; //是否有交集
+      for (let e of checkList) {
+        if (this.lableArrList.includes(e)) {
+          isFlag = true;
+          break;
+        }
+      }
+
+      if (!isFlag) {
+        this.lableArrList = [...this.lableArrList, ...checkList];
+        item.isAct = true;
+      } else {
+        //有交集
+        // 找到有交集的那个 设置为false 然后将点击的这个设置为true
+        this.lableIsRows.forEach((e1) => {
+          e1.forEach((e2) => {
+            let flag = false;
+            for (let i of e2.CheckList) {
+              if (this.lableArrList.includes(i)) {
+                flag = true;
+                break;
+              }
+            }
+            if (flag) {
+              e2.isAct = false;
+            }
+          });
+        });
+
+        item.isAct = true;
+      }
+      this.getLableDataList();
+      if (!item.isAct) return;
+      const res = await Home.tagAddHistory({
+        TagId: item.TagId,
+      });
+    },
+    getLableDataList() {
       let actId = [];
-      this.$set(item, "isAct", !item.isAct);
       this.lableIsRows.forEach((item) => {
         item.forEach((_) => {
           _.isAct && actId.push(_.TagId);
@@ -336,16 +381,18 @@ export default {
       this.page_no = 1;
       this.actIdLable = actId.join(",");
       this.getNewList();
-      if (!item.isAct) return;
-      const res = await Home.tagAddHistory({
-        TagId: item.TagId,
-      });
     },
     // 或者标签内容
     async homeTagListCustom() {
       const res = await Home.homeTagListCustom();
       if (res.Ret === 200) {
-        this.dataListLable = res.Data || [];
+        const arr = res.Data || [];
+        this.dataListLable = arr.map((item) => {
+          return {
+            ...item,
+            isAct: false,
+          };
+        });
       }
     },
   },

+ 15 - 38
pages/material/material.vue

@@ -5,7 +5,7 @@
       <view class="top-tabs">
         <block v-for="item in topTabBars" :key="item.Id">
           <view v-if="item.IsShow" :class="['item', item.val == topTabsActive && 'tabs-active']" @click="topTabsChange(item)">
-            {{ item.Name }}
+            {{ showTabBarsText(item.Name) }}
             <block v-if="(item.Id === 3 || item.Name == '图表') && wholeShowListData.IsShowChart">
               <image class="limit-img tabs-img" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/czbk/limit_icon.png" mode=""></image>
             </block>
@@ -15,12 +15,7 @@
       </view>
       <view class="tabs-content">
         <view class="second-tabs" v-if="topTabsActive == '2' || topTabsActive == '3'">
-          <view
-            :class="['item', item.ChartPermissionId == secondActive && 'tabs-active']"
-            v-for="(item, index) in secondBars"
-            :key="item.ChartPermissionId"
-            @click="handleClickTopSub(item)"
-          >
+          <view :class="['item', item.ChartPermissionId == secondActive && 'tabs-active']" v-for="(item, index) in secondBars" :key="item.ChartPermissionId" @click="handleClickTopSub(item)">
             {{ item.PermissionName }}
             <block v-if="wholeShowListData.IsShowResearch && index === secondBars.length - 1 && topTabsActive == '2'">
               <image class="limit-img tabs-img" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/czbk/limit_icon.png" mode=""></image>
@@ -30,13 +25,9 @@
         </view>
         <block v-if="topTabsActive == '3'">
           <view class="children-ul">
-            <view
-              :class="['chart-children', chartChildrenActive == item.CtagId ? 'children-active' : '']"
-              v-for="item in chartChildren"
-              :key="item.CtagId"
-              @click="handleChartChildren(item)"
-              >{{ item.Name }}</view
-            >
+            <view :class="['chart-children', chartChildrenActive == item.CtagId ? 'children-active' : '']" v-for="item in chartChildren" :key="item.CtagId" @click="handleChartChildren(item)">{{
+              item.Name
+            }}</view>
           </view>
         </block>
         <view v-if="topTabsActive == '4'" class="medium-ul">
@@ -59,13 +50,7 @@
           <view class="report-ul" style="width: 49%">
             <block v-for="(item, index) in dataList" :key="index">
               <view v-if="index % 2 == 0">
-                <ChartItem
-                  v-if="topTabsActive == 3"
-                  :list="item"
-                  :isMyChartCollection="isMyChartCollection"
-                  @myChartIsTop="myChartIsTop"
-                  @myChartCollect="myChartCollect"
-                />
+                <ChartItem v-if="topTabsActive == 3" :list="item" :isMyChartCollection="isMyChartCollection" @myChartIsTop="myChartIsTop" @myChartCollect="myChartCollect" />
                 <ReportItem v-if="topTabsActive == 2" :list="item" />
               </view>
             </block>
@@ -73,13 +58,7 @@
           <view class="report-ul" style="width: 49%">
             <block v-for="(item, index) in dataList" :key="index">
               <view v-if="index % 2 !== 0">
-                <ChartItem
-                  v-if="topTabsActive == 3"
-                  :list="item"
-                  :isMyChartCollection="isMyChartCollection"
-                  @myChartIsTop="myChartIsTop"
-                  @myChartCollect="myChartCollect"
-                />
+                <ChartItem v-if="topTabsActive == 3" :list="item" :isMyChartCollection="isMyChartCollection" @myChartIsTop="myChartIsTop" @myChartCollect="myChartCollect" />
                 <ReportItem v-if="topTabsActive == 2" :list="item" />
               </view>
             </block>
@@ -145,8 +124,6 @@ export default {
       mediumSelect: [
         { name: "音频", value: "2", isSelect: false },
         { name: "视频", value: "1", isSelect: false },
-        { name: "逻辑解析", value: "3", isSelect: false },
-        { name: "路演回放", value: "4", isSelect: false },
       ],
       mediumActive: "",
     };
@@ -488,6 +465,12 @@ export default {
         });
       }
     },
+    showTabBarsText(key) {
+      if (key == "微路演") {
+        return "路演回放";
+      }
+      return key;
+    },
   },
   onHide() {
     this.$store.commit("audioBg/parseIntAudio", false);
@@ -534,13 +517,7 @@ export default {
     } else {
       return {
         title: this.isHorzMobile ? "好友向您推荐此内容,上传名片享查研观向免费月卡!" : "素材库",
-        path:
-          "/pages/material/material?topTabsActive=" +
-          this.topTabsActive +
-          "&secondActive=" +
-          this.secondActive +
-          "&childrenActive=" +
-          this.chartChildrenActive,
+        path: "/pages/material/material?topTabsActive=" + this.topTabsActive + "&secondActive=" + this.secondActive + "&childrenActive=" + this.chartChildrenActive,
         success: (res) => {},
         fail: (err) => {},
       };
@@ -615,7 +592,7 @@ export default {
       display: flex;
       flex-wrap: wrap;
       .children-active {
-        background-color: #3385ff; 
+        background-color: #3385ff;
         color: #fff;
       }
     }

+ 6 - 2
pages/reportForm/components/strategy.vue

@@ -9,9 +9,13 @@
             >{{ item.Title }}
             <text class="reg-text" v-if="item.IsRed"></text>
           </text>
-          <text v-if="isText" :class="threeFour ? 'text-threeFour' : 'text_one'">
+          <view style="margin-top: 10rpx" v-if="matchTypeName == '每日复盘'" :class="threeFour ? 'text-threeFour' : 'text_one'">
+            <!-- <mp-html :content="'摘要:' + item.Abstract" /> -->
+            摘要:{{ item.Abstract }}
+          </view>
+          <!-- <text v-else-if="isText" :class="threeFour ? 'text-threeFour' : 'text_one'">
             {{ item.Abstract }}
-          </text>
+          </text> -->
           <text class="text_twoLine desc">{{ item.PublishDate }}</text>
         </view>
         <u-icon name="arrow-right" color="#BDBDBD" size="34"></u-icon>

+ 35 - 35
pages/reportForm/index.scss

@@ -23,7 +23,7 @@
         height: 70rpx;
         font-size: 30rpx;
         color: #707070;
-        background: #F9F9F9;
+        background: #f9f9f9;
         padding: 0 34rpx 0 70rpx;
         border-radius: 70rpx;
       }
@@ -406,39 +406,39 @@
     margin-left: 60rpx;
     display: flex;
     flex-wrap: wrap;
-	.industry-video-item{
-		height: 126rpx;
-		width: 170rpx;
-		margin: 0 40rpx 27rpx 0;
-		border-radius: 8rpx;
-		background-size: cover;
-		background-position: center;
-		background-repeat: no-repeat;
-		font-weight: 500;
-		font-size: 32rpx;
-		color: white;
-		line-height: 45rpx;
-		padding: 20rpx;
-		position: relative;
-		overflow: hidden;
-		.industry-video-icon{
-			height: 0rpx;
-			width: 0rpx;
-			border-style: solid;
-			border-color: #3385FF #3385FF transparent transparent;
-			border-width: 28rpx;
-			position: absolute;
-			right: 0;
-			top: 0;
-			image{
-				position: absolute;
-				right: -24rpx;
-				bottom: 0;
-				height: 20rpx;
-				width: 20rpx;
-			}
-		}
-	}
+    .industry-video-item {
+      height: 126rpx;
+      width: 170rpx;
+      margin: 0 40rpx 27rpx 0;
+      border-radius: 8rpx;
+      background-size: cover;
+      background-position: center;
+      background-repeat: no-repeat;
+      font-weight: 500;
+      font-size: 32rpx;
+      color: white;
+      line-height: 45rpx;
+      padding: 20rpx;
+      position: relative;
+      overflow: hidden;
+      .industry-video-icon {
+        height: 0rpx;
+        width: 0rpx;
+        border-style: solid;
+        border-color: #3385ff #3385ff transparent transparent;
+        border-width: 28rpx;
+        position: absolute;
+        right: 0;
+        top: 0;
+        image {
+          position: absolute;
+          right: -24rpx;
+          bottom: 0;
+          height: 20rpx;
+          width: 20rpx;
+        }
+      }
+    }
     .text-box {
       margin-bottom: 30rpx;
       margin-right: 40rpx;
@@ -484,4 +484,4 @@
 .text-bottom-none {
   width: 100%;
   text-align: center;
-}
+}

+ 81 - 37
pages/reportForm/reportForm.vue

@@ -12,12 +12,7 @@
         </template>
       </search-bar>
       <view class="second-tabs">
-        <view
-          :class="['item', item.ChartPermissionId == tabAct_id && 'tabs-active']"
-          v-for="(item, index) in tabBars"
-          :key="item.ChartPermissionId"
-          @click="toggleTab(item, index)"
-        >
+        <view :class="['item', item.ChartPermissionId == tabAct_id && 'tabs-active']" v-for="(item, index) in tabBars" :key="item.ChartPermissionId" @click="toggleTab(item, index)">
           {{ item.PermissionName }}
           <view class="active" v-if="item.ChartPermissionId == tabAct_id"></view>
         </view>
@@ -25,14 +20,22 @@
     </view>
     <!-- 内容 -->
     <view class="strategy" v-if="strategyIndex >= 4">
+      <view class="banne-content" v-if="strategyIndex == 4">
+        <swiper autoplay :interval="4000" circular>
+          <view v-for="(bannerItem, index) in bannerDataList" :key="index" @click.native="bannerSwiperHandler(bannerItem)">
+            <swiper-item>
+              <image :src="bannerItem.IndexImg"></image>
+            </swiper-item>
+          </view>
+        </swiper>
+        <view class="bulletin" @click="lookBulletinhandler">
+          <image :src="bulletinData.IndexImg"></image>
+          <image v-if="bulletinData.IsShowSustainable" class="limit-img" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/czbk/limit_icon.png"></image>
+        </view>
+      </view>
       <view class="tab-cont-two">
         <block v-for="(item, index) in tabBarsTow" :key="item.CategoryId">
-          <view
-            :id="'__' + index"
-            class="scroll-tab-item"
-            :class="{ active: tabAct_idTwo == item.CategoryId }"
-            @click.stop="toggleTabTwo(item, index)"
-          >
+          <view :id="'__' + index" class="scroll-tab-item" :class="{ active: tabAct_idTwo == item.CategoryId }" @click.stop="toggleTabTwo(item, index)">
             {{ item.MatchTypeName }}
             <text class="reg-text" v-if="item.IsRed"></text>
           </view>
@@ -80,12 +83,7 @@
         </view>
       </view>
       <view v-if="labelListData.length" :class="[labelListData.length > 9 ? 'label-content-column' : 'label-content']">
-        <view
-          @click="strategyLabelHadel(item)"
-          :class="['item', item.Stock.length > 6 && 'item-size', 'text_oneLine']"
-          v-for="item in labelListData"
-          :key="item.ArticleId"
-        >
+        <view @click="strategyLabelHadel(item)" :class="['item', item.Stock.length > 6 && 'item-size', 'text_oneLine']" v-for="item in labelListData" :key="item.ArticleId">
           {{ item.Stock }}
         </view>
       </view>
@@ -127,12 +125,7 @@
           </view>
           <view class="content-box" @click="goIndustryReport(item.IndustrialManagementId)">
             <view class="read-more">
-              <view
-                class="industry-video-item"
-                @click.stop="handelVideoPlay(item)"
-                :style="{ 'background-image': 'url(' + item.IndustryVideo.BackgroundImg + ')' }"
-                v-if="item.IndustryVideo"
-              >
+              <view class="industry-video-item" @click.stop="handelVideoPlay(item)" :style="{ 'background-image': 'url(' + item.IndustryVideo.BackgroundImg + ')' }" v-if="item.IndustryVideo">
                 5min
                 <br />
                 逻辑解析
@@ -142,14 +135,10 @@
               </view>
               <block v-if="item.IndustrialSubjectList">
                 <view v-if="item.IndustryVideo" style="display: flex; flex-wrap: wrap; width: 420rpx">
-                  <view v-for="val in item.IndustrialSubjectList.slice(0, 4)" :key="val.IndustrialSubjectId" class="text-box">{{
-                    val.SubjectName
-                  }}</view>
+                  <view v-for="val in item.IndustrialSubjectList.slice(0, 4)" :key="val.IndustrialSubjectId" class="text-box">{{ val.SubjectName }}</view>
                 </view>
                 <block v-if="item.IndustryVideo && item.IndustrialSubjectList.length > 4">
-                  <view v-for="val in item.IndustrialSubjectList.slice(4)" :key="val.IndustrialSubjectId" class="text-box">{{
-                    val.SubjectName
-                  }}</view>
+                  <view v-for="val in item.IndustrialSubjectList.slice(4)" :key="val.IndustrialSubjectId" class="text-box">{{ val.SubjectName }}</view>
                 </block>
                 <block v-if="!item.IndustryVideo">
                   <view v-for="val in item.IndustrialSubjectList" :key="val.IndustrialSubjectId" class="text-box">{{ val.SubjectName }}</view>
@@ -179,12 +168,7 @@
     <freeCharge class="free-charge" :isShowFreeBtn="isShowFree" />
     <!-- 视频模块 -->
     <videoModule :showVideoPop.sync="showVideoPop" :videoPopList="videoPopList" />
-    <modalDialog
-      :isShowhasPermission="isShowhasPermission"
-      :applyForIsShow="applyForIsShow"
-      :jurisdictionList="jurisdictionList"
-      :hasPermission="hasPermission"
-    />
+    <modalDialog :isShowhasPermission="isShowhasPermission" :applyForIsShow="applyForIsShow" :jurisdictionList="jurisdictionList" :hasPermission="hasPermission" />
     <Loading />
   </view>
 </template>
@@ -198,7 +182,7 @@ import modalDialog from "@/components/modalDialog.vue";
 import SearchBar from "@/components/search-bar/searchBar.vue";
 import TimeLine from "@/components/report/timeLine.vue";
 
-import { Reports } from "@/config/api.js";
+import { Reports, Home } from "@/config/api.js";
 let app = getApp();
 export default {
   components: {
@@ -260,10 +244,13 @@ export default {
           Content: "<p>hello,world</p><p>hello,world</p><p>hello,world</p>",
         }, //第一项是为了获取当前手机下,三行是多少相对高度
       ],
+      bannerDataList: [],
+      bulletinData: {},
     };
   },
   onLoad(option) {
     this.loadList(option);
+    this.getBannerList();
   },
   watch: {
     //监听tabs的变化
@@ -577,6 +564,28 @@ export default {
       //去往文章详情页面
       uni.navigateTo({ url: "/pageMy/reportDetail/reportDetail?id=" + item.ArticleId });
     },
+    // 获取banner 列表
+    async getBannerList() {
+      const res = await Reports.collectionBannerList();
+      if (res.Ret === 200) {
+        console.log(res);
+        this.bannerDataList = res.Data.ListA || [];
+        console.log(this.bannerDataList);
+        this.bulletinData = res.Data.ListB || {};
+      }
+    },
+    // bannaer 点击事件
+    bannerSwiperHandler(item) {
+      uni.navigateTo({
+        url: item.Path,
+      });
+    },
+    // 精选看板的点击事件
+    lookBulletinhandler() {
+      uni.navigateTo({
+        url: "/reportPages/selectedBulletin/selectedBulletin",
+      });
+    },
   },
   /* 触底 */
   onReachBottom: Throttle(function () {
@@ -749,6 +758,41 @@ export default {
   .label-content-column .item-size {
     font-size: 24rpx;
   }
+  .banne-content {
+    // height: 110rpx;
+    width: 100%;
+    padding: 20rpx 30rpx 0;
+    overflow: hidden;
+    margin: 0 auto 20rpx;
+    border-radius: 8rpx;
+    display: flex;
+    justify-content: space-between;
+    swiper {
+      width: 447rpx;
+      height: 110rpx;
+      border-radius: 16rpx;
+      overflow: hidden;
+    }
+    image {
+      width: 100%;
+      height: 100%;
+    }
+    .bulletin {
+      position: relative;
+      width: 214rpx;
+      height: 110rpx;
+      border-radius: 16rpx;
+      overflow: hidden;
+      .limit-img {
+        position: absolute;
+        top: 0;
+        right: 0;
+        width: 50rpx;
+        height: 26rpx;
+        z-index: 1;
+      }
+    }
+  }
 }
 .content-intimate {
   position: fixed;

+ 32 - 0
reportPages/bulletinDetail/bulletinDetail.vue

@@ -0,0 +1,32 @@
+<template>
+  <view style="padding: 30rpx"> {{ detailData.Content }} </view>
+</template>
+
+<script>
+import { Reports } from "@/config/api.js";
+
+export default {
+  data() {
+    return {
+      id: "",
+      detailData: {},
+    };
+  },
+  methods: {
+    async getDetail() {
+      const res = await Reports.collectionApplyDetail({
+        ApplyCollectionId: this.id,
+      });
+      if (res.Ret === 200) {
+        this.detailData = res.Data.Detail;
+      }
+    },
+  },
+  onLoad(options) {
+    this.id = Number(options.id) || "";
+    this.getDetail();
+  },
+};
+</script>
+
+<style></style>

+ 87 - 0
reportPages/bulletinMessage/bulletinMessage.vue

@@ -0,0 +1,87 @@
+<template>
+  <view class="container ask-container-message">
+    <view class="advice-ipt-cont">
+      <u-input v-model="advice_content" type="textarea" maxlength="100" :clearable="false" :placeholder="titlePlaceholder" height="300" class="ipt" />
+      <text class="num-tag">{{ advice_content.length }}/100</text>
+    </view>
+    <view class="btn-cont" @click="submitHandle"> 提交 </view>
+    <freeCharge class="free-charge" :isShowFreeBtn="isShowFree" />
+    <Loading />
+  </view>
+</template>
+
+<script>
+import { Reports } from "@/config/api.js";
+import freeCharge from "@/components/freeCharge";
+export default {
+  data() {
+    return {
+      advice_content: "",
+      id: "",
+      type: "",
+    };
+  },
+  components: {
+    freeCharge,
+  },
+  computed: {
+    titlePlaceholder() {
+      return "请描述您的专题需求";
+    },
+  },
+  methods: {
+    async submitHandle() {
+      if (!this.advice_content)
+        return uni.showToast({
+          title: "内容不能为空",
+          icon: "none",
+          duration: 2000,
+        });
+      const res = await Reports.collectionApplyAdd({
+        Content: this.advice_content,
+      });
+      if (res.Ret === 200) {
+        this.$util.toast("提交成功");
+        this.advice_content = "";
+        setTimeout(() => {
+          uni.navigateBack();
+        }, 500);
+      }
+    },
+  },
+  onLoad(option) {},
+};
+</script>
+
+<style scoped lang="scss">
+.ask-container-message {
+  background-color: #fff;
+  padding: 30rpx 34rpx;
+  .advice-ipt-cont {
+    height: 420rpx;
+    border: 1rpx solid #d0cfd5;
+    border-radius: 8rpx;
+    padding: 30rpx;
+    position: relative;
+    font-size: 28rpx;
+    color: #d0cfd5;
+    .num-tag {
+      position: absolute;
+      bottom: 30rpx;
+      right: 30rpx;
+    }
+  }
+  .btn-cont {
+    margin: 80rpx auto;
+    width: 368rpx;
+    height: 80rpx;
+    font-size: 34rpx;
+    line-height: 80rpx;
+    text-align: center;
+    color: #ffffff;
+    background: linear-gradient(268deg, #2ddbff 0%, #1599ff 49%, #005eff 100%);
+    opacity: 1;
+    border-radius: 4rpx;
+  }
+}
+</style>

+ 38 - 1
reportPages/keyCompany/keyCompany.vue

@@ -64,7 +64,7 @@
                     <text class="itel-label" v-for="val in key.CompanyLabel" :key="val"># {{ val }}</text>
                   </view>
                   <mp-html :content="strFontSize(key.Body)" />
-                  <view style="margin-bottom: 120rpx" v-if="key.OverviewArticleId > 0 || key.List">
+                  <view :style="{ 'margin-bottom': key.IsShowApplyButton ? '50rpx' : '120rpx' }" v-if="key.OverviewArticleId > 0 || key.List">
                     <view class="subject-detali" v-if="key.OverviewArticleId > 0">
                       <text style="display: inline-block">公司综述报告请</text>
                       <text style="color: #3385ff; margin-left: 10rpx; display: inline-block" @click="goArticle(key.OverviewArticleId)">点击查看</text>
@@ -74,6 +74,7 @@
                       <text style="color: #3385ff; margin-left: 10rpx; display: inline-block" @click="industry(key.List)">点击查看</text>
                     </view>
                   </view>
+                  <view v-if="key.IsShowApplyButton" class="item-application" @click="applicationHandel(key)"> 申请路演</view>
                 </view>
               </view>
             </view>
@@ -251,6 +252,30 @@ export default {
         url: "/reportPages/companyTabulation/companyTabulation",
       });
     },
+    applicationHandel(item) {
+      uni.showModal({
+        content: "路演申请会提交至您的对口销售,确定要申请吗?",
+        confirmColor: "#3385FF",
+        cancelColor: "#606266",
+        success: async (res) => {
+          if (res.confirm) {
+            const res = await Reports.report_selection_logApply({ ArticleId: this.reportDetail.ArticleId, SubjectName: item.SubjectName });
+            if (res.Ret === 200) {
+              uni.showToast({
+                title: "申请成功",
+                duration: 2000,
+              });
+            }
+          } else {
+            uni.showToast({
+              title: "取消申请",
+              icon: "none",
+              duration: 2000,
+            });
+          }
+        },
+      });
+    },
   },
   onLoad(option) {
     if (!this.$store.state.isAuth && !this.$store.state.isBind) this.reportSelectionDetail(option);
@@ -519,4 +544,16 @@ export default {
     }
   }
 }
+.item-application {
+  margin: 0 auto 120rpx;
+  width: 368rpx;
+  height: 80rpx;
+  font-size: 34rpx;
+  line-height: 80rpx;
+  text-align: center;
+  color: #ffffff;
+  background: linear-gradient(268deg, #2ddbff 0%, #1599ff 49%, #005eff 100%);
+  opacity: 1;
+  border-radius: 4rpx;
+}
 </style>

+ 1 - 1
reportPages/researchTheme/researchTheme.vue

@@ -176,7 +176,7 @@ export default {
   onShareAppMessage: function (res) {
     return {
       title: "研选主题",
-      path: "/reportPages/authorPages/authorPages?id=" + this.authorId + "&source=" + this.sourceShare + "&pageRouter=" + this.pageRouterShare,
+      path: "/reportPages/researchTheme/researchTheme?id=" + this.themeId + "&source=" + this.sourceShare + "&pageRouter=" + this.pageRouterShare,
     };
   },
 };

+ 77 - 0
reportPages/selectedBulletin/selectedBulletin.vue

@@ -0,0 +1,77 @@
+<template>
+  <view class="container selectedBulletin-container" v-if="isUserBindingPhoneNumber">
+    <web-view :src="linkurl" v-if="linkurl">
+      <cover-view class="search-view">
+        <cover-view class="search-view-box" @click="lookBulletinMessage">
+          <cover-view>点此提交您的专题需求</cover-view>
+        </cover-view>
+      </cover-view>
+    </web-view>
+  </view>
+  <not-have-login v-else />
+</template>
+
+<script>
+import { Report, User, Reports, FreeButton } from "@/config/api.js";
+import notHaveLogin from "@/components/notHaveLogin.vue";
+export default {
+  components: { notHaveLogin },
+  data() {
+    return {
+      linkurl: "",
+    };
+  },
+  methods: {
+    /* 获取详情 */
+    async getDetail() {
+      const res = await Reports.getCollectionDetail();
+      if (res.Ret === 200) {
+        this.linkurl = res.Data.HttpUrl;
+      }
+    },
+    // 精选看板留言
+    lookBulletinMessage() {
+      uni.navigateTo({
+        url: "/reportPages/bulletinMessage/bulletinMessage",
+      });
+    },
+  },
+  onLoad() {
+    this.getDetail();
+  },
+  onShow() {},
+};
+</script>
+
+<style lang="scss" scoped>
+.selectedBulletin-container {
+  background-color: #fff;
+  padding-bottom: 200rpx;
+  padding-bottom: calc(200rpx + constant(safe-area-inset-bottom));
+  padding-bottom: calc(200rpx + env(safe-area-inset-bottom));
+  .search-view {
+    position: fixed;
+    width: 100%;
+    height: 126rpx;
+    background: #fff;
+    z-index: 99999;
+    font-size: 32rpx;
+    box-sizing: border-box;
+    .search-view-box {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      background: #3385ff;
+      color: #fff;
+      height: 126rpx;
+      z-index: 99999;
+    }
+    .search-icon {
+      width: 147rpx;
+      height: 40rpx;
+      margin: 0 15rpx;
+      z-index: 99999;
+    }
+  }
+}
+</style>

+ 2 - 2
wxcomponents/vant/dist/dropdown-item/index.wxml

@@ -18,8 +18,8 @@
     bind:enter="onOpen"
     bind:leave="onClose"
     bind:close="toggle"
-    bind:after-enter="onOpened"
-    bind:after-leave="onClosed"
+    bind:afterEnter="onOpened"
+    bind:afterLeave="onClosed"
   >
     <van-cell
       wx:for="{{ options }}"