index.vue 115 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457
  1. <template>
  2. <normalLayout>
  3. <template #refresh>
  4. <div style="margin-right:15px">
  5. <el-button style="font-size:14px !important;color: #999999" type="text" size="small" @click="$refs.scroll.wrap.scrollTop=0">返回顶部</el-button>
  6. </div>
  7. <!-- <i class="el-icon-refresh-right" @click="refresh" v-loading.fullscreen.lock="fullscreenLoading"></i> -->
  8. </template>
  9. <template #content>
  10. <div style="padding: 20rem;">
  11. <el-scrollbar ref="scroll">
  12. <div style="height:calc(100vh);padding:5rem">
  13. <div class="mt-10 inline-16">
  14. <label class="search__label" >部门:</label>
  15. <el-cascader
  16. ref="selectdep"
  17. size="small"
  18. v-model="depment"
  19. :options="deplist"
  20. :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}"
  21. @change="selectDep"
  22. clearable
  23. ></el-cascader>
  24. </div>
  25. <div class="data-all">
  26. <div style="margin-bottom:20px">项目</div>
  27. <div class="data-all-wrapper">
  28. <div class="data-left">
  29. <div class="data-item">
  30. <p>{{ tool.formatAmount(dataAll.totalqty) }}</p>
  31. <p>项目总数</p>
  32. </div>
  33. <div class="data-item">
  34. <p>{{ tool.formatAmount(dataAll.reportProject)}}</p>
  35. <p >
  36. 报备项目数
  37. <el-tooltip class="item" effect="dark" content="报备项目数:统计已报备的项目数量" placement="top">
  38. <img style="vertical-align: middle" src="@/assets/icons/prompt_icon.svg" alt="">
  39. </el-tooltip>
  40. </p>
  41. </div>
  42. <div class="data-item">
  43. <p>{{ tool.formatAmount(dataAll.startproject) }}</p>
  44. <p>
  45. 进行中项目数
  46. <el-tooltip class="item" effect="dark" content="参与项目客户数:参与有下订单的项目的关联客户数" placement="top">
  47. <img style="vertical-align: middle" src="@/assets/icons/prompt_icon.svg" alt="">
  48. </el-tooltip>
  49. </p>
  50. </div>
  51. <div class="data-item">
  52. <p>{{ tool.formatAmount(dataAll.dealProject) }}</p>
  53. <p>
  54. 项目成交数
  55. <el-tooltip class="item" effect="dark" content="项目成交数:统计有关联审核过的订单的项目数量" placement="top">
  56. <img style="vertical-align: middle" src="@/assets/icons/prompt_icon.svg" alt="">
  57. </el-tooltip>
  58. </p>
  59. </div>
  60. <div class="data-item">
  61. <p>{{ dataAll.cjl }}%</p>
  62. <p>
  63. 项目成交率
  64. <el-tooltip class="item" effect="dark" content="项目成交率=有关联审核订单的项目数÷项目总数×100%" placement="top">
  65. <img style="vertical-align: middle" src="@/assets/icons/prompt_icon.svg" alt="">
  66. </el-tooltip>
  67. </p>
  68. </div>
  69. </div>
  70. <div class="data-right">
  71. <div class="data-item" v-for="item in dataAll.projecttype" :key="item.rowindex">
  72. <p>{{ tool.formatAmount(item.qty) }}</p>
  73. <p>
  74. {{ item.value }}
  75. <el-tooltip class="item" effect="dark" content="无分类客户数:统计没有客户分类信息的客户数量" placement="top" v-if="item.value == '无分类客户'">
  76. <img style="vertical-align: middle" src="@/assets/icons/prompt_icon.svg" alt="">
  77. </el-tooltip>
  78. <el-tooltip class="item" effect="dark" content="A核心客户:客户分类为A核心客户的数量" placement="top" v-else-if="item.value == 'A核心客户'">
  79. <img style="vertical-align: middle" src="@/assets/icons/prompt_icon.svg" alt="">
  80. </el-tooltip>
  81. <el-tooltip class="item" effect="dark" content="B重要客户:客户分类为B重要客户的数量" placement="top" v-else-if="item.value == 'B重要客户'">
  82. <img style="vertical-align: middle" src="@/assets/icons/prompt_icon.svg" alt="">
  83. </el-tooltip>
  84. <el-tooltip class="item" effect="dark" content="C普通客户:客户分类为C普通客户的数量" placement="top" v-else-if="item.value == 'C普通客户'">
  85. <img style="vertical-align: middle" src="@/assets/icons/prompt_icon.svg" alt="">
  86. </el-tooltip>
  87. <el-tooltip class="item" effect="dark" content="D一般客户:客户分类为D一般客户的数量" placement="top" v-else-if="item.value == 'D一般客户'">
  88. <img style="vertical-align: middle" src="@/assets/icons/prompt_icon.svg" alt="">
  89. </el-tooltip>
  90. </p>
  91. </div>
  92. </div>
  93. </div>
  94. </div>
  95. <!--项目类型-->
  96. <div class="data-panel">
  97. <div class="panel-header">
  98. <div class="title">项目类型分析</div>
  99. <div class="panel-select">
  100. <div class="mt-10 inline-16">
  101. <label class="search__label" >部门:</label>
  102. <el-cascader
  103. ref="selectdep"
  104. size="small"
  105. v-model="typeTableParam.content.dataid"
  106. :options="deplist"
  107. :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}"
  108. @change="$event => {if($event.length) {typeMapParam.content.type=1;typeMapParam.content.dataid=$event[$event.length - 1];typeTableParam.content.type=1;typeTableParam.content.username='';$refs.typeTable.listData();typeInit()} else {typeMapParam.content.type='';typeMapParam.content.dataid='';typeTableParam.content.dataid='';typeTableParam.content.type='';typeTableParam.content.username='';$refs.typeTable.listData();typeInit()}}"></el-cascader>
  109. </div>
  110. <div class="mt-10 inline-16">
  111. <label class="search__label" >业务员:</label>
  112. <el-select v-model="typeTableParam.content.username" filterable placeholder="请选择" size="small"
  113. @change="$event => {if($event) {typeMapParam.content.type=0;typeMapParam.content.dataid=$event;typeTableParam.content.type=0;typeTableParam.content.dataid=$event;typeTableParam.content.depname='';$refs.typeTable.listData();typeInit()} else {typeMapParam.content.type='';typeMapParam.content.dataid='';typeTableParam.content.dataid='';typeTableParam.content.type='';typeTableParam.content.depname='';$refs.typeTable.listData();typeInit()}}"
  114. >
  115. <el-option
  116. v-for="item in personnelList"
  117. :key="item.index"
  118. :label="item.name"
  119. :value="item.userid">
  120. </el-option>
  121. </el-select>
  122. </div>
  123. <!-- <div class="mt-10 inline-16" style="margin-left:10px">
  124. <FullScroll domId="projectType"></FullScroll>
  125. </div> -->
  126. </div>
  127. </div>
  128. <div class="panel-content" id="projectType">
  129. <div ref="typeEl" style="width:30%"></div>
  130. <div class="panel-table" style="width:70%">
  131. <pageTable
  132. ref="typeTable"
  133. :tablecols="tool.tabelCol($route.name).projectTable.tablecols"
  134. :param="typeTableParam"
  135. :custom="true"
  136. fixedName="operation"
  137. >
  138. <template v-slot:custom="scope">
  139. <div v-if="scope.data.columnname == 'sys_tag'">
  140. <el-tag size="small" v-for="(item,index) in scope.data.data.sys_tag" :key="index">{{ item }}</el-tag>
  141. </div>
  142. <div v-else-if="scope.data.columnname == 'operation'">
  143. <el-button type="text" size="small" @click="goDetail(scope.data.data)">详情</el-button>
  144. </div>
  145. <div v-else-if="scope.data.columnname == 'signamount_due'">
  146. {{ tool.formatAmount(scope.data.data.signamount_due,2,'¥') }}
  147. </div>
  148. <div v-else-if="scope.data.columnname === 'industry'">
  149. <el-tag size="small" v-for="(item,index) in scope.data.data.industry" :key="index">{{ item }}</el-tag>
  150. </div>
  151. <div v-else-if="scope.data.columnname === 'tradingstatus'">
  152. <span style="color:#3874f6" v-if="scope.data.data[[scope.data.columnname]] == '未成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  153. <span style="color:#fa8c16" v-else-if="scope.data.data[[scope.data.columnname]] == '已成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  154. <span style="color:#333333" v-else-if="scope.data.data[[scope.data.columnname]] == '多次成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  155. </div>
  156. <div v-else-if="scope.data.columnname === 'status'">
  157. <span style="color:rgb(250, 140, 22)" v-if="scope.data.data[[scope.data.columnname]] == '已成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  158. <span style="color:#52c41a" v-else-if="scope.data.data[[scope.data.columnname]] == '跟进中'">{{scope.data.data[[scope.data.columnname]]}}</span>
  159. <span style="color:#999999" v-else-if="scope.data.data[[scope.data.columnname]] == '已失败' || scope.data.data[[scope.data.columnname]] == '已结案'">{{scope.data.data[[scope.data.columnname]]}}</span>
  160. </div>
  161. <div v-else-if="scope.data.columnname == 'scale'">
  162. {{scope.data.data.scale ? scope.data.data.scale + scope.data.data.unitname : '' }}
  163. </div>
  164. <div v-else>
  165. {{ scope.data.data[scope.data.columnname] }}
  166. </div>
  167. </template>
  168. </pageTable>
  169. </div>
  170. </div>
  171. </div>
  172. <!--项目等级分析-->
  173. <div class="data-panel">
  174. <div class="panel-header">
  175. <div class="title">项目等级分析</div>
  176. <div class="panel-select">
  177. <div class="mt-10 inline-16">
  178. <label class="search__label" >部门:</label>
  179. <el-cascader
  180. ref="selectdep"
  181. size="small"
  182. v-model="gradTableParam.content.dataid"
  183. :options="deplist"
  184. :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}"
  185. @change="$event => {if($event.length) {gradMapParam.content.type=1;gradMapParam.content.dataid=$event[$event.length - 1];gradTableParam.content.type=1;gradTableParam.content.username='';$refs.gradTable.listData();gradInit()} else {gradMapParam.content.type='';gradMapParam.content.dataid='';gradTableParam.content.dataid='';gradTableParam.content.type='';gradTableParam.content.username='';$refs.gradTable.listData();gradInit()}}"></el-cascader>
  186. </div>
  187. <div class="mt-10 inline-16">
  188. <label class="search__label" >业务员:</label>
  189. <el-select v-model="gradTableParam.content.username" filterable placeholder="请选择" size="small"
  190. @change="$event => {if($event) {gradMapParam.content.type=0;gradMapParam.content.dataid=$event;gradTableParam.content.type=0;gradTableParam.content.dataid=$event;gradTableParam.content.depname='';$refs.gradTable.listData();gradInit()} else {gradMapParam.content.type='';gradMapParam.content.dataid='';gradTableParam.content.dataid='';gradTableParam.content.type='';gradTableParam.content.depname='';$refs.gradTable.listData();gradInit()}}"
  191. >
  192. <el-option
  193. v-for="item in personnelList"
  194. :key="item.index"
  195. :label="item.name"
  196. :value="item.userid">
  197. </el-option>
  198. </el-select>
  199. </div>
  200. </div>
  201. </div>
  202. <div class="panel-content">
  203. <div ref="gradEl" style="width:30%"></div>
  204. <div class="panel-table" style="width:70%">
  205. <pageTable
  206. ref="gradTable"
  207. :tablecols="tool.tabelCol($route.name).projectTable.tablecols"
  208. :param="gradTableParam"
  209. :custom="true"
  210. fixedName="operation"
  211. >
  212. <template v-slot:custom="scope">
  213. <div v-if="scope.data.columnname == 'sys_tag'">
  214. <el-tag size="small" v-for="(item,index) in scope.data.data.sys_tag" :key="index">{{ item }}</el-tag>
  215. </div>
  216. <div v-else-if="scope.data.columnname == 'operation'">
  217. <el-button type="text" size="small" @click="goDetail(scope.data.data)">详情</el-button>
  218. </div>
  219. <div v-else-if="scope.data.columnname == 'signamount_due'">
  220. {{ tool.formatAmount(scope.data.data.signamount_due,2,'¥') }}
  221. </div>
  222. <div v-else-if="scope.data.columnname === 'industry'">
  223. <el-tag size="small" v-for="(item,index) in scope.data.data.industry" :key="index">{{ item }}</el-tag>
  224. </div>
  225. <div v-else-if="scope.data.columnname === 'tradingstatus'">
  226. <span style="color:#3874f6" v-if="scope.data.data[[scope.data.columnname]] == '未成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  227. <span style="color:#fa8c16" v-else-if="scope.data.data[[scope.data.columnname]] == '已成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  228. <span style="color:#333333" v-else-if="scope.data.data[[scope.data.columnname]] == '多次成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  229. </div>
  230. <div v-else-if="scope.data.columnname === 'status'">
  231. <span style="color:rgb(250, 140, 22)" v-if="scope.data.data[[scope.data.columnname]] == '已成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  232. <span style="color:#52c41a" v-else-if="scope.data.data[[scope.data.columnname]] == '跟进中'">{{scope.data.data[[scope.data.columnname]]}}</span>
  233. <span style="color:#999999" v-else-if="scope.data.data[[scope.data.columnname]] == '已失败' || scope.data.data[[scope.data.columnname]] == '已结案'">{{scope.data.data[[scope.data.columnname]]}}</span>
  234. </div>
  235. <div v-else-if="scope.data.columnname == 'scale'">
  236. {{scope.data.data.scale ? scope.data.data.scale + scope.data.data.unitname : '' }}
  237. </div>
  238. <div v-else>
  239. {{ scope.data.data[scope.data.columnname] }}
  240. </div>
  241. </template>
  242. </pageTable>
  243. </div>
  244. </div>
  245. </div>
  246. <!--项目评估分析-->
  247. <div class="data-panel">
  248. <div class="panel-header">
  249. <div class="title">项目评估分析</div>
  250. <div class="panel-select">
  251. <div class="mt-10 inline-16">
  252. <label class="search__label" >部门:</label>
  253. <el-cascader
  254. ref="selectdep"
  255. size="small"
  256. v-model="scoreTableParam1.content.dataid"
  257. :options="deplist"
  258. :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}"
  259. @change="$event => {if($event.length) {scoreMapParam1.content.type=1;scoreMapParam1.content.dataid=$event[$event.length - 1];scoreTableParam1.content.type=1;scoreTableParam1.content.username='';$refs.scoreTable.listData();scoreInit()} else {scoreMapParam1.content.type='';scoreMapParam1.content.dataid='';scoreTableParam1.content.dataid='';scoreTableParam1.content.type='';scoreTableParam1.content.username='';$refs.scoreTable.listData();scoreInit()}}"></el-cascader>
  260. </div>
  261. <div class="mt-10 inline-16">
  262. <label class="search__label" >业务员:</label>
  263. <el-select v-model="scoreTableParam1.content.username" filterable placeholder="请选择" size="small"
  264. @change="$event => {if($event) {scoreMapParam1.content.type=0;scoreMapParam1.content.dataid=$event;scoreTableParam1.content.type=0;scoreTableParam1.content.dataid=$event;scoreTableParam1.content.depname='';$refs.scoreTable.listData();scoreInit()} else {scoreMapParam1.content.type='';gradMapParam.content.dataid='';scoreTableParam1.content.dataid='';scoreTableParam1.content.type='';scoreTableParam1.content.depname='';$refs.scoreTable.listData();scoreInit()}}"
  265. >
  266. <el-option
  267. v-for="item in personnelList"
  268. :key="item.index"
  269. :label="item.name"
  270. :value="item.userid">
  271. </el-option>
  272. </el-select>
  273. </div>
  274. </div>
  275. </div>
  276. <div>
  277. <div ref="scoreEl" style="max-height:400px;min-height:100px"></div>
  278. <div class="panel-table">
  279. <div class="mt-10 inline-16" style="margin-top:10px;display:flex !important;justify-content:space-between">
  280. <span style="font-size:16px;color:#333333">{{ scoreStatus ? scoreStatus : '全部' }}</span>
  281. <div style="display:flex;align-items:center">
  282. <div>
  283. <label class="search__label" >评估分档位:</label>
  284. <el-select v-model="scoreTableParam1.content.where.taskType" filterable placeholder="请选择" size="small"
  285. @change="$refs.scoreTable.listData()"
  286. >
  287. <el-option label="全部" value="" />
  288. <el-option label="高分档" value="高分档" />
  289. <el-option label="中分档" value="中分档" />
  290. <el-option label="低分档" value="低分档" />
  291. </el-select>
  292. </div>
  293. <el-tooltip class="item" effect="dark" placement="top">
  294. <template #content>
  295. <div>高分档: 200分以上</div>
  296. <div>中分档:100-200分</div>
  297. <div>低分档:100分以下</div>
  298. </template>
  299. <img style="vertical-align: middle;margin-left:10px" src="@/assets/icons/prompt_icon.svg" alt="">
  300. </el-tooltip>
  301. </div>
  302. </div>
  303. <pageTable
  304. ref="scoreTable"
  305. :tablecols="tool.tabelCol($route.name).projectTable2.tablecols.splice(0,tool.tabelCol($route.name).projectTable2.tablecols.length - 1)"
  306. :param="scoreTableParam1"
  307. :custom="true"
  308. fixedName="operation"
  309. >
  310. <template v-slot:custom="scope">
  311. <div v-if="scope.data.columnname == 'sys_tag'">
  312. <el-tag size="small" v-for="(item,index) in scope.data.data.sys_tag" :key="index">{{ item }}</el-tag>
  313. </div>
  314. <div v-else-if="scope.data.columnname == 'operation'">
  315. <el-button type="text" size="small" @click="goDetail(scope.data.data)">详情</el-button>
  316. </div>
  317. <div v-else-if="scope.data.columnname == 'signamount_due'">
  318. {{ tool.formatAmount(scope.data.data.signamount_due,2,'¥') }}
  319. </div>
  320. <div v-else-if="scope.data.columnname == 'dealamount'">
  321. {{ tool.formatAmount(scope.data.data.dealamount,2,'¥') }}
  322. </div>
  323. <div v-else-if="scope.data.columnname === 'industry'">
  324. <el-tag size="small" v-for="(item,index) in scope.data.data.industry" :key="index">{{ item }}</el-tag>
  325. </div>
  326. <div v-else-if="scope.data.columnname === 'tradingstatus'">
  327. <span style="color:#3874f6" v-if="scope.data.data[[scope.data.columnname]] == '未成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  328. <span style="color:#fa8c16" v-else-if="scope.data.data[[scope.data.columnname]] == '已成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  329. <span style="color:#333333" v-else-if="scope.data.data[[scope.data.columnname]] == '多次成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  330. </div>
  331. <div v-else-if="scope.data.columnname === 'status'">
  332. <span style="color:rgb(250, 140, 22)" v-if="scope.data.data[[scope.data.columnname]] == '已成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  333. <span style="color:#52c41a" v-else-if="scope.data.data[[scope.data.columnname]] == '跟进中'">{{scope.data.data[[scope.data.columnname]]}}</span>
  334. <span style="color:#999999" v-else-if="scope.data.data[[scope.data.columnname]] == '已失败' || scope.data.data[[scope.data.columnname]] == '已结案'">{{scope.data.data[[scope.data.columnname]]}}</span>
  335. </div>
  336. <div v-else-if="scope.data.columnname == 'scale'">
  337. {{scope.data.data.scale ? scope.data.data.scale + scope.data.data.unitname : '' }}
  338. </div>
  339. <div v-else>
  340. {{ scope.data.data[scope.data.columnname] }}
  341. </div>
  342. </template>
  343. </pageTable>
  344. </div>
  345. </div>
  346. </div>
  347. <!--12月项目新增-->
  348. <div class="data-panel">
  349. <div class="panel-header">
  350. <div class="title">近12月项目新增分析</div>
  351. <div class="panel-select">
  352. <div class="mt-10 inline-16">
  353. <label class="search__label" >部门:</label>
  354. <el-cascader
  355. ref="selectdep"
  356. size="small"
  357. v-model="addParam.content.dataid"
  358. :options="deplist"
  359. :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}"
  360. @change="$event => {if($event.length) {addParam.content.type=1;addParam.content.username='';addFun()} else {addParam.content.dataid='';addParam.content.type='';addParam.content.username='';addFun()}}"></el-cascader>
  361. </div>
  362. <div class="mt-10 inline-16">
  363. <label class="search__label" >业务员:</label>
  364. <el-select v-model="addParam.content.username" filterable placeholder="请选择" size="small"
  365. @change="$event => {if($event) {addParam.content.type=0;addParam.content.dataid=$event;addParam.content.depname='';addFun()} else {addParam.content.dataid='';addParam.content.type='';addParam.content.depname='';addFun()}}"
  366. >
  367. <el-option
  368. v-for="item in personnelList"
  369. :key="item.index"
  370. :label="item.name"
  371. :value="item.userid">
  372. </el-option>
  373. </el-select>
  374. </div>
  375. <div class="mt-10 inline-16">
  376. <label class="search__label" >分析日期:</label>
  377. <el-date-picker
  378. v-model="addParam.content.enddate"
  379. format="yyyy-MM-dd"
  380. value-format="yyyy-MM-dd"
  381. type="date"
  382. size="small"
  383. placeholder="选择日期"
  384. @change="addFun()">
  385. </el-date-picker>
  386. </div>
  387. </div>
  388. </div>
  389. <div ref="addEl" style="height:400px"></div>
  390. </div>
  391. <!--12月项目报备-->
  392. <div class="data-panel">
  393. <div class="panel-header">
  394. <div class="title">近12月项目报备分析</div>
  395. <div class="panel-select">
  396. <div class="mt-10 inline-16">
  397. <label class="search__label" >部门:</label>
  398. <el-cascader
  399. ref="selectdep"
  400. size="small"
  401. v-model="baobeiParam.content.dataid"
  402. :options="deplist"
  403. :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}"
  404. @change="$event => {if($event.length) {baobeiParam.content.type=1;baobeiParam.content.username='';baobeiFun()} else {baobeiParam.content.dataid='';baobeiParam.content.type='';baobeiParam.content.username='';baobeiFun()}}"></el-cascader>
  405. </div>
  406. <div class="mt-10 inline-16">
  407. <label class="search__label" >业务员:</label>
  408. <el-select v-model="baobeiParam.content.username" filterable placeholder="请选择" size="small"
  409. @change="$event => {if($event) {baobeiParam.content.type=0;baobeiParam.content.dataid=$event;baobeiParam.content.depname='';baobeiFun()} else {baobeiParam.content.dataid='';baobeiParam.content.type='';baobeiParam.content.depname='';baobeiFun()}}"
  410. >
  411. <el-option
  412. v-for="item in personnelList"
  413. :key="item.index"
  414. :label="item.name"
  415. :value="item.userid">
  416. </el-option>
  417. </el-select>
  418. </div>
  419. <div class="mt-10 inline-16">
  420. <label class="search__label" >分析日期:</label>
  421. <el-date-picker
  422. v-model="baobeiParam.content.enddate"
  423. format="yyyy-MM-dd"
  424. value-format="yyyy-MM-dd"
  425. type="date"
  426. size="small"
  427. placeholder="选择日期"
  428. @change="baobeiFun()">
  429. </el-date-picker>
  430. </div>
  431. </div>
  432. </div>
  433. <div ref="baobeiEl" style="height:400px"></div>
  434. </div>
  435. <!--12月项目报价-->
  436. <div class="data-panel">
  437. <div class="panel-header">
  438. <div class="title">近12月项目报价分析</div>
  439. <div class="panel-select">
  440. <div class="mt-10 inline-16">
  441. <label class="search__label" >部门:</label>
  442. <el-cascader
  443. ref="selectdep"
  444. size="small"
  445. v-model="baojiaParam.content.dataid"
  446. :options="deplist"
  447. :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}"
  448. @change="$event => {if($event.length) {baojiaParam.content.type=1;baojiaParam.content.username='';baojiaFun()} else {baojiaParam.content.dataid='';baojiaParam.content.type='';baojiaParam.content.username='';baojiaFun()}}"></el-cascader>
  449. </div>
  450. <div class="mt-10 inline-16">
  451. <label class="search__label" >业务员:</label>
  452. <el-select v-model="baojiaParam.content.username" filterable placeholder="请选择" size="small"
  453. @change="$event => {if($event) {baojiaParam.content.type=0;baojiaParam.content.dataid=$event;baojiaParam.content.depname='';baojiaFun()} else {baojiaParam.content.dataid='';baojiaParam.content.type='';baojiaParam.content.depname='';baojiaFun()}}"
  454. >
  455. <el-option
  456. v-for="item in personnelList"
  457. :key="item.index"
  458. :label="item.name"
  459. :value="item.userid">
  460. </el-option>
  461. </el-select>
  462. </div>
  463. <div class="mt-10 inline-16">
  464. <label class="search__label" >分析日期:</label>
  465. <el-date-picker
  466. v-model="baojiaParam.content.enddate"
  467. format="yyyy-MM-dd"
  468. value-format="yyyy-MM-dd"
  469. type="date"
  470. size="small"
  471. placeholder="选择日期"
  472. @change="baojiaFun()">
  473. </el-date-picker>
  474. </div>
  475. </div>
  476. </div>
  477. <div ref="baojiaEl" style="height:400px"></div>
  478. </div>
  479. <!--12月项目跟进-->
  480. <div class="data-panel">
  481. <div class="panel-header">
  482. <div class="title">近12月项目跟进分析</div>
  483. <div class="panel-select">
  484. <div class="mt-10 inline-16">
  485. <label class="search__label" >部门:</label>
  486. <el-cascader
  487. ref="selectdep"
  488. size="small"
  489. v-model="fllowParam.content.dataid"
  490. :options="deplist"
  491. :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}"
  492. @change="$event => {if($event.length) {fllowParam.content.type=1;fllowParam.content.username='';fllowFun()} else {fllowParam.content.dataid='';fllowParam.content.type='';fllowParam.content.username='';fllowFun()}}"></el-cascader>
  493. </div>
  494. <div class="mt-10 inline-16">
  495. <label class="search__label" >业务员:</label>
  496. <el-select v-model="fllowParam.content.username" filterable placeholder="请选择" size="small"
  497. @change="$event => {if($event) {fllowParam.content.type=0;fllowParam.content.dataid=$event;fllowParam.content.depname='';fllowFun()} else {fllowParam.content.dataid='';fllowParam.content.type='';fllowParam.content.depname='';fllowFun()}}"
  498. >
  499. <el-option
  500. v-for="item in personnelList"
  501. :key="item.index"
  502. :label="item.name"
  503. :value="item.userid">
  504. </el-option>
  505. </el-select>
  506. </div>
  507. <div class="mt-10 inline-16">
  508. <label class="search__label" >分析日期:</label>
  509. <el-date-picker
  510. v-model="fllowParam.content.enddate"
  511. format="yyyy-MM-dd"
  512. value-format="yyyy-MM-dd"
  513. type="date"
  514. size="small"
  515. placeholder="选择日期"
  516. @change="fllowFun()">
  517. </el-date-picker>
  518. </div>
  519. </div>
  520. </div>
  521. <div ref="fllowEl" style="height:400px"></div>
  522. </div>
  523. <!--项目跟进情况-->
  524. <div class="data-panel">
  525. <div class="panel-header">
  526. <div class="title">项目跟进情况统计</div>
  527. <div class="panel-select">
  528. <div class="mt-10 inline-16">
  529. <label class="search__label" >部门:</label>
  530. <el-cascader
  531. ref="selectdep"
  532. size="small"
  533. v-model="fllowTableParam.content.dataid"
  534. :options="deplist"
  535. :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}"
  536. @change="$event => {if($event.length) {fllowMapParam.content.type=1;fllowMapParam.content.dataid=$event[$event.length - 1];fllowTableParam.content.type=1;fllowTableParam.content.username='';$refs.projectFllowTable.listData();fllowInit()} else {fllowMapParam.content.type='';fllowMapParam.content.dataid='';fllowTableParam.content.dataid='';fllowTableParam.content.type='';fllowTableParam.content.username='';$refs.projectFllowTable.listData();fllowInit()}}"></el-cascader>
  537. </div>
  538. <div class="mt-10 inline-16">
  539. <label class="search__label" >业务员:</label>
  540. <el-select v-model="fllowTableParam.content.username" filterable placeholder="请选择" size="small"
  541. @change="$event => {if($event) {fllowMapParam.content.type=0;fllowMapParam.content.dataid=$event;fllowTableParam.content.type=0;fllowTableParam.content.dataid=$event;fllowTableParam.content.depname='';$refs.projectFllowTable.listData();fllowInit()} else {fllowMapParam.content.type='';fllowMapParam.content.dataid='';fllowTableParam.content.dataid='';fllowTableParam.content.type='';fllowTableParam.content.depname='';$refs.projectFllowTable.listData();fllowInit()}}"
  542. >
  543. <el-option
  544. v-for="item in personnelList"
  545. :key="item.index"
  546. :label="item.name"
  547. :value="item.userid">
  548. </el-option>
  549. </el-select>
  550. </div>
  551. </div>
  552. </div>
  553. <div class="panel-content">
  554. <div ref="projectFllowEl" style="width:30%"></div>
  555. <div class="panel-table" style="width:70%">
  556. <pageTable
  557. ref="projectFllowTable"
  558. :tablecols="tool.tabelCol($route.name).projectTable.tablecols"
  559. :param="fllowTableParam"
  560. :custom="true"
  561. fixedName="operation"
  562. >
  563. <template v-slot:custom="scope">
  564. <div v-if="scope.data.columnname == 'sys_tag'">
  565. <el-tag size="small" v-for="(item,index) in scope.data.data.sys_tag" :key="index">{{ item }}</el-tag>
  566. </div>
  567. <div v-else-if="scope.data.columnname == 'operation'">
  568. <el-button type="text" size="small" @click="goDetail(scope.data.data)">详情</el-button>
  569. </div>
  570. <div v-else-if="scope.data.columnname == 'signamount_due'">
  571. {{ tool.formatAmount(scope.data.data.signamount_due,2,'¥') }}
  572. </div>
  573. <div v-else-if="scope.data.columnname === 'industry'">
  574. <el-tag size="small" v-for="(item,index) in scope.data.data.industry" :key="index">{{ item }}</el-tag>
  575. </div>
  576. <div v-else-if="scope.data.columnname === 'tradingstatus'">
  577. <span style="color:#3874f6" v-if="scope.data.data[[scope.data.columnname]] == '未成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  578. <span style="color:#fa8c16" v-else-if="scope.data.data[[scope.data.columnname]] == '已成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  579. <span style="color:#333333" v-else-if="scope.data.data[[scope.data.columnname]] == '多次成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  580. </div>
  581. <div v-else-if="scope.data.columnname === 'status'">
  582. <span style="color:rgb(250, 140, 22)" v-if="scope.data.data[[scope.data.columnname]] == '已成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  583. <span style="color:#52c41a" v-else-if="scope.data.data[[scope.data.columnname]] == '跟进中'">{{scope.data.data[[scope.data.columnname]]}}</span>
  584. <span style="color:#999999" v-else-if="scope.data.data[[scope.data.columnname]] == '已失败' || scope.data.data[[scope.data.columnname]] == '已结案'">{{scope.data.data[[scope.data.columnname]]}}</span>
  585. </div>
  586. <div v-else-if="scope.data.columnname == 'scale'">
  587. {{scope.data.data.scale ? scope.data.data.scale + scope.data.data.unitname : '' }}
  588. </div>
  589. <div v-else>
  590. {{ scope.data.data[scope.data.columnname] }}
  591. </div>
  592. </template>
  593. </pageTable>
  594. </div>
  595. </div>
  596. </div>
  597. <!--项目联系人情况-->
  598. <div class="data-panel">
  599. <div class="panel-header">
  600. <div class="title">项目联系人情况统计</div>
  601. <div class="panel-select">
  602. <div class="mt-10 inline-16">
  603. <label class="search__label" >部门:</label>
  604. <el-cascader
  605. ref="selectdep"
  606. size="small"
  607. v-model="contactTableParam.content.dataid"
  608. :options="deplist"
  609. :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}"
  610. @change="$event => {if($event.length) {contactMapParam.content.type=1;contactMapParam.content.dataid=$event[$event.length - 1];contactTableParam.content.type=1;contactTableParam.content.username='';$refs.projectContactTable.listData();contactInit()} else {contactMapParam.content.type='';contactMapParam.content.dataid='';contactTableParam.content.dataid='';contactTableParam.content.type='';contactTableParam.content.username='';$refs.projectContactTable.listData();contactInit()}}"></el-cascader>
  611. </div>
  612. <div class="mt-10 inline-16">
  613. <label class="search__label" >业务员:</label>
  614. <el-select v-model="contactTableParam.content.username" filterable placeholder="请选择" size="small"
  615. @change="$event => {if($event) {contactMapParam.content.type=0;contactMapParam.content.dataid=$event;contactTableParam.content.type=0;contactTableParam.content.dataid=$event;contactTableParam.content.depname='';$refs.projectContactTable.listData();contactInit()} else {contactMapParam.content.type='';contactMapParam.content.dataid='';contactTableParam.content.dataid='';contactTableParam.content.type='';contactTableParam.content.depname='';$refs.projectContactTable.listData();contactInit()}}"
  616. >
  617. <el-option
  618. v-for="item in personnelList"
  619. :key="item.index"
  620. :label="item.name"
  621. :value="item.userid">
  622. </el-option>
  623. </el-select>
  624. </div>
  625. </div>
  626. </div>
  627. <div class="panel-content">
  628. <div ref="projectContactEl" style="width:30%"></div>
  629. <div class="panel-table" style="width:70%">
  630. <pageTable
  631. ref="projectContactTable"
  632. :tablecols="tool.tabelCol($route.name).projectTable.tablecols"
  633. :param="contactTableParam"
  634. :custom="true"
  635. fixedName="operation"
  636. >
  637. <template v-slot:custom="scope">
  638. <div v-if="scope.data.columnname == 'sys_tag'">
  639. <el-tag size="small" v-for="(item,index) in scope.data.data.sys_tag" :key="index">{{ item }}</el-tag>
  640. </div>
  641. <div v-else-if="scope.data.columnname == 'operation'">
  642. <el-button type="text" size="small" @click="goDetail(scope.data.data)">详情</el-button>
  643. </div>
  644. <div v-else-if="scope.data.columnname == 'signamount_due'">
  645. {{ tool.formatAmount(scope.data.data.signamount_due,2,'¥') }}
  646. </div>
  647. <div v-else-if="scope.data.columnname === 'industry'">
  648. <el-tag size="small" v-for="(item,index) in scope.data.data.industry" :key="index">{{ item }}</el-tag>
  649. </div>
  650. <div v-else-if="scope.data.columnname === 'tradingstatus'">
  651. <span style="color:#3874f6" v-if="scope.data.data[[scope.data.columnname]] == '未成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  652. <span style="color:#fa8c16" v-else-if="scope.data.data[[scope.data.columnname]] == '已成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  653. <span style="color:#333333" v-else-if="scope.data.data[[scope.data.columnname]] == '多次成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  654. </div>
  655. <div v-else-if="scope.data.columnname === 'status'">
  656. <span style="color:rgb(250, 140, 22)" v-if="scope.data.data[[scope.data.columnname]] == '已成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  657. <span style="color:#52c41a" v-else-if="scope.data.data[[scope.data.columnname]] == '跟进中'">{{scope.data.data[[scope.data.columnname]]}}</span>
  658. <span style="color:#999999" v-else-if="scope.data.data[[scope.data.columnname]] == '已失败' || scope.data.data[[scope.data.columnname]] == '已结案'">{{scope.data.data[[scope.data.columnname]]}}</span>
  659. </div>
  660. <div v-else-if="scope.data.columnname == 'scale'">
  661. {{scope.data.data.scale ? scope.data.data.scale + scope.data.data.unitname : '' }}
  662. </div>
  663. <div v-else>
  664. {{ scope.data.data[scope.data.columnname] }}
  665. </div>
  666. </template>
  667. </pageTable>
  668. </div>
  669. </div>
  670. </div>
  671. <!--项目关联客户情况-->
  672. <div class="data-panel">
  673. <div class="panel-header">
  674. <div class="title">项目关联客户情况统计</div>
  675. <div class="panel-select">
  676. <div class="mt-10 inline-16">
  677. <label class="search__label" >部门:</label>
  678. <el-cascader
  679. ref="selectdep"
  680. size="small"
  681. v-model="customerTableParam.content.dataid"
  682. :options="deplist"
  683. :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}"
  684. @change="$event => {if($event.length) {customerMapParam.content.type=1;customerMapParam.content.dataid=$event[$event.length - 1];customerTableParam.content.type=1;customerTableParam.content.username='';$refs.projectCustomerTable.listData();customerInit()} else {customerMapParam.content.type='';customerMapParam.content.dataid='';customerTableParam.content.dataid='';customerTableParam.content.type='';customerTableParam.content.username='';$refs.projectCustomerTable.listData();customerInit()}}"></el-cascader>
  685. </div>
  686. <div class="mt-10 inline-16">
  687. <label class="search__label" >业务员:</label>
  688. <el-select v-model="customerTableParam.content.username" filterable placeholder="请选择" size="small"
  689. @change="$event => {if($event) {customerMapParam.content.type=0;customerMapParam.content.dataid=$event;customerTableParam.content.type=0;customerTableParam.content.dataid=$event;customerTableParam.content.depname='';$refs.projectCustomerTable.listData();customerInit()} else {customerMapParam.content.type='';customerMapParam.content.dataid='';customerTableParam.content.dataid='';customerTableParam.content.type='';customerTableParam.content.depname='';$refs.projectCustomerTable.listData();customerInit()}}"
  690. >
  691. <el-option
  692. v-for="item in personnelList"
  693. :key="item.index"
  694. :label="item.name"
  695. :value="item.userid">
  696. </el-option>
  697. </el-select>
  698. </div>
  699. </div>
  700. </div>
  701. <div class="panel-content">
  702. <div ref="projectCustomerEl" style="width:30%"></div>
  703. <div class="panel-table" style="width:70%">
  704. <pageTable
  705. ref="projectCustomerTable"
  706. :tablecols="tool.tabelCol($route.name).projectTable.tablecols"
  707. :param="customerTableParam"
  708. :custom="true"
  709. fixedName="operation"
  710. >
  711. <template v-slot:custom="scope">
  712. <div v-if="scope.data.columnname == 'sys_tag'">
  713. <el-tag size="small" v-for="(item,index) in scope.data.data.sys_tag" :key="index">{{ item }}</el-tag>
  714. </div>
  715. <div v-else-if="scope.data.columnname == 'operation'">
  716. <el-button type="text" size="small" @click="goDetail(scope.data.data)">详情</el-button>
  717. </div>
  718. <div v-else-if="scope.data.columnname == 'signamount_due'">
  719. {{ tool.formatAmount(scope.data.data.signamount_due,2,'¥') }}
  720. </div>
  721. <div v-else-if="scope.data.columnname === 'industry'">
  722. <el-tag size="small" v-for="(item,index) in scope.data.data.industry" :key="index">{{ item }}</el-tag>
  723. </div>
  724. <div v-else-if="scope.data.columnname === 'tradingstatus'">
  725. <span style="color:#3874f6" v-if="scope.data.data[[scope.data.columnname]] == '未成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  726. <span style="color:#fa8c16" v-else-if="scope.data.data[[scope.data.columnname]] == '已成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  727. <span style="color:#333333" v-else-if="scope.data.data[[scope.data.columnname]] == '多次成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  728. </div>
  729. <div v-else-if="scope.data.columnname === 'status'">
  730. <span style="color:rgb(250, 140, 22)" v-if="scope.data.data[[scope.data.columnname]] == '已成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  731. <span style="color:#52c41a" v-else-if="scope.data.data[[scope.data.columnname]] == '跟进中'">{{scope.data.data[[scope.data.columnname]]}}</span>
  732. <span style="color:#999999" v-else-if="scope.data.data[[scope.data.columnname]] == '已失败' || scope.data.data[[scope.data.columnname]] == '已结案'">{{scope.data.data[[scope.data.columnname]]}}</span>
  733. </div>
  734. <div v-else-if="scope.data.columnname == 'scale'">
  735. {{scope.data.data.scale ? scope.data.data.scale + scope.data.data.unitname : '' }}
  736. </div>
  737. <div v-else>
  738. {{ scope.data.data[scope.data.columnname] }}
  739. </div>
  740. </template>
  741. </pageTable>
  742. </div>
  743. </div>
  744. </div>
  745. <!--项目评估情况-->
  746. <div class="data-panel">
  747. <div class="panel-header">
  748. <div class="title">项目评估情况统计</div>
  749. <div class="panel-select">
  750. <div class="mt-10 inline-16">
  751. <label class="search__label" >部门:</label>
  752. <el-cascader
  753. ref="selectdep"
  754. size="small"
  755. v-model="scoreTableParam.content.dataid"
  756. :options="deplist"
  757. :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}"
  758. @change="$event => {if($event.length) {scoreMapParam.content.type=1;scoreMapParam.content.dataid=$event[$event.length - 1];scoreTableParam.content.type=1;scoreTableParam.content.username='';$refs.projectScoreTable.listData();projectScoreInit()} else {scoreMapParam.content.type='';scoreMapParam.content.dataid='';scoreTableParam.content.dataid='';scoreTableParam.content.type='';scoreTableParam.content.username='';$refs.projectScoreTable.listData();projectScoreInit()}}"></el-cascader>
  759. </div>
  760. <div class="mt-10 inline-16">
  761. <label class="search__label" >业务员:</label>
  762. <el-select v-model="scoreTableParam.content.username" filterable placeholder="请选择" size="small"
  763. @change="$event => {if($event) {scoreMapParam.content.type=0;scoreMapParam.content.dataid=$event;scoreTableParam.content.type=0;scoreTableParam.content.dataid=$event;scoreTableParam.content.depname='';$refs.projectScoreTable.listData();projectScoreInit()} else {scoreMapParam.content.type='';scoreMapParam.content.dataid='';scoreTableParam.content.dataid='';scoreTableParam.content.type='';scoreTableParam.content.depname='';$refs.projectScoreTable.listData();projectScoreInit()}}"
  764. >
  765. <el-option
  766. v-for="item in personnelList"
  767. :key="item.index"
  768. :label="item.name"
  769. :value="item.userid">
  770. </el-option>
  771. </el-select>
  772. </div>
  773. </div>
  774. </div>
  775. <div class="panel-content">
  776. <div ref="projectScoreEl" style="width:30%"></div>
  777. <div class="panel-table" style="width:70%">
  778. <pageTable
  779. ref="projectScoreTable"
  780. :tablecols="tool.tabelCol($route.name).projectTable.tablecols"
  781. :param="scoreTableParam"
  782. :custom="true"
  783. fixedName="operation"
  784. >
  785. <template v-slot:custom="scope">
  786. <div v-if="scope.data.columnname == 'sys_tag'">
  787. <el-tag size="small" v-for="(item,index) in scope.data.data.sys_tag" :key="index">{{ item }}</el-tag>
  788. </div>
  789. <div v-else-if="scope.data.columnname == 'operation'">
  790. <el-button type="text" size="small" @click="goDetail(scope.data.data)">详情</el-button>
  791. </div>
  792. <div v-else-if="scope.data.columnname == 'signamount_due'">
  793. {{ tool.formatAmount(scope.data.data.signamount_due,2,'¥') }}
  794. </div>
  795. <div v-else-if="scope.data.columnname === 'industry'">
  796. <el-tag size="small" v-for="(item,index) in scope.data.data.industry" :key="index">{{ item }}</el-tag>
  797. </div>
  798. <div v-else-if="scope.data.columnname === 'tradingstatus'">
  799. <span style="color:#3874f6" v-if="scope.data.data[[scope.data.columnname]] == '未成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  800. <span style="color:#fa8c16" v-else-if="scope.data.data[[scope.data.columnname]] == '已成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  801. <span style="color:#333333" v-else-if="scope.data.data[[scope.data.columnname]] == '多次成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  802. </div>
  803. <div v-else-if="scope.data.columnname === 'status'">
  804. <span style="color:rgb(250, 140, 22)" v-if="scope.data.data[[scope.data.columnname]] == '已成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  805. <span style="color:#52c41a" v-else-if="scope.data.data[[scope.data.columnname]] == '跟进中'">{{scope.data.data[[scope.data.columnname]]}}</span>
  806. <span style="color:#999999" v-else-if="scope.data.data[[scope.data.columnname]] == '已失败' || scope.data.data[[scope.data.columnname]] == '已结案'">{{scope.data.data[[scope.data.columnname]]}}</span>
  807. </div>
  808. <div v-else-if="scope.data.columnname == 'scale'">
  809. {{scope.data.data.scale ? scope.data.data.scale + scope.data.data.unitname : '' }}
  810. </div>
  811. <div v-else>
  812. {{ scope.data.data[scope.data.columnname] }}
  813. </div>
  814. </template>
  815. </pageTable>
  816. </div>
  817. </div>
  818. </div>
  819. <!--有效项目未跟进情况-->
  820. <div class="data-panel">
  821. <div class="panel-header">
  822. <div class="title">有效项目未跟进天数分析</div>
  823. <div class="panel-select">
  824. <div class="mt-10 inline-16">
  825. <label class="search__label" >部门:</label>
  826. <el-cascader
  827. ref="selectdep"
  828. size="small"
  829. v-model="unfllowTableParam.content.dataid"
  830. :options="deplist"
  831. :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}"
  832. @change="$event => {if($event.length) {unfllowMapParam.content.type=1;unfllowMapParam.content.dataid=$event[$event.length - 1];unfllowTableParam.content.type=1;unfllowTableParam.content.username='';$refs.customerUnfllowTable.listData();customerUnfllowInit()} else {unfllowMapParam.content.type='';unfllowMapParam.content.dataid='';unfllowTableParam.content.dataid='';unfllowTableParam.content.type='';unfllowTableParam.content.username='';$refs.customerUnfllowTable.listData();customerUnfllowInit()}}"></el-cascader>
  833. </div>
  834. <div class="mt-10 inline-16">
  835. <label class="search__label" >业务员:</label>
  836. <el-select v-model="unfllowTableParam.content.username" filterable placeholder="请选择" size="small"
  837. @change="$event => {if($event) {unfllowMapParam.content.type=0;unfllowMapParam.content.dataid=$event;unfllowTableParam.content.type=0;unfllowTableParam.content.dataid=$event;unfllowTableParam.content.depname='';$refs.customerUnfllowTable.listData();customerUnfllowInit()} else {unfllowMapParam.content.type='';unfllowMapParam.content.dataid='';unfllowTableParam.content.dataid='';unfllowTableParam.content.type='';unfllowTableParam.content.depname='';$refs.customerUnfllowTable.listData();customerUnfllowInit()}}"
  838. >
  839. <el-option
  840. v-for="item in personnelList"
  841. :key="item.index"
  842. :label="item.name"
  843. :value="item.userid">
  844. </el-option>
  845. </el-select>
  846. </div>
  847. <div class="mt-10 inline-16">
  848. <label class="search__label">项目类型:</label>
  849. <el-select
  850. v-model="unfllowMapParam.content.where.projecttype"
  851. placeholder="请选择项目类型"
  852. @change="$event => {if($event.length) {unfllowTableParam.content.where.projecttype=$event;$refs.customerUnfllowTable.listData();customerUnfllowInit()} else {unfllowTableParam.content.where.projecttype='';$refs.customerUnfllowTable.listData();customerUnfllowInit()}}"
  853. size="small" clearable>
  854. <el-option
  855. v-for="item in projectType"
  856. :key="item.value"
  857. :label="item.value"
  858. :value="item.value">
  859. <span style="float: left">{{ item.value }}</span>
  860. <span style="float: right; color: #8492a6; font-size: 12px">{{ item.remarks?item.remarks:'暂无描述' }}</span>
  861. </el-option>
  862. </el-select>
  863. </div>
  864. <div class="mt-10 inline-16">
  865. <label class="search__label" >分析日期:</label>
  866. <el-date-picker
  867. v-model="unfllowMapParam.content.enddate"
  868. format="yyyy-MM-dd"
  869. value-format="yyyy-MM-dd"
  870. type="date"
  871. size="small"
  872. placeholder="选择日期"
  873. @change="unfllowTableParam.content.where.enddate=unfllowMapParam.content.enddate;customerUnfllowInit();$refs.customerUnfllowTable.listData()">
  874. </el-date-picker>
  875. </div>
  876. </div>
  877. </div>
  878. <div>
  879. <div ref="customerUnfllowEl" style="height:400px"></div>
  880. <div style="font-size:16px;color:#333333;margin:10px 0">{{ unfllowStatus ? unfllowStatus : '全部' }}</div>
  881. <div>
  882. <pageTable
  883. v-if="projectType[0].value != ''"
  884. ref="customerUnfllowTable"
  885. :tablecols="tool.tabelCol($route.name).projectTable1.tablecols.splice(0,tool.tabelCol($route.name).projectTable1.tablecols.length - 1)"
  886. :param="unfllowTableParam"
  887. :custom="true"
  888. @handleParam="handleUnfllowParam"
  889. >
  890. <template v-slot:custom="scope">
  891. <div v-if="scope.data.columnname == 'sys_tag'">
  892. <el-tag size="small" v-for="(item,index) in scope.data.data.sys_tag" :key="index">{{ item }}</el-tag>
  893. </div>
  894. <div v-else-if="scope.data.columnname == 'operation'">
  895. <el-button type="text" size="small" @click="goDetail(scope.data.data)">详情</el-button>
  896. </div>
  897. <div v-else-if="scope.data.columnname == 'signamount_due'">
  898. {{ tool.formatAmount(scope.data.data.signamount_due,2,'¥') }}
  899. </div>
  900. <div v-else-if="scope.data.columnname === 'industry'">
  901. <el-tag size="small" v-for="(item,index) in scope.data.data.industry" :key="index">{{ item }}</el-tag>
  902. </div>
  903. <div v-else-if="scope.data.columnname === 'tradingstatus'">
  904. <span style="color:#3874f6" v-if="scope.data.data[[scope.data.columnname]] == '未成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  905. <span style="color:#fa8c16" v-else-if="scope.data.data[[scope.data.columnname]] == '已成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  906. <span style="color:#333333" v-else-if="scope.data.data[[scope.data.columnname]] == '多次成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  907. </div>
  908. <div v-else-if="scope.data.columnname === 'status'">
  909. <span style="color:rgb(250, 140, 22)" v-if="scope.data.data[[scope.data.columnname]] == '已成交'">{{scope.data.data[[scope.data.columnname]]}}</span>
  910. <span style="color:#52c41a" v-else-if="scope.data.data[[scope.data.columnname]] == '跟进中'">{{scope.data.data[[scope.data.columnname]]}}</span>
  911. <span style="color:#999999" v-else-if="scope.data.data[[scope.data.columnname]] == '已失败' || scope.data.data[[scope.data.columnname]] == '已结案'">{{scope.data.data[[scope.data.columnname]]}}</span>
  912. </div>
  913. <div v-else>
  914. {{ scope.data.data[scope.data.columnname] }}
  915. </div>
  916. </template>
  917. </pageTable>
  918. </div>
  919. </div>
  920. </div>
  921. <!--项目生命周期分析-->
  922. <div class="data-panel">
  923. <div class="panel-header">
  924. <div class="title">
  925. 项目生命周期分析
  926. <el-tooltip class="item" effect="dark" content="统计项目生命周期中的会个关键节点之间平均周期" placement="top">
  927. <img style="vertical-align: middle" src="@/assets/icons/prompt_icon.svg" alt="">
  928. </el-tooltip>
  929. </div>
  930. </div>
  931. <div class="progress" v-if="dateList.length">
  932. <div class="progress-item" :style="[{'--bg':colorArr[index]},{'--width':item.avg}]" v-for="(item,index) in dateList" :key="index">
  933. <div class="day">平均周期:{{ item.dateavg.toFixed(2) }}天</div>
  934. <div class="start" v-if="index == 0">
  935. <span>{{ item.start }}</span>
  936. <span v-if="item.end == '立项'">项目立项</span>
  937. <span v-else-if="item.end == '报备'">项目报备审核</span>
  938. <span v-else-if="item.end == '报价'">项目报价审核</span>
  939. <span v-else-if="item.end == '合同'">项目合同审核</span>
  940. <span v-else-if="item.end == '订单'">项目订单审核</span>
  941. <span v-else-if="item.end == '结案'">项目结案</span>
  942. </div>
  943. <div class="end">
  944. <span>{{ item.end }}</span>
  945. <span v-if="item.end == '立项'">项目立项</span>
  946. <span v-else-if="item.end == '报备'">项目报备审核</span>
  947. <span v-else-if="item.end == '报价'">项目报价审核</span>
  948. <span v-else-if="item.end == '合同'">项目合同审核</span>
  949. <span v-else-if="item.end == '订单'">项目订单审核</span>
  950. <span v-else-if="item.end == '结案'">项目结案</span>
  951. </div>
  952. </div>
  953. </div>
  954. <el-empty description="描述文字" :image-size="80" v-else></el-empty>
  955. <div class="panel-select" style="margin-top:90px">
  956. <div class="mt-10 inline-16">
  957. <label class="search__label" >部门:</label>
  958. <el-cascader
  959. clearable
  960. ref="selectdep"
  961. size="small"
  962. v-model="dateParam.content.dataid"
  963. :options="deplist"
  964. :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}"
  965. @change="$event => {if($event.length) {[$event.length - 1];dateParam.content.type=1;dateParam.content.username='';getDate()} else {dateParam.content.dataid='';dateParam.content.type='';dateParam.content.username='';getDate()}}"></el-cascader>
  966. </div>
  967. <div class="mt-10 inline-16">
  968. <label class="search__label">项目类型:</label>
  969. <el-select v-model="dateParam.content.where.projecttype" placeholder="请选择项目类型" @change="getDate" size="small" clearable>
  970. <el-option
  971. v-for="item in projectType"
  972. :key="item.value"
  973. :label="item.value"
  974. :value="item.value">
  975. <span style="float: left">{{ item.value }}</span>
  976. <span style="float: right; color: #8492a6; font-size: 12px">{{ item.remarks?item.remarks:'暂无描述' }}</span>
  977. </el-option>
  978. </el-select>
  979. </div>
  980. <div class="mt-10 inline-16">
  981. <label class="search__label">项目等级:</label>
  982. <el-select v-model="dateParam.content.where.grade" placeholder="请选择项目等级" @change="getDate" size="small" clearable>
  983. <el-option
  984. v-for="item in projectLead"
  985. :key="item.value"
  986. :label="item.value"
  987. :value="item.value">
  988. <span style="float: left">{{ item.value }}</span>
  989. <span style="float: right; color: #8492a6; font-size: 12px">{{ item.remarks?item.remarks:'暂无描述' }}</span>
  990. </el-option>
  991. </el-select>
  992. </div>
  993. <div class="mt-10 inline-16">
  994. <label class="search__label">领域:</label>
  995. <el-select v-model="dateParam.content.where.tradefield" placeholder="请选择领域" @change="getDate" size="small" clearable>
  996. <el-option
  997. v-for="item in tradefieldSelect"
  998. :key="item.value"
  999. :label="item.value"
  1000. :value="item.value">
  1001. <span style="float: left">{{ item.value }}</span>
  1002. <span style="float: right; color: #8492a6; font-size: 12px">{{ item.remarks?item.remarks:'暂无描述' }}</span>
  1003. </el-option>
  1004. </el-select>
  1005. </div>
  1006. </div>
  1007. <div class="mt-10 inline-16" style="margin-top:10px">
  1008. <label class="search__label" >项目名称:</label>
  1009. <selectProject :projectType="projectType" :projectLead="projectLead" :tradefieldSelect="tradefieldSelect" @selectRow="selectRow" ref="selectProject">
  1010. <div slot="input" style="display:flex;align-items:center">
  1011. <el-input v-model="projectname" style="width:300px" size="small" placeholder="请选择项目" @focus="$refs.selectProject.visible=true"></el-input>
  1012. <el-button style="margin-left:10px" @click="clearSelect" size="mini" type="text" v-if="dateParam.content.where.sa_projectid">清空</el-button>
  1013. </div>
  1014. </selectProject>
  1015. </div>
  1016. <div style="margin-top:10px">
  1017. <div class="mt-10 inline-16">
  1018. <label class="search__label">开始节点:</label>
  1019. <el-select v-model="dateParam.content.begnode" placeholder="开始节点" @change="getDate" size="small" clearable>
  1020. <el-option label="立项" value="立项"></el-option>
  1021. <el-option label="报备" value="报备"></el-option>
  1022. <el-option label="报价" value="报价"></el-option>
  1023. <el-option label="合同" value="合同"></el-option>
  1024. <el-option label="订单" value="订单"></el-option>
  1025. <el-option label="结案" value="结案"></el-option>
  1026. </el-select>
  1027. </div>
  1028. <span style="margin:0 35px 0 25px">至</span>
  1029. <div class="mt-10 inline-16">
  1030. <label class="search__label">结束节点:</label>
  1031. <el-select v-model="dateParam.content.endnode" placeholder="结束节点" @change="getDate" size="small" clearable>
  1032. <el-option label="立项" value="立项"></el-option>
  1033. <el-option label="报备" value="报备"></el-option>
  1034. <el-option label="报价" value="报价"></el-option>
  1035. <el-option label="合同" value="合同"></el-option>
  1036. <el-option label="订单" value="订单"></el-option>
  1037. <el-option label="结案" value="结案"></el-option>
  1038. </el-select>
  1039. </div>
  1040. </div>
  1041. </div>
  1042. </div>
  1043. </el-scrollbar>
  1044. </div>
  1045. </template>
  1046. </normalLayout>
  1047. </template>
  1048. <script>
  1049. import { DualAxes,Pie,measureTextWidth,Column,Line,Bar } from '@antv/g2plot'
  1050. import pageTable from './components/pageTable.vue'
  1051. import selectProject from './components/selectProject.vue'
  1052. import borderTemp from '@/HDrpManagement/dataanalysis/components/border.vue'
  1053. import FullScroll from '@/components/fullScroll/index.vue'
  1054. export default {
  1055. name:'projectData',
  1056. components:{borderTemp,pageTable,selectProject,FullScroll},
  1057. data () {
  1058. return {
  1059. colorArr:['#3874f6','#00b32b','#ffae02','#f53f3f','#f2f2f2'],
  1060. deplist:[],
  1061. personnelList:[],
  1062. depmentParam:{
  1063. "id": 20230620102004,
  1064. "content": {
  1065. }
  1066. },
  1067. projectType:[{value:''}],
  1068. projectLead:[],
  1069. tradefieldSelect:[],
  1070. projectname:'',
  1071. depment:'',
  1072. dataAll:{
  1073. data:{}
  1074. },
  1075. scoreStatus:'',
  1076. unfllowStatus:'',
  1077. person:'',
  1078. //项目类型分析
  1079. typeMap:'',
  1080. typeMapParam: {
  1081. "id": 20231018140404,
  1082. "content": {
  1083. "type": '',
  1084. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1085. "dataid": '',
  1086. "where":{
  1087. "projecttype":""
  1088. }
  1089. }
  1090. },
  1091. typeTableParam:{
  1092. "id": 20231019090104,
  1093. "content": {
  1094. "type": '',
  1095. "dataid": '',
  1096. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1097. "where": {
  1098. // "isfollowup": "", // 有跟进 无跟进 ------项目跟进情况统计列表使用该字段
  1099. // "grade": "", // 项目等级统计列表使用该字段
  1100. // "iscontacts": "", //无联系人 有联系人 ------项目联系人情况统计列表使用该字段
  1101. // "iscustomers": "", //无关联客户 有关联客户 ------项目关联客户情况统计列表使用该字段
  1102. // "istask":"",// 有评估记录 无评估记录 ------ 项目评估情况统计列表使用该字段
  1103. "projecttype":""// 项目类型分析统计列表使用该最低端
  1104. }
  1105. }
  1106. },
  1107. typeData:{
  1108. map:[],
  1109. },
  1110. //项目等级分析
  1111. gradMap:'',
  1112. gradMapParam: {
  1113. "id": 20231018141804,
  1114. "content": {
  1115. "type": '',
  1116. "dataid": '',
  1117. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1118. "where":{
  1119. "grade":""
  1120. }
  1121. }
  1122. },
  1123. gradTableParam:{
  1124. "id": 20231019090104,
  1125. "content": {
  1126. "type": '',
  1127. "dataid": '',
  1128. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1129. "where": {
  1130. "grade": "", // 项目等级统计列表使用该字段
  1131. }
  1132. }
  1133. },
  1134. gradData:{
  1135. map:[],
  1136. },
  1137. //项目评估分析
  1138. scoreMap:'',
  1139. scoreMapParam1: {
  1140. "id": 20231024103104,
  1141. "content": {
  1142. "type": '',
  1143. "dataid": '',
  1144. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1145. }
  1146. },
  1147. scoreTableParam1:{
  1148. "id": 20231024112004,
  1149. "content": {
  1150. "type": "",
  1151. "dataid": "",
  1152. "occupancyratio":"",
  1153. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1154. "where":{
  1155. "taskType":""
  1156. },
  1157. "pageSize":20,
  1158. "pageNumber":1
  1159. }
  1160. },
  1161. scoreData:{
  1162. map:[],
  1163. },
  1164. //项目12月新增分析
  1165. addMap:'',
  1166. addParam: {
  1167. "id": 20231018155804,
  1168. "content": {
  1169. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1170. "type": '',
  1171. "dataid": '',
  1172. "enddate":`${new Date().getFullYear()}-${new Date().getMonth() + 1}-${new Date().getDate()}`
  1173. }
  1174. },
  1175. addData: {
  1176. arr1:[],
  1177. arr2:[]
  1178. },
  1179. //项目12月报备分析
  1180. baobeiMap:'',
  1181. baobeiParam: {
  1182. "id": 20231018160504,
  1183. "content": {
  1184. "type": '',
  1185. "enddate":`${new Date().getFullYear()}-${new Date().getMonth() + 1}-${new Date().getDate()}`,
  1186. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1187. "dataid": '',
  1188. }
  1189. },
  1190. baobeiData: {
  1191. arr1:[],
  1192. arr2:[]
  1193. },
  1194. //项目12月跟进分析
  1195. fllowMap:'',
  1196. fllowParam: {
  1197. "id": 20231018163004,
  1198. "content": {
  1199. "type": '',
  1200. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1201. "enddate":`${new Date().getFullYear()}-${new Date().getMonth() + 1}-${new Date().getDate()}`,
  1202. "dataid": '',
  1203. }
  1204. },
  1205. fllowData: {
  1206. },
  1207. //项目12月报价分析
  1208. baojiaMap:'',
  1209. baojiaParam: {
  1210. "id": 20231018161604,
  1211. "content": {
  1212. "type": '',
  1213. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1214. "enddate":`${new Date().getFullYear()}-${new Date().getMonth() + 1}-${new Date().getDate()}`,
  1215. "dataid": '',
  1216. }
  1217. },
  1218. baojiaData: {
  1219. },
  1220. //项目跟进分析
  1221. projectFllowMap:'',
  1222. fllowMapParam: {
  1223. "id": 20231019085304,
  1224. "content": {
  1225. "type": '',
  1226. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1227. "dataid": '',
  1228. "enddate":`${new Date().getFullYear()}-${new Date().getMonth() + 1}-${new Date().getDate()}`,
  1229. "where":{
  1230. "grade":""
  1231. }
  1232. }
  1233. },
  1234. fllowTableParam:{
  1235. "id": 20231019090104,
  1236. "content": {
  1237. "type": '',
  1238. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1239. "dataid": '',
  1240. "where": {
  1241. "isfollowup": "", // 有跟进 无跟进 ------项目跟进情况统计列表使用该字段
  1242. }
  1243. }
  1244. },
  1245. projectFllowData:{
  1246. map:[],
  1247. },
  1248. //项目联系人分析
  1249. projectFllowMap:'',
  1250. contactMapParam: {
  1251. "id": 20231019085404,
  1252. "content": {
  1253. "type": '',
  1254. "dataid": '',
  1255. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1256. "where":{
  1257. "grade":""
  1258. }
  1259. }
  1260. },
  1261. contactTableParam:{
  1262. "id": 20231019090104,
  1263. "content": {
  1264. "type": '',
  1265. "dataid": '',
  1266. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1267. "where": {
  1268. "iscontacts": "", //无联系人 有联系人 ------项目联系人情况统计列表使用该字段
  1269. }
  1270. }
  1271. },
  1272. projectContactData:{
  1273. map:[],
  1274. },
  1275. //项目关联客户分析
  1276. projectCustomerMap:'',
  1277. customerMapParam: {
  1278. "id": 20231019085504,
  1279. "content": {
  1280. "type": '',
  1281. "dataid": '',
  1282. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1283. "where":{
  1284. "iscustomers":""
  1285. }
  1286. }
  1287. },
  1288. customerTableParam:{
  1289. "id": 20231019090104,
  1290. "content": {
  1291. "type": '',
  1292. "dataid": '',
  1293. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1294. "where": {
  1295. "iscustomers": "", //无关联客户 有关联客户 ------项目关联客户情况统计列表使用该字段
  1296. }
  1297. }
  1298. },
  1299. projectCustomerData:{
  1300. map:[],
  1301. },
  1302. //项目评估分析
  1303. projectScoreMap:'',
  1304. scoreMapParam: {
  1305. "id": 20231019085604,
  1306. "content": {
  1307. "type": '',
  1308. "dataid": '',
  1309. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1310. "where":{
  1311. "istask":""
  1312. }
  1313. }
  1314. },
  1315. scoreTableParam:{
  1316. "id": 20231019090104,
  1317. "content": {
  1318. "type": '',
  1319. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1320. "dataid": '',
  1321. "where": {
  1322. "istask":"",// 有评估记录 无评估记录 ------ 项目评估情况统计列表使用该字段
  1323. }
  1324. }
  1325. },
  1326. projectScoreData:{
  1327. map:[],
  1328. },
  1329. //未跟进情况
  1330. customerUnfllowMap:'',
  1331. unfllowMapParam: {
  1332. "id": 20231019095804,
  1333. "content": {
  1334. "type": '',
  1335. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1336. "dataid": '',
  1337. "where": {
  1338. "projecttype":""
  1339. }
  1340. }
  1341. },
  1342. unfllowTableParam:{
  1343. "id": 20231019095904,
  1344. "content": {
  1345. "type": '',
  1346. "dataid": '',
  1347. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1348. "where": {
  1349. "projecttype":"",
  1350. "dateType":""
  1351. }
  1352. }
  1353. },
  1354. customerUnfllowData:{
  1355. map:[],
  1356. },
  1357. //项目周期分析
  1358. dateParam: {
  1359. "id": 20231023092304,
  1360. "content": {
  1361. "type": 1,
  1362. "dataid": '',
  1363. "username":JSON.parse(sessionStorage.getItem('accountinfo')).name,
  1364. "begnode":"",//开始节点
  1365. "endnode":"",//结束节点
  1366. "where": {
  1367. "projecttype": "",//项目类型
  1368. "grade":"",//项目等级
  1369. "tradefield":"",//领域
  1370. "sa_projectid":""//项目id
  1371. }
  1372. }
  1373. },
  1374. dateList:{}
  1375. }
  1376. },
  1377. methods:{
  1378. goDetail (data) {
  1379. this.$router.push({
  1380. path:'/projectChangeDetail',
  1381. query:{
  1382. id:data.sa_projectid,
  1383. }
  1384. })
  1385. this.$store.dispatch('changeDetailDrawer',true)
  1386. },
  1387. //获取数据总览
  1388. async getdataAll () {
  1389. let res = await this.$api.requested({
  1390. id:20231018110404,
  1391. content:{}
  1392. })
  1393. this.dataAll = res.data
  1394. console.log(this.dataAll,'数据总览');
  1395. },
  1396. async departmentrtment() {
  1397. const res = await this.$api.requested(this.depmentParam)
  1398. this.deplist = this.createMenu(res.data.dep)
  1399. this.personnelList = res.data.hr
  1400. },
  1401. //12月跟进初始化
  1402. async chart2Fun (init) {
  1403. let res = await this.$api.requested(this.chartParam2)
  1404. console.log(res.data,'近12月跟进');
  1405. this.chartMapData = res.data
  1406. if (init) {
  1407. this.chartMap = new DualAxes(this.$refs.chart2, {
  1408. data: [this.chartMapData.followup, this.chartMapData.tbzzl],
  1409. xField: 'date',
  1410. yField: ['value', 'value'],
  1411. geometryOptions: [
  1412. {
  1413. geometry: 'line',
  1414. seriesField:'key',
  1415. color: '#5B8FF9',
  1416. },
  1417. {
  1418. geometry: 'line',
  1419. seriesField:'key',
  1420. color: '#5AD8A6',
  1421. },
  1422. ],
  1423. });
  1424. this.chartMap.render();
  1425. } else {
  1426. this.chartMap.changeData([this.chartMapData.followup, this.chartMapData.tbzzl])
  1427. }
  1428. },
  1429. //项目类型图初始化
  1430. async typeInit (init) {
  1431. let res = await this.$api.requested(this.typeMapParam)
  1432. this.typeData.map = res.data
  1433. console.log(this.typeData.map,'项目类型数据');
  1434. if (init) {
  1435. this.typeMap = new Pie(this.$refs.typeEl, {
  1436. appendPadding: 10,
  1437. data:this.typeData.map,
  1438. angleField: 'qty',
  1439. colorField: 'key',
  1440. radius: 1,
  1441. innerRadius: 0.64,
  1442. meta: {
  1443. value: {
  1444. formatter: (v) => `${v} ¥`,
  1445. },
  1446. },
  1447. label:{
  1448. formatter: (datum) => `${datum.ratio}%`
  1449. },
  1450. statistic: {
  1451. title: {
  1452. offsetY: -4,
  1453. customHtml: (container, view, datum) => {
  1454. const { width, height } = container.getBoundingClientRect();
  1455. const d = Math.sqrt(Math.pow(width / 2, 2) + Math.pow(height / 2, 2));
  1456. const text = datum ? `${datum.key}` : '项目总数'
  1457. return this.renderStatistic(d, text, { fontSize: 28 });
  1458. },
  1459. },
  1460. content: {
  1461. offsetY: 4,
  1462. style: {
  1463. fontSize: '24px',
  1464. },
  1465. customHtml: (container, view, datum, data) => {
  1466. const { width } = container.getBoundingClientRect();
  1467. const text = datum ? `${datum.ratio}%` : data[0] ? data[0].qty : 0;
  1468. return this.renderStatistic(width, text, { fontSize: 32 });
  1469. },
  1470. },
  1471. },
  1472. legend: {
  1473. position:'left'
  1474. },
  1475. // 添加 中心统计文本 交互
  1476. interactions: [{ type: 'element-single-selected' },{ type: 'element-active' },{ type: 'pie-statistic-active' }],
  1477. });
  1478. this.typeMap.on('element:click',(v) => {
  1479. if (v.data.data.value != this.typeTableParam.content.where.projecttype) {
  1480. this.typeTableParam.content.where.projecttype = v.data.data.value
  1481. this.$refs.typeTable.listData()
  1482. } else {
  1483. this.typeTableParam.content.where.projecttype = ''
  1484. this.$refs.typeTable.listData()
  1485. }
  1486. })
  1487. this.typeMap.render();
  1488. } else {
  1489. this.typeMap.changeData(this.typeData.map)
  1490. }
  1491. },
  1492. //项目等级图初始化
  1493. async gradInit (init) {
  1494. let res = await this.$api.requested(this.gradMapParam)
  1495. this.gradData.map = res.data
  1496. console.log(this.gradData.map,'项目等级数据');
  1497. if (init) {
  1498. this.gradMap = new Pie(this.$refs.gradEl, {
  1499. appendPadding: 10,
  1500. data:this.gradData.map,
  1501. angleField: 'qty',
  1502. colorField: 'key',
  1503. radius: 1,
  1504. innerRadius: 0.64,
  1505. label:{
  1506. formatter: (datum) => `${datum.ratio}%`
  1507. },
  1508. statistic: {
  1509. title: {
  1510. offsetY: -4,
  1511. customHtml: (container, view, datum) => {
  1512. const { width, height } = container.getBoundingClientRect();
  1513. const d = Math.sqrt(Math.pow(width / 2, 2) + Math.pow(height / 2, 2));
  1514. const text = datum ? `${datum.key}` : '项目总数'
  1515. return this.renderStatistic(d, text, { fontSize: 28 });
  1516. },
  1517. },
  1518. content: {
  1519. offsetY: 4,
  1520. style: {
  1521. fontSize: '24px',
  1522. },
  1523. customHtml: (container, view, datum, data) => {
  1524. const { width } = container.getBoundingClientRect();
  1525. const text = datum ? `${datum.ratio}%` : data[0] ? data[0].qty : 0;
  1526. return this.renderStatistic(width, text, { fontSize: 32 });
  1527. },
  1528. },
  1529. },
  1530. legend: {
  1531. position:'left'
  1532. },
  1533. // 添加 中心统计文本 交互
  1534. interactions: [{ type: 'element-selected' },{ type: 'element-active' },{ type: 'pie-statistic-active' }],
  1535. });
  1536. this.gradMap.on('element:click',(v) => {
  1537. if (v.data.data.key != this.gradTableParam.content.where.grade) {
  1538. this.gradTableParam.content.where.grade = v.data.data.key
  1539. this.$refs.gradTable.listData()
  1540. } else {
  1541. this.gradTableParam.content.where.grade = ''
  1542. this.$refs.gradTable.listData()
  1543. }
  1544. })
  1545. this.gradMap.render();
  1546. } else {
  1547. this.gradMap.changeData(this.gradData.map)
  1548. }
  1549. },
  1550. //项目评估图初始化
  1551. async scoreInit (init) {
  1552. let res = await this.$api.requested(this.scoreMapParam1)
  1553. this.scoreData.map = res.data
  1554. console.log(this.scoreData.map,'项目评估数据');
  1555. if (init) {
  1556. this.scoreMap = new Bar(this.$refs.scoreEl, {
  1557. data:this.scoreData.map,
  1558. xField: 'value',
  1559. yField: 'key',
  1560. seriesField: 'key',
  1561. minBarWidth: 20,
  1562. maxBarWidth: 40,
  1563. legend: {
  1564. position: 'top-left',
  1565. },
  1566. interactions: [{ type: 'element-single-selected' }],
  1567. });
  1568. this.scoreMap.on('element:click',(v) => {
  1569. if (v.data.data.key != this.scoreTableParam1.content.occupancyratio) {
  1570. this.scoreStatus = v.data.data.key
  1571. this.scoreTableParam1.content.occupancyratio = v.data.data.key
  1572. this.$refs.scoreTable.listData()
  1573. } else {
  1574. this.scoreStatus = ''
  1575. this.scoreTableParam1.content.occupancyratio = ''
  1576. this.$refs.scoreTable.listData()
  1577. }
  1578. })
  1579. this.scoreMap.render();
  1580. } else {
  1581. this.scoreMap.changeData(this.scoreData.map)
  1582. }
  1583. },
  1584. //12月新增初始化
  1585. async addFun (init) {
  1586. let param = JSON.parse(JSON.stringify(this.addParam))
  1587. if (param.content.dataid instanceof Array) {
  1588. param.content.dataid = param.content.dataid[param.content.dataid.length - 1]
  1589. }
  1590. let res = await this.$api.requested(param)
  1591. this.addData.arr1 = res.data.histogram
  1592. res.data.lineChart.forEach(item => item[`同比增长率(%)`] = item.value)
  1593. this.addData.arr2 = res.data.lineChart
  1594. if (init) {
  1595. this.addMap = new DualAxes(this.$refs.addEl, {
  1596. data: [this.addData.arr1,this.addData.arr2],
  1597. xField: 'date',
  1598. yField: ['value', '同比增长率(%)'],
  1599. geometryOptions: [
  1600. {
  1601. geometry: 'column',
  1602. isGroup: true,
  1603. seriesField: 'key',
  1604. },
  1605. {
  1606. geometry: 'line',
  1607. lineStyle: {
  1608. lineWidth: 2,
  1609. },
  1610. },
  1611. ],
  1612. });
  1613. this.addMap.render()
  1614. } else {
  1615. this.addMap.changeData([this.addData.arr1,this.addData.arr2])
  1616. }
  1617. },
  1618. //12月报备初始化
  1619. async baobeiFun (init) {
  1620. let param = JSON.parse(JSON.stringify(this.baobeiParam))
  1621. if (param.content.dataid instanceof Array) {
  1622. param.content.dataid = param.content.dataid[param.content.dataid.length - 1]
  1623. }
  1624. let res = await this.$api.requested(param)
  1625. this.baobeiData.arr1 = res.data.histogram
  1626. res.data.lineChart.forEach(item => item[`同比增长率(%)`] = item.value)
  1627. this.baobeiData.arr2 = res.data.lineChart
  1628. if (init) {
  1629. this.baobeiMap = new DualAxes(this.$refs.baobeiEl, {
  1630. data: [this.baobeiData.arr1,this.baobeiData.arr2],
  1631. xField: 'date',
  1632. yField: ['value', '同比增长率(%)'],
  1633. geometryOptions: [
  1634. {
  1635. geometry: 'column',
  1636. isGroup: true,
  1637. seriesField: 'key',
  1638. },
  1639. {
  1640. geometry: 'line',
  1641. lineStyle: {
  1642. lineWidth: 2,
  1643. },
  1644. },
  1645. ],
  1646. });
  1647. this.baobeiMap.render()
  1648. } else {
  1649. this.baobeiMap.changeData([this.baobeiData.arr1,this.baobeiData.arr2])
  1650. }
  1651. },
  1652. //12月跟进初始化
  1653. async fllowFun (init) {
  1654. let param = JSON.parse(JSON.stringify(this.fllowParam))
  1655. if (param.content.dataid instanceof Array) {
  1656. param.content.dataid = param.content.dataid[param.content.dataid.length - 1]
  1657. }
  1658. let res = await this.$api.requested(param)
  1659. this.fllowData = res.data
  1660. this.fllowData.tbzzl.forEach(item => item.key = '同比增长率(%)')
  1661. console.log(res.data,'跟进数据');
  1662. if (init) {
  1663. this.fllowMap = new DualAxes(this.$refs.fllowEl, {
  1664. data: [this.fllowData.followup, this.fllowData.tbzzl],
  1665. xField: 'date',
  1666. yField: ['value', 'value'],
  1667. geometryOptions: [
  1668. {
  1669. geometry: 'line',
  1670. seriesField:'key',
  1671. color: '#5B8FF9',
  1672. },
  1673. {
  1674. geometry: 'line',
  1675. seriesField:'key',
  1676. color: '#5AD8A6',
  1677. },
  1678. ],
  1679. })
  1680. this.fllowMap.render()
  1681. } else {
  1682. this.fllowMap.changeData([this.fllowData.followup, this.fllowData.tbzzl])
  1683. }
  1684. },
  1685. //12月报价初始化
  1686. async baojiaFun (init) {
  1687. let param = JSON.parse(JSON.stringify(this.baojiaParam))
  1688. if (param.content.dataid instanceof Array) {
  1689. param.content.dataid = param.content.dataid[param.content.dataid.length - 1]
  1690. }
  1691. let res = await this.$api.requested(param)
  1692. this.baojiaData = res.data
  1693. console.log(res.data,'报价数据');
  1694. if (init) {
  1695. this.baojiaMap = new Line(this.$refs.baojiaEl, {
  1696. data:this.baojiaData,
  1697. xField: 'date',
  1698. yField: 'value',
  1699. seriesField: 'key',
  1700. xAxis: {
  1701. type: 'time',
  1702. },
  1703. yAxis: {
  1704. // label: {
  1705. // // 数值格式化为千分位
  1706. // formatter: (v) => `${v}`.replace(/\d{1,3}(?=(\d{3})+$)/g, (s) => `${s},`),
  1707. // },
  1708. },
  1709. })
  1710. this.baojiaMap.render()
  1711. } else {
  1712. this.baojiaMap.changeData(this.baojiaData)
  1713. }
  1714. },
  1715. //项目跟进图初始化
  1716. async fllowInit (init) {
  1717. let res = await this.$api.requested(this.fllowMapParam)
  1718. this.projectFllowData.map = res.data
  1719. console.log(this.projectFllowData.map,'项目跟进数据');
  1720. if (init) {
  1721. this.projectFllowMap = new Pie(this.$refs.projectFllowEl, {
  1722. appendPadding: 10,
  1723. data:this.projectFllowData.map,
  1724. angleField: 'value',
  1725. colorField: 'key',
  1726. radius: 1,
  1727. innerRadius: 0.64,
  1728. label:{
  1729. formatter: (datum) => `${datum.ratio}%`
  1730. },
  1731. statistic: {
  1732. title: {
  1733. offsetY: -4,
  1734. customHtml: (container, view, datum) => {
  1735. const { width, height } = container.getBoundingClientRect();
  1736. const d = Math.sqrt(Math.pow(width / 2, 2) + Math.pow(height / 2, 2));
  1737. const text = datum ? `${datum.key}` : '项目总数'
  1738. return this.renderStatistic(d, text, { fontSize: 28 });
  1739. },
  1740. },
  1741. content: {
  1742. offsetY: 4,
  1743. style: {
  1744. fontSize: '24px',
  1745. },
  1746. customHtml: (container, view, datum, data) => {
  1747. const { width } = container.getBoundingClientRect();
  1748. const text = datum ? `${datum.ratio}%` : data[0] ? data[0].totalqty : 0;
  1749. return this.renderStatistic(width, text, { fontSize: 32 });
  1750. },
  1751. },
  1752. },
  1753. legend: {
  1754. position:'left'
  1755. },
  1756. // 添加 中心统计文本 交互
  1757. interactions: [{ type: 'element-selected' },{ type: 'element-active' },{ type: 'pie-statistic-active' }],
  1758. });
  1759. this.projectFllowMap.on('element:click',(v) => {
  1760. if (v.data.data.value != this.fllowTableParam.content.where.isfollowup) {
  1761. this.fllowTableParam.content.where.isfollowup = v.data.data.value
  1762. this.$refs.projectFllowTable.listData()
  1763. } else {
  1764. this.fllowTableParam.content.where.isfollowup = ''
  1765. this.$refs.projectFllowTable.listData()
  1766. }
  1767. })
  1768. this.projectFllowMap.render();
  1769. } else {
  1770. this.projectFllowMap.changeData(this.projectFllowData.map)
  1771. }
  1772. },
  1773. //项目联系人图初始化
  1774. async contactInit (init) {
  1775. let res = await this.$api.requested(this.contactMapParam)
  1776. this.projectContactData.map = res.data
  1777. console.log(this.projectContactData.map,'项目联系人数据');
  1778. if (init) {
  1779. this.projectContactMap = new Pie(this.$refs.projectContactEl, {
  1780. appendPadding: 10,
  1781. data:this.projectContactData.map,
  1782. angleField: 'value',
  1783. colorField: 'key',
  1784. radius: 1,
  1785. innerRadius: 0.64,
  1786. label:{
  1787. formatter: (datum) => `${datum.ratio}%`
  1788. },
  1789. statistic: {
  1790. title: {
  1791. offsetY: -4,
  1792. customHtml: (container, view, datum) => {
  1793. const { width, height } = container.getBoundingClientRect();
  1794. const d = Math.sqrt(Math.pow(width / 2, 2) + Math.pow(height / 2, 2));
  1795. const text = datum ? `${datum.key}` : '项目总数'
  1796. return this.renderStatistic(d, text, { fontSize: 28 });
  1797. },
  1798. },
  1799. content: {
  1800. offsetY: 4,
  1801. style: {
  1802. fontSize: '24px',
  1803. },
  1804. customHtml: (container, view, datum, data) => {
  1805. const { width } = container.getBoundingClientRect();
  1806. const text = datum ? `${datum.ratio}%` : data[0] ? data[0].totalqty : 0;
  1807. return this.renderStatistic(width, text, { fontSize: 32 });
  1808. },
  1809. },
  1810. },
  1811. legend: {
  1812. position:'left'
  1813. },
  1814. // 添加 中心统计文本 交互
  1815. interactions: [{ type: 'element-selected' },{ type: 'element-active' },{ type: 'pie-statistic-active' }],
  1816. });
  1817. this.projectContactMap.on('element:click',(v) => {
  1818. if (v.data.data.key != this.contactTableParam.content.where.iscontacts) {
  1819. this.contactTableParam.content.where.iscontacts = v.data.data.key
  1820. this.$refs.projectContactTable.listData()
  1821. } else {
  1822. this.contactTableParam.content.where.iscontacts = ''
  1823. this.$refs.projectContactTable.listData()
  1824. }
  1825. })
  1826. this.projectContactMap.render();
  1827. } else {
  1828. this.projectContactMap.changeData(this.projectContactData.map)
  1829. }
  1830. },
  1831. //项目关联客户图初始化
  1832. async customerInit (init) {
  1833. let res = await this.$api.requested(this.customerMapParam)
  1834. this.projectCustomerData.map = res.data
  1835. console.log(this.projectCustomerData.map,'项目关联客户数据');
  1836. if (init) {
  1837. this.projectCustomerMap = new Pie(this.$refs.projectCustomerEl, {
  1838. appendPadding: 10,
  1839. data:this.projectCustomerData.map,
  1840. angleField: 'value',
  1841. colorField: 'key',
  1842. radius: 1,
  1843. innerRadius: 0.64,
  1844. label:{
  1845. formatter: (datum) => `${datum.ratio}%`
  1846. },
  1847. statistic: {
  1848. title: {
  1849. offsetY: -4,
  1850. customHtml: (container, view, datum) => {
  1851. const { width, height } = container.getBoundingClientRect();
  1852. const d = Math.sqrt(Math.pow(width / 2, 2) + Math.pow(height / 2, 2));
  1853. const text = datum ? `${datum.key}` : '项目总数'
  1854. return this.renderStatistic(d, text, { fontSize: 28 });
  1855. },
  1856. },
  1857. content: {
  1858. offsetY: 4,
  1859. style: {
  1860. fontSize: '24px',
  1861. },
  1862. customHtml: (container, view, datum, data) => {
  1863. const { width } = container.getBoundingClientRect();
  1864. const text = datum ? `${datum.ratio}%` : data[0] ? data[0].totalqty : 0;
  1865. return this.renderStatistic(width, text, { fontSize: 32 });
  1866. },
  1867. },
  1868. },
  1869. legend: {
  1870. position:'left'
  1871. },
  1872. // 添加 中心统计文本 交互
  1873. interactions: [{ type: 'element-selected' },{ type: 'element-active' },{ type: 'pie-statistic-active' }],
  1874. });
  1875. this.projectCustomerMap.on('element:click',(v) => {
  1876. if (v.data.data.key != this.customerTableParam.content.where.iscustomers) {
  1877. this.customerTableParam.content.where.iscustomers = v.data.data.key
  1878. this.$refs.projectCustomerTable.listData()
  1879. } else {
  1880. this.customerTableParam.content.where.iscustomers = ''
  1881. this.$refs.projectCustomerTable.listData()
  1882. }
  1883. })
  1884. this.projectCustomerMap.render();
  1885. } else {
  1886. this.projectCustomerMap.changeData(this.projectCustomerData.map)
  1887. }
  1888. },
  1889. //项目评估图初始化
  1890. async projectScoreInit (init) {
  1891. let res = await this.$api.requested(this.scoreMapParam)
  1892. this.projectScoreData.map = res.data
  1893. console.log(this.projectScoreData.map,'项目评估数据');
  1894. if (init) {
  1895. this.projectScoreMap = new Pie(this.$refs.projectScoreEl, {
  1896. appendPadding: 10,
  1897. data:this.projectScoreData.map,
  1898. angleField: 'value',
  1899. colorField: 'key',
  1900. radius: 1,
  1901. innerRadius: 0.64,
  1902. label:{
  1903. formatter: (datum) => `${datum.ratio}%`
  1904. },
  1905. statistic: {
  1906. title: {
  1907. offsetY: -4,
  1908. customHtml: (container, view, datum) => {
  1909. const { width, height } = container.getBoundingClientRect();
  1910. const d = Math.sqrt(Math.pow(width / 2, 2) + Math.pow(height / 2, 2));
  1911. const text = datum ? `${datum.key}` : '项目总数'
  1912. return this.renderStatistic(d, text, { fontSize: 28 });
  1913. },
  1914. },
  1915. content: {
  1916. offsetY: 4,
  1917. style: {
  1918. fontSize: '24px',
  1919. },
  1920. customHtml: (container, view, datum, data) => {
  1921. const { width } = container.getBoundingClientRect();
  1922. const text = datum ? `${datum.ratio}%` : data[0] ? data[0].totalqty : 0;
  1923. return this.renderStatistic(width, text, { fontSize: 32 });
  1924. },
  1925. },
  1926. },
  1927. legend: {
  1928. position:'left'
  1929. },
  1930. // 添加 中心统计文本 交互
  1931. interactions: [{ type: 'element-highlight-by-x ' },{ type: 'element-active' },{ type: 'pie-statistic-active' }],
  1932. });
  1933. this.projectScoreMap.on('element:click',(v) => {
  1934. if (v.data.data.key != this.scoreTableParam.content.where.istask) {
  1935. this.scoreTableParam.content.where.istask = v.data.data.key
  1936. this.$refs.projectScoreTable.listData()
  1937. } else {
  1938. this.scoreTableParam.content.where.istask = ''
  1939. this.$refs.projectScoreTable.listData()
  1940. }
  1941. })
  1942. this.projectScoreMap.render();
  1943. } else {
  1944. this.projectScoreMap.changeData(this.projectScoreData.map)
  1945. }
  1946. },
  1947. async getDate (init) {
  1948. if(init === true) this.dateParam.content.where.projecttype = this.projectType.length ? this.projectType[0].value : ''
  1949. let param = JSON.parse(JSON.stringify(this.dateParam))
  1950. if (param.content.dataid instanceof Array) {
  1951. param.content.dataid = param.content.dataid[param.content.dataid.length - 1]
  1952. }
  1953. let res = await this.$api.requested(param)
  1954. this.dateList = res.data
  1955. console.log(this.dateList,'周期数据');
  1956. },
  1957. //项目未跟进情况图初始化
  1958. async customerUnfllowInit (init) {
  1959. let res = await this.$api.requested(this.unfllowMapParam)
  1960. this.customerUnfllowData.map = res.data
  1961. console.log(this.customerUnfllowData,'未跟进数据');
  1962. if (init) {
  1963. this.customerUnfllowMap = new Column(this.$refs.customerUnfllowEl, {
  1964. data:this.customerUnfllowData.map,
  1965. isGroup: true,
  1966. xField: 'datetype',
  1967. yField: 'value',
  1968. seriesField: 'key',
  1969. /** 设置颜色 */
  1970. //color: ['#1ca9e6', '#f88c24'],
  1971. /** 设置间距 */
  1972. // marginRatio: 0.1,
  1973. label: {
  1974. // 可手动配置 label 数据标签位置
  1975. position: 'middle', // 'top', 'middle', 'bottom'
  1976. // 可配置附加的布局方法
  1977. layout: [
  1978. // 柱形图数据标签位置自动调整
  1979. { type: 'interval-adjust-position' },
  1980. // 数据标签防遮挡
  1981. { type: 'interval-hide-overlap' },
  1982. // 数据标签文颜色自动调整
  1983. { type: 'adjust-color' },
  1984. ],
  1985. },
  1986. interactions: [{ type: 'element-highlight-by-x' }],
  1987. });
  1988. this.customerUnfllowMap.on('element:click',(v) => {
  1989. console.log(v);
  1990. if (v.data.data.datetype == this.unfllowTableParam.content.where.dateType) {
  1991. this.unfllowStatus = ''
  1992. this.unfllowTableParam.content.where.dateType = ''
  1993. } else {
  1994. this.unfllowStatus = v.data.data.datetype
  1995. this.unfllowTableParam.content.where.dateType = v.data.data.datetype
  1996. }
  1997. this.$refs.customerUnfllowTable.listData()
  1998. })
  1999. this.customerUnfllowMap.render()
  2000. } else {
  2001. this.customerUnfllowMap.changeData(this.customerUnfllowData.map)
  2002. }
  2003. },
  2004. renderStatistic(containerWidth, text, style) {
  2005. const textWidth = measureTextWidth(text, style);
  2006. const textHeight = style.lineHeight || style.fontSize
  2007. const R = containerWidth / 2;
  2008. // r^2 = (w / 2)^2 + (h - offsetY)^2
  2009. let scale = 1;
  2010. if (containerWidth < textWidth) {
  2011. scale = Math.min(Math.sqrt(Math.abs(Math.pow(R, 2) / (Math.pow(textWidth / 2, 2) + Math.pow(textHeight, 2)))), 1);
  2012. }
  2013. const textStyleStr = `width:${containerWidth}px;`;
  2014. return `<div style="${textStyleStr};font-size:${scale}em;line-height:${scale < 1 ? 1 : 'inherit'};">${text}</div>`;
  2015. },
  2016. createMenu (array) {
  2017. var that = this
  2018. let arr = []
  2019. function convertToElementTree(node) {
  2020. // 新节点
  2021. if (node.subdep.length === 0){
  2022. var elNode = {
  2023. label: node["depname"],
  2024. parentid:node['parentid'],
  2025. parentname:node['parentname'],
  2026. departmentid:node["departmentid"],
  2027. value:node["departmentid"],
  2028. remarks:node["remarks"],
  2029. isused:node["isused"],
  2030. changedate:node['changedate'],
  2031. changeby:node['changeby'],
  2032. createdate:node['createdate'],
  2033. createby:node['createby'],
  2034. depno:node['depno'],
  2035. disabled:that.pageOnlyRead,
  2036. }
  2037. }else {
  2038. var elNode = {
  2039. label: node["depname"],
  2040. parentid:node['parentid'],
  2041. parentname:node['parentname'],
  2042. departmentid:node["departmentid"],
  2043. value:node["departmentid"],
  2044. remarks:node["remarks"],
  2045. isused:node["isused"],
  2046. changedate:node['changedate'],
  2047. changeby:node['changeby'],
  2048. createdate:node['createdate'],
  2049. createby:node['createby'],
  2050. depno:node['depno'],
  2051. disabled:that.pageOnlyRead,
  2052. children: []
  2053. }
  2054. }
  2055. if (node.subdep && node.subdep.length > 0) {
  2056. // 如果存在子节点
  2057. for (var index = 0; index < node.subdep.length; index++) {
  2058. // 遍历子节点, 把每个子节点看做一颗独立的树, 传入递归构造子树, 并把结果放回到新node的children中
  2059. elNode.children.push(convertToElementTree(node.subdep[index]));
  2060. }
  2061. }
  2062. return elNode;
  2063. }
  2064. array.forEach((element) => {
  2065. arr.push(convertToElementTree(element))
  2066. });
  2067. return arr
  2068. },
  2069. selectDep (val) {
  2070. let id = val[val.length - 1]
  2071. if (val.length) {
  2072. this.typeMapParam.content.dataid = id
  2073. this.typeMapParam.content.type = 1
  2074. this.typeInit()
  2075. this.typeTableParam.content.dataid = id
  2076. this.typeTableParam.content.type = 1
  2077. this.typeTableParam.content.username = ''
  2078. this.$refs.typeTable.listData()
  2079. this.gradMapParam.content.dataid = id
  2080. this.gradMapParam.content.type = 1
  2081. this.gradInit()
  2082. this.gradTableParam.content.dataid = id
  2083. this.gradTableParam.content.type = 1
  2084. this.gradTableParam.content.username = ''
  2085. this.$refs.gradTable.listData()
  2086. this.scoreMapParam1.content.dataid = id
  2087. this.scoreMapParam1.content.type = 1
  2088. this.scoreInit()
  2089. this.scoreTableParam1.content.dataid = id
  2090. this.scoreTableParam1.content.type = 1
  2091. this.scoreTableParam1.content.username = ''
  2092. this.$refs.scoreTable.listData()
  2093. this.addParam.content.dataid = id
  2094. this.addParam.content.type = 1
  2095. this.addParam.content.username = ''
  2096. this.addFun()
  2097. this.baobeiParam.content.dataid = id
  2098. this.baobeiParam.content.type = 1
  2099. this.baobeiParam.content.username = ''
  2100. this.baojiaFun()
  2101. this.fllowParam.content.dataid = id
  2102. this.fllowParam.content.type = 1
  2103. this.fllowParam.content.username = ''
  2104. this.fllowFun()
  2105. this.baojiaParam.content.dataid = id
  2106. this.baojiaParam.content.type = 1
  2107. this.baojiaParam.content.username = ''
  2108. this.baojiaFun()
  2109. this.fllowMapParam.content.dataid = id
  2110. this.fllowMapParam.content.type = 1
  2111. this.fllowInit()
  2112. this.fllowTableParam.content.dataid = id
  2113. this.fllowTableParam.content.type = 1
  2114. this.fllowTableParam.content.username = ''
  2115. this.$refs.projectFllowTable.listData()
  2116. this.contactMapParam.content.dataid = id
  2117. this.contactMapParam.content.type = 1
  2118. this.contactInit()
  2119. this.contactTableParam.content.dataid = id
  2120. this.contactTableParam.content.type = 1
  2121. this.contactTableParam.content.username = ''
  2122. this.$refs.projectContactTable.listData()
  2123. this.customerMapParam.content.dataid = id
  2124. this.customerMapParam.content.type = 1
  2125. this.customerInit()
  2126. this.customerTableParam.content.dataid = id
  2127. this.customerTableParam.content.type = 1
  2128. this.customerTableParam.content.username = ''
  2129. this.$refs.projectCustomerTable.listData()
  2130. this.scoreMapParam.content.dataid = id
  2131. this.scoreMapParam.content.type = 1
  2132. this.scoreInit()
  2133. this.scoreTableParam.content.dataid = id
  2134. this.scoreTableParam.content.type = 1
  2135. this.scoreTableParam.content.username = ''
  2136. this.$refs.projectScoreTable.listData()
  2137. this.unfllowMapParam.content.dataid = id
  2138. this.unfllowMapParam.content.type = 1
  2139. this.customerUnfllowInit()
  2140. this.unfllowTableParam.content.dataid = id
  2141. this.unfllowTableParam.content.type = 1
  2142. this.unfllowTableParam.content.username = ''
  2143. this.$refs.customerUnfllowTable.listData()
  2144. this.dateParam.content.dataid = id
  2145. this.getDate()
  2146. } else {
  2147. let name = JSON.parse(sessionStorage.getItem('accountinfo')).name
  2148. this.typeMapParam.content.dataid = ''
  2149. this.typeMapParam.content.type = ''
  2150. this.typeInit()
  2151. this.typeTableParam.content.dataid = ''
  2152. this.typeTableParam.content.type = ''
  2153. this.typeTableParam.content.username = name
  2154. this.$refs.typeTable.listData()
  2155. this.gradMapParam.content.dataid = ''
  2156. this.gradMapParam.content.type = ''
  2157. this.gradInit()
  2158. this.gradTableParam.content.dataid = ''
  2159. this.gradTableParam.content.type = ''
  2160. this.gradTableParam.content.username = name
  2161. this.$refs.gradTable.listData()
  2162. this.scoreMapParam1.content.dataid = ''
  2163. this.scoreMapParam1.content.type = ''
  2164. this.scoreInit()
  2165. this.scoreTableParam1.content.dataid = ''
  2166. this.scoreTableParam1.content.type = ''
  2167. this.scoreTableParam1.content.username = name
  2168. this.$refs.scoreTable.listData()
  2169. this.addParam.content.dataid = ''
  2170. this.addParam.content.type = ''
  2171. this.addParam.content.username = name
  2172. this.addFun()
  2173. this.baobeiParam.content.dataid = ''
  2174. this.baobeiParam.content.type = ''
  2175. this.baobeiParam.content.username = name
  2176. this.baojiaFun()
  2177. this.fllowParam.content.dataid = ''
  2178. this.fllowParam.content.type = ''
  2179. this.fllowParam.content.username = name
  2180. this.fllowFun()
  2181. this.baojiaParam.content.dataid = ''
  2182. this.baojiaParam.content.type = ''
  2183. this.baojiaParam.content.username = name
  2184. this.baojiaFun()
  2185. this.fllowMapParam.content.dataid = ''
  2186. this.fllowMapParam.content.type = ''
  2187. this.fllowInit()
  2188. this.fllowTableParam.content.dataid = ''
  2189. this.fllowTableParam.content.type = ''
  2190. this.fllowTableParam.content.username = name
  2191. this.$refs.projectFllowTable.listData()
  2192. this.contactMapParam.content.dataid = ''
  2193. this.contactMapParam.content.type = ''
  2194. this.contactInit()
  2195. this.contactTableParam.content.dataid = ''
  2196. this.contactTableParam.content.type = ''
  2197. this.contactTableParam.content.username = name
  2198. this.$refs.projectContactTable.listData()
  2199. this.customerMapParam.content.dataid = ''
  2200. this.customerMapParam.content.type = ''
  2201. this.customerInit()
  2202. this.customerTableParam.content.dataid = ''
  2203. this.customerTableParam.content.type = ''
  2204. this.customerTableParam.content.username = name
  2205. this.$refs.projectCustomerTable.listData()
  2206. this.scoreMapParam.content.dataid = ''
  2207. this.scoreMapParam.content.type = ''
  2208. this.scoreInit()
  2209. this.scoreTableParam.content.dataid = ''
  2210. this.scoreTableParam.content.type = ''
  2211. this.scoreTableParam.content.username = name
  2212. this.$refs.projectScoreTable.listData()
  2213. this.unfllowMapParam.content.dataid = ''
  2214. this.unfllowMapParam.content.type = ''
  2215. this.customerUnfllowInit()
  2216. this.unfllowTableParam.content.dataid = ''
  2217. this.unfllowTableParam.content.type = ''
  2218. this.unfllowTableParam.content.username = name
  2219. this.$refs.customerUnfllowTable.listData()
  2220. this.dateParam.content.dataid = ''
  2221. this.getDate()
  2222. }
  2223. },
  2224. selectRow (data) {
  2225. this.projectname = data.projectname
  2226. this.dateParam.content.where.sa_projectid = data.sa_projectid
  2227. this.dateParam.content.type = ''
  2228. this.dateParam.content.dataid = ''
  2229. this.dateParam.content.where.projecttype = ''
  2230. this.dateParam.content.where.grade = ''
  2231. this.dateParam.content.where.tradefield = ''
  2232. this.getDate()
  2233. },
  2234. clearSelect () {
  2235. this.projectname=''
  2236. this.dateParam.content.where.sa_projectid=''
  2237. this.dateParam.content.where.projecttype = this.projectType.length ? this.projectType[0].value : ''
  2238. this.getDate()
  2239. },
  2240. handleUnfllowParam (param) {
  2241. console.log('触发',param,this.projectType);
  2242. param.content.where.projecttype = this.projectType.length ? this.projectType[0].value : ''
  2243. this.unfllowMapParam.content.where.projecttype = this.projectType.length ? this.projectType[0].value : ''
  2244. }
  2245. },
  2246. async mounted () {
  2247. this.departmentrtment()
  2248. this.getdataAll()
  2249. this.typeInit(true)
  2250. this.gradInit(true)
  2251. this.scoreInit(true)
  2252. this.addFun(true)
  2253. this.baobeiFun(true)
  2254. this.fllowFun(true)
  2255. this.baojiaFun(true)
  2256. this.fllowInit(true)
  2257. this.contactInit(true)
  2258. this.projectScoreInit(true)
  2259. this.customerInit(true)
  2260. this.customerUnfllowInit(true)
  2261. let baseWidth = 1920
  2262. document.querySelector('html').style.fontSize = `${100 / baseWidth}vw`
  2263. /* 获取项目类型 */
  2264. let res = await this.$store.dispatch('optiontypeselect','projecttype')
  2265. this.projectType = res.data
  2266. this.getDate(true)
  2267. /* 获取项目等级 */
  2268. let res2 = await this.$store.dispatch('optiontypeselect','projectgrade')
  2269. this.projectLead = res2.data
  2270. let res3 = await this.$store.dispatch('optiontypeselect','tradefield')
  2271. this.tradefieldSelect = res3.data
  2272. }
  2273. }
  2274. </script>
  2275. <style>
  2276. .basic__layout__panel {
  2277. height: 100% !important;
  2278. }
  2279. </style>
  2280. <style scoped>
  2281. *{
  2282. box-sizing: border-box;
  2283. }
  2284. .data-all {
  2285. padding: 24rem 20rem;
  2286. width: 100%;
  2287. border-radius: 5rem;
  2288. border: 1rem;
  2289. box-shadow: 0rem 2rem 5rem 0rem rgba(0, 0, 0, 0.15);
  2290. margin-top: 10rem;
  2291. }
  2292. .data-all .data-left {
  2293. border-right: 1rem solid rgb(136,136,146);
  2294. display: flex;
  2295. flex-wrap: wrap;
  2296. }
  2297. .data-all .data-right {
  2298. padding-left: 100rem;
  2299. display: flex;
  2300. flex-wrap: wrap;
  2301. }
  2302. .data-all .data-left,.data-right {
  2303. display: flex;
  2304. }
  2305. .data-all .data-item {
  2306. width: 186rem;
  2307. margin-bottom: 20px;
  2308. }
  2309. .data-all .data-item p:nth-child(1) {
  2310. font-size: 26px;
  2311. font-weight: 5px;
  2312. font-family: 'ArialMT', 'Arial', sans-serif;
  2313. color: rgba(0, 0, 0, 0.85);
  2314. }
  2315. .data-all .data-item p:nth-child(2) {
  2316. font-size: 14px;
  2317. font-weight: 5px;
  2318. font-family: 'PingFangSC-Regular', 'PingFang SC', sans-serif;
  2319. color: rgba(0, 0, 0, 0.65)
  2320. }
  2321. .data-all .data-all-wrapper {
  2322. display: flex;
  2323. }
  2324. .data-panel {
  2325. margin-top: 40px;
  2326. }
  2327. .data-panel .panel-header {
  2328. display: flex;
  2329. justify-content: space-between;
  2330. align-items: center;
  2331. margin-bottom: 10px;
  2332. }
  2333. .title {
  2334. min-width: 220px;
  2335. }
  2336. .title::before {
  2337. content:'';
  2338. border-left: 4px #3874f6 solid;
  2339. padding-right: 10px;
  2340. }
  2341. .panel-content {
  2342. display: flex;
  2343. align-items: center;
  2344. justify-content: space-between;
  2345. background:#ffffff;
  2346. }
  2347. .panel-content div:first-child {
  2348. padding: 0 5px;
  2349. }
  2350. .progress {
  2351. display: flex;
  2352. width: 100%;
  2353. padding: 40rem 100rem;
  2354. height: 50rem;
  2355. margin-bottom: 60rem;
  2356. }
  2357. .progress::after {
  2358. content:'';
  2359. display: block;
  2360. clear:both;
  2361. }
  2362. .progress .progress-item {
  2363. flex:var(--width);
  2364. min-width: 150rem;
  2365. height: 50rem;
  2366. position: relative;
  2367. background:var(--bg);
  2368. }
  2369. .progress .progress-item .day {
  2370. position: absolute;
  2371. top: -40rem;
  2372. left: 50%;
  2373. font-size: 14rem;
  2374. transform: translateX(-50%);
  2375. white-space: nowrap;
  2376. }
  2377. .progress .progress-item .start {
  2378. position: absolute;
  2379. left: 0;
  2380. bottom:-50rem;
  2381. transform: translateX(-50%);
  2382. }
  2383. .progress .progress-item .end {
  2384. position: absolute;
  2385. right:0;
  2386. bottom:-50rem;
  2387. transform: translateX(50%);
  2388. }
  2389. .progress .progress-item .start,.end {
  2390. display: flex;
  2391. flex-direction: column;
  2392. }
  2393. .progress .progress-item .start,.end span {
  2394. text-align: center;
  2395. }
  2396. .progress .progress-item .start span:first-child,.end span:first-child {
  2397. font-size: 14rem;
  2398. }
  2399. .progress .progress-item .start span:last-child,.end span:last-child {
  2400. margin-top: 10rem;
  2401. color: #aaaaaa;
  2402. font-size: 12rem;
  2403. }
  2404. .search__label {
  2405. margin-right: 5px !important;
  2406. }
  2407. .mt-10 {
  2408. margin-right: 16px !important;
  2409. }
  2410. .el-empty {
  2411. padding: 0 !important;
  2412. }
  2413. </style>