feat(biz): 添加对账管理功能
- 创建对账控制器实现增删改查接口 - 定义对账服务接口和数据传输对象 - 实现对账业务逻辑处理和数据转换 - 添加对账数据库实体和网关接口 - 集成对账发货单关联关系处理 - 更新经销商账户流水查询参数配置
This commit is contained in:
parent
00efacd14c
commit
e677ecde66
@ -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."
|
||||
---
|
||||
|
||||
|
||||
@ -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."
|
||||
---
|
||||
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -176,4 +176,7 @@ public class OrderShipDO extends BaseDO<OrderShipDO> {
|
||||
@TableField(exist = false)
|
||||
private OrderDO orderDO;
|
||||
|
||||
@TableField(exist = false)
|
||||
private Long reconciliationId;
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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> {
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user