1、优化配送费分佣计算方式,按百分比/固定金额计算

2、增加自提订单核销数据统计功能
3、增加现场核销推广指定人分佣业务
This commit is contained in:
2026-05-21 18:14:35 +08:00
parent 4d455e2ba2
commit 18148ddb8d
10 changed files with 185 additions and 14 deletions

View File

@@ -15,6 +15,7 @@ public enum ShopDealerCapitalUpdateEnum {
MANAGEMENT_INCOME(11, "团队管理津贴收入", true), MANAGEMENT_INCOME(11, "团队管理津贴收入", true),
DIVIDEND_INCOME(12, "分红收入", true), DIVIDEND_INCOME(12, "分红收入", true),
PROMOTION_INCOME(13, "现场推广收入", true), PROMOTION_INCOME(13, "现场推广收入", true),
PROMOTION_PARENT_INCOME(14, "现场推广分佣", true),
WITHDRAW_PAYMENT(20, "提现支出", false), WITHDRAW_PAYMENT(20, "提现支出", false),
TRANSFER_PAYMENT(30, "转账支出", false), TRANSFER_PAYMENT(30, "转账支出", false),
TRANSFER_INCOME(40, "转账收入", true), TRANSFER_INCOME(40, "转账收入", true),

View File

@@ -691,7 +691,8 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
* @param tenantId * @param tenantId
* @param now * @param now
*/ */
private void updateShopOrderOrderStatusAfterTicketFinished(Integer ticketOrderId, Integer tenantId, LocalDateTime now) { @Transactional
public void updateShopOrderOrderStatusAfterTicketFinished(Integer ticketOrderId, Integer tenantId, LocalDateTime now) {
if (ticketOrderId == null || tenantId == null) { if (ticketOrderId == null || tenantId == null) {
return; return;
} }
@@ -780,7 +781,7 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
//生成配送师傅可提现账户分佣金额数据【配送奖励(按商品设置)、配送提成(每桶0.1)】 //生成配送师傅可提现账户分佣金额数据【配送奖励(按商品设置)、配送提成(每桶0.1)】
int qty = ticketOrder.getTotalNum() == null ? 0 : ticketOrder.getTotalNum(); int qty = ticketOrder.getTotalNum() == null ? 0 : ticketOrder.getTotalNum();
if (qty > 0) { //配送提成 if (qty > 0) { //配送提成(每桶0.1)
BigDecimal money = RIDER_UNIT_COMMISSION BigDecimal money = RIDER_UNIT_COMMISSION
.multiply(BigDecimal.valueOf(qty)) .multiply(BigDecimal.valueOf(qty))
.setScale(RIDER_COMMISSION_SCALE, RoundingMode.HALF_UP); .setScale(RIDER_COMMISSION_SCALE, RoundingMode.HALF_UP);
@@ -796,13 +797,19 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
} }
} }
//配送奖励 //配送奖励(按商品设置)
Integer goodsId = userTicket.getGoodsId(); Integer goodsId = userTicket.getGoodsId();
ShopGoods shopGood = shopGoodsMapper.selectById(goodsId); ShopGoods shopGood = shopGoodsMapper.selectById(goodsId);
ShopOrder order = shopOrderService.getByOrderNo(userTicket.getOrderNo(), userTicket.getTenantId()); ShopOrder order = shopOrderService.getByOrderNo(userTicket.getOrderNo(), userTicket.getTenantId());
if(shopGood != null && order != null){ if(shopGood != null && order != null){
BigDecimal money = order.getPayPrice().multiply(shopGood.getDeliveryMoney()); Integer commissionType = shopGood.getCommissionType();
if(money.signum() > 0){ BigDecimal money = BigDecimal.ZERO;
if(commissionType == 10){ //按金额
money = shopGood.getDeliveryMoney();
}else { //按比率
money = order.getPayPrice().multiply(shopGood.getDeliveryMoney()).divide(BigDecimal.valueOf(100), 3, RoundingMode.HALF_UP);
}
if(money.compareTo(BigDecimal.ZERO) > 0){
ShopDealerUserReduceDto reduceDto = new ShopDealerUserReduceDto(); ShopDealerUserReduceDto reduceDto = new ShopDealerUserReduceDto();
reduceDto.setTypeEnum(ShopDealerTypeEnum.WITHDRAW_ACCOUNT); reduceDto.setTypeEnum(ShopDealerTypeEnum.WITHDRAW_ACCOUNT);
reduceDto.setUserId(ticketOrder.getRiderId()); reduceDto.setUserId(ticketOrder.getRiderId());

View File

@@ -32,6 +32,7 @@ import com.gxwebsoft.shop.param.ShopOrderParam;
import com.gxwebsoft.shop.service.*; import com.gxwebsoft.shop.service.*;
import com.gxwebsoft.shop.service.impl.KuaiDi100Impl; import com.gxwebsoft.shop.service.impl.KuaiDi100Impl;
import com.gxwebsoft.shop.task.OrderAutoCancelTask; import com.gxwebsoft.shop.task.OrderAutoCancelTask;
import com.gxwebsoft.shop.vo.ShopOrderMyVerifyVO;
import com.wechat.pay.java.core.RSAAutoCertificateConfig; import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.core.notification.NotificationConfig; import com.wechat.pay.java.core.notification.NotificationConfig;
import com.wechat.pay.java.core.notification.NotificationParser; import com.wechat.pay.java.core.notification.NotificationParser;
@@ -42,6 +43,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springdoc.api.annotations.ParameterObject;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
@@ -140,6 +142,13 @@ public class ShopOrderController extends BaseController {
return success(shopOrderService.getByIdRel(id)); return success(shopOrderService.getByIdRel(id));
} }
// @PreAuthorize("hasAuthority('shop:shopOrder:list')")
@Operation(summary = "我已核销订单")
@GetMapping("/myVerifyOrder")
public ApiResult<ShopOrderMyVerifyVO> myVerifyOrder(@ParameterObject ShopOrderMyVerifyDto myVerifyDto) {
return success(shopOrderService.myVerifyOrder(myVerifyDto));
}
@Operation(summary = "添加订单【单商品添加】") @Operation(summary = "添加订单【单商品添加】")
@PostMapping() @PostMapping()
public ApiResult<?> save(@RequestBody OrderCreateRequest request) { public ApiResult<?> save(@RequestBody OrderCreateRequest request) {

View File

@@ -109,6 +109,12 @@ public class ShopGoods implements Serializable {
@Schema(description = "推广核验佣金比率") @Schema(description = "推广核验佣金比率")
private BigDecimal verifyRate; private BigDecimal verifyRate;
@Schema(description = "推广核验上级/指定人")
private Integer verifyParentUserId;
@Schema(description = "推广核验上级佣金比率/指定分佣")
private BigDecimal verifyParentRate;
@Schema(description = "库存计算方式(10下单减库存 20付款减库存)") @Schema(description = "库存计算方式(10下单减库存 20付款减库存)")
@JsonAlias({"cdeductStockType"}) @JsonAlias({"cdeductStockType"})
private Integer deductStockType; private Integer deductStockType;

View File

@@ -342,6 +342,12 @@ public class ShopOrder implements Serializable {
@Schema(description = "推广核销佣金") @Schema(description = "推广核销佣金")
private BigDecimal verifyMoney; private BigDecimal verifyMoney;
@Schema(description = "推广核验上级/指定人")
private Integer verifyParentUser;
@Schema(description = "推广核验上级/指定人佣金")
private BigDecimal verifyParentMoney;
@Schema(description = "门店、服务商结算标识 0-未结算 1-已结算") @Schema(description = "门店、服务商结算标识 0-未结算 1-已结算")
private Integer teamSettlementFlag; private Integer teamSettlementFlag;

View File

@@ -3,9 +3,12 @@ package com.gxwebsoft.shop.mapper;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gxwebsoft.shop.dto.ShopOrderMyVerifyDto;
import com.gxwebsoft.shop.entity.ShopOrder; import com.gxwebsoft.shop.entity.ShopOrder;
import com.gxwebsoft.shop.param.ShopOrderParam; import com.gxwebsoft.shop.param.ShopOrderParam;
import com.gxwebsoft.shop.vo.ShopOrderGoodsVO; import com.gxwebsoft.shop.vo.ShopOrderGoodsVO;
import com.gxwebsoft.shop.vo.ShopOrderMyVerifyItemVO;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Select;
@@ -67,4 +70,13 @@ public interface ShopOrderMapper extends BaseMapper<ShopOrder> {
* @return * @return
*/ */
List<ShopOrderGoodsVO> getOrderGoodsInfo(@Param("orderNo") String orderNo); List<ShopOrderGoodsVO> getOrderGoodsInfo(@Param("orderNo") String orderNo);
/**
* 查询我的核销订单数据
* @param page
* @param entity
* @return
*/
IPage<ShopOrderMyVerifyItemVO> getMyVerifyPageInfo(@Param("page") Page page, @Param("entity") ShopOrderMyVerifyDto entity);
} }

View File

@@ -342,8 +342,40 @@
AND c.is_open_commission = 1 AND c.is_open_commission = 1
AND a.order_no = #{orderNo} AND a.order_no = #{orderNo}
</select> </select>
<select id="getMyVerifyPageInfo" resultType="com.gxwebsoft.shop.vo.ShopOrderMyVerifyItemVO">
<!-- 根据订单号修改订单 --> SELECT
a.order_id,
a.order_type,
a.order_no,
a.total_price,
a.pay_price,
a.total_num,
b.goods_name,
c.NAME as activeName,
a.pay_type,
a.pay_status,
a.order_status,
a.user_id,
a.verify_time,
a.verify_user,
a.verify_money,
a.create_time
FROM
shop_order a
LEFT JOIN shop_order_goods b ON a.order_id = b.order_id
LEFT JOIN shop_flash_sale_activity c ON a.activity_id = c.id
WHERE
a.verify_user = #{entity.userId}
AND a.deleted = 0
<if test="entity.orderNo != null and entity.order != ''">
AND a.order_no LIKE CONCAT('%', #{entity.orderNo}, '%')
</if>
<if test="entity.dateStart != null and entity.dateStart != '' and entity.dateEnd != null and entity.dateEnd !=''">
AND DATE(a.verify_time) BETWEEN #{entity.dateStart} AND #{entity.dateEnd}
</if>
ORDER BY a.create_time desc
</select>
<!-- 根据订单号修改订单 -->
<update id="updateByOutTradeNo" parameterType="com.gxwebsoft.cms.entity.CmsWebsite"> <update id="updateByOutTradeNo" parameterType="com.gxwebsoft.cms.entity.CmsWebsite">
UPDATE shop_order UPDATE shop_order
<set> <set>

View File

@@ -2,10 +2,12 @@ package com.gxwebsoft.shop.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.gxwebsoft.common.core.web.PageResult; import com.gxwebsoft.common.core.web.PageResult;
import com.gxwebsoft.shop.dto.ShopOrderMyVerifyDto;
import com.gxwebsoft.shop.dto.UserOrderStats; import com.gxwebsoft.shop.dto.UserOrderStats;
import com.gxwebsoft.shop.dto.VerifyShopOrderDto; import com.gxwebsoft.shop.dto.VerifyShopOrderDto;
import com.gxwebsoft.shop.entity.ShopOrder; import com.gxwebsoft.shop.entity.ShopOrder;
import com.gxwebsoft.shop.param.ShopOrderParam; import com.gxwebsoft.shop.param.ShopOrderParam;
import com.gxwebsoft.shop.vo.ShopOrderMyVerifyVO;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.HashMap; import java.util.HashMap;
@@ -43,6 +45,12 @@ public interface ShopOrderService extends IService<ShopOrder> {
*/ */
ShopOrder getByIdRel(Integer orderId); ShopOrder getByIdRel(Integer orderId);
/**
* 我已核销订单
* @return
*/
ShopOrderMyVerifyVO myVerifyOrder(ShopOrderMyVerifyDto myVerifyDto);
HashMap<String, String> createWxOrder(ShopOrder shopOrder); HashMap<String, String> createWxOrder(ShopOrder shopOrder);
ShopOrder getByOutTradeNo(String outTradeNo); ShopOrder getByOutTradeNo(String outTradeNo);

View File

@@ -117,6 +117,7 @@ public class ShopDealerUserServiceImpl extends ServiceImpl<ShopDealerUserMapper,
case MANAGEMENT_INCOME: case MANAGEMENT_INCOME:
case DIVIDEND_INCOME: case DIVIDEND_INCOME:
case PROMOTION_INCOME: case PROMOTION_INCOME:
case PROMOTION_PARENT_INCOME:
case TRANSFER_INCOME: case TRANSFER_INCOME:
case DELIVERY_REWARD: case DELIVERY_REWARD:
case DELIVERY_INCOME:{ case DELIVERY_INCOME:{
@@ -279,7 +280,8 @@ public class ShopDealerUserServiceImpl extends ServiceImpl<ShopDealerUserMapper,
.eq(ShopDealerCapital::getOrderNo, entity.getOrderNo()) .eq(ShopDealerCapital::getOrderNo, entity.getOrderNo())
.in(ShopDealerCapital::getFlowType, Arrays.asList(ShopDealerCapitalUpdateEnum.DISTRIBUTION_INCOME.getType(), .in(ShopDealerCapital::getFlowType, Arrays.asList(ShopDealerCapitalUpdateEnum.DISTRIBUTION_INCOME.getType(),
ShopDealerCapitalUpdateEnum.MANAGEMENT_INCOME.getType(), ShopDealerCapitalUpdateEnum.DIVIDEND_INCOME.getType(), ShopDealerCapitalUpdateEnum.MANAGEMENT_INCOME.getType(), ShopDealerCapitalUpdateEnum.DIVIDEND_INCOME.getType(),
ShopDealerCapitalUpdateEnum.PROMOTION_INCOME.getType(), ShopDealerCapitalUpdateEnum.FREEZE_MONEY_THAW.getType(), ShopDealerCapitalUpdateEnum.PROMOTION_INCOME.getType(), ShopDealerCapitalUpdateEnum.PROMOTION_PARENT_INCOME.getType(),
ShopDealerCapitalUpdateEnum.FREEZE_MONEY_THAW.getType(),
ShopDealerCapitalUpdateEnum.DELIVERY_INCOME.getType(), ShopDealerCapitalUpdateEnum.DELIVERY_REWARD.getType())) ShopDealerCapitalUpdateEnum.DELIVERY_INCOME.getType(), ShopDealerCapitalUpdateEnum.DELIVERY_REWARD.getType()))
.isNotNull(ShopDealerCapital::getUserId) .isNotNull(ShopDealerCapital::getUserId)
); );

View File

@@ -3,6 +3,8 @@ package com.gxwebsoft.shop.service.impl;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gxwebsoft.common.core.config.CertificateProperties; import com.gxwebsoft.common.core.config.CertificateProperties;
import com.gxwebsoft.common.core.config.ConfigProperties; import com.gxwebsoft.common.core.config.ConfigProperties;
@@ -23,6 +25,7 @@ import com.gxwebsoft.common.system.service.PaymentService;
import com.gxwebsoft.common.system.service.SettingService; import com.gxwebsoft.common.system.service.SettingService;
import com.gxwebsoft.payment.constants.WechatPayType; import com.gxwebsoft.payment.constants.WechatPayType;
import com.gxwebsoft.shop.dto.ShopDealerUserReduceDto; import com.gxwebsoft.shop.dto.ShopDealerUserReduceDto;
import com.gxwebsoft.shop.dto.ShopOrderMyVerifyDto;
import com.gxwebsoft.shop.dto.VerifyShopOrderDto; import com.gxwebsoft.shop.dto.VerifyShopOrderDto;
import com.gxwebsoft.shop.entity.*; import com.gxwebsoft.shop.entity.*;
import com.gxwebsoft.shop.mapper.ShopFlashSaleActivityMapper; import com.gxwebsoft.shop.mapper.ShopFlashSaleActivityMapper;
@@ -31,6 +34,8 @@ import com.gxwebsoft.shop.mapper.ShopOrderMapper;
import com.gxwebsoft.shop.mapper.ShopUserAddressMapper; import com.gxwebsoft.shop.mapper.ShopUserAddressMapper;
import com.gxwebsoft.shop.param.ShopOrderParam; import com.gxwebsoft.shop.param.ShopOrderParam;
import com.gxwebsoft.shop.service.*; import com.gxwebsoft.shop.service.*;
import com.gxwebsoft.shop.vo.ShopOrderMyVerifyItemVO;
import com.gxwebsoft.shop.vo.ShopOrderMyVerifyVO;
import com.wechat.pay.java.core.Config; import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig; import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.core.RSAConfig; import com.wechat.pay.java.core.RSAConfig;
@@ -50,6 +55,7 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
import java.util.*; import java.util.*;
@@ -379,6 +385,54 @@ public class ShopOrderServiceImpl extends ServiceImpl<ShopOrderMapper, ShopOrder
return order; return order;
} }
@Override
public ShopOrderMyVerifyVO myVerifyOrder(ShopOrderMyVerifyDto entity) {
ShopOrderMyVerifyVO myVerifyVO = new ShopOrderMyVerifyVO();
User loginUser = LoginUserUtil.getLoginUser();
if(loginUser == null){
return myVerifyVO;
}else {
entity.setUserId(loginUser.getUserId());
}
IPage<ShopOrderMyVerifyItemVO> pageInfo = baseMapper.getMyVerifyPageInfo(new Page<>(entity.getPage(), entity.getLimit()), entity);
myVerifyVO.setCount(Math.toIntExact(pageInfo.getTotal()));
if(CollectionUtils.isNotEmpty(pageInfo.getRecords())){
List<ShopOrderMyVerifyItemVO> totalOrderList = pageInfo.getRecords();
//统计总订单数据
int totalGoodsNum = totalOrderList.stream().mapToInt(ShopOrderMyVerifyItemVO::getTotalNum).sum();
BigDecimal totalMoney = totalOrderList.stream().map(ShopOrderMyVerifyItemVO::getPayPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
myVerifyVO.setTotalOrderNum(totalOrderList.size());
myVerifyVO.setTotalGoodsNum(totalGoodsNum);
myVerifyVO.setTotalMoney(totalMoney);
//统计当月数据
List<ShopOrderMyVerifyItemVO> currentMonthList = totalOrderList.stream().filter(item -> item.getCreateTime().getYear() == LocalDateTime.now().getYear()
&& item.getCreateTime().getMonthValue() == LocalDateTime.now().getMonthValue()).collect(Collectors.toList());
if(CollectionUtils.isNotEmpty(currentMonthList)){
int monthGoodsNum = currentMonthList.stream().mapToInt(ShopOrderMyVerifyItemVO::getTotalNum).sum();
BigDecimal monthMoney = currentMonthList.stream().map(ShopOrderMyVerifyItemVO::getPayPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
myVerifyVO.setMonthOrderNum(currentMonthList.size());
myVerifyVO.setMonthGoodsNum(monthGoodsNum);
myVerifyVO.setMonthMoney(monthMoney);
}
//统计快核订单
List<ShopOrderMyVerifyItemVO> liveOrderList = totalOrderList.stream().filter(item -> item.getVerifyMoney().compareTo(BigDecimal.ZERO) > 0).collect(Collectors.toList());
if(CollectionUtils.isNotEmpty(liveOrderList)){
int liveGoodsNum = liveOrderList.stream().mapToInt(ShopOrderMyVerifyItemVO::getTotalNum).sum();
BigDecimal liveMoney = liveOrderList.stream().map(ShopOrderMyVerifyItemVO::getPayPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
myVerifyVO.setLiveOrderNum(liveOrderList.size());
myVerifyVO.setLiveGoodsNum(liveGoodsNum);
myVerifyVO.setLiveMoney(liveMoney);
}
myVerifyVO.setItemVOList(totalOrderList);
}
return myVerifyVO;
}
@Override @Override
public com.gxwebsoft.shop.dto.UserOrderStats getUserOrderStats(Integer userId, Integer tenantId, Integer type) { public com.gxwebsoft.shop.dto.UserOrderStats getUserOrderStats(Integer userId, Integer tenantId, Integer type) {
if (userId == null) { if (userId == null) {
@@ -470,9 +524,16 @@ public class ShopOrderServiceImpl extends ServiceImpl<ShopOrderMapper, ShopOrder
shopOrder.setVerifyStatus(1); shopOrder.setVerifyStatus(1);
shopOrder.setVerifyTime(LocalDateTime.now()); shopOrder.setVerifyTime(LocalDateTime.now());
shopOrder.setVerifyUser(loginUser.getUserId());
//7.只有推广结算才会记佣且判断是否在设定有效期内核销订单【是:计算订单核销佣金 否:不计算核销佣金】 //7.判断订单是否超过3天超过3天可核销完成但是不记录个人业绩
LocalDateTime endTime = LocalDate.now().minusDays(3).atStartOfDay();
LocalDateTime createTime = shopOrder.getCreateTime();
if(createTime.isAfter(endTime)){
shopOrder.setVerifyUser(loginUser.getUserId());
}
//8.只有推广结算才会记佣且判断是否在设定有效期内核销订单【是:计算订单核销佣金 否:不计算核销佣金】
BigDecimal rate = shopOrder.getPayPrice().divide(shopOrder.getTotalPrice(), 3, RoundingMode.HALF_UP);
if(verifyType == 2 && shopOrder.getVerifyExpTime().isAfter(LocalDateTime.now())){ if(verifyType == 2 && shopOrder.getVerifyExpTime().isAfter(LocalDateTime.now())){
List<ShopOrderGoods> orderGoodsList = shopOrderGoodsService.getListByOrderId(shopOrder.getOrderId()); List<ShopOrderGoods> orderGoodsList = shopOrderGoodsService.getListByOrderId(shopOrder.getOrderId());
if(CollectionUtils.isNotEmpty(orderGoodsList)){ if(CollectionUtils.isNotEmpty(orderGoodsList)){
@@ -481,20 +542,32 @@ public class ShopOrderServiceImpl extends ServiceImpl<ShopOrderMapper, ShopOrder
//计算推广佣金 //计算推广佣金
AtomicReference<BigDecimal> verifyMoney = new AtomicReference<>(BigDecimal.ZERO); AtomicReference<BigDecimal> verifyMoney = new AtomicReference<>(BigDecimal.ZERO);
AtomicReference<BigDecimal> verifyParentMoney = new AtomicReference<>(BigDecimal.ZERO);
orderGoodsList.forEach(orderGoods -> { orderGoodsList.forEach(orderGoods -> {
ShopGoods shopGood = shopGoods.stream().filter(goods -> orderGoods.getGoodsId().equals(goods.getGoodsId()) && ShopGoods shopGood = shopGoods.stream().filter(goods -> orderGoods.getGoodsId().equals(goods.getGoodsId()) &&
goods.getVerifyRate().compareTo(BigDecimal.ZERO) > 0).findFirst().orElse(null); goods.getVerifyRate().compareTo(BigDecimal.ZERO) > 0).findFirst().orElse(null);
if (shopGood != null) { if (shopGood != null) {
// 计算单商品核价金额
BigDecimal money = orderGoods.getPrice() BigDecimal money = orderGoods.getPrice()
.multiply(BigDecimal.valueOf(orderGoods.getTotalNum())) .multiply(BigDecimal.valueOf(orderGoods.getTotalNum()))
.multiply(shopGood.getVerifyRate()) .multiply(shopGood.getVerifyRate())
.multiply(rate)
.divide(BigDecimal.valueOf(100), 3, RoundingMode.HALF_UP); // 除100保留2位小数 .divide(BigDecimal.valueOf(100), 3, RoundingMode.HALF_UP); // 除100保留2位小数
// ✅ 原子更新(关键!)
verifyMoney.set(verifyMoney.get().add(money)); verifyMoney.set(verifyMoney.get().add(money));
//存在推广核验上级/指定人
if(shopGood.getVerifyParentUserId() != null && shopGood.getVerifyParentRate().compareTo(BigDecimal.ZERO) > 0){
BigDecimal parentMoney = orderGoods.getPrice()
.multiply(BigDecimal.valueOf(orderGoods.getTotalNum()))
.multiply(shopGood.getVerifyParentRate())
.multiply(rate)
.divide(BigDecimal.valueOf(100), 3, RoundingMode.HALF_UP); // 除100保留2位小数
verifyParentMoney.set(verifyParentMoney.get().add(parentMoney));
shopOrder.setVerifyParentUser(shopGood.getVerifyParentUserId());
shopOrder.setVerifyParentMoney(verifyMoney.get());
}
} }
}); });
shopOrder.setVerifyMoney(verifyMoney.get()); shopOrder.setVerifyMoney(verifyMoney.get());
@@ -513,12 +586,27 @@ public class ShopOrderServiceImpl extends ServiceImpl<ShopOrderMapper, ShopOrder
if(!reduceBalance){ if(!reduceBalance){
log.error("推广核销失败,结算推广佣金失败:" + reduceDto); log.error("推广核销失败,结算推广佣金失败:" + reduceDto);
} }
}
//结算推广核验上级/指定人佣金
if(verifyParentMoney.get().compareTo(BigDecimal.ZERO) > 0){
ShopDealerUserReduceDto reduceDto = new ShopDealerUserReduceDto();
reduceDto.setTypeEnum(ShopDealerTypeEnum.WITHDRAW_ACCOUNT);
reduceDto.setUserId(shopOrder.getVerifyParentUser());
reduceDto.setOrderUserId(shopOrder.getUserId());
reduceDto.setOrderNo(shopOrder.getOrderNo());
reduceDto.setPrice(verifyParentMoney.get());
reduceDto.setUpdateEnum(ShopDealerCapitalUpdateEnum.PROMOTION_PARENT_INCOME);
Boolean reduceBalance = shopDealerUserService.reduceBalance(reduceDto);
if(!reduceBalance){
log.error("推广指定人核销失败,结算推广佣金失败:" + reduceDto);
}
} }
} }
} }
//8.判断是否自提订单,如是自提订单需调整为订单完成,用户已收货状态 //9.判断是否自提订单,如是自提订单需调整为订单完成,用户已收货状态
if(shopOrder.getOrderType() != null && shopOrder.getOrderType() == 2){ if(shopOrder.getOrderType() != null && shopOrder.getOrderType() == 2){
shopOrder.setOrderStatus(1); shopOrder.setOrderStatus(1);
shopOrder.setDeliveryStatus(20); shopOrder.setDeliveryStatus(20);