From 0e8b4696f30129d25e7e43407519d647b3de3ee7 Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Wed, 5 Jun 2024 21:31:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=87=BA=E5=85=A5=E5=BA=93=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=8C=20=E8=BF=BD=E5=8A=A0=E5=87=BA?= =?UTF-8?q?=E5=85=A5=E5=BA=93=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/excel/core/util/ExcelUtils.java | 11 +- .../excel/core/util/SpinnerWriteHandler.java | 13 +- .../enums/ErrorCodeConstants.java | 2 + .../ErrorCodeConstants_手动操作.java | 3 - .../factorydata/FactoryDataController.java | 65 +++- .../vo/FactoryDataDetailRespVO.java | 10 +- .../factorydata/vo/FactoryDataExportVO.java | 51 +++ .../factorydata/vo/FactoryDataImportVO.java | 51 +++ .../factorydata/vo/FactoryDataInfoRespVO.java | 3 + .../factorydata/vo/FactoryImportRespVO.java | 23 ++ .../sizeData/FactoryDataSizeDetailRespVO.java | 9 + .../vo/sizeData/FactoryDataSizeSaveReqVO.java | 6 + .../factoryinfo/FactoryInfoController.java | 9 + .../factorydata/FactoryDataSizeMapper.java | 4 +- .../mysql/factoryinfo/FactoryInfoMapper.java | 4 +- .../job/factoryData/FactoryDataJob.java | 6 + .../factorydata/FactoryDataService.java | 11 +- .../factorydata/FactoryDataServiceImpl.java | 320 ++++++++++++++---- .../factorydata/FactoryDataSizeService.java | 2 +- .../FactoryDataSizeServiceImpl.java | 53 ++- .../factoryinfo/FactoryInfoService.java | 6 + .../factoryinfo/FactoryInfoServiceImpl.java | 33 +- .../service/packageInfo/PackageService.java | 8 + .../packageInfo/PackageServiceImpl.java | 9 + .../packagedata/PackageDataService.java | 7 + .../packagedata/PackageDataServiceImpl.java | 6 + .../factorydata/FactoryDataSizeMapper.xml | 80 ++++- 27 files changed, 697 insertions(+), 108 deletions(-) delete mode 100644 zn-module-smartfactory/zn-module-smartfactory-api/src/src/main/java/cn/iocoder/yudao/module/smartfactory/enums/ErrorCodeConstants_手动操作.java create mode 100644 zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryDataExportVO.java create mode 100644 zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryDataImportVO.java create mode 100644 zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryImportRespVO.java diff --git a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java index 18941a2e..e906dc5e 100644 --- a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java +++ b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.excel.core.util; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.converters.longconverter.LongStringConverter; +import com.alibaba.excel.support.ExcelTypeEnum; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import org.springframework.web.multipart.MultipartFile; @@ -37,7 +38,9 @@ public class ExcelUtils { .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度 .registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度 - .sheet(sheetName).doWrite(data); + .excelType(ExcelTypeEnum.XLSX) + .sheet(sheetName) + .doWrite(data); // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了 response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8.name())); @@ -45,13 +48,15 @@ public class ExcelUtils { } public static void write(HttpServletResponse response, String filename, String sheetName, - Class head, List data, List deptName, List postName) throws IOException { + Class head, List data, + int col, List value, + int col1,List value1) throws IOException { // 输出excel EasyExcel.write(response.getOutputStream(), head) .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度 - .registerWriteHandler(new SpinnerWriteHandler(deptName, postName)) + .registerWriteHandler(new SpinnerWriteHandler(col, value, col1, value1)) .registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度 .sheet(sheetName).doWrite(data); diff --git a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/SpinnerWriteHandler.java b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/SpinnerWriteHandler.java index 4690be4e..b19de687 100644 --- a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/SpinnerWriteHandler.java +++ b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/SpinnerWriteHandler.java @@ -16,6 +16,10 @@ import java.util.Map; public class SpinnerWriteHandler implements SheetWriteHandler { + private int col; + + private int col1; + private List deptName; private List postName; @@ -23,8 +27,11 @@ public class SpinnerWriteHandler implements SheetWriteHandler { public SpinnerWriteHandler() { } - public SpinnerWriteHandler(List deptName, List postName) { + public SpinnerWriteHandler(int col, List deptName, + int col1, List postName) { + this.col = col; + this.col1 = col1; this.deptName = deptName; this.postName = postName; } @@ -35,8 +42,8 @@ public class SpinnerWriteHandler implements SheetWriteHandler { Map mapDropDown = new HashMap<>(); // 这里的key值 对应导出列的顺序 从0开始 - mapDropDown.put(1, deptName.toArray(new String[0])); - mapDropDown.put(2, postName.toArray(new String[0])); + mapDropDown.put(col, deptName.toArray(new String[0])); + mapDropDown.put(col1, postName.toArray(new String[0])); Sheet sheet = writeSheetHolder.getSheet(); /// 开始设置下拉框 DataValidationHelper helper = sheet.getDataValidationHelper();// 设置下拉框 diff --git a/zn-module-smartfactory/zn-module-smartfactory-api/src/main/java/cn/iocoder/yudao/module/smartfactory/enums/ErrorCodeConstants.java b/zn-module-smartfactory/zn-module-smartfactory-api/src/main/java/cn/iocoder/yudao/module/smartfactory/enums/ErrorCodeConstants.java index 2208eaf9..cc47a514 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-api/src/main/java/cn/iocoder/yudao/module/smartfactory/enums/ErrorCodeConstants.java +++ b/zn-module-smartfactory/zn-module-smartfactory-api/src/main/java/cn/iocoder/yudao/module/smartfactory/enums/ErrorCodeConstants.java @@ -24,4 +24,6 @@ public interface ErrorCodeConstants { //出入库数据模块 ErrorCode SIZEDATA_NOT_EXISTS = new ErrorCode(1_000_002_001, "不能操作非当天录入得数据"); + ErrorCode FACTORY_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_000_002_002, "导入出入库数据不能为空!"); + } diff --git a/zn-module-smartfactory/zn-module-smartfactory-api/src/src/main/java/cn/iocoder/yudao/module/smartfactory/enums/ErrorCodeConstants_手动操作.java b/zn-module-smartfactory/zn-module-smartfactory-api/src/src/main/java/cn/iocoder/yudao/module/smartfactory/enums/ErrorCodeConstants_手动操作.java deleted file mode 100644 index 2be01a14..00000000 --- a/zn-module-smartfactory/zn-module-smartfactory-api/src/src/main/java/cn/iocoder/yudao/module/smartfactory/enums/ErrorCodeConstants_手动操作.java +++ /dev/null @@ -1,3 +0,0 @@ -// TODO 待办:请将下面的错误码复制到 yudao-module-smartfactory-api 模块的 ErrorCodeConstants 类中。注意,请给“TODO 补充编号”设置一个错误码编号!!! -// ========== 工厂信息 TODO 补充编号 ========== -ErrorCode FACTORY_INFO_NOT_EXISTS = new ErrorCode(TODO 补充编号, "工厂信息不存在"); \ No newline at end of file diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/FactoryDataController.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/FactoryDataController.java index 7f01a49b..301e86b3 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/FactoryDataController.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/FactoryDataController.java @@ -3,27 +3,33 @@ package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataDetailRespVO; -import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataPageReqVO; -import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataTotalVO; +import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.*; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeCreateReqVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeDetailRespVO; +import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryInfoDO; +import cn.iocoder.yudao.module.smartfactory.dal.dataobject.size.SizeDO; import cn.iocoder.yudao.module.smartfactory.service.factorydata.FactoryDataService; import cn.iocoder.yudao.module.smartfactory.service.factorydata.FactoryDataSizeService; +import cn.iocoder.yudao.module.smartfactory.service.factoryinfo.FactoryInfoService; +import cn.iocoder.yudao.module.smartfactory.service.size.SizeService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; @@ -40,6 +46,12 @@ public class FactoryDataController { @Resource private FactoryDataSizeService factoryDataSizeService; + @Resource + private FactoryInfoService factoryInfoService; + + @Resource + private SizeService sizeService; + @PostMapping("/create-size") @Operation(summary = "创建工厂出库入库规格数据") @PreAuthorize("@ss.hasPermission('smartfactory:factory-data:create')") @@ -110,8 +122,51 @@ public class FactoryDataController { HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); List list = dataService.getDataPage(pageReqVO).getList(); + List exportVOS = new ArrayList<>(); + for (FactoryDataDetailRespVO respVO : list) { + + exportVOS.addAll( + respVO.getItems().stream().map(info -> { + FactoryDataExportVO exportVO = BeanUtils.toBean(info, FactoryDataExportVO.class); + exportVO.setFactoryName(respVO.getFactoryName()); + exportVO.setDate(respVO.getDate()); + exportVO.setInTotalNum(respVO.getInTotalNum()); + exportVO.setOutTotalNum(respVO.getOutTotalNum()); + exportVO.setDamageTotalNum(respVO.getDamageNum()); + return exportVO; + }).collect(Collectors.toList())); + } // 导出 Excel - ExcelUtils.write(response, "工厂出库入库数据.xls", "数据", FactoryDataDetailRespVO.class, - list); + ExcelUtils.write(response, "工厂出库入库数据.xlsx", "数据", FactoryDataExportVO.class, exportVOS); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入模板") + public void importTemplate(HttpServletResponse response) throws IOException { + + // 获取工厂信息 + List factoryInfoDOS = factoryInfoService.getFactoryListByType(); + List factory = factoryInfoDOS.stream().map(info -> info.getId() + ":" + info.getShortName()).collect(Collectors.toList()); + + // 获取规格信息 + List sizeDOS = sizeService.getListSize(); + List size = sizeDOS.stream().map(info -> info.getId() + ":" + info.getName()).collect(Collectors.toList()); + + // 输出 + ExcelUtils.write(response, "出入库数据导入模板.xlsx", "详情", + FactoryDataExportVO.class, null, + 0, factory, + 2, size); + } + + @PostMapping("/import") + @Operation(summary = "导入出入库数据") + @Parameter(name = "file", description = "Excel 文件", required = true) + @PreAuthorize("@ss.hasPermission('smartfactory:factory-data:import')") + public CommonResult importExcel(@RequestParam("file") MultipartFile file) throws Exception { + + List list = ExcelUtils.read(file, FactoryDataImportVO.class); + + return success(dataService.importUserList(list)); } } \ No newline at end of file diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryDataDetailRespVO.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryDataDetailRespVO.java index 15b69b6f..21fe7baa 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryDataDetailRespVO.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryDataDetailRespVO.java @@ -20,6 +20,11 @@ public class FactoryDataDetailRespVO { @Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-05-14") private LocalDate date; + /** + * 规格明细 + */ + private List items; + @Schema(description = "入库总箱数") private Integer inTotalNum; @@ -34,9 +39,4 @@ public class FactoryDataDetailRespVO { @Schema(description = "是否可编辑 | 1可 ") private Integer isEdit; - - /** - * 规格明细 - */ - private List items; } diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryDataExportVO.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryDataExportVO.java new file mode 100644 index 00000000..2db4edf1 --- /dev/null +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryDataExportVO.java @@ -0,0 +1,51 @@ +package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; + +@Schema(description = "出入库数据导出excel VO") +@Data +@ExcelIgnoreUnannotated +public class FactoryDataExportVO { + + @ExcelProperty("工厂名称") + private String factoryName; + + @ExcelProperty("日期") + private LocalDate date; + + @ExcelProperty("规格") + private String sizeName; + + @ExcelProperty("入库数") + private Integer inNum; + + @ExcelProperty("入库平方数") + private BigDecimal squareNum; + + @ExcelProperty("打包破损数") + private Integer damageNum; + + @ExcelProperty("入库破损数") + private Integer inDamageNum; + + @ExcelProperty("出库数") + private Integer outNum; + + @ExcelProperty("出库破损数") + private Integer outDamageNum; + + @ExcelProperty("入库总数") + private Integer inTotalNum; + + @ExcelProperty("出库总数") + private Integer outTotalNum; + + @ExcelProperty("破损总数") + private Integer damageTotalNum; +} diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryDataImportVO.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryDataImportVO.java new file mode 100644 index 00000000..d78e2c25 --- /dev/null +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryDataImportVO.java @@ -0,0 +1,51 @@ +package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.time.LocalDate; + +/** + * 出入库数据导入 VO + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题 +public class FactoryDataImportVO { + + @ExcelProperty("工厂名称") + private String factoryName; + + @ExcelProperty("日期") + private LocalDate date; + + @ExcelProperty("规格") + private String sizeName; + + @ExcelProperty("手动打包数") + private Integer num; + + @ExcelProperty("自动打包数") + private Integer autoNum; + + @ExcelProperty("入库数") + private Integer inNum; + + @ExcelProperty("打包破损数") + private Integer damageNum; + + @ExcelProperty("入库破损数") + private Integer inDamageNum; + + @ExcelProperty("出库数") + private Integer outNum; + + @ExcelProperty("出库破损数") + private Integer outDamageNum; +} diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryDataInfoRespVO.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryDataInfoRespVO.java index 42f41305..092ca77d 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryDataInfoRespVO.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryDataInfoRespVO.java @@ -37,6 +37,9 @@ public class FactoryDataInfoRespVO { @Schema(description = "自动打包数") private Integer autoNum; + @Schema(description = "入库数量Id") + private Long inNumId; + @Schema(description = "入库数量") private Integer inNum; diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryImportRespVO.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryImportRespVO.java new file mode 100644 index 00000000..f7d70e6f --- /dev/null +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/FactoryImportRespVO.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Schema(description = "管理后台 - 出入库数据导入 Response VO") +@Data +@Builder +public class FactoryImportRespVO { + + @Schema(description = "创建成功的用户名数组", requiredMode = Schema.RequiredMode.REQUIRED) + private List createUsernames; + + @Schema(description = "更新成功的用户名数组", requiredMode = Schema.RequiredMode.REQUIRED) + private List updateUsernames; + + @Schema(description = "导入失败的用户集合,key 为用户名,value 为失败原因", requiredMode = Schema.RequiredMode.REQUIRED) + private Map failureUsernames; +} diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/sizeData/FactoryDataSizeDetailRespVO.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/sizeData/FactoryDataSizeDetailRespVO.java index 05cadb5f..f5b751a6 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/sizeData/FactoryDataSizeDetailRespVO.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/sizeData/FactoryDataSizeDetailRespVO.java @@ -50,6 +50,12 @@ public class FactoryDataSizeDetailRespVO { @Schema(description = "自动打包数") private Integer autoNum; + @Schema(description = "入库数Id") + private Long inNumId; + + @Schema(description = "入库数") + private Integer inNum; + @Schema(description = "打包破损数") private Integer damageNum; @@ -58,6 +64,9 @@ public class FactoryDataSizeDetailRespVO { @Schema(description = "入库破损数") private Integer inDamageNum; + + @Schema(description = "是否可编辑 | 0否 1是") + private Integer isEnable = 0; } @Data diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/sizeData/FactoryDataSizeSaveReqVO.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/sizeData/FactoryDataSizeSaveReqVO.java index c9cc5e01..a1cf7836 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/sizeData/FactoryDataSizeSaveReqVO.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factorydata/vo/sizeData/FactoryDataSizeSaveReqVO.java @@ -21,6 +21,12 @@ public class FactoryDataSizeSaveReqVO { @NotNull(message = "规格片数不能为空") private Integer sizePieces; + @Schema(description = "入库数量Id") + private Long inNumId; + + @Schema(description = "入库数量") + private Integer inNum; + @Schema(description = "入库破损数量Id") private Long inDamageNumId; diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factoryinfo/FactoryInfoController.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factoryinfo/FactoryInfoController.java index 3a2f4eb0..a6f36ab1 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factoryinfo/FactoryInfoController.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/factoryinfo/FactoryInfoController.java @@ -79,6 +79,15 @@ public class FactoryInfoController { return success(BeanUtils.toBean(factoryInfo, FactorySimpleRespVO.class)); } + @GetMapping("/simple-list-authority") + @Operation(summary = "获得工厂列表(权限检验) | 用于前端下拉框") + @PreAuthorize("@ss.hasPermission('smartfactory:factory-info:query')") + public CommonResult> getFactoryListByAuthority() { + + List factoryInfo = factoryInfoService.getFactoryListByAuthority(); + return success(BeanUtils.toBean(factoryInfo, FactorySimpleRespVO.class)); + } + @GetMapping("/page") @Operation(summary = "获得工厂信息分页") @PreAuthorize("@ss.hasPermission('smartfactory:factory-info:query')") diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/mysql/factorydata/FactoryDataSizeMapper.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/mysql/factorydata/FactoryDataSizeMapper.java index 1ea7fcd1..97b5829d 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/mysql/factorydata/FactoryDataSizeMapper.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/mysql/factorydata/FactoryDataSizeMapper.java @@ -20,7 +20,9 @@ import java.util.List; @Mapper public interface FactoryDataSizeMapper extends BaseMapperX { - List selectDetailList(@Param("factoryId") Long factoryId, @Param("date") LocalDate[] date); + List selectDetailList(@Param("factoryId") Long factoryId, + @Param("date") LocalDate[] date, + @Param("dateTime") LocalDateTime[] createTime); default void deleteByFactoryId(Long factoryId, String date) { diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/mysql/factoryinfo/FactoryInfoMapper.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/mysql/factoryinfo/FactoryInfoMapper.java index 59624ac9..ae8e5d42 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/mysql/factoryinfo/FactoryInfoMapper.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/mysql/factoryinfo/FactoryInfoMapper.java @@ -29,11 +29,11 @@ public interface FactoryInfoMapper extends BaseMapperX { .orderByAsc(FactoryInfoDO::getSort)); } - default List selectListByType(Long factoryId) { + default List selectListByType(List factoryId) { return selectList(new LambdaQueryWrapperX() .eq(FactoryInfoDO::getType, 3) - .eqIfPresent(FactoryInfoDO::getId, factoryId)); + .inIfPresent(FactoryInfoDO::getId, factoryId)); } /** diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/framework/job/factoryData/FactoryDataJob.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/framework/job/factoryData/FactoryDataJob.java index 8ef9a9ad..80d42a57 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/framework/job/factoryData/FactoryDataJob.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/framework/job/factoryData/FactoryDataJob.java @@ -71,6 +71,12 @@ public class FactoryDataJob { data.setDamageNum(data.getDamageNum() + infos.get(0).getInDamageNum()); } + if (infos.get(0).getInNum() != null) { + + // 设置 入库总数数 + data.setTotalNum(data.getTotalNum() + infos.get(0).getInNum()); + } + // 如果存在出库数时 if (infos.get(0).getOutNum() != null) { diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factorydata/FactoryDataService.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factorydata/FactoryDataService.java index 0feaacd9..d34b7c3f 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factorydata/FactoryDataService.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factorydata/FactoryDataService.java @@ -1,9 +1,7 @@ package cn.iocoder.yudao.module.smartfactory.service.factorydata; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataDetailRespVO; -import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataPageReqVO; -import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataTotalVO; +import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.*; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeCreateReqVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeDetailRespVO; import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataDO; @@ -92,4 +90,11 @@ public interface FactoryDataService { * @return 出入库数据 */ FactoryDataDO getListByType(Long factoryId, LocalDate date, Integer type); + + /** + * 导入出入库数据 + * @param list 数据 + * @return 结果 + */ + FactoryImportRespVO importUserList(List list); } \ No newline at end of file diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factorydata/FactoryDataServiceImpl.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factorydata/FactoryDataServiceImpl.java index 4fd58d1f..cd9e3ab7 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factorydata/FactoryDataServiceImpl.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factorydata/FactoryDataServiceImpl.java @@ -1,25 +1,28 @@ package cn.iocoder.yudao.module.smartfactory.service.factorydata; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; -import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataDetailRespVO; -import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataInfoRespVO; -import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataPageReqVO; -import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.FactoryDataTotalVO; +import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.*; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeCreateReqVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeDetailRespVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.factorydata.vo.sizeData.FactoryDataSizeSaveReqVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.packagedata.vo.PackageDataCreateReqVO; import cn.iocoder.yudao.module.smartfactory.convert.packageData.PackageDataConvert; import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataDO; +import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factorydata.FactoryDataSizeDO; import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryInfoDO; +import cn.iocoder.yudao.module.smartfactory.dal.dataobject.packageInfo.PackageDO; import cn.iocoder.yudao.module.smartfactory.dal.dataobject.packagedata.PackageDataDO; import cn.iocoder.yudao.module.smartfactory.dal.mysql.factorydata.FactoryDataMapper; +import cn.iocoder.yudao.module.smartfactory.dal.mysql.factorydata.FactoryDataSizeMapper; import cn.iocoder.yudao.module.smartfactory.service.factoryinfo.FactoryInfoService; +import cn.iocoder.yudao.module.smartfactory.service.packageInfo.PackageService; import cn.iocoder.yudao.module.smartfactory.service.packagedata.PackageDataService; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springframework.context.annotation.Lazy; @@ -34,7 +37,9 @@ import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; +import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.*; /** @@ -59,6 +64,12 @@ public class FactoryDataServiceImpl implements FactoryDataService { @Resource private PackageDataService packageDataService; + @Resource + private FactoryDataSizeMapper factoryDataSizeMapper; + + @Resource + private PackageService packageService; + @Override public Long createData(List factoryDataDOS) { @@ -131,13 +142,23 @@ public class FactoryDataServiceImpl implements FactoryDataService { respVO.setDate(LocalDate.parse(date)); //获得 规则明细数据 - List infoRespVOS = dataSizeService.getDetailList(factoryId, new LocalDate[]{LocalDate.parse(date), LocalDate.parse(date)}); + List infoRespVOS = dataSizeService.getDetailList(factoryId, new LocalDate[]{LocalDate.parse(date), LocalDate.parse(date)}, null); - respVO.setInItems( - infoRespVOS.stream() - .filter(info -> info.getInNum() != null || info.getInDamageNum() != null) - .map(info -> BeanUtil.toBean(info, FactoryDataSizeDetailRespVO.InItem.class)) - .collect(Collectors.toList())); + List packageInfo = infoRespVOS.stream() + .filter(info -> (info.getInDamageNum() != null && info.getInNum() == null) || info.getNum() != null || info.getAutoNum() != null) + .map(info -> BeanUtil.toBean(info, FactoryDataSizeDetailRespVO.InItem.class)) + .collect(Collectors.toList()); + + List inItems = infoRespVOS.stream() + .filter(info -> info.getInNum() != null) + .map(info -> { + FactoryDataSizeDetailRespVO.InItem inItem = BeanUtil.toBean(info, FactoryDataSizeDetailRespVO.InItem.class); + inItem.setIsEnable(1); + return inItem; + }) + .collect(Collectors.toList()); + inItems.addAll(packageInfo); + respVO.setInItems(inItems); respVO.setOutItems( infoRespVOS.stream() @@ -156,6 +177,9 @@ public class FactoryDataServiceImpl implements FactoryDataService { IPage page = dataMapper.selectDetailPage(mpPage, pageReqVO); PageResult dataPage = new PageResult<>(page.getRecords(), page.getTotal()); + //获得 入库数、打包破损、入库破损、出库数、出库破损的工厂规格数据 + List infoDatas = dataSizeService.getDetailList(pageReqVO.getFactoryId(), pageReqVO.getDate(), pageReqVO.getCreateTime()); + List respVOS = dataPage.getList(); if (!respVOS.isEmpty()) { @@ -164,15 +188,18 @@ public class FactoryDataServiceImpl implements FactoryDataService { List factoryInfoDOS = factoryInfoService.getFactoryList(factoryIdS); Map factoryMap = convertMap(factoryInfoDOS, FactoryInfoDO::getId); - //获得 入库数、打包破损、入库破损、出库数、出库破损的工厂规格数据 - List infoDatas = dataSizeService.getDetailList(pageReqVO.getFactoryId(), pageReqVO.getDate()); - respVOS.forEach(items -> { //规格明细数据 List infoList = infoDatas.stream() .filter(data -> data.getFactoryId().equals(items.getFactoryId()) && data.getDate().equals(items.getDate())) .collect(Collectors.toList()); + infoList.forEach(info -> { + int num = Optional.ofNullable(info.getNum()).orElse(0); + int autoNum = Optional.ofNullable(info.getAutoNum()).orElse(0); + int inNum = Optional.ofNullable(info.getInNum()).orElse(0); + info.setInNum((num + autoNum + inNum) == 0 ? null : (num + autoNum + inNum)); + }); items.setItems(infoList); items.setFactoryName(factoryMap.get(items.getFactoryId()).getName()); @@ -180,53 +207,79 @@ public class FactoryDataServiceImpl implements FactoryDataService { //移除 已处理过的数据 infoDatas.removeAll(infoList); }); - - // 展示当天录入的数据 - if (!infoDatas.isEmpty()) { - - // 按 工厂id和日期 进行分组 - Map>> groupedByFactoryIdAndDate = infoDatas.stream() - .collect(Collectors.groupingBy(FactoryDataInfoRespVO::getFactoryId, - Collectors.groupingBy(FactoryDataInfoRespVO::getDate))); - - groupedByFactoryIdAndDate.forEach((factoryId, dateMap) -> { - - //按日期倒叙 并遍历 - dateMap.entrySet().stream().sorted(Map.Entry.comparingByKey()) - .forEach((date) -> { - - FactoryDataDetailRespVO dataDetailRespVO = new FactoryDataDetailRespVO(); - - dataDetailRespVO.setFactoryId(factoryId); - dataDetailRespVO.setFactoryName(factoryMap.get(factoryId).getName()); - dataDetailRespVO.setDate(date.getKey()); - //设置入库总数 - dataDetailRespVO.setInTotalNum(date.getValue().stream().filter(info -> info.getInNum() != null).mapToInt(FactoryDataInfoRespVO::getInNum).sum()); - //设置入库平方数 - dataDetailRespVO.setSquareNum(date.getValue().stream().map(FactoryDataInfoRespVO::getSquareNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)); - //设置出库总数 - dataDetailRespVO.setOutTotalNum(infoDatas.stream().filter(info -> info.getOutNum() != null).mapToInt(FactoryDataInfoRespVO::getOutNum).sum()); - //设置 出入库破损总数 - Integer sum = infoDatas.stream().map(info -> { - FactoryDataInfoRespVO respVO = BeanUtils.toBean(info, FactoryDataInfoRespVO.class); - respVO.setInDamageNum(Optional.ofNullable(info.getInDamageNum()).orElse(0)); - respVO.setOutDamageNum(Optional.ofNullable(info.getOutDamageNum()).orElse(0)); - return respVO; - }).mapToInt(info -> info.getInDamageNum() + info.getOutDamageNum()).sum(); - - dataDetailRespVO.setDamageNum(sum == 0 ? null : sum); - dataDetailRespVO.setItems(date.getValue()); - //设置 可编辑状态 - dataDetailRespVO.setIsEdit(1); - - respVOS.add(0, dataDetailRespVO); - }); - }); - dataPage.setTotal((long) respVOS.size()); - } + }else { + respVOS = new ArrayList<>(); } - return dataPage; + List toDayData = new ArrayList<>(); + // 展示当天录入的数据 + if (!infoDatas.isEmpty()) { + + // 按 工厂id和日期 进行分组 + Map>> groupedByFactoryIdAndDate = infoDatas.stream() + .collect(Collectors.groupingBy(FactoryDataInfoRespVO::getFactoryId, + Collectors.groupingBy(FactoryDataInfoRespVO::getDate))); + + Map factoryMaps = convertMap(factoryInfoService.getFactoryList(groupedByFactoryIdAndDate.keySet()) + , FactoryInfoDO::getId); + groupedByFactoryIdAndDate.forEach((factoryId, dateMap) -> { + + //按日期倒叙 并遍历 + dateMap.entrySet().stream().sorted(Map.Entry.comparingByKey()).forEach((date) -> { + + FactoryDataDetailRespVO dataDetailRespVO = new FactoryDataDetailRespVO(); + + dataDetailRespVO.setFactoryId(factoryId); + dataDetailRespVO.setFactoryName(factoryMaps.get(factoryId).getName()); + dataDetailRespVO.setDate(date.getKey()); + //设置入库总数 + int inSum = date.getValue().stream() + .map(info -> { + Integer num = Optional.ofNullable(info.getNum()).orElse(0); + Integer autoNum = Optional.ofNullable(info.getAutoNum()).orElse(0); + Integer inNUm = Optional.ofNullable(info.getInNum()).orElse(0); + return num + autoNum + inNUm; + }) + .mapToInt(Integer::intValue).sum(); + dataDetailRespVO.setInTotalNum(inSum == 0 ? null : inSum); + + //设置入库平方数 + dataDetailRespVO.setSquareNum(date.getValue().stream().map(FactoryDataInfoRespVO::getSquareNum) + .filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)); + + //设置出库总数 + int outTotalNum = date.getValue().stream().filter(info -> info.getOutNum() != null) + .mapToInt(FactoryDataInfoRespVO::getOutNum).sum(); + dataDetailRespVO.setOutTotalNum(outTotalNum == 0 ? null : outTotalNum); + + //设置 出入库破损总数 + int sum = date.getValue().stream().map(info -> { + FactoryDataInfoRespVO respVO = BeanUtils.toBean(info, FactoryDataInfoRespVO.class); + respVO.setInDamageNum(Optional.ofNullable(info.getInDamageNum()).orElse(0)); + respVO.setOutDamageNum(Optional.ofNullable(info.getOutDamageNum()).orElse(0)); + return respVO; + }).mapToInt(info -> info.getInDamageNum() + info.getOutDamageNum()).sum(); + + dataDetailRespVO.setDamageNum(sum == 0 ? null : sum); + + date.getValue().forEach(info -> { + int num = Optional.ofNullable(info.getNum()).orElse(0); + int autoNum = Optional.ofNullable(info.getAutoNum()).orElse(0); + int inNum = Optional.ofNullable(info.getInNum()).orElse(0); + info.setInNum((num + autoNum + inNum) == 0 ? null : (num + autoNum + inNum)); + }); + dataDetailRespVO.setItems(date.getValue()); + //设置 可编辑状态 + dataDetailRespVO.setIsEdit(1); + + toDayData.add(dataDetailRespVO); + }); + }); + respVOS.addAll(0, toDayData); + dataPage.setTotal((long) respVOS.size()); + } + + return new PageResult<>(respVOS, dataPage.getTotal()); } @Override @@ -258,4 +311,155 @@ public class FactoryDataServiceImpl implements FactoryDataService { return dataMapper.selectListByType(factoryId, date, type); } + + @Override + @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入 + public FactoryImportRespVO importUserList(List list) { + + if (CollUtil.isEmpty(list)) { + throw exception(FACTORY_IMPORT_LIST_IS_EMPTY); + } + + FactoryImportRespVO respVO = FactoryImportRespVO.builder().createUsernames(new ArrayList<>()).updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build(); + list.forEach(data -> { + + //校验,判断是否有不符合的原因 + try { + validateFactoryForCreate(data.getFactoryName(), data.getSizeName(), data.getDate()); + } catch (ServiceException ex) { + + respVO.getFailureUsernames().put(data.getFactoryName(), ex.getMessage()); + return; + } + + // 获取 工厂ID + Long factoryId = Long.valueOf(data.getFactoryName().split(":")[0]); + // 获取 规格ID + Long sizeId = Long.valueOf(data.getSizeName().split(":")[0]); + // 获取 规格名称 + String sizeName = data.getSizeName().split(":")[1]; + + PackageDO packageDO = packageService.getPackageByFactoryIdAndSize(factoryId, sizeId); + if (data.getNum() != null || data.getAutoNum() != null) { + + PackageDataDO packageDataDO = BeanUtils.toBean(packageDO, PackageDataDO.class); + packageDataDO.setPackageDate(data.getDate()); + packageDataDO.setPackageId(packageDO.getId()); + packageDataDO.setPackageName(packageDO.getName()); + packageDataDO.setSizeName(sizeName); + packageDataDO.setNum(data.getNum()); + packageDataDO.setAutoNum(data.getAutoNum()); + packageDataDO.setDamageNum(data.getDamageNum()); + + //计算平方数 + String[] size = sizeName.split("\\*"); + BigDecimal squareNum = BigDecimal.valueOf((double) Integer.parseInt(size[0]) / 1000) + .multiply(BigDecimal.valueOf((double) Integer.parseInt(size[1]) / 1000)) + .multiply(BigDecimal.valueOf(packageDataDO.getSizePieces())) + .multiply(BigDecimal.valueOf(Integer.sum(packageDataDO.getNum(), packageDataDO.getAutoNum()))); + + //设置平方数 + packageDataDO.setSquareNum(squareNum); + + // 插入打包线数据 + packageDataService.create(packageDataDO); + } + + List factoryDataSizeDOs = new ArrayList<>(); + if (data.getInDamageNum() != null || data.getInNum() != null || data.getOutNum() != null) { + + if (data.getInDamageNum() != null) { + + FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO(); + //设置规格信息 + dataSizeDO.setId(sizeId); + dataSizeDO.setSizeName(sizeName); + dataSizeDO.setSizePieces(packageDO == null ? null : packageDO.getSizePieces()); + //设置工厂和日期 + dataSizeDO.setFactoryId(factoryId); + dataSizeDO.setDate(data.getDate()); + //设置入库破损数 + dataSizeDO.setType(1); + dataSizeDO.setNum(data.getInDamageNum()); + + factoryDataSizeDOs.add(dataSizeDO); + } + + if (data.getInNum() != null) { + + FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO(); + //设置规格信息 + dataSizeDO.setId(sizeId); + dataSizeDO.setSizeName(sizeName); + dataSizeDO.setSizePieces(packageDO == null ? null : packageDO.getSizePieces()); + //设置工厂和日期 + dataSizeDO.setFactoryId(factoryId); + dataSizeDO.setDate(data.getDate()); + //设置入库破损数 + dataSizeDO.setType(4); + dataSizeDO.setNum(data.getInNum()); + + factoryDataSizeDOs.add(dataSizeDO); + } + + if (data.getOutNum() != null) { + + FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO(); + //设置规格信息 + dataSizeDO.setId(sizeId); + dataSizeDO.setSizeName(sizeName); + //设置工厂和日期 + dataSizeDO.setFactoryId(factoryId); + dataSizeDO.setDate(data.getDate()); + //设置入库破损数 + dataSizeDO.setType(2); + dataSizeDO.setNum(data.getOutNum()); + + factoryDataSizeDOs.add(dataSizeDO); + } + + if (data.getOutDamageNum() != null) { + + FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO(); + //设置规格信息 + dataSizeDO.setId(sizeId); + dataSizeDO.setSizeName(sizeName); + //设置工厂和日期 + dataSizeDO.setFactoryId(factoryId); + dataSizeDO.setDate(data.getDate()); + //设置入库破损数 + dataSizeDO.setType(3); + dataSizeDO.setNum(data.getOutDamageNum()); + + factoryDataSizeDOs.add(dataSizeDO); + } + + factoryDataSizeMapper.insertBatch(factoryDataSizeDOs); + } + + respVO.getCreateUsernames().add(data.getFactoryName()); + }); + + return respVO; + } + + private void validateFactoryForCreate(String factoryName, String sizeName, LocalDate date) { + + if (factoryName == null) { + throw exception(FACTORY_INFO_NOT_EXISTS); + } + + if (sizeName == null) { + throw exception(SIZE_NOT_EXISTS); + } + + String factoryId = factoryName.split(":")[0]; + + Long count = factoryDataSizeMapper.selectCountByType(Long.valueOf(factoryId), date, Arrays.asList(1,2,3,4)); + List packageDOs = packageDataService.getListByFactoryIdAndDate(Long.valueOf(factoryId), date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); + + if (count > 0L || !packageDOs.isEmpty()) { + throw exception(PACKAGE_DATA_EXISTS); + } + } } \ No newline at end of file diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factorydata/FactoryDataSizeService.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factorydata/FactoryDataSizeService.java index 6972d5d4..5dce046f 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factorydata/FactoryDataSizeService.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factorydata/FactoryDataSizeService.java @@ -42,7 +42,7 @@ public interface FactoryDataSizeService { * 获得出入库规格数据 列表 * @return 出入库规格数据 */ - List getDetailList(Long factoryId, LocalDate[] date); + List getDetailList(Long factoryId, LocalDate[] date, LocalDateTime[] createTime); /** * 获得指定时间段内 出入库规格数据之和 diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factorydata/FactoryDataSizeServiceImpl.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factorydata/FactoryDataSizeServiceImpl.java index 0303dad7..8a27ae53 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factorydata/FactoryDataSizeServiceImpl.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factorydata/FactoryDataSizeServiceImpl.java @@ -50,7 +50,7 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{ //校验 当前日期得 入库数据是否已经录入 if (createReqVO.getType() == 2) { - Long count = factoryDataSizeMapper.selectCountByType(createReqVO.getFactoryId(), createReqVO.getDate(), Collections.singletonList(1)); + Long count = factoryDataSizeMapper.selectCountByType(createReqVO.getFactoryId(), createReqVO.getDate(), Arrays.asList(1,4)); if (count > 0L) { throw exception(PACKAGE_DATA_EXISTS); } @@ -113,6 +113,20 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{ factoryDataSizeDOs.add(dataSizeDO); } + + if (reqVO.getInNum() != null) { + + FactoryDataSizeDO dataSizeDO = BeanUtils.toBean(reqVO, FactoryDataSizeDO.class); + + //设置工厂和日期 + dataSizeDO.setFactoryId(createReqVO.getFactoryId()); + dataSizeDO.setDate(createReqVO.getDate()); + //设置入库数 + dataSizeDO.setType(4); + dataSizeDO.setNum(reqVO.getInNum()); + + factoryDataSizeDOs.add(dataSizeDO); + } } factoryDataSizeMapper.insertBatch(factoryDataSizeDOs); @@ -150,6 +164,27 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{ List factoryDataSizeDOs = new ArrayList<>(); for (FactoryDataSizeSaveReqVO reqVO : updateReqVO.getItems()) { + if (reqVO.getInNum() != null) { + + FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO(); + + //设置入库数 + dataSizeDO.setId(reqVO.getInNumId()); + dataSizeDO.setNum(reqVO.getInNum()); + + if (reqVO.getInNumId() == null) { + + dataSizeDO.setFactoryId(updateReqVO.getFactoryId()); + dataSizeDO.setDate(updateReqVO.getDate()); + dataSizeDO.setSizeId(reqVO.getSizeId()); + dataSizeDO.setSizeName(reqVO.getSizeName()); + dataSizeDO.setType(4); + createSizeDos.add(dataSizeDO); + }else { + factoryDataSizeDOs.add(dataSizeDO); + } + } + if (reqVO.getInDamageNum() != null) { FactoryDataSizeDO dataSizeDO = new FactoryDataSizeDO(); @@ -158,7 +193,17 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{ dataSizeDO.setId(reqVO.getInDamageNumId()); dataSizeDO.setNum(reqVO.getInDamageNum()); - factoryDataSizeDOs.add(dataSizeDO); + if (reqVO.getInDamageNumId() == null) { + + dataSizeDO.setFactoryId(updateReqVO.getFactoryId()); + dataSizeDO.setDate(updateReqVO.getDate()); + dataSizeDO.setSizeId(reqVO.getSizeId()); + dataSizeDO.setSizeName(reqVO.getSizeName()); + dataSizeDO.setType(1); + createSizeDos.add(dataSizeDO); + }else { + factoryDataSizeDOs.add(dataSizeDO); + } } if (reqVO.getOutNum() != null) { @@ -241,9 +286,9 @@ public class FactoryDataSizeServiceImpl implements FactoryDataSizeService{ } @Override - public List getDetailList(Long factoryId, LocalDate[] date) { + public List getDetailList(Long factoryId, LocalDate[] date, LocalDateTime[] createTime) { - return factoryDataSizeMapper.selectDetailList(factoryId, date); + return factoryDataSizeMapper.selectDetailList(factoryId, date, createTime); } @Override diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factoryinfo/FactoryInfoService.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factoryinfo/FactoryInfoService.java index 3e2a4d30..076d8d09 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factoryinfo/FactoryInfoService.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factoryinfo/FactoryInfoService.java @@ -99,4 +99,10 @@ public interface FactoryInfoService { * @return 返回与给定工厂ID相关联的天气代码,类型为String。 */ String getWeatherCodeByFactoryId(Long factoryId, String areaCode); + + /** + * 获得类型为工厂的工厂信息列表 + * @return 工厂列表 + */ + List getFactoryListByAuthority(); } diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factoryinfo/FactoryInfoServiceImpl.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factoryinfo/FactoryInfoServiceImpl.java index 80d5ed4c..e9a331bb 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factoryinfo/FactoryInfoServiceImpl.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/factoryinfo/FactoryInfoServiceImpl.java @@ -14,6 +14,8 @@ import cn.iocoder.yudao.module.smartfactory.dal.dataobject.factoryinfo.FactoryIn import cn.iocoder.yudao.module.smartfactory.dal.mysql.factoryinfo.FactoryInfoMapper; import cn.iocoder.yudao.module.system.api.dept.DeptApi; import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; +import cn.iocoder.yudao.module.system.api.permission.PermissionApi; +import cn.iocoder.yudao.module.system.api.permission.dto.DeptDataPermissionRespDTO; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import org.springframework.stereotype.Service; @@ -24,6 +26,7 @@ import java.util.*; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.FACTORY_INFO_NOT_EXISTS; import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.FACTOYRY_EXISTS_STAFF; @@ -46,6 +49,9 @@ public class FactoryInfoServiceImpl implements FactoryInfoService { @Resource private AdminUserApi userApi; + @Resource + private PermissionApi permissionApi; + @Override public Long createFactoryInfo(FactoryInfoSaveReqVO createReqVO) { // 插入 @@ -125,9 +131,7 @@ public class FactoryInfoServiceImpl implements FactoryInfoService { @Override public List getFactoryListByType() { - DeptRespDTO deptRespDTO = deptApi.getDept(userApi.getUser(getLoginUserId()).getCheckedData().getDeptId()).getCheckedData(); - - return factoryInfoMapper.selectListByType(deptRespDTO.getFactoryId()); + return factoryInfoMapper.selectListByType(null); } @Override @@ -189,4 +193,27 @@ public class FactoryInfoServiceImpl implements FactoryInfoService { public String getWeatherCodeByFactoryId(Long factoryId, String areaCode) { return factoryInfoMapper.getWeatherCodeByFactoryId(factoryId, areaCode); } + + @Override + public List getFactoryListByAuthority() { + + List factoryIds = null; + DeptDataPermissionRespDTO deptDataPermission = permissionApi.getDeptDataPermission(getLoginUserId()).getCheckedData(); + // 如果当前登录用户数据权限 不是查看全部数据 + if (!deptDataPermission.getAll()) { + + List deptRespDTO = deptApi.getDeptListByLeader(getLoginUserId()).getCheckedData(); + + if (deptRespDTO != null) { + + factoryIds = convertList(deptRespDTO, DeptRespDTO::getFactoryId); + }else { + + DeptRespDTO respDTO = deptApi.getDept(userApi.getUser(getLoginUserId()).getCheckedData().getDeptId()).getCheckedData(); + factoryIds = Collections.singletonList(respDTO.getFactoryId()); + } + } + + return factoryInfoMapper.selectListByType(factoryIds); + } } \ No newline at end of file diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/packageInfo/PackageService.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/packageInfo/PackageService.java index 2f610a91..4d656350 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/packageInfo/PackageService.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/packageInfo/PackageService.java @@ -53,6 +53,14 @@ public interface PackageService { */ List getPackageByFactoryId(Long factoryId); + /** + * 获得指定工厂的打包线 + * @param factoryId 工厂编号 + * @param sizeId 规格编号 + * @return 打包线信息 + */ + PackageDO getPackageByFactoryIdAndSize(Long factoryId, Long sizeId); + /** * 获得打包线分页 * diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/packageInfo/PackageServiceImpl.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/packageInfo/PackageServiceImpl.java index 25d0bed9..2f63702c 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/packageInfo/PackageServiceImpl.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/packageInfo/PackageServiceImpl.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.smartfactory.service.packageInfo; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; import cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo.PackagePageReqVO; import cn.iocoder.yudao.module.smartfactory.controller.admin.packageInfo.vo.PackageRespVO; @@ -106,6 +107,14 @@ public class PackageServiceImpl implements PackageService { return respVOS; } + @Override + public PackageDO getPackageByFactoryIdAndSize(Long factoryId, Long sizeId) { + + return packageMapper.selectOne(new LambdaQueryWrapperX() + .eq(PackageDO::getFactoryId, factoryId) + .eq(PackageDO::getSizeId, sizeId)); + } + @Override public PageResult getPackagePage(PackagePageReqVO pageReqVO) { diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/packagedata/PackageDataService.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/packagedata/PackageDataService.java index 314fb7a6..37d2f40b 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/packagedata/PackageDataService.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/packagedata/PackageDataService.java @@ -19,6 +19,13 @@ import java.util.List; */ public interface PackageDataService { + /** + * 创建打包线数据 + * + * @param createReqVO 创建信息 + */ + void create(@Valid PackageDataDO createReqVO); + /** * 创建打包线数据 * diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/packagedata/PackageDataServiceImpl.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/packagedata/PackageDataServiceImpl.java index 02913c1b..3a885ab9 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/packagedata/PackageDataServiceImpl.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/packagedata/PackageDataServiceImpl.java @@ -46,6 +46,12 @@ public class PackageDataServiceImpl implements PackageDataService { @Lazy // 循环依赖,避免报错 private FactoryDataService factoryDataService; + @Override + public void create(PackageDataDO createReqVO) { + + packageDataMapper.insert(createReqVO); + } + @Override public Long createPackageData(PackageDataCreateReqVO createReqVO) { diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/mapper/factorydata/FactoryDataSizeMapper.xml b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/mapper/factorydata/FactoryDataSizeMapper.xml index 4c44ffc1..bfb119de 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/mapper/factorydata/FactoryDataSizeMapper.xml +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/mapper/factorydata/FactoryDataSizeMapper.xml @@ -18,22 +18,43 @@ a.size_id AS sizeId, a.size_name AS sizeName, a.size_pieces AS sizePieces, - MAX(a.num) AS num, - MAX(a.auto_num) AS autoNum, - MAX(a.num + a.auto_num) AS inNum, - MAX(a.square_num) AS squareNum, - MAX(a.damage_num) AS damageNum, - MAX(CASE WHEN b.type = 1 THEN b.id END) AS inDamageNumId, - MAX(CASE WHEN b.type = 1 THEN b.num END) AS inDamageNum, - MAX(CASE WHEN b.type = 2 THEN b.id END) AS outNumId, - MAX(CASE WHEN b.type = 2 THEN b.num END) AS outNum, - MAX(CASE WHEN b.type = 3 THEN b.id END) AS outDamageNumId, - MAX(CASE WHEN b.type = 3 THEN b.num END) AS outDamageNum + a.num AS num, + a.auto_num AS autoNum, + a.square_num AS squareNum, + a.damage_num AS damageNum, + b.inNumId, + b.inNum, + b.inDamageNumId, + b.inDamageNum, + b.outNumId, + b.outNum, + b.outDamageNumId, + b.outDamageNum FROM - sf_package_data AS a - LEFT JOIN - sf_factory_data_size AS b - ON a.factory_id = b.factory_id and a.package_date = b.date and a.size_id = b.size_id + sf_package_data a + LEFT JOIN ( + SELECT + factory_id, + date, + size_pieces, + MAX( CASE WHEN type = 4 THEN id END ) AS inNumId, + MAX( CASE WHEN type = 4 THEN num END ) AS inNum, + MAX( CASE WHEN type = 1 THEN id END ) AS inDamageNumId, + MAX( CASE WHEN type = 1 THEN num END ) AS inDamageNum, + MAX( CASE WHEN type = 2 THEN id END ) AS outNumId, + MAX( CASE WHEN type = 2 THEN num END ) AS outNum, + MAX( CASE WHEN type = 3 THEN id END ) AS outDamageNumId, + MAX( CASE WHEN type = 3 THEN num END ) AS outDamageNum + FROM + sf_factory_data_size + GROUP BY + factory_id, + date, + size_pieces + ) b + ON a.factory_id = b.factory_id + AND a.package_date = b.date + and a.size_pieces = b.size_pieces a.deleted = 0 @@ -47,6 +68,14 @@ AND a.package_date <= #{date[1]} + + + AND a.create_time >= #{dateTime[0]} + + + AND a.create_time <= #{dateTime[1]} + + GROUP BY a.id,a.factory_id,a.package_name,a.package_date,a.size_id,a.size_name,a.size_pieces @@ -62,9 +91,10 @@ NULL AS sizePieces, NULL AS num, NULL AS autoNum, - NULL AS inNum, NULL AS squareNum, NULL AS damageNum, + MAX(CASE WHEN c.type = 4 THEN c.id END) AS inNumId, + MAX(CASE WHEN c.type = 4 THEN c.num END) AS inNum, MAX(CASE WHEN c.type = 1 THEN c.id END) AS inDamageNumId, MAX(CASE WHEN c.type = 1 THEN c.num END) AS inDamageNum, MAX(CASE WHEN c.type = 2 THEN c.id END) AS outNumId, @@ -74,7 +104,14 @@ FROM sf_factory_data_size AS c WHERE - NOT EXISTS (SELECT 1 FROM sf_package_data WHERE size_id = c.size_id and package_date = c.date) + NOT EXISTS ( + SELECT 1 + FROM sf_package_data + WHERE + size_id = c.size_id + AND size_pieces != c.size_pieces + AND package_date = c.date + ) AND c.deleted = 0 AND c.factory_id = #{factoryId} @@ -87,6 +124,14 @@ AND c.date <= #{date[1]} + + + AND c.create_time >= #{dateTime[0]} + + + AND c.create_time <= #{dateTime[1]} + + GROUP BY c.factory_id,c.date,c.size_id,c.size_name @@ -94,6 +139,7 @@ SELECT factory_id AS factoryId, date AS date, + SUM( CASE WHEN type = 4 THEN num END ) AS inNum, SUM( CASE WHEN type = 1 THEN num END ) AS inDamageNum, SUM( CASE WHEN type = 2 THEN num END ) AS outNum, SUM( CASE WHEN type = 3 THEN num END ) AS outDamageNum