From 98dc345c5f4eaf990dc5f4adc0d2d8a079fe7b5c Mon Sep 17 00:00:00 2001 From: chenbowen Date: Thu, 15 Jan 2026 18:04:47 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=96=B0=E5=A2=9E=E5=B8=86=E8=BD=AF?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD=202.=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=89=A9=E6=96=99=E6=89=A9=E5=B1=95=E7=89=8C?= =?UTF-8?q?=E5=8F=B7=E5=B1=9E=E6=80=A7=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/dm/2026-01-14帆软报表上传菜单.sql | 35 ++++ .../materialgradeext/MaterialGradeExtApi.java | 51 +++++ .../dto/MaterialGradeExtPageReqDTO.java | 28 +++ .../dto/MaterialGradeExtRespDTO.java | 24 +++ .../dto/MaterialGradeExtSaveReqDTO.java | 38 ++++ .../MaterialGradeExtApiImpl.java | 66 +++++++ .../config/FineReportUploadProperties.java | 25 +++ .../FineReportUploadController.java | 103 ++++++++++ .../finereport/vo/FineReportUploadRespVO.java | 20 ++ .../MaterialGradeExtController.java | 87 ++++++++ .../vo/MaterialGradeExtPageReqVO.java | 46 +++++ .../vo/MaterialGradeExtRespVO.java | 46 +++++ .../vo/MaterialGradeExtSaveReqVO.java | 42 ++++ .../MaterialGradeExtMapper.java | 31 +++ .../materialgradeext/MaterialGradeExtDO.java | 68 +++++++ .../MaterialGradeExtService.java | 23 +++ .../MaterialGradeExtServiceImpl.java | 89 +++++++++ .../MaterialGradeExtApiImplTest.java | 137 +++++++++++++ .../MaterialGradeExtServiceImplTest.java | 185 ++++++++++++++++++ .../src/test/resources/sql/clean.sql | 1 + .../src/test/resources/sql/create_tables.sql | 26 +++ 21 files changed, 1171 insertions(+) create mode 100644 sql/dm/2026-01-14帆软报表上传菜单.sql create mode 100644 zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/materialgradeext/MaterialGradeExtApi.java create mode 100644 zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/materialgradeext/dto/MaterialGradeExtPageReqDTO.java create mode 100644 zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/materialgradeext/dto/MaterialGradeExtRespDTO.java create mode 100644 zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/materialgradeext/dto/MaterialGradeExtSaveReqDTO.java create mode 100644 zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/api/materialgradeext/MaterialGradeExtApiImpl.java create mode 100644 zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/config/FineReportUploadProperties.java create mode 100644 zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/finereport/FineReportUploadController.java create mode 100644 zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/finereport/vo/FineReportUploadRespVO.java create mode 100644 zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialgradeext/MaterialGradeExtController.java create mode 100644 zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialgradeext/vo/MaterialGradeExtPageReqVO.java create mode 100644 zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialgradeext/vo/MaterialGradeExtRespVO.java create mode 100644 zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialgradeext/vo/MaterialGradeExtSaveReqVO.java create mode 100644 zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/materialgradeext/MaterialGradeExtMapper.java create mode 100644 zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/materialgradeext/MaterialGradeExtDO.java create mode 100644 zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/materialgradeext/MaterialGradeExtService.java create mode 100644 zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/materialgradeext/MaterialGradeExtServiceImpl.java create mode 100644 zt-module-base/zt-module-base-server/src/test/java/com/zt/plat/module/base/api/materialgradeext/MaterialGradeExtApiImplTest.java create mode 100644 zt-module-base/zt-module-base-server/src/test/java/com/zt/plat/module/base/service/materialgradeext/MaterialGradeExtServiceImplTest.java diff --git a/sql/dm/2026-01-14帆软报表上传菜单.sql b/sql/dm/2026-01-14帆软报表上传菜单.sql new file mode 100644 index 00000000..e0988764 --- /dev/null +++ b/sql/dm/2026-01-14帆软报表上传菜单.sql @@ -0,0 +1,35 @@ +-- 帆软报表上传菜单(父级 1965981757204459521),请根据需要调整排序/图标 + +-- DM8 兼容写法:匿名块 + 变量赋值 + SELECT ... INTO +BEGIN + DECLARE + v_parent_id BIGINT; + v_menu_id BIGINT; + v_button_id BIGINT; + BEGIN + v_parent_id := 1965981757204459521; + + -- 计算主菜单 ID(非自增:使用当前最大值 + 1) + SELECT COALESCE(MAX(id), 0) + 1 INTO v_menu_id FROM system_menu; + + INSERT INTO system_menu( + id, name, permission, type, sort, parent_id, + path, icon, component, status, component_name + ) VALUES ( + v_menu_id, '帆软报表上传', '', 2, 0, v_parent_id, + 'fine-report-upload', 'ep:upload-filled', 'base/fineReportUpload/index', 0, 'FineReportUpload' + ); + + -- 计算按钮 ID(非自增:再取最大值 + 1) + SELECT COALESCE(MAX(id), 0) + 1 INTO v_button_id FROM system_menu; + + INSERT INTO system_menu( + id, name, permission, type, sort, parent_id, + path, icon, component, status + ) VALUES ( + v_button_id, '帆软报表上传-上传', 'base:fine-report-template:upload', 3, 1, v_menu_id, + '', '', '', 0 + ); + END; +END; +/ diff --git a/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/materialgradeext/MaterialGradeExtApi.java b/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/materialgradeext/MaterialGradeExtApi.java new file mode 100644 index 00000000..964588a7 --- /dev/null +++ b/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/materialgradeext/MaterialGradeExtApi.java @@ -0,0 +1,51 @@ +package com.zt.plat.module.base.api.materialgradeext; + +import com.zt.plat.framework.common.pojo.CommonResult; +import com.zt.plat.framework.common.pojo.PageResult; +import com.zt.plat.module.base.api.materialgradeext.dto.MaterialGradeExtPageReqDTO; +import com.zt.plat.module.base.api.materialgradeext.dto.MaterialGradeExtRespDTO; +import com.zt.plat.module.base.api.materialgradeext.dto.MaterialGradeExtSaveReqDTO; +import com.zt.plat.module.base.enums.ApiConstants; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +@FeignClient(name = ApiConstants.NAME) +@Tag(name = "RPC 服务 - 物料牌号扩展") +public interface MaterialGradeExtApi { + + String PREFIX = ApiConstants.PREFIX + "/material-grade-ext"; + + @PostMapping(PREFIX + "/create") + @Operation(summary = "创建物料牌号扩展") + CommonResult create(@Valid @RequestBody MaterialGradeExtSaveReqDTO reqDTO); + + @PutMapping(PREFIX + "/update") + @Operation(summary = "更新物料牌号扩展") + CommonResult update(@Valid @RequestBody MaterialGradeExtSaveReqDTO reqDTO); + + @DeleteMapping(PREFIX + "/delete") + @Operation(summary = "删除物料牌号扩展") + CommonResult delete(@RequestParam("id") Long id); + + @DeleteMapping(PREFIX + "/delete-list") + @Operation(summary = "批量删除物料牌号扩展") + CommonResult deleteList(@RequestBody List ids); + + @GetMapping(PREFIX + "/get") + @Operation(summary = "获得物料牌号扩展") + CommonResult get(@RequestParam("id") Long id); + + @PostMapping(PREFIX + "/page") + @Operation(summary = "获得物料牌号扩展分页") + CommonResult> getPage(@Valid @RequestBody MaterialGradeExtPageReqDTO pageReqDTO); +} \ No newline at end of file diff --git a/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/materialgradeext/dto/MaterialGradeExtPageReqDTO.java b/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/materialgradeext/dto/MaterialGradeExtPageReqDTO.java new file mode 100644 index 00000000..43a3a7a5 --- /dev/null +++ b/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/materialgradeext/dto/MaterialGradeExtPageReqDTO.java @@ -0,0 +1,28 @@ +package com.zt.plat.module.base.api.materialgradeext.dto; + +import com.zt.plat.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Data +public class MaterialGradeExtPageReqDTO extends PageParam { + + private String companyCode; + private String companyName; + private String materialCode; + private String materialName; + private String chineseBrand; + private String englishBrand; + private String specificationModel; + private String lineType; + private String packageDesc; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; +} \ No newline at end of file diff --git a/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/materialgradeext/dto/MaterialGradeExtRespDTO.java b/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/materialgradeext/dto/MaterialGradeExtRespDTO.java new file mode 100644 index 00000000..4610153d --- /dev/null +++ b/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/materialgradeext/dto/MaterialGradeExtRespDTO.java @@ -0,0 +1,24 @@ +package com.zt.plat.module.base.api.materialgradeext.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class MaterialGradeExtRespDTO { + + @Schema(description = "主键ID") + private Long id; + + private String companyCode; + private String companyName; + private String materialCode; + private String materialName; + private String chineseBrand; + private String englishBrand; + private String specificationModel; + private String lineType; + private String packageDesc; + private LocalDateTime createTime; +} \ No newline at end of file diff --git a/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/materialgradeext/dto/MaterialGradeExtSaveReqDTO.java b/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/materialgradeext/dto/MaterialGradeExtSaveReqDTO.java new file mode 100644 index 00000000..7a16b600 --- /dev/null +++ b/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/materialgradeext/dto/MaterialGradeExtSaveReqDTO.java @@ -0,0 +1,38 @@ +package com.zt.plat.module.base.api.materialgradeext.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class MaterialGradeExtSaveReqDTO { + + @Schema(description = "主键ID") + private Long id; + + @Schema(description = "公司编码") + private String companyCode; + + @Schema(description = "公司名称") + private String companyName; + + @Schema(description = "物料编码") + private String materialCode; + + @Schema(description = "物料名称") + private String materialName; + + @Schema(description = "中文牌号") + private String chineseBrand; + + @Schema(description = "英文牌号") + private String englishBrand; + + @Schema(description = "规格型号") + private String specificationModel; + + @Schema(description = "线别") + private String lineType; + + @Schema(description = "包装描述") + private String packageDesc; +} \ No newline at end of file diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/api/materialgradeext/MaterialGradeExtApiImpl.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/api/materialgradeext/MaterialGradeExtApiImpl.java new file mode 100644 index 00000000..b98ef3ff --- /dev/null +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/api/materialgradeext/MaterialGradeExtApiImpl.java @@ -0,0 +1,66 @@ +package com.zt.plat.module.base.api.materialgradeext; + +import com.zt.plat.framework.common.pojo.CommonResult; +import com.zt.plat.framework.common.pojo.PageResult; +import com.zt.plat.framework.common.util.object.BeanUtils; +import com.zt.plat.module.base.api.materialgradeext.dto.MaterialGradeExtPageReqDTO; +import com.zt.plat.module.base.api.materialgradeext.dto.MaterialGradeExtRespDTO; +import com.zt.plat.module.base.api.materialgradeext.dto.MaterialGradeExtSaveReqDTO; +import com.zt.plat.module.base.controller.admin.materialgradeext.vo.MaterialGradeExtPageReqVO; +import com.zt.plat.module.base.controller.admin.materialgradeext.vo.MaterialGradeExtRespVO; +import com.zt.plat.module.base.controller.admin.materialgradeext.vo.MaterialGradeExtSaveReqVO; +import com.zt.plat.module.base.service.materialgradeext.MaterialGradeExtService; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +import static com.zt.plat.framework.common.pojo.CommonResult.success; + +@RestController +@Validated +public class MaterialGradeExtApiImpl implements MaterialGradeExtApi { + + @Resource + private MaterialGradeExtService materialGradeExtService; + + @Override + public CommonResult create(MaterialGradeExtSaveReqDTO reqDTO) { + MaterialGradeExtRespVO respVO = materialGradeExtService.create(BeanUtils.toBean(reqDTO, MaterialGradeExtSaveReqVO.class)); + return success(BeanUtils.toBean(respVO, MaterialGradeExtRespDTO.class)); + } + + @Override + public CommonResult update(MaterialGradeExtSaveReqDTO reqDTO) { + materialGradeExtService.update(BeanUtils.toBean(reqDTO, MaterialGradeExtSaveReqVO.class)); + return success(true); + } + + @Override + public CommonResult delete(Long id) { + materialGradeExtService.delete(id); + return success(true); + } + + @Override + public CommonResult deleteList(List ids) { + materialGradeExtService.deleteByIds(ids); + return success(true); + } + + @Override + public CommonResult get(Long id) { + MaterialGradeExtRespVO respVO = materialGradeExtService.get(id); + return success(BeanUtils.toBean(respVO, MaterialGradeExtRespDTO.class)); + } + + @Override + public CommonResult> getPage(@RequestBody MaterialGradeExtPageReqDTO pageReqDTO) { + MaterialGradeExtPageReqVO pageReqVO = BeanUtils.toBean(pageReqDTO, MaterialGradeExtPageReqVO.class); + PageResult pageResult = materialGradeExtService.getPage(pageReqVO); + PageResult dtoResult = BeanUtils.toBean(pageResult, MaterialGradeExtRespDTO.class); + return success(dtoResult); + } +} \ No newline at end of file diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/config/FineReportUploadProperties.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/config/FineReportUploadProperties.java new file mode 100644 index 00000000..9bce76d8 --- /dev/null +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/config/FineReportUploadProperties.java @@ -0,0 +1,25 @@ +package com.zt.plat.module.base.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 帆软上传配置 + */ +@Component +@ConfigurationProperties(prefix = "finereport.upload") +public class FineReportUploadProperties { + + /** + * 上传目标地址(sidecar 内部 Service),默认指向集群内 fine-report-upload 服务 + */ + private String url = "http://fine-report-upload.ns-f16a3067ca7b434aad127d15eac82503.svc.cluster.local:8081/upload"; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } +} diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/finereport/FineReportUploadController.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/finereport/FineReportUploadController.java new file mode 100644 index 00000000..fe009e23 --- /dev/null +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/finereport/FineReportUploadController.java @@ -0,0 +1,103 @@ +package com.zt.plat.module.base.controller.admin.finereport; + +import cn.hutool.core.util.StrUtil; +import com.zt.plat.framework.common.pojo.CommonResult; +import com.zt.plat.module.base.config.FineReportUploadProperties; +import com.zt.plat.module.base.controller.admin.finereport.vo.FineReportUploadRespVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotBlank; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.http.*; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.multipart.MultipartFile; + +import java.time.Duration; +import java.util.Map; + +import static com.zt.plat.framework.common.pojo.CommonResult.error; +import static com.zt.plat.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 帆软报表上传") +@RestController +@RequestMapping("/base/fine-report") +@Slf4j +public class FineReportUploadController { + + private final RestTemplate restTemplate; + private final FineReportUploadProperties properties; + + public FineReportUploadController(RestTemplateBuilder builder, + FineReportUploadProperties properties) { + this.restTemplate = builder + .setConnectTimeout(Duration.ofSeconds(5)) + .setReadTimeout(Duration.ofSeconds(30)) + .build(); + this.properties = properties; + } + + @PostMapping("/upload") + @Operation(summary = "上传帆软报表模板(透传到 sidecar)") + @PreAuthorize("@ss.hasPermission('base:fine-report-template:upload')") + public CommonResult upload(@RequestParam("file") MultipartFile file, + @Parameter(description = "相对路径,可为空") + @RequestParam(value = "path", required = false) String path) { + if (file == null || file.isEmpty()) { + return error(400, "文件不能为空"); + } + + String uploadUrl = properties.getUrl(); + if (StrUtil.isBlank(uploadUrl)) { + return error(500, "上传地址未配置"); + } + + try { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + + MultiValueMap body = new LinkedMultiValueMap<>(); + String filename = file.getOriginalFilename(); + ByteArrayResource resource = new ByteArrayResource(file.getBytes()) { + @Override + public String getFilename() { + return filename; + } + }; + body.add("file", resource); + if (StrUtil.isNotBlank(path)) { + body.add("path", path); + } + + HttpEntity> requestEntity = new HttpEntity<>(body, headers); + ResponseEntity response = restTemplate.postForEntity(uploadUrl, requestEntity, Map.class); + + FineReportUploadRespVO respVO = new FineReportUploadRespVO(); + respVO.setFilename(filename); + respVO.setBytes(file.getSize()); + + Map respBody = response.getBody(); + if (respBody != null) { + Object targetPath = respBody.get("path"); + if (targetPath != null) { + respVO.setTargetPath(String.valueOf(targetPath)); + } + Object status = respBody.get("status"); + if (status != null) { + respVO.setStatus(String.valueOf(status)); + } + } + + return success(respVO); + } catch (Exception ex) { + log.error("Upload FineReport template failed, url={}, file={}", properties.getUrl(), file.getOriginalFilename(), ex); + return error(500, "上传失败: " + ex.getMessage()); + } + } +} diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/finereport/vo/FineReportUploadRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/finereport/vo/FineReportUploadRespVO.java new file mode 100644 index 00000000..3fb62747 --- /dev/null +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/finereport/vo/FineReportUploadRespVO.java @@ -0,0 +1,20 @@ +package com.zt.plat.module.base.controller.admin.finereport.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class FineReportUploadRespVO { + + @Schema(description = "文件名") + private String filename; + + @Schema(description = "上传字节数") + private Long bytes; + + @Schema(description = "目标路径") + private String targetPath; + + @Schema(description = "sidecar 返回的状态") + private String status; +} diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialgradeext/MaterialGradeExtController.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialgradeext/MaterialGradeExtController.java new file mode 100644 index 00000000..457aa132 --- /dev/null +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialgradeext/MaterialGradeExtController.java @@ -0,0 +1,87 @@ +package com.zt.plat.module.base.controller.admin.materialgradeext; + +import com.zt.plat.framework.apilog.core.annotation.ApiAccessLog; +import com.zt.plat.framework.common.pojo.CommonResult; +import com.zt.plat.framework.common.pojo.PageResult; +import com.zt.plat.framework.common.pojo.vo.BatchDeleteReqVO; +import com.zt.plat.framework.datapermission.core.annotation.CompanyDataPermissionIgnore; +import com.zt.plat.framework.datapermission.core.annotation.DeptDataPermissionIgnore; +import com.zt.plat.module.base.controller.admin.materialgradeext.vo.MaterialGradeExtPageReqVO; +import com.zt.plat.module.base.controller.admin.materialgradeext.vo.MaterialGradeExtRespVO; +import com.zt.plat.module.base.controller.admin.materialgradeext.vo.MaterialGradeExtSaveReqVO; +import com.zt.plat.module.base.service.materialgradeext.MaterialGradeExtService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +import static com.zt.plat.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.zt.plat.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 物料牌号扩展") +@RestController +@RequestMapping("/base/material-grade-ext") +@Validated +@CompanyDataPermissionIgnore +@DeptDataPermissionIgnore +public class MaterialGradeExtController { + + @Resource + private MaterialGradeExtService materialGradeExtService; + + @PostMapping("/create") + @Operation(summary = "创建物料牌号扩展") + @PreAuthorize("@ss.hasPermission('base:material-grade-ext:create')") + public CommonResult create(@Valid @RequestBody MaterialGradeExtSaveReqVO reqVO) { + return success(materialGradeExtService.create(reqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新物料牌号扩展") + @PreAuthorize("@ss.hasPermission('base:material-grade-ext:update')") + public CommonResult update(@Valid @RequestBody MaterialGradeExtSaveReqVO reqVO) { + materialGradeExtService.update(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除物料牌号扩展") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('base:material-grade-ext:delete')") + public CommonResult delete(@RequestParam("id") Long id) { + materialGradeExtService.delete(id); + return success(true); + } + + @DeleteMapping("/delete-list") + @Operation(summary = "批量删除物料牌号扩展") + @PreAuthorize("@ss.hasPermission('base:material-grade-ext:delete')") + public CommonResult deleteList(@RequestBody BatchDeleteReqVO req) { + materialGradeExtService.deleteByIds(req.getIds()); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得物料牌号扩展") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('base:material-grade-ext:query')") + public CommonResult get(@RequestParam("id") Long id) { + return success(materialGradeExtService.get(id)); + } + + @RequestMapping(value = "/page", method = {RequestMethod.GET, RequestMethod.POST}) + @Operation(summary = "获得物料牌号扩展分页") + @PreAuthorize("@ss.hasPermission('base:material-grade-ext:query')") + public CommonResult> getPage(@Valid @RequestBody(required = false) MaterialGradeExtPageReqVO pageReqVO) { + if (pageReqVO == null) { + pageReqVO = new MaterialGradeExtPageReqVO(); + } + return success(materialGradeExtService.getPage(pageReqVO)); + } +} \ No newline at end of file diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialgradeext/vo/MaterialGradeExtPageReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialgradeext/vo/MaterialGradeExtPageReqVO.java new file mode 100644 index 00000000..ca41ca2b --- /dev/null +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialgradeext/vo/MaterialGradeExtPageReqVO.java @@ -0,0 +1,46 @@ +package com.zt.plat.module.base.controller.admin.materialgradeext.vo; + +import com.zt.plat.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 物料牌号扩展分页 Request VO") +@Data +public class MaterialGradeExtPageReqVO extends PageParam { + + @Schema(description = "公司编码") + private String companyCode; + + @Schema(description = "公司名称") + private String companyName; + + @Schema(description = "物料编码") + private String materialCode; + + @Schema(description = "物料名称") + private String materialName; + + @Schema(description = "中文牌号") + private String chineseBrand; + + @Schema(description = "英文牌号") + private String englishBrand; + + @Schema(description = "规格型号") + private String specificationModel; + + @Schema(description = "线别") + private String lineType; + + @Schema(description = "包装描述") + private String packageDesc; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; +} \ No newline at end of file diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialgradeext/vo/MaterialGradeExtRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialgradeext/vo/MaterialGradeExtRespVO.java new file mode 100644 index 00000000..5968c974 --- /dev/null +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialgradeext/vo/MaterialGradeExtRespVO.java @@ -0,0 +1,46 @@ +package com.zt.plat.module.base.controller.admin.materialgradeext.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 物料牌号扩展 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MaterialGradeExtRespVO { + + @Schema(description = "主键ID") + private Long id; + + @Schema(description = "公司编码") + private String companyCode; + + @Schema(description = "公司名称") + private String companyName; + + @Schema(description = "物料编码") + private String materialCode; + + @Schema(description = "物料名称") + private String materialName; + + @Schema(description = "中文牌号") + private String chineseBrand; + + @Schema(description = "英文牌号") + private String englishBrand; + + @Schema(description = "规格型号") + private String specificationModel; + + @Schema(description = "线别") + private String lineType; + + @Schema(description = "包装描述") + private String packageDesc; + + @Schema(description = "创建时间") + private LocalDateTime createTime; +} \ No newline at end of file diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialgradeext/vo/MaterialGradeExtSaveReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialgradeext/vo/MaterialGradeExtSaveReqVO.java new file mode 100644 index 00000000..47b7e741 --- /dev/null +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialgradeext/vo/MaterialGradeExtSaveReqVO.java @@ -0,0 +1,42 @@ +package com.zt.plat.module.base.controller.admin.materialgradeext.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +@Schema(description = "管理后台 - 物料牌号扩展新增/修改 Request VO") +@Data +public class MaterialGradeExtSaveReqVO { + + @Schema(description = "主键ID") + private Long id; + + @Schema(description = "公司编码") + @NotEmpty(message = "公司编码不能为空") + private String companyCode; + + @Schema(description = "公司名称") + private String companyName; + + @Schema(description = "物料编码") + @NotEmpty(message = "物料编码不能为空") + private String materialCode; + + @Schema(description = "物料名称") + private String materialName; + + @Schema(description = "中文牌号") + private String chineseBrand; + + @Schema(description = "英文牌号") + private String englishBrand; + + @Schema(description = "规格型号") + private String specificationModel; + + @Schema(description = "线别(业务字典: material_line_type)") + private String lineType; + + @Schema(description = "包装描述") + private String packageDesc; +} \ No newline at end of file diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/materialgradeext/MaterialGradeExtMapper.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/materialgradeext/MaterialGradeExtMapper.java new file mode 100644 index 00000000..1f2994ce --- /dev/null +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/materialgradeext/MaterialGradeExtMapper.java @@ -0,0 +1,31 @@ +package com.zt.plat.module.base.dal.dao.materialgradeext; + +import com.zt.plat.framework.common.pojo.PageResult; +import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX; +import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.zt.plat.module.base.controller.admin.materialgradeext.vo.MaterialGradeExtPageReqVO; +import com.zt.plat.module.base.dal.dataobject.materialgradeext.MaterialGradeExtDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 物料牌号扩展 Mapper + */ +@Mapper +public interface MaterialGradeExtMapper extends BaseMapperX { + + default PageResult selectPage(MaterialGradeExtPageReqVO reqVO) { + LambdaQueryWrapperX query = new LambdaQueryWrapperX() + .eqIfPresent(MaterialGradeExtDO::getCompanyCode, reqVO.getCompanyCode()) + .likeIfPresent(MaterialGradeExtDO::getCompanyName, reqVO.getCompanyName()) + .eqIfPresent(MaterialGradeExtDO::getMaterialCode, reqVO.getMaterialCode()) + .likeIfPresent(MaterialGradeExtDO::getMaterialName, reqVO.getMaterialName()) + .likeIfPresent(MaterialGradeExtDO::getChineseBrand, reqVO.getChineseBrand()) + .likeIfPresent(MaterialGradeExtDO::getEnglishBrand, reqVO.getEnglishBrand()) + .likeIfPresent(MaterialGradeExtDO::getSpecificationModel, reqVO.getSpecificationModel()) + .eqIfPresent(MaterialGradeExtDO::getLineType, reqVO.getLineType()) + .likeIfPresent(MaterialGradeExtDO::getPackageDesc, reqVO.getPackageDesc()) + .betweenIfPresent(MaterialGradeExtDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(MaterialGradeExtDO::getId); + return selectPage(reqVO, query); + } +} \ No newline at end of file diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/materialgradeext/MaterialGradeExtDO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/materialgradeext/MaterialGradeExtDO.java new file mode 100644 index 00000000..c5868cf8 --- /dev/null +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/materialgradeext/MaterialGradeExtDO.java @@ -0,0 +1,68 @@ +package com.zt.plat.module.base.dal.dataobject.materialgradeext; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.zt.plat.framework.mybatis.core.dataobject.BusinessBaseDO; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.ToString; + +/** + * 物料牌号扩展 DO + */ +@TableName("bse_mtrl_grade_ext") +@KeySequence("bse_mtrl_grade_ext_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MaterialGradeExtDO extends BusinessBaseDO { + + /** 主键 */ + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + /** 公司编码 */ + @TableField("CMP_CD") + private String companyCode; + + /** 公司名称 */ + @TableField("CMP_NM") + private String companyName; + + /** 物料编码 */ + @TableField("MTRL_CD") + private String materialCode; + + /** 物料名称 */ + @TableField("MTRL_NM") + private String materialName; + + /** 中文牌号 */ + @TableField("ZH_BRAND") + private String chineseBrand; + + /** 英文牌号 */ + @TableField("EN_BRAND") + private String englishBrand; + + /** 规格型号 */ + @TableField("SPC_MDL") + private String specificationModel; + + /** 线别(业务字典:material_line_type) */ + @TableField("LINE_TP") + private String lineType; + + /** 包装描述 */ + @TableField("PKG") + private String packageDesc; +} \ No newline at end of file diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/materialgradeext/MaterialGradeExtService.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/materialgradeext/MaterialGradeExtService.java new file mode 100644 index 00000000..abb93cdc --- /dev/null +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/materialgradeext/MaterialGradeExtService.java @@ -0,0 +1,23 @@ +package com.zt.plat.module.base.service.materialgradeext; + +import com.zt.plat.framework.common.pojo.PageResult; +import com.zt.plat.module.base.controller.admin.materialgradeext.vo.MaterialGradeExtPageReqVO; +import com.zt.plat.module.base.controller.admin.materialgradeext.vo.MaterialGradeExtRespVO; +import com.zt.plat.module.base.controller.admin.materialgradeext.vo.MaterialGradeExtSaveReqVO; + +import java.util.List; + +public interface MaterialGradeExtService { + + MaterialGradeExtRespVO create(MaterialGradeExtSaveReqVO reqVO); + + void update(MaterialGradeExtSaveReqVO reqVO); + + void delete(Long id); + + void deleteByIds(List ids); + + MaterialGradeExtRespVO get(Long id); + + PageResult getPage(MaterialGradeExtPageReqVO pageReqVO); +} \ No newline at end of file diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/materialgradeext/MaterialGradeExtServiceImpl.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/materialgradeext/MaterialGradeExtServiceImpl.java new file mode 100644 index 00000000..c3b1294e --- /dev/null +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/materialgradeext/MaterialGradeExtServiceImpl.java @@ -0,0 +1,89 @@ +package com.zt.plat.module.base.service.materialgradeext; + +import cn.hutool.core.collection.CollUtil; +import com.zt.plat.framework.common.pojo.PageResult; +import com.zt.plat.framework.common.util.object.BeanUtils; +import com.zt.plat.module.base.controller.admin.materialgradeext.vo.MaterialGradeExtPageReqVO; +import com.zt.plat.module.base.controller.admin.materialgradeext.vo.MaterialGradeExtRespVO; +import com.zt.plat.module.base.controller.admin.materialgradeext.vo.MaterialGradeExtSaveReqVO; +import com.zt.plat.module.base.dal.dao.materialgradeext.MaterialGradeExtMapper; +import com.zt.plat.module.base.dal.dataobject.materialgradeext.MaterialGradeExtDO; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.Collections; +import java.util.List; + +import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zt.plat.module.base.enums.ErrorCodeConstants.MATERIAL_GRADE_EXT_NOT_EXISTS; + +/** + * 物料牌号扩展 Service 实现 + */ +@Service +@Validated +public class MaterialGradeExtServiceImpl implements MaterialGradeExtService { + + @Resource + private MaterialGradeExtMapper materialGradeExtMapper; + + @Override + public MaterialGradeExtRespVO create(MaterialGradeExtSaveReqVO reqVO) { + MaterialGradeExtDO entity = BeanUtils.toBean(reqVO, MaterialGradeExtDO.class); + materialGradeExtMapper.insert(entity); + return BeanUtils.toBean(entity, MaterialGradeExtRespVO.class); + } + + @Override + public void update(MaterialGradeExtSaveReqVO reqVO) { + validateExists(reqVO.getId()); + MaterialGradeExtDO entity = BeanUtils.toBean(reqVO, MaterialGradeExtDO.class); + materialGradeExtMapper.updateById(entity); + } + + @Override + public void delete(Long id) { + validateExists(id); + materialGradeExtMapper.deleteById(id); + } + + @Override + public void deleteByIds(List ids) { + validateExists(ids); + materialGradeExtMapper.deleteBatchIds(ids); + } + + @Override + public MaterialGradeExtRespVO get(Long id) { + MaterialGradeExtDO entity = materialGradeExtMapper.selectById(id); + return BeanUtils.toBean(entity, MaterialGradeExtRespVO.class); + } + + @Override + public PageResult getPage(MaterialGradeExtPageReqVO pageReqVO) { + PageResult page = materialGradeExtMapper.selectPage(pageReqVO); + if (CollUtil.isEmpty(page.getList())) { + return new PageResult<>(Collections.emptyList(), page.getTotal()); + } + List list = BeanUtils.toBean(page.getList(), MaterialGradeExtRespVO.class); + return new PageResult<>(list, page.getTotal()); + } + + private void validateExists(Long id) { + if (id == null || materialGradeExtMapper.selectById(id) == null) { + throw exception(MATERIAL_GRADE_EXT_NOT_EXISTS); + } + } + + private void validateExists(List ids) { + if (CollUtil.isEmpty(ids)) { + throw exception(MATERIAL_GRADE_EXT_NOT_EXISTS); + } + Long count = materialGradeExtMapper.selectCount(null); + // 快速校验: 逐个检查 + for (Long id : ids) { + validateExists(id); + } + } +} \ No newline at end of file diff --git a/zt-module-base/zt-module-base-server/src/test/java/com/zt/plat/module/base/api/materialgradeext/MaterialGradeExtApiImplTest.java b/zt-module-base/zt-module-base-server/src/test/java/com/zt/plat/module/base/api/materialgradeext/MaterialGradeExtApiImplTest.java new file mode 100644 index 00000000..d190b357 --- /dev/null +++ b/zt-module-base/zt-module-base-server/src/test/java/com/zt/plat/module/base/api/materialgradeext/MaterialGradeExtApiImplTest.java @@ -0,0 +1,137 @@ +package com.zt.plat.module.base.api.materialgradeext; + +import com.zt.plat.framework.common.pojo.CommonResult; +import com.zt.plat.framework.common.pojo.PageResult; +import com.zt.plat.module.base.api.materialgradeext.dto.MaterialGradeExtPageReqDTO; +import com.zt.plat.module.base.api.materialgradeext.dto.MaterialGradeExtRespDTO; +import com.zt.plat.module.base.api.materialgradeext.dto.MaterialGradeExtSaveReqDTO; +import com.zt.plat.module.base.controller.admin.materialgradeext.vo.MaterialGradeExtPageReqVO; +import com.zt.plat.module.base.controller.admin.materialgradeext.vo.MaterialGradeExtRespVO; +import com.zt.plat.module.base.controller.admin.materialgradeext.vo.MaterialGradeExtSaveReqVO; +import com.zt.plat.module.base.service.materialgradeext.MaterialGradeExtService; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.time.LocalDateTime; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class MaterialGradeExtApiImplTest { + + @InjectMocks + private MaterialGradeExtApiImpl api; + + @Mock + private MaterialGradeExtService materialGradeExtService; + + private MaterialGradeExtSaveReqDTO buildSaveReqDTO() { + MaterialGradeExtSaveReqDTO dto = new MaterialGradeExtSaveReqDTO(); + dto.setId(1L); + dto.setCompanyCode("C001"); + dto.setCompanyName("公司A"); + dto.setMaterialCode("M001"); + dto.setMaterialName("物料A"); + dto.setChineseBrand("ZH"); + dto.setEnglishBrand("EN"); + dto.setSpecificationModel("SPC"); + dto.setLineType("single"); + dto.setPackageDesc("箱装"); + return dto; + } + + private MaterialGradeExtRespVO buildRespVO() { + MaterialGradeExtRespVO respVO = new MaterialGradeExtRespVO(); + respVO.setId(11L); + respVO.setCompanyCode("C001"); + respVO.setMaterialCode("M001"); + respVO.setCreateTime(LocalDateTime.now()); + return respVO; + } + + @Test + void create_shouldInvokeServiceAndReturnDto() { + MaterialGradeExtSaveReqDTO reqDTO = buildSaveReqDTO(); + MaterialGradeExtRespVO serviceResp = buildRespVO(); + when(materialGradeExtService.create(any(MaterialGradeExtSaveReqVO.class))).thenReturn(serviceResp); + + CommonResult result = api.create(reqDTO); + + assertThat(result.isSuccess()).isTrue(); + assertThat(result.getData().getId()).isEqualTo(serviceResp.getId()); + ArgumentCaptor captor = ArgumentCaptor.forClass(MaterialGradeExtSaveReqVO.class); + verify(materialGradeExtService).create(captor.capture()); + assertThat(captor.getValue().getCompanyCode()).isEqualTo("C001"); + assertThat(captor.getValue().getMaterialCode()).isEqualTo("M001"); + } + + @Test + void update_shouldInvokeService() { + MaterialGradeExtSaveReqDTO reqDTO = buildSaveReqDTO(); + + CommonResult result = api.update(reqDTO); + + assertThat(result.isSuccess()).isTrue(); + assertThat(result.getData()).isTrue(); + ArgumentCaptor captor = ArgumentCaptor.forClass(MaterialGradeExtSaveReqVO.class); + verify(materialGradeExtService).update(captor.capture()); + assertThat(captor.getValue().getCompanyCode()).isEqualTo("C001"); + } + + @Test + void delete_shouldInvokeService() { + CommonResult result = api.delete(9L); + + assertThat(result.isSuccess()).isTrue(); + assertThat(result.getData()).isTrue(); + verify(materialGradeExtService).delete(9L); + } + + @Test + void deleteList_shouldInvokeService() { + List ids = List.of(1L, 2L); + + CommonResult result = api.deleteList(ids); + + assertThat(result.isSuccess()).isTrue(); + assertThat(result.getData()).isTrue(); + verify(materialGradeExtService).deleteByIds(ids); + } + + @Test + void get_shouldReturnConvertedDto() { + MaterialGradeExtRespVO respVO = buildRespVO(); + when(materialGradeExtService.get(5L)).thenReturn(respVO); + + CommonResult result = api.get(5L); + + assertThat(result.isSuccess()).isTrue(); + assertThat(result.getData().getId()).isEqualTo(respVO.getId()); + assertThat(result.getData().getCompanyCode()).isEqualTo("C001"); + } + + @Test + void getPage_shouldConvertPageResult() { + MaterialGradeExtRespVO respVO = buildRespVO(); + PageResult page = new PageResult<>(List.of(respVO), 1L); + when(materialGradeExtService.getPage(any(MaterialGradeExtPageReqVO.class))).thenReturn(page); + + MaterialGradeExtPageReqDTO reqDTO = new MaterialGradeExtPageReqDTO(); + reqDTO.setCompanyCode("C001"); + + CommonResult> result = api.getPage(reqDTO); + + assertThat(result.isSuccess()).isTrue(); + assertThat(result.getData().getTotal()).isEqualTo(1L); + assertThat(result.getData().getList()).hasSize(1); + assertThat(result.getData().getList().get(0).getCompanyCode()).isEqualTo("C001"); + } +} \ No newline at end of file diff --git a/zt-module-base/zt-module-base-server/src/test/java/com/zt/plat/module/base/service/materialgradeext/MaterialGradeExtServiceImplTest.java b/zt-module-base/zt-module-base-server/src/test/java/com/zt/plat/module/base/service/materialgradeext/MaterialGradeExtServiceImplTest.java new file mode 100644 index 00000000..608d36e6 --- /dev/null +++ b/zt-module-base/zt-module-base-server/src/test/java/com/zt/plat/module/base/service/materialgradeext/MaterialGradeExtServiceImplTest.java @@ -0,0 +1,185 @@ +package com.zt.plat.module.base.service.materialgradeext; + +import com.zt.plat.framework.common.pojo.PageResult; +import com.zt.plat.framework.test.core.ut.BaseDbUnitTest; +import com.zt.plat.module.base.controller.admin.materialgradeext.vo.MaterialGradeExtPageReqVO; +import com.zt.plat.module.base.controller.admin.materialgradeext.vo.MaterialGradeExtRespVO; +import com.zt.plat.module.base.controller.admin.materialgradeext.vo.MaterialGradeExtSaveReqVO; +import com.zt.plat.module.base.dal.dao.materialgradeext.MaterialGradeExtMapper; +import com.zt.plat.module.base.dal.dataobject.materialgradeext.MaterialGradeExtDO; +import jakarta.annotation.Resource; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.List; + +import static com.zt.plat.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime; +import static com.zt.plat.framework.common.util.date.LocalDateTimeUtils.buildTime; +import static com.zt.plat.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static com.zt.plat.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.zt.plat.framework.test.core.util.AssertUtils.assertServiceException; +import static com.zt.plat.framework.test.core.util.RandomUtils.randomPojo; +import static com.zt.plat.framework.test.core.util.RandomUtils.randomLongId; +import static com.zt.plat.module.base.enums.ErrorCodeConstants.MATERIAL_GRADE_EXT_NOT_EXISTS; +import static org.junit.jupiter.api.Assertions.*; + +@Import(MaterialGradeExtServiceImpl.class) +class MaterialGradeExtServiceImplTest extends BaseDbUnitTest { + + @Resource + private MaterialGradeExtServiceImpl materialGradeExtService; + + @Resource + private MaterialGradeExtMapper materialGradeExtMapper; + + private MaterialGradeExtSaveReqVO buildSaveReqVO(Long id) { + MaterialGradeExtSaveReqVO reqVO = randomPojo(MaterialGradeExtSaveReqVO.class, o -> { + o.setId(id); + o.setCompanyCode("C001"); + o.setCompanyName("公司A"); + o.setMaterialCode("M001"); + o.setMaterialName("物料A"); + o.setChineseBrand("中文牌号"); + o.setEnglishBrand("EN-BRAND"); + o.setSpecificationModel("SPC-1"); + o.setLineType("single"); + o.setPackageDesc("箱装"); + }); + return reqVO; + } + + @Test + void create_success() { + MaterialGradeExtSaveReqVO reqVO = buildSaveReqVO(null); + + MaterialGradeExtRespVO respVO = materialGradeExtService.create(reqVO); + + assertNotNull(respVO.getId()); + MaterialGradeExtDO db = materialGradeExtMapper.selectById(respVO.getId()); + assertPojoEquals(reqVO, db, "id", "createTime", "updateTime", "creator", "updater", "deleted", + "tenantId", "deptId", "deptName", "companyId", "creatorName", "updaterName", "postId"); + } + + @Test + void update_success() { + MaterialGradeExtDO db = randomPojo(MaterialGradeExtDO.class, o -> { + o.setCompanyCode("C001"); + o.setMaterialCode("M001"); + o.setCreateTime(LocalDateTime.now()); + }); + materialGradeExtMapper.insert(db); + + MaterialGradeExtSaveReqVO reqVO = buildSaveReqVO(db.getId()); + reqVO.setCompanyCode("C002"); + reqVO.setMaterialCode("M002"); + reqVO.setLineType("double"); + + materialGradeExtService.update(reqVO); + + MaterialGradeExtDO updated = materialGradeExtMapper.selectById(db.getId()); + assertPojoEquals(reqVO, updated, "createTime", "updateTime", "creator", "updater", "deleted", + "tenantId", "deptId", "deptName", "companyId", "creatorName", "updaterName", "postId"); + } + + @Test + void update_notExists() { + MaterialGradeExtSaveReqVO reqVO = buildSaveReqVO(randomLongId()); + + assertServiceException(() -> materialGradeExtService.update(reqVO), MATERIAL_GRADE_EXT_NOT_EXISTS); + } + + @Test + void delete_success() { + MaterialGradeExtDO db = randomPojo(MaterialGradeExtDO.class, o -> { + o.setCompanyCode("C001"); + o.setMaterialCode("M001"); + }); + materialGradeExtMapper.insert(db); + + materialGradeExtService.delete(db.getId()); + + assertNull(materialGradeExtMapper.selectById(db.getId())); + } + + @Test + void delete_notExists() { + assertServiceException(() -> materialGradeExtService.delete(randomLongId()), MATERIAL_GRADE_EXT_NOT_EXISTS); + } + + @Test + void deleteByIds_success() { + MaterialGradeExtDO db1 = randomPojo(MaterialGradeExtDO.class, o -> { + o.setCompanyCode("C001"); + o.setMaterialCode("M001"); + }); + MaterialGradeExtDO db2 = randomPojo(MaterialGradeExtDO.class, o -> { + o.setCompanyCode("C002"); + o.setMaterialCode("M002"); + }); + materialGradeExtMapper.insert(db1); + materialGradeExtMapper.insert(db2); + + materialGradeExtService.deleteByIds(Arrays.asList(db1.getId(), db2.getId())); + + assertNull(materialGradeExtMapper.selectById(db1.getId())); + assertNull(materialGradeExtMapper.selectById(db2.getId())); + } + + @Test + void get_success() { + MaterialGradeExtDO db = randomPojo(MaterialGradeExtDO.class, o -> { + o.setCompanyCode("C001"); + o.setMaterialCode("M001"); + }); + materialGradeExtMapper.insert(db); + + MaterialGradeExtRespVO result = materialGradeExtService.get(db.getId()); + + assertPojoEquals(db, result, "createTime", "updateTime", "creator", "updater", "deleted", + "tenantId", "deptId", "deptName", "companyId", "creatorName", "updaterName", "postId"); + } + + @Test + void getPage_filterSuccess() { + MaterialGradeExtDO target = randomPojo(MaterialGradeExtDO.class, o -> { + o.setCompanyCode("C001"); + o.setCompanyName("公司A"); + o.setMaterialCode("M001"); + o.setMaterialName("物料A"); + o.setChineseBrand("ZH"); + o.setEnglishBrand("EN"); + o.setSpecificationModel("SPC"); + o.setLineType("single"); + o.setPackageDesc("包装A"); + o.setCreateTime(buildTime(2024, 1, 2)); + }); + materialGradeExtMapper.insert(target); + + materialGradeExtMapper.insert(cloneIgnoreId(target, o -> o.setCompanyCode("X"))); + materialGradeExtMapper.insert(cloneIgnoreId(target, o -> o.setMaterialCode("Y"))); + materialGradeExtMapper.insert(cloneIgnoreId(target, o -> o.setChineseBrand("不同"))); + materialGradeExtMapper.insert(cloneIgnoreId(target, o -> o.setLineType("double"))); + materialGradeExtMapper.insert(cloneIgnoreId(target, o -> o.setCreateTime(buildTime(2024, 2, 2)))); + + MaterialGradeExtPageReqVO pageReqVO = new MaterialGradeExtPageReqVO(); + pageReqVO.setCompanyCode("C001"); + pageReqVO.setCompanyName("公司"); + pageReqVO.setMaterialCode("M001"); + pageReqVO.setMaterialName("物料"); + pageReqVO.setChineseBrand("ZH"); + pageReqVO.setEnglishBrand("EN"); + pageReqVO.setSpecificationModel("SPC"); + pageReqVO.setLineType("single"); + pageReqVO.setPackageDesc("包装"); + pageReqVO.setCreateTime(buildBetweenTime(2024, 1, 1, 2024, 1, 3)); + + PageResult pageResult = materialGradeExtService.getPage(pageReqVO); + + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(target, pageResult.getList().get(0), "createTime", "updateTime", "creator", "updater", "deleted", + "tenantId", "deptId", "deptName", "companyId", "creatorName", "updaterName", "postId"); + } +} \ No newline at end of file diff --git a/zt-module-base/zt-module-base-server/src/test/resources/sql/clean.sql b/zt-module-base/zt-module-base-server/src/test/resources/sql/clean.sql index 5bcffbe4..1081fbd0 100644 --- a/zt-module-base/zt-module-base-server/src/test/resources/sql/clean.sql +++ b/zt-module-base/zt-module-base-server/src/test/resources/sql/clean.sql @@ -1 +1,2 @@ TRUNCATE TABLE bse_mtrl_hs_prps; +TRUNCATE TABLE bse_mtrl_grade_ext; diff --git a/zt-module-base/zt-module-base-server/src/test/resources/sql/create_tables.sql b/zt-module-base/zt-module-base-server/src/test/resources/sql/create_tables.sql index 144d366a..132ff070 100644 --- a/zt-module-base/zt-module-base-server/src/test/resources/sql/create_tables.sql +++ b/zt-module-base/zt-module-base-server/src/test/resources/sql/create_tables.sql @@ -14,3 +14,29 @@ CREATE TABLE IF NOT EXISTS bse_mtrl_hs_prps ( deleted BIT DEFAULT FALSE NOT NULL, tenant_id BIGINT DEFAULT 1 NOT NULL ); + +CREATE TABLE IF NOT EXISTS bse_mtrl_grade_ext ( + id BIGINT PRIMARY KEY, + CMP_CD VARCHAR(64) NOT NULL, + CMP_NM VARCHAR(128), + MTRL_CD VARCHAR(128) NOT NULL, + MTRL_NM VARCHAR(255), + ZH_BRAND VARCHAR(255), + EN_BRAND VARCHAR(255), + SPC_MDL VARCHAR(255), + LINE_TP VARCHAR(64), + PKG VARCHAR(255), + company_id BIGINT, + company_name VARCHAR(128), + dept_id BIGINT, + dept_name VARCHAR(128), + post_id BIGINT, + tenant_id BIGINT DEFAULT 1, + creator_name VARCHAR(64), + updater_name VARCHAR(64), + creator VARCHAR(64), + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, + updater VARCHAR(64), + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, + deleted BIT DEFAULT FALSE NOT NULL +);