roadshowQuestion.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. <template>
  2. <div class="roadshow-question-page">
  3. <div class="filter-wrap">
  4. <date-picker
  5. v-model="filterData.time"
  6. type="date"
  7. range
  8. value-type="format"
  9. clearable
  10. @change="handleCurrentChange(1)"
  11. placeholder="请选择路演时间"
  12. />
  13. <el-cascader
  14. v-model="filterData.researcher"
  15. placeholder="请选择研究员"
  16. style="width: 230px"
  17. :options="researcherList"
  18. :props="defaultSalesProps"
  19. :show-all-levels="false"
  20. collapse-tags
  21. clearable
  22. filterable
  23. :key="cascaderIdx"
  24. @change="handleCurrentChange(1)"
  25. @remove-tag="handleRemoveResearcherTag"
  26. ></el-cascader>
  27. <el-select
  28. v-model="filterData.industry"
  29. placeholder="请选择客户行业"
  30. clearable
  31. @change="handleCurrentChange(1)"
  32. >
  33. <el-option
  34. v-for="item in industryOpts"
  35. :key="item.value"
  36. :label="item.label"
  37. :value="item.value"
  38. ></el-option>
  39. </el-select>
  40. <el-select
  41. v-model="filterData.type"
  42. placeholder="请选择客户分类"
  43. clearable
  44. @change="handleCurrentChange(1)"
  45. >
  46. <el-option
  47. v-for="item in customTypeOpts"
  48. :key="item.value"
  49. :label="item.label"
  50. :value="item.value"
  51. ></el-option>
  52. </el-select>
  53. <a :href="exportExcel" download>
  54. <el-button type="primary">导出EXCEL</el-button>
  55. </a>
  56. <el-input
  57. placeholder="客户名称"
  58. prefix-icon="el-icon-search"
  59. v-model="filterData.keyword"
  60. style="display:inline-block;width:300px;margin-left: auto;"
  61. clearable
  62. @change="handleCurrentChange(1)"
  63. />
  64. </div>
  65. <el-table
  66. :data="tableData"
  67. v-loading="tableLoading"
  68. element-loading-text="数据加载中..."
  69. style="box-shadow: 0px 3px 6px rgba(155, 170, 219, 0.2);margin-top:20px;"
  70. border
  71. >
  72. <el-table-column
  73. v-for="item in tableColums"
  74. :key="item.label"
  75. :label="item.label"
  76. :width="item.widthsty"
  77. :min-width="item.minwidthsty"
  78. align="center"
  79. >
  80. <template slot-scope="{row}">
  81. <!-- 时间处理 -->
  82. <span v-if="item.key === 'time'">
  83. {{
  84. row.StartDate === row.EndDate
  85. ? ($moment(row.StartDate + " " + row.StartTime).format(
  86. "MM.DD(ddd) HH:mm") + '~' + $moment(row.EndDate + " " + row.EndTime).format("HH:mm"))
  87. : (
  88. $moment(row.StartDate + " " + row.StartTime).format(
  89. "MM.DD(ddd) HH:mm") + '~' + $moment(row.EndDate + " " + row.EndTime).format("MM.DD(ddd) HH:mm")
  90. )
  91. }}
  92. </span>
  93. <!-- 活动形式 -->
  94. <span v-else-if="item.key === 'RoadshowType'">
  95. {{row.RoadshowType}} {{ row.RoadshowType === '线上' ? `(${row.RoadshowPlatform} )` : `(${row.Province}${row.City}${row.District})`}}
  96. </span>
  97. <!-- 客户拼接 -->
  98. <span v-else-if="item.key === 'company'">
  99. {{ row.CooperationName || row.CompanyName || '——'}}
  100. <el-tooltip effect="dark" placement="top-start" v-if="row.CompanyId" @mouseenter.native="getCompanyInfo(row)" popper-class="company-tip-poper">
  101. <i class="el-icon-info"/>
  102. <div slot="content" v-if="companyInfo">
  103. <!-- 权益客户 -->
  104. <template v-if="Role.includes('rai')">
  105. <p style="margin: 6px 0;">客户状态:{{companyInfo.Status}}</p>
  106. <p style="margin: 6px 0;">所属行业:{{companyInfo.IndustryName}}</p>
  107. <p style="margin: 6px 0;text-indent: -70px;margin-left: 70px;">行业权限:{{companyInfo.PermissionName}}</p>
  108. <p style="margin: 6px 0;">累计互动次数:{{companyInfo.ReportReadTotal}}</p>
  109. </template>
  110. <!-- ficc客户分国内海外 -->
  111. <template v-else>
  112. <template v-if="companyInfo.EnglishCompany===1">
  113. <p style="margin: 6px 0;">所属国家:{{companyInfo.EnglishCountry}}</p>
  114. <p style="margin: 6px 0;">累计点击量:{{companyInfo.EnglishViewTotal}}</p>
  115. </template>
  116. <template v-else>
  117. <p style="margin: 6px 0;">客户状态:{{companyInfo.Status}}</p>
  118. <p style="margin: 6px 0;">所属行业:{{companyInfo.IndustryName}}</p>
  119. <p style="margin: 6px 0;text-indent: -70px;margin-left: 70px;">开通品种:{{companyInfo.PermissionName}}</p>
  120. <p style="margin: 6px 0;">累计报告阅读次数:{{companyInfo.ReportReadTotal}}</p>
  121. </template>
  122. </template>
  123. </div>
  124. </el-tooltip>
  125. </span>
  126. <el-button type="text" v-else-if="item.key === 'question_btn'" @click="handleShowQuestionDetail(row)">问答详情</el-button>
  127. <span v-else>{{ row[item.key] || '——' }}</span>
  128. </template>
  129. </el-table-column>
  130. <div slot="empty" style="padding: 20px 0;">
  131. <img src="~@/assets/img/data_m/table_no.png" alt="" style="display:block;width:135px;height:90px;margin: 0 auto;">
  132. <span>暂无数据</span>
  133. </div>
  134. </el-table>
  135. <div style="height:60px;padding-top: 20px;">
  136. <m-page
  137. :total="total"
  138. :page_no="page_no"
  139. :pageSize="pageSize"
  140. @handleCurrentChange="handleCurrentChange"
  141. />
  142. </div>
  143. <!-- 查看问答 -->
  144. <viewAnswer
  145. :isShow.sync="isShowViewAnswer"
  146. :roadAnswerData="currentAddAnswerData"
  147. :RsCalendarResearcherId="currentAddAnswerData.RsCalendarResearcherId"
  148. :RsCalendarId="currentAddAnswerData.RsCalendarId"
  149. :ResearcherId="currentAddAnswerData.ResearcherId"
  150. />
  151. </div>
  152. </template>
  153. <script>
  154. import { roadshowInterence } from "@/api/api.js";
  155. import mPage from "@/components/mPage.vue";
  156. import viewAnswer from './compononts/viewAnswer.vue'
  157. export default {
  158. name:'RoadShowQuestion',
  159. components:{mPage,viewAnswer},
  160. computed: {
  161. Role() {
  162. return localStorage.getItem("Role");
  163. },
  164. exportExcel(){
  165. let baseUrl = process.env.API_ROOT + "/roadshow/question/summary/export";
  166. let token = localStorage.getItem("auth") || "";
  167. let paramStr = "";
  168. let obj = {
  169. StartDate:this.filterData.time?this.filterData.time[0]:'',
  170. EndDate:this.filterData.time?this.filterData.time[1]:'',
  171. ResearcherId:this.filterData.researcher?this.filterData.researcher.join(','):'',
  172. Keyword:this.filterData.keyword,
  173. CompanyIndustry:this.filterData.industry,
  174. CompanyClassify:this.filterData.type
  175. };
  176. for (let key in obj) {
  177. paramStr = `${paramStr}&${key}=${obj[key]}`;
  178. }
  179. return `${baseUrl}?${token}${paramStr}`;
  180. }
  181. },
  182. data () {
  183. return {
  184. industryOpts:[
  185. {
  186. label:'黑色',
  187. value:'黑色'
  188. },
  189. {
  190. label:'有色',
  191. value:'有色'
  192. },
  193. {
  194. label:'能化',
  195. value:'能化'
  196. },
  197. {
  198. label:'综合',
  199. value:'综合'
  200. },
  201. {
  202. label:'金融',
  203. value:'金融'
  204. },
  205. {
  206. label:'农产品',
  207. value:'农产品'
  208. }
  209. ],
  210. customTypeOpts:[
  211. {
  212. label:'上游',
  213. value:'上游'
  214. },
  215. {
  216. label:'中游',
  217. value:'中游',
  218. },
  219. {
  220. label:'下游',
  221. value:'下游',
  222. },
  223. {
  224. label:'投资',
  225. value:'投资',
  226. }
  227. ],
  228. researcherList: [], // 研究员列表
  229. defaultSalesProps: {
  230. multiple: true,
  231. children: "ResearcherList",
  232. value: "AdminId",
  233. emitPath: false,
  234. }, //研究员配置
  235. cascaderIdx:1,
  236. filterData:{
  237. time:'',
  238. keyword:'',
  239. researcher:'',
  240. industry:'',
  241. type:''
  242. },
  243. companyInfo:{},
  244. tableColums:[
  245. {
  246. label: '路演时间',
  247. key: 'time',
  248. },
  249. {
  250. label: '客户名称',
  251. key: 'company',
  252. },
  253. {
  254. label: '路演形式',
  255. key: 'RoadshowType',
  256. },
  257. {
  258. label: '发起人',
  259. key: 'SysUserRealName',
  260. },
  261. {
  262. label: '研究员',
  263. key: 'ResearcherName',
  264. },
  265. {
  266. label: '客户问答',
  267. key: 'question_btn',
  268. },
  269. ],
  270. tableLoading:false,
  271. tableData:[],
  272. total:0,
  273. page_no:1,
  274. pageSize:10,
  275. isShowViewAnswer:false,
  276. currentAddAnswerData:{}
  277. }
  278. },
  279. created() {
  280. this.getResearcherList()
  281. this.getRoadShowQuestionList()
  282. },
  283. methods: {
  284. handleShowQuestionDetail(e){
  285. this.currentAddAnswerData=e
  286. this.isShowViewAnswer=true
  287. },
  288. async getRoadShowQuestionList(){
  289. this.tableLoading=true
  290. const res=await roadshowInterence.roadShowQuestionSummary({
  291. PageSize:this.pageSize,
  292. CurrentIndex:this.page_no,
  293. StartDate:this.filterData.time?this.filterData.time[0]:'',
  294. EndDate:this.filterData.time?this.filterData.time[1]:'',
  295. ResearcherId:this.filterData.researcher?this.filterData.researcher.join(','):'',
  296. Keyword:this.filterData.keyword,
  297. CompanyIndustry:this.filterData.industry,
  298. CompanyClassify:this.filterData.type
  299. })
  300. this.tableLoading=false
  301. if(res.Ret===200){
  302. this.tableData=res.Data.List||[]
  303. this.total=res.Data.Paging.Totals
  304. }
  305. },
  306. handleCurrentChange(page){
  307. this.page_no=page
  308. this.getRoadShowQuestionList()
  309. },
  310. handleRemoveResearcherTag(e){
  311. console.log(e);
  312. this.filterData.researcher=this.filterData.researcher.filter(i=>i!==e)
  313. this.cascaderIdx++
  314. },
  315. /* 获取客户信息 */
  316. async getCompanyInfo({CompanyId,EnglishCompany,ActivityType,ResearcherId}) {
  317. const { Data } = await roadshowInterence.componyDetail({ CompanyId,EnglishCompany });
  318. this.companyInfo = Data;
  319. },
  320. // 获取研究员列表
  321. async getResearcherList() {
  322. // 发送请求
  323. const res = await roadshowInterence.getResearcherList();
  324. if (res.Ret === 200) {
  325. const ficcList = this.formatResearcherList(res.Data.find(i=>i.GroupName==='ficc').ResearcherList||[]);
  326. const raiList = this.formatResearcherList(res.Data.find(i=>i.GroupName==='权益').ResearcherList||[]);
  327. this.researcherList = [{
  328. label:'ficc',
  329. ResearcherList:ficcList
  330. },{
  331. label:'权益',
  332. ResearcherList:raiList
  333. }]
  334. }
  335. },
  336. // 对获取到的研究员列表做处理
  337. formatResearcherList(list) {
  338. list.forEach((group) => {
  339. // 对组做处理
  340. group.label = group.GroupName;
  341. // 如果有列表
  342. group.ResearcherList &&
  343. group.ResearcherList.forEach((item) => {
  344. // 对研究员做处理
  345. item.label = item.RealName;
  346. item.value = {
  347. ResearcherId: item.AdminId,
  348. ResearcherName: item.RealName,
  349. };
  350. });
  351. });
  352. // 去掉ficc全体选项
  353. return list.filter((group) => group.GroupName !== "ficc全体");
  354. },
  355. },
  356. }
  357. </script>
  358. <style lang="scss" scoped>
  359. .roadshow-question-page{
  360. background-color: #fff;
  361. padding: 20px;
  362. }
  363. .page-type-box{
  364. display: flex;
  365. align-content: center;
  366. gap: 0 30px;
  367. font-size: 16px;
  368. line-height: 2;
  369. margin-bottom: 20px;
  370. div{
  371. cursor: pointer;
  372. }
  373. .item_active{
  374. color: #409EFF;
  375. border-bottom: 1px solid #409EFF;
  376. }
  377. }
  378. .filter-wrap{
  379. display: flex;
  380. flex-wrap: wrap;
  381. align-items: center;
  382. gap: 5px;
  383. }
  384. </style>