detail.vue 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875
  1. <template>
  2. <el-drawer append-to-body :visible.sync="dialogFormVisible" size="97%">
  3. <div class="Mcontainer">
  4. <div style="background:#ffffff;padding:10px" v-if="Object.keys(baseInfo).length">
  5. <div class="Mcontainer-header">
  6. <div class="Mcontainer-header__left">
  7. <div style="width:60px;height: 60px;background:#F3F9FC;border-radius:10px;padding:10px">
  8. <img src="@/assets/project.svg" style="width:100%;height:100%" alt="">
  9. </div>
  10. <div class="account">
  11. <p class="normal-title" style="font-size:18px">
  12. <el-tooltip class="item" effect="dark" :content="baseInfo.projectname" placement="top">
  13. <p>{{ baseInfo.projectname }}</p>
  14. </el-tooltip>
  15. </p>
  16. <div class="Mtag">
  17. <el-tag size="small" v-for="(item,index) in baseInfo.sys_tag" :key="index" style="margin-right:10px">{{ $t(item) }}</el-tag>
  18. </div>
  19. </div>
  20. </div>
  21. <div class="Mcontainer-header__right">
  22. <el-descriptions class="margin-top">
  23. <el-descriptions-item :label="$t('项目编号')">{{ baseInfo.projectnum }}</el-descriptions-item>
  24. <el-descriptions-item :label="$t('项目类型')">{{ baseInfo.projecttype }}</el-descriptions-item>
  25. <el-descriptions-item :label="$t(`领域`)"><span style="color:#E85B5B;font-size:16px;font-weight:bold">{{ $t(baseInfo.tradefield) }}</span></el-descriptions-item>
  26. <el-descriptions-item :label="$t(`预计签约金额(元)`)"> {{ tool.formatAmount(baseInfo.signamount_due || 0,2,'¥') }}</el-descriptions-item>
  27. <el-descriptions-item :label="$t('项目状态')"><span style="color:#3874f6">{{ $t(baseInfo.status) }}</span></el-descriptions-item>
  28. <el-descriptions-item :label="$t(`未跟进天数`)"><span style="color:#E85B5B;font-size:16px;font-weight:bold;margin-right: 10px">{{ baseInfo.subdate ? baseInfo.subdate + $t('天') : baseInfo.subdate }}</span>
  29. <el-tooltip class="item" effect="dark" :content="$t(`未跟进天数=当前查询时间-最近跟进时间-节假日`)" placement="top">
  30. <i class="el-icon-warning-outline"></i>
  31. </el-tooltip>
  32. </el-descriptions-item>
  33. <el-descriptions-item :label="$t(`项目等级`)"><span style="color:#E85B5B;font-size:16px;font-weight:bold"> {{ $t(baseInfo.grade) }}</span></el-descriptions-item>
  34. <el-descriptions-item :label="$t('品牌')"> {{ $t(baseInfo.brandname) }}</el-descriptions-item>
  35. <el-descriptions-item :label="$t('项目规模')"> {{ baseInfo.scale ? $t(baseInfo.scale) + $t(baseInfo.unitname) : '' }}</el-descriptions-item>
  36. <el-descriptions-item :label="$t(`预计开工时间`)"> {{ baseInfo.begdate_due }}</el-descriptions-item>
  37. <el-descriptions-item :label="$t(`预计签约时间`)"> {{ baseInfo.signdate_due }}</el-descriptions-item>
  38. <el-descriptions-item :label="$t('负责人')"> <span style="color:#E85B5B;font-size:16px;font-weight:bold">{{ baseInfo.team.length && baseInfo.team.filter(item =>item.isleader == 1)[0].name }}</span></el-descriptions-item>
  39. <el-descriptions-item :label="$t('项目阶段')"><span style="color:#E85B5B;font-size:16px;font-weight:bold">{{ $t(baseInfo.stagename) }}</span></el-descriptions-item>
  40. <el-descriptions-item :label="$t(`项目评估总分`)"><span style="color:#E85B5B;font-size:16px;font-weight:bold">{{ baseInfo.allsumscore }}</span> </el-descriptions-item>
  41. <el-descriptions-item :label="$t('项目地址')">
  42. <div style="max-width:500px">
  43. {{ `${baseInfo.province}${baseInfo.city}${baseInfo.county}${baseInfo.address}` }}
  44. </div>
  45. </el-descriptions-item>
  46. </el-descriptions>
  47. </div>
  48. </div>
  49. </div>
  50. <div v-if="data" style="padding: 0 10px;">
  51. <!--项目评估-->
  52. <div class="Mproject" style="margin-top:10px">
  53. <el-card class="box-card">
  54. <div slot="header">
  55. <span class="myTitle">{{$t(`项目评估`)}}</span>
  56. <myRadio :value1="param1.content" :value2="param1.content.where" key1="isAll" @clickBtn="refreshTable('param1','pinggu')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
  57. </myRadio>
  58. </div>
  59. <myCard
  60. :list="
  61. [
  62. {title:'评估总分值',value:baseInfo.allsumscore,bg:'#F3F9FC',color:'#3874F6'},
  63. {title:'评估次数',value:$refs.pinggu && $refs.pinggu.total,bg:'#E8F7EC',color:'#78B32B'},
  64. {title:'最近评估时间',value:$refs.pinggu && $refs.pinggu.list && $refs.pinggu.list[0] && $refs.pinggu.list[0].createdate || '--',bg:'#F9F2E5',color:'#FF7603'},
  65. ]"
  66. ></myCard>
  67. <showIsNone :title="$t(`项目评估记录明细`)">
  68. <pageTable
  69. ref="pinggu"
  70. :tablecols="tool.tabelCol($route.name).scoreTable.tablecols"
  71. :param="param1"
  72. :custom="true"
  73. >
  74. <template v-slot:custom="scope">
  75. <div v-if="scope.data.columnname == 'partieobj'">
  76. <div v-for="item in scope.data.data.parties" :key="item.sa_project_partiesid">
  77. <el-tag size="mini">{{ $t(item.type) }}</el-tag>{{ item.enterprisename }}
  78. </div>
  79. </div>
  80. <div v-else-if="scope.data.columnname == 'optionname'">
  81. <div v-for="item in scope.data.data.parties" :key="item.sa_project_partiesid + 'a'">
  82. <el-tag size="mini">{{ $t(item.optionname) }}</el-tag>
  83. </div>
  84. </div>
  85. <div v-else>
  86. {{ $t(scope.data.data[scope.data.columnname]) }}
  87. </div>
  88. </template>
  89. </pageTable>
  90. </showIsNone>
  91. </el-card>
  92. </div>
  93. <!--跟进记录-->
  94. <div class="Mfollow">
  95. <el-card class="box-card">
  96. <div slot="header">
  97. <span class="myTitle">{{$t(`跟进记录`)}}</span>
  98. <myRadio :value1="param2.content" :value2="param2.content.where" key1="isAll" @clickBtn="refreshTable('param2','fllow')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
  99. </myRadio>
  100. </div>
  101. <myCard
  102. :list="
  103. [
  104. {title:'跟进次数',value:$refs.fllow && $refs.fllow.total,bg:'#F3F9FC',color:'#3874F6'},
  105. {title:'最近跟进人',value:$refs.fllow && $refs.fllow.list[0] && $refs.fllow.list[0].name || '--',bg:'#E8F7EC',color:'#78B32B'},
  106. {title:'最近跟进时间',value:$refs.fllow && $refs.fllow.list[0] && $refs.fllow.list[0].createdate || '--',bg:'#F9F2E5',color:'#FF7603'},
  107. {title:'跟进频率',value:$refs.fllow && $refs.fllow.list[0] && $refs.fllow.list[0].followfrequency,descript:'定义:平均跟进天数;若有跟进次数,则按照:跟进频率=(首次跟进时间到当前时间的天数-节假日)÷跟进次数;',bg:'#FDF3F3',color:'#E85B5B'},
  108. ]"
  109. >
  110. </myCard>
  111. <p style="font-size:14px;font-weight:bold;margin-bottom:10px" v-if="$refs.fllow && $refs.fllow.list[0] && $refs.fllow.list[0].followDetail.length">{{$t(`跟进人及次数`)}}</p>
  112. <div style="display:flex">
  113. <myTag
  114. style="margin-right:10px"
  115. v-for="(item,index) in $refs.fllow && $refs.fllow.list[0] && $refs.fllow.list[0].followDetail"
  116. :key="index + 'b'"
  117. :data="{title:item.name,descript:'跟进次数',value:item.qty}"
  118. >
  119. </myTag>
  120. </div>
  121. <showIsNone :title="$t(`项目跟进记录明细`)">
  122. <pageTable
  123. ref="fllow"
  124. :tablecols="tool.tabelCol($route.name).clueFollow.tablecols"
  125. :param="param2"
  126. :custom="true"
  127. >
  128. <template v-slot:custom="scope">
  129. <p v-if="scope.data.columnname === 'followname'">
  130. <span v-if="scope.data.data.followname.length > 0">
  131. <span v-for="(item,index) in scope.data.data.followname">
  132. <span v-if="index === scope.data.data.followname.length -1">
  133. {{$t(item)}}
  134. </span>
  135. <span v-else>
  136. {{item + ','}}
  137. </span>
  138. </span>
  139. </span>
  140. <span v-else>--</span>
  141. </p>
  142. <div v-else style="text-wrap:wrap;word-wrap: break-word;white-space: normal;">
  143. {{ $t(scope.data.data[scope.data.columnname]) || '--' }}
  144. </div>
  145. </template>
  146. </pageTable>
  147. </showIsNone>
  148. </el-card>
  149. </div>
  150. <!--关联客户-->
  151. <div class="Mproject" style="margin-top:10px">
  152. <el-card class="box-card">
  153. <div slot="header">
  154. <span class="myTitle">{{$t(`关联客户`)}}</span>
  155. </div>
  156. <myCard
  157. :list="
  158. [
  159. {title:'客户数',value:$refs.kehu && $refs.kehu.total,bg:'#F3F9FC',color:'#3874F6'},
  160. ]"
  161. ></myCard>
  162. <showIsNone :title="$t(`客户明细`)">
  163. <pageTable
  164. ref="kehu"
  165. :tablecols="tool.tabelCol($route.name).customerTable2.tablecols"
  166. :param="param3"
  167. ></pageTable>
  168. </showIsNone>
  169. </el-card>
  170. </div>
  171. <!--竞争对手-->
  172. <div class="Mproject" style="margin-top:10px">
  173. <el-card class="box-card">
  174. <div slot="header">
  175. <span class="myTitle">{{$t(`竞争对手`)}}</span>
  176. </div>
  177. <myCard
  178. :list="
  179. [
  180. {title:'项目竞争对手数',value:$refs.duishou && $refs.duishou.total,bg:'#F3F9FC',color:'#3874F6'},
  181. ]"
  182. ></myCard>
  183. <showIsNone :title="$t(`竞争对手明细`)">
  184. <pageTable
  185. ref="duishou"
  186. :tablecols="tool.tabelCol($route.name).duishouTable.tablecols"
  187. :param="param4"
  188. ></pageTable>
  189. </showIsNone>
  190. </el-card>
  191. </div>
  192. <!--产品配置-->
  193. <div class="Mproject" style="margin-top:10px">
  194. <el-card class="box-card">
  195. <div slot="header">
  196. <span class="myTitle">{{$t(`产品配置`)}}</span>
  197. </div>
  198. <myCard
  199. :list="
  200. [
  201. {title:'产品总数',value:$refs.productset && $refs.productset.total,bg:'#F3F9FC',color:'#3874F6'},
  202. {title:'产品总金额',value:unitCompile($refs.productset && $refs.productset.list && $refs.productset.list[0] && $refs.productset.list[0].itemSumAmount || 0),bg:'#E8F7EC',color:'#78B32B'},
  203. ]"
  204. ></myCard>
  205. <showIsNone :title="$t(`产品类别及金额`)">
  206. <el-table
  207. :cell-style="{height:'40px',color:'#666666',fontWeight:'400'}"
  208. size="mini"
  209. border
  210. :data="$refs.productset && $refs.productset.list && $refs.productset.list[0] && $refs.productset.list[0].itemsClassAmount"
  211. style="width: 100%">
  212. <el-table-column
  213. prop="itemclassfullname"
  214. :label="$t(`产品类别`)">
  215. </el-table-column>
  216. <el-table-column
  217. prop="itemclassAmount"
  218. :label="$t('金额')">
  219. <template slot-scope="scope">
  220. {{ tool.formatAmount(scope.row.itemclassAmount || 0,2,'¥') }}
  221. </template>
  222. </el-table-column>
  223. </el-table>
  224. </showIsNone>
  225. <showIsNone :title="$t(`产品配置明细`)" style="margin-top:10px">
  226. <pageTable
  227. ref="productset"
  228. :tablecols="tool.tabelCol($route.name).projectSetTable2.tablecols"
  229. :param="param5"
  230. :custom="true"
  231. >
  232. <template v-slot:custom="scope">
  233. <div v-if="scope.data.columnname == 'marketprice'">
  234. {{scope.data.data.marketprice && tool.formatAmount(scope.data.data.marketprice || 0,2,'¥') }}
  235. </div>
  236. <div v-else-if="scope.data.columnname == 'price'">
  237. {{scope.data.data.price && tool.formatAmount(scope.data.data.price || 0,2,'¥') }}
  238. </div>
  239. <div v-else-if="scope.data.columnname == 'amount'">
  240. {{scope.data.data.amount && tool.formatAmount(scope.data.data.amount || 0,2,'¥') }}
  241. </div>
  242. <div v-else>
  243. {{ $t(scope.data.data[scope.data.columnname]) }}
  244. </div>
  245. </template>
  246. </pageTable>
  247. </showIsNone>
  248. </el-card>
  249. </div>
  250. <!--报价单-->
  251. <div class="Mproject" style="margin-top:10px">
  252. <el-card class="box-card">
  253. <div slot="header">
  254. <span class="myTitle">{{$t(`报价单`)}}</span>
  255. <myRadio :value1="param6.content" :value2="param6.content.where" key1="isAll" @clickBtn="refreshTable('param6','baojiadan')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
  256. </myRadio>
  257. </div>
  258. <myCard
  259. :list="
  260. [
  261. {title:'报价次数',value:$refs.baojiadan && $refs.baojiadan.total,bg:'#F3F9FC',color:'#3874F6'},
  262. {title:'最近报价金额',value:unitCompile($refs.baojiadan && $refs.baojiadan.list && $refs.baojiadan.list[0] && $refs.baojiadan.list[0].quotedpriceamount || 0),bg:'#E8F7EC',color:'#78B32B'},
  263. {title:'最近报价时间',value:$refs.baojiadan && $refs.baojiadan.list && $refs.baojiadan.list[0] && $refs.baojiadan.list[0].submitdate || '--',bg:'#F9F2E5',color:'#FF7603'},
  264. ]"
  265. ></myCard>
  266. <showIsNone :title="$t(`报价单明细`)">
  267. <pageTable
  268. ref="baojiadan"
  269. :tablecols="tool.tabelCol($route.name).quotedPriceTable.tablecols"
  270. :param="param6"
  271. :custom="true"
  272. >
  273. <template v-slot:custom="scope">
  274. <div v-if="scope.data.columnname == 'specialoffer'">
  275. {{ scope.data.data.specialoffer ? $t('是') : $t('否') }}
  276. </div>
  277. <div v-else-if="scope.data.columnname == 'sumamount'">
  278. {{scope.data.data.sumamount && tool.formatAmount(scope.data.data.sumamount || 0,2,'¥') }}
  279. </div>
  280. <div v-else-if="scope.data.columnname == 'begdate'">
  281. {{scope.data.data.begdate }}-{{scope.data.data.enddate }}
  282. </div>
  283. <div v-else>
  284. {{ $t(scope.data.data[scope.data.columnname]) }}
  285. </div>
  286. </template>
  287. </pageTable>
  288. </showIsNone>
  289. </el-card>
  290. </div>
  291. <!--合同-->
  292. <div class="Mproject" style="margin-top:10px">
  293. <el-card class="box-card">
  294. <div slot="header">
  295. <span class="myTitle">{{$t(`合同`)}}</span>
  296. <myRadio :value1="param7.content" :value2="param7.content.where" key1="isAll" @clickBtn="refreshTable('param7','hetong')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
  297. </myRadio>
  298. <el-select style="margin-left:24px" v-model="param7.content.where.type" clearable size="mini" :placeholder="$t(`请选择合同类型`)" @change="typeChange('param7','hetong')">
  299. <el-option :label="$t(`全部`)" value=""></el-option>
  300. <el-option :label="$t(item.remarks)" :value="item.value" v-for="(item,index) in contractTypeList" :key="index"></el-option>
  301. </el-select>
  302. </div>
  303. <myCard
  304. :list="
  305. [
  306. {title:'合同总数',value:$refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].allQty,bg:'#F3F9FC',color:'#3874F6'},
  307. {title:'合同金额',value:unitCompile($refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].sumSignAmount || 0),bg:'#E8F7EC',color:'#78B32B'},
  308. {title:'进行中合同总数',value:$refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].inProgressQty,bg:'#FDF3F3',color:'#E85B5B'},
  309. {title:'进行中合同金额',value:unitCompile($refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].inProgressAmount || 0),bg:'#F9F2E5',color:'#FF7603'},
  310. {title:'到期合同数',value:$refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].expireQty,bg:'#FDF3F3',color:'#E85B5B'},
  311. {title:'到期合同金额',value:unitCompile($refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].expireAmount || 0),bg:'#E8F7EC',color:'#78B32B'},
  312. {title:'转订单合同数',value:$refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].convertOrderContractQty,bg:'#F9F2E5',color:'#FF7603'},
  313. {title:'转订单金额',value:unitCompile($refs.hetong && $refs.hetong.list && $refs.hetong.list[0] && $refs.hetong.list[0].convertOrderContractAmount || 0),bg:'#E8F7EC',color:'#78B32B'},
  314. ]"
  315. ></myCard>
  316. <showIsNone :title="$t(`合同明细`)">
  317. <pageTable
  318. ref="hetong"
  319. :tablecols="tool.tabelCol($route.name).contractTable2.tablecols"
  320. :param="param7"
  321. :custom="true"
  322. >
  323. <template v-slot:custom="scope">
  324. <div v-if="scope.data.columnname == 'signAmount'">
  325. {{scope.data.data.signAmount && tool.formatAmount(scope.data.data.signAmount || 0,2,'¥') }}
  326. </div>
  327. <div v-else-if="scope.data.columnname == 'enddate'">
  328. {{scope.data.data.begdate + $t('至') + scope.data.data.enddate }}
  329. </div>
  330. <div v-else>
  331. {{ $t(scope.data.data[scope.data.columnname]) }}
  332. </div>
  333. </template>
  334. </pageTable>
  335. </showIsNone>
  336. </el-card>
  337. </div>
  338. <!--订单-->
  339. <div class="Mproject" style="margin-top:10px">
  340. <el-card class="box-card">
  341. <div slot="header">
  342. <span class="myTitle">{{$t(`订单`)}}</span>
  343. <myRadio :value1="param8.content" :value2="param8.content.where" key1="isAll" @clickBtn="refreshTable('param8','dingdan')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
  344. </myRadio>
  345. </div>
  346. <myCard
  347. :list="
  348. [
  349. {title:'订单数量',value:$refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].allOrderQty,bg:'#F3F9FC',color:'#3874F6'},
  350. {title:'订单金额',value:unitCompile($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].allAmount || 0),bg:'#E8F7EC',color:'#78B32B'},
  351. {title:'订单回款金额',value:unitCompile($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].cashbillAmount || 0),bg:'#F9F2E5',color:'#FF7603'},
  352. {title:'订单未出货金额',value:unitCompile($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].allunAmount || 0),bg:'#FDF3F3',color:'#E85B5B'},
  353. {title:'已出货未开票金额',value:unitCompile($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].uninvoicamount || 0),bg:'#F9F2E5',color:'#FF7603'},
  354. {title:'已开票未回款金额',value:unitCompile($refs.dingdan && $refs.dingdan.list && $refs.dingdan.list[0] && $refs.dingdan.list[0].unwriteoffamount || 0),bg:'#FDF3F3',color:'#E85B5B'},
  355. ]"
  356. ></myCard>
  357. <showIsNone :title="$t(`订单明细`)">
  358. <pageTable
  359. ref="dingdan"
  360. :tablecols="tool.tabelCol($route.name).orderTable.tablecols"
  361. :param="param8"
  362. :custom="true"
  363. >
  364. <template v-slot:custom="scope">
  365. <div v-if="scope.data.columnname == 'sumamount'">
  366. {{scope.data.data[scope.data.columnname]?tool.formatAmount(scope.data.data[scope.data.columnname],2,'¥'):scope.data.data[scope.data.columnname] == 0?'¥ 0.00':'--'}}
  367. </div>
  368. <div v-else-if="scope.data.columnname == 'writeoffamount'">
  369. {{scope.data.data[scope.data.columnname]?tool.formatAmount(scope.data.data[scope.data.columnname],2,'¥'):scope.data.data[scope.data.columnname] == 0?'¥ 0.00':'--'}}
  370. </div>
  371. <div v-else-if="scope.data.columnname == 'unoutOrderamount'">
  372. {{scope.data.data[scope.data.columnname]?tool.formatAmount(scope.data.data[scope.data.columnname],2,'¥'):scope.data.data[scope.data.columnname] == 0?'¥ 0.00':'--'}}
  373. </div>
  374. <div v-else-if="scope.data.columnname == 'uninvoicamount'">
  375. {{scope.data.data[scope.data.columnname]?tool.formatAmount(scope.data.data[scope.data.columnname],2,'¥'):scope.data.data[scope.data.columnname] == 0?'¥ 0.00':'--'}}
  376. </div>
  377. <div v-else-if="scope.data.columnname == 'unwriteoffamount'">
  378. {{scope.data.data[scope.data.columnname]?tool.formatAmount(scope.data.data[scope.data.columnname],2,'¥'):scope.data.data[scope.data.columnname] == 0?'¥ 0.00':'--'}}
  379. </div>
  380. <div v-else-if="scope.data.columnname == 'returnamount'">
  381. {{scope.data.data[scope.data.columnname]?tool.formatAmount(scope.data.data[scope.data.columnname],2,'¥'):scope.data.data[scope.data.columnname] == 0?'¥ 0.00':'--'}}
  382. </div>
  383. <div v-else>
  384. {{ $t(scope.data.data[scope.data.columnname]) }}
  385. </div>
  386. </template>
  387. </pageTable>
  388. </showIsNone>
  389. </el-card>
  390. </div>
  391. <!--服务-->
  392. <div class="Mproject" style="margin-top:10px">
  393. <el-card class="box-card">
  394. <div slot="header">
  395. <span class="myTitle">{{$t(`服务`)}}</span>
  396. <myRadio :value1="param9.content" :value2="param9.content.where" key1="isAll" @clickBtn="refreshTable('param9','fuwu')" :btnOptions="[{label:'全部',value:1},{label:'本年',value:0}]">
  397. </myRadio>
  398. </div>
  399. <myCard
  400. :list="
  401. [
  402. {title:'服务申请次数',value:$refs.fuwu && $refs.fuwu.list && $refs.fuwu.list[0] && $refs.fuwu.list[0].serviceOrderQty,bg:'#F3F9FC',color:'#3874F6'},
  403. {title:'服务工单次数',value:$refs.fuwu && $refs.fuwu.list && $refs.fuwu.list[0] && $refs.fuwu.list[0].workOrderQty,bg:'#E8F7EC',color:'#78B32B'},
  404. {title:'完工工单次数',value:$refs.fuwu && $refs.fuwu.list && $refs.fuwu.list[0] && $refs.fuwu.list[0].okWorkOrderQty,bg:'#F9F2E5',color:'#FF7603'},
  405. {title:'最近服务时间',value:$refs.fuwu && $refs.fuwu.list && $refs.fuwu.list[0] && $refs.fuwu.list[0].createdate || '--',bg:'#FDF3F3',color:'#E85B5B'},
  406. ]"
  407. ></myCard>
  408. <showIsNone :title="$t(`服务工单明细`)">
  409. <pageTable
  410. ref="fuwu"
  411. :tablecols="tool.tabelCol($route.name).serveOrderTable.tablecols"
  412. :param="param9"
  413. ></pageTable>
  414. </showIsNone>
  415. </el-card>
  416. </div>
  417. <div class="peopleInfo" v-if="Object.keys(baseInfo).length">
  418. <el-row>
  419. <el-col :span="12">
  420. <el-card class="box-card" style="margin-right:10px">
  421. <div slot="header">
  422. <span class="myTitle">{{$t(`团队`)}}</span>
  423. </div>
  424. <div class="peopleInfo-content">
  425. <div class="leader">
  426. <p class="title" style="margin-bottom:10px">{{$t('负责人')}}</p>
  427. <div class="content">
  428. <div class="item" v-for="(item,index) in baseInfo.team.filter(item => item.isleader == 1)" :key="index">
  429. <div class="avatar">{{ item.name.substr(0,1) }}</div>
  430. <div class="Info">
  431. <div>
  432. <p class="title">{{ item.name }}</p>
  433. <p class="descript">{{$t(`账号`)}}:<span>{{ item.accountno }}</span></p>
  434. </div>
  435. <div>
  436. <p class="descript">{{$t('部门') + ':'}}<span>{{ $t(item.depname) }}</span></p>
  437. <p class="descript">{{$t(`职位`)}}:<span>{{ $t(item.position) }}</span></p>
  438. </div>
  439. </div>
  440. </div>
  441. </div>
  442. </div>
  443. <div class="people">
  444. <p class="title" style="margin-bottom:10px">{{$t('参与人')}}</p>
  445. <div class="content">
  446. <div class="item" v-for="(item,index) in baseInfo.team.filter(item => item.isleader == 0)" :key="index">
  447. <div class="avatar">{{ item.name.substr(0,1) }}</div>
  448. <div class="Info">
  449. <div>
  450. <p class="title">{{ item.name }}</p>
  451. <p class="descript">{{$t(`账号`)}}:<span>{{ item.accountno }}</span></p>
  452. </div>
  453. <div>
  454. <p class="descript">{{$t('部门') + ':'}}<span>{{ $t(item.depname) }}</span></p>
  455. <p class="descript">{{$t(`职位`)}}:<span>{{ $t(item.position) }}</span></p>
  456. </div>
  457. </div>
  458. </div>
  459. </div>
  460. </div>
  461. </div>
  462. </el-card>
  463. </el-col>
  464. <el-col :span="12">
  465. <el-card class="box-card">
  466. <div slot="header">
  467. <span class="myTitle">{{$t(`联系人`)}}</span>
  468. </div>
  469. <div class="peopleInfo-content">
  470. <div class="leader">
  471. <div class="content" v-if="baseInfo.contacts && baseInfo.contacts.length">
  472. <div class="item" v-for="(item,index) in baseInfo.contacts" :key="index">
  473. <div class="avatar">{{ item.name.substr(0,1) }}</div>
  474. <div class="Info">
  475. <div>
  476. <p class="title">{{ item.name }}</p>
  477. <p class="descript">{{$t(`账号`)}}:<span>{{ item.accountno }}</span></p>
  478. </div>
  479. <div>
  480. <p class="descript">{{$t('部门') + ':'}}<span>{{ $t(item.depname) }}</span></p>
  481. <p class="descript">{{$t(`职位`)}}:<span>{{ $t(item.position) }}</span></p>
  482. </div>
  483. </div>
  484. </div>
  485. </div>
  486. <el-empty :image-size="100" :description="$t('暂无数据')" v-else></el-empty>
  487. </div>
  488. </div>
  489. </el-card>
  490. </el-col>
  491. </el-row>
  492. </div>
  493. </div>
  494. </div>
  495. </el-drawer>
  496. </template>
  497. <script>
  498. import pageTable from '@/HDrpManagement/customerPortrait/modules/pageTable'
  499. import showIsNone from '@/HDrpManagement/customerPortrait/modules/showIsNone'
  500. import myCard from '@/HDrpManagement/customerPortrait/modules/myCrad'
  501. import myTag from '@/HDrpManagement/customerPortrait/modules/myTag'
  502. import myRadio from '@/HDrpManagement/customerPortrait/modules/myRadio'
  503. export default {
  504. name: "index",
  505. components:{showIsNone,pageTable,myCard,myTag,myRadio},
  506. props:['data'],
  507. data() {
  508. return {
  509. dialogFormVisible:false,
  510. baseInfo:{},//基本信息
  511. //项目评估
  512. param1: {
  513. "id": 20230715112504,
  514. "content": {
  515. "pageNumber": 1,
  516. "pageSize": 20,
  517. "isAll":1,
  518. "sa_projectid":this.$route.query.id,
  519. "where":{
  520. "begdate":'',
  521. "enddate":''
  522. }
  523. },
  524. },
  525. //跟进记录
  526. param2: {
  527. "id": 20230715111804,
  528. "content": {
  529. "pageNumber": 1,
  530. "pageSize": 20,
  531. "isAll":1,
  532. "sa_projectid":this.$route.query.id,
  533. "where":{
  534. "begdate":'',
  535. "enddate":''
  536. }
  537. },
  538. },
  539. //关联客户
  540. param3: {
  541. "id": 20230715111904,
  542. "content": {
  543. "pageNumber": 1,
  544. "pageSize": 20,
  545. "sa_projectid":this.$route.query.id,
  546. }
  547. },
  548. //竞争对手
  549. param4: {
  550. "id": 20230715112004,
  551. "content": {
  552. "pageNumber": 1,
  553. "pageSize": 20,
  554. "sa_projectid":this.$route.query.id,
  555. }
  556. },
  557. //产品配置
  558. param5: {
  559. "id": 20230715112104,
  560. "content": {
  561. "pageNumber": 1,
  562. "pageSize": 20,
  563. "sa_projectid":this.$route.query.id
  564. }
  565. },
  566. //报价单
  567. param6: {
  568. "id": 20230715112204,
  569. "content": {
  570. "pageNumber": 1,
  571. "pageSize": 20,
  572. "isAll":1,
  573. "sa_projectid":this.$route.query.id,
  574. "where":{
  575. "type":"",
  576. "begdate":'',
  577. "enddate":''
  578. }
  579. }
  580. },
  581. //关联合同
  582. param7: {
  583. "id": 20230715112304,
  584. "content": {
  585. "pageNumber": 1,
  586. "pageSize": 20,
  587. "isAll":1,
  588. "sa_projectid":this.$route.query.id,
  589. "where":{
  590. "type":"",
  591. "begdate":'',
  592. "enddate":''
  593. }
  594. }
  595. },
  596. //订单
  597. param8: {
  598. "id": 20230715112404,
  599. "content": {
  600. "pageNumber": 1,
  601. "pageSize": 20,
  602. "isAll":1,
  603. "sa_projectid":this.$route.query.id,
  604. "where": {
  605. "begdate":'',
  606. "enddate":''
  607. }
  608. }
  609. },
  610. //服务
  611. param9: {
  612. "id": 20230716151004,
  613. "content": {
  614. "pageNumber": 1,
  615. "pageSize": 20,
  616. "isAll":1,
  617. "sa_projectid":this.$route.query.id,
  618. "where": {
  619. "begdate":'',
  620. "enddate":''
  621. }
  622. }
  623. },
  624. contractTypeList:[],
  625. orderTypeList:[],
  626. stageList:[]
  627. }
  628. },
  629. methods:{
  630. async getbaseInfo () {
  631. let res = await this.$api.requested({
  632. "id": 20230715111704,
  633. "content": {
  634. "sa_projectid":this.$route.query.id
  635. }
  636. })
  637. this.baseInfo = res.data[0]
  638. console.log(this.baseInfo,'基本信息');
  639. },
  640. async getSelectList () {
  641. const res = await this.$store.dispatch('optiontypeselect','contracttype')
  642. this.contractTypeList = res.data.filter(item => item.remarks != '经销商合作协议')
  643. console.log(this.contractTypeList,'合同类型');
  644. const res2 = await this.$store.dispatch('optiontypeselect','ordertype')
  645. this.orderTypeList = res2.data
  646. console.log(this.orderTypeList,'订单类型');
  647. /*获取阶段*/
  648. const res3 = await this.$api.requested({
  649. "id": 20221128143604,
  650. "content": {
  651. "pageNumber": 1,
  652. "pageSize": 9999,
  653. "where": {
  654. "condition": "",
  655. "allprojecttype":"",
  656. "projecttype":""
  657. }
  658. }
  659. })
  660. this.stageList = res3.data
  661. },
  662. refreshTable (param,el) {
  663. this[param].content.pageNumber = 1
  664. this.$refs[el] && this.$refs[el].listData()
  665. },
  666. typeChange(param,el) {
  667. this[param].content.pageNumber = 1
  668. this.$refs[el] && this.$refs[el].listData()
  669. },
  670. unitCompile (num) {
  671. if (num == 0) {
  672. return this.tool.formatAmount(num,0,'¥')
  673. } else {
  674. return this.tool.formatAmount(this.tool.unitConversion(num , 10000),2,'¥') +this.$t('万')
  675. }
  676. },
  677. },
  678. mounted() {
  679. this.getbaseInfo()
  680. this.getSelectList()
  681. }
  682. }
  683. </script>
  684. <style scoped>
  685. *{
  686. box-sizing: border-box;
  687. }
  688. .my-label {
  689. background: rgba(235, 245, 253, 1);
  690. }
  691. .nowrap {
  692. white-space: nowrap;
  693. overflow: hidden;
  694. text-overflow: ellipsis;
  695. flex: 100;
  696. }
  697. /deep/.el-drawer {
  698. background:#F5F5F5 !important;
  699. }
  700. /deep/.el-drawer__header{
  701. display: none !important;
  702. }
  703. /deep/.el-descriptions-item__cell {
  704. padding: 8px 8px 0px 8px !important;
  705. }
  706. /deep/.el-card__header,/deep/.el-card__body {
  707. padding: 10px !important;
  708. }
  709. .Mcontainer .Mcontainer-header {
  710. display: flex;
  711. align-items: center;
  712. }
  713. .Mcontainer .Mcontainer-header .Mcontainer-header__left {
  714. display: flex;
  715. max-width: 350px;
  716. min-width: 350px;
  717. align-items: center;
  718. padding-right: 20px;
  719. }
  720. .Mcontainer .Mcontainer-header .Mcontainer-header__right {
  721. flex: 100;
  722. border-left: 1px solid #cccccc;
  723. padding-left: 20px;
  724. }
  725. .Mcontainer .Mcontainer-header .Mcontainer-header__left .account{
  726. display: flex;
  727. flex-direction: column;
  728. justify-content: space-between;
  729. margin-left: 10px;
  730. overflow: hidden;
  731. flex: 100;
  732. }
  733. .Mcontainer .Mcontainer-header .Mcontainer-header__left .account .Mtag{
  734. margin-top: 5px;
  735. }
  736. .Mcontainer .Mfollow{
  737. margin-top: 10px;
  738. }
  739. .Mcontainer .peopleInfo {
  740. margin-top: 10px;
  741. padding-bottom: 10px;
  742. }
  743. .peopleInfo-content {
  744. display: flex;
  745. flex-direction: column;
  746. height: 300px;
  747. overflow-y: scroll;
  748. }
  749. .peopleInfo-content::-webkit-scrollbar {
  750. display: none;
  751. }
  752. .peopleInfo-content .leader {
  753. margin-bottom: 10px;
  754. display: flex;
  755. flex-direction: column;
  756. }
  757. .peopleInfo-content .leader .title {
  758. font-size: 14px;
  759. }
  760. .peopleInfo-content .leader .content {
  761. display: flex;
  762. flex-wrap: wrap;
  763. }
  764. .peopleInfo-content .leader .content .item {
  765. display: flex;
  766. align-items: center;
  767. margin: 0 20px 10px 0;
  768. }
  769. .peopleInfo-content .leader .content .avatar {
  770. width: 50px;
  771. height: 50px;
  772. border-radius: 50%;
  773. text-align: center;
  774. line-height: 50px;
  775. background: #3874F6;
  776. margin-right: 10px;
  777. color: #ffffff;
  778. }
  779. .peopleInfo-content .leader .content .Info {
  780. display: flex;
  781. flex-direction: column;
  782. }
  783. .peopleInfo-content .leader .content .Info div {
  784. display: flex;
  785. align-items: center;
  786. font-size: 12px;
  787. color: #cccccc;
  788. }
  789. .peopleInfo-content .people {
  790. margin-bottom: 10px;
  791. display: flex;
  792. flex-direction: column;
  793. }
  794. .peopleInfo-content .people .title {
  795. font-size: 14px;
  796. }
  797. .peopleInfo-content .people .content {
  798. display: flex;
  799. flex-wrap:wrap;
  800. }
  801. .peopleInfo-content .people .content .item {
  802. display: flex;
  803. align-items: center;
  804. margin: 0 20px 10px 0;
  805. }
  806. .peopleInfo-content .people .content .avatar {
  807. width: 50px;
  808. height: 50px;
  809. border-radius: 50%;
  810. text-align: center;
  811. line-height: 50px;
  812. background: #3874F6;
  813. margin-right: 10px;
  814. color: #ffffff;
  815. }
  816. .peopleInfo-content .people .content .Info {
  817. display: flex;
  818. flex-direction: column;
  819. }
  820. .peopleInfo-content .people .content .Info div {
  821. display: flex;
  822. align-items: center;
  823. font-size: 12px;
  824. color: #cccccc;
  825. }
  826. .peopleInfo-content .people {}
  827. .descript {
  828. font-size: 12px;
  829. color: #cccccc;
  830. margin-right: 20px;
  831. white-space:nowrap;
  832. }
  833. .title {
  834. font-size: 14px;
  835. color: #000000;
  836. margin-right: 10px;
  837. white-space:nowrap;
  838. }
  839. .myTitle {
  840. margin-right:24px;
  841. font-size: 16px;
  842. font-weight: bold;
  843. }
  844. </style>