invoiceAmountAnalysis.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. <template>
  2. <div class="div-box-new-margin" >
  3. <div class="div-border-box" id="invoiceAmountAnalysisFull">
  4. <div class="out">
  5. <div>
  6. <div class="div-line div-line-right"></div>
  7. <div class="title" style="min-width: 220px;">{{$t(`开票金额趋势分析`)}}</div>
  8. </div>
  9. <div class="in">
  10. <div class="inline-16 mt-10">
  11. <departmentSalesperson ref="departmentSalesperson" @depSelect="depSelect" @personSelect="personSelect" :isFull="isFull" :is-new-dep="true"></departmentSalesperson>
  12. </div>
  13. <div class="mt-10 inline-16">
  14. <p class="search__label">{{$t('状态')}}:</p>
  15. <el-select v-model="param.content.where.isleave" clearable style="margin-right:10px" size="small" :placeholder="$t('请选择状态')" @change="queryModel(param.content.dataid,param.content.where.isleave,'状态')">
  16. <el-option :label="$t('在职')" value="1"></el-option>
  17. <el-option :label="$t('离职')" value="2"></el-option>
  18. </el-select>
  19. </div>
  20. <div class="mt-10 inline-15">
  21. <span class="search__label inline-16">{{$t(`年度`)}}:</span>
  22. <el-date-picker
  23. :append-to-body="!isFull"
  24. v-model="yearNow"
  25. @change="changeDate"
  26. :picker-options="pickerOptions"
  27. :clearable="false"
  28. type="year"
  29. size="small"
  30. :placeholder="$t(`选择年`)">
  31. </el-date-picker>
  32. </div>
  33. <fullScreen domId="invoiceAmountAnalysisFull" @onFull="onFull" @backFull="backFull"></fullScreen>
  34. </div>
  35. </div>
  36. <div class="chart">
  37. <div id="invoiceAmountAnalysisChart" :style="{height: heightChart}"></div>
  38. </div>
  39. </div>
  40. </div>
  41. </template>
  42. <script>
  43. import departmentSalesperson from "@/views/salesData/components/departmentSalesperson";
  44. import fullScreen from "@/views/salesData/components/fullScreen";
  45. import { DualAxes } from '@antv/g2plot';
  46. export default {
  47. name: "invoiceAmountAnalysis",
  48. props:['dataid','scrollHeight','windowWidth'],
  49. components:{departmentSalesperson,fullScreen},
  50. data(){
  51. return {
  52. pickerOptions: {
  53. disabledDate(time){
  54. // 获取当前时间
  55. const today = new Date();
  56. // 比较日期,将未来的年份禁用
  57. return time.getFullYear() > today.getFullYear();
  58. }
  59. },
  60. chartDualAxes:null,
  61. param:{
  62. "id": 20231016095304,
  63. "content": {
  64. "type": 0,
  65. "dataid": 54,
  66. "year": "2023",
  67. "where":{
  68. "isleave":"1"
  69. }
  70. }
  71. },
  72. yearNow:new Date(),
  73. list:[],
  74. list1:[],
  75. heightChart:'98%',
  76. isFull:false
  77. }
  78. },
  79. methods:{
  80. async listData(val){
  81. this.renderPie(val)
  82. },
  83. async queryModel(val,isleave,state){
  84. if (state == '状态'){
  85. this.$refs.departmentSalesperson.person = ''
  86. this.param.content.type = 1
  87. this.param.content.dataid = this.$refs.departmentSalesperson.depment ? this.$refs.departmentSalesperson.depment : -1
  88. }else {
  89. this.param.content.dataid = val?val : this.dataid
  90. }
  91. this.param.content.where.isleave = isleave
  92. this.param.content.year = new Date(this.yearNow).getFullYear()
  93. const res = await this.$api.requested(this.param)
  94. let amount = res.data.map(item=>{
  95. let value = this.tool.unitConversion(item.amount,10000)
  96. return {
  97. "value":value,
  98. "date":item.date,
  99. "type":this.$t('本期金额(万元)')
  100. }
  101. })
  102. let oldamount = res.data.map(item=>{
  103. let value = this.tool.unitConversion(item.oldamount,10000)
  104. return {
  105. "date":item.date,
  106. "value":value,
  107. "type":this.$t('去年同期金额(万元)')
  108. }
  109. })
  110. this.list = oldamount.concat(amount)
  111. this.list1 = res.data.map(item=>{
  112. return {
  113. "date":item.date,
  114. "tbzzl":Math.round((item.tbzzl * 100)*100)/100
  115. }
  116. })
  117. this.chartDualAxes.changeData([this.list,this.list1])
  118. state == '状态' ? this.personData(this.$refs.departmentSalesperson.depment) : ''
  119. },
  120. renderPie(val){
  121. this.chartDualAxes = new DualAxes('invoiceAmountAnalysisChart', {
  122. data: [this.list,this.list1],
  123. xField: 'date',
  124. yField: ['value','tbzzl'],
  125. meta:{
  126. tbzzl:{
  127. alias:this.$t('同比增长率')
  128. }
  129. },
  130. geometryOptions: [
  131. {
  132. geometry: 'column',
  133. isGroup: true,
  134. seriesField: 'type',
  135. color:['#62daab','#6395fa'],
  136. label:{
  137. position:top,
  138. formatter: (datum) =>{
  139. return '¥' + this.tool.formatAmount(datum.value,2)
  140. }
  141. }
  142. },
  143. {
  144. geometry: 'line',
  145. lineStyle: {
  146. lineWidth: 2,
  147. },
  148. color: '#F6903D',
  149. smooth: true,
  150. label:{
  151. formatter: (datum) =>{
  152. return datum.tbzzl + '%'
  153. }
  154. }
  155. },
  156. ],
  157. tooltip: {
  158. fields: ['type','tbzzl', 'value'],
  159. formatter: (datum) => {
  160. return {
  161. name:datum.type === undefined?this.$t('同比增长率'):datum.type,
  162. value:datum.value === undefined?datum.tbzzl + '%':'¥' + this.tool.formatAmount(datum.value,2)
  163. }
  164. }
  165. }
  166. });
  167. this.chartDualAxes.render();
  168. this.queryModel(val,this.param.content.where.isleave)
  169. },
  170. changeDate(){
  171. this.queryModel(this.param.content.dataid,this.param.content.where.isleave)
  172. },
  173. /*选择部门*/
  174. depSelect(val){
  175. this.param.content.type = 1
  176. this.param.content.dataid = val?val:-1
  177. this.personData(this.param.content.dataid)
  178. this.queryModel(this.param.content.dataid,this.param.content.where.isleave)
  179. },
  180. /*选择业务员*/
  181. personSelect(val){
  182. if (val || this.$refs.departmentSalesperson.depment){
  183. this.param.content.type = val?0:1
  184. this.param.content.dataid = val?val:this.$refs.departmentSalesperson.depment
  185. }else {
  186. this.param.content.type = 1
  187. this.param.content.dataid = -1
  188. }
  189. this.queryModel(this.param.content.dataid,this.param.content.where.isleave)
  190. },
  191. /*获取新的业务员列表*/
  192. async personData(depid){
  193. let param = {
  194. id: 20230620102004,
  195. content: {
  196. isleave:this.param.content.where.isleave,
  197. depid:depid
  198. },
  199. }
  200. const res = await this.$api.requested(param)
  201. this.$refs.departmentSalesperson.personnelList = res.data.hr
  202. },
  203. /*全屏*/
  204. onFull(){
  205. this.heightChart = 'calc(100vh - 85px)'
  206. this.isFull = true
  207. },
  208. /*退出全屏*/
  209. backFull(val){
  210. this.heightChart = '98%'
  211. this.isFull = false
  212. this.$emit('backFull',val)
  213. }
  214. }
  215. }
  216. </script>
  217. <style scoped>
  218. </style>