wenbobowen преди 4 години
родител
ревизия
0d26ff80bc
променени са 33 файла, в които са добавени 400 реда и са изтрити 100 реда
  1. 18 0
      src/api/statisticsApi/requireStatistics.js
  2. 18 0
      src/api/statisticsApi/taskStatistics.js
  3. 27 0
      src/api/toConfigure.js
  4. BIN
      src/assets/carousel/图层1.png
  5. BIN
      src/assets/carousel/图层2.png
  6. BIN
      src/assets/carousel/图层3.png
  7. BIN
      src/assets/home_images/Group2x.png
  8. BIN
      src/assets/home_images/banner_pic.png
  9. BIN
      src/assets/home_images/banner_pic@2x.png
  10. BIN
      src/assets/home_images/banner_pic@3x.png
  11. BIN
      src/assets/home_images/home.jpg
  12. BIN
      src/assets/home_images/home.png
  13. 1 1
      src/components/newLayout/Aside.vue
  14. 12 1
      src/components/select/searchPeople.vue
  15. 5 4
      src/icons/svg/select-business.svg
  16. 5 1
      src/views/ToConfigure/components/AddTeamMembers.vue
  17. 69 8
      src/views/ToConfigure/components/MemberDetails.vue
  18. 10 1
      src/views/ToConfigure/components/memberSetup.vue
  19. 1 1
      src/views/home/index.vue
  20. 14 4
      src/views/projectManage/components/demand.vue
  21. 4 3
      src/views/projectManage/components/scheduleList.vue
  22. 60 54
      src/views/projectManage/dialog_vue.vue
  23. 2 1
      src/views/projectManage/iteration/components/demand.vue
  24. 8 3
      src/views/projectManage/projectList/components/scheduleList.vue
  25. 3 2
      src/views/projectManage/requirement/components/scheduleList.vue
  26. 3 3
      src/views/projectManage/requirement/components/taskList.vue
  27. 8 3
      src/views/projectManage/taskList/components/scheduleList.vue
  28. 8 3
      src/views/projectManage/taskList/taskViewDetail.vue
  29. 8 3
      src/views/projectManage/version/components/scheduleList.vue
  30. 1 1
      src/views/quality/components/developmentCycle.vue
  31. 57 2
      src/views/quality/requireStatistics.vue
  32. 57 1
      src/views/quality/taskStatistics.vue
  33. 1 0
      src/views/reportManagement/daily/components/dailyDetails.vue

+ 18 - 0
src/api/statisticsApi/requireStatistics.js

@@ -89,3 +89,21 @@ export function getBugStatisticData(data) {
     data
   })
 }
+
+// 需求人力统计
+export function getManpowerStatistics(data) {
+  return request({
+    url: TeamManagement + '/requirement/getManpowerStatistics',
+    method: 'post',
+    data
+  })
+}
+
+// 需求人力分布图
+export function getManpowerDistributedData(data) {
+  return request({
+    url: TeamManagement + '/requirement/getManpowerDistributedData',
+    method: 'post',
+    data
+  })
+}

+ 18 - 0
src/api/statisticsApi/taskStatistics.js

@@ -97,3 +97,21 @@ export function getBugStatisticData(data) {
     data
   })
 }
+
+// 人力统计
+export function getManpowerStatistics(data) {
+  return request({
+    url: TeamManagement + '/task/getManpowerStatistics',
+    method: 'post',
+    data
+  })
+}
+
+// 人力分布图
+export function getManpowerDistributedData(data) {
+  return request({
+    url: TeamManagement + '/task/getManpowerDistributedData',
+    method: 'post',
+    data
+  })
+}

+ 27 - 0
src/api/toConfigure.js

@@ -141,3 +141,30 @@ export function teamAddMemberToGroup(data) {
     data
   })
 }
+
+// 全部成员搜索
+export function getMembersBelongBiz(data) {
+  return request({
+    url: TeamManagement + `/setting/getMembersBelongBiz`,
+    method: 'post',
+    data
+  })
+}
+
+// 未加入团队成员搜索
+export function getMembersWithoutTeam(data) {
+  return request({
+    url: TeamManagement + `/setting/getMembersWithoutTeam`,
+    method: 'post',
+    data
+  })
+}
+
+// 团队成员搜索
+export function queryMemberInfoByIDAPorNameAndTeam(data) {
+  return request({
+    url: TeamManagement + `/member/queryMemberInfoByIDAPorNameAndTeam`,
+    method: 'post',
+    data
+  })
+}

BIN
src/assets/carousel/图层1.png


BIN
src/assets/carousel/图层2.png


BIN
src/assets/carousel/图层3.png


BIN
src/assets/home_images/Group2x.png


BIN
src/assets/home_images/banner_pic.png


BIN
src/assets/home_images/banner_pic@2x.png


BIN
src/assets/home_images/banner_pic@3x.png


BIN
src/assets/home_images/home.jpg


BIN
src/assets/home_images/home.png


+ 1 - 1
src/components/newLayout/Aside.vue

@@ -18,7 +18,7 @@
         >
           <img src="../../assets/业务线选择.png" class="business-logo"><span v-show="showBizIdSelect">项目管理首页</span>
         </div>
-        {{ bizName }}
+        <span style="font-size: 16px;">{{ bizName }}</span>
         <div
           class="icon-select"
           @mouseenter="showBizIdSelect = true"

+ 12 - 1
src/components/select/searchPeople.vue

@@ -8,7 +8,7 @@
     :remote-method="remoteMethod"
     :loading="loading"
     :size="size"
-    placeholder="请输入姓名或邮箱前缀"
+    :placeholder="placeholder"
     :disabled="disabled"
     @change="changeSelect"
   >
@@ -17,6 +17,7 @@
       :key="item.idap"
       :label="item.name"
       :value="item.idap"
+      @click.native="$emit('memberData', item)"
     >
       <div class="item-style">
         <div class="item-detail">{{ item.deptName }}</div>
@@ -35,6 +36,11 @@ export default {
       default: '',
       required: false
     },
+    placeholder: {
+      type: String,
+      default: '请输入姓名或邮箱前缀',
+      required: false
+    },
     size: {
       type: String,
       default: 'small',
@@ -60,6 +66,7 @@ export default {
     return {
       searchValue: this.value,
       loading: false,
+      memberObj: {},
       options: [],
       firstGetArr: true // 是否第一次获取数组
     }
@@ -67,6 +74,7 @@ export default {
   watch: {
     value: {
       handler(newV, oldV) {
+        console.log(this.searchValue, newV, this.searchValue === newV)
         if (this.searchValue === newV) {
           return
         }
@@ -86,6 +94,9 @@ export default {
       immediate: true
     }
   },
+  mounted() {
+    this.initMore(this.searchValue)
+  },
   methods: {
     remoteMethod(query) {
       query !== '' ? this.getMember(query) : this.options = []

+ 5 - 4
src/icons/svg/select-business.svg

@@ -1,10 +1,11 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="12.498" height="11.601" viewBox="0 0 12.498 11.601">
+<svg xmlns="http://www.w3.org/2000/svg" width="11.735" height="10.893" viewBox="0 0 11.735 10.893">
   <g id="组_2643" data-name="组 2643" transform="translate(6386.718 121.762)">
     <g id="组_2644" data-name="组 2644" transform="translate(-6386.718 -121.762)">
-      <path id="减去_1" data-name="减去 1" d="M3.584,4.137a6.168,6.168,0,0,1-1.457-.16A4.116,4.116,0,0,1,1,3.539a2.345,2.345,0,0,1-.734-.652A1.365,1.365,0,0,1,0,2.087a1.475,1.475,0,0,1,.255-.818A2.282,2.282,0,0,1,.988.585,4.056,4.056,0,0,1,2.156.126a2.867,2.867,0,0,1,.672-.1c.1-.006.213-.013.377-.025L2.78.544C1.383.678.652,1.4.652,2.047c0,.831,1.336,1.508,2.979,1.508,1.705,0,2.958-.634,2.978-1.508a.906.906,0,0,0-.226-.624.021.021,0,0,0-.009-.012l.274-.355h0a.846.846,0,0,1,.329.255,1.037,1.037,0,0,1,.26.743,1.34,1.34,0,0,1-.279.806,2.464,2.464,0,0,1-.774.662,4.539,4.539,0,0,1-1.158.449,5.828,5.828,0,0,1-1.28.164Z" transform="translate(0 6.742)" fill="#333"/>
-      <g id="点击添加" transform="matrix(0.799, 0.602, -0.602, 0.799, 6.33, 0)">
-        <path id="路径_13033" data-name="路径 13033" d="M5.643,0H2.093a1.076,1.076,0,0,0-.979.625.455.455,0,0,0-.023.053L.142,3.532A1.169,1.169,0,0,0,.595,5.107a1.193,1.193,0,0,0,1.416-.175V7.488a1.238,1.238,0,0,0,2.475,0V5.4c2.106-.185,2.128-.188,2.143-.191A1.194,1.194,0,0,0,7.723,4.07c0-.041,0-.137-.636-3.164C6.9.224,6.534,0,5.643,0ZM1.7.906A.438.438,0,0,1,2.093.648h3.55c.7,0,.73.112.814.411.221,1.056.584,2.806.617,3.026-.01.293-.289.444-.551.487l-2.39.211a.324.324,0,0,0-.3.323V7.488a.589.589,0,0,1-1.178,0V3.407A.324.324,0,0,0,2.032,3.3L1.64,4.372a.558.558,0,0,1-.723.172.524.524,0,0,1-.25-.321.513.513,0,0,1,.054-.4.324.324,0,0,0,.028-.062L1.7.906Zm0,0" transform="translate(0 0)" fill="#333"/>
+      <path id="减去_1" data-name="减去 1" d="M3.365,3.885A5.792,5.792,0,0,1,2,3.734,3.865,3.865,0,0,1,.937,3.323a2.2,2.2,0,0,1-.689-.612A1.282,1.282,0,0,1,0,1.96a1.385,1.385,0,0,1,.239-.768A2.143,2.143,0,0,1,.928.55a3.809,3.809,0,0,1,1.1-.432A2.692,2.692,0,0,1,2.656.024c.089-.005.2-.012.354-.024l-.4.511c-1.312.126-2,.805-2,1.412,0,.781,1.255,1.416,2.8,1.416,1.6,0,2.777-.6,2.8-1.416a.851.851,0,0,0-.212-.586.02.02,0,0,0-.009-.011L6.242.993h0a.794.794,0,0,1,.309.239.974.974,0,0,1,.244.7,1.258,1.258,0,0,1-.262.757,2.314,2.314,0,0,1-.727.622,4.262,4.262,0,0,1-1.087.422,5.472,5.472,0,0,1-1.2.154Z" transform="translate(0 6.331)" fill="#409eff"/>
+      <g id="点击添加" transform="matrix(0.799, 0.602, -0.602, 0.799, 5.944, 0)">
+        <path id="路径_13033" data-name="路径 13033" d="M5.3,0H1.965a1.01,1.01,0,0,0-.919.587.427.427,0,0,0-.021.05L.134,3.316A1.1,1.1,0,0,0,.559,4.8a1.12,1.12,0,0,0,1.33-.164v2.4a1.162,1.162,0,0,0,2.324,0V5.074c1.978-.173,2-.177,2.013-.179A1.121,1.121,0,0,0,7.251,3.822c0-.038,0-.129-.6-2.971C6.476.21,6.135,0,5.3,0Zm-3.7.851A.411.411,0,0,1,1.965.609H5.3c.656,0,.686.105.764.386.207.992.548,2.635.579,2.841-.009.275-.271.417-.517.457l-2.244.2a.3.3,0,0,0-.278.3V7.031a.553.553,0,0,1-1.106,0V3.2a.3.3,0,0,0-.59-.1L1.54,4.105a.524.524,0,0,1-.679.161.492.492,0,0,1-.234-.3.482.482,0,0,1,.05-.371A.3.3,0,0,0,.7,3.536L1.595.851Zm0,0" transform="translate(0 0)" fill="#409eff"/>
       </g>
     </g>
   </g>
 </svg>
+

+ 5 - 1
src/views/ToConfigure/components/AddTeamMembers.vue

@@ -73,6 +73,9 @@ export default {
       handler(newV) {
         if (newV) {
           this.type = newV
+          if (this.type.optionList) {
+            this.teamMemberList.push({ ...this.type.optionList, memberName: this.type.optionList.name, memberIDAP: this.type.optionList.idap })
+          }
         }
       },
       deep: true,
@@ -81,7 +84,8 @@ export default {
   },
   methods: {
     async teamChange(val) {
-      this.teamMemberList.push(val)
+      const data = this.teamMemberList.find(item => { return item.memberIDAP === val.memberIDAP })
+      data ? this.$message('不能重复添加') : this.teamMemberList.push(val)
       this.teamData = null
       this.options = []
     },

+ 69 - 8
src/views/ToConfigure/components/MemberDetails.vue

@@ -1,12 +1,21 @@
 <template>
   <el-container>
     <div class="team_space_between">
-      <div class="team_title">{{ titleName === '全部成员' || titleName === '未加入团队的成员' ? '成员' : '团队' }}-{{ titleName }}</div>
+      <div style="flex: 1;display: flex; justify-content: space-start;">
+        <div class="team_title">{{ titleName === '全部成员' || titleName === '未加入团队的成员' ? '成员' : '团队' }}-{{ titleName }} </div>
+        <searchPeople :value.sync="member_query_name" :size="'medium'" style="width: 30%; line-height: 40px;" :placeholder="'请输入姓名或邮箱前缀搜索'" @memberData="getOptions" @change="getMenber(member_query_name)" />
+      </div>
       <el-button v-if="titleName === '全部成员' || titleName === '未加入团队的成员'" type="primary" size="mini" icon="el-icon-plus" @click="setMember({}, '添加成员')">添加成员</el-button>
-      <el-button v-else type="primary" size="mini" icon="el-icon-plus" @click="setTeamMember">添加团队成员</el-button>
+      <el-button v-else type="primary" size="mini" icon="el-icon-plus" @click="setTeamMember(1)">添加团队成员</el-button>
     </div>
     <el-main>
-      <el-table :data="AllMember" max-height="610" :header-cell-style="{ backgroundColor: '#F4F4F4', color: '#444444', fontSize: '14px', fontWeight: '500'}">
+      <div v-if="addMember" align="center">
+        <div>人员不是{{ titleName === '全部成员' ? '业务线' : '团队' }}成员!
+          <el-button v-if="titleName === '全部成员' || titleName === '未加入团队的成员'" type="text" size="mini" @click="setMember(optionList, '添加成员', 1)">添加成员</el-button>
+          <el-button v-else type="text" size="mini" @click="setTeamMember(2)">添加团队成员</el-button>
+        </div>
+      </div>
+      <el-table v-if="!addMember" :data="AllMember" max-height="610" :header-cell-style="{ backgroundColor: '#F4F4F4', color: '#444444', fontSize: '14px', fontWeight: '500'}">
         <el-table-column prop="date" label="姓名" min-width="200">
           <template slot-scope="scope">
             <div style="display: flex; justify-content: flex-start;">
@@ -51,7 +60,7 @@
       </el-table>
     </el-main>
     <el-footer style="text-align: right;">
-      <el-pagination :current-page.sync="currentPage" :page-size="10" layout="total, prev, pager, next" :total="total" background @size-change="handleSizeChange" @current-change="handleCurrentChange" />
+      <el-pagination v-if="!addMember" :current-page.sync="currentPage" :page-size="10" layout="total, prev, pager, next" :total="total" background @size-change="handleSizeChange" @current-change="handleCurrentChange" />
     </el-footer>
     <memberSetup v-if="memberSetupShow" :data="member_information" @update="settingGetMembersBelowBiz" />
     <teamMember v-if="teamMemberSetupShow" :data="type" @update="settingGetMembersBelowBiz" />
@@ -60,14 +69,16 @@
 
 <script>
 import { mapGetters } from 'vuex'
-import { teamQueryTeamInfo, settingGetMembersBelowBiz, settingGetMembersWithoutTeam } from '@/api/toConfigure.js'
+import { teamQueryTeamInfo, settingGetMembersBelowBiz, settingGetMembersWithoutTeam, getMembersBelongBiz, getMembersWithoutTeam, queryMemberInfoByIDAPorNameAndTeam } from '@/api/toConfigure.js'
 import memberSetup from './memberSetup.vue'
 import teamMember from './AddTeamMembers.vue'
+import searchPeople from '@/components/select/searchPeople' // 人员select
 
 export default {
   components: {
     memberSetup,
-    teamMember
+    teamMember,
+    searchPeople
   },
   props: {
     data: { type: [String, Object], required: true }
@@ -79,10 +90,13 @@ export default {
       curIndex: 1,
       type: '',
       total: 0,
+      optionList: {},
+      member_query_name: '', // 筛选
       memberSetupShow: false, // 团队成员移除。取消负责人。设置负责人
       teamMemberSetupShow: false, // 添加团队成员loading
       member_information: {},
       titleName: '全部成员',
+      addMember: false,
       AllMember: [] // 全部成员
     }
   },
@@ -111,6 +125,8 @@ export default {
   methods: {
     async settingGetMembersBelowBiz() {
       if (this.bizId === -1) return
+      this.member_query_name = ''
+      this.addMember = false
       if (this.type === 'all') {
         this.titleName = '全部成员'
         const res = await settingGetMembersBelowBiz({ bizId: this.bizId, pageSize: this.pageSize, curIndex: this.curIndex })
@@ -143,15 +159,55 @@ export default {
       this.teamMemberSetupShow = false
       this.$emit('update')
     },
-    setMember(data, name) { // 团队成员移除。取消负责人。设置负责人
+    getOptions(val) {
+      this.optionList = val
+    },
+    async getMenber(menber) {
+      const people = menber || ''
+      if (this.type === 'all') {
+        const data = { bizId: this.bizId, people: people }
+        const res = await getMembersBelongBiz(data)
+        if (res.code === 200 && res.data[0]) {
+          this.AllMember = res.data
+          this.total = res.total
+          this.addMember = false
+        } else {
+          this.addMember = true
+        }
+      } else if (this.type === 'not') {
+        const data = { bizId: this.bizId, memberIDAP: menber, pageSize: 10, curIndex: 1 }
+        const res = await getMembersWithoutTeam(data)
+        if (res.code === 200 && res.data[0]) {
+          this.AllMember = res.data
+          this.total = res.total
+          this.addMember = false
+        } else {
+          this.addMember = true
+        }
+      } else {
+        const people = menber || ''
+        const data = { bizId: this.bizId, memberIDAP: people, teamId: this.type.code, needPhoto: true }
+        const res = await queryMemberInfoByIDAPorNameAndTeam(data)
+        if (res.code === 200 && res.data[0]) {
+          this.AllMember = res.data
+          this.total = res.total
+          this.addMember = false
+        } else {
+          this.addMember = true
+        }
+      }
+    },
+    setMember(data, name, index) { // 团队成员移除。取消负责人。设置负责人
       data.teamName = this.titleName
       this.member_information = {
         data: data,
         name: name
       }
+      index ? this.member_information.index = index : ''
       this.memberSetupShow = true
     },
-    setTeamMember() { // 添加团队成员
+    setTeamMember(index) { // 添加团队成员
+      index === 2 ? this.type.optionList = this.optionList : delete this.type.optionList
       this.teamMemberSetupShow = true
     },
     handleSizeChange(val) {
@@ -177,6 +233,11 @@ export default {
   font-family: PingFang SC;
   font-weight: 500;
   color: #444444;
+  line-height: 40px;
+  margin-right: 20px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
 }
 .el-dropdown-link {
     cursor: pointer;

+ 10 - 1
src/views/ToConfigure/components/memberSetup.vue

@@ -76,7 +76,16 @@ export default {
   methods: {
     async teamModifyTeam() {
       this.titleName = this.type.name
-      this.type.name === '添加成员' ? '' : this.teamData = this.type.data
+      if (this.type.name === '添加成员') {
+        if (this.type.index) {
+          this.teamData.createMember = null
+          const data = []
+          data.push(this.type.data.idap)
+          this.teamData.createMember = data
+        }
+      } else {
+        this.teamData = this.type.data
+      }
       const res = await teamQueryTeamListBelowBiz(this.bizId)
       if (res.code === 200) {
         this.teamOption = res.data

+ 1 - 1
src/views/home/index.vue

@@ -58,7 +58,7 @@
           src="@/assets/home_images/banner_icon_arrow@3x.png"
         >
       </a>
-      <img style="width: 100%;z-index: -1;" src="@/assets/home_images/home.png">
+      <img style="width: 100%;z-index: -1;" src="@/assets/home_images/home.jpg">
     </div>
     <div id="content1" />
     <div class="div-main" style="height: 600pt;width 100%;text-align: center;">

+ 14 - 4
src/views/projectManage/components/demand.vue

@@ -8,8 +8,9 @@
       <el-table-column prop="type" label="类型" min-width="70" />
       <el-table-column prop="desc" label="描述" min-width="140" />
       <el-table-column prop="seperateDaysNoHoliday" label="排期" min-width="160" />
-      <el-table-column prop="dayLength" label="时长" min-width="50" />
+      <el-table-column prop="dayLength" label="使用天数" min-width="80" />
       <el-table-column prop="peopleList" label="参与人员" min-width="150" />
+      <el-table-column prop="manpower" label="使用人力(人日)" min-width="150" />
       <el-table-column prop="dayLength" label="关联任务" min-width="80" />
       <el-table-column label="操作" width="120" />
     </el-table>
@@ -154,9 +155,17 @@
 
     <!-- 日期详情 -->
     <el-row><span class="demandLayout">交付日期:</span><span class="demandeta">{{ dataList.endTime }}</span></el-row>
-    <el-row><span class="demandLayout">排期:</span><span class="demandeta">{{ dataList.startTime || '' }} ~ {{ dataList.endTime }}</span></el-row>
+    <el-row>
+      <span class="demandLayout">排期:</span>
+      <span class="demandeta">{{ dataList.startTime || '' }} ~ {{ dataList.endTime }}</span>
+      <span style="color: #999999; font-size: 14px;">{{ '(' + dataList.scheduleTimeAnnotation.所有 + ')' }}</span>
+    </el-row>
     <el-row :gutter="20">
-      <el-col v-for="(item, index) in scheduleDetail" :key="index" :span="6"><span class="demandLayout">{{ index }}:</span><span class="demandeta">{{ item.startTime }} ~ {{ item.endTime }}</span></el-col>
+      <el-col v-for="(item, index) in scheduleDetail" :key="index" :span="12">
+        <span class="demandLayout">{{ index }}:</span>
+        <span class="demandeta">{{ item.startTime }} ~ {{ item.endTime }}</span>
+        <span style="color: #999999; font-size: 14px;">{{ '(' + dataList.scheduleTimeAnnotation[index] + ')' }}</span>
+      </el-col>
     </el-row>
     <el-row>
       <span class="demandLayout">预计上线版本:</span>
@@ -565,11 +574,12 @@ export default {
   opacity:1;
 }
 .demandeta {
-  font-size:12px;
+  font-size:14px;
   font-family:MicrosoftYaHei;
   line-height:14px;
   color:rgba(51,51,51,1);
   opacity:1;
+  margin-right: 10px;
 }
 .iconEdit {
   width:100px;

+ 4 - 3
src/views/projectManage/components/scheduleList.vue

@@ -20,12 +20,13 @@
       </el-table-column>
       <el-table-column prop="desc" label="描述" min-width="140" align="left" />
       <el-table-column prop="seperateDaysNoHoliday" label="排期" min-width="160" show-overflow-tooltip />
-      <el-table-column prop="dayLength" label="时长" min-width="50" />
+      <el-table-column prop="dayLength" label="使用天数" min-width="80" />
       <el-table-column prop="peopleList" label="参与人员" min-width="150" show-overflow-tooltip>
         <template slot-scope="scope">
           <span v-for="(item, index) in scope.row.peopleObjectList" :key="index">{{ item.name }} {{ ' ' }}</span>
         </template>
       </el-table-column>
+      <el-table-column prop="manpower" label="使用人力(人日)" min-width="150" />
       <el-table-column prop="dayLength" class="popover-blue" label="关联任务" min-width="80">
         <template slot-scope="scope">
           <el-popover placement="bottom" title="关联任务" width="500" trigger="click">
@@ -170,8 +171,8 @@ export default {
     async listByTask(id) { // 获取排期列表
       this.$emit('listByTask')
     },
-    Task_Jump(id) {
-      const bizId_id = EncryptId(`${this.bizId}_${id}`)
+    Task_Jump(val) {
+      const bizId_id = EncryptId(`${val.bizId}_${val.id}`)
       const routeData = this.$router.push({ name: '任务详情', query: { bizId_id: bizId_id }})
       window.open(routeData.href, '_blank')
     },

+ 60 - 54
src/views/projectManage/dialog_vue.vue

@@ -33,8 +33,10 @@
               </el-select>
             </el-form-item>
             <el-form-item label="业务线" prop="bizId">
-              <el-select v-model="task_form.bizId" :disabled="true" filterable placeholder="请选择" style="width:20vw">
-                <el-option v-for="item in all_bizId" :key="item.code" :label="item.name" :value="item.code" />
+              <el-select v-model="task_form.bizId" :disabled="tit_Name === '编辑任务' || task_form.source !== 2" placeholder="请选择" style="width:100%" filterable @change="task_change_bizId(task_form.bizId)">
+                <el-option-group v-for="group in bizList" :key="group.code" :label="group.name">
+                  <el-option v-for="item in group.options" :key="item.code" :label="item.name" :value="item.code" />
+                </el-option-group>
               </el-select>
             </el-form-item>
             <el-form-item label="开发负责人">
@@ -57,7 +59,7 @@
               </el-radio-group>
             </el-form-item>
             <el-form-item label="模块" prop="moduleIds">
-              <el-cascader v-model="task_form.moduleIds" clearable collapse-tags :props="props" :options="business_platform_Modular" placeholder="请选择" style="width: 20vw" @click.native="bugDataGet" />
+              <el-cascader v-model="task_form.moduleIds" clearable collapse-tags :props="props" :options="business_platform_Modular" placeholder="请选择" style="width: 20vw" />
             </el-form-item>
             <el-form-item label="测试负责人">
               <el-select v-model="task_form.qaOwner" filterable clearable remote placeholder="请输入姓名或邮箱前缀" :remote-method="remoteMethod1" :loading="loading" style="width: 20vw">
@@ -103,7 +105,7 @@ import { mapGetters } from 'vuex'
 import { analysisBizId_id, EncryptId } from '@/utils/crypto-js.js'
 const _ = require('lodash')
 import { taskCreate, memberQueryMemberInfoByIDAPorName, configShowTaskEnum, configShowRequirementVersionEnum, taskGet, taskUpdate, projectListProject } from '@/api/taskIndex' // ajax
-import { projectList, settingGetBizList } from '@/api/projectIndex'
+import { projectList, settingGetBizList, settingGetMyAndOtherBizList } from '@/api/projectIndex'
 import { settingQueryBizModuleList } from '@/api/defectManage'
 export default {
   props: {
@@ -122,6 +124,7 @@ export default {
       ascription_project: false, // 归属项目(隐藏)
       ascription_demand: false, // 归属需求(隐藏)
       test: {},
+      bizList: [],
       loading: false,
       tit: '', // 跳转
       tit_Name: '', // 新建(编辑)
@@ -139,6 +142,7 @@ export default {
       demandList: [], // 需求list
       userInformation: localStorage.getItem('username'),
       userNames: localStorage.getItem('realname'),
+      requirementIdList: {},
       task_rulesForm: {
         name: [{ required: true, message: '请输入任务名称', trigger: 'blur' }],
         // moduleIds: [{ required: true, message: '请选择模块', trigger: 'blur' }],
@@ -159,10 +163,11 @@ export default {
   },
   created() {
     this.analysisBizId_id()
+    this.settingGetBizList()
   },
   mounted() {
     this.get_taskSelect()
-    this.bugDataGet()
+    this.bugDataGet(this.bizId)
   },
   methods: {
     analysisBizId_id() { // 解析路由中的bizId_id
@@ -171,42 +176,31 @@ export default {
       this.projectId = bizId_id[1]
       this.requireId = bizId_id[1]
     },
-    init(e, id, data = null) {
+    async init(e, id, data = null) {
       this.tit_Name = '新建任务'
       switch (e) {
         case 1: // 新建任务(任务主页)
-          this.task_form = {
-            followVersion: 2
-          }
           this.dialogFormVisible = true
           this.ascription_demand = false
           this.ascription_project = false
-          this.$set(this.task_form, 'notest', 0)
-          this.$set(this.task_form, 'followVersion', 2)
-          this.$set(this.task_form, 'source', 1)
-          this.$set(this.task_form, 'bizId', this.bizId)
+          this.task_form = { 'notest': 0, 'followVersion': 2, 'source': 1, 'bizId': this.bizId }
+          this.requirementIdList = { 'name': '主页' }
           this.show_Client = false
           this.$nextTick(() => {
             this.$refs['task_form'].clearValidate()
           })
+          this.task_change_bizId(this.bizId)
           break
         case 2: // 新建任务(项目详情)
           this.tit = '新建任务'
           projectList({ id: this.projectId, curIndex: 1, pageSize: 15 }).then(res => {
             this.dialogFormVisible = true
-            var that = this
-            setTimeout(function() {
-              that.task_form = {}
-              that.ascription_demand = false
-              that.ascription_project = true
-              that.$set(that.task_form, 'bizId', that.bizId)
-              that.$set(that.task_form, 'source', 3)
-              that.$set(that.task_form, 'notest', 0)
-              that.$set(that.task_form, 'followVersion', 2)
-              that.$set(that.task_form, 'requireId', res.data[0].id)
-              that.$set(that.task_form, 'projectId', res.data[0].id)
-              that.task_form.followVersion === 2 ? that.show_Client = false : ''
-            }, 300)
+            this.task_form = { 'followVersion': 2, 'notest': 0, 'source': 3, 'projectId': res.data[0].id, 'requireId': res.data[0].id, 'bizId': this.bizId }
+            this.requirementIdList = { 'name': '项目', 'data': res.data[0].id }
+            this.ascription_demand = false
+            this.ascription_project = true
+            this.show_Client = false
+            this.task_change_bizId(this.bizId)
           })
           break
         case 3: // 编辑任务(任务详情)
@@ -238,9 +232,10 @@ export default {
                 return item
               }, [])
             }, 100)
+            this.task_change_bizId(res.data.bizId, res.data.id)
           })
           break
-        case 4: // 新建任务(项目详情)
+        case 4: // 新建任务(需求详情)
           this.tit = '新建任务'
           var ss = {}
           configShowRequirementVersionEnum({ bizId: this.bizId }).then(res => {
@@ -248,35 +243,21 @@ export default {
               item.id === this.requireId ? ss = item : ''
             })
             this.dialogFormVisible = true
-            const that = this
-            setTimeout(function() {
-              that.task_form = {}
-              that.ascription_demand = true
-              that.ascription_project = false
-              that.$set(that.task_form, 'source', 2)
-              that.$set(that.task_form, 'notest', 0)
-              that.$set(that.task_form, 'followVersion', 2)
-              that.$set(that.task_form, 'requireId', ss.id)
-              that.$set(that.task_form, 'projectId', '')
-              that.$set(that.task_form, 'bizId', that.bizId)
-              that.task_form.followVersion === 2 ? that.show_Client = false : ''
-              if (data) {
-                that.$set(that.task_form, 'requireId', data.requirementId)
-                that.$set(that.task_form, 'name', data.name)
-                that.$set(that.task_form, 'priority', data.priority)
-              }
-              console.log(that.task_form)
-            }, 300)
+            this.ascription_demand = true
+            this.ascription_project = false
+            this.task_form = { 'followVersion': 2, 'notest': 0, 'source': 2, 'projectId': '', 'requireId': ss.id, 'bizId': this.bizId }
+            this.show_Client = false
+            if (data) {
+              this.task_form = { ...this.task_form, 'requireId': data.requirementId, 'name': data.name, 'priority': data.priority }
+              this.requirementIdList = { 'name': '需求', 'data': data.requirementId }
+            }
+            this.task_change_bizId(this.bizId)
           })
           break
       }
       projectListProject({ bizId: this.bizId }).then(res => { // 获取项目(查询)
         this.projectList = res.data.filter(item => item.id !== -1)
       })
-      configShowRequirementVersionEnum({ bizId: this.bizId }).then(res => {
-        // 获取需求(查询)
-        this.demandList = res.data.filter(item => item.id !== -1)
-      })
     },
     test2(item, e) { // 获取团队人员信息
       if (typeof this.test[item.idap] === 'undefined') {
@@ -291,6 +272,27 @@ export default {
       leading: true,
       trailing: false
     }),
+    async settingGetBizList() { // 获取业务线列表
+      const res = await settingGetMyAndOtherBizList()
+      if (res.code === 200) {
+        this.bizList = [{
+          name: '我的业务线',
+          options: res.data[0] || []
+        }, {
+          name: '其他业务线',
+          options: res.data[1] ? res.data[1].filter(item => item.isSecret !== 1) : []
+        }]
+      }
+    },
+    async task_change_bizId(biz, id) { // 获取业务线需求
+      const data = { bizId: biz }
+      id ? data.taskId = id : ''
+      const res = await configShowRequirementVersionEnum(data) // 获取需求(查询)
+      if (res.code === 200) {
+        this.demandList = res.data.filter(item => item.id !== -1)
+      }
+      this.bugDataGet(biz)
+    },
     create_task(e) { // 创建任务(保存)
       this.$refs['task_form'].validate((valid) => {
         if (valid) {
@@ -392,18 +394,22 @@ export default {
         case 1:
           this.ascription_demand = false
           this.ascription_project = false
+          this.$set(this.task_form, 'bizId', this.bizId)
           this.$set(this.task_form, 'requireId', '')
           this.$set(this.task_form, 'projectId', '')
           break
         case 2:
           this.ascription_demand = true
           this.ascription_project = false
-          this.$set(this.task_form, 'requireId', '')
+          this.requirementIdList.name === '需求' ? this.$set(this.task_form, 'requireId', this.requirementIdList.data) : this.$set(this.task_form, 'requireId', '')
+          this.$set(this.task_form, 'projectId', '')
           break
         case 3:
           this.ascription_demand = false
           this.ascription_project = true
-          this.$set(this.task_form, 'projectId', '')
+          this.$set(this.task_form, 'bizId', this.bizId)
+          this.requirementIdList.name === '项目' ? this.$set(this.task_form, 'projectId', this.requirementIdList.data) : this.$set(this.task_form, 'projectId', '')
+          this.$set(this.task_form, 'requireId', '')
           break
       }
     },
@@ -422,8 +428,8 @@ export default {
       e === 1 ? this.show_Client = true : ''
       e === 2 ? this.show_Client = false : ''
     },
-    bugDataGet() { // 所属模块
-      settingQueryBizModuleList(this.bizId).then(res => {
+    bugDataGet(bizId) { // 所属模块
+      settingQueryBizModuleList(bizId).then(res => {
         this.business_platform_Modular = res.data.map(item => ({
           ...item,
           value: item.id,

+ 2 - 1
src/views/projectManage/iteration/components/demand.vue

@@ -7,7 +7,8 @@
       <el-table-column prop="type" label="类型" min-width="70" />
       <el-table-column prop="desc" label="描述" min-width="150" />
       <el-table-column prop="seperateDaysNoHoliday" label="排期" min-width="160" />
-      <el-table-column prop="dayLength" label="时长" min-width="50" />
+      <el-table-column prop="dayLength" label="使用天数" min-width="80" />
+      <el-table-column prop="manpower" label="使用人力(人日)" width="150" />
       <el-table-column prop="peopleList" label="参与人员" min-width="150" />
       <el-table-column label="操作" width="120" />
     </el-table>

+ 8 - 3
src/views/projectManage/projectList/components/scheduleList.vue

@@ -46,14 +46,19 @@
       />
       <el-table-column
         prop="dayLength"
-        label="时长"
-        width="50"
+        label="使用天数"
+        width="80"
       />
       <el-table-column
         prop="peopleList"
         label="参与人员"
         min-width="100"
       />
+      <el-table-column
+        prop="manpower"
+        label="使用人力(人日)"
+        width="150"
+      />
       <el-table-column
         label="操作"
         width="200"
@@ -68,7 +73,7 @@
     </el-table>
     <div class="bottom-detail">
       <el-row>交付日期:{{ scheduleDetail.endTime }}</el-row>
-      <el-row>排期:{{ scheduleDetail.startTime | handlerDate }} ~ {{ scheduleDetail.endTime | handlerDate }}</el-row>
+      <el-row>排期:{{ scheduleDetail.startTime | handlerDate }} ~ {{ scheduleDetail.endTime | handlerDate }} <span style="color: #999999; font-size: 14px;">{{ '(' + scheduleDetail.scheduleTimeAnnotation.所有 + ')' }}</span></el-row>
       <el-row v-if="scheduleDetail.preOnlineVersion && scheduleDetail.preOnlineVersion.length>0">
         <el-col :span="2">预计上线版本:</el-col>
         <el-col :span="6">

+ 3 - 2
src/views/projectManage/requirement/components/scheduleList.vue

@@ -28,8 +28,9 @@
       </el-table-column>
       <el-table-column prop="desc" label="描述" min-width="150" align="left" show-overflow-tooltip />
       <el-table-column prop="seperateDaysNoHoliday" label="排期" min-width="200" show-overflow-tooltip />
-      <el-table-column prop="dayLength" label="时长" min-width="50" />
+      <el-table-column prop="dayLength" label="使用天数" min-width="80" />
       <el-table-column prop="peopleList" label="参与人员" min-width="150" />
+      <el-table-column prop="manpower" label="使用人力(人日)" width="150" />
       <el-table-column label="操作" width="200">
         <template slot-scope="scope">
           <div v-if="showunlock">
@@ -42,7 +43,7 @@
     </el-table>
     <div class="bottom-detail">
       <el-row>交付日期:{{ scheduleDetail.endTime }}</el-row>
-      <el-row>排期:{{ scheduleDetail.startTime | handlerDate }} ~ {{ scheduleDetail.endTime | handlerDate }}</el-row>
+      <el-row>排期:{{ scheduleDetail.startTime | handlerDate }} ~ {{ scheduleDetail.endTime | handlerDate }} <span style="color: #999999; font-size: 14px;">{{ '(' + scheduleDetail.scheduleTimeAnnotation.所有 + ')' }}</span></el-row>
       <el-row v-if="scheduleDetail.preOnlineVersion && scheduleDetail.preOnlineVersion.length>0">
         <el-col :span="2" style="width: 100px">预计上线版本:</el-col>
         <el-col :span="6">

+ 3 - 3
src/views/projectManage/requirement/components/taskList.vue

@@ -58,7 +58,7 @@
                 {{ scope.row.tagNotification }}
               </span>
             </span>
-            <span class="task-title" @click="link_task(scope.row.id)">{{ scope.row.name }}</span>
+            <span class="task-title" @click="link_task(scope.row)">{{ scope.row.name }}</span>
           </div>
         </template>
       </el-table-column>
@@ -332,8 +332,8 @@ export default {
       }
     },
 
-    link_task(id) { // 跳转到任务详情页
-      const bizId_id = EncryptId(`${this.bizId}_${id}`)
+    link_task(ele) { // 跳转到任务详情页
+      const bizId_id = EncryptId(`${ele.bizId}_${ele.id}`)
       this.$router.push({ name: '任务详情', query: { bizId_id: bizId_id }})
     }
   }

+ 8 - 3
src/views/projectManage/taskList/components/scheduleList.vue

@@ -48,14 +48,19 @@
       />
       <el-table-column
         prop="dayLength"
-        label="时长"
-        width="50"
+        label="使用天数"
+        width="80"
       />
       <el-table-column
         prop="peopleList"
         label="参与人员"
         min-width="100"
       />
+      <el-table-column
+        prop="manpower"
+        label="使用人力(人日)"
+        width="150"
+      />
       <el-table-column
         label="关联任务"
         min-width="100"
@@ -99,7 +104,7 @@
     </el-table>
     <div class="bottom-detail">
       <el-row>交付日期:{{ scheduleDetail.endTime }}</el-row>
-      <el-row>排期:{{ scheduleDetail.startTime | handlerDate }} ~ {{ scheduleDetail.endTime | handlerDate }}</el-row>
+      <el-row>排期:{{ scheduleDetail.startTime | handlerDate }} ~ {{ scheduleDetail.endTime | handlerDate }} <span style="color: #999999; font-size: 14px;">{{ '(' + scheduleDetail.scheduleTimeAnnotation.所有 + ')' }}</span></el-row>
       <el-row>预计上线版本:
         <span v-if="scheduleDetail.preOnlineVersion && scheduleDetail.preOnlineVersion.length > 0">
           <span v-for="item in scheduleDetail.preOnlineVersion" :key="item">{{ item }}</span>

+ 8 - 3
src/views/projectManage/taskList/taskViewDetail.vue

@@ -132,11 +132,11 @@
           <div class="detail-info">
             <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="left" label-width="100px">
               <el-form-item label="所属项目:" class="module">
-                <div v-if="form_query.projectId !== -1" @click="jump('项目详情',form_query.projectId)">{{ form_query.projectName }}</div>
+                <div v-if="form_query.projectId !== -1" @click="jump('项目详情',form_query)">{{ form_query.projectName }}</div>
                 <template v-else>{{ form_query.projectName }}</template>
               </el-form-item>
               <el-form-item label="所属需求:" class="module">
-                <div v-if="form_query.requireId !== -1" @click="jump('需求详情',form_query.requireId)">{{ form_query.requireName }}</div>
+                <div v-if="form_query.requireId !== -1" @click="jumps('需求详情',form_query)">{{ form_query.requireName }}</div>
                 <template v-else>{{ form_query.requireName }}</template>
               </el-form-item>
               <el-form-item label="所属模块:" class="module">
@@ -206,6 +206,7 @@
                 .每个任务仅支持一次提测和一次准出,请合理拆解任务后再排期。<br>
                 .任务状态未变更【已排期】前,排期不可锁定;状态变更为【已排期】时,任务排期将被系统自动锁定。<br>
                 .需求排期锁定时,任务排期将全部被锁定;所有任务锁定时,需求排期将被系统自动锁定。<br>
+                .任务排期锁定后,如果解锁了排期,排期将在24小时后再次自动锁定。请解锁后,及时进行排期调整。<br>
                 .任务锁定时,系统会自动将任务排期及交付时间同步至望岳。若多个任务关联同一个望岳任务,同步时排期会汇总一并同步到望岳,交付时间则按最晚日期同步至望岳。<br>
               </div>
             </div>
@@ -813,7 +814,11 @@ export default {
       }
     },
     jump(page, id) { // 跳转
-      const bizId_id = EncryptId(`${this.bizId}_${id}`)
+      const bizId_id = EncryptId(`${id.requireProjectBizId}_${id.projectId}`)
+      this.$router.push({ name: page, query: { bizId_id: bizId_id }})
+    },
+    jumps(page, id) { // 跳转
+      const bizId_id = EncryptId(`${id.requireIdBizId}_${id.requireId}`)
       this.$router.push({ name: page, query: { bizId_id: bizId_id }})
     },
     reloadList() {

+ 8 - 3
src/views/projectManage/version/components/scheduleList.vue

@@ -48,14 +48,19 @@
       />
       <el-table-column
         prop="dayLength"
-        label="时长"
-        width="50"
+        label="使用天数"
+        width="80"
       />
       <el-table-column
         prop="peopleList"
         label="参与人员"
         min-width="100"
       />
+      <el-table-column
+        prop="manpower"
+        label="使用人力(人日)"
+        width="150"
+      />
       <el-table-column
         label="操作"
         width="200"
@@ -71,7 +76,7 @@
     </el-table>
     <div class="bottom-detail">
       <el-row>交付日期:{{ scheduleDetail.endTime }}</el-row>
-      <el-row>排期:{{ scheduleDetail.startTime | handlerDate }} ~ {{ scheduleDetail.endTime | handlerDate }}</el-row>
+      <el-row>排期:{{ scheduleDetail.startTime | handlerDate }} ~ {{ scheduleDetail.endTime | handlerDate }} <span style="color: #999999; font-size: 14px;">{{ '(' + scheduleDetail.scheduleTimeAnnotation.所有 + ')' }}</span></el-row>
       <el-row v-if="scheduleDetail.preOnlineVersion && scheduleDetail.preOnlineVersion.length>0">
         <el-col :span="2">预计上线版本:</el-col>
         <el-col :span="6">

+ 1 - 1
src/views/quality/components/developmentCycle.vue

@@ -28,7 +28,7 @@ export default {
   props: {
     id: {
       type: String,
-      default: 'develop-cycle-chart',
+      default: 'develop-cycle-charts',
       required: false
     },
     chartData: {

+ 57 - 2
src/views/quality/requireStatistics.vue

@@ -140,6 +140,21 @@
             @change="getDevelopmentCycle()"
           />
         </div>
+        <div class="chart-item">
+          <h3>人力统计<span>(根据排期计算)</span></h3>
+          <cycle-statistic :chart-data="peopleData" />
+        </div>
+        <div class="chart-item">
+          <h3>人力分布图<span>(根据排期计算)</span></h3>
+          <development-cycle
+            id="101"
+            :chart-data="developmentPeopleData"
+            type="require"
+            :graph-type.sync="peopleType"
+            :graph-type-list="peopleTypeList"
+            @change="getDevelopeopleData()"
+          />
+        </div>
         <div class="chart-item">
           <h3>需求分布图</h3>
           <distribution-chart
@@ -190,7 +205,9 @@ import {
   getStatusStayData,
   getOrntDistributeData,
   getReqUnlockData,
-  getBugStatisticData
+  getBugStatisticData,
+  getManpowerStatistics,
+  getManpowerDistributedData
 } from '@/api/statisticsApi/requireStatistics'
 import requireDrawer from './components/requireDrawer'
 import statusChart from './components/statusChart'
@@ -236,8 +253,9 @@ export default {
       cumulativeData: null, // 需求状态累计流数据
       tendencyData: null, // 趋势图数据
       cycleData: [], // 周期统计数据
+      peopleData: [], // 人力统计数据
       graphType: 1, // 周期分布图选项
-      graphTypeList: [// 周期分布图选项列表
+      graphTypeList: [ // 周期分布图选项列表
         { code: 1, label: '产品技术侧总周期' },
         { code: 2, label: '产品侧总周期' },
         { code: 3, label: '技术侧总周期' },
@@ -245,7 +263,20 @@ export default {
         { code: 5, label: '研发周期' },
         { code: 6, label: '测试周期 ' }
       ],
+      peopleType: -1, // 周期分布图选项
+      peopleTypeList: [ // 人力分布图选项列表
+        { code: -1, label: '排期使用人力' },
+        { code: 0, label: '开发类型排期使用人力' },
+        { code: 1, label: '用例类型排期使用人力' },
+        { code: 2, label: '联调类型排期使用人力' },
+        { code: 3, label: '提测类型排期使用人力' },
+        { code: 4, label: '测试类型排期使用人力 ' },
+        { code: 5, label: '准出类型排期使用人力 ' },
+        { code: 6, label: '上线类型排期使用人力 ' },
+        { code: 7, label: '其他 ' }
+      ],
       developmentCycleData: [], // 研发交付周期分布数据
+      developmentPeopleData: [], // 人力分布图
       distributeStatus: 1, // 需求分布图需求状态
       distributeStatusList: [
         { code: 1, label: '需求状态' },
@@ -328,6 +359,8 @@ export default {
       this.getRequireCountTrend()
       this.getCycleData()
       this.getDevelopmentCycle()
+      this.getPeopleData()
+      this.getDevelopeopleData()
       this.getOrntDistributeData()
       this.getDistributeData()
       this.getStatusStayData()
@@ -406,6 +439,28 @@ export default {
       const res = await getCumulativeFlowDiagram(params)
       if (res.code === 200) this.cumulativeData = res.data
     },
+    async getPeopleData() { // 人力统计数据
+      const params = {
+        ...this.globalParams,
+        timeType: this.timeType,
+        type: Number(this.activeTab)
+      }
+      const res = await getManpowerStatistics(params)
+      if (res.code === 200) this.peopleData = res.data
+    },
+    async getDevelopeopleData() { // 需求人力分布图
+      const params = {
+        ...this.globalParams,
+        type: Number(this.activeTab),
+        graphType: this.peopleType
+      }
+      const res = await getManpowerDistributedData(params)
+      if (res.code === 200) {
+        res.data.length > 0
+          ? this.developmentPeopleData = res.data
+          : this.developmentPeopleData = [moment().format('YYYY-MM-DD'), '0']
+      }
+    },
     async getCycleData() { // 周期统计数据
       const params = {
         ...this.globalParams,

+ 57 - 1
src/views/quality/taskStatistics.vue

@@ -130,6 +130,7 @@
             <span>仅统计状态已变更“已排期”且排期不为空的任务;横坐标表示任务交付日期,纵坐标代表研发交付周期(研发、联调、上线类型排期的总周期)</span>
           </div> -->
           <development-cycle
+            id="102"
             :chart-data="developmentCycleData"
             type="task"
             :graph-type.sync="graphType"
@@ -137,6 +138,21 @@
             @change="getDevelopmentCycle()"
           />
         </div>
+        <div class="chart-item">
+          <h3>人力统计<span>(根据排期计算)</span></h3>
+          <cycle-statistic :chart-data="taskPeoplecData" type="task_a" />
+        </div>
+        <div class="chart-item">
+          <h3>人力分布图<span>(根据排期计算)</span></h3>
+          <development-cycle
+            id="105"
+            :chart-data="developmentTaskPeopleData"
+            type="task"
+            :graph-type.sync="graphTypes"
+            :graph-type-list="peopleTypeList"
+            @change="getManpowerDistributedData()"
+          />
+        </div>
         <div class="chart-item">
           <h3>任务分布图</h3>
           <distribution-chart
@@ -193,7 +209,9 @@ import {
   getModuleDistributeData,
   getTaskUnlockData,
   getReportSummary,
-  getBugStatisticData
+  getBugStatisticData,
+  getManpowerStatistics,
+  getManpowerDistributedData
 } from '@/api/statisticsApi/taskStatistics'
 import statusChart from './components/statusChart'
 import tendencyChart from './components/tendencyChart'
@@ -240,6 +258,8 @@ export default {
       tendencyData: null, // 趋势图数据
       belongRequirementData: null, // 所属需求方向分布图
       cycleData: [], // 周期统计数据
+      taskPeoplecData: [], // 任务人力统计
+      graphTypes: -1, // 任务人力分布图默认
       graphType: 4, // 周期分布图选项
       graphTypeList: [// 周期分布图选项列表
         { code: 4, label: '研发交付周期' },
@@ -248,6 +268,7 @@ export default {
         { code: 7, label: '提测等待测试时长' }
       ],
       developmentCycleData: [], // 研发交付周期分布数据
+      developmentTaskPeopleData: [], // 人力分布图
       distributeStatus: 1, // 任务分布图任务状态
       distributeStatusList: [
         { code: 1, label: '任务状态' },
@@ -257,6 +278,17 @@ export default {
         { code: 5, label: '跟版客户端' },
         { code: 6, label: '直接归属' }
       ], // 任务分布图任务状态列表
+      peopleTypeList: [ // 人力分布图选项列表
+        { code: -1, label: '排期使用人力' },
+        { code: 0, label: '开发类型排期使用人力' },
+        { code: 1, label: '用例类型排期使用人力' },
+        { code: 2, label: '联调类型排期使用人力' },
+        { code: 3, label: '提测类型排期使用人力' },
+        { code: 4, label: '测试类型排期使用人力 ' },
+        { code: 5, label: '准出类型排期使用人力 ' },
+        { code: 6, label: '上线类型排期使用人力 ' },
+        { code: 7, label: '其他 ' }
+      ],
       moduleDistributeData: null, // 任务模块分布
       distributeData: null, // 任务分布图数据
       statusStayData: null, // 状态停留图数据
@@ -331,7 +363,9 @@ export default {
       this.getTaskCountTrend()
       this.getBelongRequirementData()
       this.getCycleData()
+      this.getManpowerStatistics()
       this.getDevelopmentCycle()
+      this.getManpowerDistributedData()
       this.getModuleDistributeData()
       this.getDistributeData()
       this.getStatusStayData()
@@ -414,6 +448,28 @@ export default {
       const res = await getCumulativeFlowDiagram(params)
       if (res.code === 200) this.cumulativeData = res.data
     },
+    async getManpowerStatistics() { // 获取任务人力统计
+      const params = {
+        ...this.globalParams,
+        type: Number(this.activeTab)
+      }
+      const res = await getManpowerStatistics(params)
+      if (res.code === 200) this.taskPeoplecData = res.data
+    },
+    async getManpowerDistributedData() { // 人力分布图
+      const params = {
+        ...this.globalParams,
+        type: Number(this.activeTab),
+        graphType: this.graphTypes,
+        timeType: this.timeType
+      }
+      const res = await getManpowerDistributedData(params)
+      if (res.code === 200) {
+        res.data.length > 0
+          ? this.developmentTaskPeopleData = res.data
+          : this.developmentTaskPeopleData = [moment().format('YYYY-MM-DD'), '0']
+      }
+    },
     async getCycleData() { // 周期统计数据
       const params = {
         ...this.globalParams,

+ 1 - 0
src/views/reportManagement/daily/components/dailyDetails.vue

@@ -261,4 +261,5 @@ export default {
 .setLine {
   padding: 10px 20px;
 }
+
 </style>