创建订单 - 填充新订单数据

该代码段展示了创建订单的详细过程,包括从用户提交的订单信息中获取支付方式、用户地址、商品规格等,然后计算总价和实际支付金额,保存订单、订单商品和订单状态到数据库,并构造支付中心所需的商户订单信息。此外,还提供了查询用户地址的方法。
摘要由CSDN通过智能技术生成
/**
 * @Description: 支付方式 枚举
 */
public enum PayMethod {

	WEIXIN(1, "微信"),
	ALIPAY(2, "支付宝");

	public final Integer type;
	public final String value;

	PayMethod(Integer type, String value){
		this.type = type;
		this.value = value;
	}

}
/**
 * 用于创建订单相关信息
 * @param submitOrderBO
 */
public OrderVO createOrder(SubmitOrderBO submitOrderBO);
@Transactional(propagation = Propagation.REQUIRED)
@Override
public OrderVO createOrder(SubmitOrderBO submitOrderBO) {

	String userId = submitOrderBO.getUserId();
	String addressId = submitOrderBO.getAddressId();
	String itemSpecIds = submitOrderBO.getItemSpecIds();
	Integer payMethod = submitOrderBO.getPayMethod();
	String leftMsg = submitOrderBO.getLeftMsg();
	// 包邮费用设置为0
	Integer postAmount = 0;

	String orderId = sid.nextShort();

	UserAddress address = addressService.queryUserAddres(userId, addressId);

	// 1. 新订单数据保存
	Orders newOrder = new Orders();
	newOrder.setId(orderId);
	newOrder.setUserId(userId);

	newOrder.setReceiverName(address.getReceiver());
	newOrder.setReceiverMobile(address.getMobile());
	newOrder.setReceiverAddress(address.getProvince() + " "
								+ address.getCity() + " "
								+ address.getDistrict() + " "
								+ address.getDetail());

//        newOrder.setTotalAmount();
//        newOrder.setRealPayAmount();
	newOrder.setPostAmount(postAmount);

	newOrder.setPayMethod(payMethod);
	newOrder.setLeftMsg(leftMsg);

	newOrder.setIsComment(YesOrNo.NO.type);
	newOrder.setIsDelete(YesOrNo.NO.type);
	newOrder.setCreatedTime(new Date());
	newOrder.setUpdatedTime(new Date());


	// 2. 循环根据itemSpecIds保存订单商品信息表
	String itemSpecIdArr[] = itemSpecIds.split(",");
	Integer totalAmount = 0;    // 商品原价累计
	Integer realPayAmount = 0;  // 优惠后的实际支付价格累计
	for (String itemSpecId : itemSpecIdArr) {

		// TODO 整合redis后,商品购买的数量重新从redis的购物车中获取
		int buyCounts = 1;

		// 2.1 根据规格id,查询规格的具体信息,主要获取价格
		ItemsSpec itemSpec = itemService.queryItemSpecById(itemSpecId);
		totalAmount += itemSpec.getPriceNormal() * buyCounts;
		realPayAmount += itemSpec.getPriceDiscount() * buyCounts;

		// 2.2 根据商品id,获得商品信息以及商品图片
		String itemId = itemSpec.getItemId();
		Items item = itemService.queryItemById(itemId);
		String imgUrl = itemService.queryItemMainImgById(itemId);

		// 2.3 循环保存子订单数据到数据库
		String subOrderId = sid.nextShort();
		OrderItems subOrderItem = new OrderItems();
		subOrderItem.setId(subOrderId);
		subOrderItem.setOrderId(orderId);
		subOrderItem.setItemId(itemId);
		subOrderItem.setItemName(item.getItemName());
		subOrderItem.setItemImg(imgUrl);
		subOrderItem.setBuyCounts(buyCounts);
		subOrderItem.setItemSpecId(itemSpecId);
		subOrderItem.setItemSpecName(itemSpec.getName());
		subOrderItem.setPrice(itemSpec.getPriceDiscount());
		orderItemsMapper.insert(subOrderItem);

		// 2.4 在用户提交订单以后,规格表中需要扣除库存
		itemService.decreaseItemSpecStock(itemSpecId, buyCounts);
	}

	newOrder.setTotalAmount(totalAmount);
	newOrder.setRealPayAmount(realPayAmount);
	ordersMapper.insert(newOrder);

	// 3. 保存订单状态表
	OrderStatus waitPayOrderStatus = new OrderStatus();
	waitPayOrderStatus.setOrderId(orderId);
	waitPayOrderStatus.setOrderStatus(OrderStatusEnum.WAIT_PAY.type);
	waitPayOrderStatus.setCreatedTime(new Date());
	orderStatusMapper.insert(waitPayOrderStatus);

	// 4. 构建商户订单,用于传给支付中心
	MerchantOrdersVO merchantOrdersVO = new MerchantOrdersVO();
	merchantOrdersVO.setMerchantOrderId(orderId);
	merchantOrdersVO.setMerchantUserId(userId);
	merchantOrdersVO.setAmount(realPayAmount + postAmount);
	merchantOrdersVO.setPayMethod(payMethod);

	// 5. 构建自定义订单vo
	OrderVO orderVO = new OrderVO();
	orderVO.setOrderId(orderId);
	orderVO.setMerchantOrdersVO(merchantOrdersVO);

	return orderVO;
}
/**
 * 根据用户id和地址id,查询具体的用户地址对象信息
 * @param userId
 * @param addressId
 * @return
 */
public UserAddress queryUserAddres(String userId, String addressId);
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public UserAddress queryUserAddres(String userId, String addressId) {

	UserAddress singleAddress = new UserAddress();
	singleAddress.setId(addressId);
	singleAddress.setUserId(userId);

	return userAddressMapper.selectOne(singleAddress);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值