ソースを参照

Merge branch 'http_mock' into Qz_UI_0.0.2

wenbobowen 4 年 前
コミット
a0097a4f89
22 ファイル変更251 行追加111 行削除
  1. 4 7
      src/assets/css/index.less
  2. 4 4
      src/components/dialog/normalDialog.vue
  3. 23 13
      src/components/newLayout/components/menu.vue
  4. 25 6
      src/store/modules/monthlyReport/edit/index.js
  5. 4 7
      src/styles/index.less
  6. 1 0
      src/views/monthlyReport/childrenPage/editReport/components/Cascader.vue
  7. 1 0
      src/views/monthlyReport/childrenPage/editReport/components/CascaderSingle.vue
  8. 11 3
      src/views/monthlyReport/childrenPage/editReport/components/MrTable/index.vue
  9. 1 0
      src/views/monthlyReport/childrenPage/editReport/components/MultiplePeopleInfo.vue
  10. 10 8
      src/views/monthlyReport/childrenPage/editReport/components/OverallOverviewOfTheClient/onlineQuestion.vue
  11. 8 11
      src/views/monthlyReport/childrenPage/editReport/components/OverallOverviewOfTheClient/qualityProcess.vue
  12. 1 1
      src/views/monthlyReport/childrenPage/editReport/components/OverallOverviewOfTheServer.vue
  13. 3 7
      src/views/monthlyReport/childrenPage/editReport/components/PushAndBanck.vue
  14. 2 2
      src/views/monthlyReport/childrenPage/editReport/components/Refresh.vue
  15. 9 9
      src/views/monthlyReport/childrenPage/editReport/components/SubTitle.vue
  16. 14 1
      src/views/monthlyReport/childrenPage/editReport/components/TextInfo.vue
  17. 3 1
      src/views/monthlyReport/childrenPage/editReport/components/content.vue
  18. 32 6
      src/views/monthlyReport/childrenPage/editReport/components/core.vue
  19. 55 8
      src/views/monthlyReport/childrenPage/editReport/components/markingIssues.vue
  20. 18 9
      src/views/monthlyReport/childrenPage/editReport/index.vue
  21. 21 6
      src/views/monthlyReport/index.vue
  22. 1 2
      src/views/quality/components/drawerAll.vue

+ 4 - 7
src/assets/css/index.less

@@ -70,11 +70,8 @@
 }
 
 @font-face {
-  font-family: 'iconfont';  /* project id 2402558 */
-  src: url('//at.alicdn.com/t/font_2402558_9bkkmgijjij.eot');
-  src: url('//at.alicdn.com/t/font_2402558_9bkkmgijjij.eot?#iefix') format('embedded-opentype'),
-  url('//at.alicdn.com/t/font_2402558_9bkkmgijjij.woff2') format('woff2'),
-  url('//at.alicdn.com/t/font_2402558_9bkkmgijjij.woff') format('woff'),
-  url('//at.alicdn.com/t/font_2402558_9bkkmgijjij.ttf') format('truetype'),
-  url('//at.alicdn.com/t/font_2402558_9bkkmgijjij.svg#iconfont') format('svg');
+  font-family: 'iconfont';  /* Project id 2402558 */
+  src: url('//at.alicdn.com/t/font_2402558_538plilwhpo.woff2?t=1620356015326') format('woff2'),
+       url('//at.alicdn.com/t/font_2402558_538plilwhpo.woff?t=1620356015326') format('woff'),
+       url('//at.alicdn.com/t/font_2402558_538plilwhpo.ttf?t=1620356015326') format('truetype');
 }

+ 4 - 4
src/components/dialog/normalDialog.vue

@@ -149,11 +149,11 @@ export default {
   content: ' ';
   display: inline-block;
   position: absolute;
-  top: 2px;
+  top: 3px;
   left: 0;
-  width: 5px;
-  height: 20px;
-  border-radius: 2px;
+  width: 4px;
+  height: 16px;
+  border-radius: 1px;
   background-color: rgb(64, 158, 255);
 }
 </style>

+ 23 - 13
src/components/newLayout/components/menu.vue

@@ -1,9 +1,9 @@
 <template>
   <span style="margin-top: auto">
-    <el-popover placement="right-end" trigger="hover" width="466" :open-delay="200">
+    <el-popover placement="right-end" trigger="hover" width="400" :open-delay="200">
       <div class="menu-wrapper">
-        <div class="children-menu-wrapper borderBottom">
-          <div v-for="(elm, index) in [...menuBaseData].splice(0,3)" :key="elm.key">
+        <div class="children-menu-wrapper borderBottom normal">
+          <div v-for="(elm, index) in [...menuBaseData].splice(0, 3)" :key="elm.key">
             <div
               v-if="index < 3"
               class="title"
@@ -11,7 +11,7 @@
               :style="{ display:index === 2 ? 'none' : 'auto' }"
               @click="switchProjects(elm)"
             >
-              <img width="16" height="14" :src="elm.iconData" style="position: relative; top: -2px; margin-right: 10px">
+              <img width="16" height="14" :src="elm.iconData" style="position: relative; top: -2px; margin-right: 5px">
               {{ elm.name }}
               <span v-if="elm.key === 'thothFrontend'" style="  position: absolute; top: -8px; right: -25px;">
                 <svg xmlns="http://www.w3.org/2000/svg" width="25.925" height="11.431" viewBox="0 0 25.925 11.431"> <g id="组_3108" data-name="组 3108" transform="translate(-1132.681 -133.742)"> <path id="标签_3_" data-name="标签 (3)" d="M10.629,0c.443,0,.8.548.8,1.224V20.483a1.328,1.328,0,0,1-.51,1.14L6.007,25.842a.55.55,0,0,1-.583,0L.511,21.623A1.328,1.328,0,0,1,0,20.483V1.224C0,.548.359,0,.8,0Z" transform="translate(1158.606 133.742) rotate(90)" fill="#409eff" /> <text id="当前" transform="translate(1140 142)" fill="#fff" font-size="8" fontFamily="PingFangSC-Regular, PingFang SC" letterSpacing="0.038em"> <tspan x="0" y="0">当前</tspan> </text> <circle id="椭圆_263" data-name="椭圆 263" cx="1.5" cy="1.5" r="1.5" transform="translate(1136 138)" fill="#fff" /> </g> </svg>
@@ -29,7 +29,7 @@
               width="16"
               height="16"
               :src="menuBaseData[3].iconData"
-              style="position: relative; top: -2px; margin-right: 10px"
+              style="position: relative; top: -2px; margin-right: 5px"
             >
             {{ menuBaseData[3].name }}
           </div>
@@ -50,7 +50,7 @@
                     class="iconfont icon"
                     :class="elm.menuBase.class"
                     :style="{
-                      fontSize: '22px',
+                      fontSize: '18px',
                       color: elm.menuBase.color && !elm.menuBase.class ? elm.menuBase.color : 'transparent'
                     }"
                     >{{ translateHtmlCharater(elm.menuBase.icon) }}</i
@@ -136,6 +136,9 @@ export default {
 </script>
 
 <style scoped lang="less">
+/deep/.el-popover{
+  padding: 0;
+}
 .menu-wrapper-icon {
   font-size: 30px;
   line-height: 1;
@@ -145,8 +148,9 @@ export default {
 }
 
 .menu-wrapper {
-  width: 440px;
-  padding: 12px 0px 0px;
+  width: 100%;
+  padding: 0;
+  // padding: 12px 0px 0px;
 
   .children-menu-wrapper {
     line-height: normal;
@@ -158,8 +162,8 @@ export default {
     padding: 0 20px;
 
     &.borderBottom {
-      margin-bottom: 20px;
-      padding-bottom: 20px;
+      margin-bottom: 18px;
+      padding-bottom: 18px;
       position: relative;
 
       &:after {
@@ -203,18 +207,18 @@ export default {
       //grid-template-columns: repeat(3, 33.33%);
       //grid-row-gap: 40px;
       //grid-column-gap: 40px;
-      padding: 0 15px;
+      padding: 0 0px;
 
       .item-wrapper {
         cursor: pointer;
         margin-top: 14px;
         text-align: center !important;
-        height: 65px;
+        height: 50px;
         padding: 0 !important;
 
         .name {
           margin-top: 6px;
-          font-size: 14px;
+          font-size: 12px;
           line-height: 1;
         }
 
@@ -237,6 +241,12 @@ export default {
         display: none;
       }
     }
+    &.normal{
+      justify-content: normal;
+      .title{
+        margin-right: 30px
+      }
+    }
   }
 
   .active {

+ 25 - 6
src/store/modules/monthlyReport/edit/index.js

@@ -548,9 +548,14 @@ export default {
       const find = (arr) => {
         arr.forEach(elm => {
           if (elm.title === '线上问题') {
-            // console.log(532, elm, rowData)
-            // console.log(elm.content[0].tableRows, rowData)
-            elm.content[0].tableRows.push(rowData[0])
+            const newQuestion = rowData[0].tableItems[1].value
+            const isQuestion = elm.content[0].tableRows.map(elm => elm.tableItems[1]).filter(
+              elm => elm.value === newQuestion
+            )
+            // 判断数据是否冲突
+            if (!isQuestion.length) {
+              elm.content[0].tableRows.push(rowData[0])
+            }
           }
           if (elm.children && elm.children.length) {
             find(elm.children)
@@ -614,6 +619,7 @@ export default {
         if (res.code === 200 && res.data) {
           commit('INIT_PAGE_DATA', { ...res.data })
           commit('INIT_TAB_PAGE_DATA', subActive && `tab_${subActive}`)
+          commit('SET_LOADING', false)
         }
       }
     },
@@ -666,6 +672,7 @@ export default {
           id,
           tabsActive
         })
+        commit('SET_LOADING', false)
         // 设置月报子标题
         setTimeout(() => {
           commit('SET_SUB_TITLE', {
@@ -718,6 +725,7 @@ export default {
       // 转换数据结构
       const res = await updateMonthlyReport(params)
       if (res.code === 200) {
+        state.pageDate.isDelete = false
         callback()
       }
     },
@@ -895,10 +903,21 @@ export default {
           arr.forEach((elm) => {
             if (elm.domKey === domKey) {
               // console.log(elm, res.data)
-              if (title.search(/上月问题跟进|发布&回滚|线上问题|线上问题/) > -1) {
-                elm.content = [{ ...res.data.content[0] }]
-              } else if (title.search(/线下缺陷/) > -1) {
+              if (title.search(/上月问题跟进/) > -1) {
                 elm.content = [{ ...res.data.content[0] }]
+              } else if (title.search(/线上问题/) > -1) {
+                const value = `${elm.content[0].value}`
+                // console.log(elm.content, 904)
+                // elm.content[0].tableRows = res.data.content[0].tableRows
+                elm.content = [{ ...res.data.content[0], value }]
+                // console.log(elm.content, res.data.content[0], 907)
+                // elm.content = [{
+                //   ...elm.content[0],
+                //   tableRows: res.data.content[0].tableRows
+                // }]
+              } else if (title.search(/线下缺陷|发布&回滚/) > -1) {
+                const value = `${elm.content[0].value || ''}`
+                elm.content = [{ ...res.data.content[0], value }]
                 elm.subTitles = [...res.data.subTitles]
               } else {
                 elm.content = [{ ...res.data }]

+ 4 - 7
src/styles/index.less

@@ -128,11 +128,8 @@ div:focus {
 }
 
 @font-face {
-  font-family: 'iconfont';  /* project id 2402558 */
-  src: url('//at.alicdn.com/t/font_2402558_9bkkmgijjij.eot');
-  src: url('//at.alicdn.com/t/font_2402558_9bkkmgijjij.eot?#iefix') format('embedded-opentype'),
-  url('//at.alicdn.com/t/font_2402558_9bkkmgijjij.woff2') format('woff2'),
-  url('//at.alicdn.com/t/font_2402558_9bkkmgijjij.woff') format('woff'),
-  url('//at.alicdn.com/t/font_2402558_9bkkmgijjij.ttf') format('truetype'),
-  url('//at.alicdn.com/t/font_2402558_9bkkmgijjij.svg#iconfont') format('svg');
+  font-family: 'iconfont';  /* Project id 2402558 */
+  src: url('//at.alicdn.com/t/font_2402558_538plilwhpo.woff2?t=1620356015326') format('woff2'),
+       url('//at.alicdn.com/t/font_2402558_538plilwhpo.woff?t=1620356015326') format('woff'),
+       url('//at.alicdn.com/t/font_2402558_538plilwhpo.ttf?t=1620356015326') format('truetype');
 }

+ 1 - 0
src/views/monthlyReport/childrenPage/editReport/components/Cascader.vue

@@ -5,6 +5,7 @@
     filterable
     remote
     size="small"
+    clearable
     collapse-tags
     style="width: 100%"
     reserve-keyword

+ 1 - 0
src/views/monthlyReport/childrenPage/editReport/components/CascaderSingle.vue

@@ -2,6 +2,7 @@
   <el-cascader
     v-model="selectValue"
     :options="selectEnum"
+    clearable
     @change="changeCascader" />
 </template>
 

+ 11 - 3
src/views/monthlyReport/childrenPage/editReport/components/MrTable/index.vue

@@ -160,7 +160,7 @@
         </div>
       </div>
       <div v-else-if="item.displayType === 'Texterea'" :style="{cursor: item.name === '问题' && scope.row.operationTarget ? 'pointer' : 'auto'}" @click.stop="item.name === '问题' && pageType.search(/edit/) < 0 && goto(scope.row.operationTarget) || editLine(scope.row, index)">
-        <TextInfo :text="scope.row[item.headerKey]" />
+        <TextInfo :text-align="item.name" :text="scope.row[item.headerKey]" />
       </div>
       <div v-else>
         <span v-html="scope.row[item.headerKey]" />
@@ -317,7 +317,7 @@ export default {
       let width = 80
       if (item.name === '操作') {
         if (item.defaultValue.length) {
-          width = item.defaultValue.length * 30
+          width = item.defaultValue.length * (item.defaultValue.length > 2 ? 20 : 30)
         }
         if (this.isExpand) {
           width = 90
@@ -325,10 +325,17 @@ export default {
       }
       if (item.name === '定级') {
         width = 70
+        if (this.$route.query.pageType.search(/read/) > -1) {
+          width = 55
+        }
+      }
+
+      if (item.name === '原因') {
+        width = 200
       }
 
       if (item.name === '影响') {
-        width = 130
+        width = 100
       }
 
       return `${width}px`
@@ -360,6 +367,7 @@ export default {
           this.$refs.markingIssues.openModal({
             title: '标记为重点问题',
             scope,
+            headerTitle: this.title,
             columns: this.columns
           })
         })

+ 1 - 0
src/views/monthlyReport/childrenPage/editReport/components/MultiplePeopleInfo.vue

@@ -50,6 +50,7 @@ export default {
   methods: {
     // 根据传入类型判断数据
     init() {
+      this.userName = []
       let index = typeof this.teamData === 'string' ? 'a9527' : 0
       const getInfo = () => {
         this.getMember(

+ 10 - 8
src/views/monthlyReport/childrenPage/editReport/components/OverallOverviewOfTheClient/onlineQuestion.vue

@@ -5,7 +5,7 @@
       <div class="echarts-wrapper">
         <div class="pie-wrapper">
           <div class="total-wrapper">
-            总数:<span class="total" @click.stop="reportBizName = ''">{{ tabData.total }}</span>
+            总数:<span class="total fontWeight" @click.stop="reportBizName = ''">{{ tabData.total }}</span>
           </div>
           <div
             id="a_tylo_oo_2ppmn_ayghs"
@@ -16,20 +16,19 @@
         </div>
         <div class="detail-wrapper">
           <div v-if="tabData && pieData.length">
-          <div class="fontWeight" style="margin-bottom: 10px;">{{ tabData.title }}</div>
+          <div style="margin-bottom: 10px;" v-html="tabData.title.replace(/线上问题/,'<strong>线上问题</strong>' ).replace(/为(\d+)/g, `为<strong>$1</strong>`)" />
           <div
             v-for="item in tabData.onlineProblemCopywriters.filter((elm) =>
               reportBizName ? elm.reportBizName === reportBizName : true
             )"
             :key="item.reportBizName"
           >
-            <div v-if="item.problemDetails.length" class="fontWeight" style="margin-top: 5px">{{ item.reportBizName }}:{{ item.priorityStr }}</div>
+            <div v-if="item.problemDetails.length" style="margin-top: 5px"><span class="fontWeight">{{ item.reportBizName }}</span>:<span v-html="item.priorityStr.replace(/\ (\d+)/g, `为<strong>$1</strong>`)" /></div>
             <div v-for="(pitem, pIndex) in item.problemDetails" :key="pIndex">
               <div class="fontWeight" style="color: #ED8F41;margin-top: 10px;">{{ pitem.subClientType }}</div>
               <div v-for="(dItem, dIndex) in pitem.details" :key="dIndex" style="padding-left: 10px">
-                <div style="margin-top: 5px;">
-                  <span class="fontWeight">{{ dIndex + 1 }}、</span
-                  ><span class="fontWeight">{{ dItem.priority }}问题:</span
+                <div style="margin-top: 5px;"><span>{{ dIndex + 1 }}、</span
+                  ><span>{{ dItem.priority }}问题:</span
                   >{{ dItem.problem }}
                 </div>
                 <div v-html="dItem.reason" />
@@ -38,7 +37,7 @@
           </div>
         </div>
 </div>
-        <div v-if="!pieData.length" class="no-data">各业务线{{ active }}类线上问题为 <span style="font-size: 16px">0</span>!</div>
+        <div v-if="!pieData.length" class="no-data">各业务线{{ active }}类<strong>线上问题</strong>为<span style="font-size: 16px">0</span>!</div>
       </div>
     </boxCom>
   </div>
@@ -183,7 +182,7 @@ export default {
   }
   .fontWeight {
     color: #333;
-    font-weight: 500;
+    font-weight: 600;
   }
   .no-data {
       top: 50%;
@@ -192,5 +191,8 @@ export default {
   text-align: center;
     position:absolute;
   }
+  /deep/strong{
+    font-weight: 600;
+  }
 }
 </style>

+ 8 - 11
src/views/monthlyReport/childrenPage/editReport/components/OverallOverviewOfTheClient/qualityProcess.vue

@@ -16,10 +16,7 @@
           />
           <div v-if="tabData && pieData.filter(elm => elm.total).length" style="width: 205px;color: #333">
             本月{{ active }}类:
-            <span v-for="(item, itemIndex ) in tabData.qualityProcessAndRdEfficiencyCopywriters" :key="itemIndex">
-              <span>{{ item.type }}</span>
-              <span :class="{ fontWeight: true, red: item.total > 0 }">{{ item.total }}</span>次
-              <span>{{ tabData.qualityProcessAndRdEfficiencyCopywriters.length - 1 > itemIndex ? ',': '。' }}</span>
+            <span v-for="(item, itemIndex ) in tabData.qualityProcessAndRdEfficiencyCopywriters" :key="itemIndex"><span>{{ item.type }}</span><span :class="{ fontWeight: true, red: item.total > 0 }">{{ item.total }}</span>次<span>{{ tabData.qualityProcessAndRdEfficiencyCopywriters.length - 1 > itemIndex ? ',': '。' }}</span>
             </span>
           </div>
         </div>
@@ -34,10 +31,10 @@
               :key="itemIndex"
               style="margin-bottom: 10px"
             >
-              <div class="fontWeight" style="margin-bottom: 0px">
-                {{ item.type }}数据
+              <div style="margin-bottom: 0px">
+                <span class="fontWeight">{{ item.type }}</span>数据
               </div>
-              <div style="margin-top: 0px;color: #333;">本月{{ item.type }}<span style="font-weight: 500">{{ item.total }}</span>次</div>
+              <div style="margin-top: 0px;color: #333;">本月{{ item.type }}<span style="font-weight: 600">{{ item.total }}</span>次</div>
               <div
                 v-for="(elm, elmIndex) in item.subClientDetails"
                 :key="elmIndex"
@@ -52,7 +49,7 @@
                   style="margin-bottom: 5px;padding-left: 10px"
                 >
                   <div v-if="subItem.name" style="margin-top: 0px">
-                    <span class="fontWeight">{{ subindex + 1 }}、</span
+                    <span>{{ subindex + 1 }}、</span
                     >{{ subItem.name
                     }}<span
   v-if="subItem.description"
@@ -64,7 +61,7 @@
             </div>
           </div>
         </div>
-        <div v-if="!pieData.filter(elm => elm.total).length" class="no-data">各业务线{{ active }}类质量流程&研发效率问题为 <span style="font-size: 16px">0</span>!</div>
+        <div v-if="!pieData.filter(elm => elm.total).length" class="no-data">各业务线{{ active }}类<strong>质量流程&研发效率</strong>问题为 <span style="font-size: 16px">0</span>!</div>
       </div>
     </boxCom>
   </div>
@@ -268,8 +265,8 @@ export default {
     height: 235px;
     overflow-y: scroll;
   }
-    .fontWeight {
-    font-weight: 500;
+  .fontWeight {
+    font-weight: 600;
     color: #333;
   }
   .red {

+ 1 - 1
src/views/monthlyReport/childrenPage/editReport/components/OverallOverviewOfTheServer.vue

@@ -95,7 +95,7 @@ export default {
 </script>
 <style lang="less" scoped>
 .OverallOverviewOfTheServer {
-  margin-top: 30px;
+  margin-top: 20px;
   table {
     border-collapse: collapse;
     width: 100%;

+ 3 - 7
src/views/monthlyReport/childrenPage/editReport/components/PushAndBanck.vue

@@ -2,12 +2,8 @@
   <div v-if="subTitle" class="subTitle-wrapper">
     {{ title }}&nbsp;-&nbsp;
     <div v-for="(item, index) in subTitle" :key="index" class="item">
-      <div v-if="isShowItem(item.copywriter)">
-        {{ item.copywriter }}
-        <div :class="{ red: isShowColor(item.copywriter, item.label) }">
-          <span class="fontWeight">{{ item.label }}</span>
-          <div v-if="isShow(item.copywriter)">%</div>
-        </div>
+      <div v-if="isShowItem(item.copywriter)">{{ item.copywriter }}<div :class="{ red: isShowColor(item.copywriter, item.label) }"><span class="fontWeight">{{ item.label }}</span><span v-if="isShow(item.copywriter)" class="fontWeight">%</span><span v-if="item.copywriter !== '全量回滚率' && item.copywriter !== '裸奔上线率'">次</span>
+      </div>
         <div v-if="index < subTitle.length - 1">{{ item.copywriter.search(/发布次数|全量回滚率/) > -1 ? ';' : isComma(item.copywriter) }}</div>
       </div>
     </div>
@@ -101,6 +97,6 @@ export default {
 }
 .fontWeight {
   // color: #333;
-  font-weight: 500;
+  font-weight: 600;
 }
 </style>

+ 2 - 2
src/views/monthlyReport/childrenPage/editReport/components/Refresh.vue

@@ -1,5 +1,5 @@
 <template>
-  <span style="margin-left: 5px" @click.stop>
+  <span @click.stop>
     <!-- 月报数据重新拉取 -->
     <normal-dialog
       ref="dialogRefresh"
@@ -7,7 +7,7 @@
       is-succes
       :show-dialog="false"
       :title="dialogTitle"
-      width="300px"
+      width="420px"
       @succes="refreshReport()"
     >
       <div class="report-delete">

+ 9 - 9
src/views/monthlyReport/childrenPage/editReport/components/SubTitle.vue

@@ -4,10 +4,10 @@
       <span class="query-bug" @click.stop="query(item, index)">
         <span v-if="index === 0">新增bug<span class="fontWeight">{{ item.label }}</span>个,</span>
         <span v-if="index === 1">其中P0 bug数<span class="fontWeight" :class="[item.label !== '0' ? 'query-colors' : '' ]">{{ item.label }}</span>个,</span>
-        <span v-if="index === 2">P1 bug数 <span class="fontWeight">{{ item.label }}</span>个;</span>
-        <span v-if="index === 3">P0&P1平均修复时长<span class="fontWeight">{{ item.label }}H</span>;</span>
-        <span v-if="index === 4">过夜率<span class="fontWeight">{{ item.label }}%</span>;</span>
-        <span v-if="index === 5">Reopen<span class="fontWeight">{{ item.label }}</span>次。</span>
+        <span v-if="index === 2">P1 bug数<span class="fontWeight">{{ item.label }}</span>个;</span>
+        <span v-if="index === 3 && item.label !== '--'">P0&P1平均修复时长<span class="fontWeight" :class="[item.label > 24 ? 'query-colors' : '' ]">{{ item.label }}h</span>;</span>
+        <span v-if="index === 4 && item.label !== '--'">P0&P1 过夜率<span class="fontWeight">{{ item.label }}%</span>;</span>
+        <span v-if="index === 5">Reopen<span class="fontWeight" :class="[item.label !== '0' ? 'query-colors' : '' ]">{{ item.label }}</span>次。</span>
       </span>
       <!-- 新增bug 78个,其中P0 bug数XX(标红)个,P1 bug数XX个;P0&P1平均修复时长 23.8H;P0&P1 24小时修复率70.0%;reopen XX次。 -->
     </span>
@@ -38,7 +38,7 @@ export default {
       requireList: {},
       bugPriority: ['全部', 'P0', 'P1', 'P1以上'],
       bugPrioritys: ['全部', 'P0&P1', 'P1以上'],
-      bugHour: ['全部修复', '24小时内修复', '24小时未修复']
+      bugHour: ['全部修复', '24小时内修复', '修复时长超过24小时']
     }
   },
   watch: {
@@ -106,6 +106,10 @@ export default {
 }
 </script>
 <style scoped lang="less">
+.fontWeight {
+  color: #333;
+  font-weight: 600;
+}
 .query-bug{
   color: #333;
 }
@@ -119,8 +123,4 @@ export default {
 /deep/.el-drawer__body{
   width: 50vw;
 }
-.fontWeight {
-  color: #333;
-  font-weight: 500;
-}
 </style>

+ 14 - 1
src/views/monthlyReport/childrenPage/editReport/components/TextInfo.vue

@@ -1,5 +1,5 @@
 <template>
-	<span v-if="text" style="text-align: left; display: block"><span v-html="text.replace(/\n/g, '<br />')" /></span>
+	<span v-if="text" style="text-align: left; display: block" :style="{textAlign: setTextAlign(textAlign)}"><span v-html="text.replace(/\n/g, '<br />')" /></span>
 </template>
 <script>
 export default {
@@ -9,6 +9,19 @@ export default {
       type: String,
       required: false,
       default: ''
+    },
+    textAlign: {
+      type: String,
+      required: false,
+      default: ''
+    }
+  },
+  methods: {
+    setTextAlign(name) {
+      if (name.search(/天数|模块/) > -1) {
+        return 'center'
+      }
+      return 'left'
     }
   }
 }

+ 3 - 1
src/views/monthlyReport/childrenPage/editReport/components/content.vue

@@ -18,6 +18,7 @@
           本月无线上问题!
         </div>
         <div v-else-if="title.search(/问题跟进/) > -1" style="margin-top: 10px;color: #666">上月无重点问题!</div>
+        <div v-else-if="title.search(/持续改进/) > -1" style="margin-top: 10px;color: #666">本月无持续改进!</div>
         <div v-else-if="title.search(/重点问题/) > -1" style="margin-top: 10px;color: #666">本月无重点问题!</div>
         <div v-else-if="title.search(/两轮车|代驾|货运|硬件|中台/) > -1" style="margin-top: 10px;color: #666">{{ setNoDataTitle(title) }}</div>
       </div>
@@ -75,7 +76,8 @@
           :item="item"
         />
 <!--        <div v-else class="no-data">暂无数据</div>-->
-<!--        <div v-else-if="title.search(/本月优秀|持续改进/) > -1" style="margin-top: 10px;color: #666">无{{ title }}!</div>-->
+        <div v-else-if="title.search(/本月优秀|持续改进/) > -1" style="margin-top: 10px;color: #666">本月无{{ title }}!</div>
+        <div v-else class="no-data" style="padding-left: 20px">暂无数据!</div>
       </div>
       <div v-else>
         <!--        <fixedText-->

+ 32 - 6
src/views/monthlyReport/childrenPage/editReport/components/core.vue

@@ -48,8 +48,8 @@
         }"
         v-html="headerTitle"
       />
-      <span v-if="baseData.title.search(/延期|发布&回滚/) > -1">。</span><Refresh v-if="pageDate && pageDate.status < 20" slot="refresh" :title="baseData.title" :dom-key="baseData.domKey" /><span><el-button v-if="headerTitle.indexOf('线下缺陷') > -1 && pageDate.status < 20" type="text" style="margin-left: 5px" @click.stop="marking">标记</el-button></span>
-      <span v-if="baseData.title.search(/提测打回/) > -1">。</span>
+      <span v-if="baseData.title.search(/延期|发布&回滚/) > -1">。</span><Refresh v-if="pageDate && pageDate.status < 20" slot="refresh" :title="baseData.title" :dom-key="baseData.domKey" /><span><el-button v-if="headerTitle.indexOf('线下缺陷') > -1 && pageDate.status < 20" type="text" style="margin-left: 5px;font-weight: 400;" @click.stop="marking">标记</el-button></span>
+      <span v-if="baseData.title.search(/提测打回|增发/) > -1">。</span>
     </div>
     <div
       v-if="baseData.content && baseData.content.length"
@@ -71,7 +71,12 @@
             :name="item.domKey"
             :dom-index="index"
           >
-            <Core :key="item.domKey" :tab-key="baseData.domKey" :dom-index="index" :base-data="item" />
+            <span slot="label">
+              <span v-if="item.title.search(/服务端|客户端/) > -1">
+                <i class="iconfont icon" :class="{colorActive: item.domKey === activeName}">{{ item.title === '服务端'?'&#xe607;' : '&#xe608;' }}</i>
+              </span>
+            {{ item.title }}</span>
+            <Core :key="item.domKey" v-loading="loading" style="padding-left: 20px;" :tab-key="baseData.domKey" :dom-index="index" :base-data="item" />
           </el-tab-pane>
         </el-tabs>
       </div>
@@ -130,6 +135,7 @@ export default {
       fontWeightFont: ['两轮车', '代驾', '货运', '硬件', '中台'],
       pullDataAgainTitle: ['上月问题跟进', '线上问题', '线下缺陷', '发布&回滚'],
       activeName: '',
+      loading: false,
       headerTitle: ''
     }
   },
@@ -198,12 +204,15 @@ export default {
       this.$forceUpdate()
     },
     handleClick(tab, event) {
+      this.loading = true
       // console.log(tab, event)
       this.$nextTick(() => {
         this.$store.commit('monthlyReportEdit/GET_ALL_OFFSETTOP')
         this.$store.commit('monthlyReportEdit/INIT_EDIT_KEYS')
       })
-
+      setTimeout(() => {
+        this.loading = false
+      }, 650)
       // const { name } = tab
       // this.$store.commit('monthlyReportEdit/SUB_TABS_ACTIVE', this.baseData.children[0].domKey, this.activeName)
     },
@@ -265,11 +274,14 @@ export default {
     marking() {
       this.$refs.markingIssues.modalShow = true
       const params = {
-        title: '标记为重点问题'
+        title: '标记为重点问题',
+        subTitles: this.baseData.subTitles,
+        headerTitle: this.baseData.title
       }
       if (this.baseData.content.length) {
         params.normalAreaName = this.baseData.content[0].value
       }
+      console.log(params)
       this.$nextTick(() => {
         this.$refs.markingIssues.openModal(params)
       })
@@ -288,7 +300,7 @@ export default {
         this.baseData.content[0].type === 'RichText' &&
         !this.baseData.content[0].value
       ) {
-        return false
+        return true
       }
       return true
     },
@@ -317,4 +329,18 @@ export default {
 /deep/ .el-tabs__content {
   margin-top: -10px;
 }
+/deep/.el-tabs__item {
+  .iconfont{
+    color: #333;
+    font-size: 14px;
+    &.colorActive{
+      color: #409EFF;
+    }
+  }
+  &:hover {
+    .iconfont {
+      color: #409EFF;
+    }
+  }
+}
 </style>

+ 55 - 8
src/views/monthlyReport/childrenPage/editReport/components/markingIssues.vue

@@ -6,16 +6,17 @@
       :show-dialog="false"
       is-succes
       :title="titleName"
-      width="400px"
+      width="45%"
       @succes="updateModule"
     >
-      <el-form label-width="100px" style="padding-right: 20px">
+      <el-form label-width="100px" style="padding-right: 20px;padding-left: 20px">
         <el-form-item label="问题">
           <el-input
             v-model="normalAreaName"
             autocomplete="off"
-            size="mini"
-            maxlength="100"
+            size="small"
+            type="textarea"
+            :autosize="{ minRows: 2, maxRows: 30 }"
             show-word-limit
             placeholder="请输入问题"
           />
@@ -68,6 +69,8 @@ export default {
       callBack: null,
       columns: null,
       cascaderValue: null,
+      headerTitle: null,
+      subTitles: null,
       multiplePeople: null
     }
   },
@@ -81,13 +84,15 @@ export default {
   },
   methods: {
     uuid10,
-    openModal({ title, scope, columns, normalAreaName }) {
-      console.log({ title, scope, columns, normalAreaName })
+    openModal(params) {
+      const { title, scope, columns, normalAreaName, subTitles, headerTitle } = params
       this.titleName = title
       if (scope) this.menuData = scope.row
       if (columns) this.columns = columns
       this.$refs.normalDialog.visible = true
       this.modalShow = true
+      this.subTitles = subTitles
+      this.headerTitle = headerTitle
       if (normalAreaName) this.normalAreaName = normalAreaName
       this.setDefaultValues()
     },
@@ -95,16 +100,52 @@ export default {
     setDefaultValues() {
       this.columns &&
         this.columns.forEach((elm) => {
+          // 线上问题
+          if (elm.name === '定级' && this.headerTitle === '线上问题' && this.normalAreaName.search(/级线上问题/) < 0) {
+            this.normalAreaName = `${this.menuData[elm.headerKey]}级线上问题:${this.normalAreaName}`
+          }
           if (elm.name === '问题') {
-            this.normalAreaName = this.menuData[elm.headerKey]
+            this.normalAreaName += this.menuData[elm.headerKey]
           }
-          if (elm.name === '归属团队') {
+          if (elm.name.search(/团队/) > -1) {
             this.cascaderValue = this.menuData[elm.headerKey]
           }
           if (elm.name === '负责人') {
             this.multiplePeople = [this.menuData[elm.headerKey]]
           }
         })
+      // 延期
+      if (this.headerTitle.search(/延期 - |提测打回/) > -1) {
+        this.normalAreaName = ''
+        // elm.name === '延期类型'
+        const headerKeyYQ = this.columns.filter(elm => elm.name.search(/类型/) > -1)[0]
+        const headerKeyMC = this.columns.filter(elm => elm.name === '项目名称')[0]
+        this.normalAreaName = `${this.menuData[headerKeyYQ.headerKey]}${this.menuData[headerKeyYQ.headerKey] && this.menuData[headerKeyMC.headerKey] && ':'}${this.menuData[headerKeyMC.headerKey]}`
+      }
+      // 线下缺陷:
+      if (this.headerTitle === '线下缺陷') {
+        this.normalAreaName = ''
+        this.subTitles && this.subTitles.forEach((elm, index) => {
+          // this.normalAreaName += `${elm.copywriter}:${elm.label}`
+          if (index < 3) {
+            this.normalAreaName += `${elm.copywriter}:${elm.label}个${index === 2 ? ';' : ','}`
+          }
+          if (index === 3 && elm.label !== '--') {
+            this.normalAreaName += `${elm.copywriter}:${elm.label}h;`
+          }
+          if (index === 4 && elm.label !== '--') {
+            this.normalAreaName += `${elm.copywriter}:${elm.label}%;`
+          }
+          if (index === 5) {
+            this.normalAreaName += `${elm.copywriter}:${elm.label}。`
+          }
+        })
+      }
+      // 发布&回滚
+      if (this.headerTitle.search(/发布&回滚/) > -1) {
+        const headerKeyMK = this.columns.filter(elm => elm.name.search(/模块/) > -1)[0]
+        this.normalAreaName = this.menuData[headerKeyMK.headerKey] && `${this.menuData[headerKeyMK.headerKey]}模块一次全量回滚`
+      }
     },
     updateModule() {
       this.$store.commit('monthlyReportEdit/MARK_ISSUES', {
@@ -122,4 +163,10 @@ export default {
 /deep/ .el-form-item__label {
   text-align: left!important;
 }
+.el-form-item{
+  margin-bottom: 10px;
+}
+/deep/.el-dialog__body{
+  padding-bottom: 0
+}
 </style>

+ 18 - 9
src/views/monthlyReport/childrenPage/editReport/index.vue

@@ -17,7 +17,7 @@
         <el-button v-if="pageDate && pageDate.status < 10 && (roleCode === 100 || roleCode === 0)" size="small" @click="dialogOpen('dialogSend')">
           发送确认
         </el-button>
-        <el-button v-if="$route.query.type === 'create' && pageDate && pageDate.status < 20 && (roleCode === 100 || roleCode === 0)" slot="reference" plain size="small" @click="dialogOpen('dialogCancel')">
+        <el-button v-if="$route.query.type === 'create' && pageDate && pageDate.status < 20 && pageDate.isDelete && (roleCode === 100 || roleCode === 0)" slot="reference" plain size="small" @click="dialogOpen('dialogCancel')">
           取消
         </el-button>
         <el-button
@@ -42,7 +42,7 @@
             </el-dropdown-menu>
           </el-dropdown>
         </span>
-        <el-button v-if=" pageType.search(/All/) > -1 && (!$route.query.type || $route.query.type !== 'create') && pageDate && pageDate.status < 20 && (roleCode === 100 || roleCode === 0)" slot="reference" type="danger" size="small" @click="dialogOpen('dialogDelete')">
+        <el-button v-if=" pageType.search(/All/) > -1 && (!$route.query.type || !pageDate.isDelete || $route.query.type !== 'create') && pageDate && pageDate.status < 20 && (roleCode === 100 || roleCode === 0)" slot="reference" type="danger" size="small" @click="dialogOpen('dialogDelete')">
           删除
         </el-button>
       </template>
@@ -56,7 +56,7 @@
       <el-tabs v-if="pageType.search(/All/) > -1" :value="tabsActive" @tab-click="tabClick">
         <el-tab-pane v-for="item in tabsList" :key="item.name" :label="item.label" :name="item.name" />
       </el-tabs>
-      <div class="body-wrapper">
+      <div v-loading="bodyLoading" class="body-wrapper">
         <div class="left-wrapper">
           <div v-if="tabPageShow">
             <Core v-for="(item, index) in tabPageData.children" :key="item.domKey" :dom-index="index" :base-data="item" />
@@ -74,31 +74,31 @@
       </div>
     </div>
     <!-- 月报发送确认 -->
-    <normal-dialog ref="dialogDelete" is-succes :show-dialog="false" :title="'删除月报'" width="300px" @succes="deleteReport('删除')" @cancel="deleteReport('取消')">
+    <normal-dialog ref="dialogDelete" is-succes :show-dialog="false" :title="'删除月报'" width="420px" @succes="deleteReport('删除')" @cancel="deleteReport('取消')">
       <div class="report-delete">
         确认删除当前月报?
       </div>
     </normal-dialog>
     <!-- 月报取消 -->
-    <normal-dialog ref="dialogCancel" is-succes :show-dialog="false" :title="'取消月报'" width="320px" @succes="$router.push({ path: '/monthlyReport/index' });window.log({ c: 'report_edit', d: 'report_edit_cancel' })" @cancel="$refs.dialogCancel.visible = false">
+    <normal-dialog ref="dialogCancel" is-succes :show-dialog="false" :title="'取消月报'" width="420px" @succes="$router.push({ path: '/monthlyReport/index' });window.log({ c: 'report_edit', d: 'report_edit_cancel' })" @cancel="$refs.dialogCancel.visible = false">
       <div class="report-delete">
         取消后填写的数据将不会保存,是否确认?
       </div>
     </normal-dialog>
     <!-- 月报发送确认 -->
-    <normal-dialog ref="dialogSend" is-succes :show-dialog="false" :title="'发送确认'" width="300px" @succes="sendReport" @cancel="sendReport('取消')">
+    <normal-dialog ref="dialogSend" is-succes :show-dialog="false" :title="'发送确认'" width="420px" @succes="sendReport" @cancel="sendReport('取消')">
       <div class="report-delete">
         确认发送当前月报?
       </div>
     </normal-dialog>
     <!-- 月报发布确认 -->
-    <normal-dialog ref="dialogPublishAll" is-succes :show-dialog="false" :title="'发送确认'" width="300px" @succes="publishAllReport">
+    <normal-dialog ref="dialogPublishAll" is-succes :show-dialog="false" :title="'发送确认'" width="420px" @succes="publishAllReport">
       <div class="report-delete">
         月报数据已检查无误,确认发布?
       </div>
     </normal-dialog>
     <!-- 月报确认 -->
-    <normal-dialog ref="dialogConfirm" is-succes :show-dialog="false" :title="'确认月报'" width="300px" @succes="confirmReport">
+    <normal-dialog ref="dialogConfirm" is-succes :show-dialog="false" :title="'确认月报'" width="420px" @succes="confirmReport">
       <div class="report-delete">
         确认数据已填写无误,进行月报确认吗?
       </div>
@@ -131,6 +131,7 @@ export default {
     return {
       /* 右侧列表页数据 */
       anchorActive: '',
+      bodyLoading: false,
       scrollTop: 0
     }
   },
@@ -196,6 +197,7 @@ export default {
   },
   created() {
     this.$store.commit('monthlyReportEdit/INIT_STATE_DATA')
+    this.$store.commit('monthlyReportEdit/SET_LOADING', true)
     this.indexShow = true
     // 默认获取用户权限
     this.$store.dispatch('monthlyReportEdit/getUserPermission')
@@ -238,6 +240,9 @@ export default {
       })
       // this.getPageData(this.$route.query.reportId)
     }
+    // setTimeout(() => {
+    //   this.$store.commit('monthlyReportEdit/SET_LOADING', false)
+    // }, 1000)
   },
   destroyed() {
     this.indexShow = false
@@ -389,11 +394,15 @@ export default {
       })
     },
     tabClick(tab, event) {
+      this.bodyLoading = true
       this.$store.dispatch('monthlyReportEdit/tabActiveChange', {
         ...this.$route.query,
         id: this.$route.query.reportId,
         tabsActive: tab.name
       })
+      setTimeout(() => {
+        this.bodyLoading = false
+      }, 700)
     },
     dialogOpen(key) {
       this.$refs[key].visible = true
@@ -476,7 +485,7 @@ export default {
   }
 }
 
-.report-delete {
+/deep/.report-delete {
   text-align: center;
 }
 

+ 21 - 6
src/views/monthlyReport/index.vue

@@ -19,7 +19,7 @@
       </template>
     </headerCom>
     <!--  content  -->
-    <div class="content-wrapper">
+    <div v-loading="contentLoading" class="content-wrapper">
       <div class="content-reportName">
         {{ reportName }}
         <el-button v-if="reportStatus.status === 20" type="text" @click="jump('report_home_Publication', '/monthlyReport/edit', { pageType: 'readAll', reportId: reportStatus.id })"> 月报发布</el-button>
@@ -32,8 +32,8 @@
       <div v-show="reportStatus.status === 10" class="report-bottom">
         <span v-if="tagData.confirmeList || tagData.toBeConfirmList "><i class="el-icon-warning report-icon-warning" /> 已确认业务线<b>{{ tagData.confirmeList || '无' }}</b> ,未确认业务线<b>{{ tagData.toBeConfirmList || '无' }}</b>。 </span>
       </div>
-      <el-row :gutter="12">
-        <el-col v-for="(i, k) in tagData.subReportList" :key="k" :span="innerWidth">
+      <el-row v-if="tagData && tagData.subReportList" :gutter="12">
+        <el-col v-for="(i, k) in tagData.subReportList" :key="k + 'yh'" :span="innerWidth">
           <monthlyEards :datas="i" />
         </el-col>
       </el-row>
@@ -117,6 +117,7 @@ export default {
       },
       reportValue: '', // select value
       reportName: '', // select reportName
+      contentLoading: true,
       rules: {
         reportSettingIds: [{ type: 'array', required: true, message: '请至少选择一个业务线', trigger: 'change' }],
         reportName: [{ required: true, message: '请选择名称', trigger: 'change' }],
@@ -135,16 +136,29 @@ export default {
       const res = await getAvaliableInfo()
       if (res.code === 200) {
         this.reportData = res.data
-        this.reportValue = res.data.reportList[0].id
-        this.reportName = res.data.reportList[0].reportName
-        this.reportStatus = res.data.reportList[0]
+        let index = 0
+        if (this.$route.query.reportId) {
+          res.data.reportList.forEach((elm, elmIndex) => {
+            if (`${elm.id}` === `${this.$route.query.reportId}`) {
+              index = elmIndex
+            }
+          })
+        }
+        console.log(this.$route.query.reportId, index, 146)
+        this.reportValue = res.data.reportList[index].id
+        this.reportName = res.data.reportList[index].reportName
+        this.reportStatus = res.data.reportList[index]
         this.monthlyReportIndex(this.reportValue)
       }
     },
     async monthlyReportIndex(id) {
+      // console.log(id)
       const res = await monthlyReportIndex(id)
       if (res.code === 200) {
         this.tagData = res.data
+        setTimeout(() => {
+          this.contentLoading = false
+        }, 200)
       }
     },
     async createReport() {
@@ -181,6 +195,7 @@ export default {
       this.$router.push({ path: '/monthlyReport/edit', query: { pageType: 'editAll', reportId: this.reportStatus.id }})
     },
     getReportStatus(e) {
+      this.contentLoading = true
       this.monthlyReportIndex(e.id)
       this.reportName = e.reportName
       this.reportValue = e.id

+ 1 - 2
src/views/quality/components/drawerAll.vue

@@ -242,9 +242,8 @@ export default {
       } else if (this.Statistics.title === '缺陷24小时修复') {
         const listData = this.Statistics.yaxis[this.defaultKey]
         this.dataList = listData[this.defaultKey2]
-        console.log(this.defaultKey, this.defaultKey2, this.dataList)
       }
-      if (this.dataList[0]) { // 判断idList有没有数据
+      if (this.dataList && this.dataList[0]) { // 判断idList有没有数据
         this.getTableData(this.dataList)
       } else { // 没有数据初始化table
         this.tableData = []