增加门店、服务商佣金定时结算功能,默认每天凌晨一点执行
This commit is contained in:
@@ -60,7 +60,7 @@ public class ConfigProperties {
|
||||
/**
|
||||
* token过期时间, 单位秒
|
||||
*/
|
||||
private Long tokenExpireTime = 60 * 60 * 365 * 24L;
|
||||
private Long tokenExpireTime = 60 * 60 * 30 * 24L;
|
||||
|
||||
/**
|
||||
* token快要过期自动刷新时间, 单位分钟
|
||||
|
||||
@@ -194,9 +194,7 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
|
||||
gltTicketOrder.setCreateTime(now);
|
||||
}
|
||||
// “立刻送水”下单场景不再需要前端选择配送时间;若未传则默认当前时间,便于排序与派单。
|
||||
if (!StringUtils.hasText(gltTicketOrder.getSendTime())) {
|
||||
gltTicketOrder.setSendTime(now.format(SEND_TIME_FMT));
|
||||
}
|
||||
gltTicketOrder.setUpdateTime(now);
|
||||
if (!this.save(gltTicketOrder)) {
|
||||
throw new BusinessException("创建订单失败");
|
||||
|
||||
@@ -180,7 +180,7 @@ public class WxPayConfigService {
|
||||
* 获取证书文件路径
|
||||
*/
|
||||
private String getCertificatePath(Integer tenantId, Payment payment) throws PaymentException {
|
||||
if ("dev".equals(activeProfile)) {
|
||||
if ("local".equals(activeProfile)) {
|
||||
return getDevCertificatePath(tenantId);
|
||||
} else {
|
||||
return getProdCertificatePath(payment);
|
||||
|
||||
@@ -3,19 +3,18 @@ package com.gxwebsoft.shop.controller;
|
||||
import cn.afterturn.easypoi.excel.ExcelImportUtil;
|
||||
import cn.afterturn.easypoi.excel.entity.ImportParams;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import com.gxwebsoft.common.core.web.BaseController;
|
||||
import com.gxwebsoft.shop.service.ShopDealerOrderService;
|
||||
import com.gxwebsoft.shop.entity.ShopDealerOrder;
|
||||
import com.gxwebsoft.shop.param.ShopDealerOrderParam;
|
||||
import com.gxwebsoft.shop.param.ShopDealerOrderImportParam;
|
||||
import com.gxwebsoft.common.core.annotation.OperationLog;
|
||||
import com.gxwebsoft.common.core.utils.JSONUtil;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
import com.gxwebsoft.common.core.web.PageResult;
|
||||
import com.gxwebsoft.common.core.web.BaseController;
|
||||
import com.gxwebsoft.common.core.web.BatchParam;
|
||||
import com.gxwebsoft.common.core.annotation.OperationLog;
|
||||
import com.gxwebsoft.common.core.web.PageResult;
|
||||
import com.gxwebsoft.common.system.entity.User;
|
||||
import com.gxwebsoft.shop.entity.ShopDealerOrder;
|
||||
import com.gxwebsoft.shop.param.ShopDealerOrderImportParam;
|
||||
import com.gxwebsoft.shop.param.ShopDealerOrderParam;
|
||||
import com.gxwebsoft.shop.service.ShopDealerOrderService;
|
||||
import com.gxwebsoft.shop.task.OrderSettlementTask;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
@@ -40,6 +39,9 @@ public class ShopDealerOrderController extends BaseController {
|
||||
@Resource
|
||||
private ShopDealerOrderService shopDealerOrderService;
|
||||
|
||||
@Resource
|
||||
private OrderSettlementTask orderSettlementTask;
|
||||
|
||||
@PreAuthorize("hasAuthority('shop:shopDealerOrder:list')")
|
||||
@Operation(summary = "分页查询分销商订单记录表")
|
||||
@GetMapping("/page")
|
||||
@@ -187,4 +189,11 @@ public class ShopDealerOrderController extends BaseController {
|
||||
return fail(e.getMessage(),null);
|
||||
}
|
||||
}
|
||||
|
||||
@Operation(summary = "店、服务商结算任务:每天一点,每10分钟执行一次结算任务")
|
||||
@PutMapping("/teamSettlement")
|
||||
public ApiResult<?> teamSettlement() {
|
||||
orderSettlementTask.teamSettlement();
|
||||
return success("success");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.gxwebsoft.shop.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 分销订单结算
|
||||
* @author xm
|
||||
* @since 2026-05-13
|
||||
*/
|
||||
@Data
|
||||
@Schema(name = "ShopDealerSettlementDto", description = "分销订单结算")
|
||||
public class ShopDealerSettlementDto {
|
||||
|
||||
@Schema(description = "变动类型 1-操作冻结账户余额 2-操作提现账户余额【直接结算】 3-解冻 4-退款")
|
||||
private Integer type;
|
||||
|
||||
@Schema(description = "资金流动类型 (10分销收入 11团队管理津贴收入 12分红收入 13现场推广收入 20提现支出 30转账支出 40转账收入 50佣金解冻 60配送奖励 70佣金退回【退单】)")
|
||||
private Integer flowType;
|
||||
|
||||
@Schema(description = "描述")
|
||||
private String comments;
|
||||
|
||||
@Schema(description = "商城ID")
|
||||
private Integer tenantId;
|
||||
|
||||
@Schema(description = "明细列表")
|
||||
private List<ShopDealerSettlementItemDto> itemList;
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.gxwebsoft.shop.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* 分销订单退款
|
||||
* @author xm
|
||||
* @since 2026-05-13
|
||||
*/
|
||||
@Data
|
||||
@Schema(name = "ShopDealerSettlementItemDto", description = "分销订单退款")
|
||||
public class ShopDealerSettlementItemDto {
|
||||
|
||||
@Schema(description = "订单号")
|
||||
private String no;
|
||||
|
||||
@Schema(description = "分销商用户ID")
|
||||
private Integer userId;
|
||||
|
||||
@Schema(description = "变更金额")
|
||||
private BigDecimal money;
|
||||
|
||||
}
|
||||
@@ -334,6 +334,12 @@ public class ShopOrder implements Serializable {
|
||||
@Schema(description = "推广核销佣金")
|
||||
private BigDecimal verifyMoney;
|
||||
|
||||
@Schema(description = "门店、服务商结算标识 0-未结算 1-已结算")
|
||||
private Integer teamSettlementFlag;
|
||||
|
||||
@Schema(description = "分红结算标识 0-未结算 1-已结算")
|
||||
private Integer dividendSettlementFlag;
|
||||
|
||||
@Schema(description = "修改时间")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private LocalDateTime updateTime;
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.gxwebsoft.shop.entity.ShopDealerOrder;
|
||||
import com.gxwebsoft.shop.param.ShopDealerOrderParam;
|
||||
import com.gxwebsoft.shop.vo.ShopDealerOrderTaskVO;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
@@ -34,4 +35,11 @@ public interface ShopDealerOrderMapper extends BaseMapper<ShopDealerOrder> {
|
||||
*/
|
||||
List<ShopDealerOrder> selectListRel(@Param("param") ShopDealerOrderParam param);
|
||||
|
||||
/**
|
||||
* 获取订单门店/分销商待结算数据
|
||||
* @param tenantId 租户ID
|
||||
* @return
|
||||
*/
|
||||
List<ShopDealerOrderTaskVO> getDealerOrderList(@Param("tenantId") Integer tenantId);
|
||||
|
||||
}
|
||||
|
||||
@@ -89,5 +89,27 @@
|
||||
<select id="selectListRel" resultType="com.gxwebsoft.shop.entity.ShopDealerOrder">
|
||||
<include refid="selectSql"></include>
|
||||
</select>
|
||||
<select id="getDealerOrderList" resultType="com.gxwebsoft.shop.vo.ShopDealerOrderTaskVO">
|
||||
SELECT
|
||||
a.order_id,
|
||||
b.id as shopDealerOrderId,
|
||||
b.order_no,
|
||||
first_dividend_user,
|
||||
b.first_dividend,
|
||||
b.first_dividend_flag,
|
||||
second_dividend_user,
|
||||
b.second_dividend,
|
||||
b.second_dividend_flag
|
||||
FROM
|
||||
shop_order a
|
||||
LEFT JOIN shop_dealer_order b ON a.order_no = b.order_no
|
||||
WHERE
|
||||
DATE(a.create_time) >= '2026-05-14'
|
||||
AND a.team_settlement_flag = 0
|
||||
AND a.pay_status = 1
|
||||
AND a.order_status = 1
|
||||
AND a.deleted = 0
|
||||
AND ((b.first_dividend > 0 AND first_dividend_flag = 0) OR (b.second_dividend > 0 AND second_dividend_flag = 0))
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.gxwebsoft.shop.service;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.gxwebsoft.common.core.web.PageResult;
|
||||
import com.gxwebsoft.shop.dto.ShopDealerRefundDto;
|
||||
import com.gxwebsoft.shop.dto.ShopDealerSettlementDto;
|
||||
import com.gxwebsoft.shop.dto.ShopDealerUserReduceDto;
|
||||
import com.gxwebsoft.shop.entity.ShopDealerUser;
|
||||
import com.gxwebsoft.shop.param.ShopDealerUserParam;
|
||||
@@ -58,4 +59,12 @@ public interface ShopDealerUserService extends IService<ShopDealerUser> {
|
||||
* @return
|
||||
*/
|
||||
Boolean refundOrder(ShopDealerRefundDto refundDto);
|
||||
|
||||
/**
|
||||
* 用户资金结算
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
Boolean settlementBatch(ShopDealerSettlementDto dto);
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.gxwebsoft.shop.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.gxwebsoft.common.core.enums.ShopDealerCapitalUpdateEnum;
|
||||
@@ -11,6 +12,8 @@ import com.gxwebsoft.common.system.entity.User;
|
||||
import com.gxwebsoft.common.system.mapper.UserMapper;
|
||||
import com.gxwebsoft.common.system.redis.OrderNoUtils;
|
||||
import com.gxwebsoft.shop.dto.ShopDealerRefundDto;
|
||||
import com.gxwebsoft.shop.dto.ShopDealerSettlementDto;
|
||||
import com.gxwebsoft.shop.dto.ShopDealerSettlementItemDto;
|
||||
import com.gxwebsoft.shop.dto.ShopDealerUserReduceDto;
|
||||
import com.gxwebsoft.shop.entity.ShopDealerCapital;
|
||||
import com.gxwebsoft.shop.entity.ShopDealerUser;
|
||||
@@ -364,6 +367,50 @@ public class ShopDealerUserServiceImpl extends ServiceImpl<ShopDealerUserMapper,
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public Boolean settlementBatch(ShopDealerSettlementDto entity) {
|
||||
if(entity != null && CollectionUtils.isNotEmpty(entity.getItemList())){
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
List<ShopDealerSettlementItemDto> itemList = entity.getItemList();
|
||||
|
||||
List<Integer> userIdList = itemList.stream().map(ShopDealerSettlementItemDto::getUserId).distinct().collect(Collectors.toList());
|
||||
|
||||
List<ShopDealerUser> shopDealerUserList = baseMapper.selectList(new LambdaQueryWrapper<ShopDealerUser>().select(ShopDealerUser::getId, ShopDealerUser::getUserId,
|
||||
ShopDealerUser::getMoney, ShopDealerUser::getTotalMoney, ShopDealerUser::getFreezeMoney).in(ShopDealerUser::getUserId, userIdList));
|
||||
|
||||
List<ShopDealerUser> updateDealerUserList = new ArrayList<>();
|
||||
List<ShopDealerCapital> capitalList = new ArrayList<>();
|
||||
itemList.forEach(item ->{
|
||||
ShopDealerUser dealerUser = shopDealerUserList.stream().filter(shopDealerUser -> item.getUserId().equals(shopDealerUser.getUserId())).findFirst().orElse(null);
|
||||
if(dealerUser != null){
|
||||
dealerUser.setMoney(dealerUser.getMoney().add(item.getMoney()));
|
||||
dealerUser.setTotalMoney(dealerUser.getTotalMoney().add(item.getMoney()));
|
||||
dealerUser.setUpdateTime(now);
|
||||
updateDealerUserList.add(dealerUser);
|
||||
|
||||
ShopDealerCapital capital = BeanUtil.toBean(entity, ShopDealerCapital.class);
|
||||
capital.setNo(item.getNo());
|
||||
capital.setUserId(item.getUserId());
|
||||
capital.setMoney(item.getMoney());
|
||||
capital.setMoneyAfter(dealerUser.getMoney());
|
||||
capital.setFreezeMoneyAfter(dealerUser.getFreezeMoney());
|
||||
capital.setCreateTime(now);
|
||||
capitalList.add(capital);
|
||||
}
|
||||
});
|
||||
|
||||
if(CollectionUtils.isNotEmpty(updateDealerUserList)){
|
||||
updateBatchById(updateDealerUserList);
|
||||
}
|
||||
|
||||
if(CollectionUtils.isNotEmpty(capitalList)){
|
||||
shopDealerCapitalService.saveBatch(capitalList);
|
||||
}
|
||||
}
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
|
||||
public ShopDealerUser getDealerUser(Integer userId){
|
||||
ShopDealerUser shopDealerUser = baseMapper.selectOne(new LambdaQueryWrapper<ShopDealerUser>().eq(ShopDealerUser::getUserId, userId));
|
||||
if(shopDealerUser == null){
|
||||
|
||||
@@ -851,13 +851,6 @@ public class ShopOrderServiceImpl extends ServiceImpl<ShopOrderMapper, ShopOrder
|
||||
}
|
||||
}
|
||||
|
||||
// 测试环境使用1分钱(快照优先)
|
||||
if ("dev".equals(active)) {
|
||||
amount.setTotal(1);
|
||||
request.setAmount(amount);
|
||||
snapshot.setTotal(1);
|
||||
}
|
||||
|
||||
Exception last = null;
|
||||
String notifyUrlUsed = null;
|
||||
for (String notifyUrl : buildNotifyUrlCandidates(order, payment, snapshot)) {
|
||||
|
||||
166
src/main/java/com/gxwebsoft/shop/task/OrderSettlementTask.java
Normal file
166
src/main/java/com/gxwebsoft/shop/task/OrderSettlementTask.java
Normal file
@@ -0,0 +1,166 @@
|
||||
package com.gxwebsoft.shop.task;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.gxwebsoft.common.core.enums.ShopDealerCapitalUpdateEnum;
|
||||
import com.gxwebsoft.common.core.enums.ShopDealerTypeEnum;
|
||||
import com.gxwebsoft.common.system.redis.OrderNoUtils;
|
||||
import com.gxwebsoft.shop.dto.ShopDealerSettlementDto;
|
||||
import com.gxwebsoft.shop.dto.ShopDealerSettlementItemDto;
|
||||
import com.gxwebsoft.shop.entity.ShopDealerOrder;
|
||||
import com.gxwebsoft.shop.entity.ShopOrder;
|
||||
import com.gxwebsoft.shop.mapper.ShopDealerOrderMapper;
|
||||
import com.gxwebsoft.shop.mapper.ShopOrderMapper;
|
||||
import com.gxwebsoft.shop.service.ShopDealerOrderService;
|
||||
import com.gxwebsoft.shop.service.ShopDealerUserService;
|
||||
import com.gxwebsoft.shop.service.ShopOrderService;
|
||||
import com.gxwebsoft.shop.vo.ShopDealerOrderTaskVO;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 订单结算任务【门店/服务商结算、总分红结算等】
|
||||
* @author xm
|
||||
* @since 2026-05-15
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@AllArgsConstructor
|
||||
public class OrderSettlementTask {
|
||||
|
||||
private ShopDealerOrderMapper shopDealerOrderMapper;
|
||||
|
||||
private ShopDealerOrderService shopDealerOrderService;
|
||||
|
||||
private ShopOrderMapper shopOrderMapper;
|
||||
|
||||
private ShopOrderService shopOrderService;
|
||||
|
||||
private ShopDealerUserService shopDealerUserService;
|
||||
|
||||
private OrderNoUtils orderNoUtils;
|
||||
|
||||
/**
|
||||
* 门店、服务商结算任务:每天一点,每10分钟执行一次结算任务
|
||||
*/
|
||||
@Scheduled(cron = "0 0/10 1 * * ?")
|
||||
@Transactional
|
||||
public void teamSettlement(){
|
||||
//1.查询待结算订单信息
|
||||
List<ShopDealerOrderTaskVO> orderTaskVOList = shopDealerOrderMapper.getDealerOrderList(10584);
|
||||
if(CollectionUtils.isNotEmpty(orderTaskVOList)){
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
List<Integer> orderIdList = orderTaskVOList.stream().map(ShopDealerOrderTaskVO::getOrderId).distinct().collect(Collectors.toList());
|
||||
List<Integer> shopDealerIdList = orderTaskVOList.stream().map(ShopDealerOrderTaskVO::getShopDealerOrderId).distinct().collect(Collectors.toList());
|
||||
|
||||
//2.查询商品订单信息
|
||||
List<ShopOrder> shopOrderList = shopOrderMapper.selectList(new LambdaQueryWrapper<ShopOrder>().select(ShopOrder::getOrderId, ShopOrder::getTeamSettlementFlag)
|
||||
.in(ShopOrder::getOrderId, orderIdList));
|
||||
|
||||
//3.查询商品订单分销信息
|
||||
List<ShopDealerOrder> shopDealerOrderList = shopDealerOrderMapper.selectList(new LambdaQueryWrapper<ShopDealerOrder>().select(ShopDealerOrder::getId, ShopDealerOrder::getOrderNo)
|
||||
.in(ShopDealerOrder::getId, shopDealerIdList));
|
||||
|
||||
//4.结算一级服务商佣金
|
||||
Map<Integer, List<ShopDealerOrderTaskVO>> firstDealerMap = orderTaskVOList.stream().collect(Collectors.groupingBy(ShopDealerOrderTaskVO::getFirstDividendUser));
|
||||
List<ShopDealerSettlementItemDto> firstSettlementItemDtoList = new ArrayList<>();
|
||||
firstDealerMap.forEach((k, value) ->{
|
||||
List<Integer> orderIds = value.stream().map(ShopDealerOrderTaskVO::getOrderId).distinct().collect(Collectors.toList());
|
||||
List<Integer> shopDealerOrderIds = value.stream().map(ShopDealerOrderTaskVO::getShopDealerOrderId).distinct().collect(Collectors.toList());
|
||||
|
||||
//4.1 标记商品订单为已结算状态
|
||||
List<ShopOrder> shopOrders = shopOrderList.stream().filter(shopOrder -> orderIds.contains(shopOrder.getOrderId())).collect(Collectors.toList());
|
||||
shopOrders.forEach(shopOrder -> shopOrder.setTeamSettlementFlag(1));
|
||||
|
||||
//4.2 生成分销记录【增加钱包金额】
|
||||
BigDecimal firstDividendSum = value.stream().map(ShopDealerOrderTaskVO::getFirstDividend).reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
ShopDealerSettlementItemDto itemDto = new ShopDealerSettlementItemDto();
|
||||
String no = orderNoUtils.generate("C");
|
||||
itemDto.setNo(no);
|
||||
itemDto.setUserId(k);
|
||||
itemDto.setMoney(firstDividendSum);
|
||||
firstSettlementItemDtoList.add(itemDto);
|
||||
|
||||
//4.3更新商品分销记录对应的一级服务商佣金为已结算状态
|
||||
List<ShopDealerOrder> shopDealerOrders = shopDealerOrderList.stream().filter(shopDealerOrder -> shopDealerOrderIds.contains(shopDealerOrder.getId())).collect(Collectors.toList());
|
||||
shopDealerOrders.forEach(shopDealerOrder -> {
|
||||
shopDealerOrder.setFirstDividendFlag(1);
|
||||
shopDealerOrder.setFirstDividendNo(no);
|
||||
shopDealerOrder.setFirstDividendTime(now);
|
||||
});
|
||||
});
|
||||
|
||||
//4.4 一级结算【增加钱包金额】
|
||||
if(CollectionUtils.isNotEmpty(firstSettlementItemDtoList)){
|
||||
ShopDealerSettlementDto firstSettlementDto = new ShopDealerSettlementDto();
|
||||
firstSettlementDto.setType(ShopDealerTypeEnum.WITHDRAW_ACCOUNT.getCode());
|
||||
firstSettlementDto.setFlowType(ShopDealerCapitalUpdateEnum.MANAGEMENT_INCOME.getType());
|
||||
firstSettlementDto.setComments("团队管理津贴(1)");
|
||||
firstSettlementDto.setTenantId(10584);
|
||||
firstSettlementDto.setItemList(firstSettlementItemDtoList);
|
||||
shopDealerUserService.settlementBatch(firstSettlementDto);
|
||||
}
|
||||
|
||||
//5.结算二级服务商佣金
|
||||
Map<Integer, List<ShopDealerOrderTaskVO>> secondDealerMap = orderTaskVOList.stream().collect(Collectors.groupingBy(ShopDealerOrderTaskVO::getSecondDividendUser));
|
||||
List<ShopDealerSettlementItemDto> secondSettlementItemDtoList = new ArrayList<>();
|
||||
secondDealerMap.forEach((k, value) ->{
|
||||
List<Integer> orderIds = value.stream().map(ShopDealerOrderTaskVO::getOrderId).distinct().collect(Collectors.toList());
|
||||
List<Integer> shopDealerOrderIds = value.stream().map(ShopDealerOrderTaskVO::getShopDealerOrderId).distinct().collect(Collectors.toList());
|
||||
|
||||
//5.1 标记商品订单为已结算状态
|
||||
List<ShopOrder> shopOrders = shopOrderList.stream().filter(shopOrder -> orderIds.contains(shopOrder.getOrderId())).collect(Collectors.toList());
|
||||
shopOrders.forEach(shopOrder -> shopOrder.setTeamSettlementFlag(1));
|
||||
|
||||
//5.2 生成分销记录【增加钱包金额】
|
||||
BigDecimal secondDividendSum = value.stream().map(ShopDealerOrderTaskVO::getSecondDividend).reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
ShopDealerSettlementItemDto itemDto = new ShopDealerSettlementItemDto();
|
||||
String no = orderNoUtils.generate("C");
|
||||
itemDto.setNo(no);
|
||||
itemDto.setUserId(k);
|
||||
itemDto.setMoney(secondDividendSum);
|
||||
secondSettlementItemDtoList.add(itemDto);
|
||||
|
||||
//5.3 更新商品分销记录对应的一级服务商佣金为已结算状态
|
||||
List<ShopDealerOrder> shopDealerOrders = shopDealerOrderList.stream().filter(shopDealerOrder -> shopDealerOrderIds.contains(shopDealerOrder.getId())).collect(Collectors.toList());
|
||||
shopDealerOrders.forEach(shopDealerOrder -> {
|
||||
shopDealerOrder.setSecondDividendFlag(1);
|
||||
shopDealerOrder.setSecondDividendNo(no);
|
||||
shopDealerOrder.setSecondDividendTime(now);
|
||||
});
|
||||
});
|
||||
|
||||
//5.4 二级结算【增加钱包金额】
|
||||
if(CollectionUtils.isNotEmpty(secondSettlementItemDtoList)){
|
||||
ShopDealerSettlementDto secondSettlementDto = new ShopDealerSettlementDto();
|
||||
secondSettlementDto.setType(ShopDealerTypeEnum.WITHDRAW_ACCOUNT.getCode());
|
||||
secondSettlementDto.setFlowType(ShopDealerCapitalUpdateEnum.MANAGEMENT_INCOME.getType());
|
||||
secondSettlementDto.setComments("团队管理津贴(2)");
|
||||
secondSettlementDto.setTenantId(10584);
|
||||
secondSettlementDto.setItemList(secondSettlementItemDtoList);
|
||||
shopDealerUserService.settlementBatch(secondSettlementDto);
|
||||
}
|
||||
|
||||
//6.批量修改订单为已结算状态
|
||||
if(CollectionUtils.isNotEmpty(shopOrderList)){
|
||||
shopOrderService.updateBatchById(shopOrderList);
|
||||
}
|
||||
|
||||
//7.批量修改订单分销数据为已结算状态
|
||||
if(CollectionUtils.isNotEmpty(shopDealerOrderList)){
|
||||
shopDealerOrderService.updateBatchById(shopDealerOrderList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.gxwebsoft.shop.vo;
|
||||
|
||||
import cn.afterturn.easypoi.excel.annotation.Excel;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* 订单分销门店/服务商分佣记录
|
||||
* @author xm
|
||||
* @since 2026-05-15
|
||||
*/
|
||||
@Data
|
||||
@Schema(description = "订单分销门店/服务商分佣记录")
|
||||
public class ShopDealerOrderTaskVO {
|
||||
|
||||
@Schema(description = "商品订单ID")
|
||||
private Integer orderId;
|
||||
|
||||
@Schema(description = "主键ID")
|
||||
private Integer shopDealerOrderId;
|
||||
|
||||
@Excel(name = "订单编号")
|
||||
private String orderNo;
|
||||
|
||||
@Schema(description = "一级服务商/门店")
|
||||
private Integer firstDividendUser;
|
||||
|
||||
@Schema(description = "一级服务商/门店管理津贴")
|
||||
private BigDecimal firstDividend;
|
||||
|
||||
@Schema(description = "一级服务商/门店结算标识 0-否 1-是")
|
||||
private Integer firstDividendFlag;
|
||||
|
||||
@Schema(description = "二级服务商/门店")
|
||||
private Integer secondDividendUser;
|
||||
|
||||
@Schema(description = "二级服务商/门店管理津贴")
|
||||
private BigDecimal secondDividend;
|
||||
|
||||
@Schema(description = "二级服务商/门店结算标识 0-否 1-是")
|
||||
private Integer secondDividendFlag;
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user