delayedShipmentAnalysis.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. <template>
  2. <div class="div-box-new-margin">
  3. <div class="div-border-box" id="delayedShipmentFull">
  4. <div class="out">
  5. <div>
  6. <div class="div-line div-line-right"></div>
  7. <div class="title" style="min-width: 220px;">近12月延期出货情况分析</div>
  8. </div>
  9. <div class="in">
  10. <div class="inline-16 mt-10">
  11. <departmentSalesperson ref="departmentSalesperson" @depSelect="depSelect" @personSelect="personSelect" :isFull="isFull"></departmentSalesperson>
  12. </div>
  13. <div class="mt-10 inline-16">
  14. <span class="search__label inline-16">分析日期:</span>
  15. <el-date-picker
  16. :append-to-body="!isFull"
  17. v-model="enddate"
  18. type="date"
  19. :clearable="false"
  20. @change="changeDate"
  21. format="yyyy-MM-dd"
  22. value-format="yyyy-MM-dd"
  23. size="small"
  24. range-separator="至"
  25. start-placeholder="开始月份"
  26. end-placeholder="结束月份">
  27. </el-date-picker>
  28. </div>
  29. <div class="inline-15 mt-10">
  30. <exportFile :param="param" :columns="tablecols" fileName="近12月延期出货情况分析" :dataid="param.content.dataid"></exportFile>
  31. </div>
  32. <fullScreen domId="delayedShipmentFull" @onFull="onFull" @backFull="backFull"></fullScreen>
  33. </div>
  34. </div>
  35. <div class="chart">
  36. <div id="delayedShipmentAnalysisChart" :style="{height: heightChart}"></div>
  37. </div>
  38. <div style="font-size: 16px;color: #333333;margin: 10px 0 10px 0">{{param.content.dateType?param.content.dateType:'全部'}}</div>
  39. <div :style="{height: heightTable}">
  40. <tableTemplate ref="table" :layout="tablecols" :data="list" :opwidth="200" :custom="true" :height="height">
  41. <template v-slot:customcol="scope">
  42. <p v-if="scope.column.columnname === 'province'">
  43. {{scope.column.data.province+scope.column.data.city+scope.column.data.county}}
  44. </p>
  45. <p v-else-if="scope.column.columnname === 'marketprice'">
  46. <span v-if="scope.column.data[scope.column.columnname]">
  47. ¥{{tool.formatAmount(scope.column.data[scope.column.columnname],2)}}
  48. </span>
  49. <span v-else>--</span>
  50. </p>
  51. <p v-else-if="scope.column.columnname === 'defaultprice'">
  52. <span v-if="scope.column.data[scope.column.columnname]">
  53. ¥{{tool.formatAmount(scope.column.data[scope.column.columnname],2)}}
  54. </span>
  55. <span v-else>--</span>
  56. </p>
  57. <p v-else-if="scope.column.columnname === 'defaultamount'">
  58. <span v-if="scope.column.data[scope.column.columnname]">
  59. ¥{{tool.formatAmount(scope.column.data[scope.column.columnname],2)}}
  60. </span>
  61. <span v-else>--</span>
  62. </p>
  63. <p v-else-if="scope.column.columnname === 'price'">
  64. <span v-if="scope.column.data[scope.column.columnname]">
  65. ¥{{tool.formatAmount(scope.column.data[scope.column.columnname],2)}}
  66. </span>
  67. <span v-else>--</span>
  68. </p>
  69. <p v-else-if="scope.column.columnname === 'amount'">
  70. <span v-if="scope.column.data[scope.column.columnname]">
  71. ¥{{tool.formatAmount(scope.column.data[scope.column.columnname],2)}}
  72. </span>
  73. <span v-else>--</span>
  74. </p>
  75. <p v-else>{{scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname]:'--'}}</p>
  76. </template>
  77. </tableTemplate>
  78. <div class="container normal-panel" style="text-align:right;float: right;">
  79. <el-pagination
  80. background
  81. @size-change="handleSizeChange"
  82. @current-change="handleCurrentChange"
  83. :current-page="currentPage"
  84. :pager-count="7"
  85. :page-sizes="[20, 50,100, 200]"
  86. :page-size="20"
  87. layout="total,sizes, prev, pager, next, jumper"
  88. :total="total">
  89. </el-pagination>
  90. </div>
  91. </div>
  92. </div>
  93. </div>
  94. </template>
  95. <script>
  96. import { Bar } from '@antv/g2plot';
  97. import departmentSalesperson from "@/views/salesData/components/departmentSalesperson";
  98. import tableTemplate from '@/views/salesData/components/table';
  99. import fullScreen from "@/views/salesData/components/fullScreen";
  100. import exportFile from '@/components/export_file/index'
  101. export default {
  102. name: "delayedShipmentAnalysis",
  103. props:['dataid','scrollHeight','windowWidth'],
  104. components:{departmentSalesperson,tableTemplate,fullScreen,exportFile},
  105. data(){
  106. return {
  107. chartBar:null,
  108. param:{
  109. "id": 20231012163804,
  110. "content": {
  111. "type": 0,
  112. "dataid": '',
  113. "enddate": "",//分析日期
  114. "dateType": "",//图标联动 一周 一月 一季 一季以上 可不传 不传默认查全部
  115. "pageSize":20,
  116. "pageNumber":1
  117. }
  118. },
  119. list:[],
  120. chartData:[],
  121. tablecols:[],
  122. currentPage:0,
  123. total:0,
  124. enddate:new Date().getFullYear() + '-' + (new Date().getMonth() + 1) + '-' + new Date().getDate(),
  125. hoverData:[],
  126. heightChart:'100%',
  127. heightTable:'403px',
  128. height:'356px',
  129. isFull:false
  130. }
  131. },
  132. methods:{
  133. async listData(val){
  134. this.renderPie(val)
  135. },
  136. async queryModel(val){
  137. this.param.content.dataid = val || this.dataid
  138. const res = await this.$api.requested(this.param)
  139. if (res.data.length === 1){
  140. if (res.data[0].isEmpty == 1){
  141. this.list = []
  142. this.total = 0
  143. this.currentPage = 0
  144. }else {
  145. this.list = res.data
  146. this.total = res.total
  147. this.currentPage = res.data.currentPage
  148. }
  149. }else {
  150. this.list = res.data
  151. this.total = res.total
  152. this.currentPage = res.data.currentPage
  153. }
  154. this.chartData = res.data[0].trend.map(item=>{
  155. return {
  156. "sequence": item.sequence,
  157. "value": item.value,
  158. "key": item.key,
  159. "type":'订单行数'
  160. }
  161. })
  162. this.chartBar.changeData(this.chartData)
  163. },
  164. renderPie(val){
  165. this.chartBar = new Bar('delayedShipmentAnalysisChart', {
  166. data:this.chartData,
  167. xField: 'value',
  168. yField: 'key',
  169. seriesField: 'type',
  170. label:{
  171. position:top
  172. },
  173. legend: {
  174. position: 'top-left',
  175. },
  176. interactions: [{ type: 'element-single-selected' }]
  177. });
  178. this.chartBar.on('plot:click',ev=>{
  179. const states = this.chartBar.getStates()
  180. this.param.content.dateType = states.length === 0 ?'':ev.data.data.key
  181. this.param.content.pageNumber = 1
  182. this.queryTable(this.param.content.dataid)
  183. })
  184. this.chartBar.render();
  185. this.queryModel(val)
  186. },
  187. async queryTable(val){
  188. this.param.content.dataid = val || this.dataid
  189. const res = await this.$api.requested(this.param)
  190. this.list = res.data
  191. this.total = res.total
  192. this.currentPage = res.pageNumber
  193. },
  194. changeDate(){
  195. this.queryModel(this.param.content.dataid)
  196. },
  197. /*选择部门*/
  198. depSelect(val){
  199. this.param.content.type = 1
  200. this.param.content.dataid = val
  201. this.queryModel(val)
  202. },
  203. /*选择业务员*/
  204. personSelect(val){
  205. this.param.content.type = 0
  206. this.param.content.dataid = val
  207. this.queryModel(val)
  208. },
  209. handleSizeChange(val) {
  210. // console.log(`每页 ${val} 条`);
  211. this.param.content.pageSize = val
  212. this.queryTable(this.param.content.dataid)
  213. },
  214. handleCurrentChange(val) {
  215. // console.log(`当前页: ${val}`);
  216. this.param.content.pageNumber = val
  217. this.queryTable(this.param.content.dataid)
  218. },
  219. /*全屏*/
  220. onFull(){
  221. /*this.heightChart = 'calc(100vh - 85px)'*/
  222. this.heightChart = '98%'
  223. /* this.heightTable = '883px'
  224. this.height = '886px'*/
  225. this.heightTable = 'calc(100vh - 800px)'
  226. this.height = this.windowWidth > 1205 ? 'calc(100vh - 555px)' :'calc(100vh - 620px)'
  227. this.isFull = true
  228. },
  229. /*退出全屏*/
  230. backFull(val){
  231. this.heightChart = '100%'
  232. this.heightTable = '403px'
  233. this.height = '356px'
  234. this.isFull = false
  235. this.$emit('backFull',val)
  236. }
  237. },
  238. created() {
  239. this.tablecols = this.tool.tabelCol(this.$route.name).delayedShipmentTable.tablecols
  240. }
  241. }
  242. </script>
  243. <style scoped>
  244. </style>