订单系统之【分单】

在这里插入图片描述
最近在搞商城项目,牵扯到订单方面的问题,就将大概的订单处理流程记录下来,方便自己查看和帮助别人理解。
费话不多少,开始
(由于是上线项目,部分代码不方便粘贴,逻辑懂就行了)

  1. 下单
    进入商城,选择商品,选择商品的各种信息,付款购买或者加入购物车随后结算。结算时你的订单会生成一条信息,这条信息就包含你的商品的属性和个人信息,也会生成一个主键即 商品ID
  2. 开始分单
    下单前后台获取商品的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);
		            }
				}
			}
		}  

这就是分单的简单逻辑,复杂的不是没有,牵扯东西多的去了,逻辑懂了,复杂的也不怕。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值