文章目录
1. 概要
在供应链系统中,处理和管理各种单据是业务流程自动化的关键组成部分。面对不同的单据类型,如内销单、外销单、退货单等,每次新建或更新操作都可能触发需求数的更新和数据统计的需求。然而,由于不同单据类型之间在需求数处理逻辑上的差异性,以及随着业务发展可能不断增加的单据种类,如果对每种单据类型都单独编写一套处理逻辑,将不可避免地导致代码的冗余和膨胀。
这种代码冗余不仅增加了开发和维护的难度,也严重影响了项目的可扩展性和灵活性。为了解决这一问题,我们采用了抽象工厂设计模式,这是一种被广泛认可的软件设计模式,特别适合于处理这种具有多种产品但又需要统一管理的场景。
通过封装和抽象化需求数处理的核心逻辑,我们能够创建一个灵活且可扩展的系统,它能够适应不断变化的业务需求而无需重写现有代码。Spring框架提供的工厂设计模式支持,进一步增强了我们解决方案的灵活性和可维护性。利用Spring的依赖注入和生命周期管理特性,我们可以轻松地注册、获取和使用各种单据类型的具体处理器,而不必担心它们背后的实现细节。
本文档将详细介绍我们的设计方案,包括抽象工厂的实现方式、各个组件之间的交互流程,以及如何通过这种模式提高代码复用性、降低系统耦合度,并最终实现一个更加健壮和易于维护的系统。
2. 整体架构流程
2.1 定义实体类
@Data
@ApiModel(value = "DemandRecordBO", description = "需求记录统一转换入参")
public class DemandRecordBO{
/**
* 单据类型:根据具体业务定义枚举值
*/
private String sourceType;
/**
* 单据编号
*/
private String sourceNo;
/**
* 零件编号
*/
private String partNo;
/**
* 零件名称
*/
private String partName;
/**
* 需求数
*/
private BigDecimal unissuedQty;
/**
* 零件行号
*/
private String itemNo;
/**
* 无效/ 有效 标识(eg: 0. 无效; 1. 有效)
*/
private Integer validFlag;
/**
* 创建人姓名
*/
private String createByName;
/**
* 更新人姓名
*/
private String updateByName;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新人姓名
*/
private Date updateTime;
/**
* 版本号
*/
private Integer version;
}
@Data
@ApiModel(value = "DomesticOrderEvent ", description = "内销业务推送事件的入参")
public class DomesticOrderEvent {
@ApiModelProperty(value = "内销单号")
private String domesticSalesNo;
@ApiModelProperty(value = "内销单ID")
private Long domesticSalesId;
@ApiModelProperty(value = "bo号")
private String boNo;
@ApiModelProperty(value = "厂家")
private String mfr;