|
|
@@ -0,0 +1,153 @@
|
|
|
+package com.cyksj.service.order.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Assert;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.cyksj.common.exception.BusinessRuntimeException;
|
|
|
+import com.cyksj.common.snowflake.Sequence;
|
|
|
+import com.cyksj.common.util.Jsons;
|
|
|
+import com.cyksj.mapper.AddressMapper;
|
|
|
+import com.cyksj.mapper.RentOrderDonTransportMapper;
|
|
|
+import com.cyksj.mapper.UserMapper;
|
|
|
+import com.cyksj.mapper.rent.RentGoodsDonSkuMapper;
|
|
|
+import com.cyksj.mapper.rent.RentGoodsDonSpecMapper;
|
|
|
+import com.cyksj.mapper.rent.RentOrderDonMapper;
|
|
|
+import com.cyksj.model.dto.AliPayParams;
|
|
|
+import com.cyksj.model.entity.*;
|
|
|
+import com.cyksj.model.manage.request.ReqGoodsSkuSpec;
|
|
|
+import com.cyksj.model.request.AlipayOrderDonReq;
|
|
|
+import com.cyksj.model.request.RentOrderPayRequest;
|
|
|
+import com.cyksj.service.order.RentOrderDonService;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 项目名: yhlxj2
|
|
|
+ * 文件名: RentOrderDonServiceImpl
|
|
|
+ * 创建者: JavaZou
|
|
|
+ * 创建时间:2024/2/22 17:31
|
|
|
+ */
|
|
|
+@Service
|
|
|
+@RequiredArgsConstructor
|
|
|
+@Slf4j
|
|
|
+public class RentOrderDonServiceImpl implements RentOrderDonService {
|
|
|
+ private final RentGoodsDonSkuMapper skuMapper;
|
|
|
+
|
|
|
+ private final RentGoodsDonSpecMapper specMapper;
|
|
|
+
|
|
|
+ private final UserMapper userMapper;
|
|
|
+
|
|
|
+ private final AddressMapper addressMapper;
|
|
|
+
|
|
|
+ private final RentOrderDonMapper orderDonMapper;
|
|
|
+
|
|
|
+ private final RentOrderDonTransportMapper orderDonTransportMapper;
|
|
|
+
|
|
|
+ private static final Sequence SEQUENCE = new Sequence(0);
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public RentOrderDon submit(RentOrderPayRequest payRequest) throws Exception {
|
|
|
+ Long skuId = payRequest.getSkuId();
|
|
|
+ RentGoodsDonSku sku = skuMapper.selectById(skuId);
|
|
|
+ Assert.notNull(sku, "规格不存在..");
|
|
|
+ BigDecimal price = sku.getPrice();
|
|
|
+ //押金
|
|
|
+ BigDecimal deposit = getRentGoodsDonDeposit(sku.getGoodsId(), sku.getSpecIds());
|
|
|
+ Assert.notNull(deposit, "应付押金异常..");
|
|
|
+
|
|
|
+ Long userId = payRequest.getUserId();
|
|
|
+ User user = userMapper.selectById(userId);
|
|
|
+ Assert.notNull(user, "用户信息已失效,请重新登录");
|
|
|
+
|
|
|
+ Long addressId = payRequest.getAddressId();
|
|
|
+
|
|
|
+ //检查地址是否存在
|
|
|
+ Address address = checkAddressId(addressId);
|
|
|
+
|
|
|
+ /* 生成订单 */
|
|
|
+ String donNo = SEQUENCE.nextId().toString();
|
|
|
+ RentOrderDon orderDon = new RentOrderDon();
|
|
|
+
|
|
|
+ orderDon.setOrderNo(donNo);
|
|
|
+ orderDon.setOpenId(user.getOpenId());
|
|
|
+
|
|
|
+ if (payRequest.getDonMoney().compareTo(price.add(deposit)) < 0) {
|
|
|
+ payRequest.setDonMoney(price.add(deposit));
|
|
|
+ }
|
|
|
+ orderDon.setMoney(payRequest.getDonMoney());
|
|
|
+ //押金
|
|
|
+ orderDon.setDeposit(deposit);
|
|
|
+ orderDon.setSkuId(payRequest.getSkuId());
|
|
|
+ orderDon.setGoodsId(sku.getGoodsId());
|
|
|
+ orderDon.setStatus(RentOrderDon.Status.noPayment);
|
|
|
+ orderDon.setUserId(user.getId());
|
|
|
+ orderDon.setType(RentOrderDon.Type.getType(payRequest.getType()));
|
|
|
+ orderDon.setPayTitle(sku.getSpecVal());
|
|
|
+ orderDonMapper.insert(orderDon);
|
|
|
+
|
|
|
+ saveTransport(address, orderDon.getId());
|
|
|
+
|
|
|
+ return orderDon;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public AliPayParams aliPay(AlipayOrderDonReq alipayOrderDonReq, String productCode, String qrPayMode) throws Exception {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void aliPayNotify(Map<String, String> paramsMap) throws Exception {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取租赁商品的应付押金
|
|
|
+ */
|
|
|
+ private BigDecimal getRentGoodsDonDeposit(Long goodsId, String specIdsStr) throws Exception {
|
|
|
+ RentGoodsDonSpec rentGoodsDonSpec = specMapper.selectOne(Wrappers.lambdaQuery(RentGoodsDonSpec.class)
|
|
|
+ .eq(RentGoodsDonSpec::getGoodsId, goodsId)
|
|
|
+ .last("limit 1"));
|
|
|
+ List<Long> specIds = Jsons.parseList(specIdsStr, Long.class);
|
|
|
+ String specsJson = rentGoodsDonSpec.getSpecsJson();
|
|
|
+ List<ReqGoodsSkuSpec> reqGoodsSkuSpec = Jsons.parseList(specsJson, ReqGoodsSkuSpec.class);
|
|
|
+ //押金
|
|
|
+ BigDecimal deposit = null;
|
|
|
+ for (ReqGoodsSkuSpec spec : reqGoodsSkuSpec) {
|
|
|
+ if (spec.getKey().contains("版本")) {
|
|
|
+ for (ReqGoodsSkuSpec.Node value : spec.getValues()) {
|
|
|
+ if (specIds.contains(value.getId())) {
|
|
|
+ return value.getDeposit();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Address checkAddressId(Long addressId) {
|
|
|
+ if (addressId == null) {
|
|
|
+ throw new BusinessRuntimeException("请选择收货地址.");
|
|
|
+ }
|
|
|
+ Address address = addressMapper.selectById(addressId);
|
|
|
+ if (address == null) {
|
|
|
+ throw new BusinessRuntimeException("请添加收货地址.");
|
|
|
+ }
|
|
|
+ return address;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void saveTransport(Address address, Long orderId) {
|
|
|
+ RentOrderDonTransport transport = new RentOrderDonTransport();
|
|
|
+ transport.setOrderId(orderId);
|
|
|
+ transport.setReceiver(address.getReceiver());
|
|
|
+ transport.setPhone(address.getPhone());
|
|
|
+ transport.setProvince(address.getProvince());
|
|
|
+ transport.setCity(address.getCity());
|
|
|
+ transport.setDistrict(address.getDistrict());
|
|
|
+ transport.setAddress(address.getAddress());
|
|
|
+ orderDonTransportMapper.insert(transport);
|
|
|
+ }
|
|
|
+}
|