jinlin
2023-11-24 c041523ff100a6a43ebc4411125a3e566e19f193
Changes
32个文件已修改
1580 ■■■■■ 已修改文件
modules/mainPart/src/main/java/com/zt/life/modules/itemCirculatOrder/controller/ItemCirculatOrderController.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/itemCirculatOrder/dao/ItemCirculatOrderDao.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/itemCirculatOrder/dao/ItemCirculatOrderTechnicalDao.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/itemCirculatOrder/dto/ItemCirculatOrderDto.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/itemCirculatOrder/model/ItemCirculatOrder.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/itemCirculatOrder/model/ItemCirculatOrderTechnical.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/itemCirculatOrder/service/ItemCirculatOrderService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/itemCirculatOrder/service/ItemCirculatOrderTechnicalService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/resources/mapper/itemCirculatOrder/ItemCirculatOrderDao.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/resources/mapper/itemCirculatOrder/ItemCirculatOrderTechnicalDao.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/package-lock.json 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/package.json 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/packages/components/zt-uploader/src/zt-uploader.vue 1199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/components/config-uploader/src/config-uploader.vue 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/components/table-uploader/src/table-uploader.vue 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/modules/itemCirculatOrder/ItemCirculatOrder-AddOrUpdate.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/modules/itemCirculatOrder/ItemCirculatOrder.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/src/views/modules/project/SoftwareTestOrder-AddOrUpdate.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zt/common/src/main/java/com/zt/core/sys/dto/DictIstance.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zt/core/src/main/java/com/zt/modules/oss/annotation/DataFieldParser.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zt/core/src/main/java/com/zt/modules/oss/cloud/LocalStorageService.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zt/core/src/main/java/com/zt/modules/oss/cloud/StorageConfig.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zt/core/src/main/java/com/zt/modules/oss/controller/SysOssController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zt/core/src/main/java/com/zt/modules/oss/controller/chunkUploadController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zt/core/src/main/java/com/zt/modules/oss/encry/NoEncryptService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zt/core/src/main/java/com/zt/modules/oss/enums/OssStatus.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
zt/core/src/main/java/com/zt/modules/oss/mapstruct/OssMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zt/core/src/main/java/com/zt/modules/oss/model/OssFieldDefine.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zt/core/src/main/java/com/zt/modules/oss/model/SysOss.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zt/core/src/main/java/com/zt/modules/oss/service/SysOssService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zt/core/src/main/resources/mapper/oss/SysOssDao.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zt/core/src/main/resources/mapper/sys/SysDictTypeDao.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/itemCirculatOrder/controller/ItemCirculatOrderController.java
@@ -14,7 +14,9 @@
import com.zt.common.validator.group.UpdateGroup;
import com.zt.life.modules.itemCirculatOrder.dto.ItemCirculatOrderDto;
import com.zt.life.modules.itemCirculatOrder.model.ItemCirculatOrder;
import com.zt.life.modules.itemCirculatOrder.model.ItemCirculatOrderTechnical;
import com.zt.life.modules.itemCirculatOrder.service.ItemCirculatOrderService;
import com.zt.life.modules.itemCirculatOrder.service.ItemCirculatOrderTechnicalService;
import com.zt.life.modules.project.dto.SoftwareTestOrderDto;
import com.zt.life.sys.dto.OssDto;
import com.zt.life.sys.service.SysOssConfigService;
@@ -52,6 +54,9 @@
    @Autowired
    private SysOssConfigService sysOssConfigService;
    @Autowired
    private ItemCirculatOrderTechnicalService technicalService;
    @GetMapping("page")
    @ApiOperation("分页")
    @ApiImplicitParams({
@@ -59,7 +64,10 @@
        @ApiImplicitParam(name = Constant.Q.LIMIT, value = Constant.QV.LIMIT, required = true, dataType = Constant.QT.INT),
        @ApiImplicitParam(name = Constant.Q.ORDER_FIELD, value = Constant.QV.ORDER_FIELD, dataType = Constant.QT.STRING),
        @ApiImplicitParam(name = Constant.Q.ORDER, value = Constant.QV.ORDER, dataType = Constant.QT.STRING),
        @ApiImplicitParam(name = "code", value = "物品流转单编号", dataType = Constant.QT.STRING, format = "code^LK")    })
        @ApiImplicitParam(name = "code", value = "物品流转单编号", dataType = Constant.QT.STRING, format = "code^LK"),
        @ApiImplicitParam(name = "softwareName", value = "物品名称", dataType = Constant.QT.STRING, format = "software_name^EQ"),
        @ApiImplicitParam(name = "softwareIdentity", value = "物品编号", dataType = Constant.QT.STRING, format = "software_identity^EQ")
    })
    public PageResult<ItemCirculatOrder> page(@ApiIgnore @QueryParam QueryFilter queryFilter){
        return PageResult.ok(itemCirculatOrderService.page(queryFilter));
@@ -70,9 +78,12 @@
    public Result<ItemCirculatOrderDto> getDto(Long projectId, Long circulatOrderid) {
        ItemCirculatOrderDto data = itemCirculatOrderService.getDto(projectId, circulatOrderid);
        if (circulatOrderid!=null) {
            OssDto ossDto = sysOssConfigService.getOssByBusiType(circulatOrderid, "circulat_order");
            if (ossDto != null) {
                data.setFiles(ossDto);
            for (ItemCirculatOrderTechnical technical : technicalService.getList(circulatOrderid)) {
                Long technicalId = technical.getId();
                OssDto ossDto = sysOssConfigService.getOssByBusiType(technicalId, "circulat_order");
                if (ossDto != null) {
                    technical.setFiles(ossDto);
                }
            }
        }
        return Result.ok(data);
modules/mainPart/src/main/java/com/zt/life/modules/itemCirculatOrder/dao/ItemCirculatOrderDao.java
@@ -22,5 +22,5 @@
    List<ItemCirculatOrder> getList(Map<String, Object> params);
    List<DictIstance> itemList(Long projectId);
}
modules/mainPart/src/main/java/com/zt/life/modules/itemCirculatOrder/dao/ItemCirculatOrderTechnicalDao.java
@@ -1,6 +1,7 @@
package com.zt.life.modules.itemCirculatOrder.dao;
import com.zt.common.dao.BaseDao;
import com.zt.core.sys.dto.DictIstance;
import com.zt.life.modules.itemCirculatOrder.model.ItemCirculatOrderTechnical;
import org.apache.ibatis.annotations.Mapper;
@@ -19,5 +20,6 @@
public interface ItemCirculatOrderTechnicalDao extends BaseDao<ItemCirculatOrderTechnical> {
    List<ItemCirculatOrderTechnical> getList(Map<String, Object> params);
    List<DictIstance> itemList(Long projectId);
}
modules/mainPart/src/main/java/com/zt/life/modules/itemCirculatOrder/dto/ItemCirculatOrderDto.java
@@ -23,8 +23,7 @@
    private ItemCirculatOrder circulatOrder;
    @ApiModelProperty(value = "测试机构信息")
    private TestAgencyInfo TestAgencyInfo;
    @ApiModelProperty(value = "附件")
    private OssDto files;
    @ApiModelProperty(value = "技术资料")
    private List<ItemCirculatOrderTechnical> technicalList = new ArrayList<>();
modules/mainPart/src/main/java/com/zt/life/modules/itemCirculatOrder/model/ItemCirculatOrder.java
@@ -1,5 +1,6 @@
package com.zt.life.modules.itemCirculatOrder.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.zt.common.entity.BusiEntity;
@@ -51,6 +52,7 @@
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date detectDate;
    @ApiModelProperty(value = "校准检测情况说明")
    private String detectSituation;
@@ -80,4 +82,13 @@
    @ApiModelProperty(value = "年份")
    private String year;
    @TableField(exist = false)
    @ApiModelProperty(value = "物品名称")
    private String softwareName;
    @TableField(exist = false)
    @ApiModelProperty(value = "物品编号")
    private String softwareIdentity;
}
modules/mainPart/src/main/java/com/zt/life/modules/itemCirculatOrder/model/ItemCirculatOrderTechnical.java
@@ -1,7 +1,9 @@
package com.zt.life.modules.itemCirculatOrder.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.zt.common.entity.BusiEntity;
import com.zt.life.sys.dto.OssDto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -28,7 +30,7 @@
    private Integer no;
    @ApiModelProperty(value = "技术资料名称")
    private String infoName;
    private String name;
    @ApiModelProperty(value = "标识")
    private String identify;
@@ -48,7 +50,8 @@
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "文件")
    private String file;
    @TableField(exist = false)
    @ApiModelProperty(value = "附件")
    private OssDto files;
}
modules/mainPart/src/main/java/com/zt/life/modules/itemCirculatOrder/service/ItemCirculatOrderService.java
@@ -6,6 +6,7 @@
import com.zt.core.sys.dto.DictLeafDto;
import com.zt.life.export.dto.WordFile;
import com.zt.life.modules.itemCirculatOrder.dao.ItemCirculatOrderDao;
import com.zt.life.modules.itemCirculatOrder.dao.ItemCirculatOrderTechnicalDao;
import com.zt.life.modules.itemCirculatOrder.dto.ItemCirculatOrderDto;
import com.zt.life.modules.itemCirculatOrder.model.ItemCirculatOrder;
import com.zt.life.modules.itemCirculatOrder.model.ItemCirculatOrderTechnical;
@@ -14,6 +15,7 @@
import com.zt.life.modules.project.service.ProjectService;
import com.zt.life.modules.project.service.SoftwareTestOrderService;
import com.zt.life.modules.sysBaseInfo.service.TestAgencyInfoService;
import com.zt.life.sys.dto.OssDto;
import com.zt.life.sys.service.SysOssConfigService;
import com.zt.modules.coderule.service.SysCodeRuleService;
import com.zt.modules.oss.service.SysOssService;
@@ -101,6 +103,7 @@
                circulatOrderTechnical.setCirculatOrderId(circulatOrderid);
                technicalService.insert(circulatOrderTechnical);
            }
            sysOssConfigService.updateOss(circulatOrderTechnical.getId(), circulatOrderTechnical.getFiles());// 保存附件
        }
        if (itemCirculatOrderDto.getTestAgencyInfo().getId() == 10000) {
@@ -109,7 +112,6 @@
        } else {
            testAgencyInfoService.update(itemCirculatOrderDto.getTestAgencyInfo());
        }
        sysOssConfigService.updateOss(itemCirculatOrderDto.getId(), itemCirculatOrderDto.getFiles());// 保存附件
        return true;
    }
@@ -130,10 +132,9 @@
        } else {
            ItemCirculatOrder itemCirculatOrder =new ItemCirculatOrder();
            data.setCirculatOrder(itemCirculatOrder);
            List<?> resultList = baseDao.itemList(projectId);
            List<?> resultList = technicalService.itemList(projectId);
            List<?> technicalList = resultList;
            data.setTechnicalList((List<ItemCirculatOrderTechnical>) technicalList);
        }
        if (projectId != null) {
modules/mainPart/src/main/java/com/zt/life/modules/itemCirculatOrder/service/ItemCirculatOrderTechnicalService.java
@@ -1,6 +1,7 @@
package com.zt.life.modules.itemCirculatOrder.service;
import com.zt.common.service.BaseService;
import com.zt.core.sys.dto.DictIstance;
import com.zt.life.modules.itemCirculatOrder.dao.ItemCirculatOrderTechnicalDao;
import com.zt.life.modules.itemCirculatOrder.model.ItemCirculatOrderTechnical;
import com.zt.life.modules.project.model.SoftwareTestOrderMeasured;
@@ -45,5 +46,8 @@
        params.put("circulatOrderid",circulatOrderid);
        return baseDao.getList(params);
    }
    public List<DictIstance> itemList(Long projectId) {
        return baseDao.itemList(projectId);
    }
}
modules/mainPart/src/main/resources/mapper/itemCirculatOrder/ItemCirculatOrderDao.xml
@@ -17,16 +17,6 @@
            ORDER BY ${orderBySql}
        </if>
    </select>
    <select id="itemList" resultType="com.zt.core.sys.dto.DictIstance">
        SELECT m.*
        FROM software_test_order_measured m
        JOIN software_test_order s ON s.id = m.order_id
        <where>
            s.is_delete = 0 and m.is_delete = 0
            <if test="projectId!=null">
                and s.project_id = ${projectId}
            </if>
        </where>
    </select>
</mapper>
modules/mainPart/src/main/resources/mapper/itemCirculatOrder/ItemCirculatOrderTechnicalDao.xml
@@ -16,5 +16,16 @@
            ORDER BY ${orderBySql}
        </if>
    </select>
    <select id="itemList" resultType="com.zt.core.sys.dto.DictIstance">
        SELECT m.*, p.secret_class
        FROM software_test_order_measured m
        JOIN software_test_order s ON s.id = m.order_id
        JOIN project p ON p.id = ${projectId}
        <where>
            s.is_delete = 0 and m.is_delete = 0
            <if test="projectId!=null">
                and s.project_id = ${projectId}
            </if>
        </where>
    </select>
</mapper>
web/package-lock.json
@@ -7504,8 +7504,7 @@
    "duplexer": {
      "version": "0.1.2",
      "resolved": "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz",
      "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
      "dev": true
      "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="
    },
    "duplexer2": {
      "version": "0.0.2",
@@ -8452,6 +8451,27 @@
      "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==",
      "dev": true
    },
    "event-stream": {
      "version": "4.0.1",
      "resolved": "https://registry.npmmirror.com/event-stream/-/event-stream-4.0.1.tgz",
      "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==",
      "requires": {
        "duplexer": "^0.1.1",
        "from": "^0.1.7",
        "map-stream": "0.0.7",
        "pause-stream": "^0.0.11",
        "split": "^1.0.1",
        "stream-combiner": "^0.2.2",
        "through": "^2.3.8"
      },
      "dependencies": {
        "map-stream": {
          "version": "0.0.7",
          "resolved": "https://registry.npmmirror.com/map-stream/-/map-stream-0.0.7.tgz",
          "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ=="
        }
      }
    },
    "eventemitter3": {
      "version": "2.0.3",
      "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-2.0.3.tgz",
@@ -9295,6 +9315,11 @@
      "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz",
      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
      "dev": true
    },
    "from": {
      "version": "0.1.7",
      "resolved": "https://registry.npmmirror.com/from/-/from-0.1.7.tgz",
      "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g=="
    },
    "from2": {
      "version": "2.3.0",
@@ -12860,6 +12885,11 @@
        "lodash._objecttypes": "~2.4.1"
      }
    },
    "lodash.assign": {
      "version": "4.2.0",
      "resolved": "https://registry.npmmirror.com/lodash.assign/-/lodash.assign-4.2.0.tgz",
      "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw=="
    },
    "lodash.clonedeep": {
      "version": "4.5.0",
      "resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
@@ -13533,6 +13563,11 @@
        "matches-selector": "^1.2.0",
        "min-dash": "^3.8.1"
      }
    },
    "mingo": {
      "version": "6.4.9",
      "resolved": "https://registry.npmmirror.com/mingo/-/mingo-6.4.9.tgz",
      "integrity": "sha512-jsOiIEJ19UtTaWjNFN4CnuKWqELm2sINZcHqI/nmjezMvXthBIQOftJrlT85NuIDoSFc0vrbjD+GnrzEgYnPbA=="
    },
    "mini-css-extract-plugin": {
      "version": "0.8.2",
@@ -14878,6 +14913,14 @@
      "integrity": "sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==",
      "dev": true,
      "optional": true
    },
    "pause-stream": {
      "version": "0.0.11",
      "resolved": "https://registry.npmmirror.com/pause-stream/-/pause-stream-0.0.11.tgz",
      "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==",
      "requires": {
        "through": "~2.3"
      }
    },
    "pbkdf2": {
      "version": "3.1.2",
@@ -17340,6 +17383,17 @@
        }
      }
    },
    "save": {
      "version": "2.9.0",
      "resolved": "https://registry.npmmirror.com/save/-/save-2.9.0.tgz",
      "integrity": "sha512-eg8+g8CjvehE/2C6EbLdtK1pINVD27pcJLj4M9PjWWhoeha/y5bWf4dp/0RF+OzbKTcG1bae9qi3PAqiR8CJTg==",
      "requires": {
        "async": "^3.2.2",
        "event-stream": "^4.0.1",
        "lodash.assign": "^4.2.0",
        "mingo": "^6.1.0"
      }
    },
    "sax": {
      "version": "1.3.0",
      "resolved": "https://registry.npmmirror.com/sax/-/sax-1.3.0.tgz",
@@ -17967,6 +18021,11 @@
      "resolved": "https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz",
      "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw=="
    },
    "spark-md5": {
      "version": "3.0.2",
      "resolved": "https://registry.npmmirror.com/spark-md5/-/spark-md5-3.0.2.tgz",
      "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw=="
    },
    "sparkles": {
      "version": "1.0.1",
      "resolved": "https://registry.npmmirror.com/sparkles/-/sparkles-1.0.1.tgz",
@@ -18085,6 +18144,14 @@
            "safe-buffer": "~5.2.0"
          }
        }
      }
    },
    "split": {
      "version": "1.0.1",
      "resolved": "https://registry.npmmirror.com/split/-/split-1.0.1.tgz",
      "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
      "requires": {
        "through": "2"
      }
    },
    "split-string": {
@@ -18254,6 +18321,15 @@
        }
      }
    },
    "stream-combiner": {
      "version": "0.2.2",
      "resolved": "https://registry.npmmirror.com/stream-combiner/-/stream-combiner-0.2.2.tgz",
      "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==",
      "requires": {
        "duplexer": "~0.1.1",
        "through": "~2.3.4"
      }
    },
    "stream-consume": {
      "version": "0.1.1",
      "resolved": "https://registry.npmmirror.com/stream-consume/-/stream-consume-0.1.1.tgz",
web/package.json
@@ -49,7 +49,9 @@
    "qs": "^6.7.0",
    "quill": "^1.3.6",
    "sass-loader": "^7.1.0",
    "save": "^2.9.0",
    "screenfull": "^4.2.1",
    "spark-md5": "^3.0.2",
    "v-distpicker": "^1.2.6",
    "v-gantt-chart": "^1.5.1",
    "vue": "^2.7.14",
web/packages/components/zt-uploader/src/zt-uploader.vue
@@ -4,39 +4,65 @@
    <el-upload
      ref="upload"
      class="upload-input"
      :class="{hide: uploadDisabled || !isShowUpload}"
      :accept="accept"
      :action="uploadAction"
      :before-upload="handleBeforeUpload"
      :data="data"
      :disabled="uploading"
      :drag="false"
      :limit="limit"
      list-type="text"
      :multiple="multiple"
      :name="name"
      :on-change="handleChange"
      :on-error="handleUploadError"
      :auto-upload="true"
      :before-upload="handleBeforeUpload"
      :http-request="checkedFile"
      :before-remove="removeFile"
      :on-exceed="handleExceed"
      :on-success="handleUploadSuccess"
      :on-progress="onUploadProgress"
      :show-file-list="false"
      :file-list="fileList"
      v-if="!image && !crop"
    >
      <el-button class="upload-btn" size="mini" type="primary" icon="el-icon-upload"
                 v-show="!uploadDisabled && isShowUpload">{{ buttonText }}
      <!--      <el-upload-->
      <!--        ref="upload"-->
      <!--        class="upload-input"-->
      <!--        :class="{hide: uploadDisabled || !isShowUpload}"-->
      <!--        :accept="accept"-->
      <!--        :action="uploadAction"-->
      <!--        :before-upload="handleBeforeUpload"-->
      <!--        :data="data"-->
      <!--        :disabled="uploading"-->
      <!--        :drag="false"-->
      <!--        :limit="limit"-->
      <!--        list-type="text"-->
      <!--        :multiple="multiple"-->
      <!--        :name="name"-->
      <!--        :on-change="handleChange"-->
      <!--        :on-error="handleUploadError"-->
      <!--        :on-exceed="handleExceed"-->
      <!--        :on-success="handleUploadSuccess"-->
      <!--        :on-progress="onUploadProgress"-->
      <!--        :show-file-list="false"-->
      <!--        :file-list="fileList"-->
      <!--        v-if="!image && !crop"-->
      <!--        :auto-upload="true"-->
      <!--        :http-request="checkedFile"-->
      <!--        :before-remove="removeFile"-->
      <!--      >-->
      <div style="display:inline-block;width:600px;text-align: center" v-if="onlyUploadFile" class="el-upload__tip">
        {{computerFileName}}
      </div>
      <el-button slot="trigger" v-if="onlyUploadFile" size="small" type="primary">选取文件</el-button>
      <el-button type="primary" v-if="onlyUploadFile" size="small" style="margin-left:20px" @click="myCheckedFile">提 交
      </el-button>
      <el-button class="upload-btn" size="mini" type="primary" icon="el-icon-upload"
                 v-show="!uploadDisabled && isShowUpload && !onlyUploadFile">{{ buttonText }}
      </el-button>
      <div slot="tip" class="el-upload__tip" v-show="!uploadDisabled && isShowUpload && tip">{{ tip }}</div>
    </el-upload>
    <br/>
    <div v-show="progressFlag">
    <el-progress :text-inside="true" :stroke-width="30" :percentage="progressPercent" :format="format"></el-progress>
      <el-progress :text-inside="true" :stroke-width="30" :percentage="progressPercent" :format="format"></el-progress>
    </div>
</div>
    <ul class="el-upload-list el-upload-list--text" v-if="!image && !crop && showFileList">
    <ul class="el-upload-list el-upload-list--text" v-if="!image && !crop && !onlyUploadFile">
      <li tabindex="0" class="el-upload-list__item is-success" v-for="(file, index) in uploadList" :key="file.id">
        <a class="el-upload-list__item-name" :href="file.url" target="_blank"><i
          class="el-icon-document"></i>{{ file.name }}</a>
@@ -71,6 +97,7 @@
          :limit="limit"
          :list-type="drag ? 'picture' : 'picture-card'"
          :multiple="multiple"
          :name="name"
          :on-change="handleChange"
          :on-error="handleUploadError"
          :on-exceed="handleExceed"
@@ -161,386 +188,816 @@
</template>
<script>
import Cookies from 'js-cookie'
import Cropper from 'vue-image-crop-upload'
import EleGallery from '../../vue-ele-gallery'
  import Cookies from 'js-cookie'
  import Cropper from 'vue-image-crop-upload'
  import EleGallery from '../../vue-ele-gallery'
  import SparkMD5 from "spark-md5";
  import axios from "axios";
  import {getUUID} from "../../../utils";
export default {
  name: 'ZtUploader',
  props: {
    // 值
    value: {
      type: [Object, Array],
      default() {
        return this.multiple ? [] : null
      }
    },
    action: {
      type: String,
      default: '/sys/oss/upload'
    },
    // 是否为图片
    image: {
      type: Boolean,
      default: false
    },
    // 是否剪裁
    crop: {
      type: Boolean,
      default: false
    },
    // 裁剪高度
    cropHeight: {
      type: Number
    },
    // 裁剪宽度
    cropWidth: {
      type: Number
    },
    // 是否启用拖拽上传
    drag: {
      type: Boolean,
      default: false
    },
    // 是否支持多选文件
    multiple: {
      type: Boolean,
      default: false
    },
    // 图片显示大小
    size: {
      type: Number,
      default: 100
    },
    // 大小限制(MB)
    fileSize: {
      type: Number
    },
    // 文件类型, 例如['png', 'jpg', 'jpeg']
    fileType: {
      type: Array,
      default: () => []
    },
    // 缩略图后缀, 例如七牛云缩略图样式 (?imageView2/1/w/20/h/20)
    thumbSuffix: {
      type: String,
      default: ''
    },
    // 是否显示提示
    isShowTip: {
      type: Boolean,
      default: true
    },
    // 弹窗标题
    title: String,
    // 图片懒加载
    lazy: {
      type: Boolean,
      default: false
    },
    // 文件个数显示
    limit: {
      type: Number,
      default: 10
    },
    // 上传时附带的额外参数
    data: Object,
    // 上传的文件字段名
    name: {
      type: String,
      default: 'file'
    },
    // 接受上传的文件类型(thumbnail-mode 模式下此参数无效)
    accept: String,
    buttonText: {
      type: String,
      default: '上传'
    },
    tip: String,
    showFileList: {
      type: Boolean,
      default: true
    },
    disabled: {
      type: Boolean,
      default: false
    }
  },
  components: {
    Cropper,
    EleGallery
  },
  inject: {
    elForm: {
      default: ''
    }
  },
  data() {
    return {
      progressPercent: 0,
      uploadAction: `${window.SITE_CONFIG['apiURL']}${this.action}?token=${Cookies.get('token')}`,
      cropData: {},
      isShowCrop: false,
      uploading: false,
      fileList: this.getUploadList(this.value),
      uploadList: this.getUploadList(this.value),
      progressFlag:false
    }
  },
  computed: {
    // 是否显示提示
    showTip() {
      return this.isShowTip && (this.fileType.length || this.fileSize)
    },
    galleryValues() {
      let urls = []
      if (this.value) {
        if (this.multiple) {
          this.value.forEach(v => urls.push({
            src: v.url,
            title: v.name
          }))
        } else {
          urls.push({
            src: this.value.url,
            title: this.value.name
          })
  export default {
    name: 'ZtUploader',
    props: {
      // 值
      value: {
        type: [Object, Array],
        default() {
          return this.multiple ? [] : null
        }
      },
      dataForm: Object,
      action: {
        type: String,
        default: '/sys/oss/uploadNew'
      },
      // 是否为图片
      showFileList: {
        type: Boolean,
        default: true
      },
      onlyUploadFile: {
        type: Boolean,
        default: false
      },
      // 是否为图片
      image: {
        type: Boolean,
        default: false
      },
      // 是否剪裁
      crop: {
        type: Boolean,
        default: false
      },
      // 裁剪高度
      cropHeight: {
        type: Number
      },
      // 裁剪宽度
      cropWidth: {
        type: Number
      },
      // 是否启用拖拽上传
      drag: {
        type: Boolean,
        default: false
      },
      // 是否支持多选文件
      multiple: {
        type: Boolean,
        default: false
      },
      // 图片显示大小
      size: {
        type: Number,
        default: 100
      },
      // 大小限制(MB)
      fileSize: {
        type: Number
      },
      // 文件类型, 例如['png', 'jpg', 'jpeg']
      fileType: {
        type: Array,
        default: () => []
      },
      // 缩略图后缀, 例如七牛云缩略图样式 (?imageView2/1/w/20/h/20)
      thumbSuffix: {
        type: String,
        default: ''
      },
      // 是否显示提示
      isShowTip: {
        type: Boolean,
        default: true
      },
      // 弹窗标题
      title: String,
      // 图片懒加载
      lazy: {
        type: Boolean,
        default: false
      },
      // 文件个数显示
      limit: {
        type: Number,
        default: 10
      },
      // 上传时附带的额外参数
      data: Object,
      // 上传的文件字段名
      name: {
        type: String,
        default: 'file'
      },
      // 接受上传的文件类型(thumbnail-mode 模式下此参数无效)
      accept: String,
      buttonText: {
        type: String,
        default: '上传'
      },
      tip: String,
      disabled: {
        type: Boolean,
        default: false
      }
      return urls
    },
    isShowUpload() { // 是否显示上传按钮
      if (this.multiple) {
        return this.uploadList.length < this.limit
    components: {
      Cropper,
      EleGallery
    },
    inject: {
      elForm: {
        default: ''
      }
    },
    data() {
      return {
        isUpload: false,
        maxSize: 50 * 1024 * 1024 * 1024, // 上传最大文件限制  最小单位是b
        multiUploadSize: 10 * 1024 * 1024, // 大于这个大小的文件使用分块上传(后端可以支持断点续传)  100mb
        eachSize: 10 * 1024 * 1024, // 每块文件大小   100mb
        requestCancelQueue: [], // 请求方法队列(调用取消上传
        // 每上传一块的进度
        eachProgress: 0,
        // 总共有多少块。断点续传使用
        chunksKeep: 0,
        // 切割后的文件数组
        fileChunksKeep: [],
        // 这个文件,断点续传
        fileKeep: null,
        // 断点续传,文件md5
        fileMd5Keep: "",
        progressPercent: 0,
        uploadAction: `${window.SITE_CONFIG['apiURL']}/sys/oss/upload_chunk?token=${Cookies.get('token')}`,
        uploadCheckAction: `${window.SITE_CONFIG['apiURL']}/sys/oss/upload_success?token=${Cookies.get('token')}`,
        uploadProcessAction: `${window.SITE_CONFIG['apiURL']}${this.action}?token=${Cookies.get('token')}`,
        cropData: {},
        isShowCrop: false,
        uploading: false,
        fileList: this.getUploadList(this.value),
        uploadList: this.getUploadList(this.value),
        progressFlag: false
      }
    },
    created() {
      if (this.onlyUploadFile) {
        this.fileList = [{id: '1', name: '', url: ''}]
      } else {
        return this.uploadList.length === 0
        this.fileList = []
      }
    },
    uploadDisabled() {
      return this.disabled || (this.elForm || {}).disabled
    },
    successFiles() {
      return this.uploadList.filter((file) => file.status === 'success')
    },
    isShowGrllery() {
      return this.galleryValues.length > 0
    }
  },
  watch: {
    value(val, oldval) {
      if (this.uploadList !== val) {
        this.uploadList = this.getUploadList(val)
        this.fileList = this.getUploadList(val)
        console.log(this.fileList,'this.fileList this.fileList')
        this.$emit('getUploaderImg',this.fileList)
      }
    },
    isShowCrop(value) {
      if (value === false) {
        this.cropData = {}
      }
    }
  },
  methods: {
    format(percentage) {
      return percentage === 100 ? '后台正在处理' : `${percentage}%`;
    },
    // 获取已上传的文件列表
    getUploadList(val) {
      if (val) {
        // console.log(val, 'getUploadList val')
        if (!this.multiple) { // 单选
          return [val]
        } else {
          // console.log([...val], 'getUploadList [...val]')
          return [...val]
    computed: {
      // 是否显示提示
      showTip() {
        return this.isShowTip && (this.fileType.length || this.fileSize)
      },
      computerFileName(computerFileName) {
        let fileName = 'aaaa'
        if (this.fileList.length > 0) {
          fileName = this.fileList[0].name
        }
      } else {
        return []
      }
    },
    onUploadProgress(event, file, fileList) {
      this.progressFlag = true
      let per = Number(
        ((event.loaded / event.total) * 100).toFixed(2)
      )
      this.progressPercent = per > 100 ? 100 : per
    },
    handleSetFileSet(fileName, fileType, fileSize) {
      const uid = this.cropData.uid || new Date().getTime()
      this.cropData = {
        name: fileName,
        percentage: 0,
        size: fileSize,
        type: fileType,
        status: 'ready',
        uid: uid
      }
    },
    handleCropSuccess(b64Data) {
      this.cropData.url = b64Data
    },
    handleCropUploadError(status) {
      this.$message.error('上传失败, 请重试')
      this.$emit('error', status)
    },
    handleCropUploadSuccess(response) {
      this.cropData.status = 'success'
      this.cropData.percentage = 100
      this.cropData.response = response
      const file = Object.assign({}, this.cropData)
      this.handleUploadSuccess(response, file)
    },
    // 上传前校检格式和大小
    handleBeforeUpload(file) {
      let isAccept = true
      if (this.fileType.length) { // 文件类型(后缀)一致
        let fileExtension = ''
        if (file.name.lastIndexOf('.') > -1) {
          fileExtension = file.name.slice(file.name.lastIndexOf('.') + 1)
        }
        isAccept = this.fileType.some((type) => {
          if (file.type.indexOf(type) > -1) return true
          if (fileExtension && fileExtension.indexOf(type) > -1) return true
          return false
        })
      }
      if (!isAccept) {
        this.$message.error(`文件格式不正确, 请上传${this.fileType.join('/')}格式文件!`)
        return false
      }
      if (this.fileSize) {
        const isLt = file.size / 1024 / 1024 < this.fileSize
        if (!isLt) {
          this.$message.error(`上传大小不能超过 ${this.fileSize} MB!`)
          return false
        }
      }
      this.uploading = true
      return true
    },
    handleChange() {
      this.uploading = false
      /*const config = {
        onUploadProgress: (progressEvent) => {
          this.progressPercent = Number(
            ((progressEvent.loaded / progressEvent.total) * 90).toFixed(2)
          )
        }
      }
      //this.progressFlag = true;
      let form = new FormData();
      form.append("file", params.file);
      this.$http.post( this.uploadAction,form,config ).then((res) => {
        this.progressPercent = 100;
      })*/
    },
    // 文件个数超出
    handleExceed() {
      this.$message.error(`最多上传${this.limit}个`)
    },
    // 上传失败
    handleUploadError(err) {
      this.uploading = false
      this.$message.error('上传失败, 请重试')
      this.$emit('error', err)
    },
    // 上传成功回调
    handleUploadSuccess(response, file) {
      console.log(response, file,'response, file')
      if (response.code === 0) {
        this.progressPercent = 100
        this.uploading = false
        // this.$message.success('上传成功')
        if (this.multiple) {
          this.uploadList.push(response.data)
          this.$emit('input', this.uploadList)
        } else {
          this.$emit('input', response.data)
        }
        this.progressFlag = false
        this.progressPercent = 0
      }
    },
    async handleRemove(index) {
      let file = this.uploadList[index]
      if (file.status === 1) { // 证书文件,直接从列表删除,不保存数据库
        this.handRemoveAndSetValue(index)
      } else {
        if (await this.$tip.confirm(this.$t('prompt.info', {'handle': this.$t('delete')}))) {
          let res = await this.$http.delete('/sys/oss', {'data': [file.id]})
          if (res.success) {
            await this.$tip.success()
            this.handRemoveAndSetValue(index)
        return fileName
      },
      galleryValues() {
        let urls = []
        if (this.value) {
          if (this.multiple) {
            this.value.forEach(v => urls.push({
              src: v.url,
              title: v.name
            }))
          } else {
            urls.push({
              src: this.value.url,
              title: this.value.name
            })
          }
        }
        return urls
      },
      isShowUpload() { // 是否显示上传按钮
        if (this.multiple) {
          return this.uploadList.length < this.limit
        } else {
          return this.uploadList.length === 0 || this.onlyUploadFile
        }
      },
      uploadDisabled() {
        return this.disabled || (this.elForm || {}).disabled
      },
      successFiles() {
        return this.uploadList.filter((file) => file.status === 'success')
      },
      isShowGrllery() {
        return this.galleryValues.length > 0
      }
    },
    handRemoveAndSetValue(index) {
      if (this.multiple) {
        this.uploadList.splice(index, 1)
        this.$refs.upload.uploadFiles.splice(index, 1)
        this.$emit('input', this.uploadList || [])
      } else {
        this.$emit('input', null)
    watch: {
      // eslint-disable-next-line no-unused-vars
      value(val, oldval) {
        if (this.uploadList !== val) {
          this.uploadList = this.getUploadList(val)
          this.fileList = this.getUploadList(val)
          if (this.fileList.length>0){
            console.log(this.fileList[0].status, 'val.files[0].status23')
            // alert('2222'+this.fileList[0].status)
          }
        }
      },
      isShowCrop(value) {
        if (value === false) {
          this.cropData = {}
        }
      }
    },
    methods: {
      format(percentage) {
        return percentage === 100 ? '后台正在处理' : percentage === 99 ? '正在进行文件校验' : `已上传${percentage}%`;
      },
      // 获取已上传的文件列表
      getUploadList(val) {
        if (val) {
          if (val.length > 0) {
            if (!this.multiple) { // 单选
              console.log(val, 'getUploadList val')
              return val
            } else {
              console.log([...val], 'getUploadList [...val]')
              return [...val]
            }
          } else {
            return []
          }
        }
      },
      // eslint-disable-next-line no-unused-vars
      onUploadProgress(event, file, fileList) {
        this.progressFlag = true
        /*let per = Number(
          ((event.loaded / event.total) * 100).toFixed(2)
        )
        this.progressPercent = per > 100 ? 100 : per*/
      },
      handleSetFileSet(fileName, fileType, fileSize) {
        const uid = this.cropData.uid || new Date().getTime()
        this.cropData = {
          name: fileName,
          percentage: 0,
          size: fileSize,
          type: fileType,
          status: 'ready',
          uid: uid
        }
      },
      handleCropSuccess(b64Data) {
        this.cropData.url = b64Data
      },
      handleCropUploadError(status) {
        this.$message.error('上传失败, 请重试')
        this.$emit('error', status)
      },
      handleCropUploadSuccess(response) {
        console.log(response, 'handleCropUploadSuccess response')
        this.cropData.status = 'success'
        this.cropData.percentage = 100
        this.cropData.response = response
        const file = Object.assign({}, this.cropData)
        this.handleUploadSuccess(response, file)
      },
      // 上传前校检格式和大小
      handleBeforeUpload(file) {
        let isAccept = true
        if (this.fileType.length) { // 文件类型(后缀)一致
          let fileExtension = ''
          if (file.name.lastIndexOf('.') > -1) {
            fileExtension = file.name.slice(file.name.lastIndexOf('.') + 1)
          }
          isAccept = this.fileType.some((type) => {
            if (file.type.indexOf(type) > -1) return true
            if (fileExtension && fileExtension.indexOf(type) > -1) return true
            return false
          })
        }
        if (!isAccept) {
          this.$message.error(`文件格式不正确, 请上传${this.fileType.join('/')}格式文件!`)
          return false
        }
        if (this.fileSize) {
          const isLt = file.size / 1024 / 1024 < this.fileSize
          if (!isLt) {
            this.$message.error(`上传大小不能超过 ${this.fileSize} MB!`)
            return false
          }
        }
        if (this.dataForm) {
          // eslint-disable-next-line vue/no-mutating-props
          this.dataForm.hasUploadFinsh = 50
        }
        this.uploading = true
        return true
      },
      async handleChange() {
        this.uploading = false
        /*const config = {
          onUploadProgress: (progressEvent) => {
            this.progressPercent = Number(
              ((progressEvent.loaded / progressEvent.total) * 90).toFixed(2)
            )
          }
        }
        //this.progressFlag = true;
        let form = new FormData();
        form.append("file", params.file);
        this.$http.post( this.uploadAction,form,config ).then((res) => {
          this.progressPercent = 100;
        })*/
      },
      // 文件个数超出
      handleExceed(files, fileList) {
        if (this.onlyUploadFile) {
          this.$set(fileList[0], 'raw', files[0])
          this.$set(fileList[0], 'name', files[0].name)
          /*          this.$refs.upload.clearFiles()
                    this.$refs.upload.handleStart(files[0])*/
        }
        //this.$message.error(`最多上传${this.limit}个`)
      },
      // 上传失败
      handleUploadError(err) {
        this.uploading = false
        this.$message.error('上传失败, 请重试')
        this.$emit('error', err)
      },
      // 上传成功回调
      // eslint-disable-next-line no-unused-vars
      handleUploadSuccess(response, file) {
        console.log(response, 'handleUploadSuccess response')
        if (response.code === 0) {
          this.progressPercent = 100
          this.uploading = false
          // this.$message.success('上传成功')
          if (this.multiple) {
            this.uploadList.push(response.data)
            this.$emit('input', this.uploadList)
          } else {
            this.$emit('input', response.data)
          }
          this.progressFlag = false
          this.progressPercent = 0
        }
      },
      async handleRemove(index) {
        let file = this.uploadList[index]
        if (file.status === 1) { // 证书文件,直接从列表删除,不保存数据库
          this.handRemoveAndSetValue(index)
        } else {
          if (await this.$tip.confirm(this.$t('prompt.info', {'handle': this.$t('delete')}))) {
            let res = await this.$http.delete('/sys/oss', {'data': [file.id]})
            if (res.success) {
              await this.$tip.success()
              this.handRemoveAndSetValue(index)
            }
          }
        }
      },
      handRemoveAndSetValue(index) {
        console.log(index, 'handRemoveAndSetValue')
        if (this.multiple) {
          this.uploadList.splice(index, 1)
          this.$refs.upload.uploadFiles.splice(index, 1)
          this.$emit('input', this.uploadList || [])
        } else {
          this.$emit('input', null)
        }
      },
      nullFunction(param) {
      },
      //开始分片上传myCheckedFile
      async myCheckedFile() {
        if (!this.handleBeforeUpload(this.fileList[0].raw))
          return
        let options = {
          file: this.fileList[0].raw,
          onProgress: function (val) {
          },
          onSuccess: function (val) {
          },
          onError: function (val) {
          }
        }
        await this.checkedFile(options)
      },
      async checkedFile(options) {
        if (!this.isUpload) {
          this.isUpload = true;
        } else {
          return this.$message({
            message: `当前文件正在上传`,
            type: "warning"
          });
        }
        this.progressFlag = true
        const {
          maxSize,
          multiUploadSize,
          getSize,
          splitUpload,
          singleUpload
        } = this; // 解构赋值
        const {file, onProgress, onSuccess, onError} = options; // 解构赋值
        file.uid = getUUID().toString()
        if (file.size > maxSize) {
          return this.$message({
            message: `您选择的文件大于${getSize(maxSize)}`,
            type: "error"
          });
        }
        this.fileKeep = file;
        const uploadFunc =
          file.size > multiUploadSize ? splitUpload : singleUpload; // 选择上传方式
        try {
          await uploadFunc(file, onProgress);
          onSuccess();
        } catch (e) {
          console.error(e);
          this.$message({
            message: e.message,
            type: "error"
          });
          this.progressFlag = false;
          this.progressPercent = 0;
          onError();
        }
      },
      // 格式化文件大小显示文字
      getSize(size) {
        return size > 1024
          ? size / 1024 > 1024
            ? size / (1024 * 1024) > 1024
              ? (size / (1024 * 1024 * 1024)).toFixed(2) + "GB"
              : (size / (1024 * 1024)).toFixed(2) + "MB"
            : (size / 1024).toFixed(2) + "KB"
          : size.toFixed(2) + "B";
      },
      // 单文件直接上传
      async singleUpload(file, onProgress) {
        await this.postFile(
          {file, uid: file.uid, fileName: file.fileName, chunk: 0},
          onProgress
        );
        const reader = new FileReader();
        reader.readAsArrayBuffer(file);
        console.log(file, 'singleUpload file');
        let hashMd5 = "";
        console.log(hashMd5);
        const that = this;
        function getHash(cb) {
          console.log(cb, "进入单个上传的getHash");
          console.log("进入单个上传的getHash");
          reader.onload = function (e) {
            console.log("进入单个上传的getHash的函数2");
            console.log(hashMd5);
            console.log(this);
            // console.log(e)
            const hash = SparkMD5.ArrayBuffer.hash(e.target.result, false);
            console.log(e.target.result, 'e.target.result');
            console.log(hash, 'hash');
            that.hashMd5 = hash;
            console.log(that.hashMd5, 'hashMd5');
            that.fileMd5Keep = hash;
            cb(hash);
          };
        }
        await getHash(function (hash) {
          console.log(hash, 'getHash(function (hash) hash');
          console.log(that, 'getHash(function (hash) that');
          // 请求接口
          that.validateFile({
            name: file.name,
            uid: file.uid,
            md5: hash,
            chunks: 1,
            filter_type: "user_data_file"
          });
        });
      },
      // 大文件分块上传
      splitUpload(file, onProgress) {
        console.log(file, 'splitUpload(file');
        // eslint-disable-next-line no-async-promise-executor
        return new Promise(async (resolve, reject) => {
          try {
            const {eachSize} = this;
            const chunks = Math.ceil(file.size / eachSize);
            this.chunksKeep = chunks;
            const fileChunks = await this.splitFile(file, eachSize, chunks);
            this.fileChunksKeep = fileChunks;
            //判断每上传一个文件,进度条涨多少,保留两位小数
            this.eachProgress = 100 / chunks;
            this.progressFlag = true;
            let currentChunk = 0;
            let percent = 0;
            for (let i = 0; i < fileChunks.length; i++) {
              // 服务端检测已经上传到第currentChunk块了,那就直接跳到第currentChunk块,实现断点续传
              // 此时需要判断进度条
              if (Number(currentChunk) === i) {
                // 每块上传完后则返回需要提交的下一块的index
                await this.postFile(
                  {
                    chunked: true,
                    chunk: i,
                    chunks,
                    eachSize,
                    fileName: file.name,
                    fullSize: file.size,
                    uid: file.uid,
                    file: fileChunks[i]
                  },
                  onProgress
                );
                currentChunk++;
                // 上传完一块后,进度条增加
                percent = percent + this.eachProgress;
                // 不能超过100
                this.progressPercent = percent > 100 ? 99 : Math.floor(percent);
              }
            }
            const spark = new SparkMD5.ArrayBuffer();
            let currentChunkMd5 = 0;
            const that = this;
            const reader = new FileReader();
            reader.onload = async function (e) {
              spark.append(e.target.result);
              currentChunkMd5++;
              if (currentChunkMd5 < chunks) {
                await loadNext();
              } else {
                // console.log(spark.end());
                const hashMd5111 = spark.end();
                that.fileMd5Keep = hashMd5111;
                // 在这里请求接口
                await that.validateFile({
                  name: file.name,
                  uid: file.uid,
                  md5: hashMd5111,
                  chunks: fileChunks.length,
                  filter_type: "git_secret_file"
                });
              }
            };
            // eslint-disable-next-line no-inner-declarations
            async function loadNext() {
              const start = currentChunkMd5 * eachSize;
              const end =
                start + eachSize >= file.size ? file.size : start + eachSize;
              await reader.readAsArrayBuffer(file.slice(start, end));
            }
            await loadNext();
            resolve();
          } catch (error) {
            reject(error);
          }
        });
      },
      // 断点续传
      againSplitUpload(file, array) {
        console.log("file,array");
        console.log(file);
        console.log(array);
        // eslint-disable-next-line no-async-promise-executor
        return new Promise(async (resolve, reject) => {
          try {
            // eslint-disable-next-line no-unused-vars
            const {eachSize, fileKeep} = this;
            const chunks = this.chunksKeep;
            const fileChunks = this.fileChunksKeep;
            this.progressFlag = true;
            // let currentChunk = 0;
            for (let i = 0; i < array.length; i++) {
              // 服务端检测已经上传到第currentChunk块了,那就直接跳到第currentChunk块,实现断点续传
              // 此时需要判断进度条
              // 每块上传完后则返回需要提交的下一块的index
              await this.postFile({
                chunked: true,
                chunk: array[i],
                chunks,
                name: file.name,
                fullSize: fileKeep.size,
                uid: file.uid,
                file: fileChunks[array[i]]
              });
              // currentChunk++
              // 上传完一块后,进度条增加
              this.progressPercent += this.eachProgress;
              // 不能超过100
              this.progressPercent = this.progressPercent > 100 ? 100 : this.progressPercent;
            }
            let fileMd5KeepTwo = this.fileMd5Keep;
            const isValidate = await this.validateFile({
              name: file.name,
              uid: file.uid,
              md5: fileMd5KeepTwo,
              chunks: fileChunks.length,
              filter_type: "git_secret_file"
            });
            if (!isValidate) {
              throw new Error("文件校验异常");
            }
            // 关闭进度条
            this.progressFlag = false;
            // 重置进度条
            this.progressPercent = 0;
            resolve();
          } catch (e) {
            reject(e);
          }
        });
      },
      // 文件分块,利用Array.prototype.slice方法
      splitFile(file, eachSize, chunks) {
        return new Promise((resolve, reject) => {
          try {
            setTimeout(() => {
              const fileChunk = [];
              for (let chunk = 0; chunks > 0; chunks--) {
                fileChunk.push(file.slice(chunk, chunk + eachSize));
                chunk += eachSize;
              }
              resolve(fileChunk);
            }, 0);
          } catch (e) {
            console.error(e);
            reject(new Error("文件切块发生错误"));
          }
        });
      },
      removeFile(file) {
        this.requestCancelQueue[file.uid]();
        delete this.requestCancelQueue[file.uid];
        return true;
      },
      // 提交文件方法,将参数转换为FormData, 然后通过axios发起请求
      postFile(param, onProgress) {
        const formData = new FormData();
        formData.append("file", param.file); //  改了
        formData.append("fileName", param.fileName); //  改了
        formData.append("uid", param.uid);
        formData.append("chunk", param.chunk);
        formData.append("filter_type", "git_secret_file");
        formData.append("chunks", param.chunks);
        const {requestCancelQueue} = this;
        const config = {
          cancelToken: new axios.CancelToken(function executor(cancel) {
            if (requestCancelQueue[param.uid]) {
              requestCancelQueue[param.uid]();
              delete requestCancelQueue[param.uid];
            }
            requestCancelQueue[param.uid] = cancel;
          }),
          onUploadProgress: e => {
            if (param.chunked) {
              e.percent = Number(
                (
                  ((param.chunk * (param.eachSize - 1) + e.loaded) /
                    param.fullSize) *
                  100
                ).toFixed(2)
              );
            } else {
              e.percent = Number(((e.loaded / e.total) * 100).toFixed(2));
            }
            onProgress(e)
          }
        }
        //return axios.post('sys/oss/upload_chunk/', formData, config).then(rs => rs.data)
        return this.$http({
          url: "/sys/oss/upload_chunk/",
          method: "POST",
          data: formData
        }).then(rs => rs.data
        );
      },
      // 文件校验方法
      validateFile(file) {
        //return axios.post('sys/oss/upload_success/', file).then(rs => rs.data)
        return this.$http({
          url: "/sys/oss/upload_success/",
          method: "POST",
          data: file
        }).then(res => {
          console.log(res, "validateFile res")
          if (res && !res.data) {
            this.againSplitUpload(file, res.data.error_file)
            this.$message({
              message: "有文件上传失败,正在重新上传",
              type: "warning"
            });
          } else if (res && res.data) {
            this.progressPercent = 100
            if (!this.onlyUploadFile) {
              this.$http({
                url: this.action,
                method: "POST",
                data: file
              }).then(res => {
                console.log(res, '后台处理 res1')
                let aa = res.data.status
                console.log(aa, 'res.data.status')
                if (this.multiple) {
                  this.uploadList.push(res.data)
                  this.$emit('input', this.uploadList)
                } else {
                  this.$emit('input', res.data)
                }
                this.uploading = false
                this.progressFlag = false
                this.progressPercent = 0
                this.isUpload = false
              })
            } else {
              console.log(file.uid, 'file.uid')
              this.$emit('recall', file.uid)
              this.uploading = false
              this.progressFlag = false
              this.progressPercent = 0
              this.isUpload = false
            }
          } else if (res && res.status == 40008) {
            this.$message.error(res.message);
            this.progressFlag = false;
            this.progressPercent = 0;
          }
        })
      }
    },
    mounted() {
      // 插入到body中, 避免弹出层被遮盖
      if (this.crop && this.$refs.cropper) {
        document.body.appendChild(this.$refs.cropper.$el)
      }
    }
  },
  mounted() {
    // 插入到body中, 避免弹出层被遮盖
    if (this.crop && this.$refs.cropper) {
      document.body.appendChild(this.$refs.cropper.$el)
    }
  }
}
</script>
<style>
.zt-upload {
  line-height: 1;
}
  .zt-upload {
    line-height: 1;
  }
.zt .upload-input .upload-btn {
  padding: 8px 12px;
}
  .zt .upload-input .upload-btn {
    padding: 8px 12px;
  }
.zt .upload-input.hide {
  height: 0px;
}
  .zt .upload-input.hide {
    height: 0px;
  }
.zt-upload .el-loading-spinner {
  line-height: 1;
}
  .zt-upload .el-loading-spinner {
    line-height: 1;
  }
.zt-upload .el-icon-plus {
  vertical-align: middle;
}
  .zt-upload .el-icon-plus {
    vertical-align: middle;
  }
.zt-upload .el-upload--picture-card {
  width: auto;
  height: auto;
  background: none;
  line-height: inherit;
}
  .zt-upload .el-upload--picture-card {
    width: auto;
    height: auto;
    background: none;
    line-height: inherit;
  }
/* 裁剪 */
.vue-image-crop-upload.zt-upload-image--cropper {
  z-index: 99;
}
  /* 裁剪 */
  .vue-image-crop-upload.zt-upload-image--cropper {
    z-index: 99;
  }
.zt-upload-image--cropper .vicp-drop-area {
  background-color: #fbfdff !important;
}
  .zt-upload-image--cropper .vicp-drop-area {
    background-color: #fbfdff !important;
  }
.zt-upload-image--cropper .vicp-icon1-arrow {
  border-bottom-color: #909399 !important;
}
  .zt-upload-image--cropper .vicp-icon1-arrow {
    border-bottom-color: #909399 !important;
  }
.zt-upload-image--cropper .vicp-icon1-body {
  background-color: #909399 !important;
}
  .zt-upload-image--cropper .vicp-icon1-body {
    background-color: #909399 !important;
  }
.zt-upload-image--cropper .vicp-icon1-bottom {
  border-color: #909399 !important;
}
  .zt-upload-image--cropper .vicp-icon1-bottom {
    border-color: #909399 !important;
  }
</style>
web/src/components/config-uploader/src/config-uploader.vue
@@ -1,9 +1,9 @@
<template>
  <div>
    <el-collapse class="config-uploader" v-model="activeNames" v-if="oss && oss.groups.length>1">
  <div v-if="oss">
    <el-collapse class="config-uploader" v-model="activeNames" v-if="oss.groups.length>1">
      <el-collapse-item name="1" v-for="group in (oss.groups || [])" :key="group.busiFieldGroup">
        <template slot="title">
          <el-tag v-if="!image">{{group.busiFieldGroup}}</el-tag>
          <el-tag>{{group.busiFieldGroup}}</el-tag>
        </template>
        <!-- <zt-form-item :label="field.busiFieldName" :prop="field.busiField" v-for="field in group.fields"
                       :key="field.busiField" :rules="field.isRequired ? 'required':''" style="width: 100%;">
@@ -11,15 +11,17 @@
                        :accept="field.accept" :file-size="field.fileSize" @input="change(field.busiField)"/>
         </zt-form-item>-->
        <el-table :data="group.fields" :show-header="false">
          <el-table-column width="250" style="text-align: left;white-space:nowrap;">
          <el-table-column width="180" style="text-align: left;white-space:nowrap;">
            <template slot-scope="scope">
              <span v-html="scope.row.busiFieldName"></span>
              <span v-html="(scope.row.isRequired?'<font color=red>* </font>':'')+ scope.row.busiFieldName"></span>
            </template>
          </el-table-column>
          <el-table-column align="left">
            <template slot-scope="scope">
              <zt-uploader :image="image" v-model="dataForm[scope.row.busiField]" multiple :limit="scope.row.fileLimit" :file-type="scope.row.fileType"
                           :accept="scope.row.accept" :file-size="scope.row.fileSize" @getUploaderImg="getUploaderImg" @input="change(scope.row.busiField)"/>
              <zt-uploader v-model="dataForm[scope.row.busiField]" :dataForm="dataForm" multiple
                           :limit="scope.row.fileLimit" :file-type="scope.row.fileTypeArr"
                           :showFileList2="false" :accept="scope.row.accept" :file-size="scope.row.fileSize"
                           @input="change(scope.row.busiField)"/>
            </template>
          </el-table-column>
        </el-table>
@@ -32,16 +34,26 @@
           <zt-uploader v-model="dataForm[field.busiField]" multiple :limit="field.fileLimit" :file-type="field.fileType"
                        :accept="field.accept" :file-size="field.fileSize" @input="change(field.busiField)"/>
         </zt-form-item>-->
        <template slot="title">
          <el-tag>{{group.busiFieldGroup}}</el-tag>
        </template>
        <!-- <zt-form-item :label="field.busiFieldName" :prop="field.busiField" v-for="field in group.fields"
                       :key="field.busiField" :rules="field.isRequired ? 'required':''" style="width: 100%;">
           <zt-uploader v-model="dataForm[field.busiField]" multiple :limit="field.fileLimit" :file-type="field.fileType"
                        :accept="field.accept" :file-size="field.fileSize" @input="change(field.busiField)"/>
         </zt-form-item>-->
        <el-table :data="group.fields" :show-header="false">
          <el-table-column width="250" style="text-align: left;white-space:nowrap;">
          <el-table-column width="180" style="text-align: left;white-space:nowrap;">
            <template slot-scope="scope">
              <span v-html="scope.row.busiFieldName"></span>
              <span v-html="(scope.row.isRequired?'<font color=red>* </font>':'')+ scope.row.busiFieldName"></span>
            </template>
          </el-table-column>
          <el-table-column align="left">
            <template slot-scope="scope">
              <zt-uploader :image="image" v-model="dataForm[scope.row.busiField]" multiple :limit="scope.row.fileLimit" :file-type="scope.row.fileType"
                           :accept="scope.row.accept" :file-size="scope.row.fileSize" @getUploaderImg="getUploaderImg" @input="change(scope.row.busiField)"/>
              <zt-uploader v-model="dataForm[scope.row.busiField]" :dataForm="dataForm" multiple
                           :limit="scope.row.fileLimit" :file-type="scope.row.fileTypeArr"
                           :showFileList2="false" :accept="scope.row.accept" :file-size="scope.row.fileSize"
                           @input="change(scope.row.busiField)"/>
            </template>
          </el-table-column>
        </el-table>
@@ -58,7 +70,6 @@
    props: {
      value: Object,
      dataForm: Object,
      image:false,
      busiType: String // 业务类型
    },
    data() {
@@ -72,7 +83,15 @@
        let arr = []
        if (this.dataForm.files && this.dataForm.files.groups) {
          this.dataForm.files.groups.forEach(group => {
            group.fields.forEach(field => arr.push(field))
            group.fields.forEach(field => {
              let arrType = []
              if (field.fileTypes) {
                arrType = field.fileTypes.split(',')
              }
              //this.$set(field, 'fileTypeArr', arrType)
              field.fileTypeArr = arrType
              arr.push(field)
            })
          })
        }
        return arr
@@ -110,25 +129,31 @@
      getOss() {
        let arr = (this.$store.state.oss.configs || []).filter(config => config.busiType === this.busiType)
        if (arr.length > 0) {
          arr[0].groups.forEach(group => {
            group.fields.forEach(field => {
              let arrType = []
              if (field.fileTypes) {
                arrType = field.fileTypes.split(',')
              }
              //this.$set(field, 'fileTypeArr', arrType)
              field.fileTypeArr = arrType
            })
          })
          console.log(JSON.parse(JSON.stringify(arr[0])),'JSON.parse(JSON.stringify(arr[0]))')
          return JSON.parse(JSON.stringify(arr[0]))
        }
        return null
      },
      change(busiField) {
        console.log(busiField,'busiField busiField')
        this.fields.forEach(field => {
          if (field.busiField === busiField) {
            field.files.length = 0
            this.dataForm[busiField].forEach(file => field.files.push(file))
            if (this.dataForm) {
              this.dataForm.hasUploadFinsh = 100
            }
          }
        })
      },
      getUploaderImg(list){
        // this.imageList = list
        if(list[0].url){
          this.$emit('getImageUrl',list[0].url)
        }
      }
    }
  }
web/src/components/table-uploader/src/table-uploader.vue
@@ -1,25 +1,12 @@
<template>
  <div>
    <div class="config-uploader" >
    <div class="config-uploader" v-if="oss">
      <div v-for="group in (oss.groups || [])" :key="group.busiFieldGroup">
         <zt-form-item v-for="field in group.fields" :prop="field.busiField"
                       :key="field.busiField" :rules="field.isRequired ? 'required':''" style="width: 100%;margin-bottom: 0">
           <zt-uploader v-model="dataForm[field.busiField]" multiple :limit="field.fileLimit" :file-type="field.fileType"
                        :accept="field.accept" :file-size="field.fileSize" @input="change(field.busiField)"/>
         </zt-form-item>
<!--        <el-table :data="group.fields" :show-header="false">-->
<!--          <el-table-column width="250" style="text-align: left;white-space:nowrap;">-->
<!--            <template slot-scope="scope">-->
<!--              <span v-html="scope.row.busiFieldName"></span>-->
<!--            </template>-->
<!--          </el-table-column>-->
<!--          <el-table-column align="left">-->
<!--            <template slot-scope="scope">-->
<!--              <zt-uploader v-model="dataForm[scope.row.busiField]" multiple :limit="scope.row.fileLimit" :file-type="scope.row.fileType"-->
<!--                           :accept="scope.row.accept" :file-size="scope.row.fileSize" @getUploaderImg="getUploaderImg" @input="change(scope.row.busiField)"/>-->
<!--            </template>-->
<!--          </el-table-column>-->
<!--        </el-table>-->
      </div>
    </div>
  </div>
@@ -60,6 +47,7 @@
          ...this.getOss(),
          ...(val || {})
        }
        console.log(this.oss,"this.oss")
        // this.dataForm.files = this.oss
        this.$set(this.dataForm, 'files', this.oss)
@@ -72,6 +60,7 @@
    }
  },
  mounted() {
    this.oss = this.getOss()
    if (this.oss) {
      this.oss.groups.forEach(group => {
@@ -91,10 +80,14 @@
    },
    change(busiField) {
      console.log(busiField,'busiField busiField')
      this.fields.forEach(field => {
        if (field.busiField === busiField) {
          field.files.length = 0
          this.dataForm[busiField].forEach(file => field.files.push(file))
          this.dataForm[busiField].forEach(file => {
            console.log(file,"change file")
            field.files.push(file)
          })
        }
      })
    },
web/src/views/modules/itemCirculatOrder/ItemCirculatOrder-AddOrUpdate.vue
@@ -24,7 +24,7 @@
            <el-input v-model="dataForm.project.softwareIdentity" placeholder="物品编号"></el-input>
          </el-form-item>
          <el-form-item class="marginTopAndMarginBottom3" label="数 量" style="width: 32%">
            <el-input v-model="dataForm.project.softwareName" placeholder="数量"></el-input>
            <el-input v-model="dataForm.project.isContract" placeholder="数量"></el-input>
          </el-form-item>
        </div>
        <div style="border-bottom: 1px solid rgba(0,0,0,.2);">
@@ -38,19 +38,19 @@
                    <span v-html="indexFormat(scope.$index)"></span>
                  </template>
                </el-table-column>
                <el-table-column prop="Name" min-width="180" label="技术资料名称">
                <el-table-column prop="infoName" min-width="180" label="技术资料名称">
                  <template v-slot="{ row }">
                    <el-input v-model="row.Name" placeholder="技术资料名称"></el-input>
                    <el-input v-model="row.name" placeholder="技术资料名称"></el-input>
                  </template>
                </el-table-column>
                <el-table-column prop="identify" align="center" width="150" label="标识">
                  <template v-slot="{ row }">
                    <el-input v-model="row.identify" placeholder="标识"></el-input>
                    <el-input v-model="row.version" placeholder="标识"></el-input>
                  </template>
                </el-table-column>
                <el-table-column prop="version" align="center" width="120" label="版本">
                  <template v-slot="{ row }">
                    <el-input v-model="row.version" placeholder="版本"></el-input>
                    <el-input v-model="row.identify" placeholder="版本"></el-input>
                  </template>
                </el-table-column>
                <el-table-column prop="secretClass" label="密级" width="100"  align="center">
@@ -77,7 +77,7 @@
                <el-table-column fixed="right" prop="files" label="上传附件" width="80"  align="center">
                  <template v-slot="{ row }">
<!--                    <zt-table-button @click="files(row.id)">上传附件</zt-table-button>-->
                    <table-uploader busi-type="test_order" model-name="dataForm" :dataForm="dataForm"
                    <table-uploader busi-type="circulat_order" model-name="row" :dataForm="row"
                                     v-model="row.files"/>
                  </template>
                </el-table-column>
@@ -156,7 +156,7 @@
          </div>
          <div class="el-border-left " style="width: 35%;height: 40px;">
            <el-form-item label="是否满足测试要求" label-width="150px" style="padding-left:20px;margin-bottom:0">
              <zt-dict v-model="dataForm.circulatOrder.acceptSituation" :radio="true" dict="is_or_not"></zt-dict>
              <zt-dict v-model="dataForm.circulatOrder.cscs" :radio="true" dict="is_or_not"></zt-dict>
            </el-form-item>
          </div>
        </div>
@@ -364,16 +364,18 @@
          ...this.dataForm,
          ...res.data
        }
        console.log(this.dataForm,"this.dataForm")
        console.log(this.dataForm,"getInfo this.dataForm")
      },
      // 表单提交
      async formSubmit() {
        console.log(this.dataForm,"this.dataForm11111")
        let res = await this.$http[!this.dataForm.id ? 'post' : 'put']('/itemCirculatOrder/ItemCirculatOrder/', this.dataForm)
        if (res.success) {
          await this.$tip.success()
          this.$refs.dialog.close()
          this.$emit('refreshDataList')
        }
      }
    }
  }
web/src/views/modules/itemCirculatOrder/ItemCirculatOrder.vue
@@ -5,7 +5,12 @@
        <el-form :inline="true" :model="dataForm" @keyup.enter.native="table.query()">
          <el-form-item>
            <el-input v-model="dataForm.code" placeholder="请输入物品流转单编号" clearable></el-input>
          </el-form-item>
          <el-form-item>
            <el-input v-model="dataForm.softwareName" placeholder="请输入物品名称" clearable></el-input>
          </el-form-item>
          <el-form-item>
            <el-input v-model="dataForm.softwareIdentity" placeholder="请输入物品编号" clearable></el-input>
          </el-form-item>
          <el-form-item>
            <zt-button type="query" @click="table.query()"/>
@@ -16,6 +21,8 @@
        <el-table v-loading="table.dataLoading" :data="table.dataList" height="100px" v-adaptive="{bottomOffset:70}" border @selection-change="table.selectionChangeHandle">
          <el-table-column type="selection" width="40"/>
            <el-table-column prop="code" label="物品流转单编号"/>
            <el-table-column prop="softwareName" label="物品名称"/>
            <el-table-column prop="softwareIdentity" label="物品编号"/>
              <zt-table-column-handle :table="table" edit-perm="itemCirculatOrder:update" delete-perm="itemCirculatOrder::delete"/>
        </el-table>
        <!-- 弹窗, 新增 / 修改 -->
@@ -37,6 +44,8 @@
      return {
        dataForm: {
          code: '',
          softwareName:'',
          softwareIdentity:'',
        }
      }
    },
web/src/views/modules/project/SoftwareTestOrder-AddOrUpdate.vue
@@ -568,6 +568,7 @@
        }
      }
      // console.log(this.dataForm, "this.dataForm")
      console.log(this.dataForm,"getInfo this.dataForm")
    },
    async print(){
      var params = qs.stringify({
@@ -579,7 +580,7 @@
    },
    // 表单提交
    async formSubmit() {
      console.log(this.dataForm, ' this.dataForm')
      console.log(this.dataForm, 'formSubmit this.dataForm')
      if(this.dataForm.softwareTestOrder.testType1){
        this.dataForm.softwareTestOrder.testType1=this.dataForm.softwareTestOrder.testType1.join(',')
      }
zt/common/src/main/java/com/zt/core/sys/dto/DictIstance.java
@@ -12,4 +12,6 @@
    private String identify;
    private String secretClass;
}
zt/core/src/main/java/com/zt/modules/oss/annotation/DataFieldParser.java
@@ -1,10 +1,8 @@
package com.zt.modules.oss.annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.zt.common.annotation.OssField;
import com.zt.modules.oss.model.OssFieldDefine;
import io.swagger.annotations.ApiModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
@@ -16,10 +14,10 @@
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.stereotype.Component;
import com.zt.common.annotation.OssField;
import com.zt.modules.oss.model.OssFieldDefine;
import io.swagger.annotations.ApiModel;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Component("dataFieldParser")
public class DataFieldParser {
zt/core/src/main/java/com/zt/modules/oss/cloud/LocalStorageService.java
@@ -8,12 +8,10 @@
package com.zt.modules.oss.cloud;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.spire.xls.Workbook;
import com.zt.common.exception.ErrorCode;
import com.zt.common.exception.RenException;
import com.zt.common.utils.CommonUtils;
import com.zt.core.oss.encry.IOssEncryptService;
import com.zt.modules.oss.enums.CloudChannel;
import com.zt.modules.oss.model.QdSysOss;
@@ -29,7 +27,6 @@
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.Date;
/**
 * 本地上传
@@ -98,8 +95,6 @@
    }
    public void content(SysOss oss, HttpServletResponse response) throws Exception {
        Date beginDate = new Date();
        Date lastDate = beginDate;
        if (oss == null) {
            throw new IOException("文件不存在!");
        }
@@ -118,15 +113,7 @@
            System.out.println(File.separator);
            System.out.println(oss.getPath());
            // 创建文件输入流
            Date nowDate = new Date();
            System.out.println("准备时间:" + CommonUtils.getDatePoor(nowDate, lastDate));
            lastDate = nowDate;
            InputStream is = ossEncryptService.decrypt(file);
            nowDate = new Date();
            System.out.println("解密时间:" + CommonUtils.getDatePoor(nowDate, lastDate));
            lastDate = nowDate;
            // 响应输出流
            ServletOutputStream out = response.getOutputStream();
            // 创建缓冲区
@@ -138,9 +125,6 @@
            is.close();
            out.flush();
            out.close();
            nowDate = new Date();
            System.out.println("输出时间:" + CommonUtils.getDatePoor(nowDate, lastDate));
            System.out.println("总时间:" + CommonUtils.getDatePoor(nowDate, beginDate));
        }
    }
@@ -166,7 +150,8 @@
                        workbook.saveToStream(outputStream, com.spire.xls.FileFormat.Version2013); // 指定文件格式
                        documentBytes = outputStream.toByteArray();
                        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
                    }  else if (filename.endsWith(".docx") || filename.endsWith(".xlsx")) {
                    }
                    if (filename.endsWith(".doc") || filename.endsWith(".docx") ||  filename.endsWith(".xlsx")) {
                        documentBytes = FileCopyUtils.copyToByteArray(in);
                        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
                        headers.setContentDispositionFormData("attachment", filename);
zt/core/src/main/java/com/zt/modules/oss/cloud/StorageConfig.java
@@ -8,10 +8,10 @@
package com.zt.modules.oss.cloud;
import java.io.Serializable;
import lombok.Data;
import java.io.Serializable;
/**
 * 云存储配置信息
 *
zt/core/src/main/java/com/zt/modules/oss/controller/SysOssController.java
@@ -8,7 +8,6 @@
package com.zt.modules.oss.controller;
import cn.hutool.core.io.IoUtil;
import com.zt.common.annotation.LogOperation;
import com.zt.common.annotation.QueryParam;
import com.zt.common.constant.Constant;
@@ -30,21 +29,14 @@
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import springfox.documentation.annotations.ApiIgnore;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.nio.file.Files;
import java.util.Map;
/**
zt/core/src/main/java/com/zt/modules/oss/controller/chunkUploadController.java
@@ -5,7 +5,6 @@
import io.swagger.annotations.Api;
import org.apache.tomcat.util.http.fileupload.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -26,11 +25,11 @@
    @PostMapping("/upload_chunk/")
    public Result<Boolean> uploadFile(@RequestParam("file") MultipartFile file,
                             @RequestParam("uid") String uid,
                             @RequestParam("chunk") int chunk,
                             @RequestParam("filter_type") String filterType,
                             @RequestParam("fileName") String fileName,
                             @RequestParam(value = "chunks", required = false) String chunks) {
                                      @RequestParam("uid") String uid,
                                      @RequestParam("chunk") int chunk,
                                      @RequestParam("filter_type") String filterType,
                                      @RequestParam("fileName") String fileName,
                                      @RequestParam(value = "chunks", required = false) String chunks) {
        try {
            String tempUploadDir = storageService.getConfig().getLocalPath() + File.separator + "TEMP_UPLOAD";
            File dir = new File(tempUploadDir);
zt/core/src/main/java/com/zt/modules/oss/encry/NoEncryptService.java
@@ -1,13 +1,11 @@
package com.zt.modules.oss.encry;
import java.io.File;
import java.io.InputStream;
import cn.hutool.core.io.IoUtil;
import com.zt.core.oss.encry.IOssEncryptService;
import org.springframework.stereotype.Service;
import cn.hutool.core.io.IoUtil;
import com.zt.core.oss.encry.IOssEncryptService;
import java.io.File;
import java.io.InputStream;
@Service("noEncryptService")
public class NoEncryptService implements IOssEncryptService {
zt/core/src/main/java/com/zt/modules/oss/enums/OssStatus.java
@@ -20,7 +20,7 @@
@Dictionary(type = "oss_status", name = "文件状态")
public enum OssStatus implements IDictionary {
    TEMPORARY(0, "临时"), PERMANENT(1, "永久");
    TEMPORARY(100, "临时"), PERMANENT(101, "永久");
    private Integer value;
    private String name;
zt/core/src/main/java/com/zt/modules/oss/mapstruct/OssMapper.java
@@ -1,9 +1,8 @@
package com.zt.modules.oss.mapstruct;
import org.mapstruct.Mapper;
import com.zt.core.oss.dto.OssDto;
import com.zt.modules.oss.model.SysOss;
import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
public interface OssMapper {
zt/core/src/main/java/com/zt/modules/oss/model/OssFieldDefine.java
@@ -1,11 +1,10 @@
package com.zt.modules.oss.model;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
@Data
public class OssFieldDefine {
zt/core/src/main/java/com/zt/modules/oss/model/SysOss.java
@@ -8,16 +8,14 @@
package com.zt.modules.oss.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.zt.common.entity.BusiEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * 文件上传
zt/core/src/main/java/com/zt/modules/oss/service/SysOssService.java
@@ -1,6 +1,5 @@
package com.zt.modules.oss.service;
import ch.qos.logback.core.util.FileUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.NumberUtil;
@@ -13,8 +12,6 @@
import com.zt.common.exception.ErrorCode;
import com.zt.common.exception.RenException;
import com.zt.common.service.BaseService;
import com.zt.common.utils.MoveTotherFoldersUtils;
import com.zt.common.utils.UUIDUtil;
import com.zt.core.oss.dto.OssDto;
import com.zt.core.oss.service.ISysOssService;
import com.zt.modules.oss.annotation.DataFieldParser;
@@ -38,7 +35,6 @@
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import java.io.*;
import java.nio.file.Files;
import java.security.Key;
import java.security.SecureRandom;
import java.util.*;
zt/core/src/main/resources/mapper/oss/SysOssDao.xml
@@ -45,5 +45,6 @@
        </if>
        ORDER by a.busi_id,a.sort
    </select>
    <select id="getOldFileList" resultType="com.zt.modules.oss.model.SysOss"></select>
</mapper>
zt/core/src/main/resources/mapper/sys/SysDictTypeDao.xml
@@ -5,7 +5,7 @@
    <select id="getTenantDictTypes" resultType="com.zt.modules.sys.model.SysDictType">
        select a.*
        from DJ_SYS_DICT_TYPE a
        from SYS_DICT_TYPE a
        where a.is_delete = 0
        <if test="tenantId == 0">
            and a.tenant_id = #{tenantId}