From cf05131d0b1dcd23f34afe880e631cfdea94f701 Mon Sep 17 00:00:00 2001 From: chenfang Date: Tue, 10 Oct 2023 14:59:57 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=A9=E5=93=81=E5=9F=BA=E6=9C=AC=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD=E5=8F=8A=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E6=A8=A1=E6=9D=BF=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../itembasic/ItembasicController.java | 34 +++++++++ .../itembasic/vo/ItembasicImportExcelVo.java | 70 +++++++++++++++++++ .../convert/itembasic/ItembasicConvert.java | 14 ++-- .../dal/mysql/itembasic/ItembasicMapper.java | 10 ++- .../service/itembasic/ItembasicService.java | 23 +++--- .../itembasic/ItembasicServiceImpl.java | 57 +++++++++++++-- 6 files changed, 185 insertions(+), 23 deletions(-) create mode 100644 win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/itembasic/vo/ItembasicImportExcelVo.java diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/itembasic/ItembasicController.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/itembasic/ItembasicController.java index 46d62c72..4fd8fd3d 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/itembasic/ItembasicController.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/itembasic/ItembasicController.java @@ -1,6 +1,7 @@ package com.win.module.wms.controller.itembasic; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.enums.CommonStatusEnum; import com.win.framework.common.pojo.CommonResult; import com.win.framework.common.pojo.PageResult; import com.win.framework.excel.core.util.ExcelUtils; @@ -12,15 +13,18 @@ import com.win.module.wms.dal.mysql.itembasic.ItembasicMapper; import com.win.module.wms.service.itembasic.ItembasicService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; 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.Arrays; import java.util.Collection; import java.util.List; @@ -116,5 +120,35 @@ public class ItembasicController { List datas = ItembasicConvert.INSTANCE.convertList02(list); ExcelUtils.write(response, "物品基本信息.xls", "数据", ItembasicExcelVO.class, datas); } + @GetMapping("/get-import-template") + @Operation(summary = "获得导入用户模板") + public void importTemplate(HttpServletResponse response) throws IOException { + // 手动创建导出 demo + List list = Arrays.asList( + ItembasicImportExcelVo.builder().code("yunai").uom(1).isStdPack(1).enableBuy(1) + .enableMake(1).status(CommonStatusEnum.ENABLE.getStatus()).enableOutsourcing(1) + .isRecycled(1).isPhantom(1).abcClass(1).type(1).validityDays(1).available(1).build(), + ItembasicImportExcelVo.builder().code("yuanma").uom(2).isStdPack(2).enableBuy(2) + .enableMake(2).status(CommonStatusEnum.DISABLE.getStatus()).enableOutsourcing(2) + .isRecycled(2).isPhantom(2).abcClass(2).type(2).validityDays(2).available(2).build() + ); + + // 输出 + ExcelUtils.write(response, "用户导入模板.xls", "用户列表", ItembasicImportExcelVo.class, list); + } + + + @PostMapping("/import") + @Operation(summary = "导入用户") + @Parameters({ + @Parameter(name = "file", description = "Excel 文件", required = true), + @Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true") + }) + @PreAuthorize("@ss.hasPermission('wms:itembasic:import')") + public CommonResult importExcel(@RequestParam("file") MultipartFile file, + @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { + List list = ExcelUtils.read(file, ItembasicImportExcelVo.class); + return success(itembasicService.importUserList(list, updateSupport)); + } } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/itembasic/vo/ItembasicImportExcelVo.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/itembasic/vo/ItembasicImportExcelVo.java new file mode 100644 index 00000000..5f4f06f6 --- /dev/null +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/itembasic/vo/ItembasicImportExcelVo.java @@ -0,0 +1,70 @@ +package com.win.module.wms.controller.itembasic.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.wms.enums.DictTypeConstants; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题 +public class ItembasicImportExcelVo { + + @ExcelProperty("代码") + private String code; + + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.ITEM_STATUS) + private Integer status; + + @ExcelProperty(value = "计量单位", converter = DictConvert.class) + @DictFormat(DictTypeConstants.UOM) + private Integer uom; + + @ExcelProperty(value = "是否标包", converter = DictConvert.class) + @DictFormat(DictTypeConstants.TRUE_FALSE) + private Integer isStdPack; + + @ExcelProperty(value = "可采购", converter = DictConvert.class) + @DictFormat(DictTypeConstants.TRUE_FALSE) + private Integer enableBuy; + + @ExcelProperty(value = "可制造", converter = DictConvert.class) + @DictFormat(DictTypeConstants.TRUE_FALSE) + private Integer enableMake; + + @ExcelProperty(value = "可委外加工", converter = DictConvert.class) + @DictFormat(DictTypeConstants.TRUE_FALSE) + private Integer enableOutsourcing; + + @ExcelProperty(value = "回收件", converter = DictConvert.class) + @DictFormat(DictTypeConstants.TRUE_FALSE) + private Integer isRecycled; + + @ExcelProperty(value = "虚零件", converter = DictConvert.class) + @DictFormat(DictTypeConstants.TRUE_FALSE) + private Integer isPhantom; + + @ExcelProperty(value = "ABC类", converter = DictConvert.class) + @DictFormat(DictTypeConstants.ABC_CLASS) + private Integer abcClass; + + @ExcelProperty(value = "类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.ITEM_TYPE) + private Integer type; + @ExcelProperty(value = "有效天数") + private Integer validityDays; + + @ExcelProperty(value = "是否可用", converter = DictConvert.class) + @DictFormat(DictTypeConstants.TRUE_FALSE) + private Integer available; + + +} diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/itembasic/ItembasicConvert.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/itembasic/ItembasicConvert.java index 08567286..41dda341 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/itembasic/ItembasicConvert.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/itembasic/ItembasicConvert.java @@ -1,16 +1,12 @@ package com.win.module.wms.convert.itembasic; -import java.util.*; - import com.win.framework.common.pojo.PageResult; - -import com.win.module.wms.controller.itembasic.vo.ItembasicCreateReqVO; -import com.win.module.wms.controller.itembasic.vo.ItembasicExcelVO; -import com.win.module.wms.controller.itembasic.vo.ItembasicRespVO; -import com.win.module.wms.controller.itembasic.vo.ItembasicUpdateReqVO; +import com.win.module.wms.controller.itembasic.vo.*; +import com.win.module.wms.dal.dataobject.itembasic.ItembasicDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; -import com.win.module.wms.dal.dataobject.itembasic.ItembasicDO; + +import java.util.List; /** * 物品基本信息 Convert @@ -28,6 +24,8 @@ public interface ItembasicConvert { ItembasicRespVO convert(ItembasicDO bean); + ItembasicDO convert(ItembasicImportExcelVo bean); + List convertList(List list); PageResult convertPage(PageResult page); diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/itembasic/ItembasicMapper.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/itembasic/ItembasicMapper.java index a9a3cd62..b841a50b 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/itembasic/ItembasicMapper.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/itembasic/ItembasicMapper.java @@ -1,15 +1,15 @@ package com.win.module.wms.dal.mysql.itembasic; -import java.util.*; - import com.win.framework.common.pojo.PageResult; -import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; import com.win.module.wms.controller.itembasic.vo.ItembasicExportReqVO; import com.win.module.wms.controller.itembasic.vo.ItembasicPageReqVO; import com.win.module.wms.dal.dataobject.itembasic.ItembasicDO; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + /** * 物品基本信息 Mapper * @@ -18,6 +18,10 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface ItembasicMapper extends BaseMapperX { + default ItembasicDO selectByCode(String code) { + return selectOne(ItembasicDO::getCode, code); + } + default PageResult selectPage(ItembasicPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(ItembasicDO::getCode, reqVO.getCode()) diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/itembasic/ItembasicService.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/itembasic/ItembasicService.java index 70c8a9bb..287b981b 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/itembasic/ItembasicService.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/itembasic/ItembasicService.java @@ -1,14 +1,12 @@ package com.win.module.wms.service.itembasic; -import java.util.*; -import javax.validation.*; - -import com.win.module.wms.controller.itembasic.vo.ItembasicCreateReqVO; -import com.win.module.wms.controller.itembasic.vo.ItembasicExportReqVO; -import com.win.module.wms.controller.itembasic.vo.ItembasicPageReqVO; -import com.win.module.wms.controller.itembasic.vo.ItembasicUpdateReqVO; -import com.win.module.wms.dal.dataobject.itembasic.ItembasicDO; import com.win.framework.common.pojo.PageResult; +import com.win.module.wms.controller.itembasic.vo.*; +import com.win.module.wms.dal.dataobject.itembasic.ItembasicDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; /** * 物品基本信息 Service 接口 @@ -71,4 +69,13 @@ public interface ItembasicService { */ List getItembasicList(ItembasicExportReqVO exportReqVO); + /** + * 批量导入用户 + * + * @param importUsers 导入用户列表 + * @param isUpdateSupport 是否支持更新 + * @return 导入结果 + */ + ItembasicImportRespVO importUserList(List importItembasics, boolean isUpdateSupport); + } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/itembasic/ItembasicServiceImpl.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/itembasic/ItembasicServiceImpl.java index 7bfb3a01..6003a9cf 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/itembasic/ItembasicServiceImpl.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/itembasic/ItembasicServiceImpl.java @@ -1,21 +1,26 @@ package com.win.module.wms.service.itembasic; +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.exception.ServiceException; import com.win.framework.common.pojo.PageResult; -import com.win.module.wms.controller.itembasic.vo.ItembasicCreateReqVO; -import com.win.module.wms.controller.itembasic.vo.ItembasicExportReqVO; -import com.win.module.wms.controller.itembasic.vo.ItembasicPageReqVO; -import com.win.module.wms.controller.itembasic.vo.ItembasicUpdateReqVO; +import com.win.framework.datapermission.core.util.DataPermissionUtils; +import com.win.module.wms.controller.itembasic.vo.*; import com.win.module.wms.convert.itembasic.ItembasicConvert; import com.win.module.wms.dal.dataobject.itembasic.ItembasicDO; import com.win.module.wms.dal.mysql.itembasic.ItembasicMapper; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.Collection; +import java.util.LinkedHashMap; import java.util.List; import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.system.enums.ErrorCodeConstants.USER_IMPORT_LIST_IS_EMPTY; +import static com.win.module.system.enums.ErrorCodeConstants.USER_USERNAME_EXISTS; import static com.win.module.wms.enums.itembasic.ErrorCodeConstants.ITEMBASIC_NOT_EXISTS; import static com.win.module.wms.enums.itembasic.ErrorCodeConstants.ITEMBASIC_NOT_RIGHT; @@ -174,4 +179,48 @@ public class ItembasicServiceImpl implements ItembasicService { return itembasicMapper.selectList(exportReqVO); } + @Override + @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入 + public ItembasicImportRespVO importUserList(List importItembasics, boolean isUpdateSupport) { + if (CollUtil.isEmpty(importItembasics)) { + throw exception(USER_IMPORT_LIST_IS_EMPTY); + } + ItembasicImportRespVO respVO = ItembasicImportRespVO.builder().createItembasics(new ArrayList<>()) + .updateItembasics(new ArrayList<>()).failureItembasics(new LinkedHashMap<>()).build(); + importItembasics.forEach(importItembasic -> { + // 校验,判断是否有不符合的原因 + try { + validateUserForCreateOrUpdate(importItembasic.getCode()); + } catch (ServiceException ex) { + respVO.getFailureItembasics().put(importItembasic.getCode(), ex.getMessage()); + return; + } + // 判断如果不存在,在进行插入 + ItembasicDO existItembasic = itembasicMapper.selectByCode(importItembasic.getCode()); + if (existItembasic == null) { + itembasicMapper.insert(ItembasicConvert.INSTANCE.convert(importItembasic)); // 设置默认密码及空岗位编号数组 + respVO.getCreateItembasics().add(importItembasic.getCode()); + return; + } + // 如果存在,判断是否允许更新 + if (!isUpdateSupport) { + respVO.getFailureItembasics().put(importItembasic.getCode(), USER_USERNAME_EXISTS.getMsg()); + return; + } + ItembasicDO updateUser = ItembasicConvert.INSTANCE.convert(importItembasic); + updateUser.setId(existItembasic.getId()); + itembasicMapper.updateById(updateUser); + respVO.getUpdateItembasics().add(importItembasic.getCode()); + }); + return respVO; + } + + private void validateUserForCreateOrUpdate(String code) { + // 关闭数据权限,避免因为没有数据权限,查询不到数据,进而导致唯一校验不正确 + DataPermissionUtils.executeIgnore(() -> { + // 校验code唯一 + codeExists(code); + }); + } + }