|
@@ -1,16 +1,47 @@
|
|
|
package com.kxs.lhb.basic.biz.service.impl;
|
|
package com.kxs.lhb.basic.biz.service.impl;
|
|
|
|
|
|
|
|
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
|
|
|
|
+import cn.hutool.core.date.DatePattern;
|
|
|
|
|
+import cn.hutool.core.date.LocalDateTimeUtil;
|
|
|
|
|
+import cn.hutool.core.util.IdUtil;
|
|
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.github.yulichang.base.MPJBaseServiceImpl;
|
|
import com.github.yulichang.base.MPJBaseServiceImpl;
|
|
|
-import com.github.yulichang.toolkit.JoinWrappers;
|
|
|
|
|
-import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
|
|
|
|
|
|
+import com.kxs.common.core.constant.CommonConstants;
|
|
|
|
|
+import com.kxs.common.core.exception.GlobalCustomerException;
|
|
|
|
|
+import com.kxs.common.core.util.AssertUtil;
|
|
|
|
|
+import com.kxs.common.mq.handlers.IMQSender;
|
|
|
|
|
+import com.kxs.common.pay.enums.PayPlatformEnum;
|
|
|
|
|
+import com.kxs.common.pay.enums.PayStatusCommEnum;
|
|
|
|
|
+import com.kxs.common.pay.factory.PaymentFactory;
|
|
|
|
|
+import com.kxs.common.pay.model.PayRequest;
|
|
|
|
|
+import com.kxs.common.pay.model.QueryRequest;
|
|
|
|
|
+import com.kxs.common.pay.model.QueryResponse;
|
|
|
|
|
+import com.kxs.common.security.util.SecurityUtils;
|
|
|
|
|
+import com.kxs.lhb.basic.api.amqp.RabbitOrderTimeoutQueueMQ;
|
|
|
|
|
+import com.kxs.lhb.basic.api.constant.enums.OrderStatusEnum;
|
|
|
|
|
+import com.kxs.lhb.basic.api.dto.tongyi.*;
|
|
|
|
|
+import com.kxs.lhb.basic.api.model.*;
|
|
|
import com.kxs.lhb.basic.api.vo.admin.sysOrder.QueryLogisticsVO;
|
|
import com.kxs.lhb.basic.api.vo.admin.sysOrder.QueryLogisticsVO;
|
|
|
|
|
+import com.kxs.lhb.basic.api.vo.tongyi.OrderChargeLevelRes;
|
|
|
|
|
+import com.kxs.lhb.basic.api.vo.tongyi.QueryLogisticsRes;
|
|
|
|
|
+import com.kxs.lhb.basic.biz.channel.BasicService;
|
|
|
import com.kxs.lhb.basic.biz.mapper.LhbOrderMapper;
|
|
import com.kxs.lhb.basic.biz.mapper.LhbOrderMapper;
|
|
|
-import com.kxs.lhb.basic.biz.service.LhbOrderService;
|
|
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
+import com.kxs.lhb.basic.biz.mq.model.params.BindNotify;
|
|
|
|
|
+import com.kxs.lhb.basic.biz.service.*;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
-import com.kxs.lhb.basic.api.model.LhbOrder;
|
|
|
|
|
|
|
+import org.springframework.scheduling.annotation.Async;
|
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
+
|
|
|
|
|
+import java.io.IOException;
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
|
|
+import java.time.LocalDate;
|
|
|
|
|
+import java.time.LocalDateTime;
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
|
+import java.util.List;
|
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -24,10 +55,286 @@ import com.kxs.lhb.basic.api.model.LhbOrder;
|
|
|
@Slf4j
|
|
@Slf4j
|
|
|
public class LhbOrderServiceImpl extends MPJBaseServiceImpl<LhbOrderMapper, LhbOrder> implements LhbOrderService {
|
|
public class LhbOrderServiceImpl extends MPJBaseServiceImpl<LhbOrderMapper, LhbOrder> implements LhbOrderService {
|
|
|
|
|
|
|
|
|
|
+ private final BasicService basicService;
|
|
|
|
|
+
|
|
|
|
|
+ private final LhbUserService userService;
|
|
|
|
|
+
|
|
|
|
|
+ private final LhbGoodsService goodsService;
|
|
|
|
|
+
|
|
|
|
|
+ private final LhbGoodsSkuService goodsSkuService;
|
|
|
|
|
+
|
|
|
|
|
+ private final LhbGoodsActivitiesService goodsActivitiesService;
|
|
|
|
|
+
|
|
|
|
|
+ private final PaymentFactory paymentFactory;
|
|
|
|
|
+
|
|
|
|
|
+ private final IMQSender mqSender;
|
|
|
|
|
+
|
|
|
|
|
+ private final LhbNotifyService notifyService;
|
|
|
|
|
+
|
|
|
|
|
+ private final LhbAreaService areaService;
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<QueryLogisticsVO> queryLogistics(Integer id) {
|
|
|
|
|
+
|
|
|
|
|
+ LhbOrder order = getById(id);
|
|
|
|
|
+
|
|
|
|
|
+ if(StrUtil.isBlank(order.getOutOrderSn())){
|
|
|
|
|
+ throw new GlobalCustomerException("订单未下单");
|
|
|
|
|
+ }
|
|
|
|
|
+ QueryOrderReq req = QueryOrderReq.builder().orderId(order.getOutOrderSn()).build();
|
|
|
|
|
+ QueryLogisticsRes queryLogisticsRes = basicService.queryLogistics(req);
|
|
|
|
|
+ order.setExpressNo(queryLogisticsRes.getExpressNo());
|
|
|
|
|
+ order.updateById();
|
|
|
|
|
+
|
|
|
|
|
+ List<QueryLogisticsVO> list = new ArrayList<>();
|
|
|
|
|
+ queryLogisticsRes.getInfoList().forEach(item -> {
|
|
|
|
|
+ QueryLogisticsVO logisticsVO = new QueryLogisticsVO();
|
|
|
|
|
+ logisticsVO.setExpressNo(queryLogisticsRes.getExpressNo());
|
|
|
|
|
+ logisticsVO.setContent(item.getContent());
|
|
|
|
|
+ logisticsVO.setOperationTime(item.getOperationTime());
|
|
|
|
|
+ list.add(logisticsVO);
|
|
|
|
|
+ });
|
|
|
|
|
+ return list;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Integer prePhone(LhbOrder order) {
|
|
|
|
|
+
|
|
|
|
|
+ LhbUser user = userService.getById(SecurityUtils.getUser().getId());
|
|
|
|
|
+
|
|
|
|
|
+ //订单号
|
|
|
|
|
+ String orderSn = CommonConstants.ORDER_SN_PREFIX + IdUtil.getSnowflakeNextIdStr();
|
|
|
|
|
+ order.setOrderSn(orderSn);
|
|
|
|
|
+ order.setEmployNum(user.getEmployNum());
|
|
|
|
|
+ order.setUserId(user.getId());
|
|
|
|
|
+
|
|
|
|
|
+ //预占号码
|
|
|
|
|
+ PreNumbersReq req = PreNumbersReq.builder()
|
|
|
|
|
+ .regionId(order.getRegionId())
|
|
|
|
|
+ .idenNr(order.getIdCard())
|
|
|
|
|
+ .number(order.getMakeMobile()).build();
|
|
|
|
|
+ basicService.preNumber(req);
|
|
|
|
|
+
|
|
|
|
|
+ order.insert();
|
|
|
|
|
+
|
|
|
|
|
+ //发送订单延时取消消息
|
|
|
|
|
+ RabbitOrderTimeoutQueueMQ.MsgEntity msgEntity = new RabbitOrderTimeoutQueueMQ.MsgEntity();
|
|
|
|
|
+ msgEntity.setOrderId(order.getId());
|
|
|
|
|
+ mqSender.send(RabbitOrderTimeoutQueueMQ.build(msgEntity), 60 * 20);
|
|
|
|
|
+
|
|
|
|
|
+ return order.getId();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
|
+ public Integer submit(LhbOrder param) {
|
|
|
|
|
+
|
|
|
|
|
+ LhbOrder order = getById(param.getId());
|
|
|
|
|
+ AssertUtil.isTrue(order.getStatus().equals(OrderStatusEnum.NO_PAY.getCode()), "订单状态异常");
|
|
|
|
|
+
|
|
|
|
|
+ LhbGoods goods = goodsService.getById(param.getGoodsId());
|
|
|
|
|
+ if(goods.getServerFee().compareTo(param.getServerFee()) != 0){
|
|
|
|
|
+
|
|
|
|
|
+ throw new GlobalCustomerException("服务费与传入的服务费不匹配");
|
|
|
|
|
+ }
|
|
|
|
|
+ order.setOperators(goods.getOperators());
|
|
|
|
|
+ order.setAddress(param.getAddress());
|
|
|
|
|
+ order.setArea(param.getArea());
|
|
|
|
|
+ order.setContMobile(param.getContMobile());
|
|
|
|
|
+ order.setCustName(param.getCustName());
|
|
|
|
|
+ order.setPackageName(param.getPackageName());
|
|
|
|
|
+ order.setGoodsId(param.getGoodsId());
|
|
|
|
|
+ order.setSkuId(param.getSkuId());
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ LhbGoodsSku goodsSku = goodsSkuService.getById(param.getSkuId());
|
|
|
|
|
+ List<LhbGoodsActivities> activities = goodsActivitiesService.list(Wrappers.lambdaQuery(LhbGoodsActivities.class).eq(LhbGoodsActivities::getSkuId, goodsSku.getId()));
|
|
|
|
|
+
|
|
|
|
|
+ //如果有服务费 需要先支付 在回调再下单
|
|
|
|
|
+ if(order.getServerFee().compareTo(BigDecimal.ZERO) == 0){
|
|
|
|
|
+
|
|
|
|
|
+ order.setStatus(OrderStatusEnum.PAY.getCode());
|
|
|
|
|
+ order.setPayTime(LocalDateTime.now());
|
|
|
|
|
+ //三方下单
|
|
|
|
|
+ OrderSubmitReq req = OrderSubmitReq.builder()
|
|
|
|
|
+ .goodsId(goods.getExternalId())
|
|
|
|
|
+ .goodsSkuId(goodsSku.getExternalSkuId())
|
|
|
|
|
+ .offerCodes(!activities.isEmpty() ? activities.stream().map(LhbGoodsActivities::getActivityCode).collect(Collectors.joining(",")) : "")
|
|
|
|
|
+ .payMoney("0")
|
|
|
|
|
+ .number(order.getMakeMobile())
|
|
|
|
|
+ .custName(order.getCustName())
|
|
|
|
|
+ .contNumber(order.getContMobile())
|
|
|
|
|
+ .idenNr(order.getIdCard())
|
|
|
|
|
+ .receiveName(order.getCustName())
|
|
|
|
|
+ .receiveMobile(order.getContMobile())
|
|
|
|
|
+ .receiveAddress(order.getAddress())
|
|
|
|
|
+ .area(order.getArea())
|
|
|
|
|
+ .preNumber(Boolean.FALSE)
|
|
|
|
|
+ .regionId(order.getRegionId()).build();
|
|
|
|
|
+ String orderId = basicService.orderSubmit(req);
|
|
|
|
|
+ order.setOutOrderSn(orderId);
|
|
|
|
|
+ }
|
|
|
|
|
+ order.updateById();
|
|
|
|
|
+ return order.getId();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
@Override
|
|
@Override
|
|
|
- public Page<QueryLogisticsVO> queryLogistics(Page<QueryLogisticsVO> page, LhbOrder param) {
|
|
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
|
+ public void payBack(String outTradeNo, String transactionId) {
|
|
|
|
|
+ LhbOrder order = getOne(Wrappers.lambdaQuery(LhbOrder.class).eq(LhbOrder::getOrderSn, outTradeNo));
|
|
|
|
|
+ if(order.getStatus() != OrderStatusEnum.NO_PAY.getCode()){
|
|
|
|
|
+ throw new GlobalCustomerException("订单状态错误");
|
|
|
|
|
+ }
|
|
|
|
|
+ LhbGoods goods = goodsService.getById(order.getGoodsId());
|
|
|
|
|
+ LhbGoodsSku goodsSku = goodsSkuService.getById(order.getSkuId());
|
|
|
|
|
|
|
|
- return null;
|
|
|
|
|
|
|
+ order.setPayTradeNo(transactionId);
|
|
|
|
|
+ order.setStatus(OrderStatusEnum.PAY.getCode());
|
|
|
|
|
+ order.setPayTime(LocalDateTime.now());
|
|
|
|
|
+
|
|
|
|
|
+ //三方下单
|
|
|
|
|
+ OrderSubmitReq req = OrderSubmitReq.builder()
|
|
|
|
|
+ .goodsId(goods.getExternalId())
|
|
|
|
|
+ .goodsSkuId(goodsSku.getExternalSkuId())
|
|
|
|
|
+ .payMoney("0")
|
|
|
|
|
+ .number(order.getMakeMobile())
|
|
|
|
|
+ .custName(order.getCustName())
|
|
|
|
|
+ .contNumber(order.getContMobile())
|
|
|
|
|
+ .idenNr(order.getIdCard())
|
|
|
|
|
+ .receiveName(order.getCustName())
|
|
|
|
|
+ .receiveMobile(order.getContMobile())
|
|
|
|
|
+ .receiveAddress(order.getAddress())
|
|
|
|
|
+ .area(order.getArea())
|
|
|
|
|
+ .preNumber(Boolean.FALSE)
|
|
|
|
|
+ .regionId(order.getRegionId()).build();
|
|
|
|
|
+ String orderId = basicService.orderSubmit(req);
|
|
|
|
|
+ order.setOutOrderSn(orderId);
|
|
|
|
|
+ order.updateById();
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Object payOrder(LhbOrder param) {
|
|
|
|
|
+
|
|
|
|
|
+ LhbUser user = userService.getById(SecurityUtils.getUser().getId());
|
|
|
|
|
+
|
|
|
|
|
+ LhbOrder order = getById(param.getId());
|
|
|
|
|
+
|
|
|
|
|
+ PayRequest payReq = new PayRequest();
|
|
|
|
|
+ payReq.setPayTypeEnum(PayPlatformEnum.WX);
|
|
|
|
|
+ payReq.setOutTradeNo(order.getOrderSn());
|
|
|
|
|
+ payReq.setSubject(order.getPackageName());
|
|
|
|
|
+ payReq.setTotalAmount(order.getServerFee().doubleValue());
|
|
|
|
|
+ //扩展参数
|
|
|
|
|
+ payReq.setPassbackParams(CommonConstants.PRODUCT_FLAG);
|
|
|
|
|
+ payReq.setOpenid(user.getWxOpenid());
|
|
|
|
|
+
|
|
|
|
|
+ return paymentFactory.getPayService(PayPlatformEnum.WX.getType()).jsPay(payReq);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void changeTimeoutOrder(LhbOrder order) {
|
|
|
|
|
+
|
|
|
|
|
+ order.setStatus(OrderStatusEnum.CANCEL.getCode());
|
|
|
|
|
+
|
|
|
|
|
+ //有押金才查询是否支付
|
|
|
|
|
+ if(order.getServerFee().compareTo(BigDecimal.ZERO) > 0){
|
|
|
|
|
+ QueryRequest queryReq = QueryRequest.builder()
|
|
|
|
|
+ .outTradeNo(order.getOrderSn())
|
|
|
|
|
+ .build();
|
|
|
|
|
+
|
|
|
|
|
+ QueryResponse query = paymentFactory.getPayService(PayPlatformEnum.WX.getType()).query(queryReq);
|
|
|
|
|
+
|
|
|
|
|
+ if (query != null && PayStatusCommEnum.TRADE_SUCCESS == query.getTradeStatus() ) {
|
|
|
|
|
+ order.setStatus( OrderStatusEnum.PAY.getCode());
|
|
|
|
|
+ order.setPayTime(LocalDateTime.now());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ updateById(order);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
|
+ public Boolean cancelOrder(LhbOrder param) {
|
|
|
|
|
+
|
|
|
|
|
+ LhbOrder order = getById(param.getId());
|
|
|
|
|
+ if(order.getIsAct() == 1){
|
|
|
|
|
+ throw new GlobalCustomerException("订单已激活,无法取消");
|
|
|
|
|
+ }
|
|
|
|
|
+ if(order.getOutStatus() == 41){
|
|
|
|
|
+ throw new GlobalCustomerException("配送中,不可取消订单");
|
|
|
|
|
+ }
|
|
|
|
|
+ if(order.getOutStatus() == 6){
|
|
|
|
|
+ throw new GlobalCustomerException("订单正在取消中");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ order.setStatus(OrderStatusEnum.CANCEL.getCode());
|
|
|
|
|
+ order.setRemark(param.getRemark());
|
|
|
|
|
+ order.updateById();
|
|
|
|
|
+
|
|
|
|
|
+ OrderCancelReq req = OrderCancelReq.builder()
|
|
|
|
|
+ .orderId(order.getOutOrderSn())
|
|
|
|
|
+ .returnCause(param.getRemark())
|
|
|
|
|
+ .applyPerson(SecurityUtils.getUser().getName()).build();
|
|
|
|
|
+ basicService.orderCancel(req);
|
|
|
|
|
+
|
|
|
|
|
+ return Boolean.TRUE;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ @Async
|
|
|
|
|
+ public void orderStatusTask() {
|
|
|
|
|
+ List<LhbOrder> orders = list(Wrappers.lambdaQuery(LhbOrder.class)
|
|
|
|
|
+ .eq(LhbOrder::getIsAct, CommonConstants.FAIL)
|
|
|
|
|
+ .eq(LhbOrder::getStatus, OrderStatusEnum.PAY.getCode()));
|
|
|
|
|
+
|
|
|
|
|
+ orders.forEach(order -> {
|
|
|
|
|
+ QueryOrderReq req = QueryOrderReq.builder().orderId(order.getOutOrderSn()).build();
|
|
|
|
|
+ String outStatus = basicService.queryStatus(req);
|
|
|
|
|
+ //更新状态
|
|
|
|
|
+ update(Wrappers.lambdaUpdate(LhbOrder.class).eq(LhbOrder::getId, order.getId()).set(LhbOrder::getOutStatus, outStatus));
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ @Async
|
|
|
|
|
+ public void orderFirstCharge() {
|
|
|
|
|
+ List<LhbOrder> orders = list(Wrappers.lambdaQuery(LhbOrder.class)
|
|
|
|
|
+ .eq(LhbOrder::getIsAct, CommonConstants.FAIL)
|
|
|
|
|
+ .eq(LhbOrder::getStatus, OrderStatusEnum.PAY.getCode()));
|
|
|
|
|
+
|
|
|
|
|
+ orders.forEach(order -> {
|
|
|
|
|
+ QueryOrderReq req = QueryOrderReq.builder().orderId(order.getOutOrderSn()).build();
|
|
|
|
|
+ String firstCharge = basicService.queryFirstCharge(req);
|
|
|
|
|
+ if(firstCharge.contains("50") || firstCharge.contains("100")){
|
|
|
|
|
+
|
|
|
|
|
+ BigDecimal firstChargeAmt = firstCharge.contains("50") ? new BigDecimal("5000") : new BigDecimal("10000");
|
|
|
|
|
+
|
|
|
|
|
+ //更新状态
|
|
|
|
|
+ update(Wrappers.lambdaUpdate(LhbOrder.class).eq(LhbOrder::getId, order.getId())
|
|
|
|
|
+ .set(LhbOrder::getIsAct, CommonConstants.SUCCESS)
|
|
|
|
|
+ .set(LhbOrder::getFirstCharge, firstChargeAmt)
|
|
|
|
|
+ .set(LhbOrder::getIsFirstRecharge, CommonConstants.SUCCESS));
|
|
|
|
|
+
|
|
|
|
|
+ //构建推送消息
|
|
|
|
|
+ BindNotify bindNotify = BindNotify.builder().mobile(order.getMakeMobile())
|
|
|
|
|
+ .productName(order.getPackageName())
|
|
|
|
|
+ .firstRechargeAmount(firstChargeAmt)
|
|
|
|
|
+ .userName(order.getCustName())
|
|
|
|
|
+ .orderNo(order.getOrderSn())
|
|
|
|
|
+ .receiveName(order.getCustName())
|
|
|
|
|
+ .receiveMobile(order.getContMobile())
|
|
|
|
|
+ .receiveAddress(order.getAddress())
|
|
|
|
|
+ .createTime(LocalDateTimeUtil.format(LocalDate.now(), DatePattern.NORM_DATETIME_PATTERN))
|
|
|
|
|
+ .build();
|
|
|
|
|
+ notifyService.bindPush(bindNotify, order.getIsvNo());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
|
|
|