You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

285 lines
8.4 KiB

4 years ago
  1. <template>
  2. <section>
  3. <el-dialog :title="(filters.project?'【'+filters.project.name+'】':'')+'任务属性分布'" append-to-body modal-append-to-body width="80%" top="20px" :visible.sync="visible">
  4. <el-row :gutter="5">
  5. <el-col :span="18">
  6. <div>
  7. <div class="main" id="xmTaskAttDist"
  8. style="width:100%;height:600px;margin:0 auto;"></div>
  9. <div class="progress"></div>
  10. </div>
  11. </el-col>
  12. <el-col :span="6" class="border">
  13. <el-form :label-position="'top'" label-width="120px" :model="filters">
  14. <el-form-item label="分组属性">
  15. <el-select v-model="groupBy" @change="onXmTaskSomeFieldsChange('groupBy',$event)" clearable>
  16. <el-option v-for="i in this.groupBys" :label="i.name" :key="i.id" :value="i.id"></el-option>
  17. </el-select>
  18. </el-form-item>
  19. <xm-project-select class="padding" v-if="!xmProject" ref="xmProjectSelect" style="display:inline;" :auto-select="false" :link-project-id="xmProject?xmProject.id:null" @row-click="onProjectSelected" :iterationId="xmIteration?xmIteration.id:null" @clear="onProjectClear"></xm-project-select>
  20. <el-form-item label="任务状态" prop="taskState">
  21. <el-select v-model="filters.taskState" @change="onXmTaskSomeFieldsChange('taskState',$event)" clearable>
  22. <el-option v-for="i in this.dicts.taskState" :label="i.name" :key="i.id" :value="i.id"></el-option>
  23. </el-select>
  24. </el-form-item>
  25. <el-form-item label="任务类型" prop="taskType" >
  26. <el-select v-model="filters.taskType" @change="onXmTaskSomeFieldsChange('taskType',$event)" clearable>
  27. <el-option v-for="i in this.dicts.taskType" :label="i.name" :key="i.id" :value="i.id"></el-option>
  28. </el-select>
  29. </el-form-item>
  30. <el-form-item label="计划类型" prop="planType">
  31. <el-select v-model="filters.planType" @change="onXmTaskSomeFieldsChange('planType',$event)" clearable>
  32. <el-option v-for="i in this.dicts.planType" :label="i.name" :key="i.id" :value="i.id"></el-option>
  33. </el-select>
  34. </el-form-item>
  35. <el-form-item label="结算方案" prop="settleSchemel" >
  36. <el-select v-model="filters.settleSchemel" @change="onXmTaskSomeFieldsChange('settleSchemel',$event)" clearable>
  37. <el-option v-for="i in this.dicts.xmTaskSettleSchemel" :label="i.name" :key="i.id" :value="i.id"></el-option>
  38. </el-select>
  39. </el-form-item>
  40. <el-form-item label="优先级" prop="priority" >
  41. <el-select v-model="filters.priority" @change="onXmTaskSomeFieldsChange('priority',$event)" clearable>
  42. <el-option v-for="i in dicts.priority" :label="i.name" :key="i.id" :value="i.id"></el-option>
  43. </el-select>
  44. </el-form-item>
  45. <el-form-item>
  46. <el-button type="primary" icon="el-icon-search" @click="searchXmTaskAttDist">查询</el-button>
  47. </el-form-item>
  48. </el-form>
  49. </el-col>
  50. </el-row>
  51. </el-dialog>
  52. </section>
  53. </template>
  54. <script>
  55. import util from '@/common/js/util';//全局公共库
  56. import { initSimpleDicts } from '@/api/mdp/meta/item';//下拉框数据查询
  57. import { mapGetters } from 'vuex'
  58. import { getXmTaskAttDist } from '@/api/xm/core/xmTask';
  59. import XmProjectSelect from '@/views/xm/core/components/XmProjectSelect';//新增界面
  60. export default {
  61. components: {
  62. XmProjectSelect,
  63. },
  64. props:['xmProduct','xmIteration','xmProject'],
  65. computed: {
  66. ...mapGetters([
  67. 'userInfo','roles'
  68. ]),
  69. xmTaskAttDistsCpd(){
  70. if(this.xmTaskAttDists.length==0){
  71. return []
  72. }else{
  73. var itemId="";
  74. if(this.groupBy=='task_state'){
  75. itemId="taskState"
  76. }else if(this.groupBy=='settle_schemel'){
  77. itemId="xmTaskSettleSchemel"
  78. }else if(this.groupBy=='task_type'){
  79. itemId="taskType"
  80. }else if(this.groupBy=='priority'){
  81. itemId="priority"
  82. }else if(this.groupBy=='plan_type'){
  83. itemId="planType"
  84. }
  85. return this.xmTaskAttDists.map(i=>{
  86. var data={...i}
  87. data.name=this.formatDict(itemId,data.name)
  88. return data;
  89. })
  90. }
  91. },
  92. title(){
  93. return this.groupBys.find(i=>i.id==this.groupBy).name+'数量分布'
  94. },
  95. legendCpd(){
  96. var itemId="";
  97. if(this.groupBy=='task_state'){
  98. itemId="taskState"
  99. }else if(this.groupBy=='settle_schemel'){
  100. itemId="xmTaskSettleSchemel"
  101. }else if(this.groupBy=='task_type'){
  102. itemId="taskType"
  103. }else if(this.groupBy=='priority'){
  104. itemId="priority"
  105. }else if(this.groupBy=='plan_type'){
  106. itemId="planType"
  107. }
  108. return this.dicts[itemId].map(i=>i.name)
  109. }
  110. },
  111. watch: {
  112. xmTaskAttDistsCpd(){
  113. this.drawCharts();
  114. }
  115. },
  116. data() {
  117. return {
  118. filters:{
  119. product:null,
  120. iteration:null,
  121. },
  122. groupBy:'task_state',
  123. groupBys:[
  124. {id:'task_state', name:'任务状态'},
  125. {id:'task_type', name:'任务类型'},
  126. {id:'plan_type', name:'计划类型'},
  127. {id:'settle_schemel', name:'结算方案'},
  128. {id:'priority', name:'优先级'}
  129. ],
  130. dicts:{},//下拉选择框的所有静态数据 params=[{categoryId:'0001',itemCode:'sex'}] 返回结果 {'sex':[{optionValue:'1',optionName:'男',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'女',seqOrder:'2',fp:'',isDefault:'0'}]}
  131. load:{ list: false, edit: false, del: false, add: false },//查询中...
  132. dateRanger:[],
  133. maxTableHeight:300,
  134. visible:false,
  135. xmTaskAttDists:[],
  136. }//end return
  137. },//end data
  138. methods: {
  139. formatDict(itemId,val){
  140. var dict=this.dicts[itemId]
  141. if(dict){
  142. var item=dict.find(i=>i.id==val)
  143. if(item){
  144. return item.name
  145. }
  146. }
  147. return val;
  148. },
  149. findMax( list ) {
  150. var i, max = list[0];
  151. if(list.length < 2) return max;
  152. for (i = 0; i < list.length; i++) {
  153. if (list[i].distBudgetWorkload > max.distBudgetWorkload) {
  154. max = list[i];
  155. }
  156. }
  157. return max;
  158. },
  159. open(params){
  160. this.visible=true;
  161. this.filters.product=params.xmProduct
  162. this.filters.project=params.xmProject
  163. this.filters.Product=params.xmProduct
  164. },
  165. drawCharts() {
  166. this.myChart = this.$echarts.init(document.getElementById("xmTaskAttDist"));
  167. this.myChart.setOption(
  168. {
  169. title: {
  170. text: this.title,
  171. left: 'center'
  172. },
  173. tooltip: {
  174. trigger: 'item'
  175. },
  176. legend: {
  177. top:'5%',
  178. left: 'center',
  179. data:this.legendCpd,
  180. },
  181. series: [
  182. {
  183. type: 'pie',
  184. radius: '50%',
  185. data: this.xmTaskAttDistsCpd,
  186. emphasis: {
  187. itemStyle: {
  188. shadowBlur: 10,
  189. shadowOffsetX: 0,
  190. shadowColor: 'rgba(0, 0, 0, 0.5)'
  191. }
  192. },
  193. label: {
  194. show: true,
  195. position: 'center'
  196. },
  197. }
  198. ]
  199. }
  200. )
  201. },
  202. onXmTaskSomeFieldsChange(fieldName,$event){
  203. this.xmTaskAttDists=[]
  204. },
  205. searchXmTaskAttDist(){
  206. if(!this.groupBy){
  207. this.$notify({position:'bottom-left',showClose:true,message:'请选中分组属性',type:'warning'})
  208. return
  209. }
  210. var params={}
  211. if(this.filters.taskType){
  212. params.taskType=this.filters.taskType
  213. }
  214. if(this.filters.taskState){
  215. params.taskState=this.filters.taskState
  216. }
  217. if(this.filters.planType){
  218. params.planType=this.filters.planType
  219. }
  220. if(this.filters.settleSchemel){
  221. params.settleSchemel=this.filters.settleSchemel
  222. }
  223. if(this.filters.priority){
  224. params.priority=this.filters.priority
  225. }
  226. params.groupBy=this.groupBy
  227. if(this.filters.project){
  228. params.projectId=this.filters.project.id
  229. }
  230. if(this.filters.iteration){
  231. params.iterationId=this.filters.iteration.id
  232. }
  233. getXmTaskAttDist(params).then(res=>{
  234. this.xmTaskAttDists=res.data.data
  235. })
  236. },
  237. onProjectSelected(project){
  238. this.filters.project=project
  239. },
  240. onProjectClear(){
  241. this.filters.project=null
  242. },
  243. onIterationSelected(iteration){
  244. this.filters.iteration=iteration
  245. },
  246. onIterationClear(){
  247. this.filters.iteration=null
  248. }
  249. },//end method
  250. mounted() {
  251. initSimpleDicts('all',['planType','xmTaskSettleSchemel','taskType','priority','taskState'] ).then(res=>{
  252. this.dicts=res.data.data;
  253. })
  254. //this.charts();
  255. //this.drawCharts();
  256. }//end mounted
  257. }
  258. </script>
  259. <style scoped>
  260. .image {
  261. width: 100%;
  262. display: block;
  263. }
  264. </style>