Jelajahi Sumber

Merge branch 'master' into cygx_crm_

bding 1 tahun lalu
induk
melakukan
5218903823
31 mengubah file dengan 1297 tambahan dan 561 penghapusan
  1. 4 0
      src/api/modules/rai/YanXuanApi.js
  2. 8 0
      src/api/modules/rai/lableApi.js
  3. 33 0
      src/api/modules/rai/videoListApi.js
  4. TEMPAT SAMPAH
      src/assets/img/rai_m/edit_icon_GuDing.png
  5. TEMPAT SAMPAH
      src/assets/img/rai_m/remove_below_GuDing.png
  6. 5 2
      src/utils/commonOptions.js
  7. 17 0
      src/views/Login.vue
  8. 48 5
      src/views/business_ETA_manage/businessAuth.vue
  9. 2 2
      src/views/business_trip_manage/businessCalendar.vue
  10. 2 2
      src/views/custom_manage/customList/applyTurn.vue
  11. 10 11
      src/views/custom_manage/customList/components/raiPermissionbox.vue
  12. 2 2
      src/views/custom_manage/customList/updateServe.vue
  13. 148 58
      src/views/interaction_manage/videoManageEN.vue
  14. 16 5
      src/views/interaction_manage/videoManageENAdd.vue
  15. 28 9
      src/views/rai_manage/activityManage/activityManage.vue
  16. 29 22
      src/views/rai_manage/activityManage/components/addActivity.vue
  17. 3 3
      src/views/rai_manage/activityManage/components/addComopnents/ResearchDeduct.vue
  18. 5 2
      src/views/rai_manage/activityManage/components/addComopnents/modifyImgDlg.vue
  19. 21 14
      src/views/rai_manage/activityManage/roadShow/components/playDetailsDlg.vue
  20. 297 0
      src/views/rai_manage/activityManage/roadShow/components/releaseAudio.vue
  21. 56 42
      src/views/rai_manage/activityManage/roadShow/tableTabs.js
  22. 49 21
      src/views/rai_manage/activityManage/roadShowList.vue
  23. 13 8
      src/views/rai_manage/components/addSummary.vue
  24. 9 9
      src/views/rai_manage/components/generationAsk.vue
  25. 24 25
      src/views/rai_manage/components/report_preview/summaryPre.vue
  26. 175 0
      src/views/rai_manage/cygxManage/components/lableDlg.vue
  27. 49 5
      src/views/rai_manage/cygxManage/lableManage.vue
  28. 59 173
      src/views/rai_manage/reportManage/appletsReport.vue
  29. 168 127
      src/views/rai_manage/reportManage/morningMeetingManage.vue
  30. 13 10
      src/views/rai_manage/reportManage/summaryManage.vue
  31. 4 4
      src/views/rai_manage/reportManage/yanXuanSpecial.vue

+ 4 - 0
src/api/modules/rai/YanXuanApi.js

@@ -21,6 +21,10 @@ const YanXuanApi = {
   yanxuan_specialEnable: (params) => {
     return http.post("/cygx/yanxuan_special/enable", params);
   },
+  // 置顶、取消置顶
+  yanxuan_tope_change: (params) => {
+    return http.post("/cygx/activity/tope_change ", params);
+  },
 };
 
 export default YanXuanApi;

+ 8 - 0
src/api/modules/rai/lableApi.js

@@ -33,6 +33,14 @@ const lableApi = {
   video_and_voiceImgActivityVideo: (params) => {
     return http.get("/cygx/activityVideo/video_and_voice/img", params);
   },
+  /* 热门活动接口 */
+  tagHot_activityList: (params) => {
+    return http.get("/cygx/tag/hot_activity/list", params);
+  },
+  /* 热门活动接口 */
+  tagHot_activityListUpdate: (params) => {
+    return http.post("/cygx/tag/hot_activity/update", params);
+  },
 };
 
 export default lableApi;

+ 33 - 0
src/api/modules/rai/videoListApi.js

@@ -50,4 +50,37 @@ export default {
   getMicroRoadshowCommentList: (params) => {
     return http.get("/cygx/microRoadshow/commentList/voice", params);
   },
+  /* 微路演问答列表 */
+  askserie_videoList: (params) => {
+    return http.get("/cygx/askserie_video/list", params);
+  },
+  /* 播放记录详情 */
+  askserie_videoHistory_list: (params) => {
+    return http.get("/cygx/askserie_video/history_list", params);
+  },
+  /*问答留言详情 */
+  askserieVideoCollectionList: (params) => {
+    return http.get("/cygx/askserie_video/collection_list", params);
+  },
+  /*问答详情 */
+  askserieVideoDetail: (params) => {
+    return http.get("/cygx/askserie_video/detail", params);
+  },
+  /*问答新增 */
+  askseriePreserveAndEdit: (params) => {
+    return http.post("/cygx/askserie_video/preserveAndEdit", params);
+  },
+  /*发布/取消发布 */
+  askseriePublishAndcancel: (params) => {
+    return http.post("/cygx/askserie_video/publishAndcancel", params);
+  },
+  /*发布/取消发布 */
+  activityVoiceAndVideoList: (params) => {
+    return http.get("/cygx/activity_voice_and_video/list", params);
+  },
+  /*发布/取消发布 */
+  activityVoiceAndVideoCommentList: (params) => {
+    return http.get("/cygx/activity_voice_and_video/commentList", params);
+  },
+  
 };

TEMPAT SAMPAH
src/assets/img/rai_m/edit_icon_GuDing.png


TEMPAT SAMPAH
src/assets/img/rai_m/remove_below_GuDing.png


+ 5 - 2
src/utils/commonOptions.js

@@ -22,7 +22,7 @@ export function checkPassWord(pwd){
 //验证手机号的正则 仅支持国内大陆的
 export const patternPhone = /0?(13|14|15|18|17)[0-9]{9}/
 export function isMobileNo(account) {
-    // 手机号正则
+    /* // 手机号正则
     var isChinaMobile = new RegExp(
       "(^1(3[4-9]|4[78]|5[0-27-9]|7[28]|8[2-478]|98)\\d{8}$)"
     ); // 中国移动
@@ -41,7 +41,10 @@ export function isMobileNo(account) {
       return true;
     } else if (isChinaTelcom.test(account)) {
       return true;
-    } else return isOtherTelphone.test(account);
+    } else return isOtherTelphone.test(account); */
+    //改成和后端一样的正则
+    const phonePatter = new RegExp("(^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0-9])|(17[0-9])|(16[0-9])|(19[0-9]))\\d{8}$)")
+    return phonePatter.test(account)
   }
 //验证邮箱的正则
 export const patternEmail = /\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/

+ 17 - 0
src/views/Login.vue

@@ -593,6 +593,23 @@ export default {
 		flex: 1;
 		text-align: center;
 	}
+	.check-dialog{
+		.el-dialog{
+			border-radius: 8px;
+			.el-dialog__header{
+				background-color: transparent;
+				.el-dialog__headerbtn>i{
+					color: #C0C4CC;
+				}
+			}
+			.el-input{
+				width:100%;
+			}
+			.el-dialog__footer{
+				text-align: center;
+			}
+		}
+	}
 }
 </style>
 <style lang="scss" scoped>

+ 48 - 5
src/views/business_ETA_manage/businessAuth.vue

@@ -33,7 +33,8 @@ export default {
             defaultCheckedKeys:[],
             treeLoading:false,
             checkAll:false,
-            isIndeterminate:false
+            isIndeterminate:false,
+            checkList:[],
         };
     },
     watch:{
@@ -61,10 +62,52 @@ export default {
                 if(!res.Data) return
                 const {List,ChoiceList=[],HalfChoiceList=[]} = res.Data
                 this.authList = List||[]
-                this.defaultCheckedKeys = ChoiceList.filter((item)=>!HalfChoiceList.some((halfItem)=>item===halfItem))
-                this.handleCheckChange(this.defaultCheckedKeys,HalfChoiceList)
+                this.checkList = ChoiceList
+                this.authList.forEach(item=>{
+                    this.checkTree(item)
+                })
+                //this.defaultCheckedKeys = ChoiceList.filter((item)=>!HalfChoiceList.some((halfItem)=>item===halfItem))
+                this.$nextTick(()=>{
+                    this.authList.forEach(item=>{
+                        this.checkTree(item)
+                    })
+                    this.defaultCheckedKeys = this.checkList
+                    this.handleCheckChange(this.defaultCheckedKeys)
+                })
+                
             })
         },
+        checkTree(data){
+            //非叶子节点递归
+            if(data.Children && data.Children.length){
+                data.Children = data.Children.map(i=>{
+                    return this.checkTree(i)
+                })
+            }
+            //叶子节点向上检查MenuId
+            if(!data.Children||data.Children&&data.Children.length===0){
+                this.checkDataList(data)
+            }
+            return data
+        },
+        //根据MenuId找到对应节点
+        findTreeNode(MenuId){
+            return this.$refs.checkboxTree.getNode(MenuId)
+        },
+        checkDataList(data){
+            //获取data的MenuId 和 checkList对比 
+            //如果MenuId不在checkList里,检查data.ParentId在不在checkList里,若在,则从checkList里去除
+            if(!this.checkList.includes(data.MenuId)&&this.checkList.includes(data.ParentId)){
+                const index = this.checkList.indexOf(data.ParentId)
+                index!==-1&&this.checkList.splice(index,1)
+                console.log('应该去除的节点',data.ParentId)
+            }
+            //向上检查MenuId
+            const parentNode = this.findTreeNode(data.ParentId)
+            if(parentNode){
+                this.checkDataList(parentNode.data)
+            }
+        },
         async handleBtnClik(type){
             if(type==='save'){
                 //获取树形列表选择的项 getCheckedKeys getHalfCheckedKeys
@@ -87,9 +130,9 @@ export default {
             }
             this.$router.push('/businessETAList')
         },
-        handleCheckChange(choiceList,HalfChoiceList){
+        handleCheckChange(choiceList/* ,HalfChoiceList */){
             const keys = choiceList||this.$refs.checkboxTree.getCheckedKeys()
-            const halfKeys = HalfChoiceList||this.$refs.checkboxTree.getHalfCheckedKeys()
+            //const halfKeys = HalfChoiceList||this.$refs.checkboxTree.getHalfCheckedKeys()
             const ChoiceList = Array.from(new Set([...keys]))
             const topLevelNodes = this.authList.map(i=>i.MenuId)
             let nodeLength = 0

+ 2 - 2
src/views/business_trip_manage/businessCalendar.vue

@@ -58,7 +58,7 @@
                   <td class="thead-rs">{{ rs.RealName }}</td>
                     <td :key="data_key+'_0'" v-for="(data,data_key) in rs.BusinessTripList.filter(it => it.WeekType == 'current')"
                       style="position: relative;">
-                      <img src="../../assets/img/icons/television.png" v-if="item.GroupId==1 && data.City" 
+                      <img src="../../assets/img/icons/television.png" v-if="item.GroupId==1 && data.City&&data.Reason==='路演'" 
                       @click="toResearchCalendar(data.WeekDate,rs)"
                       class="view-researcher-icon"/>
                       <span style="cursor: pointer;" :style="{color:data.Status=='待审批'?'#FF8A00':'#666666'}"
@@ -68,7 +68,7 @@
                     </td>
                     <td :key="data_key+'_1'" v-for="(data,data_key) in rs.BusinessTripList.filter(it => it.WeekType == 'next')" 
                       style="position: relative;">
-                      <img src="../../assets/img/icons/television.png" v-if="item.GroupId==1 && data.City" 
+                      <img src="../../assets/img/icons/television.png" v-if="item.GroupId==1 && data.City&&data.Reason==='路演'" 
                       @click="toResearchCalendar(data.WeekDate,rs)"
                       class="view-researcher-icon"/>
                       <span style="cursor: pointer;" :style="{color:data.Status=='待审批'?'#FF8A00':'#666666'}"

+ 2 - 2
src/views/custom_manage/customList/applyTurn.vue

@@ -259,7 +259,7 @@ export default {
 						/* 处理数据把复选框 拆分成三个*/
 						res.Data.Item.PermissionList.length&&res.Data.Item.PermissionList.forEach(item => {
 						let arr = item.Items.filter(key=> [22,21,20,19,23,30].includes(key.ChartPermissionId))
-						let ItemsPrivate = item.Items.filter(key=> [29,31,20031].includes(key.ChartPermissionId))
+						let ItemsPrivate = item.Items.filter(key=> [29,31,20031,20032].includes(key.ChartPermissionId))
 						let ItemsUp = item.Items.filter(key=> key.PermissionName.includes('升级'))
 						let ItemsBig = item.Items.filter(key=> key.ChartPermissionId==0)
 							let obj = {
@@ -298,7 +298,7 @@ export default {
 						/* 处理数据把复选框 拆分成三个*/
 						res.Data.List.length&&res.Data.List.forEach(item => {
 						let arr = item.Items.filter(key=> [22,21,20,19,23,30].includes(key.ChartPermissionId))
-						let ItemsPrivate = item.Items.filter(key=> [29,31,20031].includes(key.ChartPermissionId))
+						let ItemsPrivate = item.Items.filter(key=> [29,31,20031,20032].includes(key.ChartPermissionId))
 						let ItemsUp = item.Items.filter(key=> key.PermissionName.includes('升级'))
 						let ItemsBig = item.Items.filter(key=> key.ChartPermissionId==0)
 							let obj = {

+ 10 - 11
src/views/custom_manage/customList/components/raiPermissionbox.vue

@@ -194,13 +194,15 @@
         item.Items.find(its => name.includes(its.PermissionName)).disabled=value
       },
       handlePrivateChecked(value,itP,item){
-        // console.log(value,itP,item);
-        if(![20031,31].includes(itP.ChartPermissionId)) return 
-        // 买方严选的3W与5W互斥
-        let disabledItem = item.ItemsPrivate.find(itPri => {
-          return [20031,31].includes(itPri.ChartPermissionId) && itP.ChartPermissionId!=itPri.ChartPermissionId
+        if(![20032,20031,31].includes(itP.ChartPermissionId)) return 
+        // 买方严选的互斥
+        item.ItemsPrivate.forEach(itPri => {
+         if([20032,20031,31].includes(itPri.ChartPermissionId)&&itP.ChartPermissionId!=itPri.ChartPermissionId && value){
+             itPri.disabled =true
+          }else {
+             itPri.disabled =false
+          }
         })
-        if(disabledItem) disabledItem.disabled=value
       },
       equityGroupDisabled(item){
         return item.some(key=> key>100000);
@@ -214,16 +216,13 @@
 
 <style lang="scss" scoped>
 	.rai-checkbox-content {
-		width: 100%;
+		// width: 100%;
 		// height: 160px;
 		padding: 20px 0 20px 20px;
 		border:1px dashed #aab4cc;
-		display: flex;
+		// display: flex;
 		.rai-checkbox-bigS-box{
 			display: flex;
-			flex-direction: column;
-			align-items: flex-start;
-			height: unset;
 			.bigS-item{
 				display: inline-flex;
 				align-items: center;

+ 2 - 2
src/views/custom_manage/customList/updateServe.vue

@@ -433,7 +433,7 @@ export default {
 						/* 处理数据把复选框 拆分成三个*/
 						res.Data.Item.PermissionList.length&&res.Data.Item.PermissionList.forEach(item => {
 						let arr = item.Items.filter(key=> [22,21,20,19,23,30].includes(key.ChartPermissionId))
-						let ItemsPrivate = item.Items.filter(key=> [29,31,20031].includes(key.ChartPermissionId))
+						let ItemsPrivate = item.Items.filter(key=> [29,31,20031,20032].includes(key.ChartPermissionId))
 						let ItemsUp = item.Items.filter(key=> key.PermissionName.includes('升级'))
 						let ItemsBig = item.Items.filter(key=> key.ChartPermissionId==0)
 							let obj = {
@@ -507,7 +507,7 @@ export default {
 						/* 处理数据把复选框 拆分成三个*/
 						res.Data.List.length&&res.Data.List.forEach(item => {
 						let arr = item.Items.filter(key=> [22,21,20,19,23,30].includes(key.ChartPermissionId))
-						let ItemsPrivate = item.Items.filter(key=> [29,31,20031].includes(key.ChartPermissionId))
+						let ItemsPrivate = item.Items.filter(key=> [29,31,20031,20032].includes(key.ChartPermissionId))
 						let ItemsUp = item.Items.filter(key=> key.PermissionName.includes('升级'))
 						let ItemsBig = item.Items.filter(key=> key.ChartPermissionId==0)
 							let obj = {

+ 148 - 58
src/views/interaction_manage/videoManageEN.vue

@@ -49,7 +49,8 @@
                     align="center"
                 >
                     <template slot-scope="{row}">
-                        <span>{{row.ClassifyNameFirst}}</span>
+                        <span>{{row.ClassifyNameRoot}}</span>
+                        <span v-if="row.ClassifyNameFirst">/{{row.ClassifyNameFirst}}</span>
                         <span v-if="row.ClassifyNameSecond">/{{row.ClassifyNameSecond}}</span>
                     </template>
                 </el-table-column>
@@ -260,8 +261,21 @@
         >
         <div class="send-email-wrap">
             <el-form ref="form" :model="popEmailData" label-width="100px">
-            <el-form-item label="收件人:">
+            <el-form-item label="邮件主题:">
                 <div>
+                <el-input 
+                    placeholder="请输入邮件主题" 
+                    v-model="popEmailData.theme" 
+                    type="textarea" 
+                    maxlength="100"
+                    show-word-limit
+                    :autosize="{ minRows: 3, maxRows: 5}"
+                ></el-input>
+                </div>
+            </el-form-item>
+            <el-form-item label="收件人:">
+            <div class="addressee-box">
+              <div class="addressee-cancel-box">
                 <!-- <el-radio v-model="popEmailData.radio" label="1">默认全部</el-radio> -->
                 <el-cascader
                     v-if="popEmailData.show"
@@ -276,55 +290,84 @@
                     children:'Child'
                     }"
                     placeholder="请选择品种权限"
+                    style="margin-bottom: 10px;"
                 />
-                <el-checkbox v-model="popEmailData.checkUser" style="margin-left:20px">指定人员</el-checkbox>
-                </div>
-                <div v-if="popEmailData.checkUser" class="user-box">
+                <div class="user-box-hint">取消发送客户信息:</div>
                 <el-select
-                    v-model="popEmailData.value"
-                    multiple
-                    filterable
-                    collapse-tags
-                    placeholder="请选择客户"
-                    value-key="Id"
-                >
+                v-model="popEmailData.customValue"
+                multiple
+                filterable
+                collapse-tags
+                placeholder="请选择客户"
+                value-key="CompanyId">
                     <el-option
+                    v-for="item in popEmailData.customOptions"
+                    :key="item.CompanyId"
+                    :label="item.CompanyName"
+                    :value="item">
+                    </el-option>
+                </el-select>
+                <div class="user-box">
+                  <div style="margin-top:10px" class="box">
+                    <!-- <el-tooltip 
+                      effect="dark" 
+                      :content="item.CompanyName" 
+                      placement="top"
+                      v-for="(item,index) in popEmailData.customValue"
+                      :key="item.CompanyId"
+                      > -->
+                    <el-tag
+                      closable
+                      v-for="(item,index) in popEmailData.customValue"
+                      :key="item.CompanyId"
+                      style="margin:0 10px 10px 0"
+                      @close="handleDelSelectCompany(item,index)">
+                      {{item.CompanyName}}
+                    </el-tag>
+                    <!-- </el-tooltip> -->
+                  </div>
+                </div>
+              </div>
+              <div class="addressee-append-box">
+                <el-checkbox v-model="popEmailData.checkUser" style="margin:0 0 10px 20px;width: 100px;">指定人员</el-checkbox>
+                <div class="user-box-hint" v-show="popEmailData.checkUser">指定发送人员信息:</div>
+                <el-select
+                  v-show="popEmailData.checkUser"
+                  v-model="popEmailData.value"
+                  multiple
+                  filterable
+                  collapse-tags
+                  placeholder="请选择人员"
+                  value-key="Id">
+                  <el-option
                     v-for="item in popEmailData.options"
                     :key="item.Id"
                     :label="item.Name"
-                    :value="item">
+                    :value="item"
+                    :disabled="item.Enabled===0">
                     <span>{{item.Name}} &lt;{{item.Email}}&gt;</span>
-                    </el-option>
+                  </el-option>
                 </el-select>
-                <div style="margin-top:10px" class="box">
+                <div class="user-box" v-show="popEmailData.checkUser">
+                  <div style="margin-top:10px" class="box">
                     <el-tooltip 
-                    effect="dark" 
-                    :content="item.Email" 
-                    placement="top"
-                    v-for="(item,index) in popEmailData.value"
-                    :key="item.Id"
-                    >
+                      effect="dark" 
+                      :content="item.Email" 
+                      placement="top"
+                      v-for="(item,index) in popEmailData.value"
+                      :key="item.Id"
+                      >
                     <el-tag
-                    closable
-                    style="margin:0 10px 10px 0"
-                    @close="handleDelSelectCustom(item,index)">
-                    {{item.Name}}
+                      closable
+                      style="margin:0 10px 10px 0"
+                      @close="handleDelSelectCustom(item,index)">
+                      {{item.Name}}
                     </el-tag>
                     </el-tooltip>
+                  </div>
                 </div>
-                </div>
-            </el-form-item>
-            <el-form-item label="邮件主题:">
-                <div>
-                <el-input 
-                    placeholder="请输入邮件主题" 
-                    v-model="popEmailData.theme" 
-                    type="textarea" 
-                    maxlength="100"
-                    show-word-limit
-                    :autosize="{ minRows: 3, maxRows: 5}"
-                ></el-input>
-                </div>
+              </div>
+            </div>
             </el-form-item>
             <div style="text-align:center;margin-bottom:30px;margin-top:40px">
                 <el-button type="primary" plain style="margin-right:10px" @click="popEmailData.show=false">取消</el-button>
@@ -339,7 +382,7 @@
 <script>
 import { videoENInterface,PVDetailList } from '@/api/modules/reportEnApi'
 import * as reportEnInterface from '@/api/modules/reportEnApi';
-import {customInterence,videoInterface,departInterence,reportVarietyENInterence} from '@/api/api.js'
+import {customInterence,videoInterface,reportVarietyENInterence} from '@/api/api.js'
 export default {
     filters:{
         formatDuration(e){
@@ -401,6 +444,8 @@ export default {
                 checkUser:false,//是否选择指定人员
                 options: [],
                 value: [],
+                customOptions:[],
+                customValue:[],
                 theme:'',
                 videoId:0,
                 varietyOpt:[],
@@ -693,17 +738,18 @@ export default {
                 VideoId:this.popEmailData.videoId
             }).then(res=>{
                 if(res.Ret===200){
-                const arr=res.Data||[]
-                this.popEmailData.varietyOpt=arr.filter(e=>{
-                    e.Child&&e.Child.forEach(_e=>delete _e.Child)
-                    return e.Child&&e.Child.length>0
-                })
-                // 设置全部选中
-                this.popEmailData.varietyOpt.forEach(e=>{
-                    e.Child.forEach(_e=>{
-                    this.popEmailData.varietyVal.push([e.EnPermissionId,_e.EnPermissionId])
+                    const arr=res.Data||[]
+                    this.popEmailData.varietyOpt=arr.filter(e=>{
+                        e.Child&&e.Child.forEach(_e=>delete _e.Child)
+                        return e.Child&&e.Child.length>0
                     })
-                })
+                    // 设置全部选中
+                    this.popEmailData.varietyOpt.forEach(e=>{
+                        e.Child.forEach(_e=>{
+                        this.popEmailData.varietyVal.push([e.EnPermissionId,_e.EnPermissionId])
+                        })
+                    })
+                    this.getCustomListEnFun()
                 }
             })
         },
@@ -719,16 +765,45 @@ export default {
                 this.popEmailData.options=arr
             }
         },
+        // 获取英文客户列表
+        getCustomListEnFun(){
+            let arr=[]
+            this.popEmailData.varietyVal&&this.popEmailData.varietyVal.forEach(_e => {
+                arr.push(_e[1])
+            });
+            if(!(arr.length>0)){
+                this.popEmailData.customOptions=[]
+                return 
+            }
+
+            customInterence.getCustomListEn({
+                PageSize:100000,
+                CurrentIndex:1,
+                EnPermissionIds:arr.join(',')
+            }).then(res=>{
+                if(res.Ret!==200) return 
+                this.popEmailData.customOptions = res.Data.List || []
+            })
+        },
         //删除选中的群发客户
         handleDelSelectCustom(item,index){
             this.popEmailData.value.splice(index,1)
         },
+        //删除选中的英文客户
+        handleDelSelectCompany(item,index){
+            this.popEmailData.customValue.splice(index,1)
+        },
         //发送邮件
         handleConfirmSendEmail(){
             let ids=[]
             this.popEmailData.value.forEach(item=>{
                 ids.push(item.Id)
             })
+            let customIds=[]
+            this.popEmailData.customValue.forEach(item=>{
+                customIds.push(item.CompanyId)
+            })
+
             if(this.popEmailData.checkUser&&ids.length===0){//指定人员
                 this.$message.warning('请选择需要发送邮件的人员')
                 return
@@ -753,7 +828,8 @@ export default {
                 ReportId:this.popEmailData.videoId,
                 EmailIds:ids.join(','),
                 Theme:this.popEmailData.theme,
-                EnPermissions:arr
+                EnPermissions:arr,
+                NoCompanyIds:customIds,
             }).then(res=>{
                 if(res.Ret===200){
                     this.$message.success('发送成功')
@@ -868,14 +944,28 @@ export default {
     }
 }
 .send-email-wrap{
-  .user-box{
-    border: 1px dashed #DCDFE6;
-    border-radius: 4px;
-    padding: 20px;
-    margin-top: 20px;
-    .box{
-      max-height: 200px;
-      overflow-y: auto;
+    .addressee-box{
+    display: flex;
+    align-items: flex-start;
+    justify-content: space-between;
+    .addressee-cancel-box,.addressee-append-box{
+      display: flex;
+      flex-direction: column;
+      justify-content: flex-start;
+      width: calc(50% - 12px);
+    }
+    .user-box-hint{
+      color: #999999;
+    }
+    .user-box{
+      border: 1px dashed #DCDFE6;
+      border-radius: 4px;
+      padding: 20px;
+      margin-top: 20px;
+      .box{
+        max-height: 200px;
+        overflow-y: auto;
+      }
     }
   }
 }

+ 16 - 5
src/views/interaction_manage/videoManageENAdd.vue

@@ -217,14 +217,17 @@ export default {
     methods: {
         // 分类变化设置标题
         handleClassifyChange(e){
-
             if(this.formData.id) return //编辑情况不改
             let name=''
             this.options.forEach(item => {
                 if(item.Id==this.formData.classify[0]){
                     item.Child.forEach(_item=>{
                         if(_item.Id==this.formData.classify[1]){
-                            name=_item.ClassifyName
+                            _item.Child.forEach(_it =>{
+                                if(_it.Id==this.formData.classify[2]){
+                                    name=_it.ClassifyName
+                                }
+                            })
                         }
                     })
                 }
@@ -359,8 +362,9 @@ export default {
                 if(!valid) return
                 let params={
                     Id:this.formData.id,
-                    ClassifyIdFirst:this.formData.classify[0],
-                    ClassifyIdSecond:this.formData.classify[1],
+                    // 传二级和三级分类
+                    ClassifyIdFirst:this.formData.classify[1],
+                    ClassifyIdSecond:this.formData.classify[2],
                     Title:this.formData.title,
                     Abstract:this.formData.des,
                     State:this.formData.state,//状态:1:未发布,2:已发布
@@ -394,7 +398,7 @@ export default {
             if(obj){
                 this.formData.id=obj.Id
                 this.formData.title=obj.Title
-                this.formData.classify=[obj.ClassifyIdFirst,obj.ClassifyIdSecond]
+                this.formData.classify=[obj.ClassifyIdRoot,obj.ClassifyIdFirst,obj.ClassifyIdSecond]
                 this.formData.des=obj.Abstract
                 this.formData.videoUrl=obj.VideoUrl
                 this.formData.VideoSeconds=obj.VideoSeconds
@@ -411,6 +415,13 @@ export default {
             if(res.Ret===200){
                 const arr=res.Data.List||[]
                 this.options=arr.map(item=>{
+                    if(item.Child && item.Child.length>0){
+                        item.Child.map(it =>{
+                            console.log(it);
+                            it.disabled = it.Child?false:true
+                        })
+                    }
+
                     return{
                         ...item,
                         disabled:item.Child?false:true

+ 28 - 9
src/views/rai_manage/activityManage/activityManage.vue

@@ -61,16 +61,19 @@
         <el-table-column v-if="tabsPitchon === 2" align="center" label="路演回放" min-width="100">
           <template slot-scope="{ row }"> {{ row.IsUpload ? "已上传" : "" }} </template>
         </el-table-column>
-        <el-table-column align="center" width="146" label="操作">
+        <el-table-column align="center" width="156" label="操作">
           <template slot-scope="{ row }">
-            <span v-if="row.PublishStatus == 0 && tabsPitchon == 0" class="editsty" @click="operationBtn(row.ActivityId, '发布')">发布</span>
-            <span v-if="row.PublishStatus == 3" class="editsty" @click="operationBtn(row.ActivityId, '重新发布')">重新发布</span>
-            <span v-if="row.PublishStatus == 1" class="editsty" @click="operationBtn(row.ActivityId, '取消发布')">取消发布</span>
-            &nbsp;&nbsp;
-            <span class="editsty" @click="editBtn(row.ActivityId, row.PublishStatus)">编辑</span>
-            &nbsp;&nbsp;
-            <span class="deletesty" v-if="row.PublishStatus == 0 && tabsPitchon == 0" @click="operationBtn(row.ActivityId, '删除')">删除</span>
-            <span class="editsty" v-if="row.IsShowSigninButton" @click="handleDownLoadImg(row)">下载签到码</span>
+            <div class="operate-box">
+              <p v-if="row.PublishStatus == 0 && tabsPitchon == 0" class="editsty" @click="operationBtn(row.ActivityId, '发布')">发布</p>
+              <p v-if="row.PublishStatus == 3" class="editsty" @click="operationBtn(row.ActivityId, '重新发布')">重新发布</p>
+              <p v-if="row.PublishStatus == 1" class="editsty" @click="operationBtn(row.ActivityId, '取消发布')">取消发布</p>
+              &nbsp;&nbsp;
+              <p class="editsty" @click="editBtn(row.ActivityId, row.PublishStatus)">编辑</p>
+              &nbsp;&nbsp;
+              <p class="deletesty" v-if="row.PublishStatus == 0 && tabsPitchon == 0" @click="operationBtn(row.ActivityId, '删除')">删除</p>
+              <p class="editsty" v-if="row.IsShowSigninButton" @click="handleDownLoadImg(row)">下载签到码</p>
+              <p v-if="row.ChartPermissionId === 31 && tabsPitchon == 0" class="editsty" @click="overheadHandler(row.ActivityId, '置顶')">&nbsp;&nbsp;{{ row.TopTime == 0 ? "置顶" : "取消置顶" }}</p>
+            </div>
           </template>
         </el-table-column>
       </el-table>
@@ -349,6 +352,15 @@ export default {
     childrenImgMeetingHandler() {
       this.$refs.imgUpload.clearFiles();
     },
+    // 是否置顶
+    async overheadHandler(id) {
+      const res = await raiInterface.yanxuan_tope_change({
+        ActivityId: id,
+      });
+      if (res.Ret !== 200) return;
+      this.$message.success("操作成功!");
+      this.getsummaryManageList();
+    },
   },
   /* 页面跳转前记录参数 */
   beforeRouteLeave(to, form, next) {
@@ -418,5 +430,12 @@ export default {
   .customWidth {
     width: 550px !important;
   }
+  .operate-box {
+    display: flex;
+    flex-wrap: wrap;
+    p {
+      flex-shrink: 0;
+    }
+  }
 }
 </style>

+ 29 - 22
src/views/rai_manage/activityManage/components/addActivity.vue

@@ -18,6 +18,10 @@
           <el-select placeholder="请选择活动类型" :disabled="!isShowSelect" clearable v-model="cactivityType" @change="activityTypeDetail" style="width: 360px">
             <el-option v-for="item in cactivityTypeList" :label="item.ActivityTypeName" :key="item.ActivityTypeId" :value="item.ActivityTypeId"></el-option>
           </el-select>
+          <template>
+            <el-radio style="margin-left: 30px" v-model="areaType" :label="1">国内</el-radio>
+            <el-radio v-model="areaType" :label="2">海外</el-radio>
+          </template>
         </div>
         <div>
           <el-button v-if="isShowSelect" type="primary" @click="templateBtn">活动内容输入模板</el-button>
@@ -138,7 +142,7 @@
               <div class="is-visible">
                 <el-radio-group v-model="radioVisibleActivity">
                   <el-radio :label="1">仅本组客户可见</el-radio>
-                  <el-radio :label="2">全部客户可见</el-radio>
+                  <el-radio :label="2">所有组客户可见</el-radio>
                 </el-radio-group>
                 <el-checkbox v-model="decisionChecked">仅决策人可见</el-checkbox>
               </div>
@@ -355,15 +359,16 @@ export default {
       isShowAddIcon: true, //主题标签的添加的iocn 是否显示
       modifyImgVisible: false,
       defaultImage: "",
-      shareImg:'',
+      shareImg: "",
       videoAndVoiceList: [],
+      areaType: 1,
     };
   },
   computed: {
     // 弘则 研选 是否是研选
-    isResearch(){
-      return this.$route.path.indexOf("Purchaser")!=-1?true:false
-    }
+    isResearch() {
+      return this.$route.path.indexOf("Purchaser") != -1 ? true : false;
+    },
   },
   mixins: [richTextMixins],
   watch: {
@@ -393,19 +398,19 @@ export default {
         this.isCheckAllType(newval === 4 ? true : false);
       },
     },
-    '$route.path':{
-      handler(value){
-        console.log(value,'value');
+    "$route.path": {
+      handler(value) {
+        console.log(value, "value");
       },
-      immediate:true
-    }
+      immediate: true,
+    },
   },
   created() {},
   mounted() {
-    if(!this.isResearch){
+    if (!this.isResearch) {
       this.chartPermission();
-    }else{
-      this.optionFormregion="买方研选"
+    } else {
+      this.optionFormregion = "买方研选";
     }
     this.getActivityType();
     this.customerTypelist();
@@ -507,8 +512,8 @@ export default {
       raiInterface.activityDetail({ ActivityId: Number(this.$route.query.id) }).then((res) => {
         if (res.Ret !== 200) return;
         const { Data } = res;
-        this.defaultImage = Data.BackgroundImg
-        this.shareImg = Data.ShareImg
+        this.defaultImage = Data.BackgroundImg;
+        this.shareImg = Data.ShareImg;
         this.activeIsState = Data.ActiveState;
         this.cactivityType = Data.ActivityTypeId;
         this.optionFormregion = Data.ChartPermissionName;
@@ -526,6 +531,7 @@ export default {
         this.isMark = Data.IsShowSubjectName == 1 ? true : false;
         this.valTemporary = Data.TemporaryLabel;
         this.radioTemporary = this.valTemporary ? true : false;
+        this.areaType = Data.AreaType;
         // 复选框模块
         this.$nextTick(() => {
           let RefPage = this.$refs.researchSelect;
@@ -539,7 +545,7 @@ export default {
           RefPage.SiginupDeadline = Data.SiginupDeadline;
           RefPage.PointsSet = Data.PointsSet;
           RefPage.institutionName = Data.PointsSet.CompanyName;
-          RefPage.isShowHz = !!Data.IsShowHz
+          RefPage.isShowHz = !!Data.IsShowHz;
         });
         this.addEditVideo = Data.VideoDetail
           ? [Data.VideoDetail].map((item) => {
@@ -667,10 +673,11 @@ export default {
         IsBClass: RefPage.isBClass ? 1 : 0,
         SiginupDeadline: RefPage.SiginupDeadline,
         PointsSet,
-        BackgroundImg:this.defaultImage,
-        ShareImg:this.shareImg,
-        IsResearch:this.optionFormregion.includes('研选')?true:false,
-        IsShowHz:RefPage.isShowHz?1:0
+        BackgroundImg: this.defaultImage,
+        ShareImg: this.shareImg,
+        IsResearch: this.optionFormregion.includes("研选") ? true : false,
+        IsShowHz: RefPage.isShowHz ? 1 : 0,
+        AreaType: this.areaType,
       });
 
       if (res.Ret !== 200) return;
@@ -679,7 +686,7 @@ export default {
     },
     //获取行业
     chartPermission() {
-      raiInterface.chartPermissionList({IsHideResearch:!this.isResearch}).then((res) => {
+      raiInterface.chartPermissionList({ IsHideResearch: !this.isResearch }).then((res) => {
         if (res.Ret === 200) {
           this.chartPermissionList = res.Data.List;
         }
@@ -687,7 +694,7 @@ export default {
     },
     //获取活动类型
     getActivityType() {
-      raiInterface.getActivityType({IsResearch:this.isResearch}).then((res) => {
+      raiInterface.getActivityType({ IsResearch: this.isResearch }).then((res) => {
         if (res.Ret === 200) {
           this.isShowAddIcon = res.Data.IsShowAddIcon;
           this.cactivityTypeList = res.Data.List;

+ 3 - 3
src/views/rai_manage/activityManage/components/addComopnents/ResearchDeduct.vue

@@ -6,7 +6,7 @@
         <i class="el-icon-info" />
       </el-tooltip>
     </el-checkbox>
-    <el-checkbox v-if="isResearch && [1,3,5].includes(cactivityType)" v-model="isShowHz"> 同时在弘则活动页展示 </el-checkbox>
+    <el-checkbox v-if="isResearch && [1, 3, 5, 8].includes(cactivityType)" v-model="isShowHz"> 同时在弘则活动页展示 </el-checkbox>
     <el-checkbox v-if="cactivityType == 3" v-model="isExternalLabel"> 外部资源 </el-checkbox>
     <template v-if="cactivityType == 7 || cactivityType == 2">
       <el-checkbox v-model="isYidongConduct">
@@ -87,7 +87,7 @@ export default {
       default: "",
     },
     isResearch: {
-      type:Boolean,
+      type: Boolean,
       default: false,
     },
   },
@@ -114,7 +114,7 @@ export default {
         CancelDeadlineType: "", //截至报名时间
       },
       dataDeadlineSet: [],
-      isShowHz:false
+      isShowHz: false,
     };
   },
   computed: {

+ 5 - 2
src/views/rai_manage/activityManage/components/addComopnents/modifyImgDlg.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="container">
     <!-- 选择图片的弹框 -->
-    <el-dialog title="选择图片" :visible.sync="modifyImgVisible" width="80%" v-dialogDrag :close-on-click-modal="false" :modal-append-to-body="false" center>
+    <el-dialog title="选择图片" :visible.sync="modifyImgVisible" width="80%" v-dialogDrag :close-on-click-modal="false" :modal-append-to-body="false" center @close="cancelHandle">
       <div class="seleect-img-box">
         <div class="content-img" @click="clickSelectImg(item)" v-for="(item, index) in videoAndVoiceList" :key="index">
           <img :src="item.ImgUrl" alt="" class="item-img" />
@@ -49,10 +49,13 @@ export default {
       this.page_no = page;
       this.getSelectImgList();
     },
+    cancelHandle() {
+      this.$emit("update:modifyImgVisible", false);
+    },
     clickSelectImg(item) {
       this.$parent.defaultImage = item.ImgUrl;
       this.$parent.shareImg = item.ShareImg;
-      this.$emit("update:modifyImgVisible", false);
+      this.cancelHandle();
     },
   },
 };

+ 21 - 14
src/views/rai_manage/activityManage/roadShow/components/playDetailsDlg.vue

@@ -3,19 +3,12 @@
     <el-dialog v-dialogDrag :close-on-click-modal="false" :modal-append-to-body="false" center title="播放详情" :visible.sync="playDetailsVisible" width="1242px" :before-close="cancelHandle">
       <el-table :data="dataList" style="width: 100%" border height="400">
         <template v-for="item in tableColums">
-          <el-table-column
-            :key="item.label"
-            :label="item.label"
-            :width="item.widthsty"
-            :min-width="item.minwidthsty"
-            align="center"
-            v-if="(tabActive == 1 || tabActive == 2) && item.key != 'PlaySeconds'"
-          >
+          <el-table-column :key="item.label" :label="item.label" :width="item.widthsty" :min-width="item.minwidthsty" align="center" v-if="tabActive == 4 && item.key != 'PlaySeconds'">
             <template slot-scope="{ row }">
               <span>{{ handleRowContent(row, item.key) }}</span>
             </template>
           </el-table-column>
-          <el-table-column :key="item.label" :label="item.label" :width="item.widthsty" :min-width="item.minwidthsty" align="center" v-else-if="tabActive == 3">
+          <el-table-column :key="item.label" :label="item.label" :width="item.widthsty" :min-width="item.minwidthsty" align="center" v-else-if="tabActive != 4">
             <template slot-scope="{ row }">
               <span>{{ handleRowContent(row, item.key) }}</span>
             </template>
@@ -63,14 +56,22 @@ export default {
     "playDetailsList.VideoId": {
       handler(newval) {
         if (newval) {
-          this.tabActive == 1 ? this.getVideoDeatil() : this.activityVideoDeatil();
+          this.tabActive == 4 && this.getVideoDeatil();
         }
       },
     },
-    "playDetailsList.ActivityVoiceId": {
+    "playDetailsList.FileName": {
       handler(newval) {
         if (newval) {
-          this.getVoiceDeatil();
+          newval == "视频" && this.activityVideoDeatil();
+          newval == "音频" && this.getVoiceDeatil();
+        }
+      },
+    },
+    "playDetailsList.AskserieVideoId": {
+      handler(newval) {
+        if (newval) {
+          this.askserieVideoHistoryList();
         }
       },
     },
@@ -90,7 +91,7 @@ export default {
       }
     },
     async getVoiceDeatil() {
-      const res = await raiVideoApi.voiceDeatil({ VoiceId: this.playDetailsList.ActivityVoiceId });
+      const res = await raiVideoApi.voiceDeatil({ VideoId: this.playDetailsList.VideoId });
       if (res.Ret === 200) {
         this.dataList = res.Data || [];
       }
@@ -101,9 +102,15 @@ export default {
         this.dataList = res.Data || [];
       }
     },
+    async askserieVideoHistoryList() {
+      const res = await raiVideoApi.askserie_videoHistory_list({ AskserieVideoId: this.playDetailsList.AskserieVideoId });
+      if (res.Ret === 200) {
+        this.dataList = res.Data.List || [];
+      }
+    },
     handleRowContent(row, key) {
       if (key == "PlaySeconds") {
-        if (!row[key] || row[key] == 0) return "";
+        if (!row[key] || row[key] == 0) return '--';
         let m = parseInt(row[key] / 60);
         let s = parseInt(row[key] % 60);
         let ms = `${m > 9 ? m : "0" + m}分${s > 9 ? s : "0" + s}秒`;

+ 297 - 0
src/views/rai_manage/activityManage/roadShow/components/releaseAudio.vue

@@ -0,0 +1,297 @@
+<template>
+  <div class="container add-edit-release-audio">
+    <el-dialog
+      v-dialogDrag
+      :close-on-click-modal="false"
+      :modal-append-to-body="false"
+      center
+      width="568px"
+      :title="dlgTitle"
+      :visible.sync="addEditdialogReleaseAudio"
+      customClass="add-edit-video-dlg"
+      :before-close="cancelHandle"
+    >
+      <div>
+        <el-form :model="addEditAudio" :rules="rules" ref="ruleFormAudio" class="demo-ruleForm">
+          <el-form-item prop="audioName">
+            <div style="display: flex; justify-content: space-between">
+              <el-input style="width: 75%" clearable placeholder="请上传音频" v-model="addEditAudio.audioName"></el-input>
+              <el-upload class="upload-demo" action="" :show-file-list="false" :http-request="handleUploadAudio" accept="audio/*" :file-list="fileListAudio">
+                <el-button type="primary" :loading="startUpload">上传音频</el-button>
+              </el-upload>
+              <el-progress type="circle" :percentage="percentage" width="40" style="margin-left: 10px" v-if="startUpload"></el-progress>
+            </div>
+          </el-form-item>
+          <el-form-item prop="industryId">
+            <el-select style="width: 100%" placeholder="请选择行业" v-model="addEditAudio.industryId" clearable @change="selectChangeHandle">
+              <el-option
+                v-for="item in chartPermissionList.filter((item) => item.PermissionName != '宏观' && item.PermissionName != '策略' && item.PermissionName != '买方研选')"
+                :label="item.PermissionName"
+                :key="item.ChartPermissionId"
+                :value="item.ChartPermissionId"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <el-select v-model="addEditAudio.property" multiple placeholder="请选择产业(可多选)" clearable filterable style="width: 100%" @focus="industrySelectFocus">
+              <el-option :label="item.PermissionName" :value="item.ChartPermissionId" v-for="item in selectedIndustryArr" :key="item.ChartPermissionId"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div class="cover-content" style="margin: 10px 0" v-if="this.addEditAudio.industryId && defaultImage">
+        <span class="text" style="width: 46px; text-align: right">封面:</span>
+        <div class="img-content">
+          <img :src="defaultImage" alt="" />
+          <div class="modify" @click="modifyImgHandler">修改</div>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="confirmSubmit(1)">确定</el-button>
+        <el-button @click="cancelHandle">取消</el-button>
+      </span>
+    </el-dialog>
+    <modify-img-dlg :modifyImgVisible.sync="modifyImgVisible" :videoAndVoiceList.sync="videoAndVoiceList" />
+  </div>
+</template>
+
+<script>
+import { raiInterface, resourceVoiceupload, raiVideoApi } from "@/api/api.js";
+import ModifyImgDlg from "../../components/addComopnents/modifyImgDlg.vue";
+export default {
+  name: "",
+  components: { ModifyImgDlg },
+  props: {
+    addEditdialogReleaseAudio: {
+      type: Boolean,
+      default: false,
+    },
+    chartPermissionList: {
+      type: Array,
+      default: [],
+    },
+    playDetailsList: {
+      default: {},
+      type: Object,
+    },
+  },
+  watch: {
+    "playDetailsList.AskserieVideoId": {
+      handler(newVal) {
+        newVal && newVal > 0 && this.askserieVideoDetail();
+      },
+      deep: true,
+      immediate: true,
+    },
+  },
+  data() {
+    return {
+      addEditAudio: {
+        audioName: "", //音频名称
+        industryId: "", //行业id
+        property: "", //产业名称
+        audioUrl: "", //视频链接
+        AudioSeconds: "", //时长
+      },
+      rules: {
+        // audioName: [{ required: true, message: "请上传音频", trigger: "blur" }],
+        industryId: [{ required: true, message: "请选择行业", trigger: "change" }],
+      },
+      industryArr: [],
+      selectedIndustryArr: [],
+      percentage: 0,
+      startUpload: false, //开始上传
+      fileListAudio: [],
+      videoAndVoiceList: [],
+      defaultImage: [],
+      modifyImgVisible: false,
+      defaultImage: "",
+      shareImg: "",
+      dlgTitle: "发布问答",
+    };
+  },
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {
+    /* 获取全部的行业 前的判断 */
+    industrySelectFocus() {
+      if (!this.addEditAudio.industryId) {
+        this.$message.error("请先选择行业");
+      }
+    },
+    // 行业更改
+    selectChangeHandle(value) {
+      this.addEditAudio.property = "";
+      value ? this.getIndustry(value) : (this.selectedIndustryArr = []);
+      value && this.getVideoAndImg();
+    },
+    /* 获取选择的行业 */
+    getIndustry(industryId) {
+      if (this.industryArr.length) {
+        this.selectedIndustryArr = this.industryArr.filter((item) => item.ChartPermissionId == industryId)[0].List;
+        return;
+      }
+      raiInterface.getListIndustrial().then((res) => {
+        if (res.Ret === 200) {
+          this.industryArr = res.Data.List || [];
+          this.selectedIndustryArr = this.industryArr.filter((item) => item.ChartPermissionId == industryId)[0].List;
+        }
+      });
+    },
+    //保存或发布
+    confirmSubmit(type) {
+      this.$refs.ruleFormAudio.validate(async (valid) => {
+        if (valid) {
+          if (!this.fileListAudio[0].url) return this.$message.error("请上传音频");
+          if (!this.addEditAudio.audioName) return this.$message.error("请输入音频名称");
+          let ChartPermissionName = "";
+          this.chartPermissionList.forEach((item) => {
+            if (item.ChartPermissionId == this.addEditAudio.industryId) {
+              ChartPermissionName = item.PermissionName;
+            }
+          });
+          const res = await raiVideoApi.askseriePreserveAndEdit({
+            AskserieVideoId: this.playDetailsList.AskserieVideoId ? this.playDetailsList.AskserieVideoId : 0,
+            VideoName: this.addEditAudio.audioName,
+            ChartPermissionId: this.addEditAudio.industryId,
+            ChartPermissionName,
+            IndustrialManagementIds: this.addEditAudio.property ? this.addEditAudio.property.join(",") : "",
+            VideoUrl: this.addEditAudio.audioUrl,
+            VideoDuration: this.addEditAudio.AudioSeconds + "",
+            BackgroundImg: this.defaultImage,
+            ShareImg: this.shareImg,
+          });
+          if (res.Ret === 200) {
+            this.$message.success("添加成功");
+            this.cancelHandle();
+            this.$parent.getVideoList();
+          }
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+    // 上传音频
+    async handleUploadAudio(e) {
+      this.startUpload = true;
+      let form = new FormData();
+      form.append("file", e.file);
+      const res = await resourceVoiceupload(form);
+      if (res.Ret === 200) {
+        let obj = {
+          name: res.Data.ResourceName,
+          url: res.Data.ResourceUrl,
+          PlaySeconds: res.Data.PlaySeconds,
+        };
+        this.addEditAudio.audioName = res.Data.ResourceName; //音频名称
+        this.addEditAudio.audioUrl = res.Data.ResourceUrl; //视频链接
+        this.addEditAudio.AudioSeconds = res.Data.PlaySeconds; //时长
+        this.fileListAudio = [obj];
+      }
+      this.startUpload = false;
+    },
+    // 封面图
+    async getVideoAndImg(isOne = "") {
+      const res = await raiInterface.video_and_voiceImgActivityVideo({
+        ChartPermissionId: this.addEditAudio.industryId,
+      });
+      if (res.Ret === 200) {
+        isOne == "修改" ? "" : ((this.defaultImage = res.Data.List[0].ImgUrl), (this.shareImg = res.Data.List[0].ShareImg));
+        this.videoAndVoiceList = res.Data.List;
+      }
+    },
+    // 点击修改图片的弹框
+    modifyImgHandler() {
+      this.getVideoAndImg("修改");
+      this.modifyImgVisible = true;
+    },
+    cancelHandle() {
+      this.$refs.ruleFormAudio.resetFields();
+      this.addEditAudio = {
+        audioName: "", //音频名称
+        industryId: "", //行业id
+        property: "", //产业名称
+        audioUrl: "", //视频链接
+        AudioSeconds: "", //时长
+      };
+      this.fileListAudio = [];
+      this.defaultImage = "";
+      this.shareImg = "";
+      this.dlgTitle = "发布问答";
+      this.$emit("update:addEditdialogReleaseAudio", false);
+      this.$emit("update:playDetailsList", {});
+    },
+    // 获取详情
+    async askserieVideoDetail() {
+      const res = await raiVideoApi.askserieVideoDetail({
+        AskserieVideoId: this.playDetailsList.AskserieVideoId,
+      });
+      if (res.Ret === 200) {
+        this.dlgTitle = "编辑";
+        let { Detail } = res.Data;
+        this.getIndustry(Detail.ChartPermissionId);
+        let str = [];
+        Detail.ListIndustrial &&
+          Detail.ListIndustrial.forEach((item) => {
+            str.push(item.IndustrialManagementId);
+          });
+        this.addEditAudio = {
+          audioName: Detail.VideoName, //音频名称
+          industryId: Detail.ChartPermissionId, //行业id
+          property: str, //产业名称
+          audioUrl: Detail.VideoUrl, //视频链接
+          AudioSeconds: Detail.VideoDuration, //时长
+        };
+        this.defaultImage = Detail.BackgroundImg;
+        this.shareImg = Detail.ShareImg;
+        let obj = {
+          name: Detail.VideoName,
+          url: Detail.VideoUrl,
+          PlaySeconds: Detail.VideoDuration,
+        };
+        this.fileListAudio = [obj];
+      }
+    },
+  },
+};
+</script>
+<style lang="scss">
+.add-edit-release-audio {
+  .add-edit-video-dlg {
+    .el-input {
+      width: 100%;
+    }
+  }
+}
+</style>
+<style lang="scss" scoped>
+.add-edit-release-audio {
+  display: flex;
+  justify-content: space-between;
+  .cover-content {
+    display: flex;
+    // align-items: stretch;
+    // vertical-align: bottom;
+    .img-content {
+      position: relative;
+      height: 200px;
+      width: 200px;
+      border: 1px solid #ccc;
+      img {
+        width: 100%;
+        height: 100%;
+      }
+    }
+    .modify {
+      position: absolute;
+      bottom: 0;
+      right: -50px;
+      height: 20px;
+      cursor: pointer;
+      color: #409eff;
+    }
+  }
+}
+</style>

+ 56 - 42
src/views/rai_manage/activityManage/roadShow/tableTabs.js

@@ -1,6 +1,6 @@
 //表格列
 export const tableColums = (type) => {
-  return type === 1
+  return type === 1 || type === 2
     ? [
         {
           label: "文件名称",
@@ -8,31 +8,32 @@ export const tableColums = (type) => {
           widthsty: 300,
         },
         {
-          label: "行业",
-          key: "ChartPermissionName",
+          label: "文件类型",
+          key: "FileName",
           widthsty: 90,
         },
         {
-          label: "产业",
-          key: "IndustryName",
+          label: "行业",
+          key: "ChartPermissionName",
+          widthsty: 90,
         },
         {
-          label: "发布状态",
-          key: "PublishStatus",
-          widthsty: 90,
+          label: "活动类型",
+          key: "ActivityTypeName",
+          minwidthsty: "110",
         },
         {
-          label: "发布时间",
-          key: "PublishDate",
-          widthsty: 160,
+          label: "活动标签",
+          key: "Label",
+          minwidthsty: "120",
         },
         {
-          label: "更新时间",
-          key: "ModifyDate",
-          widthsty: 160,
+          label: "活动时间",
+          key: "ActivityTimeText",
+          minwidthsty: "200",
         },
         {
-          label: "视频时长",
+          label: "时长",
           key: "VideoDuration",
           widthsty: 100,
         },
@@ -47,7 +48,7 @@ export const tableColums = (type) => {
           widthsty: 100,
         },
       ]
-    : type === 2
+    : type === 3
     ? [
         {
           label: "文件名称",
@@ -60,22 +61,26 @@ export const tableColums = (type) => {
           widthsty: 90,
         },
         {
-          label: "活动类型",
-          key: "ActivityTypeName",
-          minwidthsty: "110",
+          label: "产业",
+          key: "IndustryName",
         },
         {
-          label: "活动标签",
-          key: "Label",
-          minwidthsty: "120",
+          label: "发布状态",
+          key: "PublishStatus",
+          widthsty: 90,
         },
         {
-          label: "活动时间",
-          key: "ActivityTimeText",
-          minwidthsty: "200",
+          label: "发布时间",
+          key: "PublishDate",
+          widthsty: 160,
+        },
+        {
+          label: "更新时间",
+          key: "ModifyDate",
+          widthsty: 160,
         },
         {
-          label: "视频时长",
+          label: "时长",
           key: "VideoDuration",
           widthsty: 100,
         },
@@ -93,7 +98,7 @@ export const tableColums = (type) => {
     : [
         {
           label: "文件名称",
-          key: "VoiceName",
+          key: "VideoName",
           widthsty: 300,
         },
         {
@@ -102,28 +107,32 @@ export const tableColums = (type) => {
           widthsty: 90,
         },
         {
-          label: "活动类型",
-          key: "ActivityTypeName",
-          minwidthsty: "110",
+          label: "产业",
+          key: "IndustryName",
         },
         {
-          label: "活动标签",
-          key: "Label",
-          minwidthsty: "120",
+          label: "发布状态",
+          key: "PublishStatus",
+          widthsty: 90,
         },
         {
-          label: "活动时间",
-          key: "ActivityTimeText",
-          minwidthsty: "200",
+          label: "发布时间",
+          key: "PublishDate",
+          widthsty: 160,
         },
         {
-          label: "音频时长",
-          key: "VoicePlaySeconds",
+          label: "更新时间",
+          key: "ModifyDate",
+          widthsty: 160,
+        },
+        {
+          label: "时长",
+          key: "VideoDuration",
           widthsty: 100,
         },
         {
           label: "播放量",
-          key: "VoiceCounts",
+          key: "VideoCounts",
           widthsty: 100,
         },
         {
@@ -159,9 +168,14 @@ export const PalyTable = [
     label: "播放时长",
     key: "PlaySeconds",
   },
+  {
+    label: "播放来源",
+    key: "RegisterPlatform",
+  },
 ];
 export const TopTabs = [
-  { name: "活动视频", value: 2 },
-  { name: "活动音频", value: 3 },
-  { name: "产业视频", value: 1 },
+  { name: "路演回放", value: 1 },
+  { name: "调研反馈", value: 2 },
+  { name: "问答系列", value: 3 },
+  { name: "产业视频", value: 4 },
 ];

+ 49 - 21
src/views/rai_manage/activityManage/roadShowList.vue

@@ -16,17 +16,26 @@
           <el-select style="margin-bottom: 20px" placeholder="行业" v-model="chartPermissionId" clearable @change="selectChangeHandle">
             <el-option v-for="item in chartPermissionList" :label="item.PermissionName" :key="item.ChartPermissionId" :value="item.ChartPermissionId"></el-option>
           </el-select>
-          <el-select v-if="tabActive != 1" placeholder="活动类型" clearable v-model="cactivityTypeVal" @change="selectChangeHandle">
+          <el-select v-if="tabActive == 1 || tabActive == 2" placeholder="活动类型" clearable v-model="cactivityTypeVal" @change="selectChangeHandle">
             <el-option v-for="item in cactivityTypeList" :label="item.ActivityTypeName" :key="item.ActivityTypeId" :value="item.ActivityTypeId"></el-option>
           </el-select>
-          <date-picker style="margin-bottom: 20px" v-model="issueTime" type="date" range :placeholder="tabActive == 1 ? '发布时间' : '活动时间'" value-type="format" @change="selectChangeHandle">
+          <date-picker
+            style="margin-bottom: 20px"
+            v-model="issueTime"
+            type="date"
+            range
+            :placeholder="tabActive == 4 || tabActive == 3 ? '发布时间' : '活动时间'"
+            value-type="format"
+            @change="selectChangeHandle"
+          >
           </date-picker>
-          <el-select v-if="tabActive == 1" placeholder="发布状态" clearable v-model="publishStatus" @change="selectChangeHandle" style="margin-bottom: 20px">
+          <el-select v-if="tabActive == 4 || tabActive == 3" placeholder="发布状态" clearable v-model="publishStatus" @change="selectChangeHandle" style="margin-bottom: 20px">
             <el-option v-for="item in publishSelect" :label="item.name" :key="item.value" :value="item.value"></el-option>
           </el-select>
         </div>
         <div>
-          <el-button type="primary" v-if="tabActive === 1" @click="addEditdialogVisib = true">添加视频</el-button>
+          <el-button type="primary" v-if="tabActive === 4" @click="addEditdialogVisib = true">添加视频</el-button>
+          <el-button type="primary" v-if="tabActive === 3" @click="addEditdialogReleaseAudio = true">发布问答</el-button>
         </div>
       </div>
       <el-table :data="dataList" style="width: 100%" border @sort-change="sortChangeHandle">
@@ -45,7 +54,7 @@
         >
         <el-table-column align="center" prop="LastUpdatedTime" width="170" label="操作">
           <template slot-scope="{ row }">
-            <div v-if="tabActive === 1">
+            <div v-if="tabActive === 4 || tabActive === 3">
               <span class="editsty" @click="handlePublish(row)">{{ row.PublishStatus == 1 ? "取消发布" : "发布" }}</span>
               &nbsp;&nbsp;
               <span class="editsty" @click="handleEditVideo(row, '产业')">编辑</span>
@@ -66,6 +75,7 @@
     <addVideoDlg :addEditdialogVisib.sync="addEditdialogVisib" :chartPermissionList="chartPermissionList" :playDetailsList.sync="editDetails" />
     <atc-particulars :dialogVisible.sync="dialogVisible" :detailData.sync="detailData" />
     <generation-ask :generaitondialogVisib.sync="generaitondialogVisib" :generaitonId="generaitonId" :generaitonType="generaitonType" :tabActiveRoadshow="tabActive" />
+    <release-audio :addEditdialogReleaseAudio.sync="addEditdialogReleaseAudio" :chartPermissionList="chartPermissionList" :playDetailsList.sync="editDetails" />
   </div>
 </template>
 
@@ -79,16 +89,17 @@ import addVideoDlg from "./roadShow/components/addVideoDlg.vue";
 import moment from "moment";
 import AtcParticulars from "../components/atcParticulars.vue";
 import GenerationAsk from "../components/generationAsk.vue";
+import ReleaseAudio from "./roadShow/components/releaseAudio.vue";
 
 export default {
   name: "",
-  components: { mPage, playDetails, addVideoDlg, AtcParticulars, GenerationAsk },
+  components: { mPage, playDetails, addVideoDlg, AtcParticulars, GenerationAsk, ReleaseAudio },
   props: {},
   data() {
     return {
       tableColums: [],
       dataList: [],
-      tabActive: 2, //tabs 选中
+      tabActive: 1, //tabs 选中
       chartPermissionList: [], //行业的数组
       chartPermissionId: "", //行业的id
       issueTime: "", //活动时间
@@ -109,6 +120,7 @@ export default {
       generaitondialogVisib: false, //代问的弹框
       generaitonId: "",
       generaitonType: "微路演",
+      addEditdialogReleaseAudio: false,
     };
   },
   computed: {
@@ -162,7 +174,7 @@ export default {
       }
     },
     async getVideoList() {
-      let SortParam = this.sortType && this.tabActive == 1 ? "videoCounts" : this.sortType && this.tabActive == 2 ? "voiceCounts" : "";
+      // let SortParam = this.sortType && this.tabActive == 4 ? "videoCounts" : this.sortType && this.tabActive == 1 ? "voiceCounts" : "";
       let params = {
         PageSize: this.PageSize,
         CurrentIndex: this.page_no,
@@ -173,9 +185,17 @@ export default {
         ChartPermissionId: this.chartPermissionId,
         ActivityTypeId: this.cactivityTypeVal,
         SortType: this.sortType,
-        SortParam,
+        SortParam: "videoCounts",
+        SearchType: this.tabActive,
       };
-      const res = this.tabActive == 1 ? await raiVideoApi.videoList(params) : this.tabActive == 2 ? await raiVideoApi.getActivityVideo(params) : await raiVideoApi.voiceList(params);
+      const res =
+        this.tabActive == 4
+          ? await raiVideoApi.videoList(params)
+          : this.tabActive == 1
+          ? await raiVideoApi.activityVoiceAndVideoList(params)
+          : this.tabActive == 3
+          ? await raiVideoApi.askserie_videoList(params)
+          : await raiVideoApi.activityVoiceAndVideoList(params);
       if (res.Ret === 200) {
         this.dataList = res.Data.List;
         this.total = res.Data.Paging.Totals;
@@ -196,7 +216,6 @@ export default {
     },
     /* 点击表格的排序 */
     sortChangeHandle({ prop, order }) {
-      console.log(order);
       this.sortType = order == "ascending" ? "asc" : order == "descending" ? "desc" : "";
       this.getVideoList();
     },
@@ -210,7 +229,7 @@ export default {
     */
     handleRowContent(row, key) {
       if (key == "PublishStatus") {
-        let status = row["PublishStatus"] == 1 ? "已发布" : "未发布";
+        let status = row["PublishStatus"] == 1 ? "已发布" : row["PublishStatus"] == 3 ? "已取消" : "未发布";
         return status;
       } else if (key == "VideoDuration" || key == "VoicePlaySeconds") {
         let m = parseInt(row[key] / 60);
@@ -235,10 +254,8 @@ export default {
         this.playDetailsVisible = true;
         this.playDetailsList = row;
       } else if (key == "CommentNum") {
-        console.log(row);
-        //点击代问的弹框
         this.generaitondialogVisib = true;
-        this.generaitonId = this.tabActive == 3 ? row.ActivityId : row.VideoId;
+        this.generaitonId = this.tabActive == 1 || this.tabActive == 2 ? row.ActivityId : this.tabActive == 3 ? row.AskserieVideoId : row.VideoId;
       }
     },
     /*
@@ -255,16 +272,23 @@ export default {
     },
     //发布或者取消发布
     handlePublish(item) {
-      this.$confirm(item.PublishStatus == 1 ? "确认取消发布该视频吗?" : "确认发布该视频吗?", "提示", {
+      let str = this.tabActive == 3 ? "音频" : "视频";
+      this.$confirm(item.PublishStatus == 1 ? `确认取消发布该${str}吗?` : `确认发布该${str}吗?`, "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
         type: "warning",
       })
         .then(async () => {
-          const res = await raiVideoApi.videoPublish({
-            VideoId: item.VideoId,
-            PublishOrCancle: item.PublishStatus == 1 ? 0 : 1,
-          });
+          const res =
+            this.tabActive == 3
+              ? await raiVideoApi.askseriePublishAndcancel({
+                  AskserieVideoId: item.AskserieVideoId,
+                  PublishOrCancle: item.PublishStatus == 1 ? 0 : 1,
+                })
+              : await raiVideoApi.videoPublish({
+                  VideoId: item.VideoId,
+                  PublishOrCancle: item.PublishStatus == 1 ? 0 : 1,
+                });
           if (res.Ret === 200) {
             this.$message.success("操作成功!");
             this.getVideoList();
@@ -289,7 +313,11 @@ export default {
         });
       } else {
         this.editDetails = item;
-        this.addEditdialogVisib = true;
+        if (this.tabActive == 3) {
+          this.addEditdialogReleaseAudio = true;
+        } else {
+          this.addEditdialogVisib = true;
+        }
       }
     },
   },

+ 13 - 8
src/views/rai_manage/components/addSummary.vue

@@ -80,7 +80,7 @@
           </div>
         </el-form-item>
         <el-form-item class="form-item-bootm">
-          <div style="color:#f00;font-size: 16px;" v-if="isSource !== 'HZ'">*报告发布前,请在核心观点/核心结论下加分割线</div>
+          <div style="color: #f00; font-size: 16px" v-if="isSource !== 'HZ'">*报告发布前,请在核心观点/核心结论下加分割线</div>
           <el-button type="primary" @click="submitForm('预览')">预览</el-button>
           <el-button type="primary" @click="submitForm('保存')">保存</el-button>
           <el-button type="primary" @click="submitForm('发布')" v-if="isShowStatus">发布</el-button>
@@ -136,11 +136,11 @@ import VueFroala from "vue-froala-wysiwyg";
 import Clipboard from "clipboard";
 import chartDialogVue from "../../dataEntry_manage/components/chartDialog.vue";
 import AddIndustryMark from "../components/addIndustryMark.vue";
-import RichTextMixins from"./reportComponents/RichTextMixins"
+import RichTextMixins from "./reportComponents/RichTextMixins";
 export default {
   name: "",
   components: { AddIndustryMark },
-  mixins:[RichTextMixins],
+  mixins: [RichTextMixins],
   data() {
     var that = this;
     return {
@@ -294,9 +294,14 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`,
           ChartPermissionId: this.addOfEditForm.industry,
         };
         if (type == "预览") {
-          sessionStorage.setItem("summaryPre", JSON.stringify(params));
-          let { href } = this.$router.resolve({ name: "预览研选报告" });
-          window.open(href, "_blank");
+          if (!this.isShowStatus) {
+            let href = `${process.env.CYGX_WEB}/material/info/${this.$route.query.id}`;
+            window.open(href, "_blank");
+          } else {
+            sessionStorage.setItem("summaryPre", JSON.stringify(params));
+            let { href } = this.$router.resolve({ name: "预览研选报告" });
+            window.open(href, "_blank");
+          }
           return;
         } else {
           const res = this.isSource === "HZ" ? await raiInterface.reportPreserveAndPublish(params) : await raiInterface.preserveAndPublish(params);
@@ -391,10 +396,10 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`,
     industrySelectFocus(value) {
       if (!value) return;
       if (this.addOfEditForm.industry || this.addOfEditForm.regions) {
-        this.getIndustry()
+        this.getIndustry();
       } else {
         this.industryArr = [];
-        this.$message.error(this.isSource === 'HZ' ? "请先选择行业" :'请先选择报告类型');
+        this.$message.error(this.isSource === "HZ" ? "请先选择行业" : "请先选择报告类型");
       }
     },
     //添加标的的点击事件

+ 9 - 9
src/views/rai_manage/components/generationAsk.vue

@@ -60,11 +60,11 @@ export default {
       } else if (this.generaitonType == "报名") {
         url = "/cygx/activitySignup/askListExport?ActivityId=";
       } else if (this.generaitonType == "微路演") {
-        this.tabActiveRoadshow == 1
+        this.tabActiveRoadshow == 4
           ? (url = "/cygx/microRoadshow/commentListExport/video?VideoId=")
-          : this.tabActiveRoadshow == 2
-          ? (url = "/cygx/activityVideo/commnetListExport?VideoId=")
-          : (url = "/cygx/microRoadshow/commentListExport/voice?ActivityId=");
+          : this.tabActiveRoadshow == 3
+          ? (url = "/cygx/askserie_video/collection_list?IsExport=true&AskserieVideoId=")
+          : (url = "/cygx/activity_voice_and_video/commentList?IsExport=true&ActivityId=");
       } else {
         url = "/cygx/summaryManage/commentListExport?ArticleId=";
       }
@@ -136,15 +136,15 @@ export default {
     //微路演
     async getRoadshowList() {
       const res =
-        this.tabActiveRoadshow == 1
+        this.tabActiveRoadshow == 4
           ? await raiVideoApi.getMicroRoadshowVideo({
               VideoId: this.generaitonId,
             })
-          : this.tabActiveRoadshow == 2
-          ? await raiVideoApi.getMicroRoadshowVoice({
-              VideoId: this.generaitonId,
+          : this.tabActiveRoadshow == 3
+          ? await raiVideoApi.askserieVideoCollectionList({
+              AskserieVideoId: this.generaitonId,
             })
-          : await raiVideoApi.getMicroRoadshowCommentList({
+          : await raiVideoApi.activityVoiceAndVideoCommentList({
               ActivityId: this.generaitonId,
             });
 

+ 24 - 25
src/views/rai_manage/components/report_preview/summaryPre.vue

@@ -14,7 +14,12 @@
         </div>
       </div>
       <div class="report-disclaimer">注:请务必阅读<span @click="showDisclaimer">免责声明</span></div>
-      <div class="report-abstract">摘要:{{ reportInfo.Abstract }}</div>
+      <div class="report-abstract">
+        <div>摘要:</div>
+        <div>
+          {{ reportInfo.Abstract }}
+        </div>
+      </div>
       <div class="report-content-item">
         <div class="report-content" id="report-content" v-html="reportInfo.Body"></div>
       </div>
@@ -71,15 +76,16 @@ export default {
     display: flex;
     align-items: center;
     .report-author-name {
-        margin-right: 30px;
-        margin-bottom: 0px !important;
+      margin-right: 30px;
+      margin-bottom: 0px !important;
     }
   }
   .report-title {
     font-style: normal;
     font-weight: bold;
-    font-size: 18px;
+    font-size: 30px;
     color: #333333;
+    font-weight: 600;
     margin-bottom: 10px;
   }
   .report-author-box {
@@ -101,16 +107,17 @@ export default {
     .report-publishTime {
       font-style: normal;
       font-weight: 400;
-      font-size: 16px;
-      color: #999999;
+      font-size: 12px;
+      color: #b3b3b3;
     }
   }
   .report-disclaimer {
     font-style: normal;
     font-weight: 400;
-    font-size: 16px;
+    font-size: 14px;
     line-height: 22px;
     color: #999999;
+    margin: 15px 0;
     span {
       color: #3385ff;
       cursor: pointer;
@@ -118,27 +125,19 @@ export default {
     }
   }
   .report-abstract {
-    font-style: normal;
-    font-weight: 400;
-    font-size: 16px;
-    color: #666666;
-    padding: 12px 0;
-    text-indent: 14px;
-    word-break: break-all;
-    position: relative;
-    border-bottom: 1px dashed #dcdfe6;
-    &:before {
-      content: "";
-      height: 20px;
-      width: 4px;
-      background-color: #3385ff;
-      position: absolute;
-      left: 0;
-      top: 12px;
+    border-left: 3px solid #001529;
+    padding-left: 12px;
+    :nth-child(1){
+      margin-bottom: 0.6em;
+      font-size: 20px;
+      color: #000;
+      font-style: italic;
     }
   }
   .report-content-item {
-    margin-top: 10px;
+    margin-top: 20px;
+    padding-top: 20px;
+    border-top: 1px solid #f0f0f0;
   }
   .deeperReport {
     width: 128px;

+ 175 - 0
src/views/rai_manage/cygxManage/components/lableDlg.vue

@@ -0,0 +1,175 @@
+<template>
+  <div class="container lable-add-content">
+    <el-dialog :title="visibleTitle" :visible.sync="showRegularDlg" width="600px" v-dialogDrag :close-on-click-modal="false" :modal-append-to-body="false" center @close="handleClose">
+      <div v-if="dataRegular.TagType == 1">
+        <div v-for="(item, index) in addDataList" :key="index" class="add-name-item">
+          <el-autocomplete style="width: 90%" v-model="item.name" clearable :fetch-suggestions="querySearchAsync" @select="tableSelectHandel(item)" placeholder="请输入内容"></el-autocomplete>
+          <img style="width: 20px; height: 20px" @click="deleteChildren(index)" src="~@/assets/img/icons/delete-Item.png" />
+        </div>
+        <div style="display: flex; align-items: center; cursor: pointer; width: 100px" @click="addActivityNameHandler">
+          <img style="width: 20px; height: 20px; margin-right: 10px" src="~@/assets/img/document_m/add-label.png" />
+          添加活动
+        </div>
+      </div>
+      <div class="text-content" v-else>{{ visibleText }}</div>
+      <span slot="footer" class="dialog-footer">
+        <template v-if="dataRegular.TagType == 1">
+          <el-button @click="handleClose">取 消</el-button>
+          <el-button type="primary" @click="addBannerHandler">确 定</el-button>
+        </template>
+        <el-button v-else type="primary" @click="handleClose">关闭</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { raiInterface } from "@/api/api.js";
+
+export default {
+  name: "",
+  components: {},
+  props: {
+    showRegularDlg: {
+      type: Boolean,
+      default: false,
+    },
+    dataRegular: {
+      type: Object,
+      default: {},
+    },
+  },
+  data() {
+    return {
+      querySearchList: [],
+      addDataList: [],
+    };
+  },
+  computed: {
+    visibleTitle() {
+      return this.dataRegular.TagName || "";
+    },
+    visibleText() {
+      let str =
+        this.dataRegular.TagType == 2
+          ? "所有【海外】的活动,和报告类型为【海外研究】的报告"
+          : this.dataRegular.TagType == 3
+          ? "所有路演回放音视频"
+          : this.dataRegular.TagType == 4
+          ? "所有问答系列音频"
+          : "";
+      return str;
+    },
+  },
+  watch: {
+    showRegularDlg: {
+      handler(newVal) {
+        if (newVal) {
+          newVal && this.getInitList();
+        }
+      },
+    },
+  },
+  created() {},
+  async mounted() {},
+  methods: {
+    handleClose() {
+      this.querySearchList = [];
+      this.addDataList = [];
+      this.$emit("update:showRegularDlg", false);
+      this.$emit("update:dataRegular", {});
+    },
+    async addBannerHandler() {
+      let isOk = this.addDataList.every((item) => item.name !== "");
+      if (isOk) {
+        let arr = [];
+        this.addDataList.forEach((_) => {
+          arr.push(_.id);
+        });
+        const res = await raiInterface.tagHot_activityListUpdate({
+          ActivityIds: arr,
+        });
+        if (res.Ret === 200) {
+          this.$message.success("保存成功");
+          this.handleClose();
+        }
+      } else {
+        this.$message.error("活动名称不能为空");
+      }
+    },
+    // 删除
+    deleteChildren(index) {
+      this.addDataList.splice(index, 1);
+    },
+    async querySearchAsync(query, cb) {
+      cb([]);
+      if (query) {
+        const res = await raiInterface.tagHot_activityList({ KeyWord: query });
+        if (res.Ret === 200) {
+          console.log(res);
+          this.querySearchList = res.Data.List.map((_) => {
+            return {
+              ..._,
+              value: _.ActivityName + "," + _.ActivityTime,
+            };
+          });
+          cb(this.querySearchList);
+        }
+      }
+    },
+    addActivityNameHandler() {
+      this.addDataList.push({
+        name: "",
+        id: "",
+      });
+    },
+    tableSelectHandel(item) {
+      this.querySearchList.forEach((_) => {
+        if (_.value === item.name) {
+          item.id = _.ActivityId;
+        }
+      });
+    },
+    async getInitList() {
+      const res = await raiInterface.tagHot_activityList();
+      if (res.Ret === 200 && res.Data.List.length > 0) {
+        res.Data.List.forEach((item) => {
+          this.addDataList.push({
+            name: item.ActivityName + "," + item.ActivityTime,
+            id: item.ActivityId,
+          });
+        });
+      }
+    },
+  },
+};
+</script>
+<style lang="scss">
+.lable-add-content {
+  .add-name-item {
+    display: flex;
+    align-items: center;
+    margin-bottom: 20px;
+    .el-input {
+      width: 100% !important;
+    }
+    img {
+      margin-left: 20px;
+    }
+  }
+}
+</style>
+<style scoped lang="scss">
+.lable-add-content {
+  .text-content {
+    width: 487px;
+    height: 40px;
+    line-height: 40px;
+    border-radius: 4px;
+    border: 1px solid #dcdfe6;
+    padding-left: 12px;
+    color: #c0c4cc;
+    margin: 0 auto 50px;
+  }
+}
+</style>

+ 49 - 5
src/views/rai_manage/cygxManage/lableManage.vue

@@ -2,13 +2,21 @@
   <div class="container lable-manage-page">
     <el-card style="overflow: hidden">
       <div class="top-comtent">
-        <span>当前标签</span>
+        <div>
+          <span>当前标签</span>
+          <span>自定义标签</span>
+          <span>固定标签</span>
+        </div>
         <el-button type="primary" @click="addOfEitdHandler('添加')">添加标签</el-button>
       </div>
       <div ref="lableSortable" class="lable-content">
-        <div class="lable-item" v-for="item in lableList" :key="item.TagId">
+        <div :class="['lable-item', item.TagType > 0 && 'regular-lable']" v-for="item in lableList" :key="item.TagId">
           <div class="text_oneLine">{{ item.TagName }}</div>
-          <div class="lable-img">
+          <div class="lable-img" v-if="item.TagType">
+            <img src="~@/assets/img/rai_m/edit_icon_GuDing.png" alt="" @click="addOfEitdHandler('编辑', item)" />
+            <img src="~@/assets/img/rai_m/remove_below_GuDing.png" alt="" @click="lableButtonHandel('撤下', item)" />
+          </div>
+          <div class="lable-img" v-else>
             <img src="~@/assets/img/rai_m/edit_icon.png" alt="" @click="addOfEitdHandler('编辑', item)" />
             <img src="~@/assets/img/rai_m/remove_below.png" alt="" @click="lableButtonHandel('撤下', item)" />
           </div>
@@ -112,6 +120,7 @@
         </span>
       </el-dialog>
     </div>
+    <lable-dlg :showRegularDlg.sync="showRegularDlg" :dataRegular.sync="dataRegular" />
   </div>
 </template>
 
@@ -119,9 +128,10 @@
 import Sortable from "sortablejs";
 import mPage from "@/components/mPage.vue";
 import { raiInterface } from "@/api/api.js";
+import LableDlg from "./components/lableDlg.vue";
 export default {
   name: "",
-  components: { mPage },
+  components: { mPage, LableDlg },
   props: {},
   data() {
     return {
@@ -157,6 +167,8 @@ export default {
       optionsIndustries: [],
       optionsSubject: [],
       dlgTitle: "添加",
+      showRegularDlg: false,
+      dataRegular: {},
     };
   },
   computed: {},
@@ -192,7 +204,7 @@ export default {
     // 获取活动类型
     async activityType() {
       const res = await raiInterface.getActivityType({
-        IsGetAll:true,
+        IsGetAll: true,
       });
       if (res.Ret === 200) {
         this.optionsActivity = res.Data.List;
@@ -286,6 +298,11 @@ export default {
     },
     // 添加或者编辑标签
     addOfEitdHandler(type, item) {
+      if (item && item.TagType > 0) {
+        this.dataRegular = item;
+        this.showRegularDlg = true;
+        return;
+      }
       this.dlgTitle = type;
       if (item) {
         const { TagName, ArticleTypes, ActivityTypes, Industries, SubjectNames, TagId } = item;
@@ -393,6 +410,28 @@ export default {
     display: flex;
     align-items: center;
     justify-content: space-between;
+    div {
+      :nth-child(2),
+      :nth-child(3) {
+        font-size: 12px;
+        font-weight: 400;
+        text-align: center;
+        display: inline-block;
+        width: 80px;
+        height: 30px;
+        line-height: 30px;
+        background: #ecf5ff;
+        border: 1px solid #b3d8ff;
+        color: #409eff;
+        border-radius: 4px;
+        margin-left: 10px;
+      }
+      :nth-child(3) {
+        background-color: #fff8e4;
+        border: 1px solid #ffd9c2;
+        color: #e37318;
+      }
+    }
     span {
       font-weight: 500;
       font-size: 16px;
@@ -435,6 +474,11 @@ export default {
       border: 2px solid #409eff;
       overflow: hidden;
     }
+    .regular-lable {
+      background-color: #fff8e4 !important;
+      border: 1px solid #ffd9c2;
+      color: #e37318;
+    }
   }
   .pv-uv-download {
     display: flex;

+ 59 - 173
src/views/rai_manage/reportManage/appletsReport.vue

@@ -4,9 +4,7 @@
     <el-card class="top-card-box">
       <div class="top-card">
         <div>
-          <span v-for="item in tabsList" :key="item.index" :class="tabs_index == item.index ? 'tab_active' : ''" @click="tabActive(item)">{{
-            item.name
-          }}</span>
+          <span v-for="item in tabsList" :key="item.index" :class="tabs_index == item.index ? 'tab_active' : ''" @click="tabActive(item)">{{ item.name }}</span>
         </div>
         <div class="input-box">
           <el-input placeholder="请输入报告标题" v-model="listFrom.KeyWord" @input="listFromInput" clearable>
@@ -20,81 +18,27 @@
       <!-- 筛选条件 -->
       <div class="screen-box">
         <div style="flex: 1">
-          <el-select
-            style="margin-bottom: 20px"
-            placeholder="行业"
-            v-model="listFrom.ChartPermissionId"
-            @clear="clearSelect"
-            clearable
-            @change="listChangeBtn"
-          >
-            <el-option
-              v-for="item in chartPermissionList"
-              :label="item.PermissionName"
-              :key="item.ChartPermissionId"
-              :value="item.ChartPermissionId"
-            ></el-option>
+          <el-select style="margin-bottom: 20px" placeholder="行业" v-model="listFrom.ChartPermissionId" @clear="clearSelect" clearable @change="listChangeBtn">
+            <el-option v-for="item in chartPermissionList" :label="item.PermissionName" :key="item.ChartPermissionId" :value="item.ChartPermissionId"></el-option>
           </el-select>
           <el-select placeholder="系列" v-model="listFrom.SubCategoryName" @focus="reportMappingist" clearable @change="listChangeBtn">
             <el-option v-for="(item, index) in themeList" :label="item.SubCategoryName" :key="index" :value="item.SubCategoryName"></el-option>
           </el-select>
-          <el-select
-            placeholder="报告类型"
-            v-model="listFrom.MatchTypeName"
-            v-show="tabs_index == 1"
-            @focus="reportMappingMatchTypeRep"
-            clearable
-            @change="listChangeBtn"
-          >
+          <el-select placeholder="报告类型" v-model="listFrom.MatchTypeName" v-show="tabs_index == 1" @focus="reportMappingMatchTypeRep" clearable @change="listChangeBtn">
             <el-option v-for="(item, index) in MatchTypeNameList" :label="item.MatchTypeName" :key="index" :value="item.MatchTypeName"></el-option>
           </el-select>
-          <el-select
-            placeholder="产业"
-            v-model="listFrom.IndustrialManagementId"
-            v-show="tabs_index == 1"
-            @focus="getIndustrialManagement"
-            clearable
-            @change="listChangeBtn"
-          >
+          <el-select placeholder="产业" v-model="listFrom.IndustrialManagementId" v-show="tabs_index == 1" @focus="getIndustrialManagement" clearable @change="listChangeBtn">
             <template>
-              <el-option
-                v-for="item in idustrialManagement"
-                :label="item.IndustryName"
-                :key="item.IndustrialManagementId"
-                :value="item.IndustrialManagementId"
-              ></el-option>
+              <el-option v-for="item in idustrialManagement" :label="item.IndustryName" :key="item.IndustrialManagementId" :value="item.IndustrialManagementId"></el-option>
             </template>
           </el-select>
-          <el-input
-            v-if="tabs_index == 1"
-            style="width: 230px; margin-right: 15px"
-            placeholder="请输入报告标签"
-            v-model="listFrom.relevance"
-            @input="listFromInput"
-            clearable
-          >
+          <el-input v-if="tabs_index == 1" style="width: 230px; margin-right: 15px" placeholder="请输入报告标签" v-model="listFrom.relevance" @input="listFromInput" clearable>
             <i slot="prefix" class="el-input__icon el-icon-search"></i>
           </el-input>
-          <el-input
-            v-if="tabs_index != 2"
-            style="width: 230px; margin-right: 15px"
-            placeholder="请输入个股标签"
-            v-model="listFrom.reportLabel"
-            @input="listFromInput"
-            clearable
-          >
+          <el-input v-if="tabs_index != 2" style="width: 230px; margin-right: 15px" placeholder="请输入个股标签" v-model="listFrom.reportLabel" @input="listFromInput" clearable>
             <i slot="prefix" class="el-input__icon el-icon-search"></i>
           </el-input>
-          <date-picker
-            style="margin-bottom: 30px"
-            type="date"
-            range
-            v-model="createdate"
-            placeholder="发布时间"
-            value-type="format"
-            @change="listChangeBtn"
-          >
-          </date-picker>
+          <date-picker style="margin-bottom: 30px" type="date" range v-model="createdate" placeholder="发布时间" value-type="format" @change="listChangeBtn"> </date-picker>
         </div>
         <div style="width: 220px">
           <el-button type="primary" style="margin-bottom: 30px" v-if="IsShowButton" @click="$router.push('/appIndustry')">产业管理</el-button>
@@ -118,11 +62,7 @@
             <template slot-scope="scope">
               <div>
                 <span>{{ scope.row.MatchTypeName }}</span>
-                <img
-                  @click="modification(scope.row.ReportId)"
-                  :src="$icons.amend"
-                  style="color: #fff; width: 12px; height: 12px; margin-left: 5px; vertical-align: middle"
-                />
+                <img @click="modification(scope.row.ReportId)" :src="$icons.amend" style="color: #fff; width: 12px; height: 12px; margin-left: 5px; vertical-align: middle" />
               </div>
             </template>
           </el-table-column>
@@ -154,25 +94,14 @@
           <el-table-column align="center" label="操作" min-width="120">
             <template slot-scope="scope">
               <div v-if="scope.row.SubCategoryName == '专项调研'">
-                <span class="editsty" @click="operationBtn(scope.row.ArticleId, '发布')"
-                  >{{ scope.row.PublishStatus == 0 ? "发布" : "取消发布" }} &nbsp;&nbsp;</span
-                >
+                <span class="editsty" @click="operationBtn(scope.row.ArticleId, '发布')">{{ scope.row.PublishStatus == 0 ? "发布" : "取消发布" }} &nbsp;&nbsp;</span>
                 <span class="editsty" @click="addSummary(scope.row.ArticleId)">编辑 &nbsp;&nbsp;</span>
-                <span class="deletesty" v-if="scope.row.PublishStatus == 0" @click="operationBtn(scope.row.ArticleId, '删除')"
-                  >删除 &nbsp;&nbsp;</span
-                >
+                <span class="deletesty" v-if="scope.row.PublishStatus == 0" @click="operationBtn(scope.row.ArticleId, '删除')">删除 &nbsp;&nbsp;</span>
               </div>
               <div v-else>
                 <el-button type="text" v-if="(tabs_index == 0 || tabs_index == 2) && IsShowButton" @click="classifyBtn(scope.row)">归类</el-button>
-                <el-button type="text" v-if="scope.row.ShowButton && tabs_index == 1 && IsShowButton" @click="classifyBtn(scope.row)"
-                  >修改归类</el-button
-                >
-                <el-button
-                  type="text"
-                  v-if="scope.row.ShowButton && (tabs_index == 0 || tabs_index == 1) && IsShowButton"
-                  @click="filtrationBtn(scope.row.ReportId)"
-                  >过滤</el-button
-                >
+                <el-button type="text" v-if="scope.row.ShowButton && tabs_index == 1 && IsShowButton" @click="classifyBtn(scope.row)">修改归类</el-button>
+                <el-button type="text" v-if="scope.row.ShowButton && (tabs_index == 0 || tabs_index == 1) && IsShowButton" @click="filtrationBtn(scope.row.ReportId)">过滤</el-button>
               </div>
             </template>
           </el-table-column>
@@ -199,40 +128,13 @@
       </div>
       <el-form :model="chartPermissionPost" :rules="rules" ref="ruleForm">
         <el-form-item prop="IndustrialManagementId">
-          <el-select
-            clearable
-            placeholder="请选择所属产业"
-            style="width: 100%"
-            filterable
-            @clear="clearSelectChart"
-            @change="chartPermissionPostChange"
-            multiple
-            v-model="chartPermissionPostOptins"
-          >
-            <el-option
-              v-for="item in idustrialManagement"
-              :label="item.IndustryName"
-              :key="item.IndustrialManagementId"
-              :value="item.IndustrialManagementId"
-            ></el-option>
+          <el-select clearable placeholder="请选择所属产业" style="width: 100%" filterable @clear="clearSelectChart" @change="chartPermissionPostChange" multiple v-model="chartPermissionPostOptins">
+            <el-option v-for="item in idustrialManagement" :label="item.IndustryName" :key="item.IndustrialManagementId" :value="item.IndustrialManagementId"></el-option>
           </el-select>
         </el-form-item>
       </el-form>
-      <el-select
-        placeholder="请选择关联标的"
-        v-model="optionS"
-        style="width: 100%; margin-bottom: 40px; margin-top: 30px"
-        @change="optionsChange"
-        @focus="getIndustrialSubject"
-        multiple
-        clearable
-      >
-        <el-option
-          v-for="item in listSubject"
-          :label="item.SubjectName"
-          :key="item.IndustrialSubjectId"
-          :value="item.IndustrialSubjectId"
-        ></el-option>
+      <el-select placeholder="请选择关联标的" v-model="optionS" style="width: 100%; margin-bottom: 40px; margin-top: 30px" @change="optionsChange" @focus="getIndustrialSubject" multiple clearable>
+        <el-option v-for="item in listSubject" :label="item.SubjectName" :key="item.IndustrialSubjectId" :value="item.IndustrialSubjectId"></el-option>
       </el-select>
       <span slot="footer" class="dialog-footer">
         <el-button type="primary" @click="classifyClick">保存</el-button>
@@ -349,21 +251,8 @@ export default {
   created() {},
   mounted() {
     if (sessionStorage.getItem("appletsReportPageBack")) {
-      let {
-        tabsIndex,
-        page,
-        KeyWord,
-        ChartPermissionId,
-        SubCategoryName,
-        MatchTypeName,
-        IndustrialManagementId,
-        relevance,
-        reportLabel,
-        createdate,
-        IsClass,
-        IsFilter,
-        chartPermissionList,
-      } = JSON.parse(sessionStorage.getItem("appletsReportPageBack"));
+      let { tabsIndex, page, KeyWord, ChartPermissionId, SubCategoryName, MatchTypeName, IndustrialManagementId, relevance, reportLabel, createdate, IsClass, IsFilter, chartPermissionList } =
+        JSON.parse(sessionStorage.getItem("appletsReportPageBack"));
       this.tabs_index = tabsIndex;
       this.page_no = page;
       this.createdate = createdate;
@@ -406,16 +295,8 @@ export default {
       return h("div", { attrs: { style: "padding:0;" } }, [
         h("span", column.label),
         h("el-tooltip", { props: { placement: "top" } }, [
-          h(
-            "p",
-            { slot: "content", attrs: { style: "display:block;padding:5px 0;width:420px;" } },
-            "pv:报告被打开的次数,每次打开都计算一次(只统计有权限用户)"
-          ),
-          h(
-            "p",
-            { slot: "content", attrs: { style: "display:block;padding:5px 0;width:420px;" } },
-            "uv:访问报告的人数,每篇报告同一个人访问只计算一次(只统计有权限用户)"
-          ),
+          h("p", { slot: "content", attrs: { style: "display:block;padding:5px 0;width:420px;" } }, "pv:报告被打开的次数,每次打开都计算一次(只统计有权限用户)"),
+          h("p", { slot: "content", attrs: { style: "display:block;padding:5px 0;width:420px;" } }, "uv:访问报告的人数,每篇报告同一个人访问只计算一次(只统计有权限用户)"),
           h("el-button", { props: { icon: "el-icon-info" }, attrs: { style: "border:none;background:none;pading:2px" } }, ""),
         ]),
       ]);
@@ -558,31 +439,27 @@ export default {
     //获取产业
     getIndustrialManagement() {
       if (this.listFrom.ChartPermissionId == "") return;
-      raiInterface
-        .getIndustrialManagement({ ChartPermissionId: this.listFrom.ChartPermissionId - 0 || this.chartPermissionPost.ChartPermissionId - 0 })
-        .then((res) => {
-          if (res.Ret !== 200) return;
-          if (res.Data.List) {
-            this.idustrialManagement = res.Data.List;
-          } else {
-            this.idustrialManagement = [];
-          }
-        });
+      raiInterface.getIndustrialManagement({ ChartPermissionId: this.listFrom.ChartPermissionId - 0 || this.chartPermissionPost.ChartPermissionId - 0 }).then((res) => {
+        if (res.Ret !== 200) return;
+        if (res.Data.List) {
+          this.idustrialManagement = res.Data.List;
+        } else {
+          this.idustrialManagement = [];
+        }
+      });
     },
     //弹窗获取产业
     getIndustrialManagementDalg() {
       this.listSubject = [];
       this.optionS = [];
-      raiInterface
-        .getIndustrialManagement({ ChartPermissionId: this.listFrom.ChartPermissionId - 0 || this.chartPermissionPost.ChartPermissionId - 0 })
-        .then((res) => {
-          if (res.Ret !== 200) return;
-          if (res.Data.List) {
-            this.idustrialManagement = res.Data.List;
-          } else {
-            this.idustrialManagement = [];
-          }
-        });
+      raiInterface.getIndustrialManagement({ ChartPermissionId: this.listFrom.ChartPermissionId - 0 || this.chartPermissionPost.ChartPermissionId - 0 }).then((res) => {
+        if (res.Ret !== 200) return;
+        if (res.Data.List) {
+          this.idustrialManagement = res.Data.List;
+        } else {
+          this.idustrialManagement = [];
+        }
+      });
     },
     //弹窗获取标的
     getIndustrialSubject() {
@@ -602,13 +479,15 @@ export default {
     },
     //报告类型
     reportMappingMatchTypeRep() {
-      if(!this.listFrom.ChartPermissionId) return this.$message.error('请先选择行业')
-      raiInterface.reportMappingMatchTypeRep({
-         ChartPermissionId: this.listFrom.ChartPermissionId,
-      }).then((res) => {
-        if (res.Ret !== 200) return;
-        this.MatchTypeNameList = res.Data.List;
-      });
+      if (!this.listFrom.ChartPermissionId) return this.$message.error("请先选择行业");
+      raiInterface
+        .reportMappingMatchTypeRep({
+          ChartPermissionId: this.listFrom.ChartPermissionId,
+        })
+        .then((res) => {
+          if (res.Ret !== 200) return;
+          this.MatchTypeNameList = res.Data.List;
+        });
     },
     //报告归类确定事件
     classifyClick() {
@@ -668,11 +547,18 @@ export default {
       this.status = "";
     },
     //文章详情
-    lookDetail(item) {
-      // let href = `https://vmp.hzinsights.com/v2/articles/${item.ArticleId}`;
-      // window.open(href, "_blank");
-      let href = `${process.env.CYGX_WEB}/material/info/${item.ArticleId}`
-      window.open(href, "_blank");
+    async lookDetail(item) {
+      if (item.PublishStatus === 1) {
+        let href = `${process.env.CYGX_WEB}/material/info/${item.ArticleId}`;
+        window.open(href, "_blank");
+      } else {
+        const res = await raiInterface.reportArticleDetail({ ArticleId: item.ArticleId });
+        if (res.Ret === 200) {
+          sessionStorage.setItem("summaryPre", JSON.stringify(res.Data));
+          let { href } = this.$router.resolve({ name: "预览研选报告" });
+          window.open(href, "_blank");
+        }
+      }
     },
     //筛选行业的清除事件
     clearSelect() {

+ 168 - 127
src/views/rai_manage/reportManage/morningMeetingManage.vue

@@ -1,44 +1,69 @@
 <template>
-<!-- 晨会精华管理 -->
+  <!-- 晨会精华管理 -->
   <div class="moring-meeting-wrap">
     <div class="add-btn">
-        <el-button type="primary" @click="handleTableClick({},'add')">添加报告</el-button>
-      </div>
+      <el-button type="primary" @click="handleTableClick({}, 'add')">添加报告</el-button>
+    </div>
     <div class="meeting-wrap">
       <div class="select-box">
         <div class="select">
           <el-select placeholder="请选择发布状态" v-model="searchPublish" clearable @change="changeSelect">
-            <el-option v-for="item in [{label:'已发布',value:1},{label:'未发布',value:0}]" :label="item.label" :key="item.value" :value="item.value"/>
+            <el-option
+              v-for="item in [
+                { label: '已发布', value: 1 },
+                { label: '未发布', value: 0 },
+              ]"
+              :label="item.label"
+              :key="item.value"
+              :value="item.value"
+            />
           </el-select>
           <!-- <date-picker  type="date" range placeholder="晨会时间" v-model="searchDate" value-type="format"/> -->
-          <el-date-picker v-model="searchDate" type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd" @change="changeSelect"
-            class="date-pick" placeholder="晨会时间">
-      </el-date-picker>
+          <el-date-picker v-model="searchDate" type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd" @change="changeSelect" class="date-pick" placeholder="晨会时间"> </el-date-picker>
         </div>
-        
-        <el-input  placeholder="请输入产业标签" clearable v-model="searchLabel" @input="changeSelect">
+
+        <el-input placeholder="请输入产业标签" clearable v-model="searchLabel" @input="changeSelect">
           <i slot="prefix" class="el-input__icon el-icon-search"></i>
         </el-input>
       </div>
-      
+
       <div class="table-wrap">
         <el-table :data="tableData" border>
-          <el-table-column v-for="item in tableColumn" :key="item.key"
-            :prop="item.key" :label="item.label" align="center" :min-width="item.minWidth">
-            <template slot-scope="{row}">
-              <!-- <span v-if="['modifyTime','publishTime'].includes(item.key)&&row[item.key]">{{$moment(row[item.key]).format('YYYY.MM.DD HH:MM:ss')}}</span> -->
-              <span v-if="item.key==='meetingTime'&&row[item.key]">{{$moment(row[item.key]).format('YYYY.MM.DD')}}</span>
-              <span v-else-if="item.key==='status'">{{row[item.key]===1?'已发布':'未发布'}}</span>
-              <span v-else>{{ row[item.key]||'-' }}</span>
+          <el-table-column v-for="item in tableColumn" :key="item.key" :prop="item.key" :label="item.label" align="center" :min-width="item.minWidth">
+            <template slot-scope="{ row }">
+              <span v-if="item.key === 'meetingTime' && row[item.key]">{{ $moment(row[item.key]).format("YYYY.MM.DD") }}</span>
+              <span v-else-if="item.key === 'status'">{{ row[item.key] === 1 ? "已发布" : "未发布" }}</span>
+              <span v-else>{{ row[item.key] || "-" }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column width="150" label="PV / UV" align="center" key="pvUv" :render-header="renderHeader">
+            <template slot="header" slot-scope="scope">
+              <div class="todolabel" style="width: 100%; display: flex; justify-content: center; align-items: center">
+                <span>PV / UV</span>
+                <el-tooltip style="margin-left: 10px" effect="dark" placement="top-start">
+                  <template slot="content">
+                    <p>pv:报告被打开的次数,每次打开都计算一次(只统计有权限用户)</p>
+                    <p>uv:访问报告的人数,每篇报告同一个人访问只计算一次(只统计有权限用户)</p>
+                  </template>
+                  <i class="el-icon-info" />
+                </el-tooltip>
+              </div>
+            </template>
+            <template slot-scope="{ row }">
+              <div class="pv-uv-download">
+                <span>{{ row.Pv }}/{{ row.Uv }}</span>
+                <a :href="`${exportPvUv(row)}`" download>
+                  <img src="~@/assets/img/rai_m/pvuv_download.png" alt="" />
+                </a>
+              </div>
             </template>
           </el-table-column>
           <el-table-column label="操作" align="center" min-width="160">
-            <template slot-scope="{row}">
-              <div style="color:#4099ef; font-size:24px;">
-                <span class="editsty" @click="handleTableClick(row,'publish')">{{row.status===1?'取消发布':'发布'}}</span>
-                <span class="editsty" @click="handleTableClick(row,'edit')">编辑</span>
-                <span class="deletesty" style="cursor: pointer; color: #d1433a" v-if="row.status===0"
-                    @click="handleTableClick(row,'delete')">删除</span>
+            <template slot-scope="{ row }">
+              <div style="color: #4099ef; font-size: 24px">
+                <span class="editsty" @click="handleTableClick(row, 'publish')">{{ row.status === 1 ? "取消发布" : "发布" }}</span>
+                <span class="editsty" @click="handleTableClick(row, 'edit')">编辑</span>
+                <span class="deletesty" style="cursor: pointer; color: #d1433a" v-if="row.status === 0" @click="handleTableClick(row, 'delete')">删除</span>
               </div>
             </template>
           </el-table-column>
@@ -51,10 +76,9 @@
           :page-size="pageSize"
           :total="total"
           style="text-align: end; margin-top: 20px"
-          />
+        />
       </div>
     </div>
-   
   </div>
 </template>
 
@@ -63,159 +87,176 @@ import { raiInterface } from "@/api/api.js";
 export default {
   data() {
     return {
-      tableColumn:[{
-        key:'meetingTime',
-        label:'晨会日期'
-      },{
-        key:'partNums',
-        label:'段落数'
-      },{
-        key:'industryName',
-        label:'相关产业',
-        minWidth:160
-      },{
-        key:'publishTime',
-        label:'发布时间'
-      },{
-        key:'modifyTime',
-        label:'更新时间'
-      },{
-        key:'status',
-        label:'发布状态'
-      }],
-      tableData:[],
+      tableColumn: [
+        {
+          key: "meetingTime",
+          label: "晨会日期",
+        },
+        {
+          key: "partNums",
+          label: "段落数",
+        },
+        {
+          key: "industryName",
+          label: "相关产业",
+          minWidth: 160,
+        },
+        {
+          key: "publishTime",
+          label: "发布时间",
+        },
+        {
+          key: "modifyTime",
+          label: "更新时间",
+        },
+        {
+          key: "status",
+          label: "发布状态",
+        },
+      ],
+      tableData: [],
       //分页相关
-      page_no:1,
-      pageSize:10,
-      total:11,
+      page_no: 1,
+      pageSize: 10,
+      total: 11,
       //搜索相关
-      searchPublish:'',
-      searchDate:'',
-      searchLabel:''
+      searchPublish: "",
+      searchDate: "",
+      searchLabel: "",
     };
   },
-  watch:{
-
-  },
+  watch: {},
   methods: {
-    handleTableClick(data,type){
-      if(type==='delete'){
-        this.$confirm(
-        '确定要删除这篇报告吗?',
-        '提示',
-        {
-            confirmButtonText: '确定',
-            cancelButtonText: '取消',
-            type: 'warning',
-        }
-      ).then(()=>{
-        this.deleteMeeting(data.Id)
-      })
-        
+    handleTableClick(data, type) {
+      if (type === "delete") {
+        this.$confirm("确定要删除这篇报告吗?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        }).then(() => {
+          this.deleteMeeting(data.Id);
+        });
       }
-      if(type==='add'){
-        this.$router.push('/addMorningMeeting')
+      if (type === "add") {
+        this.$router.push("/addMorningMeeting");
       }
-      if(type==='edit'){
+      if (type === "edit") {
         this.$router.push({
-        path: "/editMorningMeeting",
-        query: { id: data.Id },
-      });}
-       if(type==='publish'){
-        this.publishMeeting(data)
+          path: "/editMorningMeeting",
+          query: { id: data.Id },
+        });
+      }
+      if (type === "publish") {
+        this.publishMeeting(data);
       }
     },
-    handleCurrentChange(current){
+    handleCurrentChange(current) {
       this.page_no = current;
       this.getListData();
     },
-    async getListData(){
+    async getListData() {
       const res = await raiInterface.getMorningMeetingList({
-        PageSize:this.pageSize,
-        CurrentIndex:this.page_no,
-        KeyWord:this.searchLabel,
-        MeetingTime:this.searchDate,
-        Status:this.searchPublish
-      })
-      if(res.Ret!==200) return 
-      const {CurrentIndex,Totals} = res.Data.Paging
-      this.tableData = res.Data.List||[]
-      this.page_no = CurrentIndex
-      this.total = Totals
+        PageSize: this.pageSize,
+        CurrentIndex: this.page_no,
+        KeyWord: this.searchLabel,
+        MeetingTime: this.searchDate,
+        Status: this.searchPublish,
+      });
+      if (res.Ret !== 200) return;
+      const { CurrentIndex, Totals } = res.Data.Paging;
+      this.tableData = res.Data.List || [];
+      this.page_no = CurrentIndex;
+      this.total = Totals;
     },
     //删除晨会
-    async deleteMeeting(id){
-      const res  = await raiInterface.deleteListMeeting({ReviewId:id})
-      if(res.Ret!==200) return 
-      this.$message.success("删除成功") 
+    async deleteMeeting(id) {
+      const res = await raiInterface.deleteListMeeting({ ReviewId: id });
+      if (res.Ret !== 200) return;
+      this.$message.success("删除成功");
       let page_num = Math.ceil((this.total - 1) / this.pageSize);
       if (this.page_no > page_num) {
-         this.page_no = page_num;
+        this.page_no = page_num;
       }
-      this.getListData()
+      this.getListData();
     },
     //发布/取消发布晨会
-    async publishMeeting(data){
-      let res = null
-      if(data.status===1){
-        res = await raiInterface.cancelPublish({ReviewId:data.Id})
-      }else{
-        res = await raiInterface.publishListMeeting({ReviewIds:data.Id+''})
+    async publishMeeting(data) {
+      let res = null;
+      if (data.status === 1) {
+        res = await raiInterface.cancelPublish({ ReviewId: data.Id });
+      } else {
+        res = await raiInterface.publishListMeeting({ ReviewIds: data.Id + "" });
       }
-      if(res.Ret!==200) return
-      this.$message.success(`${data.status===0?'':'取消'}发布成功`)
-      this.searchPublish = ''
-      this.searchDate=''
-      this.searchLabel=''
-      this.getListData()
+      if (res.Ret !== 200) return;
+      this.$message.success(`${data.status === 0 ? "" : "取消"}发布成功`);
+      this.searchPublish = "";
+      this.searchDate = "";
+      this.searchLabel = "";
+      this.getListData();
     },
     //筛选条件更改
-    changeSelect(){
-      this.page_no=1
-      this.getListData()
-    }
+    changeSelect() {
+      this.page_no = 1;
+      this.getListData();
+    },
+    exportPvUv(row) {
+      return process.env.API_ROOT + "/cygx/morningMeeting/list_pv?MeetingId=" + row.Id + "&" + localStorage.getItem("auth") + `&IsExport=${true}`;
+    },
+  },
+  computed: {},
+  mounted() {
+    this.getListData();
   },
-  mounted(){
-    this.getListData()
-  }
 };
 </script>
 
 <style scoped lang="scss">
-.moring-meeting-wrap{
-  .add-btn,.meeting-wrap{
+.moring-meeting-wrap {
+  .add-btn,
+  .meeting-wrap {
     background-color: #fff;
     box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
     border-radius: 4px;
     padding: 20px 30px;
     box-sizing: border-box;
   }
-  .add-btn{
+  .add-btn {
     text-align: right;
-    height:80px;
+    height: 80px;
     margin-bottom: 20px;
   }
-  .meeting-wrap{
+  .meeting-wrap {
     min-height: calc(100vh - 220px);
-    .select-box{
+    .select-box {
       display: flex;
       margin-bottom: 20px;
       justify-content: space-between;
-      .el-select,.date-pick{
-        width:210px !important;
+      .el-select,
+      .date-pick {
+        width: 210px !important;
         margin-right: 20px;
       }
-      .el-input{
+      .el-input {
         width: 420px !important;
         margin-right: 0;
       }
-      .date-pick{
-        &.el-input{
-          width:210px !important;
+      .date-pick {
+        &.el-input {
+          width: 210px !important;
           margin-right: 20px;
         }
       }
     }
   }
+  .pv-uv-download {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    img {
+      width: 14px;
+      height: 14px;
+      margin-left: 10px;
+    }
+  }
 }
 </style>

+ 13 - 10
src/views/rai_manage/reportManage/summaryManage.vue

@@ -30,7 +30,7 @@
       <el-table :data="dataList" style="width: 100%" border>
         <el-table-column key="title" align="center" label="报告标题" min-width="300">
           <template slot-scope="scope">
-            <span class="editsty" style="color: #409eff" @click="lookDetail(scope.row.ArticleId)">{{ scope.row.Title }}</span>
+            <span class="editsty" style="color: #409eff" @click="lookDetail(scope.row)">{{ scope.row.Title }}</span>
           </template>
         </el-table-column>
         <el-table-column key="category" prop="ArticleTypeName" align="center" label="报告类型" min-width="95"></el-table-column>
@@ -251,15 +251,18 @@ export default {
       });
     },
     //文章详情
-    lookDetail(id) {
-      // let url =
-      //   process.env.NODE_ENV === "production"
-      //     ? "https://details.hzinsights.com/cygx/report"
-      //     : process.env.NODE_ENV === "test"
-      //     ? "http://xcxh5test.hzinsights.com/xcx_h5/cygx/report"
-      //     : "http://xcxh5test.hzinsights.com/xcx_h5/cygx/report";
-      let href = `${process.env.CYGX_WEB}/material/info/${id}`
-      window.open(href, "_blank");
+    async lookDetail(item) {
+      if (item.PublishStatus === 1) {
+        let href = `${process.env.CYGX_WEB}/material/info/${item.ArticleId}`;
+        window.open(href, "_blank");
+      } else {
+        const res = await raiInterface.getsummaryManagedetail({ ArticleId: item.ArticleId });
+        if (res.Ret === 200) {
+          sessionStorage.setItem("summaryPre", JSON.stringify(res.Data));
+          let { href } = this.$router.resolve({ name: "预览研选报告" });
+          window.open(href, "_blank");
+        }
+      }
     },
     //列表
     getsummaryManageList() {

+ 4 - 4
src/views/rai_manage/reportManage/yanXuanSpecial.vue

@@ -11,8 +11,9 @@
             <img :src="item.HeadImg" alt="" />
           </div>
           <div class="info-content">
-            <p class="info-name">{{ item.RealName }} - {{ item.Mobile }}</p>
+            <p class="info-name">{{ item.SpecialName }}</p>
             <p>昵称:{{ item.NickName }}</p>
+            <p>{{ item.RealName }}-{{ item.Mobile }}</p>
             <p>{{ item.CompanyName }}</p>
           </div>
           <div class="switch-box">
@@ -221,7 +222,6 @@ div {
       overflow-y: auto;
       .author-li {
         flex: 1;
-        height: 116px;
         padding: 20px;
         display: flex;
         justify-content: space-between;
@@ -238,8 +238,8 @@ div {
     flex: 1;
     padding-left: 16px;
     color: #999999;
-    p:nth-child(2) {
-      margin: 8px 0;
+    p {
+      margin: 5px 0;
     }
   }
   .avatar {