diff --git a/.claude/skills/add-enum-field/SKILL.md b/.claude/skills/add-enum-field/SKILL.md index 2fbb06e..1e99cfe 100644 --- a/.claude/skills/add-enum-field/SKILL.md +++ b/.claude/skills/add-enum-field/SKILL.md @@ -1,5 +1,5 @@ --- -name: "Add Enum Field" +name: "add-enum-field" description: "Add enum field to ERPTurbo project entities following DDD layered architecture. Automatically creates enum class, updates DO, VO, Cmd, and Domain Entity with proper type mapping and MyBatis annotations." --- diff --git a/.claude/skills/add-field/SKILL.md b/.claude/skills/add-field/SKILL.md index 16be932..87a33f0 100644 --- a/.claude/skills/add-field/SKILL.md +++ b/.claude/skills/add-field/SKILL.md @@ -1,5 +1,5 @@ --- -name: "Add Database Field" +name: "add-database-field" description: "Standardized field addition tool for ERPTurbo project. Automatically adds fields to DO, VO, Cmd, and Domain Entity classes with proper type mapping, annotations, and generates DDL migration script. Supports snake_case to camelCase conversion, BigDecimal for decimal types, and proper Java imports." --- diff --git a/erp-turbo-admin/src/main/java/com/xunhong/erp/turbo/admin/controller/ReconciliationController.java b/erp-turbo-admin/src/main/java/com/xunhong/erp/turbo/admin/controller/ReconciliationController.java new file mode 100644 index 0000000..adff4be --- /dev/null +++ b/erp-turbo-admin/src/main/java/com/xunhong/erp/turbo/admin/controller/ReconciliationController.java @@ -0,0 +1,79 @@ +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.ReconciliationServiceI; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationCreateCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationDestroyCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationUpdateCmd; +import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationListQry; +import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPageQry; +import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationShowQry; +import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationVO; +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 = "Reconciliation", description = "对账管理") +@RestController("operationReconciliationController") +@RequestMapping(value = "/operation") +@RequiredArgsConstructor +public class ReconciliationController { + + @DubboReference(version = "1.0.0") + private final ReconciliationServiceI reconciliationService; + + @SaCheckLogin + @GetMapping("listReconciliation") + @Operation(summary = "对账列表", method = "GET") + public MultiResponse listReconciliation(@ModelAttribute @Validated ReconciliationListQry reconciliationListQry) { + return MultiResponse.of(reconciliationService.list(reconciliationListQry)); + } + + @SaCheckLogin + @PostMapping("createReconciliation") + @Operation(summary = "创建对账", method = "POST") + public SingleResponse createReconciliation(@RequestBody @Validated ReconciliationCreateCmd reconciliationCreateCmd) { + return SingleResponse.of(reconciliationService.create(reconciliationCreateCmd)); + } + + @SaCheckLogin + @GetMapping("showReconciliation") + @Operation(summary = "对账详情", method = "GET") + public SingleResponse showReconciliation(@ModelAttribute @Validated ReconciliationShowQry reconciliationShowQry) { + return SingleResponse.of(reconciliationService.show(reconciliationShowQry)); + } + + @SaCheckLogin + @GetMapping("pageReconciliation") + @Operation(summary = "对账列表", method = "GET") + public PageResponse pageReconciliation(@ModelAttribute @Validated ReconciliationPageQry reconciliationPageQry) { + PageDTO page = reconciliationService.page(reconciliationPageQry); + return PageResponse.of(page.getRecords(), (int) page.getTotal(), (int) page.getSize(), (int) page.getCurrent()); + } + + @SaCheckLogin + @RequestMapping(value = "updateReconciliation", method = {RequestMethod.PATCH, RequestMethod.PUT}) + @Operation(summary = "对账更新", method = "PATCH") + public SingleResponse updateReconciliation(@RequestBody @Validated ReconciliationUpdateCmd reconciliationUpdateCmd) { + return SingleResponse.of(reconciliationService.update(reconciliationUpdateCmd)); + } + + @SaCheckLogin + @DeleteMapping("destroyReconciliation") + @Operation(summary = "对账删除", method = "DELETE") + public Response destroyReconciliation(@RequestBody @Validated ReconciliationDestroyCmd reconciliationDestroyCmd) { + reconciliationService.destroy(reconciliationDestroyCmd); + return Response.buildSuccess(); + } +} diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/assembler/ReconciliationAssembler.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/assembler/ReconciliationAssembler.java new file mode 100644 index 0000000..da3aa1a --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/assembler/ReconciliationAssembler.java @@ -0,0 +1,19 @@ +package com.xunhong.erp.turbo.biz.app.assembler; + +import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationVO; +import com.xunhong.erp.turbo.biz.domain.entity.Reconciliation; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.NullValueCheckStrategy; + +/** + * @author shenyifei + */ +@Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) +public interface ReconciliationAssembler { + + @Mapping(target = "dealerVO", source = "dealer") + @Mapping(target = "companyVO", source = "company") + @Mapping(target = "orderShipVOList", source = "orderShipList") + ReconciliationVO toReconciliationVO(Reconciliation reconciliation); +} diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/cmd/ReconciliationCreateCmdExe.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/cmd/ReconciliationCreateCmdExe.java new file mode 100644 index 0000000..d1f0972 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/cmd/ReconciliationCreateCmdExe.java @@ -0,0 +1,29 @@ +package com.xunhong.erp.turbo.biz.app.executor.cmd; + +import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationCreateCmd; +import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationVO; +import com.xunhong.erp.turbo.biz.app.assembler.ReconciliationAssembler; +import com.xunhong.erp.turbo.biz.domain.entity.Reconciliation; +import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationGateway; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author shenyifei + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ReconciliationCreateCmdExe { + + private final ReconciliationAssembler reconciliationAssembler; + private final ReconciliationGateway reconciliationGateway; + + public ReconciliationVO execute(ReconciliationCreateCmd reconciliationCreateCmd) { + Reconciliation reconciliation = reconciliationGateway.save(reconciliationCreateCmd); + + return reconciliationAssembler.toReconciliationVO(reconciliation); + } +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/cmd/ReconciliationDestroyCmdExe.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/cmd/ReconciliationDestroyCmdExe.java new file mode 100644 index 0000000..3fd0f68 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/cmd/ReconciliationDestroyCmdExe.java @@ -0,0 +1,22 @@ +package com.xunhong.erp.turbo.biz.app.executor.cmd; + +import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationDestroyCmd; +import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationGateway; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author shenyifei + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ReconciliationDestroyCmdExe { + private final ReconciliationGateway reconciliationGateway; + + public void execute(ReconciliationDestroyCmd reconciliationDestroyCmd) { + reconciliationGateway.destroy(reconciliationDestroyCmd); + } +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/cmd/ReconciliationUpdateCmdExe.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/cmd/ReconciliationUpdateCmdExe.java new file mode 100644 index 0000000..67cad9d --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/cmd/ReconciliationUpdateCmdExe.java @@ -0,0 +1,27 @@ +package com.xunhong.erp.turbo.biz.app.executor.cmd; + +import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationUpdateCmd; +import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationVO; +import com.xunhong.erp.turbo.biz.app.assembler.ReconciliationAssembler; +import com.xunhong.erp.turbo.biz.domain.entity.Reconciliation; +import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationGateway; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author shenyifei + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ReconciliationUpdateCmdExe { + + private final ReconciliationAssembler reconciliationAssembler; + private final ReconciliationGateway reconciliationGateway; + + public ReconciliationVO execute(ReconciliationUpdateCmd reconciliationUpdateCmd) { + Reconciliation reconciliation = reconciliationGateway.update(reconciliationUpdateCmd); + return reconciliationAssembler.toReconciliationVO(reconciliation); + } +} diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ReconciliationListQryExe.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ReconciliationListQryExe.java new file mode 100644 index 0000000..0b73ed3 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ReconciliationListQryExe.java @@ -0,0 +1,30 @@ +package com.xunhong.erp.turbo.biz.app.executor.query; + +import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationListQry; +import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationVO; +import com.xunhong.erp.turbo.biz.app.assembler.ReconciliationAssembler; +import com.xunhong.erp.turbo.biz.domain.entity.Reconciliation; +import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationGateway; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author shenyifei + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ReconciliationListQryExe { + + private final ReconciliationGateway reconciliationGateway; + private final ReconciliationAssembler reconciliationAssembler; + + public List execute(ReconciliationListQry reconciliationListQry) { + List reconciliationList = reconciliationGateway.list(reconciliationListQry); + return reconciliationList.stream().map(reconciliationAssembler::toReconciliationVO).toList(); + } +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ReconciliationPageQryExe.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ReconciliationPageQryExe.java new file mode 100644 index 0000000..cb468d8 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ReconciliationPageQryExe.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.ReconciliationPageQry; +import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationVO; +import com.xunhong.erp.turbo.biz.app.assembler.ReconciliationAssembler; +import com.xunhong.erp.turbo.biz.domain.entity.Reconciliation; +import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationGateway; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author shenyifei + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ReconciliationPageQryExe { + + private final ReconciliationGateway reconciliationGateway; + private final ReconciliationAssembler reconciliationAssembler; + + public IPage execute(ReconciliationPageQry reconciliationPageQry) { + IPage page = reconciliationGateway.page(reconciliationPageQry); + return page.convert(reconciliationAssembler::toReconciliationVO); + } +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ReconciliationShowQryExe.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ReconciliationShowQryExe.java new file mode 100644 index 0000000..a20fed2 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/executor/query/ReconciliationShowQryExe.java @@ -0,0 +1,29 @@ +package com.xunhong.erp.turbo.biz.app.executor.query; + +import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationShowQry; +import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationVO; +import com.xunhong.erp.turbo.biz.app.assembler.ReconciliationAssembler; +import com.xunhong.erp.turbo.biz.domain.entity.Reconciliation; +import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationGateway; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author shenyifei + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ReconciliationShowQryExe { + + private final ReconciliationAssembler reconciliationAssembler; + private final ReconciliationGateway reconciliationGateway; + + public ReconciliationVO execute(ReconciliationShowQry reconciliationShowQry) { + Reconciliation reconciliation = reconciliationGateway.show(reconciliationShowQry); + + return reconciliationAssembler.toReconciliationVO(reconciliation); + } +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/service/ReconciliationServiceImpl.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/service/ReconciliationServiceImpl.java new file mode 100644 index 0000000..15e034a --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/app/service/ReconciliationServiceImpl.java @@ -0,0 +1,71 @@ +package com.xunhong.erp.turbo.biz.app.service; + +import com.xunhong.erp.turbo.api.biz.api.ReconciliationServiceI; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationCreateCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationDestroyCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationUpdateCmd; +import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationListQry; +import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPageQry; +import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationShowQry; +import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationVO; +import com.xunhong.erp.turbo.base.dto.PageDTO; +import com.xunhong.erp.turbo.biz.app.executor.cmd.ReconciliationCreateCmdExe; +import com.xunhong.erp.turbo.biz.app.executor.cmd.ReconciliationDestroyCmdExe; +import com.xunhong.erp.turbo.biz.app.executor.cmd.ReconciliationUpdateCmdExe; +import com.xunhong.erp.turbo.biz.app.executor.query.ReconciliationListQryExe; +import com.xunhong.erp.turbo.biz.app.executor.query.ReconciliationPageQryExe; +import com.xunhong.erp.turbo.biz.app.executor.query.ReconciliationShowQryExe; +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 = ReconciliationServiceI.class, version = "1.0.0") +@RequiredArgsConstructor +public class ReconciliationServiceImpl implements ReconciliationServiceI { + + private final ReconciliationCreateCmdExe reconciliationCreateCmdExe; + private final ReconciliationUpdateCmdExe reconciliationUpdateCmdExe; + private final ReconciliationPageQryExe reconciliationPageQryExe; + private final ReconciliationListQryExe reconciliationListQryExe; + private final ReconciliationShowQryExe reconciliationShowQryExe; + private final ReconciliationDestroyCmdExe reconciliationDestroyCmdExe; + + @Override + public ReconciliationVO create(ReconciliationCreateCmd reconciliationCreateCmd) { + return reconciliationCreateCmdExe.execute(reconciliationCreateCmd); + } + + @Override + public PageDTO page(ReconciliationPageQry reconciliationPageQry) { + return PageDTO.of(reconciliationPageQryExe.execute(reconciliationPageQry)); + } + + @Override + public List list(ReconciliationListQry reconciliationListQry) { + return reconciliationListQryExe.execute(reconciliationListQry); + } + + @Override + public ReconciliationVO update(ReconciliationUpdateCmd reconciliationUpdateCmd) { + return reconciliationUpdateCmdExe.execute(reconciliationUpdateCmd); + } + + @Override + public ReconciliationVO show(ReconciliationShowQry reconciliationShowQry) { + return reconciliationShowQryExe.execute(reconciliationShowQry); + } + + @Override + public void destroy(ReconciliationDestroyCmd reconciliationDestroyCmd) { + reconciliationDestroyCmdExe.execute(reconciliationDestroyCmd); + } +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/domain/entity/Reconciliation.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/domain/entity/Reconciliation.java new file mode 100644 index 0000000..798182b --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/domain/entity/Reconciliation.java @@ -0,0 +1,97 @@ +package com.xunhong.erp.turbo.biz.domain.entity; + +import com.alibaba.cola.domain.Entity; +import com.alibaba.cola.dto.DTO; +import com.xunhong.erp.turbo.api.biz.dto.enums.ReconciliationStateEnum; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author shenyifei + */ +@Data +@Entity +@EqualsAndHashCode(callSuper = true) +public class Reconciliation extends DTO { + + /** + * 对账ID + */ + private Long reconciliationId; + + /** + * 对账编码 + */ + private String reconciliationSn; + + /** + * 经销商ID + */ + private Long dealerId; + + /** + * 公司ID + */ + private Long companyId; + + /** + * 原对账金额 + */ + private BigDecimal originalAmount; + + /** + * 是否抹零 1是0否 + */ + private Boolean isRounding; + + /** + * 抹零金额 + */ + private BigDecimal roundingAmount; + + /** + * 抹零备注 + */ + private String roundingRemark; + + /** + * 对账金额 + */ + private BigDecimal reconciliationAmount; + + /** + * 状态: 0-待对账, 1-已对账, 2-部分开票, 3-已开票, 4-部分回款, 5-已回款 + */ + private ReconciliationStateEnum state; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private LocalDateTime createdAt; + + /** + * 对账详情 + */ + private List orderShipList; + + /** + * 公司信息 + */ + private Company company; + + /** + * 经销商信息 + */ + private Dealer dealer; + +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/domain/entity/ReconciliationItem.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/domain/entity/ReconciliationItem.java new file mode 100644 index 0000000..48a3fce --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/domain/entity/ReconciliationItem.java @@ -0,0 +1,37 @@ +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; + +/** + * @author shenyifei + */ +@Data +@Entity +@EqualsAndHashCode(callSuper = true) +public class ReconciliationItem extends DTO { + + /** + * 对账记录ID + */ + private Long reconciliationItemId; + + /** + * 对账ID + */ + private Long reconciliationId; + + /** + * 订单ID + */ + private Long orderId; + + /** + * 发货单ID + */ + private Long orderShipId; + +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/domain/gateway/ReconciliationGateway.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/domain/gateway/ReconciliationGateway.java new file mode 100644 index 0000000..3ef7c2e --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/domain/gateway/ReconciliationGateway.java @@ -0,0 +1,30 @@ +package com.xunhong.erp.turbo.biz.domain.gateway; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationCreateCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationDestroyCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationUpdateCmd; +import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationListQry; +import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPageQry; +import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationShowQry; +import com.xunhong.erp.turbo.biz.domain.entity.Reconciliation; + +import java.util.List; + +/** + * @author shenyifei + */ +public interface ReconciliationGateway { + Reconciliation save(ReconciliationCreateCmd reconciliationCreateCmd); + + IPage page(ReconciliationPageQry reconciliationPageQry); + + List list(ReconciliationListQry reconciliationListQry); + + Reconciliation update(ReconciliationUpdateCmd reconciliationUpdateCmd); + + Reconciliation show(ReconciliationShowQry reconciliationShowQry); + + void destroy(ReconciliationDestroyCmd reconciliationDestroyCmd); +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/convert/ReconciliationConvert.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/convert/ReconciliationConvert.java new file mode 100644 index 0000000..bad0fdf --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/convert/ReconciliationConvert.java @@ -0,0 +1,46 @@ +package com.xunhong.erp.turbo.biz.infrastructure.convert; + +import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationCreateCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationUpdateCmd; +import com.xunhong.erp.turbo.biz.domain.entity.Reconciliation; +import com.xunhong.erp.turbo.biz.infrastructure.entity.ReconciliationDO; +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 ReconciliationConvert { + + @Mapping(target = "dealer", source = "dealerDO") + @Mapping(target = "company", source = "companyDO") + @Mapping(target = "orderShipList", source = "orderShipDOList") + Reconciliation toReconciliation(ReconciliationDO reconciliationDO); + + @Mapping(target = "dealerDO", ignore = true) + @Mapping(target = "companyDO", ignore = true) + @Mapping(target = "state", ignore = true) + @Mapping(target = "reconciliationSn", ignore = true) + @Mapping(target = "reconciliationId", ignore = true) + @Mapping(target = "orderShipDOList", ignore = true) + @Mapping(target = "version", ignore = true) + @Mapping(target = "updatedAt", ignore = true) + @Mapping(target = "isDelete", ignore = true) + @Mapping(target = "createdAt", ignore = true) + ReconciliationDO toReconciliationDO(ReconciliationCreateCmd reconciliationCreateCmd); + + @Mapping(target = "dealerDO", ignore = true) + @Mapping(target = "companyDO", ignore = true) + @Mapping(target = "state", ignore = true) + @Mapping(target = "reconciliationSn", ignore = true) + @Mapping(target = "orderShipDOList", ignore = true) + @Mapping(target = "version", ignore = true) + @Mapping(target = "updatedAt", ignore = true) + @Mapping(target = "isDelete", ignore = true) + @Mapping(target = "createdAt", ignore = true) + void toReconciliationDO(@MappingTarget ReconciliationDO reconciliationDO, ReconciliationUpdateCmd reconciliationUpdateCmd); +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/convert/ReconciliationItemConvert.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/convert/ReconciliationItemConvert.java new file mode 100644 index 0000000..9177626 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/convert/ReconciliationItemConvert.java @@ -0,0 +1,18 @@ +package com.xunhong.erp.turbo.biz.infrastructure.convert; + +import com.xunhong.erp.turbo.api.biz.dto.vo.OrderShipVO; +import com.xunhong.erp.turbo.biz.infrastructure.entity.ReconciliationItemDO; +import org.mapstruct.Mapper; +import org.mapstruct.NullValueCheckStrategy; + +import java.util.List; + +/** + * @author shenyifei + */ +@Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) +public interface ReconciliationItemConvert { + + List toReconciliationItemList(List orderShipVOList); +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/entity/OrderShipDO.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/entity/OrderShipDO.java index 8f26b47..fccf044 100644 --- a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/entity/OrderShipDO.java +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/entity/OrderShipDO.java @@ -176,4 +176,7 @@ public class OrderShipDO extends BaseDO { @TableField(exist = false) private OrderDO orderDO; + @TableField(exist = false) + private Long reconciliationId; + } diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/entity/ReconciliationDO.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/entity/ReconciliationDO.java new file mode 100644 index 0000000..6a43aa8 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/entity/ReconciliationDO.java @@ -0,0 +1,103 @@ +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.xunhong.erp.turbo.api.biz.dto.enums.ReconciliationStateEnum; +import com.xunhong.erp.turbo.datasource.domain.entity.BaseDO; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @author shenyifei + */ +@Data +@TableName(value = "reconciliation") +@EqualsAndHashCode(callSuper = true) +public class ReconciliationDO extends BaseDO { + + /** + * 对账ID + */ + @TableId(value = "reconciliation_id", type = IdType.ASSIGN_ID) + private Long reconciliationId; + + /** + * 对账编码 + */ + @TableField(value = "reconciliation_sn") + private String reconciliationSn; + + /** + * 经销商ID + */ + @TableField(value = "dealer_id") + private Long dealerId; + + /** + * 公司ID + */ + @TableField(value = "company_id") + private Long companyId; + + /** + * 原对账金额 + */ + @TableField(value = "original_amount") + private BigDecimal originalAmount; + + /** + * 是否抹零 1是0否 + */ + @TableField(value = "is_rounding") + private Boolean isRounding; + + /** + * 抹零金额 + */ + @TableField(value = "rounding_amount") + private BigDecimal roundingAmount; + + /** + * 抹零备注 + */ + @TableField(value = "rounding_remark") + private String roundingRemark; + + /** + * 对账金额 + */ + @TableField(value = "reconciliation_amount") + private BigDecimal reconciliationAmount; + + /** + * 状态: 0-待对账, 1-已对账, 2-部分开票, 3-已开票, 4-部分回款, 5-已回款 + */ + @TableField(value = "state") + private ReconciliationStateEnum state; + + /** + * 备注 + */ + @TableField(value = "remark") + private String remark; + + @TableField(exist = false) + private List orderShipDOList; + + @TableField(exist = false) + private CompanyDO companyDO; + + @TableField(exist = false) + private DealerDO dealerDO; + + public String generateReconciliationSn() { + return "DZ" + java.time.LocalDate.now().format(java.time.format.DateTimeFormatter.BASIC_ISO_DATE) + + String.format("%03d", System.currentTimeMillis() % 1000); + } +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/entity/ReconciliationItemDO.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/entity/ReconciliationItemDO.java new file mode 100644 index 0000000..99b3874 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/entity/ReconciliationItemDO.java @@ -0,0 +1,50 @@ +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.xunhong.erp.turbo.datasource.domain.entity.BaseDO; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author shenyifei + */ +@Data +@TableName(value = "reconciliation_item") +@EqualsAndHashCode(callSuper = true) +public class ReconciliationItemDO extends BaseDO { + + /** + * 对账记录ID + */ + @TableId(value = "reconciliation_item_id", type = IdType.ASSIGN_ID) + private Long reconciliationItemId; + + /** + * 对账ID + */ + @TableField(value = "reconciliation_id") + private Long reconciliationId; + + /** + * 订单ID + */ + @TableField(value = "order_id") + private Long orderId; + + /** + * 发货单ID + */ + @TableField(value = "order_ship_id") + private Long orderShipId; + + @TableField(exist = false) + private OrderDO orderDO; + + @TableField(exist = false) + private OrderShipDO orderShipDO; + +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/gateway/ReconciliationGatewayImpl.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/gateway/ReconciliationGatewayImpl.java new file mode 100644 index 0000000..2f43322 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/gateway/ReconciliationGatewayImpl.java @@ -0,0 +1,167 @@ +package com.xunhong.erp.turbo.biz.infrastructure.gateway; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.ReconciliationCreateCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationDestroyCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationUpdateCmd; +import com.xunhong.erp.turbo.api.biz.dto.enums.ReconciliationStateEnum; +import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationListQry; +import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPageQry; +import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationShowQry; +import com.xunhong.erp.turbo.biz.domain.entity.Reconciliation; +import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationGateway; +import com.xunhong.erp.turbo.biz.infrastructure.convert.ReconciliationConvert; +import com.xunhong.erp.turbo.biz.infrastructure.convert.ReconciliationItemConvert; +import com.xunhong.erp.turbo.biz.infrastructure.entity.*; +import com.xunhong.erp.turbo.biz.infrastructure.mapper.*; +import lombok.RequiredArgsConstructor; +import org.apache.ibatis.session.ExecutorType; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author shenyifei + */ +@Repository +@RequiredArgsConstructor +public class ReconciliationGatewayImpl implements ReconciliationGateway { + private final ReconciliationMapper reconciliationMapper; + private final ReconciliationConvert reconciliationConvert; + + private final ReconciliationItemConvert reconciliationItemConvert; + private final SqlSessionFactory sqlSessionFactory; + + private final ReconciliationItemMapper reconciliationItemMapper; + private final OrderShipMapper orderShipMapper; + + private final OrderMapper orderMapper; + + private final CompanyMapper companyMapper; + private final DealerMapper dealerMapper; + + @Override + @Transactional + public Reconciliation save(ReconciliationCreateCmd reconciliationCreateCmd) { + ReconciliationDO reconciliationDO = reconciliationConvert.toReconciliationDO(reconciliationCreateCmd); + reconciliationDO.setReconciliationSn(reconciliationDO.generateReconciliationSn()); + reconciliationDO.setState(ReconciliationStateEnum.PENDING); + + List reconciliationItemList = reconciliationItemConvert.toReconciliationItemList(reconciliationCreateCmd.getOrderShipVOList()); + + SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false); + ReconciliationItemMapper reconciliationItemMapper = sqlSession.getMapper(ReconciliationItemMapper.class); + reconciliationItemList.forEach(reconciliationItemDO -> { + reconciliationItemDO.setReconciliationId(reconciliationDO.getReconciliationId()); + reconciliationItemMapper.insert(reconciliationItemDO); + }); + + sqlSession.commit(); + sqlSession.close(); + + + reconciliationMapper.insert(reconciliationDO); + + return reconciliationConvert.toReconciliation(reconciliationDO); + } + + @Override + public IPage page(ReconciliationPageQry reconciliationPageQry) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(ReconciliationDO.class); + queryWrapper.eq(Objects.nonNull(reconciliationPageQry.getDealerId()), ReconciliationDO::getDealerId, reconciliationPageQry.getDealerId()); + queryWrapper.eq(Objects.nonNull(reconciliationPageQry.getState()), ReconciliationDO::getState, reconciliationPageQry.getState()); + queryWrapper.like(StrUtil.isNotBlank(reconciliationPageQry.getReconciliationSn()), ReconciliationDO::getReconciliationSn, reconciliationPageQry.getReconciliationSn()); + queryWrapper.orderByDesc(ReconciliationDO::getCreatedAt); + + IPage page = new Page<>(reconciliationPageQry.getPageIndex(), reconciliationPageQry.getPageSize()); + page = reconciliationMapper.selectPage(page, queryWrapper, reconciliationPageQry); + Set reconciliationIdList = page.getRecords().stream().map(ReconciliationDO::getReconciliationId).collect(Collectors.toSet()); + if (CollUtil.isNotEmpty(reconciliationIdList)) { + List orderDOList = orderMapper.selectByReconciliationIdList(reconciliationIdList); + Map orderDOMap = orderDOList.stream().collect(Collectors.toMap(OrderDO::getOrderId, Function.identity())); + List orderShipDOList = orderShipMapper.selectByReconciliationIdList(reconciliationIdList); + orderShipDOList.forEach(orderShipDO -> { + orderShipDO.setOrderDO(orderDOMap.get(orderShipDO.getOrderId())); + }); + + page.getRecords().forEach(reconciliationDO -> { + reconciliationDO.setOrderShipDOList(orderShipDOList.stream().filter(orderShipDO -> orderShipDO.getReconciliationId().equals(reconciliationDO.getReconciliationId())).toList()); + }); + } + + Set companyIdList = page.getRecords().stream().map(ReconciliationDO::getCompanyId).collect(Collectors.toSet()); + if (CollUtil.isNotEmpty(companyIdList)) { + List companyDOList = companyMapper.selectByIds(companyIdList); + Map companyDOMap = companyDOList.stream().collect(Collectors.toMap(CompanyDO::getCompanyId, Function.identity())); + page.getRecords().forEach(reconciliationDO -> { + reconciliationDO.setCompanyDO(companyDOMap.get(reconciliationDO.getCompanyId())); + }); + } + + Set dealerIdList = page.getRecords().stream().map(ReconciliationDO::getDealerId).collect(Collectors.toSet()); + if (CollUtil.isNotEmpty(dealerIdList)) { + List dealerDOList = dealerMapper.selectByIds(dealerIdList); + Map dealerDOMap = dealerDOList.stream().collect(Collectors.toMap(DealerDO::getDealerId, Function.identity())); + page.getRecords().forEach(reconciliationDO -> { + reconciliationDO.setDealerDO(dealerDOMap.get(reconciliationDO.getDealerId())); + }); + } + + return page.convert(reconciliationConvert::toReconciliation); + } + + @Override + public List list(ReconciliationListQry reconciliationListQry) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(ReconciliationDO.class); + List reconciliationDOList = reconciliationMapper.selectList(queryWrapper); + return reconciliationDOList.stream().map(reconciliationConvert::toReconciliation).toList(); + } + + @Override + public Reconciliation update(ReconciliationUpdateCmd reconciliationUpdateCmd) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(ReconciliationDO.class); + queryWrapper.eq(ReconciliationDO::getReconciliationId, reconciliationUpdateCmd.getReconciliationId()); + queryWrapper.last("limit 1"); + + ReconciliationDO reconciliationDO = reconciliationMapper.selectOne(queryWrapper); + + reconciliationConvert.toReconciliationDO(reconciliationDO, reconciliationUpdateCmd); + reconciliationMapper.updateById(reconciliationDO); + + return reconciliationConvert.toReconciliation(reconciliationDO); + } + + @Override + public Reconciliation show(ReconciliationShowQry reconciliationShowQry) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(ReconciliationDO.class); + queryWrapper.eq(ReconciliationDO::getReconciliationId, reconciliationShowQry.getReconciliationId()); + queryWrapper.last("limit 1"); + + ReconciliationDO reconciliationDO = reconciliationMapper.selectOne(queryWrapper); + return reconciliationConvert.toReconciliation(reconciliationDO); + } + + @Override + public void destroy(ReconciliationDestroyCmd reconciliationDestroyCmd) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(ReconciliationDO.class); + queryWrapper.eq(ReconciliationDO::getReconciliationId, reconciliationDestroyCmd.getReconciliationId()); + queryWrapper.last("limit 1"); + + ReconciliationDO reconciliationDO = reconciliationMapper.selectOne(queryWrapper); + reconciliationDO.deleteById(); + } +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/OrderMapper.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/OrderMapper.java index 98b3016..a49e067 100644 --- a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/OrderMapper.java +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/OrderMapper.java @@ -25,5 +25,7 @@ public interface OrderMapper extends BaseMapper { IPage selectPage(IPage page, @Param(Constants.WRAPPER) LambdaQueryWrapper queryWrapper, @Param("query") OrderPageQry orderPageQry); List selectByQueryList(@Param(Constants.WRAPPER)LambdaQueryWrapper queryWrapper, @Param("query") OrderListQry orderListQry); + + List selectByReconciliationIdList(@Param("reconciliationIdList") Set reconciliationIdList); } diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/OrderShipMapper.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/OrderShipMapper.java index 22cee55..04fe413 100644 --- a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/OrderShipMapper.java +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/OrderShipMapper.java @@ -3,11 +3,16 @@ package com.xunhong.erp.turbo.biz.infrastructure.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.xunhong.erp.turbo.biz.infrastructure.entity.OrderShipDO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Set; /** * @author shenyifei */ @Mapper public interface OrderShipMapper extends BaseMapper { + List selectByReconciliationIdList(@Param("reconciliationIdList") Set reconciliationIdList); } diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/ReconciliationItemMapper.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/ReconciliationItemMapper.java new file mode 100644 index 0000000..1e4a901 --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/ReconciliationItemMapper.java @@ -0,0 +1,13 @@ +package com.xunhong.erp.turbo.biz.infrastructure.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xunhong.erp.turbo.biz.infrastructure.entity.ReconciliationItemDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author shenyifei + */ +@Mapper +public interface ReconciliationItemMapper extends BaseMapper { +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/ReconciliationMapper.java b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/ReconciliationMapper.java new file mode 100644 index 0000000..bd3557f --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/java/com/xunhong/erp/turbo/biz/infrastructure/mapper/ReconciliationMapper.java @@ -0,0 +1,19 @@ +package com.xunhong.erp.turbo.biz.infrastructure.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPageQry; +import com.xunhong.erp.turbo.biz.infrastructure.entity.ReconciliationDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * @author shenyifei + */ +@Mapper +public interface ReconciliationMapper extends BaseMapper { + IPage selectPage(IPage page, @Param(Constants.WRAPPER) LambdaQueryWrapper queryWrapper, @Param("query") ReconciliationPageQry reconciliationPageQry); +} + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/OrderMapper.xml b/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/OrderMapper.xml index d62c4c8..fd43346 100644 --- a/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/OrderMapper.xml +++ b/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/OrderMapper.xml @@ -157,5 +157,27 @@ + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/OrderShipMapper.xml b/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/OrderShipMapper.xml index 8060412..69a7b7b 100644 --- a/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/OrderShipMapper.xml +++ b/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/OrderShipMapper.xml @@ -36,4 +36,23 @@ + + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/ReconciliationItemMapper.xml b/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/ReconciliationItemMapper.xml new file mode 100644 index 0000000..f98470f --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/ReconciliationItemMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + diff --git a/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/ReconciliationMapper.xml b/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/ReconciliationMapper.xml new file mode 100644 index 0000000..95d379a --- /dev/null +++ b/erp-turbo-business/erp-turbo-biz/src/main/resources/mapper/ReconciliationMapper.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/api/ReconciliationServiceI.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/api/ReconciliationServiceI.java new file mode 100644 index 0000000..c6e8df0 --- /dev/null +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/api/ReconciliationServiceI.java @@ -0,0 +1,30 @@ +package com.xunhong.erp.turbo.api.biz.api; + +import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationCreateCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationDestroyCmd; +import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationUpdateCmd; +import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationListQry; +import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPageQry; +import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationShowQry; +import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationVO; +import com.xunhong.erp.turbo.base.dto.PageDTO; + +import java.util.List; + +/** + * @author shenyifei + */ +public interface ReconciliationServiceI { + ReconciliationVO create(ReconciliationCreateCmd reconciliationCreateCmd); + + PageDTO page(ReconciliationPageQry reconciliationPageQry); + + List list(ReconciliationListQry reconciliationListQry); + + ReconciliationVO update(ReconciliationUpdateCmd reconciliationUpdateCmd); + + ReconciliationVO show(ReconciliationShowQry reconciliationShowQry); + + void destroy(ReconciliationDestroyCmd reconciliationDestroyCmd); +} + diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ReconciliationCreateCmd.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ReconciliationCreateCmd.java new file mode 100644 index 0000000..af95953 --- /dev/null +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ReconciliationCreateCmd.java @@ -0,0 +1,74 @@ +package com.xunhong.erp.turbo.api.biz.dto.cmd; + +import com.xunhong.erp.turbo.api.biz.dto.vo.OrderShipVO; +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.BigDecimal; +import java.util.List; + +/** + * @author shenyifei + */ +@Data +@Schema(title = "对账创建") +@EqualsAndHashCode(callSuper = true) +public class ReconciliationCreateCmd extends Command { + + /** + * 经销商ID + */ + @Schema(title = "经销商ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED) + private Long dealerId; + + /** + * 公司ID + */ + @Schema(title = "公司ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED) + private Long companyId; + + /** + * 原对账金额 + */ + @Schema(title = "原对账金额", requiredMode = Schema.RequiredMode.REQUIRED) + private BigDecimal originalAmount; + + /** + * 是否抹零 1是0否 + */ + @Schema(title = "是否抹零 1是0否", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean isRounding; + + /** + * 抹零金额 + */ + @Schema(title = "抹零金额", requiredMode = Schema.RequiredMode.REQUIRED) + private BigDecimal roundingAmount; + + /** + * 抹零备注 + */ + @Schema(title = "抹零备注", requiredMode = Schema.RequiredMode.REQUIRED) + private String roundingRemark; + + /** + * 对账金额 + */ + @Schema(title = "对账金额", requiredMode = Schema.RequiredMode.REQUIRED) + private BigDecimal reconciliationAmount; + + /** + * 备注 + */ + @Schema(title = "备注") + private String remark; + + /** + * 对账明细 + */ + @Schema(title = "对账发货单") + private List orderShipVOList; +} + diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ReconciliationDestroyCmd.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ReconciliationDestroyCmd.java new file mode 100644 index 0000000..edaf616 --- /dev/null +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ReconciliationDestroyCmd.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 ReconciliationDestroyCmd extends Command { + + @Schema(title = "对账ID", requiredMode = Schema.RequiredMode.REQUIRED, type = "string") + private Long reconciliationId; +} + diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ReconciliationUpdateCmd.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ReconciliationUpdateCmd.java new file mode 100644 index 0000000..9598673 --- /dev/null +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/cmd/ReconciliationUpdateCmd.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 ReconciliationUpdateCmd extends ReconciliationCreateCmd { + + @Schema(title = "对账ID", requiredMode = Schema.RequiredMode.REQUIRED, type = "string") + private Long reconciliationId; +} + diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/enums/ReconciliationStateEnum.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/enums/ReconciliationStateEnum.java new file mode 100644 index 0000000..7bcda7d --- /dev/null +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/enums/ReconciliationStateEnum.java @@ -0,0 +1,45 @@ +package com.xunhong.erp.turbo.api.biz.dto.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * 对账状态枚举 + * + * @author shenyifei + */ +@Getter +@RequiredArgsConstructor +public enum ReconciliationStateEnum { + /** + * 待对账 + */ + PENDING(0, "待对账"), + /** + * 已对账 + */ + RECONCILED(1, "已对账"), + /** + * 部分开票 + */ + PARTIAL_INVOICE(2, "部分开票"), + /** + * 已开票 + */ + INVOICED(3, "已开票"), + /** + * 部分回款 + */ + PARTIAL_PAYMENT(4, "部分回款"), + /** + * 已回款 + */ + PAID(5, "已回款"), + ; + + @EnumValue + private final int type; + + private final String message; +} diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/DealerAccountRecordPageQry.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/DealerAccountRecordPageQry.java index cdb90bb..88b35e2 100644 --- a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/DealerAccountRecordPageQry.java +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/DealerAccountRecordPageQry.java @@ -20,31 +20,31 @@ public class DealerAccountRecordPageQry extends PageQuery { /** * 流水编号 */ - @Schema(title = "流水编号", requiredMode = Schema.RequiredMode.REQUIRED) + @Schema(title = "流水编号") private String recordSn; /** * 经销商ID */ - @Schema(title = "经销商ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED) + @Schema(title = "经销商ID", type = "string") private Long dealerId; /** * 订单ID */ - @Schema(title = "订单ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED) + @Schema(title = "订单ID", type = "string") private Long orderId; /** * 变动对象ID */ - @Schema(title = "变动对象ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED) + @Schema(title = "变动对象ID", type = "string") private Long targetId; /** * 变动类型:1-产地采购发货单;2-市场采购发货单;3-市场调货发货单; */ - @Schema(title = "变动类型:1-产地采购发货单;2-市场采购发货单;3-市场调货发货单;", requiredMode = Schema.RequiredMode.REQUIRED) + @Schema(title = "变动类型:1-产地采购发货单;2-市场采购发货单;3-市场调货发货单;") private DealerAccountRecordTargetTypeEnum targetType; } diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/ReconciliationListQry.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/ReconciliationListQry.java new file mode 100644 index 0000000..597f8fb --- /dev/null +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/ReconciliationListQry.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 ReconciliationListQry extends Query { + + @Schema(title = "对账ID", type = "string") + private Long reconciliationId; +} + diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/ReconciliationPageQry.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/ReconciliationPageQry.java new file mode 100644 index 0000000..60c1aa0 --- /dev/null +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/ReconciliationPageQry.java @@ -0,0 +1,35 @@ +package com.xunhong.erp.turbo.api.biz.dto.qry; + +import com.xunhong.erp.turbo.api.biz.dto.enums.ReconciliationStateEnum; +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 ReconciliationPageQry extends PageQuery { + + @Schema(title = "对账ID", type = "string") + private Long reconciliationId; + + /** + * 状态: 0-待对账, 1-已对账, 2-部分开票, 3-已开票, 4-部分回款, 5-已回款 + */ + @Schema(title = "状态: 0-待对账, 1-已对账, 2-部分开票, 3-已开票, 4-部分回款, 5-已回款") + private ReconciliationStateEnum state; + + @Schema(title = "经销商ID", type = "string") + private Long dealerId; + + @Schema(title = "对账单号", type = "string") + private String reconciliationSn; + + @Schema(title = "订单ID", type = "string") + private Long orderId; +} + diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/ReconciliationShowQry.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/ReconciliationShowQry.java new file mode 100644 index 0000000..f1e7f95 --- /dev/null +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/qry/ReconciliationShowQry.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 ReconciliationShowQry extends Query { + + @Schema(title = "对账ID", type = "string") + private Long reconciliationId; +} + diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/vo/ReconciliationItemVO.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/vo/ReconciliationItemVO.java new file mode 100644 index 0000000..1507c96 --- /dev/null +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/vo/ReconciliationItemVO.java @@ -0,0 +1,44 @@ +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; + +/** + * @author shenyifei + */ +@Data +@Schema(title = "对账记录表") +@EqualsAndHashCode(callSuper = true) +public class ReconciliationItemVO extends DTO { + + /** + * 对账记录ID + */ + @Schema(title = "对账记录ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED) + private Long reconciliationItemId; + + /** + * 对账ID + */ + @Schema(title = "对账ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED) + private Long reconciliationId; + + /** + * 订单ID + */ + @Schema(title = "订单ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderId; + + /** + * 发货单ID + */ + @Schema(title = "发货单ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderShipId; + + @Schema(title = "发货单信息") + private OrderShipVO orderShipVO; + +} + diff --git a/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/vo/ReconciliationVO.java b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/vo/ReconciliationVO.java new file mode 100644 index 0000000..3f224c9 --- /dev/null +++ b/erp-turbo-common/erp-turbo-api/src/main/java/com/xunhong/erp/turbo/api/biz/dto/vo/ReconciliationVO.java @@ -0,0 +1,102 @@ +package com.xunhong.erp.turbo.api.biz.dto.vo; + +import com.alibaba.cola.dto.DTO; +import com.xunhong.erp.turbo.api.biz.dto.enums.ReconciliationStateEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author shenyifei + */ +@Data +@Schema(title = "对账") +@EqualsAndHashCode(callSuper = true) +public class ReconciliationVO extends DTO { + + /** + * 对账ID + */ + @Schema(title = "对账ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED) + private Long reconciliationId; + + /** + * 对账编码 + */ + @Schema(title = "对账编码", requiredMode = Schema.RequiredMode.REQUIRED) + private String reconciliationSn; + + /** + * 经销商ID + */ + @Schema(title = "经销商ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED) + private Long dealerId; + + /** + * 公司ID + */ + @Schema(title = "公司ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED) + private Long companyId; + + /** + * 原对账金额 + */ + @Schema(title = "原对账金额", requiredMode = Schema.RequiredMode.REQUIRED) + private BigDecimal originalAmount; + + /** + * 是否抹零 1是0否 + */ + @Schema(title = "是否抹零 1是0否", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean isRounding; + + /** + * 抹零金额 + */ + @Schema(title = "抹零金额", requiredMode = Schema.RequiredMode.REQUIRED) + private BigDecimal roundingAmount; + + /** + * 抹零备注 + */ + @Schema(title = "抹零备注", requiredMode = Schema.RequiredMode.REQUIRED) + private String roundingRemark; + + /** + * 对账金额 + */ + @Schema(title = "对账金额", requiredMode = Schema.RequiredMode.REQUIRED) + private BigDecimal reconciliationAmount; + + /** + * 状态: 0-待对账, 1-已对账, 2-部分开票, 3-已开票, 4-部分回款, 5-已回款 + */ + @Schema(title = "状态: 0-待对账, 1-已对账, 2-部分开票, 3-已开票, 4-部分回款, 5-已回款", requiredMode = Schema.RequiredMode.REQUIRED) + private ReconciliationStateEnum state; + + /** + * 备注 + */ + @Schema(title = "备注") + private String remark; + + /** + * 创建时间 + */ + @Schema(title = "创建时间") + private LocalDateTime createdAt; + + @Schema(title = "对账发货单") + private List orderShipVOList; + + @Schema(title = "公司信息") + private CompanyVO companyVO; + + @Schema(title = "经销商信息") + private DealerVO dealerVO; +} +