构造器设计模式完成订单下单的数据赋值
/**
* @Author: xrl
* @Date: 2022/9/10 14:41
* @Version 1.0
* 订单
*/
@Service
public class OrdersServiceImpl extends ServiceImpl<OrdersMapper, Orders> implements OrdersService {
@Autowired
private ShoppingCartService shoppingCartService;
@Autowired
private AddressBookService addressBookService;
@Autowired
private UserService userService;
@Autowired
private OrderDetailService orderDetailService;
/**
* 用户下单
*/
@Override
@Transactional
public void submit(Orders orders) {
//工具类获取订单号,设置到订单表中
orders.setId(IdWorker.getId());
StructureBuilder structureBuilder = new StructureBuilder(shoppingCartService,addressBookService,userService,
orderDetailService,orders);
//构造设计模式,构造结果
OrderPlus orderPlus = structureBuilder.builderOrderItem().builderOrder().build();
//获得订单数据
Orders orderPlusOrders = orderPlus.getOrders();
//获得订单明细数据
List<OrderDetail> detailList = orderPlus.getOrderDetailList();
//添加数据到订单表
this.save(orderPlusOrders);
//订单明细数据添加到订单明细表OrderDetail
orderDetailService.saveBatch(detailList);
//结算成功,清空购物车
LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ShoppingCart::getUserId, BaseContext.getCurrentId());
shoppingCartService.remove(wrapper);
}
}
builder构造
/**
* @Author: xrl
* @Date: 2022/9/13 13:53
* @Version 1.0
* 最终结果类
*/
@Data
public class OrderPlus {
private Orders orders;
private List<OrderDetail> orderDetailList;
}
构造设计模式,构造数据
/**
* @Author: xrl
* @Date: 2022/9/13 13:52
* @Version 1.0
* 构造设计模式,构造数据
*/
public class StructureBuilder {
private ShoppingCartService shoppingCartService;
private AddressBookService addressBookService;
private UserService userService;
private OrderDetailService orderDetailService;
private Orders orders;
private AtomicInteger amount = new AtomicInteger(0);//就可以使用这个类;
//最终结果类
private OrderPlus orderPlus;
//构造接收参数,提升作用域到成员变量位置
public StructureBuilder(ShoppingCartService shoppingCartService, AddressBookService addressBookService,
UserService userService, OrderDetailService orderDetailService, Orders orders
) {
this.shoppingCartService = shoppingCartService;
this.addressBookService = addressBookService;
this.userService = userService;
this.orderDetailService = orderDetailService;
this.orders = orders;
this.orderPlus = new OrderPlus();
}
//获取购物车数据信息,设置到OrderPlus结果实体类中
public StructureBuilder builderOrderItem() {
LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ShoppingCart::getUserId, BaseContext.getCurrentId());
//根据用户id,查询用户购物车
List<ShoppingCart> cartList = shoppingCartService.list(wrapper);
if (cartList == null || cartList.size() == 0) {
throw new CustomException("购物车为空,禁止下单");
}
//遍历购物车
List<OrderDetail> orderDetailas = cartList.stream().map((item) -> {
//创建订单明细OrderDetail对象
OrderDetail orderDetail = new OrderDetail();
//组装订单明细表信息(基本信息使用拷贝方式)
BeanUtils.copyProperties(item, orderDetail);
orderDetail.setOrderId(orders.getId());
//累加订单金额 = 单价 * 数量
int value = item.getAmount().multiply(new BigDecimal(item.getNumber())).intValue();
amount.addAndGet(value);
return orderDetail;
}).collect(Collectors.toList());
orderPlus.setOrderDetailList(orderDetailas);
return this;
}
//获取订单信息,设置到OrderPlus结果实体类中
public StructureBuilder builderOrder() {
//查询地址信息
Long addressId = orders.getAddressBookId();
AddressBook addressBook = addressBookService.getById(addressId);
if (addressBook == null) {
throw new CustomException("地址信息为空,禁止下单");
}
//获取用户信息
User user = userService.getById(BaseContext.getCurrentId());
//组装订单表数据
Orders build = Orders.builder()
.number(String.valueOf(orders.getId()))
.status(2)
.addressBookId(addressId)
.userId(BaseContext.getCurrentId())
.orderTime(LocalDateTime.now())
.checkoutTime(LocalDateTime.now())
.payMethod(2)//支付方式
.amount(new BigDecimal(amount.get()))
.phone(addressBook.getPhone())
.userName(user.getName())
.consignee(addressBook.getConsignee())
.address((addressBook.getProvinceName() == null ? "" : addressBook.getProvinceName())
+ (addressBook.getCityName() == null ? "" : addressBook.getCityName())
+ (addressBook.getDistrictName() == null ? "" : addressBook.getDistrictName())
+ (addressBook.getDetail() == null ? "" : addressBook.getDetail())).build();//具体地址信息
orderPlus.setOrders(build);
return this;
}
public OrderPlus build() {
return orderPlus;
}
}