Ver Fonte

Merge branch 'master' into crm_16.7

bding há 1 semana atrás
pai
commit
171cd939ec
25 ficheiros alterados com 1880 adições e 462 exclusões
  1. 1 1
      config/prod.test.env.js
  2. 13 1
      src/api/modules/crmApi.js
  3. 13 0
      src/api/modules/roadshowApi.js
  4. 5 0
      src/routes/modules/roadShowRoutes.js
  5. 58 0
      src/views/custom_manage/contacts/compontents/addLabelDlg.vue
  6. 135 83
      src/views/custom_manage/contacts/compontents/contactsColums.js
  7. 53 96
      src/views/custom_manage/contacts/compontents/interactionDlg.vue
  8. 96 25
      src/views/custom_manage/contacts/compontents/labelDlg.vue
  9. 116 45
      src/views/custom_manage/contacts/contactsList.vue
  10. 1 1
      src/views/custom_manage/customList/addCustom.vue
  11. 23 1
      src/views/custom_manage/customList/customDetail.vue
  12. 1 1
      src/views/custom_manage/customList/customList.vue
  13. 1 1
      src/views/custom_manage/customList/customShareList.vue
  14. 6 2
      src/views/custom_manage/customList/pickCustom.vue
  15. 5 4
      src/views/rai_manage/activityManage/activityManage.vue
  16. 1 1
      src/views/rai_manage/components/addChoiceness.vue
  17. 2 3
      src/views/rai_manage/cygxManage/components/lableDlg.vue
  18. 90 5
      src/views/roadshow_manage/compononts/activityDetailDia.vue
  19. 290 0
      src/views/roadshow_manage/compononts/addAnswer.vue
  20. 180 0
      src/views/roadshow_manage/compononts/viewAnswer.vue
  21. 319 184
      src/views/roadshow_manage/myCalendar.vue
  22. 397 0
      src/views/roadshow_manage/roadshowQuestion.vue
  23. 2 1
      src/views/roadshow_manage/roleConfig/myCalendarConfig.js
  24. 37 2
      src/views/roadshow_manage/statistics/mixin.js
  25. 35 5
      src/views/roadshow_manage/statistics/researcher.vue

+ 1 - 1
config/prod.test.env.js

@@ -1,7 +1,7 @@
 module.exports = {
     NODE_ENV:'"test"',
   	// API_ROOT:'"http://rddpapi.brilliantstart.cn/adminapi"',  //测试环境
-  	API_ROOT:'"http://8.136.199.33:7777/adminapi/"',  //测试环境
+  	API_ROOT:'"http://8.136.199.33:7777/adminapi"',  //测试环境
 	Domain:'"brilliantstart.cn"',
 	// Login:'"http://rddpapi.brilliantstart.cn/login"',
 	Login:'"http://8.136.199.33:7777/login"',

+ 13 - 1
src/api/modules/crmApi.js

@@ -1140,7 +1140,7 @@ const equityContacts = {
   },
   //用户相关互动接口
   getInteractionRelevant: (params) => {
-    return http.get("/cygx/user/interaction/relevant", params);
+    return http.get("/cygx/use_rai_label/detail", params);
   },
   //机构状态搜索栏互助
   getInteractionNum: (params) => {
@@ -1178,6 +1178,18 @@ const equityContacts = {
   userFeedbackDel:(params)=>{
     return http.post("/cygx/user_feedback/del",params)
   }, 
+  // 删除销售输入标签接口
+  userRaiLabelDel:(params)=>{
+    return http.post("/cygx/use_rai_label/delte",params)
+  }, 
+  // 销售输入标签接口
+  userRaiLabelAdd:(params)=>{
+    return http.post("/cygx/use_rai_label/add",params)
+  }, 
+  // 获取标签详情接口
+  getLabelList:(params)=>{
+    return http.get("/cygx/use_rai_label/list",params)
+  }, 
 };
 
 /*

+ 13 - 0
src/api/modules/roadshowApi.js

@@ -368,6 +368,19 @@ const roadshowInterence={
 	rai_serve_search_chcck_PermissionName:params => {
 		return http.get('/cygx/rai_serve/chcck_PermissionName',params)
 	},	
+
+	// 路演客户问答保存
+	addRoadShowQuestion:params=>{
+		return http.post('/roadshow/question/save',params)
+	},
+	// 路演问答详情
+	roadShowQuestionInfo:params=>{
+		return http.get('/roadshow/question/list',params)
+	},
+	// 客户路演问答汇总
+	roadShowQuestionSummary:params=>{
+		return http.get('/roadshow/question/summary/list',params)
+	}
 }
 
 export {

+ 5 - 0
src/routes/modules/roadShowRoutes.js

@@ -54,6 +54,11 @@ export default [
 				name: "销售员日历",
 				component: () => import('@/views/roadshow_manage/sellerCalendar.vue')
 			},
+			{
+				path: "roadshowQuestion",
+				name: "客户路演问题汇总",
+				component: () => import('@/views/roadshow_manage/roadshowQuestion.vue')
+			},
 		]
 	},
 ]

+ 58 - 0
src/views/custom_manage/contacts/compontents/addLabelDlg.vue

@@ -0,0 +1,58 @@
+<template>
+  <div class="container-feedbackDlg">
+    <el-dialog v-dialogDrag :visible.sync="addIsShow" :close-on-click-modal="false" :modal-append-to-body="false" @close="cancelHandle" center title="添加标签" width="500px">
+      <el-input style="width: 100%" type="text" placeholder="请输入标签名称" v-model="lableText"> </el-input>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="cancelHandle">取 消</el-button>
+        <el-button type="primary" @click="remindBtnHandler">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { equityContacts } from "@/api/api.js";
+
+export default {
+  name: "",
+  components: {},
+  props: {
+    addIsShow: {
+      type: Boolean,
+      default: false,
+    },
+    interactionFrom: {
+      type: Object,
+      default: {},
+    },
+  },
+  data() {
+    return {
+      lableText: "",
+    };
+  },
+  computed: {},
+
+  methods: {
+    // 弹框关闭的事件
+    cancelHandle() {
+      this.$emit("update:addIsShow", false);
+      this.lableText = "";
+    },
+    // 确认事件
+    async remindBtnHandler() {
+      if (!this.lableText) return;
+      const res = await equityContacts.userRaiLabelAdd({
+        Label: this.lableText,
+        UserId: this.interactionFrom.UserId,
+      });
+      if (res.Ret === 200) {
+        this.cancelHandle();
+        this.$emit("updateList");
+        this.$message.success("添加成功!");
+      }
+    },
+  },
+};
+</script>
+<style scoped lang="scss"></style>

+ 135 - 83
src/views/custom_manage/contacts/compontents/contactsColums.js

@@ -375,90 +375,142 @@ export const tableColums = (type) => {
 };
 
 //表格列
-export const interactionColums = [
-  {
-    title: "报告阅读",
-    tableName: "List1",
-    table: [
-      {
-        label: "报告标题",
-        key: "Title",
-        minwidthsty: 140,
-      },
-      {
-        label: "阅读时间",
-        key: "CreateTime",
-      },
-      {
-        label: "阅读时长",
-        key: "StopTime",
-        widthsty: 80,
-      },
-    ],
-  },
-  {
-    title: "报告收藏",
-    tableName: "List2",
-    table: [
-      {
-        label: "报告标题",
-        key: "Title",
-        minwidthsty: 140,
-      },
-      {
-        label: "收藏时间",
-        key: "CreateTime",
-      },
-    ],
-  },
-  {
-    tableName: "List3",
-    title: "活动互动",
-    table: [
-      {
-        label: "活动名称",
-        key: "ActivityName",
-        minwidthsty: 140,
-      },
-      {
-        label: "活动形式",
-        key: "ActivityType",
-      },
-      {
-        label: "活动时间",
-        key: "ActivityTime",
-      },
-      {
-        label: "参会总时长",
-        key: "Duration",
-      },
-    ],
-  },
-  {
-    tableName: "List4",
-    title: "专项调研",
-    table: [
-      {
-        label: "调研主题",
-        key: "ActivityName",
-        minwidthsty: 140,
-      },
-      {
-        label: "行业",
-        key: "PermissionName",
-      },
-      {
-        label: "活动时间",
-        key: "ActivityTime",
-      },
-      {
-        label: "调研形式",
-        key: "ActivityType",
-      },
-    ],
-  },
-];
+export const interactionColums = (type) => {
+  return type === 1
+    ? [
+        {
+          label: "关键字",
+          key: "Label",
+        },
+        {
+          label: "搜索时间",
+          key: "CreateTime",
+        },
+      ]
+    : type === 2
+    ? [
+        {
+          label: "活动名称",
+          key: "ActivityName",
+        },
+        {
+          label: "活动类型",
+          key: "ActivityTypeName",
+        },
+        {
+          label: "活动时间",
+          key: "ActivityTime",
+        },
+        {
+          label: "参会时长",
+          key: "Duration",
+        },
+        {
+          label: "活动标签",
+          key: "Label",
+        },
+      ]
+    : type === 4
+    ? [
+        {
+          label: "活动名称",
+          key: "ActivityName",
+        },
+        {
+          label: "活动类型",
+          key: "ActivityTypeName",
+        },
+        {
+          label: "活动时间",
+          key: "ActivityTime",
+        },
+
+        {
+          label: "活动标签",
+          key: "Label",
+        },
+      ]
+    : type === 3 || type === 5
+    ? [
+        {
+          label: "研究员",
+          key: "ResearcherName",
+        },
+        {
+          label: "路演时间",
+          key: "RoadShowTime",
+        },
+        {
+          label: "路演主题",
+          key: "Theme",
+        },
 
+        {
+          label: "主题标签",
+          key: "Label",
+        },
+      ]
+    : type === 6
+    ? [
+        {
+          label: "输入关键字",
+          key: "Label",
+        },
+        {
+          label: "创建人",
+          key: "SysUserRealName",
+        },
+        {
+          label: "创建时间",
+          key: "CreateTime",
+        },
+      ]
+    : type === 9
+    ? [
+        {
+          label: "音视频名称",
+          key: "Title",
+        },
+        {
+          label: "活动时间",
+          key: "ActivityTime",
+        },
+        {
+          label: "活动标签",
+          key: "Label",
+        },
+        {
+          label: "查看时间",
+          key: "CreateTime",
+        },
+      ]
+    : [
+        {
+          label: "报告标题",
+          key: "Title",
+        },
+        {
+          label: "发布时间",
+          key: "PublishDate",
+        },
+        {
+          label: "阅读时间",
+          key: "CreateTime",
+        },
+        {
+          label: "阅读来源",
+          key: "SourceText",
+        },
+        {
+          label: "阅读时长",
+          key: "StopTime",
+        },
+        {
+          label: type === 8 ? "报告类型" : "报告标签",
+          key: "Label",
+        },
+      ];
+};
 //活动的筛选
 export const screenList = [
   {

+ 53 - 96
src/views/custom_manage/contacts/compontents/interactionDlg.vue

@@ -1,55 +1,19 @@
 <template>
   <div class="container-interaction-dlg">
-    <el-dialog
-      v-dialogDrag
-      :visible.sync="interactionDlg"
-      :close-on-click-modal="false"
-      :modal-append-to-body="false"
-      @close="cancelHandle"
-      center
-      width="800px"
-    >
-      <div slot="title">
-        <i
-          class="el-icon-close"
-          style="fontsize: 24px; cursor: pointer; position: absolute; right: 20px; top: 50%; transform: translateY(-50%)"
-          @click="cancelHandle"
-        ></i>
-        <span style="fontsize: 16px">{{ industryName }} - 相关互动</span>
-      </div>
+    <el-dialog v-dialogDrag :visible.sync="interactionDlg" :close-on-click-modal="false" :modal-append-to-body="false" @close="cancelHandle" :title="dlgTitle" center width="800px">
       <div>
-        <template v-if="isFllow">
-          <img src="~@/assets/img/attention.png" alt="" />
-          关注的产业
-        </template>
-        <div class="tabs-box">
-          <span v-for="item in interactionColums" :key="item.title" :class="tabsActive === item.title ? 'active' : ''" @click="tabsHandle(item)">
-            {{ item.title }}</span
-          >
-        </div>
         <div class="content">
-          <div v-for="item in interactionColums" :key="item.title">
-            <template v-if="tabsActive === item.title">
-              <el-table :data="tableData" v-loading="tableLoading" element-loading-text="数据加载中..." border height="350">
-                <el-table-column
-                  v-for="val in item.table"
-                  :key="val.label"
-                  :label="val.label"
-                  :width="val.widthsty"
-                  :min-width="val.minwidthsty"
-                  align="center"
-                >
-                  <template slot-scope="{ row }">
-                    <span @click="handleRowClick(row, val.key)" :style="handleRowStyle(val.key)">{{ handleRowContent(row, val.key) }}</span>
-                  </template>
-                </el-table-column>
-                <div slot="empty" style="padding: 20px 0">
-                  <img src="~@/assets/img/data_m/table_no.png" alt="" style="display: block; width: 135px; height: 90px; margin: 0 auto" />
-                  <span>暂无数据</span>
-                </div>
-              </el-table>
-            </template>
-          </div>
+          <el-table :data="tableData" v-loading="tableLoading" element-loading-text="数据加载中..." border height="350">
+            <el-table-column v-for="val in dataColums" :key="val.label" :label="val.label" :width="val.widthsty" :min-width="val.minwidthsty" align="center">
+              <template slot-scope="{ row }">
+                <span>{{ row[val.key] }}</span>
+              </template>
+            </el-table-column>
+            <div slot="empty" style="padding: 20px 0">
+              <img src="~@/assets/img/data_m/table_no.png" alt="" style="display: block; width: 135px; height: 90px; margin: 0 auto" />
+              <span>暂无数据</span>
+            </div>
+          </el-table>
         </div>
       </div>
     </el-dialog>
@@ -67,22 +31,41 @@ export default {
       type: Boolean,
       default: false,
     },
-    interactionFrom: {
-      type: Object,
+    raiLabelId: {
+      type: Number,
     },
   },
   data() {
     return {
       tableLoading: false,
       tableData: [],
-      tabsActive: "报告阅读",
-      industryName: "",
-      isFllow: false,
+      sourceType: "",
+      dataColums: [],
     };
   },
   computed: {
-    interactionColums() {
-      return interactionColums;
+    dlgTitle() {
+      switch (this.sourceType) {
+        case 1:
+          return "搜索关键字";
+        case 2:
+          return "线下活动";
+        case 3:
+          return "线下路演";
+        case 4:
+          return "线上活动";
+        case 5:
+          return "线上路演";
+        case 6:
+          return "输入标签";
+        case 7:
+        case 8:
+          return "阅读报告";
+        case 9:
+          return "路演回放";
+        default:
+          return ""; // 返回一个空对象表示没有样式
+      }
     },
   },
   watch: {
@@ -99,59 +82,33 @@ export default {
   methods: {
     async getInteractionRelevant() {
       const res = await equityContacts.getInteractionRelevant({
-        UserId: this.interactionFrom.id,
-        KeyWord: this.interactionFrom.key,
-        Source: this.tabsActive === "报告阅读" ? 1 : this.tabsActive === "报告收藏" ? 2 : this.tabsActive === "活动互动" ? 3 : 4,
+        RaiLabelId: this.raiLabelId,
       });
       if (res.Ret === 200) {
-        this.industryName = res.Data.IndustryName;
-        this.isFllow = res.Data.IsFllow;
-        this.tableData = res.Data.List || [];
+        this.sourceType = res.Data.SourceType;
+        this.dataColums = interactionColums(this.sourceType);
+        this.tableData =
+          res.Data.SourceType == 1
+            ? [res.Data.KeyWord]
+            : res.Data.SourceType == 2 || res.Data.SourceType == 4
+            ? [res.Data.Activity]
+            : res.Data.SourceType == 3 || res.Data.SourceType == 5
+            ? [res.Data.RoadShow]
+            : res.Data.SourceType == 6
+            ? [res.Data.Seller]
+            : res.Data.SourceType == 9
+            ? [res.Data.ActivityVivo]
+            : [res.Data.Article];
       }
     },
     tabsHandle(item) {
-      this.tabsActive = item.title;
       this.tableData = [];
       this.getInteractionRelevant();
     },
     //关闭弹框
     cancelHandle() {
-      this.tabsActive = "报告阅读";
       this.$emit("update:interactionDlg", false);
     },
-    /* 表格行的样式 */
-    handleRowStyle(key) {
-      const style = {
-        Title: "color: #409eff; cursor: pointer",
-      };
-      return style[key] ? style[key] : "";
-    },
-    /* 表格行的数据处理 */
-    handleRowContent(row, key) {
-      if (["ActivityType"].includes(key)) {
-        return row[key] == 1 ? "线上" : "线下";
-      } else {
-        return row[key];
-      }
-    },
-    /* 表格行的点击事件 */
-    handleRowClick(row, key) {
-      if (key === "Title") {
-        if (row.ArticleType == 1) {
-          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 = `${url}?id=${row.ArticleIdMd5}`;
-          window.open(href, "_blank");
-        } else {
-          let href = `https://vmp.hzinsights.com/v2/articles/${row.ArticleId}`;
-          window.open(href, "_blank");
-        }
-      }
-    },
   },
 };
 </script>

+ 96 - 25
src/views/custom_manage/contacts/compontents/labelDlg.vue

@@ -1,35 +1,25 @@
 <template>
   <div class="container-labrlDlg">
-    <el-dialog
-      title="标签"
-      v-dialogDrag
-      :visible.sync="isShowLabelDlg"
-      :close-on-click-modal="false"
-      :modal-append-to-body="false"
-      @close="cancelHandle"
-      center
-      width="800px"
-    >
+    <el-dialog title="标签" v-dialogDrag :visible.sync="isShowLabelDlg" :close-on-click-modal="false" :modal-append-to-body="false" @close="cancelHandle" center width="800px">
       <div class="popover-item">
-        <el-tag
-          size="mini"
-          style="margin: 5px 8px; cursor: pointer"
-          v-for="item in lookLabelListNumber()"
-          :key="item"
-          :type="userLabel == item && 'danger'"
-          @click="labelChildren(item)"
-        >
-          {{ item }}
-        </el-tag>
+        <span class="label-tag" :style="lookLabelColor(item)" v-for="item in lableListL" :key="item.RaiLabelId" @click="labelChildren(item.RaiLabelId)">
+          {{ item.Label }}
+          <i @click.stop="deleteLabel(item)" v-if="item.SourceType == 6" class="el-icon-circle-close"></i>
+        </span>
+        <span @click="labelChildrenAdd" class="label-tag" style="margin: 5px 8px; cursor: pointer" effect="dark" color="#EAF3FE"> 添加标签 <i class="el-icon-circle-plus-outline"></i></span>
       </div>
     </el-dialog>
+    <AddLabelDlg :interactionFrom="interactionFrom" :addIsShow.sync="addLabelDlgVisibility" @updateList="getUpdateList" />
   </div>
 </template>
 
 <script>
+import AddLabelDlg from "./addLabelDlg.vue";
+import { equityContacts } from "@/api/api.js";
+
 export default {
   name: "",
-  components: {},
+  components: { AddLabelDlg },
   props: {
     isShowLabelDlg: {
       default: false,
@@ -45,38 +35,119 @@ export default {
     },
   },
   data() {
-    return {};
+    return {
+      lableListL: [],
+      interactionFrom: "",
+      addLabelDlgVisibility: false,
+    };
   },
   computed: {},
-  watch: {},
+  watch: {
+    isShowLabelDlg: {
+      handler(newVal) {
+        newVal && this.getDataList();
+      },
+    },
+  },
   created() {},
   mounted() {},
   methods: {
+    async getDataList() {
+      const res = await equityContacts.getLabelList({
+        UserId: this.dlgLabelList.UserId,
+      });
+      if (res.Ret === 200) {
+        this.lableListL = res.Data.List || [];
+      }
+    },
     // 类型的处理
     lookLabelListNumber() {
       let arr = this.dlgLabelList.Labels ? this.dlgLabelList.Labels.split(",") : [];
       return arr;
     },
     // 点击标签的事件
-    labelChildren(key) {
-      this.$emit("labelChildren", key, this.dlgLabelList);
+    labelChildren(item) {
+      this.$emit("labelClick", item);
+    },
+    // 点击标签的事件
+    deleteLabel(item) {
+      this.$emit("update:isShowLabelDlg", false);
+      if (item.SourceType == 6) {
+        this.$confirm("确定要删除此标签吗?", "删除标签", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        }).then(async () => {
+          const res = await equityContacts.userRaiLabelDel({
+            RaiLabelId: item.RaiLabelId,
+          });
+          if (res.Ret == 200) {
+            this.$message({
+              type: "success",
+              message: "删除成功!",
+            });
+            this.getDataList();
+            this.$emit("getUpdateList");
+          }
+        });
+      }
     },
     // 关闭了弹框
     cancelHandle() {
       this.$emit("update:dlgLabelList", {});
       this.$emit("update:isShowLabelDlg", false);
     },
+    // 标签的颜色
+    lookLabelColor(item) {
+      switch (item.SourceType) {
+        case 1:
+          return { backgroundColor: "#FFE5E6", color: "#D60808" };
+        case 2:
+        case 3:
+          return { backgroundColor: "#FDE5FF", color: "#891B98" };
+        case 4:
+        case 5:
+          return { backgroundColor: "#FFEEE5", color: "#DD4D00" };
+        case 7:
+          return { backgroundColor: "#E5FCFF", color: "#076873" };
+        case 8:
+          return { backgroundColor: "#E5EAFF", color: "#1A31C5" };
+        default:
+          return {}; // 返回一个空对象表示没有样式
+      }
+    },
+    // 添加销售输入标签接口
+    labelChildrenAdd() {
+      this.addLabelDlgVisibility = true;
+      this.interactionFrom = this.dlgLabelList;
+    },
+    // 添加标签后的更新列表事件
+    getUpdateList() {
+      this.getDataList();
+      this.$emit("getUpdateList");
+    },
   },
 };
 </script>
 <style scoped lang="scss">
 .container-labrlDlg {
   .popover-item {
+    display: flex;
+    flex-wrap: wrap;
     padding-bottom: 30px;
   }
   .popover-not-have {
     width: 100%;
     text-align: center;
   }
+  .label-tag {
+    padding: 0 10px;
+    font-size: 14px;
+    border-radius: 4px;
+    background-color: #eaf3fe;
+    color: #409eff;
+    margin: 5px 8px;
+    cursor: pointer;
+  }
 }
 </style>

+ 116 - 45
src/views/custom_manage/contacts/contactsList.vue

@@ -33,25 +33,7 @@
         :props="{ value: 'TryStage', label: 'Name', children: 'List', checkStrictly: true }"
         @change="handelGetData"
       ></el-cascader>
-      <el-autocomplete
-        style="width: 200px; margin-bottom: 20px"
-        prefix-icon="el-icon-search"
-        clearable
-        class="inline-input"
-        v-model="userLabel"
-        :fetch-suggestions="querySearchHandler"
-        placeholder="用户标签搜索"
-        @clear="handelGetData"
-        :trigger-on-focus="false"
-        @select="handelGetData"
-      >
-        <template slot-scope="scope">
-          <div v-if="scope.item.IndustryName">
-            {{ scope.item.IndustryName }}
-          </div>
-          <div v-else style="text-align: center">暂无数据</div>
-        </template>
-      </el-autocomplete>
+      <el-input style="width: 200px; margin-bottom: 20px" prefix-icon="el-icon-search" clearable class="inline-input" v-model="userLabel" placeholder="用户标签搜索" @input="handelGetData"> </el-input>
     </div>
     <el-card>
       <el-table :data="tableData" style="width: 100%" border @sort-change="sortChangeHandle" :row-class-name="setRowClass">
@@ -111,26 +93,31 @@
           </template>
         </el-table-column>
         <el-table-column prop="" width="350">
-          <div slot="header" slot-scope="{}" style="text-align: center">标签</div>
+          <div slot="header" slot-scope="{}" style="text-align: center">
+            <el-popover placement="top-start" width="376" trigger="hover">
+              <span slot="reference">
+                <p style="cursor: pointer">标签 <i class="el-icon-info" style="color: #606266" /></p>
+              </span>
+              <div class="popover-item">
+                <span class="label-tag" :style="lookLabelColor(item)" v-for="item in lableDescribe" :key="item.SourceType" @click="labelChildren(item.RaiLabelId)">
+                  {{ item.Label }}
+                  <i @click.stop="deleteLabel(item)" v-if="item.SourceType == 6" class="el-icon-circle-close"></i>
+                </span>
+                <p style="margin:10px 15px">仅标记客户4个月以内的互动行为</p>
+              </div>
+            </el-popover>
+          </div>
           <template slot-scope="{ row }">
             <div class="popover-item">
-              <el-tag size="mini" style="margin: 5px 8px; cursor: pointer" v-for="item in lookLabelListNumber(row)" :key="item" :type="userLabel == item && 'danger'" @click="labelChildren(item, row)">
-                {{ item }}
-              </el-tag>
-              <span @click="showLabelDlg(row)" style="font-weight: 700; padding: 5px 10px" class="editsty" v-if="row.Labels && row.Labels.split(',').length > 10">...</span>
+              <span class="label-tag" :style="lookLabelColor(item)" v-for="item in lookLabelListNumber(row)" :key="item.RaiLabelId" @click="labelChildren(item.RaiLabelId)">
+                {{ item.Label }}
+                <i @click.stop="deleteLabel(item)" v-if="item.SourceType == 6" class="el-icon-circle-close"></i>
+              </span>
+              <span @click="showLabelDlg(row)" style="font-weight: 700; padding: 5px 10px" class="editsty" v-if="row.RaiLabelList && row.RaiLabelList.length > 6">...</span>
+              <span @click="labelChildrenAdd(row)" class="label-tag" style="margin: 5px 8px; cursor: pointer" effect="dark" color="#EAF3FE"> 添加标签 <i class="el-icon-circle-plus-outline"></i></span>
             </div>
           </template>
         </el-table-column>
-        <!-- <el-table-column align="center" prop="" label="备注" width="90">
-          <template slot-scope="{ row }">
-            <div class="remark-list">
-              <div class="button">
-                <span class="editsty" @click="lookOver(row, '添加')">添加</span>
-                <span v-if="row.Content" style="font-weight: 700; padding: 5px 10px" class="editsty" @click="lookOver(row, '历史')">...</span>
-              </div>
-            </div>
-          </template>
-        </el-table-column> -->
         <el-table-column align="center" prop="" label="操作" width="160">
           <template slot-scope="{ row }">
             <span :class="row.IsRemind ? 'deletesty' : 'editsty'" @click="remindHandler(row)">{{ row.IsRemind ? "取消提醒" : "互动提醒" }}</span>
@@ -165,11 +152,12 @@
         </template>
       </div>
     </el-dialog>
-    <InteractionDlg :interactionDlg.sync="interactionDlg" :interactionFrom="interactionFrom" />
-    <label-dlg :isShowLabelDlg.sync="isShowLabelDlg" :dlgLabelList.sync="dlgLabelList" @labelChildren="labelChildren" :userLabel="userLabel" />
+    <InteractionDlg :interactionDlg.sync="interactionDlg" :raiLabelId="raiLabelId" />
+    <label-dlg :isShowLabelDlg.sync="isShowLabelDlg" :dlgLabelList.sync="dlgLabelList" @labelClick="labelChildren" @deleteClick="deleteLabel" @getUpdateList="getCygxContactsList" />
     <remind-dlg :isShowRemindDlg.sync="isShowRemindDlg" :remindList.sync="remindList" />
     <FeedbackDlg :showFeedbackDlg.sync="showFeedbackDlg" :remindList.sync="remindList" />
     <ContactTransfer :contactTransferDlgVisible.sync="contactTransferDlgVisible" :TransferMobile.sync="TransferMobile" />
+    <AddLabelDlg :interactionFrom="interactionFrom" :addIsShow.sync="addLabelDlgVisibility" @updateList="getCygxContactsList" />
   </div>
 </template>
 
@@ -182,10 +170,11 @@ import LabelDlg from "./compontents/labelDlg.vue";
 import RemindDlg from "./compontents/remindDlg.vue";
 import FeedbackDlg from "./compontents/feedbackDlg.vue";
 import ContactTransfer from "../customList/components/ContactTransferDlg.vue";
+import AddLabelDlg from "./compontents/addLabelDlg.vue";
 
 export default {
   name: "",
-  components: { mPage, mDialog, InteractionDlg, LabelDlg, RemindDlg, FeedbackDlg, ContactTransfer },
+  components: { mPage, mDialog, InteractionDlg, LabelDlg, RemindDlg, FeedbackDlg, ContactTransfer, AddLabelDlg },
   props: {},
   data() {
     return {
@@ -246,6 +235,36 @@ export default {
       TransferMobile: 0,
 
       contactTransferDlgVisible: false, //联系人转移的弹框
+
+      addLabelDlgVisibility: false, // 销售输入标签
+      raiLabelId: "",
+
+      lableDescribe: [
+        {
+          Label: "搜索关键词标签",
+          SourceType: 1,
+        },
+        {
+          Label: "产业/个股标签(线上活动/路演/路演回放)",
+          SourceType: 5,
+        },
+        {
+          Label: "报告类型标签",
+          SourceType: 8,
+        },
+        {
+          Label: "产业/个股标签(线下活动/路演)",
+          SourceType: 2,
+        },
+        {
+          Label: "销售输入标签",
+          SourceType: 6,
+        },
+        {
+          Label: "产业/个股标签(报告)",
+          SourceType: 7,
+        },
+      ],
     };
   },
   computed: {},
@@ -399,12 +418,35 @@ export default {
       window.open(href, "_blank");
     },
     /* 标签下的单独的某一个 */
-    labelChildren(key, row) {
+    labelChildren(id) {
       this.interactionDlg = true;
-      this.interactionFrom = {
-        id: row.UserId,
-        key,
-      };
+      this.raiLabelId = id;
+    },
+    // 点击删除标签的某一个
+    deleteLabel(item) {
+      if (item.SourceType == 6) {
+        this.$confirm("确定要删除此标签吗?", "删除标签", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        }).then(async () => {
+          const res = await equityContacts.userRaiLabelDel({
+            RaiLabelId: item.RaiLabelId,
+          });
+          if (res.Ret == 200) {
+            this.$message({
+              type: "success",
+              message: "删除成功!",
+            });
+            this.getCygxContactsList();
+          }
+        });
+      }
+    },
+    // 添加销售输入标签接口
+    labelChildrenAdd(item) {
+      this.addLabelDlgVisibility = true;
+      this.interactionFrom = item;
     },
     //鼠标经过了 机构互助量
     async isShowOrganization(row) {
@@ -446,13 +488,12 @@ export default {
       this.isShowRemindDlg = true;
     },
     sortChangeHandle(item) {
-      console.log(item.order);
       this.orderTable = item.order === "ascending" ? "asc" : item.order === "descending" ? "desc" : "";
       this.getCygxContactsList();
     },
     // 处理标签不能超过10个
     lookLabelListNumber(row) {
-      let arr = row.Labels ? row.Labels.split(",").splice(0, 10) : [];
+      let arr = row.RaiLabelList ? _.cloneDeep(row.RaiLabelList).splice(0, 6) : [];
       return arr;
     },
     // 展示弹框
@@ -473,10 +514,28 @@ export default {
     // 设置表格行的样式
     setRowClass({ row }) {
       if (row.IsMaker == 1) {
-        console.log(row);
         return "not-read-seven-days";
       }
     },
+    lookLabelColor(item) {
+      switch (item.SourceType) {
+        case 1:
+          return { backgroundColor: "#FFE5E6", color: "#D60808" };
+        case 2:
+        case 3:
+          return { backgroundColor: "#FDE5FF", color: "#891B98" };
+        case 4:
+        case 5:
+        case 9:
+          return { backgroundColor: "#FFEEE5", color: "#DD4D00" };
+        case 7:
+          return { backgroundColor: "#E5FCFF", color: "#076873" };
+        case 8:
+          return { backgroundColor: "#E5EAFF", color: "#1A31C5" };
+        default:
+          return {}; // 返回一个空对象表示没有样式
+      }
+    },
   },
   /* 页面跳转前记录参数 */
   beforeRouteLeave(to, from, next) {
@@ -568,9 +627,21 @@ export default {
   }
 }
 .popover-item {
+  display: flex;
+  flex-wrap: wrap;
   overflow: hidden;
   overflow-y: auto;
+  .label-tag {
+    padding: 0 10px;
+    font-size: 14px;
+    border-radius: 4px;
+    background-color: #eaf3fe;
+    color: #409eff;
+    margin: 5px 8px;
+    cursor: pointer;
+  }
 }
+
 .popover-not-have {
   width: 100%;
   text-align: center;

+ 1 - 1
src/views/custom_manage/customList/addCustom.vue

@@ -83,7 +83,7 @@
 			<el-form-item label="客户状态" prop="cuStatus" style="marginRight:120px;">
 				<i style="color:#f00;fontSize:20px;position:absolute;left:-90px;top:10%;">*</i>
 				<el-radio-group v-model="dataForm.cuStatus" size="medium" style="width:400px;">
-					<el-radio border label="试用"  style="width:184px;">试用(2个月)</el-radio>
+					<el-radio border label="试用"  style="width:184px;">试用({{typeArr.includes('权益') ? 1 : 2}}个月)</el-radio>
 					<el-radio border label="永续" style="width:184px;marginLeft:0;" v-if="Role=='admin'">永续</el-radio>
 				</el-radio-group>
 			</el-form-item>

+ 23 - 1
src/views/custom_manage/customList/customDetail.vue

@@ -417,6 +417,7 @@
 								>图表权限</span>
 								</block> -->
 								<p v-if="isUserYanXuanButtonShow" class="editsty" @click="isOpenMfyxStatusHandler(scope.row)">{{scope.row.MfyxStatus =='试用'?'关闭研选订阅试用':'开通研选订阅试用'}} </p>
+								<p  class="editsty" @click="lookUserLabler(scope.row)">查看个人标签 </p>
 							</div>
 						</template>
 					</el-table-column>
@@ -733,6 +734,10 @@
 		<HistoricalNotesDlg :historicalNotesDlgVisible.sync="historicalNotesDlgVisible" :CompanyId.sync="historicalNotesId"/>
 		<ContactTransfer :contactTransferDlgVisible.sync="contactTransferDlgVisible" :TransferMobile.sync="TransferMobile"/>
 		<edit-mobile :editMobileDialogVisible.sync="editMobileDialogVisible" :editMobileId="editMobileId" :outboundMobile="outboundMobile" isType="客户" />
+		<!-- <interactionDlg />	 -->
+		<InteractionDlg  :interactionDlg.sync="interactionDlg" :raiLabelId="raiLabelId"/>
+		 
+		 <LabelDlg :isShowLabelDlg.sync="isShowLabelDlg" :dlgLabelList.sync="dlgLabelList" @labelClick="labelChildren"  @getUpdateList="getuserTable"/>
 	</div>	
 </template>
 
@@ -756,9 +761,11 @@ import HistoricalNotesDlg from "@/components/historicalNotesDlg.vue";
 import ContactTransfer from './components/ContactTransferDlg.vue'
 
 import EditMobile from "../../rai_manage/components/editMobile.vue";
+import InteractionDlg from '../contacts/compontents/interactionDlg.vue'
+import LabelDlg from '../contacts/compontents/labelDlg.vue'
 export default {
 	name:'',
-	components: { Ctimeline, Contactdia, Readia, ElImageViewer, CpessionTable, pdf, chartAuthDialog, ExportData, CpessionTableEquity, ProductReadInfo, DeductDetailDlg, HistoryContract, HistoricalNotesDlg, ContactTransfer, EditMobile},
+	components: { Ctimeline, Contactdia, Readia, ElImageViewer, CpessionTable, pdf, chartAuthDialog, ExportData, CpessionTableEquity, ProductReadInfo, DeductDetailDlg, HistoryContract, HistoricalNotesDlg, ContactTransfer, EditMobile, InteractionDlg ,LabelDlg},
 	computed:{
 		Role() {
 			let role = localStorage.getItem('Role') || '';
@@ -896,6 +903,12 @@ export default {
 			editMobileDialogVisible: false,
 			editMobileId :0,
 			outboundMobile :0,
+
+			// 查看权益个人标签模块
+			isShowLabelDlg:false,
+			dlgLabelList:{},
+			interactionDlg:false,
+			raiLabelId:'',
 		};
 	},
 	methods: {
@@ -1729,6 +1742,15 @@ export default {
       this.editMobileId = id;
       this.outboundMobile = value;
     },
+	// 查看个人标签
+	lookUserLabler(row){
+		this.dlgLabelList = row;
+		this.isShowLabelDlg = true
+	},
+	labelChildren(id){
+		this.interactionDlg = true;
+      	this.raiLabelId = id;
+	},
 	},
 	mounted() {
 		this.getDetail();

+ 1 - 1
src/views/custom_manage/customList/customList.vue

@@ -532,7 +532,7 @@
 		center>
 			<div slot="title" style="display:flex;alignItems:center;">
 				<!-- <img :src="$icons.auth" style="color:#fff;width:16px;height:16px;marginRight:5px;"> -->
-				<span style="fontSize:16px;">增开试用(默认两个月)</span>
+				<span style="fontSize:16px;">增开试用(默认{{ RoleType == '权益' ? '一' : ''}}个月)</span>
 			</div>
 			<Cauthlist
 			:autharr="authList"

+ 1 - 1
src/views/custom_manage/customList/customShareList.vue

@@ -475,7 +475,7 @@
 		v-dialogDrag
 		center>
 			<div slot="title" style="display:flex;alignItems:center;">
-				<span style="fontSize:16px;">增开试用(默认两个月)</span>
+				<span style="fontSize:16px;">增开试用(默认{{ RoleType == '权益' ? '一' : ''}}个月)</span>
 			</div>
 			<Cauthlist
 				:autharr="authList"

+ 6 - 2
src/views/custom_manage/customList/pickCustom.vue

@@ -16,7 +16,7 @@
 				</li>
 				<li>
 					<label style="marginRight:60px;width:80px;textAlign:right;display:inline-block;">客户状态</label>
-					<el-radio border :label="basicInfo.cuStatus" style="width:184px;marignRight:200px;" v-model="basicInfo.cuStatus">{{basicInfo.cuStatus=='试用'?'试用(2个月)':basicInfo.cuStatus}}</el-radio>
+					<el-radio border :label="basicInfo.cuStatus" style="width:184px;marignRight:200px;" v-model="basicInfo.cuStatus">{{basicInfo.cuStatus=='试用'?`试用(${roleType == '权益' ? 1 : 2}个月)`:basicInfo.cuStatus}}</el-radio>
 				</li>
 				<li>
 					<label style="marginRight:60px;width:80px;textAlign:right;display:inline-block;">客户类型</label>
@@ -78,7 +78,7 @@
 						<el-form-item label="客户状态" prop="cuStatus">
 							<i style="color:#f00;fontSize:20px;position:absolute;left:-90px;top:10%;">*</i>
 							<el-radio-group v-model="pickForm.cuStatus" size="medium">
-								<el-radio border label="试用" style="width:184px;">试用(2个月)</el-radio>
+								<el-radio border label="试用" style="width:184px;">试用({{roleType == '权益' ? 1 : 2}}个月)</el-radio>
 							</el-radio-group>
 						</el-form-item>
 						<el-form-item label="客户类型" prop="custype" style="marginRight:120px;">
@@ -170,6 +170,10 @@ export default {
 			let role = localStorage.getItem('Role') || '';
 			return role;
 		},
+		roleType() {
+			let type = localStorage.getItem('RoleType') || '';
+			return type;
+		}
 	},	
 	data () {
 		return {

+ 5 - 4
src/views/rai_manage/activityManage/activityManage.vue

@@ -71,7 +71,8 @@
               <p :class="row.PublishStatus == 3 ? 'grey-color' : '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 class="editsty" v-if="row.IsShowSigninButton" @click="handleDownLoadImg(row, '签到')">下载签到码</p>
+              <p class="editsty" v-if="row.ActiveState == 1 && !isResearch" @click="handleDownLoadImg(row, '详情')">下载小程序码</p>
               <p v-if="row.ChartPermissionId === 31 && tabsPitchon == 0 && row.PublishStatus == 1" class="editsty" @click="overheadHandler(row.ActivityId, '置顶')">
                 &nbsp;&nbsp;{{ row.TopTime == 0 ? "置顶" : "取消置顶" }}
               </p>
@@ -307,10 +308,10 @@ export default {
       this.dialogVisible = true;
     },
     // 下载图片
-    handleDownLoadImg(row) {
+    handleDownLoadImg(row, type) {
       let img = new Image();
       img.setAttribute("crossOrigin", "anonymous");
-      img.src = row.SigninImg;
+      img.src = type == "签到" ? row.SigninImg : row.XcxDetailImg;
       img.onload = () => {
         let canvas = document.createElement("canvas");
         canvas.width = img.width;
@@ -319,7 +320,7 @@ export default {
         context.drawImage(img, 0, 0, img.width, img.height);
         let dataURL = canvas.toDataURL("image/png", 1);
         const a = document.createElement("a");
-        a.setAttribute("download", "签到码.png");
+        a.setAttribute("download", `${row.ActivityName}签到码.png`);
         a.style.display = "none";
         a.href = dataURL;
         document.body.appendChild(a);

+ 1 - 1
src/views/rai_manage/components/addChoiceness.vue

@@ -496,7 +496,7 @@ export default {
               clearInterval(this.timeInterval);
               sessionStorage.removeItem("addChoicenessQY");
               this.$message.success("操作成功!");
-              this.init();
+              type != "保存" && this.init();
               type != "保存" && this.$router.back();
             }
           }

+ 2 - 3
src/views/rai_manage/cygxManage/components/lableDlg.vue

@@ -11,7 +11,7 @@
           添加活动
         </div>
       </div>
-      <div class="text-content" v-else>{{ visibleText }}</div>
+      <div class="text-content" v-else v-html="visibleText"></div>
       <span slot="footer" class="dialog-footer">
         <template v-if="dataRegular.TagType == 1">
           <el-button @click="handleClose">取 消</el-button>
@@ -58,7 +58,7 @@ export default {
           : this.dataRegular.TagType == 4
           ? "所有问答系列音频"
           : this.dataRegular.TagType == 5
-          ? "医药-趋势观察 ,科技-产业跟踪 ,智造-产业跟踪 ,消费-月度调研,策略-每日复盘,固收-债市复盘"
+          ? "医药-趋势观察 ,科技-产业跟踪 ,智造-产业跟踪 ,消费-月度调研,策略-每日复盘<br/>固收-债市复盘,消费-产业跟踪"
           : "";
       return str;
     },
@@ -165,7 +165,6 @@ export default {
 .lable-add-content {
   .text-content {
     width: 620px;
-    height: 40px;
     line-height: 40px;
     border-radius: 4px;
     border: 1px solid #dcdfe6;

+ 90 - 5
src/views/roadshow_manage/compononts/activityDetailDia.vue

@@ -3,11 +3,36 @@
       v-dialogDrag
       :title="title"
       :visible.sync="isShow"
-      :modal-append-to-body="false"
+      :modal-append-to-body="true"
+    	:append-to-body="true"
       @close="cancel"
-			width="850px"
+			width="900px"
 			class="statistic-dialog-cont"
     >
+		<div>
+			<!-- 区域筛选 -->
+			<el-select v-model="regionValue" v-if="region!=='oversea'" @change="getStatisticDetail">
+				<el-option :value="-1" label="全部区域"></el-option>
+				<el-option :value="0" label="国内"></el-option>
+				<el-option :value="1" label="海外"></el-option>
+			</el-select>
+			<template v-if="hasQustion">
+			<el-select v-model="statusType" @change="getStatisticDetail">
+				<el-option label="全部" :value="0"></el-option>
+				<el-option label="已完成" :value="1"></el-option>
+			</el-select>
+			<el-tooltip 
+				effect="dark"
+				placement="top"
+			>
+				<div slot="content">
+					<div>已完成:研究员已接受、已填写客户问答的路演</div>
+					<div>全部:研究员已接受的路演</div>
+				</div>
+				<i class="el-icon-info"></i>
+			</el-tooltip>
+			</template>
+		</div>
 		<el-table
 			:data="tableData"
 			class="table-cont"
@@ -44,26 +69,50 @@
 
 						<el-tooltip effect="dark" placement="top-start" v-if="row.CompanyId"  @mouseenter.native="getCompanyInfo(row)" popper-class="company-tip-poper">
 							<i class="el-icon-info"/>
+							
 							<div slot="content" v-if="companyInfo">
+								<!-- 国内客户 -->
+								<template v-if="companyInfo.EnglishCompany===0">
 								<p style="margin: 6px 0;">客户状态:{{companyInfo.Status}}</p>
 								<p style="margin: 6px 0;">所属行业:{{companyInfo.IndustryName}}</p>
 								<p style="margin: 6px 0;text-indent: -70px;margin-left: 70px;">开通{{form.departmentType == '权益'  ? '行业:':'品种:'}}{{companyInfo.PermissionName}}</p>
 								<p style="margin: 6px 0;">{{form.departmentType == '权益' ? '累计互动次数':'累计报告阅读次数'}}:{{companyInfo.ReportReadTotal}}</p>
+								</template>
+								<!-- 海外客户 -->
+								<template v-if="companyInfo.EnglishCompany===1">
+								<p style="margin: 6px 0;">客户状态:{{companyInfo.Status}}</p>
+								<p style="margin: 6px 0;">所属国家:{{companyInfo.EnglishCountry}}</p>
+								<p style="margin: 6px 0;">{{form.departmentType == '权益' ? '累计互动次数':'累计报告阅读次数'}}:{{companyInfo.EnglishViewTotal}}</p>
+								</template>
 							</div>
 						</el-tooltip>
 					</span>
+					<div v-else-if="item.key==='roadAnswer'">
+						<span v-if="row.CompanyIndustry">客户行业:{{ row.CompanyIndustry }}</span>
+						<span v-if="row.CompanyClassify">客户分类:{{ row.CompanyClassify }}</span>
+						<el-button type="text" @click="handleShowRoasShowQuestion(row)" v-if="row.QuestionStatus===1">问答详情</el-button>
+					</div>
 
 					<span v-else>{{ row[item.key] || '——' }}</span>
 
 				</template>
 			</el-table-column>
 		</el-table>
+
+		<!-- 查看问答 -->
+    <viewAnswer 
+			:isShow.sync="isShowViewAnswer"
+      :roadAnswerData="currentAddAnswerData"
+      :RsCalendarResearcherId="currentAddAnswerData.RsCalendarResearcherId"
+    />
 	</el-dialog>	
 </template>
 
 <script>
 import { roadshowInterence } from '@/api/api.js';
+import viewAnswer from './viewAnswer.vue'
 export default {
+	components:{viewAnswer},
 	props: {
 		title: {
 			type: String
@@ -82,6 +131,10 @@ export default {
 		region: {
 			type: String,
 			default: 'home'
+		},
+		hasQustion:{//是否显示问答
+			type:Boolean,
+			default:false
 		}
 	},
 	watch: {
@@ -96,11 +149,20 @@ export default {
 		return {
 			companyInfo: null,
 			tableColumns:[], //
-			tableData: []
+			tableData: [],
+			statusType:1,
+			isShowViewAnswer:false,
+			currentAddAnswerData:{},
+			regionValue:-1,
 		}
 	},
 	methods: {
 
+		handleShowRoasShowQuestion(item){
+			this.currentAddAnswerData=item
+			this.isShowViewAnswer=true
+		},
+
 		/* 获取列表 */
 		getStatisticDetail() {
 			const { startDate,endDate,userid,key } = this.form;
@@ -139,7 +201,9 @@ export default {
 					StartDate: startDate,
 					EndDate: endDate,
 					AdminId: userid,
-					AdminType: this.fromType
+					AdminType: this.fromType,
+					Status:this.hasQustion?this.statusType:0,
+					EnglishCompany:this.regionValue,
 				}).then(res => {
 					const { Ret,Data } = res;
 
@@ -154,6 +218,8 @@ export default {
 
 		/* 取消 */
 		cancel() {
+			this.statusType=this.hasQustion?1:0
+			this.regionValue=-1
 			this.$emit('update:isShow', false);
 		},
 
@@ -162,7 +228,9 @@ export default {
       const { Data }  = await roadshowInterence.componyDetail({ 
 		CompanyId:row.CompanyId,
 		RsReportRecordId:row.RsReportRecordId,
-		CompanyType:this.form.departmentType 
+		CompanyType:this.form.departmentType,
+		SellerId:row.SellerId,
+		EnglishCompany:row.EnglishCompany
 		});
       this.companyInfo = Data;
     },
@@ -220,6 +288,23 @@ export default {
 						},
 						{ ...dynamic_column }
 				]	
+			// 增加问答列
+			if(this.hasQustion&&this.title==='路演详情'){
+				this.tableColumns=[
+					...this.tableColumns,
+					{
+						label: '客户类型',
+						key: 'CompanyType',
+						minwidthsty: '100px',
+					},
+					{
+						label: '客户问答',
+						key: 'roadAnswer',
+						minwidthsty: '250px',
+					},
+				]
+				this.statusType=1
+			}
 			this.tableColumns = this.tableColumnsHandler()
 			this.$refs.tableRef && this.$refs.tableRef.clearSort()
 			this.$nextTick(()=>{

+ 290 - 0
src/views/roadshow_manage/compononts/addAnswer.vue

@@ -0,0 +1,290 @@
+<template>
+  <el-dialog
+    v-dialogDrag
+    :title="companyName+'客户问答'"
+    :visible.sync="isShow"
+    :modal-append-to-body="true"
+    :append-to-body="true"
+    @close="handleCancel"
+    width="750px"
+    class="answer-dialog"
+  >
+    <el-form 
+      :model="ruleForm" 
+      :rules="rules" 
+      label-width="80px"
+      ref="ruleForm"
+      class="ruleForm-wrap"
+    >
+      <div class="flex-box">
+        <el-form-item label="客户行业" prop="industry">
+          <el-select v-model="ruleForm.industry" placeholder="请选择客户行业">
+            <el-option 
+              v-for="item in industryOpts" 
+              :key="item.value" 
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="客户分类" prop="type">
+          <el-select v-model="ruleForm.type" placeholder="请选择客户分类">
+            <el-option 
+              v-for="item in customTypeOpts" 
+              :key="item.value" 
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </div>
+      <div class="answer-list">
+        <div class="answer-item" v-for="item,index in ruleForm.list" :key="index">
+          <img class="del-icon" src="~@/assets/img/icons/delete-Item.png" alt="" v-if="ruleForm.list.length>2" @click="handleDelQuestion(index)">
+          <el-form-item
+            :label="'Q'+(index+1)"
+            :prop="`list.${index}.question`"
+            :rules="{
+              required: true,
+              message: '请填写问题',
+              trigger: 'blur',
+            }"
+          >
+            <el-input
+              placeholder="请输入内容"
+              v-model="item.question"
+              style="width: 580px;"
+            ></el-input>
+          </el-form-item>
+          <el-form-item
+            :label="'A'+(index+1)"
+            :prop="`list.${index}.answer`"
+            :rules="[
+              {
+                required: true,
+                message: '请输入内容',
+                trigger: 'blur',
+              },
+              {
+                type: 'string',
+                min: 30,
+                message: '字数不少于30字',
+                trigger: 'blur'
+              }
+            ]"
+          >
+            <el-input
+              placeholder="请输入内容"
+              type="textarea"
+              v-model="item.answer"
+              style="width: 580px;"
+            ></el-input>
+          </el-form-item>
+        </div>
+      </div>
+    </el-form>
+    <div class="add-btn-box" @click="handleAddQuestion">
+      <img class="add-icon" src="~@/assets/img/icons/add_blue.png">
+      <span>添加更多</span>
+    </div>
+    <div class="btn-group">
+      <el-button @click="handleCancel">取消</el-button>
+      <el-button type="primary" @click="handleSubmit">提交</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { roadshowInterence } from "@/api/api.js";
+export default {
+  props: {
+		isShow: {
+			type: Boolean
+		},
+    companyName:'',
+    RsCalendarResearcherId:{
+      type:Number,
+      default:0
+    },
+    RsCalendarId:{
+      type:Number,
+      default:0
+    }
+	},
+	watch: {
+		isShow(newval) {
+			if(newval) {
+						
+			}
+		}
+	},
+  data () {
+    return {
+      industryOpts:[
+        {
+          label:'黑色',
+          value:'黑色'
+        },
+        {
+          label:'有色',
+          value:'有色'
+        },
+        {
+          label:'能化',
+          value:'能化'
+        },
+        {
+          label:'综合',
+          value:'综合'
+        },
+        {
+          label:'金融',
+          value:'金融'
+        },
+        {
+          label:'农产品',
+          value:'农产品'
+        }
+      ],
+      customTypeOpts:[ 
+      {
+          label:'上游',
+          value:'上游'
+        },
+        {
+          label:'中游',
+          value:'中游',
+        },
+        {
+          label:'下游',
+          value:'下游',
+        },
+        {
+          label:'投资',
+          value:'投资',
+        }
+      ],
+      ruleForm:{
+        industry:'',
+        type:'',
+        list:[
+          {
+            question:'',
+            answer:''
+          },
+          {
+            question:'',
+            answer:''
+          }
+        ]
+      },
+      rules:{
+        industry:[{ required: true, message: '请选择客户行业', trigger: 'change' }],
+        type:[{ required: true, message: '请选择客户类型', trigger: 'change' }]
+      }
+    }
+  },
+  methods: {
+    handleCancel(){
+      this.$refs.ruleForm.resetFields();
+      this.$emit('update:isShow', false);
+    },
+
+    async handleSubmit(){
+      await this.$refs.ruleForm.validate();
+      await this.$confirm('客户问答只能提交一次,确认提交吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+      const qArr=this.ruleForm.list.map(item=>{
+        return {
+          QuestionContent:item.question,
+          ReplyContent:item.answer
+        }
+      })
+      const res=await roadshowInterence.addRoadShowQuestion({
+        RsCalendarId:this.RsCalendarId,
+        RsCalendarResearcherId:this.RsCalendarResearcherId,
+        CompanyIndustry:this.ruleForm.industry,
+        CompanyClassify:this.ruleForm.type,
+        QuestionList:qArr
+      })
+      if(res.Ret===200){
+        this.$message.success('提交成功')
+        this.$emit('success')
+        this.handleCancel()
+      }
+    },
+
+    handleAddQuestion(){
+      this.ruleForm.list.push({
+        question:'',
+        answer:''
+      })
+    },
+
+    handleDelQuestion(index){
+      this.ruleForm.list.splice(index, 1)
+    }
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.ruleForm-wrap{
+  padding-right: 50px;
+  .flex-box{
+    display: flex;
+    justify-content: space-between;
+    .el-form-item{
+      flex-shrink: 0;
+      min-width: 300px;
+    }
+  }
+  .answer-list{
+    // max-height: 50vh;
+    // overflow-y: auto;
+    .answer-item{
+      position: relative;
+      .del-icon{
+        width: 20px;
+        height: 20px;
+        position: absolute;
+        top: 10px;
+        right: -25px;
+        cursor: pointer;
+      }
+    }
+  }
+}
+.answer-dialog{
+  .ruleForm-wrap{
+    overflow-y: auto;
+    max-height: 60vh;
+    &::-webkit-scrollbar{
+      width: 2px;
+      background: #ccc
+    }
+  }
+  .add-btn-box{
+    padding-left: 34px;
+    display: flex;
+    align-items: center;
+    gap: 0 5px;
+    color: #456DD6;
+    cursor: pointer;
+    .add-icon{
+      width: 16px;
+      height: 16px;
+    }
+  }
+  .btn-group {
+    margin: 20px 0;
+    text-align: center;
+    .el-button {
+      width: 140px;
+    }
+  }
+}
+</style>

+ 180 - 0
src/views/roadshow_manage/compononts/viewAnswer.vue

@@ -0,0 +1,180 @@
+<template>
+  <el-dialog
+    v-dialogDrag
+    :title="roadAnswerData.CompanyName+'客户问答'"
+    :visible.sync="isShow"
+    :modal-append-to-body="true"
+    :append-to-body="true"
+    @close="handleCancel"
+    width="750px"
+    class="answer-dialog"
+  >
+    <!-- 单个研究员的问题详情 -->
+    <div class="answer-wrap" v-if="ResearcherId.split(',').length<2">
+      <div class="top-box">
+        <div style="flex: 1;">
+          <span class="label">客户行业:</span>
+          <span>{{roadAnswerData.CompanyIndustry}}</span>
+        </div>
+        <div style="flex: 1;">
+          <span class="label">客户分类:</span>
+          <span>{{roadAnswerData.CompanyClassify}}</span>
+        </div>
+      </div>
+      <div class="answer-list">
+        <div class="answer-item" v-for="item,index in list" :key="index">
+          <div class="info-item">
+            <div class="label">Q{{ index +1}}:</div>
+            <div>{{item.QuestionContent}}</div>
+          </div>
+          <div class="info-item">
+            <div class="label">A{{ index+1 }}:</div>
+            <div>{{item.ReplyContent}}</div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!-- 多个研究员 -->
+    <div class="answer-list" v-else>
+      <div class="group-item" v-for="group in list" :key="group.id">
+        <div class="answer-item" v-for="item,index in group.list" :key="index">
+          <div class="info-item">
+            <div class="label">
+              <span v-if="index===0" style="color:#333">{{ group.name }}</span>
+              Q{{ index +1}}:
+            </div>
+            <div>{{item.QuestionContent}}</div>
+          </div>
+          <div class="info-item">
+            <div class="label">A{{ index+1 }}:</div>
+            <div>{{item.ReplyContent}}</div>
+          </div>
+        </div>
+      </div>
+      
+    </div>
+
+  </el-dialog>
+</template>
+
+<script>
+import { roadshowInterence } from "@/api/api.js";
+export default {
+  props: {
+		isShow: {
+			type: Boolean
+		},
+    roadAnswerData:{},
+
+    RsCalendarResearcherId:{
+      type:Number,
+      default:0
+    },
+    RsCalendarId:{
+      type:Number,
+      default:0
+    },
+    ResearcherId:{//如果是在路演问题统计表中来的则有该字段数据 这时候根据是否有多个人来判断
+      type:String,
+      default:''
+    }
+	},
+	watch: {
+		isShow(newval) {
+			if(newval&&this.RsCalendarResearcherId) {
+				this.getInfo()
+			}
+		}
+	},
+  data () {
+    return {
+      list:[]
+    }
+  },
+  methods: {
+    handleCancel(){
+      this.$emit('update:isShow', false);
+    },
+    groupById(arr) {
+      const grouped = arr.reduce((acc, item) => {
+        const id = item.ResearcherId;
+        // 如果当前id不存在,初始化一个分组
+        if (!acc[id]) {
+          acc[id] = { id: id,name:item.ResearcherName, list: [] };
+        }
+        // 将当前项添加到对应的list中
+        acc[id].list.push(item);
+        return acc;
+      }, {}); // 初始值为空对象,用于存储按id分组的临时数据
+
+      // 将分组对象转换为数组
+      return Object.values(grouped);
+    },
+
+    async getInfo(){
+      let params={}
+      if(this.ResearcherId.split(',').length>1){
+        params={
+          RsCalendarId:this.RsCalendarId
+        }
+      }else{
+        params={
+          RsCalendarResearcherId:this.RsCalendarResearcherId
+        }
+      }
+      const res=await roadshowInterence.roadShowQuestionInfo(params)
+      if(res.Ret===200){
+        let arr=res.Data||[]
+        // 根据研究员划分
+        if(this.ResearcherId.split(',').length>1){
+          arr=this.groupById(arr)
+        }
+        this.list=arr
+      }
+    }
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.answer-wrap{
+  .label{
+    color: #999999;
+    flex-shrink: 0;
+    display: inline-block;
+    width: 100px;
+    text-align: right;
+  }
+  .top-box{
+    display: flex;
+    margin-bottom: 10px;
+  }
+  
+}
+.answer-list{
+  max-height: 60vh;
+  overflow-y: auto;
+  .group-item{
+    border-bottom: 1px dashed #C0C4CC;
+    margin-bottom: 10px;
+    &:last-child{
+      border: none;
+    }
+  }
+    .answer-item{
+      margin-bottom: 14px;
+      .info-item{
+        display: flex;
+        margin-bottom: 14px;
+        line-height: 1.5;
+        .label{
+          flex-shrink: 0;
+          text-align: right;
+          width: 100px;
+          color: #999999;
+        }
+      }
+    }
+  }
+
+</style>

+ 319 - 184
src/views/roadshow_manage/myCalendar.vue

@@ -1,193 +1,246 @@
 <template>
   <div class="my-calendar">
     <el-card class="my-calendar-list">
-      <ul class="tabs-type">
-        <li :class="['type-item',{ 'act': default_tab === tab.key }]" v-for="tab in tabs" :key="tab.key"  @click="default_tab=tab.key">{{tab.label}}</li>
-      </ul>
+      <div class="top-wrap">
+        <ul class="tabs-type">
+          <li :class="['type-item',{ 'act': default_tab === tab.key }]" v-for="tab in tabs" :key="tab.key"  @click="default_tab=tab.key">{{tab.label}}</li>
+        </ul>
+        <!-- 已处理申请筛选模块 -->
+        <div class="filter-wrap" v-if="default_tab===2 ">
+          <el-select placeholder="请选择状态" v-model="roadStatus" clearable @change="handleCurrentChange(1)">
+            <el-option 
+              v-for="item in roadStatusOpts" 
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+          <el-date-picker
+            clearable
+            v-model="roadTime"
+            type="daterange"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            value-format="yyyy-MM-dd"
+            @change="handleCurrentChange(1)"
+          />
+          <el-input
+            placeholder="客户名称"
+            prefix-icon="el-icon-search"
+            v-model="roadSearchVal"
+            style="display:inline-block;width:300px;margin-left: auto;"
+            clearable
+            @change="handleCurrentChange(1)"
+          />
+        </div>
+      </div>
       <el-table
 				:data="tableData"
         v-loading="tableLoading"
         element-loading-text="数据加载中..." 
 				style="box-shadow: 0px 3px 6px rgba(155, 170, 219, 0.2);margin-top:20px;"
-				border>
-					<el-table-column
-            v-if="!item.hidden"
-						v-for="item in tableColums"
-						:key="item.label"
-						:label="item.label"
-						:width="item.widthsty"
-						:min-width="item.minwidthsty"
-						align="center"
-					>
-						<template slot-scope="{row}">
-
-              <!-- 时间处理 -->
-              <span v-if="item.key === 'time'">
-                {{
-                  row.StartDate === row.EndDate
-                  ? ($moment(row.StartDate + " " + row.StartTime).format(
-                    "MM.DD(ddd) HH:mm") + '~' +  $moment(row.EndDate + " " + row.EndTime).format("HH:mm"))
-                  : (
-                    $moment(row.StartDate + " " + row.StartTime).format(
-                    "MM.DD(ddd) HH:mm") + '~' + $moment(row.EndDate + " " + row.EndTime).format("MM.DD(ddd) HH:mm")
-                  )
-                }}
-              </span>
-
-              <!-- 活动形式 -->
-              <span v-else-if="item.key === 'RoadshowType'">
-                {{row.RoadshowType}} {{ row.RoadshowType === '线上' ? `(${row.RoadshowPlatform}  )` : `(${row.Province}${row.City}${row.District})`}}
-              </span>
-
-              <!-- 状态 -->
-              <span v-else-if="item.key === 'Status'" 
-              :class="row.Status === 2 ? 'successty' : row.Status === 3 ? 'deletesty' : '' ">
-                {{statusMap.get(row.Status)}}
-                <i 
-                  class="el-icon-info" 
-                  style="color:#666;" 
-                  v-if="[3,4].includes(row.Status) && ENUM_RESEARCHLIST.includes(Role)"
-                  @click="iconClick(row)"
-                />
-              </span>
-
-              <!-- 客户拼接 -->
-              <span v-else-if="item.key === 'company'">
-                {{ row.CooperationName || row.CompanyName || '——'}}
-
-                <el-tooltip effect="dark" placement="top-start" v-if="row.CompanyId"  @mouseenter.native="getCompanyInfo(row)" popper-class="company-tip-poper">
-                  <i class="el-icon-info"/>
-                  <div slot="content" v-if="companyInfo">
-                    <!-- 权益客户 -->
-                    <template v-if="Role.includes('rai')">
-                        <p style="margin: 6px 0;">客户状态:{{companyInfo.Status}}</p>
-                        <p style="margin: 6px 0;">所属行业:{{companyInfo.IndustryName}}</p>
-                        <p style="margin: 6px 0;text-indent: -70px;margin-left: 70px;">行业权限:{{companyInfo.PermissionName}}</p>
-                        <p style="margin: 6px 0;">累计互动次数:{{companyInfo.ReportReadTotal}}</p>
-                    </template>
-                    <!-- ficc客户分国内海外 -->
-                    <template v-else>
-                        <template v-if="companyInfo.EnglishCompany===1">
-                            <p style="margin: 6px 0;">所属国家:{{companyInfo.EnglishCountry}}</p>
-                            <p style="margin: 6px 0;">累计点击量:{{companyInfo.EnglishViewTotal}}</p>
-                        </template>
-                        <template v-else>
-                            <p style="margin: 6px 0;">客户状态:{{companyInfo.Status}}</p>
-                            <p style="margin: 6px 0;">所属行业:{{companyInfo.IndustryName}}</p>
-                            <p style="margin: 6px 0;text-indent: -70px;margin-left: 70px;">开通品种:{{companyInfo.PermissionName}}</p>
-                            <p style="margin: 6px 0;">累计报告阅读次数:{{companyInfo.ReportReadTotal}}</p>
-                        </template>
-                    </template>
-                  </div>
-                </el-tooltip>
-              </span>
-
-							<span v-else>{{ row[item.key] || '——' }}</span>
-						</template>
-					</el-table-column>
-          <el-table-column label="操作" align="center" v-if="handleArr.length">
-            <template slot-scope="{ row }" >
-            
-            <template  v-if="![4,6].includes(row.Status) && ($moment(`${row.StartDate} ${row.StartTime}`).valueOf() > new Date().getTime())">
-              <template v-if="default_tab === 1">
-                <span
-                  class="editsty"
-                  v-if="handleArr.includes('撤回')"
-                  @click="revocation(row)"
-                  >撤回</span>
-                <span
-                  class="editsty"
-                  v-if="handleArr.includes('接受')"
-                  @click="accept(row)"
-                  >接受</span>
-                <span
-                  class="editsty"
-                  v-if="handleArr.includes('拒绝')"
-                  @click="refuse(row)"
-                  >拒绝</span>
-              </template>
+				border
+      >
+        <el-table-column
+          v-if="!item.hidden"
+          v-for="item in tableColums"
+          :key="item.label"
+          :label="item.label"
+          :width="item.widthsty"
+          :min-width="item.minwidthsty"
+          align="center"
+        >
+          <template slot-scope="{row}">
+
+            <!-- 时间处理 -->
+            <span v-if="item.key === 'time'">
+              {{
+                row.StartDate === row.EndDate
+                ? ($moment(row.StartDate + " " + row.StartTime).format(
+                  "MM.DD(ddd) HH:mm") + '~' +  $moment(row.EndDate + " " + row.EndTime).format("HH:mm"))
+                : (
+                  $moment(row.StartDate + " " + row.StartTime).format(
+                  "MM.DD(ddd) HH:mm") + '~' + $moment(row.EndDate + " " + row.EndTime).format("MM.DD(ddd) HH:mm")
+                )
+              }}
+            </span>
+
+            <!-- 活动形式 -->
+            <span v-else-if="item.key === 'RoadshowType'">
+              {{row.RoadshowType}} {{ row.RoadshowType === '线上' ? `(${row.RoadshowPlatform}  )` : `(${row.Province}${row.City}${row.District})`}}
+            </span>
+
+            <!-- 状态 -->
+            <span v-else-if="item.key === 'Status'" 
+            :class="row.Status === 2 ? 'successty' : row.Status === 3 ? 'deletesty' : '' ">
+              {{statusMap.get(row.Status)}}{{row.Status===2&&row.QuestionStatus===1?'(已填写)':''}}
+              <i 
+                class="el-icon-info" 
+                style="color:#666;" 
+                v-if="[3,4].includes(row.Status) && ENUM_RESEARCHLIST.includes(Role)"
+                @click="iconClick(row)"
+              />
+            </span>
+
+            <!-- 客户拼接 -->
+            <span v-else-if="item.key === 'company'">
+              {{ row.CooperationName || row.CompanyName || '——'}}
+
+              <el-tooltip effect="dark" placement="top-start" v-if="row.CompanyId"  @mouseenter.native="getCompanyInfo(row)" popper-class="company-tip-poper">
+                <i class="el-icon-info"/>
+                <div slot="content" v-if="companyInfo">
+                  <!-- 权益客户 -->
+                  <template v-if="Role.includes('rai')">
+                      <p style="margin: 6px 0;">客户状态:{{companyInfo.Status}}</p>
+                      <p style="margin: 6px 0;">所属行业:{{companyInfo.IndustryName}}</p>
+                      <p style="margin: 6px 0;text-indent: -70px;margin-left: 70px;">行业权限:{{companyInfo.PermissionName}}</p>
+                      <p style="margin: 6px 0;">累计互动次数:{{companyInfo.ReportReadTotal}}</p>
+                  </template>
+                  <!-- ficc客户分国内海外 -->
+                  <template v-else>
+                      <template v-if="companyInfo.EnglishCompany===1">
+                          <p style="margin: 6px 0;">所属国家:{{companyInfo.EnglishCountry}}</p>
+                          <p style="margin: 6px 0;">累计点击量:{{companyInfo.EnglishViewTotal}}</p>
+                      </template>
+                      <template v-else>
+                          <p style="margin: 6px 0;">客户状态:{{companyInfo.Status}}</p>
+                          <p style="margin: 6px 0;">所属行业:{{companyInfo.IndustryName}}</p>
+                          <p style="margin: 6px 0;text-indent: -70px;margin-left: 70px;">开通品种:{{companyInfo.PermissionName}}</p>
+                          <p style="margin: 6px 0;">累计报告阅读次数:{{companyInfo.ReportReadTotal}}</p>
+                      </template>
+                  </template>
+                </div>
+              </el-tooltip>
+            </span>
+
+            <span v-else>{{ row[item.key] || '——' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center" v-if="handleArr.length">
+          <template slot-scope="{ row }" >
+          
+          <template  v-if="![4,6].includes(row.Status) && ($moment(`${row.StartDate} ${row.StartTime}`).valueOf() > new Date().getTime())">
+            <template v-if="default_tab === 1">
+              <span
+                class="editsty"
+                v-if="handleArr.includes('撤回')"
+                @click="revocation(row)"
+                >撤回</span>
+              <span
+                class="editsty"
+                v-if="handleArr.includes('接受')"
+                @click="accept(row)"
+                >接受</span>
+              <span
+                class="editsty"
+                v-if="handleArr.includes('拒绝')"
+                @click="refuse(row)"
+                >拒绝</span>
+            </template>
 
-              <template v-if="default_tab === 2">
-                <span
-                  class="deletesty"
-                  v-if="handleArr.includes('删除') && row.Status === 2"
-                  @click="deleteRoadshow(row)"
-                  >删除</span
-                >
-                <span
-                  class="editsty"
-                  v-if="handleArr.includes('拒绝理由') && row.Status === 3"
-                  @click="showRefuseReason(row)"
-                  >拒绝理由</span>
-                <span
-                  class="editsty"
-                  v-if="handleArr.includes('修改重提') &&  [3,5].includes(row.Status)"
-                  @click="resubmit(row)"
-                  >修改重提</span>
-              </template>
+            <template v-if="default_tab === 2"> 
+              <span
+                class="deletesty"
+                v-if="handleArr.includes('删除') && row.Status === 2"
+                @click="deleteRoadshow(row)"
+                >删除</span
+              >
+              <span
+                class="editsty"
+                v-if="handleArr.includes('拒绝理由') && row.Status === 3"
+                @click="showRefuseReason(row)"
+                >拒绝理由</span>
+              <span
+                class="editsty"
+                v-if="handleArr.includes('修改重提') &&  [3,5].includes(row.Status)"
+                @click="resubmit(row)"
+                >修改重提</span>
+            </template>
 
-              <template v-if="[3,4].includes(default_tab)">
-                <span
-                  class="editsty"
-                  v-if="handleArr.includes('修改')"
-                  @click="editActivityHandle(row)"
-                  >修改</span>
-                <span
-                  class="deletesty"
-                  @click="delNormalHandle(row)"
-                  v-if="handleArr.includes('删除')"
-                  >删除</span>
-              </template>
+            <template v-if="[3,4].includes(default_tab)">
+              <span
+                class="editsty"
+                v-if="handleArr.includes('修改')"
+                @click="editActivityHandle(row)"
+                >修改</span>
+              <span
+                class="deletesty"
+                @click="delNormalHandle(row)"
+                v-if="handleArr.includes('删除')"
+                >删除</span>
             </template>
-            <!-- 事项的操作栏由后端控制 -->
-            <template v-if="default_tab===5">
-                <!-- <span class="editsty" v-if="row.EditReason" @click="showReason(row)">最近修改记录</span> -->
+          </template>
+          <!-- 事项的操作栏由后端控制 -->
+          <template v-if="default_tab===5">
+              <!-- <span class="editsty" v-if="row.EditReason" @click="showReason(row)">最近修改记录</span> -->
+              <span
+                class="editsty"
+                v-if="!row.ButtonAuth.EditDisabled"
+                @click="editActivityHandle(row)"
+                >修改</span>
+              <span
+                class="deletesty"
+                @click="delNormalHandle(row)"
+                v-if="!row.ButtonAuth.RemoveDisabled"
+                >删除</span>
+          </template>
+          <!-- 提交/查看参会名单 按钮由后端控制 -->
+          <template v-if="default_tab===2&&!ENUM_RESEARCHLIST.includes(Role)">
+            <span
+                class="editsty"
+                v-if="row.EditButton"
+                @click="editActivityHandle(row)"
+                >修改</span>
+                <span 
+                  class="deletesty"
+                  v-if="row.SubmitButton"
+                  @click="submitAttendees(row,'提交')"
+                >提交参会名单</span>
                 <span
                   class="editsty"
-                  v-if="!row.ButtonAuth.EditDisabled"
-                  @click="editActivityHandle(row)"
-                  >修改</span>
+                  v-if="row.ViewButton"
+                  @click="submitAttendees(row,'查看')"
+                >查看参会名单
+                </span>
                 <span
-                  class="deletesty"
-                  @click="delNormalHandle(row)"
-                  v-if="!row.ButtonAuth.RemoveDisabled"
-                  >删除</span>
-            </template>
-            <!-- 提交/查看参会名单 按钮由后端控制 -->
-            <template v-if="default_tab===2">
-              <span
                   class="editsty"
-                  v-if="row.EditButton"
-                  @click="editActivityHandle(row)"
-                  >修改</span>
-                  <span 
-                    class="deletesty"
-                    v-if="row.SubmitButton"
-                    @click="submitAttendees(row,'提交')"
-                  >提交参会名单</span>
-                  <span
-                    class="editsty"
-                    v-if="row.ViewButton"
-                    @click="submitAttendees(row,'查看')"
-                  >查看参会名单
-                  </span>
-            </template>
-
-            </template>
-          </el-table-column>
-					<div slot="empty" style="padding: 20px 0;">
-						<img src="~@/assets/img/data_m/table_no.png" alt="" style="display:block;width:135px;height:90px;margin: 0 auto;">
-						<span>暂无数据</span>
-					</div>
-				</el-table>
-        <el-col :span="24" class="toolbar">
-            <m-page
-              :total="total"
-              :page_no="page_no"
-              :pageSize="10"
-              @handleCurrentChange="handleCurrentChange"
-            />
-          </el-col>
+                  v-if="row.QuestionStatus===1"
+                  @click="handleShowAddAnswer(row,'view')"
+                >问答详情
+            </span>
+          </template>
+
+          <!-- 客户问答、问答详情(仅针对路演) -->
+          <template v-if="default_tab===2&&ENUM_RESEARCHLIST.includes(Role)">
+            <span 
+              class="editsty"
+              v-if="row.Status===2&&row.ActivityType==='路演'&&row.QuestionStatus===0"
+              @click="handleShowAddAnswer(row)"
+            >填写客户问答</span> 
+            <span
+              class="editsty"
+              v-if="row.QuestionStatus===1"
+              @click="handleShowAddAnswer(row,'view')"
+            >问答详情
+            </span>
+          </template>
+
+          </template>
+        </el-table-column>
+        <div slot="empty" style="padding: 20px 0;">
+          <img src="~@/assets/img/data_m/table_no.png" alt="" style="display:block;width:135px;height:90px;margin: 0 auto;">
+          <span>暂无数据</span>
+        </div>
+			</el-table>
+      <el-col :span="24" class="toolbar">
+        <m-page
+          :total="total"
+          :page_no="page_no"
+          :pageSize="10"
+          @handleCurrentChange="handleCurrentChange"
+        />
+      </el-col>
 
     </el-card>
     <el-card class="my-calendar-context" v-if="Role!=='admin'">
@@ -313,6 +366,20 @@
         :ResearcherId="currentResearcherId"
         @close="isParticipateShow=false"
     />
+    <!-- 添加问答 -->
+    <addAnswer 
+      :companyName="currentAddAnswerData.CompanyName"
+      :RsCalendarResearcherId="edit_rs_id"
+      :RsCalendarId="edit_id"
+      :isShow.sync="isShowAddAnswer"
+      @success="getCalendarList()"
+    />
+    <!-- 查看问答 -->
+    <viewAnswer 
+      :isShow.sync="isShowViewAnswer"
+      :roadAnswerData="currentAddAnswerData"
+      :RsCalendarResearcherId="edit_rs_id"
+    />
   </div>
 </template>
 
@@ -326,6 +393,8 @@ import addActivityBtnDia from "./compononts/addActivityBtnDia.vue";
 import addParticipateDia from "./compononts/addParticipateDia.vue";
 import mPage from "@/components/mPage.vue";
 import showParticipateListDia from "./compononts/showParticipateListDia.vue";
+import addAnswer from "./compononts/addAnswer.vue";
+import viewAnswer from './compononts/viewAnswer.vue'
 
 export default {
   components: {
@@ -335,7 +404,9 @@ export default {
     addActivityBtnDia,
     addActivityCellDia,
     addParticipateDia,
-    showParticipateListDia
+    showParticipateListDia,
+    addAnswer,
+    viewAnswer
 },
   watch: {
     default_tab(newval) {
@@ -415,10 +486,52 @@ export default {
       },
       isReasonDiaShow:false,
       currentResearcherId:0,
-      isRaiEditType:''
+      isRaiEditType:'',
+
+      currentAddAnswerData:{},
+      isShowAddAnswer:false,//添加问答
+      isShowViewAnswer:false,//查看客户问答
+      roadStatus:'',
+      roadStatusOpts:[
+        {
+          label:'已结束',
+          value:6
+        },
+        {
+          label:'已接受',
+          value:2
+        },
+        {
+          label:'已撤回',
+          value:5
+        },
+        {
+          label:'已删除',
+          value:4
+        },
+        {
+          label:'已拒绝',
+          value:3
+        },
+      ],
+      roadTime:'',
+      roadSearchVal:''
     };
   },
   methods: {
+    // 填写客户问答
+    handleShowAddAnswer(row,type){
+      this.edit_id = row.RsCalendarId;
+      this.edit_rs_id = row.RsCalendarResearcherId;
+      this.currentAddAnswerData=row
+      if(type==='view'){
+        this.isShowViewAnswer=true
+      }else{
+        this.isShowAddAnswer = true;
+      }
+      
+    },
+
     // 添加事项按钮
     addMatterBtn() {
       const { currentStart } = this.$refs.calendarRef.calendarApi.view;
@@ -438,6 +551,10 @@ export default {
         PageSize: 10,
         CurrentIndex: this.page_no,
         CalendarType: this.default_tab,
+        Status:this.roadStatus,
+        StartDate:this.roadTime?this.roadTime[0]:'',
+        EndDate:this.roadTime?this.roadTime[1]:'',
+        Keyword:this.roadSearchVal,
       });
 
       this.tableLoading = false;
@@ -456,8 +573,8 @@ export default {
     },
     
     /* 获取客户信息 */
-    async getCompanyInfo({CompanyId,EnglishCompany,ActivityType,ResearcherId}) {
-      const { Data }  = await roadshowInterence.componyDetail({ CompanyId,EnglishCompany });
+    async getCompanyInfo({CompanyId,EnglishCompany,ActivityType,ResearcherId,SysUserId}) {
+      const { Data }  = await roadshowInterence.componyDetail({ CompanyId,EnglishCompany,SellerId:SysUserId });
       this.companyInfo = Data;
     },
 
@@ -580,10 +697,14 @@ export default {
 
     /* 编辑活动 或事项 */
     editActivityHandle(row) {
+      //编辑活动
       this.isRaiEditType ='RaiEdit'
       if(this.default_tab==5){
         this.editMatterHandle(row);
       }else{
+        if(!row.RsMattersId && row.ActivityType === '内部会议') {
+           this.resubmitData = this.editInfoBack(row,2);
+        } 
         this.raiEditMatterHandle(row)
       }
     },
@@ -699,11 +820,11 @@ export default {
                   partnersName: CooperationName, // 合作方名称
                   activityClass: ActivityCategory, // 活动类别
                   District: District || '',
-
+                  
                   selectResearchers: [
                     // 选择的研究员
                     {
-                      researcherId: Number(ResearcherId),
+                      researcherId: ResearcherId.split(',').length > 1 ? ResearcherId.split(',').map(item => Number(item)) : Number(ResearcherId),
                       startDate: new Date(StartDate),
                       startTime: new Date(`${StartDate} ${StartTime}`),
                       endDate: new Date(EndDate),
@@ -711,9 +832,13 @@ export default {
                     },
                   ],
                 };
-                this.edit_id = RsCalendarId;
-                this.edit_rs_id = RsCalendarResearcherId;
-                this.isActivityCellDiaShow = true;
+        this.edit_id = RsCalendarId;
+        this.edit_rs_id = RsCalendarResearcherId;
+        if(!RsMattersId && ActivityType === '内部会议') {
+          this.isActivityBtnDiaShow = true;
+        }else {
+          this.isActivityCellDiaShow = true;
+        }
     },
     /* 编辑事项 */
     editMatterHandle({ RsMattersId,StartDate,StartTime,EndDate,EndTime,MatterContent }) {
@@ -760,7 +885,17 @@ export default {
 <style lang="scss">
 .my-calendar {
   .my-calendar-list {
+    .top-wrap{
+      display: flex;
+      .filter-wrap{
+        flex: 1;
+        display: flex;
+        align-items: center;
+        gap: 0 5px;
+      }
+    }
     .tabs-type {
+      flex-shrink: 0;
       display: flex;
       align-items: center;
       .type-item {

+ 397 - 0
src/views/roadshow_manage/roadshowQuestion.vue

@@ -0,0 +1,397 @@
+<template>
+  <div class="roadshow-question-page">
+    <div class="filter-wrap">
+      <date-picker
+        v-model="filterData.time" 
+        type="date" 
+        range
+        value-type="format"
+        clearable
+        @change="handleCurrentChange(1)"
+        placeholder="请选择路演时间"
+      />
+      <el-cascader
+        v-model="filterData.researcher"
+        placeholder="请选择研究员"
+        style="width: 230px"
+        :options="researcherList"
+        :props="defaultSalesProps"
+        :show-all-levels="false"
+        collapse-tags
+        clearable
+        filterable
+        :key="cascaderIdx"
+        @change="handleCurrentChange(1)"
+        @remove-tag="handleRemoveResearcherTag"
+      ></el-cascader>
+      <el-select 
+        v-model="filterData.industry" 
+        placeholder="请选择客户行业" 
+        clearable
+        @change="handleCurrentChange(1)"
+      >
+        <el-option 
+          v-for="item in industryOpts" 
+          :key="item.value" 
+          :label="item.label"
+          :value="item.value"
+        ></el-option>
+      </el-select>
+      <el-select 
+        v-model="filterData.type" 
+        placeholder="请选择客户分类" 
+        clearable
+        @change="handleCurrentChange(1)"
+      >
+        <el-option 
+          v-for="item in customTypeOpts" 
+          :key="item.value" 
+          :label="item.label"
+          :value="item.value"
+        ></el-option>
+      </el-select>
+      <a :href="exportExcel" download>
+        <el-button type="primary">导出EXCEL</el-button>
+      </a>
+      <el-input
+        placeholder="客户名称"
+        prefix-icon="el-icon-search"
+        v-model="filterData.keyword"
+        style="display:inline-block;width:300px;margin-left: auto;"
+        clearable
+        @change="handleCurrentChange(1)"
+      />
+    </div>
+
+    <el-table
+      :data="tableData"
+      v-loading="tableLoading"
+      element-loading-text="数据加载中..." 
+      style="box-shadow: 0px 3px 6px rgba(155, 170, 219, 0.2);margin-top:20px;"
+      border
+    >
+      <el-table-column
+        v-for="item in tableColums"
+        :key="item.label"
+        :label="item.label"
+        :width="item.widthsty"
+        :min-width="item.minwidthsty"
+        align="center"
+      >
+        <template slot-scope="{row}">
+
+          <!-- 时间处理 -->
+          <span v-if="item.key === 'time'">
+            {{
+              row.StartDate === row.EndDate
+              ? ($moment(row.StartDate + " " + row.StartTime).format(
+                "MM.DD(ddd) HH:mm") + '~' +  $moment(row.EndDate + " " + row.EndTime).format("HH:mm"))
+              : (
+                $moment(row.StartDate + " " + row.StartTime).format(
+                "MM.DD(ddd) HH:mm") + '~' + $moment(row.EndDate + " " + row.EndTime).format("MM.DD(ddd) HH:mm")
+              )
+            }}
+          </span>
+          <!-- 活动形式 -->
+          <span v-else-if="item.key === 'RoadshowType'">
+            {{row.RoadshowType}} {{ row.RoadshowType === '线上' ? `(${row.RoadshowPlatform}  )` : `(${row.Province}${row.City}${row.District})`}}
+          </span>
+          <!-- 客户拼接 -->
+          <span v-else-if="item.key === 'company'">
+            {{ row.CooperationName || row.CompanyName }}
+
+						<el-tooltip effect="dark" placement="top-start" v-if="row.CompanyId"  @mouseenter.native="getCompanyInfo(row)" popper-class="company-tip-poper">
+							<i class="el-icon-info"/>
+							<div slot="content" v-if="companyInfo">
+								<p style="margin: 6px 0;">客户状态:{{companyInfo.Status}}</p>
+								<p style="margin: 6px 0;">所属行业:{{companyInfo.IndustryName}}</p>
+								<p style="margin: 6px 0;text-indent: -70px;margin-left: 70px;">开通{{companyInfo.CompanyType == 'FICC'  ? '品种:':'行业:'}}{{companyInfo.PermissionName}}</p>
+								<p style="margin: 6px 0;">{{companyInfo.CompanyType == 'FICC' ? '累计报告阅读次数':'累计互动次数'}}:{{companyInfo.ReportReadTotal}}</p>
+							</div>
+						</el-tooltip>
+          </span>
+          <el-button type="text" v-else-if="item.key === 'question_btn'"  @click="handleShowQuestionDetail(row)">问答详情</el-button>
+          <span v-else>{{ row[item.key] || '——' }}</span>
+        </template>
+      </el-table-column>
+      <div slot="empty" style="padding: 20px 0;">
+        <img src="~@/assets/img/data_m/table_no.png" alt="" style="display:block;width:135px;height:90px;margin: 0 auto;">
+        <span>暂无数据</span>
+      </div>
+    </el-table>
+    <div style="height:60px;padding-top: 20px;">
+      <m-page
+        :total="total"
+        :page_no="page_no"
+        :pageSize="pageSize"
+        @handleCurrentChange="handleCurrentChange"
+      />
+    </div>
+
+    <!-- 查看问答 -->
+    <viewAnswer 
+      :isShow.sync="isShowViewAnswer"
+      :roadAnswerData="currentAddAnswerData"
+      :RsCalendarResearcherId="currentAddAnswerData.RsCalendarResearcherId"
+      :RsCalendarId="currentAddAnswerData.RsCalendarId"
+      :ResearcherId="currentAddAnswerData.ResearcherId"
+    />
+  </div>
+</template>
+
+<script>
+import { roadshowInterence } from "@/api/api.js";
+import mPage from "@/components/mPage.vue";
+import viewAnswer from './compononts/viewAnswer.vue'
+export default {
+  name:'RoadShowQuestion',
+  components:{mPage,viewAnswer},
+  computed: {
+    Role() {
+      return localStorage.getItem("Role");
+    },
+    exportExcel(){
+			let baseUrl = process.env.API_ROOT + "/roadshow/question/summary/export";
+			let token = localStorage.getItem("auth") || "";
+			let paramStr = "";
+			let obj = {
+				StartDate:this.filterData.time?this.filterData.time[0]:'',
+        EndDate:this.filterData.time?this.filterData.time[1]:'',
+        ResearcherId:this.filterData.researcher?this.filterData.researcher.join(','):'',
+        Keyword:this.filterData.keyword,
+        CompanyIndustry:this.filterData.industry,
+        CompanyClassify:this.filterData.type
+			};
+			for (let key in obj) {
+				paramStr = `${paramStr}&${key}=${obj[key]}`;
+			}
+			return `${baseUrl}?${token}${paramStr}`;
+		}
+  },
+  data () {
+    return {
+      industryOpts:[
+        {
+          label:'黑色',
+          value:'黑色'
+        },
+        {
+          label:'有色',
+          value:'有色'
+        },
+        {
+          label:'能化',
+          value:'能化'
+        },
+        {
+          label:'综合',
+          value:'综合'
+        },
+        {
+          label:'金融',
+          value:'金融'
+        },
+        {
+          label:'农产品',
+          value:'农产品'
+        }
+      ],
+      customTypeOpts:[ 
+        {
+          label:'上游',
+          value:'上游'
+        },
+        {
+          label:'中游',
+          value:'中游',
+        },
+        {
+          label:'下游',
+          value:'下游',
+        },
+        {
+          label:'投资',
+          value:'投资',
+        }
+      ],
+      researcherList: [], // 研究员列表
+      defaultSalesProps: {
+        multiple: true,
+        children: "ResearcherList",
+        value: "AdminId",
+        emitPath: false,
+      }, //研究员配置
+      cascaderIdx:1,
+
+      filterData:{
+        time:'',
+        keyword:'',
+        researcher:'',
+        industry:'',
+        type:''
+      },
+
+      companyInfo:{},
+
+      tableColums:[
+        {
+          label: '路演时间',
+          key: 'time',
+        },
+        {
+          label: '客户名称',
+          key: 'company',
+        },
+        {
+          label: '路演形式',
+          key: 'RoadshowType',
+        },
+        {
+          label: '发起人',
+          key: 'SysUserRealName',
+        },
+        {
+          label: '研究员',
+          key: 'ResearcherName',
+        },
+        {
+          label: '客户问答',
+          key: 'question_btn',
+        },
+      ],
+      tableLoading:false,
+      tableData:[],
+      total:0,
+      page_no:1,
+      pageSize:10,
+
+      isShowViewAnswer:false,
+      currentAddAnswerData:{}
+    }
+  },
+  created() {
+    this.getResearcherList()
+    this.getRoadShowQuestionList()
+  },
+  methods: {
+    handleShowQuestionDetail(e){
+      this.currentAddAnswerData=e
+      this.isShowViewAnswer=true
+    },
+
+    async getRoadShowQuestionList(){
+      this.tableLoading=true
+      const res=await roadshowInterence.roadShowQuestionSummary({
+        PageSize:this.pageSize,
+        CurrentIndex:this.page_no,
+        StartDate:this.filterData.time?this.filterData.time[0]:'',
+        EndDate:this.filterData.time?this.filterData.time[1]:'',
+        ResearcherId:this.filterData.researcher?this.filterData.researcher.join(','):'',
+        Keyword:this.filterData.keyword,
+        CompanyIndustry:this.filterData.industry,
+        CompanyClassify:this.filterData.type
+      })
+      this.tableLoading=false
+
+      if(res.Ret===200){
+        this.tableData=res.Data.List||[]
+        this.total=res.Data.Paging.Totals 
+      }
+
+    },
+
+    handleCurrentChange(page){
+      this.page_no=page
+      this.getRoadShowQuestionList()
+    },
+
+    handleRemoveResearcherTag(e){
+      this.filterData.researcher=this.filterData.researcher.filter(i=>i!==e)
+      this.cascaderIdx++
+      if(this.filterData.researcher.length===0){
+        this.handleCurrentChange(1)
+      }
+    },
+
+    /* 获取客户信息 */
+    async getCompanyInfo(row) {
+      const { Data }  = await roadshowInterence.componyDetail({ 
+        CompanyId:row.CompanyId,
+        SellerId:row.SysUserId,
+        EnglishCompany:row.EnglishCompany
+      });
+      this.companyInfo = Data;
+    },
+
+    // 获取研究员列表
+    async getResearcherList() {
+      // 发送请求
+      const res = await roadshowInterence.getResearcherList();
+      if (res.Ret === 200) {
+        const ficcList = this.formatResearcherList(res.Data.find(i=>i.GroupName==='ficc').ResearcherList||[]);
+        const raiList = this.formatResearcherList(res.Data.find(i=>i.GroupName==='权益').ResearcherList||[]);
+        this.researcherList = [{
+            label:'ficc',
+            ResearcherList:ficcList
+        },{
+            label:'权益',
+            ResearcherList:raiList
+        }]
+      }
+    },
+    // 对获取到的研究员列表做处理
+    formatResearcherList(list) {
+      list.forEach((group) => {
+        // 对组做处理
+        group.label = group.GroupName;
+        // 如果有列表
+        group.ResearcherList &&
+          group.ResearcherList.forEach((item) => {
+            // 对研究员做处理
+            item.label = item.RealName;
+            item.value = {
+              ResearcherId: item.AdminId,
+              ResearcherName: item.RealName,
+            };
+          });
+      });
+      // 去掉ficc全体选项
+      return list.filter((group) => group.GroupName !== "ficc全体");
+    },
+
+  },
+} 
+</script>
+<style lang="scss">
+.company-tip-poper {
+	max-width: 400px;
+}
+</style>
+<style lang="scss" scoped>
+.roadshow-question-page{
+  background-color: #fff;
+  padding: 20px;
+}
+.page-type-box{
+  display: flex;
+  align-content: center;
+  gap: 0 30px;
+  font-size: 16px;
+  line-height: 2;
+  margin-bottom: 20px;
+  div{
+    cursor: pointer;
+  }
+  .item_active{
+    color: #409EFF;
+    border-bottom: 1px solid #409EFF;
+  }
+}
+.filter-wrap{
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  gap: 5px;
+
+}
+</style>

+ 2 - 1
src/views/roadshow_manage/roleConfig/myCalendarConfig.js

@@ -244,7 +244,8 @@ export const tableColums = (type) => {
 export const handleArr = (type) => {
 	if(type === 1 && sellerList.includes(localStorage.getItem('Role'))) return ['撤回']
 	if(type === 1 && ENUM_RESEARCHLIST.includes(localStorage.getItem('Role'))) return ['接受','拒绝']
-	if(type === 2 && sellerList.includes(localStorage.getItem('Role'))) return ['拒绝理由','修改重提','删除']
+	if(type === 2 && ENUM_RESEARCHLIST.includes(localStorage.getItem('Role'))) return ['填写客户问答','问答详情']
+	if(type === 2 && sellerList.includes(localStorage.getItem('Role'))) return ['拒绝理由','修改重提','删除','问答详情']
 	if([3,4,5].includes(type)) return ['修改','删除']
 
 	return []

+ 37 - 2
src/views/roadshow_manage/statistics/mixin.js

@@ -7,7 +7,7 @@ export default {
 			dataLoading: false,
 			default_tab: '周度统计表',
 			select_date: '',
-			staticTabs: [ '周度统计表','月度统计表','近1个月','近3个月','近6个月' ],
+			// staticTabs: [ '周度统计表','季度统计表','月度统计表','近1个月','近3个月','近6个月' ],
 			tableTheadColumns: this.$route.path === '/sellerStatisticSeller' 
 				? [
 					`本周(${this.getWeekOrMonthDate(0)})`,
@@ -29,11 +29,25 @@ export default {
 		}
 	},
 	computed:{
+		staticTabs(){
+			// 研究员路演统计增加季度统计表
+			if(this.$route.path === '/statisticResearcher') return [ '周度统计表','季度统计表','月度统计表','近1个月','近3个月','近6个月' ]
+
+			return [ '周度统计表','月度统计表','近1个月','近3个月','近6个月' ]
+		},
 		departmentTheadColumns(){
 			return this.departmentAct == 'ficc' ?  ['试用路演','正式路演','公开会议'] :  ['路演','沙龙']
 		}
 	},
 	methods: {
+		// 格式化表中的数字显示
+		formatTableValue(data){
+			// 如果有askNum 则表示要显示路演问答统计数据
+			if(data.askNum!==undefined){
+				return data.value !== 0 ? `${data.askNum||0}/${data.value||0}` : ''
+			}
+			return data.value !== 0 ? data.value : ''
+		},
 
 		/* 切换顶部tab */
 		changeTabHandle(tab,type) {
@@ -68,6 +82,13 @@ export default {
 								this.getWeekOrMonthDate(3,'month'),
 							];
 					break;
+				case '季度统计表':
+						this.tableTheadColumns= [
+							`本季度(${this.getWeekOrMonthDate(0,'quarter')})`,
+							`上一季度(${this.getWeekOrMonthDate(1,'quarter')})`,
+							`上两个季度(${this.getWeekOrMonthDate(2,'quarter')})`,
+						];
+						break;
 				default:
 					this.tableTheadColumns = this.departmentTheadColumns;
 					break;
@@ -90,6 +111,7 @@ export default {
 				{
 					key: '试用路演',
 					value: item.TryOutNum,
+					askNum:item.AskNum,
 					startDate: item.StartDate,
 					endDate: item.EndDate,
 					userid
@@ -97,6 +119,7 @@ export default {
 				{
 					key: '正式路演',
 					value: item.FormalNum,
+					askNum:item.AskNum,
 					startDate: item.StartDate,
 					endDate: item.EndDate,
 					userid
@@ -112,6 +135,7 @@ export default {
 				{
 					key: '路演',
 					value: item.RoadShowNum,
+					askNum:item.AskNum,
 					startDate: item.StartDate,
 					endDate: item.EndDate,
 					userid
@@ -154,6 +178,13 @@ export default {
 				this.select_date = '';
 			}
 		},
+		// 格式化季度为 "YYYY.MM-MM" 字符串
+		formatQuarter(quarter, year) {
+			const startMonth = (quarter - 1) * 3; // 季度起始月份(0-based)
+			const startStr = String(startMonth + 1).padStart(2, '0'); // 转换为两位月份
+			const endStr = String(startMonth + 3).padStart(2, '0'); // 结束月份(startMonth + 3,如0+3=3 → 4月,但需要显示为03)
+			return `${year}.${startStr}~${year}.${endStr}`;
+		},
 
 		/* 	获取几周前 周一周日日期 或前几月月份*/
 		getWeekOrMonthDate(weeknum,type='week') {
@@ -163,7 +194,11 @@ export default {
 	
 				// console.log(weekStart,weekEnd)
 				return `${weekStart}~${weekEnd}`;
-			} else {
+			}else if(type==='quarter'){
+				if(weeknum===0) return this.formatQuarter(this.$moment().quarter(),this.$moment().year())
+				const previousMoment = this.$moment().subtract(weeknum, 'quarters'); 
+				return this.formatQuarter(previousMoment.quarter(),previousMoment.year())
+			}else {
 				const month = this.$moment().subtract(weeknum,'M').format('YYYY.MM');
 				return month;
 			}

+ 35 - 5
src/views/roadshow_manage/statistics/researcher.vue

@@ -15,6 +15,17 @@
 			:clearable="false"
 			@change="dateChange"
 			placeholder="请选择统计时间"/>
+
+			<el-tooltip 
+				effect="dark" 
+				content="前面数字表示研究员已接受、已填写客户问答的路演,后面数字表示研究员已接受的路演" 
+				placement="top"
+			>
+				<i class="el-icon-info"></i>
+			</el-tooltip>
+			<a :href="exportExcel" download style="margin-left: auto;">
+				<el-button type="primary">导出excel</el-button>
+			</a>
 		</div>
 		<div class="table-cont" v-show="dataLoading" >
 			<div class="table-body-wrapper" ref="bodyRef">
@@ -22,9 +33,9 @@
 					<thead>
 						<tr>
 							<td rowspan="2" :class="['thead-rs']">组别</td>
-							<td rowspan="2" :class="['thead-rs']">销售</td>
+							<td rowspan="2" :class="['thead-rs']">研究员</td>
 							<td
-								:colspan="departmentAct == '权益' && ['周度统计表','月度统计表'].includes(default_tab) ? 2 : ['周度统计表','月度统计表'].includes(default_tab) ? 3 : 1"
+								:colspan="departmentAct == '权益' && ['周度统计表','季度统计表','月度统计表'].includes(default_tab) ? 2 : ['周度统计表','季度统计表','月度统计表'].includes(default_tab) ? 3 : 1"
 								v-for="item in tableTheadColumns" 
 								:key="item" 
 								class="head-column"
@@ -37,7 +48,7 @@
 								<td  v-for="(tdItem,inx) in departmentTheadColumns" :key="index+'_'+inx">{{tdItem}}</td>
 							</template>
 						</tr>
-						<tr v-if="['周度统计表'].includes(default_tab)">
+						<tr v-if="['周度统计表','季度统计表'].includes(default_tab)">
 							<template v-for="(item,index) in new Array(3)">
 								<td  v-for="(tdItem,inx) in departmentTheadColumns" :key="index+'_'+inx">{{tdItem}}</td>
 							</template>
@@ -57,7 +68,7 @@
 										:key="data_key" 
 										@click="openDiaHandle(data)"
 									>
-										{{ data.value !== 0 ? data.value : '' }}
+										{{ formatTableValue(data) }}
 									</td>
 
 								</tr>
@@ -95,6 +106,7 @@
 			:title="diaTitle"
 			:form="dialogForm"
 			fromType="researcher"
+			:hasQustion="['试用路演','正式路演','路演'].includes(dialogForm.key)"
 		/>
 
 	</div>
@@ -108,6 +120,23 @@ export default {
 	name:'',
 	mixins: [ mixin ],
 	components: { actiyityDetailDia },
+	computed:{
+		exportExcel(){
+			let baseUrl = process.env.API_ROOT + "/roadshow/report/researcher/export";
+			let token = localStorage.getItem("auth") || "";
+			let paramStr = "";
+			let obj = {
+				DataType: this.default_tab === '周度统计表' ? 'week' : this.default_tab === '月度统计表' ? 'month':this.default_tab === '季度统计表' ? 'quarter' : 'time_interval',
+				StartDate: this.select_date ? this.select_date[0] : '',
+				EndDate: this.select_date ? this.select_date[1] : '',
+				CompanyType:this.departmentAct
+			};
+			for (let key in obj) {
+				paramStr = `${paramStr}&${key}=${obj[key]}`;
+			}
+			return `${baseUrl}?${token}${paramStr}`;
+		}
+	},
 	data () {
 		return {
 		};
@@ -118,7 +147,7 @@ export default {
 		getTableData() {
 			this.dataLoading = false;
 			roadshowInterence.researcherStatistic({
-				DataType: this.default_tab === '周度统计表' ? 'week' : this.default_tab === '月度统计表' ? 'month' : 'time_interval',
+				DataType: this.default_tab === '周度统计表' ? 'week' : this.default_tab === '月度统计表' ? 'month':this.default_tab === '季度统计表' ? 'quarter' : 'time_interval',
 				StartDate: this.select_date ? this.select_date[0] : '',
 				EndDate: this.select_date ? this.select_date[1] : '',
 				CompanyType:this.departmentAct
@@ -148,6 +177,7 @@ export default {
 
 				const dynamic_width = {
 					'周度统计表': '9%',
+					'季度统计表': '9%',
 					'月度统计表': '7%',
 				}
 				this.$nextTick(() => {