叶松
2023-09-27 95caf74f05712c6556128eca180d555f427e289e
Merge branch 'master' of http://111.30.93.211:10101/r/supipe
已修改10个文件
已添加23个文件
5696 ■■■■ 文件已修改
hd/pipe/materialsManage/src/main/java/com/thhy/materials/modules/biz/embedment/controller/SysInsetRecordsController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/materialsManage/src/main/java/com/thhy/materials/modules/biz/embedment/service/SysEmbedmentRecordService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/materialsManage/src/main/java/com/thhy/materials/modules/biz/embedment/service/impl/SysEmbedmentRecordServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/materialsManage/src/main/resources/mapping/SysEmbedmentRecordMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionHazardInform/controller/TRegionHazardInformController.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionHazardInform/dto/TRegionHazardInformDto.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionHazardInform/entity/TRegionHazardInformEntity.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionHazardInform/mapper/TRegionHazardInformMapper.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionHazardInform/service/TRegionHazardInformService.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionHazardInform/service/impl/TRegionHazardInformServiceImpl.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionWarranty/controller/TRegionWarrantyController.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionWarranty/dto/TRegionWarrantyDto.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionWarranty/entity/TRegionWarrantyEntity.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionWarranty/entity/TRegionWarrantyUserEntity.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionWarranty/mapper/TRegionWarrantyMapper.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionWarranty/service/TRegionWarrantyService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionWarranty/service/impl/TRegionWarrantyServiceImpl.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/secure/src/main/resources/mapping/TRegionHazardInformMapper.xml 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/secure/src/main/resources/mapping/TRegionWarrantyMapper.xml 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/package-lock.json 1129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/api/modules/ductpiecePLM.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/api/modules/materials.js 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/components/table/Pagination.vue 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/components/table/Table.vue 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/MaterialsIndex/EmbeddedIndex.vue 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/MaterialsIndex/components/embedded/Check.vue 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/MaterialsIndex/components/embedded/Cost.vue 316 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/MaterialsIndex/components/embedded/Income.vue 369 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/MaterialsIndex/components/embedded/Invent.vue 294 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/MaterialsIndex/components/embedded/Type.vue 244 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/ProductPlan/DuctPracticalRaw.vue 236 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/ProjectManage/ProjectsIndex.vue 815 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/ProjectManage/SectionManage.vue 901 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hd/pipe/materialsManage/src/main/java/com/thhy/materials/modules/biz/embedment/controller/SysInsetRecordsController.java
@@ -100,12 +100,12 @@
    /**
     * 导出模板
     * @param embedmentRecordDto
     * @param
     * @param response
     */
    @PostMapping(value = "recordExportTemplate")
    void recordExportTemplate(@RequestBody EmbedmentRecordDto embedmentRecordDto, HttpServletResponse response){
        this.sysEmbedmentRecordService.recordExportTemplate(embedmentRecordDto,response);
    void recordExportTemplate(HttpServletResponse response){
        this.sysEmbedmentRecordService.recordExportTemplate(null,response);
    }
    /**
hd/pipe/materialsManage/src/main/java/com/thhy/materials/modules/biz/embedment/service/SysEmbedmentRecordService.java
@@ -1,6 +1,7 @@
package com.thhy.materials.modules.biz.embedment.service;
import com.thhy.general.common.BasicResult;
import com.thhy.materials.modules.biz.embedment.dto.EmbedmentGoodsDto;
import com.thhy.materials.modules.biz.embedment.dto.EmbedmentRecordDto;
import com.thhy.materials.modules.biz.embedment.entity.SysEmbedmentRecordEntity;
import org.springframework.web.multipart.MultipartFile;
@@ -43,7 +44,7 @@
    void export(EmbedmentRecordDto embedmentRecordDto, HttpServletResponse response);
    void recordExportTemplate(EmbedmentRecordDto embedmentRecordDto, HttpServletResponse response);
    void recordExportTemplate(EmbedmentGoodsDto embedmentGoodsDto, HttpServletResponse response);
    BasicResult variateExcel(MultipartFile file, HttpServletRequest request);
}
hd/pipe/materialsManage/src/main/java/com/thhy/materials/modules/biz/embedment/service/impl/SysEmbedmentRecordServiceImpl.java
@@ -9,6 +9,7 @@
import com.thhy.general.exception.BasicException;
import com.thhy.general.utils.ExcelUtils;
import com.thhy.general.utils.UserInfoUtils;
import com.thhy.materials.modules.biz.embedment.dto.EmbedmentGoodsDto;
import com.thhy.materials.modules.biz.embedment.dto.EmbedmentRecordDto;
import com.thhy.materials.modules.biz.embedment.entity.SysEmbedmentGoodsEntity;
import com.thhy.materials.modules.biz.embedment.entity.SysEmbedmentRecordEntity;
@@ -142,7 +143,8 @@
    }
    @Override
    public void recordExportTemplate(EmbedmentRecordDto embedmentRecordDto, HttpServletResponse response) {
    public void recordExportTemplate(EmbedmentGoodsDto embedmentGoodsDto, HttpServletResponse response) {
        embedmentGoodsDto = new EmbedmentGoodsDto();
        SysUserInfo sysUserInfo = UserInfoUtils.getInstance().getUserInfo();
        String companyId = sysUserInfo.getCompanyId();
        XSSFWorkbook book = new XSSFWorkbook();
@@ -153,8 +155,8 @@
        row.createCell(2).setCellValue("单价");
        row.createCell(3).setCellValue("金额");
        row.createCell(4).setCellValue("备注");
        embedmentRecordDto.setCompanyId(companyId);
        List<String> lx = sysEmbedmentRecordMapper.embedmentRecordList(embedmentRecordDto).stream().map(s -> s.getEmbedmentNameAndModel()).collect(Collectors.toList());
        embedmentGoodsDto.setCompanyId(companyId);
        List<String> lx = sysEmbedmentGoodsMapper.findAll(embedmentGoodsDto).stream().map(s -> s.getEmbedmentName()+"-"+s.getEmbedmentModel()).collect(Collectors.toList());
        String[] gjlx = lx.toArray(new String[lx.size()]);
        //物品名称-规格型号
hd/pipe/materialsManage/src/main/resources/mapping/SysEmbedmentRecordMapper.xml
@@ -171,8 +171,8 @@
      <if test="companyId!=null and companyId!='' ">
          and ser.company_id=#{companyId}
      </if>
      <if test="supplierId!=null and supplierId!='' ">
          and ser.supplier_id=#{supplierId}
      <if test="embedmentModel!=null and embedmentModel!='' ">
          and seg.embedment_model=#{embedmentModel}
      </if>
      <if test="getDepart!=null and getDepart!='' ">
          and sd.depart_name like concat('%',#{getDepart},'%')
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionHazardInform/controller/TRegionHazardInformController.java
对比新文件
@@ -0,0 +1,49 @@
package com.thhy.secure.modules.biz.regionHazardInform.controller;
import com.thhy.general.common.BasicResult;
import com.thhy.secure.modules.biz.regionHazardInform.dto.TRegionHazardInformDto;
import com.thhy.secure.modules.biz.regionHazardInform.entity.TRegionHazardInformEntity;
import com.thhy.secure.modules.biz.regionHazardInform.service.TRegionHazardInformService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @Author QiuYuHao
 * @CreateDate 2023-09-26 13:32:08
 * 危险源告知控制层
 */
@RestController
@RequestMapping(value = "regionHazardInform")
public class TRegionHazardInformController {
    @Autowired
    private TRegionHazardInformService service;
    @PostMapping(value = "findAll")
    public BasicResult findAll(TRegionHazardInformDto tRegionHazardInformDto){
        return service.findAll(tRegionHazardInformDto);
    }
    @GetMapping(value = "findEntity")
    public BasicResult findEntity(String id){
        return service.findEntity(id);
    }
    @PostMapping(value = "insert")
    public BasicResult insert(TRegionHazardInformEntity tRegionHazardInformEntity){
        return service.insert(tRegionHazardInformEntity);
    }
    @PostMapping(value = "update")
    public BasicResult update(TRegionHazardInformEntity tRegionHazardInformEntity){
        return service.update(tRegionHazardInformEntity);
    }
    @GetMapping(value = "delete")
    public BasicResult delete(String id){
        return service.delete(id);
    }
}
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionHazardInform/dto/TRegionHazardInformDto.java
对比新文件
@@ -0,0 +1,16 @@
package com.thhy.secure.modules.biz.regionHazardInform.dto;
import lombok.Data;
/**
 * @Author QiuYuHao
 * @CreateDate 2023-09-26 13:33:54
 * 危险源告知dto
 */
@Data
public class TRegionHazardInformDto {
    private Integer level;//安全等级
    private Integer pageNum;
    private Integer pageSize;
    private String companyId;
}
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionHazardInform/entity/TRegionHazardInformEntity.java
对比新文件
@@ -0,0 +1,24 @@
package com.thhy.secure.modules.biz.regionHazardInform.entity;
import com.thhy.general.annotations.Idkey;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
 * @Author QiuYuHao
 * @CreateDate 2023-09-26 13:35:42
 * 危险告知实体
 */
@Data
public class TRegionHazardInformEntity implements Serializable {
    @Idkey(value = "id")
    private String id;
    private String region;
    private Integer level;
    private String     regionColor;
    private String companyId;
    private String createUser;
    private Date createTime;
}
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionHazardInform/mapper/TRegionHazardInformMapper.java
对比新文件
@@ -0,0 +1,26 @@
package com.thhy.secure.modules.biz.regionHazardInform.mapper;
import com.thhy.secure.modules.biz.regionHazardInform.dto.TRegionHazardInformDto;
import com.thhy.secure.modules.biz.regionHazardInform.entity.TRegionHazardInformEntity;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
 * @Author QiuYuHao
 * @CreateDate 2023-09-26 13:39:01
 * 危险告知mapper
 */
@Mapper
public interface TRegionHazardInformMapper {
    List<TRegionHazardInformEntity> findAll(TRegionHazardInformDto tRegionHazardInformDto);
    TRegionHazardInformEntity findEntity(String id);
    void insert(TRegionHazardInformEntity tRegionHazardInformEntity);
    void update(TRegionHazardInformEntity tRegionHazardInformEntity);
    void delete(String id);
}
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionHazardInform/service/TRegionHazardInformService.java
对比新文件
@@ -0,0 +1,25 @@
package com.thhy.secure.modules.biz.regionHazardInform.service;
import com.thhy.general.common.BasicResult;
import com.thhy.secure.modules.biz.regionHazardInform.dto.TRegionHazardInformDto;
import com.thhy.secure.modules.biz.regionHazardInform.entity.TRegionHazardInformEntity;
import java.util.List;
/**
 * @Author QiuYuHao
 * @CreateDate 2023-09-26 13:42:53
 * 危险告知源接口
 */
public interface TRegionHazardInformService {
    BasicResult findAll(TRegionHazardInformDto tRegionHazardInformDto);
    BasicResult findEntity(String id);
    BasicResult insert(TRegionHazardInformEntity tRegionHazardInformEntity);
    BasicResult update(TRegionHazardInformEntity tRegionHazardInformEntity);
    BasicResult delete(String id);
}
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionHazardInform/service/impl/TRegionHazardInformServiceImpl.java
对比新文件
@@ -0,0 +1,65 @@
package com.thhy.secure.modules.biz.regionHazardInform.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.thhy.general.common.BasicResult;
import com.thhy.general.config.SysUserInfo;
import com.thhy.general.utils.UserInfoUtils;
import com.thhy.secure.modules.biz.regionHazardInform.dto.TRegionHazardInformDto;
import com.thhy.secure.modules.biz.regionHazardInform.entity.TRegionHazardInformEntity;
import com.thhy.secure.modules.biz.regionHazardInform.mapper.TRegionHazardInformMapper;
import com.thhy.secure.modules.biz.regionHazardInform.service.TRegionHazardInformService;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * @Author QiuYuHao
 * @CreateDate 2023-09-26 13:44:04
 * 危险告知源逻辑实现
 */
@Service
public class TRegionHazardInformServiceImpl implements TRegionHazardInformService {
    @Autowired
    private TRegionHazardInformMapper tRegionHazardInformMapper;
    @Override
    public BasicResult findAll(TRegionHazardInformDto tRegionHazardInformDto) {
        SysUserInfo userInfo = UserInfoUtils.getInstance().getUserInfo();
        tRegionHazardInformDto.setCompanyId(userInfo.getCompanyId());
        PageHelper.startPage(tRegionHazardInformDto.getPageNum(), tRegionHazardInformDto.getPageSize());
        List<TRegionHazardInformEntity> all = this.tRegionHazardInformMapper.findAll(tRegionHazardInformDto);
        PageInfo<TRegionHazardInformEntity> pageInfo = new PageInfo<>(all);
        return BasicResult.success(pageInfo);
    }
    @Override
    public BasicResult findEntity(String id) {
        TRegionHazardInformEntity entity = this.tRegionHazardInformMapper.findEntity(id);
        return BasicResult.success(entity);
    }
    @Override
    public BasicResult insert(TRegionHazardInformEntity tRegionHazardInformEntity) {
        SysUserInfo userInfo = UserInfoUtils.getInstance().getUserInfo();
        tRegionHazardInformEntity.setCompanyId(userInfo.getCompanyId());
        tRegionHazardInformEntity.setCreateUser(userInfo.getRealName());
        this.tRegionHazardInformMapper.insert(tRegionHazardInformEntity);
        return BasicResult.success();
    }
    @Override
    public BasicResult update(TRegionHazardInformEntity tRegionHazardInformEntity) {
        this.tRegionHazardInformMapper.update(tRegionHazardInformEntity);
        return BasicResult.success();
    }
    @Override
    public BasicResult delete(String id) {
        this.tRegionHazardInformMapper.delete(id);
        return BasicResult.success();
    }
}
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionWarranty/controller/TRegionWarrantyController.java
对比新文件
@@ -0,0 +1,48 @@
package com.thhy.secure.modules.biz.regionWarranty.controller;
import com.thhy.general.common.BasicResult;
import com.thhy.secure.modules.biz.regionWarranty.dto.TRegionWarrantyDto;
import com.thhy.secure.modules.biz.regionWarranty.entity.TRegionWarrantyEntity;
import com.thhy.secure.modules.biz.regionWarranty.service.TRegionWarrantyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * @Author QiuYuHao
 * @CreateDate 2023-09-26 14:20:54
 * 区域包保控制层
 */
@RestController
@RequestMapping(value = "tRegionWarranty")
public class TRegionWarrantyController {
    @Autowired
    private TRegionWarrantyService tRegionWarrantyService;
    @PostMapping(value = "insert")
    BasicResult insert(@RequestBody TRegionWarrantyEntity tRegionWarrantyEntity){
        return tRegionWarrantyService.insert(tRegionWarrantyEntity);
    }
    @GetMapping(value = "delete")
    BasicResult delete(@RequestParam String id){
        return tRegionWarrantyService.delete(id);
    }
    @PostMapping(value = "update")
    BasicResult update(@RequestBody TRegionWarrantyEntity tRegionWarrantyEntity){
        return tRegionWarrantyService.update(tRegionWarrantyEntity);
    }
    @PostMapping(value = "findAll")
    BasicResult findAll(@RequestBody TRegionWarrantyDto tRegionWarrantyDto){
        return tRegionWarrantyService.findAll(tRegionWarrantyDto);
    }
    @GetMapping(value = "findEntity")
    BasicResult findEntity(@RequestParam String id){
        return tRegionWarrantyService.findEntity(id);
    }
}
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionWarranty/dto/TRegionWarrantyDto.java
对比新文件
@@ -0,0 +1,15 @@
package com.thhy.secure.modules.biz.regionWarranty.dto;
import lombok.Data;
/**
 * @Author QiuYuHao
 * @CreateDate 2023-09-26 14:22:22
 * 区域包保dto
 */
@Data
public class TRegionWarrantyDto {
    private Integer pageNum;
    private Integer pageSize;
    private String regionHazardInformId;//区域名称id
}
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionWarranty/entity/TRegionWarrantyEntity.java
对比新文件
@@ -0,0 +1,33 @@
package com.thhy.secure.modules.biz.regionWarranty.entity;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
 * @Author QiuYuHao
 * @CreateDate 2023-09-26 14:28:10
 * 区域包保实体
 */
@Data
public class TRegionWarrantyEntity implements Serializable {
    private String id;
    private String regionHazardInformId;//区域id
    private String region;//区域名称
    private String riskSourceSituation;//危险情况
    private String countermeasures;//应对措施
    private String createUser;
    private String companyId;
    private Date createTime;
    private List<String> leader;//领导id集合
    private List<String> staff;//员工id集合
    private List<TRegionWarrantyUserEntity> leaderList;//领导集合
    private List<TRegionWarrantyUserEntity> staffList;//领导集合
}
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionWarranty/entity/TRegionWarrantyUserEntity.java
对比新文件
@@ -0,0 +1,19 @@
package com.thhy.secure.modules.biz.regionWarranty.entity;
import com.thhy.general.annotations.Idkey;
import lombok.Data;
/**
 * @Author QiuYuHao
 * @CreateDate 2023-09-26 14:39:29
 * 中间表
 */
@Data
public class TRegionWarrantyUserEntity {
    @Idkey("id")
    private String id;
    private String regionWarrantyId;//区域包保表id
    private Integer userType;
    private String userId;//1是领导  2是小组成员
    private String realName;//姓名
}
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionWarranty/mapper/TRegionWarrantyMapper.java
对比新文件
@@ -0,0 +1,48 @@
package com.thhy.secure.modules.biz.regionWarranty.mapper;
import com.thhy.secure.modules.biz.regionWarranty.dto.TRegionWarrantyDto;
import com.thhy.secure.modules.biz.regionWarranty.entity.TRegionWarrantyEntity;
import com.thhy.secure.modules.biz.regionWarranty.entity.TRegionWarrantyUserEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * @Author QiuYuHao
 * @CreateDate 2023-09-26 14:38:26
 * 区域包保mapper
 */
@Mapper
public interface TRegionWarrantyMapper {
    void insert(TRegionWarrantyEntity tRegionWarrantyEntity);
    /**
     * 添加中间表
     * @param tRegionWarrantyUserEntity
     */
    void insertMiddleTable(TRegionWarrantyUserEntity tRegionWarrantyUserEntity);
    void delete(String id);
    /**
     * 删除中间表
     * @param id
     */
    void deleteMiddleTable(String id);
    void update(TRegionWarrantyEntity tRegionWarrantyEntity);
    List<TRegionWarrantyEntity> findAll(TRegionWarrantyDto tRegionWarrantyDto);
    TRegionWarrantyEntity findEntity(String id);
    /**
     * 查询中间表
     * @param regionWarrantyId
     * @param userType
     * @return
     */
    List<TRegionWarrantyUserEntity> findMiddleTable(@Param("regionWarrantyId") String regionWarrantyId,
                                                    @Param("userType") Integer userType);
}
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionWarranty/service/TRegionWarrantyService.java
对比新文件
@@ -0,0 +1,24 @@
package com.thhy.secure.modules.biz.regionWarranty.service;
import com.thhy.general.common.BasicResult;
import com.thhy.secure.modules.biz.regionWarranty.dto.TRegionWarrantyDto;
import com.thhy.secure.modules.biz.regionWarranty.entity.TRegionWarrantyEntity;
import com.thhy.secure.modules.biz.regionWarranty.entity.TRegionWarrantyUserEntity;
import java.util.List;
/**
 * @Author QiuYuHao
 * @CreateDate 2023-09-26 14:48:39
 * 区域包保interface
 */
public interface TRegionWarrantyService {
    BasicResult insert(TRegionWarrantyEntity tRegionWarrantyEntity);
    BasicResult delete(String id);
    BasicResult update(TRegionWarrantyEntity tRegionWarrantyEntity);
    BasicResult findAll(TRegionWarrantyDto tRegionWarrantyDto);
    BasicResult findEntity(String id);
}
hd/pipe/secure/src/main/java/com/thhy/secure/modules/biz/regionWarranty/service/impl/TRegionWarrantyServiceImpl.java
对比新文件
@@ -0,0 +1,111 @@
package com.thhy.secure.modules.biz.regionWarranty.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.thhy.general.common.BasicResult;
import com.thhy.general.utils.UUIDUtils;
import com.thhy.secure.modules.biz.regionWarranty.dto.TRegionWarrantyDto;
import com.thhy.secure.modules.biz.regionWarranty.entity.TRegionWarrantyEntity;
import com.thhy.secure.modules.biz.regionWarranty.entity.TRegionWarrantyUserEntity;
import com.thhy.secure.modules.biz.regionWarranty.mapper.TRegionWarrantyMapper;
import com.thhy.secure.modules.biz.regionWarranty.service.TRegionWarrantyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
 * @Author QiuYuHao
 * @CreateDate 2023-09-26 14:49:45
 * 区域包保实现
 */
@Service
public class TRegionWarrantyServiceImpl implements TRegionWarrantyService {
    @Autowired
    private TRegionWarrantyMapper tRegionWarrantyMapper;
    @Override
    public BasicResult insert(TRegionWarrantyEntity tRegionWarrantyEntity) {
        String id = UUIDUtils.create();//
        tRegionWarrantyEntity.setId(id);
        tRegionWarrantyMapper.insert(tRegionWarrantyEntity);
        //新增领导
        List<String> leader = tRegionWarrantyEntity.getLeader();
        leader.forEach(s->{
            TRegionWarrantyUserEntity t = new TRegionWarrantyUserEntity();
            t.setRegionWarrantyId(id);
            t.setUserId(s);
            t.setUserType(1);
            tRegionWarrantyMapper.insertMiddleTable(t);
        });
        //员工
        List<String> staff = tRegionWarrantyEntity.getStaff();
        staff.forEach(s -> {
            TRegionWarrantyUserEntity t = new TRegionWarrantyUserEntity();
            t.setRegionWarrantyId(id);
            t.setUserId(s);
            t.setUserType(2);
            tRegionWarrantyMapper.insertMiddleTable(t);
        });
        return BasicResult.success();
    }
    @Override
    public BasicResult delete(String id) {
        tRegionWarrantyMapper.delete(id);
        tRegionWarrantyMapper.deleteMiddleTable(id);
        return BasicResult.success();
    }
    @Override
    public BasicResult update(TRegionWarrantyEntity tRegionWarrantyEntity) {
        tRegionWarrantyMapper.deleteMiddleTable(tRegionWarrantyEntity.getId());
        //领导
        List<String> leader = tRegionWarrantyEntity.getLeader();
        leader.forEach(s->{
            TRegionWarrantyUserEntity t = new TRegionWarrantyUserEntity();
            t.setRegionWarrantyId(tRegionWarrantyEntity.getId());
            t.setUserId(s);
            t.setUserType(1);
            tRegionWarrantyMapper.insertMiddleTable(t);
        });
        //员工
        List<String> staff = tRegionWarrantyEntity.getStaff();
        staff.forEach(s -> {
            TRegionWarrantyUserEntity t = new TRegionWarrantyUserEntity();
            t.setRegionWarrantyId(tRegionWarrantyEntity.getId());
            t.setUserId(s);
            t.setUserType(2);
            tRegionWarrantyMapper.insertMiddleTable(t);
        });
        tRegionWarrantyMapper.update(tRegionWarrantyEntity);
        return null;
    }
    @Override
    public BasicResult findAll(TRegionWarrantyDto tRegionWarrantyDto) {
        PageHelper.startPage(tRegionWarrantyDto.getPageNum(), tRegionWarrantyDto.getPageSize());
        List<TRegionWarrantyEntity> all = tRegionWarrantyMapper.findAll(tRegionWarrantyDto);
        all.forEach(tRegionWarrantyEntity -> {
            tRegionWarrantyEntity.setLeaderList(tRegionWarrantyMapper.findMiddleTable(tRegionWarrantyEntity.getId(),1));
            tRegionWarrantyEntity.setStaffList(tRegionWarrantyMapper.findMiddleTable(tRegionWarrantyEntity.getId(),2));
        });
        PageInfo<TRegionWarrantyEntity> info = new PageInfo(all);
        return BasicResult.success(info);
    }
    @Override
    public BasicResult findEntity(String id) {
        TRegionWarrantyEntity entity = tRegionWarrantyMapper.findEntity(id);
        List<TRegionWarrantyUserEntity> leaderList = tRegionWarrantyMapper.findMiddleTable(id,1);
        entity.setLeaderList(leaderList);
        List<TRegionWarrantyUserEntity> staffList= tRegionWarrantyMapper.findMiddleTable(id,2);
        entity.setStaffList(staffList);
        return BasicResult.success(entity);
    }
}
hd/pipe/secure/src/main/resources/mapping/TRegionHazardInformMapper.xml
对比新文件
@@ -0,0 +1,125 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.thhy.secure.modules.biz.regionHazardInform.mapper.TRegionHazardInformMapper">
  <resultMap id="BaseResultMap" type="com.thhy.secure.modules.biz.regionHazardInform.entity.TRegionHazardInformEntity">
    <!--
      WARNING - @mbg.generated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Fri Jun 02 10:07:36 CST 2023.
    -->
      <id column="id" jdbcType="VARCHAR" property="id" />
    <result column="region" jdbcType="VARCHAR" property="region" />
    <result column="level" jdbcType="INTEGER" property="level" />
    <result column="region_color" jdbcType="VARCHAR" property="regionColor" />
    <result column="company_id" jdbcType="VARCHAR" property="companyId" />
    <result column="create_user" jdbcType="VARCHAR" property="createUser" />
    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
  </resultMap>
  <insert id="insert" >
    insert into t_region_hazard_inform
    <trim prefix="(" suffix=")" suffixOverrides=",">
          <if test="id != null">
              id,
          </if>
          <if test="region != null">
            region,
          </if>
          <if test="level != null">
            `level`,
           </if>
          <if test="regionColor != null">
            region_color,
          </if>
          <if test="createTime != null">
            create_time,
          </if>
          <if test="createUser != null">
            create_user,
          </if>
          <if test="companyId != null">
            company_id,
          </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
        <if test="id != null">
            #{id,jdbcType=VARCHAR},
        </if>
        <if test="region != null">
            #{region,jdbcType=VARCHAR},
        </if>
        <if test="level != null">
            #{level,jdbcType=INTEGER},
        </if>
        <if test="regionColor != null">
            #{regionColor,jdbcType=VARCHAR},
        </if>
        <if test="createTime != null">
            #{createTime,jdbcType=TIMESTAMP},
        </if>
        <if test="createUser != null">
            #{createUser,jdbcType=VARCHAR},
        </if>
        <if test="companyId != null">
            #{companyId,jdbcType=VARCHAR},
        </if>
    </trim>
  </insert>
  <select id="findAll" parameterType="com.thhy.secure.modules.biz.regionHazardInform.dto.TRegionHazardInformDto" resultMap="BaseResultMap">
          SELECT
              id,
              region,
              `level`,
              region_color,
              company_id,
              create_user,
              create_time,
              is_use
          FROM
            t_region_hazard_inform
          WHERE
          is_use = 1
        <if test="companyId!=null and companyId!='' ">
          and company_id=#{companyId}
        </if>
        <if test="level!=null and level!='' ">
          and `level`=#{level}
        </if>
        order by create_time desc
  </select>
  <select id="findEntity" parameterType="java.lang.String" resultType="com.thhy.secure.modules.biz.regionHazardInform.entity.TRegionHazardInformEntity">
      SELECT
              id,
              region,
              `level`,
              region_color,
              company_id,
              create_user,
              create_time,
              is_use
      FROM
              t_region_hazard_inform
      WHERE
              is_use = 1 and id = #{id,jdbcType=VARCHAR}
  </select>
  <update id="update">
      update t_region_hazard_inform
    <set>
        <if test="level != null">
            level = #{level,jdbcType=INTEGER},
        </if>
        <if test="region != null">
            region = #{region,jdbcType=VARCHAR},
        </if>
        <if test="regionColor != null">
            region_color = #{regionColor,jdbcType=VARCHAR},
        </if>
    </set>
    where id = #{id,jdbcType=VARCHAR}
  </update>
    <delete id="delete">
        update t_region_hazard_inform set is_use = 2 where id = #{id,jdbcType=VARCHAR}
    </delete>
</mapper>
hd/pipe/secure/src/main/resources/mapping/TRegionWarrantyMapper.xml
对比新文件
@@ -0,0 +1,168 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.thhy.secure.modules.biz.regionWarranty.mapper.TRegionWarrantyMapper">
    <resultMap id="BaseResultMap"
               type="com.thhy.secure.modules.biz.regionWarranty.entity.TRegionWarrantyEntity">
        <result column="region" jdbcType="VARCHAR" property="region" />
        <result column="region_hazard_inform_id" jdbcType="VARCHAR" property="regionHazardInformId" />
        <result column="risk_source_situation" jdbcType="VARCHAR" property="riskSourceSituation" />
        <result column="countermeasures" jdbcType="VARCHAR" property="countermeasures" />
        <result column="company_id" jdbcType="VARCHAR" property="companyId" />
        <result column="create_user" jdbcType="VARCHAR" property="createUser" />
        <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
    </resultMap>
  <insert id="insert" >
      insert into t_region_warranty
    <trim prefix="(" suffix=")" suffixOverrides=",">
          <if test="id != null">
              id,
          </if>
          <if test="regionHazardInformId != null">
              region_hazard_inform_id,
          </if>
          <if test="riskSourceSituation != null">
              risk_source_situation,
           </if>
          <if test="countermeasures != null">
              countermeasures,
          </if>
          <if test="createTime != null">
            create_time,
          </if>
          <if test="createUser != null">
            create_user,
          </if>
          <if test="companyId != null">
            company_id,
          </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
        <if test="id != null">
            #{id,jdbcType=VARCHAR},
        </if>
        <if test="regionHazardInformId != null">
            #{regionHazardInformId,jdbcType=VARCHAR},
        </if>
        <if test="riskSourceSituation != null">
            #{riskSourceSituation,jdbcType=VARCHAR},
        </if>
        <if test="countermeasures != null">
            #{countermeasures,jdbcType=VARCHAR},
        </if>
        <if test="createTime != null">
            #{createTime,jdbcType=TIMESTAMP},
        </if>
        <if test="createUser != null">
            #{createUser,jdbcType=VARCHAR},
        </if>
        <if test="companyId != null">
            #{companyId,jdbcType=VARCHAR},
        </if>
    </trim>
  </insert>
    <select id="findAll" parameterType="com.thhy.secure.modules.biz.regionWarranty.dto.TRegionWarrantyDto" resultMap="com.thhy.secure.modules.biz.regionWarranty.entity.TRegionWarrantyEntity">
      SELECT
          a.id,
          a.region_hazard_inform_id  regionHazardInformId,
          a.risk_source_situation riskSourceSituation,
          a.countermeasures countermeasures,
          a.create_time createTime,
          a.create_user createUser,
          b.region
      FROM
      t_region_warranty a
      LEFT JOIN t_region_hazard_inform b ON b.id = a.region_hazard_inform_id
      WHERE is_use = 1
          <if test="companyId!=null and companyId!='' ">
              and a.company_id=#{companyId}
          </if>
          <if test="regionHazardInformId!=null and regionHazardInformId!='' ">
              and b.id = #{regionHazardInformId}
          </if>
        order by a.create_time desc
  </select>
  <select id="findEntity" parameterType="java.lang.String" resultType="com.thhy.secure.modules.biz.regionWarranty.entity.TRegionWarrantyEntity">
      SELECT
              a.id,
              a.region_hazard_inform_id  regionHazardInformId,
              a.risk_source_situation riskSourceSituation,
              a.countermeasures countermeasures,
              a.create_time createTime,
              a.create_user createUser,
              b.region
      FROM
      t_region_warranty a
      LEFT JOIN t_region_hazard_inform b ON b.id = a.region_hazard_inform_id
      WHERE is_use = 1  and a.id = #{id,jdbcType=VARCHAR}
  </select>
  <update id="update">
      update t_region_warranty
    <set>
        <if test="regionHazardInformId != null">
            #{regionHazardInformId,jdbcType=VARCHAR},
        </if>
        <if test="riskSourceSituation != null">
            #{riskSourceSituation,jdbcType=VARCHAR},
        </if>
        <if test="countermeasures != null">
            #{countermeasures,jdbcType=VARCHAR},
        </if>
    </set>
    where id = #{id,jdbcType=VARCHAR}
  </update>
    <delete id="delete">
        update t_region_warranty set is_use = 2 where id = #{id,jdbcType=VARCHAR}
    </delete>
    <insert id="insertMiddleTable" >
        insert into t_region_warranty_user
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="id != null">
                id,
            </if>
            <if test="regionWarrantyId != null">
                region_warranty_id,
            </if>
            <if test="userType != null">
                user_type,
            </if>
            <if test="userId != null">
                user_id,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="id != null">
                #{id},
            </if>
            <if test="regionWarrantyId != null">
                #{regionWarrantyId},
            </if>
            <if test="userType != null">
                #{userType},
            </if>
            <if test="userId != null">
                #{userId},
            </if>
        </trim>
    </insert>
    <delete id="deleteMiddleTable">
        delete from t_region_warranty_user where region_warranty_id = #{id,jdbcType=VARCHAR}
    </delete>
    <select id="findMiddleTable" parameterType="java.lang.String" resultType="com.thhy.secure.modules.biz.regionWarranty.entity.TRegionWarrantyUserEntity">
        SELECT
                a.id,
                a.region_warranty_id regionWarrantyId,
                a.user_id userId,
                a.user_type userType,
                b.real_name as realName
        FROM t_region_warranty_user a
        LEFT JOIN sys_plat_user b ON b.user_id = a.user_id
        WHERE a.region_warranty_id = #{regionWarrantyId} and a.user_type = #{userType}
    </select>
</mapper>
web/package-lock.json
@@ -1095,7 +1095,6 @@
      "version": "7.17.2",
      "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.17.2.tgz",
      "integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==",
      "dev": true,
      "requires": {
        "regenerator-runtime": "^0.13.4"
      }
@@ -1296,6 +1295,11 @@
      "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==",
      "dev": true
    },
    "@transloadit/prettier-bytes": {
      "version": "0.0.7",
      "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz",
      "integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA=="
    },
    "@types/body-parser": {
      "version": "1.19.2",
      "resolved": "https://registry.npmmirror.com/@types/body-parser/-/body-parser-1.19.2.tgz",
@@ -1324,6 +1328,11 @@
        "@types/express-serve-static-core": "*",
        "@types/node": "*"
      }
    },
    "@types/event-emitter": {
      "version": "0.3.3",
      "resolved": "https://registry.npmjs.org/@types/event-emitter/-/event-emitter-0.3.3.tgz",
      "integrity": "sha512-UfnOK1pIxO7P+EgPRZXD9jMpimd8QEFcEZ5R67R1UhGbv4zghU5+NE7U8M8G9H5Jc8FI51rqDWQs6FtUfq2e/Q=="
    },
    "@types/express": {
      "version": "4.17.13",
@@ -1512,6 +1521,121 @@
          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
          "dev": true
        }
      }
    },
    "@uppy/companion-client": {
      "version": "2.2.2",
      "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-2.2.2.tgz",
      "integrity": "sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==",
      "requires": {
        "@uppy/utils": "^4.1.2",
        "namespace-emitter": "^2.0.1"
      }
    },
    "@uppy/core": {
      "version": "2.3.4",
      "resolved": "https://registry.npmjs.org/@uppy/core/-/core-2.3.4.tgz",
      "integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==",
      "requires": {
        "@transloadit/prettier-bytes": "0.0.7",
        "@uppy/store-default": "^2.1.1",
        "@uppy/utils": "^4.1.3",
        "lodash.throttle": "^4.1.1",
        "mime-match": "^1.0.2",
        "namespace-emitter": "^2.0.1",
        "nanoid": "^3.1.25",
        "preact": "^10.5.13"
      }
    },
    "@uppy/store-default": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/@uppy/store-default/-/store-default-2.1.1.tgz",
      "integrity": "sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ=="
    },
    "@uppy/utils": {
      "version": "4.1.3",
      "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-4.1.3.tgz",
      "integrity": "sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==",
      "requires": {
        "lodash.throttle": "^4.1.1"
      }
    },
    "@uppy/xhr-upload": {
      "version": "2.1.3",
      "resolved": "https://registry.npmjs.org/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz",
      "integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==",
      "requires": {
        "@uppy/companion-client": "^2.2.2",
        "@uppy/utils": "^4.1.2",
        "nanoid": "^3.1.25"
      }
    },
    "@videojs/http-streaming": {
      "version": "3.5.3",
      "resolved": "https://registry.npmjs.org/@videojs/http-streaming/-/http-streaming-3.5.3.tgz",
      "integrity": "sha512-dty8lsZk9QPc0i4It79tjWsmPiaC3FpgARFM0vJGko4k3yKNZIYkAk8kjiDRfkAQH/HZ3rYi5dDTriFNzwSsIg==",
      "requires": {
        "@babel/runtime": "^7.12.5",
        "@videojs/vhs-utils": "4.0.0",
        "aes-decrypter": "4.0.1",
        "global": "^4.4.0",
        "m3u8-parser": "^7.1.0",
        "mpd-parser": "^1.1.1",
        "mux.js": "7.0.0",
        "video.js": "^7 || ^8"
      },
      "dependencies": {
        "m3u8-parser": {
          "version": "7.1.0",
          "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-7.1.0.tgz",
          "integrity": "sha512-7N+pk79EH4oLKPEYdgRXgAsKDyA/VCo0qCHlUwacttQA0WqsjZQYmNfywMvjlY9MpEBVZEt0jKFd73Kv15EBYQ==",
          "requires": {
            "@babel/runtime": "^7.12.5",
            "@videojs/vhs-utils": "^3.0.5",
            "global": "^4.4.0"
          },
          "dependencies": {
            "@videojs/vhs-utils": {
              "version": "3.0.5",
              "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.5.tgz",
              "integrity": "sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==",
              "requires": {
                "@babel/runtime": "^7.12.5",
                "global": "^4.4.0",
                "url-toolkit": "^2.2.1"
              }
            }
          }
        },
        "mux.js": {
          "version": "7.0.0",
          "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-7.0.0.tgz",
          "integrity": "sha512-DeZmr+3NDrO02k4SREtl4VB5GyGPCz2fzMjDxBIlamkxffSTLge97rtNMoonnmFHTp96QggDucUtKv3fmyObrA==",
          "requires": {
            "@babel/runtime": "^7.11.2",
            "global": "^4.4.0"
          }
        }
      }
    },
    "@videojs/vhs-utils": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-4.0.0.tgz",
      "integrity": "sha512-xJp7Yd4jMLwje2vHCUmi8MOUU76nxiwII3z4Eg3Ucb+6rrkFVGosrXlMgGnaLjq724j3wzNElRZ71D/CKrTtxg==",
      "requires": {
        "@babel/runtime": "^7.12.5",
        "global": "^4.4.0",
        "url-toolkit": "^2.2.1"
      }
    },
    "@videojs/xhr": {
      "version": "2.6.0",
      "resolved": "https://registry.npmjs.org/@videojs/xhr/-/xhr-2.6.0.tgz",
      "integrity": "sha512-7J361GiN1tXpm+gd0xz2QWr3xNWBE+rytvo8J3KuggFaLg+U37gZQ2BuPLcnkfGffy2e+ozY70RHC8jt7zjA6Q==",
      "requires": {
        "@babel/runtime": "^7.5.5",
        "global": "~4.4.0",
        "is-function": "^1.0.1"
      }
    },
    "@vue/babel-helper-vue-jsx-merge-props": {
@@ -1808,6 +1932,63 @@
          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
          "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"
          }
        },
        "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
        },
        "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"
          }
        },
        "ssri": {
          "version": "8.0.1",
          "resolved": "https://registry.npmmirror.com/ssri/-/ssri-8.0.1.tgz",
@@ -1815,6 +1996,28 @@
          "dev": true,
          "requires": {
            "minipass": "^3.1.1"
          }
        },
        "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"
          }
        }
      }
@@ -1907,6 +2110,88 @@
      "resolved": "https://registry.npmmirror.com/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz",
      "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==",
      "dev": true
    },
    "@wangeditor/basic-modules": {
      "version": "1.1.7",
      "resolved": "https://registry.npmjs.org/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
      "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==",
      "requires": {
        "is-url": "^1.2.4"
      }
    },
    "@wangeditor/code-highlight": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz",
      "integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==",
      "requires": {
        "prismjs": "^1.23.0"
      }
    },
    "@wangeditor/core": {
      "version": "1.1.19",
      "resolved": "https://registry.npmjs.org/@wangeditor/core/-/core-1.1.19.tgz",
      "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==",
      "requires": {
        "@types/event-emitter": "^0.3.3",
        "event-emitter": "^0.3.5",
        "html-void-elements": "^2.0.0",
        "i18next": "^20.4.0",
        "scroll-into-view-if-needed": "^2.2.28",
        "slate-history": "^0.66.0"
      }
    },
    "@wangeditor/editor": {
      "version": "5.1.23",
      "resolved": "https://registry.npmjs.org/@wangeditor/editor/-/editor-5.1.23.tgz",
      "integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==",
      "requires": {
        "@uppy/core": "^2.1.1",
        "@uppy/xhr-upload": "^2.0.3",
        "@wangeditor/basic-modules": "^1.1.7",
        "@wangeditor/code-highlight": "^1.0.3",
        "@wangeditor/core": "^1.1.19",
        "@wangeditor/list-module": "^1.0.5",
        "@wangeditor/table-module": "^1.1.4",
        "@wangeditor/upload-image-module": "^1.0.2",
        "@wangeditor/video-module": "^1.1.4",
        "dom7": "^3.0.0",
        "is-hotkey": "^0.2.0",
        "lodash.camelcase": "^4.3.0",
        "lodash.clonedeep": "^4.5.0",
        "lodash.debounce": "^4.0.8",
        "lodash.foreach": "^4.5.0",
        "lodash.isequal": "^4.5.0",
        "lodash.throttle": "^4.1.1",
        "lodash.toarray": "^4.4.0",
        "nanoid": "^3.2.0",
        "slate": "^0.72.0",
        "snabbdom": "^3.1.0"
      }
    },
    "@wangeditor/editor-for-vue": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/@wangeditor/editor-for-vue/-/editor-for-vue-1.0.2.tgz",
      "integrity": "sha512-BOENvAXJVtVXlE2X50AAvjV82YlCUeu5cbeR0cvEQHQjYtiVnJtq7HSoj85r2kTgGouI5OrpJG9BBEjSjUSPyA=="
    },
    "@wangeditor/list-module": {
      "version": "1.0.5",
      "resolved": "https://registry.npmjs.org/@wangeditor/list-module/-/list-module-1.0.5.tgz",
      "integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ=="
    },
    "@wangeditor/table-module": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/@wangeditor/table-module/-/table-module-1.1.4.tgz",
      "integrity": "sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w=="
    },
    "@wangeditor/upload-image-module": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz",
      "integrity": "sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA=="
    },
    "@wangeditor/video-module": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/@wangeditor/video-module/-/video-module-1.1.4.tgz",
      "integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg=="
    },
    "@webassemblyjs/ast": {
      "version": "1.9.0",
@@ -2083,6 +2368,11 @@
        "@xtuc/long": "4.2.2"
      }
    },
    "@xmldom/xmldom": {
      "version": "0.8.10",
      "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
      "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw=="
    },
    "@xtuc/ieee754": {
      "version": "1.2.0",
      "resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
@@ -2133,6 +2423,29 @@
      "resolved": "https://registry.npmmirror.com/address/-/address-1.1.2.tgz",
      "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==",
      "dev": true
    },
    "aes-decrypter": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/aes-decrypter/-/aes-decrypter-4.0.1.tgz",
      "integrity": "sha512-H1nh/P9VZXUf17AA5NQfJML88CFjVBDuGkp5zDHa7oEhYN9TTpNLJknRY1ie0iSKWlDf6JRnJKaZVDSQdPy6Cg==",
      "requires": {
        "@babel/runtime": "^7.12.5",
        "@videojs/vhs-utils": "^3.0.5",
        "global": "^4.4.0",
        "pkcs7": "^1.0.4"
      },
      "dependencies": {
        "@videojs/vhs-utils": {
          "version": "3.0.5",
          "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.5.tgz",
          "integrity": "sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==",
          "requires": {
            "@babel/runtime": "^7.12.5",
            "global": "^4.4.0",
            "url-toolkit": "^2.2.1"
          }
        }
      }
    },
    "ajv": {
      "version": "6.12.6",
@@ -2250,7 +2563,6 @@
      "version": "1.0.10",
      "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz",
      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
      "dev": true,
      "requires": {
        "sprintf-js": "~1.0.2"
      }
@@ -2672,6 +2984,34 @@
      "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz",
      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
      "dev": true
    },
    "bmaplib.curveline": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/bmaplib.curveline/-/bmaplib.curveline-1.0.0.tgz",
      "integrity": "sha512-9wcFMVhiYxNPqpvsLDAADn3qDhNzXp2mA6VyHSHg2XOAgSooC7ZiujdFhy0sp+0QYjTfJ/MjmLuNoUg2HHxH4Q=="
    },
    "bmaplib.heatmap": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/bmaplib.heatmap/-/bmaplib.heatmap-1.0.4.tgz",
      "integrity": "sha512-rmhqUARBpUSJ9jXzUI2j7dIOqnc38bqubkx/8a349U2qtw/ulLUwyzRD535OrA8G7w5cz4aPKm6/rNvUAarg/Q=="
    },
    "bmaplib.lushu": {
      "version": "1.0.7",
      "resolved": "https://registry.npmjs.org/bmaplib.lushu/-/bmaplib.lushu-1.0.7.tgz",
      "integrity": "sha512-LVvgpESPii6xGxyjnQjq8u+ic4NjvhdCPV/RiSS/PGTUdZKeTDS7prSpleJLZH3ES0+oc0gYn8bw0LtPYUSz2w=="
    },
    "bmaplib.markerclusterer": {
      "version": "1.0.13",
      "resolved": "https://registry.npmjs.org/bmaplib.markerclusterer/-/bmaplib.markerclusterer-1.0.13.tgz",
      "integrity": "sha512-VrLyWSiuDEVNi0yUfwOhFQ6z1oEEHS4w36GNu3iASu6p52QIx9uAXMUkuSCHReNR0bj2Cp9SA1dSx5RpojXajQ==",
      "requires": {
        "bmaplib.texticonoverlay": "^1.0.2"
      }
    },
    "bmaplib.texticonoverlay": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/bmaplib.texticonoverlay/-/bmaplib.texticonoverlay-1.0.2.tgz",
      "integrity": "sha512-4ZTWr4ZP3B6qEWput5Tut16CfZgII38YwM3bpyb4gFTQyORlKYryFp9WHWrwZZaHlOyYDAXG9SX0hka43jTADg=="
    },
    "bn.js": {
      "version": "5.2.0",
@@ -3557,6 +3897,11 @@
        }
      }
    },
    "compute-scroll-into-view": {
      "version": "1.0.20",
      "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
      "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
    },
    "concat-map": {
      "version": "0.0.1",
      "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
@@ -4182,6 +4527,15 @@
      "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==",
      "dev": true
    },
    "d": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
      "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
      "requires": {
        "es5-ext": "^0.10.50",
        "type": "^1.0.1"
      }
    },
    "dashdash": {
      "version": "1.14.1",
      "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz",
@@ -4580,6 +4934,19 @@
        }
      }
    },
    "dom-walk": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
      "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
    },
    "dom7": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/dom7/-/dom7-3.0.0.tgz",
      "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
      "requires": {
        "ssr-window": "^3.0.0-alpha.1"
      }
    },
    "domain-browser": {
      "version": "1.2.0",
      "resolved": "https://registry.npmmirror.com/domain-browser/-/domain-browser-1.2.0.tgz",
@@ -4671,6 +5038,22 @@
      "requires": {
        "jsbn": "~0.1.0",
        "safer-buffer": "^2.1.0"
      }
    },
    "echarts": {
      "version": "5.4.3",
      "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.3.tgz",
      "integrity": "sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA==",
      "requires": {
        "tslib": "2.3.0",
        "zrender": "5.4.4"
      },
      "dependencies": {
        "tslib": {
          "version": "2.3.0",
          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
          "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
        }
      }
    },
    "ee-first": {
@@ -4845,6 +5228,40 @@
        "is-callable": "^1.1.4",
        "is-date-object": "^1.0.1",
        "is-symbol": "^1.0.2"
      }
    },
    "es5-ext": {
      "version": "0.10.62",
      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz",
      "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==",
      "requires": {
        "es6-iterator": "^2.0.3",
        "es6-symbol": "^3.1.3",
        "next-tick": "^1.1.0"
      }
    },
    "es5-shim": {
      "version": "4.6.7",
      "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.6.7.tgz",
      "integrity": "sha512-jg21/dmlrNQI7JyyA2w7n+yifSxBng0ZralnSfVZjoCawgNTCnS+yBCyVM9DL5itm7SUnDGgv7hcq2XCZX4iRQ=="
    },
    "es6-iterator": {
      "version": "2.0.3",
      "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
      "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
      "requires": {
        "d": "1",
        "es5-ext": "^0.10.35",
        "es6-symbol": "^3.1.1"
      }
    },
    "es6-symbol": {
      "version": "3.1.3",
      "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
      "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
      "requires": {
        "d": "^1.0.1",
        "ext": "^1.1.2"
      }
    },
    "escalade": {
@@ -5095,6 +5512,15 @@
      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
      "dev": true
    },
    "event-emitter": {
      "version": "0.3.5",
      "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
      "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
      "requires": {
        "d": "1",
        "es5-ext": "~0.10.14"
      }
    },
    "event-pubsub": {
      "version": "4.3.0",
      "resolved": "https://registry.npmmirror.com/event-pubsub/-/event-pubsub-4.3.0.tgz",
@@ -5264,6 +5690,21 @@
        }
      }
    },
    "ext": {
      "version": "1.7.0",
      "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
      "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
      "requires": {
        "type": "^2.7.2"
      },
      "dependencies": {
        "type": {
          "version": "2.7.2",
          "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
          "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
        }
      }
    },
    "extend": {
      "version": "3.0.2",
      "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz",
@@ -5370,6 +5811,11 @@
      "version": "1.3.0",
      "resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz",
      "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="
    },
    "ezuikit-js": {
      "version": "7.7.6",
      "resolved": "https://registry.npmjs.org/ezuikit-js/-/ezuikit-js-7.7.6.tgz",
      "integrity": "sha512-eizB8ToIBumN7v69SII4poly1ppZGIGQPj9c8yYTmP7KGZpXnqrQAXcjYrN4PRjcI2U7jrJoRr1i4BNIofzYVg=="
    },
    "fast-deep-equal": {
      "version": "3.1.3",
@@ -5845,6 +6291,15 @@
      "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==",
      "dev": true
    },
    "global": {
      "version": "4.4.0",
      "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
      "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
      "requires": {
        "min-document": "^2.19.0",
        "process": "^0.11.10"
      }
    },
    "globals": {
      "version": "11.12.0",
      "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz",
@@ -6167,6 +6622,11 @@
      "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==",
      "dev": true
    },
    "html-void-elements": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz",
      "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A=="
    },
    "html-webpack-plugin": {
      "version": "3.2.0",
      "resolved": "https://registry.npmmirror.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz",
@@ -6382,6 +6842,14 @@
      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
      "dev": true
    },
    "i18next": {
      "version": "20.6.1",
      "resolved": "https://registry.npmjs.org/i18next/-/i18next-20.6.1.tgz",
      "integrity": "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==",
      "requires": {
        "@babel/runtime": "^7.12.0"
      }
    },
    "iconv-lite": {
      "version": "0.4.24",
      "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -6417,6 +6885,11 @@
      "resolved": "https://registry.npmmirror.com/ignore/-/ignore-4.0.6.tgz",
      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
      "dev": true
    },
    "immer": {
      "version": "9.0.21",
      "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
      "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA=="
    },
    "import-cwd": {
      "version": "2.1.0",
@@ -6525,6 +6998,11 @@
      "resolved": "https://registry.npmmirror.com/indexes-of/-/indexes-of-1.0.1.tgz",
      "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==",
      "dev": true
    },
    "individual": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/individual/-/individual-2.0.0.tgz",
      "integrity": "sha512-pWt8hBCqJsUWI/HtcfWod7+N9SgAqyPEaF7JQjwzjn5vGrpg6aQ5qeAFQ7dx//UH4J1O+7xqew+gCeeFt6xN/g=="
    },
    "infer-owner": {
      "version": "1.0.4",
@@ -6898,6 +7376,11 @@
      "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
    },
    "is-function": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
      "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ=="
    },
    "is-glob": {
      "version": "4.0.3",
      "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
@@ -6906,6 +7389,11 @@
      "requires": {
        "is-extglob": "^2.1.1"
      }
    },
    "is-hotkey": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.2.0.tgz",
      "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw=="
    },
    "is-negative-zero": {
      "version": "2.0.2",
@@ -7037,6 +7525,11 @@
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz",
      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
    },
    "is-url": {
      "version": "1.2.4",
      "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
      "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
    },
    "is-utf8": {
      "version": "0.2.1",
@@ -7206,6 +7699,11 @@
        "verror": "1.10.0"
      }
    },
    "keycode": {
      "version": "2.2.0",
      "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz",
      "integrity": "sha512-ps3I9jAdNtRpJrbBvQjpzyFbss/skHqzS+eu4RxKLaEAtFqkjZaB6TZMSivPbLxf4K7VI4SjR0P5mRCX5+Q25A=="
    },
    "killable": {
      "version": "1.0.1",
      "resolved": "https://registry.npmmirror.com/killable/-/killable-1.0.1.tgz",
@@ -7252,6 +7750,14 @@
      "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
      "dev": true
    },
    "linkify-it": {
      "version": "2.2.0",
      "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz",
      "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==",
      "requires": {
        "uc.micro": "^1.0.1"
      }
    },
    "load-json-file": {
      "version": "1.1.0",
@@ -7373,17 +7879,36 @@
      "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
    },
    "lodash.camelcase": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
      "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
    },
    "lodash.clonedeep": {
      "version": "4.5.0",
      "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
      "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
    },
    "lodash.debounce": {
      "version": "4.0.8",
      "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
      "dev": true
      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
    },
    "lodash.defaultsdeep": {
      "version": "4.6.1",
      "resolved": "https://registry.npmmirror.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz",
      "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==",
      "dev": true
    },
    "lodash.foreach": {
      "version": "4.5.0",
      "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
      "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ=="
    },
    "lodash.isequal": {
      "version": "4.5.0",
      "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
      "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
    },
    "lodash.kebabcase": {
      "version": "4.1.1",
@@ -7402,6 +7927,16 @@
      "resolved": "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
      "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
      "dev": true
    },
    "lodash.throttle": {
      "version": "4.1.1",
      "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
      "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
    },
    "lodash.toarray": {
      "version": "4.4.0",
      "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
      "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw=="
    },
    "lodash.transform": {
      "version": "4.6.0",
@@ -7454,6 +7989,28 @@
        "yallist": "^3.0.2"
      }
    },
    "m3u8-parser": {
      "version": "6.2.0",
      "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-6.2.0.tgz",
      "integrity": "sha512-qlC00JTxYOxawcqg+RB8jbyNwL3foY/nCY61kyWP+RCuJE9APLeqB/nSlTjb4Mg0yRmyERgjswpdQxMvkeoDrg==",
      "requires": {
        "@babel/runtime": "^7.12.5",
        "@videojs/vhs-utils": "^3.0.5",
        "global": "^4.4.0"
      },
      "dependencies": {
        "@videojs/vhs-utils": {
          "version": "3.0.5",
          "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.5.tgz",
          "integrity": "sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==",
          "requires": {
            "@babel/runtime": "^7.12.5",
            "global": "^4.4.0",
            "url-toolkit": "^2.2.1"
          }
        }
      }
    },
    "make-dir": {
      "version": "3.1.0",
      "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz",
@@ -7483,6 +8040,25 @@
        "object-visit": "^1.0.0"
      }
    },
    "markdown-it": {
      "version": "8.4.2",
      "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz",
      "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==",
      "requires": {
        "argparse": "^1.0.7",
        "entities": "~1.1.1",
        "linkify-it": "^2.0.0",
        "mdurl": "^1.0.1",
        "uc.micro": "^1.0.5"
      },
      "dependencies": {
        "entities": {
          "version": "1.1.2",
          "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
          "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
        }
      }
    },
    "md5.js": {
      "version": "1.3.5",
      "resolved": "https://registry.npmmirror.com/md5.js/-/md5.js-1.3.5.tgz",
@@ -7499,6 +8075,11 @@
      "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.4.tgz",
      "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
      "dev": true
    },
    "mdurl": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
      "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g=="
    },
    "media-typer": {
      "version": "0.3.0",
@@ -7624,6 +8205,14 @@
      "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.51.0.tgz",
      "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g=="
    },
    "mime-match": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/mime-match/-/mime-match-1.0.2.tgz",
      "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==",
      "requires": {
        "wildcard": "^1.1.0"
      }
    },
    "mime-types": {
      "version": "2.1.34",
      "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.34.tgz",
@@ -7637,6 +8226,14 @@
      "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-1.2.0.tgz",
      "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
      "dev": true
    },
    "min-document": {
      "version": "2.19.0",
      "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
      "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==",
      "requires": {
        "dom-walk": "^0.1.0"
      }
    },
    "mini-css-extract-plugin": {
      "version": "0.9.0",
@@ -7778,6 +8375,29 @@
        "run-queue": "^1.0.3"
      }
    },
    "mpd-parser": {
      "version": "1.2.2",
      "resolved": "https://registry.npmjs.org/mpd-parser/-/mpd-parser-1.2.2.tgz",
      "integrity": "sha512-QCfB1koOoZw6E5La1cx+W/Yd0EZlRhHMqMr4TAJez0eRTuPDzPM5FWoiOqjyo37W+ISPLzmfJACSbJFEBjbL4Q==",
      "requires": {
        "@babel/runtime": "^7.12.5",
        "@videojs/vhs-utils": "^3.0.5",
        "@xmldom/xmldom": "^0.8.3",
        "global": "^4.4.0"
      },
      "dependencies": {
        "@videojs/vhs-utils": {
          "version": "3.0.5",
          "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.5.tgz",
          "integrity": "sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==",
          "requires": {
            "@babel/runtime": "^7.12.5",
            "global": "^4.4.0",
            "url-toolkit": "^2.2.1"
          }
        }
      }
    },
    "ms": {
      "version": "2.1.2",
      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
@@ -7806,6 +8426,15 @@
      "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
      "dev": true
    },
    "mux.js": {
      "version": "6.3.0",
      "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-6.3.0.tgz",
      "integrity": "sha512-/QTkbSAP2+w1nxV+qTcumSDN5PA98P0tjrADijIzQHe85oBK3Akhy9AHlH0ne/GombLMz1rLyvVsmrgRxoPDrQ==",
      "requires": {
        "@babel/runtime": "^7.11.2",
        "global": "^4.4.0"
      }
    },
    "mz": {
      "version": "2.7.0",
      "resolved": "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz",
@@ -7817,10 +8446,20 @@
        "thenify-all": "^1.0.0"
      }
    },
    "namespace-emitter": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz",
      "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g=="
    },
    "nan": {
      "version": "2.15.0",
      "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz",
      "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ=="
    },
    "nanoid": {
      "version": "3.3.6",
      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
      "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA=="
    },
    "nanomatch": {
      "version": "1.2.13",
@@ -7858,6 +8497,11 @@
      "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz",
      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
      "dev": true
    },
    "next-tick": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
      "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
    },
    "nice-try": {
      "version": "1.0.5",
@@ -8094,6 +8738,11 @@
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
      "integrity": "sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU="
    },
    "normalize.css": {
      "version": "8.0.1",
      "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz",
      "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg=="
    },
    "npm-run-path": {
      "version": "2.0.2",
@@ -8495,6 +9144,11 @@
        "safe-buffer": "^5.1.1"
      }
    },
    "parse-headers": {
      "version": "2.0.5",
      "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz",
      "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA=="
    },
    "parse-json": {
      "version": "5.2.0",
      "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz",
@@ -8661,6 +9315,14 @@
      "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
      "requires": {
        "pinkie": "^2.0.0"
      }
    },
    "pkcs7": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/pkcs7/-/pkcs7-1.0.4.tgz",
      "integrity": "sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==",
      "requires": {
        "@babel/runtime": "^7.5.5"
      }
    },
    "pkg-dir": {
@@ -9287,6 +9949,11 @@
      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
      "dev": true
    },
    "preact": {
      "version": "10.17.1",
      "resolved": "https://registry.npmjs.org/preact/-/preact-10.17.1.tgz",
      "integrity": "sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA=="
    },
    "prelude-ls": {
      "version": "1.1.2",
      "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.1.2.tgz",
@@ -9316,11 +9983,15 @@
        "renderkid": "^2.0.4"
      }
    },
    "prismjs": {
      "version": "1.29.0",
      "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
      "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q=="
    },
    "process": {
      "version": "0.11.10",
      "resolved": "https://registry.npmmirror.com/process/-/process-0.11.10.tgz",
      "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
      "dev": true
      "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="
    },
    "process-nextick-args": {
      "version": "2.0.1",
@@ -9627,8 +10298,7 @@
    "regenerator-runtime": {
      "version": "0.13.9",
      "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
      "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
      "dev": true
      "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
    },
    "regenerator-transform": {
      "version": "0.14.5",
@@ -9966,6 +10636,14 @@
        "aproba": "^1.1.1"
      }
    },
    "rust-result": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/rust-result/-/rust-result-1.0.0.tgz",
      "integrity": "sha512-6cJzSBU+J/RJCF063onnQf0cDUOHs9uZI1oroSGnHOph+CQTIJ5Pp2hK5kEQq1+7yE/EEWfulSNXAQ2jikPthA==",
      "requires": {
        "individual": "^2.0.0"
      }
    },
    "rxjs": {
      "version": "6.6.7",
      "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-6.6.7.tgz",
@@ -9979,6 +10657,14 @@
      "version": "5.1.2",
      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
    },
    "safe-json-parse": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-4.0.0.tgz",
      "integrity": "sha512-RjZPPHugjK0TOzFrLZ8inw44s9bKox99/0AZW9o/BEQVrJfhI+fIHMErnPyRa89/yRXUUr93q+tiN6zhoVV4wQ==",
      "requires": {
        "rust-result": "^1.0.0"
      }
    },
    "safe-regex": {
      "version": "1.1.0",
@@ -10144,6 +10830,14 @@
        "@types/json-schema": "^7.0.5",
        "ajv": "^6.12.4",
        "ajv-keywords": "^3.5.2"
      }
    },
    "scroll-into-view-if-needed": {
      "version": "2.2.31",
      "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
      "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==",
      "requires": {
        "compute-scroll-into-view": "^1.0.20"
      }
    },
    "scss-tokenizer": {
@@ -10434,6 +11128,38 @@
      "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
      "dev": true
    },
    "slate": {
      "version": "0.72.8",
      "resolved": "https://registry.npmjs.org/slate/-/slate-0.72.8.tgz",
      "integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==",
      "requires": {
        "immer": "^9.0.6",
        "is-plain-object": "^5.0.0",
        "tiny-warning": "^1.0.3"
      },
      "dependencies": {
        "is-plain-object": {
          "version": "5.0.0",
          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
          "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
        }
      }
    },
    "slate-history": {
      "version": "0.66.0",
      "resolved": "https://registry.npmjs.org/slate-history/-/slate-history-0.66.0.tgz",
      "integrity": "sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==",
      "requires": {
        "is-plain-object": "^5.0.0"
      },
      "dependencies": {
        "is-plain-object": {
          "version": "5.0.0",
          "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
          "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
        }
      }
    },
    "slice-ansi": {
      "version": "2.1.0",
      "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-2.1.0.tgz",
@@ -10452,6 +11178,11 @@
          "dev": true
        }
      }
    },
    "snabbdom": {
      "version": "3.5.1",
      "resolved": "https://registry.npmjs.org/snabbdom/-/snabbdom-3.5.1.tgz",
      "integrity": "sha512-wHMNIOjkm/YNE5EM3RCbr/+DVgPg6AqQAX1eOxO46zYNvCXjKP5Y865tqQj3EXnaMBjkxmQA5jFuDpDK/dbfiA=="
    },
    "snapdragon": {
      "version": "0.8.2",
@@ -10685,6 +11416,11 @@
      "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
      "dev": true
    },
    "spark-md5": {
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz",
      "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw=="
    },
    "spdx-correct": {
      "version": "3.1.1",
      "resolved": "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.1.1.tgz",
@@ -10765,8 +11501,7 @@
    "sprintf-js": {
      "version": "1.0.3",
      "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz",
      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
      "dev": true
      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
    },
    "sshpk": {
      "version": "1.17.0",
@@ -10783,6 +11518,11 @@
        "safer-buffer": "^2.0.2",
        "tweetnacl": "~0.14.0"
      }
    },
    "ssr-window": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-3.0.0.tgz",
      "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA=="
    },
    "ssri": {
      "version": "6.0.2",
@@ -11299,6 +12039,11 @@
      "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==",
      "dev": true
    },
    "tiny-warning": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
      "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
    },
    "tmp": {
      "version": "0.0.33",
      "resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz",
@@ -11414,6 +12159,11 @@
      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
      "dev": true
    },
    "tsml": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/tsml/-/tsml-1.0.1.tgz",
      "integrity": "sha512-3KmepnH9SUsoOVtg013CRrL7c+AK7ECaquAsJdvu4288EDJuraqBlP4PDXT/rLEJ9YDn4jqLAzRJsnFPx+V6lg=="
    },
    "tty-browserify": {
      "version": "0.0.0",
      "resolved": "https://registry.npmmirror.com/tty-browserify/-/tty-browserify-0.0.0.tgz",
@@ -11432,6 +12182,11 @@
      "version": "0.14.5",
      "resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz",
      "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
    },
    "type": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
      "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
    },
    "type-check": {
      "version": "0.3.2",
@@ -11463,6 +12218,11 @@
      "resolved": "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz",
      "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
      "dev": true
    },
    "uc.micro": {
      "version": "1.0.6",
      "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
      "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
    },
    "uglify-js": {
      "version": "3.4.10",
@@ -11693,6 +12453,11 @@
        "requires-port": "^1.0.0"
      }
    },
    "url-toolkit": {
      "version": "2.2.5",
      "resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.5.tgz",
      "integrity": "sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg=="
    },
    "use": {
      "version": "3.1.1",
      "resolved": "https://registry.npmmirror.com/use/-/use-3.1.1.tgz",
@@ -11787,6 +12552,202 @@
        "extsprintf": "^1.2.0"
      }
    },
    "video.js": {
      "version": "8.5.2",
      "resolved": "https://registry.npmjs.org/video.js/-/video.js-8.5.2.tgz",
      "integrity": "sha512-6/uNXQV3xSaKLpaPf/bVvr7omd+82sKUp0RMBgIt4PxHIe28GtX+O+GcNfI2fuwBvcDRDqk5Ei5AG9bJJOpulA==",
      "requires": {
        "@babel/runtime": "^7.12.5",
        "@videojs/http-streaming": "3.5.3",
        "@videojs/vhs-utils": "^4.0.0",
        "@videojs/xhr": "2.6.0",
        "aes-decrypter": "^4.0.1",
        "global": "4.4.0",
        "keycode": "2.2.0",
        "m3u8-parser": "^6.0.0",
        "mpd-parser": "^1.0.1",
        "mux.js": "^6.2.0",
        "safe-json-parse": "4.0.0",
        "videojs-contrib-quality-levels": "4.0.0",
        "videojs-font": "4.1.0",
        "videojs-vtt.js": "0.15.5"
      }
    },
    "videojs-contrib-hls": {
      "version": "5.15.0",
      "resolved": "https://registry.npmjs.org/videojs-contrib-hls/-/videojs-contrib-hls-5.15.0.tgz",
      "integrity": "sha512-18zbMYZ0XRBKTPEayA9bFTWWrqhT9b4G8+zf0czJLD7Epe5PcK1I/3dflTHQeQ5rwlWir+/XnFU3sMg/B2MMcw==",
      "requires": {
        "aes-decrypter": "1.0.3",
        "global": "^4.3.0",
        "m3u8-parser": "2.1.0",
        "mux.js": "4.3.2",
        "url-toolkit": "^2.1.3",
        "video.js": "^5.19.1 || ^6.2.0",
        "videojs-contrib-media-sources": "4.7.2",
        "webwackify": "0.1.6"
      },
      "dependencies": {
        "aes-decrypter": {
          "version": "1.0.3",
          "resolved": "https://registry.npmjs.org/aes-decrypter/-/aes-decrypter-1.0.3.tgz",
          "integrity": "sha512-rsx8pfx7wJsn+ziYbpJ8XA5c93hKAtBCrfydxJqJCMT+qfjipd/B5wC2xHtBcoxyvlqJcpeAo3K55t0lXOn9yQ==",
          "requires": {
            "pkcs7": "^0.2.3"
          }
        },
        "m3u8-parser": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-2.1.0.tgz",
          "integrity": "sha512-WbEpQ2FUaNGbJ0YanSeyj9D9ruu4FUvz+ZvebIzI2bSME+PUwcPXO1kKXZkjcPUAFruDikoOI5fWQNIA6JCCOQ=="
        },
        "mux.js": {
          "version": "4.3.2",
          "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-4.3.2.tgz",
          "integrity": "sha512-g0q6DPdvb3yYcoK7ElBGobdSSrhY/RjPt19U7uUc733aqvc5bCS/aCvL9z+448y+IoCZnYDwyZfQBBXMSmGOaQ=="
        },
        "pkcs7": {
          "version": "0.2.3",
          "resolved": "https://registry.npmjs.org/pkcs7/-/pkcs7-0.2.3.tgz",
          "integrity": "sha512-kJRwmADEQUg+qJyRgWLtpEL9q9cFjZschejTEK3GRjKvnsU9G5WWoe/wKqRgbBoqWdVSeTUKP6vIA3Y72M3rWA=="
        },
        "process": {
          "version": "0.5.2",
          "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz",
          "integrity": "sha512-oNpcutj+nYX2FjdEW7PGltWhXulAnFlM0My/k48L90hARCOJtvBbQXc/6itV2jDvU5xAAtonP+r6wmQgCcbAUA=="
        },
        "video.js": {
          "version": "6.13.0",
          "resolved": "https://registry.npmjs.org/video.js/-/video.js-6.13.0.tgz",
          "integrity": "sha512-36/JR/GhPQSZj0o+GNbhcEYv/b0SkV9SQsjlodAnzMQYN0TA7VhmqrKPYMCi1NGRYu7S9W3OaFCFoUxkYfSVlg==",
          "requires": {
            "babel-runtime": "^6.9.2",
            "global": "4.3.2",
            "safe-json-parse": "4.0.0",
            "tsml": "1.0.1",
            "videojs-font": "2.1.0",
            "videojs-ie8": "1.1.2",
            "videojs-vtt.js": "0.12.6",
            "xhr": "2.4.0"
          },
          "dependencies": {
            "global": {
              "version": "4.3.2",
              "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz",
              "integrity": "sha512-/4AybdwIDU4HkCUbJkZdWpe4P6vuw/CUtu+0I1YlLIPe7OlUO7KNJ+q/rO70CW2/NW6Jc6I62++Hzsf5Alu6rQ==",
              "requires": {
                "min-document": "^2.19.0",
                "process": "~0.5.1"
              }
            }
          }
        },
        "videojs-font": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-2.1.0.tgz",
          "integrity": "sha512-zFqWpLrXf1q8NtYx5qtZhMC6SLUFScDmR6j+UGPogobxR21lvXShhnzcNNMdOxJUuFLiToJ/BPpFUQwX4xhpvA=="
        },
        "videojs-vtt.js": {
          "version": "0.12.6",
          "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.12.6.tgz",
          "integrity": "sha512-XFXeGBQiljnElMhwCcZst0RDbZn2n8LU7ZScXryd3a00OaZsHAjdZu/7/RdSr7Z1jHphd45FnOvOQkGK4YrWCQ==",
          "requires": {
            "global": "^4.3.1"
          }
        }
      }
    },
    "videojs-contrib-media-sources": {
      "version": "4.7.2",
      "resolved": "https://registry.npmjs.org/videojs-contrib-media-sources/-/videojs-contrib-media-sources-4.7.2.tgz",
      "integrity": "sha512-e6iCHWBFuV05EGo7v+pS9iepObXnJ9joms467gzi8ZjpKVb3ifha9M0Ja24Rd8JfvYpzjltsgDVtGFDvIg4hQQ==",
      "requires": {
        "global": "^4.3.0",
        "mux.js": "4.3.2",
        "video.js": "^5.17.0 || ^6.2.0",
        "webwackify": "0.1.6"
      },
      "dependencies": {
        "mux.js": {
          "version": "4.3.2",
          "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-4.3.2.tgz",
          "integrity": "sha512-g0q6DPdvb3yYcoK7ElBGobdSSrhY/RjPt19U7uUc733aqvc5bCS/aCvL9z+448y+IoCZnYDwyZfQBBXMSmGOaQ=="
        },
        "process": {
          "version": "0.5.2",
          "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz",
          "integrity": "sha512-oNpcutj+nYX2FjdEW7PGltWhXulAnFlM0My/k48L90hARCOJtvBbQXc/6itV2jDvU5xAAtonP+r6wmQgCcbAUA=="
        },
        "video.js": {
          "version": "6.13.0",
          "resolved": "https://registry.npmjs.org/video.js/-/video.js-6.13.0.tgz",
          "integrity": "sha512-36/JR/GhPQSZj0o+GNbhcEYv/b0SkV9SQsjlodAnzMQYN0TA7VhmqrKPYMCi1NGRYu7S9W3OaFCFoUxkYfSVlg==",
          "requires": {
            "babel-runtime": "^6.9.2",
            "global": "4.3.2",
            "safe-json-parse": "4.0.0",
            "tsml": "1.0.1",
            "videojs-font": "2.1.0",
            "videojs-ie8": "1.1.2",
            "videojs-vtt.js": "0.12.6",
            "xhr": "2.4.0"
          },
          "dependencies": {
            "global": {
              "version": "4.3.2",
              "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz",
              "integrity": "sha512-/4AybdwIDU4HkCUbJkZdWpe4P6vuw/CUtu+0I1YlLIPe7OlUO7KNJ+q/rO70CW2/NW6Jc6I62++Hzsf5Alu6rQ==",
              "requires": {
                "min-document": "^2.19.0",
                "process": "~0.5.1"
              }
            }
          }
        },
        "videojs-font": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-2.1.0.tgz",
          "integrity": "sha512-zFqWpLrXf1q8NtYx5qtZhMC6SLUFScDmR6j+UGPogobxR21lvXShhnzcNNMdOxJUuFLiToJ/BPpFUQwX4xhpvA=="
        },
        "videojs-vtt.js": {
          "version": "0.12.6",
          "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.12.6.tgz",
          "integrity": "sha512-XFXeGBQiljnElMhwCcZst0RDbZn2n8LU7ZScXryd3a00OaZsHAjdZu/7/RdSr7Z1jHphd45FnOvOQkGK4YrWCQ==",
          "requires": {
            "global": "^4.3.1"
          }
        }
      }
    },
    "videojs-contrib-quality-levels": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-4.0.0.tgz",
      "integrity": "sha512-u5rmd8BjLwANp7XwuQ0Q/me34bMe6zg9PQdHfTS7aXgiVRbNTb4djcmfG7aeSrkpZjg+XCLezFNenlJaCjBHKw==",
      "requires": {
        "global": "^4.4.0"
      }
    },
    "videojs-font": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-4.1.0.tgz",
      "integrity": "sha512-X1LuPfLZPisPLrANIAKCknZbZu5obVM/ylfd1CN+SsCmPZQ3UMDPcvLTpPBJxcBuTpHQq2MO1QCFt7p8spnZ/w=="
    },
    "videojs-ie8": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/videojs-ie8/-/videojs-ie8-1.1.2.tgz",
      "integrity": "sha512-0Zb2T4MLkpfZbeGMK/Z93b8Lrepr+rLFoHgQV1CoDeFqXvH7b+Vsd/VHoILGxQrgCSHFQ7mAODR6oyMjuiD4/g==",
      "requires": {
        "es5-shim": "^4.5.1"
      }
    },
    "videojs-vtt.js": {
      "version": "0.15.5",
      "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz",
      "integrity": "sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==",
      "requires": {
        "global": "^4.3.1"
      }
    },
    "vm-browserify": {
      "version": "1.1.2",
      "resolved": "https://registry.npmmirror.com/vm-browserify/-/vm-browserify-1.1.2.tgz",
@@ -11797,6 +12758,18 @@
      "version": "2.6.14",
      "resolved": "https://registry.npmmirror.com/vue/-/vue-2.6.14.tgz",
      "integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ=="
    },
    "vue-baidu-map": {
      "version": "0.21.22",
      "resolved": "https://registry.npmjs.org/vue-baidu-map/-/vue-baidu-map-0.21.22.tgz",
      "integrity": "sha512-WQMPCih4UTh0AZCKKH/OVOYnyAWjfRNeK6BIeoLmscyY5aF8zzlJhz/NOHLb3mdztIpB0Z6aohn4Jd9mfCSjQw==",
      "requires": {
        "bmaplib.curveline": "^1.0.0",
        "bmaplib.heatmap": "^1.0.4",
        "bmaplib.lushu": "^1.0.7",
        "bmaplib.markerclusterer": "^1.0.13",
        "markdown-it": "^8.4.0"
      }
    },
    "vue-demi": {
      "version": "0.12.5",
@@ -11854,87 +12827,6 @@
          "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz",
          "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
          "dev": true
        }
      }
    },
    "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
        },
        "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.2",
          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.2.tgz",
          "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
          "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"
          }
        }
      }
    },
@@ -12633,6 +13525,11 @@
      "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
      "dev": true
    },
    "webwackify": {
      "version": "0.1.6",
      "resolved": "https://registry.npmjs.org/webwackify/-/webwackify-0.1.6.tgz",
      "integrity": "sha512-pGcw1T3HpNnM/UTRQqqRkkkzythSLts05mB+7Gr00B+0VbL0m39dFL5g20rSIEUt9Wrpw+/8k+snxRlUFHhcqA=="
    },
    "which": {
      "version": "1.3.1",
      "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz",
@@ -12666,6 +13563,11 @@
      "requires": {
        "string-width": "^1.0.2 || 2 || 3 || 4"
      }
    },
    "wildcard": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-1.1.2.tgz",
      "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng=="
    },
    "word-wrap": {
      "version": "1.2.3",
@@ -12742,11 +13644,37 @@
        "async-limiter": "~1.0.0"
      }
    },
    "xhr": {
      "version": "2.4.0",
      "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.4.0.tgz",
      "integrity": "sha512-TUbBsdAuJbX8olk9hsDwGK8P1ri1XlV+PdEWkYw+HQQbpkiBR8PLgD1F3kQDPBs9l4Px34hP9rCYAZOCCAENbw==",
      "requires": {
        "global": "~4.3.0",
        "is-function": "^1.0.1",
        "parse-headers": "^2.0.0",
        "xtend": "^4.0.0"
      },
      "dependencies": {
        "global": {
          "version": "4.3.2",
          "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz",
          "integrity": "sha512-/4AybdwIDU4HkCUbJkZdWpe4P6vuw/CUtu+0I1YlLIPe7OlUO7KNJ+q/rO70CW2/NW6Jc6I62++Hzsf5Alu6rQ==",
          "requires": {
            "min-document": "^2.19.0",
            "process": "~0.5.1"
          }
        },
        "process": {
          "version": "0.5.2",
          "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz",
          "integrity": "sha512-oNpcutj+nYX2FjdEW7PGltWhXulAnFlM0My/k48L90hARCOJtvBbQXc/6itV2jDvU5xAAtonP+r6wmQgCcbAUA=="
        }
      }
    },
    "xtend": {
      "version": "4.0.2",
      "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz",
      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
      "dev": true
      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
    },
    "y18n": {
      "version": "4.0.3",
@@ -12866,6 +13794,21 @@
          "dev": true
        }
      }
    },
    "zrender": {
      "version": "5.4.4",
      "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.4.tgz",
      "integrity": "sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw==",
      "requires": {
        "tslib": "2.3.0"
      },
      "dependencies": {
        "tslib": {
          "version": "2.3.0",
          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
          "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
        }
      }
    }
  }
}
web/src/api/modules/ductpiecePLM.js
@@ -26,6 +26,7 @@
      url: '/m/pipeInfo/findList',
      data: {
        proId: params.proId,
        segmentId: params.segmentId,
        ringNum: params.ringNum,
        groupId: params.groupId,
        checkResult: params.checkResult,
@@ -250,7 +251,15 @@
    axios.post('/m/repo/delete', params),
  //堆场详情信息
  detailsYardInfo: params =>
    axios.post('/m/repoRecord/repoDetail', params),
    axios({
      method: 'post',
      url: '/m/repoRecord/repoDetail',
      headers: {
        pageNum: params.pageNum,
        pageSize: params.pageSize
      },
      data: params
    }),
  //堆场单元下拉框
  getUnitYardList: params =>
    axios.post('/m/repo/repoUnitPullDown', params),
web/src/api/modules/materials.js
@@ -128,5 +128,71 @@
     responseType: 'blob',
     data: params
 }),
  /* 预埋件管理 */
  embedded: {
    // 库存管理
    inventGetLists: params => // table列表
        axios.post('/materials/embedmentInventoryManagement/findAll', params),
    inventCheck: params => // 库存校正
        axios.post('/materials/embedmentInventoryManagement/inventoryCorrection', params),
    inventPresAlarm: params => // 预报警设置
        axios.post('/materials/embedmentInventoryManagement/alarmSet', params),
    inventExportxls: params => // 导出
        axios({
            method: 'post',
            url: '/materials/embedmentInventoryManagement/export',
            responseType: 'blob',
            data: params
        }),
    // 入库记录
    incomeGetLists: params => // talbe列表
        axios.post('/materials/embedmentInsetRecord/embedmentRecordList', params),
    incomeInsert: params => // 新增
        axios.post('/materials/embedmentInsetRecord/insert', params),
    incomeUpdate: params => // 修改更新
        axios.post('/materials/embedmentInsetRecord/update', params),
    incomeDel: params => // 修改回显
        axios.get('/materials/embedmentInsetRecord/embedmentRecordDel', { params }),
    incomeExportxls: params => // 导出
        axios({
            method: 'post',
            url: '/materials/embedmentInsetRecord/export',
            responseType: 'blob',
            data: params
        }),
    incomeExportXls: params => //导出模板
        axios({
        method: 'post',
        url: '/materials/embedmentInsetRecord/recordExportTemplate',
        responseType: 'blob',
        params: params
    }),
    incomeInXls: params => //导入Excel
        axios.post('/materials/embedmentInsetRecord/variateExcel', params),
    // 预埋件种类
    typeGetLists: params => // table列表
        axios.post('/materials/embedmentGoods/findAll', params),
    typeInsert: params => // 新增
        axios.post('/materials/embedmentGoods/insert', params),
    typeUpdate: params => // 修改更新
      axios.post('/materials/embedmentGoods/update', params),
    typeDetail: params => // 修改回显
        axios.get('/materials/embedmentGoods/findEntity', { params }),
    typeModels: params => // 类别
        axios.get('/materials/embedmentGoods/getType', { params }),
    // 消耗记录
    costGetLists: params => // table列表
      axios.post('/materials/embedmentInsetRecord/embedmentRecordOutList', params),
    costInser: params => // table列表
      axios.post('/materials/embedmentInsetRecord/insert', params),
    costUpdate: params => // table列表
      axios.post('/materials/embedmentInsetRecord/update', params),
    costDel: params => // table列表
      axios.get('/materials/embedmentInsetRecord/embedmentRecordDel', { params }),
    // 校正记录
    checkGetLists: params => // 修改回显
        axios.post('/materials/embedmentCorrection/inventoryList', params),
  },
}
web/src/components/table/Pagination.vue
对比新文件
@@ -0,0 +1,78 @@
<template>
  <div class="pagination-container">
    <el-pagination @current-change="handleCurrentChange" @size-change="handleSizeChange" :page-sizes="[10, 20, 30]"
      :total="total" :current-page="pageNum" :page-size="pageSize"
      layout="total, sizes, prev, pager, next, jumper"></el-pagination>
  </div>
</template>
<script>
export default {
  name: "pagination",
  data() {
    return {};
  },
  props: {
    // 总页数
    total: {
      type: Number,
    },
    // 当前页
    pageNum: {
      type: Number,
    },
    // 每页显示条数
    pageSize: {
      type: Number,
    },
  },
  methods: {
    // 当前页码变化
    handleCurrentChange(val) {
      this.$emit("change-page-num", val);
    },
    //  每页查看条数变化
    handleSizeChange(val) {
      this.$emit("change-page-size", val);
    },
  },
  // watch: {
  //   pageSize: {
  //     // immediate: true,
  //     handler(newValue, oldValue) {
  //       this.page._pageSize = this.newValue;
  //       console.log("pageSize", newValue, oldValue);
  //     },
  //   },
  //   pageNum: {
  //     // immediate: true,
  //     handler(newValue, oldValue) {
  //       this.page._currentPage = newValue;
  //       console.log("pageNum", newValue, oldValue);
  //     },
  //   },
  // },
};
</script>
<style lang="scss" scoped>
// 主体底部样式
::v-deep.el-pagination .btn-prev,
::v-deep.el-pagination .btn-next,
::v-deep.el-pagination .el-pager li {
  background-color: rgba(20, 25, 58, 0.4);
  border: 1px solid rgba(255, 255, 255, 0.12);
  font-weight: 400;
  color: #E2E4E9;
  border-radius: 4px;
}
::v-deep.el-pagination .el-pager li:not(.disabled).active {
  color: #fff;
  border: 1px solid #39B5FE;
  background-color: #0B3562;
  font-weight: 400;
}
.pagination-container {
  margin-top: 30px;
}
</style>
web/src/components/table/Table.vue
对比新文件
@@ -0,0 +1,126 @@
<template>
  <div>
    <el-table v-loading="tableLoading" :data="tableData" :ref="tableRef" :size="tableSize" @row-click="rowClick"
      @row-dblclick="rowDblClick" @selection-change="handleSelectionChange" border stripe>
      <template v-for="(col, index) in tableColumnsConfig">
        <!-- 选择框 -->
        <el-table-column v-if="col.selection" width="50" :key="`selection_${index}`" type="selection" align="center">
        </el-table-column>
        <!-- 序号 -->
        <el-table-column v-else-if="col.index" width="50" label="序号" :key="`index_${index}`" type="index" align="center">
        </el-table-column>
        <!-- 自定义 -->
        <slot v-else-if="col.slot" :name="col.slot" show-overflow-tooltip></slot>
        <!-- 常规col -->
        <el-table-column v-else :key="`col_${index}`" :width="col.width" :label="col.name" :prop="col.key"
          :show-overflow-tooltip="col.showOverflowTip || false" :align="col.align || 'center'">
          <template #default="{ row }">
            {{ row[col.key] }}
          </template>
        </el-table-column>
      </template>
    </el-table>
    <!-- 分页组件 -->
    <cPagination :total="pageTotal" :page-num.sync="pageNum" :page-size.sync="pageSize" @change-page-num="changePageNum"
      @change-page-size="changePageSize" />
  </div>
</template>
<script>
import cPagination from "@/components/table/Pagination"
export default {
  name: "cTable",
  data() {
    return {
      time: null
    };
  },
  props: {
    tableData: {
      type: Array,
      default() {
        return [];
      }
    },
    tableHeight: {
      type: Number,
      default: null
    },
    tableLoading: {
      type: Boolean,
      default: false
    },
    tableRef: {
      type: String,
      default: "multipleTable"
    },
    tableSize: {
      type: String,
      default: "mini"
    },
    tableColumnsConfig: {
      type: Array,
      default() {
        return [];
      }
    },
    pageTotal: {
      type: Number
    },
    pageNum: {
      type: Number,
      default: 1
    },
    pageSize: {
      type: Number,
      default: 10
    },
    pageChange: {
      type: Function,
      default: () => { }
    },
    handleSelection: {
      type: Function,
      default: () => { }
    }
  },
  components: {
    cPagination
  },
  methods: {
    changePageNum(val) {
      // console.log(val)
      // this.pageNum = val
      this.$emit("update:pageNum", val);
      this.pageChange();
    },
    changePageSize(val) {
      this.$emit("update:pageSize", val);
      if (val * (this.pageNum - 1) <= this.pageTotal) {
        this.pageChange();
      }
    },
    // 单击
    rowClick() {
      // this.time && clearTimeout(this.time);
      // this.time = setTimeout(() => {
      //   this.$refs[this.tableRef].toggleRowSelection(row);
      // }, 200);
    },
    // 双击
    rowDblClick() {
      // this.time && clearTimeout(this.time);
    },
    clearSelection() {
      this.$refs[this.tableRef].clearSelection();
    },
    handleSelectionChange(val) {
      this.handleSelection(val);
    }
  }
};
</script>
<style lang="scss" scoped>
.el-table {
  border: none;
}
</style>
web/src/views/MaterialsIndex/EmbeddedIndex.vue
对比新文件
@@ -0,0 +1,82 @@
<template>
    <div class="main">
        <div class="main_tabs">
            <el-tabs v-model="activeName" @tab-click="handleClick">
                <el-tab-pane label="库存管理" name="first">
                    <embedded-invent ref="Invent"></embedded-invent>
                </el-tab-pane>
                <el-tab-pane label="消耗记录" name="third">
                    <embedded-cost ref="Costs"></embedded-cost>
                </el-tab-pane>
                <el-tab-pane label="入库记录" name="second">
                    <embedded-income ref="Income"></embedded-income>
                </el-tab-pane>
                <el-tab-pane label="校正记录" name="fourth">
                    <embedded-check ref="checks"></embedded-check>
                </el-tab-pane>
                <el-tab-pane label="预埋件种类" name="five">
                    <embedded-type ref="Auxiliary"></embedded-type>
                </el-tab-pane>
            </el-tabs>
        </div>
    </div>
</template>
<script>
import EmbeddedInvent from './components/embedded/Invent'//库存管理
import EmbeddedCost from './components/embedded/Cost'//消耗记录
import EmbeddedIncome from './components/embedded/Income'//入库记录
import EmbeddedCheck from './components/embedded/Check'//校正记录
import EmbeddedType from './components/embedded/Type'//预埋件种类
export default {
    components: {
        EmbeddedInvent,
        EmbeddedCost,
        EmbeddedIncome,
        EmbeddedCheck,
        EmbeddedType
    },
    data() {
        return {
            activeName: 'first'
        }
    },
    mounted() {
        this.$refs.Invent.searchButtonInfo(true);
    },
    methods: {
        //切换界面
        handleClick(tab) {
            switch (tab.name) {
                case 'second':
                    this.$refs.Income.searchButtonInfo(true);
                    this.$refs.Income.getNameList()
                    break;
                case 'third':
                    this.$refs.Costs.searchButtonInfo(true);
                    this.$refs.Costs.getNameList()
                    break;
                case 'fourth':
                    this.$refs.checks.searchButtonInfo(true);
                    break;
                case 'five':
                    this.$refs.Auxiliary.searchButtonInfo(true);
                    this.$refs.Auxiliary.getAllTypes();
                    break;
                default:
                    this.$refs.Invent.searchButtonInfo(true);
            }
        },
    }
}
</script>
<style scoped lang="scss">
@import'@/style/layout-main.scss';
/deep/ .el-tabs__content {
    position: static;
}
/deep/.main {
    background: none;
}
</style>
web/src/views/MaterialsIndex/components/embedded/Check.vue
对比新文件
@@ -0,0 +1,212 @@
<template>
  <div class="main tabs_main" style="height:89%">
    <div class="main_header">
      <div class="header_item">
        <span class="header_label">预埋件名称:</span>
        <el-input v-model="search.embedmentName" :size="size" clearable placeholder="请输入预埋件名称"></el-input>
      </div>
      <!-- <div class="header_item">
        <span class="header_label">规格型号:</span>
        <el-select v-model="search.steelModel" placeholder="请选择规格型号">
            <el-option
            v-for="item in optionsModels"
            :key="item.dictId"
            :label="item.dictName"
            :value="item.dictId">
            </el-option>
        </el-select>
      </div> -->
      <!-- <div class="header_item">
        <span class="header_label">校正时间:</span>
        <el-date-picker
            v-model="search.time"
            type="daterange"
            value-format="yyyy-MM-dd HH:mm:ss"
            range-separator="-"
            start-placeholder="起始时间"
            end-placeholder="结束时间">
        </el-date-picker>
      </div> -->
      <div class="header_item">
        <el-button :size="size" icon="el-icon-search" v-if="showButton('search')"
          @click="searchButtonInfo(true)">查询</el-button>
      </div>
    </div>
    <div class="main_content">
      <el-table v-loading="loading" :data="dataList" height="100%">
        <el-table-column align="center" label="序号" width="60">
          <template #default="scope">
            <span>{{ (pageNum - 1) * pageSize + scope.$index + 1 }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="createTime" label="校正时间" align="center" width="180"></el-table-column>
        <el-table-column prop="createUser" label="校正人" align="center"></el-table-column>
        <el-table-column prop="embedmentName" label="预埋件名称" align="center"></el-table-column>
        <el-table-column prop="embedmentModel" label="规格型号" align="center"></el-table-column>
        <el-table-column prop="unit" label="计量单位" align="center"></el-table-column>
        <el-table-column prop="correctionNum" label="校正数量" align="center"></el-table-column>
        <el-table-column prop="correctionBefore" label="校正前库存" align="center"></el-table-column>
        <el-table-column prop="correctionAfter" label="校正后库存" align="center"></el-table-column>
        <el-table-column prop="remark" label="备注" align="center" show-overflow-tooltip></el-table-column>
      </el-table>
    </div>
    <div class="main_footer">
      <el-pagination background @current-change="changePageNum" @size-change="changePageSize" :current-page="pageNum"
        :page-sizes="[10, 20, 50, 100]" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper"
        :total="total">
      </el-pagination>
    </div>
  </div>
</template>
<script>
import {buttonPinia} from '@/pinia/index';
import {changeSize} from '@/plugins/public'; // 导入节流、动态切换组件尺寸方法
export default {
  data() {
    return {
      size: changeSize(), // 组件尺寸
      pageNum: 1,
      pageSize: 10,
      search: {},//查询条件
      total: 0,
      loading: false,
      dataList: [], //校正记录管理信息列表
      asyncTitle: true, // 对话框title 新增:true  修改:false
      asyncVisible: false, // 添加 修改对话框
      ruleForm: {
      }, // 按钮表单
      rules: {
        supplierNo: [{
          required: true,
          message: '请输入供应商编号',
          trigger: 'blur'
        }],
        optionsType: [{
          required: true,
          message: '请选择供应商类型',
          trigger: 'change'
        }],
        supplierName: [{
          required: true,
          message: '请输入供应商企业名称',
          trigger: 'blur'
        }],
        legalPerson: [{
          required: true,
          message: '请输入法定代表人',
          trigger: 'blur'
        }],
        succ: [{
          required: true,
          message: '请输入统一社会信用代码',
          trigger: 'blur'
        }, {
          validator: (rule, value, callback) => {
            const reg = /^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/
            if (reg.test(value)) {
              callback()
            } else {
              callback(new Error('请输入正确格式'))
            }
          },
          trigger: 'blur'
        }],
        contact: [{
          required: true,
          message: '请输入联系人',
          trigger: 'blur'
        }],
        email: [{
          required: false,
          message: '请输入邮箱',
          trigger: 'blur'
        }, {
          type: 'email',
          message: '请输入正确的邮箱地址',
          trigger: 'blur'
        }],
        contactPhone: [{
          required: true,
          message: '请输入联系电话',
          trigger: 'blur'
        }, {
          validator: (rule, value, callback) => {
            const reg = /^1[3456789]\d{9}$/
            if (reg.test(value)) {
              callback()
            } else {
              callback(new Error('请输入正确格式'))
            }
          },
          trigger: 'blur'
        }],
        address: [{
          required: true,
          message: '请输入公司地址',
          trigger: 'blur'
        }],
      },
      optionsRebar: [],//钢筋名称
      optionsModels: [],//规格型号
    }
  },
  watch: {
    asyncVisible(bol) {
      if (!bol) {
        this.ruleForm = {};
        this.$refs.ruleForm.resetFields();
      }
    }
  },
  mounted() {
    const that = this;
    // 根据窗口大小动态修改组件尺寸
    window.onresize = () => {
      that.size = changeSize();
    }
  },
  methods: {
    // 查询按钮列表信息
    searchButtonInfo(bol) {
      if (bol) {
        this.pageNum = 1;
      }
      let params = Object.assign({}, this.search, {
        pageNum: this.pageNum,
        pageSize: this.pageSize
      })
      params.strTime = this.search.time && this.search.time[0]
      params.endTime = this.search.time && this.search.time[1]
      delete params.time
      this.loading = true;
      this.$api.Materials.embedded.checkGetLists(params).then((res) => {
        if (res.statusMsg === 'ok') {
          this.total = res.data.total;
          this.dataList = res.data.list;
        }
        this.loading = false;
      })
    },
    // 判断按钮权限信息
    showButton(str) {
      const pinia = buttonPinia();
      return pinia.$state.buttonInfo.includes(str);
    },
    // 切换页数
    changePageNum(page) {
      this.pageNum = page;
      this.searchButtonInfo();
    },
    // 切换每页条数
    changePageSize(size) {
      this.pageSize = size;
      this.searchButtonInfo();
    }
  }
}
</script>
<style lang="scss" scoped>
@import '@/style/layout-main.scss';
</style>
web/src/views/MaterialsIndex/components/embedded/Cost.vue
对比新文件
@@ -0,0 +1,316 @@
<template>
  <div class="main tabs_main" style="height:89%">
    <div class="main_header">
      <div class="header_item">
        <span class="header_label">预埋件名称:</span>
        <el-select v-model="search.embedmentId" placeholder="请选择预埋件型号" clearable>
          <el-option v-for="item in optionsNames" :key="item.id" :label="`${item.embedmentName} - ${item.embedmentModel}`"
            :value="item.id">
          </el-option>
        </el-select>
      </div>
      <div class="header_item">
        <span class="header_label">时间范围:</span>
        <el-date-picker v-model="search.time" type="daterange" :default-time="['00:00:00', '23:59:59']" clearable
          value-format="yyyy-MM-dd HH:mm:ss" range-separator="-" start-placeholder="起始时间" end-placeholder="结束时间">
        </el-date-picker>
      </div>
      <div class="header_item">
        <el-button icon="el-icon-search" v-if="showButton('search')" @click="searchButtonInfo(true)">查询</el-button>
        <el-button class="search_btn" icon="el-icon-plus" v-if="showButton('insert')" @click="insertProp">新增</el-button>
      </div>
    </div>
    <div class="main_content">
      <el-table v-loading="loading" :data="dataList" height="100%">
        <el-table-column align="center" label="序号" width="60">
          <template #default="scope">
            <span>{{ (pageNum - 1) * pageSize + scope.$index + 1 }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="embedmentName" label="预埋件名称" align="center" width="180"></el-table-column>
        <el-table-column prop="embedmentModel" label="规格型号" align="center" width="120"></el-table-column>
        <el-table-column prop="changeStock" label="出库数量" align="center"></el-table-column>
        <el-table-column prop="singlePrice" label="单价" align="center" show-overflow-tooltip></el-table-column>
        <el-table-column prop="amount" label="金额" align="center"></el-table-column>
        <el-table-column prop="createUser" label="发料人" align="center"></el-table-column>
        <el-table-column prop="createTime" label="出库时间" align="center" show-overflow-tooltip></el-table-column>
        <el-table-column prop="remark" label="备注" align="center" show-overflow-tooltip></el-table-column>
        <el-table-column label="操作" align="center" width="140">
          <template #default="scope">
            <el-button class="table_btn" size="mini" v-if="showButton('update')"
              @click="updateProp(scope.$index)">修改</el-button>
            <el-button class="delete_btn" size="mini" v-if="showButton('delete')"
              @click="deleteInfo(scope.row)">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <div class="main_footer">
      <el-pagination background @current-change="changePageNum" @size-change="changePageSize" :current-page="pageNum"
        :page-sizes="[10, 20, 50, 100]" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper"
        :total="total">
      </el-pagination>
    </div>
    <el-dialog class="prop_dialog" :title="asyncTitle ? '新增出库' : '修改出库信息'" :close-on-click-modal="false"
      :visible.sync="asyncVisible" width="35%">
      <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="auto" class="rule_form">
        <el-form-item label="预埋件名称:" prop="embedmentId">
          <el-select v-model="ruleForm.embedmentId" placeholder="请选择预埋件名称" @change="changeName">
            <el-option v-for="item in optionsNames" :key="item.id"
              :label="`${item.embedmentName} - ${item.embedmentModel}`" :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="规格型号:" prop="embedmentModel">
          <el-input v-model="ruleForm.embedmentModel" placeholder="请选择规格型号" disabled></el-input>
        </el-form-item>
        <el-form-item label="出库数量:" prop="changeStock">
          <el-input v-model="ruleForm.changeStock" :size="size" type="number" clearable placeholder="请输入出库数量"></el-input>
        </el-form-item>
        <el-form-item label="单价:" prop="singlePrice">
          <el-input v-model="ruleForm.singlePrice" type="number" :size="size" clearable placeholder="请输入单价"
            @blur="priceChange"></el-input>
        </el-form-item>
        <el-form-item label="金额:" prop="amount">
          <el-input v-model="ruleForm.amount" :size="size" clearable placeholder="请输入金额" :disabled="disabled"></el-input>
        </el-form-item>
        <el-form-item label="备注:" prop="remark">
          <el-input v-model="ruleForm.remark" :size="size" type="textarea" :rows="2" clearable
            placeholder="请输入备注"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer">
        <el-button @click="asyncVisible = false">取 消</el-button>
        <el-button class="submit_btn" @click="asyncTitle ? submitInsert() : submitUpdate()">提 交</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import {buttonPinia} from '@/pinia/index';
import {throttle, changeSize} from '@/plugins/public'; // 导入节流、动态切换组件尺寸方法
export default {
  data() {
    return {
      size: changeSize(), // 组件尺寸
      pageNum: 1,
      pageSize: 10,
      search: {},//查询条件
      total: 0,
      loading: false,
      disabled: false,//是否禁止修改
      dataList: [], //入库记录信息列表
      asyncTitle: true, // 对话框title 新增:true  修改:false
      asyncVisible: false, // 添加 修改对话框
      ruleForm: {
        embedmentModel: '',
      }, // 按钮表单
      rules: {
        embedmentId: [{
          required: true,
          message: '请选择预埋件名称',
          trigger: 'change'
        }],
        changeStock: [{
          required: true,
          message: '请输入出库数量',
          trigger: 'blur'
        }],
        embedmentModel: [{
          required: true,
          message: '请选择规格型号',
          trigger: 'blur'
        }],
        singlePrice: [{
          required: true,
          message: '请输入单价',
          trigger: 'blur'
        }],
        amount: [{
          required: true,
          message: '请输入金额',
          trigger: 'blur'
        }],
      },
      optionsNames: [],//预埋件名称
    }
  },
  watch: {
    asyncVisible(bol) {
      if (!bol) {
        this.ruleForm = {};
        this.$refs.ruleForm.resetFields();
      }
    }
  },
  mounted() {
    const that = this;
    // 根据窗口大小动态修改组件尺寸
    window.onresize = () => {
      that.size = changeSize();
    }
  },
  methods: {
    //计算金额
    priceChange() {
      console.log(this.ruleForm.singlePrice, '******', this.ruleForm.changeStock, '大白话')
      if (this.ruleForm.changeStock !== undefined && this.ruleForm.changeStock !== undefined) {
        this.$set(this.ruleForm, 'amount', this.ruleForm.singlePrice * 1 * this.ruleForm.changeStock)
      } else {
        this.$set(this.ruleForm, 'amount', ' ')
      }
    },
    //获取所有预埋件名称
    getNameList() {
      let params = {
        pageNum: 1,
        pageSize: 100000000
      }
      this.$api.Materials.embedded.typeGetLists(params).then(res => {
        if (res.statusMsg === 'ok') {
          this.optionsNames = res.data.list
        }
      })
    },
    // 转圈圈
    functionLoading() {
      this.loadingView = this.$loading({
        lock: true,
        text: '请稍后...',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      });
    },
    // 查询按钮列表信息
    searchButtonInfo(bol) {
      if (bol) {
        this.pageNum = 1;
      }
      let params = Object.assign({}, this.search, {
        pageNum: this.pageNum,
        pageSize: this.pageSize,
        stockType: 2
      })
      params.strTime = this.search.time && this.search.time[0]
      params.endTime = this.search.time && this.search.time[1]
      delete params.time
      this.loading = true;
      this.$api.Materials.embedded.costGetLists(params).then((res) => {
        if (res.statusMsg === 'ok') {
          this.total = res.data.total;
          this.dataList = res.data.list;
        } else {
          this.$message.warning(res.statusMsg)
        }
        this.loading = false;
      })
    },
    // 根据预埋件名称选择规格型号
    changeName(val) {
      const array = this.optionsNames
      for (let index = 0; index < array.length; index++) {
        const item = array[index]
        if (item.id === val) {
          this.ruleForm.embedmentModel = item.embedmentModel
          break
        }
      }
    },
    // 修改按钮信息
    updateProp(index) {
      this.asyncTitle = false;
      this.asyncVisible = true;
      this.disabled = true
      this.ruleForm = this.dataList[index]
    },
    // 新增按钮信息
    insertProp() {
      this.asyncTitle = true;
      this.asyncVisible = true;
      this.disabled = true
    },
    // 删除按钮信息
    deleteInfo(row) {
      this.$confirm("该操作将删除该信息,是否继续删除?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      }).then(() => {
        this.$api.Materials.embedded.costDel({id: row.id})
          .then(res => {
            if (res.statusMsg === 'ok') {
              this.searchButtonInfo(true);
              this.$message.success("删除成功!");
            } else {
              this.$message.warning(res.statusMsg);
            }
          })
      })
        .catch(() => {
          this.$message.warning("您已取消");
        })
    },
    // 提交添加按钮信息
    submitInsert: throttle(function () {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          const params = Object.assign({}, this.ruleForm);
          params.changeStock = this.ruleForm.changeStock * 1
          params.singlePrice = this.ruleForm.singlePrice * 1
          params.stockType = 2
          this.$api.Materials.embedded.costInser(params).then((res) => {
            if (res.statusMsg === 'ok') {
              this.asyncVisible = false;
              this.searchButtonInfo(true);
              this.$message.success('添加成功!');
            } else {
              this.$message.warning(res.statusMsg);
            }
          })
        }
      })
    }, 3000),
    // 提交修改按钮信息
    submitUpdate: throttle(function () {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          const params = Object.assign({}, this.ruleForm);
          params.changeStock = this.ruleForm.changeStock * 1
          params.singlePrice = this.ruleForm.singlePrice * 1
          params.stockType = 2
          this.$api.Materials.embedded.costUpdate(params).then((res) => {
            if (res.statusMsg === 'ok') {
              this.asyncVisible = false;
              this.searchButtonInfo(true);
              this.$message.success('修改成功!');
            } else {
              this.$message.warning(res.statusMsg);
            }
          })
        }
      })
    }, 3000),
    // 判断按钮权限信息
    showButton(str) {
      const pinia = buttonPinia();
      return pinia.$state.buttonInfo.includes(str);
    },
    // 切换页数
    changePageNum(page) {
      this.pageNum = page;
      this.searchButtonInfo();
    },
    // 切换每页条数
    changePageSize(size) {
      this.pageSize = size;
      this.searchButtonInfo();
    }
  }
}
</script>
<style lang="scss" scoped>
@import '@/style/layout-main.scss';
</style>
web/src/views/MaterialsIndex/components/embedded/Income.vue
对比新文件
@@ -0,0 +1,369 @@
<template>
  <div class="main tabs_main" style="height:89%">
    <div class="main_header">
      <div class="header_item">
        <span class="header_label">预埋件名称:</span>
        <el-input v-model="search.embedmentName" placeholder="请选择预埋件名称" clearable></el-input>
      </div>
      <div class="header_item">
        <span class="header_label">规格型号:</span>
        <el-select v-model="search.embedmentModel" placeholder="请选择规格型号" clearable>
          <el-option v-for="item in optionsNames" :key="item.id" :label="item.embedmentModel"
            :value="item.embedmentModel">
          </el-option>
        </el-select>
      </div>
      <div class="header_item">
        <span class="header_label">时间范围:</span>
        <el-date-picker v-model="search.time" type="daterange" :default-time="['00:00:00', '23:59:59']" clearable
          value-format="yyyy-MM-dd HH:mm:ss" range-separator="-" start-placeholder="起始时间" end-placeholder="结束时间">
        </el-date-picker>
      </div>
      <div class="header_item">
        <el-button icon="el-icon-search" v-if="showButton('search')" @click="searchButtonInfo(true)">查询</el-button>
        <el-button class="search_btn" icon="el-icon-plus" v-if="showButton('insert')" @click="insertProp">新增</el-button>
        <el-button icon="el-icon-upload2" v-if="showButton('export')" @click="exportIncomeData">导出Excel</el-button>
        <el-button icon="el-icon-postcard" v-if="showButton('export')" @click="exportIncomeFile">导出模板</el-button>
        <el-upload class="upload-demo" style="margin-left:10px" action="" :multiple="false" :http-request="httpRequest"
          :show-file-list="false" :file-list="fileList">
          <el-button icon="el-icon-download" v-if="showButton('exportIn')" :size="size">导入Excel</el-button>
        </el-upload>
      </div>
    </div>
    <div class="main_content">
      <el-table v-loading="loading" :data="dataList" height="100%">
        <el-table-column align="center" label="序号" width="60">
          <template #default="scope">
            <span>{{ (pageNum - 1) * pageSize + scope.$index + 1 }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="embedmentName" label="预埋件名称" align="center" width="180"></el-table-column>
        <el-table-column prop="embedmentModel" label="规格型号" align="center" width="120"></el-table-column>
        <el-table-column prop="changeStock" label="入库数量" align="center"></el-table-column>
        <el-table-column prop="singlePrice" label="单价" align="center" show-overflow-tooltip></el-table-column>
        <el-table-column prop="amount" label="金额" align="center"></el-table-column>
        <el-table-column prop="createTime" label="入库时间" align="center" show-overflow-tooltip></el-table-column>
        <el-table-column prop="remark" label="备注" align="center" show-overflow-tooltip></el-table-column>
        <el-table-column label="操作" align="center" width="140">
          <template #default="scope">
            <el-button class="table_btn" size="mini" v-if="showButton('update')"
              @click="updateProp(scope.$index)">修改</el-button>
            <el-button class="delete_btn" size="mini" v-if="showButton('delete')"
              @click="deleteInfo(scope.row)">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <div class="main_footer">
      <el-pagination background @current-change="changePageNum" @size-change="changePageSize" :current-page="pageNum"
        :page-sizes="[10, 20, 50, 100]" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper"
        :total="total">
      </el-pagination>
    </div>
    <el-dialog class="prop_dialog" :title="asyncTitle ? '新增入库' : '修改入库信息'" :close-on-click-modal="false"
      :visible.sync="asyncVisible" width="35%">
      <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="auto" class="rule_form">
        <el-form-item label="预埋件名称:" prop="embedmentId">
          <el-select v-model="ruleForm.embedmentId" :size="size" placeholder="请选择预埋件名称" @change="changeName">
            <el-option v-for="item in optionsNames" :key="item.id"
              :label="`${item.embedmentName} - ${item.embedmentModel}`" :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="规格型号:" prop="embedmentModel">
          <el-input v-model="ruleForm.embedmentModel" placeholder="请选择规格型号" disabled></el-input>
        </el-form-item>
        <el-form-item label="入库数量:" prop="changeStock">
          <el-input v-model="ruleForm.changeStock" :size="size" type="number" clearable placeholder="请输入入库数量"
            @blur="priceChange"></el-input>
        </el-form-item>
        <el-form-item label="单价:" prop="singlePrice">
          <el-input v-model="ruleForm.singlePrice" type="number" :size="size" clearable placeholder="请输入单价"
            @blur="priceChange"></el-input>
        </el-form-item>
        <el-form-item label="金额:" prop="amount">
          <el-input v-model="ruleForm.amount" :size="size" clearable placeholder="请输入金额" :disabled="disabled"></el-input>
        </el-form-item>
        <el-form-item label="备注:" prop="remark">
          <el-input v-model="ruleForm.remark" :size="size" type="textarea" :rows="2" clearable
            placeholder="请输入备注"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer">
        <el-button @click="asyncVisible = false">取 消</el-button>
        <el-button class="submit_btn" @click="asyncTitle ? submitInsert() : submitUpdate()">提 交</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import {buttonPinia} from '@/pinia/index';
import {throttle, changeSize, downFiles} from '@/plugins/public'; // 导入节流、动态切换组件尺寸方法
export default {
  data() {
    return {
      size: changeSize(), // 组件尺寸
      pageNum: 1,
      pageSize: 10,
      search: {},//查询条件
      total: 0,
      loading: false,
      disabled: false,//是否禁止修改
      dataList: [], //入库记录信息列表
      asyncTitle: true, // 对话框title 新增:true  修改:false
      asyncVisible: false, // 添加 修改对话框
      ruleForm: {
        embedmentModel: '',
      }, // 按钮表单
      rules: {
        embedmentId: [{
          required: true,
          message: '请选择物品型号',
          trigger: 'change'
        }],
        embedmentModel: [{
          required: true,
          message: '请选择供应商',
          trigger: 'blur'
        }],
        changeStock: [{
          required: true,
          message: '请输入入库数量',
          trigger: 'blur'
        }],
        singlePrice: [{
          required: true,
          message: '请输入单价',
          trigger: 'blur'
        }],
        amount: [{
          required: true,
          message: '请输入金额',
          trigger: 'blur'
        }],
      },
      optionsNames: [],//物品名称
      fileList: [],//导入
    }
  },
  watch: {
    asyncVisible(bol) {
      if (!bol) {
        this.ruleForm = {};
        this.$refs.ruleForm.resetFields();
      }
    }
  },
  mounted() {
    const that = this;
    // 根据窗口大小动态修改组件尺寸
    window.onresize = () => {
      that.size = changeSize();
    }
  },
  methods: {
    //导出数据
    exportIncomeData() {
      this.functionLoading();
      let params = Object.assign({}, this.search, {
        stockType: 1
      })
      this.$api.Materials.embedded.incomeExportxls(params).then(res => {
        downFiles(res, '入库记录信息', 'xls')
        this.loadingView.close()
      })
        .catch(() => {
          this.loadingView.close();
        })
    },
    //计算金额
    priceChange() {
      if (this.ruleForm.singlePrice !== undefined && this.ruleForm.changeStock !== undefined) {
        this.$set(this.ruleForm, 'amount', this.ruleForm.singlePrice * 1 * this.ruleForm.changeStock)
      } else {
        this.$set(this.ruleForm, 'amount', ' ')
      }
    },
    //获取所有预埋件名称
    getNameList() {
      let params = {
        pageNum: 1,
        pageSize: 100000000
      }
      this.$api.Materials.embedded.typeGetLists(params).then(res => {
        if (res.statusMsg === 'ok') {
          this.optionsNames = res.data.list
        }
      })
    },
    //自定义上传
    httpRequest({file}) {
      this.functionLoading();
      const formData = new FormData();
      formData.set('file', file);
      this.$api.Materials.embedded.incomeInXls(formData).then((res) => {
        if (res.success) {
          this.searchButtonInfo();
          this.$message.success('上传成功!');
          this.loadingView.close();
        } else {
          this.$message.warning(typeof (res.data) === 'object' ? res.statusMsg : res.data);
          this.loadingView.close();
        }
      })
        .catch(() => {
          this.$message.error('请检查网络设置!');
          this.loadingView.close();
        })
    },
    // 转圈圈
    functionLoading() {
      this.loadingView = this.$loading({
        lock: true,
        text: '请稍后...',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      });
    },
    //导出模板
    exportIncomeFile() {
      this.functionLoading();
      this.$api.Materials.embedded.incomeExportXls({}).then(res => {
        downFiles(res, '入库记录信息模板', 'xls')
        this.loadingView.close()
      })
        .catch(() => {
          this.loadingView.close();
        })
    },
    // 查询按钮列表信息
    searchButtonInfo(bol) {
      if (bol) {
        this.pageNum = 1;
      }
      let params = Object.assign({}, this.search, {
        pageNum: this.pageNum,
        pageSize: this.pageSize,
        stockType: 1
      })
      params.strTime = this.search.time && this.search.time[0]
      params.endTime = this.search.time && this.search.time[1]
      delete params.time
      this.loading = true;
      this.$api.Materials.embedded.incomeGetLists(params).then((res) => {
        if (res.statusMsg === 'ok') {
          this.total = res.data.total;
          this.dataList = res.data.list;
        } else {
          this.$message.warning(res.statusMsg)
        }
        this.loading = false;
      })
    },
    // 根据预埋件名称选择规格型号
    changeName(val) {
      const array = this.optionsNames
      for (let index = 0; index < array.length; index++) {
        const item = array[index]
        if (item.id === val) {
          this.ruleForm.embedmentModel = item.embedmentModel
          break
        }
      }
    },
    // 修改按钮信息
    updateProp(index) {
      this.asyncTitle = false;
      this.asyncVisible = true;
      this.disabled = true
      this.ruleForm = this.dataList[index]
    },
    // 新增按钮信息
    insertProp() {
      this.asyncTitle = true;
      this.asyncVisible = true;
      this.disabled = true
    },
    // 删除按钮信息
    deleteInfo(row) {
      this.$confirm("该操作将删除该信息,是否继续删除?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      }).then(() => {
        this.$api.Materials.embedded.incomeDel({id: row.id})
          .then(res => {
            if (res.statusMsg === 'ok') {
              this.searchButtonInfo(true);
              this.$message.success("删除成功!");
            } else {
              this.$message.warning(res.statusMsg);
            }
          })
      }).catch(() => {
        this.$message.warning("您已取消");
      })
    },
    // 提交添加按钮信息
    submitInsert: throttle(function () {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          const params = Object.assign({}, this.ruleForm);
          params.changeStock = this.ruleForm.changeStock * 1
          params.singlePrice = this.ruleForm.singlePrice * 1
          params.stockType = 1
          this.$api.Materials.embedded.incomeInsert(params).then((res) => {
            if (res.statusMsg === 'ok') {
              this.asyncVisible = false;
              this.searchButtonInfo(true);
              this.$message.success('添加成功!');
            } else {
              this.$message.warning(res.statusMsg);
            }
          })
        }
      })
    }, 3000),
    // 提交修改按钮信息
    submitUpdate: throttle(function () {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          const params = Object.assign({}, this.ruleForm);
          params.changeStock = this.ruleForm.changeStock * 1
          params.singlePrice = this.ruleForm.singlePrice * 1
          params.stockType = 1
          this.$api.Materials.embedded.incomeUpdate(params).then((res) => {
            if (res.statusMsg === 'ok') {
              this.asyncVisible = false;
              this.searchButtonInfo(true);
              this.$message.success('修改成功!');
            } else {
              this.$message.warning(res.statusMsg);
            }
          })
        }
      })
    }, 3000),
    // 判断按钮权限信息
    showButton(str) {
      const pinia = buttonPinia();
      return pinia.$state.buttonInfo.includes(str);
    },
    // 切换页数
    changePageNum(page) {
      this.pageNum = page;
      this.searchButtonInfo();
    },
    // 切换每页条数
    changePageSize(size) {
      this.pageSize = size;
      this.searchButtonInfo();
    }
  }
}
</script>
<style lang="scss" scoped>
@import '@/style/layout-main.scss';
</style>
web/src/views/MaterialsIndex/components/embedded/Invent.vue
对比新文件
@@ -0,0 +1,294 @@
<template>
  <div class="main tabs_main" style="height:89%">
    <div class="main_header">
      <div class="header_item">
        <span class="header_label">预埋件名称:</span>
        <el-input v-model="search.embedmentName" :size="size" clearable placeholder="请输入预埋件名称"></el-input>
      </div>
      <div class="header_item">
        <el-button :size="size" icon="el-icon-search" v-if="showButton('search')"
          @click="searchButtonInfo(true)">查询</el-button>
        <el-button :size="size" icon="el-icon-upload2" v-if="showButton('export')" @click="exportFile">导出Excel</el-button>
      </div>
    </div>
    <div class="main_content">
      <el-table v-loading="loading" :data="dataList" height="100%" :cell-style="cellStyle">
        <el-table-column align="center" label="序号" width="60">
          <template #default="scope">
            <span>{{ (pageNum - 1) * pageSize + scope.$index + 1 }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="embedmentName" label="预埋件名称" align="center"></el-table-column>
        <el-table-column prop="embedmentModel" label="型号规格" align="center"></el-table-column>
        <el-table-column prop="dictName" label="类别" align="center"></el-table-column>
        <el-table-column prop="unit" label="计量单位" align="center"></el-table-column>
        <el-table-column prop="stock" label="库存数量" align="center">
          <template #default="{ row }">
            {{ row.stock === null ? 0 : row.stock }}
          </template>
        </el-table-column>
        <el-table-column prop="alarmCount" label="报警数" align="center">
          <template #default="{ row }">
            {{ row.alarmCount === null ? 0 : row.alarmCount }}
          </template>
        </el-table-column>
        <el-table-column prop="position" label="位置" align="center" show-overflow-tooltip></el-table-column>
        <el-table-column label="操作" align="center" width="200">
          <template #default="scope">
            <el-button class="table_btn" size="mini" v-if="showButton('update')"
              @click="updateProp(scope.$index)">库存校正</el-button>
            <el-button class="delete_btn" size="mini" v-if="showButton('update')"
              @click="updatePropAlarm(scope.$index)">预警设置</el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <div class="main_footer">
      <el-pagination background @current-change="changePageNum" @size-change="changePageSize" :current-page="pageNum"
        :page-sizes="[10, 20, 50, 100]" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper"
        :total="total">
      </el-pagination>
    </div>
    <el-dialog class="prop_dialog" :title="asyncTitle ? '预警设置' : '库存校正'" :close-on-click-modal="false"
      :visible.sync="asyncVisible" width="35%">
      <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="auto" class="rule_form">
        <el-form-item label="物品名称:" prop="embedmentName">
          <el-input v-model="ruleForm.embedmentName" :size="size" clearable placeholder="请输入物品名称"
            :disabled="disabled"></el-input>
        </el-form-item>
        <el-form-item label="规格型号:" prop="embedmentModel">
          <el-input v-model="ruleForm.embedmentModel" :size="size" clearable placeholder="请输入规格型号"
            :disabled="disabled"></el-input>
        </el-form-item>
        <el-form-item label="库存数量:" prop="correctionBefore" v-if="!asyncTitle">
          <el-input v-model="ruleForm.correctionBefore" :size="size" clearable placeholder="请输入库存数量"
            :disabled="disabled"></el-input>
        </el-form-item>
        <el-form-item label="校正数量:" prop="correctionNum" v-if="!asyncTitle">
          <el-input v-model="ruleForm.correctionNum" type="number" :size="size" clearable placeholder="请输入校正数量"
            @blur="changeAfter"></el-input>
        </el-form-item>
        <el-form-item label="校正后数量:" prop="correctionAfter" v-if="!asyncTitle">
          <el-input v-model="ruleForm.correctionAfter" :size="size" clearable placeholder="请输入校正后数量"
            :disabled="true"></el-input>
        </el-form-item>
        <el-form-item label="预警数量:" prop="alarmCount" v-if="asyncTitle">
          <el-input v-model="ruleForm.alarmCount" :size="size" clearable placeholder="请输入预警数量"></el-input>
        </el-form-item>
        <el-form-item label="备注:" prop="remark" v-if="!asyncTitle">
          <el-input v-model="ruleForm.remark" :size="size" type="textarea" :rows="2" clearable
            placeholder="请输入备注"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer">
        <el-button @click="asyncVisible = false">取 消</el-button>
        <el-button class="submit_btn" @click="asyncTitle ? submitInsert() : submitUpdate()">提 交</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import {buttonPinia} from '@/pinia/index';
import {throttle, changeSize, downFiles} from '@/plugins/public'; // 导入节流、动态切换组件尺寸方法
export default {
  data() {
    return {
      size: changeSize(), // 组件尺寸
      pageNum: 1,
      pageSize: 10,
      id: "",//一行ID
      search: {},//查询条件
      total: 0,
      loading: false,
      disabled: false,//是否禁止修改
      dataList: [], //库存管理信息列表
      asyncTitle: true, // 对话框title 预警设置:true  库存校正:false
      asyncVisible: false, // 添加 修改对话框
      ruleForm: {
      }, // 按钮表单
      rules: {
        embedmentName: [{
          required: true,
          message: '请输入预埋件名称',
          trigger: 'blur'
        }],
        embedmentModel: [{
          required: true,
          message: '请输入规格型号',
          trigger: 'blur'
        }],
        alarmCount: [{
          required: true,
          message: '请输入预警数量',
          trigger: 'blur'
        }],
        correctionBefore: [{
          required: true,
          message: '请输入库存数量',
          trigger: 'blur'
        }],
        correctionNum: [{
          required: true,
          message: '请输入校正数量',
          trigger: 'blur'
        }],
        correctionAfter: [{
          required: true,
          message: '请输入校正后数量',
          trigger: 'blur'
        }],
      },
    }
  },
  watch: {
    asyncVisible(bol) {
      if (!bol) {
        this.ruleForm = {};
        this.$refs.ruleForm.resetFields();
      }
    }
  },
  mounted() {
    const that = this;
    // 根据窗口大小动态修改组件尺寸
    window.onresize = () => {
      that.size = changeSize();
    }
  },
  methods: {
    cellStyle({row, column}) {
      if (row.stock <= row.alarmCount && column.property == "stock") {
        return {
          'color': 'red'
        }
      }
    },
    //计算出校正后重量
    changeAfter() {
      this.$set(this.ruleForm, 'correctionAfter', this.ruleForm.correctionBefore + this.ruleForm.correctionNum * 1)
    },
    // 转圈圈
    functionLoading() {
      this.loadingView = this.$loading({
        lock: true,
        text: '请稍后...',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      });
    },
    //导出Excel
    exportFile() {
      this.functionLoading();
      let params = Object.assign({}, this.search)
      this.$api.Materials.embedded.inventExportxls(params).then(res => {
        downFiles(res, '库存管理信息', 'xls')
        this.loadingView.close()
      })
        .catch(() => {
          this.loadingView.close();
        })
    },
    // 查询按钮列表信息
    searchButtonInfo(bol) {
      if (bol) {
        this.pageNum = 1;
      }
      let params = Object.assign({}, this.search, {
        pageNum: this.pageNum,
        pageSize: this.pageSize
      })
      this.loading = true;
      this.$api.Materials.embedded.inventGetLists(params).then((res) => {
        if (res.statusMsg === 'ok') {
          this.total = res.data.total;
          this.dataList = res.data.list;
        }
        this.loading = false;
      })
    },
    //预警设置按钮
    updatePropAlarm(index) {
      const row = {...this.dataList[index]}
      this.id = row.id
      this.asyncTitle = true;
      this.asyncVisible = true;
      this.disabled = true
      this.ruleForm = row
    },
    //库存校正按钮
    updateProp(index) {
      const row = {...this.dataList[index]}
      this.id = row.id
      this.asyncTitle = false;
      this.asyncVisible = true;
      this.disabled = true
      this.ruleForm = row
      this.ruleForm.correctionBefore = row.stock
      this.ruleForm.remark = row.remark
    },
    // 提交库存校正按钮信息
    submitUpdate: throttle(function () {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          const params = {
            id: this.ruleForm.id,
            correctionNum: this.ruleForm.correctionNum,
            correctionAfter: this.ruleForm.correctionAfter,
            correctionBefore: this.ruleForm.correctionBefore,
            remark: this.ruleForm.remark,
          }
          this.$api.Materials.embedded.inventCheck(params).then((res) => {
            if (res.statusMsg === 'ok') {
              this.asyncVisible = false;
              this.searchButtonInfo(true);
              this.$message.success('库存校正成功!');
            } else {
              this.$message.warning(res.statusMsg);
            }
          })
        }
      })
    }, 3000),
    // 提交预警设置按钮信息
    submitInsert: throttle(function () {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          const params = {
            id: this.ruleForm.id,
            alarmCount: this.ruleForm.alarmCount
          }
          this.$api.Materials.embedded.inventPresAlarm(params).then((res) => {
            if (res.statusMsg === 'ok') {
              this.asyncVisible = false;
              this.searchButtonInfo(true);
              this.$message.success('预警设置成功!');
            } else {
              this.$message.warning(res.statusMsg);
            }
          })
        }
      })
    }, 3000),
    // 判断按钮权限信息
    showButton(str) {
      const pinia = buttonPinia();
      return pinia.$state.buttonInfo.includes(str);
    },
    // 切换页数
    changePageNum(page) {
      this.pageNum = page;
      this.searchButtonInfo();
    },
    // 切换每页条数
    changePageSize(size) {
      this.pageSize = size;
      this.searchButtonInfo();
    }
  }
}
</script>
<style lang="scss" scoped>
@import '@/style/layout-main.scss';
</style>
web/src/views/MaterialsIndex/components/embedded/Type.vue
对比新文件
@@ -0,0 +1,244 @@
<template>
  <div class="main tabs_main" style="height:89%">
    <div class="main_header">
      <div class="header_item">
        <span class="header_label">预埋件名称:</span>
        <el-input v-model="search.embedmentName" :size="size" clearable placeholder="请输入物品名称"></el-input>
      </div>
      <div class="header_item">
        <el-button icon="el-icon-search" v-if="showButton('search')" @click="searchButtonInfo(true)">查询</el-button>
        <el-button class="search_btn" icon="el-icon-plus" v-if="showButton('insert')" @click="insertProp">新增</el-button>
      </div>
    </div>
    <div class="main_content">
      <el-table v-loading="loading" :data="dataList" height="100%">
        <el-table-column align="center" label="序号" width="60">
          <template #default="scope">
            <span>{{ (pageNum - 1) * pageSize + scope.$index + 1 }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="embedmentName" label="预埋件名称" align="center"></el-table-column>
        <el-table-column prop="dictName" label="类别" align="center"></el-table-column>
        <el-table-column prop="embedmentModel" label="型号规格" align="center"></el-table-column>
        <el-table-column prop="unit" label="计量单位" align="center"></el-table-column>
        <el-table-column prop="position" label="位置" align="center"></el-table-column>
        <el-table-column prop="remark" label="备注" align="center" show-overflow-tooltip></el-table-column>
        <el-table-column label="操作" align="center">
          <template #default="{ row }">
            <el-button class="table_btn" size="mini" v-if="showButton('update')" @click="updateProp(row)">修改</el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <div class="main_footer">
      <el-pagination background @current-change="changePageNum" @size-change="changePageSize" :current-page="pageNum"
        :page-sizes="[10, 20, 50, 100]" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper"
        :total="total">
      </el-pagination>
    </div>
    <el-dialog class="prop_dialog" :title="asyncTitle ? '新增辅材种类' : '修改辅材种类'" :close-on-click-modal="false"
      :visible.sync="asyncVisible" width="35%">
      <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="auto" class="rule_form">
        <el-form-item label="预埋件名称:" prop="embedmentName">
          <el-input v-model="ruleForm.embedmentName" :size="size" clearable placeholder="请输入预埋件名称"
            @input="changeInput"></el-input>
        </el-form-item>
        <el-form-item label="类别:" prop="embedmentType">
          <el-select v-model="ruleForm.embedmentType" placeholder="请选择类别">
            <el-option v-for="item in optionsType" :key="item.dictId" :label="item.dictName" :value="item.dictId">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="规格型号:" prop="embedmentModel">
          <el-input v-model="ruleForm.embedmentModel" :size="size" clearable placeholder="请输入规格型号"></el-input>
        </el-form-item>
        <el-form-item label="计量单位:" prop="unit">
          <el-input v-model="ruleForm.unit" :size="size" clearable placeholder="请输入计量单位"></el-input>
        </el-form-item>
        <el-form-item label="位置:" prop="position">
          <el-input v-model="ruleForm.position" :size="size" clearable placeholder="请输入位置"></el-input>
        </el-form-item>
        <el-form-item label="备注:" prop="remark">
          <el-input v-model="ruleForm.remark" :size="size" clearable placeholder="请输入备注" type="textarea"
            :rows="2"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer">
        <el-button @click="asyncVisible = false">取 消</el-button>
        <el-button class="submit_btn" @click="asyncTitle ? submitInsert() : submitUpdate()">提 交</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import {buttonPinia} from '@/pinia/index';
import {throttle, changeSize} from '@/plugins/public'; // 导入节流、动态切换组件尺寸方法
export default {
  data() {
    return {
      size: changeSize(), // 组件尺寸
      pageNum: 1,
      pageSize: 10,
      search: {},//查询条件
      total: 0,
      loading: false,
      optionsType: [],//辅材类别
      dataList: [], //辅材种类信息列表
      asyncTitle: true, // 对话框title 新增:true  修改:false
      asyncVisible: false, // 添加 修改对话框
      ruleForm: {}, // 按钮表单
      rules: {
        embedmentName: [{
          required: true,
          message: '请输入物品名称',
          trigger: 'blur'
        }],
        embedmentModel: [{
          required: true,
          message: '请输入规格型号',
          trigger: 'blur'
        }],
        unit: [{
          required: true,
          message: '请输入单位',
          trigger: 'blur'
        }],
        position: [{
          required: true,
          message: '请输入位置',
          trigger: 'blur'
        }],
      },
    }
  },
  watch: {
    asyncVisible(bol) {
      if (!bol) {
        this.ruleForm = {};
        this.$refs.ruleForm.resetFields();
      }
    }
  },
  mounted() {
    const that = this;
    // 根据窗口大小动态修改组件尺寸
    window.onresize = () => {
      that.size = changeSize();
    }
    that.searchButtonInfo(true);
  },
  methods: {
    //输入增加限制
    changeInput(val) {
      let reg = RegExp(/-/)
      if (reg.test(val)) {
        this.$message.warning('禁止输入‘-’字符!!!')
        this.$set(this.ruleForm, 'embedmentName', '')
      }
    },
    //获取辅材类别信息
    getAllTypes() {
      let params = {
        pageNum: 1,
        pageSize: 100000000
      }
      this.$api.Materials.embedded.typeModels(params).then(res => {
        if (res.statusMsg === 'ok') {
          this.optionsType = res.data
        } else {
          this.$message.warning(res.statusMsg)
        }
      })
    },
    // 查询按钮列表信息
    searchButtonInfo(bol) {
      if (bol) {
        this.pageNum = 1;
      }
      let params = Object.assign({}, this.search, {
        pageNum: this.pageNum,
        pageSize: this.pageSize
      })
      this.loading = true;
      this.$api.Materials.embedded.typeGetLists(params).then((res) => {
        if (res.statusMsg === 'ok') {
          this.total = res.data.total;
          this.dataList = res.data.list;
        }
        this.loading = false;
      })
    },
    // 新增按钮信息
    insertProp() {
      this.asyncTitle = true;
      this.asyncVisible = true;
    },
    // 修改按钮信息
    updateProp(row) {
      this.asyncTitle = false;
      this.asyncVisible = true;
      this.$api.Materials.embedded.typeDetail({id: row.id}).then(res => {
        if (res.statusMsg === 'ok') {
          this.ruleForm = res.data
        } else {
          this.$message.warning(res.statusMsg)
        }
      })
    },
    // 提交添加按钮信息
    submitInsert: throttle(function () {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          const params = Object.assign({}, this.ruleForm);
          this.$api.Materials.embedded.typeInsert(params).then((res) => {
            if (res.statusMsg === 'ok') {
              this.asyncVisible = false;
              this.searchButtonInfo(true);
              this.$message.success('添加成功!');
            } else {
              this.$message.warning(res.statusMsg);
            }
          })
        }
      })
    }, 3000),
    // 提交修改按钮信息
    submitUpdate: throttle(function () {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          const params = Object.assign({}, this.ruleForm);
          this.$api.Materials.embedded.typeUpdate(params).then((res) => {
            if (res.statusMsg === 'ok') {
              this.asyncVisible = false;
              this.searchButtonInfo(true);
              this.$message.success('修改成功!');
            } else {
              this.$message.warning(res.statusMsg);
            }
          })
        }
      })
    }, 3000),
    // 判断按钮权限信息
    showButton(str) {
      const pinia = buttonPinia();
      return pinia.$state.buttonInfo.includes(str);
    },
    // 切换页数
    changePageNum(page) {
      this.pageNum = page;
      this.searchButtonInfo();
    },
    // 切换每页条数
    changePageSize(size) {
      this.pageSize = size;
      this.searchButtonInfo();
    }
  }
}
</script>
<style lang="scss" scoped>
@import '@/style/layout-main.scss';
</style>
web/src/views/ProductPlan/DuctPracticalRaw.vue
@@ -6,11 +6,11 @@
      <div class="header_item">
        <span class="header_label">日期:</span>
        <el-date-picker v-model="datePicker" type="daterange" range-separator="至" start-placeholder="开始日期"
          end-placeholder="结束日期" value-format="yyyy-MM-dd HH:mm:ss" @change="dateChange">
          end-placeholder="结束日期" value-format="yyyy-MM-dd" @change="dateChange">
        </el-date-picker>
      </div>
      <div class="header_item">
        <el-button icon="el-icon-search" v-if="showButton('search')" @click="query">查询</el-button>
        <el-button icon="el-icon-search" v-if="showButton('search')" @click="queryReset">查询</el-button>
        <el-button class="search_btn" icon="el-icon-plus" v-if="showButton('insert')" @click="addRow">新增</el-button>
        <el-button icon="el-icon-upload2" v-if="showButton('export')" @click="exportExcel">导出Excel</el-button>
      </div>
@@ -25,13 +25,16 @@
          </template>
        </el-table-column>
        <!--  -->
        <el-table-column align="center" label="操作" width="74">
        <el-table-column align="center" label="操作" width="76">
          <template #default="{ row }">
            <el-button size="mini" @click="copyRow(row)">复制</el-button>
            <el-button class="copyBtn" size="mini" @click="copyRow(row)">复制</el-button>
          </template>
        </el-table-column>
        <!--  -->
        <el-table-column prop="materialReleaseTime" align="center" label="时间">
        <el-table-column prop="materialReleaseTime" align="center" label="记录时间" width="136">
        </el-table-column>
        <!--  -->
        <el-table-column prop="dataTime" align="center" label="数据日期" width="86">
        </el-table-column>
        <!--  -->
        <el-table-column prop="quantity" align="center" label="方量">
@@ -53,7 +56,7 @@
          </el-table-column>
        </el-table-column>
        <!--  -->
        <el-table-column label="操作" align="center" width="138">
        <el-table-column label="操作" align="center" width="140">
          <template #default="{ row }">
            <el-button class="table_btn" size="mini" v-if="showButton('update')" @click="updateRow(row)">修改</el-button>
            <el-button class="delete_btn" size="mini" v-if="showButton('delete')" @click="deleteRow(row)">删除</el-button>
@@ -71,27 +74,33 @@
    <!-- dialog-->
    <el-dialog class="prop_dialog" v-if="isRender" :title="dialogTitle" :visible.sync="asyncVisible" width="700px"
      @close="closeForm">
      <el-form :inline="true" size="mini" :model="form" label-width="auto" class="rule_form">
      <el-form :inline="true" size="mini" :model="form" :rules="rules" ref="ruleForm" label-width="auto"
        class="rule_form">
        <!-- 理论 -->
        <div class="elFormTitle">理论配比(kg/m³)</div>
        <div class="labelText">理论配比(kg/m³)</div>
        <!-- 理论配比 -->
        <el-form-item v-for="item in form.materialTheory" :key="`${item.dictId}${item.releaseType}`"
        <el-form-item style="width:282px" v-for="item in form.materialTheory" :key="`${item.dictId}${item.releaseType}`"
          :label="item.dictName">
          <el-input placeholder="请输入" type="number" v-model="item.releaseData" @input="doCompute($event, item.dictId)"
            clearable></el-input>
        </el-form-item>
        <!-- 方量 -->
        <el-form-item class="elFormTitle" type="number" label="方量(m³)" style="width:90%">
        <el-form-item class="labelText2" type="number" label="方量(m³)" style="width:574px">
          <el-input placeholder="请输入" v-model="form.quantity" @input="doComputeMulti($event)"></el-input>
        </el-form-item>
        <!-- 日期 -->
        <el-form-item class="labelText2" type="number" label="数据日期" prop="dataTime" style="width:574px">
          <el-date-picker v-model="form.dataTime" placeholder="选择日期" value-format="yyyy-MM-dd"></el-date-picker>
        </el-form-item>
        <!-- 实际配比 -->
        <el-form-item v-for="item in form.materialReal" :key="`${item.dictId}${item.releaseType}`" :label="item.dictName">
        <el-form-item style="width:282px" v-for="item in form.materialReal" :key="`${item.dictId}${item.releaseType}`"
          :label="item.dictName">
          <el-input type="number" v-model="item.releaseData" :disabled="true" clearable></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer">
        <el-button @click="asyncVisible = false">取 消</el-button>
        <el-button class="submit_btn" @click="onSubmit">提 交</el-button>
        <el-button class="submit_btn" @click="onSubmit('ruleForm')">提 交</el-button>
      </div>
    </el-dialog>
  </div>
@@ -116,6 +125,9 @@
        pageSize: 10,
        strTime: '',
        endTime: ''
      },
      rules: {
        dataTime: [{required: true, message: '请选择日期', trigger: 'change'}]
      },
      form: null, // 表单数据 {}
      materialNames: [], // 原料名称
@@ -148,11 +160,9 @@
      this.$api.Ducts.practicalRaw.getLists(params).then(res => {
        this.loading = false
        if (res.statusMsg === 'ok') {
          this.total = res.data.total
          this.dataLists = res.data.list
          this.dataLists.forEach(item => {
            // 接口返回是混一起的数据,,需要清洗.
          let lists = res.data.list
          // 接口返回是混一起的数据,,需要清洗.
          lists.forEach(item => {
            item.treleaseTheoryData = []
            item.treleaseRealData = []
            item.treleaseTheoryKeys = {}
@@ -172,6 +182,8 @@
              })
            }
          })
          this.total = res.data.total
          this.dataLists = lists
        } else {
          this.$message.warning(res.statusMsg)
        }
@@ -198,13 +210,14 @@
      return this.materialNameKeys[id] || ''
    },
    setFormProps(options = {}) {
      const {quantity = 1, materialTheory = [], materialReal = []} = options
      const {quantity = 1, dataTime = null, materialTheory = [], materialReal = []} = options
      let _form = {
        quantity,   // 方量
        dataTime,  // 数据时间
        materialTheory, // 原料理论信息
        materialReal // 原料实际信息信息
      }
      if (materialTheory.length) {
      if (Object.keys(options).length) {
        this.form = _form
        return
      }
@@ -256,18 +269,22 @@
    },
    closeForm() {
      this.asyncVisible = false
      this.resetForm('ruleForm')
      this.setFormProps()
    },
    resetForm(formName) {
      this.$refs[formName].resetFields()
    },
    dateChange(dates) {
      dates = dates || []
      if (dates.length) {
        dates[1] = dates[1].slice(0, -8) + '23:59:59'
      }
      // if (dates.length) {
      //   dates[1] = dates[1].slice(0, -8) + '23:59:59'
      // }
      this.queryInfo.strTime = dates[0] || ''
      this.queryInfo.endTime = dates[1] || ''
    },
    // 查询按钮列表信息
    query() {
    queryReset() {
      this.queryInfo.pageNum = 1
      this.queryInfo.pageSize = 10
      this.getLists()
@@ -276,46 +293,33 @@
      this.submitMode = 'add'
      this.showForm()
    },
    // 根据 materialNameKeys 的顺序来进行数据排序.
    getSortRow(row) {
      const {quantity, dataTime, treleaseTheoryData, treleaseRealData} = row
      const sorts = Object.keys(this.materialNameKeys)
      treleaseTheoryData.sort(function (a, b) {
        return (sorts.indexOf(a.dictId) - sorts.indexOf(b.dictId))
      })
      treleaseRealData.sort(function (a, b) {
        return (sorts.indexOf(a.dictId) - sorts.indexOf(b.dictId))
      })
      return {
        quantity,
        dataTime,
        materialTheory: treleaseTheoryData,
        materialReal: treleaseRealData,
      }
    },
    copyRow(row) {
      this.submitMode = 'copy'
      this.rowId = row.materialReleaseId
      let _materialIds = []
      this.materialNames.forEach(item => {
        _materialIds.push(item.dictId)
      })
      row.treleaseTheoryData.sort(function (a, b) {
        return (_materialIds.indexOf(a.dictId) - _materialIds.indexOf(b.dictId))
      })
      row.treleaseRealData.sort(function (a, b) {
        return (_materialIds.indexOf(a.dictId) - _materialIds.indexOf(b.dictId))
      })
      let opts = {
        quantity: row.quantity,
        materialTheory: row.treleaseTheoryData,
        materialReal: row.treleaseRealData,
      }
      this.setFormProps(opts)
      this.setFormProps(this.getSortRow(row))
      this.showForm()
    },
    updateRow(row) {
      this.submitMode = 'update'
      this.rowId = row.materialReleaseId
      let _materialIds = []
      this.materialNames.forEach(item => {
        _materialIds.push(item.dictId)
      })
      row.treleaseTheoryData.sort(function (a, b) {
        return (_materialIds.indexOf(a.dictId) - _materialIds.indexOf(b.dictId))
      })
      row.treleaseRealData.sort(function (a, b) {
        return (_materialIds.indexOf(a.dictId) - _materialIds.indexOf(b.dictId))
      })
      let opts = {
        quantity: row.quantity,
        materialTheory: row.treleaseTheoryData,
        materialReal: row.treleaseRealData,
      }
      this.setFormProps(opts)
      this.setFormProps(this.getSortRow(row))
      this.showForm()
    },
    deleteRow(row) {
@@ -327,7 +331,7 @@
        this.$api.Ducts.practicalRaw.delete({materialReleaseId: row.materialReleaseId})
          .then(res => {
            if (res.statusMsg === 'ok') {
              this.query()
              this.queryReset()
              this.$message.success("删除成功!")
            } else {
              this.$message.warning(res.statusMsg)
@@ -337,41 +341,44 @@
        this.$message.warning("您已取消");
      })
    },
    onSubmit: throttle(function () {
      const {quantity, materialTheory, materialReal} = this.form
      let releaseData = [...materialTheory, ...materialReal]
      // 为空数据,重置为0,否则接口报错
      releaseData.forEach(item => {
        if (!item.releaseData) {
          item.releaseData = 0
    onSubmit: throttle(function (formName) {
      this.$refs[formName].validate((valid) => {
        if (!valid) return false
        const {quantity, dataTime, materialTheory, materialReal} = this.form
        let releaseData = [...materialTheory, ...materialReal]
        // releaseData是空数据需要重置为0,否则接口报错
        releaseData.forEach(item => {
          if (!item.releaseData) {
            item.releaseData = 0
          }
        })
        let params = {quantity, dataTime, releaseData}
        if (this.isUpdate) {
          // 更新
          params.materialReleaseId = this.rowId
          this.$api.Ducts.practicalRaw.update(params).then(res => {
            if (res.statusMsg === 'ok') {
              this.closeForm()
              this.getLists()
              this.$message.success('修改成功!')
            } else {
              this.$message.warning(res.statusMsg)
            }
          })
        } else {
          // 添加 | 复制
          this.$api.Ducts.practicalRaw.insert(params).then(res => {
            if (res.statusMsg === 'ok') {
              this.closeForm()
              this.getLists()
              this.$message.success('添加成功!')
            } else {
              this.$message.warning(res.statusMsg)
            }
          })
        }
      })
      let params = {quantity, releaseData}
      if (this.isUpdate) {
        // 更新
        params.materialReleaseId = this.rowId
        this.$api.Ducts.practicalRaw.update(params).then(res => {
          if (res.statusMsg === 'ok') {
            this.closeForm()
            this.getLists()
            this.$message.success('修改成功!')
          } else {
            this.$message.warning(res.statusMsg)
          }
        })
      } else {
        // 添加 复制
        this.$api.Ducts.practicalRaw.insert(params).then(res => {
          if (res.statusMsg === 'ok') {
            this.closeForm()
            this.getLists()
            this.$message.success('添加成功!')
          } else {
            this.$message.warning(res.statusMsg)
          }
        })
      }
    }, 3000),
    }, 1000),
    exportExcel() {
      let params = this.queryInfo
      this.$api.Ducts.practicalRaw.exportXls(params).then(res => {
@@ -404,7 +411,30 @@
<style lang="scss" scoped>
@import '../../style/layout-main.scss';
.elFormTitle {
/deep/ {
  &::-webkit-scrollbar {
    width: 8px;
    height: 8px;
  }
  &::-webkit-scrollbar-corner {
    background-color: transparent;
  }
  &::-webkit-scrollbar-thumb {
    border-radius: 10px;
    box-shadow: inset 0 0 5px transparent;
    background: #39B5FE;
  }
  &::-webkit-scrollbar-track {
    box-shadow: inset 0 0 5px transparent;
    border-radius: 10px;
    background: rgba(76, 188, 254, .3);
  }
}
.labelText {
  display: block;
  font-weight: bold;
  color: #39B5FE;
@@ -428,8 +458,32 @@
  }
}
/deep/.prop_dialog .elFormTitle .el-form-item__label {
::v-deep .labelText2 .el-form-item__label-wrap .el-form-item__label {
  font-weight: bold;
  color: #39B5FE;
}
.el-table ::v-deep {
  border: 1px solid #39B5FE;
  .copyBtn {
    background-position: unset;
  }
  th.el-table__cell {
    border-bottom: 1px solid #39B5FE;
    border-right: 1px solid #39B5FE;
    background: rgba(76, 188, 254, .16) !important;
  }
  tr {
    background: none !important;
  }
  th.el-table__cell.is-leaf,
  td.el-table__cell {
    border-bottom: 1px solid #39B5FE;
    border-right: 1px solid #39B5FE;
  }
}
</style>
web/src/views/ProjectManage/ProjectsIndex.vue
@@ -1,415 +1,522 @@
<template>
  <!-- 工程项目管理 ==> 项目管理-->
  <div class="main">
    <!-- header-->
    <div class="main_header" style="flex-direction: row-reverse;">
      <!-- <div class="header_item">
        <span class="header_label">类型:</span>
        <el-select v-model="search.dictType" placeholder="请选择类型" clearable>
            <el-option
            v-for="item in optionsType"
            :key="item.value"
            :label="item.label"
            :value="item.value">
            </el-option>
        </el-select>
      </div> -->
      <div class="header_item" style="margin-right:0px">
        <!-- <el-button   :size="size" v-if="showButton('search')" @click="searchButtonInfo(true)">查询</el-button> -->
        <el-button class="search_btn" icon="el-icon-plus" v-if="showButton('insert')" @click="insertProp">新增</el-button>
        <el-button class="search_btn" icon="el-icon-plus" v-if="showButton('insert')" @click="addRow">新增</el-button>
      </div>
    </div>
    <!-- content-->
    <div class="main_content">
      <el-table
        v-loading="loading"
        :data="dataList"
        height="100%">
        <el-table-column align="center" label="序号" width="60">
      <el-table v-loading="loading" :data="dataList" height="100%">
        <el-table-column align="center" label="序号" width="48">
          <template #default="scope">
            <span>{{(pageNum - 1) * pageSize + scope.$index + 1}}</span>
            <span>{{ (queryInfo.pageNum - 1) * queryInfo.pageSize + scope.$index + 1 }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="proName" label="项目名称" align="center" ></el-table-column>
        <el-table-column  label="尺寸" align="center" show-overflow-tooltip>
            <template #default="{row}">
                <div>{{showInfo(row.proSizes)}}</div>
            </template>
        <el-table-column label="已完成(块)" align="center">
          <template #default="{ row }">
            <div style="cursor: pointer;" @click="showDetail(row)">{{ row.completedQuantity }}</div>
          </template>
        </el-table-column>
        <el-table-column  label="配筋" align="center" show-overflow-tooltip>
            <template #default="{row}">
                <div>{{showInfo(row.proHas)}}</div>
            </template>
        <el-table-column prop="proName" label="项目名称" align="center" width="160"></el-table-column>
        <el-table-column label="尺寸" align="center" show-overflow-tooltip>
          <template #default="{ row }">
            <div>{{ showInfo(row.proSizes) }}</div>
          </template>
        </el-table-column>
        <el-table-column  label="转向" align="center" show-overflow-tooltip>
            <template #default="{row}">
                <div>{{showInfo(row.proTurns)}}</div>
            </template>
        <el-table-column label="配筋" align="center" show-overflow-tooltip>
          <template #default="{ row }">
            <div>{{ showInfo(row.proHas) }}</div>
          </template>
        </el-table-column>
        <el-table-column label="转向" align="center" show-overflow-tooltip>
          <template #default="{ row }">
            <div>{{ showInfo(row.proTurns) }}</div>
          </template>
        </el-table-column>
        <el-table-column label="注浆孔" align="center" show-overflow-tooltip>
            <template #default="{row}">
                <div>{{showInfo(row.proGroutings)}}</div>
            </template>
          <template #default="{ row }">
            <div>{{ showInfo(row.proGroutings) }}</div>
          </template>
        </el-table-column>
        <el-table-column label="块号" align="center" show-overflow-tooltip>
            <template #default="{row}">
                <div>{{showInfo(row.proBloks)}}</div>
            </template>
          <template #default="{ row }">
            <div>{{ showInfo(row.proBloks) }}</div>
          </template>
        </el-table-column>
        <el-table-column prop="startDate" label="开始日期" align="center" show-overflow-tooltip></el-table-column>
        <el-table-column prop="createUnit" label="建设单位" align="center"></el-table-column>
        <el-table-column prop="planUnit" label="设计单位" align="center"></el-table-column>
        <el-table-column prop="supervisionUnit" label="监理单位" align="center"></el-table-column>
        <el-table-column prop="constructionUnit" label="施工单位" align="center"></el-table-column>
        <el-table-column prop="outsideDiameter" label="外径" align="center"></el-table-column>
        <el-table-column prop="innerDiameter" label="内径" align="center"></el-table-column>
        <el-table-column prop="thickness" label="厚度" align="center"></el-table-column>
        <el-table-column prop="ringWidth" label="环宽" align="center"></el-table-column>
        <el-table-column prop="concreteStrengthGrade" label="混凝土强度等级" align="center"></el-table-column>
        <el-table-column prop="impermeabilityLevel" label="抗渗等级" align="center"></el-table-column>
        <el-table-column prop="waterproofType" label="有无外弧面防水" align="center">
          <template #default="{ row }">
            <div>{{ row.waterproofType === 0 ? '有' : '无' }}</div>
          </template>
        </el-table-column>
        <el-table-column prop="startDate" label="开始日期" align="center" width="86"></el-table-column>
        <el-table-column prop="proTime" label="工期(月)" align="center"></el-table-column>
        <el-table-column prop="planOutput" label="总需求(环)" align="center"></el-table-column>
        <el-table-column label="操作" align="center">
          <template #default="{ row }">
            <el-button class="table_btn" size="mini" v-if="showButton('stop')" @click="deleteInfo(row)">停用</el-button>
            <el-button class="delete_btn" size="mini" v-if="showButton('update')" @click="updateProp(row)">修改</el-button>
        <el-table-column label="操作" align="center" width="140">
          <template #default="scope">
            <el-button class="table_btn" size="mini" v-if="showButton('stop')"
              @click="deleteRow(scope.row)">停用</el-button>
            <el-button class="delete_btn" size="mini" v-if="showButton('update')"
              @click="updateRow(scope.$index)">修改</el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <!-- footer-->
    <div class="main_footer">
      <el-pagination
        background
        @current-change="changePageNum"
        @size-change="changePageSize"
        :current-page="pageNum"
        :page-sizes="[10, 20, 50, 100]"
        :page-size="pageSize"
        layout="total, sizes, prev, pager, next, jumper"
        :total="total">
      <el-pagination background @current-change="changePageNum" @size-change="changePageSize"
        :current-page="queryInfo.pageNum" :page-sizes="[10, 20, 50, 100]" :page-size="queryInfo.pageSize"
        layout="total, sizes, prev, pager, next, jumper" :total="total">
      </el-pagination>
    </div>
    <el-dialog
      class="prop_dialog"
      :title="asyncTitle ? '新增项目' : '修改项目'"
      :close-on-click-modal="false"
      :visible.sync="asyncVisible"
      width="35%">
      <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="auto" class="rule_form">
        <el-form-item label="项目名称:" prop="proName">
          <el-input v-model="ruleForm.proName" :size="size" clearable placeholder="请输入项目名称"></el-input>
    <!-- dialog -->
    <el-dialog class="prop_dialog" v-if="isRender" :title="dialogTitle" :visible.sync="asyncVisible" width="35%"
      @close="closeForm">
      <el-form ref="ruleForm" size="mini" :model="ruleForm" :rules="rules" label-width="auto" class="rule_form">
        <el-form-item label="项目名称" prop="proName">
          <el-input v-model="ruleForm.proName" clearable placeholder="请输入项目名称"></el-input>
        </el-form-item>
        <el-form-item label="项目简介:" prop="proDesc">
          <el-input v-model="ruleForm.proDesc" :size="size" type="textarea" :rows="3" clearable placeholder="请输入内容"></el-input>
        <el-form-item label="项目简介:" prop="proDesc">
          <el-input v-model="ruleForm.proDesc" type="textarea" :rows="3" clearable placeholder="请输入内容"></el-input>
        </el-form-item>
        <el-form-item label="尺寸(m):" prop="sizes">
        <el-form-item label="尺寸(m):" prop="sizes">
          <el-select v-model="ruleForm.sizes" placeholder="请选择尺寸" multiple>
                <el-option
                v-for="item in optionsSize"
                :key="item.dictId"
                :label="item.dictName"
                :value="item.dictId">
                </el-option>
            </el-select>
            <el-option v-for="item in optionsSize" :key="item.dictId" :label="item.dictName" :value="item.dictId">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="配筋:" prop="hass">
        <el-form-item label="配筋:" prop="hass">
          <el-select v-model="ruleForm.hass" placeholder="请选择配筋" multiple>
                <el-option
                v-for="item in optionsHass"
                :key="item.dictId"
                :label="item.dictName"
                :value="item.dictId">
                </el-option>
            </el-select>
            <el-option v-for="item in optionsHass" :key="item.dictId" :label="item.dictName" :value="item.dictId">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="转向:" prop="turns">
        <el-form-item label="转向:" prop="turns">
          <el-select v-model="ruleForm.turns" placeholder="请选择转向" multiple>
                <el-option
                v-for="item in optionsTurn"
                :key="item.dictId"
                :label="item.dictName"
                :value="item.dictId">
                </el-option>
            </el-select>
            <el-option v-for="item in optionsTurn" :key="item.dictId" :label="item.dictName" :value="item.dictId">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="注浆孔:" prop="groutings">
        <el-form-item label="注浆孔:" prop="groutings">
          <el-select v-model="ruleForm.groutings" placeholder="请选择注浆孔" multiple>
                <el-option
                v-for="item in optionsGrout"
                :key="item.dictId"
                :label="item.dictName"
                :value="item.dictId">
                </el-option>
            </el-select>
            <el-option v-for="item in optionsGrout" :key="item.dictId" :label="item.dictName" :value="item.dictId">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="块号:" prop="bloks">
        <el-form-item label="块号:" prop="bloks">
          <el-select v-model="ruleForm.bloks" placeholder="请选择块号" multiple>
                <el-option
                v-for="item in optionsBlocks"
                :key="item.dictId"
                :label="item.dictName"
                :value="item.dictId">
                </el-option>
            </el-select>
            <el-option v-for="item in optionsBlocks" :key="item.dictId" :label="item.dictName" :value="item.dictId">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="建设单位:" prop="createUnit">
          <el-input v-model="ruleForm.createUnit" clearable placeholder="请输入"></el-input>
        </el-form-item>
        <el-form-item label="设计单位:" prop="planUnit">
          <el-input v-model="ruleForm.planUnit" clearable placeholder="请输入"></el-input>
        </el-form-item>
        <el-form-item label="监理单位:" prop="supervisionUnit">
          <el-input v-model="ruleForm.supervisionUnit" clearable placeholder="请输入"></el-input>
        </el-form-item>
        <el-form-item label="施工单位:" prop="constructionUnit">
          <el-input v-model="ruleForm.constructionUnit" clearable placeholder="请输入"></el-input>
        </el-form-item>
        <el-form-item label="外径:" prop="outsideDiameter">
          <el-input v-model="ruleForm.outsideDiameter" clearable placeholder="请输入"></el-input>
        </el-form-item>
        <el-form-item label="内径:" prop="innerDiameter">
          <el-input v-model="ruleForm.innerDiameter" clearable placeholder="请输入"></el-input>
        </el-form-item>
        <el-form-item label="厚度:" prop="thickness">
          <el-input v-model="ruleForm.thickness" clearable placeholder="请输入"></el-input>
        </el-form-item>
        <el-form-item label="环宽:" prop="ringWidth">
          <el-input v-model="ruleForm.ringWidth" clearable placeholder="请输入"></el-input>
        </el-form-item>
        <el-form-item label="混凝土强度等级:" prop="concreteStrengthGrade">
          <el-input v-model="ruleForm.concreteStrengthGrade" clearable placeholder="请输入"></el-input>
        </el-form-item>
        <el-form-item label="抗渗等级:" prop="impermeabilityLevel">
          <el-input v-model="ruleForm.impermeabilityLevel" clearable placeholder="请输入"></el-input>
        </el-form-item>
        <el-form-item label="有无外弧面防水:" prop="waterproofType">
          <el-radio-group v-model="ruleForm.waterproofType">
            <el-radio :label="0">有</el-radio>
            <el-radio :label="1">无</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item label="开始日期:" prop="startDate">
          <el-date-picker
                v-model="ruleForm.startDate"
                type="date"
                style="width:100%"
                value-format="yyyy-MM-dd"
                placeholder="请选择开始日期">
            </el-date-picker>
          <el-date-picker v-model="ruleForm.startDate" type="date" style="width:100%" value-format="yyyy-MM-dd"
            placeholder="请选择开始日期">
          </el-date-picker>
        </el-form-item>
        <el-form-item label="工期(月):" prop="proTime">
          <el-input v-model="ruleForm.proTime" :size="size" type="number" clearable placeholder="请输入工期"></el-input>
        <el-form-item label="工期(月):" prop="proTime">
          <el-input v-model="ruleForm.proTime" type="number" clearable placeholder="请输入"></el-input>
        </el-form-item>
        <el-form-item label="总需求(环):" prop="planOutput">
          <el-input v-model="ruleForm.planOutput" :size="size" type="number" clearable placeholder="请输入总需求"></el-input>
        <el-form-item label="总需求(环):" prop="planOutput">
          <el-input v-model="ruleForm.planOutput" type="number" clearable placeholder="请输入"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer">
        <el-button @click="asyncVisible = false">取 消</el-button>
        <el-button class="submit_btn" @click="asyncTitle ? submitInsert() : submitUpdate()">提 交</el-button>
        <el-button class="submit_btn" @click="onSubmit('ruleForm')">提 交</el-button>
      </div>
    </el-dialog>
    <!-- detail dialog -->
    <el-dialog class="prop_dialog" v-if="detail.isRenderDetail" title="管片数量" :visible.sync="detail.asyncVisible"
      width="800px">
      <cpnTable :table-index="true" :table-data="detail.tableData" :table-columns-config="detail.tableColumns"
        :page-total="detail.total" :page-num.sync="detail.pageNum" :page-size.sync="detail.pageSize"
        :page-change="pageChange">
      </cpnTable>
    </el-dialog>
  </div>
</template>
<script>
import { buttonPinia } from '../../pinia/index';
import { throttle, changeSize } from '../../plugins/public'; // 导入节流、动态切换组件尺寸方法
  export default {
    data() {
      return {
        size: changeSize(), // 组件尺寸
import {buttonPinia} from '../../pinia/index';
import {throttle} from '../../plugins/public'; // 导入节流、动态切换组件尺寸方法
import cpnTable from '@/components/table/Table'
export default {
  data() {
    return {
      isRender: false,
      loading: false,
      submitMode: '', // add update
      asyncVisible: false, // 添加 修改对话框
      total: 0,
      queryInfo: {
        pageNum: 1,
        pageSize: 10,
        search:{},//查询条件
      },
      dataList: [],
      ruleForm: {}, // 表单数据 {}
      rules: {
        proName: [{required: true, message: '请输入', trigger: 'blur'}],
        proDesc: [{required: true, message: '请输入', trigger: 'blur'}],
        sizes: [{required: true, message: '请选择', trigger: 'blur'}],
        hass: [{required: true, message: '请选择', trigger: 'blur'}],
        turns: [{required: true, message: '请选择', trigger: 'blur'}],
        groutings: [{required: true, message: '请选择', trigger: 'blur'}],
        bloks: [{required: true, message: '请选择', trigger: 'blur'}],
        createUnit: [{required: true, message: '请输入', trigger: 'blur'}],
        planUnit: [{required: true, message: '请输入', trigger: 'blur'}],
        supervisionUnit: [{required: true, message: '请输入', trigger: 'blur'}],
        constructionUnit: [{required: true, message: '请输入', trigger: 'blur'}],
        outsideDiameter: [{required: true, message: '请输入', trigger: 'blur'}],
        innerDiameter: [{required: true, message: '请输入', trigger: 'blur'}],
        thickness: [{required: true, message: '请输入', trigger: 'blur'}],
        ringWidth: [{required: true, message: '请输入', trigger: 'blur'}],
        concreteStrengthGrade: [{required: true, message: '请输入', trigger: 'blur'}],
        impermeabilityLevel: [{required: true, message: '请输入', trigger: 'blur'}],
        waterproofType: [{required: true, message: '请选择', trigger: 'blur'}],
      },
      optionsSize: [],//尺寸下拉框
      optionsHass: [],//配筋下拉框
      optionsTurn: [],//转向下拉框
      optionsGrout: [],//注浆孔下拉框
      optionsBlocks: [],//块号下拉框
      detail: {
        rowId: '',
        isRenderDetail: false,
        asyncVisible: false,
        pageNum: 1,
        pageSize: 10,
        total: 0,
        loading: false,
        dataList: [], //项目管理信息列表
        asyncTitle: true, // 对话框title 新增:true  修改:false
        asyncVisible: false, // 添加 修改对话框
        ruleForm: {
        }, // 按钮表单
        rules: {
          proName: [{
            required: true,
            message: '请输入项目名称',
            trigger: 'blur'
          }],
          proDesc: [{
            required: true,
            message: '请输入项目简介',
            trigger: 'blur'
          }],
          sizes: [{
            required: true,
            message: '请选择尺寸',
            trigger: 'blur'
          }],
          hass: [{
            required: true,
            message: '请选择配筋',
            trigger: 'blur'
          }],
          turns: [{
            required: true,
            message: '请选择转向',
            trigger: 'blur'
          }],
          groutings: [{
            required: true,
            message: '请选择注浆孔',
            trigger: 'blur'
          }],
          bloks: [{
            required: true,
            message: '请选择块号',
            trigger: 'blur'
          }],
        },
        optionsSize:[],//尺寸下拉框
        optionsHass:[],//配筋下拉框
        optionsTurn:[],//转向下拉框
        optionsGrout:[],//注浆孔下拉框
        optionsBlocks:[],//块号下拉框
      }
    },
    watch: {
      asyncVisible(bol) {
        if(!bol) {
          this.ruleForm = {};
          this.$refs['ruleForm'].resetFields();
        }
      }
    },
    mounted() {
      const that = this;
      // 根据窗口大小动态修改组件尺寸
      window.onresize = () => {
        that.size = changeSize();
      }
      that.searchButtonInfo(true);
      that.getAllTypes()//获取尺寸配筋等信息
    },
    methods: {
      //table上展示尺寸等信息
      showInfo(val){
        let str=''
        let str1 = ''
        if(val.length===1){
            str = val[0].dictName
        }else{
            val.forEach(item=>{
                str+=item.dictName+','
            })
            str1 = str.lastIndexOf(',')
            str = str.substring(0,str1)
        }
        return str
      },
      //获取尺寸配筋转向等信息
      getAllTypes(){
        let params = {
            pageNum: 1,
            pageSize: 100000000
        }
        this.$api.Dictionary.searchDictionary(params).then(res=>{
            if(res.statusMsg === 'ok'){
                this.optionsSize = res.data.list.filter(item =>item.dictType === '1')
                this.optionsHass = res.data.list.filter(item =>item.dictType === '2')
                this.optionsTurn = res.data.list.filter(item =>item.dictType === '3')
                this.optionsGrout = res.data.list.filter(item =>item.dictType === '4')
                this.optionsBlocks = res.data.list.filter(item =>item.dictType === '5')
            }else{
                this.$message.warning(res.statusMsg)
            }
        })
      },
      // 查询按钮列表信息
      searchButtonInfo(bol) {
        if(bol) {
          this.pageNum = 1;
        }
        let params = Object.assign({},this.search,{
          pageNum: this.pageNum,
          pageSize: this.pageSize
        })
        this.loading = true;
        this.$api.Engineer.searchProjects(params).then((res) => {
          if(res.statusMsg === 'ok') {
            this.total = res.data.total;
            this.dataList = res.data.list;
          }
          this.loading = false;
        })
      },
      // 新增按钮信息
      insertProp() {
        this.asyncTitle = true;
        this.asyncVisible = true;
      },
      // 修改按钮信息
      updateProp(row) {
        this.asyncTitle = false;
        this.asyncVisible = true;
        this.$api.Engineer.detailsProjects({proId: row.proId}).then(res=>{
            if(res.statusMsg === 'ok'){
                this.ruleForm = res.data
                let sizeArr = []
                let hassArr = []
                let turnArr = []
                let groutArr = []
                let blockArr = []
                res.data.proSizes.forEach(item=>{
                    sizeArr.push(item.sizes)
                })
                res.data.proHas.forEach(item=>{
                    hassArr.push(item.hasSteel)
                })
                res.data.proTurns.forEach(item=>{
                    turnArr.push(item.turn)
                })
                res.data.proGroutings.forEach(item=>{
                    groutArr.push(item.groutingHoles)
                })
                res.data.proBloks.forEach(item=>{
                    blockArr.push(item.blockNum)
                })
                this.$set(this.ruleForm,'sizes',sizeArr)
                this.$set(this.ruleForm,'hass',hassArr)
                this.$set(this.ruleForm,'turns',turnArr)
                this.$set(this.ruleForm,'groutings',groutArr)
                this.$set(this.ruleForm,'bloks',blockArr)
            }else{
                this.$message.warning(res.statusMsg)
            }
        })
      },
      // 删除按钮信息
      deleteInfo(row) {
        this.$confirm("该操作将删除该信息,是否继续删除?", "提示", {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning"
       })
       .then(() => {
         this.$api.Engineer.deleteProjects({proId: row.proId})
        .then(res => {
          if(res.statusMsg === 'ok') {
            this.searchButtonInfo(true);
            this.$message.success("删除成功!");
          } else {
            this.$message.warning(res.statusMsg);
          }
        })
       })
       .catch(() => {
         this.$message.warning("您已取消");
       })
      },
      // 提交添加按钮信息
      submitInsert: throttle(function() {
        this.$refs.ruleForm.validate((valid) => {
          if(valid) {
            const params = Object.assign({}, this.ruleForm);
            this.$api.Engineer.insertProjects(params).then((res) => {
              if(res.statusMsg === 'ok') {
                this.asyncVisible = false;
                this.searchButtonInfo(true);
                this.$message.success('添加成功!');
              } else {
                this.$message.warning(res.statusMsg);
              }
            })
          }
        })
      }, 3000),
      // 提交修改按钮信息
      submitUpdate: throttle(function() {
        this.$refs.ruleForm.validate((valid) => {
          if(valid) {
            const params = Object.assign({}, this.ruleForm);
            this.$api.Engineer.updateProjects(params).then((res) => {
              if(res.statusMsg === 'ok') {
                this.asyncVisible = false;
                this.searchButtonInfo(true);
                this.$message.success('添加成功!');
              } else {
                this.$message.warning(res.statusMsg);
              }
            })
          }
        })
      }, 3000),
      // 判断按钮权限信息
      showButton(str) {
        const pinia = buttonPinia();
        return pinia.$state.buttonInfo.includes(str);
      },
      // 切换页数
      changePageNum(page) {
        this.pageNum = page;
        this.searchButtonInfo();
      },
      // 切换每页条数
      changePageSize(size) {
        this.pageSize = size;
        this.searchButtonInfo();
        tableData: [],
        tableColumns: [],
      }
    }
  },
  components: {
    cpnTable
  },
  computed: {
    dialogTitle() {
      return this.submitMode === 'update' ? '修改项目' : '新增项目'
    },
    isUpdate() {
      return this.submitMode === 'update'
    },
  },
  created() {
    this.setFormProps()
    this.getAllTypes()
    this.getLists()
  },
  methods: {
    getLists() {
      let params = this.queryInfo
      this.loading = true
      this.$api.Engineer.searchProjects(params).then(res => {
        this.loading = false
        if (res.statusMsg === 'ok') {
          this.total = res.data.total
          this.dataList = res.data.list
        }
      })
    },
    //获取尺寸配筋转向等信息
    getAllTypes() {
      let params = {pageNum: 1, pageSize: 100000000}
      this.$api.Dictionary.searchDictionary(params).then(res => {
        if (res.statusMsg === 'ok') {
          res.data.list.forEach(item => {
            switch (item.dictType) {
              case '1':
                this.optionsSize.push(item)
                break
              case '2':
                this.optionsHass.push(item)
                break
              case '3':
                this.optionsTurn.push(item)
                break
              case '4':
                this.optionsGrout.push(item)
                break
              case '5':
                this.optionsBlocks.push(item)
                break
            }
          })
        }
      })
    },
    setFormProps(options = {}) {
      let _form = {
        proName: '', // 项目名称
        proDesc: '', // 项目描述
        sizes: '',  // 尺寸
        hass: '', // 配筋
        turns: '', // 转向
        groutings: '', // 注浆孔
        bloks: '', // 块号
        createUnit: '', // 建设单位
        planUnit: '', // 设计单位
        supervisionUnit: '', // 监理单位
        constructionUnit: '', // 施工单位
        outsideDiameter: '', // 外径
        innerDiameter: '', // 内径
        thickness: '', // 厚度
        ringWidth: '', // 环宽
        concreteStrengthGrade: '', // 混凝土强度等级
        impermeabilityLevel: '', // 抗渗等级
        waterproofType: '', // 有无外弧面防水
        startDate: '', // 开始日期
        proTime: '', // 工期
        planOutput: '', // 总需求
      }
      this.ruleForm = Object.keys(options).length ? options : _form
    },
    //table上展示尺寸等信息
    showInfo(val) {
      let str = ''
      let str1 = ''
      if (val.length === 1) {
        str = val[0].dictName
      } else {
        val.forEach(item => {
          str += item.dictName + ','
        })
        str1 = str.lastIndexOf(',')
        str = str.substring(0, str1)
      }
      return str
    },
    resetForm(formName) {
      this.$refs[formName].resetFields()
    },
    showForm() {
      !this.isRender && (this.isRender = true)
      this.asyncVisible = true
    },
    closeForm() {
      this.asyncVisible = false
      this.resetForm('ruleForm')
      this.setFormProps()
    },
    addRow() {
      this.submitMode = 'add'
      this.showForm()
    },
    updateRow(rowIndex) {
      const rowData = this.dataList[rowIndex]
      // 以下字段不能直接使用,需要处理后赋值
      // a:[b,c]   a:ruleForm的key b:rowData的key c:rowData[key]数据里的key
      const formFormatKeys = {
        sizes: ['proSizes', 'sizes'],
        hass: ['proHas', 'hasSteel'],
        turns: ['proTurns', 'turn'],
        groutings: ['proGroutings', 'groutingHoles'],
        bloks: ['proBloks', 'blockNum'],
      }
      Object.keys(formFormatKeys).forEach(item => {
        const targetKey = formFormatKeys[item].shift()
        const targetValKey = formFormatKeys[item].pop()
        if (Array.isArray(rowData[targetKey])) {
          rowData[targetKey].forEach(val => {
            formFormatKeys[item].push(val[targetValKey])
          })
        } else {
          formFormatKeys[item] = rowData[targetKey]
        }
      })
      Object.keys(this.ruleForm).forEach(item => {
        if (rowData.hasOwnProperty.call(rowData, item)) {
          this.ruleForm[item] = rowData[item]
        } else if (formFormatKeys[item]) {
          this.ruleForm[item] = formFormatKeys[item]
        }
      })
      this.ruleForm.proId = rowData.proId
      this.submitMode = 'update'
      this.showForm()
    },
    deleteRow(row) {
      this.$confirm("该操作将删除该信息,是否继续删除?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      }).then(() => {
        this.$api.Engineer.deleteProjects({proId: row.proId})
          .then(res => {
            if (res.statusMsg === 'ok') {
              this.getLists()
              this.$message.success("删除成功!")
            } else {
              this.$message.warning(res.statusMsg)
            }
          })
      }).catch(() => {
        this.$message.warning("您已取消")
      })
    },
    onSubmit: throttle(function (formName) {
      this.$refs[formName].validate((valid) => {
        if (!valid) return false
        const params = this.ruleForm
        if (this.isUpdate) {
          // 更新
          this.$api.Engineer.updateProjects(params).then((res) => {
            if (res.statusMsg === 'ok') {
              this.closeForm()
              this.getLists();
              this.$message.success('更新成功!')
            } else {
              this.$message.warning(res.statusMsg)
            }
          })
        } else {
          // 添加
          this.$api.Engineer.insertProjects(params).then((res) => {
            if (res.statusMsg === 'ok') {
              this.closeForm()
              this.getLists()
              this.$message.success('添加成功!')
            } else {
              this.$message.warning(res.statusMsg)
            }
          })
        }
      })
    }, 1000),
    // 判断按钮权限信息
    showButton(str) {
      const pinia = buttonPinia();
      return pinia.$state.buttonInfo.includes(str);
    },
    changePageNum(page) {
      this.queryInfo.pageNum = page;
      this.getLists();
    },
    changePageSize(size) {
      this.queryInfo.pageSize = size
      this.getLists()
    },
    showDetail(row) {
      let detailData = this.detail
      !detailData.isRenderDetail && (detailData.isRenderDetail = true)
      detailData.asyncVisible = true
      detailData.rowId = row.proId
      detailData.total = 0
      detailData.tableData = []
      this.getDetailLists()
    },
    getDetailLists() {
      let detailData = this.detail
      this.$api.DuctpiecePLM.searchDuctpiecePLMList({
        proId: detailData.rowId,
        pageNum: detailData.pageNum,
        pageSize: detailData.pageSize
      }).then(res => {
        if (res.success) {
          if (!detailData.tableColumns.length) {
            detailData.tableColumns = [
              {index: true},
              {slot: "name"},
              {name: "环号", key: "ringNum"},
              {name: "管片编号", key: "pipeNum", width: 140},
              {name: "转向", key: "turnName", width: 106},
              {name: "配筋", key: "reinforcementName"},
              {name: "注浆孔", key: "groutingHolesName"},
              {name: "块号", key: "blockNumName"},
              {name: "模具", key: "mouldNum"},
              {name: "入模时间", key: "intoModTime", width: 136},
              {name: "浇筑时间", key: "pouringTime"},
              {name: "质检时间", key: "checkTime", width: 136},
              {name: "生产班组", key: "groupName"},
              {name: "项目", key: "proName", width: 240},
              {name: "质量标注", key: "checkResultStr"},
            ]
          }
          detailData.total = res.data.total
          detailData.tableData = res.data.list
        }
      })
    },
    pageChange() {
      this.getDetailLists()
    },
  }
}
</script>
<style lang="sass" scoped>
<style lang="scss" scoped>
@import '../../style/layout-main.scss';
/deep/ {
  &::-webkit-scrollbar {
    width: 8px;
    height: 8px;
  }
  &::-webkit-scrollbar-corner {
    background-color: transparent;
  }
  &::-webkit-scrollbar-thumb {
    border-radius: 10px;
    box-shadow: inset 0 0 5px transparent;
    background: #39B5FE;
  }
  &::-webkit-scrollbar-track {
    box-shadow: inset 0 0 5px transparent;
    border-radius: 10px;
    background: rgba(76, 188, 254, .3);
  }
}
</style>
web/src/views/ProjectManage/SectionManage.vue
@@ -1,422 +1,579 @@
<template>
  <!-- 工程项目管理 ==> 单位工程管理-->
  <div class="main">
    <div class="main_header">
      <div class="header_item">
        <span class="header_label">标段名称:</span>
        <el-input v-model="search.segmentName" :size="size" clearable placeholder="请输入标段名称"></el-input>
        <el-input v-model="queryInfo.segmentName" clearable placeholder="请输入标段名称"></el-input>
      </div>
      <div class="header_item">
        <span class="header_label">项目名称:</span>
        <el-select v-model="search.proId" placeholder="请选择项目名称" clearable>
            <el-option
            v-for="item in optionsProject"
            :key="item.proId"
            :label="item.proName"
            :value="item.proId">
            </el-option>
        <el-select v-model="queryInfo.proId" placeholder="请选择项目名称" clearable>
          <el-option v-for="item in optionsProject" :key="item.proId" :label="item.proName" :value="item.proId">
          </el-option>
        </el-select>
      </div>
      <div class="header_item">
        <el-button icon="el-icon-search" v-if="showButton('search')" @click="searchButtonInfo(true)">查询</el-button>
        <el-button class="search_btn" icon="el-icon-plus" v-if="showButton('insert')" @click="insertProp">新增</el-button>
        <el-button icon="el-icon-search" v-if="showButton('search')" @click="queryReset">查询</el-button>
        <el-button class="search_btn" icon="el-icon-plus" v-if="showButton('insert')" @click="addRow">新增</el-button>
      </div>
    </div>
    <div class="main_content">
      <el-table
        v-loading="loading"
        :data="dataList"
        height="100%">
        <el-table-column align="center" label="序号" width="60">
          <template #default="scope">
            <span>{{(pageNum - 1) * pageSize + scope.$index + 1}}</span>
          </template>
        </el-table-column>
        <el-table-column prop="proName" label="项目名称" align="center" show-overflow-tooltip></el-table-column>
        <el-table-column prop="segmentName" label="标段名称" align="center" show-overflow-tooltip></el-table-column>
        <el-table-column prop="shieldEnp" label="盾构单位" align="center" show-overflow-tooltip></el-table-column>
        <el-table-column prop="station" label="站点" align="center"></el-table-column>
        <el-table-column prop="realName" label="负责人" align="center"></el-table-column>
        <el-table-column label="操作" align="center">
      <cpnTable :table-index="true" :table-data="dataList" :table-columns-config="tableColumns" :page-total="total"
        :page-num.sync="queryInfo.pageNum" :page-size.sync="queryInfo.pageSize" :page-change="pageChange">
        <el-table-column slot="finished" label="已完成(块)" align="center">
          <template #default="{ row }">
            <el-button class="table_btn" size="mini" v-if="showButton('update')" @click="updateProp(row)">修改</el-button>
            <el-button class="delete_btn" size="mini" v-if="showButton('delete')" @click="deleteInfo(row)">删除</el-button>
            <div style="cursor: pointer;" @click="showDetail(row)">{{ row.completedQuantity }}</div>
          </template>
        </el-table-column>
      </el-table>
        <el-table-column slot="action" label="操作" width="140" align="center">
          <template #default="{ row }">
            <el-button class="table_btn" size="mini" v-if="showButton('update')" @click="updateRow(row)">修改</el-button>
            <el-button class="delete_btn" size="mini" v-if="showButton('delete')" @click="deleteRow(row)">删除</el-button>
          </template>
        </el-table-column>
      </cpnTable>
    </div>
    <div class="main_footer">
      <el-pagination
        background
        @current-change="changePageNum"
        @size-change="changePageSize"
        :current-page="pageNum"
        :page-sizes="[10, 20, 50, 100]"
        :page-size="pageSize"
        layout="total, sizes, prev, pager, next, jumper"
        :total="total">
      </el-pagination>
    </div>
    <el-dialog
      class="prop_dialog"
      :title="asyncTitle ? '新增标段' : '修改标段'"
      :close-on-click-modal="false"
      :visible.sync="asyncVisible"
      width="35%">
    <!-- dialog -->
    <el-dialog class="prop_dialog" v-if="isRender" :title="dialogTitle" :visible.sync="asyncVisible" width="660px"
      @close="closeForm">
      <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="auto" class="rule_form">
        <el-form-item label="项目名称:" prop="proId">
          <el-select v-model="ruleForm.proId" placeholder="请选择项目名称" @change="changeNeed">
                <el-option
                v-for="item in optionsProject"
                :key="item.proId"
                :label="item.proName"
                :value="item.proId">
                </el-option>
            </el-select>
        <el-form-item label="项目名称:" prop="proId">
          <el-select v-model="ruleForm.proId" placeholder="请选择" @change="changeNeed">
            <el-option v-for="item in optionsProject" :key="item.proId" :label="item.proName" :value="item.proId">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="标段名称:" prop="segmentName">
          <el-input v-model="ruleForm.segmentName" :size="size" clearable placeholder="请输入标段名称"></el-input>
        <el-form-item label="起讫里程:" prop="mileage">
          <el-input v-model="ruleForm.mileage" clearable placeholder="请输入起讫里程"></el-input>
        </el-form-item>
        <el-form-item label="需求负责人:" prop="segmentAdmin">
          <el-select v-model="ruleForm.segmentAdmin" placeholder="请选择需求负责人">
                <el-option
                    v-for="item in optionsUser"
                    :key="item.userId"
                    :label="item.realName"
                    :value="item.userId">
                </el-option>
            </el-select>
        <el-form-item label="单位工程名称:" prop="unitProjectName">
          <el-input v-model="ruleForm.unitProjectName" clearable placeholder="请输入单位工程名称"></el-input>
        </el-form-item>
        <el-form-item label="盾构单位:" prop="shieldEnp">
          <el-input v-model="ruleForm.shieldEnp" :size="size" clearable placeholder="请输入盾构单位"></el-input>
        <el-form-item label="需求负责人:" prop="segmentAdmin">
          <el-select v-model="ruleForm.segmentAdmin" placeholder="请选择求负责人">
            <el-option v-for="item in optionsUser" :key="item.userId" :label="item.realName" :value="item.userId">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="站点:" prop="station">
          <el-input v-model="ruleForm.station" :size="size" clearable placeholder="请输入站点"></el-input>
        <el-form-item label="盾构单位:" prop="shieldEnp">
          <el-input v-model="ruleForm.shieldEnp" clearable placeholder="请输入盾构单位"></el-input>
        </el-form-item>
        <el-form-item label="开始时间:" prop="startTime">
          <el-date-picker v-model="ruleForm.startTime" value-format="yyyy-MM-dd" placeholder="请选择开始日期"></el-date-picker>
        </el-form-item>
        <el-form-item label="结束时间:" prop="endTime">
          <el-date-picker v-model="ruleForm.endTime" value-format="yyyy-MM-dd" placeholder="请选择结束日期"></el-date-picker>
        </el-form-item>
        <el-form-item label="工期:" prop="duration">
          <el-input v-model="ruleForm.duration" clearable placeholder="请输入工期"></el-input>
        </el-form-item>
        <el-form-item label="站点:" prop="station">
          <el-input v-model="ruleForm.station" clearable placeholder="请输入站点"></el-input>
        </el-form-item>
        <div class="section_needs">标段需求</div>
        <div class="section_needs_content">
            <div v-for="item in needBlocks" :key="item.dictId" class="needs_items">
                <div class="needs_text">{{item.dictName}}</div>
                <el-input placeholder="请输入数量" type="number"  v-model="item.needNum" class="needs_num">
                    <template slot="append">块</template>
                </el-input>
            </div>
          <div v-for="item in ruleForm.segmentList" :key="item.dictId" class="needs_items">
            <div class="needs_text">{{ item.dictName }}</div>
            <el-input placeholder="请输入数量" type="number" v-model="item.needNum" class="needs_num">
              <template slot="append">块</template>
            </el-input>
          </div>
        </div>
      </el-form>
      <div slot="footer">
        <el-button @click="asyncVisible = false">取 消</el-button>
        <el-button class="submit_btn" @click="asyncTitle ? submitInsert() : submitUpdate()">提 交</el-button>
        <el-button class="submit_btn" @click="onSubmit('ruleForm')">提 交</el-button>
      </div>
    </el-dialog>
    <!-- detail dialog -->
    <el-dialog class="prop_dialog" v-if="detail.isRenderDetail" title="管片数量" :visible.sync="detail.asyncVisible"
      width="1000px">
      <el-card>
        <div class="titles" v-for="item in detail.infoMap" :key="item.key">
          {{ item.name }}&nbsp;:
          <template v-if="item.key === 'waterproofType'">
            <span>{{ detail.infos[item.key] === 0 ? '有' : '无' }} </span>
          </template>
          <template v-else-if="item.key === 'proHas'">
            <span v-for="val in detail.infos[item.key]" :key="val.hasSteel">
              {{ val.dictName }}
            </span>
          </template>
          <template v-else>
            <span>{{ detail.infos[item.key] }}</span>
          </template>
        </div>
      </el-card>
      <cpnTable :table-index="true" :table-data="detail.tableData" :table-columns-config="detail.tableColumns"
        :page-total="detail.total" :page-num.sync="detail.pageNum" :page-size.sync="detail.pageSize"
        :page-change="detailPageChange">
      </cpnTable>
    </el-dialog>
  </div>
</template>
<script>
import { buttonPinia } from '../../pinia/index';
import { throttle, changeSize } from '../../plugins/public'; // 导入节流、动态切换组件尺寸方法
  export default {
    data() {
      return {
        size: changeSize(), // 组件尺寸
import {buttonPinia} from '../../pinia/index';
import {throttle} from '../../plugins/public'; // 导入节流、动态切换组件尺寸方法
import cpnTable from '@/components/table/Table'
export default {
  data() {
    return {
      isRender: false,
      loading: false,
      asyncVisible: false,
      submitMode: '', // add update
      total: 0,
      queryInfo: {
        pageNum: 1,
        pageSize: 10,
        search:{},//查询条件
        segmentName: '',
        proId: '',
      },
      dataList: [],
      tableColumns: [],
      optionsUser: [], //需求负责人
      optionsProject: [], // 项目名称
      ruleForm: {}, // 按钮表单
      rules: {
        proId: [{required: true, message: '请选择', trigger: 'change'}],
        mileage: [{required: true, message: '请输入', trigger: 'blur'}],
        unitProjectName: [{required: true, message: '请输入', trigger: 'blur'}],
        segmentAdmin: [{required: true, message: '请选择', trigger: 'change'}],
        shieldEnp: [{required: true, message: '请输入', trigger: 'blur'}],
        startTime: [{required: true, message: '请选择', trigger: 'change'}],
        endTime: [{required: true, message: '请选择', trigger: 'change'}],
        duration: [{required: true, message: '请输入', trigger: 'blur'}],
        station: [{required: true, message: '请输入', trigger: 'blur'}],
      },
      detail: {
        rowId: '',
        isRenderDetail: false,
        asyncVisible: false,
        pageNum: 1,
        pageSize: 10,
        total: 0,
        loading: false,
        dataList: [], //标段信息列表
        optionsUser:[],//需求负责人
        optionsProject:[],//项目名称
        asyncTitle: true, // 对话框title 新增:true  修改:false
        asyncVisible: false, // 添加 修改对话框
        ruleForm: {}, // 按钮表单
        rules: {
          segmentName: [{
            required: true,
            message: '请输入标段名称',
            trigger: 'blur'
          }],
          shieldEnp: [{
            required: true,
            message: '请输入盾构单位',
            trigger: 'blur'
          }],
          station: [{
            required: true,
            message: '请输入站点',
            trigger: 'blur'
          }],
          proId: [{
            required: true,
            message: '请选择项目名称',
            trigger: 'change'
          }],
          segmentAdmin: [{
            required: true,
            message: '请选择需求负责人',
            trigger: 'change'
          }],
        },
        needBlocks:[],//标段需求
      }
    },
    watch: {
      asyncVisible(bol) {
        if(!bol) {
          this.ruleForm = {};
          this.$refs.ruleForm.resetFields();
        }
      }
    },
    mounted() {
      const that = this;
      // 根据窗口大小动态修改组件尺寸
      window.onresize = () => {
        that.size = changeSize();
      }
      that.searchButtonInfo(true);
      that.getAllProjects()
      that.getAllPersons()
    },
    methods: {
    //通过不同的项目展示不同的标段需求
    changeNeed(val){
        let obj = {
            proId:val
        }
        this.needBlocks = []
        this.$api.Reinforce.searchProjectBears(obj).then(res=>{
            if(res.statusMsg ==='ok'){
              if(this.ruleForm.proId ===''){
                this.needBlocks = []
              }else{
                res.data.blokDtos.forEach(item=>{
                    this.needBlocks.push({
                        dictName:item.blockName,
                        needType:item.blockNum,
                        needNum:0,
                        segmentId:''
                    })
                })
              }
            }else{
                this.$message.warning(res.statusMsg)
            }
        })
    },
     //获得所有人员
     getAllPersons(){
        this.$api.Engineer.getPersonsList({}).then(res=>{
            if(res.statusMsg === 'ok'){
                this.optionsUser = res.data
            }else{
                this.$message.warning(res.statusMsg)
            }
        })
     },
     //获得所有项目名称
     getAllProjects(){
        let obj = {
            pageNum: 1,
            pageSize: 100000000
        }
        this.$api.Engineer.searchProjects(obj).then(res=>{
            if(res.statusMsg === 'ok'){
                this.optionsProject = res.data.list
            }else{
                this.$message.warning(res.statusMsg)
            }
        })
     },
     //获取块号
      getAllBlocks(){
        let params = {
            pageNum: 1,
            pageSize: 100000000
        }
        this.$api.Dictionary.searchDictionary(params).then(res=>{
            if(res.statusMsg === 'ok'){
              if(this.ruleForm.proId===undefined){
                this.needBlocks = []
              }else{
                res.data.list.filter(item =>item.dictType === '5').forEach(iten=>{
                    this.needBlocks.push({
                        dictName:iten.dictName,
                        needType:iten.dictId,
                        needNum:0,
                        segmentId:''
                    })
                })
              }
            }else{
                this.$message.warning(res.statusMsg)
            }
        })
      },
      // 查询按钮列表信息
      searchButtonInfo(bol) {
        if(bol) {
          this.pageNum = 1;
        }
        let params = Object.assign({},this.search,{
          pageNum: this.pageNum,
          pageSize: this.pageSize
        })
        this.loading = true;
        this.$api.Engineer.searchSegment(params).then((res) => {
          if(res.statusMsg === 'ok') {
            this.total = res.data.total;
            this.dataList = res.data.list;
        tableData: [],
        tableColumns: [],
        infos: [],
        infoMap: [
          {
            name: '项目名称',
            key: 'proName',
          },
          {
            name: '单位工程名称',
            key: 'createUnit',
          },
          {
            name: '外径',
            key: 'outsideDiameter',
          },
          {
            name: '內径',
            key: 'innerDiameter',
          },
          {
            name: '厚度',
            key: 'thickness',
          },
          {
            name: '环宽',
            key: 'ringWidth',
          },
          {
            name: '混凝土强度等级',
            key: 'concreteStrengthGrade',
          },
          {
            name: '抗渗等级',
            key: 'impermeabilityLevel',
          },
          {
            name: '配筋型号',
            key: 'proHas',
          },
          {
            name: '有无外弧面防水',
            key: 'waterproofType',
          }
          this.loading = false;
        })
      },
      // 新增按钮信息
      insertProp() {
        this.asyncTitle = true;
        this.asyncVisible = true;
        this.getAllBlocks()
        if(this.ruleForm.proId===undefined){
          this.needBlocks = []
        }else{
          this.needBlocks.forEach(item=>{
              item.needNum = 0
          })
        }
      },
      // 修改按钮信息
      updateProp(row) {
        this.asyncTitle = false;
        this.asyncVisible = true;
        this.$api.Engineer.detailsSegment({segmentId: row.segmentId}).then(res=>{
            if(res.statusMsg === 'ok'){
                this.ruleForm = res.data
                this.needBlocks = res.data.segmentNeeds
            }else{
                this.$message.warning(res.statusMsg)
            }
        })
      },
      // 删除按钮信息
      deleteInfo(row) {
        this.$confirm("该操作将删除该信息,是否继续删除?", "提示", {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning"
       })
       .then(() => {
         this.$api.Engineer.deleteSegment({segmentId: row.segmentId})
        .then(res => {
          if(res.statusMsg === 'ok') {
            this.searchButtonInfo(true);
            this.$message.success("删除成功!");
          } else {
            this.$message.warning(res.statusMsg);
          }
        })
       })
       .catch(() => {
         this.$message.warning("您已取消");
       })
      },
      // 提交添加按钮信息
      submitInsert: throttle(function() {
        this.$refs.ruleForm.validate((valid) => {
          if(valid) {
            const params = Object.assign({}, this.ruleForm);
            params.segmentList = this.needBlocks
            this.$api.Engineer.insertSegment(params).then((res) => {
              if(res.statusMsg === 'ok') {
                this.asyncVisible = false;
                this.searchButtonInfo(true);
                this.$message.success('添加成功!');
              } else {
                this.$message.warning(res.statusMsg);
              }
            })
          }
        })
      }, 3000),
      // 提交修改按钮信息
      submitUpdate: throttle(function() {
        this.$refs.ruleForm.validate((valid) => {
          if(valid) {
            const params = Object.assign({}, this.ruleForm);
            params.segmentList = this.needBlocks
            this.$api.Engineer.updateSegment(params).then((res) => {
              if(res.statusMsg === 'ok') {
                this.asyncVisible = false;
                this.searchButtonInfo(true);
                this.$message.success('添加成功!');
              } else {
                this.$message.warning(res.statusMsg);
              }
            })
          }
        })
      }, 3000),
      // 判断按钮权限信息
      showButton(str) {
        const pinia = buttonPinia();
        return pinia.$state.buttonInfo.includes(str);
      },
      // 切换页数
      changePageNum(page) {
        this.pageNum = page;
        this.searchButtonInfo();
      },
      // 切换每页条数
      changePageSize(size) {
        this.pageSize = size;
        this.searchButtonInfo();
        ]
      }
    }
  },
  components: {
    cpnTable
  },
  computed: {
    dialogTitle() {
      return this.submitMode === 'update' ? '修改新增单位工程' : '新增单位工程'
    },
    isUpdate() {
      return this.submitMode === 'update'
    },
  },
  created() {
    this.setFormProps()
    this.setTableColumn()
    this.getLists()
    this.getAllProjects()
    this.getAllPersons()
    // this.getAllBlocks() // 暂时没用,先屏蔽
  },
  methods: {
    getLists() {
      this.loading = true
      let params = this.queryInfo
      this.$api.Engineer.searchSegment(params).then(res => {
        if (res.statusMsg === 'ok') {
          this.total = res.data.total
          this.dataList = res.data.list
        }
        this.loading = false
      })
    },
    //获得所有人员
    getAllPersons() {
      this.$api.Engineer.getPersonsList({}).then(res => {
        if (res.statusMsg === 'ok') {
          this.optionsUser = res.data
        } else {
          this.$message.warning('人员名称获取失败')
        }
      })
    },
    //获得所有项目名称
    getAllProjects() {
      let obj = {
        pageNum: 1,
        pageSize: 100000000
      }
      this.$api.Engineer.searchProjects(obj).then(res => {
        if (res.statusMsg === 'ok') {
          this.optionsProject = res.data.list
        } else {
          this.$message.warning('项目名称获取失败')
        }
      })
    },
    //字典里获取所有标段块号
    getAllBlocks() {
      let params = {
        pageNum: 1,
        pageSize: 100000000
      }
      this.$api.Dictionary.searchDictionary(params).then(res => {
        if (res.statusMsg === 'ok') {
          const segmentList = []
          res.data.list.forEach(item => {
            if (item.dictType === '5') {
              segmentList.push({
                dictName: item.dictName,
                needType: item.dictId,
                needNum: 0,
                segmentId: ''
              })
            }
          })
          this.ruleForm.segmentList = segmentList
        } else {
          this.$message.warning('标段获取失败')
        }
      })
    },
    getDetailLists() {
      let detailData = this.detail
      this.$api.DuctpiecePLM.searchDuctpiecePLMList({
        segmentId: detailData.rowId,
        pageNum: detailData.pageNum,
        pageSize: detailData.pageSize
      }).then(res => {
        if (res.success) {
          detailData.total = res.data.total
          detailData.tableData = res.data.list
        }
      })
    },
    getDetailInfos(id) {
      this.$api.Engineer.detailsProjects({proId: id}).then(res => {
        if (res.success) {
          this.detail.infos = res.data
        }
      })
    },
    setFormProps(options = {}) {
      let _form = {
        proId: '', // 项目名称id
        mileage: '', // 起讫里程
        unitProjectName: '',  // 单位工程名称
        segmentAdmin: '', // 需求负责人
        shieldEnp: '', // 盾构单位
        startTime: null, // 开始时间
        endTime: null, // 结束时间
        duration: '', // 工期
        station: '', // 站点
        segmentList: [], // 标段需求
      }
      this.ruleForm = Object.keys(options).length ? options : _form
    },
    setTableColumn() {
      this.tableColumns = [
        {index: true},
        {slot: "finished"},
        {name: "项目名称", key: "proName", width: 160},
        {name: "起讫里程", key: "mileage"},
        {name: "单位工程名称", key: "unitProjectName"},
        {name: "盾构单位", key: "shieldEnp"},
        {name: "开始时间", key: "startTime", width: 100},
        {name: "结束时间", key: "endTime", width: 100},
        {name: "工期", key: "duration"},
        {name: "站点", key: "station"},
        {name: "负责人", key: "realName"},
        {slot: 'action'},
      ]
      this.detail.tableColumns = [
        {index: true},
        {slot: "name"},
        {name: "环号", key: "ringNum"},
        {name: "管片编号", key: "pipeNum", width: 140},
        {name: "转向", key: "turnName", width: 106},
        {name: "配筋", key: "reinforcementName"},
        {name: "注浆孔", key: "groutingHolesName"},
        {name: "块号", key: "blockNumName"},
        {name: "模具", key: "mouldNum"},
        {name: "入模时间", key: "intoModTime", width: 136},
        {name: "浇筑时间", key: "pouringTime"},
        {name: "质检时间", key: "checkTime", width: 136},
        {name: "生产班组", key: "groupName"},
        {name: "项目", key: "proName", width: 240},
        {name: "质量标注", key: "checkResultStr"},
      ]
    },
    resetForm(formName) {
      this.$refs[formName].resetFields()
    },
    showForm() {
      !this.isRender && (this.isRender = true)
      this.asyncVisible = true
    },
    closeForm() {
      this.asyncVisible = false
      this.resetForm('ruleForm')
      this.setFormProps()
    },
    // 查询按钮列表信息
    queryReset() {
      this.queryInfo.pageNum = 1
      this.queryInfo.pageSize = 10
      this.getLists()
    },
    addRow() {
      this.submitMode = 'add'
      this.showForm()
    },
    async updateRow(row) {
      this.submitMode = 'update'
      this.showForm()
      const segmentList = await this.getProjectBlocks(row.segmentId)
      Object.keys(this.ruleForm).forEach(item => {
        if (row.hasOwnProperty.call(row, item)) {
          this.ruleForm[item] = row[item]
        }
      })
      this.ruleForm.segmentId = row.segmentId
      this.ruleForm.segmentList = segmentList
    },
    deleteRow(row) {
      this.$confirm("该操作将删除该信息,是否继续删除?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      }).then(() => {
        this.$api.Engineer.deleteSegment({segmentId: row.segmentId}).then(res => {
          if (res.statusMsg === 'ok') {
            this.queryReset();
            this.$message.success("删除成功!")
          } else {
            this.$message.warning(res.statusMsg)
          }
        })
      }).catch(() => {
        this.$message.warning("您已取消")
      })
    },
    //获取项目标段
    getProjectBlocks(id) {
      return new Promise(resolve => {
        this.$api.Engineer.detailsSegment({segmentId: id}).then(res => {
          let outData = []
          if (res.statusMsg === 'ok') {
            outData.push(...res.data.segmentNeeds)
          }
          resolve(outData)
        })
      })
    },
    //通过不同的项目展示不同的标段需求
    changeNeed(val) {
      this.$api.Reinforce.searchProjectBears({proId: val}).then(res => {
        if (res.statusMsg === 'ok') {
          const segmentList = []
          res.data.blokDtos.forEach(item => {
            segmentList.push({
              dictName: item.blockName,
              needType: item.blockNum,
              needNum: 0,
              segmentId: ''
            })
          })
          this.ruleForm.segmentList = segmentList
        } else {
          this.$message.warning('标段获取失败')
        }
      })
    },
    onSubmit: throttle(function () {
      this.$refs.ruleForm.validate(valid => {
        if (!valid) return
        const params = this.ruleForm
        if (this.isUpdate) {
          // 更新
          this.$api.Engineer.updateSegment(params).then((res) => {
            if (res.statusMsg === 'ok') {
              this.closeForm()
              this.getLists()
              this.$message.success('更新成功!')
            } else {
              this.$message.warning(res.statusMsg)
            }
          })
        } else {
          // 添加
          this.$api.Engineer.insertSegment(params).then((res) => {
            if (res.statusMsg === 'ok') {
              this.closeForm()
              this.getLists()
              this.$message.success('添加成功!')
            } else {
              this.$message.warning(res.statusMsg)
            }
          })
        }
      })
    }, 1000),
    // 判断按钮权限信息
    showButton(str) {
      const pinia = buttonPinia();
      return pinia.$state.buttonInfo.includes(str);
    },
    showDetail(row) {
      let detailData = this.detail
      !detailData.isRenderDetail && (detailData.isRenderDetail = true)
      detailData.asyncVisible = true
      detailData.rowId = row.segmentId
      detailData.total = 0
      detailData.tableData = []
      detailData.infos = []
      this.getDetailInfos(row.proId)
      this.getDetailLists()
    },
    pageChange() {
      this.getLists();
    },
    detailPageChange() {
      this.getDetailLists();
    },
  }
}
</script>
<style lang="scss" scoped>
@import '../../style/layout-main.scss';
.section_needs{
    position: relative;
    color:#18F5F7;
    padding: 20px 20px 10px 15px;
    border-bottom: 1px solid #1949A3;
    &::before{
        position: absolute;
        content: "";
        width: 2px;
        height: 20px;
        background-color: #18F5F7;
        top: 20px;
        left: 5px;
    }
}
.section_needs_content{
    height: 180px;
    overflow: auto;
    display: flex;
    // flex-direction: column;
    // justify-content: space-between;
    flex-wrap: wrap;
    // &:after{
    //     content: "";
    //     flex: 0 0 412px;
    // }
    .needs_items{
        max-width: 190px;
        min-width: 142px;
        padding: 15px;
        display: flex;
        .needs_text{
            // width: 50px;
            flex: none;
            align-self: center;
            text-align: center;
            padding-right: 15px;
            color: #E1E3E9;
        }
        .needs_num{
            align-self: center;
        }
    }
/deep/ {
  &::-webkit-scrollbar {
    width: 8px;
    height: 8px;
  }
  &::-webkit-scrollbar-corner {
    background-color: transparent;
  }
  &::-webkit-scrollbar-thumb {
    border-radius: 10px;
    box-shadow: inset 0 0 5px transparent;
    background: #39B5FE;
  }
  &::-webkit-scrollbar-track {
    box-shadow: inset 0 0 5px transparent;
    border-radius: 10px;
    background: rgba(76, 188, 254, .3);
  }
}
.el-card {
  margin-bottom: 20px;
  border: none;
  color: #fff;
  background: rgba(9, 64, 101, 1);
  .titles {
    float: left;
    width: 25%;
    min-height: 36px;
    padding-right: 6px;
    margin-bottom: 6px;
    line-height: 18px;
    box-sizing: border-box;
  }
  span {
    color: #39B5FE;
  }
}
.section_needs {
  position: relative;
  color: #18F5F7;
  padding: 20px 20px 10px 15px;
  border-bottom: 1px solid #1949A3;
  &::before {
    position: absolute;
    content: "";
    width: 2px;
    height: 20px;
    background-color: #18F5F7;
    top: 20px;
    left: 5px;
  }
}
.section_needs_content {
  display: flex;
  flex-wrap: wrap;
  .needs_items {
    max-width: 190px;
    min-width: 142px;
    padding: 15px;
    display: flex;
    .needs_text {
      // width: 50px;
      flex: none;
      align-self: center;
      text-align: center;
      padding-right: 15px;
      color: #E1E3E9;
    }
    .needs_num {
      align-self: center;
    }
  }
}
</style>