salesfunnel.vue 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149
  1. // 各模块文件存储占比
  2. <template>
  3. <div class="container normal-panel">
  4. <div class="inline-16" style="margin-top:0px;margin-bottom: 20px">
  5. <label class="search__label" >{{$t('部门') +':'}}</label>
  6. <el-cascader ref="selectdep" size="small" v-model="depment" :options="deplist" :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}" @change="selectDep" clearable></el-cascader>
  7. </div>
  8. <div class="inline-16">
  9. <label class="search__label" >{{$t('业务员' +':')}}</label>
  10. <el-select v-model="person" filterable :placeholder="$t('请选择')" size="small" clearable @change="selectPerson">
  11. <el-option
  12. v-for="item in personnelList"
  13. :key="item.index"
  14. :label="$t(item.name)"
  15. :value="item.userid">
  16. </el-option>
  17. </el-select>
  18. </div>
  19. <div class="inline-16">
  20. <p class="search__label">{{$t('状态') +':'}}</p>
  21. <el-select v-model="isleave" clearable style="margin-right:10px" size="small" :placeholder="$t('请选择状态')" @change="leaveChange" >
  22. <el-option :label="$t('在职')" value="1"></el-option>
  23. <el-option :label="$t('离职')" value="2"></el-option>
  24. </el-select>
  25. </div>
  26. <div class="inline-16">
  27. <p class="search__label">{{$t('领域') +':'}}</p>
  28. <el-select v-model="tradefield" clearable style="margin-right:10px" size="small" :placeholder="$t('请选择领域')" @change="dataParam.content.where.tradefield = tradefield;projectParam.content.where.tradefield = tradefield;getProportionOfFileModel()">
  29. <el-option v-for="item in tradefields" :label="$t(item.value)" :key="item.rowindex" :value="item.value">
  30. </el-option>
  31. </el-select>
  32. </div>
  33. <div>
  34. <el-row>
  35. <el-col :xs="15" :sm="15" :md="15" :lg="15" :xl="14">
  36. <div>
  37. <div class="title inline-16">
  38. {{$t(`销售漏斗图`)}}
  39. </div>
  40. <div class="inline-16">
  41. <el-checkbox v-model="unfinish" true-label="0" false-label="1" @change="dataParam.content.where.unfinish = unfinish;projectParam.content.where.unfinish = unfinish;getProportionOfFileModel()">{{$t(`包含失败、结案项目`)}}</el-checkbox>
  42. </div>
  43. <div class="inline-16" style="margin-top:0px;margin-bottom: 20px">
  44. <el-button-group>
  45. <el-button size="small" :type="dataParam.content.dateType==99?'primary':''" @click="dataChange(99)">{{$t(`全部`)}}</el-button>
  46. <el-button size="small" :type="dataParam.content.dateType==1?'primary':''" @click="dataChange(1)">{{$t(`近一年`)}}</el-button>
  47. <el-button size="small" :type="dataParam.content.dateType==2?'primary':''" @click="dataChange(2)">{{$t(`近九个月`)}}</el-button>
  48. <el-button size="small" :type="dataParam.content.dateType==3?'primary':''" @click="dataChange(3)">{{$t(`近六个月`)}}</el-button>
  49. <el-button size="small" :type="dataParam.content.dateType==4?'primary':''" @click="dataChange(4)">{{$t(`近三个月`)}}</el-button>
  50. </el-button-group>
  51. </div>
  52. <div class="inline-16" style="margin-top:0px;margin-bottom: 20px">
  53. <el-date-picker
  54. size="small"
  55. v-model="dateSelect"
  56. @change="dateChange"
  57. type="daterange"
  58. :clearable="false"
  59. format="yyyy-MM-dd"
  60. value-format="yyyy-MM-dd"
  61. :range-separator="$t('至')"
  62. :start-placeholder="$t('开始日期')"
  63. :end-placeholder="$t('结束日期')">
  64. </el-date-picker>
  65. </div>
  66. </div>
  67. <div class="re-panel">
  68. <div id="containerFunnel" style="height: calc(60vh)"></div>
  69. </div>
  70. </el-col>
  71. <el-col :offset="1" :xs="8" :sm="8" :md="8" :lg="8" :xl="9">
  72. <div>
  73. <p class="title">{{$t(`表格数据`)}}</p>
  74. <tableNewTemp :layout="tablecolsData" :data="tableData" :opwidth="200" :custom="true" :headerOptions="['signamount_due','dealamount']">
  75. <template v-slot:header="scope">
  76. <div v-if="scope.column.columnname == 'signamount_due'">
  77. <p>{{$t(`预计签约`)}}</p>
  78. <p>{{$t(`金额(万元)`)}}</p>
  79. </div>
  80. <div v-if="scope.column.columnname == 'dealamount'">
  81. <p>{{$t(`项目成交`)}}</p>
  82. <p>{{$t(`金额(万元)`)}}</p>
  83. </div>
  84. </template>
  85. <template v-slot:customcol="scope">
  86. <div>
  87. {{scope.column.data[[scope.column.columnname]]?scope.column.data[[scope.column.columnname]]:'--'}}
  88. </div>
  89. </template>
  90. </tableNewTemp>
  91. </div>
  92. </el-col>
  93. </el-row>
  94. </div>
  95. <div v-if="siteid == 'HY' || siteid == 'YOSTEST1'">
  96. <p class="title">{{$t(`项目预计成交分析`)}}</p>
  97. <previousTwelveMonths :data="previousData"></previousTwelveMonths>
  98. <futureTwelveMonths ref="futureTwelveMonthsRef" style="margin-top: 15px" @selectStage="selectStage" :dataBoxData="dataBoxData" @clickChart="clickChart" @onCheck="onCheck"></futureTwelveMonths>
  99. </div>
  100. <div style="margin-top: 40px">
  101. <div style="display: flex;justify-content: space-between">
  102. <p class="title">
  103. {{projectTile}}
  104. <el-button style="margin-left: 15px" type="text" size="mini" v-if="siteid == 'HY' || siteid == 'YOSTEST1'" @click="restBtn">{{$t(`重置`)}}</el-button>
  105. </p>
  106. <exportFile :param="siteid == 'HY' || siteid == 'YOSTEST1'?transactionParam:projectParam" :columns="tablecols" :fileName="projectTile"></exportFile>
  107. </div>
  108. <tableTemp :layout="tablecols" :data="projectList" :opwidth="200" :custom="true" :height="tableHieght">
  109. <template v-slot:customcol="scope">
  110. <div v-if="scope.column.columnname === 'status'">
  111. <span :style="{color:scope.column.data[[scope.column.columnname]] == '跟进中'?'#52c41a':tool.getStatusColor(scope.column.data[[scope.column.columnname]],true)}" >{{$t(scope.column.data[[scope.column.columnname]])}}</span>
  112. </div>
  113. <div v-else-if="scope.column.columnname === 'tag_sys'">
  114. <div v-for="item in scope.column.data.tag_sys" :key="item.index" style="float: left;margin-left: 5px;margin-bottom: 5px">
  115. <el-tag color="#3874F6" size="mini" type="primary" effect="dark">
  116. <span>{{$t(item)}}</span>
  117. </el-tag>
  118. </div>
  119. <div v-for="item in scope.column.data.tag" :key="item.index" style="float: left;margin-left: 5px;margin-bottom: 5px">
  120. <el-tag color="#FA8C16" size="mini" type="warning" effect="dark">
  121. <span>{{$t(item)}}</span>
  122. </el-tag>
  123. </div>
  124. </div>
  125. <div v-else-if="scope.column.columnname === 'leader'">
  126. {{scope.data.column.leader[0] && scope.data.column.data.leader[0].name}}
  127. </div>
  128. <div v-else-if="scope.column.columnname === 'projecttype'">
  129. {{scope.column.data.projecttype + '-' + scope.column.data.projecttype_remarks}}
  130. </div>
  131. <div v-else-if="scope.column.columnname == 'totalinvestment'">
  132. <span>{{scope.column.data[[scope.column.columnname]] ?tool.formatAmount(scope.column.data[[scope.column.columnname]],2):'--'}}</span>
  133. </div>
  134. <div v-else-if="scope.column.columnname == 'costofconstruction'">
  135. <span>{{scope.column.data[[scope.column.columnname]] ?tool.formatAmount(scope.column.data[[scope.column.columnname]],2):'--'}}</span>
  136. </div>
  137. <div v-else-if="scope.column.columnname == 'budgetary'">
  138. <span>{{scope.column.data[[scope.column.columnname]] ?tool.formatAmount(scope.column.data[[scope.column.columnname]],2):'--'}}</span>
  139. </div>
  140. <div v-else-if="scope.column.columnname == 'signamount_due'">
  141. <span>{{scope.column.data[[scope.column.columnname]] ?tool.formatAmount(scope.column.data[[scope.column.columnname]],2):'--'}}</span>
  142. </div>
  143. <div v-else-if="scope.column.columnname == 'dealamount'">
  144. <span>{{scope.column.data[[scope.column.columnname]] ?tool.formatAmount(scope.column.data[[scope.column.columnname]],2):'--'}}</span>
  145. </div>
  146. <div v-else-if="scope.column.columnname == 'begdate_due'">
  147. <span>{{scope.column.data[[scope.column.columnname]] ? scope.column.data[[scope.column.columnname]] !== 'NaN-NaN'?scope.column.data[[scope.column.columnname]]:'--' :'--'}}</span>
  148. </div>
  149. <div v-else-if="scope.column.columnname == 'enddate_due'">
  150. <span>{{scope.column.data[[scope.column.columnname]] ? scope.column.data[[scope.column.columnname]] !== 'NaN-NaN'?scope.column.data[[scope.column.columnname]]:'--' :'--'}}</span>
  151. </div>
  152. <div v-else-if="scope.column.columnname == 'scale'">
  153. <span>{{scope.column.data[[scope.column.columnname]]?scope.column.data[[scope.column.columnname]] + scope.column.data.unitname:'--'}}</span>
  154. </div>
  155. <div v-else-if="scope.column.columnname == 'address'">
  156. <span>{{scope.column.data.province?scope.column.data.province + scope.column.data.city + scope.column.data.county + scope.column.data[[scope.column.columnname]]:'--'}}</span>
  157. </div>
  158. <div v-else-if="scope.column.columnname == 'projectname'">
  159. <el-button size="mini" type="text" @click="goDetail(scope.column.data)">{{scope.column.data[[scope.column.columnname]]}}</el-button>
  160. </div>
  161. <div v-else>
  162. {{scope.column.data[[scope.column.columnname]]?scope.column.data[[scope.column.columnname]]:'--'}}
  163. </div>
  164. </template>
  165. </tableTemp>
  166. <div style="text-align:right;margin-top: 10px">
  167. <el-pagination
  168. background
  169. @size-change="handleSizeChange"
  170. @current-change="handleCurrentChange"
  171. :current-page="siteid == 'HY' || siteid == 'YOSTEST1'?transactionParam.content.pageNumber:projectParam.content.pageNumber"
  172. :page-sizes="[20,50,100,150]"
  173. :page-size="20"
  174. layout="total,sizes, prev, pager, next, jumper"
  175. :total="total">
  176. </el-pagination>
  177. </div>
  178. </div>
  179. </div>
  180. </template>
  181. <script>
  182. import tableTemp from '@/components/table/index8'
  183. import tableNewTemp from '@/components/table/index10'
  184. import { Funnel,G2 } from '@antv/g2plot';
  185. const G = G2.getEngine('canvas');
  186. import chartTemplate from '@/template/chartG2Template/Column'
  187. import previousTwelveMonths from './previousTwelveMonths'
  188. import futureTwelveMonths from './futureTwelveMonths'
  189. import exportFile from '@/components/export_file/index5'
  190. export default {
  191. components:{tableTemp,tableNewTemp,chartTemplate,previousTwelveMonths,futureTwelveMonths,exportFile},
  192. data () {
  193. return {
  194. chartPie:null,
  195. flagIndex:'',
  196. /*tableHieght:'calc(100vh)',*/
  197. tableHieght:'857px',
  198. tableData:[],
  199. person:'',
  200. depment:'',
  201. dateType:"",
  202. projectTile:"",
  203. fullscreenLoading:false,
  204. total:0,
  205. sa_projstagemagid:'',
  206. data:[{ stagename: '简历筛选', sequence1: 253 },],
  207. activeName: '部门',
  208. dataid:'',
  209. range:'',
  210. pointValue:'',
  211. isDep:false,
  212. isPerson:false,
  213. visible:false,
  214. deplist:[],
  215. personnelList:[],
  216. projectList:[],
  217. tablecols:[],
  218. tablecolsData:[],
  219. depmentParam:{
  220. "id": 20230620102004,
  221. "content": {
  222. "isleave":'1',
  223. "depid":''
  224. }
  225. },
  226. dataParam:{
  227. "id": 20230630151504,
  228. "content": {
  229. "type":0, // 0 按人搜素 1 按部门搜索
  230. "dataid":0, // 人员id或部门id
  231. 'dateType':99,
  232. "where": {
  233. "begindate": "",
  234. "begdate":"",
  235. "enddate":"",
  236. "departmentid":"",
  237. "tradefield":"",
  238. "isleave":"1",
  239. "unfinish":'1'
  240. }
  241. }
  242. },
  243. projectParam:{
  244. "id": 20230719085004,
  245. "content": {
  246. "pageNumber": 1,
  247. "pageSize": 20,
  248. "type": '',
  249. "dataid": '',
  250. "dateType": 99,
  251. "sa_projstagemagid":'',
  252. "where": {
  253. "begdate":"",
  254. "enddate":"",
  255. "tradefield":"",
  256. "isleave":"1",
  257. "unfinish":'1'
  258. }
  259. }
  260. },
  261. dateSelect:[],
  262. tradefield:'',
  263. isleave:'1',
  264. tradefields:[],
  265. unfinish:'1',
  266. siteid:JSON.parse(sessionStorage.getItem('active_account')).siteid,
  267. previousData:[],
  268. futreData:[],
  269. transactionParam:{
  270. "id": 20241028162104,
  271. "content": {
  272. "type": "0",
  273. "dataid": "0",
  274. "stagename":[],
  275. "signdate_due":'',
  276. "pageNumber": 1,
  277. "pageSize": 20,
  278. "where": {
  279. "tradefield": "",
  280. "isleave":"",
  281. "unfinish":'1'
  282. }
  283. }
  284. },
  285. dataBoxData:[]
  286. }
  287. },
  288. methods:{
  289. async departmentrtment() {
  290. const res = await this.$api.requested(this.depmentParam)
  291. this.deplist = this.createMenu(res.data.dep)
  292. this.personnelList = res.data.hr
  293. this.person = JSON.parse(window.sessionStorage.getItem('active_account')).name
  294. this.depmentParam.content.depid = res.data.dep[0].departmentid
  295. // this.personData()
  296. this.getProportion()
  297. },
  298. async getProportion () {
  299. const res = await this.$api.requested(this.dataParam)
  300. this.tableData = res.data
  301. sessionStorage.setItem('flagIndex',res.data.length)
  302. if (this.siteid == 'HY' || this.siteid == 'YOSTEST1'){
  303. this.expectedTransaction(true)
  304. }
  305. this.renderPie()
  306. },
  307. async personData(){
  308. const res = await this.$api.requested(this.depmentParam)
  309. this.personnelList = res.data.hr
  310. },
  311. leaveChange(){
  312. this.person = ''
  313. if (this.isleave){
  314. this.dataParam.content.where.isleave = this.isleave
  315. this.dataParam.content.dataid = this.dataParam.content.type == 0?-1:this.dataParam.content.dataid
  316. this.projectParam.content.where.isleave = this.isleave
  317. this.projectParam.content.dataid = this.projectParam.content.type == 0?-1:this.projectParam.content.dataid
  318. this.depmentParam.content.isleave = this.isleave
  319. this.personData()
  320. this.getProportionOfFileModel()
  321. }else {
  322. this.dataParam.content.where.isleave = 0
  323. this.dataParam.content.dataid = this.dataParam.content.type == 0?-1:this.dataParam.content.dataid
  324. this.projectParam.content.where.isleave = 0
  325. this.projectParam.content.dataid = this.projectParam.content.type == 0?-1:this.projectParam.content.dataid
  326. this.depmentParam.content.isleave = 0
  327. this.personData()
  328. this.getProportionOfFileModel()
  329. }
  330. },
  331. createMenu (array) {
  332. var that = this
  333. let arr = []
  334. function convertToElementTree(node) {
  335. // 新节点
  336. if (node.subdep.length === 0){
  337. var elNode = {
  338. label: node["depname"],
  339. parentid:node['parentid'],
  340. parentname:node['parentname'],
  341. departmentid:node["departmentid"],
  342. value:node["departmentid"],
  343. remarks:node["remarks"],
  344. isused:node["isused"],
  345. changedate:node['changedate'],
  346. changeby:node['changeby'],
  347. createdate:node['createdate'],
  348. createby:node['createby'],
  349. depno:node['depno'],
  350. disabled:that.pageOnlyRead,
  351. }
  352. }else {
  353. var elNode = {
  354. label: node["depname"],
  355. parentid:node['parentid'],
  356. parentname:node['parentname'],
  357. departmentid:node["departmentid"],
  358. value:node["departmentid"],
  359. remarks:node["remarks"],
  360. isused:node["isused"],
  361. changedate:node['changedate'],
  362. changeby:node['changeby'],
  363. createdate:node['createdate'],
  364. createby:node['createby'],
  365. depno:node['depno'],
  366. disabled:that.pageOnlyRead,
  367. children: []
  368. }
  369. }
  370. if (node.subdep && node.subdep.length > 0) {
  371. // 如果存在子节点
  372. for (var index = 0; index < node.subdep.length; index++) {
  373. // 遍历子节点, 把每个子节点看做一颗独立的树, 传入递归构造子树, 并把结果放回到新node的children中
  374. elNode.children.push(convertToElementTree(node.subdep[index]));
  375. }
  376. }
  377. return elNode;
  378. }
  379. array.forEach((element) => {
  380. arr.push(convertToElementTree(element))
  381. });
  382. return arr
  383. },
  384. selectDep(val) {
  385. this.person = ''
  386. this.dataParam.content.type = 1
  387. this.dataParam.content.dataid = val[val.length -1] ? val[val.length -1] : -1
  388. this.depmentParam.content.depid = val[val.length -1] ? val[val.length -1] : -1
  389. this.personData()
  390. this.getProportionOfFileModel()
  391. },
  392. selectPerson(val){
  393. // this.depment = ''
  394. if (val || this.depment[this.depment.length -1]){
  395. this.dataParam.content.type = val ? 0 : 1
  396. this.dataParam.content.dataid = val ? val : this.depment[this.depment.length -1]
  397. }else {
  398. this.dataParam.content.type = 0
  399. this.dataParam.content.dataid = -1
  400. }
  401. this.getProportionOfFileModel()
  402. },
  403. dataChange(val){
  404. this.dataParam.content.dateType = val
  405. this.projectParam.content.dateType = val
  406. if (val == '1'){
  407. let currentDate = new Date(); // 获取当前日期
  408. let startDate = new Date(currentDate.getFullYear() - 1, currentDate.getMonth(), currentDate.getDate() + 1); // 计算起始日期
  409. let endDate = currentDate; // 结束日期为当前日期
  410. this.dateSelect = [startDate.toISOString().split('T')[0],endDate.toISOString().split('T')[0]]
  411. }else if (val == '2'){
  412. let currentDate = new Date(); // 获取当前日期
  413. let startDate = new Date(currentDate.getFullYear(), currentDate.getMonth() - 9, currentDate.getDate() + 1); // 计算起始日期
  414. let endDate = currentDate; // 结束日期为当前日期
  415. this.dateSelect = [startDate.toISOString().split('T')[0],endDate.toISOString().split('T')[0]]
  416. }else if (val == '3'){
  417. let currentDate = new Date(); // 获取当前日期
  418. let startDate = new Date(currentDate.getFullYear(), currentDate.getMonth() - 6, currentDate.getDate() + 1); // 计算起始日期
  419. let endDate = currentDate; // 结束日期为当前日期
  420. this.dateSelect = [startDate.toISOString().split('T')[0],endDate.toISOString().split('T')[0]]
  421. }else if (val == '4'){
  422. let currentDate = new Date(); // 获取当前日期
  423. let startDate = new Date(currentDate.getFullYear(), currentDate.getMonth() - 3, currentDate.getDate() + 1); // 计算起始日期
  424. let endDate = currentDate; // 结束日期为当前日期
  425. this.dateSelect = [startDate.toISOString().split('T')[0],endDate.toISOString().split('T')[0]]
  426. }else if (val == '99'){
  427. this.dateSelect = []
  428. }
  429. this.getProportionOfFileModel()
  430. },
  431. dateSet(val){
  432. if (val == '1'){
  433. let currentDate = new Date(); // 获取当前日期
  434. let startDate = new Date(currentDate.getFullYear() - 1, currentDate.getMonth(), currentDate.getDate() + 1); // 计算起始日期
  435. let endDate = currentDate; // 结束日期为当前日期
  436. this.dateSelect = [startDate.toISOString().split('T')[0],endDate.toISOString().split('T')[0]]
  437. }else if (val == '2'){
  438. let currentDate = new Date(); // 获取当前日期
  439. let startDate = new Date(currentDate.getFullYear(), currentDate.getMonth() - 9, currentDate.getDate() + 1); // 计算起始日期
  440. let endDate = currentDate; // 结束日期为当前日期
  441. this.dateSelect = [startDate.toISOString().split('T')[0],endDate.toISOString().split('T')[0]]
  442. }else if (val == '3'){
  443. let currentDate = new Date(); // 获取当前日期
  444. let startDate = new Date(currentDate.getFullYear(), currentDate.getMonth() - 6, currentDate.getDate() + 1); // 计算起始日期
  445. let endDate = currentDate; // 结束日期为当前日期
  446. this.dateSelect = [startDate.toISOString().split('T')[0],endDate.toISOString().split('T')[0]]
  447. }else if (val == '4'){
  448. let currentDate = new Date(); // 获取当前日期
  449. let startDate = new Date(currentDate.getFullYear(), currentDate.getMonth() - 3, currentDate.getDate() + 1); // 计算起始日期
  450. let endDate = currentDate; // 结束日期为当前日期
  451. this.dateSelect = [startDate.toISOString().split('T')[0],endDate.toISOString().split('T')[0]]
  452. }else if (val == '99'){
  453. this.dateSelect = []
  454. }
  455. },
  456. dateChange(){
  457. this.dataParam.content.dateType = 0
  458. this.dataParam.content.where.begdate = this.dateSelect[0]
  459. this.dataParam.content.where.enddate = this.dateSelect[1]
  460. this.projectParam.content.dateType = 0
  461. this.projectParam.content.where.begdate = this.dateSelect[0]
  462. this.projectParam.content.where.enddate = this.dateSelect[1]
  463. this.getProportionOfFileModel()
  464. },
  465. renderPie() {
  466. if (JSON.parse(sessionStorage.getItem('flagIndex')) === 7){
  467. const colorArray = ['#6395fa','#63daab','#657798','#f7c122','#7666fa','#75cbed'];
  468. this.chartPie = new Funnel('containerFunnel', {
  469. data: this.tableData,
  470. maxSize:0.6,
  471. xField: 'stagename',
  472. yField: 'wide',
  473. shape: 'funnel',
  474. dynamicHeight: false,
  475. legend: false,
  476. interactions: [{ type: 'element-active'}],
  477. color:['#6395fa','#63daab','#657798','#f7c122','#7666fa','#75cbed','#fff'],
  478. label: {
  479. layout:"fixedOverlap",
  480. position:'right',
  481. offsetX:40,
  482. content:(datum)=>{
  483. const group = new G.Group({});
  484. const content = ()=>{
  485. if (this.tableData[0]) {
  486. const text = `${datum.stagename} 项目总数: ${datum.sequence1} 当前项目数: ${datum.projectqty} 转化率: ${datum.zhl?Math.round((datum.zhl* 100)*100)/100 + '%':'--'} 预计签约金额: ${datum.signamount_due}万元 项目成交金额: ${datum.dealamount}万元`
  487. const lines = text.split(' ');
  488. return lines.join('\n');
  489. }
  490. };
  491. const color = ()=>{
  492. let clr = ''
  493. this.tableData.some((e,index) =>{
  494. if (e.stagename == datum.stagename) {
  495. clr = colorArray[index]
  496. }
  497. })
  498. if (clr == '' || clr == undefined) {
  499. clr= '#ffffff'
  500. }
  501. return clr
  502. };
  503. group.addShape({
  504. type: 'text',
  505. attrs: {
  506. x: 40,
  507. y: 0,
  508. text: content(),
  509. textAlign: 'left',
  510. fontSize: 14,
  511. textBaseline: 'top',
  512. fill: color()
  513. },
  514. });
  515. return group;
  516. },
  517. },
  518. tooltip:{
  519. customContent: (title, items) => {
  520. // 构建自定义内容
  521. const content = `<div>
  522. <ul style="padding:10px;">
  523. ${items.map((item) => `
  524. <li>
  525. <p style="margin-bottom:10px">${title}</p>
  526. <p>项目总数:${item.data.projectqty}</p>
  527. </li>`).join('')}
  528. </ul>
  529. </div>`;
  530. return content;
  531. },
  532. },
  533. conversionTag: false,
  534. funnelStyle: {
  535. stroke: '#fff',
  536. lineWidth: 3,
  537. },
  538. });
  539. this.chartPie.render();
  540. if (this.siteid != 'HY' && this.siteid != 'YOSTEST1'){
  541. document.addEventListener('click',(evt) => {
  542. const states = this.chartPie.getStates();
  543. let dataList = []
  544. dataList = states
  545. if (dataList.length > 0){
  546. this.projectTile = dataList[0].data.stagename
  547. this.sa_projstagemagid = dataList[0].data.sa_projstagemagid
  548. this.projectParam.content.pageNumber = 1
  549. this.projectParam.content.pageSize = 20
  550. this.getProjectList()
  551. }
  552. })
  553. }
  554. this.getProportionOfFileModel()
  555. }else if(JSON.parse(sessionStorage.getItem('flagIndex')) === 8){
  556. const colorArray = ['#6395fa','#63daab','#657798','#f7c122','#7666fa','#75cbed','#6FD26C'];
  557. this.chartPie = new Funnel('containerFunnel', {
  558. data: this.tableData,
  559. maxSize:0.6,
  560. xField: 'stagename',
  561. yField: 'wide',
  562. shape: 'funnel',
  563. dynamicHeight: false,
  564. legend: false,
  565. interactions: [{ type: 'element-active'}],
  566. color:['#6395fa','#63daab','#657798','#f7c122','#7666fa','#75cbed','#6FD26C','#fff'],
  567. label: {
  568. layout:"fixedOverlap",
  569. position:'right',
  570. offsetX:40,
  571. content:(datum)=>{
  572. const group = new G.Group({});
  573. const content = ()=>{
  574. if (this.tableData[0]) {
  575. const text = `${datum.stagename} 项目总数: ${datum.sequence1} 当前项目数: ${datum.projectqty} 转化率: ${datum.zhl?Math.round((datum.zhl* 100)*100)/100 + '%':'--'} 预计签约金额: ${datum.signamount_due}万元 项目成交金额: ${datum.dealamount}万元`
  576. const lines = text.split(' ');
  577. return lines.join('\n');
  578. }
  579. };
  580. const color = ()=>{
  581. let clr = ''
  582. this.tableData.some((e,index) =>{
  583. if (e.stagename == datum.stagename) {
  584. clr = colorArray[index]
  585. }
  586. })
  587. if (clr == '' || clr == undefined) {
  588. clr= '#ffffff'
  589. }
  590. return clr
  591. };
  592. group.addShape({
  593. type: 'text',
  594. attrs: {
  595. x: 40,
  596. y: 0,
  597. text: content(),
  598. textAlign: 'left',
  599. fontSize: 14,
  600. textBaseline: 'top',
  601. fill: color()
  602. },
  603. });
  604. return group;
  605. },
  606. },
  607. tooltip:{
  608. customContent: (title, items) => {
  609. // 构建自定义内容
  610. const content = `<div>
  611. <ul style="padding:10px;">
  612. ${items.map((item) => `
  613. <li>
  614. <p style="margin-bottom:10px">${title}</p>
  615. <p>项目总数:${item.data.projectqty}</p>
  616. </li>`).join('')}
  617. </ul>
  618. </div>`;
  619. return content;
  620. },
  621. },
  622. conversionTag: false,
  623. funnelStyle: {
  624. stroke: '#fff',
  625. lineWidth: 3,
  626. },
  627. });
  628. this.chartPie.render();
  629. if (this.siteid != 'HY' && this.siteid != 'YOSTEST1'){
  630. document.addEventListener('click',(evt) => {
  631. const states = this.chartPie.getStates();
  632. let dataList = []
  633. dataList = states
  634. if (dataList.length > 0){
  635. this.projectTile = dataList[0].data.stagename
  636. this.sa_projstagemagid = dataList[0].data.sa_projstagemagid
  637. this.projectParam.content.pageNumber = 1
  638. this.projectParam.content.pageSize = 20
  639. this.getProjectList()
  640. }
  641. })
  642. }
  643. this.getProportionOfFileModel()
  644. }else if(JSON.parse(sessionStorage.getItem('flagIndex')) === 6){
  645. const colorArray = ['#6395fa','#63daab','#657798','#f7c122','#7666fa'];
  646. this.chartPie = new Funnel('containerFunnel', {
  647. data: this.tableData,
  648. maxSize:0.6,
  649. xField: 'stagename',
  650. yField: 'wide',
  651. shape: 'funnel',
  652. dynamicHeight: false,
  653. legend: false,
  654. interactions: [{ type: 'element-active'}],
  655. color:['#6395fa','#63daab','#657798','#f7c122','#7666fa','#fff'],
  656. label: {
  657. layout:"fixedOverlap",
  658. position:'right',
  659. offsetX:40,
  660. content:(datum)=>{
  661. const group = new G.Group({});
  662. const content = ()=>{
  663. if (this.tableData[0]) {
  664. const text = `${datum.stagename} 项目总数: ${datum.sequence1} 当前项目数: ${datum.projectqty} 转化率: ${datum.zhl?Math.round((datum.zhl* 100)*100)/100 + '%':'--'} 预计签约金额: ${datum.signamount_due}万元 项目成交金额: ${datum.dealamount}万元`
  665. const lines = text.split(' ');
  666. return lines.join('\n');
  667. }
  668. };
  669. const color = ()=>{
  670. let clr = ''
  671. this.tableData.some((e,index) =>{
  672. if (e.stagename == datum.stagename) {
  673. clr = colorArray[index]
  674. }
  675. })
  676. if (clr == '' || clr == undefined) {
  677. clr= '#ffffff'
  678. }
  679. return clr
  680. };
  681. group.addShape({
  682. type: 'text',
  683. attrs: {
  684. x: 40,
  685. y: 0,
  686. text: content(),
  687. textAlign: 'left',
  688. fontSize: 14,
  689. textBaseline: 'top',
  690. fill: color()
  691. },
  692. });
  693. return group;
  694. },
  695. },
  696. tooltip:{
  697. customContent: (title, items) => {
  698. // 构建自定义内容
  699. const content = `<div>
  700. <ul style="padding:10px;">
  701. ${items.map((item) => `
  702. <li>
  703. <p style="margin-bottom:10px">${title}</p>
  704. <p>项目总数:${item.data.projectqty}</p>
  705. </li>`).join('')}
  706. </ul>
  707. </div>`;
  708. return content;
  709. },
  710. },
  711. conversionTag: false,
  712. funnelStyle: {
  713. stroke: '#fff',
  714. lineWidth: 3,
  715. },
  716. });
  717. this.chartPie.render();
  718. if (this.siteid != 'HY' && this.siteid != 'YOSTEST1'){
  719. document.addEventListener('click',(evt) => {
  720. const states = this.chartPie.getStates();
  721. let dataList = []
  722. dataList = states
  723. if (dataList.length > 0){
  724. this.projectTile = dataList[0].data.stagename
  725. this.sa_projstagemagid = dataList[0].data.sa_projstagemagid
  726. this.projectParam.content.pageNumber = 1
  727. this.projectParam.content.pageSize = 20
  728. this.getProjectList()
  729. }
  730. })
  731. }
  732. this.getProportionOfFileModel()
  733. } else {
  734. /*const colorArray = ['#6395fa','#63daab','#657798','#f7c122','#7666fa','#75cbed','#6FD26C','#DFC064'];*/
  735. const colorArray = ['#6395fa','#63daab','#657798','#f7c122','#7666fa','#75cbed','#6FD26C','#DFC064'];
  736. this.chartPie = new Funnel('containerFunnel', {
  737. data: this.tableData,
  738. maxSize:0.6,
  739. xField: 'stagename',
  740. yField: 'wide',
  741. shape: 'funnel',
  742. dynamicHeight: false,
  743. legend: false,
  744. interactions: [{ type: 'element-active'}],
  745. color:['#6395fa','#63daab','#657798','#f7c122','#7666fa','#75cbed','#6FD26C','#DFC064','#fff'],
  746. label: {
  747. layout:"fixedOverlap",
  748. position:'right',
  749. offsetX:40,
  750. content:(datum)=>{
  751. const group = new G.Group({});
  752. const content = ()=>{
  753. if (this.tableData[0]) {
  754. const text = `${datum.stagename} 项目总数: ${datum.sequence1} 当前项目数: ${datum.projectqty} 转化率: ${datum.zhl?Math.round((datum.zhl* 100)*100)/100 + '%':'--'} 预计签约金额: ${datum.signamount_due}万元 项目成交金额: ${datum.dealamount}万元`
  755. const lines = text.split(' ');
  756. return lines.join('\n');
  757. }
  758. };
  759. const color = ()=>{
  760. let clr = ''
  761. this.tableData.some((e,index) =>{
  762. if (e.stagename == datum.stagename) {
  763. clr = colorArray[index]
  764. }
  765. })
  766. if (clr == '' || clr == undefined) {
  767. clr= '#ffffff'
  768. }
  769. return clr
  770. };
  771. group.addShape({
  772. type: 'text',
  773. attrs: {
  774. x: 40,
  775. y: 0,
  776. text: content(),
  777. textAlign: 'left',
  778. fontSize: 14,
  779. textBaseline: 'top',
  780. fill: color()
  781. },
  782. });
  783. return group;
  784. },
  785. },
  786. tooltip:{
  787. customContent: (title, items) => {
  788. // 构建自定义内容
  789. const content = `<div>
  790. <ul style="padding:10px;">
  791. ${items.map((item) => `
  792. <li>
  793. <p style="margin-bottom:10px">${title}</p>
  794. <p>项目总数:${item.data.projectqty}</p>
  795. </li>`).join('')}
  796. </ul>
  797. </div>`;
  798. return content;
  799. },
  800. },
  801. conversionTag: false,
  802. funnelStyle: {
  803. stroke: '#fff',
  804. lineWidth: 3,
  805. },
  806. });
  807. this.chartPie.render();
  808. if (this.siteid != 'HY' && this.siteid != 'YOSTEST1'){
  809. document.addEventListener('click',(evt) => {
  810. const states = this.chartPie.getStates();
  811. let dataList = []
  812. dataList = states
  813. if (dataList.length > 0 && dataList[0].data.stagename !== ''){
  814. this.projectTile = dataList[0].data.stagename
  815. this.sa_projstagemagid = dataList[0].data.sa_projstagemagid
  816. this.projectParam.content.pageNumber = 1
  817. this.projectParam.content.pageSize = 20
  818. this.getProjectList()
  819. }
  820. })
  821. }
  822. this.getProportionOfFileModel()
  823. }
  824. },
  825. async getProportionOfFileModel () {
  826. const res = await this.$api.requested(this.dataParam)
  827. this.tableData = res.data
  828. let dataList = []
  829. dataList = res.data
  830. this.sa_projstagemagid = dataList[0].sa_projstagemagid
  831. this.projectTile = dataList[0].stagename
  832. this.projectParam.content.pageNumber = 1
  833. this.projectParam.content.pageSize = 20
  834. sessionStorage.setItem('flagIndex',dataList.length)
  835. this.flagIndex = dataList.length
  836. this.chartPie.changeData(res.data)
  837. dataList.splice(dataList.length-1)
  838. if (this.siteid == 'HY' || this.siteid == 'YOSTEST1'){
  839. this.expectedTransaction(false)
  840. }else {
  841. this.getProjectList()
  842. }
  843. },
  844. async getProjectList(){
  845. this.projectParam.content.type = this.dataParam.content.type
  846. this.projectParam.content.dataid = this.dataParam.content.dataid
  847. /*this.projectParam.content.dateType = this.dataParam.content.dateType*/
  848. this.projectParam.content.sa_projstagemagid = this.sa_projstagemagid
  849. const res = await this.$api.requested(this.projectParam)
  850. this.projectList = res.data
  851. this.total = res.total
  852. },
  853. handleSizeChange(val) {
  854. // console.log(`每页 ${val} 条`);
  855. if (this.siteid == 'HY' || this.siteid == 'YOSTEST1'){
  856. this.transactionParam.content.pageSize = val
  857. this.queryProject(this.transactionParam.content.signdate_due)
  858. }else {
  859. this.projectParam.content.pageSize = val
  860. this.getProjectList()
  861. }
  862. },
  863. handleCurrentChange(val) {
  864. // console.log(`当前页: ${val}`);
  865. if (this.siteid == 'HY' || this.siteid == 'YOSTEST1'){
  866. this.transactionParam.content.pageNumber = val
  867. this.queryProject(this.transactionParam.content.signdate_due)
  868. }else {
  869. this.projectParam.content.pageNumber = val
  870. this.getProjectList()
  871. }
  872. },
  873. /*获取领域*/
  874. async queryTradeField(){
  875. const res = await this.$store.dispatch('optiontypeselect','tradefield')
  876. this.tradefields = res.data
  877. },
  878. restBtn(){
  879. this.transactionParam.content.signdate_due = ''
  880. this.expectedTransaction(false)
  881. },
  882. /*项目成交数据*/
  883. async expectedTransaction(init){
  884. this.transactionParam.content.type = this.dataParam.content.type
  885. this.transactionParam.content.dataid = this.dataParam.content.dataid
  886. this.transactionParam.content.where.tradefield = this.dataParam.content.where.tradefield
  887. this.transactionParam.content.where.isleave = this.dataParam.content.where.isleave
  888. const res = await this.$api.requested(this.transactionParam)
  889. console.log(res.data,'数据项目成交')
  890. if (res.code == 0){
  891. this.tool.showMessage(res,()=>{})
  892. }else {
  893. this.previousData = [
  894. {
  895. title:'成交项目数',
  896. value:res.data?res.data[0].extradata.dealTotalCount:"",
  897. unit:'个',
  898. description:'当前状态为已成交,并且项目成交时间在前12个月(不含当前月)的项目数量',
  899. color:'#3874F6'
  900. },
  901. {
  902. title:'预计成交正偏差',
  903. title1:'项目',
  904. value1:res.data?res.data[0].extradata.positiveCount:"",
  905. unit1:'个',
  906. title2:'金额',
  907. value2:this.tool.formatAmount(this.tool.unitConversion(res.data?res.data[0].extradata.positiveOffsetAmount:"",10000),2),
  908. unit2:'万元',
  909. description:this.$t('依据:每个项目的偏差金额 = 项目成交金额 - 预计签约金额') + '\n ①' + this.$t('项目:合计偏差金额为正数的项目数量') + '\n ②' + this.$t('金额:合计每个项目的正数偏差金额'),
  910. color:'#E6A23C'
  911. },
  912. {
  913. title:'项目成交金额合计',
  914. value:this.tool.formatAmount(this.tool.unitConversion(res.data?res.data[0].extradata.dealAmount:'',10000),2),
  915. unit:'万元',
  916. description:'合计当前状态为已成交,并且项目成交时间在前12个月(不含当前月)的项目订单金额',
  917. color: '#009966'
  918. },
  919. {
  920. title:'失败项目数',
  921. value:res.data?res.data[0].extradata.failTotalCount:"",
  922. unit:'个',
  923. description:'当前状态为已失败,并且失败操作时间在前12个月(不含当前月)的项目数量',
  924. color:'#3874F6'
  925. },
  926. {
  927. title:'预计成交负偏差',
  928. title1:'项目',
  929. value1:res.data?res.data[0].extradata.negativeCount:"",
  930. unit1:'个',
  931. title2:'金额',
  932. value2:this.tool.formatAmount(this.tool.unitConversion(res.data?res.data[0].extradata.negativeOffsetAmount:"",10000),2),
  933. unit2:'万元',
  934. description:this.$t('依据:每个项目的偏差金额 = 项目成交金额 - 预计签约金额') + '\n ①' + this.$t('项目:合计偏差金额为负数的项目数量') + '\n ②' + this.$t('金额:合计每个项目的负数偏差金额'),
  935. color:'#E6A23C'
  936. },
  937. {
  938. title:'预计签约金额合计',
  939. value:this.tool.formatAmount(this.tool.unitConversion(res.data?res.data[0].extradata.signAmount:"",10000),2),
  940. unit:'万元',
  941. description:'合计当前状态为已成交,并且项目成交时间在前12个月(不含当前月)的项目预计签约金额',
  942. color: '#009966'
  943. },
  944. {
  945. title:'项目成交率',
  946. value:res.data?Math.round((res.data[0].extradata.dealRate * 100)*100)/100:"",
  947. unit:'%',
  948. description:'项目成交率 = 成交项目数 ÷ (成交项目数 + 失败项目数)×100%',
  949. color:'#3874F6'
  950. },
  951. {
  952. title:'预计成交准确率',
  953. value:res.data?Math.round((res.data[0].extradata.rightRate * 100)*100)/100:"",
  954. unit:'%',
  955. description:this.$t('依据:偏差率 = |(项目成交金额 - 预计签约金额)| ÷ 预计签约金额 × 100%') + '\n ' + this.$t('预计成交准确率 = 偏差率≤15%的项目数 ÷ 成交项目数 × 100%'),
  956. color:'#E6A23C'
  957. },
  958. ]
  959. this.dataBoxData = [
  960. {
  961. title:'预计签约金额合计',
  962. value:this.tool.formatAmount(this.tool.unitConversion(res.data?res.data[0].extradata.sumsignamount_due:"",10000),2),
  963. unit:'万元',
  964. description:'合计未来12个月的项目预计签约金额',
  965. color: '#3874F6'
  966. },
  967. {
  968. title:'预计成交金额合计',
  969. value:this.tool.formatAmount(this.tool.unitConversion(res.data?res.data[0].extradata.sumdealamount_due:"",10000),2),
  970. unit:'万元',
  971. description:'合计未来12个月的项目预计成交金额',
  972. color: '#E6A23C'
  973. },
  974. ]
  975. this.futreData = res.data?res.data[0].extradata.array:""
  976. this.$refs.futureTwelveMonthsRef.chartData(init,this.futreData)
  977. this.projectList = res.data
  978. this.total = res.total
  979. this.projectTile = this.$t('全部') + this.$t('_预计成交项目') + '(' + res.total + ')'
  980. }
  981. },
  982. selectStage(val){
  983. this.transactionParam.content.stagename = val
  984. this.expectedTransaction(false)
  985. },
  986. onCheck(val){
  987. this.transactionParam.content.where.unfinish = val
  988. this.expectedTransaction(false)
  989. },
  990. clickChart(date){
  991. this.transactionParam.content.signdate_due = date
  992. this.transactionParam.content.pageNumber = 1
  993. this.queryProject(date)
  994. },
  995. async queryProject(date){
  996. this.transactionParam.content.type = this.dataParam.content.type
  997. this.transactionParam.content.dataid = this.dataParam.content.dataid
  998. this.transactionParam.content.where.tradefield = this.dataParam.content.where.tradefield
  999. this.transactionParam.content.where.isleave = this.dataParam.content.where.isleave
  1000. const res = await this.$api.requested(this.transactionParam)
  1001. this.projectList = res.data
  1002. this.total = res.total
  1003. this.projectTile = date + this.$t('_预计成交项目') + '(' + res.total + ')'
  1004. },
  1005. goDetail(data){
  1006. let route = this.$route
  1007. if (route.path !== '/projectChangeDetail') {
  1008. this.oldRoute = {path:route.path,query:route.query}
  1009. this.$store.dispatch('setHistoryRouter',this.oldRoute)
  1010. }
  1011. this.$store.dispatch("changeDetailDrawer", true);
  1012. this.$router.push({
  1013. path:'/projectChangeDetail',
  1014. query:{
  1015. id:data.sa_projectid,
  1016. rowindex:data.rowindex,
  1017. }
  1018. })
  1019. }
  1020. },
  1021. mounted () {
  1022. /* this.renderPie()*/
  1023. this.departmentrtment()
  1024. this.dateSet(99)
  1025. this.queryTradeField()
  1026. },
  1027. created() {
  1028. this.tablecols = this.tool.tabelCol(this.$route.name).projectTable.tablecols
  1029. this.tablecolsData = this.tool.tabelCol(this.$route.name).tableDatas.tablecols
  1030. }
  1031. }
  1032. </script>
  1033. <style>
  1034. </style>
  1035. <style scoped>
  1036. .title{
  1037. height: 20px;
  1038. line-height: 20px;
  1039. font-size: 14px;
  1040. text-indent: 7px;
  1041. font-weight: bold;
  1042. color: #333333;
  1043. margin-bottom: 20px;
  1044. border-left: .3rem solid #3874F6;
  1045. }
  1046. .container{
  1047. /* height:calc(100vh)*/
  1048. }
  1049. .statistics-box{
  1050. width: 49%;
  1051. background: #FFFFFF;
  1052. box-shadow: 0px 1px 6px 1px rgba(0,0,0,0.16);
  1053. border-radius: 10px 10px 10px 10px;
  1054. box-sizing: border-box;
  1055. }
  1056. .statistics-box .statistics-box-title{
  1057. font-family: Microsoft YaHei, Microsoft YaHei;
  1058. font-weight: bold;
  1059. font-size: 16px;
  1060. color: #333333;
  1061. line-height: 22px;
  1062. text-align: left;
  1063. font-style: normal;
  1064. text-transform: none;
  1065. }
  1066. .screen-box{
  1067. width: 100%;
  1068. height: 302px;
  1069. background: #FFFFFF;
  1070. box-shadow: 0px 1px 6px 1px rgba(0,0,0,0.16);
  1071. border-radius: 5px 5px 5px 5px;
  1072. box-sizing: border-box;
  1073. }
  1074. .title-margin-15{
  1075. margin-top: 15px;
  1076. }
  1077. .title-margin-5{
  1078. margin-top: 5px;
  1079. }
  1080. .title-font-style1{
  1081. font-family: Microsoft YaHei, Microsoft YaHei;
  1082. font-weight: 400;
  1083. font-size: 14px;
  1084. color: #888888;
  1085. text-align: left;
  1086. font-style: normal;
  1087. text-transform: none;
  1088. }
  1089. .title-font-style2{
  1090. font-family: Microsoft YaHei, Microsoft YaHei;
  1091. font-weight: bold;
  1092. font-size: 18px;
  1093. color: #009966;
  1094. text-align: left;
  1095. font-style: normal;
  1096. text-transform: none;
  1097. }
  1098. .title-font-style3{
  1099. font-family: Microsoft YaHei, Microsoft YaHei;
  1100. font-weight: 400;
  1101. font-size: 14px;
  1102. color: #003399;
  1103. text-align: left;
  1104. font-style: normal;
  1105. text-transform: none;
  1106. }
  1107. .title-font-style4{
  1108. font-family: Microsoft YaHei, Microsoft YaHei;
  1109. font-weight: bold;
  1110. font-size: 12px;
  1111. color: #009966;
  1112. text-align: left;
  1113. font-style: normal;
  1114. text-transform: none;
  1115. }
  1116. .title-font-style5{
  1117. font-family: Microsoft YaHei, Microsoft YaHei;
  1118. font-weight: 400;
  1119. font-size: 16px;
  1120. color: #333333;
  1121. text-align: left;
  1122. font-style: normal;
  1123. text-transform: none;
  1124. padding-top: 20px;
  1125. }
  1126. </style>