diff --git a/erp-turbo-admin/src/main/java/com/xunhong/erp/turbo/admin/controller/ProductController.java b/erp-turbo-admin/src/main/java/com/xunhong/erp/turbo/admin/controller/ProductController.java new file mode 100644 index 0000000..1b2cab7 --- /dev/null +++ b/erp-turbo-admin/src/main/java/com/xunhong/erp/turbo/admin/controller/ProductController.java @@ -0,0 +1,95 @@ +package com.xunhong.erp.turbo.admin.controller; + +import cn.dev33.satoken.annotation.SaCheckLogin; +import com.alibaba.cola.dto.MultiResponse; +import com.alibaba.cola.dto.PageResponse; +import com.alibaba.cola.dto.Response; +import com.alibaba.cola.dto.SingleResponse; +import com.xunhong.erp.turbo.api.biz.api.ProductServiceI; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductCreateCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductDestroyCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductUpdateCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductDragCmd; +import com.xunhong.erp.turbo.api.biz.dto.qry.ProductListQry; +import com.xunhong.erp.turbo.api.biz.dto.qry.ProductPageQry; +import com.xunhong.erp.turbo.api.biz.dto.qry.ProductShowQry; +import com.xunhong.erp.turbo.api.biz.dto.vo.ProductVO; +import com.xunhong.erp.turbo.base.dto.PageDTO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * @author shenyifei + */ +@Tag(name = "Product", description = "产品管理") +@RestController("operationProductController") +@RequestMapping(value = "/operation") +@RequiredArgsConstructor +public class ProductController { + + @DubboReference(version = "1.0.0") + private final ProductServiceI productService; + + @SaCheckLogin +// @SaCheckPermission(value = {PermissionConstant.MDB_BUSINESS_COST_ITEM_VIEW}) + @GetMapping("listProduct") + @Operation(summary = "产品列表", method = "GET") + public MultiResponse listProduct(@ModelAttribute @Validated ProductListQry productListQry) { + return MultiResponse.of(productService.list(productListQry)); + } + + @SaCheckLogin +// @SaCheckPermission(value = {PermissionConstant.MDB_BUSINESS_COST_ITEM_CREATE}) + @PostMapping("createProduct") + @Operation(summary = "创建产品", method = "POST") + public SingleResponse createProduct(@RequestBody @Validated ProductCreateCmd productCreateCmd) { + return SingleResponse.of(productService.create(productCreateCmd)); + } + + @SaCheckLogin +// @SaCheckPermission(value = {PermissionConstant.MDB_BUSINESS_COST_ITEM_VIEW}) + @GetMapping("showProduct") + @Operation(summary = "产品详情", method = "GET") + public SingleResponse showProduct(@ModelAttribute @Validated ProductShowQry productShowQry) { + return SingleResponse.of(productService.show(productShowQry)); + } + + @SaCheckLogin +// @SaCheckPermission(value = {PermissionConstant.MDB_BUSINESS_COST_ITEM_VIEW}) + @GetMapping("pageProduct") + @Operation(summary = "产品列表", method = "GET") + public PageResponse pageProduct(@ModelAttribute @Validated ProductPageQry productPageQry) { + PageDTO page = productService.page(productPageQry); + return PageResponse.of(page.getRecords(), (int) page.getTotal(), (int) page.getSize(), (int) page.getCurrent()); + } + + @SaCheckLogin +// @SaCheckPermission(value = {PermissionConstant.MDB_BUSINESS_COST_ITEM_UPDATE}) + @RequestMapping(value = "updateProduct", method = {RequestMethod.PATCH, RequestMethod.PUT}) + @Operation(summary = "产品更新", method = "PATCH") + public SingleResponse updateProduct(@RequestBody @Validated ProductUpdateCmd productUpdateCmd) { + return SingleResponse.of(productService.update(productUpdateCmd)); + } + + @SaCheckLogin +// @SaCheckPermission(value = {PermissionConstant.MDB_BUSINESS_COST_ITEM_DELETE}) + @DeleteMapping("destroyProduct") + @Operation(summary = "产品删除", method = "DELETE") + public Response destroyProduct(@RequestBody @Validated ProductDestroyCmd productDestroyCmd) { + productService.destroy(productDestroyCmd); + return Response.buildSuccess(); + } + + @SaCheckLogin +// @SaCheckPermission(value = {PermissionConstant.MDB_BUSINESS_COST_ITEM_UPDATE}) + @RequestMapping(value = "dragProduct", method = {RequestMethod.PATCH, RequestMethod.PUT}) + @Operation(summary = "产品拖拽排序", method = "PATCH") + public Response dragProduct(@RequestBody @Validated ProductDragCmd productDragCmd) { + productService.drag(productDragCmd); + return Response.buildSuccess(); + } +} diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/assembler/ProductAssembler.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/assembler/ProductAssembler.java new file mode 100644 index 0000000..fe72b32 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/assembler/ProductAssembler.java @@ -0,0 +1,17 @@ +package com.xunhong.erp.turbo.biz.app.assembler; + +import com.xunhong.erp.turbo.api.biz.dto.vo.ProductVO; +import com.xunhong.erp.turbo.biz.domain.entity.Product; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.NullValueCheckStrategy; + +/** + * @author shenyifei + */ +@Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) +public interface ProductAssembler { + + @Mapping(target = "costItemVOList", source = "costItemList") + ProductVO toProductVO(Product product); +} diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/cmd/ProductCreateCmdExe.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/cmd/ProductCreateCmdExe.java new file mode 100644 index 0000000..17e5969 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/cmd/ProductCreateCmdExe.java @@ -0,0 +1,29 @@ +package com.xunhong.erp.turbo.biz.app.executor.cmd; + +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductCreateCmd; +import com.xunhong.erp.turbo.api.biz.dto.vo.ProductVO; +import com.xunhong.erp.turbo.biz.app.assembler.ProductAssembler; +import com.xunhong.erp.turbo.biz.domain.entity.Product; +import com.xunhong.erp.turbo.biz.domain.gateway.ProductGateway; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author shenyifei + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ProductCreateCmdExe { + + private final ProductAssembler productAssembler; + private final ProductGateway productGateway; + + public ProductVO execute(ProductCreateCmd productCreateCmd) { + Product product = productGateway.save(productCreateCmd); + + return productAssembler.toProductVO(product); + } +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/cmd/ProductDestroyCmdExe.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/cmd/ProductDestroyCmdExe.java new file mode 100644 index 0000000..25cf110 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/cmd/ProductDestroyCmdExe.java @@ -0,0 +1,23 @@ +package com.xunhong.erp.turbo.biz.app.executor.cmd; + +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductDestroyCmd; +import com.xunhong.erp.turbo.biz.app.assembler.ProductAssembler; +import com.xunhong.erp.turbo.biz.domain.gateway.ProductGateway; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author shenyifei + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ProductDestroyCmdExe { + private final ProductGateway productGateway; + + public void execute(ProductDestroyCmd productDestroyCmd) { + productGateway.destroy(productDestroyCmd); + } +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/cmd/ProductUpdateCmdExe.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/cmd/ProductUpdateCmdExe.java new file mode 100644 index 0000000..6a71077 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/cmd/ProductUpdateCmdExe.java @@ -0,0 +1,27 @@ +package com.xunhong.erp.turbo.biz.app.executor.cmd; + +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductUpdateCmd; +import com.xunhong.erp.turbo.api.biz.dto.vo.ProductVO; +import com.xunhong.erp.turbo.biz.app.assembler.ProductAssembler; +import com.xunhong.erp.turbo.biz.domain.entity.Product; +import com.xunhong.erp.turbo.biz.domain.gateway.ProductGateway; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author shenyifei + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ProductUpdateCmdExe { + + private final ProductAssembler productAssembler; + private final ProductGateway productGateway; + + public ProductVO execute(ProductUpdateCmd productUpdateCmd) { + Product product = productGateway.update(productUpdateCmd); + return productAssembler.toProductVO(product); + } +} diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ProductDragCmdExe.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ProductDragCmdExe.java new file mode 100644 index 0000000..d6a69a0 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ProductDragCmdExe.java @@ -0,0 +1,21 @@ +package com.xunhong.erp.turbo.biz.app.executor.query; + +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductDragCmd; +import com.xunhong.erp.turbo.biz.domain.gateway.ProductGateway; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author shenyifei + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ProductDragCmdExe { + private final ProductGateway productGateway; + + public void execute(ProductDragCmd productDragCmd) { + productGateway.drag(productDragCmd); + } +} \ No newline at end of file diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ProductListQryExe.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ProductListQryExe.java new file mode 100644 index 0000000..c14b8c1 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ProductListQryExe.java @@ -0,0 +1,30 @@ +package com.xunhong.erp.turbo.biz.app.executor.query; + +import com.xunhong.erp.turbo.api.biz.dto.qry.ProductListQry; +import com.xunhong.erp.turbo.api.biz.dto.vo.ProductVO; +import com.xunhong.erp.turbo.biz.app.assembler.ProductAssembler; +import com.xunhong.erp.turbo.biz.domain.entity.Product; +import com.xunhong.erp.turbo.biz.domain.gateway.ProductGateway; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author shenyifei + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ProductListQryExe { + + private final ProductGateway productGateway; + private final ProductAssembler productAssembler; + + public List execute(ProductListQry productListQry) { + List productList = productGateway.list(productListQry); + return productList.stream().map(productAssembler::toProductVO).toList(); + } +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ProductPageQryExe.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ProductPageQryExe.java new file mode 100644 index 0000000..485747c --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ProductPageQryExe.java @@ -0,0 +1,29 @@ +package com.xunhong.erp.turbo.biz.app.executor.query; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.xunhong.erp.turbo.api.biz.dto.qry.ProductPageQry; +import com.xunhong.erp.turbo.api.biz.dto.vo.ProductVO; +import com.xunhong.erp.turbo.biz.app.assembler.ProductAssembler; +import com.xunhong.erp.turbo.biz.domain.entity.Product; +import com.xunhong.erp.turbo.biz.domain.gateway.ProductGateway; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author shenyifei + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ProductPageQryExe { + + private final ProductGateway productGateway; + private final ProductAssembler productAssembler; + + public IPage execute(ProductPageQry productPageQry) { + IPage page = productGateway.page(productPageQry); + return page.convert(productAssembler::toProductVO); + } +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ProductShowQryExe.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ProductShowQryExe.java new file mode 100644 index 0000000..2e16e21 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ProductShowQryExe.java @@ -0,0 +1,29 @@ +package com.xunhong.erp.turbo.biz.app.executor.query; + +import com.xunhong.erp.turbo.api.biz.dto.qry.ProductShowQry; +import com.xunhong.erp.turbo.api.biz.dto.vo.ProductVO; +import com.xunhong.erp.turbo.biz.app.assembler.ProductAssembler; +import com.xunhong.erp.turbo.biz.domain.entity.Product; +import com.xunhong.erp.turbo.biz.domain.gateway.ProductGateway; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author shenyifei + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ProductShowQryExe { + + private final ProductAssembler productAssembler; + private final ProductGateway productGateway; + + public ProductVO execute(ProductShowQry productShowQry) { + Product product = productGateway.show(productShowQry); + + return productAssembler.toProductVO(product); + } +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/service/ProductServiceImpl.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/service/ProductServiceImpl.java new file mode 100644 index 0000000..5868342 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/service/ProductServiceImpl.java @@ -0,0 +1,78 @@ +package com.xunhong.erp.turbo.biz.app.service; + +import com.xunhong.erp.turbo.api.biz.api.ProductServiceI; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductCreateCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductDestroyCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductUpdateCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductDragCmd; +import com.xunhong.erp.turbo.api.biz.dto.qry.ProductListQry; +import com.xunhong.erp.turbo.api.biz.dto.qry.ProductPageQry; +import com.xunhong.erp.turbo.api.biz.dto.qry.ProductShowQry; +import com.xunhong.erp.turbo.api.biz.dto.vo.ProductVO; +import com.xunhong.erp.turbo.base.dto.PageDTO; +import com.xunhong.erp.turbo.biz.app.executor.cmd.ProductCreateCmdExe; +import com.xunhong.erp.turbo.biz.app.executor.cmd.ProductDestroyCmdExe; +import com.xunhong.erp.turbo.biz.app.executor.cmd.ProductUpdateCmdExe; +import com.xunhong.erp.turbo.biz.app.executor.query.ProductListQryExe; +import com.xunhong.erp.turbo.biz.app.executor.query.ProductPageQryExe; +import com.xunhong.erp.turbo.biz.app.executor.query.ProductShowQryExe; +import com.xunhong.erp.turbo.biz.app.executor.query.ProductDragCmdExe; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author shenyifei + */ +@Slf4j +@Service +@DubboService(interfaceClass = ProductServiceI.class, version = "1.0.0") +@RequiredArgsConstructor +public class ProductServiceImpl implements ProductServiceI { + + private final ProductCreateCmdExe productCreateCmdExe; + private final ProductUpdateCmdExe productUpdateCmdExe; + private final ProductPageQryExe productPageQryExe; + private final ProductListQryExe productListQryExe; + private final ProductShowQryExe productShowQryExe; + private final ProductDestroyCmdExe productDestroyCmdExe; + private final ProductDragCmdExe productDragCmdExe; + + @Override + public ProductVO create(ProductCreateCmd productCreateCmd) { + return productCreateCmdExe.execute(productCreateCmd); + } + + @Override + public PageDTO page(ProductPageQry productPageQry) { + return PageDTO.of(productPageQryExe.execute(productPageQry)); + } + + @Override + public List list(ProductListQry productListQry) { + return productListQryExe.execute(productListQry); + } + + @Override + public ProductVO update(ProductUpdateCmd productUpdateCmd) { + return productUpdateCmdExe.execute(productUpdateCmd); + } + + @Override + public ProductVO show(ProductShowQry productShowQry) { + return productShowQryExe.execute(productShowQry); + } + + @Override + public void destroy(ProductDestroyCmd productDestroyCmd) { + productDestroyCmdExe.execute(productDestroyCmd); + } + + @Override + public void drag(ProductDragCmd productDragCmd) { + productDragCmdExe.execute(productDragCmd); + } +} \ No newline at end of file diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/domain/entity/Product.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/domain/entity/Product.java new file mode 100644 index 0000000..ceba8aa --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/domain/entity/Product.java @@ -0,0 +1,61 @@ +package com.xunhong.erp.turbo.biz.domain.entity; + +import com.alibaba.cola.domain.Entity; +import com.alibaba.cola.dto.DTO; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.*; +import java.time.*; +import java.util.List; + +/** + * @author shenyifei + */ +@Data +@Entity +@EqualsAndHashCode(callSuper = true) +public class Product extends DTO { + + /** + * 产品ID + */ + private Long productId; + + /** + * 产品名称 + */ + private String name; + + /** + * 关联成本费用id + */ + private List costItemIds; + + /** + * 备注 + */ + private String remark; + + /** + * 排序号 + */ + private BigDecimal sort; + + /** + * 状态:1_启用;0_禁用 + */ + private Boolean status; + + /** + * 成本费用列表 + */ + private List costItemList; + + /** + * 创建时间 + */ + private LocalDateTime createdAt; + +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/domain/gateway/ProductGateway.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/domain/gateway/ProductGateway.java new file mode 100644 index 0000000..55dd14c --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/domain/gateway/ProductGateway.java @@ -0,0 +1,32 @@ +package com.xunhong.erp.turbo.biz.domain.gateway; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductCreateCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductDestroyCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductUpdateCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductDragCmd; +import com.xunhong.erp.turbo.api.biz.dto.qry.ProductListQry; +import com.xunhong.erp.turbo.api.biz.dto.qry.ProductPageQry; +import com.xunhong.erp.turbo.api.biz.dto.qry.ProductShowQry; +import com.xunhong.erp.turbo.biz.domain.entity.Product; + +import java.util.List; + +/** + * @author shenyifei + */ +public interface ProductGateway { + Product save(ProductCreateCmd productCreateCmd); + + IPage page(ProductPageQry productPageQry); + + List list(ProductListQry productListQry); + + Product update(ProductUpdateCmd productUpdateCmd); + + Product show(ProductShowQry productShowQry); + + void destroy(ProductDestroyCmd productDestroyCmd); + + void drag(ProductDragCmd productDragCmd); +} \ No newline at end of file diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/convert/ProductConvert.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/convert/ProductConvert.java new file mode 100644 index 0000000..99bd854 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/convert/ProductConvert.java @@ -0,0 +1,35 @@ +package com.xunhong.erp.turbo.biz.infrastructure.convert; + +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductCreateCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductUpdateCmd; +import com.xunhong.erp.turbo.biz.domain.entity.Product; +import com.xunhong.erp.turbo.biz.infrastructure.entity.ProductDO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.MappingTarget; +import org.mapstruct.NullValueCheckStrategy; + +/** + * @author shenyifei + */ +@Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) +public interface ProductConvert { + + @Mapping(target = "costItemList", source = "costItemDOList") + Product toProduct(ProductDO productDO); + + @Mapping(target = "costItemDOList", ignore = true) + @Mapping(target = "version", ignore = true) + @Mapping(target = "updatedAt", ignore = true) + @Mapping(target = "isDelete", ignore = true) + @Mapping(target = "createdAt", ignore = true) + ProductDO toProductDO(ProductCreateCmd productCreateCmd); + + @Mapping(target = "costItemDOList", ignore = true) + @Mapping(target = "version", ignore = true) + @Mapping(target = "updatedAt", ignore = true) + @Mapping(target = "isDelete", ignore = true) + @Mapping(target = "createdAt", ignore = true) + void toProductDO(@MappingTarget ProductDO productDO, ProductUpdateCmd productUpdateCmd); +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/entity/ProductDO.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/entity/ProductDO.java new file mode 100644 index 0000000..ccac7a3 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/entity/ProductDO.java @@ -0,0 +1,70 @@ +package com.xunhong.erp.turbo.biz.infrastructure.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import com.xunhong.erp.turbo.datasource.domain.entity.BaseDO; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author shenyifei + */ +@Data +@TableName(value = "product", autoResultMap = true) +@EqualsAndHashCode(callSuper = true) +public class ProductDO extends BaseDO { + + /** + * 产品ID + */ + @TableId(value = "product_id", type = IdType.ASSIGN_ID) + private Long productId; + + /** + * 产品名称 + */ + @TableField(value = "name") + private String name; + + /** + * 关联成本费用id + */ + @TableField(value = "cost_item_ids", typeHandler = JacksonTypeHandler.class) + private List costItemIds; + + /** + * 备注 + */ + @TableField(value = "remark") + private String remark; + + /** + * 排序号 + */ + @TableField(value = "sort") + private BigDecimal sort; + + /** + * 状态:1_启用;0_禁用 + */ + @TableField(value = "status") + private Boolean status; + + @TableField(exist = false) + private List costItemDOList; + + /** + * 创建时间 + */ + @TableField(value = "created_at") + private LocalDateTime createdAt; + +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/gateway/CompanyGatewayImpl.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/gateway/CompanyGatewayImpl.java index 8444ff5..c559ea6 100644 --- a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/gateway/CompanyGatewayImpl.java +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/gateway/CompanyGatewayImpl.java @@ -14,6 +14,7 @@ import com.xunhong.erp.turbo.api.biz.dto.qry.CompanyShowQry; import com.xunhong.erp.turbo.biz.domain.entity.Company; import com.xunhong.erp.turbo.biz.domain.gateway.CompanyGateway; import com.xunhong.erp.turbo.biz.infrastructure.convert.CompanyConvert; +import com.xunhong.erp.turbo.biz.infrastructure.entity.BoxProductDO; import com.xunhong.erp.turbo.biz.infrastructure.entity.CompanyDO; import com.xunhong.erp.turbo.biz.infrastructure.mapper.CompanyMapper; import lombok.RequiredArgsConstructor; diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/gateway/ProductGatewayImpl.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/gateway/ProductGatewayImpl.java new file mode 100644 index 0000000..c42edea --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/gateway/ProductGatewayImpl.java @@ -0,0 +1,167 @@ +package com.xunhong.erp.turbo.biz.infrastructure.gateway; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductCreateCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductDestroyCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductDragCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductUpdateCmd; +import com.xunhong.erp.turbo.api.biz.dto.qry.ProductListQry; +import com.xunhong.erp.turbo.api.biz.dto.qry.ProductPageQry; +import com.xunhong.erp.turbo.api.biz.dto.qry.ProductShowQry; +import com.xunhong.erp.turbo.biz.domain.entity.Product; +import com.xunhong.erp.turbo.biz.domain.gateway.ProductGateway; +import com.xunhong.erp.turbo.biz.infrastructure.convert.ProductConvert; +import com.xunhong.erp.turbo.biz.infrastructure.entity.CostItemDO; +import com.xunhong.erp.turbo.biz.infrastructure.entity.ProductDO; +import com.xunhong.erp.turbo.biz.infrastructure.mapper.CostItemMapper; +import com.xunhong.erp.turbo.biz.infrastructure.mapper.ProductMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author shenyifei + */ +@Repository +@RequiredArgsConstructor +public class ProductGatewayImpl implements ProductGateway { + private final ProductMapper productMapper; + private final ProductConvert productConvert; + + private final CostItemMapper costItemMapper; + + @Override + public Product save(ProductCreateCmd productCreateCmd) { + ProductDO productDO = productConvert.toProductDO(productCreateCmd); + productMapper.insert(productDO); + + return productConvert.toProduct(productDO); + } + + @Override + public IPage page(ProductPageQry productPageQry) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(ProductDO.class); + queryWrapper.eq(Objects.nonNull(productPageQry.getStatus()), ProductDO::getStatus, productPageQry.getStatus()); + + queryWrapper.orderByAsc(ProductDO::getSort); + queryWrapper.orderByDesc(ProductDO::getCreatedAt); + IPage page = new Page<>(productPageQry.getPageIndex(), productPageQry.getPageSize()); + page = productMapper.selectPage(page, queryWrapper); + + return page.convert(productConvert::toProduct); + } + + @Override + public List list(ProductListQry productListQry) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(ProductDO.class); + queryWrapper.eq(Objects.nonNull(productListQry.getStatus()), ProductDO::getStatus, productListQry.getStatus()); + + queryWrapper.orderByAsc(ProductDO::getSort); + queryWrapper.orderByDesc(ProductDO::getCreatedAt); + List productDOList = productMapper.selectList(queryWrapper); + + Set costItemIdList = productDOList.stream().map(ProductDO::getCostItemIds).flatMap(List::stream).collect(Collectors.toSet()); + if (CollUtil.isNotEmpty(costItemIdList)) { + LambdaQueryWrapper queryWrapper1 = Wrappers.lambdaQuery(CostItemDO.class); + queryWrapper1.in(CostItemDO::getItemId, costItemIdList); + List costItemDOList = costItemMapper.selectList(queryWrapper1); + + productDOList.forEach(productDO -> { + productDO.setCostItemDOList(costItemDOList.stream().filter(costItemDO -> productDO.getCostItemIds().contains(costItemDO.getItemId())).toList()); + }); + } + + return productDOList.stream().map(productConvert::toProduct).toList(); + } + + @Override + public Product update(ProductUpdateCmd productUpdateCmd) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(ProductDO.class); + queryWrapper.eq(ProductDO::getProductId, productUpdateCmd.getProductId()); + queryWrapper.last("limit 1"); + + ProductDO productDO = productMapper.selectOne(queryWrapper); + + productConvert.toProductDO(productDO, productUpdateCmd); + productMapper.updateById(productDO); + + return productConvert.toProduct(productDO); + } + + @Override + public Product show(ProductShowQry productShowQry) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(ProductDO.class); + queryWrapper.eq(ProductDO::getProductId, productShowQry.getProductId()); + queryWrapper.last("limit 1"); + + ProductDO productDO = productMapper.selectOne(queryWrapper); + return productConvert.toProduct(productDO); + } + + @Override + public void destroy(ProductDestroyCmd productDestroyCmd) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(ProductDO.class); + queryWrapper.eq(ProductDO::getProductId, productDestroyCmd.getProductId()); + queryWrapper.last("limit 1"); + + ProductDO productDO = productMapper.selectOne(queryWrapper); + productDO.deleteById(); + } + + @Override + @Transactional + public void drag(ProductDragCmd productDragCmd) { + reorderTask(productDragCmd.getCurrentId(), productDragCmd.getPrevId(), productDragCmd.getNextId()); + } + + // 拖拽排序核心方法 + public void reorderTask(Long currentId, Long prevId, Long nextId) { + // 获取相邻元素的sort值 + Double prevSort = Optional.ofNullable(prevId) + .map(id -> productMapper.selectById(id).getSort().doubleValue()) + .orElse(null); + Double nextSort = Optional.ofNullable(nextId) + .map(id -> productMapper.selectById(id).getSort().doubleValue()) + .orElse(null); + // 计算新sort值 + Double newSort = calculateNewSort(prevSort, nextSort); + // 检查是否需要重整排序 + if (needResetSort(prevSort, nextSort)) { + productMapper.batchResetSort(productMapper.selectById(currentId).getProductId()); + } else { + // 更新当前任务sort值 + productMapper.update(null, new LambdaUpdateWrapper() + .eq(ProductDO::getProductId, currentId) + .set(ProductDO::getSort, newSort) + ); + } + } + + private Double calculateNewSort(Double prevSort, Double nextSort) { + if (prevSort == null && nextSort != null) { + return nextSort - 1000; // 插入到开头 + } else if (nextSort == null && prevSort != null) { + return prevSort + 1000; // 插入到末尾 + } else if (prevSort == null && nextSort == null) { + return 0.0; + } else { + return (prevSort + nextSort) / 2; // 插入中间 + } + } + + private boolean needResetSort(Double prevSort, Double nextSort) { + return prevSort != null && nextSort != null + && (nextSort - prevSort) < 1.0; // 判断间隙是否耗尽 + } +} diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/ProductMapper.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/ProductMapper.java new file mode 100644 index 0000000..a12556b --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/ProductMapper.java @@ -0,0 +1,23 @@ +package com.xunhong.erp.turbo.biz.infrastructure.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xunhong.erp.turbo.biz.infrastructure.entity.ProductDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +import java.util.List; + +/** + * @author shenyifei + */ +@Mapper +public interface ProductMapper extends BaseMapper { + /** + * 批量重置排序 + * + * @param productId 产品ID + */ + @Update("UPDATE product SET sort = (product_id * 1000) WHERE product_id = #{productId}") + void batchResetSort(@Param("productId") Long productId); +} \ No newline at end of file diff --git a/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/ProductMapper.xml b/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/ProductMapper.xml new file mode 100644 index 0000000..4514eb1 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/ProductMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/api/ProductServiceI.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/api/ProductServiceI.java new file mode 100644 index 0000000..6da1d3e --- /dev/null +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/api/ProductServiceI.java @@ -0,0 +1,32 @@ +package com.xunhong.erp.turbo.api.biz.api; + +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductCreateCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductDestroyCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductUpdateCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ProductDragCmd; +import com.xunhong.erp.turbo.api.biz.dto.qry.ProductListQry; +import com.xunhong.erp.turbo.api.biz.dto.qry.ProductPageQry; +import com.xunhong.erp.turbo.api.biz.dto.qry.ProductShowQry; +import com.xunhong.erp.turbo.api.biz.dto.vo.ProductVO; +import com.xunhong.erp.turbo.base.dto.PageDTO; + +import java.util.List; + +/** + * @author shenyifei + */ +public interface ProductServiceI { + ProductVO create(ProductCreateCmd productCreateCmd); + + PageDTO page(ProductPageQry productPageQry); + + List list(ProductListQry productListQry); + + ProductVO update(ProductUpdateCmd productUpdateCmd); + + ProductVO show(ProductShowQry productShowQry); + + void destroy(ProductDestroyCmd productDestroyCmd); + + void drag(ProductDragCmd productDragCmd); +} \ No newline at end of file diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ProductCreateCmd.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ProductCreateCmd.java new file mode 100644 index 0000000..fb92f93 --- /dev/null +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ProductCreateCmd.java @@ -0,0 +1,63 @@ +package com.xunhong.erp.turbo.api.biz.dto.cmd; + +import com.xunhong.erp.turbo.base.dto.Command; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.*; +import java.time.*; +import java.util.List; + +/** + * @author shenyifei + */ +@Data +@Schema(title = "产品表创建") +@EqualsAndHashCode(callSuper = true) +public class ProductCreateCmd extends Command { + + /** + * 产品ID + */ + @Schema(title = "产品ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED) + private Long productId; + + /** + * 产品名称 + */ + @Schema(title = "产品名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String name; + + /** + * 关联成本费用id + */ + @Schema(title = "关联成本费用id") + private List costItemIds; + + /** + * 备注 + */ + @Schema(title = "备注") + private String remark; + + /** + * 排序号 + */ + @Schema(title = "排序号", requiredMode = Schema.RequiredMode.REQUIRED) + private BigDecimal sort; + + /** + * 状态:1_启用;0_禁用 + */ + @Schema(title = "状态:1_启用;0_禁用", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean status; + + /** + * 创建时间 + */ + @Schema(title = "创建时间") + private LocalDateTime createdAt; + +} + diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ProductDestroyCmd.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ProductDestroyCmd.java new file mode 100644 index 0000000..186fbc2 --- /dev/null +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ProductDestroyCmd.java @@ -0,0 +1,19 @@ +package com.xunhong.erp.turbo.api.biz.dto.cmd; + +import com.xunhong.erp.turbo.base.dto.Command; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author shenyifei + */ +@Data +@Schema(title = "删除产品表") +@EqualsAndHashCode(callSuper = true) +public class ProductDestroyCmd extends Command { + + @Schema(title = "产品表ID", requiredMode = Schema.RequiredMode.REQUIRED, type = "string") + private Long productId; +} + diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ProductDragCmd.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ProductDragCmd.java new file mode 100644 index 0000000..309ff1d --- /dev/null +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ProductDragCmd.java @@ -0,0 +1,33 @@ +package com.xunhong.erp.turbo.api.biz.dto.cmd; + +import com.xunhong.erp.turbo.base.dto.Command; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author shenyifei + */ +@Data +@Schema(title = "产品拖拽") +@EqualsAndHashCode(callSuper = true) +public class ProductDragCmd extends Command { + + /** + * 相邻元素 + */ + @Schema(title = "相邻元素前") + private Long prevId; + + /** + * 相邻元素 + */ + @Schema(title = "相邻元素后") + private Long nextId; + + /** + * 当前元素 + */ + @Schema(title = "当前元素") + private Long currentId; +} \ No newline at end of file diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ProductUpdateCmd.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ProductUpdateCmd.java new file mode 100644 index 0000000..93e1350 --- /dev/null +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ProductUpdateCmd.java @@ -0,0 +1,18 @@ +package com.xunhong.erp.turbo.api.biz.dto.cmd; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author shenyifei + */ +@Data +@Schema(title = "产品表更新") +@EqualsAndHashCode(callSuper = true) +public class ProductUpdateCmd extends ProductCreateCmd { + + @Schema(title = "产品表ID", requiredMode = Schema.RequiredMode.REQUIRED, type = "string") + private Long productId; +} + diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/ProductListQry.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/ProductListQry.java new file mode 100644 index 0000000..685bfb9 --- /dev/null +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/ProductListQry.java @@ -0,0 +1,19 @@ +package com.xunhong.erp.turbo.api.biz.dto.qry; + +import com.xunhong.erp.turbo.base.dto.Query; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author shenyifei + */ +@Data +@Schema(title = "产品表列表查询") +@EqualsAndHashCode(callSuper = true) +public class ProductListQry extends Query { + + @Schema(title = "产品表ID", type = "string") + private Long productId; +} + diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/ProductPageQry.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/ProductPageQry.java new file mode 100644 index 0000000..c79c43d --- /dev/null +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/ProductPageQry.java @@ -0,0 +1,19 @@ +package com.xunhong.erp.turbo.api.biz.dto.qry; + +import com.xunhong.erp.turbo.base.dto.PageQuery; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author shenyifei + */ +@Data +@Schema(title = "产品表分页查询") +@EqualsAndHashCode(callSuper = true) +public class ProductPageQry extends PageQuery { + + @Schema(title = "产品表ID", type = "string") + private Long productId; +} + diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/ProductShowQry.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/ProductShowQry.java new file mode 100644 index 0000000..95814d3 --- /dev/null +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/ProductShowQry.java @@ -0,0 +1,19 @@ +package com.xunhong.erp.turbo.api.biz.dto.qry; + +import com.xunhong.erp.turbo.base.dto.Query; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author shenyifei + */ +@Data +@Schema(title = "产品表查询") +@EqualsAndHashCode(callSuper = true) +public class ProductShowQry extends Query { + + @Schema(title = "产品表ID", type = "string") + private Long productId; +} + diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/vo/ProductVO.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/vo/ProductVO.java new file mode 100644 index 0000000..2de06d2 --- /dev/null +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/vo/ProductVO.java @@ -0,0 +1,69 @@ +package com.xunhong.erp.turbo.api.biz.dto.vo; + +import com.alibaba.cola.dto.DTO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.*; +import java.time.*; +import java.util.List; + +/** + * @author shenyifei + */ +@Data +@Schema(title = "产品表") +@EqualsAndHashCode(callSuper = true) +public class ProductVO extends DTO { + + /** + * 产品ID + */ + @Schema(title = "产品ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED) + private Long productId; + + /** + * 产品名称 + */ + @Schema(title = "产品名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String name; + + /** + * 关联成本费用id + */ + @Schema(title = "关联成本费用id") + private List costItemIds; + + /** + * 备注 + */ + @Schema(title = "备注") + private String remark; + + /** + * 排序号 + */ + @Schema(title = "排序号", requiredMode = Schema.RequiredMode.REQUIRED) + private BigDecimal sort; + + /** + * 状态:1_启用;0_禁用 + */ + @Schema(title = "状态:1_启用;0_禁用", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean status; + + /** + * 成本费用 + */ + @Schema(title = "成本费用") + private List costItemVOList; + + /** + * 创建时间 + */ + @Schema(title = "创建时间") + private LocalDateTime createdAt; + +} +