游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

Java微服务实现商城系统架构设计与实现(业务,规划,设计,

  Java微服务实现商城系统架构设计与实现(业务,规划,设计,实现)
  目录背景商城整体架构订单系统商品系统促销系统支付系统推荐系统积分系统会员系统总结
  1。背景
  随着互联网技术广泛应用,各行各业都依托线上平台进行商务活动。小到个人带货,大到企业商业活动,都少不了需要少不了在线交易。于是,到处可见商城影响,不管是加盟大的电商平台如淘宝、京东、拼多多,或是企业自建商城平台,目的基本都是扩大生意渠道,卖货增加业绩收入。
  下面基于我们公司自建商城平台,来谈谈我们商城架构设计方案。
  2。商城整体架构
  一般来说,商城系统按单体服务方案去构思的话,按模块划分至少包括:商品、订单、会员、促销、支付、积分、仓储、物流、风控、企业内部erp、财务系统等。
  公司原有技术架构是SpringCloud微服务架构,所以商城系统也是在这个体系下,同时根据我们公司实际业务特殊和复杂性,对各个模块进行微服务划分,业务领域分成多个业务中台和数据中台。
  设计商城整架构如下:
  一个完整商城体系结构是比较复杂的,涉及到很多关联系统和子系统模块。
  采用分层设计,从系统分层设计角度考虑,可以划分:前端接入层、应用表示层、中台服务、后端服务层、基础服务层。
  3。订单系统2。1、订单系统边界
  在搭建企业订单系统之前,需要先梳理整体业务系统之间的关系和订单系统上下游关系,只有划分清业务系统边界,才能确定订单系统的职责与功能,进而保证各系统之间高效简洁的工作。
  对外服务展示,所有给企业外部用户使用的系统都在这一层,包括WEB、普通用户使用的C端,还包括给商户使用的商家后台和在各个销售渠道进行分销的系统,比如与银行信用卡中心合作、微信合作在合作商的平台展示出本产品。这类系统站在与客户接触的最前线,是企业实现商业模式的桥头堡。
  中后台系统,每个C端的业务形态都会有一个对应的系统模块,如负责管理平台交易的订单系统,管理优惠信息的促销系统,管理平台所有产品的产商品系统,以及管理所有对外系统显示内容的内容系统(CMS)等。
  基础服务系统,随着企业的发展,信息化建设到达一定程度后,企业需要将通用功能服务化、平台化,以保证应用架构的合理性,提升服务效率。这类系统主要给其他应用系统提供基础服务能力支持。
  由此可见,订单系统对上接收用户信息,将用户信息转化为产品订单,同时管理并跟踪订单信息和数据,承载了整个交易线的重要对客环节。
  对下则衔接产品系统、促销系统、仓储系统、会员系统、积分系统、支付系统等,对整个电商平台起着承上启下的作用。2。2、订单系统业务架构
  订单服务,该模块的主要功能是用户日常使用的服务和页面,主要有订单列表、订单详情、在线下单等,还包括为公共业务模块提供的多维度订单数据服务。
  订单逻辑,订单系统的核心,起着至关重要的作用,在订单系统负责管理订单创建、订单支付、订单生产、订单确认、订单完成、取消订单等订单流程。还涉及到复杂的订单状态规则、订单金额计算规则以及增减库存规则等。
  底层服务,信息化建设达到一定程度的企业,一般会将公共服务模块化和中台化,比如:产品,会构建对应的产品系统,代码、数据库,接口等相对独立。但是,这也带来了一个问题,比如:订单创建的场景下需要获取的信息分散在各个系统。组装信息的时候会比较麻烦。
  如果需要从各个中台系统调用:一是会花费大量时间,二是代码的维护成本非常高。因此,订单系统接入所需的公共服务模块聚合接口,在订单系统即可完成对接公共系统的服务。2。3、订单核心功能
  功能脑图
  为了使订单系统能够对订单进行高效、精准的管理和跟踪,订单会储存关于产品、优惠、用户、支付信息等一系列的订单实时数据,来和下游系统,如:促销、仓储、物流进行交互。
  以一个通用B2C商城的订单为例,梳理其包含的信息如下:
  这里要注意的是订单类型,随着平台业务的不断发展,品类丰富、交易方式丰富后,需要对订单进行多维度的分类管理,同时订单类型利于订单系统的扩展性。每种订单类型将会对应一套流程及一套状态,便于对订单进行分类管理和复用。
  2。4、订单正向流程
  2。4。1、订单创建
  用户下单后,系统需要生成订单,此时需要先获取下单中涉及的商品信息,然后获取该商品所涉及到的优惠信息,如果商品不参与优惠信息,则无此环节。
  接着获取该账户的会员权益,这里要注意的是:优惠信息与会员权益的区别,比如:商品满减是优惠信息,会员全场9。8折指的是会员权益,一个是针对商品,另一个是针对账户。其次就是优惠活动的叠加规则和优先级规则等。
  增减库存规则是指订单中的商品,何时从库存系统中对相应商品库存进行扣除,目前主流有两种方式:
  (1)下单减库存即用户下单成功时减少库存数量
  优势:用户体验友好,系统逻辑简洁。
  缺点:会导致恶意下单或下单后却不买,使得真正有需求的用户无法购买,影响真实销量。
  解决办法:
  设置订单有效时间,若订单创建成功N分钟不付款,则订单取消,库存回滚;
  限购,用各种条件来限制买家的购买件数,比如一个账号、一个ip,只能买一件;
  风控,从技术角度进行判断,屏蔽恶意账号,禁止恶意账号购买。
  (2)付款减库存即用户支付完成并反馈给平台后再减少库存数量
  优势:减少无效订单带来的资源损耗。
  缺点:因第三方支付返回结果存在时差,同一时间多个用户同时付款成功,会导致下单数目超过库存,商家库存不足容易引发断货和投诉,成本增加。
  解决办法:
  付款前再次校验库存,如确认订单要付款时再验证一次,并友好提示用户库存不足;
  增加提示信息:在商品详情页,订单步骤页面提示不及时付款,不能保证有库存等。
  综上所述,两种方式各有优缺点,因此,需结合实际场景进行考虑,如:秒杀、抢购、促销活动等,可使用下单减库存的方式。而对于产品库存量大,并发流量没有那么强的产品使用付款减库存的方式(秒杀系统设计是在另外文档中专题描述)。
  将两种方式带入到销售场景中,关联商品类型、促销类型、供需关系等,灵活使用,以充分发挥计算机系统的优势。2。4。2、订单支付
  用户支付完订单后,需要获取订单的支付信息,包括支付流水号、支付时间等。支付完订单接着就是等商家发货,但在发货过程中,根据平台业务模式的不同,可能会涉及到订单的拆分。
  订单拆分一般分两种:
  一种是用户挑选的商品来自于不同渠道(自营与商家,商家与商家);
  另一种是在SKU层面上拆分订单:不同仓库,不同运输要求的SKU,包裹重量体积限制等因素需要将订单拆分。
  订单拆分也是一个相对独立的模块,可以采用子母单的形式,也可以采用服务单和订单形式,总的来说就是1:N关系。2。4。3、订单生产
  订单生产,是指产品从企业到用户这一流程的概述。如电商平台中,商家发货过程已有一个标准化的流程,订单内容会发送到仓库,仓库对商品进行打单、拣货、包装、交接快递进行配送(在我们这里一般是由供应商完成)。2。4。4、订单确认
  收到货后,订单系统需要在快递被签收后提醒用户对商品做评价。这里要注意,确认收到货不代表交易成功,而是售后服务的开始。2。4。5、订单完成
  订单完成是指在收到货X天的状态,此时订单不在售后的支持时间范围内。到此,一个订单的正向流程就算走完了。
  2。4、订单逆向流程
  上面说到逆向流程是各种修改订单、取消订单、退款、退货等操作,需要梳理清楚这些流程与正向流程的关系,才能理清订单系统完整的订单流程。2。4。1、订单修改
  可梳理订单内信息,根据信息关联程度及业务诉求,设定订单的可修改范围是什么,比如:客户下单后,想修改收货人地址及电话。此时只需对相应数据进行更新即可。2。4。2、订单取消
  用户提交订单后没有进行支付操作,此时用户原则上属于取消订单,因为还未付款,则比较简单,只需要将原本提交订单时扣减的库存补回,促销优惠中使用的优惠券,权益等视平台规则,进行相应补回。2。4。3、退款
  用户支付成功后,客户发出退款的诉求后,需商户进行退款审核,双方达成一致后,系统应以退款单的形式完成退款,关联原订单数据。因商品无变化,所以不许考虑与库存系统的交互,仅需考虑促销系统及支付系统交互即可。2。4。4、退货
  用户支付成功后,客户发出退货的诉求后,需商户进行退款审核,双方达成一致后,需对库存系统进行补回,支付系统、促销系统以退款单形式完成退款。最后,在退款退货流程中,需结合平台业务场景,考虑优惠分摊的逻辑,在发生退款退货时,优惠该如何退回的处理规则和流程。2。5、状态机设计
  状态机是管理订单状态逻辑的工具。状态机可归纳为3个要素,即现态、动作、次态。
  现态:是指当前所处的状态。
  动作:动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。
  次态:动作满足后要迁往的新状态,次态是相对于现态而言的,次态一旦被激活,就转变成新的现态了。
  状态机的设计需要结合平台实际业务场景,将状态间的切换细化成了执行了某个动作。
  以一个B2C商城的订单系统举例,状态分类如下:
  订单系统为了高效的对订单进行跟踪和管理,会对订单流程当中的关键节点,抽象出订单状态。而订单状态从不同用户的角度可分为:系统订单状态、商家订单状态、买家订单状态等。
  对于订单系统来说,订单状态细分的颗粒度越细、越明确,订单系统管理的精度和可靠性就越高,比如:在待付款和待发货两个状态中,订单系统后台会细分为:订单超时取消、订单支付失败、订单付款完成等。
  因此,订单状态模块中,通常会维护状态映射表,以不同的用户角色对系统订单状态进行重新划分,以满足不同用户的需求。
  除此以外,随着业务的不断发展,不同的业务类型,所对应的订单状态都会有所区别。所以,订单系统中一般会储存多套状态机,以满足不同的订单类型来使用。2。5、关键代码片断
  对前商提供API访问接口Module(订单模块C端)RestControllerRequestMapping(customerapiv1order)publicclassOrderCustomerController{ResourceprivateOrderServiceorderService;ResourceprivateOrderCreateCmdExeorderCreateCmdExe;ResourceprivateOrderPayCmdExeorderPayCmdExe;ResourceprivateOrderCancelCmdExeorderCancelCmdExe;ResourceprivateRefundApplyCmdExerefundApplyCmdExe;ResourceprivateOrderDeleteCmdExeorderDeleteCmdExe;生成订单paramcmd订单内容return订单信息RestApi(name生成订单,logabledtrue)PostMapping(create)CheckResubmitpublicDataResponseOrderCreateCOcreate(RequestBodyValidOrderCreateCmdcmd){OrderCreateCOorderCreateCOorderCreateCmdExe。create(cmd);returnDataResponse。of(orderCreateCO);}订单支付RestApi(name订单支付,logabledtrue)PostMapping(pay)CheckResubmitpublicDataResponseOrderPaymentInfoCOpay(RequestBodyValidOrderPayCmdcmd,HttpServletRequestrequest){OrderPaymentInfoCOpaymentInfoCOorderPayCmdExe。pay(cmd,request);returnDataResponse。of(paymentInfoCO);}订单列表(分页)paramcmd查询条件return查询结果RestApi(name订单列表(分页),logabledtrue)PostMapping(page)publicDataResponseCustomizePageOrderPageCOpage(RequestBodyOrderPageQryCmdcmd){OrderQryDTOdtoBeanToolkit。instance()。copy(cmd,OrderQryDTO。class);dto。setPageNo(cmd。getPageNo());dto。setPageSize(cmd。getPageSize());dto。setCreatorId(HttpContext。getCustomerId());dto。setCustomerDeleted(0);CustomizePageOrderDTOorderDTOPageorderService。customerPage(dto);CustomizePageOrderPageCOresultnewCustomizePage(orderDTOPage。getCurrent(),orderDTOPage。getSize(),orderDTOPage。getTotal());result。setRecords(OrderConverter。converter2OrderCO(orderDTOPage。getRecords()));returnDataResponse。of(result);}订单详情paramorderId订单IDreturn订单详情RestApi(name主订单详情,logabledtrue)GetMapping(detail{orderId})publicDataResponseOrderPageCOdetail(PathVariable(orderId)LongorderId){OrderDTOorderDTOorderService。detail(orderId,TerminalEnum。CUSTOMER);returnDataResponse。of(OrderConverter。converter2OrderCO(orderDTO));}订单状态统计RestApi(name订单状态统计,logabledtrue)GetMapping(stateStatistics)publicDataResponseOrderStateStatisticsCustomerCOorderStateStatistics(){OrderStateStatisticsCustomerCOresultorderService。customerOrderStateStatistics();returnDataResponse。of(result);}取消订单paramcmd取消订单RestApi(name取消订单,logabledtrue)PostMapping(cancel)publicResponsecancel(RequestBodyValidOrderCancelCmdcmd){orderCancelCmdExe。cancel(cmd);returnResponse。buildSuccess();}退换货申请paramcmd申请内容RestApi(name退换货申请,logabledtrue)PostMapping(refundApply)publicResponserefundApply(RequestBodyValidRefundApplyCmdcmd){refundApplyCmdExe。refundApply(cmd);returnResponse。buildSuccess();}退换货订单列表(分页)paramqry查询条件return查询结果RestApi(name退换货订单列表(分页),logabledtrue)PostMapping(refundApplypage)publicDataResponseCustomizePageOrderPageCOrefundOrderPage(RequestBodyRefundApplyQryqry){CustomizePageOrderDTOorderDTOPageorderService。refundOrderPage(qry);CustomizePageOrderPageCOresultnewCustomizePage(orderDTOPage。getCurrent(),orderDTOPage。getSize(),orderDTOPage。getTotal());result。setRecords(OrderConverter。converter2OrderCO(orderDTOPage。getRecords()));returnDataResponse。of(result);}删除订单RestApi(name删除订单,logabledtrue)DeleteMapping(delete)publicResponsedeleteOrder(ValidRequestBodyOrderDeleteCmdcmd){orderDeleteCmdExe。deleteOrder(cmd);returnResponse。buildSuccess();}获取订单开票信息paramorderId主订单IDreturn开票信息RestApi(name获取订单开票信息,logabledtrue)GetMapping(orderInvoiceInfo{orderId})publicDataResponseOrderInvoiceInfoCOgetOrderInvoiceInfo(PathVariable(orderId)LongorderId){returnDataResponse。of(orderService。getOrderInvoiceInfo(orderId));}}
  订单创建执行器Slf4jComponentpublicclassOrderCreateCmdExe{ResourceprivateNumberingGatewaynumberingGateway;ResourceprivateOrderValidatororderValidator;ResourceprivateGoodsServicegoodsService;ResourceprivatePointsGatewaypointsGateway;ResourceprivateCustomerMemberGatewaycustomerMemberGateway;ResourceprivateOrderAutoCancelPublisherorderAutoCancelPublisher;ResourceprivateOrderDaiZhiFuNoticePublisherorderDaiZhiFuNoticePublisher;ResourceprivateMemberCartGatewaymemberCartGateway;生成订单Transactional(rollbackForException。class)publicOrderCreateCOcreate(OrderCreateCmdcmd){1、查询商品信息ListStringskuIdscmd。getGoodsList()。stream()。map(OrderCreateCmd。GoodsList::getSkuId)。collect(Collectors。toList());MapString,SpuApiCOskuMapgoodsService。mapSkuCO(skuIds);2、查询客户积分BigDecimalcustomerIntegralpointsGateway。getCustomerIntegral(HttpContext。getCustomerId());3、查询会员信息MemberDTOmemberDTOcustomerMemberGateway。findByCustomerId(HttpContext。getCustomerId());4、检查下单条件orderValidator。createOrderValidate(cmd,skuMap,customerIntegral,memberDTO);5、组装订单信息ListMallOrderEmallOrderDOSnewMallOrderE(cmd,skuMap,memberDTO。getMemberLevel());6、检查用户积分余额orderValidator。customerIntegralValidate(mallOrderDOS。get(0),customerIntegral);7、保存订单信息MallOrderE。queryInstance()。saveBatch(mallOrderDOS);8、批量扣除库存,考虑到没有分布式事务,因此最后进行RPC扣库存ListUpdateInventoryDTOupdateInventoryDTOSGoodsConverter。convert2UpdateInventoryDTO(cmd。getGoodsList());goodsService。updateInventory(updateInventoryDTOS);9、开启延迟队列9。1、待支付订单自动取消OrderEventorderEventnewOrderEvent();orderEvent。setMainOrderId(mallOrderDOS。get(0)。getId());orderEvent。setMainOrderCode(mallOrderDOS。get(0)。getCode());orderAutoCancelPublisher。sendMessage(orderEvent);9。2、待支付订单提醒orderDaiZhiFuNoticePublisher。sendMessage(orderEvent);10、删除购物车中的商品if(SubmitPageEnum。orderConfirm。getValue()。equals(cmd。getSubmitPage())){deleteGoodsCart(cmd。getGoodsList());}OrderCreateCOresultnewOrderCreateCO();result。setOrderId(mallOrderDOS。get(0)。getId()。toString());result。setOrderNo(mallOrderDOS。get(0)。getCode());returnresult;}组装订单信息返回的订单集合中,index0的为主订单privateListMallOrderEnewMallOrderE(OrderCreateCmdcmd,MapString,SpuApiCOskuMap,IntegermemberLevel){ListMallOrderEresultnewArrayList();1、打包主订单信息MallOrderEmallOrderEBeanToolkit。instance()。copy(cmd,MallOrderE。class);result。add(mallOrderE);mallOrderE。setId(numberingGateway。getNextId());StringorderCodenumberingGateway。generateOrderCode();mallOrderE。setCode(orderCode);mallOrderE。setStatus(OrderStatusEnum。DAIZHIFU。getValue());订单总价格、订单总积分、订单总运费LongtotalPrice0L;LongtotalFreight0L;LongtotalIntegral0L;2、打包子订单信息QueueStringsubOrderCodenumberingGateway。generateSubOrderCode(orderCode,cmd。getGoodsList()。size());for(OrderCreateCmd。GoodsListgoods:cmd。getGoodsList()){SpuApiCOspuskuMap。get(goods。getSkuId());MallOrderEmallOrderEItemBeanToolkit。instance()。copy(cmd,MallOrderE。class);mallOrderEItem。setId(numberingGateway。getNextId());mallOrderEItem。setCode(subOrderCode。poll());mallOrderEItem。setMainOrderId(mallOrderE。getId());mallOrderEItem。setMainOrderCode(mallOrderE。getCode());mallOrderEItem。setStatus(OrderStatusEnum。DAIZHIFU。getValue());CalcPayPriceDTOcalcPayPriceDTOgoodsService。calcPayPrice(spu。getSku(),goods。getCount(),memberLevel,cmd。getReceiverRegion());mallOrderEItem。setPrice(calcPayPriceDTO。getPayPrice());子订单价格mallOrderEItem。setIntegral(calcPayPriceDTO。getGoodsTotalIntegral());子订单积分mallOrderEItem。setFreight(calcPayPriceDTO。getFreight());子订单运费mallOrderEItem。setSpuId(Long。valueOf(goods。getSpuId()));mallOrderEItem。setSkuId(Long。valueOf(goods。getSkuId()));mallOrderEItem。setQuantity(goods。getCount());mallOrderEItem。setGoodsName(spu。getGoodsName());mallOrderEItem。setGoodsSupplierId(spu。getSupplierId());mallOrderEItem。setGoodsType(spu。getGoodsType());mallOrderEItem。setCreatorId(HttpContext。getCustomerId());mallOrderEItem。setCreator(HttpContext。getCustomerName());mallOrderEItem。setCreateDt(LocalDateTime。now());mallOrderEItem。setLastUpdatorId(HttpContext。getCustomerId());mallOrderEItem。setLastUpdator(HttpContext。getCustomerName());mallOrderEItem。setLastUpdateDt(LocalDateTime。now());result。add(mallOrderEItem);totalPricecalcPayPriceDTO。getPayPrice();totalFreightcalcPayPriceDTO。getFreight();totalIntegralcalcPayPriceDTO。getGoodsTotalIntegral();}mallOrderE。setPrice(totalPrice);订单总价mallOrderE。setIntegral(totalIntegral);订单总积分mallOrderE。setFreight(totalFreight);订单总运费mallOrderE。setCreatorId(HttpContext。getCustomerId());mallOrderE。setCreator(HttpContext。getCustomerName());mallOrderE。setCreateDt(LocalDateTime。now());mallOrderE。setLastUpdatorId(HttpContext。getCustomerId());mallOrderE。setLastUpdator(HttpContext。getCustomerName());mallOrderE。setLastUpdateDt(LocalDateTime。now());returnresult;}批量删除购物车数据paramgoodsList待删除的商品privatevoiddeleteGoodsCart(ListOrderCreateCmd。GoodsListgoodsList){for(OrderCreateCmd。GoodsListlist:goodsList){DeleteGoodsCartCmddeleteGoodsCartCmdnewDeleteGoodsCartCmd();deleteGoodsCartCmd。setSpuId(Long。valueOf(list。getSpuId()));deleteGoodsCartCmd。setSkuId(Long。valueOf(list。getSkuId()));memberCartGateway。deleteGoodsCart(HttpContext。getCustomerId(),deleteGoodsCartCmd);}}}
  订单取消执行器订单取消执行器authorcglidate2022123009:19ComponentpublicclassOrderCancelCmdExe{ResourceprivateOrderValidatororderValidator;ResourceprivateMallOrderGatewayorderGateway;ResourceprivateRollbackIntegralExerollbackIntegralExe;ResourceprivateGoodsServicegoodsService;取消订单Transactional(rollbackForException。class)publicvoidcancel(OrderCancelCmdcmd){MallOrderEmallOrderEMallOrderE。queryInstance()。getById(cmd。getOrderId());orderValidator。cancelOrderValidate(mallOrderE);ListMallOrderEorderUpdateListnewArrayList();ListUpdateInventoryDTOinventoryUpdateListnewArrayList();主订单状态置为已取消MallOrderEmainOrderEForUpdatenewMallOrderE();mainOrderEForUpdate。setId(mallOrderE。getId());mainOrderEForUpdate。setStatus(OrderStatusEnum。YIQUXIAO。getValue());orderUpdateList。add(mainOrderEForUpdate);ListOrderDTOorderDTOSorderGateway。listByMainOrderId(cmd。getOrderId());for(OrderDTOorderDTO:orderDTOS){子订单状态置为已取消MallOrderEsubOrderEForUpdatenewMallOrderE();subOrderEForUpdate。setId(orderDTO。getId());subOrderEForUpdate。setStatus(OrderStatusEnum。YIQUXIAO。getValue());orderUpdateList。add(subOrderEForUpdate);回滚库存UpdateInventoryDTOupdateInventoryDTOnewUpdateInventoryDTO(orderDTO。getSkuId()。toString(),orderDTO。getQuantity());inventoryUpdateList。add(updateInventoryDTO);}orderGateway。updateBatchById(orderUpdateList);判断是否已经进行了积分支付,需要将积分回滚rollbackIntegralExe。execute(mallOrderE,订单取消积分返还);库存回滚goodsService。updateInventory(inventoryUpdateList);}}
  订单删除执行器订单删除执行器authorcglidate2022123009:30ComponentpublicclassOrderDeleteCmdExe{ResourceprivateOrderValidatororderValidator;删除订单Transactional(rollbackForException。class)publicvoiddeleteOrder(OrderDeleteCmdcmd){MallOrderEmallOrderEMallOrderE。queryInstance()。getById(cmd。getOrderId());orderValidator。deleteValidate(mallOrderE);MallOrderE。queryInstance()。customerDeleteByMainOrderId(mallOrderE。getId());}}
  订单查询服务Slf4jServicepublicclassOrderServiceextendsBaseService{AutowiredprivateMallOrderGatewayorderGateway;AutowiredprivateMallDeliveryGatewaydeliveryGateway;AutowiredprivateGoodsServicegoodsService;AutowiredprivateMallOrderBillGatewaymallOrderBillGateway;AutowiredprivateMallInvoiceRecordGatewayinvoiceRecordGateway;订单列表(分页)publicCustomizePageOrderDTOpage(OrderQryDTOdto){dto。setQuerySubOrder(true);CustomizePageOrderDTOpageorderGateway。page(dto);MapString,SupplierDTOsupplierMapgoodsService。mapSupplierCO();查询订单物流信息ListLongdeliveryIdspage。getRecords()。stream()。map(OrderDTO::getDeliveryId)。filter(Objects::nonNull)。distinct()。collect(Collectors。toList());MapLong,MallDeliveryEdeliveryEMapdeliveryGateway。mapById(deliveryIds);for(OrderDTOorderDTO:page。getRecords()){整合供应商名称SupplierDTOsupplierDTOsupplierMap。get(orderDTO。getGoodsSupplierId());if(supplierDTO!null){orderDTO。setGoodsSupplierName(supplierDTO。getSupplierName());}转译订单状态orderDTO。setStatusDesc(OrderStatusEnum。value2Desc(TerminalEnum。ADMIN,orderDTO。getStatus()));物流信息MallDeliveryEmallDeliveryEdeliveryEMap。get(orderDTO。getDeliveryId());orderDTO。setDeliveryInfo(mallDeliveryE);商品信息GoodsCOgoodsCOnewGoodsCO();goodsCO。setGoodsName(orderDTO。getGoodsName());orderDTO。setGoods(goodsCO);}returnpage;}消费者端分页查询订单信息paramdto查询条件return查询结果publicCustomizePageOrderDTOcustomerPage(OrderQryDTOdto){dto。setQueryMainOrder(true);CustomizePageOrderDTOmainOrderPageorderGateway。page(dto);if(CollUtil。isEmpty(mainOrderPage。getRecords())){returnnewCustomizePage(mainOrderPage。getCurrent(),mainOrderPage。getSize(),mainOrderPage。getTotal());}ListLongmainOrderIdsmainOrderPage。getRecords()。stream()。map(OrderDTO::getId)。collect(Collectors。toList());查询子订单信息OrderQryDTOsubOrderQrynewOrderQryDTO();subOrderQry。setMainOrderIds(mainOrderIds);ListOrderDTOsubOrderListorderGateway。list(subOrderQry);查询商品信息ListStringskuIdssubOrderList。stream()。map(OrderDTO::getSkuId)。map(String::valueOf)。collect(Collectors。toList());MapString,SpuApiCOspuMapgoodsService。mapSkuCO(skuIds);查询派送信息ListLongdeliveryIdssubOrderList。stream()。map(OrderDTO::getDeliveryId)。filter(Objects::nonNull)。distinct()。collect(Collectors。toList());MapLong,MallDeliveryEdeliveryMapdeliveryGateway。mapById(deliveryIds);查询支付信息MapLong,MallOrderBillEbillMapmallOrderBillGateway。getBill(mainOrderIds,BillingTypeEnum。PAY,OrderPayWayEnum。INTEGRALPAY);整合发票信息MapLong,MallInvoiceRecordEorderInvoiceMapinvoiceRecordGateway。getOrderInvoice(mainOrderIds);整合子母单、商品信息和物流信息returnOrderConverter。converter2OrderDTO(mainOrderPage,subOrderList,spuMap,deliveryMap,billMap,orderInvoiceMap);}B端订单状态统计publicOrderStateStatisticsCOorderStateStatistics(OrderPageQryCmdcmd){returnorderGateway。orderStateStatistics(cmd);}C端订单状态统计publicOrderStateStatisticsCustomerCOcustomerOrderStateStatistics(){returnorderGateway。customerOrderStateStatistics(HttpContext。getCustomerId());}获取订单详情paramorderId订单IDparamterminal终端类型return订单详情publicOrderDTOdetail(LongorderId,TerminalEnumterminal){OrderDTOresultnull;1、获取订单信息MallOrderEmallOrderEMallOrderE。queryInstance()。getById(orderId);if(mallOrderE。isMainOrder()){2、查看主订单维度的详情2。1、查询子订单信息ListOrderDTOorderDTOSorderGateway。listByMainOrderId(orderId);2。2、查询商品信息ListStringskuIdsorderDTOS。stream()。map(OrderDTO::getSkuId)。map(String::valueOf)。collect(Collectors。toList());MapString,SpuApiCOspuMapgoodsService。mapSkuCO(skuIds);resultOrderConverter。converter2OrderDTO(mallOrderE,orderDTOS,spuMap,terminal);}else{3、查看子单维度的详情3。1、查询母单订单信息MallOrderEmainOrderInfoMallOrderE。queryInstance()。getById(mallOrderE。getMainOrderId());3。2、查询商品信息MapString,SpuApiCOspuMapgoodsService。mapSkuCO(Collections。singletonList(String。valueOf(mallOrderE。getSkuId())));4、整合订单详情OrderDTOsubOrderDTOBeanToolkit。instance()。copy(mallOrderE,OrderDTO。class);resultOrderConverter。converter2OrderDTO(mainOrderInfo,Collections。singletonList(subOrderDTO),spuMap,terminal);}returnresult;}商品销量统计publicListGoodsSalesCOgoodsSalesStatistics(GoodsSalesStatisticsQryCmdcmd){returnorderGateway。goodsSalesStatistics(cmd。getSkuIds(),cmd。getCreateDtBegin(),cmd。getCreateDtEnd(),cmd。getLimit());}退款订单列表paramqry查询条件return查询结果publicCustomizePageOrderDTOrefundOrderPage(RefundApplyQryqry){OrderQryDTOqryDTOBeanToolkit。instance()。copy(qry,OrderQryDTO。class);qryDTO。setPageNo(qry。getPageNo());qryDTO。setPageSize(qry。getPageSize());qryDTO。setStatusList(Arrays。asList(OrderStatusEnum。TUIHUOSHENQING。getValue(),OrderStatusEnum。TUIHUOWANCHENG。getValue()));qryDTO。setQuerySubOrder(true);qryDTO。setCreatorId(HttpContext。getCustomerId());CustomizePageOrderDTOpageorderGateway。page(qryDTO);查询商品信息ListStringskuIdspage。getRecords()。stream()。map(OrderDTO::getSkuId)。map(String::valueOf)。collect(Collectors。toList());MapString,SpuApiCOspuMapgoodsService。mapSkuCO(skuIds);returnOrderConverter。converter2OrderDTO(page,spuMap);}获取导出数据paramcmd查询条件return查询结果publicListOrderExcelDTOexport(OrderPageQryCmdcmd){intexportCount0;已经处理的数据OrderQryDTOorderQryDTOOrderQryDTO。of(cmd);orderQryDTO。setPageNo(1);orderQryDTO。setPageSize(200);分批整合数据CustomizePageOrderDTOorderPagepage(orderQryDTO);if(CollUtil。isEmpty(orderPage。getRecords())){thrownewDataNotFoundException();}ListOrderExcelDTOresultnewArrayList();while(CollUtil。isNotEmpty(orderPage。getRecords())BizConstant。MAXEXPORTSIZEexportCount){ListOrderExcelDTOorderExcelDTOListOrderConverter。converter2OrderExcelDTO(orderPage。getRecords());result。addAll(orderExcelDTOList);处理下一页的数据exportCountorderQryDTO。getPageSize();orderQryDTO。setPageNo(orderQryDTO。getPageNo()1);orderPagepage(orderQryDTO);}returnresult;}获取订单退货申请记录paramorderId订单IDreturn查询结果publicRefundApplyInfoCOgetRefundApplyInfoCO(LongorderId){MallRefundApplyErefundApplyEMallRefundApplyE。queryInstance()。getByOrderId(orderId);if(refundApplyEnull){thrownewDataNotFoundException();}RefundApplyInfoCOresultBeanToolkit。instance()。copy(refundApplyE,RefundApplyInfoCO。class);result。setRefundTypeDesc(OrderRefundTypeEnum。value2Desc(result。getRefundType()));returnresult;}获取订单列表paramcmd查询条件return查询结果publicListOrderDTOqueryOrderList(OrderQryCmdcmd){OrderQryDTOsubOrderQryBeanToolkit。instance()。copy(cmd,OrderQryDTO。class);subOrderQry。setQuerySubOrder(true);returnorderGateway。list(subOrderQry);}获取SKU产生的最新订单paramskuIdsskuId集合return订单信息publicListOrderCOskuLatestSale(ListLongskuIds){returnorderGateway。skuLatestSale(skuIds);}获取订单开票信息publicOrderInvoiceInfoCOgetOrderInvoiceInfo(LongorderId){MallOrderEmainOrderEMallOrderE。queryInstance()。getById(orderId);if(Objects。isNull(mainOrderE)){thrownewServiceException(订单不存在);}if(!OrderStatusEnum。YIWANCHENG。getValue()。equals(mainOrderE。getStatus())){thrownewServiceException(未完成的订单无法申请开发票);}if(!mainOrderE。moneyPaid()){thrownewServiceException(该订单未进行现金支付,无法开具发票);}OrderInvoiceInfoCOresultnewOrderInvoiceInfoCO();result。setOrderId(mainOrderE。getId()。toString());result。setOrderCode(mainOrderE。getCode());开票金额,该母单的实际支付金额,部分退款则取最终收款金额longtotalRefundorderGateway。listByMainOrderId(orderId)。stream()。filter(orderDTOOrderStatusEnum。TUIHUOWANCHENG。getValue()。equals(orderDTO。getStatus()))。mapToLong(OrderDTO::getPayPrice)。sum();longinvoicePricemainOrderE。getPayPrice()totalRefund;result。setInvoicePrice(BigDecimalUtils。penny2yuan(invoicePrice));returnresult;}}订单领域层服务接口publicinterfaceMallOrderGateway{分页查询CustomizePageOrderDTOpage(OrderQryDTOdto);订单列表ListOrderDTOlist(OrderQryDTOdto);根据主订单ID获取自订单集合ListOrderDTOlistByMainOrderId(LongorderId);ListOrderDTOlistByMainOrderIdList(ListLongorderIdList);统计消费者购买的商品数量paramcustomerId消费者IDparamskuIdskuIdreturn统计结果IntegercountBySkuId(StringcustomerId,LongskuId);根据ID查询订单信息paramid订单IDreturn查询结果MallOrderEgetById(Longid);根据子单查询母单数据paramid子单IDreturn母单数据MallOrderEgetMainOrderBySubId(Longid);MallOrderEgetByCode(Stringcode);根据ID批量查询订单信息paramids订单ID集合return查询结果ListMallOrderElistById(ListLongids);批量保存订单信息parammallOrderES待保存内容return保存结果BooleansaveBatch(ListMallOrderEmallOrderES);根据主键更新订单信息parammallOrderE更新内容return更新结果BooleanupdateById(MallOrderEmallOrderE);BooleanupdateBatchById(ListMallOrderEorderEList);B端订单状态统计OrderStateStatisticsCOorderStateStatistics(OrderPageQryCmdcmd);消费者订单状态统计OrderStateStatisticsCustomerCOcustomerOrderStateStatistics(StringcustomerId);商品销量统计paramskuIds商品SKUIDreturn统计结果ListGoodsSalesCOgoodsSalesStatistics(ListLongskuIds,LocalDateTimecreateDtBegin,LocalDateTimecreateDtEnd,Integerlimit);删除主订单parammainOrderId主订单IDreturn删除结果BooleancustomerDeleteByMainOrderId(LongmainOrderId);获取SKU产生的最新订单paramskuIdsskuId集合return订单信息ListOrderCOskuLatestSale(ListLongskuIds);根据订单ID集合批量删除订单paramids订单ID集合return删除结果BooleandeleteBatchById(CollectionLongids);}

ColorOS6海报剧透系统外观简洁设计,OPPOReno首IT之家3月15日消息今天ColorOS官方微博公布了3月17日发布会倒计时新的海报,号称抛弃条框辅助,信息更规整易读。这意味着,ColorOS6系统信息被进一步释放,手机系统……OPPOReno将搭载Breeno智能助理听说看全面升级IT之家3月14日消息2018年12月OPPO在中国正式推出了智能助理Breeno。Breeno集感知、决策、学习进化等能力于一体,能够让人们与包括手机在内的智能终端实现更自然……OPPOReno10倍混合变焦拍照样张曝光IT之家3月13日消息OPPO将于4月10日推出名为Reno的全新系列智能手机,该机很可能会配备MWC2019演示的10倍变焦摄像头,现在网上已经曝光了疑似该机的10倍混合变焦……OPPOReno新机拍照样张公布4800万像素实力不凡IT之家3月13日消息OPPO将于4月10日推出名为Reno的全新系列智能手机,该机很可能会配备MWC2019演示的10倍变焦摄像头,现在OPPO副总裁沈义人刚刚在微博公布了该……Nature利用量子纠缠,物质波干涉仪首超标准量子极限光子盒研究院出品美国JILA和NIST研究员JamesK。Thompson带领研究团队首次成功地将量子力学的两个最诡异特征结合起来原子的纠缠和离域化(delocaliza……曲江二期变局在即看曲江电竞如何玩出新花样历经三年的沉寂,旅游市场忽如一夜春风来。据西安市文旅部门统计,2023年春节假期期间(1月2127日),西安市监测的15家重点旅游景区累计接待227。79万人次,同比增长……萱草花中国人的母亲之花时光最是无情物,四时交替不停歇。转眼已是立夏时节,旬日不曾到江滨公园,昨日傍晚,与儿慢跑于江畔,猛然发现昔日花蕾紧闭的萱草已然绽放,远看成片的萱草花如云霞般灿烂,于路旁、树荫下……OPPO新机入网工信部,疑似F11Pro减配版感谢IT之家网友百口莫辩的线索投递!IT之家3月30日消息日前,OPPO一款型号为PCAT10手机入网工信部,这款手机与OPPO在海外推出的OPPOF11Pro参数大部分……国产手机市场正式进入战国时代战国(前475年前221年)是中国东周列国诸侯争斗激烈的时代。与春秋在历史上并无明确时间界限,仅依历来惯例,以公元前453年,韩赵魏灭掉智氏,三家分晋为起始标志,至公元前221……GoliothESPIDFSDK,将ESP32开发板连接到了文章来源:GoliothESPIDFSDK,将ESP32开发板连接到了GoliothCloudCNXSoftware中文站Golioth译为歌莉娅,是一个支持设备制造商实……再下一城OPPO手机上线重庆畅通卡感谢IT之家网友软媒用户645169的线索投递!IT之家9月6日消息今日,重庆城市通卡官方表示,OPPO手机公交卡正式上线重庆畅通卡。手机交通卡支持在重庆地区乘坐轨道交通……官方展示OPPOReno2新功能照片与视频拍摄均支持防抖IT之家9月6日消息今日,OPPO官方带来了一则OPPOReno2四摄视频,展示了这款手机的拍摄功能。OPPOReno2照片与视频拍摄均支持防抖。随着OPPOReno2发……
仁川登陆纪念馆雕塑离开韩国的前夜,住在了仁川的一家旅店。此地这种汽车旅馆特别多,形成了规模。不远处,是一望无际的汽车停放地,问过司机导游才知道,这不是二手车市场,而是出口二手车的港口,……建议中年男人冬天多穿Barbour外套,一看就是有钱人的感觉Burberry、Aquascutum和Barbour,这三个都是英国皇室认证了的防风雨衣品牌,但相较于前两个,Barbour在国内的知名度就略显低调、小众。随着近年来老……中国最适合私奔的13个小镇,一定要带爱的人来这里愿有人与你分担家长里短,也愿陪你浪迹天涯。有人说,人生至少要有三场说走就走旅行,一次独行,一次和伴侣,一次陪同家人;而这里面,第二种旅行是最浪漫的。热恋中的爱……避孕套的八大妙用,你知道吗?公元前2000多年,古埃及人发明了避孕套,挂在男人身上当作装饰品。公元1000多年前,古代埃及人用山羊、猪等动物的膀胱或盲肠当材料做成了真正的避孕套。现在避孕套的材质多样……秋冬季节,嘴唇老起皮,养护技巧来啦一到秋冬,最先感受到干燥和寒冷的,就是我们的嘴唇了。为什么?因为嘴唇只有一层薄薄的黏膜,没有汗腺、皮脂腺,无法分泌油脂保护自己。所以对干燥的空气、大风、低温等环境特别敏感,天一……从加密之王到危机男主,SBF是如何陨落的SBF曾长期在该领域被视为偶像他的套利交易、创立FTX和Alameda、成功的大型投资,比如SOL。他在巅峰时期积累下了巨额净资产,预计有100145亿美元。SBF……7月30日小麦仍在上涨,但已动力不足玉米价格继续上涨7月30日,小麦价格小幅上涨逐步趋于稳定。但值得注意的是,现在有部分头部贸易商正在陆续离场。短期内小麦有望继续保持上行,但后劲已不足,这波上涨大范围冲高1。6的可能性较小……河南为啥叫河南?很长时间以来,我一直有个疑问,河南为啥叫河南?记得小时候,老师给的说法是:我们在黄河南边,所以叫河南。这解释能糊弄住年龄个位数的xio们,却经不起进一步的推敲:黄河流经了……以汽车压铸为抓手,肇庆加速布局新能源汽车产业3月28日,中国新能源汽车压铸产业高质量发展峰会在肇庆举行。政府部门、专家学者、企业代表汇聚一堂,共商打造大湾区新能源汽车压铸产业发展生态圈。峰会在肇庆压铸产业发展宣传片……小清新美甲,本甲就能做的款式,喜欢收藏吧分享一篇清新款美甲合集,快抓住夏天的尾巴吧!喜欢的记得收藏起来!第一款:肉桂豆沙色渐变腮红法式格纹魔镜粉,珍珠饰品。图片来源于网络第二款:玉脂裸透色亮星渐变珍……山东男篮被深圳队淘汰后,球迷透露杜锋被这3名球员的表现征服北京时间4月4日,CBA季后赛首轮第二回合的比赛继续进行,其中深圳男篮与山东队的比赛引起了球迷的注意。从两队常规赛排名看,深圳男篮虽然排名靠前,排在了球队榜的第6位,而山东男篮……武汉动物园首个动物展区基本落成大洋洲主题展区游客栈道日前,武汉动物园大洋洲主题动物展区,从2021年1月正式改造历时一年半,该区动物宝宝们的新居终于落成。园林养护科普长廊全力打造沉浸……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网