digitalSigns.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. <template>
  2. <div class="div-box-new-margin">
  3. <div class="div-box-new">
  4. <div style="font-size: 16px;color: #333333;margin-bottom: 20px">{{$t('线索数据概况')}}</div>
  5. <div class="div-border-new">
  6. <div class="item div-click" @click="onClick('线索总数')">
  7. <p class="title">{{list.total}}</p>
  8. <span class="content-font-new">{{$t('线索总数')}}</span>
  9. <el-tooltip placement="top">
  10. <div slot="content">{{$t('线索总数:包含待分配、已分配线索数。')}}</div>
  11. <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
  12. </el-tooltip>
  13. </div>
  14. <div class="item div-click" @click="onClick('待分配未过期线索数')">
  15. <p class="title">{{ list.dfp }}</p>
  16. <span class="content-font-new">{{$t('待分配未过期线索数')}}</span>
  17. <el-tooltip placement="top">
  18. <div slot="content">{{$t('待分配未过期线索数:所有线索中,待分配未过期的线索数量。')}}</div>
  19. <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
  20. </el-tooltip>
  21. </div>
  22. <div class="item div-click" @click="onClick('待跟进线索数')">
  23. <p class="title">{{ list.dgj }}</p>
  24. <span class="content-font-new">{{$t('待跟进线索数')}}</span>
  25. <el-tooltip placement="top">
  26. <div slot="content">{{$t('待跟进线索数:销售线索应用中,已分配给业务员,待跟进状态的线索数量。')}}</div>
  27. <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
  28. </el-tooltip>
  29. </div>
  30. <div class="item div-click" @click="onClick('跟进中线索数')">
  31. <p class="title">{{ list.gjz }}</p>
  32. <span class="content-font-new">{{$t('跟进中线索数')}}</span>
  33. <el-tooltip placement="top">
  34. <div slot="content">{{$t('跟进中线索数:销售线索应用中,已分配给业务员,跟进中状态的线索数量。')}}</div>
  35. <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
  36. </el-tooltip>
  37. </div>
  38. <div class="item div-click" @click="onClick('已转化线索数')">
  39. <p class="title">{{ list.yzh }}</p>
  40. <span class="content-font-new">{{$t('已转化线索数')}}</span>
  41. <el-tooltip placement="top">
  42. <div slot="content">{{$t('①已转化线索数:销售线索应用中,已分配给业务员,已转化状态的线索数量。')}}<br/>
  43. {{$t('②一条线索可进行两次转化:转化客户、转化项目,因此,已转化线索数≠转化客户线索数+转化项目线索数。')}}</div>
  44. <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
  45. </el-tooltip>
  46. </div>
  47. <div class="item div-click" @click="onClick('已无效线索数')">
  48. <p class="title">{{ list.ywx }}</p>
  49. <span class="content-font-new">{{$t('已无效线索数')}}</span>
  50. <el-tooltip placement="top">
  51. <div slot="content">{{$t('已无效线索数:销售线索应用中,已分配给业务员,已无效状态的线索数量。')}}</div>
  52. <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
  53. </el-tooltip>
  54. </div>
  55. <div class="item div-click" @click="onClick('待分配已过期线索数')">
  56. <p class="title">{{ list.ygq }}</p>
  57. <span class="content-font-new">{{$t('待分配已过期线索数')}}</span>
  58. <el-tooltip placement="top">
  59. <div slot="content">{{$t('待分配已过期线索数:所有线索中,待分配已过期的线索数量。')}}</div>
  60. <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
  61. </el-tooltip>
  62. </div>
  63. <div class="item">
  64. <p class="title">{{ Math.round(((list.gqbl * 100)*100)/100) }}%</p>
  65. <span class="content-font-new">{{$t('过期比例')}}</span>
  66. <el-tooltip placement="top">
  67. <div slot="content">{{$t('过期比例=已过期线索数÷待分配线索数×100%')}}</div>
  68. <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
  69. </el-tooltip>
  70. </div>
  71. <div class="item div-click" @click="onClick('转化客户线索数')">
  72. <p class="title">{{ list.covercusomers }}</p>
  73. <span class="content-font-new">{{$t('转化客户线索数')}}</span>
  74. <el-tooltip placement="top">
  75. <div slot="content">{{$t('转化客户线索数:统计有转化客户操作的线索数')}}</div>
  76. <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
  77. </el-tooltip>
  78. </div>
  79. <div class="item div-click" @click="onClick('转化项目线索数')">
  80. <p class="title">{{ list.coverproject }}</p>
  81. <span class="content-font-new">{{$t('转化项目线索数')}}</span>
  82. <el-tooltip placement="top">
  83. <div slot="content">{{$t('转化项目线索数:统计有转化项目操作的线索数')}}</div>
  84. <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
  85. </el-tooltip>
  86. </div>
  87. <div class="item">
  88. <p class="title">{{ Math.round(((list.zhl*100)*100)/100) }}%</p>
  89. <span class="content-font-new">{{$t('线索转化率')}}</span>
  90. <el-tooltip placement="top">
  91. <div slot="content">{{$t('线索转化率=已转化线索数÷线索总数×100%')}}</div>
  92. <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
  93. </el-tooltip>
  94. </div>
  95. <div class="item div-click" @click="onClick('线索成交数')">
  96. <p class="title">{{ list.dealqty }}</p>
  97. <span class="content-font-new">{{$t(`线索成交数`)}}</span>
  98. <el-tooltip placement="top">
  99. <div slot="content">{{$t(`线索成交数:转化后有下订单的线索数量`)}}</div>
  100. <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
  101. </el-tooltip>
  102. </div>
  103. <div class="item" >
  104. <p class="title">{{ Math.round(((list.cjl*100)*100)/100) }}%</p>
  105. <span class="content-font-new">{{$t('线索成交率')}}</span>
  106. <el-tooltip placement="top">
  107. <div slot="content">{{$t('线索成交率=转化后有下订单的线索数÷线索总数×100%')}}</div>
  108. <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
  109. </el-tooltip>
  110. </div>
  111. <div class="item div-click" @click="onClick('参与线索数')">
  112. <p class="title">{{ list.joinordercluesize }}</p>
  113. <span class="content-font-new">{{$t(`参与线索数`)}}</span>
  114. <el-tooltip placement="top">
  115. <div slot="content">{{$t(`参与线索数:参与的并且至少有一次跟进的线索数量`)}}</div>
  116. <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
  117. </el-tooltip>
  118. </div>
  119. <div class="item div-click" @click="onClick('参与线索转化数')">
  120. <p class="title">{{ list.joincoverorderclue }}</p>
  121. <span class="content-font-new">{{$t(`参与线索转化数`)}}</span>
  122. <el-tooltip placement="top">
  123. <div slot="content">{{$t(`参与线索转化数:参与的并且至少有一次跟进的有发生转化的线索数量`)}}</div>
  124. <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
  125. </el-tooltip>
  126. </div>
  127. <div class="item">
  128. <p class="title">{{ Math.round(((list.joinordercluezhl*100)*100)/100) }}%</p>
  129. <span class="content-font-new">{{$t(`参与线索转化率`)}}</span>
  130. <el-tooltip placement="top">
  131. <div slot="content">{{$t(`参与线索转化率=参与线索转化数 ÷ 参与线索数 ×100%`)}}</div>
  132. <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
  133. </el-tooltip>
  134. </div>
  135. <div class="item div-click" @click="onClick('参与线索成交数')">
  136. <p class="title">{{ list.joindealorderclue }}</p>
  137. <span class="content-font-new">{{$t(`参与线索成交数`)}}</span>
  138. <el-tooltip placement="top">
  139. <div slot="content">{{$t(`参与线索成交数:参与的并且至少有一次跟进的转化后有下订单的线索数量`)}}</div>
  140. <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
  141. </el-tooltip>
  142. </div>
  143. <div class="item">
  144. <p class="title">{{ Math.round(((list.joinordercluecjl*100)*100)/100) }}%</p>
  145. <span class="content-font-new">{{$t(`参与线索成交率`)}}</span>
  146. <el-tooltip placement="top">
  147. <div slot="content">{{$t(`参与线索成交率=参与线索成交率 ÷ 参与线索数 ×100%`)}}</div>
  148. <img style="vertical-align: middle" width="14px" height="14px" src="../../../assets/icons/prompt_icon.svg" >
  149. </el-tooltip>
  150. </div>
  151. </div>
  152. </div>
  153. <dataDetail ref="detailRef" :title="title" :param="paramDetail" :person="person" :departmentid="depment" :isleave="isleave" :layout="tablecols" height="calc(100vh - 230px)">
  154. <template #custom>
  155. <div class="mt-10 inline-16">
  156. <p class="search__label">{{$t('跟进状态')}}:</p>
  157. <el-select v-model="paramDetail.content.where.status" clearable class="inline-24" size="small" :placeholder="$t('请选择线索状态')" @change="selectChange">
  158. <el-option v-for="item in statusList" :label="$t(item.value)" :key="item.rowindex" :value="item.remarks">
  159. </el-option>
  160. </el-select>
  161. </div>
  162. <div class="mt-10 inline-16">
  163. <p class="search__label">{{$t('领域')}}:</p>
  164. <el-select v-model="paramDetail.content.where.tradefield" clearable style="margin-right:10px" size="small" :placeholder="$t('请选择领域')" @change="selectChange">
  165. <el-option v-for="item in tradefields" :label="$t(item.value)" :key="item.rowindex" :value="item.value">
  166. </el-option>
  167. </el-select>
  168. </div>
  169. <div class="mt-10 inline-16">
  170. <p class="search__label">{{$t('标签')}}:</p>
  171. <el-select v-model="paramDetail.content.where.tag" clearable style="margin-right:10px" size="small" :placeholder="$t('请选择标签')" @change="selectChange" multiple>
  172. <el-option v-for="item in tagData" :label="$t(item.tag)" :key="item.tag" :value="item.tag">
  173. </el-option>
  174. </el-select>
  175. </div>
  176. </template>
  177. </dataDetail>
  178. </div>
  179. </template>
  180. <script>
  181. import dataDetail from '@/template/dataDetail/index'
  182. export default {
  183. name: "digitalSigns",
  184. components:{dataDetail},
  185. props:["person","depment","dateType","isleave","userName"],
  186. data(){
  187. return {
  188. list:[],
  189. title:'',
  190. tablecols:'',
  191. status:'',
  192. statusList:[],
  193. tradefield:'',
  194. tradefields:[],
  195. tagData:[],
  196. tag:'',
  197. paramDetail:{
  198. "id": 20241008125804,
  199. "content": {
  200. "dataid": '',
  201. "type": '',
  202. "username": "",
  203. "typemx": "",
  204. "pageNumber":1,
  205. "pageSize":100,
  206. "dateType":"",
  207. "where": {
  208. "isleave": "",
  209. "condition": "",
  210. "allocationstatus": "",
  211. "tradefield": "",
  212. "status": "",
  213. "tag": []
  214. }
  215. },
  216. },
  217. param:{
  218. "id": 20231014114204,
  219. "content": {
  220. "type": 0,
  221. "dataid": '',
  222. "dateType":'',
  223. "where":{
  224. "isleave":"1"
  225. }
  226. }
  227. }
  228. }
  229. },
  230. methods:{
  231. async listData(val,dateType){
  232. this.param.content.dataid = val
  233. this.param.content.dateType = dateType
  234. const res = await this.$api.requested(this.param)
  235. this.list = res.data
  236. },
  237. selectChange(){
  238. this.paramDetail.content.pageNumber = 1
  239. this.$refs.detailRef.listData()
  240. },
  241. onClick(title){
  242. this.title = this.dateType + '_' + title
  243. this.paramDetail.content.dataid = this.person?this.person == this.userName?JSON.parse(sessionStorage.getItem('active_account')).userid:this.person:this.depment
  244. this.paramDetail.content.type = this.person?'0':'1'
  245. this.paramDetail.content.typemx = title
  246. this.paramDetail.content.where.isleave = this.isleave
  247. this.paramDetail.content.dateType = this.dateType
  248. this.$refs.detailRef.onShow()
  249. },
  250. /*标签列表*/
  251. async tagList(){
  252. const res = await this.$api.requested({
  253. "id":20221013104401,
  254. "content":{
  255. "isExport":1,
  256. "pageNumber":1,
  257. "pageSize":100,
  258. "sys_systemtagid":14,
  259. "where":{
  260. "condition":""
  261. }
  262. }
  263. })
  264. this.tagData = res.data
  265. },
  266. },
  267. async created() {
  268. this.tablecols = this.tool.tabelCol(this.$route.name).clueDetail.tablecols
  269. const res2 = await this.$store.dispatch('optiontypeselect','datafollowuptype')
  270. this.statusList = res2.data
  271. const res3 = await this.$store.dispatch('optiontypeselect','tradefield')
  272. this.tradefields = res3.data
  273. this.tagList()
  274. }
  275. }
  276. </script>
  277. <style scoped>
  278. .div-box-new{
  279. margin-top: 16px;
  280. width: 100%;
  281. /* height: 210px;*/
  282. border-radius: 2px;
  283. border: 1px solid #e9e9e9;
  284. background-color: #ffffff;
  285. box-sizing: border-box;
  286. box-shadow: -1px -1px 5px 0px rgba(0, 0, 0, 0.2);
  287. padding: 16px
  288. }
  289. .div-border-new{
  290. /*margin:0 30px 0 30px;*/
  291. height: 250px
  292. }
  293. .div-border-new .item{
  294. height: 33%;
  295. width: 16.6%;
  296. float: left;
  297. }
  298. .div-border-new .item .title{
  299. font-size: 26px
  300. }
  301. .div-border-new .item .content-font-new{
  302. font-size: 14px;
  303. margin-right: 10px;
  304. color: #000000A6;
  305. }
  306. .div-click:hover{
  307. color: #3874f6 !important;
  308. }
  309. </style>