阿里妹导读:张建飞是阿里巴巴高级技术专家,一直在致力于应用架构和代码复杂度的治理。最近,他在看零售通商品域的代码。面对零售通如此复杂的业务场景,如何在架构和代码层面进行应对,是一个新课题。结合实际的业务场景,Frank 沉淀了一套“如何写复杂业务代码”的方法论,在此分享给大家,相信同样的方法论可以复制到大部分复杂业务场景。
@Commandpublic class OnSaleNormalItemCmdExe {private OnSaleContextInitPhase onSaleContextInitPhase;private OnSaleDataCheckPhase onSaleDataCheckPhase;private OnSaleProcessPhase onSaleProcessPhase;public Response execute(OnSaleNormalItemCmd cmd) {OnSaleContext onSaleContext = init(cmd);checkData(onSaleContext);process(onSaleContext);return Response.buildSuccess();}private OnSaleContext init(OnSaleNormalItemCmd cmd) {return onSaleContextInitPhase.init(cmd);}private void checkData(OnSaleContext onSaleContext) {onSaleDataCheckPhase.check(onSaleContext);}private void process(OnSaleContext onSaleContext) {onSaleProcessPhase.process(onSaleContext);}}
@Phasepublic class OnSaleProcessPhase {private PublishOfferStep publishOfferStep;private BackOfferBindStep backOfferBindStep;//省略其它steppublic void process(OnSaleContext onSaleContext){SupplierItem supplierItem = onSaleContext.getSupplierItem();// 生成OfferGroupNogenerateOfferGroupNo(supplierItem);// 发布商品publishOffer(supplierItem);// 前后端库存绑定 backoffer域bindBackOfferStock(supplierItem);// 同步库存路由 backoffer域syncStockRoute(supplierItem);// 设置虚拟商品拓展字段setVirtualProductExtension(supplierItem);// 发货保障打标 offer域markSendProtection(supplierItem);// 记录变更内容ChangeDetailrecordChangeDetail(supplierItem);// 同步供货价到BackOffersyncSupplyPriceToBackOffer(supplierItem);// 如果是组合商品打标,写扩展信息setCombineProductExtension(supplierItem);// 去售罄标removeSellOutTag(offerId);// 发送领域事件fireDomainEvent(supplierItem);// 关闭关联的待办事项closeIssues(supplierItem);}}
boolean isCombineProduct = supplierItem.getSign().isCombProductQuote();// supplier.usc warehouse needn't checkif (WarehouseTypeEnum.isAliWarehouse(supplierItem.getWarehouseType())) {// quote warehosue checkif (CollectionUtil.isEmpty(supplierItem.getWarehouseIdList()) && !isCombineProduct) {throw ExceptionFactory.makeFault(ServiceExceptionCode.SYSTEM_ERROR, "亲,不能发布Offer,请联系仓配运营人员,建立品仓关系!");}// inventory amount checkLong sellableAmount = 0L;if (!isCombineProduct) {sellableAmount = normalBiz.acquireSellableAmount(supplierItem.getBackOfferId(), supplierItem.getWarehouseIdList());} else {//组套商品OfferModel backOffer = backOfferQueryService.getBackOffer(supplierItem.getBackOfferId());if (backOffer != null) {sellableAmount = backOffer.getOffer().getTradeModel().getTradeCondition().getAmountOnSale();}}if (sellableAmount < 1) {throw ExceptionFactory.makeFault(ServiceExceptionCode.SYSTEM_ERROR, "亲,实仓库存必须大于0才能发布,请确认已补货.\r[id:" + supplierItem.getId() + "]");}}
if(backOffer.isCloudWarehouse()){ return;}
if (backOffer.isNonInWarehouse()){ throw new BizException("亲,不能发布Offer,请联系仓配运营人员,建立品仓关系!");}
if (backOffer.getStockAmount() < 1){ throw new BizException("亲,实仓库存必须大于0才能发布,请确认已补货.\r[id:" + backOffer.getSupplierItem().getCspuCode() + "]");}
复用性
内聚性
public class CSPU {private String code;private String baseCode;//省略其它属性/*** 单品是否为最小单位。**/public boolean isMinimumUnit(){return StringUtils.equals(code, baseCode);}/*** 针对中包的特殊处理**/public boolean isMidPackage(){return StringUtils.equals(code, midPackageCode);}}
你可能还喜欢
点击下方图片即可阅读
关注「阿里技术」
把握前沿技术脉搏