ForeCast.vue 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754
  1. <template>
  2. <div class="listData">
  3. <div class="listData_title" v-if="type == 'entintel'">
  4. <strong style="font-weight: bold; font-size: 18px; color: #1d1d1d"
  5. >企业列表</strong
  6. >
  7. <span style="font-size: 14px; color: #686868"
  8. >(可关注 {{ myDataObj.maxCount }} 个企业,已关注
  9. <em style="color: #2cb7ca">{{ myDataObj.initTotal }}</em> 个)</span
  10. >
  11. </div>
  12. <div class="tip_title" v-if="type == 'entintel'">
  13. <Tips tipText="解锁关注更多企业"></Tips>
  14. </div>
  15. <template v-else>
  16. <div class="listData_title">{{ title }}</div>
  17. <div class="listData_desc">{{ desc }}</div>
  18. </template>
  19. <div
  20. class="filtrate_box"
  21. :class="{ 'no-border': tabActive === 'fwl' }"
  22. v-if="showFiltrate"
  23. >
  24. <div class="tab_box">
  25. <tabs :list="tab_list" @onChange="tabChange"></tabs>
  26. </div>
  27. <TimeSelector
  28. ref="timeSelector"
  29. selectorTime="allAndlately90"
  30. @onChange="changeTime"
  31. selectorType="line"
  32. v-show="tabActive === 'fwl'"
  33. >
  34. <div class="filter-label" slot="header">合同到期时间:</div>
  35. </TimeSelector>
  36. <!-- 地区 -->
  37. <div class="filter-region" v-show="tabActive === 'fwl'">
  38. <AreaCityCountryCascader
  39. ref="areaCityCountry"
  40. :showTags="false"
  41. :isHaveAll="isShowAllCountry"
  42. :source="sourceAreaMap"
  43. :initMap="regionMapData"
  44. @hideSelect="onAreaHideSelect"
  45. @change="onAreaCityCountryChange"
  46. >
  47. <div class="filter-label" slot="header">项目地区:</div>
  48. </AreaCityCountryCascader>
  49. </div>
  50. </div>
  51. <!-- 中标企业预测-->
  52. <ul class="listData_ul" v-if="type == 'bidfor'">
  53. <li
  54. class="list_li"
  55. v-for="(item, index) in listState.list.slice(
  56. (listState.pageNum - 1) * listState.pageSize,
  57. listState.pageNum * listState.pageSize
  58. )"
  59. :key="index"
  60. @click="goBidForcast(item)"
  61. >
  62. <div class="list_name">{{ item.projectname }}</div>
  63. <div class="list_unit">
  64. <div class="pur_unit">
  65. <span class="unit_label">采购单位:</span>
  66. <span class="unit_name">{{ item.buyer }}</span>
  67. </div>
  68. <div class="pur_unit">
  69. <span class="unit_label">采购时间:</span>
  70. <span class="unit_name">{{ item.firsttime }}</span>
  71. </div>
  72. </div>
  73. </li>
  74. </ul>
  75. <!-- 中标企业预测>预测结果>预测项目列表-->
  76. <ul class="listData_ul" v-if="type == 'bidforResult'">
  77. <li
  78. class="list_li_result list_li"
  79. v-for="(item, index) in listState.list.slice(0, 5)"
  80. :key="index"
  81. @click="goEntPor(item.entId)"
  82. >
  83. <div class="list_li_left">
  84. <div class="result_chart">
  85. <el-progress
  86. type="circle"
  87. :show-text="true"
  88. :color="activeColor(index)"
  89. :width="44"
  90. :stroke-width="4"
  91. :percentage="item.weight"
  92. ></el-progress>
  93. <div class="bidrete_text">中标概率</div>
  94. </div>
  95. </div>
  96. <div class="list_li_right">
  97. <div class="list_name">{{ item.entname }}</div>
  98. <div class="list_unit">
  99. <div class="pur_unit">
  100. <span class="unit_label">成立日期:</span>
  101. <span class="unit_name">{{ item.datestr }}</span>
  102. </div>
  103. <div class="pur_unit">
  104. <span class="unit_label">注册资本:</span>
  105. <span class="unit_name">{{ item.capital }}</span>
  106. </div>
  107. <div class="pur_unit">
  108. <span class="unit_label">员工人数:</span>
  109. <span class="unit_name">{{ item.employee_no }}</span>
  110. </div>
  111. </div>
  112. </div>
  113. </li>
  114. </ul>
  115. <!-- 投标决策分析 -->
  116. <ul class="listData_ul" v-if="type == 'bidpolicy'">
  117. <li
  118. class="list_li"
  119. v-for="(item, index) in listState.list.slice(
  120. (listState.pageNum - 1) * listState.pageSize,
  121. listState.pageNum * listState.pageSize
  122. )"
  123. :key="index"
  124. @click="goForcast(item)"
  125. >
  126. <div class="list_name">{{ item.projectname }}</div>
  127. <div class="list_unit">
  128. <div class="pur_unit">
  129. <span class="unit_label">采购单位:</span>
  130. <span class="unit_name">{{ item.buyer }}</span>
  131. </div>
  132. <div class="pur_unit">
  133. <span class="unit_label">采购时间:</span>
  134. <span class="unit_name">{{ item.firsttime }}</span>
  135. </div>
  136. </div>
  137. </li>
  138. </ul>
  139. <!-- 企业情报 -->
  140. <div v-if="type == 'entintel'" style="padding: 0 40px">
  141. <div class="entintel-thead">
  142. <span style="width: 810px">企业</span>
  143. <span style="width: 100px" class="thead-flex">
  144. <em>更新时间</em>
  145. <el-tooltip class="item" effect="dark" placement="top">
  146. <div
  147. slot="content"
  148. style="text-align: center; font-size: 13px; line-height: 20px"
  149. >
  150. 初始值为关注企业的时间,<br />
  151. 关注后,企业下项目动态如有更新, <br />则为项目更新时间
  152. </div>
  153. <i class="icon-quesion"></i>
  154. </el-tooltip>
  155. </span>
  156. <span style="width: 100px">分组</span>
  157. <span style="width: 100px">操作</span>
  158. </div>
  159. <ul
  160. class="listData_ul"
  161. :style="{ 'padding-bottom': getShowPagination ? '' : '48px' }"
  162. >
  163. <li
  164. class="list_li"
  165. style="
  166. padding: 24px 0 26px;
  167. display: flex;
  168. align-items: center;
  169. cursor: default;
  170. "
  171. :class="{ visited: item.visited }"
  172. v-for="(item, index) in getMyData.listState.list"
  173. :key="index"
  174. >
  175. <div
  176. style="padding: 0 12px; width: 810px; cursor: pointer"
  177. @click="goViewEnt(item.s_entId, item)"
  178. >
  179. <div class="list_name ent_li_name visited-hd">
  180. {{ item.s_entname
  181. }}<span class="red_point" v-if="item.i_apppushunread == 1"></span>
  182. </div>
  183. <div class="list_unit">
  184. <div class="pur_unit">
  185. <span class="unit_label">成立日期:</span>
  186. <span class="unit_name entname visited-ft">{{
  187. item.l_establishdate
  188. ? dateFormatter(item.l_establishdate * 1000, 'yyyy-MM-dd')
  189. : '--'
  190. }}</span>
  191. </div>
  192. <div class="pur_unit">
  193. <span class="unit_label">注册资本:</span>
  194. <span class="unit_name entname visited-ft">{{
  195. item.f_capital ? moneyUnit(item.f_capital * 10000) : '--'
  196. }}</span>
  197. </div>
  198. <div class="pur_unit">
  199. <span class="unit_label">企业地址:</span>
  200. <span class="unit_name entname visited-ft"
  201. >{{ item.s_area ? item.s_area : '--'
  202. }}{{ item.s_city ? item.s_city : '' }}</span
  203. >
  204. </div>
  205. <div class="pur_unit">
  206. <span class="unit_label">企业联系方式:</span>
  207. <span class="unit_name entname visited-ft">{{
  208. item.s_phone ? item.s_phone : '--'
  209. }}</span>
  210. </div>
  211. </div>
  212. </div>
  213. <div class="list_li_item">
  214. {{
  215. item.l_lastpushtime
  216. ? dateFormatter(item.l_lastpushtime * 1000, 'yyyy-MM-dd')
  217. : '--'
  218. }}
  219. </div>
  220. <div class="list_li_item item-flex-column">
  221. <span
  222. v-for="(s, j) in formatGroup(item.s_group)"
  223. :key="'00' + j"
  224. style="line-height: 20px"
  225. >{{ s }}</span
  226. >
  227. </div>
  228. <div class="list_li_item entintel-handle">
  229. <span @click="editGroup(item)">编辑分组</span>
  230. <span @click="cancelFollow(item)">取消关注</span>
  231. </div>
  232. </li>
  233. </ul>
  234. </div>
  235. <!-- 企业情报搜索结果组件 -->
  236. <ul class="listData_ul" v-if="type == 'entintelRes'">
  237. <li
  238. class="list_li res_li"
  239. v-for="(item, index) in listState.list"
  240. :key="index"
  241. >
  242. <div class="list_name">
  243. <div class="list_name_left" @click="goViewEnt(item.entId)">
  244. <span class="icon_company"></span>
  245. <span class="list_pur_name">{{ item.entName }}</span>
  246. </div>
  247. <div
  248. class="list_btn"
  249. v-if="item.isFollow == ''"
  250. @click="setFollow(item.entId, item.isFollow)"
  251. >
  252. <span class="icon_grey"></span>
  253. <span class="notice">关注</span>
  254. </div>
  255. <div
  256. class="list_btn_follow"
  257. v-else-if="item.isFollow == '1'"
  258. @click="setFollow(item.entId, item.isFollow)"
  259. >
  260. <span class="icon_heart_red"></span>
  261. <span class="notice">已关注</span>
  262. </div>
  263. </div>
  264. </li>
  265. </ul>
  266. <!-- 企业查询默认和搜索结果组件 -->
  267. <ul class="listData_ul" v-if="type == 'entsearchRes'">
  268. <li
  269. class="list_li"
  270. v-for="(item, index) in listState.list.slice(
  271. (listState.pageNum - 1) * listState.pageSize,
  272. listState.pageNum * listState.pageSize
  273. )"
  274. :key="index"
  275. @click="goSearchViewEnt(item.entId)"
  276. >
  277. <div class="list_name ent_li_name">
  278. {{ item.entName || item.name
  279. }}<span
  280. class="red_point"
  281. v-if="item.isFollow !== 0 && item.i_apppushunread"
  282. ></span>
  283. </div>
  284. <div class="list_unit">
  285. <div class="pur_unit">
  286. <span class="unit_label">成立日期:</span>
  287. <span class="unit_name entname">{{
  288. item.establish_date ? item.establish_date : '--'
  289. }}</span>
  290. </div>
  291. <div class="pur_unit">
  292. <span class="unit_label">注册资本:</span>
  293. <span class="unit_name entname">{{
  294. item.capital ? moneyUnit(item.capital * 10000) : '--'
  295. }}</span>
  296. </div>
  297. <div class="pur_unit">
  298. <span class="unit_label">企业地址:</span>
  299. <span class="unit_name entname"
  300. >{{ item.company_area ? item.company_area : '--'
  301. }}{{ item.company_city ? item.company_city : '' }}</span
  302. >
  303. </div>
  304. <div class="pur_unit">
  305. <span class="unit_label">企业联系方式:</span>
  306. <span class="unit_name entname">{{
  307. item.company_phone ? item.company_phone : '--'
  308. }}</span>
  309. </div>
  310. </div>
  311. </li>
  312. </ul>
  313. <!-- 潜在项目预测 -->
  314. <div class="potential-container" v-if="type == 'potential'">
  315. <div
  316. v-show="tabActive === 'fwl'"
  317. style="background: #f2f2f4; height: 16px"
  318. ></div>
  319. <div v-show="tabActive === 'fwl'" class="list-header">
  320. <div class="list-header-container">
  321. <span>
  322. <el-checkbox v-model="allChecked" @change="onAllCheckedChange"
  323. >全选</el-checkbox
  324. >
  325. <em class="header-result-text" v-html="resultText"></em>
  326. </span>
  327. <div
  328. class="header-export"
  329. :class="{ disabled: listState.list.length === 0 }"
  330. @click="onDataExport"
  331. >
  332. <img src="@/assets/images/icon/export-gray.png" /><span
  333. >数据导出</span
  334. >
  335. </div>
  336. </div>
  337. </div>
  338. <ul class="listData_ul">
  339. <li
  340. class="list_li poten_li"
  341. v-for="(item, index) in listState.list"
  342. :key="index"
  343. >
  344. <span v-show="tabActive === 'fwl'" style="margin-top: 3px">
  345. <el-checkbox
  346. v-model="item.checked"
  347. @change="(checked) => onCheckboxItem(checked, item)"
  348. ></el-checkbox>
  349. </span>
  350. <div
  351. style="margin-left: 8px; flex: 1"
  352. @click.stop="
  353. goPotenSimiLar(item.id, item.purchasing, item.createtime)
  354. "
  355. >
  356. <div class="list_name">
  357. <div class="list_name_left">
  358. <span class="pur_company">采购单位</span>
  359. <span class="list_pur_name">{{ item.buyer }}</span>
  360. </div>
  361. <div class="list_time">
  362. {{ item.createtime }}
  363. </div>
  364. </div>
  365. <div class="list_unit list_poten">
  366. <div class="pur_unit poten_unit">
  367. <span class="unit_label poten_label"
  368. ><span class="point"></span>预测线索</span
  369. >
  370. <span class="unit_name poten_name">{{ item.title }}</span>
  371. </div>
  372. <div class="pur_unit poten_unit poten_margin">
  373. <span class="unit_label poten_label"
  374. ><span class="point"></span>预测采购内容</span
  375. >
  376. <span class="unit_name poten_name">
  377. <span>{{ item.purchasing }}</span>
  378. </span>
  379. </div>
  380. <div
  381. class="pur_unit poten_unit poten_margin"
  382. v-show="tabActive === 'fwl'"
  383. >
  384. <span class="unit_label poten_label"
  385. ><span class="point"></span>合同到期时间:{{
  386. item.yuceendtime
  387. }}</span
  388. >
  389. </div>
  390. </div>
  391. </div>
  392. </li>
  393. </ul>
  394. </div>
  395. <!-- 潜在项目预测近似项目列表 -->
  396. <ul class="listData_ul" v-if="type == 'potensimilar'">
  397. <li
  398. class="list_li potensimilar_li"
  399. v-for="(item, index) in listState.list.slice(
  400. (listState.pageNum - 1) * listState.pageSize,
  401. listState.pageNum * listState.pageSize
  402. )"
  403. :key="index"
  404. >
  405. <div class="list_unit">
  406. <div class="pur_unit">
  407. <span class="unit_label">预测采购内容:</span>
  408. <span class="unit_name">{{ item.p_purchasing }}</span>
  409. </div>
  410. <div class="pur_unit">
  411. <span class="unit_label">同类项目:</span>
  412. <span
  413. class="unit_name similar_name"
  414. @click="goViewDetail(item.p_id)"
  415. >{{ item.p_orther }}</span
  416. >
  417. </div>
  418. <div class="pur_unit">
  419. <span class="unit_label">联系人:</span>
  420. <span class="unit_name">{{ item.p_person }}</span>
  421. </div>
  422. <div class="pur_unit">
  423. <span class="unit_label">联系电话:</span>
  424. <span class="unit_name">{{ item.p_phone }}</span>
  425. </div>
  426. </div>
  427. </li>
  428. </ul>
  429. <Empty
  430. v-if="showEmpty && potenCode != 1"
  431. :tip="getTipText"
  432. :images="tipimages"
  433. >
  434. <el-button
  435. v-if="tips === '暂无企业情报信息,前往企业搜索关注企业'"
  436. class="add-btn"
  437. type="primary"
  438. slot="button"
  439. @click="goSearchEnt"
  440. >
  441. 添加关注企业
  442. </el-button>
  443. <el-button
  444. v-if="resetStatus"
  445. class="add-btn"
  446. type="primary"
  447. slot="button"
  448. @click="goResetFilter"
  449. >重置筛选</el-button
  450. >
  451. <el-button
  452. v-if="goSetStatus"
  453. class="add-btn"
  454. type="primary"
  455. slot="button"
  456. @click="setKey"
  457. >前往订阅设置</el-button
  458. >
  459. </Empty>
  460. <Empty
  461. v-else-if="showEmpty && potenCode == 1"
  462. :images="getAssetsFile('empty/jy-cry.png')"
  463. >
  464. <div name="default">
  465. <div class="poten_tip">暂未设置订阅关键词,无法进行预测</div>
  466. <div class="setKeyWords" v-if="!info.isSubCount">
  467. <button class="add-btn" @click="setKey()">立即设置关键词</button>
  468. </div>
  469. </div>
  470. </Empty>
  471. <div class="el-pagination-container" v-if="listState.total > 0">
  472. <el-pagination
  473. popper-class="pagination-custom-select"
  474. background
  475. layout="prev, pager, next, sizes, jumper"
  476. :current-page="listState.pageNum"
  477. :page-size="listState.pageSize"
  478. :page-sizes="[5, 10, 50, 100]"
  479. :total="listState.total"
  480. :show-confirm-btn="true"
  481. @current-change="onPageChange"
  482. @size-change="onSizeChange"
  483. >
  484. </el-pagination>
  485. </div>
  486. <!-- 分组dialog -->
  487. <el-dialog
  488. custom-class="sub-dialog"
  489. :visible.sync="dialog.group"
  490. :close-on-click-modal="false"
  491. :show-close="false"
  492. :destroy-on-close="true"
  493. :lock-scroll="false"
  494. center
  495. width="460px"
  496. >
  497. <GroupCard
  498. :initGroupInfo="this.cur.group"
  499. @onCancel="dialog.group = false"
  500. @onConfirm="saveGroupData"
  501. >
  502. <div slot="header">编辑分组</div>
  503. </GroupCard>
  504. </el-dialog>
  505. </div>
  506. </template>
  507. <script>
  508. import {
  509. Pagination,
  510. Progress,
  511. Message,
  512. Tooltip,
  513. Dialog,
  514. Button,
  515. Checkbox
  516. } from 'element-ui'
  517. import { mapState } from 'vuex'
  518. import { mixinVisited } from '@/utils/mixins/visited'
  519. import Tips from '@/components/common/Tips.vue'
  520. import tabs from '@/components/common/tabs.vue'
  521. import Empty from '@/components/common/Empty.vue'
  522. import GroupCard from '@/components/selector/GroupSelector.vue'
  523. import TimeSelector from '@/components/selector/TimeSelector.vue'
  524. import { moneyUnit, dateFormatter } from '@/utils'
  525. import { tryCallHooks } from '@jianyu/easy-inject-qiankun'
  526. import { getPowerUrl } from '@/utils/power/redirect'
  527. import {
  528. setFollowEnt,
  529. setCancelEnt,
  530. changeEntGroup,
  531. forecastArea
  532. } from '@/api/modules'
  533. import AreaCityCountryCascader from '@/components/selector-cascader/AreaCityCountryCascader.vue'
  534. export default {
  535. props: [
  536. 'type',
  537. 'title',
  538. 'desc',
  539. 'mydata',
  540. 'myDataObj',
  541. 'resData',
  542. 'myPolicydata',
  543. 'potenObj',
  544. 'potenResult',
  545. 'entSearch',
  546. 'entSearchRes',
  547. 'showFiltrate',
  548. 'tab_list'
  549. ],
  550. name: 'listData',
  551. mixins: [mixinVisited],
  552. components: {
  553. [Pagination.name]: Pagination,
  554. [Progress.name]: Progress,
  555. [Message.name]: Message,
  556. [Tooltip.name]: Tooltip,
  557. [Dialog.name]: Dialog,
  558. [Button.name]: Button,
  559. [Checkbox.name]: Checkbox,
  560. Empty,
  561. GroupCard,
  562. Tips,
  563. TimeSelector,
  564. tabs,
  565. AreaCityCountryCascader
  566. },
  567. data() {
  568. return {
  569. listState: {
  570. loaded: true, // 是否已经搜索过
  571. loading: false,
  572. pageNum: 1, // 当前页
  573. pageSize: 10, // 每页多少条数据
  574. total: 0, // 一共多少条数据
  575. list: [], // 查询请求返回的数据
  576. match: '', // 筛选条件输入框
  577. group: '', // 筛选条件企业名称
  578. distinctCount: 0 // 导出标讯数
  579. },
  580. isFollow: '1',
  581. potenCode: 0,
  582. tips: '', // 空状态提示
  583. tipimages: 'jy-cry.png',
  584. dialog: {
  585. group: false
  586. },
  587. cur: {
  588. group: '', // 当前点击编辑的分组信息
  589. fid: ''
  590. },
  591. tabActive: 'fwl',
  592. regionMapData: '',
  593. sourceAreaMap: {},
  594. allChecked: false,
  595. selectedId: []
  596. }
  597. },
  598. created() {
  599. // 中标企业预测
  600. if (this.type === 'bidfor') {
  601. this.initData(this.mydata, this.type)
  602. }
  603. // 投标决策分析
  604. if (this.type === 'bidpolicy') {
  605. this.initPolicyData(this.myPolicydata, this.type)
  606. }
  607. // 潜在项目预测列表
  608. if (this.type === 'potential') {
  609. this.potenInitData(this.potenObj)
  610. this.getForecastArea()
  611. }
  612. // 潜在项目近似列表
  613. if (this.type === 'potensimilar') {
  614. this.potenSimiData(this.potenResult)
  615. }
  616. // 企业搜索
  617. if (this.type === 'entintelRes') {
  618. this.entSearchData(this.entSearch)
  619. }
  620. // 企业查询
  621. if (this.type === 'entsearchRes') {
  622. this.entSearchResData(this.entSearchRes)
  623. }
  624. },
  625. watch: {
  626. 'myDataObj.list'(newVal) {
  627. this.getMyData.listState.list = newVal.map((item) => {
  628. const visited = this.pathVisited(
  629. this.createPathItem('/ent_portrait/*', `id=${item.s_entId}`)
  630. )
  631. return {
  632. ...item,
  633. visited
  634. }
  635. })
  636. this.getEntListTips()
  637. },
  638. mydata(newVal, oldVal) {
  639. this.initData(newVal)
  640. },
  641. myPolicydata(newVal, oldVal) {
  642. this.initPolicyData(newVal, this.type)
  643. },
  644. resData(newVal, oldVal) {
  645. this.resInitData(newVal)
  646. },
  647. potenObj(newVal) {
  648. this.potenInitData(newVal)
  649. },
  650. potenResult(newVal, oldVal) {
  651. this.potenSimiData(newVal)
  652. },
  653. entSearch(newVal, oldVal) {
  654. this.entSearchData(newVal)
  655. },
  656. entSearchRes(newVal, oldVal) {
  657. this.entSearchResData(this.entSearchRes)
  658. }
  659. // inspectType () {
  660. // this.initPolicyData(this.myPolicydata, this.type)
  661. // }
  662. },
  663. computed: {
  664. ...mapState({
  665. bidnum: (state) => state.forcast.bidForeCastNum,
  666. info: (state) => state.user.info,
  667. filter: (state) => state.forcast.entFilter
  668. }),
  669. showEmpty() {
  670. return !this.listState.list.length
  671. },
  672. getShowPagination() {
  673. let show = true
  674. if (
  675. this.listState.pageNum === 1 &&
  676. this.listState.list &&
  677. this.listState.list.length < this.listState.pageSize
  678. ) {
  679. show = false
  680. }
  681. return show
  682. },
  683. getTipText() {
  684. return this.tips
  685. },
  686. getMyData() {
  687. // eslint-disable-next-line vue/no-side-effects-in-computed-properties
  688. return this
  689. },
  690. activeColor() {
  691. return function (item) {
  692. const val = Number(item)
  693. if (val === 0) {
  694. return '#FF9F40'
  695. } else if (val < 2 && val > 0) {
  696. return '#0BD991'
  697. } else if (val < 3 && val > 1) {
  698. return '#0987FF'
  699. } else {
  700. return '#C0C4CC'
  701. }
  702. }
  703. },
  704. resultText() {
  705. // const checked = this.listState.list.some(v => v.checked)
  706. const checkedCount = this.selectedId.length
  707. if (checkedCount) {
  708. return `已选<em class="highlight-text">${checkedCount}</em>条信息`
  709. } else {
  710. return `搜索到<em class="highlight-text">${this.listState.total}</em>条信息`
  711. }
  712. },
  713. // 是否显示全国
  714. isShowAllCountry() {
  715. const len = Object.keys(this.sourceAreaMap).length
  716. return len === 0
  717. },
  718. resetStatus() {
  719. const type = this.type === 'potential' && this.tabActive === 'fwl'
  720. const text = this.tips === '当前筛选条件下结果为空'
  721. return type && text
  722. },
  723. goSetStatus() {
  724. const exactText = this.tips === '您设置的订阅关键词无法进行预测'
  725. return exactText || this.tips.indexOf('设置订阅关键词') > -1
  726. }
  727. },
  728. mounted() {
  729. this.getEntListTips()
  730. },
  731. methods: {
  732. dateFormatter,
  733. moneyUnit,
  734. initData(list, type) {
  735. this.listState.pageNum = 1
  736. if (list.length !== 0) {
  737. this.listState.list = this.unique(list)
  738. this.listState.total = this.unique(list).length
  739. } else {
  740. this.listState.list = []
  741. this.listState.total = 0
  742. this.tips = '暂无搜索历史'
  743. }
  744. },
  745. initPolicyData(list, type) {
  746. this.listState.pageNum = 1
  747. if (list && list.length !== 0) {
  748. this.listState.list = this.unique(list)
  749. this.listState.total = list.length
  750. } else {
  751. this.listState.list = []
  752. this.listState.total = 0
  753. this.tips = '暂无搜索历史'
  754. }
  755. },
  756. resInitData(list) {
  757. if (list && list.length !== 0) {
  758. list.forEach(function (item) {
  759. item.weight = Number((item.weight * 100).toFixed(0))
  760. if (item.employee_no === '') {
  761. item.employee_no = '--'
  762. }
  763. if (item.capital !== 0) {
  764. item.capital = item.capital + '万元'
  765. } else {
  766. item.capital = '--'
  767. }
  768. })
  769. this.listState.list = list
  770. this.listState.total = list.length
  771. } else {
  772. this.listState.list = []
  773. this.listState.total = 0
  774. }
  775. },
  776. potenInitData(obj) {
  777. // console.log(obj)
  778. if (obj.list && obj.list.length !== 0) {
  779. obj.list.forEach((res) => {
  780. if (res.purchasing && res.purchasing.length > 1) {
  781. res.purchasing = res.purchasing.toString()
  782. } else {
  783. if (res.purchasing) {
  784. res.purchasing = res.purchasing[0]
  785. }
  786. }
  787. })
  788. this.listState.list = obj.list
  789. this.listState.total = obj.count
  790. this.listState.distinctCount = obj.distinctCount
  791. if (this.type === 'potential' && this.tabActive === 'fwl') {
  792. this.allChecked = this.listState.list.every((v) => v.checked)
  793. }
  794. } else {
  795. this.listState.list = []
  796. this.listState.total = 0
  797. if (obj.code === 1) {
  798. this.potenCode = 1
  799. } else {
  800. this.potenCode = 2
  801. this.tips = obj.msg
  802. }
  803. this.allChecked = false
  804. }
  805. this.$forceUpdate()
  806. },
  807. potenSimiData(list) {
  808. if (list && list.length !== 0) {
  809. this.listState.list = list
  810. this.listState.total = list.length
  811. } else {
  812. this.listState.list = []
  813. this.listState.total = 0
  814. }
  815. },
  816. // 企业搜索
  817. entSearchData(list) {
  818. if (list && list.length !== 0) {
  819. this.listState.list = list
  820. this.listState.total = list.length
  821. } else {
  822. this.listState.list = []
  823. this.listState.total = 0
  824. this.tips = '暂无数据'
  825. }
  826. },
  827. entInitData(obj) {
  828. if (obj && obj.list && obj.list.length !== 0) {
  829. this.listState.list = obj.list
  830. this.listState.total = obj.total
  831. } else {
  832. this.listState.list = []
  833. this.listState.total = 0
  834. if (!obj.match && !obj.group && obj.initTotal === 0) {
  835. this.tips = '暂无企业情报信息,前往企业搜索关注企业'
  836. } else {
  837. this.tips = '暂无匹配数据'
  838. }
  839. }
  840. },
  841. // 企业查询
  842. entSearchResData(list) {
  843. this.listState.pageNum = 1
  844. if (list && list.length !== 0) {
  845. this.listState.list = list
  846. this.listState.total = list.length
  847. } else {
  848. this.listState.list = []
  849. this.listState.total = 0
  850. this.tips = '暂无数据'
  851. }
  852. },
  853. // 关注
  854. setFollow(id, num) {
  855. if (num === '') {
  856. setFollowEnt({ entId: id }).then((res) => {
  857. if (res.error_code === 0) {
  858. if (res.data === 'success') {
  859. this.entSearch.forEach(function (item, i) {
  860. if (id === item.entId) {
  861. item.isFollow = '1'
  862. }
  863. })
  864. }
  865. }
  866. })
  867. } else {
  868. setCancelEnt({ entId: id }).then((res) => {
  869. if (res.error_code === 0) {
  870. if (res.data === 'success') {
  871. this.entSearch.forEach(function (item, i) {
  872. if (id === item.entId) {
  873. item.isFollow = ''
  874. }
  875. })
  876. }
  877. }
  878. })
  879. }
  880. },
  881. goBidForcast(data) {
  882. // 有中标预测次数才能点击
  883. if (this.bidnum !== 0) {
  884. const result = [data]
  885. this.$store.commit('forcast/setHistoryList', result)
  886. this.$router.push({
  887. path: '/ai_add',
  888. query: {
  889. pid: data.s_id,
  890. sid: data.sourceinfoid
  891. }
  892. })
  893. }
  894. },
  895. goForcast(data) {
  896. const result = [data]
  897. this.$store.commit('forcast/setHistoryPolicyList', result)
  898. const routeUrl = this.$router.resolve({
  899. path: `/analysis_result?ptid=${data.s_id}&sid=${data.sourceinfoid}`
  900. })
  901. return window.open(routeUrl.href, '_blank')
  902. },
  903. goViewEnt(id, item) {
  904. if (item.i_apppushunread) {
  905. item.i_apppushunread = null
  906. }
  907. if (this.type === 'entintel') {
  908. item.visited = true
  909. this.pathVisiting(this.createPathItem('/ent_portrait/*', `id=${id}`))
  910. }
  911. const { url } = getPowerUrl('entDesc', { id })
  912. window.open(url)
  913. },
  914. goSearchViewEnt(id) {
  915. const routeUrl = this.$router.resolve({
  916. path: `/svip/ent_ser_portrait/${id}`,
  917. query: {
  918. svip: '1'
  919. }
  920. })
  921. return window.open(routeUrl.href, '_blank')
  922. },
  923. goEntPor(id) {
  924. if (id && id !== '' && id !== undefined && id !== 'undefined') {
  925. const routeUrl = this.$router.resolve({
  926. path: `/ent_portrait/${id}`
  927. })
  928. return window.open(routeUrl.href, '_blank')
  929. } else {
  930. this.$message('暂无数据')
  931. }
  932. },
  933. goViewDetail(id) {
  934. const routeUrl = this.$router.resolve({
  935. path: '/pro_follow_detail?sid=' + id
  936. })
  937. return window.open(routeUrl.href, '_blank')
  938. },
  939. goPotenSimiLar(id, keys, time) {
  940. const routeUrl = this.$router.resolve({
  941. path: '/analysis_filter',
  942. query: {
  943. id: id,
  944. keys: keys,
  945. createtime: time
  946. }
  947. })
  948. return window.open(routeUrl.href, '_blank')
  949. },
  950. // 设置关键词
  951. setKey() {
  952. this.$router.push('/set_subscribe/config')
  953. },
  954. // 数组对象去重
  955. unique(arr) {
  956. const res = new Map()
  957. return arr.filter((arr) => !res.has(arr.s_id) && res.set(arr.s_id, 1))
  958. },
  959. onPageChange(p) {
  960. const filter = this.filter
  961. this.listState.pageNum = p
  962. this.$emit(
  963. 'onPageChange',
  964. p,
  965. filter.entVal ? filter.entVal : '',
  966. filter.group ? filter.group : '',
  967. this.listState.pageSize
  968. )
  969. },
  970. onSizeChange(size) {
  971. this.listState.pageNum = 1
  972. this.listState.pageSize = size
  973. this.onPageChange(this.listState.pageNum)
  974. },
  975. // 处理显示分组
  976. formatGroup(data) {
  977. if (!data) return
  978. let val
  979. switch (data) {
  980. case 'A':
  981. val = '默认分组'
  982. break
  983. case 'B':
  984. val = '竞争对手'
  985. break
  986. case 'C':
  987. val = '合作伙伴'
  988. break
  989. case 'B,C' || 'C,B':
  990. val = '竞争对手,合作伙伴'
  991. break
  992. default:
  993. val = '默认分组'
  994. break
  995. }
  996. const arr = val.split(',')
  997. return arr
  998. },
  999. // 企业情报监控 编辑分组
  1000. editGroup(item) {
  1001. this.dialog.group = true
  1002. this.cur.group = item.s_group ? item.s_group : 'A'
  1003. this.cur.fid = item.fid
  1004. },
  1005. // 企业情报监控 取消关注
  1006. cancelFollow(item) {
  1007. const filter = this.filter
  1008. const num = this.listState.list.length <= 1 ? 0 : this.listState.pageNum
  1009. setCancelEnt({
  1010. entId: item.s_entId,
  1011. fid: item.fid
  1012. }).then((res) => {
  1013. if (res.data === 'success') {
  1014. this.$toast('取消关注成功', 1000)
  1015. this.$emit(
  1016. 'onPageChange',
  1017. num,
  1018. filter.entVal ? filter.entVal : '',
  1019. filter.group ? filter.group : '',
  1020. this.listState.pageSize
  1021. )
  1022. } else {
  1023. this.$toast(res.error_msg)
  1024. }
  1025. })
  1026. },
  1027. saveGroupData(data) {
  1028. const params = {
  1029. fid: this.cur.fid,
  1030. group: data
  1031. }
  1032. const defaultParams = {
  1033. fid: this.cur.fid
  1034. }
  1035. const filter = this.filter
  1036. const num = this.listState.list.length <= 1 ? 0 : this.listState.pageNum
  1037. // console.log(num, this.listState.list, '1111')
  1038. changeEntGroup(data === 'A' ? defaultParams : params).then((res) => {
  1039. if (res.data === 'success') {
  1040. this.dialog.group = false
  1041. this.$emit(
  1042. 'onPageChange',
  1043. num,
  1044. filter.entVal ? filter.entVal : '',
  1045. filter.group ? filter.group : '',
  1046. this.listState.pageSize
  1047. )
  1048. } else {
  1049. this.$toast(res.error_msg)
  1050. }
  1051. })
  1052. },
  1053. goSearchEnt() {
  1054. const url = '/jylab/entSearch/index.html'
  1055. tryCallHooks({
  1056. fn: () => {
  1057. this.$BRACE.methods.open({
  1058. route: {
  1059. link: url,
  1060. appType: 'iframe'
  1061. }
  1062. })
  1063. },
  1064. spareFn: () => {
  1065. window.open(url)
  1066. }
  1067. })
  1068. },
  1069. getEntListTips() {
  1070. if (
  1071. this.myDataObj &&
  1072. !this.myDataObj.match &&
  1073. !this.myDataObj.group &&
  1074. this.myDataObj.initTotal === 0
  1075. ) {
  1076. this.tips = '暂无企业情报信息,前往企业搜索关注企业'
  1077. this.tipimages = 'jy-back.png'
  1078. console.info(this.tipimages)
  1079. } else if (
  1080. this.myDataObj &&
  1081. this.myDataObj.list.length === 0 &&
  1082. this.myDataObj.initTotal !== 0
  1083. ) {
  1084. this.tips = '暂无匹配数据'
  1085. this.tipimages = 'jy-back.png'
  1086. }
  1087. },
  1088. changeTime(data) {
  1089. this.$emit('onChange', data)
  1090. if (this.type === 'potential') {
  1091. this.selectedId = []
  1092. this.$emit('changeId', this.selectedId)
  1093. }
  1094. },
  1095. tabChange(data) {
  1096. this.tabActive = data.value
  1097. this.$refs.timeSelector.setState({
  1098. exact: 'all'
  1099. })
  1100. this.$emit('tabChange', data)
  1101. },
  1102. async getForecastArea() {
  1103. const { data } = await forecastArea()
  1104. this.sourceAreaMap = data || {}
  1105. // const obj = {
  1106. // 安徽: {},
  1107. // 广西: {
  1108. // 贺州市: ['富川瑶族自治县']
  1109. // },
  1110. // 河南: {
  1111. // 郑州市: []
  1112. // }
  1113. // }
  1114. // this.sourceAreaMap = obj
  1115. },
  1116. onDataExport() {
  1117. if (this.listState.list.length === 0) return
  1118. this.$emit('export')
  1119. },
  1120. onAllCheckedChange(checked) {
  1121. if (this.listState.list.length === 0) return
  1122. this.listState.list.forEach((v) => {
  1123. v.checked = checked
  1124. })
  1125. if (checked) {
  1126. const selectedArr = this.listState.list
  1127. .filter((v) => v.checked)
  1128. .map((s) => s.infoId)
  1129. const uniqueArr = Array.from(new Set(selectedArr))
  1130. this.selectedId = this.selectedId.concat(uniqueArr)
  1131. this.selectedId = Array.from(new Set(this.selectedId))
  1132. } else {
  1133. const noSelectedArr = this.listState.list.map((s) => s.infoId)
  1134. const data = []
  1135. this.selectedId.forEach((el, index) => {
  1136. if (!noSelectedArr.find((item) => item === el)) {
  1137. data.push(this.selectedId[index])
  1138. }
  1139. })
  1140. this.selectedId = data
  1141. }
  1142. this.$emit('changeId', this.selectedId)
  1143. this.$forceUpdate()
  1144. },
  1145. onCheckboxItem(checked, item) {
  1146. if (checked) {
  1147. this.selectedId.push(item.infoId)
  1148. Array.from(new Set(this.selectedId))
  1149. } else {
  1150. this.selectedId = this.selectedId.filter((v) => v !== item.infoId)
  1151. }
  1152. this.$emit('changeId', this.selectedId)
  1153. },
  1154. // 省市区组件回调数据
  1155. onAreaCityCountryChange(data) {
  1156. // const { regionMap } = data
  1157. // this.regionMapData = regionMap
  1158. // this.selectedId = []
  1159. // this.$emit('changeArea', regionMap)
  1160. // this.$emit('changeId', this.selectedId)
  1161. },
  1162. // 每次选择地区时不需要都调用接口,等所有选择完 下拉框隐藏时再调用
  1163. onAreaHideSelect(data) {
  1164. const { regionMap } = data
  1165. if (JSON.stringify(regionMap) === JSON.stringify(this.regionMapData))
  1166. return
  1167. this.regionMapData = regionMap
  1168. this.selectedId = []
  1169. this.$emit('changeArea', regionMap)
  1170. this.$emit('changeId', this.selectedId)
  1171. },
  1172. // 重置筛选(目前需求只有潜在项目预测-服务类项目有)
  1173. goResetFilter() {
  1174. this.regionMapData = ''
  1175. this.$emit('changeArea', {})
  1176. this.$refs.areaCityCountry.setState(this.regionMapData)
  1177. this.$refs.timeSelector.setState({
  1178. exact: 'all'
  1179. })
  1180. this.$emit('onChange', { start: 0, end: 0 })
  1181. }
  1182. }
  1183. }
  1184. </script>
  1185. <style lang="scss" scoped>
  1186. .listData {
  1187. padding-top: 36px;
  1188. width: 100%;
  1189. background-color: #fff;
  1190. border-radius: 8px;
  1191. .listData_title {
  1192. padding-left: 40px;
  1193. width: 100%;
  1194. height: 28px;
  1195. font-size: 18px;
  1196. font-weight: 400;
  1197. text-align: LEFT;
  1198. color: #1d1d1d;
  1199. line-height: 28px;
  1200. }
  1201. .listData_desc {
  1202. font-size: 14px;
  1203. line-height: 22px;
  1204. color: #686868;
  1205. padding-left: 40px;
  1206. margin: 20px 0 16px 0;
  1207. }
  1208. .filtrate_box {
  1209. border-bottom: 1px dashed #e0e0e0;
  1210. // min-height: 123px;
  1211. .selector-card.time-selector.s-line {
  1212. // padding: 12px 16px;
  1213. }
  1214. .filter-label {
  1215. display: flex;
  1216. align-items: center;
  1217. justify-content: flex-end;
  1218. font-size: 14px;
  1219. white-space: nowrap;
  1220. min-width: 98px;
  1221. color: #686868;
  1222. }
  1223. .filter-region {
  1224. border-top: 1px dashed #e0e0e0;
  1225. background: #f2f2f4;
  1226. .area-city-country {
  1227. border-radius: 0 0 8px 8px;
  1228. }
  1229. }
  1230. .tab_box {
  1231. padding: 0 0 4px 40px;
  1232. }
  1233. ::v-deep {
  1234. .date-time-container .date-time-item.left::after {
  1235. height: 1px;
  1236. background-color: #e0e0e0;
  1237. }
  1238. .selector-card.s-line {
  1239. padding: 16px 40px;
  1240. }
  1241. }
  1242. }
  1243. .no-border {
  1244. border: 0;
  1245. }
  1246. .tip_title {
  1247. padding-left: 40px;
  1248. padding-right: 40px;
  1249. margin-top: 24px;
  1250. margin-bottom: -10px;
  1251. }
  1252. .entintel-thead {
  1253. display: flex;
  1254. align-items: center;
  1255. margin-top: 26px;
  1256. height: 48px;
  1257. background: #f7f9fc;
  1258. color: #1d1d1d;
  1259. text-align: center;
  1260. font-size: 14px;
  1261. .thead-flex {
  1262. display: flex;
  1263. align-items: center;
  1264. justify-content: center;
  1265. }
  1266. .icon-quesion {
  1267. display: inline-block;
  1268. width: 18px;
  1269. height: 18px;
  1270. margin-left: 2px;
  1271. background: url('~@/assets/images/icon/help.png') no-repeat center center;
  1272. background-size: contain;
  1273. cursor: pointer;
  1274. ::before {
  1275. content: '' !important;
  1276. }
  1277. }
  1278. }
  1279. .list_li_item {
  1280. width: 100px;
  1281. text-align: center;
  1282. font-size: 14px;
  1283. &.item-flex-column {
  1284. display: flex;
  1285. flex-direction: column;
  1286. align-items: center;
  1287. }
  1288. }
  1289. .add-btn {
  1290. margin: 16px 0;
  1291. background: #2cb7ca;
  1292. border-radius: 4px;
  1293. border: 0;
  1294. height: 30px;
  1295. padding: 0 24px;
  1296. color: #fff;
  1297. }
  1298. .entintel-handle {
  1299. width: 100px;
  1300. display: flex;
  1301. flex-direction: column;
  1302. align-items: center;
  1303. font-size: 14px;
  1304. color: #2cb7ca;
  1305. line-height: 22px;
  1306. span {
  1307. cursor: pointer;
  1308. }
  1309. }
  1310. .list-header {
  1311. background: #f2f2f4;
  1312. border-bottom: 1px solid #ececec;
  1313. .list-header-container {
  1314. padding: 12px 16px;
  1315. display: flex;
  1316. align-items: center;
  1317. justify-content: space-between;
  1318. background: #fff;
  1319. border-radius: 8px 8px 0 0;
  1320. }
  1321. .header-result-text {
  1322. margin-left: 8px;
  1323. font-size: 14px;
  1324. color: #686868;
  1325. }
  1326. .header-export {
  1327. display: flex;
  1328. align-items: center;
  1329. color: #252627;
  1330. font-size: 14px;
  1331. cursor: pointer;
  1332. &.disabled {
  1333. opacity: 0.5;
  1334. cursor: not-allowed;
  1335. }
  1336. img {
  1337. width: 24px;
  1338. height: 24px;
  1339. }
  1340. }
  1341. }
  1342. .listData_ul {
  1343. content: '';
  1344. overflow: hidden;
  1345. width: 100%;
  1346. .list_li {
  1347. padding: 24px 40px 26px;
  1348. width: 100%;
  1349. box-shadow: 0px -1px 0px 0px rgba(0, 0, 0, 0.05) inset;
  1350. cursor: pointer;
  1351. .list_name {
  1352. font-size: 16px;
  1353. font-weight: 400;
  1354. text-align: LEFT;
  1355. color: #1d1d1d;
  1356. line-height: 24px;
  1357. }
  1358. .ent_li_name {
  1359. display: flex;
  1360. align-items: center;
  1361. .red_point {
  1362. display: flex;
  1363. margin-left: 4px;
  1364. width: 8px;
  1365. height: 8px;
  1366. background: #fb483d;
  1367. border-radius: 50%;
  1368. }
  1369. }
  1370. .list_unit {
  1371. display: flex;
  1372. margin-top: 12px;
  1373. .pur_unit {
  1374. margin-right: 28px;
  1375. font-size: 14px;
  1376. color: #2cb7ca;
  1377. font-weight: 400;
  1378. .unit_label {
  1379. color: #999999;
  1380. }
  1381. .entname {
  1382. color: #1d1d1d;
  1383. text-shadow: 0px -1px 0px 0px rgba(0, 0, 0, 0.05) inset;
  1384. }
  1385. }
  1386. }
  1387. &:hover {
  1388. background: #f5f6f7;
  1389. box-shadow: 0px -1px 0px 0px rgba(0, 0, 0, 0.05) inset;
  1390. .list_name {
  1391. color: #2cb7ca;
  1392. }
  1393. .unit_name.entname {
  1394. color: #2cb7ca;
  1395. }
  1396. }
  1397. }
  1398. // 中标预测--预测项目
  1399. .list_li_result {
  1400. padding: 14px 40px;
  1401. display: flex;
  1402. align-items: center;
  1403. width: 100%;
  1404. height: 108px;
  1405. .list_li_left {
  1406. display: flex;
  1407. flex-direction: column;
  1408. justify-content: center;
  1409. align-items: center;
  1410. width: 76px;
  1411. height: 100%;
  1412. .result_chart {
  1413. display: flex;
  1414. flex-direction: column;
  1415. justify-content: center;
  1416. align-items: center;
  1417. width: 100%;
  1418. .bidrete_text {
  1419. margin-top: 10px;
  1420. font-size: 14px;
  1421. color: #737278;
  1422. }
  1423. }
  1424. // .result_chart ::v-deep svg>path:nth-child(2) {
  1425. // stroke: #120D65;
  1426. // }
  1427. }
  1428. .list_li_right {
  1429. margin-left: 30px;
  1430. display: flex;
  1431. flex-direction: column;
  1432. justify-content: center;
  1433. .list_name {
  1434. font-size: 16px;
  1435. font-family: Microsoft YaHei, Microsoft YaHei-Regular;
  1436. font-weight: 400;
  1437. text-align: LEFT;
  1438. color: #1d1d1d;
  1439. line-height: 24px;
  1440. text-shadow: 0px -1px 0px 0px rgba(0, 0, 0, 0.05) inset;
  1441. }
  1442. .list_unit {
  1443. display: flex;
  1444. align-items: center;
  1445. margin-top: 12px;
  1446. .pur_unit {
  1447. margin-right: 40px;
  1448. }
  1449. }
  1450. }
  1451. }
  1452. // 潜在项目预测样式
  1453. .poten_li {
  1454. padding: 24px 40px 24px 16px;
  1455. display: flex;
  1456. .list_name {
  1457. display: flex;
  1458. justify-content: space-between;
  1459. align-items: center;
  1460. .pur_company {
  1461. margin-right: 8px;
  1462. padding: 2px 8px;
  1463. width: 68px;
  1464. height: 24px;
  1465. background: rgba(245, 101, 0, 0.1);
  1466. border-radius: 2px;
  1467. box-shadow: 0px -1px 0px 0px rgba(0, 0, 0, 0.05) inset;
  1468. font-size: 13px;
  1469. font-weight: 400;
  1470. text-align: center;
  1471. color: #f56500;
  1472. line-height: 20px;
  1473. }
  1474. .list_time {
  1475. font-size: 12px;
  1476. font-weight: 400;
  1477. color: #9b9ca3;
  1478. text-shadow: 0px -1px 0px 0px rgba(0, 0, 0, 0.05) inset;
  1479. }
  1480. }
  1481. .list_poten {
  1482. display: flex;
  1483. flex-direction: column;
  1484. .poten_unit {
  1485. display: flex;
  1486. flex-direction: column;
  1487. .poten_label {
  1488. display: flex;
  1489. align-items: center;
  1490. font-size: 12px;
  1491. font-weight: 400;
  1492. color: #999999;
  1493. line-height: 20px;
  1494. text-shadow: 0px -1px 0px 0px rgba(0, 0, 0, 0.05) inset;
  1495. .point {
  1496. display: flex;
  1497. margin-right: 8px;
  1498. width: 4px;
  1499. height: 4px;
  1500. background: #ececec;
  1501. border-radius: 50%;
  1502. box-shadow: 0px -1px 0px 0px rgba(0, 0, 0, 0.05) inset;
  1503. }
  1504. }
  1505. .poten_name {
  1506. margin-left: 12px;
  1507. font-size: 14px;
  1508. font-weight: 400;
  1509. color: #686868;
  1510. line-height: 24px;
  1511. text-shadow: 0px -1px 0px 0px rgba(0, 0, 0, 0.05) inset;
  1512. }
  1513. }
  1514. .poten_margin {
  1515. margin-top: 10px;
  1516. }
  1517. }
  1518. }
  1519. // 潜在项目近似项目预测样式
  1520. .potensimilar_li {
  1521. .list_unit {
  1522. display: flex;
  1523. flex-direction: column;
  1524. margin-top: 0;
  1525. .pur_unit {
  1526. display: flex;
  1527. align-items: center;
  1528. margin-top: 12px;
  1529. .unit_label {
  1530. display: flex;
  1531. justify-content: flex-end;
  1532. width: 98px;
  1533. text-align: right;
  1534. font-size: 14px;
  1535. color: #999999;
  1536. line-height: 22px;
  1537. }
  1538. .unit_name {
  1539. flex: 1;
  1540. font-size: 14px;
  1541. color: #1d1d1d;
  1542. line-height: 22px;
  1543. }
  1544. .similar_name {
  1545. color: #2cb7ca;
  1546. text-decoration: underline;
  1547. }
  1548. }
  1549. }
  1550. }
  1551. // 企业情报搜索结果组件样式
  1552. .res_li {
  1553. .list_name {
  1554. display: flex;
  1555. justify-content: space-between;
  1556. .list_name_left {
  1557. display: flex;
  1558. align-items: center;
  1559. .icon_company {
  1560. display: flex;
  1561. margin-right: 8px;
  1562. width: 24px;
  1563. height: 24px;
  1564. background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKsSURBVHgB7ZldbtNAEMdn1oHQIqiPYB6Q2iKV+AaxAkg8QU+Q9gRtTlA4AeEElBOkfeIBheQGNpEokfriG5C3ilB7GKdp5abeje2s4lb176Hb/fBmJzv7n/UEoKSkpKRIMM2g9e9uHYWxh0g1yM6ICH2E4PikYR+CZpQGWB3XXFkzOghUBw0QYP8Mg23fsUegCaHqXF0TPV2Lj4jmWiGjAxqRGrDZdXe4yOMySiIjpnNroSLrQMQmxer8v0dB2IJz8CEDwgATKuILxL4MQqPJxSFoQGoA+2v9Wh3D7eFr24cc1HquMybx57LOu6BtZ0XagUMn3+IjvJuH1gRNpDbgtnLnDahAQWz8GPSkncSCMQ4+D9/Od9tcBkwC3BOjjpjsy0Qcff8FnmoByviCUMeq2H/RHbR/NbZaoCCXARzgXF6mJevHKL5XjT7/dWABCGl/szswTxpbu7Ixec9AChWRG5gJpJ3oLibrzrUDFIa7HOjeqcYERMeq/jAIE3dn4pZCfOJNtK7aDOOAi37S+FwG/H5lH3FxBAvAQbEv63vec/0HFLnpBarAdytl9NSxvZkmqcsWpkLxuVafGu+zPBOnUBVa/+ZaRlW4BGRGz7B0jqye+yzL+0KhKhTwTZWuz2U+Os92hS9MhSJO39jeRtdtIeDLybxAP1WHO4nCVOhqrobdhgW4n5e5UoWmlCoEpQotzr1XodKAokltAMubtlzOPGoZPktlgB+vPA4nb0VLYQxib6bJk42Vptc5AfsBUBzMDB6xbudNjVszdR+SFzQbGziyhy2ZWkll9KGA9l+CZvzddDqxLleykhrpZt0nIZdsqQtF+UxO6DoE2bLROpksntegyssqD3H04IUR4dclGzLicP/xDEN7XlI51W9kl0SXL1gCWW+kJSUld5j/wlY18F5JPmoAAAAASUVORK5CYII=)
  1565. no-repeat;
  1566. background-size: contain;
  1567. }
  1568. }
  1569. .list_btn {
  1570. display: flex;
  1571. justify-content: center;
  1572. align-items: center;
  1573. width: 82px;
  1574. height: 36px;
  1575. border: 1px solid #e0e0e0;
  1576. border-radius: 5px;
  1577. box-shadow: 0px -1px 0px 0px rgba(0, 0, 0, 0.05) inset;
  1578. color: #686868;
  1579. font-size: 14px;
  1580. .icon_grey {
  1581. display: flex;
  1582. justify-content: center;
  1583. align-items: center;
  1584. margin-right: 4px;
  1585. width: 16px;
  1586. height: 16px;
  1587. background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAkCAYAAAD7PHgWAAAACXBIWXMAACE4AAAhOAFFljFgAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOCSURBVHgBzZhNbtpAFMffeMyqG25Q9wSlNwgnCCyrJiFWACmrJCcAbkBXSIbIpDTKMrkB9ASlJ6iPgNS0ioTt1zdj/AHYxDYk5L/xjGf85jdvvt4Y4I2LpalkmvfF+fyfBuCUgg8ZsxqN4wmklLBh248lRNSy2NgI2O+PDkBhh4B4StlivAE25Jx3dP2zlWSDMawhsEqCjRnZeEiyEQsoe+v+aQGyS0grxrqNs6Or6CvD+HbKFGamtwHtxtlxZ/lVHJzzdwyApeUSnAEoFpNPyslytuIRNlX5u7KuV2WdwWDURYCLGBsWZYppbKirgKtw5P4JzZtOo3EyWa0rhg8ZmlRHWwCUxPfUSdmA69pDUPihQlBJNoSXQYHWso3He0qUvfajDV7f0rC67bDDLhmtteEZEWibLLUgwQtptGZjMWUCwF7vTlML9u+scPCCkCpXPyh+plBwggJy9zQLnBBtF22amJEJHgxVNhsAEz/vOPZlAIjgVoI04hXk0DokHEBWRb6nBVaTgHK/W6wmscKybMCbIGn+fIWMEm3TnmktskW5ihEVjTFXvnERfsGWWgxVG3KKnPSDHppISw8SnBYWsinsWwiWn1TgjUsC0hBb/gs6wN/DnoUMPvpp34PBsNLxU4G9iwUnmQRsNr9MYXHGkoreqt6PZPQDQUg2C+YgLY4bCDMt2JOQhdGPCMMCwPnc7kbqHfSvR68OKWKBiPeA83knADw/162lUwCh/ZqQcYGKruvWWjzYH4wo3IocUTFB5EvDiRCvXj+S4dbaPqhyuwqRVf3SnlzzHLVNQ1uFADZGpmlSVK0KT0YD11Pq1Q3sUMZgdEEA3bANtDh3PtHQBiFa7EkiKthzu4peaC5F6eFg8L0GO5KwFQNXjsJ57zeo1zM1XuDjMBzfjScFnOhwDJy1WvfZe3E8JFTr9eMHyCG6SFUozrtPA+eVp1AM5AxdpeydQOllGLclprhibhfTwHl1UmpbyDxwXr0MyguZF86rm1ECUi3wn5EL94xuX5+Sfn2I2yIvOGP/CMsCJ5Q5YBVHIrpOORr9OI5Dl/U7DZ6BE9+4rlNNCyeU2YO+DMOkYePj8LLFyDO87HsyDk50rNnUMy2s3ICbIJ+eKBLZAZxnc0ut7msJjeTeN7e+NImG6QeSnlSOLup54YR2cqtrnp0MhZeiZ7f8xYZAw3oyhC30H/vo/dbmeuwmAAAAAElFTkSuQmCC)
  1588. no-repeat;
  1589. background-size: contain;
  1590. }
  1591. &:hover {
  1592. border: 1px solid #fe737a;
  1593. .icon_grey {
  1594. display: flex;
  1595. width: 18px;
  1596. height: 18px;
  1597. background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAHlSURBVHgB7ZntTcJAHMafNg7gBjJC3QAmME6gJvoZRtAN4LMxsgEbaDewTiBs0AEE/D+1JoT2yr1RzuR+yYXQl7vn12u56wFEIpFIxIEEhmyfh0OkYLmQr+dSSmywkpInD3l+8PzX4Tm+keEMV/X5xnUYC1SNAmMpk7pBFUspcymz5C4vXeqQ85+gwUEBaTiTj4WUAfRZSrmWEIVjHSOpY9l1UKdA3fA7uq+YihLb6mqzlal1Hb8SheoApYCEH8jHh2XDPqHEpaon0o4Tba+8b5hhodrZKiBX/xZm9+uxybYvVaYGqh4YIzRS3LRtbjwD9b3/hRBZp4Pk/m21u6nZA2tkCJVkM9rf1BRIAhZo+VFJ8b/QEigRLo1sTYEUylHv5LRka+sBHhRqLxwWqGeROcJjvj/DJaqHeIbwaJ1etwqIaS4zyZAkZuaTuQSPQBAPdCHhJ6qdSoH6fuPId0qJos6gROeNjIMHp9Z9j9BV+LYHdxeTd+I+JbTCE+1ViR4ltMMTo2WVHiSMwhPzdaHjSRiHJ8YC5AgSVuGJlQDxKGEdnlgLEA8STuGJkwBxkHAOT5wFiIWEl/DEiwAxkPAWnngTIBoSXsMTrwKkQ8J7eOJd4I96eZJ/YjDwpwSfIhKJRCKh8QM2/7mt6fWCsAAAAABJRU5ErkJggg==)
  1598. no-repeat;
  1599. background-size: contain;
  1600. }
  1601. .notice {
  1602. color: #fe737a;
  1603. }
  1604. }
  1605. }
  1606. .list_btn_follow {
  1607. display: flex;
  1608. justify-content: center;
  1609. align-items: center;
  1610. width: 82px;
  1611. height: 36px;
  1612. color: #686868;
  1613. font-size: 14px;
  1614. .icon_heart_red {
  1615. display: flex;
  1616. justify-content: center;
  1617. align-items: center;
  1618. margin-right: 4px;
  1619. width: 16px;
  1620. height: 16px;
  1621. background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAACBElEQVRYR+3Xv0scQRTA8e+TC0TwTwiYkBQ2IvYBx1QJJIVgkUAE90QI2KQR0qmEkBSBpAlpEvcKwRSCTUC7G8E/QEFQKy/gnxA0kGMn7HLIJW7mx7q3WNw0V9zMm8+9fftmTrhmQ66Zhz7I9UT6Gbpyhszq5ARiZgGF4VYn4BHCdxJpyFzzuHsT03hwlyR5gfAYuI2hhnAKaBL5KHPNfRvqv4/MfFJDDPIZ4bklwC/gHS3eZHOGWQJeIdQsa75xxrws6J95c3JBHcwWwn1XirPvDRvZpzDtOX+Xcx7lofJBsVoHnnoFLzrJsCZ1PfPv8ksg83VyjAGzV3SfoHVGlNSbO91rLoNiFQNpEVcxGhLpyAU6yd6OakZLIn3HDlpVvx1vSXlUQ1vq+oYrQ+fAzfJ2tUTyBB0CIxWBDqSuR10Z+gC8rAQkvJdZvWgHfVH3GOCwgjpKu/y4RPrICsoab6zeZkdAb8eyRHrF2Rgz0JKqMcy691EQCk+Pmh88kxXd9gL1FGXBpPtaL2ilZ8qBcYJKzZQHxgtUCsoT4w3qQm12boIhZbxNiyd5BZwXJOiSb2KVHimbwENP0TYwJZFOe47XCAJ1epQvKhgT9Mi6f55HpgphCoMcmSqMuRLoAiW8JiH929NGWMOwGFIz3p3aqwJ7MCm4qHtg+CtkH+TKcD9Drgz9AS0gsyVs0KiWAAAAAElFTkSuQmCC)
  1622. no-repeat;
  1623. background-size: contain;
  1624. }
  1625. }
  1626. }
  1627. &:hover {
  1628. background: none;
  1629. .list_pur_name {
  1630. color: #1d1d1d;
  1631. }
  1632. }
  1633. }
  1634. }
  1635. .poten_tip {
  1636. text-align: center;
  1637. }
  1638. .setKeyWords {
  1639. display: flex;
  1640. justify-content: center;
  1641. align-items: center;
  1642. margin-top: 40px;
  1643. width: 100%;
  1644. height: 46px;
  1645. .setBtn {
  1646. width: 352px;
  1647. height: 46px;
  1648. background: #2cb7ca;
  1649. border-radius: 6px;
  1650. font-size: 16px;
  1651. font-family: Microsoft YaHei, Microsoft YaHei-Regular;
  1652. font-weight: 400;
  1653. text-align: CENTER;
  1654. color: #ffffff;
  1655. }
  1656. }
  1657. .el-pagination-container {
  1658. margin-right: 40px;
  1659. }
  1660. ::v-deep {
  1661. .list-header,
  1662. .poten_li {
  1663. .el-checkbox__label {
  1664. font-size: 16px;
  1665. }
  1666. .el-checkbox__inner {
  1667. width: 18px;
  1668. height: 18px;
  1669. }
  1670. .el-checkbox__input.is-checked + .el-checkbox__label {
  1671. color: #1d1d1d;
  1672. }
  1673. .el-checkbox__inner::after {
  1674. width: 5px;
  1675. height: 8px;
  1676. }
  1677. }
  1678. }
  1679. .empty-container {
  1680. padding-bottom: 60px;
  1681. }
  1682. }
  1683. </style>