最近在搞商城项目,牵扯到订单方面的问题,就将大概的订单处理流程记录下来,方便自己查看和帮助别人理解。
费话不多少,开始。
(由于是上线项目,部分代码不方便粘贴,逻辑懂就行了)
- 下单
进入商城,选择商品,选择商品的各种信息,付款购买或者加入购物车随后结算。结算时你的订单会生成一条信息,这条信息就包含你的商品的属性和个人信息,也会生成一个主键即 商品ID - 开始分单
下单前后台获取商品的ID,根据商品ID进行一系列操作
(分单时在订单结算前完成的操作,未付款状态)
a).首先获取商品的ID,根据ID获取商品信息
//根据商品id获取商品信息
GoodsDetailInfoDto GoodsDetail = GoGoodsService.getGoodsDetailInfoByGoodsId(record.getQgoodsId());
然后通过这些信息,查找商品的状态,库存以及结算金额等,根据业务需求判断。
b)从商品信息中获取收货地址id获取相关收件地址信息
// 根据收货地址id获取相关收件地址信息
if (StringUtils.isBlank(record.getAddressId())) {
log.info("配送方式为邮寄,但邮寄地址id为空");
throw new BusinessException(ErrorCode.ORDER_10008);
}
CusaddrDto cusaddrDto = new CusaddrDto();
cusaddrDto.setCusAddrId(record.getAddressId());
cusaddrDto = cusaddrService.selectCusaddrById(cusaddrDto);
if (cusaddrDto != null) {
record.setRecvGoName(cusaddrDto.getReceiver());// 收货人姓名
record.setRecvMobile(cusaddrDto.getMobile());// 手机号码
record.setProvinceId(cusaddrDto.getProvinceId());// 省ID
record.setProvinceName(cusaddrDto.getProvinceName());// 省名称
record.setCityId(cusaddrDto.getCityId());// 市ID
record.setCityName(cusaddrDto.getCityName());// 市名称
record.setAreaId(cusaddrDto.getDistrictId());// 区ID
record.setAreaName(cusaddrDto.getDistrictName());// 区名称
record.setDetailAddr(cusaddrDto.getDitailaddr());// 详细地址
record.setZipCode(cusaddrDto.getPostalCode());// 邮编
}
然后放着,一会用,现在我们来查一个专供品这个东西。
c)该商品是否为专供品如果是直接分给经销商
专供品:电商专供一般是从厂家直接拿到的货。
此字段在商品表里,比如买一款手机,总公司和分公司都可以制造,但是分公司发布商品时设置该手机为分公司专供,所以发货的就是分公司,跟总公司没有关系。
//根据专供品查找经销商
GoGoods goods=GoGoodsService.selectByPrimaryKey(record.getQgoodsId());//查询商品是否存在
if (goods != null) {
GoodsZgpDto GoodsZgpDto= GoodsZgpService.selectByItemid(goods.getItemId()); //查询商品是否为专供品
if(GoodsZgpDto.getYesNo()!=null && GoodsZgpDto.getYesNo().equals("1") && !GoodsZgpDto.getBusiName().equals("")){
record.setBusiid(GoodsZgpDto.getBusiId());
record.setBusiname(GoodsZgpDto.getBusiName());
record.setRecvBusiid(GoodsZgpDto.getBusiId());// 收款经销商ID
record.setRecvBusiname(GoodsZgpDto.getBusiName());// 收款经销商名称
record.setChangeorderstatus(TaobaoEnum.changeorderstatus.正常分单.code());// 改派订单状态
}
}
此时将专供商品分给经销商,不是专供商品的继续往下走。
d)不是专供品的只能按地区来分配,而判断是否分单成功的条件有很多,我这里是判断经销商的ID和名字是否为空,然后如果根据地区找到了经销商,直接将订单给经销商,如果没有,直接分配给总部
//判断专供品是否分单成功,没有则按照地区分单
if(StringUtils.isBlank(record.getBusiid()) && StringUtils.isBlank(record.getBusiname())){
// 根据收货城市获取经销商
Business business = null;
if (cusaddrDto != null && (StringUtils.isNotBlank(cusaddrDto.getCityId()))) {
business = businessService.getBusinessByCityId(cusaddrDto.getCityId());
if (business != null) {
record.setBusiid(business.getId());// 经销商ID
record.setBusiname(business.getBusiName());// 经销商名称
record.setRecvBusiid(business.getId());// 收款经销商ID
record.setRecvBusiname(business.getBusiName());// 收款经销商名称
record.setChangeorderstatus(TaobaoEnum.changeorderstatus.正常分单.code());// 改派订单状态
}else{
//没找到经销商的情况下将订单分配总部
business=businessService.getHeadQuarterBusiness();
if (business != null) {
record.setBusiid(null);// 经销商ID
record.setBusiname(null);// 经销商名称
record.setRecvBusiid(business.getId());// 收款经销商ID
record.setRecvBusiname(business.getBusiName());// 收款经销商名称
record.setChangeorderstatus(TaobaoEnum.changeorderstatus.不正常分单.code());// 改派订单状态
}else{
log.info("在没有找经销商的情况下,将订单默认分配给总部,但是并未获取到总部信息");
throw new BusinessException(ErrorCode.ORDER_10024);
}
}
}
}
这就是分单的简单逻辑,复杂的不是没有,牵扯东西多的去了,逻辑懂了,复杂的也不怕。