Bladeren bron

Merge branch 'V0.0.2' of http://10.87.10.227:4000/jzyd_yyds/soc_app into V0.0.2

coys 2 jaren geleden
bovenliggende
commit
7ebe82e4ec

+ 16 - 0
src/api/public.js

@@ -126,3 +126,19 @@ export function upload(data,type) {
   })
 }
 
+// 机构树
+export function deptTreeSelect(removeId) {
+  return request({
+    url: '/system/dept/deptTree',
+    method: 'get',
+    params:removeId
+  })
+}
+
+//行社机构树
+export function handsheDeptTreeSelect() {
+  return request({
+    url: '/system/dept/deptTree/hangshe',
+    method: 'get'
+  })
+}

+ 4 - 0
src/assets/css/index.scss

@@ -19,3 +19,7 @@ body .app {
   height: 223px;
   width: 223px;
 }
+
+.van-field__error-message{
+  display: none;
+}

+ 1 - 0
src/components/layouts/index.vue

@@ -60,6 +60,7 @@ export default {
         this.$store.commit('SET_USER_ORGID',info.user.orgId);
         this.$store.commit('SET_USER_ORGNAME',info.user.orgName);
       })
+      this.$store.dispatch('getOrgTree')
     },
     handleChange(v) {
       console.log('tab value:', v)

+ 5 - 19
src/components/orgTree/index.vue

@@ -3,7 +3,7 @@
     <tree-select
       @select="onSelect"
       v-model="selected"
-      :options="treeData"
+      :options="orgTree"
       :clearable="false"
       :backspaceRemoves="false"
       placeholder="请选择归属机构"
@@ -16,7 +16,7 @@
 <script>
 import TreeSelect from '@riophae/vue-treeselect'
 import '@riophae/vue-treeselect/dist/vue-treeselect.css'
-import { deptTreeList } from '@/api/public'
+import {mapGetters} from "vuex";
 export default {
   components: {
     TreeSelect
@@ -33,9 +33,8 @@ export default {
       selected: null,
     }
   },
-  created() {
-    this.getTreeList();
-
+  computed: {
+    ...mapGetters(['orgTree'])
   },
   watch: {
     value: {
@@ -43,9 +42,7 @@ export default {
         if(!val){
           this.selected = null
         }else {
-         
-            this.selected = this.value
-         
+          this.selected = this.value
         }
       },
     },
@@ -62,19 +59,8 @@ export default {
         children: node.children
       }
     },
-    //获取机构树
-    getTreeList() {
-      deptTreeList(this.orgId).then(res => {
-        this.$nextTick(() => {
-          this.treeData = res.data
-          this.$emit('getTree')
-        })
-
-      })
-    },
     onSelect(value) {
       this.$emit('change', value.id)
-      this.$emit('changeItem', value)
     }
   },
   model: {

+ 1 - 1
src/components/selectCell/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="date-cell">
     <van-cell v-if="disabled" :required="required" :title="title" :label="label"/>
-    <van-cell v-else :required="required" :title="title" :label="label" is-link  @click="clickItem"/>
+    <van-cell :required="required" :title="title" :label="label" is-link  @click="clickItem"/>
     <van-popup v-model="showPicker" round lazy-render position="bottom" :close-on-popstate="true" get-container="#app">
       <van-picker
         v-bind="$attrs"

+ 2 - 1
src/store/getters.js

@@ -3,7 +3,8 @@ const getters = {
   id: state => state.user.id,
   orgId: state => state.user.orgId,
   orgName: state => state.user.orgName,
-  roleList: state => state.user.userRoleList
+  roleList: state => state.user.userRoleList,
+  orgTree: state => state.app.orgTree,
 }
 
 export default getters

+ 4 - 1
src/store/index.js

@@ -2,12 +2,15 @@ import Vue from 'vue'
 import Vuex from 'vuex'
 import getters from './getters'
 import user from './modules/user'
+import app from './modules/app'
+
 
 Vue.use(Vuex)
 
 const store = new Vuex.Store({
   modules: {
-    user
+    user,
+    app
   },
   getters
 })

+ 34 - 0
src/store/modules/app.js

@@ -1,3 +1,4 @@
+import { deptTreeSelect, handsheDeptTreeSelect } from '@/api/public'
 const state = {
   //用户名
   userName: null,
@@ -7,13 +8,46 @@ const state = {
   id:null,
   //机构名称
   orgName:null,
+  //用户机构树
+  orgTree: [],
+  //行社机构树
+  depTree: [],
 }
 const mutations = {
   SET_USER_NAME(state, name) {
     state.userName = name;
   },
+  SET_ORGTREE: (state, val) => {
+    state.orgTree = val
+  },
+  SET_DEPTREE: (state, val) => {
+    state.depTree = val
+  }
 }
 const actions = {
+  //获取用户机构树
+  getOrgTree({ commit, state }){
+    return new Promise((resolve, reject) => {
+      deptTreeSelect().then(res => {
+        commit('SET_ORGTREE', res.data)
+        resolve(res)
+      }).catch(error => {
+        reject(error)
+      })
+    })
+  },
+
+  //获取行社机构树
+  getDepTree({ commit, state }){
+    return new Promise((resolve, reject) => {
+      handsheDeptTreeSelect().then(res => {
+        commit('SET_DEPTREE', res.data)
+        resolve(res)
+      }).catch(error => {
+        reject(error)
+      })
+    })
+  },
   // 设置name
   // setUserName({ commit }, name) {
   //   commit('SET_USER_INFO', name)

+ 80 - 20
src/views/menu/LZRegister/edit.vue

@@ -54,7 +54,11 @@
 
             </van-cell>
             <van-cell v-show="nfcImage.length > 0" :border="false" >
-              <img class="nfc-img" v-for="(v,i) in selectArea.nfclist" v-if="v.img" :src="imgUrl(v.img)" alt="" :key="v.img">
+              <div v-if="v.img" class="nfc-img" v-for="v in nfcImage" :key="v.img">
+                <img :src="imgUrl(v.img)" alt="" >
+                <span>{{v.checkName}}</span>
+              </div>
+<!--              <img class="nfc-img" v-for="(v,i) in selectArea.nfclist" v-if="v.img" :src="imgUrl(v.img)" alt="" :key="v.img">-->
             </van-cell>
           </div>
         </van-panel>
@@ -104,16 +108,24 @@
                   <template #right-icon>
                     <van-switch
                       v-if="enable"
+                      style="margin-left: 10px;"
                       v-model="item.resvalue"
                       :active-value="1"
                       :inactive-value="0"
                       inactive-color="#4fc08d"
-                      active-color="orange"
+                      active-color="#ee0a24"
                       @change="switchChange(item)"
                       size="20" />
+                    <span v-else>
+<!--                      <van-icon  v-if="item.resvalue" name="success" color="#07c160" />-->
+<!--                      <van-icon v-else name="fail" color="#ee0a24"/>-->
+                      <van-tag v-if="item.resvalue" type="warning">隐患</van-tag>
+                      <van-tag v-else type="success">正常</van-tag>
+                    </span>
                   </template>
                 </van-cell>
                 <van-cell-group v-show="item.resvalue">
+                  <select-cell required :disabled="!enable" title="整改期限" v-model="item.rectificationDeadline"  :dict="'rectification_deadline'" />
                   <van-field
                     required
                     v-model="item.resremark"
@@ -125,10 +137,13 @@
                   <div class="upload-box" >
                     <uploader :maxCount="5" v-if="enable" v-model="item.imgData"/>
                     <van-cell v-else>
-                      <img class="nfc-img" v-for="v in item.imgData" :src="imgUrl(v.imgPath)" alt="" :key="v.id">
+                      <div class="nfc-img van-hairline--surround" v-for="v in item.imgData" :key="v.id">
+                        <img :src="imgUrl(v.imgPath)" alt="" >
+                        <span>{{v.checkName}}</span>
+                      </div>
+<!--                      <img class="nfc-img" v-for="v in item.imgData" :src="imgUrl(v.imgPath)" alt="" :key="v.id">-->
                     </van-cell>
                   </div>
-                  <select-cell required :disabled="!enable" title="整改期限" v-model="item.rectificationDeadline"  :dict="'rectification_deadline'" />
                 </van-cell-group>
                 <date-cell
                   :disabled="!enable"
@@ -237,8 +252,13 @@ export default {
     //保存数据
     saveData(){
       let pointdata = [];
+      let checkNFC = [];
       this.areaList.forEach(area=>{
-        console.log(area,'area')
+        area.nfclist.forEach(v=>{
+          if(v.status === 1){
+            checkNFC.push(v)
+          }
+        })
         area.checklist.forEach(item=>{
          item.checkitemlist.forEach(checkItem=>{
             checkItem.protections = checkItem.protectionVo;
@@ -251,24 +271,25 @@ export default {
             checkItem.resumptionId = this.$route.query.id;
             pointdata.push(checkItem);
           })
-
         })
       });
       //验证必填项
-      pointdata.every(v=>{
-        if(v.resvalue === 1){
+      let arr = pointdata.filter(v=>{
+        if(v.resvalue === 1 ){
           console.log(v,'验证')
-          if(!v.resremark) this.$toast('请填写情况描述');
-          if(!v.rectificationDeadline) this.$toast('请选择整改期限');
+          return !v.resremark || !v.rectificationDeadline
         }
       })
+      if(arr.length) return this.$toast(`${arr[0].areaname}-${arr[0].itemname}:信息不完整请填写`);
+
+      console.log(this.nfcImage,'this.nfcImage')
       let data = {
         dateTime:new Date(),
         isSubmit:0,
         resumptionId:this.$route.query.id,
         year: this.taskInfo.year,
         quarter: this.taskInfo.quarter,
-        nfcData:this.nfcImage,
+        nfcData:checkNFC,
         pointdata,
       }
       saveTaskData(data).then(res=>{
@@ -293,6 +314,7 @@ export default {
     },
     //选中区域时数据变更
     activeArea(area,index){
+      //设置选中样式
       this.$nextTick(()=>{
         let doms = document.getElementsByClassName('check-area');
         console.log(doms,'doms')
@@ -301,10 +323,14 @@ export default {
         })
         doms[index].classList.add('active');
       })
+      //获取当前选中区域
       this.selectArea = area;
+      //获取当前区域检查项列表
       this.checkList = area.checklist;
       //设置默认展开项
       this.activeNames = this.checkList.map(v=>v.itemname);
+      //清空nfc图片
+      this.nfcImage = [];
       //回显nfc图片
       area.nfclist.forEach( v =>{
         if(v.img){
@@ -339,7 +365,13 @@ export default {
     //提交数据
     submitData(){
       let pointdata = [];
+      let checkNFC = [];
       this.areaList.forEach(area=>{
+        area.nfclist.forEach(v=>{
+          if(v.status === 1){
+            checkNFC.push(v)
+          }
+        })
         area.checklist.forEach(item=>{
           item.checkitemlist.forEach(checkItem=>{
             checkItem.protections = checkItem.protectionVo;
@@ -355,21 +387,23 @@ export default {
 
         })
       })
+
       //验证必填项
-      pointdata.forEach(v=>{
-        if(v.resvalue === 1){
-          if(!v.resremark) return this.$toast('请填写情况描述');
-          if(!v.rectificationDeadline) return this.$toast('请选择整改期限');
+      let arr = pointdata.filter(v=>{
+        if(v.resvalue === 1 ){
+          console.log(v,'验证')
+          return !v.resremark || !v.rectificationDeadline
         }
       })
-      console.log(pointdata,'pointdata')
+      if(arr.length) return this.$toast(`${arr[0].areaname}-${arr[0].itemname}:信息不完整请填写`);
+
       let data = {
         dateTime:new Date(),
         isSubmit:1,
         resumptionId:this.$route.query.id,
         year: this.taskInfo.year,
         quarter: this.taskInfo.quarter,
-        nfcData:[],
+        nfcData:checkNFC,
         pointdata,
       }
       saveTaskData(data).then(res=>{
@@ -409,10 +443,12 @@ export default {
     },
     //添加图片时的回调
     changeNfcImg(imgItem){
-      console.log(imgItem,'imgItem')
+      console.log(imgItem,this.selectArea.nfclist,'imgItem')
       this.selectArea.nfclist.forEach(v=>{
         if(v.nfccdoe === imgItem.nfcCode){
           v.img = imgItem.url;
+          v.status = 1;
+          v.scanMethod = 1;
           this.nfcImage.push(v);
         }
       })
@@ -478,7 +514,31 @@ export default {
     background-color: #1989fa;
   }
   .nfc-img{
-    width: 160px;
-    height: 160px;
+    display: inline-block;
+    width: 140px;
+    height: 140px;
+    margin: 0 10px;
+    position: relative;
+    >img{
+      width: 100%;
+      height: 100%;
+      border: none;
+    }
+    >span{
+      position: absolute;
+      padding: 0 10px;
+      bottom: 0;
+      left: 0;
+      display: block;
+      width: 100%;
+      background-color: rgba(0,0,0,.1 );
+      color: #aaa;
+      font-size: 20px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+      line-height: 30px;
+      height: 30px;
+    }
   }
 </style>

+ 80 - 2
yarn.lock

@@ -1986,7 +1986,7 @@ ajv-formats@^2.1.1:
   dependencies:
     ajv "^8.0.0"
 
-ajv-keywords@^3.5.2:
+ajv-keywords@^3.1.0, ajv-keywords@^3.5.2:
   version "3.5.2"
   resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
   integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
@@ -1998,7 +1998,7 @@ ajv-keywords@^5.0.0:
   dependencies:
     fast-deep-equal "^3.1.3"
 
-ajv@^6.12.4, ajv@^6.12.5:
+ajv@^6.1.0, ajv@^6.12.4, ajv@^6.12.5:
   version "6.12.6"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
   integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -2174,6 +2174,11 @@ babel-plugin-polyfill-regenerator@^0.3.1:
   dependencies:
     "@babel/helper-define-polyfill-provider" "^0.3.1"
 
+babel-plugin-syntax-dynamic-import@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.npmmirror.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da"
+  integrity sha512-MioUE+LfjCEz65Wf7Z/Rm4XCP5k2c+TbMd2Z2JKc7U9uwjBhAfNPE48KC4GTGKhppMeYVepwDBNO/nGY6NYHBA==
+
 babel-plugin-transform-remove-console@^6.9.4:
   version "6.9.4"
   resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz#b980360c067384e24b357a588d807d3c83527780"
@@ -2969,6 +2974,11 @@ domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1:
   dependencies:
     domelementtype "^2.2.0"
 
+dommatrix@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/dommatrix/-/dommatrix-1.0.3.tgz#e7c18e8d6f3abdd1fef3dd4aa74c4d2e620a0525"
+  integrity sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww==
+
 domutils@^2.5.2, domutils@^2.8.0:
   version "2.8.0"
   resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135"
@@ -3960,6 +3970,15 @@ loader-runner@^4.1.0, loader-runner@^4.2.0:
   resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1"
   integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==
 
+loader-utils@^1.0.0, loader-utils@^1.4.0:
+  version "1.4.2"
+  resolved "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3"
+  integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==
+  dependencies:
+    big.js "^5.2.2"
+    emojis-list "^3.0.0"
+    json5 "^1.0.1"
+
 loader-utils@^1.0.2, loader-utils@^1.1.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
@@ -4547,6 +4566,19 @@ path-type@^4.0.0:
   resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
   integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
 
+pdfjs-dist@2.5.207:
+  version "2.5.207"
+  resolved "https://registry.npmmirror.com/pdfjs-dist/-/pdfjs-dist-2.5.207.tgz#b5e8c19627be64269cd3fb6df3eaaf45ddffe7b6"
+  integrity sha512-xGDUhnCYPfHy+unMXCLCJtlpZaaZ17Ew3WIL0tnSgKFUZXHAPD49GO9xScyszSsQMoutNDgRb+rfBXIaX/lJbw==
+
+pdfjs-dist@^2.5.207:
+  version "2.16.105"
+  resolved "https://registry.npmmirror.com/pdfjs-dist/-/pdfjs-dist-2.16.105.tgz#937b9c4a918f03f3979c88209d84c1ce90122c2a"
+  integrity sha512-J4dn41spsAwUxCpEoVf6GVoz908IAA3mYiLmNxg8J9kfRXc2jxpbUepcP0ocp0alVNLFthTAM8DZ1RaHh8sU0A==
+  dependencies:
+    dommatrix "^1.0.3"
+    web-streams-polyfill "^3.2.1"
+
 picocolors@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f"
@@ -4964,6 +4996,14 @@ raw-body@2.5.1:
     iconv-lite "0.4.24"
     unpipe "1.0.0"
 
+raw-loader@^4.0.1:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6"
+  integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==
+  dependencies:
+    loader-utils "^2.0.0"
+    schema-utils "^3.0.0"
+
 read-pkg-up@^7.0.1:
   version "7.0.1"
   resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
@@ -5187,6 +5227,14 @@ sass@^1.54.4:
     immutable "^4.0.0"
     source-map-js ">=0.6.2 <2.0.0"
 
+schema-utils@^0.4.0:
+  version "0.4.7"
+  resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187"
+  integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==
+  dependencies:
+    ajv "^6.1.0"
+    ajv-keywords "^3.1.0"
+
 schema-utils@^2.6.5:
   version "2.7.1"
   resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7"
@@ -5840,6 +5888,23 @@ vue-loader@^17.0.0:
     hash-sum "^2.0.0"
     loader-utils "^2.0.0"
 
+vue-pdf@4.2.0:
+  version "4.2.0"
+  resolved "https://registry.npmmirror.com/vue-pdf/-/vue-pdf-4.2.0.tgz#d553e2a46704f9acd15479d8cf32c73e90989b77"
+  integrity sha512-GpAbZfM48Hom1R8f4XL5ZzoVBLlbyy+4z0VYmTQORVOSieVIIu+XtnNl0RY6EXg60Qni6T6nIgrmsCcCkWv39A==
+  dependencies:
+    babel-plugin-syntax-dynamic-import "^6.18.0"
+    loader-utils "^1.4.0"
+    pdfjs-dist "^2.5.207"
+    raw-loader "^4.0.1"
+    vue-resize-sensor "^2.0.0"
+    worker-loader "^2.0.0"
+
+vue-resize-sensor@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/vue-resize-sensor/-/vue-resize-sensor-2.0.0.tgz#3a587fd6802e1688709cf2c5aadae7a0075952bf"
+  integrity sha512-W+y2EAI/BxS4Vlcca9scQv8ifeBFck56DRtSwWJ2H4Cw1GLNUYxiZxUHHkuzuI5JPW/cYtL1bPO5xPyEXx4LmQ==
+
 vue-router@^3.6.5:
   version "3.6.5"
   resolved "https://registry.npmmirror.com/vue-router/-/vue-router-3.6.5.tgz#95847d52b9a7e3f1361cb605c8e6441f202afad8"
@@ -5906,6 +5971,11 @@ wcwidth@^1.0.1:
   dependencies:
     defaults "^1.0.3"
 
+web-streams-polyfill@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.npmmirror.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6"
+  integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==
+
 webidl-conversions@^3.0.0:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
@@ -6090,6 +6160,14 @@ wildcard@^2.0.0:
   resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec"
   integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==
 
+worker-loader@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/worker-loader/-/worker-loader-2.0.0.tgz#45fda3ef76aca815771a89107399ee4119b430ac"
+  integrity sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==
+  dependencies:
+    loader-utils "^1.0.0"
+    schema-utils "^0.4.0"
+
 wrap-ansi@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba"