feat(biz): 添加对账管理功能

- 创建对账控制器实现增删改查接口
- 定义对账服务接口和数据传输对象
- 实现对账业务逻辑处理和数据转换
- 添加对账数据库实体和网关接口
- 集成对账发货单关联关系处理
- 更新经销商账户流水查询参数配置
This commit is contained in:
shenyifei 2026-01-12 17:33:56 +08:00
parent 00efacd14c
commit e677ecde66
39 changed files with 1442 additions and 7 deletions

View File

@ -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."
---

View File

@ -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."
---

View File

@ -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<ReconciliationVO> listReconciliation(@ModelAttribute @Validated ReconciliationListQry reconciliationListQry) {
return MultiResponse.of(reconciliationService.list(reconciliationListQry));
}
@SaCheckLogin
@PostMapping("createReconciliation")
@Operation(summary = "创建对账", method = "POST")
public SingleResponse<ReconciliationVO> createReconciliation(@RequestBody @Validated ReconciliationCreateCmd reconciliationCreateCmd) {
return SingleResponse.of(reconciliationService.create(reconciliationCreateCmd));
}
@SaCheckLogin
@GetMapping("showReconciliation")
@Operation(summary = "对账详情", method = "GET")
public SingleResponse<ReconciliationVO> showReconciliation(@ModelAttribute @Validated ReconciliationShowQry reconciliationShowQry) {
return SingleResponse.of(reconciliationService.show(reconciliationShowQry));
}
@SaCheckLogin
@GetMapping("pageReconciliation")
@Operation(summary = "对账列表", method = "GET")
public PageResponse<ReconciliationVO> pageReconciliation(@ModelAttribute @Validated ReconciliationPageQry reconciliationPageQry) {
PageDTO<ReconciliationVO> 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<ReconciliationVO> 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();
}
}

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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<ReconciliationVO> execute(ReconciliationListQry reconciliationListQry) {
List<Reconciliation> reconciliationList = reconciliationGateway.list(reconciliationListQry);
return reconciliationList.stream().map(reconciliationAssembler::toReconciliationVO).toList();
}
}

View File

@ -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<ReconciliationVO> execute(ReconciliationPageQry reconciliationPageQry) {
IPage<Reconciliation> page = reconciliationGateway.page(reconciliationPageQry);
return page.convert(reconciliationAssembler::toReconciliationVO);
}
}

View File

@ -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);
}
}

View File

@ -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<ReconciliationVO> page(ReconciliationPageQry reconciliationPageQry) {
return PageDTO.of(reconciliationPageQryExe.execute(reconciliationPageQry));
}
@Override
public List<ReconciliationVO> 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);
}
}

View File

@ -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<OrderShip> orderShipList;
/**
* 公司信息
*/
private Company company;
/**
* 经销商信息
*/
private Dealer dealer;
}

View File

@ -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;
}

View File

@ -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<Reconciliation> page(ReconciliationPageQry reconciliationPageQry);
List<Reconciliation> list(ReconciliationListQry reconciliationListQry);
Reconciliation update(ReconciliationUpdateCmd reconciliationUpdateCmd);
Reconciliation show(ReconciliationShowQry reconciliationShowQry);
void destroy(ReconciliationDestroyCmd reconciliationDestroyCmd);
}

View File

@ -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);
}

View File

@ -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<ReconciliationItemDO> toReconciliationItemList(List<OrderShipVO> orderShipVOList);
}

View File

@ -176,4 +176,7 @@ public class OrderShipDO extends BaseDO<OrderShipDO> {
@TableField(exist = false)
private OrderDO orderDO;
@TableField(exist = false)
private Long reconciliationId;
}

View File

@ -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<ReconciliationDO> {
/**
* 对账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<OrderShipDO> 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);
}
}

View File

@ -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<ReconciliationItemDO> {
/**
* 对账记录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;
}

View File

@ -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<ReconciliationItemDO> 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<Reconciliation> page(ReconciliationPageQry reconciliationPageQry) {
LambdaQueryWrapper<ReconciliationDO> 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<ReconciliationDO> page = new Page<>(reconciliationPageQry.getPageIndex(), reconciliationPageQry.getPageSize());
page = reconciliationMapper.selectPage(page, queryWrapper, reconciliationPageQry);
Set<Long> reconciliationIdList = page.getRecords().stream().map(ReconciliationDO::getReconciliationId).collect(Collectors.toSet());
if (CollUtil.isNotEmpty(reconciliationIdList)) {
List<OrderDO> orderDOList = orderMapper.selectByReconciliationIdList(reconciliationIdList);
Map<Long, OrderDO> orderDOMap = orderDOList.stream().collect(Collectors.toMap(OrderDO::getOrderId, Function.identity()));
List<OrderShipDO> 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<Long> companyIdList = page.getRecords().stream().map(ReconciliationDO::getCompanyId).collect(Collectors.toSet());
if (CollUtil.isNotEmpty(companyIdList)) {
List<CompanyDO> companyDOList = companyMapper.selectByIds(companyIdList);
Map<Long, CompanyDO> companyDOMap = companyDOList.stream().collect(Collectors.toMap(CompanyDO::getCompanyId, Function.identity()));
page.getRecords().forEach(reconciliationDO -> {
reconciliationDO.setCompanyDO(companyDOMap.get(reconciliationDO.getCompanyId()));
});
}
Set<Long> dealerIdList = page.getRecords().stream().map(ReconciliationDO::getDealerId).collect(Collectors.toSet());
if (CollUtil.isNotEmpty(dealerIdList)) {
List<DealerDO> dealerDOList = dealerMapper.selectByIds(dealerIdList);
Map<Long, DealerDO> 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<Reconciliation> list(ReconciliationListQry reconciliationListQry) {
LambdaQueryWrapper<ReconciliationDO> queryWrapper = Wrappers.lambdaQuery(ReconciliationDO.class);
List<ReconciliationDO> reconciliationDOList = reconciliationMapper.selectList(queryWrapper);
return reconciliationDOList.stream().map(reconciliationConvert::toReconciliation).toList();
}
@Override
public Reconciliation update(ReconciliationUpdateCmd reconciliationUpdateCmd) {
LambdaQueryWrapper<ReconciliationDO> 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<ReconciliationDO> 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<ReconciliationDO> queryWrapper = Wrappers.lambdaQuery(ReconciliationDO.class);
queryWrapper.eq(ReconciliationDO::getReconciliationId, reconciliationDestroyCmd.getReconciliationId());
queryWrapper.last("limit 1");
ReconciliationDO reconciliationDO = reconciliationMapper.selectOne(queryWrapper);
reconciliationDO.deleteById();
}
}

View File

@ -25,5 +25,7 @@ public interface OrderMapper extends BaseMapper<OrderDO> {
IPage<OrderDO> selectPage(IPage<OrderDO> page, @Param(Constants.WRAPPER) LambdaQueryWrapper<OrderDO> queryWrapper, @Param("query") OrderPageQry orderPageQry);
List<OrderDO> selectByQueryList(@Param(Constants.WRAPPER)LambdaQueryWrapper<OrderDO> queryWrapper, @Param("query") OrderListQry orderListQry);
List<OrderDO> selectByReconciliationIdList(@Param("reconciliationIdList") Set<Long> reconciliationIdList);
}

View File

@ -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<OrderShipDO> {
List<OrderShipDO> selectByReconciliationIdList(@Param("reconciliationIdList") Set<Long> reconciliationIdList);
}

View File

@ -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<ReconciliationItemDO> {
}

View File

@ -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<ReconciliationDO> {
IPage<ReconciliationDO> selectPage(IPage<ReconciliationDO> page, @Param(Constants.WRAPPER) LambdaQueryWrapper<ReconciliationDO> queryWrapper, @Param("query") ReconciliationPageQry reconciliationPageQry);
}

View File

@ -157,5 +157,27 @@
</if>
</where>
</select>
<select id="selectByReconciliationIdList"
resultType="com.xunhong.erp.turbo.biz.infrastructure.entity.OrderDO">
SELECT
po.*,
ov.vehicle_id, ov.vehicle_no, ov.dealer_id, ov.dealer_name, ov.origin,
ov.destination
FROM `order` po
LEFT JOIN order_vehicle ov ON po.order_id = ov.order_id AND ov.is_delete
= 0
<where>
po.is_delete = 0
<if test="reconciliationIdList != null and reconciliationIdList.size() > 0">
AND po.order_id IN (select order_id from reconciliation_item where
reconciliation_id in
<foreach item="item" collection="reconciliationIdList"
separator=","
open="(" close=")" index="">
#{item}
</foreach>)
</if>
</where>
</select>
</mapper>

View File

@ -36,4 +36,23 @@
<result property="isDelete" column="is_delete"/>
<result property="version" column="version"/>
</resultMap>
<select id="selectByReconciliationIdList"
resultType="com.xunhong.erp.turbo.biz.infrastructure.entity.OrderShipDO"
resultMap="BaseResultMap">
SELECT
os.*, ri.reconciliation_id
FROM order_ship os
LEFT JOIN reconciliation_item ri ON os.order_ship_id = ri.order_ship_id
<where>
os.is_delete = 0
<if test="reconciliationIdList != null and reconciliationIdList.size() > 0">
AND ri.reconciliation_id IN
<foreach item="item" collection="reconciliationIdList"
separator="," open="(" close=")" index="index">
#{item}
</foreach>
</if>
</where>
</select>
</mapper>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace="com.xunhong.erp.turbo.biz.infrastructure.mapper.ReconciliationItemMapper">
<resultMap id="BaseResultMap"
type="com.xunhong.erp.turbo.biz.infrastructure.entity.ReconciliationItemDO">
<result property="reconciliationItemId"
column="reconciliation_item_id"/>
<result property="reconciliationId" column="reconciliation_id"/>
<result property="orderId" column="order_id"/>
<result property="orderShipId" column="order_ship_id"/>
<result property="createdAt" column="created_at"/>
<result property="updatedAt" column="updated_at"/>
<result property="isDelete" column="is_delete"/>
<result property="version" column="version"/>
</resultMap>
</mapper>

View File

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace="com.xunhong.erp.turbo.biz.infrastructure.mapper.ReconciliationMapper">
<resultMap id="BaseResultMap"
type="com.xunhong.erp.turbo.biz.infrastructure.entity.ReconciliationDO">
<result property="reconciliationId" column="reconciliation_id"/>
<result property="reconciliationSn" column="reconciliation_sn"/>
<result property="dealerId" column="dealer_id"/>
<result property="originalAmount" column="original_amount"/>
<result property="isRounding" column="is_rounding"/>
<result property="roundingAmount" column="rounding_amount"/>
<result property="roundingRemark" column="rounding_remark"/>
<result property="reconciliationAmount" column="reconciliation_amount"/>
<result property="state" column="state"/>
<result property="remark" column="remark"/>
<result property="createdAt" column="created_at"/>
<result property="createdAt" column="created_at"/>
<result property="updatedAt" column="updated_at"/>
<result property="isDelete" column="is_delete"/>
<result property="version" column="version"/>
</resultMap>
<select id="selectPage"
resultType="com.xunhong.erp.turbo.biz.infrastructure.entity.ReconciliationDO"
resultMap="BaseResultMap">
SELECT
r.*
FROM reconciliation r
<where>
r.is_delete = 0
<if test="query.orderId">
AND r.order_id in (select order_id from reconciliation_item where order_id = #{query.orderId})
</if>
<if test="ew != null">
<if test="ew.nonEmptyOfWhere">
AND
</if>
${ew.sqlSegment}
</if>
</where>
</select>
</mapper>

View File

@ -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<ReconciliationVO> page(ReconciliationPageQry reconciliationPageQry);
List<ReconciliationVO> list(ReconciliationListQry reconciliationListQry);
ReconciliationVO update(ReconciliationUpdateCmd reconciliationUpdateCmd);
ReconciliationVO show(ReconciliationShowQry reconciliationShowQry);
void destroy(ReconciliationDestroyCmd reconciliationDestroyCmd);
}

View File

@ -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<OrderShipVO> orderShipVOList;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<OrderShipVO> orderShipVOList;
@Schema(title = "公司信息")
private CompanyVO companyVO;
@Schema(title = "经销商信息")
private DealerVO dealerVO;
}