diff --git a/win-module-wms/win-module-wms-api/src/main/java/com/win/module/wms/enums/workstation/ErrorCodeConstants.java b/win-module-wms/win-module-wms-api/src/main/java/com/win/module/wms/enums/workstation/ErrorCodeConstants.java index e1b20b34..62e9a1e4 100644 --- a/win-module-wms/win-module-wms-api/src/main/java/com/win/module/wms/enums/workstation/ErrorCodeConstants.java +++ b/win-module-wms/win-module-wms-api/src/main/java/com/win/module/wms/enums/workstation/ErrorCodeConstants.java @@ -11,4 +11,8 @@ public interface ErrorCodeConstants { ErrorCode WORKSTATION_NOT_EXISTS = new ErrorCode(1_040_000_000, "工位不存在"); + ErrorCode WORKSTATION_NOT_RIGHT = new ErrorCode(1_040_000_001, "工位信息填写不正确"); + + ErrorCode CODE_NOT_ONLY = new ErrorCode(1_040_000_002, "code已存在"); + } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/WorkstationController.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/WorkstationController.java index 0009c208..b012189d 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/WorkstationController.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/WorkstationController.java @@ -10,15 +10,18 @@ import com.win.module.wms.dal.dataobject.workstation.WorkstationDO; import com.win.module.wms.service.workstation.WorkstationService; 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; @@ -96,4 +99,28 @@ public class WorkstationController { ExcelUtils.write(response, "工位.xls", "数据", WorkstationExcelVO.class, datas); } + @GetMapping("/get-import-template") + @Operation(summary = "获得导入用户模板") + public void importTemplate(HttpServletResponse response) throws IOException { + // 手动创建导出 demo + List list = Arrays.asList( + WorkstationImportExcelVo.builder().code("yunai") + .workshopCode("1").productionLineCode("1").available("TRUE").build()); + + // 输出 + ExcelUtils.write(response, "用户导入模板.xls", "用户列表", WorkstationImportExcelVo.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:workstation:import')") + public CommonResult importExcel(@RequestParam("file") MultipartFile file, + @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { + List list = ExcelUtils.read(file, WorkstationImportExcelVo.class); + return success(workstationService.importUserList(list, updateSupport)); + } } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/vo/WorkstationBaseVO.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/vo/WorkstationBaseVO.java index fbe0bff9..ea33e952 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/vo/WorkstationBaseVO.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/vo/WorkstationBaseVO.java @@ -48,7 +48,7 @@ public class WorkstationBaseVO { @Schema(description = "是否可用", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "是否可用不能为空") - private Integer available; + private String available; @Schema(description = "生效时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/vo/WorkstationExportReqVO.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/vo/WorkstationExportReqVO.java index e9113f45..37136b4b 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/vo/WorkstationExportReqVO.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/vo/WorkstationExportReqVO.java @@ -37,7 +37,7 @@ public class WorkstationExportReqVO { private String fgLocationCode; @Schema(description = "是否可用") - private Integer available; + private String available; @Schema(description = "生效时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/vo/WorkstationImportExcelVo.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/vo/WorkstationImportExcelVo.java new file mode 100644 index 00000000..4cb38802 --- /dev/null +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/vo/WorkstationImportExcelVo.java @@ -0,0 +1,38 @@ +package com.win.module.wms.controller.workstation.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 WorkstationImportExcelVo { + + @ExcelProperty("代码") + private String code; + + @ExcelProperty(value = "类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.WORK_STATION_TYPE) + private String tupe; + + @ExcelProperty(value = "车间代码") + private String workshopCode; + + @ExcelProperty(value = "生产线代码") + private String productionLineCode; + + @ExcelProperty(value = "是否可用", converter = DictConvert.class) + @DictFormat(DictTypeConstants.TRUE_FALSE) + private String available; + + +} diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/vo/WorkstationImportRespVO.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/vo/WorkstationImportRespVO.java new file mode 100644 index 00000000..613f69f3 --- /dev/null +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/vo/WorkstationImportRespVO.java @@ -0,0 +1,24 @@ +package com.win.module.wms.controller.workstation.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 WorkstationImportRespVO { + + @Schema(description = "创建成功的用户名数组", requiredMode = Schema.RequiredMode.REQUIRED) + private List createWorkstations; + + @Schema(description = "更新成功的用户名数组", requiredMode = Schema.RequiredMode.REQUIRED) + private List updateWorkstations; + + @Schema(description = "导入失败的用户集合,key 为用户名,value 为失败原因", requiredMode = Schema.RequiredMode.REQUIRED) + private Map failureWorkstations; + +} diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/vo/WorkstationPageReqVO.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/vo/WorkstationPageReqVO.java index 09236d9a..1cf1e902 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/vo/WorkstationPageReqVO.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/workstation/vo/WorkstationPageReqVO.java @@ -42,7 +42,7 @@ public class WorkstationPageReqVO extends PageParam { private String fgLocationCode; @Schema(description = "是否可用") - private Integer available; + private String available; @Schema(description = "生效时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/workstation/WorkstationConvert.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/workstation/WorkstationConvert.java index 880b77fc..32433432 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/workstation/WorkstationConvert.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/convert/workstation/WorkstationConvert.java @@ -1,16 +1,12 @@ package com.win.module.wms.convert.workstation; -import java.util.*; - import com.win.framework.common.pojo.PageResult; - -import com.win.module.wms.controller.workstation.vo.WorkstationCreateReqVO; -import com.win.module.wms.controller.workstation.vo.WorkstationExcelVO; -import com.win.module.wms.controller.workstation.vo.WorkstationRespVO; -import com.win.module.wms.controller.workstation.vo.WorkstationUpdateReqVO; +import com.win.module.wms.controller.workstation.vo.*; +import com.win.module.wms.dal.dataobject.workstation.WorkstationDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; -import com.win.module.wms.dal.dataobject.workstation.WorkstationDO; + +import java.util.List; /** * 工位 Convert @@ -28,6 +24,8 @@ public interface WorkstationConvert { WorkstationRespVO convert(WorkstationDO bean); + WorkstationDO convert(WorkstationImportExcelVo 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/workstation/WorkstationMapper.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/workstation/WorkstationMapper.java index cd76bf0f..5d9c18ab 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/workstation/WorkstationMapper.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/dal/mysql/workstation/WorkstationMapper.java @@ -1,15 +1,15 @@ package com.win.module.wms.dal.mysql.workstation; -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.workstation.vo.WorkstationExportReqVO; import com.win.module.wms.controller.workstation.vo.WorkstationPageReqVO; import com.win.module.wms.dal.dataobject.workstation.WorkstationDO; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + /** * 工位 Mapper * @@ -18,6 +18,10 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface WorkstationMapper extends BaseMapperX { + default WorkstationDO selectByCode(String code) { + return selectOne(WorkstationDO::getCode, code); + } + default PageResult selectPage(WorkstationPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(WorkstationDO::getCode, reqVO.getCode()) diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/workstation/WorkstationService.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/workstation/WorkstationService.java index bb4d0980..6d88cd65 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/workstation/WorkstationService.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/workstation/WorkstationService.java @@ -1,14 +1,12 @@ package com.win.module.wms.service.workstation; -import java.util.*; -import javax.validation.*; - -import com.win.module.wms.controller.workstation.vo.WorkstationCreateReqVO; -import com.win.module.wms.controller.workstation.vo.WorkstationExportReqVO; -import com.win.module.wms.controller.workstation.vo.WorkstationPageReqVO; -import com.win.module.wms.controller.workstation.vo.WorkstationUpdateReqVO; -import com.win.module.wms.dal.dataobject.workstation.WorkstationDO; import com.win.framework.common.pojo.PageResult; +import com.win.module.wms.controller.workstation.vo.*; +import com.win.module.wms.dal.dataobject.workstation.WorkstationDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; /** * 工位 Service 接口 @@ -71,4 +69,5 @@ public interface WorkstationService { */ List getWorkstationList(WorkstationExportReqVO exportReqVO); + WorkstationImportRespVO importUserList(List list, Boolean isUpdateSupport); } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/workstation/WorkstationServiceImpl.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/workstation/WorkstationServiceImpl.java index 2104de99..e311df64 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/workstation/WorkstationServiceImpl.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/workstation/WorkstationServiceImpl.java @@ -1,22 +1,27 @@ package com.win.module.wms.service.workstation; +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.workstation.vo.WorkstationCreateReqVO; -import com.win.module.wms.controller.workstation.vo.WorkstationExportReqVO; -import com.win.module.wms.controller.workstation.vo.WorkstationPageReqVO; -import com.win.module.wms.controller.workstation.vo.WorkstationUpdateReqVO; +import com.win.framework.datapermission.core.util.DataPermissionUtils; +import com.win.module.wms.controller.workstation.vo.*; import com.win.module.wms.convert.workstation.WorkstationConvert; import com.win.module.wms.dal.dataobject.workstation.WorkstationDO; import com.win.module.wms.dal.mysql.workstation.WorkstationMapper; 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.wms.enums.workstation.ErrorCodeConstants.WORKSTATION_NOT_EXISTS; +import static com.win.module.wms.enums.workstation.ErrorCodeConstants.WORKSTATION_NOT_RIGHT; /** * 工位 Service 实现类 @@ -81,5 +86,56 @@ public class WorkstationServiceImpl implements WorkstationService { public List getWorkstationList(WorkstationExportReqVO exportReqVO) { return workstationMapper.selectList(exportReqVO); } + + @Override + @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入 + public WorkstationImportRespVO importUserList(List workstations, Boolean isUpdateSupport) { + if (CollUtil.isEmpty(workstations)) { + throw exception(USER_IMPORT_LIST_IS_EMPTY); + } + WorkstationImportRespVO respVO = WorkstationImportRespVO.builder().createWorkstations(new ArrayList<>()) + .updateWorkstations(new ArrayList<>()).failureWorkstations(new LinkedHashMap<>()).build(); + workstations.forEach(workstation -> { + // 校验,判断是否有不符合的原因 + try { + validateUserForCreateOrUpdate(workstation.getCode()); + } catch (ServiceException ex) { + respVO.getFailureWorkstations().put(workstation.getCode(), ex.getMessage()); + return; + } + // 判断如果不存在,在进行插入 + WorkstationDO existWorkstation = workstationMapper.selectByCode(workstation.getCode()); + if (existWorkstation == null) { + workstationMapper.insert(WorkstationConvert.INSTANCE.convert(workstation)); + respVO.getCreateWorkstations().add(workstation.getCode()); + return; + } + // 如果存在,判断是否允许更新 +// if (!isUpdateSupport) { +// String put = respVO.getFailureWorkstations().put(workstation.getCode(), USER_USERNAME_EXISTS.getMsg()); +// System.out.println(put); +// return; +// } + WorkstationDO updateUser = WorkstationConvert.INSTANCE.convert(workstation); + updateUser.setId(existWorkstation.getId()); + workstationMapper.updateById(updateUser); + respVO.getUpdateWorkstations().add(workstation.getCode()); + }); + return respVO; + } + + private void validateUserForCreateOrUpdate(String code) { + // 关闭数据权限,避免因为没有数据权限,查询不到数据,进而导致唯一校验不正确 + DataPermissionUtils.executeIgnore(() -> { + // 校验code唯一 + codeExists(code); + }); + } + + private void codeExists(String code) { + if (code.isEmpty()) { + throw exception(WORKSTATION_NOT_RIGHT); + } + } }