|
|
@@ -1,5 +1,6 @@
|
|
|
package com.cyksj.service.mange.impl;
|
|
|
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.date.DateField;
|
|
|
import cn.hutool.core.date.DateTime;
|
|
|
@@ -24,9 +25,11 @@ import com.cyksj.config.WeChatConfig;
|
|
|
import com.cyksj.config.zfb.AliPayClientFactory;
|
|
|
import com.cyksj.dto.RedisKey;
|
|
|
import com.cyksj.mapper.*;
|
|
|
+import com.cyksj.mapper.channel.ChannelPopularizeMapper;
|
|
|
import com.cyksj.mapper.channel.ShopConfigMapper;
|
|
|
import com.cyksj.mapper.channel.UserPayEquipmentReceiveBenefitsRecordMapper;
|
|
|
import com.cyksj.mapper.manage.cms.CmsUserMapper;
|
|
|
+import com.cyksj.mapper.manage.coupon.CouponMapper;
|
|
|
import com.cyksj.mapper.manage.distribute.DistributeWaitingSendPointsMapper;
|
|
|
import com.cyksj.mapper.manage.distribute.UserDistributeBusinessOrderDonRecordMapper;
|
|
|
import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
|
|
|
@@ -36,8 +39,12 @@ import com.cyksj.mapper.shop.YhShopUserDistributeBusinessOrderDonRecordMapper;
|
|
|
import com.cyksj.mapper.stock.GoodsSkuStockRelateMapper;
|
|
|
import com.cyksj.model.entity.*;
|
|
|
import com.cyksj.model.excel.ExcelOrderDonInfo;
|
|
|
+import com.cyksj.model.excel.ExcelOrderMasterDonData;
|
|
|
import com.cyksj.model.manage.request.ReqSetLogisticsPost;
|
|
|
+import com.cyksj.model.manage.views.AccountView;
|
|
|
import com.cyksj.model.manage.views.GroupsRelationView;
|
|
|
+import com.cyksj.model.manage.views.OrderDonSkuBackView;
|
|
|
+import com.cyksj.model.manage.views.OrderDonSkuExportView;
|
|
|
import com.cyksj.model.request.ChangeRelationReq;
|
|
|
import com.cyksj.model.request.ClickOutReq;
|
|
|
import com.cyksj.model.request.OrderRefundReq;
|
|
|
@@ -49,6 +56,7 @@ import com.cyksj.service.mange.CmsOrderDonService;
|
|
|
import com.cyksj.service.mange.stock.GoodsDonStockService;
|
|
|
import com.cyksj.service.market.MarketFrontService;
|
|
|
import com.cyksj.service.order.OrderCommonService;
|
|
|
+import com.cyksj.service.order.OrderMasterDonService;
|
|
|
import com.cyksj.service.order.UserRealOrderBenefitsService;
|
|
|
import com.cyksj.service.paypal.PayPalService;
|
|
|
import com.cyksj.service.relation.GroupRelationClearService;
|
|
|
@@ -58,7 +66,9 @@ import com.cyksj.service.stripe.StripeService;
|
|
|
import com.cyksj.service.user.UserBenefitsService;
|
|
|
import com.cyksj.service.wechat.WeChatService;
|
|
|
import com.ejlchina.searcher.BeanSearcher;
|
|
|
+import com.ejlchina.searcher.param.Operator;
|
|
|
import com.ejlchina.searcher.util.MapUtils;
|
|
|
+import com.google.common.collect.Lists;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.dao.DuplicateKeyException;
|
|
|
@@ -71,6 +81,10 @@ import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.Optional;
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
+import java.util.concurrent.CopyOnWriteArrayList;
|
|
|
+import java.util.concurrent.CountDownLatch;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
/**
|
|
|
* @author chan
|
|
|
@@ -159,6 +173,11 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
|
|
|
|
|
|
private final YhShopUserDistributeBusinessOrderDonRecordMapper yhShopBusinessOrderDonRecordMapper;
|
|
|
|
|
|
+ private final ChannelPopularizeMapper channelPopularizeMapper;
|
|
|
+
|
|
|
+ private final OrderMasterDonService orderMasterDonService;
|
|
|
+
|
|
|
+ private final CouponMapper couponMapper;
|
|
|
private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
|
|
|
|
|
|
@Override
|
|
|
@@ -179,80 +198,82 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
|
|
|
orderDonWaybill.setTrackingNumber(reqSetLogisticsPost.getTrackingNumber());
|
|
|
orderDonWaybill.setOrderId(reqSetLogisticsPost.getOrderId());
|
|
|
orderDonWaybill.setRemark(reqSetLogisticsPost.getRemark());
|
|
|
- OrderDon orderDon = getById(orderDonWaybill.getOrderId());
|
|
|
- if(orderDonWaybill.getId() == null){
|
|
|
+ OrderMasterDon masterDon = orderMasterDonService.getById(orderDonWaybill.getOrderId());
|
|
|
+ Long mOid = masterDon.getId();
|
|
|
+
|
|
|
+ if (orderDonWaybill.getId() == null) {
|
|
|
try {
|
|
|
orderDonWaybillMapper.insert(orderDonWaybill);
|
|
|
} catch (DuplicateKeyException e) {
|
|
|
return orderDonWaybill;
|
|
|
}
|
|
|
- orderDon.setStatus(OrderDon.Status.transport);
|
|
|
- updateById(orderDon);
|
|
|
-
|
|
|
- GoodsDonSku sku = goodsDonSkuMapper.selectById(orderDon.getSkuId());
|
|
|
- //库存扣减逻辑
|
|
|
- List<GoodsSkuStockRelate> relateList = skuStockRelateMapper.selectList(Wrappers.lambdaQuery(GoodsSkuStockRelate.class).eq(GoodsSkuStockRelate::getSkuId,orderDon.getSkuId()));
|
|
|
- if(!relateList.isEmpty()){
|
|
|
- relateList.forEach((relate)->{
|
|
|
- goodsDonStockService.upStockRelate(relate.getStockId(),orderDon.getId(),"transport");
|
|
|
- });
|
|
|
- }
|
|
|
+ List<OrderDonSkuBackView> orderDonList = beanSearcher.searchAll(OrderDonSkuBackView.class, MapUtils.builder().field(OrderDonSkuBackView::getMOid, mOid)
|
|
|
+ .field(OrderDonSkuBackView::getGoodsDonType, 1).op(Operator.GreaterThan)
|
|
|
+ .field(OrderDonSkuBackView::getRelationId, 0)
|
|
|
+ .build());
|
|
|
+ for (OrderDonSkuBackView orderDon : orderDonList) {
|
|
|
+ orderDon.setStatus(OrderDon.Status.transport);
|
|
|
+ boolean update = update(null, Wrappers.lambdaUpdate(OrderDon.class)
|
|
|
+ .set(OrderDon::getStatus, OrderDon.Status.transport)
|
|
|
+ .ne(OrderDon::getStatus, OrderDon.Status.transport)
|
|
|
+ .eq(OrderDon::getId, orderDon.getId()));
|
|
|
+ if (!update) {
|
|
|
+ log.info("已更新实物订单orderId:{]状态", orderDon.getId());
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
- //发放实物购买权益
|
|
|
- Boolean isReceivedAll = true;
|
|
|
- if (sku != null) {
|
|
|
- if (sku.getIsBenefits()) {
|
|
|
- if (StrUtil.isNotEmpty(sku.getBenefitsList())) {
|
|
|
- try {
|
|
|
- List<GoodsDonSku> goodsDonSkus = Jsons.parseList(sku.getBenefitsList(), GoodsDonSku.class);
|
|
|
- //自购实物 获取权益
|
|
|
- isReceivedAll = userRealOrderBenefitsService.getPayRealGoodsBenefits(orderDon.getUserId(), orderDon.getId(), orderDon.getYhsId(), goodsDonSkus);
|
|
|
- } catch (Exception e) {
|
|
|
+ GoodsDonSku sku = goodsDonSkuMapper.selectById(orderDon.getSkuId());
|
|
|
+ //库存扣减逻辑
|
|
|
+ List<GoodsSkuStockRelate> relateList = skuStockRelateMapper.selectList(Wrappers.lambdaQuery(GoodsSkuStockRelate.class).eq(GoodsSkuStockRelate::getSkuId, orderDon.getSkuId()));
|
|
|
+ if (!relateList.isEmpty()) {
|
|
|
+ relateList.forEach((relate) -> {
|
|
|
+ goodsDonStockService.upStockRelate(relate.getStockId(), orderDon.getId(), "transport");
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ //发放实物购买权益
|
|
|
+ Boolean isReceivedAll = true;
|
|
|
+ if (sku != null) {
|
|
|
+ if (sku.getIsBenefits()) {
|
|
|
+ if (StrUtil.isNotEmpty(sku.getBenefitsList())) {
|
|
|
+ try {
|
|
|
+ List<GoodsDonSku> goodsDonSkus = Jsons.parseList(sku.getBenefitsList(), GoodsDonSku.class);
|
|
|
+ //自购实物 获取权益
|
|
|
+ isReceivedAll = userRealOrderBenefitsService.getPayRealGoodsBenefits(orderDon.getUserId(), orderDon.getId(), orderDon.getYhsId(), goodsDonSkus);
|
|
|
+ } catch (Exception e) {
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- final Boolean flag = isReceivedAll;
|
|
|
-
|
|
|
- //发送微信模板消息
|
|
|
-// TASK_POOL.execute(()->{
|
|
|
-// try {
|
|
|
-// log.info("发送发货通知至{}用户", orderDon.getUserId());
|
|
|
-// templateCommonService.sendTransportMsgNotify(orderDon, reqSetLogisticsPost, flag);
|
|
|
-// } catch (Exception e) {
|
|
|
-// log.error("发送发货通知至{}用户失败:{}", orderDon.getUserId(), e);
|
|
|
-// }
|
|
|
-// });
|
|
|
- }else {
|
|
|
- if (orderDon.getStatus() == OrderDon.Status.hasPayment) {
|
|
|
- orderDon.setStatus(OrderDon.Status.transport);
|
|
|
- updateById(orderDon);
|
|
|
- }
|
|
|
- orderDonWaybillMapper.updateById(orderDonWaybill);
|
|
|
- }
|
|
|
- //实物分销订单是否存在
|
|
|
- DistributeWaitingSendPoints waitingSendPoints = distributeWaitingSendPointsMapper.selectOne(Wrappers.lambdaQuery(DistributeWaitingSendPoints.class)
|
|
|
- .eq(DistributeWaitingSendPoints::getOrderId, orderDon.getId())
|
|
|
- .eq(DistributeWaitingSendPoints::getIsDelivery, false)
|
|
|
- .last("limit 1"));
|
|
|
- if (waitingSendPoints != null) {
|
|
|
- //实物分销订单发货后再 进行提成结算期
|
|
|
- waitingSendPoints.setIsDelivery(true);
|
|
|
- distributeWaitingSendPointsMapper.updateById(waitingSendPoints);
|
|
|
- }
|
|
|
- //分销有礼 分销实物是否有发货后用户权益
|
|
|
- EquipmentUserDistributeTransportBenefits transportBenefits = transportBenefitsMapper.selectOne(Wrappers.lambdaQuery(EquipmentUserDistributeTransportBenefits.class)
|
|
|
- .eq(EquipmentUserDistributeTransportBenefits::getOrderId, orderDon.getId())
|
|
|
- .eq(EquipmentUserDistributeTransportBenefits::getStatus, EquipmentUserDistributeTransportBenefits.Status.hasPayment).last("limit 1"));
|
|
|
- if (transportBenefits != null) {
|
|
|
- if (transportBenefits.getBalance().compareTo(BigDecimal.ZERO) > 0) {
|
|
|
- //7天后余额到账
|
|
|
- transportBenefitsMapper.update(null, Wrappers.lambdaUpdate(EquipmentUserDistributeTransportBenefits.class)
|
|
|
- .set(EquipmentUserDistributeTransportBenefits::getStatus, EquipmentUserDistributeTransportBenefits.Status.transport)
|
|
|
- .set(EquipmentUserDistributeTransportBenefits::getSendTime, DateUtil.offsetDay(DateTime.now(), 7))
|
|
|
+
|
|
|
+ //实物分销订单是否存在
|
|
|
+ DistributeWaitingSendPoints waitingSendPoints = distributeWaitingSendPointsMapper.selectOne(Wrappers.lambdaQuery(DistributeWaitingSendPoints.class)
|
|
|
+ .eq(DistributeWaitingSendPoints::getOrderId, orderDon.getId())
|
|
|
+ .eq(DistributeWaitingSendPoints::getIsDelivery, false)
|
|
|
+ .last("limit 1"));
|
|
|
+ if (waitingSendPoints != null) {
|
|
|
+ //实物分销订单发货后再 进行提成结算期
|
|
|
+ waitingSendPoints.setIsDelivery(true);
|
|
|
+ distributeWaitingSendPointsMapper.updateById(waitingSendPoints);
|
|
|
+ }
|
|
|
+ //分销有礼 分销实物是否有发货后用户权益
|
|
|
+ EquipmentUserDistributeTransportBenefits transportBenefits = transportBenefitsMapper.selectOne(Wrappers.lambdaQuery(EquipmentUserDistributeTransportBenefits.class)
|
|
|
.eq(EquipmentUserDistributeTransportBenefits::getOrderId, orderDon.getId())
|
|
|
- .eq(EquipmentUserDistributeTransportBenefits::getStatus, EquipmentUserDistributeTransportBenefits.Status.hasPayment));
|
|
|
+ .eq(EquipmentUserDistributeTransportBenefits::getStatus, EquipmentUserDistributeTransportBenefits.Status.hasPayment).last("limit 1"));
|
|
|
+ if (transportBenefits != null) {
|
|
|
+ if (transportBenefits.getBalance().compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ //7天后余额到账
|
|
|
+ transportBenefitsMapper.update(null, Wrappers.lambdaUpdate(EquipmentUserDistributeTransportBenefits.class)
|
|
|
+ .set(EquipmentUserDistributeTransportBenefits::getStatus, EquipmentUserDistributeTransportBenefits.Status.transport)
|
|
|
+ .set(EquipmentUserDistributeTransportBenefits::getSendTime, DateUtil.offsetDay(DateTime.now(), 7))
|
|
|
+ .eq(EquipmentUserDistributeTransportBenefits::getOrderId, orderDon.getId())
|
|
|
+ .eq(EquipmentUserDistributeTransportBenefits::getStatus, EquipmentUserDistributeTransportBenefits.Status.hasPayment));
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ } else {
|
|
|
+ orderDonWaybillMapper.updateById(orderDonWaybill);
|
|
|
}
|
|
|
return orderDonWaybill;
|
|
|
}
|
|
|
@@ -941,6 +962,89 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
|
|
|
userBenefitsService.addUserBalance(orderDon.getUserId(), refundBalance, UserBalanceSourceRecord.Source.price_differ, orderDon.getYhsId());
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public List<ExcelOrderMasterDonData> exportMOrders(List<ExcelOrderMasterDonData> mOrderList) throws InterruptedException {
|
|
|
+ List<List<ExcelOrderMasterDonData>> partition = Lists.partition(mOrderList, 500);
|
|
|
+ List<ExcelOrderMasterDonData> exportDataList = new CopyOnWriteArrayList<>();
|
|
|
+ CountDownLatch latch = new CountDownLatch(partition.size());
|
|
|
+ Map<Long, String> channelMap = new ConcurrentHashMap<>();
|
|
|
+ Map<Long, String> accountMap = new ConcurrentHashMap<>();
|
|
|
+ String channel_default = "自然流量";
|
|
|
+ for (List<ExcelOrderMasterDonData> mOrders : partition) {
|
|
|
+ TASK_POOL.execute(() -> {
|
|
|
+ for (ExcelOrderMasterDonData e : mOrders) {
|
|
|
+ List<OrderDonSkuExportView> orderDonSkuBackViews = beanSearcher.searchAll(OrderDonSkuExportView.class, MapUtils.builder().field(OrderDonSkuExportView::getMOid, e.getOrderId()).build());
|
|
|
+ for (OrderDonSkuExportView orderSku : orderDonSkuBackViews) {
|
|
|
+ ExcelOrderMasterDonData excelOrderMasterDonData = new ExcelOrderMasterDonData();
|
|
|
+ BeanUtil.copyProperties(e, excelOrderMasterDonData);
|
|
|
+ if (e.getPopularizeId() != null && e.getPopularizeId() > 0) {
|
|
|
+ String channel = channelMap.get(e.getPopularizeId());
|
|
|
+ if (StrUtil.isEmpty(channel)) {
|
|
|
+ channel = channelPopularizeMapper.selectChannelByPid(e.getPopularizeId());
|
|
|
+ if (StrUtil.isNotBlank(channel)) {
|
|
|
+ channelMap.putIfAbsent(e.getPopularizeId(), channel);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ excelOrderMasterDonData.setChannel(channel);
|
|
|
+ } else {
|
|
|
+ excelOrderMasterDonData.setChannel(channel_default);
|
|
|
+ }
|
|
|
+
|
|
|
+ excelOrderMasterDonData.setOrderSkuId(orderSku.getId());
|
|
|
+ excelOrderMasterDonData.setTitle(orderSku.getTitle());
|
|
|
+ excelOrderMasterDonData.setSpecVal(orderSku.getSpecVal());
|
|
|
+ //主账号
|
|
|
+ if (orderSku.getGroupsId() != null) {
|
|
|
+ String account = accountMap.get(orderSku.getGroupsId());
|
|
|
+ if (StrUtil.isEmpty(account)) {
|
|
|
+ AccountView accountView = beanSearcher.searchFirst(AccountView.class, MapUtils.builder().field(AccountView::getGroupsId, orderSku.getGroupsId()).onlySelect(AccountView::getAccount)
|
|
|
+ .onlySelect(AccountView::getAccount)
|
|
|
+ .build());
|
|
|
+ if (accountView != null) {
|
|
|
+ account = accountView.getAccount();
|
|
|
+ accountMap.putIfAbsent(orderSku.getGroupsId(), account);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ excelOrderMasterDonData.setAccount(account);
|
|
|
+ }
|
|
|
+ excelOrderMasterDonData.setOrderSkuMoney(orderSku.getMoney().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : orderSku.getMoney().divide(BigDecimal.valueOf(100)));
|
|
|
+ excelOrderMasterDonData.setGalaxycoin(excelOrderMasterDonData.getOrderSkuMoney());
|
|
|
+ excelOrderMasterDonData.setStatus(orderSku.getStatus().getDesc());
|
|
|
+ StringBuilder disInfo = new StringBuilder();
|
|
|
+ if (orderSku.getCouponMoney().compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ Long couponUserId = orderSku.getCouponUserId();
|
|
|
+ String couponName = couponMapper.getCouponNameByCouponUserId(couponUserId);
|
|
|
+ if (StrUtil.isNotBlank(couponName)) {
|
|
|
+ disInfo.append(String.format("%s优惠券减免金额¥%s", couponName, orderSku.getCouponMoney().divide(BigDecimal.valueOf(100))));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (orderSku.getBalance().compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ if (disInfo.length() > 0) {
|
|
|
+ disInfo.append(";");
|
|
|
+ }
|
|
|
+ disInfo.append(String.format("余额减免金额¥%s", orderSku.getBalance().divide(BigDecimal.valueOf(100))));
|
|
|
+ }
|
|
|
+ if (orderSku.getGalaxyCoin().compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ if (disInfo.length() > 0) {
|
|
|
+ disInfo.append(";");
|
|
|
+ }
|
|
|
+ disInfo.append(String.format("银河币减免金额¥%s", orderSku.getGalaxyCoin().divide(BigDecimal.valueOf(100))));
|
|
|
+ }
|
|
|
+ if (disInfo.length() > 0) {
|
|
|
+ excelOrderMasterDonData.setDiscountInfo(disInfo.toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ exportDataList.add(excelOrderMasterDonData);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ latch.countDown();
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ latch.await(60, TimeUnit.MINUTES);
|
|
|
+ return exportDataList;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 寻找该车队空余车位
|
|
|
*/
|