feat(operation): 新增对账发票和对账付款功能模块

- 添加了对账发票管理的完整CRUD控制器和接口定义
- 实现了对账发票的创建、查询、更新、删除功能
- 添加了对账付款管理的完整CRUD控制器和接口定义
- 实现了对账付款的创建、查询、更新、删除功能
- 定义了对账发票和对账付款的数据传输对象(DTO)
- 实现了数据访问层的映射转换器和执行器
- 集成了Swagger API文档注解支持
- 添加了分页查询和列表查询功能实现
This commit is contained in:
shenyifei 2026-01-13 10:37:27 +08:00
parent a66ca25cef
commit 1e29eda0b4
56 changed files with 2213 additions and 64 deletions

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.ReconciliationInvoiceServiceI;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationInvoiceCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationInvoiceDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationInvoiceUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationInvoiceListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationInvoicePageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationInvoiceShowQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationInvoiceVO;
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 = "ReconciliationInvoice", description = "对账发票管理")
@RestController("operationReconciliationInvoiceController")
@RequestMapping(value = "/operation")
@RequiredArgsConstructor
public class ReconciliationInvoiceController {
@DubboReference(version = "1.0.0")
private final ReconciliationInvoiceServiceI reconciliationInvoiceService;
@SaCheckLogin
@GetMapping("listReconciliationInvoice")
@Operation(summary = "对账发票列表", method = "GET")
public MultiResponse<ReconciliationInvoiceVO> listReconciliationInvoice(@ModelAttribute @Validated ReconciliationInvoiceListQry reconciliationInvoiceListQry) {
return MultiResponse.of(reconciliationInvoiceService.list(reconciliationInvoiceListQry));
}
@SaCheckLogin
@PostMapping("createReconciliationInvoice")
@Operation(summary = "创建对账发票", method = "POST")
public SingleResponse<ReconciliationInvoiceVO> createReconciliationInvoice(@RequestBody @Validated ReconciliationInvoiceCreateCmd reconciliationInvoiceCreateCmd) {
return SingleResponse.of(reconciliationInvoiceService.create(reconciliationInvoiceCreateCmd));
}
@SaCheckLogin
@GetMapping("showReconciliationInvoice")
@Operation(summary = "对账发票详情", method = "GET")
public SingleResponse<ReconciliationInvoiceVO> showReconciliationInvoice(@ModelAttribute @Validated ReconciliationInvoiceShowQry reconciliationInvoiceShowQry) {
return SingleResponse.of(reconciliationInvoiceService.show(reconciliationInvoiceShowQry));
}
@SaCheckLogin
@GetMapping("pageReconciliationInvoice")
@Operation(summary = "对账发票列表", method = "GET")
public PageResponse<ReconciliationInvoiceVO> pageReconciliationInvoice(@ModelAttribute @Validated ReconciliationInvoicePageQry reconciliationInvoicePageQry) {
PageDTO<ReconciliationInvoiceVO> page = reconciliationInvoiceService.page(reconciliationInvoicePageQry);
return PageResponse.of(page.getRecords(), (int) page.getTotal(), (int) page.getSize(), (int) page.getCurrent());
}
@SaCheckLogin
@RequestMapping(value = "updateReconciliationInvoice", method = {RequestMethod.PATCH, RequestMethod.PUT})
@Operation(summary = "对账发票更新", method = "PATCH")
public SingleResponse<ReconciliationInvoiceVO> updateReconciliationInvoice(@RequestBody @Validated ReconciliationInvoiceUpdateCmd reconciliationInvoiceUpdateCmd) {
return SingleResponse.of(reconciliationInvoiceService.update(reconciliationInvoiceUpdateCmd));
}
@SaCheckLogin
@DeleteMapping("destroyReconciliationInvoice")
@Operation(summary = "对账发票删除", method = "DELETE")
public Response destroyReconciliationInvoice(@RequestBody @Validated ReconciliationInvoiceDestroyCmd reconciliationInvoiceDestroyCmd) {
reconciliationInvoiceService.destroy(reconciliationInvoiceDestroyCmd);
return Response.buildSuccess();
}
}

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.ReconciliationPaymentServiceI;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationPaymentCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationPaymentDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationPaymentUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPaymentListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPaymentPageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPaymentShowQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationPaymentVO;
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 = "ReconciliationPayment", description = "对账付款管理")
@RestController("operationReconciliationPaymentController")
@RequestMapping(value = "/operation")
@RequiredArgsConstructor
public class ReconciliationPaymentController {
@DubboReference(version = "1.0.0")
private final ReconciliationPaymentServiceI reconciliationPaymentService;
@SaCheckLogin
@GetMapping("listReconciliationPayment")
@Operation(summary = "对账付款列表", method = "GET")
public MultiResponse<ReconciliationPaymentVO> listReconciliationPayment(@ModelAttribute @Validated ReconciliationPaymentListQry reconciliationPaymentListQry) {
return MultiResponse.of(reconciliationPaymentService.list(reconciliationPaymentListQry));
}
@SaCheckLogin
@PostMapping("createReconciliationPayment")
@Operation(summary = "创建对账付款", method = "POST")
public SingleResponse<ReconciliationPaymentVO> createReconciliationPayment(@RequestBody @Validated ReconciliationPaymentCreateCmd reconciliationPaymentCreateCmd) {
return SingleResponse.of(reconciliationPaymentService.create(reconciliationPaymentCreateCmd));
}
@SaCheckLogin
@GetMapping("showReconciliationPayment")
@Operation(summary = "对账付款详情", method = "GET")
public SingleResponse<ReconciliationPaymentVO> showReconciliationPayment(@ModelAttribute @Validated ReconciliationPaymentShowQry reconciliationPaymentShowQry) {
return SingleResponse.of(reconciliationPaymentService.show(reconciliationPaymentShowQry));
}
@SaCheckLogin
@GetMapping("pageReconciliationPayment")
@Operation(summary = "对账付款列表", method = "GET")
public PageResponse<ReconciliationPaymentVO> pageReconciliationPayment(@ModelAttribute @Validated ReconciliationPaymentPageQry reconciliationPaymentPageQry) {
PageDTO<ReconciliationPaymentVO> page = reconciliationPaymentService.page(reconciliationPaymentPageQry);
return PageResponse.of(page.getRecords(), (int) page.getTotal(), (int) page.getSize(), (int) page.getCurrent());
}
@SaCheckLogin
@RequestMapping(value = "updateReconciliationPayment", method = {RequestMethod.PATCH, RequestMethod.PUT})
@Operation(summary = "对账付款更新", method = "PATCH")
public SingleResponse<ReconciliationPaymentVO> updateReconciliationPayment(@RequestBody @Validated ReconciliationPaymentUpdateCmd reconciliationPaymentUpdateCmd) {
return SingleResponse.of(reconciliationPaymentService.update(reconciliationPaymentUpdateCmd));
}
@SaCheckLogin
@DeleteMapping("destroyReconciliationPayment")
@Operation(summary = "对账付款删除", method = "DELETE")
public Response destroyReconciliationPayment(@RequestBody @Validated ReconciliationPaymentDestroyCmd reconciliationPaymentDestroyCmd) {
reconciliationPaymentService.destroy(reconciliationPaymentDestroyCmd);
return Response.buildSuccess();
}
}

View File

@ -0,0 +1,15 @@
package com.xunhong.erp.turbo.biz.app.assembler;
import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationInvoiceVO;
import com.xunhong.erp.turbo.biz.domain.entity.ReconciliationInvoice;
import org.mapstruct.Mapper;
import org.mapstruct.NullValueCheckStrategy;
/**
* @author shenyifei
*/
@Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface ReconciliationInvoiceAssembler {
ReconciliationInvoiceVO toReconciliationInvoiceVO(ReconciliationInvoice reconciliationInvoice);
}

View File

@ -0,0 +1,15 @@
package com.xunhong.erp.turbo.biz.app.assembler;
import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationPaymentVO;
import com.xunhong.erp.turbo.biz.domain.entity.ReconciliationPayment;
import org.mapstruct.Mapper;
import org.mapstruct.NullValueCheckStrategy;
/**
* @author shenyifei
*/
@Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface ReconciliationPaymentAssembler {
ReconciliationPaymentVO toReconciliationPaymentVO(ReconciliationPayment reconciliationPayment);
}

View File

@ -0,0 +1,29 @@
package com.xunhong.erp.turbo.biz.app.executor.cmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationInvoiceCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationInvoiceVO;
import com.xunhong.erp.turbo.biz.app.assembler.ReconciliationInvoiceAssembler;
import com.xunhong.erp.turbo.biz.domain.entity.ReconciliationInvoice;
import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationInvoiceGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class ReconciliationInvoiceCreateCmdExe {
private final ReconciliationInvoiceAssembler reconciliationInvoiceAssembler;
private final ReconciliationInvoiceGateway reconciliationInvoiceGateway;
public ReconciliationInvoiceVO execute(ReconciliationInvoiceCreateCmd reconciliationInvoiceCreateCmd) {
ReconciliationInvoice reconciliationInvoice = reconciliationInvoiceGateway.save(reconciliationInvoiceCreateCmd);
return reconciliationInvoiceAssembler.toReconciliationInvoiceVO(reconciliationInvoice);
}
}

View File

@ -0,0 +1,22 @@
package com.xunhong.erp.turbo.biz.app.executor.cmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationInvoiceDestroyCmd;
import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationInvoiceGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class ReconciliationInvoiceDestroyCmdExe {
private final ReconciliationInvoiceGateway reconciliationInvoiceGateway;
public void execute(ReconciliationInvoiceDestroyCmd reconciliationInvoiceDestroyCmd) {
reconciliationInvoiceGateway.destroy(reconciliationInvoiceDestroyCmd);
}
}

View File

@ -0,0 +1,27 @@
package com.xunhong.erp.turbo.biz.app.executor.cmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationInvoiceUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationInvoiceVO;
import com.xunhong.erp.turbo.biz.app.assembler.ReconciliationInvoiceAssembler;
import com.xunhong.erp.turbo.biz.domain.entity.ReconciliationInvoice;
import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationInvoiceGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class ReconciliationInvoiceUpdateCmdExe {
private final ReconciliationInvoiceAssembler reconciliationInvoiceAssembler;
private final ReconciliationInvoiceGateway reconciliationInvoiceGateway;
public ReconciliationInvoiceVO execute(ReconciliationInvoiceUpdateCmd reconciliationInvoiceUpdateCmd) {
ReconciliationInvoice reconciliationInvoice = reconciliationInvoiceGateway.update(reconciliationInvoiceUpdateCmd);
return reconciliationInvoiceAssembler.toReconciliationInvoiceVO(reconciliationInvoice);
}
}

View File

@ -0,0 +1,29 @@
package com.xunhong.erp.turbo.biz.app.executor.cmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationPaymentCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationPaymentVO;
import com.xunhong.erp.turbo.biz.app.assembler.ReconciliationPaymentAssembler;
import com.xunhong.erp.turbo.biz.domain.entity.ReconciliationPayment;
import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationPaymentGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class ReconciliationPaymentCreateCmdExe {
private final ReconciliationPaymentAssembler reconciliationPaymentAssembler;
private final ReconciliationPaymentGateway reconciliationPaymentGateway;
public ReconciliationPaymentVO execute(ReconciliationPaymentCreateCmd reconciliationPaymentCreateCmd) {
ReconciliationPayment reconciliationPayment = reconciliationPaymentGateway.save(reconciliationPaymentCreateCmd);
return reconciliationPaymentAssembler.toReconciliationPaymentVO(reconciliationPayment);
}
}

View File

@ -0,0 +1,22 @@
package com.xunhong.erp.turbo.biz.app.executor.cmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationPaymentDestroyCmd;
import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationPaymentGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class ReconciliationPaymentDestroyCmdExe {
private final ReconciliationPaymentGateway reconciliationPaymentGateway;
public void execute(ReconciliationPaymentDestroyCmd reconciliationPaymentDestroyCmd) {
reconciliationPaymentGateway.destroy(reconciliationPaymentDestroyCmd);
}
}

View File

@ -0,0 +1,27 @@
package com.xunhong.erp.turbo.biz.app.executor.cmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationPaymentUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationPaymentVO;
import com.xunhong.erp.turbo.biz.app.assembler.ReconciliationPaymentAssembler;
import com.xunhong.erp.turbo.biz.domain.entity.ReconciliationPayment;
import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationPaymentGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class ReconciliationPaymentUpdateCmdExe {
private final ReconciliationPaymentAssembler reconciliationPaymentAssembler;
private final ReconciliationPaymentGateway reconciliationPaymentGateway;
public ReconciliationPaymentVO execute(ReconciliationPaymentUpdateCmd reconciliationPaymentUpdateCmd) {
ReconciliationPayment reconciliationPayment = reconciliationPaymentGateway.update(reconciliationPaymentUpdateCmd);
return reconciliationPaymentAssembler.toReconciliationPaymentVO(reconciliationPayment);
}
}

View File

@ -0,0 +1,30 @@
package com.xunhong.erp.turbo.biz.app.executor.query;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationInvoiceListQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationInvoiceVO;
import com.xunhong.erp.turbo.biz.app.assembler.ReconciliationInvoiceAssembler;
import com.xunhong.erp.turbo.biz.domain.entity.ReconciliationInvoice;
import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationInvoiceGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class ReconciliationInvoiceListQryExe {
private final ReconciliationInvoiceGateway reconciliationInvoiceGateway;
private final ReconciliationInvoiceAssembler reconciliationInvoiceAssembler;
public List<ReconciliationInvoiceVO> execute(ReconciliationInvoiceListQry reconciliationInvoiceListQry) {
List<ReconciliationInvoice> reconciliationInvoiceList = reconciliationInvoiceGateway.list(reconciliationInvoiceListQry);
return reconciliationInvoiceList.stream().map(reconciliationInvoiceAssembler::toReconciliationInvoiceVO).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.ReconciliationInvoicePageQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationInvoiceVO;
import com.xunhong.erp.turbo.biz.app.assembler.ReconciliationInvoiceAssembler;
import com.xunhong.erp.turbo.biz.domain.entity.ReconciliationInvoice;
import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationInvoiceGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class ReconciliationInvoicePageQryExe {
private final ReconciliationInvoiceGateway reconciliationInvoiceGateway;
private final ReconciliationInvoiceAssembler reconciliationInvoiceAssembler;
public IPage<ReconciliationInvoiceVO> execute(ReconciliationInvoicePageQry reconciliationInvoicePageQry) {
IPage<ReconciliationInvoice> page = reconciliationInvoiceGateway.page(reconciliationInvoicePageQry);
return page.convert(reconciliationInvoiceAssembler::toReconciliationInvoiceVO);
}
}

View File

@ -0,0 +1,29 @@
package com.xunhong.erp.turbo.biz.app.executor.query;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationInvoiceShowQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationInvoiceVO;
import com.xunhong.erp.turbo.biz.app.assembler.ReconciliationInvoiceAssembler;
import com.xunhong.erp.turbo.biz.domain.entity.ReconciliationInvoice;
import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationInvoiceGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class ReconciliationInvoiceShowQryExe {
private final ReconciliationInvoiceAssembler reconciliationInvoiceAssembler;
private final ReconciliationInvoiceGateway reconciliationInvoiceGateway;
public ReconciliationInvoiceVO execute(ReconciliationInvoiceShowQry reconciliationInvoiceShowQry) {
ReconciliationInvoice reconciliationInvoice = reconciliationInvoiceGateway.show(reconciliationInvoiceShowQry);
return reconciliationInvoiceAssembler.toReconciliationInvoiceVO(reconciliationInvoice);
}
}

View File

@ -0,0 +1,30 @@
package com.xunhong.erp.turbo.biz.app.executor.query;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPaymentListQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationPaymentVO;
import com.xunhong.erp.turbo.biz.app.assembler.ReconciliationPaymentAssembler;
import com.xunhong.erp.turbo.biz.domain.entity.ReconciliationPayment;
import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationPaymentGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class ReconciliationPaymentListQryExe {
private final ReconciliationPaymentGateway reconciliationPaymentGateway;
private final ReconciliationPaymentAssembler reconciliationPaymentAssembler;
public List<ReconciliationPaymentVO> execute(ReconciliationPaymentListQry reconciliationPaymentListQry) {
List<ReconciliationPayment> reconciliationPaymentList = reconciliationPaymentGateway.list(reconciliationPaymentListQry);
return reconciliationPaymentList.stream().map(reconciliationPaymentAssembler::toReconciliationPaymentVO).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.ReconciliationPaymentPageQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationPaymentVO;
import com.xunhong.erp.turbo.biz.app.assembler.ReconciliationPaymentAssembler;
import com.xunhong.erp.turbo.biz.domain.entity.ReconciliationPayment;
import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationPaymentGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class ReconciliationPaymentPageQryExe {
private final ReconciliationPaymentGateway reconciliationPaymentGateway;
private final ReconciliationPaymentAssembler reconciliationPaymentAssembler;
public IPage<ReconciliationPaymentVO> execute(ReconciliationPaymentPageQry reconciliationPaymentPageQry) {
IPage<ReconciliationPayment> page = reconciliationPaymentGateway.page(reconciliationPaymentPageQry);
return page.convert(reconciliationPaymentAssembler::toReconciliationPaymentVO);
}
}

View File

@ -0,0 +1,29 @@
package com.xunhong.erp.turbo.biz.app.executor.query;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPaymentShowQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationPaymentVO;
import com.xunhong.erp.turbo.biz.app.assembler.ReconciliationPaymentAssembler;
import com.xunhong.erp.turbo.biz.domain.entity.ReconciliationPayment;
import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationPaymentGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class ReconciliationPaymentShowQryExe {
private final ReconciliationPaymentAssembler reconciliationPaymentAssembler;
private final ReconciliationPaymentGateway reconciliationPaymentGateway;
public ReconciliationPaymentVO execute(ReconciliationPaymentShowQry reconciliationPaymentShowQry) {
ReconciliationPayment reconciliationPayment = reconciliationPaymentGateway.show(reconciliationPaymentShowQry);
return reconciliationPaymentAssembler.toReconciliationPaymentVO(reconciliationPayment);
}
}

View File

@ -0,0 +1,71 @@
package com.xunhong.erp.turbo.biz.app.service;
import com.xunhong.erp.turbo.api.biz.api.ReconciliationInvoiceServiceI;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationInvoiceCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationInvoiceDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationInvoiceUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationInvoiceListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationInvoicePageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationInvoiceShowQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationInvoiceVO;
import com.xunhong.erp.turbo.base.dto.PageDTO;
import com.xunhong.erp.turbo.biz.app.executor.cmd.ReconciliationInvoiceCreateCmdExe;
import com.xunhong.erp.turbo.biz.app.executor.cmd.ReconciliationInvoiceDestroyCmdExe;
import com.xunhong.erp.turbo.biz.app.executor.cmd.ReconciliationInvoiceUpdateCmdExe;
import com.xunhong.erp.turbo.biz.app.executor.query.ReconciliationInvoiceListQryExe;
import com.xunhong.erp.turbo.biz.app.executor.query.ReconciliationInvoicePageQryExe;
import com.xunhong.erp.turbo.biz.app.executor.query.ReconciliationInvoiceShowQryExe;
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 = ReconciliationInvoiceServiceI.class, version = "1.0.0")
@RequiredArgsConstructor
public class ReconciliationInvoiceServiceImpl implements ReconciliationInvoiceServiceI {
private final ReconciliationInvoiceCreateCmdExe reconciliationInvoiceCreateCmdExe;
private final ReconciliationInvoiceUpdateCmdExe reconciliationInvoiceUpdateCmdExe;
private final ReconciliationInvoicePageQryExe reconciliationInvoicePageQryExe;
private final ReconciliationInvoiceListQryExe reconciliationInvoiceListQryExe;
private final ReconciliationInvoiceShowQryExe reconciliationInvoiceShowQryExe;
private final ReconciliationInvoiceDestroyCmdExe reconciliationInvoiceDestroyCmdExe;
@Override
public ReconciliationInvoiceVO create(ReconciliationInvoiceCreateCmd reconciliationInvoiceCreateCmd) {
return reconciliationInvoiceCreateCmdExe.execute(reconciliationInvoiceCreateCmd);
}
@Override
public PageDTO<ReconciliationInvoiceVO> page(ReconciliationInvoicePageQry reconciliationInvoicePageQry) {
return PageDTO.of(reconciliationInvoicePageQryExe.execute(reconciliationInvoicePageQry));
}
@Override
public List<ReconciliationInvoiceVO> list(ReconciliationInvoiceListQry reconciliationInvoiceListQry) {
return reconciliationInvoiceListQryExe.execute(reconciliationInvoiceListQry);
}
@Override
public ReconciliationInvoiceVO update(ReconciliationInvoiceUpdateCmd reconciliationInvoiceUpdateCmd) {
return reconciliationInvoiceUpdateCmdExe.execute(reconciliationInvoiceUpdateCmd);
}
@Override
public ReconciliationInvoiceVO show(ReconciliationInvoiceShowQry reconciliationInvoiceShowQry) {
return reconciliationInvoiceShowQryExe.execute(reconciliationInvoiceShowQry);
}
@Override
public void destroy(ReconciliationInvoiceDestroyCmd reconciliationInvoiceDestroyCmd) {
reconciliationInvoiceDestroyCmdExe.execute(reconciliationInvoiceDestroyCmd);
}
}

View File

@ -0,0 +1,71 @@
package com.xunhong.erp.turbo.biz.app.service;
import com.xunhong.erp.turbo.api.biz.api.ReconciliationPaymentServiceI;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationPaymentCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationPaymentDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationPaymentUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPaymentListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPaymentPageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPaymentShowQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationPaymentVO;
import com.xunhong.erp.turbo.base.dto.PageDTO;
import com.xunhong.erp.turbo.biz.app.executor.cmd.ReconciliationPaymentCreateCmdExe;
import com.xunhong.erp.turbo.biz.app.executor.cmd.ReconciliationPaymentDestroyCmdExe;
import com.xunhong.erp.turbo.biz.app.executor.cmd.ReconciliationPaymentUpdateCmdExe;
import com.xunhong.erp.turbo.biz.app.executor.query.ReconciliationPaymentListQryExe;
import com.xunhong.erp.turbo.biz.app.executor.query.ReconciliationPaymentPageQryExe;
import com.xunhong.erp.turbo.biz.app.executor.query.ReconciliationPaymentShowQryExe;
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 = ReconciliationPaymentServiceI.class, version = "1.0.0")
@RequiredArgsConstructor
public class ReconciliationPaymentServiceImpl implements ReconciliationPaymentServiceI {
private final ReconciliationPaymentCreateCmdExe reconciliationPaymentCreateCmdExe;
private final ReconciliationPaymentUpdateCmdExe reconciliationPaymentUpdateCmdExe;
private final ReconciliationPaymentPageQryExe reconciliationPaymentPageQryExe;
private final ReconciliationPaymentListQryExe reconciliationPaymentListQryExe;
private final ReconciliationPaymentShowQryExe reconciliationPaymentShowQryExe;
private final ReconciliationPaymentDestroyCmdExe reconciliationPaymentDestroyCmdExe;
@Override
public ReconciliationPaymentVO create(ReconciliationPaymentCreateCmd reconciliationPaymentCreateCmd) {
return reconciliationPaymentCreateCmdExe.execute(reconciliationPaymentCreateCmd);
}
@Override
public PageDTO<ReconciliationPaymentVO> page(ReconciliationPaymentPageQry reconciliationPaymentPageQry) {
return PageDTO.of(reconciliationPaymentPageQryExe.execute(reconciliationPaymentPageQry));
}
@Override
public List<ReconciliationPaymentVO> list(ReconciliationPaymentListQry reconciliationPaymentListQry) {
return reconciliationPaymentListQryExe.execute(reconciliationPaymentListQry);
}
@Override
public ReconciliationPaymentVO update(ReconciliationPaymentUpdateCmd reconciliationPaymentUpdateCmd) {
return reconciliationPaymentUpdateCmdExe.execute(reconciliationPaymentUpdateCmd);
}
@Override
public ReconciliationPaymentVO show(ReconciliationPaymentShowQry reconciliationPaymentShowQry) {
return reconciliationPaymentShowQryExe.execute(reconciliationPaymentShowQry);
}
@Override
public void destroy(ReconciliationPaymentDestroyCmd reconciliationPaymentDestroyCmd) {
reconciliationPaymentDestroyCmdExe.execute(reconciliationPaymentDestroyCmd);
}
}

View File

@ -0,0 +1,78 @@
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.common.UploadFileItem;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author shenyifei
*/
@Data
@Entity
@EqualsAndHashCode(callSuper = true)
public class ReconciliationInvoice extends DTO {
/**
* 对账发票ID
*/
private Long reconciliationInvoiceId;
/**
* 对账ID
*/
private Long reconciliationId;
/**
* 对账发票编码
*/
private String invoiceSn;
/**
* 经销商ID
*/
private Long dealerId;
/**
* 经销商账户ID
*/
private Long accountId;
/**
* 发票金额
*/
private BigDecimal invoiceAmount;
/**
* 入账公司ID
*/
private Long companyId;
/**
* 发票日期
*/
private LocalDate invoiceDate;
/**
* 发票图片支持多张
*/
private List<UploadFileItem> invoiceImg;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private LocalDateTime createdAt;
}

View File

@ -0,0 +1,95 @@
package com.xunhong.erp.turbo.biz.domain.entity;
import com.alibaba.cola.domain.Entity;
import com.alibaba.cola.dto.DTO;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* @author shenyifei
*/
@Data
@Entity
@EqualsAndHashCode(callSuper = true)
public class ReconciliationPayment extends DTO {
/**
* 对账付款ID
*/
private Long reconciliationPaymentId;
/**
* 对账ID
*/
private Long reconciliationId;
/**
* 经销商ID
*/
private Long dealerId;
/**
* 我方收款公司ID
*/
private Long companyId;
/**
* 我方收款公司账户ID
*/
private Long accountId;
/**
* 账户类别1_对公账户2_私人账户
*/
private Boolean accountCategory;
/**
* 账户类型1_银行卡2_支付宝3_微信
*/
private Boolean accountType;
/**
* 银行名称
*/
private String bankName;
/**
* 支行名称
*/
private String branchName;
/**
* 开户公司名称&#x2F;支付宝昵称&#x2F;微信号
*/
private String accountName;
/**
* 银行账号&#x2F;支付宝账号&#x2F;微信账号
*/
private String accountNumber;
/**
* 回款时间
*/
private LocalDateTime returnAt;
/**
* 回款金额
*/
private BigDecimal returnAmount;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private LocalDateTime createdAt;
}

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.ReconciliationInvoiceCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationInvoiceDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationInvoiceUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationInvoiceListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationInvoicePageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationInvoiceShowQry;
import com.xunhong.erp.turbo.biz.domain.entity.ReconciliationInvoice;
import java.util.List;
/**
* @author shenyifei
*/
public interface ReconciliationInvoiceGateway {
ReconciliationInvoice save(ReconciliationInvoiceCreateCmd reconciliationInvoiceCreateCmd);
IPage<ReconciliationInvoice> page(ReconciliationInvoicePageQry reconciliationInvoicePageQry);
List<ReconciliationInvoice> list(ReconciliationInvoiceListQry reconciliationInvoiceListQry);
ReconciliationInvoice update(ReconciliationInvoiceUpdateCmd reconciliationInvoiceUpdateCmd);
ReconciliationInvoice show(ReconciliationInvoiceShowQry reconciliationInvoiceShowQry);
void destroy(ReconciliationInvoiceDestroyCmd reconciliationInvoiceDestroyCmd);
}

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.ReconciliationPaymentCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationPaymentDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationPaymentUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPaymentListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPaymentPageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPaymentShowQry;
import com.xunhong.erp.turbo.biz.domain.entity.ReconciliationPayment;
import java.util.List;
/**
* @author shenyifei
*/
public interface ReconciliationPaymentGateway {
ReconciliationPayment save(ReconciliationPaymentCreateCmd reconciliationPaymentCreateCmd);
IPage<ReconciliationPayment> page(ReconciliationPaymentPageQry reconciliationPaymentPageQry);
List<ReconciliationPayment> list(ReconciliationPaymentListQry reconciliationPaymentListQry);
ReconciliationPayment update(ReconciliationPaymentUpdateCmd reconciliationPaymentUpdateCmd);
ReconciliationPayment show(ReconciliationPaymentShowQry reconciliationPaymentShowQry);
void destroy(ReconciliationPaymentDestroyCmd reconciliationPaymentDestroyCmd);
}

View File

@ -0,0 +1,32 @@
package com.xunhong.erp.turbo.biz.infrastructure.convert;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationInvoiceCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationInvoiceUpdateCmd;
import com.xunhong.erp.turbo.biz.domain.entity.ReconciliationInvoice;
import com.xunhong.erp.turbo.biz.infrastructure.entity.ReconciliationInvoiceDO;
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 ReconciliationInvoiceConvert {
ReconciliationInvoice toReconciliationInvoice(ReconciliationInvoiceDO reconciliationInvoiceDO);
@Mapping(target = "version", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
@Mapping(target = "isDelete", ignore = true)
@Mapping(target = "createdAt", ignore = true)
ReconciliationInvoiceDO toReconciliationInvoiceDO(ReconciliationInvoiceCreateCmd reconciliationInvoiceCreateCmd);
@Mapping(target = "version", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
@Mapping(target = "isDelete", ignore = true)
@Mapping(target = "createdAt", ignore = true)
void toReconciliationInvoiceDO(@MappingTarget ReconciliationInvoiceDO reconciliationInvoiceDO, ReconciliationInvoiceUpdateCmd reconciliationInvoiceUpdateCmd);
}

View File

@ -0,0 +1,32 @@
package com.xunhong.erp.turbo.biz.infrastructure.convert;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationPaymentCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationPaymentUpdateCmd;
import com.xunhong.erp.turbo.biz.domain.entity.ReconciliationPayment;
import com.xunhong.erp.turbo.biz.infrastructure.entity.ReconciliationPaymentDO;
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 ReconciliationPaymentConvert {
ReconciliationPayment toReconciliationPayment(ReconciliationPaymentDO reconciliationPaymentDO);
@Mapping(target = "version", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
@Mapping(target = "isDelete", ignore = true)
@Mapping(target = "createdAt", ignore = true)
ReconciliationPaymentDO toReconciliationPaymentDO(ReconciliationPaymentCreateCmd reconciliationPaymentCreateCmd);
@Mapping(target = "version", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
@Mapping(target = "isDelete", ignore = true)
@Mapping(target = "createdAt", ignore = true)
void toReconciliationPaymentDO(@MappingTarget ReconciliationPaymentDO reconciliationPaymentDO, ReconciliationPaymentUpdateCmd reconciliationPaymentUpdateCmd);
}

View File

@ -138,16 +138,5 @@ public class PaymentRecordDO extends BaseDO<PaymentRecordDO> {
@TableField(exist = false)
private OrderCostDO orderCostDO;
/**
* 付款记录编号
*
* @return 付款记录编号
*/
public String generatePaymentRecordSn() {
// 生成类似 PAY20251105001 格式的编号
return "PAY" + java.time.LocalDate.now().format(java.time.format.DateTimeFormatter.BASIC_ISO_DATE)
+ String.format("%03d", System.currentTimeMillis() % 1000);
}
}

View File

@ -94,10 +94,5 @@ public class ReconciliationDO extends BaseDO<ReconciliationDO> {
@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,93 @@
package com.xunhong.erp.turbo.biz.infrastructure.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.xunhong.erp.turbo.api.biz.dto.common.UploadFileItem;
import com.xunhong.erp.turbo.datasource.domain.entity.BaseDO;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author shenyifei
*/
@Data
@TableName(value = "reconciliation_invoice", autoResultMap = true)
@EqualsAndHashCode(callSuper = true)
public class ReconciliationInvoiceDO extends BaseDO<ReconciliationInvoiceDO> {
/**
* 对账发票ID
*/
@TableId(value = "reconciliation_invoice_id", type = IdType.ASSIGN_ID)
private Long reconciliationInvoiceId;
/**
* 对账ID
*/
@TableField(value = "reconciliation_id")
private Long reconciliationId;
/**
* 对账发票编码
*/
@TableField(value = "invoice_sn")
private String invoiceSn;
/**
* 经销商ID
*/
@TableField(value = "dealer_id")
private Long dealerId;
/**
* 经销商账户ID
*/
@TableField(value = "account_id")
private Long accountId;
/**
* 发票金额
*/
@TableField(value = "invoice_amount")
private BigDecimal invoiceAmount;
/**
* 入账公司ID
*/
@TableField(value = "company_id")
private Long companyId;
/**
* 发票日期
*/
@TableField(value = "invoice_date")
private LocalDate invoiceDate;
/**
* 发票图片支持多张
*/
@TableField(value = "invoice_img", typeHandler = JacksonTypeHandler.class)
private List<UploadFileItem> invoiceImg;
/**
* 备注
*/
@TableField(value = "remark")
private String remark;
/**
* 创建时间
*/
@TableField(value = "created_at")
private LocalDateTime createdAt;
}

View File

@ -0,0 +1,107 @@
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;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* @author shenyifei
*/
@Data
@TableName(value = "reconciliation_payment")
@EqualsAndHashCode(callSuper = true)
public class ReconciliationPaymentDO extends BaseDO<ReconciliationPaymentDO> {
/**
* 对账付款ID
*/
@TableId(value = "reconciliation_payment_id", type = IdType.ASSIGN_ID)
private Long reconciliationPaymentId;
/**
* 对账ID
*/
@TableField(value = "reconciliation_id")
private Long reconciliationId;
/**
* 经销商ID
*/
@TableField(value = "dealer_id")
private Long dealerId;
/**
* 我方收款公司ID
*/
@TableField(value = "company_id")
private Long companyId;
/**
* 我方收款公司账户ID
*/
@TableField(value = "account_id")
private Long accountId;
/**
* 账户类别1_对公账户2_私人账户
*/
@TableField(value = "account_category")
private Boolean accountCategory;
/**
* 账户类型1_银行卡2_支付宝3_微信
*/
@TableField(value = "account_type")
private Boolean accountType;
/**
* 银行名称
*/
@TableField(value = "bank_name")
private String bankName;
/**
* 支行名称
*/
@TableField(value = "branch_name")
private String branchName;
/**
* 开户公司名称&#x2F;支付宝昵称&#x2F;微信号
*/
@TableField(value = "account_name")
private String accountName;
/**
* 银行账号&#x2F;支付宝账号&#x2F;微信账号
*/
@TableField(value = "account_number")
private String accountNumber;
/**
* 回款时间
*/
@TableField(value = "return_at")
private LocalDateTime returnAt;
/**
* 回款金额
*/
@TableField(value = "return_amount")
private BigDecimal returnAmount;
/**
* 备注
*/
@TableField(value = "remark")
private String remark;
}

View File

@ -20,6 +20,7 @@ import com.xunhong.erp.turbo.biz.infrastructure.convert.OrderCostConvert;
import com.xunhong.erp.turbo.biz.infrastructure.convert.PaymentRecordConvert;
import com.xunhong.erp.turbo.biz.infrastructure.entity.*;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.*;
import com.xunhong.erp.turbo.biz.util.SerialNumberGenerator;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository;
@ -137,7 +138,7 @@ public class OrderCostGatewayImpl implements OrderCostGateway {
}
PaymentRecordDO paymentRecordDO = orderCostConvert.toPaymentRecordDO(orderCostPayCmd);
paymentRecordDO.setPaymentRecordSn(paymentRecordDO.generatePaymentRecordSn());
paymentRecordDO.setPaymentRecordSn(SerialNumberGenerator.generate("PAY"));
paymentRecordDO.setTargetId(orderCostPayCmd.getOrderCostId());
paymentRecordDO.setTargetType(PaymentTargetTypeEnum.ORDER_COST);
paymentRecordDO.setPaidState(PaymentRecordStateEnum.PAID);

View File

@ -18,6 +18,7 @@ import com.xunhong.erp.turbo.biz.domain.gateway.OrderGateway;
import com.xunhong.erp.turbo.biz.infrastructure.convert.*;
import com.xunhong.erp.turbo.biz.infrastructure.entity.*;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.*;
import com.xunhong.erp.turbo.biz.util.SerialNumberGenerator;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@ -430,7 +431,7 @@ public class OrderGatewayImpl implements OrderGateway {
orderShipDO.setOrderShipId(null);
// 生成发货单编号
if (StrUtil.isBlank(orderShipDO.getOrderSn())) {
orderShipDO.setOrderSn("FH" + generateOrderShipSn());
orderShipDO.setOrderSn(SerialNumberGenerator.generate("FH"));
}
shipsToInsert.add(orderShipDO);
}
@ -716,17 +717,6 @@ public class OrderGatewayImpl implements OrderGateway {
}
}
/**
* 生成发货单编号
*
* @return 发货单编号
*/
private String generateOrderShipSn() {
// 生成类似 SO20251105001 格式的编号
return java.time.LocalDate.now().format(java.time.format.DateTimeFormatter.BASIC_ISO_DATE)
+ String.format("%03d", System.currentTimeMillis() % 1000);
}
@Override
public void rejectFinal(OrderRejectFinalCmd orderRejectFinalCmd) {
LambdaQueryWrapper<OrderDO> queryWrapper = Wrappers.lambdaQuery(OrderDO.class);
@ -762,7 +752,7 @@ public class OrderGatewayImpl implements OrderGateway {
if (orderStep1Cmd.getOrderId() == null) {
orderDO = orderConvert.toOrderDO(orderStep1Cmd);
orderDO.setState(OrderStateEnum.DRAFT);
orderDO.setOrderSn("CG" + generateOrderShipSn());
orderDO.setOrderSn(SerialNumberGenerator.generate("CG"));
orderDO.setType(orderStep1Cmd.getType());
orderMapper.insert(orderDO);
} else {
@ -1000,15 +990,6 @@ public class OrderGatewayImpl implements OrderGateway {
}
}
/**
* 生成编码
*/
private String generateInvoiceSn() {
// 生成类似 SO20251105001 格式的编号
return java.time.LocalDate.now().format(java.time.format.DateTimeFormatter.BASIC_ISO_DATE)
+ String.format("%03d", System.currentTimeMillis() % 1000);
}
/**
* 处理供应商发票信息
* 逻辑
@ -1049,7 +1030,7 @@ public class OrderGatewayImpl implements OrderGateway {
newInvoice.setInvoiceImg(frontendInvoiceImg);
newInvoice.setCreatedBy(orderStep2Cmd.getCreatedBy());
newInvoice.setCreatedByName(orderStep2Cmd.getCreatedByName());
newInvoice.setInvoiceSn("INV" + generateInvoiceSn());
newInvoice.setInvoiceSn(SerialNumberGenerator.generate("INV"));
// 构建 orderSupplierInvoice 列表
List<OrderSupplierInvoice> orderSupplierInvoiceList = buildOrderSupplierInvoiceList(supplierDO);

View File

@ -24,6 +24,7 @@ import com.xunhong.erp.turbo.biz.infrastructure.convert.PaymentTaskConvert;
import com.xunhong.erp.turbo.biz.infrastructure.convert.PaymentTaskSupplierConvert;
import com.xunhong.erp.turbo.biz.infrastructure.entity.*;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.*;
import com.xunhong.erp.turbo.biz.util.SerialNumberGenerator;
import lombok.RequiredArgsConstructor;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
@ -60,22 +61,11 @@ public class PaymentTaskGatewayImpl implements PaymentTaskGateway {
private final PaymentRecordMapper paymentRecordMapper;
/**
* 付款任务编号
*
* @return 付款任务编号
*/
private String generatePaymentTaskSn() {
// 生成类似 SO20251105001 格式的编号
return java.time.LocalDate.now().format(java.time.format.DateTimeFormatter.BASIC_ISO_DATE)
+ String.format("%03d", System.currentTimeMillis() % 1000);
}
@Override
@Transactional
public PaymentTask save(PaymentTaskCreateCmd paymentTaskCreateCmd) {
PaymentTaskDO paymentTaskDO = paymentTaskConvert.toPaymentTaskDO(paymentTaskCreateCmd);
paymentTaskDO.setPaymentTaskSn("TASK" + generatePaymentTaskSn());
paymentTaskDO.setPaymentTaskSn(SerialNumberGenerator.generate("TASK"));
paymentTaskMapper.insert(paymentTaskDO);
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
@ -239,7 +229,7 @@ public class PaymentTaskGatewayImpl implements PaymentTaskGateway {
// 创建付款记录
PaymentRecordDO paymentRecordDO = new PaymentRecordDO();
paymentRecordDO.setPaymentRecordSn(paymentRecordDO.generatePaymentRecordSn());
paymentRecordDO.setPaymentRecordSn(SerialNumberGenerator.generate("PAY"));
paymentRecordDO.setPaymentTaskId(paymentTaskPayCmd.getPaymentTaskId());
paymentRecordDO.setTargetId(paymentTaskDO.getTargetId());
paymentRecordDO.setTargetType(paymentTaskDO.getTaskType().equals(PaymentTaskTypeEnum.MELON_FARMER)

View File

@ -22,6 +22,7 @@ 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 com.xunhong.erp.turbo.biz.util.SerialNumberGenerator;
import lombok.RequiredArgsConstructor;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
@ -60,7 +61,7 @@ public class ReconciliationGatewayImpl implements ReconciliationGateway {
@Transactional
public Reconciliation save(ReconciliationCreateCmd reconciliationCreateCmd) {
ReconciliationDO reconciliationDO = reconciliationConvert.toReconciliationDO(reconciliationCreateCmd);
reconciliationDO.setReconciliationSn(reconciliationDO.generateReconciliationSn());
reconciliationDO.setReconciliationSn(SerialNumberGenerator.generate("DZ"));
reconciliationDO.setState(ReconciliationStateEnum.PENDING);
reconciliationMapper.insert(reconciliationDO);

View File

@ -0,0 +1,94 @@
package com.xunhong.erp.turbo.biz.infrastructure.gateway;
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.ReconciliationInvoiceCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationInvoiceDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationInvoiceUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationInvoiceListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationInvoicePageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationInvoiceShowQry;
import com.xunhong.erp.turbo.biz.domain.entity.ReconciliationInvoice;
import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationInvoiceGateway;
import com.xunhong.erp.turbo.biz.infrastructure.convert.ReconciliationInvoiceConvert;
import com.xunhong.erp.turbo.biz.infrastructure.entity.ReconciliationInvoiceDO;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.ReconciliationInvoiceMapper;
import com.xunhong.erp.turbo.biz.util.SerialNumberGenerator;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author shenyifei
*/
@Repository
@RequiredArgsConstructor
public class ReconciliationInvoiceGatewayImpl implements ReconciliationInvoiceGateway {
private final ReconciliationInvoiceMapper reconciliationInvoiceMapper;
private final ReconciliationInvoiceConvert reconciliationInvoiceConvert;
@Override
public ReconciliationInvoice save(ReconciliationInvoiceCreateCmd reconciliationInvoiceCreateCmd) {
ReconciliationInvoiceDO reconciliationInvoiceDO = reconciliationInvoiceConvert.toReconciliationInvoiceDO(reconciliationInvoiceCreateCmd);
reconciliationInvoiceDO.setInvoiceSn(SerialNumberGenerator.generate("INV"));
reconciliationInvoiceMapper.insert(reconciliationInvoiceDO);
return reconciliationInvoiceConvert.toReconciliationInvoice(reconciliationInvoiceDO);
}
@Override
public IPage<ReconciliationInvoice> page(ReconciliationInvoicePageQry reconciliationInvoicePageQry) {
LambdaQueryWrapper<ReconciliationInvoiceDO> queryWrapper = Wrappers.lambdaQuery(ReconciliationInvoiceDO.class);
queryWrapper.orderByDesc(ReconciliationInvoiceDO::getCreatedAt);
IPage<ReconciliationInvoiceDO> page = new Page<>(reconciliationInvoicePageQry.getPageIndex(), reconciliationInvoicePageQry.getPageSize());
page = reconciliationInvoiceMapper.selectPage(page, queryWrapper);
return page.convert(reconciliationInvoiceConvert::toReconciliationInvoice);
}
@Override
public List<ReconciliationInvoice> list(ReconciliationInvoiceListQry reconciliationInvoiceListQry) {
LambdaQueryWrapper<ReconciliationInvoiceDO> queryWrapper = Wrappers.lambdaQuery(ReconciliationInvoiceDO.class);
List<ReconciliationInvoiceDO> reconciliationInvoiceDOList = reconciliationInvoiceMapper.selectList(queryWrapper);
return reconciliationInvoiceDOList.stream().map(reconciliationInvoiceConvert::toReconciliationInvoice).toList();
}
@Override
public ReconciliationInvoice update(ReconciliationInvoiceUpdateCmd reconciliationInvoiceUpdateCmd) {
LambdaQueryWrapper<ReconciliationInvoiceDO> queryWrapper = Wrappers.lambdaQuery(ReconciliationInvoiceDO.class);
queryWrapper.eq(ReconciliationInvoiceDO::getReconciliationInvoiceId, reconciliationInvoiceUpdateCmd.getReconciliationInvoiceId());
queryWrapper.last("limit 1");
ReconciliationInvoiceDO reconciliationInvoiceDO = reconciliationInvoiceMapper.selectOne(queryWrapper);
reconciliationInvoiceConvert.toReconciliationInvoiceDO(reconciliationInvoiceDO, reconciliationInvoiceUpdateCmd);
reconciliationInvoiceMapper.updateById(reconciliationInvoiceDO);
return reconciliationInvoiceConvert.toReconciliationInvoice(reconciliationInvoiceDO);
}
@Override
public ReconciliationInvoice show(ReconciliationInvoiceShowQry reconciliationInvoiceShowQry) {
LambdaQueryWrapper<ReconciliationInvoiceDO> queryWrapper = Wrappers.lambdaQuery(ReconciliationInvoiceDO.class);
queryWrapper.eq(ReconciliationInvoiceDO::getReconciliationInvoiceId, reconciliationInvoiceShowQry.getReconciliationInvoiceId());
queryWrapper.last("limit 1");
ReconciliationInvoiceDO reconciliationInvoiceDO = reconciliationInvoiceMapper.selectOne(queryWrapper);
return reconciliationInvoiceConvert.toReconciliationInvoice(reconciliationInvoiceDO);
}
@Override
public void destroy(ReconciliationInvoiceDestroyCmd reconciliationInvoiceDestroyCmd) {
LambdaQueryWrapper<ReconciliationInvoiceDO> queryWrapper = Wrappers.lambdaQuery(ReconciliationInvoiceDO.class);
queryWrapper.eq(ReconciliationInvoiceDO::getReconciliationInvoiceId, reconciliationInvoiceDestroyCmd.getReconciliationInvoiceId());
queryWrapper.last("limit 1");
ReconciliationInvoiceDO reconciliationInvoiceDO = reconciliationInvoiceMapper.selectOne(queryWrapper);
reconciliationInvoiceDO.deleteById();
}
}

View File

@ -0,0 +1,92 @@
package com.xunhong.erp.turbo.biz.infrastructure.gateway;
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.ReconciliationPaymentCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationPaymentDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationPaymentUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPaymentListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPaymentPageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPaymentShowQry;
import com.xunhong.erp.turbo.biz.domain.entity.ReconciliationPayment;
import com.xunhong.erp.turbo.biz.domain.gateway.ReconciliationPaymentGateway;
import com.xunhong.erp.turbo.biz.infrastructure.convert.ReconciliationPaymentConvert;
import com.xunhong.erp.turbo.biz.infrastructure.entity.ReconciliationPaymentDO;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.ReconciliationPaymentMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author shenyifei
*/
@Repository
@RequiredArgsConstructor
public class ReconciliationPaymentGatewayImpl implements ReconciliationPaymentGateway {
private final ReconciliationPaymentMapper reconciliationPaymentMapper;
private final ReconciliationPaymentConvert reconciliationPaymentConvert;
@Override
public ReconciliationPayment save(ReconciliationPaymentCreateCmd reconciliationPaymentCreateCmd) {
ReconciliationPaymentDO reconciliationPaymentDO = reconciliationPaymentConvert.toReconciliationPaymentDO(reconciliationPaymentCreateCmd);
reconciliationPaymentMapper.insert(reconciliationPaymentDO);
return reconciliationPaymentConvert.toReconciliationPayment(reconciliationPaymentDO);
}
@Override
public IPage<ReconciliationPayment> page(ReconciliationPaymentPageQry reconciliationPaymentPageQry) {
LambdaQueryWrapper<ReconciliationPaymentDO> queryWrapper = Wrappers.lambdaQuery(ReconciliationPaymentDO.class);
queryWrapper.orderByDesc(ReconciliationPaymentDO::getCreatedAt);
IPage<ReconciliationPaymentDO> page = new Page<>(reconciliationPaymentPageQry.getPageIndex(), reconciliationPaymentPageQry.getPageSize());
page = reconciliationPaymentMapper.selectPage(page, queryWrapper);
return page.convert(reconciliationPaymentConvert::toReconciliationPayment);
}
@Override
public List<ReconciliationPayment> list(ReconciliationPaymentListQry reconciliationPaymentListQry) {
LambdaQueryWrapper<ReconciliationPaymentDO> queryWrapper = Wrappers.lambdaQuery(ReconciliationPaymentDO.class);
List<ReconciliationPaymentDO> reconciliationPaymentDOList = reconciliationPaymentMapper.selectList(queryWrapper);
return reconciliationPaymentDOList.stream().map(reconciliationPaymentConvert::toReconciliationPayment).toList();
}
@Override
public ReconciliationPayment update(ReconciliationPaymentUpdateCmd reconciliationPaymentUpdateCmd) {
LambdaQueryWrapper<ReconciliationPaymentDO> queryWrapper = Wrappers.lambdaQuery(ReconciliationPaymentDO.class);
queryWrapper.eq(ReconciliationPaymentDO::getReconciliationPaymentId, reconciliationPaymentUpdateCmd.getReconciliationPaymentId());
queryWrapper.last("limit 1");
ReconciliationPaymentDO reconciliationPaymentDO = reconciliationPaymentMapper.selectOne(queryWrapper);
reconciliationPaymentConvert.toReconciliationPaymentDO(reconciliationPaymentDO, reconciliationPaymentUpdateCmd);
reconciliationPaymentMapper.updateById(reconciliationPaymentDO);
return reconciliationPaymentConvert.toReconciliationPayment(reconciliationPaymentDO);
}
@Override
public ReconciliationPayment show(ReconciliationPaymentShowQry reconciliationPaymentShowQry) {
LambdaQueryWrapper<ReconciliationPaymentDO> queryWrapper = Wrappers.lambdaQuery(ReconciliationPaymentDO.class);
queryWrapper.eq(ReconciliationPaymentDO::getReconciliationPaymentId, reconciliationPaymentShowQry.getReconciliationPaymentId());
queryWrapper.last("limit 1");
ReconciliationPaymentDO reconciliationPaymentDO = reconciliationPaymentMapper.selectOne(queryWrapper);
return reconciliationPaymentConvert.toReconciliationPayment(reconciliationPaymentDO);
}
@Override
public void destroy(ReconciliationPaymentDestroyCmd reconciliationPaymentDestroyCmd) {
LambdaQueryWrapper<ReconciliationPaymentDO> queryWrapper = Wrappers.lambdaQuery(ReconciliationPaymentDO.class);
queryWrapper.eq(ReconciliationPaymentDO::getReconciliationPaymentId, reconciliationPaymentDestroyCmd.getReconciliationPaymentId());
queryWrapper.last("limit 1");
ReconciliationPaymentDO reconciliationPaymentDO = reconciliationPaymentMapper.selectOne(queryWrapper);
reconciliationPaymentDO.deleteById();
}
}

View File

@ -20,6 +20,7 @@ import com.xunhong.erp.turbo.biz.infrastructure.entity.OrderSupplierDO;
import com.xunhong.erp.turbo.biz.infrastructure.entity.SupplierInvoiceDO;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.OrderSupplierMapper;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.SupplierInvoiceMapper;
import com.xunhong.erp.turbo.biz.util.SerialNumberGenerator;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@ -38,20 +39,11 @@ public class SupplierInvoiceGatewayImpl implements SupplierInvoiceGateway {
private final OrderSupplierMapper orderSupplierMapper;
/**
* 生成编码
*/
private String generateInvoiceSn() {
// 生成类似 SO20251105001 格式的编号
return java.time.LocalDate.now().format(java.time.format.DateTimeFormatter.BASIC_ISO_DATE)
+ String.format("%03d", System.currentTimeMillis() % 1000);
}
@Override
@Transactional
public SupplierInvoice save(SupplierInvoiceCreateCmd supplierInvoiceCreateCmd) {
SupplierInvoiceDO supplierInvoiceDO = supplierInvoiceConvert.toInvoiceDO(supplierInvoiceCreateCmd);
supplierInvoiceDO.setInvoiceSn("INV" + generateInvoiceSn());
supplierInvoiceDO.setInvoiceSn(SerialNumberGenerator.generate("INV"));
supplierInvoiceMapper.insert(supplierInvoiceDO);
List<Long> orderSupplierIdList = supplierInvoiceCreateCmd.getOrderSupplierInvoiceList().stream().map(OrderSupplierInvoice::getOrderSupplierId).toList();

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.ReconciliationInvoiceDO;
import org.apache.ibatis.annotations.Mapper;
/**
* @author shenyifei
*/
@Mapper
public interface ReconciliationInvoiceMapper extends BaseMapper<ReconciliationInvoiceDO> {
}

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.ReconciliationPaymentDO;
import org.apache.ibatis.annotations.Mapper;
/**
* @author shenyifei
*/
@Mapper
public interface ReconciliationPaymentMapper extends BaseMapper<ReconciliationPaymentDO> {
}

View File

@ -0,0 +1,134 @@
package com.xunhong.erp.turbo.biz.util;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
/**
* 编号生成工具类
* <p>
* 用于生成各类业务编号格式为前缀 + 日期(YYYYMMDD) + 序号
* 例如DZ20250113001, INV20250113002
*
* @author shenyifei
*/
public class SerialNumberGenerator {
/**
* 日期格式化器 - 基本格式YYYYMMDD
*/
private static final DateTimeFormatter BASIC_DATE_FORMATTER = DateTimeFormatter.BASIC_ISO_DATE;
/**
* 默认序号位数
*/
private static final int DEFAULT_SEQUENCE_DIGITS = 3;
/**
* 默认序号范围0-999
*/
private static final int MAX_SEQUENCE = 1000;
/**
* 私有构造函数防止实例化
*/
private SerialNumberGenerator() {
throw new UnsupportedOperationException("Utility class cannot be instantiated");
}
/**
* 生成编号不带前缀
* <p>
* 格式YYYYMMDD + 序号(3位)
* 例如20250113001
*
* @return 编号字符串
*/
public static String generate() {
return generate(null, DEFAULT_SEQUENCE_DIGITS);
}
/**
* 生成编号带前缀
* <p>
* 格式前缀 + YYYYMMDD + 序号(3位)
* 例如DZ20250113001
*
* @param prefix 编号前缀可为空
* @return 编号字符串
*/
public static String generate(String prefix) {
return generate(prefix, DEFAULT_SEQUENCE_DIGITS);
}
/**
* 生成编号自定义序号位数
* <p>
* 格式前缀 + YYYYMMDD + 序号
* 例如DZ202501130013位序号DZ202501130000015位序号
*
* @param prefix 编号前缀可为空
* @param sequenceDigits 序号位数
* @return 编号字符串
*/
public static String generate(String prefix, int sequenceDigits) {
String datePart = LocalDate.now().format(BASIC_DATE_FORMATTER);
int sequence = (int) (System.currentTimeMillis() % getMaxSequence(sequenceDigits));
String sequencePart = String.format("%0" + sequenceDigits + "d", sequence);
StringBuilder sb = new StringBuilder();
if (prefix != null && !prefix.isEmpty()) {
sb.append(prefix);
}
sb.append(datePart).append(sequencePart);
return sb.toString();
}
/**
* 生成日期部分YYYYMMDD
*
* @return 日期字符串
*/
public static String generateDatePart() {
return LocalDate.now().format(BASIC_DATE_FORMATTER);
}
/**
* 生成序号部分
*
* @param digits 序号位数
* @return 序号字符串
*/
public static String generateSequencePart(int digits) {
int sequence = (int) (System.currentTimeMillis() % getMaxSequence(digits));
return String.format("%0" + digits + "d", sequence);
}
/**
* 获取指定位数的最大序号
*
* @param digits 序号位数
* @return 最大序号10的digits次方
*/
private static int getMaxSequence(int digits) {
if (digits <= 0) {
throw new IllegalArgumentException("Sequence digits must be positive");
}
if (digits > 9) {
throw new IllegalArgumentException("Sequence digits cannot exceed 9");
}
return (int) Math.pow(10, digits);
}
/**
* 生成编号使用当前时间戳的低3位作为序号
* <p>
* 与旧代码兼容的方法生成格式YYYYMMDD + 3位序号
*
* @return 编号字符串
*/
public static String generateLegacy() {
return LocalDate.now().format(BASIC_DATE_FORMATTER)
+ String.format("%03d", System.currentTimeMillis() % MAX_SEQUENCE);
}
}

View File

@ -0,0 +1,26 @@
<?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.ReconciliationPaymentMapper">
<resultMap id="BaseResultMap" type="com.xunhong.erp.turbo.biz.infrastructure.entity.ReconciliationPaymentDO">
<result property="reconciliationPaymentId" column="reconciliation_payment_id"/>
<result property="reconciliationId" column="reconciliation_id"/>
<result property="dealerId" column="dealer_id"/>
<result property="companyId" column="company_id"/>
<result property="accountId" column="account_id"/>
<result property="accountCategory" column="account_category"/>
<result property="accountType" column="account_type"/>
<result property="bankName" column="bank_name"/>
<result property="branchName" column="branch_name"/>
<result property="accountName" column="account_name"/>
<result property="accountNumber" column="account_number"/>
<result property="returnAt" column="return_at"/>
<result property="returnAmount" column="return_amount"/>
<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>
</mapper>

View File

@ -0,0 +1,23 @@
<?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.ReconciliationInvoiceMapper">
<resultMap id="BaseResultMap" type="com.xunhong.erp.turbo.biz.infrastructure.entity.ReconciliationInvoiceDO">
<result property="reconciliationInvoiceId" column="reconciliation_invoice_id"/>
<result property="reconciliationId" column="reconciliation_id"/>
<result property="invoiceSn" column="invoice_sn"/>
<result property="dealerId" column="dealer_id"/>
<result property="accountId" column="account_id"/>
<result property="invoiceAmount" column="invoice_amount"/>
<result property="companyId" column="company_id"/>
<result property="invoiceDate" column="invoice_date"/>
<result property="invoiceImg" column="invoice_img"
typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
<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>
</mapper>

View File

@ -0,0 +1,30 @@
package com.xunhong.erp.turbo.api.biz.api;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationInvoiceCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationInvoiceDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationInvoiceUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationInvoiceListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationInvoicePageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationInvoiceShowQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationInvoiceVO;
import com.xunhong.erp.turbo.base.dto.PageDTO;
import java.util.List;
/**
* @author shenyifei
*/
public interface ReconciliationInvoiceServiceI {
ReconciliationInvoiceVO create(ReconciliationInvoiceCreateCmd reconciliationInvoiceCreateCmd);
PageDTO<ReconciliationInvoiceVO> page(ReconciliationInvoicePageQry reconciliationInvoicePageQry);
List<ReconciliationInvoiceVO> list(ReconciliationInvoiceListQry reconciliationInvoiceListQry);
ReconciliationInvoiceVO update(ReconciliationInvoiceUpdateCmd reconciliationInvoiceUpdateCmd);
ReconciliationInvoiceVO show(ReconciliationInvoiceShowQry reconciliationInvoiceShowQry);
void destroy(ReconciliationInvoiceDestroyCmd reconciliationInvoiceDestroyCmd);
}

View File

@ -0,0 +1,30 @@
package com.xunhong.erp.turbo.api.biz.api;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationPaymentCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationPaymentDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.ReconciliationPaymentUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPaymentListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPaymentPageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.ReconciliationPaymentShowQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.ReconciliationPaymentVO;
import com.xunhong.erp.turbo.base.dto.PageDTO;
import java.util.List;
/**
* @author shenyifei
*/
public interface ReconciliationPaymentServiceI {
ReconciliationPaymentVO create(ReconciliationPaymentCreateCmd reconciliationPaymentCreateCmd);
PageDTO<ReconciliationPaymentVO> page(ReconciliationPaymentPageQry reconciliationPaymentPageQry);
List<ReconciliationPaymentVO> list(ReconciliationPaymentListQry reconciliationPaymentListQry);
ReconciliationPaymentVO update(ReconciliationPaymentUpdateCmd reconciliationPaymentUpdateCmd);
ReconciliationPaymentVO show(ReconciliationPaymentShowQry reconciliationPaymentShowQry);
void destroy(ReconciliationPaymentDestroyCmd reconciliationPaymentDestroyCmd);
}

View File

@ -0,0 +1,89 @@
package com.xunhong.erp.turbo.api.biz.dto.cmd;
import com.xunhong.erp.turbo.api.biz.dto.common.UploadFileItem;
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.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author shenyifei
*/
@Data
@Schema(title = "对账发票创建")
@EqualsAndHashCode(callSuper = true)
public class ReconciliationInvoiceCreateCmd extends Command {
/**
* 对账发票ID
*/
@Schema(title = "对账发票ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED)
private Long reconciliationInvoiceId;
/**
* 对账ID
*/
@Schema(title = "对账ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED)
private Long reconciliationId;
/**
* 对账发票编码
*/
@Schema(title = "对账发票编码", requiredMode = Schema.RequiredMode.REQUIRED)
private String invoiceSn;
/**
* 经销商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 accountId;
/**
* 发票金额
*/
@Schema(title = "发票金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal invoiceAmount;
/**
* 入账公司ID
*/
@Schema(title = "入账公司ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED)
private Long companyId;
/**
* 发票日期
*/
@Schema(title = "发票日期", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDate invoiceDate;
/**
* 发票图片支持多张
*/
@Schema(title = "发票图片(支持多张)")
private List<UploadFileItem> invoiceImg;
/**
* 备注
*/
@Schema(title = "备注")
private String remark;
/**
* 创建时间
*/
@Schema(title = "创建时间")
private LocalDateTime createdAt;
}

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 ReconciliationInvoiceDestroyCmd extends Command {
@Schema(title = "对账发票ID", requiredMode = Schema.RequiredMode.REQUIRED, type = "string")
private Long reconciliationInvoiceId;
}

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 ReconciliationInvoiceUpdateCmd extends ReconciliationInvoiceCreateCmd {
@Schema(title = "对账发票ID", requiredMode = Schema.RequiredMode.REQUIRED, type = "string")
private Long reconciliationInvoiceId;
}

View File

@ -0,0 +1,110 @@
package com.xunhong.erp.turbo.api.biz.dto.cmd;
import com.xunhong.erp.turbo.base.dto.Command;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* @author shenyifei
*/
@Data
@Schema(title = "对账付款创建")
@EqualsAndHashCode(callSuper = true)
public class ReconciliationPaymentCreateCmd extends Command {
/**
* 对账付款ID
*/
@Schema(title = "对账付款ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED)
private Long reconciliationPaymentId;
/**
* 对账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 dealerId;
/**
* 我方收款公司ID
*/
@Schema(title = "我方收款公司ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED)
private Long companyId;
/**
* 我方收款公司账户ID
*/
@Schema(title = "我方收款公司账户ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED)
private Long accountId;
/**
* 账户类别1_对公账户2_私人账户
*/
@Schema(title = "账户类别1_对公账户2_私人账户", requiredMode = Schema.RequiredMode.REQUIRED)
private Boolean accountCategory;
/**
* 账户类型1_银行卡2_支付宝3_微信
*/
@Schema(title = "账户类型1_银行卡2_支付宝3_微信", requiredMode = Schema.RequiredMode.REQUIRED)
private Boolean accountType;
/**
* 银行名称
*/
@Schema(title = "银行名称")
private String bankName;
/**
* 支行名称
*/
@Schema(title = "支行名称")
private String branchName;
/**
* 开户公司名称&#x2F;支付宝昵称&#x2F;微信号
*/
@Schema(title = "开户公司名称&#x2F;支付宝昵称&#x2F;微信号", requiredMode = Schema.RequiredMode.REQUIRED)
private String accountName;
/**
* 银行账号&#x2F;支付宝账号&#x2F;微信账号
*/
@Schema(title = "银行账号&#x2F;支付宝账号&#x2F;微信账号", requiredMode = Schema.RequiredMode.REQUIRED)
private String accountNumber;
/**
* 回款时间
*/
@Schema(title = "回款时间")
private LocalDateTime returnAt;
/**
* 回款金额
*/
@Schema(title = "回款金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal returnAmount;
/**
* 备注
*/
@Schema(title = "备注")
private String remark;
/**
* 创建时间
*/
@Schema(title = "创建时间")
private LocalDateTime createdAt;
}

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 ReconciliationPaymentDestroyCmd extends Command {
@Schema(title = "对账付款ID", requiredMode = Schema.RequiredMode.REQUIRED, type = "string")
private Long reconciliationPaymentId;
}

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 ReconciliationPaymentUpdateCmd extends ReconciliationPaymentCreateCmd {
@Schema(title = "对账付款ID", requiredMode = Schema.RequiredMode.REQUIRED, type = "string")
private Long reconciliationPaymentId;
}

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 ReconciliationInvoiceListQry extends Query {
@Schema(title = "对账发票ID", type = "string")
private Long reconciliationInvoiceId;
}

View File

@ -0,0 +1,19 @@
package com.xunhong.erp.turbo.api.biz.dto.qry;
import com.xunhong.erp.turbo.base.dto.PageQuery;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author shenyifei
*/
@Data
@Schema(title = "对账发票分页查询")
@EqualsAndHashCode(callSuper = true)
public class ReconciliationInvoicePageQry extends PageQuery {
@Schema(title = "对账发票ID", type = "string")
private Long reconciliationInvoiceId;
}

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 ReconciliationInvoiceShowQry extends Query {
@Schema(title = "对账发票ID", type = "string")
private Long reconciliationInvoiceId;
}

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 ReconciliationPaymentListQry extends Query {
@Schema(title = "对账付款ID", type = "string")
private Long reconciliationPaymentId;
}

View File

@ -0,0 +1,19 @@
package com.xunhong.erp.turbo.api.biz.dto.qry;
import com.xunhong.erp.turbo.base.dto.PageQuery;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author shenyifei
*/
@Data
@Schema(title = "对账付款分页查询")
@EqualsAndHashCode(callSuper = true)
public class ReconciliationPaymentPageQry extends PageQuery {
@Schema(title = "对账付款ID", type = "string")
private Long reconciliationPaymentId;
}

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 ReconciliationPaymentShowQry extends Query {
@Schema(title = "对账付款ID", type = "string")
private Long reconciliationPaymentId;
}

View File

@ -0,0 +1,89 @@
package com.xunhong.erp.turbo.api.biz.dto.vo;
import com.alibaba.cola.dto.DTO;
import com.xunhong.erp.turbo.api.biz.dto.common.UploadFileItem;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author shenyifei
*/
@Data
@Schema(title = "对账发票")
@EqualsAndHashCode(callSuper = true)
public class ReconciliationInvoiceVO extends DTO {
/**
* 对账发票ID
*/
@Schema(title = "对账发票ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED)
private Long reconciliationInvoiceId;
/**
* 对账ID
*/
@Schema(title = "对账ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED)
private Long reconciliationId;
/**
* 对账发票编码
*/
@Schema(title = "对账发票编码", requiredMode = Schema.RequiredMode.REQUIRED)
private String invoiceSn;
/**
* 经销商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 accountId;
/**
* 发票金额
*/
@Schema(title = "发票金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal invoiceAmount;
/**
* 入账公司ID
*/
@Schema(title = "入账公司ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED)
private Long companyId;
/**
* 发票日期
*/
@Schema(title = "发票日期", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDate invoiceDate;
/**
* 发票图片支持多张
*/
@Schema(title = "发票图片(支持多张)")
private List<UploadFileItem> invoiceImg;
/**
* 备注
*/
@Schema(title = "备注")
private String remark;
/**
* 创建时间
*/
@Schema(title = "创建时间")
private LocalDateTime createdAt;
}

View File

@ -0,0 +1,110 @@
package com.xunhong.erp.turbo.api.biz.dto.vo;
import com.alibaba.cola.dto.DTO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* @author shenyifei
*/
@Data
@Schema(title = "对账付款")
@EqualsAndHashCode(callSuper = true)
public class ReconciliationPaymentVO extends DTO {
/**
* 对账付款ID
*/
@Schema(title = "对账付款ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED)
private Long reconciliationPaymentId;
/**
* 对账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 dealerId;
/**
* 我方收款公司ID
*/
@Schema(title = "我方收款公司ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED)
private Long companyId;
/**
* 我方收款公司账户ID
*/
@Schema(title = "我方收款公司账户ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED)
private Long accountId;
/**
* 账户类别1_对公账户2_私人账户
*/
@Schema(title = "账户类别1_对公账户2_私人账户", requiredMode = Schema.RequiredMode.REQUIRED)
private Boolean accountCategory;
/**
* 账户类型1_银行卡2_支付宝3_微信
*/
@Schema(title = "账户类型1_银行卡2_支付宝3_微信", requiredMode = Schema.RequiredMode.REQUIRED)
private Boolean accountType;
/**
* 银行名称
*/
@Schema(title = "银行名称")
private String bankName;
/**
* 支行名称
*/
@Schema(title = "支行名称")
private String branchName;
/**
* 开户公司名称&#x2F;支付宝昵称&#x2F;微信号
*/
@Schema(title = "开户公司名称&#x2F;支付宝昵称&#x2F;微信号", requiredMode = Schema.RequiredMode.REQUIRED)
private String accountName;
/**
* 银行账号&#x2F;支付宝账号&#x2F;微信账号
*/
@Schema(title = "银行账号&#x2F;支付宝账号&#x2F;微信账号", requiredMode = Schema.RequiredMode.REQUIRED)
private String accountNumber;
/**
* 回款时间
*/
@Schema(title = "回款时间")
private LocalDateTime returnAt;
/**
* 回款金额
*/
@Schema(title = "回款金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal returnAmount;
/**
* 备注
*/
@Schema(title = "备注")
private String remark;
/**
* 创建时间
*/
@Schema(title = "创建时间")
private LocalDateTime createdAt;
}