Sfoglia il codice sorgente

Merge branch 'master' of http://47.100.37.243:10191/wutt/manHourHousekeeper

# Conflicts:
#	fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
QuYueTing 8 mesi fa
parent
commit
f3b0a9fec4

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/GroupBudgetReviewController.java

@@ -234,8 +234,14 @@ public class GroupBudgetReviewController {
             queryWrapper.eq(GroupBudgetReview::getCreatorId,checkUserId);
         }
         List<GroupBudgetReview> list = groupBudgetReviewService.list(queryWrapper);
+        List<Integer> projectIdList=new ArrayList<>();
+        if (!list.isEmpty()) {
+            projectIdList = list.stream().map(GroupBudgetReview::getProjectId).distinct().collect(Collectors.toList());
+        }
+        List<Project> projectList = projectMapper.selectList(new LambdaQueryWrapper<Project>().in(Project::getId, projectIdList).eq(Project::getCompanyId, companyId));
         List<List<String>> dataList=new ArrayList<>();
         List<String> titleList=new ArrayList<>();
+        titleList.add("项目编号");
         titleList.add("项目名称");
         titleList.add("分组名称");
         titleList.add("提交人");
@@ -249,6 +255,16 @@ public class GroupBudgetReviewController {
         dataList.add(titleList);
         for (GroupBudgetReview groupBudgetReview : list) {
             List<String> item=new ArrayList<>();
+            if (!projectList.isEmpty()){
+                Optional<Project> optional = projectList.stream().filter(p -> p.getId().equals(groupBudgetReview.getProjectId())).findFirst();
+                if (optional.isPresent()){
+                    item.add(optional.get().getProjectCode());
+                }else {
+                    item.add("");
+                }
+            }else {
+                item.add("");
+            }
             item.add(groupBudgetReview.getProjectName());
             item.add(groupBudgetReview.getGroupName());
             if((wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1)||(dingding!=null&&dingding.getContactNeedTranslate()==1)){

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml

@@ -148,7 +148,7 @@ referer:
     - mldmobworktime.ttkuaiban.com
     - mldworktime.ttkuaiban.com
     - 47.101.180.183
-excludeUrls: /wxcorp/*,/wxcorp/*/*,/dingding/*,/feishu-info/*,/error,/testClient,/corpWXAuth,/corpWXScanningAuth,/corpInsideWXAuth,/wx-corp-info/*,/clean/*,/innerRoles/*,/project/getProjectListByToken,/project/getTimeCostByToken,/report/getReportListByToken,/report/getProcessErrorData,/project/synchronizationProject,/user/updateUserDeptHierarchy,/report/getUserTimeCostByThird,/report/getProjectTimeCostByThird,/leave-sheet-fv/*
+excludeUrls: /wxcorp/*,/wxcorp/*/*,/dingding/*,/feishu-info/*,/error,/testClient,/corpWXAuth,/corpWXScanningAuth,/corpInsideWXAuth,/wx-corp-info/*,/clean/*,/innerRoles/*,/project/getProjectListByToken,/project/getTimeCostByToken,/report/getReportListByToken,/report/getProcessErrorData,/project/synchronizationProject,/user/updateUserDeptHierarchy,/report/getUserTimeCostByThird,/report/getProjectTimeCostByThird,/leave-sheet-fv/*,/report/getNotFullReportUserList
 
 #企业微信相关参数
 suitId: ww4e237fd6abb635af

+ 1 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/application.yml

@@ -15,7 +15,7 @@ spring:
       location: C:/upload/
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://47.101.180.183:17089/man_workshop_lew_real?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
+    url: jdbc:mysql://47.101.180.183:17089/man_workshop_lew?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
     username: root
     password: P011430@Huoshi*
     hikari:

+ 88 - 88
fhKeeper/formulahousekeeper/timesheet-workshop-h5/package-lock.json

@@ -1817,59 +1817,6 @@
           "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
           "dev": true
         },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true,
-          "optional": true
-        },
-        "emojis-list": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
-          "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
-          "dev": true,
-          "optional": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true,
-          "optional": true
-        },
-        "loader-utils": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
-          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
         "minimist": {
           "version": "1.2.5",
           "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz",
@@ -1899,41 +1846,6 @@
           "requires": {
             "ansi-regex": "^5.0.0"
           }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        },
-        "vue-loader-v16": {
-          "version": "npm:vue-loader@16.8.3",
-          "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
-          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "chalk": "^4.1.0",
-            "hash-sum": "^2.0.0",
-            "loader-utils": "^2.0.0"
-          },
-          "dependencies": {
-            "chalk": {
-              "version": "4.1.2",
-              "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-              "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-              "dev": true,
-              "optional": true,
-              "requires": {
-                "ansi-styles": "^4.1.0",
-                "supports-color": "^7.1.0"
-              }
-            }
-          }
         }
       }
     },
@@ -12200,6 +12112,94 @@
         }
       }
     },
+    "vue-loader-v16": {
+      "version": "npm:vue-loader@16.8.3",
+      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
+      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "chalk": "^4.1.0",
+        "hash-sum": "^2.0.0",
+        "loader-utils": "^2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true,
+          "optional": true
+        },
+        "emojis-list": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+          "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+          "dev": true,
+          "optional": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "loader-utils": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
     "vue-router": {
       "version": "3.5.1",
       "resolved": "https://registry.npm.taobao.org/vue-router/download/vue-router-3.5.1.tgz?cache=0&sync_timestamp=1617697843139&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-router%2Fdownload%2Fvue-router-3.5.1.tgz",

+ 10 - 10
fhKeeper/formulahousekeeper/timesheet/config/index.js

@@ -1,20 +1,20 @@
 var path = require('path')
 
 //  var ip = '192.168.2.12'
-var ip = '47.101.180.183'
+// var ip = '47.101.180.183'
 // var ip = '47.100.37.243'
 // var ip = '192.168.10.2'
 // var ip = '192.168.2.8' 
 
-// var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
-// for (var i in ifaces) {
-//     for (var j in ifaces[i]) {
-//         var val = ifaces[i][j]
-//         if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
-//             ip = val.address
-//         }
-//     }
-// }
+var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip
+for (var i in ifaces) {
+    for (var j in ifaces[i]) {
+        var val = ifaces[i][j]
+        if (val.family === 'IPv4' && val.address !== '127.0.0.1') {
+            ip = val.address
+        }
+    }
+}
 // 1196735749
 module.exports = {
   build: {

File diff suppressed because it is too large
+ 1147 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/contract/components/contractManagement.vue


File diff suppressed because it is too large
+ 1334 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/contract/components/customContract.vue


File diff suppressed because it is too large
+ 23 - 1135
fhKeeper/formulahousekeeper/timesheet/src/views/contract/index.vue


+ 19 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -135,9 +135,10 @@
                                 </span>
                                 <span style="float:right;">
                                     <el-link type="primary" v-if="user.timeType.enableNewWeeklyfill != 1" style="margin-right:10px;" :underline="false" @click="isSubstitude=false;fillInReport(-1,0)">{{$t('textLink.fillInTheWork')}}</el-link>
-                                    <el-link v-if="reportTimeType.type != 0 && user.companyId != yuzhongCompId && user.timeType.enableNewWeeklyfill != 1 && user.companyId != 3092" type="primary" style="margin-right:10px;" :underline="false" @click="isSubstitude=false;fillInReportss()">{{$t('textLink.fillInAWeek')}}</el-link>
+                                    <el-link v-if="reportTimeType.type != 0 && user.companyId != yuzhongCompId && user.timeType.enableNewWeeklyfill != 1 && user.companyId != 3092 && user.timeType.enableNewWeeklyfill != 2" type="primary" style="margin-right:10px;" :underline="false" @click="isSubstitude=false;fillInReportss()">{{$t('textLink.fillInAWeek')}}</el-link>
                                     <el-link v-if="user.timeType.enableNewWeeklyfill == 1" type="primary" style="margin-right:10px;" :underline="false" @click="isSubstitude=false;fillInReportCustom()">{{ $t('textLink.fillInAWeek') }}</el-link>
-                                    <!-- <el-link type="primary" style="margin-right:10px;" :underline="false" @click="isSubstitude=false;fillInReportCustom()">按周填报</el-link> -->
+                                    <!-- <el-link type="primary" style="margin-right:10px;" :underline="false" @click="isSubstitude=false;fillInReportCustom()">按周填报123</el-link> -->
+                                    <el-link type="primary" style="margin-right:10px;" :underline="false" @click="isSubstitude=false;weekIndex++,fillWeekDialogVisiCustomTwo=true" v-if="user.timeType.enableNewWeeklyfill==2">按周填报</el-link>
                                     <el-link type="primary" v-if="user.companyId != 5978 && permissions.reportsFillOut && user.timeType.enableNewWeeklyfill != 1" style="margin-right:10px;" :underline="false" @click="isSubstitude=true; fillInReport(-1,2)">{{$t('textLink.helpToFillIn')}}</el-link>
                                     <!-- 苏州景昱,按周填报的模式进行代填日报 -->
                                     <el-link type="primary" v-if="user.companyId == 5978 && permissions.reportsFillOut && user.timeType.enableNewWeeklyfill != 1" style="margin-right:10px;" :underline="false" @click="isSubstitude=true; fillInReportss();">{{$t('textLink.helpToFillIn')}}</el-link>
@@ -1063,6 +1064,13 @@
             </div>
         </el-dialog>
 
+        <!-- enableNewWeeklyfill==2 -->
+        <el-dialog :title="$t('textLink.fillInAWeek')" class="fillWeekCustom" :visible.sync="fillWeekDialogVisiCustomTwo" width="1400px" :before-close="handleClose" top="7.5vh">
+            <div class="fillWeekDialogVisiCustom">
+                <NewWeeklyCustomization @weekClose="fillWeekCustomClneTwo" @weekSubmit="fillWeekCustomSubmit" :key="weekIndex" :weekParentData="weekParentData"></NewWeeklyCustomization>
+            </div>
+        </el-dialog>
+
         <!-- 选择时间 -->
         <el-dialog :title="$t('other.timeSelection')" :visible.sync="btnZho" width="30%" :before-close="handleClose">
             <span>{{$t('other.thisIsAPieceOfInformation')}}</span>
@@ -2190,6 +2198,9 @@
 
     // 威派格定制转移工时
     import TransferWorkingHours from "./transferWorkingHours.vue"
+
+    // 新的按周填报
+    import NewWeeklyCustomization from "./newWeeklyCustomization.vue"
     
     import { mapMutations } from 'vuex'
     let _that = this
@@ -2200,7 +2211,8 @@
             vueCascader,
             WeeklyCustomization,
             vueMultipleDept,
-            TransferWorkingHours
+            TransferWorkingHours,
+            NewWeeklyCustomization
         },
         data() {
             return {
@@ -2409,6 +2421,7 @@
                 isSubstiS: false,
                 fillWeekDialogVisi: false,
                 fillWeekDialogVisiCustom: false,
+                fillWeekDialogVisiCustomTwo: false,
                 zhoData: [],
                 weekDateRange: [],
                 btnZho: false,
@@ -8711,6 +8724,9 @@
             fillWeekCustomClne() {
                 this.fillWeekDialogVisiCustom = false
             },
+            fillWeekCustomClneTwo() {
+                this.fillWeekDialogVisiCustomTwo = false
+            },
             fillWeekCustomSubmit() {
                 this.getReportList();
                 this.getDepartment();

+ 430 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/newWeeklyCustomization.vue

@@ -0,0 +1,430 @@
+<template>
+    <div class='weeklyCustomization'>
+        <div class="title">
+            <el-button @click="getCurrentWeek(-7)" size="small">&lt;&lt;</el-button>
+            <el-button @click="getCurrentWeek(0)" size="small">{{ $t('time.thisWeek') }}</el-button>
+            <el-button @click="getCurrentWeek(7)" size="small">&gt;&gt;</el-button>
+        </div>
+        <div class="weekcen flexColumn" v-loading="submitLoading">
+            <div class="flexColumnAuto flex1">
+                <el-table :data="weekTableData" border style="width: 100%;" height="0" :span-method="arraySpanMethod">
+                    <el-table-column prop="dateTime" :label="$t('weekDay.date')" width="180">
+                        <template slot-scope="scope">
+                            <span>{{ scope.row.dateTime }}</span>
+                            (<span>{{ scope.row.weekDayTxt }}</span>)
+                        </template>
+                    </el-table-column>
+                    <el-table-column :label="$t('other.project')" width="220">
+                        <template slot-scope="scope">
+                            <el-select v-model="scope.row.projectId" size="small" :placeholder="$t('defaultText.pleaseSelectSnItem')" clearable
+                                @change="changeProject(scope.row.projectId, scope.$index)"
+                                :disabled="scope.row.state == 1 || scope.row.state == 0 || !scope.row.canFill">
+                                <el-option v-for="item in projectList" :key="item.id" :label="item.projectName"
+                                    :value="item.id">
+                                </el-option>
+                            </el-select>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="content" :label="$t('gongZuoNeiRong')">
+                        <template slot-scope="scope">
+                            <el-input size="small" type="textarea" :rows="2" v-model="scope.row.content"
+                                :disabled="scope.row.state == 1 || scope.row.state == 0 || !scope.row.canFill"
+                                resize="none"></el-input>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="workingTime" :label="$t('shiJianXiaoShi')" width="160">
+                        <template slot-scope="scope">
+                            <el-input-number size="small" v-model="scope.row.workingTime" :min="0" :max="12" :step="0.5"
+                                :disabled="scope.row.state == 1 || scope.row.state == 0 || !scope.row.canFill"></el-input-number>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="state" :label="$t('state.states')" width="140" fixed="right">
+                        <template slot-scope="scope">
+                            <div class="controls">
+                                <el-tag v-if="scope.row.state == 0" type="warning">{{ $t('daiShen') }}</el-tag>
+                                <el-tag v-if="scope.row.state == 1" type="success">{{ $t('btn.through') }}</el-tag>
+                                <el-tag v-if="scope.row.state == 2" type="danger">{{ $t('juJue') }}</el-tag>
+                                <span v-if="scope.row.state != 1 && scope.row.canFill">
+                                    <el-link type="primary" :underline="false" class="el-icon-circle-plus-outline"
+                                        @click="insertRow(scope.$index)"></el-link>
+                                    <el-link type="primary" :underline="false" class="el-icon-delete"
+                                        @click="deleteRow(scope.$index)" v-if="!scope.row.isDelete"></el-link>
+                                </span>
+                            </div>
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </div>
+            <div class="weeklyCustomization_btn">
+                <el-button @click="handleClose()">{{ $t('quXiao') }}</el-button>
+                <el-button @click="submitWeekData(1)">{{ $t('zanCun') }}</el-button>
+                <el-button type="primary" @click="submitWeekData(0)">{{ $t('tiJiao') }}</el-button>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+import cloneDeep from 'lodash/cloneDeep'; // 深拷贝
+export default {
+    name: '',
+    components: {},
+    props: {
+        weekParentData: {
+            type: Object,
+            default: () => {
+                return {}
+            }
+        },
+    },
+    data() {
+        return {
+            summaryContent: null,
+            weekTableData: [],
+            projectList: [],
+            nowTime: this.dayjs().format('YYYY-MM-DD'),
+            submitLoading: false,
+            permissions: JSON.parse(sessionStorage.getItem("permissions")),
+            user: JSON.parse(sessionStorage.getItem("user")),
+        }
+    },
+    computed: {},
+    watch: {},
+    created() { },
+    mounted() {
+        this.$set(this, 'weekTableData', [])
+        this.getCurrentWeek(0)
+        this.getProjectList()
+    },
+    methods: {
+        // 提交与暂存
+        submitWeekData(draft) { // draft 暂存(1)提交(0)
+            const newWeekData = cloneDeep(this.weekTableData)
+
+            let strArr = this.judgmentData(newWeekData)
+            const { allday } = this.user.timeType // 系统设置的每日工作时间
+            if (strArr.length > 0) {
+                this.$message({
+                    message: `【${strArr.join('、')}】`+this.$t('tianXieGongShiHeJiFei')+` ${allday}`+ this.$t('time.hour'),
+                    type: "error"
+                });
+                return
+            }
+
+            let formData = new FormData();
+            formData.append("draft", draft);
+            formData.append('summary', this.summaryContent);
+            let fixation = {
+                id: -1,
+                projectId: '',
+                subProjectId: 0,
+                taskId: 0,
+                reportTimeType: 1,
+                workingTime: 0,
+                multiWorktime: 0,
+                content: '',
+                isOvertime: 0,
+                createDate: '',
+                basecostId: 0,
+                degreeId: -1,
+                customData: 0,
+                customText: '-',
+            }
+
+            let arr = newWeekData
+                .filter(data => data.projectId)
+                .map(data => ({
+                    ...fixation,
+                    projectId: data.projectId,
+                    createDate: data.dateTime,
+                    content: data.content ? data.content : '',
+                    projectAuditorId: data.projectAuditorId,
+                    workingTime: data.workingTime,
+                    groupId: data.groupId,
+                    id: data.id || -1,
+                }));
+
+            arr.forEach(item => { 
+                delete item.groupId
+            })
+                
+            arr.forEach(item => {
+                Object.entries(item).forEach(([key, value]) => {
+                    formData.append(key, value);
+                });
+            });
+
+            this.submitLoading = true
+            this.http.uploadFile(this.port.report.editPort, formData,
+                res => {
+                    this.submitLoading = false
+                    if (res.code == "ok") {
+                        this.$message({
+                            message: `${draft ? this.$t('message.Temporarysuccess') : this.$t('message.submittedSuccessfully')}`,
+                            type: "success"
+                        });
+                        this.$emit('weekClose')
+                        this.$emit('weekSubmit')
+                    } else {
+                        this.$message({
+                            message: `${draft ? this.$t('zanCunShiBai') : this.$t('tiJiaoShiBai')}` + res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.submitLoading = false
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+        },
+        // 判断是否小于系统设置的每日工作时间
+        judgmentData(data) {
+            const { allday } = this.user.timeType // 系统设置的每日工作时间
+            console.log(allday, '<======= 填写日报时长allday')
+            const result = [];
+            data.forEach((item) => {
+                const date = item.dateTime;
+                const index = result.findIndex((arr) => arr[0].dateTime === date);
+
+                if (index === -1) {
+                    result.push([item]);
+                } else {
+                    result[index].push(item);
+                }
+            });
+
+            const strArr = result
+                .filter((arr) => arr[0].projectId)
+                .filter(
+                    (arr) => arr.reduce((sum, item) => sum + (+item.workingTime || 0), 0) != allday
+                )
+                .map((arr) => arr[0].dateTime);
+
+            return strArr
+        },
+        // 项目切换事件
+        changeProject(projectId, index) {
+            this.$set(this.weekTableData[index], 'projectAuditorId', '')
+            this.$set(this.weekTableData[index], 'projectAuditorName', '')
+            this.$set(this.weekTableData[index], 'groupId', '')
+            // if (projectId) {
+            //     this.getProjectGroup(projectId, index)
+            // }
+        },
+        // 分组切换事件
+        changeGroup(groupId, groupList, index) {
+            let newArr = groupList.filter(item => item.id == groupId)
+            if (!newArr[0].inchargerId) {
+                this.$message({
+                    message: `【${newArr[0].name}】`+this.$t('fenZuWeiSheZhiShenPiRenQingLianXiGaiXiangMuGuanLiRenYuan'),
+                    type: "error"
+                });
+                return
+            }
+            this.$set(this.weekTableData[index], 'projectAuditorId', newArr[0].inchargerId)
+            this.$set(this.weekTableData[index], 'projectAuditorName', newArr[0].inchargerName)
+        },
+        // 获取周数据
+        async getCurrentWeek(time) {
+            if (!time) {
+                this.nowTime = this.dayjs().format('YYYY-MM-DD')
+            } else {
+                this.nowTime = this.dayjs(this.nowTime).add(time, 'day').format('YYYY-MM-DD')
+            }
+            let { data } = await this.getData('/report/getWeeklyFillReportData', { targetDate: this.nowTime })
+            console.log(JSON.parse(JSON.stringify(data)), '<===== 处理之前的')
+            this.summaryContent = data.summary;
+            data.dateList.forEach(dateItem => {
+                const reportList = dateItem.reportList;
+                reportList.forEach(report => {
+                    const { state, taskGroups } = report;
+                    console.log(state, taskGroups);
+                    if(state != 1 && state != 0 && taskGroups && taskGroups.length > 0) {
+                        console.log('执行');
+                        report.projectAuditorId = taskGroups[0].inchargerId;
+                        report.projectAuditorName = taskGroups[0].inchargerName;
+                    }
+                    if(state == 1 && state == 0 && taskGroups && taskGroups.length > 0) {
+                        taskGroups[0].inchargerId = report.projectAuditorId;
+                        taskGroups[0].inchargerName = report.projectAuditorName;
+                    }
+                });
+            });
+            console.log(data, '<===== 处理之后的')
+            const { dateList, projectList, sumTimeList, cardTimeList } = data;
+            const weekTableData = dateList.flatMap(date => {
+                const { weekDayTxt, date: dateTime, reportList, canFill } = date;
+                const reports = reportList.map(report => ({ ...report, weekDayTxt, dateTime, canFill }));
+                return reports.length > 0 ? reports : [{ weekDayTxt, dateTime, canFill }];
+            });
+            let sumSet = new Set();
+            weekTableData.forEach(obj => {
+                obj.isDelete = sumSet.has(obj.dateTime) ? false : true;
+                sumSet.add(obj.dateTime);
+            });
+            this.weekTableData = weekTableData;
+            console.log(weekTableData, '<========== weekTableData')
+        },
+        // 获取项目列表
+        async getProjectList() {
+            let { data } = await this.getData('/project/getProjectList', { forReport: 1 })
+            this.projectList = data
+        },
+        // 获取项目下的分组
+        // async getProjectGroup(projectId, index) {
+        //     const { isSubstitude } = this.weekParentData;
+        //     let { data } = await this.getData('/task-group/listProjectGroupAndAuditor', { projectId, isSubstitude: isSubstitude ? 1 : 0 })
+        //     if (data.length == 0) {
+        //         this.$message({
+        //             message: this.$t('fenZuWeiSheZhiQingLianXiGaiXiangMuGuanLiRenYuan'),
+        //             type: "error"
+        //         });
+        //     } else if (data.length == 1) {
+        //         this.$set(this.weekTableData[index], 'groupId', data[0].id)
+        //         this.$set(this.weekTableData[index], 'projectAuditorId', data[0].inchargerId)
+        //         this.$set(this.weekTableData[index], 'projectAuditorName', data[0].inchargerName)
+        //         if (!data[0].inchargerId) {
+        //             this.$message({
+        //                 message: `【${data[0].name}】`+this.$t('fenZuWeiSheZhiShenPiRenQingLianXiGaiXiangMuGuanLiRenYuan'),
+        //                 type: "error"
+        //             });
+        //         }
+        //     }
+        //     this.$set(this.weekTableData[index], 'taskGroups', data)
+        // },
+        // 插入一行
+        insertRow(index) {
+            this.weekTableData.splice(index + 1, 0, {
+                dateTime: this.weekTableData[index].dateTime,
+                weekDayTxt: this.weekTableData[index].weekDayTxt,
+                content: '',
+                workingTime: 0,
+                projectId: '',
+                projectAuditorId: '',
+                projectAuditorName: '',
+                groupId: '',
+                groupList: [],
+                approverList: [],
+                canFill: 1,
+                isDelete: false
+            })
+        },
+        // 删除一行
+        deleteRow(index) {
+            this.weekTableData.splice(index, 1)
+        },
+        // 合并单元格
+        arraySpanMethod({ row, column, rowIndex, columnIndex }) {
+            let spanOneArr = [], concatOne = 0;
+            this.weekTableData.map((item, index) => {
+                if (index === 0) {
+                    spanOneArr.push(1);
+                } else {
+                    if (item.dateTime === this.weekTableData[index - 1].dateTime) {
+                        spanOneArr[concatOne] += 1;
+                        spanOneArr.push(0);
+                    } else {
+                        spanOneArr.push(1);
+                        concatOne = index;
+                    };
+                }
+            });
+
+            if (columnIndex === 0) {
+                const _row = spanOneArr[rowIndex];
+                const _col = _row > 0 ? 1 : 0;
+                return {
+                    rowspan: _row,
+                    colspan: _col
+                }
+            }
+        },
+        // 回显审批人名字
+        auditorNameFun(item) {
+            const { groupId, taskGroups } = item;
+
+            if (groupId) {
+                const newArr = taskGroups.filter(v => v.id === groupId);
+                return newArr.length > 0 ? newArr[0].inchargerName : '';
+            }
+
+            return '';
+        },
+        // post 方法请求二次封装
+        async getData(url, param) {
+            return new Promise((resolve, reject) => {
+                this.http.post(url, param,
+                    res => {
+                        resolve(res)
+                    },
+                    error => {
+                        this.$message({
+                            message: error,
+                            type: "error"
+                        });
+                        reject(error)
+                    }
+                )
+            });
+        },
+        // 关闭弹窗
+        handleClose() {
+            this.$emit('weekClose')
+        },
+    },
+}
+</script>
+<style scoped lang='scss'>
+.flexColumn {
+    display: flex;
+    flex-direction: column;
+}
+
+.flexColumnAuto {
+    display: flex;
+    flex-direction: column;
+    overflow: auto;
+}
+
+.flex1 {
+    flex: 1;
+    overflow-y: auto;
+}
+
+.weeklyCustomization {
+    width: 100%;
+    height: 100%;
+
+    .title {
+        position: absolute;
+        top: 16px;
+        left: 140px;
+    }
+
+    .weekcen {
+        width: 100%;
+        height: 100%;
+    }
+
+    .weeklyCustomization_btn {
+        display: flex;
+        justify-content: flex-end;
+        padding-top: 10px;
+    }
+
+    .controls {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        width: 100%;
+
+        .el-link {
+            font-size: 18px;
+            margin-right: 5px;
+        }
+    }
+}
+</style>

+ 146 - 90
fhKeeper/formulahousekeeper/timesheet_h5/package-lock.json

@@ -1817,6 +1817,59 @@
           "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
           "dev": true
         },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true,
+          "optional": true
+        },
+        "emojis-list": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+          "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+          "dev": true,
+          "optional": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "loader-utils": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
         "minimist": {
           "version": "1.2.5",
           "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz",
@@ -1846,6 +1899,41 @@
           "requires": {
             "ansi-regex": "^5.0.0"
           }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "vue-loader-v16": {
+          "version": "npm:vue-loader@16.8.3",
+          "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
+          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chalk": "^4.1.0",
+            "hash-sum": "^2.0.0",
+            "loader-utils": "^2.0.0"
+          },
+          "dependencies": {
+            "chalk": {
+              "version": "4.1.2",
+              "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+              "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+              "dev": true,
+              "optional": true,
+              "requires": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+              }
+            }
+          }
         }
       }
     },
@@ -2419,6 +2507,14 @@
       "integrity": "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=",
       "dev": true
     },
+    "async-validator": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz",
+      "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
+      "requires": {
+        "babel-runtime": "6.x"
+      }
+    },
     "asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz",
@@ -2565,6 +2661,11 @@
         "resolve": "^1.12.0"
       }
     },
+    "babel-helper-vue-jsx-merge-props": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
+      "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
+    },
     "babel-loader": {
       "version": "8.2.2",
       "resolved": "https://registry.npm.taobao.org/babel-loader/download/babel-loader-8.2.2.tgz?cache=0&sync_timestamp=1606424647115&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-loader%2Fdownload%2Fbabel-loader-8.2.2.tgz",
@@ -2674,6 +2775,22 @@
         "@babel/helper-define-polyfill-provider": "^0.2.0"
       }
     },
+    "babel-runtime": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+      "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
+      "requires": {
+        "core-js": "^2.4.0",
+        "regenerator-runtime": "^0.11.0"
+      },
+      "dependencies": {
+        "regenerator-runtime": {
+          "version": "0.11.1",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+          "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+        }
+      }
+    },
     "balanced-match": {
       "version": "1.0.0",
       "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz",
@@ -4389,8 +4506,7 @@
     "deepmerge": {
       "version": "1.5.2",
       "resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.2.tgz?cache=0&sync_timestamp=1612354180346&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdeepmerge%2Fdownload%2Fdeepmerge-1.5.2.tgz",
-      "integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M=",
-      "dev": true
+      "integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M="
     },
     "default-gateway": {
       "version": "5.0.5",
@@ -4839,6 +4955,19 @@
       "integrity": "sha1-hX4xDKAPC3XaTh22/w4HPMSpHd8=",
       "dev": true
     },
+    "element-ui": {
+      "version": "2.15.14",
+      "resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.15.14.tgz",
+      "integrity": "sha512-2v9fHL0ZGINotOlRIAJD5YuVB8V7WKxrE9Qy7dXhRipa035+kF7WuU/z+tEmLVPBcJ0zt8mOu1DKpWcVzBK8IA==",
+      "requires": {
+        "async-validator": "~1.8.1",
+        "babel-helper-vue-jsx-merge-props": "^2.0.0",
+        "deepmerge": "^1.2.0",
+        "normalize-wheel": "^1.0.1",
+        "resize-observer-polyfill": "^1.5.0",
+        "throttle-debounce": "^1.0.1"
+      }
+    },
     "elliptic": {
       "version": "6.5.4",
       "resolved": "https://registry.nlark.com/elliptic/download/elliptic-6.5.4.tgz",
@@ -8159,6 +8288,11 @@
       "integrity": "sha1-suHE3E98bVd0PfczpPWXjRhlBVk=",
       "dev": true
     },
+    "normalize-wheel": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
+      "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA=="
+    },
     "npm-run-path": {
       "version": "2.0.2",
       "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz",
@@ -10130,6 +10264,11 @@
       "integrity": "sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=",
       "dev": true
     },
+    "resize-observer-polyfill": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+      "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+    },
     "resolve": {
       "version": "1.20.0",
       "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.20.0.tgz",
@@ -11420,6 +11559,11 @@
         "neo-async": "^2.6.0"
       }
     },
+    "throttle-debounce": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
+      "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg=="
+    },
     "through": {
       "version": "2.3.8",
       "resolved": "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz",
@@ -12024,94 +12168,6 @@
         }
       }
     },
-    "vue-loader-v16": {
-      "version": "npm:vue-loader@16.8.3",
-      "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
-      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "chalk": "^4.1.0",
-        "hash-sum": "^2.0.0",
-        "loader-utils": "^2.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true,
-          "optional": true
-        },
-        "emojis-list": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz",
-          "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
-          "dev": true,
-          "optional": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true,
-          "optional": true
-        },
-        "loader-utils": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
-          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
     "vue-router": {
       "version": "3.5.1",
       "resolved": "https://registry.npm.taobao.org/vue-router/download/vue-router-3.5.1.tgz?cache=0&sync_timestamp=1617697843139&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-router%2Fdownload%2Fvue-router-3.5.1.tgz",