Browse Source

Merge branch 'http_test' of git.xiaojukeji.com:jacklijiajia/thoth-frontend into wangzi_dev

wangziqian 5 years ago
parent
commit
2ef37f6d66
31 changed files with 1299 additions and 627 deletions
  1. 8 0
      src/api/requirement.js
  2. 1 0
      src/components/input/normalArea.vue
  3. 2 4
      src/components/input/textArea.vue
  4. 8 8
      src/router/index.js
  5. 3 0
      src/styles/detail-pages.scss
  6. 51 124
      src/views/Platform/presentation/Acceptance.vue
  7. 43 84
      src/views/Platform/presentation/ClientAcceptance.vue
  8. 11 22
      src/views/Platform/presentation/PresentReport.vue
  9. 17 40
      src/views/Platform/presentation/presentationReport.vue
  10. 3 1
      src/views/ToConfigure/configure.vue
  11. 368 0
      src/views/projectManage/components/demand.vue
  12. 232 0
      src/views/projectManage/components/scheduleList.vue
  13. 10 4
      src/views/projectManage/components/timeLine.vue
  14. 352 0
      src/views/projectManage/iteration/components/demand.vue
  15. 0 253
      src/views/projectManage/iteration/components/iterationTable.vue
  16. 35 23
      src/views/projectManage/iteration/components/requiredTable.vue
  17. 1 1
      src/views/projectManage/projectList/components/dataStatistics.vue
  18. 27 2
      src/views/projectManage/projectList/components/needsList.vue
  19. 4 4
      src/views/projectManage/projectList/projectViewDetails.vue
  20. 12 11
      src/views/projectManage/requirement/list/create.vue
  21. 32 3
      src/views/projectManage/requirement/list/index.vue
  22. 20 18
      src/views/projectManage/requirement/requirementDetail.vue
  23. 4 4
      src/views/projectManage/taskList/childrenTask/childDetail.vue
  24. 4 4
      src/views/projectManage/taskList/childrenTask/childDrawer.vue
  25. 1 1
      src/views/projectManage/taskList/components/dataStatistics.vue
  26. 4 4
      src/views/projectManage/taskList/taskViewDetail.vue
  27. 2 2
      src/views/quality/defectStatistics.vue
  28. 1 0
      src/views/workbench/person/components/myFullCalendar.vue
  29. 8 4
      src/views/workbench/person/index.vue
  30. 27 2
      src/views/workbench/team/components/needsList.vue
  31. 8 4
      src/views/workbench/team/index.vue

+ 8 - 0
src/api/requirement.js

@@ -274,3 +274,11 @@ export function filterGetFilter(id) {
     method: 'get'
   })
 }
+
+// 获取新的排期变更记录
+export function scheduleGetHistoryRequireScheduleById(id) {
+  return request({
+    url: requestIp + `/schedule/getHistoryRequireScheduleById?id=${id}`,
+    method: 'get'
+  })
+}

+ 1 - 0
src/components/input/normalArea.vue

@@ -59,6 +59,7 @@ export default {
   watch: {
     value: {
       handler(newV, oldV) {
+        console.log(newV)
         this.inputValue = newV
       },
       immediate: true

+ 2 - 4
src/components/input/textArea.vue

@@ -132,22 +132,20 @@ export default {
 </script>
 <style scoped lang="scss">
 article {
-  padding: 20px 30px;
+  padding: 0 30px 20px 30px;
 }
 .text-edit {
-  height: 25vh;
   color: #666666;
   font-size: 14px;
   display: flex;
   align-items: center;
-  justify-content: center;
+  justify-content: flex-start;
 }
 .text-pre {
   white-space:pre-line;
   font-size: 14px;
   color: #333B4A;
   cursor: pointer;
-  min-height: 20vh;
 }
 /deep/ textarea {
   width: calc(100% - 40px);

+ 8 - 8
src/router/index.js

@@ -604,16 +604,16 @@ export const constantRoutes = [{
       component: (resolve) => require(['@/views/automation/index'], resolve),
       meta: { title: '扁鹊' }
     },
-    // {
-    //   path: '/apiManagemet',
-    //   name: 'api管理'
-    // },
     {
-      path: '/apiManagement',
-      name: 'api管理',
-      component: (resolve) => require(['@/views/apiManagement/index'], resolve),
-      meta: { title: 'api管理' }
+      path: '/apiManagemet',
+      name: 'api管理'
     }
+    // {
+    //   path: '/apiManagement',
+    //   name: 'api管理',
+    //   component: (resolve) => require(['@/views/apiManagement/index'], resolve),
+    //   meta: { title: 'api管理' }
+    // }
     ]
   }
   ]

+ 3 - 0
src/styles/detail-pages.scss

@@ -149,5 +149,8 @@
       color: #333333;
       font-size: 14px;
     }
+    >>>.el-form-item{
+      margin-bottom: 0;
+    }
   }
 }

+ 51 - 124
src/views/Platform/presentation/Acceptance.vue

@@ -53,24 +53,20 @@
       </div>
 
       <div class="backStyle" style="margin-bottom:2%;">二. 项目背景</div>
-      <div id="editorElem" class="toolbar" />
-      <div id="editorElem1" class="text" />
+      <normal-area id="clients-children-projectBackground" :value.sync="clienEdit.projectBackground" :height="200" />
 
       <div class="backStyle">三. 模块信息</div>
       <div class="titStyle" style="margin: 20px 0;">1、模块信息</div>
 
-      <div id="editorElems" class="toolbar" />
-      <div id="editorElems1" class="text" />
+      <normal-area id="clients-children-moduleInfo" :value.sync="clienEdit.moduleInfo" :height="200" />
 
       <div class="titStyle" style="margin: 20px 0;">2、本期功能</div>
 
-      <div id="editorFrom" class="toolbar" />
-      <div id="editorFrom1" class="text" />
+      <normal-area id="clients-children-functionInfo" :value.sync="clienEdit.functionInfo" :height="200" />
 
       <div class="titStyle" style="margin: 20px 0;">3、风险点</div>
 
-      <div id="editorF" class="toolbar" />
-      <div id="editorF1" class="text" />
+      <normal-area id="clients-children-onlineRisk" :value.sync="clienEdit.onlineRisk" :height="200" />
 
       <div class="titStyle" style="margin: 20px 0;">4、缺陷分析</div>
 
@@ -121,8 +117,7 @@
         </div>
       </div>
 
-      <div id="editorEl" class="toolbar" />
-      <div id="editorEl1" class="text" />
+      <normal-area id="clients-children-fctInfo" :value.sync="clienEdit.fctInfo" :height="200" />
 
       <div class="titStyle BJIsize">
         <el-form-item style="flex:1; ">2、可靠性测试</el-form-item>
@@ -133,8 +128,7 @@
         </div>
       </div>
 
-      <div id="editorEle" class="toolbar" />
-      <div id="editorEle1" class="text" />
+      <normal-area id="clients-children-rqtInfo" :value.sync="clienEdit.rqtInfo" :height="200" />
 
       <div class="titStyle BJIsize">
         <el-form-item style="flex:1; ">3、稳定性测试</el-form-item>
@@ -145,8 +139,7 @@
         </div>
       </div>
 
-      <div id="editorSix" class="toolbar" />
-      <div id="editorSix1" class="text" />
+      <normal-area id="clients-children-pftInfo" :value.sync="clienEdit.pftInfo" :height="200" />
 
       <div class="titStyle BJIsize">
         <el-form-item style="flex:1; ">4、安全性测试</el-form-item>
@@ -156,9 +149,7 @@
           <el-tag :type="safeResultChange2" size="small" effect="dark" class="tag" @click="safeResultradio(2)"> 测试未通过 </el-tag>
         </div>
       </div>
-
-      <div id="editorEight" class="toolbar" />
-      <div id="editorEight1" class="text" />
+      <normal-area id="clients-children-safeResultInfo" :value.sync="clienEdit.safeResultInfo" :height="200" />
 
       <div class="titStyle BJIsize">
         <el-form-item style="flex:1; ">5、线上监控</el-form-item>
@@ -168,17 +159,19 @@
           <el-tag :type="moniterResultChange2" size="small" effect="dark" class="tag" @click="moniterResultradio(2)"> 测试未通过 </el-tag>
         </div>
       </div>
-      <div id="editorNine" class="toolbar" />
-      <div id="editorNine1" class="text" />
+      <normal-area id="clients-children-moniterResultInfo" :value.sync="clienEdit.moniterResultInfo" :height="200" />
     </el-form>
   </div>
 </template>
 
 <script>
 import { projectTestReportUpdate, projectTestReportCreate, bugFinishList } from '@/api/ResultPage'
-import E from 'wangeditor'
+import normalArea from '@/components/input/normalArea'
 export default {
   name: 'Acceptance',
+  components: {
+    normalArea
+  },
   props: {
     clienData: {
       type: Object,
@@ -221,9 +214,7 @@ export default {
         taskLateReason: [{ required: true, message: '延期原因不能为空', trigger: 'change' }],
         smokeTestResult: [{ required: true, message: '准入结果不能为空', trigger: 'change' }],
         developer: [{ required: true, message: '开发人员不能为空', trigger: 'change' }],
-        // devTimeEnd: [{ required: true, message: '开发周期不能为空', trigger: 'change' }],
         tester: [{ required: true, message: '测试人员不能为空', trigger: 'change' }]
-        // testTimeEnd: [{ required: true, message: '测试周期不能为空', trigger: 'change' }]
       },
       showData: false,
       showDelay: false,
@@ -233,15 +224,17 @@ export default {
       value: '',
       status: '',
       ClientData: {},
-      editorElem: '',
-      editorElems: '',
-      editorFrom: '',
-      editorF: '',
-      editorEl: '',
-      editorEle: '',
-      editorSix: '',
-      editorEight: '',
-      editorNine: '',
+      clienEdit: {
+        projectBackground: '',
+        moduleInfo: `<p></p><table border="1" style="border: 1px solid #DEE2E7" width="100%"><colgroup><col width="20%"><col width="20%"></colgroup><thead><tr><th>提测模块</th><th>提测分支</th></tr></thead><tbody><tr><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td></tr></tbody></table>`,
+        functionInfo: '',
+        onlineRisk: '',
+        fctInfo: `<p></p><table border="1" style="border: 1px solid #DEE2E7" width="100%"><colgroup><col width="20%"><col width="20%"><col width="20%"><col width="20%"></colgroup><thead><tr><th>子类</th><th>测试功能点</th><th>测试结果</th><th>备注</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr></tbody></table>`,
+        rqtInfo: `<p></p><table border="1" style="border: 1px solid #DEE2E7" width="100%"><colgroup><col width="20%"><col width="20%"><col width="20%"><col width="20%"></colgroup><thead><tr><th>子类</th><th>描述</th><th>测试结果</th><th>备注</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr></tbody></table>`,
+        pftInfo: `<p></p><table border="1" style="border: 1px solid #DEE2E7" width="100%"><colgroup><col width="20%"><col width="20%"><col width="20%"><col width="20%"></colgroup><thead><tr><th>子类</th><th>描述</th><th>测试结果</th><th>备注</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr></tbody></table>`,
+        safeResultInfo: `<p></p><table border="1" style="border: 1px solid #DEE2E7"  width="100%"><colgroup><col width="20%"><col width="20%"><col width="20%"><col width="20%"></colgroup><thead><tr><th>子类</th><th>描述</th><th>测试结果</th><th>备注</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr></tbody></table>`,
+        moniterResultInfo: `<p></p><table border="1" style="border: 1px solid #DEE2E7" width="100%"><colgroup><col width="20%"><col width="20%"><col width="20%"><col width="20%"></colgroup><thead><tr><th>子类</th><th>描述</th><th>测试结果</th><th>备注</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr></tbody></table>`
+      },
       tableData: [],
       fctResult: '',
       rqtResult: '',
@@ -255,87 +248,21 @@ export default {
   created() {
     this.getRouterData()
   },
-  mounted() {
-    this.editorElem = new E('#editorElem', '#editorElem1')
-    this.editorElems = new E('#editorElems', '#editorElems1')
-    this.editorFrom = new E('#editorFrom', '#editorFrom1')
-    this.editorF = new E('#editorF', '#editorF1')
-    this.editorEl = new E('#editorEl', '#editorEl1')
-    this.editorEle = new E('#editorEle', '#editorEle1')
-    this.editorSix = new E('#editorSix', '#editorSix1')
-    this.editorEight = new E('#editorEight', '#editorEight1')
-    this.editorNine = new E('#editorNine', '#editorNine1')
-
-    this.editorElem.customConfig.menus = ['bold', 'italic', 'underline', 'link', 'list', 'justify', 'table']
-    this.editorElems.customConfig.menus = ['bold', 'italic', 'underline', 'link', 'list', 'justify', 'table']
-    this.editorFrom.customConfig.menus = ['bold', 'italic', 'underline', 'link', 'list', 'justify', 'table']
-    this.editorF.customConfig.menus = ['bold', 'italic', 'underline', 'link', 'list', 'justify', 'table']
-    this.editorEl.customConfig.menus = ['bold', 'italic', 'underline', 'link', 'list', 'justify', 'table']
-    this.editorEle.customConfig.menus = ['bold', 'italic', 'underline', 'link', 'list', 'justify', 'table']
-    this.editorSix.customConfig.menus = ['bold', 'italic', 'underline', 'link', 'list', 'justify', 'table']
-    this.editorEight.customConfig.menus = ['bold', 'italic', 'underline', 'link', 'list', 'justify', 'table']
-    this.editorNine.customConfig.menus = ['bold', 'italic', 'underline', 'link', 'list', 'justify', 'table']
-
-    this.editorElem.customConfig.zIndex = 110
-    this.editorElems.customConfig.zIndex = 110
-    this.editorFrom.customConfig.zIndex = 110
-    this.editorF.customConfig.zIndex = 110
-    this.editorEl.customConfig.zIndex = 110
-    this.editorEle.customConfig.zIndex = 110
-    this.editorSix.customConfig.zIndex = 110
-    this.editorEight.customConfig.zIndex = 110
-    this.editorNine.customConfig.zIndex = 110
-
-    this.editorElem.customConfig.onchange = (html) => { this.editorElem = html }
-    this.editorElem.create()
-
-    this.editorElems.customConfig.onchange = (html) => { this.editorElems = html }
-    this.editorElems.create()
-
-    this.editorFrom.customConfig.onchange = (html) => { this.editorFrom = html }
-    this.editorFrom.create()
-
-    this.editorF.customConfig.onchange = (html) => { this.editorF = html }
-    this.editorF.create()
-
-    this.editorEl.customConfig.onchange = (html) => { this.editorEl = html }
-    this.editorEl.create()
-
-    this.editorEle.customConfig.onchange = (html) => { this.editorEle = html }
-    this.editorEle.create()
-
-    this.editorSix.customConfig.onchange = (html) => { this.editorSix = html }
-    this.editorSix.create()
-
-    this.editorEight.customConfig.onchange = (html) => { this.editorEight = html }
-    this.editorEight.create()
-
-    this.editorNine.customConfig.onchange = (html) => { this.editorNine = html }
-    this.editorNine.create()
-
-    this.editorElem.txt.html(``)
-    this.editorElems.txt.html(`<p></p><table style="border-radius:4px;" width="100%"><colgroup><col width="20%"><col width="20%"></colgroup><thead><tr><th>提测模块</th><th>提测分支</th></tr></thead><tbody><tr><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td></tr></tbody></table><p></p>`)
-    this.editorEl.txt.html(`<p></p><table style="border-radius:4px;" width="100%"><colgroup><col width="20%"><col width="20%"><col width="20%"><col width="20%"></colgroup><thead><tr><th>子类</th><th>测试功能点</th><th>测试结果</th><th>备注</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr></tbody></table><p></p>`)
-    this.editorEle.txt.html(`<p></p><table style="border-radius:4px;" width="100%"><colgroup><col width="20%"><col width="20%"><col width="20%"><col width="20%"></colgroup><thead><tr><th>子类</th><th>描述</th><th>测试结果</th><th>备注</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr></tbody></table><p></p>`)
-    this.editorSix.txt.html(`<p></p><table style="border-radius:4px;" width="100%"><colgroup><col width="20%"><col width="20%"><col width="20%"><col width="20%"></colgroup><thead><tr><th>子类</th><th>描述</th><th>测试结果</th><th>备注</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr></tbody></table><p></p>`)
-    this.editorEight.txt.html(`<p></p><table style="border-radius:4px;" width="100%"><colgroup><col width="20%"><col width="20%"><col width="20%"><col width="20%"></colgroup><thead><tr><th>子类</th><th>描述</th><th>测试结果</th><th>备注</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr></tbody></table><p></p>`)
-    this.editorNine.txt.html(`<p></p><table style="border-radius:4px;" width="100%"><colgroup><col width="20%"><col width="20%"><col width="20%"><col width="20%"></colgroup><thead><tr><th>子类</th><th>描述</th><th>测试结果</th><th>备注</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr></tbody></table><p></p>`)
-  },
   methods: {
     getRouterData() {
       this.getBugData(this.clienData)
       console.log(this.clienData, '准出服务端')
       this.ClientData = this.clienData
       this.$nextTick(() => {
-        this.ClientData.projectBackground !== null ? this.editorElem.txt.html(this.ClientData.projectBackground) : ''
-        this.ClientData.moduleInfo !== null ? this.editorElems.txt.html(this.ClientData.moduleInfo) : ''
-        this.ClientData.functionInfo !== null ? this.editorFrom.txt.html(this.ClientData.functionInfo) : ''
-        this.ClientData.onlineRisk !== null ? this.editorF.txt.html(this.ClientData.onlineRisk) : ''
-        this.ClientData.rqtInfo !== null ? this.editorEle.txt.html(this.ClientData.rqtInfo) : ''
-        this.ClientData.fctInfo !== null ? this.editorEl.txt.html(this.ClientData.fctInfo) : ''
-        this.ClientData.pftInfo !== null ? this.editorSix.txt.html(this.ClientData.pftInfo) : ''
-        this.ClientData.safeResultInfo !== null ? this.editorEight.txt.html(this.ClientData.safeResultInfo) : ''
-        this.ClientData.moniterResultInfo !== null ? this.editorNine.txt.html(this.ClientData.moniterResultInfo) : ''
+        this.clienEdit.projectBackground = this.ClientData.projectBackground || this.clienEdit.projectBackground
+        this.clienEdit.moduleInfo = this.ClientData.moduleInfo || this.clienEdit.moduleInfo
+        this.clienEdit.functionInfo = this.ClientData.functionInfo || this.clienEdit.functionInfo
+        this.clienEdit.onlineRisk = this.ClientData.onlineRisk || this.clienEdit.onlineRisk
+        this.clienEdit.fctInfo = this.ClientData.fctInfo || this.clienEdit.fctInfo
+        this.clienEdit.rqtInfo = this.ClientData.rqtInfo || this.clienEdit.rqtInfo
+        this.clienEdit.pftInfo = this.ClientData.pftInfo || this.clienEdit.pftInfo
+        this.clienEdit.safeResultInfo = this.ClientData.safeResultInfo || this.clienEdit.safeResultInfo
+        this.clienEdit.moniterResultInfo = this.ClientData.moniterResultInfo || this.clienEdit.moniterResultInfo
       })
       if (this.ClientData.status === 1) {
         this.tagBtn = 'success'
@@ -480,15 +407,15 @@ export default {
       this.$refs['ClientData'].validate((valid) => {
         if (valid) {
           this.ClientData = ele
-          typeof (this.editorElem) === 'string' ? this.ClientData.projectBackground = this.editorElem : ''
-          typeof (this.editorElems) === 'string' ? this.ClientData.moduleInfo = this.editorElems : ''
-          typeof (this.editorFrom) === 'string' ? this.ClientData.functionInfo = this.editorFrom : ''
-          typeof (this.editorF) === 'string' ? this.ClientData.onlineRisk = this.editorF : ''
-          typeof (this.editorEle) === 'string' ? this.ClientData.rqtInfo = this.editorEle : ''
-          typeof (this.editorEl) === 'string' ? this.ClientData.fctInfo = this.editorEl : ''
-          typeof (this.editorSix) === 'string' ? this.ClientData.pftInfo = this.editorSix : ''
-          typeof (this.editorEight) === 'string' ? this.ClientData.safeResultInfo = this.editorEight : ''
-          typeof (this.editorNine) === 'string' ? this.ClientData.moniterResultInfo = this.editorNine : ''
+          this.ClientData.projectBackground = this.clienEdit.projectBackground
+          this.ClientData.moduleInfo = this.clienEdit.moduleInfo
+          this.ClientData.functionInfo = this.clienEdit.functionInfo
+          this.ClientData.onlineRisk = this.clienEdit.onlineRisk
+          this.ClientData.fctInfo = this.clienEdit.fctInfo
+          this.ClientData.rqtInfo = this.clienEdit.rqtInfo
+          this.ClientData.pftInfo = this.clienEdit.pftInfo
+          this.ClientData.safeResultInfo = this.clienEdit.safeResultInfo
+          this.ClientData.moniterResultInfo = this.clienEdit.moniterResultInfo
           this.ClientData.fctResult = this.fctResult
           this.ClientData.rqtResult = this.rqtResult
           this.ClientData.pftResult = this.pftResult
@@ -525,15 +452,15 @@ export default {
       this.$refs['ClientData'].validate((valid) => {
         if (valid) {
           this.ClientData = ele
-          typeof (this.editorElem) === 'string' ? this.ClientData.projectBackground = this.editorElem : ''
-          typeof (this.editorElems) === 'string' ? this.ClientData.moduleInfo = this.editorElems : ''
-          typeof (this.editorFrom) === 'string' ? this.ClientData.functionInfo = this.editorFrom : ''
-          typeof (this.editorF) === 'string' ? this.ClientData.onlineRisk = this.editorF : ''
-          typeof (this.editorEle) === 'string' ? this.ClientData.rqtInfo = this.editorEle : ''
-          typeof (this.editorEl) === 'string' ? this.ClientData.fctInfo = this.editorEl : ''
-          typeof (this.editorSix) === 'string' ? this.ClientData.pftInfo = this.editorSix : ''
-          typeof (this.editorEight) === 'string' ? this.ClientData.safeResultInfo = this.editorEight : ''
-          typeof (this.editorNine) === 'string' ? this.ClientData.moniterResultInfo = this.editorNine : ''
+          this.ClientData.projectBackground = this.clienEdit.projectBackground
+          this.ClientData.moduleInfo = this.clienEdit.moduleInfo
+          this.ClientData.functionInfo = this.clienEdit.functionInfo
+          this.ClientData.onlineRisk = this.clienEdit.onlineRisk
+          this.ClientData.fctInfo = this.clienEdit.fctInfo
+          this.ClientData.rqtInfo = this.clienEdit.rqtInfo
+          this.ClientData.pftInfo = this.clienEdit.pftInfo
+          this.ClientData.safeResultInfo = this.clienEdit.safeResultInfo
+          this.ClientData.moniterResultInfo = this.clienEdit.moniterResultInfo
           this.$route.query.id ? this.ClientData.taskId = this.$route.query.id : ''
           this.ClientData.bizId = Number(localStorage.getItem('bizId'))
           this.ClientData.taskIds = this.Tsk

+ 43 - 84
src/views/Platform/presentation/ClientAcceptance.vue

@@ -44,8 +44,7 @@
 
       <div style="margin-bottom: 1%;" class="backStyle">二. 项目背景</div>
 
-      <div id="editorElem" class="toolbar" />
-      <div id="editorElem1" class="text" />
+      <normal-area id="bug-children-projectBackground" :value.sync="clienEdit.projectBackground" :height="150" />
 
       <div style="margin: 1% 0;" class="backStyle">三. 测试项</div>
 
@@ -58,8 +57,7 @@
         </div>
       </div>
 
-      <div id="editorElems" class="toolbar" />
-      <div id="editorElems1" class="text" />
+      <normal-area id="bug-children-fctInfo" :value.sync="clienEdit.fctInfo" :height="150" />
 
       <div class="BJIsize">
         <el-form-item>2.兼容测试</el-form-item>
@@ -70,11 +68,9 @@
         </div>
       </div>
 
-      <div id="editorFrom" class="toolbar" />
-      <div id="editorFrom1" class="text" />
+      <normal-area id="bug-children-sctInfo" :value.sync="clienEdit.sctInfo" :height="400" />
 
       <div style="margin: 2% 0 0% 0;" class="backStyle">四. 产品验收</div>
-
       <div class="BJIsize">
         <p>验收结果</p>
         <div class="BJIsize">
@@ -83,12 +79,9 @@
           <el-tag :type="acceptanceResultChange2" size="small" effect="dark" class="tag" @click="changeAcceptanceResult(2)"> 测试未通过 </el-tag>
         </div>
       </div>
-
-      <div id="editorFro" class="toolbar" />
-      <div id="editorFro1" class="text" />
+      <normal-area id="bug-children-acceptanceResultInfo" :value.sync="clienEdit.acceptanceResultInfo" :height="150" />
 
       <div style="margin: 2% 0 2% 0;" class="backStyle">五. bug指标</div>
-
       <el-table :data="tableData" border>
         <el-table-column prop="totalBug" label="bug总数" min-width="200" align="center" edit="false">
           <template slot-scope="scope">
@@ -125,9 +118,13 @@
 
 <script>
 import { projectTestReportUpdate, projectTestReportCreate, bugFinishList } from '@/api/ResultPage'
-import E from 'wangeditor'
+import normalArea from '@/components/input/normalArea'
+
 export default {
   name: 'ClientAcceptance',
+  components: {
+    normalArea
+  },
   props: {
     clienData: {
       type: Object,
@@ -161,9 +158,7 @@ export default {
         taskLateReason: [{ required: true, message: '延期原因不能为空', trigger: 'change' }],
         smokeTestResult: [{ required: true, message: '准入结果不能为空', trigger: 'change' }],
         developer: [{ required: true, message: '开发人员不能为空', trigger: 'change' }],
-        // devTimeEnd: [{ required: true, message: '开发周期不能为空', trigger: 'change' }],
         tester: [{ required: true, message: '测试人员不能为空', trigger: 'change' }]
-        // testTimeEnd: [{ required: true, message: '测试周期不能为空', trigger: 'change' }]
       },
       showDelay: false,
       status: '',
@@ -171,58 +166,34 @@ export default {
       pftResult: '',
       sctResult: '',
       acceptanceResult: '',
+      clienEdit: {
+        projectBackground: '',
+        sctInfo: `<p>1、机型兼容</p><table border="1" style="border: 1px solid #DEE2E7" width="100%"><colgroup><col width="20%"><col width="20%"><col width="20%"><col width="20%"></colgroup><thead><tr><th>手机型号</th><th>操作系统</th><th>分辨率</th><th>(微信版本号)</tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr></tbody></table><p>2、网络兼容</p><table border="1" style="border: 1px solid #DEE2E7" width="100%"><colgroup><col width="20%"><col width="20%"><col width="20%"></colgroup><thead><tr><th>WIFI</th><th>4G</th><th>5G</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td></tr></tbody></table><p>3、容器兼容</p><br>`,
+        acceptanceResultInfo: `<table border="1" style="border: 1px solid #DEE2E7" width="100%"><colgroup><col width="20%"><col width="20%"><col width="20%"><col width="20%"><col width="20%"></colgroup><thead><tr><th>验收项</th><th>验收点</th><th>验收人</th><th>验收结果</th><th>备注</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td><td><br></td><td><br></td></tr></tbody></table>`,
+        fctInfo: `<table border="1" style="border: 1px solid #DEE2E7" width="100%"><colgroup><col width="20%"><col width="20%"><col width="20%"><col width="20%"><col width="20%"></colgroup><thead><tr><th>页面</th><th>模块</th><th>接口</th><th>测试结果</th><th>备注</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td><td><br></td><td><br></td></tr></tbody></table>`
+      },
       ClientData: {},
-      editorElem: [],
-      editorElems: [],
       bugNum: '',
       Ts: [],
       clienId: '',
       tableData: []
     }
   },
-  created() {
-    this.getRouterData()
-  },
-  mounted() {
-    this.editorElem = new E('#editorElem', '#editorElem1')
-    this.editorElems = new E('#editorElems', '#editorElems1')
-    this.editorFrom = new E('#editorFrom', '#editorFrom1')
-    this.editorFro = new E('#editorFro', '#editorFro1')
-
-    this.editorElem.customConfig.zIndex = 110
-    this.editorElems.customConfig.zIndex = 110
-    this.editorFrom.customConfig.zIndex = 110
-    this.editorFro.customConfig.zIndex = 110
-
-    this.editorElem.customConfig.menus = ['bold', 'italic', 'underline', 'link', 'list', 'justify', 'table']
-    this.editorElems.customConfig.menus = ['bold', 'italic', 'underline', 'link', 'list', 'justify', 'table']
-    this.editorFrom.customConfig.menus = ['bold', 'italic', 'underline', 'link', 'list', 'justify', 'table']
-    this.editorFro.customConfig.menus = ['bold', 'italic', 'underline', 'link', 'list', 'justify', 'table']
-
-    this.editorElem.customConfig.onchange = (html) => { this.editorElem = html }
-    this.editorElems.customConfig.onchange = (html) => { this.editorElems = html }
-    this.editorFrom.customConfig.onchange = (html) => { this.editorFrom = html }
-    this.editorFro.customConfig.onchange = (html) => { this.editorFro = html }
-
-    this.editorElem.create()
-    this.editorElems.create()
-    this.editorFrom.create()
-    this.editorFro.create()
-
-    this.editorElems.txt.html(`<p></p><table width="100%"><colgroup><col width="20%"><col width="20%"><col width="20%"><col width="20%"><col width="20%"></colgroup><thead><tr><th>页面</th><th>模块</th><th>接口</th><th>测试结果</th><th>备注</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td><td><br></td><td><br></td></tr></tbody></table><p></p>`)
-    this.editorFrom.txt.html(`<p>1、机型兼容</p><table width="100%"><colgroup><col width="20%"><col width="20%"><col width="20%"><col width="20%"></colgroup><thead><tr><th>手机型号</th><th>操作系统</th><th>分辨率</th><th>(微信版本号)</tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td><td><br></td></tr></tbody></table><p>2、网络兼容</p><table width="100%"><colgroup><col width="20%"><col width="20%"><col width="20%"></colgroup><thead><tr><th>WIFI</th><th>4G</th><th>5G</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td></tr></tbody></table><p>3、容器兼容</p><br>`)
-    this.editorFro.txt.html(`<p></p><table width="100%"><colgroup><col width="20%"><col width="20%"><col width="20%"><col width="20%"><col width="20%"></colgroup><thead><tr><th>验收项</th><th>验收点</th><th>验收人</th><th>验收结果</th><th>备注</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td><td><br></td><td><br></td></tr></tbody></table><p></p>`)
+  watch: {
+    clienData: {
+      handler(newV, old) {
+        if (newV.id) {
+          this.getRouterData()
+        }
+        this.bugNum = { type: 2, taskIds: newV.taskIds }
+        this.getBugData()
+      },
+      immediate: true
+    }
   },
   methods: {
     getRouterData() {
-      var url = location.href // 获取url中"?"符后的字串
-      var arr = url.split('=')
-      console.log(this.clienData, '准出客户端')
       this.ClientData = this.clienData
-      var task_Ids = ''
-      this.clienData.taskIds ? task_Ids = this.ClientData.taskIds : task_Ids = [Number(arr[1])]
-      this.bugNum = { type: 2, taskIds: task_Ids }
-      this.getBugData()
       if (this.ClientData.status === 1) {
         this.tagBtn = 'success'
         this.tagBtn1 = 'info'
@@ -307,18 +278,17 @@ export default {
         }
       }
       this.$nextTick(() => {
-        this.ClientData.projectBackground !== null ? this.editorElem.txt.html(this.ClientData.projectBackground) : ''
-        this.ClientData.fctInfo !== null ? this.editorElems.txt.html(this.ClientData.fctInfo) : ''
-        this.ClientData.sctInfo !== null ? this.editorFrom.txt.html(this.ClientData.sctInfo) : ''
-        this.ClientData.acceptanceResultInfo !== null ? this.editorFro.txt.html(this.ClientData.acceptanceResultInfo) : ''
+        this.clienEdit.projectBackground = this.ClientData.projectBackground || this.clienEdit.projectBackground
+        this.clienEdit.fctInfo = this.ClientData.fctInfo || this.clienEdit.fctInfo
+        this.clienEdit.sctInfo = this.ClientData.sctInfo || this.clienEdit.sctInfo
+        this.clienEdit.acceptanceResultInfo = this.ClientData.acceptanceResultInfo || this.clienEdit.acceptanceResultInfo
       })
     },
-    getBugData() {
-      bugFinishList(this.bugNum).then(res => {
-        res.data.launchInfo !== null ? this.$set(this.ClientData, 'smokeTestResult', res.data.launchInfo) : ''
-        this.tableData = [res.data]
-        this.formatData()
-      })
+    async getBugData() {
+      const res = await bugFinishList(this.bugNum)
+      res.data.launchInfo !== null ? this.$set(this.ClientData, 'smokeTestResult', res.data.launchInfo) : ''
+      this.tableData = [res.data]
+      this.formatData()
     },
     parentHandleclick(e, task, id) {
       if (e === 1) {
@@ -333,10 +303,10 @@ export default {
       this.$refs['ClientData'].validate((valid) => {
         if (valid) {
           this.ClientData = ele
-          typeof (this.editorElem) === 'string' ? this.ClientData.projectBackground = this.editorElem : ''
-          typeof (this.editorElems) === 'string' ? this.ClientData.fctInfo = this.editorElems : ''
-          typeof (this.editorFrom) === 'string' ? this.ClientData.sctInfo = this.editorFrom : ''
-          typeof (this.editorFro) === 'string' ? this.ClientData.acceptanceResultInfo = this.editorFro : ''
+          this.ClientData.projectBackground = this.clienEdit.projectBackground
+          this.ClientData.fctInfo = this.clienEdit.fctInfo
+          this.ClientData.sctInfo = this.clienEdit.sctInfo
+          this.ClientData.acceptanceResultInfo = this.clienEdit.acceptanceResultInfo
           this.ClientData.pftResult = this.pftResult
           this.ClientData.sctResult = this.sctResult
           this.ClientData.acceptanceResult = this.acceptanceResult
@@ -362,10 +332,10 @@ export default {
       this.$refs['ClientData'].validate((valid) => {
         if (valid) {
           this.ClientData = ele
-          typeof (this.editorElem) === 'string' ? this.ClientData.projectBackground = this.editorElem : ''
-          typeof (this.editorElems) === 'string' ? this.ClientData.fctInfo = this.editorElems : ''
-          typeof (this.editorFrom) === 'string' ? this.ClientData.sctInfo = this.editorFrom : ''
-          typeof (this.editorFro) === 'string' ? this.ClientData.acceptanceResultInfo = this.editorFro : ''
+          this.ClientData.projectBackground = this.clienEdit.projectBackground
+          this.ClientData.fctInfo = this.clienEdit.fctInfo
+          this.ClientData.sctInfo = this.clienEdit.sctInfo
+          this.ClientData.acceptanceResultInfo = this.clienEdit.acceptanceResultInfo
           this.ClientData.pftResult = this.pftResult
           this.ClientData.sctResult = this.sctResult
           this.ClientData.acceptanceResult = this.acceptanceResult
@@ -511,17 +481,6 @@ export default {
     height:100%;
     display: inline-block;
   }
-  .toolbar {
-    border: 2px solid #DEE2E7;
-  }
-  .text {
-    text-align: left;
-    min-height: 100px;
-    font-size: 15px;
-    color: #606266;
-    border: 1px solid #DEE2E7;
-    height: auto;
-  }
   .BJIsize {
     display: flex;
     align-items: center;

+ 11 - 22
src/views/Platform/presentation/PresentReport.vue

@@ -91,8 +91,7 @@
 
       <div class="backStyle">二. 联调详情</div>
 
-      <div id="DetailsOfProposal" class="toolbar" />
-      <div id="DetailsOfProposal1" class="text" />
+      <normal-area id="presen-children-joinTest" :value.sync="clienEdit.joinTest" :height="200" />
 
       <div class="backStyle">三. 其他</div>
 
@@ -107,10 +106,13 @@
 
 <script>
 import { launchTestUpdate, launchTestCreate } from '@/api/InterfaceReport'
-import E from 'wangeditor'
+import normalArea from '@/components/input/normalArea'
 
 export default {
   name: 'PresentReport',
+  components: {
+    normalArea
+  },
   props: {
     clienData: {
       type: Object,
@@ -159,7 +161,9 @@ export default {
       dataChange: {
         cr: 0
       },
-      DetailsOfProposal: '',
+      clienEdit: {
+        joinTest: `<p></p><table border="1" style="border: 1px solid #DEE2E7" width="100%"><colgroup><col width="30%"><col width="30%"><col width="30%"></colgroup><thead><tr><th>端类型</th><th>联调RD</th><th>联调结果</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td></tr></tbody></table>`
+      },
       lateStatus: '',
       bizIdCode: '',
       projectIdCode: '',
@@ -179,12 +183,6 @@ export default {
         this.getRouterData()
       })
     })
-    this.DetailsOfProposal = new E('#DetailsOfProposal', '#DetailsOfProposal1')
-    this.DetailsOfProposal.customConfig.zIndex = 110
-    this.DetailsOfProposal.customConfig.menus = ['bold', 'italic', 'underline', 'link', 'list', 'justify', 'table']
-    this.DetailsOfProposal.customConfig.onchange = (html) => { this.DetailsOfProposal = html }
-    this.DetailsOfProposal.create()
-    this.DetailsOfProposal.txt.html(`<p></p><table width="100%"><colgroup><col width="30%"><col width="30%"><col width="30%"></colgroup><thead><tr><th>端类型</th><th>联调RD</th><th>联调结果</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td></tr></tbody></table><p></p>`)
   },
   methods: {
     getRouterData() {
@@ -240,7 +238,7 @@ export default {
           this.showCodeReview = false
         }
         this.$nextTick(() => {
-          this.DetailsOfProposal.txt.html(this.dataChange.joinTest)
+          this.clienEdit.joinTest = this.dataChange.joinTest || this.clienEdit.joinTest
         })
       }
       if (!this.clienData[0] === undefined) {
@@ -253,7 +251,7 @@ export default {
           this.dataChange = ele
           this.dataChange.lateStatus = this.lateStatus
           this.dataChange.id === undefined ? this.dataChange.id = this.clien : ''
-          typeof (this.DetailsOfProposal) === 'string' ? this.dataChange.joinTest = this.DetailsOfProposal : ''
+          this.ClientData.joinTest = this.clienEdit.joinTest
           this.userData = { ename: this.userInformation, name: this.userNames }
           this.objData = { launchTestInfo: this.dataChange, user: this.userData }
           launchTestUpdate(this.objData).then(res => {
@@ -283,7 +281,7 @@ export default {
           this.dataChange = ele
           this.dataChange.configInfo ? '' : this.dataChange.configInfo = ''
           this.dataChange.dependentComponents ? '' : this.dataChange.dependentComponents = ''
-          typeof (this.DetailsOfProposal) === 'string' ? this.dataChange.joinTest = this.DetailsOfProposal : ''
+          this.dataChange.joinTest = this.clienEdit.joinTest
           this.dataChange.bizId = Number(localStorage.getItem('bizId'))
           this.dataChange.taskIds = this.ids
           this.dataChange.type = 1
@@ -386,15 +384,6 @@ export default {
      text-align: center;
      cursor:pointer
   }
-  .toolbar {
-    border: 1px solid #DEE2E7;
-  }
-  .text {
-    font-size: 15px;
-    color: #606266;
-    border: 1px solid #DEE2E7;
-    height: auto;
-  }
   .CodeReview {
     /deep/ .el-form-item__label {
       width: 106px;

+ 17 - 40
src/views/Platform/presentation/presentationReport.vue

@@ -81,13 +81,12 @@
         </el-col>
       </div>
       <el-form-item label="提测模块" style="margin: 2px 0;" />
-      <div id="DetailsOfProposal" class="toolbar" />
-      <div id="DetailsOfProposal1" class="text" />
+
+      <normal-area id="presens-children-moduleInfo" :value.sync="clienEdit.moduleInfo" :height="200" />
 
       <div class="backStyle">二. 联调详情</div>
 
-      <div id="editorContent" class="toolbar" />
-      <div id="editorContent1" class="text" />
+      <normal-area id="presens-children-joinTest" :value.sync="clienEdit.joinTest" :height="200" />
 
       <div class="backStyle">三. 其他</div>
       <div class="double">
@@ -108,10 +107,13 @@
 const _ = require('lodash')
 import moment from 'moment'
 import { launchTestUpdate, launchTestCreate } from '@/api/InterfaceReport'
-import E from 'wangeditor'
+import normalArea from '@/components/input/normalArea'
 
 export default {
   name: 'PresentationReport',
+  components: {
+    normalArea
+  },
   props: {
     clienData: {
       type: Object,
@@ -155,36 +157,19 @@ export default {
       lateStatus: 1,
       getInfo: '',
       fromDev: {},
+      clienEdit: {
+        moduleInfo: `<p></p><table border="1" style="border: 1px solid #DEE2E7" width="100%"><colgroup><col width="30%"><col width="30%"><col width="30%"></colgroup><thead><tr><th>提测模块</th><th>提测分支</th><th>对应RD</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td></tr></tbody></table>`,
+        joinTest: `<p></p><table border="1" style="border: 1px solid #DEE2E7" width="100%"><colgroup><col width="30%"><col width="30%"><col width="30%"></colgroup><thead><tr><th>联调模块</th><th>联调RD</th><th>联调结果</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td></tr></tbody></table>`
+      },
       ids: [],
-      editorContent: '',
       showData: false,
       showCodeReview: false,
-      DetailsOfProposal: '',
       projectIdCode: ''
     }
   },
   created() {
     this.getRouterData()
   },
-  mounted() {
-    this.editorContent = new E('#editorContent', '#editorContent1')
-    this.DetailsOfProposal = new E('#DetailsOfProposal', '#DetailsOfProposal1')
-
-    this.editorContent.customConfig.zIndex = 110
-    this.DetailsOfProposal.customConfig.zIndex = 110
-
-    this.editorContent.customConfig.menus = ['bold', 'italic', 'underline', 'link', 'list', 'justify', 'table']
-    this.DetailsOfProposal.customConfig.menus = ['bold', 'italic', 'underline', 'link', 'list', 'justify', 'table']
-
-    this.editorContent.customConfig.onchange = (html) => { this.editorContent = html }
-    this.DetailsOfProposal.customConfig.onchange = (html) => { this.DetailsOfProposal = html }
-
-    this.editorContent.create()
-    this.DetailsOfProposal.create()
-
-    this.editorContent.txt.html(`<p></p><table width="100%"><colgroup><col width="30%"><col width="30%"><col width="30%"></colgroup><thead><tr><th>联调模块</th><th>联调RD</th><th>联调结果</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td></tr></tbody></table><p></p>`)
-    this.DetailsOfProposal.txt.html(`<p></p><table width="100%"><colgroup><col width="30%"><col width="30%"><col width="30%"></colgroup><thead><tr><th>提测模块</th><th>提测分支</th><th>对应RD</th></tr></thead><tbody><tr><td><br></td><td><br></td><td><br></td></tr><tr><td><br></td><td><br></td><td><br></td></tr></tbody></table><p></p>`)
-  },
   methods: {
     getRouterData() {
       console.log(this.clienData, '提测服务端')
@@ -226,8 +211,8 @@ export default {
           this.$set(this.fromDev, 'crBy', '')
         }
         this.$nextTick(() => {
-          this.fromDev.joinTest !== null ? this.editorContent.txt.html(this.fromDev.joinTest) : ''
-          this.fromDev.moduleInfo !== null ? this.DetailsOfProposal.txt.html(this.fromDev.moduleInfo) : ''
+          this.clienEdit.moduleInfo = this.fromDev.moduleInfo || this.clienEdit.moduleInfo
+          this.clienEdit.joinTest = this.fromDev.joinTest || this.clienEdit.joinTest
         })
       }
     },
@@ -235,8 +220,8 @@ export default {
       this.$refs['fromDev'].validate((valid) => {
         if (valid) {
           const params = _.cloneDeep(this.fromDev)
-          typeof (this.editorContent) === 'string' ? params.joinTest = this.editorContent : ''
-          typeof (this.DetailsOfProposal) === 'string' ? params.moduleInfo = this.DetailsOfProposal : ''
+          params.moduleInfo = this.clienEdit.moduleInfo
+          params.joinTest = this.clienEdit.joinTest
           params.lateStatus = this.lateStatus
           params.devTimeStart = moment(params.devTimeStart).format('YYYY.MM.DD')
           params.devTimeEnd = moment(params.devTimeEnd).format('YYYY.MM.DD')
@@ -270,7 +255,8 @@ export default {
         if (valid) {
           this.fromDev = ele
           typeof (this.editorContent) === 'string' ? this.fromDev.joinTest = this.editorContent : ''
-          typeof (this.DetailsOfProposal) === 'string' ? this.fromDev.moduleInfo = this.DetailsOfProposal : ''
+          this.fromDev.moduleInfo = this.clienEdit.moduleInfo
+          this.fromDev.joinTest = this.clienEdit.joinTest
           this.fromDev.lateReason = ele.lateReason
           this.fromDev.lateStatus = this.lateStatus
           this.fromDev.bizId = Number(localStorage.getItem('bizId'))
@@ -352,15 +338,6 @@ export default {
     border-radius: 4px;
     margin: 1% 0;
   }
-  .toolbar {
-    border: 2px solid #DEE2E7;
-  }
-  .text {
-   font-size: 15px;
-   color: #606266;
-   border: 2px solid #DEE2E7;
-   height: auto;
-  }
   .CodeReview {
     /deep/ .el-form-item__label {
       width: 106px;

+ 3 - 1
src/views/ToConfigure/configure.vue

@@ -49,7 +49,7 @@
           </el-tab-pane>
         </el-tabs>
       </div>
-      <el-dialog :title="title_name" :visible.sync="dialogFormVisible" width="40%" center :close-on-click-modal="false">
+      <el-dialog v-if="dialogFormVisible" :title="title_name" :visible.sync="dialogFormVisible" width="40%" center :close-on-click-modal="false">
         <el-form ref="form" label-position="left" :model="form" :rules="rules" label-width="110px">
           <el-form-item label="团队名称" prop="teamName">
             <el-input v-model="form.teamName" autocomplete="off" placeholder="请输入团队名称,不得超过20个汉字" @blur="blur_teamName(form)" />
@@ -428,6 +428,8 @@ export default {
         const teamMemberRelateInfoResponseList = []
         const leader = []
         const teamMember = []
+        this.arr = []
+        this.arry = []
         res.data.teamLeaderRelateInfoResponseList.map(item => {
           teamLeaderRelateInfoResponseList.push({ name: item.memberName, idap: item.memberIDAP, teamId: item.teamId })
           leader.push(item.memberIDAP)

+ 368 - 0
src/views/projectManage/components/demand.vue

@@ -0,0 +1,368 @@
+<template>
+  <!-- 表头 -->
+  <div class="schedule-list">
+    <el-table v-if="tableHeader === false" max-height="38px" :data="datas" class="tableHeader" border size="mini" :header-cell-style="{ background: 'rgba(247,247,247,1)', color: 'rgb(74, 74, 74)', fontSize: '14px', fontWeight: '500'}" @selection-change="changeCheckout(1)">
+      <el-table-column v-if="locking" type="selection" width="50" align="center" />
+      <el-table-column prop="date" label="任务" width="300" />
+      <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="peopleList" label="参与人员" min-width="150" />
+      <el-table-column label="操作" width="120" />
+    </el-table>
+    <div v-if="tableHeader === true" class="Layout_space_between" style="height: 40px;;border: 1px solid #EBEEF5;">
+      <div class="Layout_flex_start" style="width: 90%">
+        <el-checkbox v-model="checkAlls" style="padding: 17.5px; line-height: 20px; border-right: 1px solid #EBEEF5" @change="changeCheckout(checkAlls)" />
+        <div style="margin: 0 30px 0 10px" class="endCheck"> 已选择 <span style="color:rgba(64,158,255,1) ">{{ taskList.length }}</span> 个</div>
+        <div class="endCheck cursorPo" @click="clickAddScheduling(1)"><i class="el-icon-document" /> 添加排期</div>
+      </div>
+      <div class="endCheck cursorPo" @click="Deselect">取消选择</div>
+    </div>
+    <!-- 表头 -->
+
+    <!-- 任务表格 -->
+    <el-table ref="taskList" :data="tableData" :cell-class-name="addClass" :header-cell-style="{ background: 'rgba(247,247,247,1)', color: 'rgb(74, 74, 74)', fontSize: '14px', fontWeight: '500'}" border :show-header="false" @selection-change="handleSelectionChange">
+      <el-table-column v-if="locking" type="selection" width="50" align="center" />
+      <el-table-column label="任务" width="300" align="left">
+        <template slot-scope="scope">
+          <div v-if="!scope.row.vsInput">
+            <div class="templatName">
+              <el-tooltip class="item" effect="dark" :content="scope.row.moduleInfoName" placement="top">
+                <span>{{ scope.row.moduleInfoName === null ? "" : scope.row.moduleInfoName.substring(0,9) }}</span>
+              </el-tooltip>
+              <span v-if="scope.row.involveAppString !== null" class="el-involveApp">{{ scope.row.involveAppString }}</span>
+            </div>
+
+            <div class="Layout_space_between" @mouseover="scope.row.vVisible = true" @mouseout="scope.row.vVisible = false">
+              <div class="Layout_flex_start">
+                <div class="templatTaskName cursorPo" @click="clickTemplatTaskName(scope.row.id)">{{ scope.row.name }}</div>
+                <el-tooltip v-if="locking" class="item" effect="dark" :content="scope.row.isScheduleLocked === 1? '点击解锁排期' : '点击锁定排期'" placement="top">
+                  <div :class="scope.row.isScheduleLocked === 1 ? 'el-icon-lock' : 'el-icon-unlock'" @click="changeSchedule(scope.row)" />
+                </el-tooltip>
+              </div>
+              <div v-if="locking" v-show="scope.row.vVisible" class="iconEdit"><i class="el-icon-edit-outline iconPadding cursorPo" @click="editTask(scope.row)" /> <i v-show="scope.row.isScheduleLocked === 0" class="el-icon-circle-plus-outline cursorPo" @click="clickAddScheduling(2,scope.row)" /></div>
+            </div>
+
+            <div class="templatCreator">
+              开发负责人:{{ scope.row.rdObject.name !== null? scope.row.rdObject.name: '无' }} 测试负责人: {{ scope.row.qaObject.name !== null?scope.row.qaObject.name: '无' }}
+            </div>
+          </div>
+          <el-input v-if="scope.row.vsInput" ref="taskName" v-model="taskName" type="textarea" rows="4" placeholder="请输入内容" maxlength="150" show-word-limit @blur="changeTaskName(scope.row)" />
+        </template>
+      </el-table-column>
+      <el-table-column label="任" style="padding: 20px;">
+        <template slot-scope="scope">
+          <schedule-list :id="scope.row.id" ref="taskSchedule" :locking="locking" :select-task-list="taskList" :required-list="taskScheduleLists(scope.row.id)" @listByTask="listByTask(requirementId)" />
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 任务表格 -->
+
+    <!-- 日期详情 -->
+    <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 :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-row>
+    <el-row><span class="demandLayout">预计上线版本:</span> <span v-for="item in preOnlineVersion" :key="item" class="demandeta">{{ item }}</span></el-row>
+    <!-- 日期详情 -->
+
+    <!-- 排期锁定弹窗 -->
+    <schedule ref="ScheduleEvent" :visible.sync="scheduleVisble" :name="'任务'" :is-schedule-locked="isScheduleLocked" :require-id="Number(taskId)" @updataData="listByTask(requirementId)" />
+  <!-- 排期锁定弹窗 -->
+  </div>
+</template>
+<script>
+import { listByRequire } from '@/api/requirement.js'
+import scheduleList from '@/views/projectManage/components/scheduleList.vue'
+import '@/styles/PublicStyle/index.scss' // 通用css
+import { taskUpdate } from '@/api/taskIndex'
+import schedule from '@/views/projectManage/schedule' // 排期锁定弹窗
+export default {
+  components: {
+    scheduleList,
+    schedule
+  },
+  props: {
+    requiredList: {
+      type: [Object, Array],
+      default: () => null,
+      required: false
+    }
+  },
+  data() {
+    return {
+      requirementId: Number(this.$route.query.id),
+      tableData: [],
+      checkAlls: false,
+      taskScheduleList: [],
+      scheduleList: [],
+      datas: [{
+        date: '',
+        type: '',
+        desc: '',
+        seperateDaysNoHoliday: '',
+        dayLength: '',
+        peopleList: ''
+      }],
+      isScheduleLocked: '', //  当前排期的状态
+      taskId: '', // taskID
+      scheduleVisble: false, // 排期锁定
+      userInformation: localStorage.getItem('username'),
+      userNames: localStorage.getItem('realname'),
+      taskList: [], // 全选list
+      tableHeader: false, // 表头切换
+      taskName: '', // taskname
+      scheduleDetail: {}, // 用例/开发/提测/测试/准出/上线
+      preOnlineVersion: [], // 预计上线版本
+      dataList: {}, // 排期
+      taskScheduleEvent: [], // 排期类型
+      locking: true, // 查看历史记录锁定能
+      isDelete: false // 删除排期操作
+    }
+  },
+  watch: {
+    requiredList: {
+      handler(newV, old) {
+        if (newV.length === 0) {
+          console.log('没有数据')
+        } else {
+          this.tableData = newV.taskDetailList // 任务list
+          this.dataList = newV // 排期
+          this.scheduleList = newV.scheduleDetailRespons || []
+          this.scheduleDetail = newV.timeInfos // 用例/开发/提测/测试/准出/上线
+          this.preOnlineVersion = newV.preOnlineVersion // 预计上线版本
+          this.taskScheduleEvent = newV.scheduleDetailRespons // 排期详情
+          this.locking = false
+          this.tableHeader = false
+          if (this.tableData !== null) {
+            this.tableData = this.tableData.map(item => ({
+              ...item,
+              vVisible: false,
+              vsInput: false
+            }))
+          }
+        }
+      },
+      immediate: true
+    }
+  },
+  methods: {
+    async listByTask(id) { // 获取排期列表
+      this.taskList = []
+      this.scheduleVisble = false
+      const res = await listByRequire(id)
+      if (res.code === 200) {
+        this.$nextTick(() => {
+          this.tableData = res.data.taskDetailList // 任务list
+          this.dataList = res.data // 排期
+          this.scheduleList = res.data.scheduleDetailRespons || []
+          this.scheduleDetail = res.data.timeInfos // 用例/开发/提测/测试/准出/上线
+          this.preOnlineVersion = res.data.preOnlineVersion // 预计上线版本
+          this.taskScheduleEvent = res.data.scheduleDetailRespons // 排期详情
+          this.tableData = this.tableData.map(item => ({
+            ...item,
+            vVisible: false,
+            vsInput: false
+          }))
+        })
+      }
+    },
+
+    addClass({ row, column, rowIndex, columnIndex }) {
+      if (columnIndex === 2) {
+        return 'cell-grey'
+      }
+    },
+    lockingchange() {
+      this.locking = true
+    },
+    changeSchedule(ele) { // 修改锁定状态
+      if (this.dataList.isScheduleLocked === 1 && ele.isScheduleLocked === 1) {
+        this.$message({ message: '无法解锁,请先变更归属需求的排期状态为未锁定状态!', type: 'error', duration: 3000, offset: 150 })
+      } else {
+        this.isScheduleLocked = ele.isScheduleLocked
+        this.taskId = ele.id
+        this.scheduleVisble = true
+      }
+    },
+    async changeTaskName(val) { // 修改taskname
+      val.vsInput = false
+      val.vVisible = false
+      val.name = this.taskName.split(' ').join('').length === 0 ? val.name : this.taskName
+      const taskInfoDO = val
+      const user = { name: this.userNames, ename: this.userInformation, id: '' }
+      const res = await taskUpdate({ taskInfoDO, user })
+      if (res.code === 200) {
+        this.$message({ message: '已修改任务名称', type: 'success', duration: 1000, offset: 150 })
+      }
+    },
+    clickAddScheduling(index, ele) { // 模拟调用自组件方法
+      if (index === 2) {
+        this.taskList = []
+        this.taskList.push(ele)
+      }
+      const taskA = []
+      this.taskList.map(item => {
+        if (item.isScheduleLocked === 1) {
+          taskA.push(item.taskIdSting)
+        }
+      })
+      if (taskA.length !== 0) {
+        this.$message({ message: '任务 ' + taskA + ' 的排期已锁定,请先解锁排期后再添加排期', type: 'warning', offset: 150 })
+        return
+      }
+      this.$refs.taskSchedule.addSchedule()
+    },
+    clickTemplatTaskName(e) { // 任务名称店家跳转
+      const { href } = this.$router.resolve({ name: '任务详情', query: { id: e }})
+      window.open(href, '_blank')
+    },
+    editTask(val) { // 点击修改taskName
+      val.vsInput = true
+      this.taskName = val.name
+      this.$nextTick(() => {
+        this.$refs.taskName.focus()
+      })
+    },
+    changeCheckout(rows) {
+      if (rows) {
+        this.tableData.forEach(row => {
+          this.$refs.taskList.toggleRowSelection(row, true)
+        })
+      } else {
+        this.$refs.taskList.clearSelection()
+      }
+    },
+    Deselect() { // 取消选择
+      this.taskList.forEach(row => {
+        this.$refs.taskList.clearSelection()// 调用这个方法
+      })
+      this.tableHeader = false
+      this.taskList = []
+    },
+    handleSelectionChange(val) {
+      this.taskList = val
+      this.taskList.length === this.tableData.length ? this.checkAlls = true : this.checkAlls = false
+      if (this.taskList.length > 0) {
+        this.tableHeader = true
+      } else {
+        this.tableHeader = false
+      }
+    },
+    taskScheduleLists(id) {
+      for (var key in this.taskScheduleEvent) {
+        if (id === Number(key)) {
+          return this.taskScheduleEvent[key]
+        }
+      }
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.templatName {
+  font-size:12px;
+  font-family:MicrosoftYaHei;
+  line-height:14px;
+  color:rgba(102,102,102,1);
+  opacity:1;
+  margin: 5px 0;
+}
+.templatTaskName {
+  font-size:14px;
+  font-family:MicrosoftYaHei;
+  line-height:23px;
+  color:rgba(51,51,51,1);
+  margin-right: 5px;
+  opacity:1;
+}
+.cursorPo:hover {
+  color:#409EFF;
+  cursor: pointer;
+}
+.templatCreator {
+  font-size:12px;
+  font-family:MicrosoftYaHei;
+  line-height:14px;
+  color:rgba(102,102,102,1);
+  opacity:1;
+  margin: 5px 0;
+}
+.demandLayout {
+  display: inline-block;
+  // width: 100px;
+  margin: 10px 0;
+  font-size:12px;
+  line-height:14px;
+  color:rgba(102,102,102,1);
+  opacity:1;
+}
+.demandeta {
+  font-size:12px;
+  font-family:MicrosoftYaHei;
+  line-height:14px;
+  color:rgba(51,51,51,1);
+  opacity:1;
+}
+.iconEdit {
+  width:67px;
+  background:rgba(245,245,245,1);
+  opacity:1;
+  padding: 0 10px;
+  border-radius:20px;
+  display: flex;
+  justify-content: space-between;
+}
+.tableHeader {
+  >>> .el-table__empty-block{
+    display: none;
+  }
+}
+.iconPadding {
+  margin-right: 5px;
+}
+.schedule-list {
+ /deep/ .el-table td {
+    padding: 0;
+ }
+}
+.schedule-list {
+  margin: 0 20px;
+  padding: 0;
+}
+>>>.el-table, .el-table__expanded-cell{
+  background:rgba(248,248,248,0.6);
+}
+.el-involveApp {
+  border:1px solid rgba(64,158,255,1);
+  border-radius:20px;
+  font-size:10px;
+  font-family:MicrosoftYaHei;
+  line-height:12px;
+  padding: 0 5px;
+  margin-left: 5px;
+  color:rgba(64,158,255,1);
+  opacity:1;
+}
+.endCheck {
+  font-size:14px;
+  font-family:Microsoft Sans Serif;
+  font-weight:400;
+  line-height:16px;
+  margin-right: 10px;
+  color:rgba(102,102,102,1);
+  opacity:1;
+}
+
+</style>
+<style>
+ .cell-grey .cell {
+   padding: 0 !important;
+ }
+.el-tooltip__popper.is-dark {
+  background:rgba(121,132,150,0.8);
+  color: #FFF;
+}
+</style>

+ 232 - 0
src/views/projectManage/components/scheduleList.vue

@@ -0,0 +1,232 @@
+<template>
+  <div class="white">
+    <el-table
+      :id="'schedule-'+id"
+      :data="scheduleList"
+      show-overflow-tooltip="true"
+      :show-header="false"
+      :cell-class-name="addClass"
+      row-key="id"
+      border
+      style="min-height: 90px;"
+      size="mini"
+      :class="{'ignore-elements': dondrop }"
+    >
+      <el-table-column prop="type" label="类型" min-width="70">
+        <template slot-scope="scope">
+          {{ scope.row.name }}
+          <div :class="scope.row.isScheduleLocked === 1 ? 'el-icon-lock' : 'el-icon-unlock'" />
+        </template>
+      </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="160" show-overflow-tooltip />
+      <el-table-column prop="dayLength" label="时长" min-width="50" />
+      <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 label="操作" width="120">
+        <template slot-scope="scope">
+          <div class="btn-style">
+            <el-button v-if="scope.row.isScheduleLocked === 0" type="text" size="small" @click="editSchedule(scope.row)">编辑</el-button>
+            <el-button v-if="scope.row.isScheduleLocked === 0" type="text" size="small" @click="deleteSchedule(scope.row)">删除</el-button>
+          </div>
+        </template>
+      </el-table-column>
+
+    </el-table>
+    <modify-schedule
+      v-if="visibleSchedule"
+      :visible.sync="visibleSchedule"
+      :select-task-list="selectTaskList"
+      :is-delete.sync="isDelete"
+      :detail-data="detailData"
+      :title="DialogTitle"
+      @update="listByTask(id)"
+    />
+  </div>
+</template>
+<script>
+import Sortable from 'sortablejs'
+import { sortForTask } from '@/api/projectViewDetails'
+import modifySchedule from '@/views/projectManage/requirement/components/modifySchedule.vue'
+import '@/styles/PublicStyle/index.scss' // 通用css
+export default {
+  components: {
+    modifySchedule
+  },
+  props: {
+    id: {
+      type: Number,
+      default: NaN,
+      required: true
+    },
+    locking: {
+      type: Boolean,
+      required: true
+    },
+    selectTaskList: { // 已选任务列表
+      type: Array,
+      default: () => [],
+      required: false
+    },
+    requiredList: {
+      type: Array,
+      default: () => [],
+      required: false
+    },
+    typeList: {
+      type: Array,
+      default: () => [],
+      required: false
+    }
+  },
+  data() {
+    return {
+      scheduleList: [],
+      scheduleDetail: {},
+      visibleSchedule: false,
+      detailData: null,
+      dondrop: true,
+      taskScheduleEvent: [], // 排期类型
+      DialogTitle: '新建排期',
+      isDelete: false // 删除排期操作
+    }
+  },
+  watch: {
+    locking: {
+      handler(newV, oldV) {
+        this.dondrop = !newV
+      },
+      immediate: true
+    },
+    requiredList: {
+      handler(newV, oldV) {
+        this.scheduleList = newV
+      },
+      immediate: true
+    },
+    typeList: {
+      handler(newV, oldV) {
+        this.taskScheduleEvent = newV
+      },
+      immediate: true
+    }
+  },
+
+  mounted() {
+    this.rowDrop()
+  },
+  methods: {
+    rowDrop() {
+      const tbody = document.querySelector(`#schedule-${this.id} tbody`)
+      const _this = this
+      Sortable.create(tbody, {
+        disabled: _this.dondrop,
+        onEnd({ newIndex, oldIndex }) {
+          const currRow = _this.scheduleList.splice(oldIndex, 1)[0]
+          _this.scheduleList.splice(newIndex, 0, currRow)
+          _this.sortForTask(_this.scheduleList.map(item => item.id))
+        }
+      })
+    },
+    async sortForTask(arr) {
+      const res = await sortForTask(this.id, arr)
+      if (res.code === 200) {
+        this.$message({ message: '移动成功', type: 'success', duration: 1000, offset: 150 })
+      }
+    },
+    getType(value) {
+      const res = this.taskScheduleEvent.find(item => item.code === value) || {}
+      return res.msg
+    },
+    async listByTask(id) { // 获取排期列表
+      this.$emit('listByTask')
+    },
+    addSchedule() {
+      this.detailData = null
+      this.DialogTitle = '新建排期'
+      this.visibleSchedule = true
+    },
+    deleteSchedule(row) { // 删除排期
+      this.DialogTitle = '删除排期'
+      this.isDelete = true
+      this.visibleSchedule = true
+      this.detailData = row
+    },
+    editSchedule(row) { // 编辑排期
+      this.DialogTitle = '编辑排期'
+      this.visibleSchedule = true
+      this.detailData = row
+    },
+    addClass({ row, column, rowIndex, columnIndex }) {
+      if (columnIndex <= 5) {
+        return 'cell-greys'
+      }
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.white {
+  background: #ffffff;
+  .add-schedule {
+    padding: 0 0 20px 0;
+  }
+  /deep/.el-table{
+    background: #ffffff !important;
+  }
+}
+.btn-style {
+ >>> .el-button {
+    padding: 0;
+  }
+}
+.add-schedule {
+  cursor: pointer;
+  color: #409EFF;
+  font-size: 14px;
+  margin: 0 20px;
+  padding: 20px 0;
+  i {
+    margin-right: 4px;
+  }
+  span {
+    margin-right: 20px;
+  }
+}
+>>>.el-table, .el-table__expanded-cell{
+  background:rgba(248,248,248,0.6);
+}
+.white {
+  background: #ffffff;
+  .add-schedule {
+    padding: 0 0 20px 0;
+  }
+  /deep/.el-table{
+    background: #ffffff !important;
+  }
+}
+.sortable-tip {
+  height: 26px;
+  width: 15px;
+  border-radius:2px;
+  margin: auto;
+  justify-content: center;
+  align-items: center;
+  img {
+    width: 8px;
+  }
+}
+</style>
+<style>
+ .cell-greys .cell {
+   margin-left: 10px !important;
+ }
+.el-tooltip__popper.is-dark {
+  background:rgba(121,132,150,0.8);
+  color: #FFF;
+}
+</style>
+

+ 10 - 4
src/views/projectManage/components/timeLine.vue

@@ -35,7 +35,7 @@
           />
         </div>
         <div :class="[index%2==0?'point1':'point2']" />
-        <div class="content3">
+        <div class="content3" :class="{'start-time': item.timeSpan === '0天'}">
           {{ item.timeSpan }}
         </div>
         <div class="content1">
@@ -103,11 +103,11 @@ export default {
 
 <style scoped lang="scss">
 .swiper-container {
-  padding-bottom: 50px;
+  padding-bottom: 20px;
   position: relative;
 }
 .timeline {
-  width: 90%;
+  width: calc(100% - 60px);
   list-style-type: none;
   display: flex;
   padding: 0;
@@ -115,7 +115,7 @@ export default {
 }
 .swiper-slide {
   height: 150px;
-  width: 210px !important;
+  width: 120px !important;
   display: flex;
   align-items: center;
   font-size: 18px;
@@ -216,6 +216,12 @@ export default {
   .content1 {
     top: 45px;
   }
+  .start-time {
+    color: rgba(153,153,153,1);
+  }
+}
+.swiper-slide {
+  margin-top: -30px;
 }
 .swiper-slide:nth-child(2n) {
   width: 40%;

+ 352 - 0
src/views/projectManage/iteration/components/demand.vue

@@ -0,0 +1,352 @@
+<template>
+  <!-- 表头 -->
+  <div class="schedule-list">
+    <el-table v-if="tableHeader === false" max-height="38px" :data="datas" class="tableHeader" border size="mini" :header-cell-style="{ background: 'rgba(247,247,247,1)', color: 'rgb(74, 74, 74)', fontSize: '14px', fontWeight: '500'}" @selection-change="changeCheckout(1)">
+      <el-table-column v-if="locking" type="selection" width="50" align="center" />
+      <el-table-column prop="date" label="任务" width="300" />
+      <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="peopleList" label="参与人员" min-width="150" />
+      <el-table-column label="操作" width="120" />
+    </el-table>
+    <div v-if="tableHeader === true" class="Layout_space_between" style="height: 40px;;border: 1px solid #EBEEF5;">
+      <div class="Layout_flex_start" style="width: 90%">
+        <el-checkbox v-model="checkAlls" style="padding: 17.5px; line-height: 20px; border-right: 1px solid #EBEEF5" @change="changeCheckout(checkAlls)" />
+        <div style="margin: 0 30px 0 10px" class="endCheck"> 已选择 <span style="color:rgba(64,158,255,1) ">{{ taskList.length }}</span> 个</div>
+        <div class="endCheck cursorPo" @click="clickAddScheduling(1)"><i class="el-icon-document" /> 添加排期</div>
+      </div>
+      <div class="endCheck cursorPo" @click="Deselect">取消选择</div>
+    </div>
+    <!-- 表头 -->
+
+    <!-- 任务表格 -->
+    <el-table ref="taskList" :data="tableData" :cell-class-name="addClass" :header-cell-style="{ background: 'rgba(247,247,247,1)', color: 'rgb(74, 74, 74)', fontSize: '14px', fontWeight: '500'}" border :show-header="false" @selection-change="handleSelectionChange">
+      <el-table-column v-if="locking" type="selection" width="50" align="center" />
+      <el-table-column label="任务" width="300" align="left">
+        <template slot-scope="scope">
+          <div v-if="!scope.row.vsInput">
+            <div class="templatName">
+              <el-tooltip class="item" effect="dark" :content="scope.row.moduleInfoName" placement="top">
+                <span>{{ scope.row.moduleInfoName === null ? "" : scope.row.moduleInfoName.substring(0,9) }}</span>
+              </el-tooltip>
+              <span v-if="scope.row.involveAppString !== null" class="el-involveApp">{{ scope.row.involveAppString }}</span>
+            </div>
+
+            <div class="Layout_space_between" @mouseover="scope.row.vVisible = true" @mouseout="scope.row.vVisible = false">
+              <div class="Layout_flex_start">
+                <div class="templatTaskName cursorPo" @click="clickTemplatTaskName(scope.row.id)">{{ scope.row.name }}</div>
+                <el-tooltip v-if="locking" class="item" effect="dark" :content="scope.row.isScheduleLocked === 1? '点击解锁排期' : '点击锁定排期'" placement="top">
+                  <div :class="scope.row.isScheduleLocked === 1 ? 'el-icon-lock' : 'el-icon-unlock'" @click="changeSchedule(scope.row)" />
+                </el-tooltip>
+              </div>
+              <div v-if="locking" v-show="scope.row.vVisible" class="iconEdit"><i class="el-icon-edit-outline iconPadding cursorPo" @click="editTask(scope.row)" /> <i v-show="scope.row.isScheduleLocked === 0" class="el-icon-circle-plus-outline cursorPo" @click="clickAddScheduling(2,scope.row)" /></div>
+            </div>
+
+            <div class="templatCreator">
+              开发负责人:{{ scope.row.rdObject.name !== null? scope.row.rdObject.name: '无' }} 测试负责人: {{ scope.row.qaObject.name !== null?scope.row.qaObject.name: '无' }}
+            </div>
+          </div>
+          <el-input v-if="scope.row.vsInput" ref="taskName" v-model="taskName" type="textarea" rows="4" placeholder="请输入内容" maxlength="150" show-word-limit @blur="changeTaskName(scope.row)" />
+        </template>
+      </el-table-column>
+      <el-table-column label="任" style="padding: 20px;">
+        <template slot-scope="scope">
+          <schedule-list :id="scope.row.id" ref="taskSchedule" :locking="locking" :select-task-list="taskList" :required-list="taskScheduleLists(scope.row.id)" @listByTask="listByTask(newID)" />
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 任务表格 -->
+
+    <!-- 日期详情 -->
+    <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 :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-row>
+    <el-row><span class="demandLayout">预计上线版本:</span> <span v-for="item in preOnlineVersion" :key="item" class="demandeta">{{ item }}</span></el-row>
+    <!-- 日期详情 -->
+
+    <!-- 排期锁定弹窗 -->
+    <schedule ref="ScheduleEvent" :visible.sync="scheduleVisble" :name="'任务'" :is-schedule-locked="isScheduleLocked" :require-id="Number(taskId)" @updataData="listByTask(newID)" />
+  <!-- 排期锁定弹窗 -->
+  </div>
+</template>
+<script>
+import { listByRequire } from '@/api/requirement.js'
+import scheduleList from '@/views/projectManage/components/scheduleList.vue'
+import '@/styles/PublicStyle/index.scss' // 通用css
+import { taskUpdate } from '@/api/taskIndex'
+import schedule from '@/views/projectManage/schedule' // 排期锁定弹窗
+export default {
+  components: {
+    scheduleList,
+    schedule
+  },
+  props: {
+    id: {
+      type: [String, Number],
+      default: () => null,
+      required: false
+    }
+  },
+  data() {
+    return {
+      requirementId: Number(this.$route.query.id),
+      tableData: [],
+      checkAlls: false,
+      taskScheduleList: [],
+      scheduleList: [],
+      datas: [{
+        date: '',
+        type: '',
+        desc: '',
+        seperateDaysNoHoliday: '',
+        dayLength: '',
+        peopleList: ''
+      }],
+      newID: '',
+      isScheduleLocked: '', //  当前排期的状态
+      taskId: '', // taskID
+      scheduleVisble: false, // 排期锁定
+      userInformation: localStorage.getItem('username'),
+      userNames: localStorage.getItem('realname'),
+      taskList: [], // 全选list
+      tableHeader: false, // 表头切换
+      taskName: '', // taskname
+      scheduleDetail: {}, // 用例/开发/提测/测试/准出/上线
+      preOnlineVersion: [], // 预计上线版本
+      dataList: {}, // 排期
+      taskScheduleEvent: [], // 排期类型
+      locking: true, // 查看历史记录锁定能
+      isDelete: false // 删除排期操作
+    }
+  },
+  watch: {
+    id: {
+      handler(newV, old) {
+        this.newID = newV
+        this.listByTask(newV)
+      },
+      immediate: true
+    }
+  },
+  methods: {
+    async listByTask(id) { // 获取排期列表
+      this.taskList = []
+      this.scheduleVisble = false
+      const res = await listByRequire(id)
+      if (res.code === 200) {
+        this.$nextTick(() => {
+          this.tableData = res.data.taskDetailList // 任务list
+          this.dataList = res.data // 排期
+          this.scheduleList = res.data.scheduleDetailRespons || []
+          this.scheduleDetail = res.data.timeInfos // 用例/开发/提测/测试/准出/上线
+          this.preOnlineVersion = res.data.preOnlineVersion // 预计上线版本
+          this.taskScheduleEvent = res.data.scheduleDetailRespons // 排期详情
+          this.tableData = this.tableData.map(item => ({
+            ...item,
+            vVisible: false,
+            vsInput: false
+          }))
+        })
+      }
+    },
+
+    addClass({ row, column, rowIndex, columnIndex }) {
+      if (columnIndex === 2) {
+        return 'cell-grey'
+      }
+    },
+    lockingchange() {
+      this.locking = true
+    },
+    changeSchedule(ele) { // 修改锁定状态
+      if (this.dataList.isScheduleLocked === 1 && ele.isScheduleLocked === 1) {
+        this.$message({ message: '无法解锁,请先变更归属需求的排期状态为未锁定状态!', type: 'error', duration: 3000, offset: 150 })
+      } else {
+        this.isScheduleLocked = ele.isScheduleLocked
+        this.taskId = ele.id
+        this.scheduleVisble = true
+      }
+    },
+    async changeTaskName(val) { // 修改taskname
+      val.vsInput = false
+      val.vVisible = false
+      val.name = this.taskName.split(' ').join('').length === 0 ? val.name : this.taskName
+      const taskInfoDO = val
+      const user = { name: this.userNames, ename: this.userInformation, id: '' }
+      const res = await taskUpdate({ taskInfoDO, user })
+      if (res.code === 200) {
+        this.$message({ message: '已修改任务名称', type: 'success', duration: 1000, offset: 150 })
+      }
+    },
+    clickAddScheduling(index, ele) { // 模拟调用自组件方法
+      if (index === 2) {
+        this.taskList = []
+        this.taskList.push(ele)
+      }
+      const taskA = []
+      this.taskList.map(item => {
+        if (item.isScheduleLocked === 1) {
+          taskA.push(item.taskIdSting)
+        }
+      })
+      if (taskA.length !== 0) {
+        this.$message({ message: '任务 ' + taskA + ' 的排期已锁定,请先解锁排期后再添加排期', type: 'warning', offset: 150 })
+        return
+      }
+      this.$refs.taskSchedule.addSchedule()
+    },
+    clickTemplatTaskName(e) { // 任务名称店家跳转
+      const { href } = this.$router.resolve({ name: '任务详情', query: { id: e }})
+      window.open(href, '_blank')
+    },
+    editTask(val) { // 点击修改taskName
+      val.vsInput = true
+      this.taskName = val.name
+      this.$nextTick(() => {
+        this.$refs.taskName.focus()
+      })
+    },
+    changeCheckout(rows) {
+      if (rows) {
+        this.tableData.forEach(row => {
+          this.$refs.taskList.toggleRowSelection(row, true)
+        })
+      } else {
+        this.$refs.taskList.clearSelection()
+      }
+    },
+    Deselect() { // 取消选择
+      this.taskList.forEach(row => {
+        this.$refs.taskList.clearSelection()// 调用这个方法
+      })
+      this.tableHeader = false
+      this.taskList = []
+    },
+    handleSelectionChange(val) {
+      this.taskList = val
+      this.taskList.length === this.tableData.length ? this.checkAlls = true : this.checkAlls = false
+      if (this.taskList.length > 0) {
+        this.tableHeader = true
+      } else {
+        this.tableHeader = false
+      }
+    },
+    taskScheduleLists(id) {
+      for (var key in this.taskScheduleEvent) {
+        if (id === Number(key)) {
+          return this.taskScheduleEvent[key]
+        }
+      }
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.templatName {
+  font-size:12px;
+  font-family:MicrosoftYaHei;
+  line-height:14px;
+  color:rgba(102,102,102,1);
+  opacity:1;
+  margin: 5px 0;
+}
+.templatTaskName {
+  font-size:14px;
+  font-family:MicrosoftYaHei;
+  line-height:23px;
+  color:rgba(51,51,51,1);
+  margin-right: 5px;
+  opacity:1;
+}
+.cursorPo:hover {
+  color:#409EFF;
+  cursor: pointer;
+}
+.templatCreator {
+  font-size:12px;
+  font-family:MicrosoftYaHei;
+  line-height:14px;
+  color:rgba(102,102,102,1);
+  opacity:1;
+  margin: 5px 0;
+}
+.demandLayout {
+  display: inline-block;
+  // width: 100px;
+  margin: 10px 0;
+  font-size:12px;
+  line-height:14px;
+  color:rgba(102,102,102,1);
+  opacity:1;
+}
+.demandeta {
+  font-size:12px;
+  font-family:MicrosoftYaHei;
+  line-height:14px;
+  color:rgba(51,51,51,1);
+  opacity:1;
+}
+.iconEdit {
+  width:67px;
+  background:rgba(245,245,245,1);
+  opacity:1;
+  padding: 0 10px;
+  border-radius:20px;
+  display: flex;
+  justify-content: space-between;
+}
+.tableHeader {
+  >>> .el-table__empty-block{
+    display: none;
+  }
+}
+.iconPadding {
+  margin-right: 5px;
+}
+.schedule-list {
+ /deep/ .el-table td {
+    padding: 0;
+ }
+}
+.schedule-list {
+  margin: 0 20px;
+  padding: 0;
+}
+>>>.el-table, .el-table__expanded-cell{
+  background:rgba(248,248,248,0.6);
+}
+.el-involveApp {
+  border:1px solid rgba(64,158,255,1);
+  border-radius:20px;
+  font-size:10px;
+  font-family:MicrosoftYaHei;
+  line-height:12px;
+  padding: 0 5px;
+  margin-left: 5px;
+  color:rgba(64,158,255,1);
+  opacity:1;
+}
+.endCheck {
+  font-size:14px;
+  font-family:Microsoft Sans Serif;
+  font-weight:400;
+  line-height:16px;
+  margin-right: 10px;
+  color:rgba(102,102,102,1);
+  opacity:1;
+}
+
+</style>
+<style>
+ .cell-grey .cell {
+   padding: 0 !important;
+ }
+.el-tooltip__popper.is-dark {
+  background:rgba(121,132,150,0.8);
+  color: #FFF;
+}
+</style>

+ 0 - 253
src/views/projectManage/iteration/components/iterationTable.vue

@@ -1,253 +0,0 @@
-<template>
-  <div class="schedule-list">
-    <!-- <el-col align="right" class="add-schedule"><span @click="addSchedule()"><i class="el-icon-circle-plus-outline" />添加排期</span></el-col> -->
-    <el-table
-      :id="'schedule-'+id"
-      :data="scheduleList"
-      :header-cell-style="{'background-color': 'rgba(232,232,232,0.4)'}"
-      style="width: 100%"
-      show-overflow-tooltip="true"
-      row-key="id"
-      border
-      stripe
-    >
-      <!-- <el-table-column
-        width="80"
-
-      >
-        <template>
-          <el-tooltip class="item" effect="dark" content="代表移动,鼠标选中区域可以向上移动" placement="bottom">
-            <div class="sortable-tip">
-              <img :src="imgUrl" alt="">
-            </div>
-          </el-tooltip>
-        </template>
-      </el-table-column> -->
-      <el-table-column
-        prop="type"
-        label="类型"
-        min-width="80"
-      >
-        <template slot-scope="scope">
-          {{ getType(scope.row.type) }}
-          <div :class="scope.row.isScheduleLocked === 1 ? 'el-icon-lock' : 'el-icon-unlock'" />
-        </template>
-      </el-table-column>
-      <el-table-column
-        prop="desc"
-        label="描述"
-        min-width="200"
-
-        show-overflow-tooltip
-      />
-      <el-table-column
-        prop="seperateDaysNoHoliday"
-        label="排期"
-        min-width="100"
-
-        show-overflow-tooltip
-      />
-      <el-table-column
-        prop="dayLength"
-        label="时长"
-        min-width="50"
-      />
-      <el-table-column
-        prop="peopleList"
-        label="参与人员"
-        min-width="150"
-      />
-      <el-table-column
-        label="操作"
-        min-width="150"
-
-        show-overflow-tooltip
-      >
-        <template slot-scope="scope">
-          <el-button v-if="scope.row.isScheduleLocked === 0" type="text" size="small" @click="editSchedule(scope.row)">编辑</el-button>
-          <el-button v-if="scope.row.isScheduleLocked === 0" type="text" size="small" @click="deleteSchedule(scope.row)">删除</el-button>
-        </template>
-      </el-table-column>
-
-    </el-table>
-    <div class="bottom-detail">
-      <el-row>排期总汇:{{ scheduleDetail.startTime | handlerDate }} ~ {{ scheduleDetail.endTime | handlerDate }}</el-row>
-      <el-row v-if="scheduleDetail.preOnlineVersion && scheduleDetail.preOnlineVersion.length>0">
-        <el-col :span="2">预计上线版本:</el-col>
-        <el-col :span="6">
-          <span v-for="item in scheduleDetail.preOnlineVersion" :key="item">{{ item }}</span><br>
-        </el-col>
-      </el-row>
-      <el-row v-else>预计上线版本:</el-row>
-    </div>
-    <modify-schedule
-      v-if="visibleSchedule"
-      :visible.sync="visibleSchedule"
-      :is-delete.sync="isDelete"
-      :detail-data="detailData"
-      :title="DialogTitle"
-      @update="listByTask(id)"
-    />
-  </div>
-</template>
-<script>
-// import Sortable from 'sortablejs'
-import moment from 'moment'
-import 'moment/locale/zh-cn'
-import imgUrl from '@/assets/麻将@2x.png'
-import { scheduleListByRequire } from '@/api/iteration.js'
-import { sortForTask } from '@/api/projectViewDetails'
-import modifySchedule from './modifySchedule'
-// import 'ant-design-vue/dist/antd.css'
-export default {
-  components: {
-    modifySchedule
-  },
-  filters: {
-    handlerDate(val) {
-      return val ? moment(val).format('YYYY-MM-DD') : ''
-    }
-  },
-  props: {
-    id: {
-      type: Number,
-      default: NaN,
-      required: true
-    },
-    typeList: {
-      type: Array,
-      default: () => [],
-      required: false
-    }
-  },
-  data() {
-    return {
-      imgUrl: imgUrl,
-      scheduleList: [],
-      scheduleDetail: {},
-      visibleSchedule: false,
-      detailData: null,
-      taskScheduleEvent: [], // 排期类型
-      DialogTitle: '新建排期',
-      isDelete: false // 删除排期操作
-    }
-  },
-  watch: {
-    id: {
-      handler(newV, oldV) {
-        this.listByTask(newV)
-      },
-      immediate: true
-    },
-    typeList: {
-      handler(newV, oldV) {
-        this.taskScheduleEvent = newV
-      },
-      immediate: true
-    }
-  },
-  mounted() {
-    // this.rowDrop()
-  },
-  methods: {
-    // rowDrop() {
-    //   const tbody = document.querySelector(`#schedule-${this.id} tbody`)
-    //   const _this = this
-    //   Sortable.create(tbody, {
-    //     onEnd({ newIndex, oldIndex }) {
-    //       const currRow = _this.scheduleList.splice(oldIndex, 1)[0]
-    //       _this.scheduleList.splice(newIndex, 0, currRow)
-    //       _this.sortForTask(_this.scheduleList.map(item => item.id))
-    //     }
-    //   })
-    // },
-    async sortForTask(arr) {
-      const res = await sortForTask(this.id, arr)
-      if (res.code === 200) {
-        this.$message({ message: '移动成功', type: 'success', duration: 1000, offset: 150 })
-      }
-    },
-    getType(value) {
-      const res = this.taskScheduleEvent.find(item => item.code === value) || {}
-      return res.msg
-    },
-    async listByTask(id) { // 获取排期列表
-      const res = await scheduleListByRequire(id)
-      if (res.code === 200) {
-        this.scheduleList = res.data.scheduleDetailRespons || []
-        this.scheduleDetail = res.data || {}
-        this.scheduleList = this.scheduleList.map(item => ({
-          ...item,
-          peopleList: item.peopleObjectList.map(item => item.name).join(',')
-        }))
-      }
-    },
-    addSchedule() {
-      this.detailData = null
-      this.DialogTitle = '新建排期'
-      this.visibleSchedule = true
-    },
-    deleteSchedule(row) { // 删除排期
-      this.DialogTitle = '删除排期'
-      this.isDelete = true
-      this.visibleSchedule = true
-      this.detailData = row
-    },
-    editSchedule(row) { // 编辑排期
-      this.DialogTitle = '编辑排期'
-      this.visibleSchedule = true
-      this.detailData = row
-    }
-  }
-}
-</script>
-<style lang="scss" scoped>
-.add-schedule {
-  cursor: pointer;
-  color: #409EFF;
-  font-size: 14px;
-  width: calc(100% - 40px);
-  margin: 0 20px;
-  padding: 20px 0;
-  i {
-    margin-right: 4px;
-  }
-  span {
-    margin-right: 20px;
-  }
-}
-.schedule-list {
-  width: calc(100% - 40px);
-  margin: 0 20px;
-  padding: 0;
-}
->>>.el-table, .el-table__expanded-cell{
-  background:rgba(248,248,248,0.6);
-}
-.bottom-detail {
-  font-size: 14px;
-  width: calc(100% - 40px);
-  margin: 0 20px;
-  padding: 20px 0;
-  :first-child {
-    margin-bottom: 10px;
-  }
-}
-// .sortable-tip {
-//   height: 26px;
-//   width: 15px;
-//   border-radius:2px;
-//   margin: auto;
-//   justify-content: center;
-//   align-items: center;
-//   img {
-//     width: 8px;
-//   }
-// }
-</style>
-<style>
-.el-tooltip__popper.is-dark {
-  background:rgba(121,132,150,0.8);
-  color: #FFF;
-}
-</style>

+ 35 - 23
src/views/projectManage/iteration/components/requiredTable.vue

@@ -77,7 +77,7 @@
           <div class="expand"><i v-show="allChange" class="el-icon-minus" @click="expandAll(false)" /></div>
         </template>
         <template slot-scope="props">
-          <iterationTable :id="props.row.id" :type-list="taskScheduleEvent" />
+          <demand :id="props.row.id" />
         </template>
       </el-table-column>
       <el-table-column label="优先级" min-width="80" align="center">
@@ -103,7 +103,16 @@
       <el-table-column label="需求名称" min-width="250" show-overflow-tooltip>
         <template v-slot="scope">
           <div class="table-project-name" @click="clickRequiredName(scope.row.id)">
-            <span class="id">{{ scope.row.requirementDisplayId }} <img v-if="scope.row.type === 1" :src="extraUrgent" style="height: 17px;padding: 0 10px;"></span>
+            <span class="id">
+              {{ scope.row.requirementDisplayId }}
+              <img v-if="scope.row.type === 1" :src="extraUrgent" style="height: 17px;padding: 0 10px;">
+              <div
+                v-if="scope.row.optionsObject && scope.row.optionsObject.tagsType !==-1 && scope.row.optionsObject.remindTags && scope.row.status !== -2"
+                :class="'tag-tip'+scope.row.optionsObject.tagsType"
+              >{{ scope.row.optionsObject.remindTags }}
+              </div>
+              <div v-if="scope.row.status === -2" class="tag-tip1">hold</div>
+            </span>
             <span class="public_Jump">{{ scope.row.name }}</span>
           </div>
         </template>
@@ -169,17 +178,18 @@
 <script>
 import '@/styles/PublicStyle/index.scss'
 import iterationDelete from '@/views/projectManage/iteration/components/delete.vue'
-import iterationTable from '@/views/projectManage/iteration/components/iterationTable.vue'
 import Sortable from 'sortablejs'
 import { configShowTaskEnum } from '@/api/taskIndex'
 import image_role from '@/assets/麻将@2x.png' // 表格移动
 import { iterationList, iterationRequire, iterationOrder, iterationChangeIteration } from '@/api/iteration.js'
 import { updateRequirementStatus } from '@/api/requirement.js'
 import extraUrgent from '@/assets/extraUrgent.png'
+import demand from '@/views/projectManage/iteration/components/demand.vue'
 export default {
   components: {
     iterationDelete,
-    iterationTable
+    demand
+
   },
   filters: {
     ellipsis(value, index) {
@@ -200,7 +210,6 @@ export default {
       dialogVisibleDelete: false, // 移除迭代
       requiredArray: [], // 需求状态
       showHeader: true, // 是否显示表头
-      checkAll: [],
       loading: true,
       searchResult: [], // 变更迭代下的数据
       SearchIterationValue: '',
@@ -223,16 +232,11 @@ export default {
   },
   methods: {
     async iteratioFilter() {
-      const list = iterationList({ id: this.iterationId, curIndex: 1, pageSize: 15, bizId: this.bizId })
-      const requiredList = iterationRequire({ id: this.iterationId, curIndex: 1, pageSize: 50, bizId: this.bizId })
-      // const requirementEnum = showRequirementEnum()
-      const listRes = await list
-      const listRequire = await requiredList
-      // const requiredstatus = await requirementEnum
-      this.iterationData = listRes.data.list[0]
-      this.RequirementSet = listRequire.data.right.list
-      // this.requiredArray = requiredList.data.right.list.availableStatusList
-      this.checkAll = this.RequirementSet
+      const data = { id: this.iterationId, curIndex: 1, pageSize: 15, bizId: this.bizId }
+      const list = await iterationList(data)
+      const requiredList = await iterationRequire(data)
+      this.iterationData = list.data.list[0]
+      this.RequirementSet = requiredList.data.right.list
       this.loading = false
     },
 
@@ -271,14 +275,6 @@ export default {
         }
       }
       )
-      // iterationUpdateReqStatus(data).then(res => {
-      //   if (res.code === 200) {
-      //     this.$message.success(res.msg)
-      //     this.iteratioFilter()
-      //   } else {
-      //     this.$message.warning(res.msg)
-      //   }
-      // })
     },
 
     clickRequiredName(e) { // 需求跳转
@@ -353,6 +349,22 @@ export default {
   border:1px solid #DCDFE6;
   cursor: pointer;
 }
+.tag-tip0,.tag-tip1 {
+  margin-left: 5px;
+  display: inline-block;
+  padding: 0 5px;
+  border-radius: 8px;
+  height: 16px;
+  line-height: 16px;
+}
+.tag-tip0 {
+  background: rgba(255,137,82,0.15);
+  color: rgba(255,137,82,1);
+}
+.tag-tip1{
+  background: rgba(245,108,108,0.17);
+  color: rgba(245,108,108,1);
+}
 /deep/ .el-table__expand-icon{
   font-size: 14px;
   .el-icon{

+ 1 - 1
src/views/projectManage/projectList/components/dataStatistics.vue

@@ -112,7 +112,7 @@ export default {
         color: ['#3AA1FF'],
         tooltip: { trigger: 'axis', axisPointer: { type: 'line' }}, // 默认为直线,可选为:'line' | 'shadow'
         grid: { left: '15%', right: '15%', top: '15%', bottom: '10%', containLabel: true },
-        xAxis: [{ type: 'category', data: data.xaxis, axisTick: { alignWithLabel: true }}],
+        xAxis: [{ type: 'category', data: data.xaxis, axisLabel: { interval: 0, rotate: 40 }, axisTick: { alignWithLabel: true }}],
         yAxis: [{ type: 'value', axisLine: { show: false }, splitLine: { lineStyle: { type: 'dashed' }}}],
         series: [
           {

+ 27 - 2
src/views/projectManage/projectList/components/needsList.vue

@@ -18,10 +18,19 @@
           </span>
         </template>
       </el-table-column>
-      <el-table-column label="需求名称" fixed width="250" align="left" show-overflow-tooltip>
+      <el-table-column label="需求名称" fixed min-width="300" align="left" show-overflow-tooltip>
         <template slot-scope="scope">
           <div class="table-project-name" @click="needs_link(scope.row.id)">
-            <span class="id">{{ scope.row.requirementDisplayId }} <img v-if="scope.row.type === 1" :src="extraUrgent" style="height: 17px;padding: 0 10px;"></span>
+            <span class="id">
+              {{ scope.row.requirementDisplayId }}
+              <img v-if="scope.row.type === 1" :src="extraUrgent" style="height: 17px;padding: 0 10px;">
+              <div
+                v-if="scope.row.optionsObject && scope.row.optionsObject.tagsType !==-1 && scope.row.optionsObject.remindTags && scope.row.status !== -2"
+                :class="'tag-tip'+scope.row.optionsObject.tagsType"
+              >{{ scope.row.optionsObject.remindTags }}
+              </div>
+              <div v-if="scope.row.status === -2" class="tag-tip1">hold</div>
+            </span>
             <span class="name">{{ scope.row.name }}</span>
           </div>
         </template>
@@ -188,6 +197,22 @@ export default {
 .status150 {
   @include setStatus(#7ED321)
 }
+.tag-tip0,.tag-tip1 {
+  margin-left: 5px;
+  display: inline-block;
+  padding: 0 5px;
+  border-radius: 8px;
+  height: 16px;
+  line-height: 16px;
+}
+.tag-tip0 {
+  background: rgba(255,137,82,0.15);
+  color: rgba(255,137,82,1);
+}
+.tag-tip1{
+  background: rgba(245,108,108,0.17);
+  color: rgba(245,108,108,1);
+}
 .div_priority {
   text-align: center;
   color: #ffffff;

+ 4 - 4
src/views/projectManage/projectList/projectViewDetails.vue

@@ -62,7 +62,7 @@
             <div class="title-left-name">基础信息</div>
           </div>
           <div class="detail-info">
-            <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="right" label-width="100px">
+            <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="left" label-width="100px">
               <el-form-item label="项目负责人:">
                 <search-people :value.sync="form_query.projectOwner" :clearable="false" @change="changeArea" />
               </el-form-item>
@@ -73,7 +73,7 @@
                 <search-people :value.sync="form_query.rdOwner" @change="changeArea" />
               </el-form-item>
             </el-form>
-            <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="right" label-width="100px">
+            <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="left" label-width="100px">
               <el-form-item label="测试负责人:">
                 <search-people :value.sync="form_query.testOwner" @change="changeArea" />
               </el-form-item>
@@ -108,7 +108,7 @@
             <div class="title-left-name">项目总目标</div>
           </div>
           <div>
-            <text-area :id="'pro-target'" :value.sync="form_query.target" :empty-text="'您还没有设定目标'" :input-button="'立即添加'" @change="changeArea" />
+            <text-area :id="'pro-target'" :value.sync="form_query.target" :empty-text="'您还没有设定目标'" :input-button="'立即添加'" @change="changeArea" />
           </div>
         </section>
         <section class="main-section">
@@ -416,7 +416,7 @@ export default {
 .main-section {
   @include main-section;
   .detail-info {
-    padding: 20px 34px;
+    padding: 0 34px 20px 34px;
     /deep/.el-input__inner{
       border: 1px solid rgba(220,223,230,0)
     }

+ 12 - 11
src/views/projectManage/requirement/list/create.vue

@@ -361,13 +361,14 @@ export default {
             return
           }
           this.form.creator = localStorage.getItem('username')
+          this.form.rqmtProposer = this.form.rqmtProposer.length ? this.form.rqmtProposer.join() : null
+          this.form.referredClientType = this.form.referredClientType ? this.form.referredClientType.join() : null
           if (this.title === '新建需求') {
-            let data = {}
-            console.log(this.form, 'from')
-            data = this.form
-            data.rqmtProposer = data.rqmtProposer ? this.form.rqmtProposer.join() : null
-            data.referredClientType = data.referredClientType.join()
-            createRequirement(data)
+            // let data = {}
+            // data = this.form
+            // data.rqmtProposer = data.rqmtProposer ? this.form.rqmtProposer.join() : null
+            // data.referredClientType = data.referredClientType === null || data.referredClientType === '' || typeof (data.referredClientType) === Array ? null : this.form.referredClientType.join()
+            createRequirement(this.form)
               .then(res => {
                 if (res.code === 200) {
                   this.$emit('confirm', this.form)
@@ -376,11 +377,11 @@ export default {
                 }
               })
           } else {
-            let data = {}
-            data = this.form
-            data.rqmtProposer = data.rqmtProposer ? this.form.rqmtProposer.join() : null
-            data.referredClientType = this.form.referredClientType.join()
-            updateRequirement(data)
+            // let data = {}
+            // data = this.form
+            // data.rqmtProposer = data.rqmtProposer ? this.form.rqmtProposer.join() : null
+            // data.referredClientType = this.form.referredClientType.join()
+            updateRequirement(this.form)
               .then(res => {
                 if (res.code === 200) {
                   this.$emit('confirm', this.form)

+ 32 - 3
src/views/projectManage/requirement/list/index.vue

@@ -123,9 +123,18 @@
             <div class="div_priority" :style="{background: priorityColors[scope.row.priority % priorityColors.length]}">{{ 'P'+scope.row.priority }}</div>
           </template>
         </el-table-column>
-        <el-table-column label="需求名称" fixed min-width="250" show-overflow-tooltip align="left">
+        <el-table-column label="需求名称" fixed min-width="300" show-overflow-tooltip align="left">
           <template v-slot="scope">
-            <span style="font-size: 12px;color: rgba(167,174,188,1);">{{ scope.row.requirementDisplayId }}<img v-if="scope.row.type === 1" :src="extraUrgent" style="height: 17px; padding: 0 10px;"></span><br>
+            <span class="require-item-title">
+              {{ scope.row.requirementDisplayId }}
+              <img v-if="scope.row.type === 1" :src="extraUrgent" style="height: 17px; padding: 0 10px;">
+              <div
+                v-if="scope.row.optionsObject && scope.row.optionsObject.tagsType !==-1 && scope.row.optionsObject.remindTags && scope.row.status !== -2"
+                :class="'tag-tip'+scope.row.optionsObject.tagsType"
+              >{{ scope.row.optionsObject.remindTags }}
+              </div>
+              <div v-if="scope.row.status === -2" class="tag-tip1">hold</div>
+            </span><br>
             <span class="stylus-hover" @click="getToRequirementDetails(scope.row.id)">{{ scope.row.name }}</span>
           </template>
         </el-table-column>
@@ -445,7 +454,7 @@ export default {
 }
 </script>
 
-<style scoped>
+<style scoped lang="scss">
 .el-loading-mask {
   z-index: 8;
 }
@@ -483,6 +492,26 @@ export default {
 .el-from-spacing {
   margin: 15px 0;
 }
+.require-item-title {
+  font-size: 12px;
+  color: rgba(167,174,188,1);
+}
+.tag-tip0,.tag-tip1 {
+  margin-left: 5px;
+  display: inline-block;
+  padding: 0 5px;
+  border-radius: 8px;
+  height: 16px;
+  line-height: 16px;
+}
+.tag-tip0 {
+  background: rgba(255,137,82,0.15);
+  color: rgba(255,137,82,1);
+}
+.tag-tip1{
+  background: rgba(245,108,108,0.17);
+  color: rgba(245,108,108,1);
+}
 </style>
 
 <style>

+ 20 - 18
src/views/projectManage/requirement/requirementDetail.vue

@@ -93,7 +93,7 @@
             <div class="title-left-name">基础信息</div>
           </div>
           <div class="detail-info">
-            <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="right" label-width="100px">
+            <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.belongingProject !== -1" @click="jump('项目详情',form_query.belongingProject)">{{ form_query.belongingProjectName }}</div>
                 <template v-else>{{ form_query.belongingProjectName }}</template>
@@ -107,7 +107,7 @@
                 <search-people :value.sync="form_query.pm" :clearable="false" @change="changeArea" />
               </el-form-item>
             </el-form>
-            <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="right" label-width="100px">
+            <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="left" label-width="100px">
               <el-form-item label="需求方向:">
                 <el-cascader v-model="form_query.rqmtOrntIds" size="medium" collapse-tags :props="props" :options="demandDirection" placeholder="请选择" @change="changeArea" />
               </el-form-item>
@@ -120,7 +120,7 @@
                 <search-people :value.sync="form_query.rqmtProposer" :clearable="false" :multiple="true" @change="changeArea" />
               </el-form-item>
             </el-form>
-            <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="right" label-width="100px">
+            <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="left" label-width="100px">
               <el-form-item label="优先级:">
                 <el-select v-model="form_query.priority" size="small" filterable placeholder="请选择" @change="changeArea">
                   <el-option v-for="(item,index) in priorityList" :key="item.msg + index" :label="item.msg" :value="item.code" />
@@ -137,7 +137,7 @@
                 </el-select>
               </el-form-item>
             </el-form>
-            <el-form :model="form_query" class="demo-form-inline" label-position="right" label-width="100px">
+            <el-form :model="form_query" class="demo-form-inline" label-position="left" label-width="100px">
               <el-form-item label="BRD链接:" class="PRD">
                 <span class="PRD-link"><a :href="form_query.brdUrl" target="_blank">{{ form_query.brdUrl }}</a></span>
               </el-form-item>
@@ -180,7 +180,8 @@
 
           <el-container>
             <el-main style="padding: 0;">
-              <schedule-list :id="requirementId" ref="ScheduleEvent" :showunlock="showunlock" :type-list="taskScheduleEvent" :required-list="taskScheduleList" class-name="white" :all="true" :no-move="false" />
+              <!-- <schedule-list :id="requirementId" ref="ScheduleEvent" :showunlock="showunlock" :type-list="taskScheduleEvent" :required-list="taskScheduleList" class-name="white" :all="true" :no-move="false" /> -->
+              <demand :id="requirementId" ref="ScheduleEvent" :showunlock="showunlock" :type-list="taskScheduleEvent" :required-list="taskScheduleList" />
             </el-main>
             <el-aside v-if="lockHide" class="SchedulingAside">
               <div v-for="(item, index) in SchedulingContent" :key="index" class="SchedulingDiv" @click="clickScheduling(item)">
@@ -205,7 +206,7 @@
             <div class="title-left-icon" />
             <div class="title-left-name">动态</div>
           </div>
-          <el-tabs v-model="optionName" class="sign-tabs" @tab-click="handleClick">
+          <el-tabs v-model="optionName" class="sign-tabs">
             <el-tab-pane label="评论" name="first">
               <div class="detail-info">
                 <ul class="comment-main">
@@ -318,7 +319,8 @@ import {
   requirementUnhold,
   configShowRequireStatusEnum,
   scheduleGetRequireScheduleHistory,
-  scheduleGetHistoryScheduleById,
+  scheduleGetHistoryRequireScheduleById,
+  // scheduleGetHistoryScheduleById,
   settingQueryBizRqmtOrntList
 } from '@/api/requirement.js'
 import { configShowTaskEnum } from '@/api/taskIndex'
@@ -331,11 +333,12 @@ import image_url from '@/assets/home_images/home_u.png'
 import createdBug from '@/views/projectManage/bugList/file/createdBug'
 import tasksList from './components/taskList'
 import dataStatistics from './components/dataStatistics'
-import scheduleList from './components/scheduleList'
+// import scheduleList from './components/scheduleList'
 import bugTableDialog from '@/views/projectManage/bugList/details/bugTableDialog' // 缺陷表格
 import schedule from '@/views/projectManage/schedule' // 排期锁定弹窗
 import urgent from '@/assets/urgent.png'
 import download from '@/views/projectManage/components/export.vue'
+import demand from '@/views/projectManage/components/demand.vue'
 import '@/styles/PublicStyle/index.scss'
 import record from '@/views/projectManage/components/record.vue'
 import timeLine from '@/views/projectManage/components/timeLine.vue'
@@ -349,12 +352,13 @@ export default {
     createdBug,
     tasksList,
     dataStatistics,
-    scheduleList,
+    // scheduleList,
     bugTableDialog,
     schedule,
     download,
     record,
-    timeLine
+    timeLine,
+    demand
   },
   filters: {
     ellipsis(value, num) {
@@ -436,30 +440,27 @@ export default {
     this.$store.state.data.bizId = false
   },
   methods: {
-    handleClick(tab, event) {
-      console.log(tab, event)
-    },
     async GetRequireScheduleHistory() {
       this.scheduleVisble = false
       const res = await scheduleGetRequireScheduleHistory(this.requirementId)
-      this.SchedulingContent = res.data
       const res1 = await listByRequire(this.requirementId)
+      this.isScheduleLocked = res1.data.isScheduleLocked
+      this.SchedulingContent = res.data
       this.BackToTheLatest = false // 回到最新
       this.Latest = true
       this.lockHide = false // 隐藏排期变更记录
       this.showunlock = true
       this.ScheduId = 0
-      this.taskScheduleList = res1.data.scheduleDetailRespons
-      this.isScheduleLocked = res1.data.isScheduleLocked // 锁定状态1锁定0未锁定
       this.$refs.ScheduleEvent.listByTask(this.requirementId)
+      this.$refs.ScheduleEvent.lockingchange()
       this.getRequirementById()
     },
     async clickScheduling(ele) {
       this.showunlock = false
       this.Latest = false
       this.ScheduId = ele.id
-      const res = await scheduleGetHistoryScheduleById(ele.id)
-      this.taskScheduleList = res.data.scheduleDetailRespons
+      const res = await scheduleGetHistoryRequireScheduleById(ele.id)
+      this.taskScheduleList = res.data
       this.BackToTheLatest = true
     },
     changeSchedule() { // 修改锁定状态
@@ -662,6 +663,7 @@ export default {
       this.$router.push({ name: page, query: { id: id }})
     },
     reloadList() {
+      this.GetRequireScheduleHistory()
       this.getRequirementById()
       if (this.$refs['bugTableDialog']) {
         this.$refs['bugTableDialog'].bugGetTableList()

+ 4 - 4
src/views/projectManage/taskList/childrenTask/childDetail.vue

@@ -35,14 +35,14 @@
             <div class="title-left-name">基础信息</div>
           </div>
           <div class="detail-info">
-            <el-form :inline="true" :model="formData" class="demo-form-inline" label-position="right" label-width="100px">
+            <el-form :inline="true" :model="formData" class="demo-form-inline" label-position="left" label-width="100px">
               <el-form-item label="所属父任务:"><span class="module">{{ formData.parentName }}</span></el-form-item>
               <el-form-item label="业务线:"><span class="module">{{ formData.bizIdString }}</span></el-form-item>
               <el-form-item label="负责人:">
                 <search-people :value.sync="formData.owner" :clearable="false" @change="changeArea('owner')" />
               </el-form-item>
             </el-form>
-            <el-form :inline="true" :model="formData" class="demo-form-inline" label-position="right" label-width="100px">
+            <el-form :inline="true" :model="formData" class="demo-form-inline" label-position="left" label-width="100px">
               <el-form-item label="开始日期:">
                 <el-date-picker
                   v-model="formData.startTime"
@@ -71,7 +71,7 @@
                 <search-people :value.sync="formData.participants" :multiple="true" @change="changeArea('participants')" />
               </el-form-item>
             </el-form>
-            <el-form :inline="true" :model="formData" class="demo-form-all" label-position="right" label-width="100px">
+            <el-form :inline="true" :model="formData" class="demo-form-all" label-position="left" label-width="100px">
               <el-form-item label="任务进度:">
                 <div class="process">
                   <el-slider v-model.number="formData.process" @change="changeProgres" />
@@ -310,7 +310,7 @@ export default {
     }
   }
   .detail-info {
-    padding: 20px 34px;
+    padding: 0 34px 20px 34px;
     /deep/.el-input__inner{
       border: 1px solid rgba(220,223,230,0);
       padding-left: 10px;

+ 4 - 4
src/views/projectManage/taskList/childrenTask/childDrawer.vue

@@ -55,11 +55,11 @@
           <div class="title-left-name">基础信息</div>
         </div>
         <div class="detail-info">
-          <el-form :inline="true" :model="formData" class="demo-form-inline" label-position="right" label-width="100px">
+          <el-form :inline="true" :model="formData" class="demo-form-inline" label-position="left" label-width="100px">
             <el-form-item label="所属父任务:"><span class="module">{{ formData.parentName }}</span></el-form-item>
             <el-form-item label="业务线:"><span class="module">{{ formData.bizIdString }}</span></el-form-item>
           </el-form>
-          <el-form :inline="true" :model="formData" class="demo-form-inline" label-position="right" label-width="100px">
+          <el-form :inline="true" :model="formData" class="demo-form-inline" label-position="left" label-width="100px">
             <el-form-item label="开始日期:">
               <el-date-picker
                 v-model="formData.startTime"
@@ -85,7 +85,7 @@
               />
             </el-form-item>
           </el-form>
-          <el-form :inline="true" :model="formData" class="demo-form-all" label-position="right" label-width="100px">
+          <el-form :inline="true" :model="formData" class="demo-form-all" label-position="left" label-width="100px">
             <el-form-item label="任务进度:">
               <div class="process">
                 <el-slider v-model.number="formData.process" @change="changeProgres" />
@@ -105,7 +105,7 @@
           <div class="title-left-name">用户信息</div>
         </div>
         <div class="detail-info">
-          <el-form :model="formData" class="demo-form-inline" label-position="right" label-width="100px">
+          <el-form :model="formData" class="demo-form-inline" label-position="left" label-width="100px">
             <el-form-item label="负责人:">
               <search-people :value.sync="formData.owner" :clearable="false" @change="changeArea('owner')" />
             </el-form-item>

+ 1 - 1
src/views/projectManage/taskList/components/dataStatistics.vue

@@ -55,7 +55,7 @@ export default {
         color: ['#3AA1FF'],
         tooltip: { trigger: 'axis', axisPointer: { type: 'line' }}, // 默认为直线,可选为:'line' | 'shadow'
         grid: { left: '15%', right: '15%', top: '15%', bottom: '10%', containLabel: true },
-        xAxis: [{ type: 'category', data: data.xaxis, axisTick: { alignWithLabel: true }}],
+        xAxis: [{ type: 'category', data: data.xaxis, axisLabel: { interval: 0, rotate: 40 }, axisTick: { alignWithLabel: true }}],
         yAxis: [{ type: 'value', axisLine: { show: false }, splitLine: { lineStyle: { type: 'dashed' }}}],
         series: [
           {

+ 4 - 4
src/views/projectManage/taskList/taskViewDetail.vue

@@ -108,7 +108,7 @@
             <div class="title-left-name">基础信息</div>
           </div>
           <div class="detail-info">
-            <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="right" label-width="100px">
+            <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>
                 <template v-else>{{ form_query.projectName }}</template>
@@ -121,7 +121,7 @@
                 <div>{{ form_query.moduleInfoName }}</div>
               </el-form-item>
             </el-form>
-            <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="right" label-width="100px">
+            <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="left" label-width="100px">
               <el-form-item label="开发负责人:">
                 <search-people :value.sync="form_query.rdOwner" @change="changeArea" />
               </el-form-item>
@@ -134,7 +134,7 @@
                 </el-select>
               </el-form-item>
             </el-form>
-            <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="right" label-width="100px">
+            <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="left" label-width="100px">
               <el-form-item label="跟版客户端:">
                 <el-select v-if="form_query.followVersion === 1" v-model="form_query.involveApp" size="small" filterable placeholder="请选择" @change="changeArea">
                   <el-option v-for="(item,index) in appClient" :key="item.msg + index" :label="item.msg" :value="item.code" />
@@ -146,7 +146,7 @@
                 </div>
               </el-form-item>
             </el-form>
-            <el-form :inline="true" :model="form_query" class="demo-form-inline" style="white-space: nowrap;" label-position="right" label-width="100px">
+            <el-form :inline="true" :model="form_query" class="demo-form-inline" style="white-space: nowrap;" label-position="left" label-width="100px">
               <el-form-item label="技术文档:" class="module">
                 <span class="PRD-link"><a :href="form_query.devUrl" target="_blank">{{ form_query.devUrl }}</a></span>
               </el-form-item>

+ 2 - 2
src/views/quality/defectStatistics.vue

@@ -445,7 +445,7 @@ export default {
         color: ['#3AA1FF'],
         tooltip: { trigger: 'axis', axisPointer: { type: 'line' }}, // 默认为直线,可选为:'line' | 'shadow'
         grid: { left: '0', right: '0', top: '5%', bottom: '0', containLabel: true },
-        xAxis: [{ type: 'category', data: this.chart3Data.xaxis, axisTick: { alignWithLabel: true }}],
+        xAxis: [{ type: 'category', data: this.chart3Data.xaxis, axisLabel: { interval: 0, rotate: 40 }, axisTick: { alignWithLabel: true }}],
         yAxis: [{ type: 'value', axisLine: { show: false }, splitLine: { lineStyle: { type: 'dashed' }}}],
         series: [
           {
@@ -477,7 +477,7 @@ export default {
           color: ['#3AA1FF'],
           tooltip: { trigger: 'axis', axisPointer: { type: 'line' }}, // 默认为直线,可选为:'line' | 'shadow'
           grid: { left: '0', right: '0', top: '5%', bottom: '0', containLabel: true },
-          xAxis: [{ type: 'category', data: this.chart1Data.xaxis, axisTick: { alignWithLabel: true }}],
+          xAxis: [{ type: 'category', data: this.chart1Data.xaxis, axisLabel: { interval: 0, rotate: 40 }, axisTick: { alignWithLabel: true }}],
           yAxis: [{ type: 'value', axisLine: { show: false }, splitLine: { lineStyle: { type: 'dashed' }}}],
           series: [
             {

+ 1 - 0
src/views/workbench/person/components/myFullCalendar.vue

@@ -251,6 +251,7 @@ export default {
 >>>.fc-title {
   line-height: 15px;
   padding-left: 4px;
+  color:#333333 !important;
 }
 >>>.fc-event-container .fc-content {
   text-overflow: inherit;

+ 8 - 4
src/views/workbench/person/index.vue

@@ -254,11 +254,15 @@ export default {
       detailXY: [0, 0], // 详情弹框位置
       colorList: [
         'rgba(11,160,188,1)', 'rgba(129,186,0,1)', 'rgba(235,172,0,1)', 'rgba(132,100,247 ,1)', 'rgba(73,92,197 ,1)',
-        'rgba(193,67,96,1)', 'rgba(211,87,35,1)', 'rgba(211,96,118,1)', 'rgba(179,201,58,1)', 'rgba(64,127,232,1)'
+        'rgba(193,67,96,1)', 'rgba(211,87,35,1)', 'rgba(211,96,118,1)', 'rgba(179,201,58,1)', 'rgba(64,127,232,1)',
+        'rgba(86,68,93,1)', 'rgba(111,33,8,1)', 'rgba(192,53,70,1)', 'rgba(92,25,107,1)', 'rgba(73,10,61,1)',
+        'rgba(189,21,80,1)', 'rgba( 31,78,95,1)', 'rgba(241,0,229,1)', 'rgba(114,0,218,1)', 'rgba(70,14,68,1)'
       ],
       bgColorList: [
         'rgba(11,160,188,0.2)', 'rgba(129,186,0,0.2)', 'rgba(235,172,0,0.2)', 'rgba(132,100,247 ,0.2)', 'rgba(73,92,197 ,0.2)',
-        'rgba(193,67,96,0.2)', 'rgba(211,87,35,0.2)', 'rgba(211,96,118,0.2)', 'rgba(179,201,58,0.2)', 'rgba(64,127,232,0.2)'
+        'rgba(193,67,96,0.2)', 'rgba(211,87,35,0.2)', 'rgba(211,96,118,0.2)', 'rgba(179,201,58,0.2)', 'rgba(64,127,232,0.2)',
+        'rgba(86,68,93,0.2)', 'rgba(111,33,8,0.2)', 'rgba(192,53,70,0.2)', 'rgba(92,25,107,0.2)', 'rgba(73,10,61,0.2)',
+        'rgba(189,21,80,0.2)', 'rgba( 31,78,95,0.2)', 'rgba(241,0,229,0.2)', 'rgba(114,0,218,0.2)', 'rgba(70,14,68,0.2)'
       ]
     }
   },
@@ -382,8 +386,8 @@ export default {
             end: moment(item.endTime).add(1, 'day').toDate(),
             detailData: item,
             className: item.origin ? 'schedule1' : 'schedule2',
-            backgroundColor: this.bgColorList[(index - num) % 10],
-            textColor: this.colorList[(index - num) % 10]
+            backgroundColor: this.bgColorList[(index - num) % 20],
+            textColor: this.colorList[(index - num) % 20]
           }
         })
       }

+ 27 - 2
src/views/workbench/team/components/needsList.vue

@@ -24,10 +24,19 @@
           </span>
         </template>
       </el-table-column>
-      <el-table-column label="需求名称" fixed min-width="250" align="left" show-overflow-tooltip>
+      <el-table-column label="需求名称" fixed min-width="300" align="left" show-overflow-tooltip>
         <template slot-scope="scope">
           <div class="table-project-name" @click="needs_link(scope.row.id)">
-            <span class="id">{{ scope.row.requirementDisplayId }} <img v-if="scope.row.type === 1" :src="extraUrgent" style="height: 17px;padding: 0 10px;"></span>
+            <span class="id">
+              {{ scope.row.requirementDisplayId }}
+              <img v-if="scope.row.type === 1" :src="extraUrgent" style="height: 17px;padding: 0 10px;">
+              <div
+                v-if="scope.row.optionsObject && scope.row.optionsObject.tagsType !==-1 && scope.row.optionsObject.remindTags && scope.row.status !== -2"
+                :class="'tag-tip'+scope.row.optionsObject.tagsType"
+              >{{ scope.row.optionsObject.remindTags }}
+              </div>
+              <div v-if="scope.row.status === -2" class="tag-tip1">hold</div>
+            </span>
             <span class="name">{{ scope.row.name }}</span>
           </div>
         </template>
@@ -268,6 +277,22 @@ export default {
 .status150 {
   @include setStatus(#7ED321)
 }
+.tag-tip0,.tag-tip1 {
+  margin-left: 5px;
+  display: inline-block;
+  padding: 0 5px;
+  border-radius: 8px;
+  height: 16px;
+  line-height: 16px;
+}
+.tag-tip0 {
+  background: rgba(255,137,82,0.15);
+  color: rgba(255,137,82,1);
+}
+.tag-tip1{
+  background: rgba(245,108,108,0.17);
+  color: rgba(245,108,108,1);
+}
 .search-control {
 	padding: 30px 17px 0;
 	color: #333B4A;

+ 8 - 4
src/views/workbench/team/index.vue

@@ -198,11 +198,15 @@ export default {
       visibleSchedule: false, // 排期任务弹框
       colorList: [
         'rgba(11,160,188,1)', 'rgba(129,186,0,1)', 'rgba(235,172,0,1)', 'rgba(132,100,247 ,1)', 'rgba(73,92,197 ,1)',
-        'rgba(193,67,96,1)', 'rgba(211,87,35,1)', 'rgba(211,96,118,1)', 'rgba(179,201,58,1)', 'rgba(64,127,232,1)'
+        'rgba(193,67,96,1)', 'rgba(211,87,35,1)', 'rgba(211,96,118,1)', 'rgba(179,201,58,1)', 'rgba(64,127,232,1)',
+        'rgba(86,68,93,1)', 'rgba(111,33,8,1)', 'rgba(192,53,70,1)', 'rgba(92,25,107,1)', 'rgba(73,10,61,1)',
+        'rgba(189,21,80,1)', 'rgba( 31,78,95,1)', 'rgba(241,0,229,1)', 'rgba(114,0,218,1)', 'rgba(70,14,68,1)'
       ],
       bgColorList: [
         'rgba(11,160,188,0.2)', 'rgba(129,186,0,0.2)', 'rgba(235,172,0,0.2)', 'rgba(132,100,247 ,0.2)', 'rgba(73,92,197 ,0.2)',
-        'rgba(193,67,96,0.2)', 'rgba(211,87,35,0.2)', 'rgba(211,96,118,0.2)', 'rgba(179,201,58,0.2)', 'rgba(64,127,232,0.2)'
+        'rgba(193,67,96,0.2)', 'rgba(211,87,35,0.2)', 'rgba(211,96,118,0.2)', 'rgba(179,201,58,0.2)', 'rgba(64,127,232,0.2)',
+        'rgba(86,68,93,0.2)', 'rgba(111,33,8,0.2)', 'rgba(192,53,70,0.2)', 'rgba(92,25,107,0.2)', 'rgba(73,10,61,0.2)',
+        'rgba(189,21,80,0.2)', 'rgba( 31,78,95,0.2)', 'rgba(241,0,229,0.2)', 'rgba(114,0,218,0.2)', 'rgba(70,14,68,0.2)'
       ],
       mapMemberColor: new Map()// 人员对应颜色表
     }
@@ -247,8 +251,8 @@ export default {
       this.mapMemberColor.clear()
       arr.map((item, index) => {
         this.mapMemberColor.set(item.idap, {
-          color: this.colorList[index % 10],
-          bgColor: this.bgColorList[index % 10]
+          color: this.colorList[index % 20],
+          bgColor: this.bgColorList[index % 20]
         })
       })
     },