Procházet zdrojové kódy

Merge branch 'dev' of http://git.izouma.com/xiongzhu/jmrh into dev

yuanyuan před 3 roky
rodič
revize
59cf3ceaec

+ 8 - 0
src/main/java/com/izouma/jmrh/domain/Conversation.java

@@ -3,6 +3,7 @@ package com.izouma.jmrh.domain;
 import com.izouma.jmrh.converter.ContactConverter;
 import com.izouma.jmrh.enums.ConversationType;
 import com.izouma.jmrh.enums.DockingRole;
+import com.izouma.jmrh.enums.ResSnDType;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -46,4 +47,11 @@ public class Conversation extends BaseEntity {
     private LocalDateTime lastUpdate;
 
     private String lastMessage;
+
+    @ApiModelProperty("资源id")
+    private Long sndId;
+
+    @ApiModelProperty("资源供需类型")
+    @Enumerated(EnumType.STRING)
+    private ResSnDType resSndType;
 }

+ 84 - 0
src/main/java/com/izouma/jmrh/dto/ConversationToAbutmentDTO.java

@@ -0,0 +1,84 @@
+package com.izouma.jmrh.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.izouma.jmrh.domain.Contact;
+import com.izouma.jmrh.domain.Conversation;
+import com.izouma.jmrh.domain.OrgInfo;
+import com.izouma.jmrh.domain.User;
+import com.izouma.jmrh.enums.ConversationType;
+import com.izouma.jmrh.enums.ResSnDType;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class ConversationToAbutmentDTO {
+    private Long id;
+
+    private String sessionId;
+
+    private Long userId;
+
+    private Long toUserId;
+
+    private Long orgId;
+
+    private Contact contact;
+
+    private ConversationType type;
+
+    private LocalDateTime lastUpdate;
+
+    private String lastMessage;
+
+
+
+    @ApiModelProperty("资源id")
+    private Long sndId;
+
+    @ApiModelProperty("资源供需类型")
+    @Enumerated(EnumType.STRING)
+    private ResSnDType resSndType;
+
+
+    //-----------------------------------------
+
+
+    @ApiModelProperty("资源名字")
+    private String resourceName;
+
+    @ApiModelProperty("资源图片")
+    private List<String> resourceImag;
+
+
+//企业信息------------------------------------
+
+    @ApiModelProperty("企业logo")
+    @ExcelProperty("企业logo")
+    private String logo;
+
+    private String orgName;
+
+
+    private OrgInfo orgInfo;
+
+    private String title;
+
+    private String icon;
+
+    private long unread;
+
+
+}

+ 3 - 0
src/main/java/com/izouma/jmrh/repo/ConversationRepo.java

@@ -24,6 +24,9 @@ public interface ConversationRepo extends JpaRepository<Conversation, Long>, Jpa
 
     Conversation findFirstByUserIdAndToUserIdOrderByIdDesc(Long userId, Long toUserId);
 
+
+    Conversation findBySndId(Long sendId);
+
     @Transactional
     @Modifying
     @Query("update Conversation c set c.lastUpdate = ?2, c.lastMessage = ?3 where c.sessionId = ?1")

+ 56 - 20
src/main/java/com/izouma/jmrh/service/ConversationService.java

@@ -38,7 +38,7 @@ public class ConversationService {
                 (userId + "-" + snd.getPublishersId()) : (snd.getPublishersId() + "-" + userId);
 
 
-        Conversation conversationFrom = conversationRepo
+     /*   Conversation conversationFrom = conversationRepo
                 .findFirstByUserIdAndToUserIdOrderByIdDesc(userId, snd.getPublishersId());
         if (conversationFrom == null) {
             conversationFrom = Conversation.builder()
@@ -52,9 +52,32 @@ public class ConversationService {
         }
         conversationFrom.setOrgId(snd.getOrgId());
         conversationFrom.setContact(contact);
-        conversationRepo.save(conversationFrom);
+        conversationRepo.save(conversationFrom);*/
 
-        Conversation conversationTo = conversationRepo
+        Conversation conversationFrom = conversationRepo.findBySndId(sndId);
+
+        if (conversationFrom == null) {
+            conversationFrom = Conversation.builder()
+                                           .sessionId(sessionId)
+                                           .userId(userId)
+                                           .toUserId(snd.getPublishersId())
+                                           .orgId(snd.getOrgId())
+                                           .contact(contact)
+                                           .type(ConversationType.DOCKING)
+                                           .sndId(sndId)
+                                           .resSndType(snd.getType())
+                                           .build();
+            conversationRepo.save(conversationFrom);
+        }else{
+            conversationFrom.setOrgId(snd.getOrgId());
+            conversationFrom.setContact(contact);
+            conversationRepo.save(conversationFrom);
+        }
+
+
+        //-------------------------------
+
+      /*  Conversation conversationTo = conversationRepo
                 .findFirstByUserIdAndToUserIdOrderByIdDesc(snd.getPublishersId(), userId);
         if (conversationTo == null) {
             conversationTo = Conversation.builder()
@@ -68,7 +91,20 @@ public class ConversationService {
         }
         conversationTo.setContact(contact);
         conversationTo.setOrgId(snd.getOrgId());
-        conversationRepo.save(conversationTo);
+        conversationRepo.save(conversationTo);*/
+
+
+//
+//        Conversation conversationTo = Conversation.builder()
+//                                                  .sessionId(sessionId)
+//                                                  .userId(snd.getPublishersId())
+//                                                  .toUserId(userId)
+//                                                  .orgId(snd.getOrgId())
+//                                                  .contact(contact)
+//                                                  .type(ConversationType.PUBLISH)
+//                                                  .build();
+//        conversationRepo.save(conversationTo);
+        //------------------------------------
 
         messageService.send(userId, snd.getPublishersId(), sessionId, MessageType.TEXT, content);
         messageService.send(userId, snd.getPublishersId(), sessionId, MessageType.SND, JSON.toJSONString(snd));
@@ -89,22 +125,22 @@ public class ConversationService {
         dockingRecordFrom.setContact(contact);
         dockingRecordRepo.save(dockingRecordFrom);
 
-        DockingRecord dockingRecordTo = dockingRecordRepo
-                .findFirstByUserIdAndSndIdAndRoleAndStatusInOrderByIdDesc(snd
-                                .getPublishersId(), sndId, DockingRole.PUBLISH,
-                        Arrays.asList(DockingStatus.PENDING, DockingStatus.IN_PROGRESS));
-        if (dockingRecordTo == null) {
-            dockingRecordTo = DockingRecord.builder()
-                    .userId(snd.getPublishersId())
-                    .orgId(snd.getOrgId())
-                    .sndId(sndId)
-                    .role(DockingRole.PUBLISH)
-                    .status(DockingStatus.PENDING)
-                    .build();
-        }
-        dockingRecordTo.setConversationId(conversationTo.getId());
-        dockingRecordTo.setContact(contact);
-        dockingRecordRepo.save(dockingRecordTo);
+//        DockingRecord dockingRecordTo = dockingRecordRepo
+//                .findFirstByUserIdAndSndIdAndRoleAndStatusInOrderByIdDesc(snd
+//                                .getPublishersId(), sndId, DockingRole.PUBLISH,
+//                        Arrays.asList(DockingStatus.PENDING, DockingStatus.IN_PROGRESS));
+//        if (dockingRecordTo == null) {
+//            dockingRecordTo = DockingRecord.builder()
+//                    .userId(snd.getPublishersId())
+//                    .orgId(snd.getOrgId())
+//                    .sndId(sndId)
+//                    .role(DockingRole.PUBLISH)
+//                    .status(DockingStatus.PENDING)
+//                    .build();
+//        }
+//        dockingRecordTo.setConversationId(conversationTo.getId());
+//        dockingRecordTo.setContact(contact);
+//        dockingRecordRepo.save(dockingRecordTo);
     }
 
     public ConversationDTO get(Long id) {

+ 83 - 15
src/main/java/com/izouma/jmrh/web/ConversationController.java

@@ -1,35 +1,45 @@
 package com.izouma.jmrh.web;
 
 import com.izouma.jmrh.domain.Conversation;
+import com.izouma.jmrh.domain.OrgInfo;
 import com.izouma.jmrh.domain.ResourceSupplyAndDemand;
 import com.izouma.jmrh.dto.ConversationDTO;
+import com.izouma.jmrh.dto.ConversationToAbutmentDTO;
 import com.izouma.jmrh.dto.PageQuery;
+import com.izouma.jmrh.dto.R;
 import com.izouma.jmrh.enums.ConversationType;
 import com.izouma.jmrh.enums.Exist;
+import com.izouma.jmrh.enums.ResSnDType;
 import com.izouma.jmrh.exception.BusinessException;
 import com.izouma.jmrh.repo.ConversationRepo;
+import com.izouma.jmrh.repo.OrgInfoRepo;
+import com.izouma.jmrh.repo.ResourceSupplyAndDemandRepo;
 import com.izouma.jmrh.service.ConversationService;
 import com.izouma.jmrh.utils.ObjUtils;
 import com.izouma.jmrh.utils.SecurityUtils;
 import com.izouma.jmrh.utils.excel.ExcelUtils;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/conversation")
 @AllArgsConstructor
+@Slf4j
 public class ConversationController extends BaseController {
     private ConversationService conversationService;
-    private ConversationRepo    conversationRepo;
+    private ConversationRepo            conversationRepo;
+    private ResourceSupplyAndDemandRepo resourceSupplyAndDemandRepo;
+    private OrgInfoRepo                 orgInfoRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -50,20 +60,78 @@ public class ConversationController extends BaseController {
 
     //@PreAuthorize("hasRole('ADMIN')")
     @GetMapping("/all")
-    public Page<Conversation> all(PageQuery pageQuery) {
+    public R all(PageQuery pageQuery) {
         //过滤已经终止并删除的对接
         ArrayList<Exist> exists = new ArrayList<>();
         exists.add(Exist.PUBLISHERS_DELETED);
         exists.add(Exist.ON_DELETED);
         pageQuery.getQuery().put("exist", exists);
+        Map<String, Object> query = pageQuery.getQuery();
+        String str = (String) query.get("typeStr");
+        log.info(str);
+        List<String> types = Arrays.asList(str.split(","));
+        boolean b = types.contains("PRODUCT_SUPPLY");
+        log.info("是否包含PRODUCT_SUPPLY{}", b);
         Page<Conversation> all = conversationRepo.findAll(toSpecification(pageQuery, Conversation.class), toPageRequest(pageQuery));
         List<Conversation> content = all.getContent();
-        List<Conversation> filteredList = content.stream()
-                                                 .filter(x -> x.getType().equals(ConversationType.DOCKING) && x.getUserId().equals(SecurityUtils.getAuthenticatedUser().getId()))
-                                                 .collect(Collectors.toList());
-        Page<Conversation> filteredPage = new PageImpl<>(filteredList, all.getPageable(), filteredList.size());
+        if (b) {
+            List<Conversation> filteredList = content.stream()
+                                                     .filter(x -> x.getType().equals(ConversationType.DOCKING)
+                                                             && x.getUserId().equals(SecurityUtils.getAuthenticatedUser().getId())
+                                                             && (x.getResSndType().equals(ResSnDType.PRODUCT_SUPPLY)
+                                                             || x.getResSndType().equals(ResSnDType.TECH_SUPPLY)
+                                                             || x.getResSndType().equals(ResSnDType.RES_SUPPLY)))
+                                                            .collect(Collectors.toList());
+
+            List<ConversationToAbutmentDTO> filteredListDto   =  filteredList.stream().map(conversation -> {
+                ConversationToAbutmentDTO conversationToAbutmentDTO = new ConversationToAbutmentDTO();
+                BeanUtils.copyProperties(conversation, conversationToAbutmentDTO);
+
+                ResourceSupplyAndDemand snd = resourceSupplyAndDemandRepo.findById(conversation.getSndId())
+                                                                         .orElseThrow(new BusinessException("供需不存在"));
+                conversationToAbutmentDTO.setResourceName(snd.getName());
+                conversationToAbutmentDTO.setResourceImag(snd.getImages());
+
+                OrgInfo orgInfo = orgInfoRepo.findById(conversation.getOrgId())
+                                             .orElseThrow(new BusinessException("无记录"));
+                conversationToAbutmentDTO.setOrgName(orgInfo.getOrgName());
+
+                return conversationToAbutmentDTO;
+            }).collect(Collectors.toList());
+
+            Page<ConversationToAbutmentDTO> filteredPage = new PageImpl<>(filteredListDto, all.getPageable(), filteredList.size());
+
+            return R.success(filteredPage);
+        } else {
+            List<Conversation> filteredList = content.stream()
+                                                     .filter(x -> x.getType().equals(ConversationType.DOCKING)
+                                                             && x.getUserId().equals(SecurityUtils.getAuthenticatedUser().getId())
+                                                             && (x.getResSndType().equals(ResSnDType.TECH_DEMAND)
+                                                             || x.getResSndType().equals(ResSnDType.PRODUCT_DEMAND)
+                                                             || x.getResSndType().equals(ResSnDType.FINANCING_DEMAND)))
+                                                     .collect(Collectors.toList());
+
+            List<ConversationToAbutmentDTO> filteredListDto   =  filteredList.stream().map(conversation -> {
+                ConversationToAbutmentDTO conversationToAbutmentDTO = new ConversationToAbutmentDTO();
+                BeanUtils.copyProperties(conversation, conversationToAbutmentDTO);
+
+                ResourceSupplyAndDemand snd = resourceSupplyAndDemandRepo.findById(conversation.getSndId())
+                                                                         .orElseThrow(new BusinessException("供需不存在"));
+                conversationToAbutmentDTO.setResourceName(snd.getName());
+                conversationToAbutmentDTO.setResourceImag(snd.getImages());
+
+                OrgInfo orgInfo = orgInfoRepo.findById(conversation.getOrgId())
+                                             .orElseThrow(new BusinessException("无记录"));
+                conversationToAbutmentDTO.setOrgName(orgInfo.getOrgName());
+
+                return conversationToAbutmentDTO;
+            }).collect(Collectors.toList());
+
+            Page<ConversationToAbutmentDTO> filteredPage = new PageImpl<>(filteredListDto, all.getPageable(), filteredList.size());
+
+            return R.success(filteredPage);
+        }
 
-        return filteredPage;
 
     }
 
@@ -77,12 +145,12 @@ public class ConversationController extends BaseController {
         conversationRepo.deleteById(id);
     }
 
-    @GetMapping("/excel")
-    @ResponseBody
-    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
-        List<Conversation> data = all(pageQuery).getContent();
-        ExcelUtils.export(response, data);
-    }
+//    @GetMapping("/excel")
+//    @ResponseBody
+//    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+//        List<Conversation> data = all(pageQuery).getContent();
+//        ExcelUtils.export(response, data);
+//    }
 
     @GetMapping("/my")
     @ApiOperation("我的对话")

+ 112 - 104
src/main/jmrh/package-lock.json

@@ -16375,8 +16375,7 @@
     "@tinymce/tinymce-vue": {
       "version": "3.2.7",
       "resolved": "https://registry.npmjs.org/@tinymce/tinymce-vue/-/tinymce-vue-3.2.7.tgz",
-      "integrity": "sha512-ahGIuGFDlBnnqY2Q7sNBj8//nPuLP2kg9LSEBEi5xll9/F9wlJ3YYEGoe+YM8e9iSGAnkzfbo853HyCnVEV1/w==",
-      "requires": {}
+      "integrity": "sha512-ahGIuGFDlBnnqY2Q7sNBj8//nPuLP2kg9LSEBEi5xll9/F9wlJ3YYEGoe+YM8e9iSGAnkzfbo853HyCnVEV1/w=="
     },
     "@types/anymatch": {
       "version": "1.3.1",
@@ -16843,8 +16842,7 @@
       "version": "4.5.9",
       "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.9.tgz",
       "integrity": "sha512-mFNIJhYiJjzCgytkDHX00ROy5Yzl7prkZpUbeDE0biwcLteMf2s3qZVbESOQl6GcviqcfEt2f3tHQQtLNa+OLg==",
-      "dev": true,
-      "requires": {}
+      "dev": true
     },
     "@vue/cli-service": {
       "version": "4.5.9",
@@ -16916,6 +16914,16 @@
           "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
           "dev": true
         },
+        "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"
+          }
+        },
         "cacache": {
           "version": "13.0.1",
           "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz",
@@ -16942,6 +16950,34 @@
             "unique-filename": "^1.1.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
+        },
         "debug": {
           "version": "4.3.1",
           "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
@@ -16951,6 +16987,25 @@
             "ms": "2.1.2"
           }
         },
+        "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"
+          }
+        },
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -16973,6 +17028,16 @@
             "minipass": "^3.1.1"
           }
         },
+        "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"
+          }
+        },
         "terser-webpack-plugin": {
           "version": "2.3.8",
           "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz",
@@ -16989,6 +17054,18 @@
             "terser": "^4.6.12",
             "webpack-sources": "^1.4.3"
           }
+        },
+        "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"
+          }
         }
       }
     },
@@ -17080,8 +17157,7 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz",
       "integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==",
-      "dev": true,
-      "requires": {}
+      "dev": true
     },
     "@vue/web-component-wrapper": {
       "version": "1.2.0",
@@ -17296,8 +17372,7 @@
       "version": "5.3.1",
       "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
       "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
-      "dev": true,
-      "requires": {}
+      "dev": true
     },
     "acorn-walk": {
       "version": "7.2.0",
@@ -17337,15 +17412,13 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
       "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
-      "dev": true,
-      "requires": {}
+      "dev": true
     },
     "ajv-keywords": {
       "version": "3.5.2",
       "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
       "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
-      "dev": true,
-      "requires": {}
+      "dev": true
     },
     "alphanum-sort": {
       "version": "1.0.2",
@@ -17822,6 +17895,16 @@
       "dev": true,
       "optional": true
     },
+    "bindings": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz",
+      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "file-uri-to-path": "1.0.0"
+      }
+    },
     "bluebird": {
       "version": "3.7.2",
       "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
@@ -20569,6 +20652,13 @@
         "schema-utils": "^2.5.0"
       }
     },
+    "file-uri-to-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+      "dev": true,
+      "optional": true
+    },
     "filesize": {
       "version": "3.6.1",
       "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz",
@@ -25455,15 +25545,6 @@
       "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
       "dev": true
     },
-    "string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
     "string-width": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
@@ -25494,6 +25575,15 @@
         "define-properties": "^1.1.3"
       }
     },
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
     "strip-ansi": {
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
@@ -26458,87 +26548,6 @@
         }
       }
     },
-    "vue-loader-v16": {
-      "version": "npm:vue-loader@16.1.2",
-      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.1.2.tgz",
-      "integrity": "sha512-8QTxh+Fd+HB6fiL52iEVLKqE9N1JSlMXLR92Ijm6g8PZrwIxckgpqjPDWRP5TWxdiPaHR+alUWsnu1ShQOwt+Q==",
-      "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.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "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
-        },
-        "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.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-          "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-          "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.4.9",
       "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.4.9.tgz",
@@ -26594,8 +26603,7 @@
     "vuex": {
       "version": "3.6.0",
       "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.0.tgz",
-      "integrity": "sha512-W74OO2vCJPs9/YjNjW8lLbj+jzT24waTo2KShI8jLvJW8OaIkgb3wuAMA7D+ZiUxDOx3ubwSZTaJBip9G8a3aQ==",
-      "requires": {}
+      "integrity": "sha512-W74OO2vCJPs9/YjNjW8lLbj+jzT24waTo2KShI8jLvJW8OaIkgb3wuAMA7D+ZiUxDOx3ubwSZTaJBip9G8a3aQ=="
     },
     "watchpack": {
       "version": "1.7.5",