detail.vue 36 KB

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