diff --git a/src/main/java/com/gxwebsoft/common/core/enums/ShopDealerCapitalUpdateEnum.java b/src/main/java/com/gxwebsoft/common/core/enums/ShopDealerCapitalUpdateEnum.java index ff261fb..94c2734 100644 --- a/src/main/java/com/gxwebsoft/common/core/enums/ShopDealerCapitalUpdateEnum.java +++ b/src/main/java/com/gxwebsoft/common/core/enums/ShopDealerCapitalUpdateEnum.java @@ -15,6 +15,7 @@ public enum ShopDealerCapitalUpdateEnum { MANAGEMENT_INCOME(11, "团队管理津贴收入", true), DIVIDEND_INCOME(12, "分红收入", true), PROMOTION_INCOME(13, "现场推广收入", true), + PROMOTION_PARENT_INCOME(14, "现场推广分佣", true), WITHDRAW_PAYMENT(20, "提现支出", false), TRANSFER_PAYMENT(30, "转账支出", false), TRANSFER_INCOME(40, "转账收入", true), diff --git a/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java b/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java index 18898fc..4ffde38 100644 --- a/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java +++ b/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java @@ -691,7 +691,8 @@ public class GltTicketOrderServiceImpl extends ServiceImpl 0) { //配送提成 + if (qty > 0) { //配送提成(每桶0.1) BigDecimal money = RIDER_UNIT_COMMISSION .multiply(BigDecimal.valueOf(qty)) .setScale(RIDER_COMMISSION_SCALE, RoundingMode.HALF_UP); @@ -796,13 +797,19 @@ public class GltTicketOrderServiceImpl extends ServiceImpl 0){ + Integer commissionType = shopGood.getCommissionType(); + 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(); reduceDto.setTypeEnum(ShopDealerTypeEnum.WITHDRAW_ACCOUNT); reduceDto.setUserId(ticketOrder.getRiderId()); diff --git a/src/main/java/com/gxwebsoft/shop/controller/ShopOrderController.java b/src/main/java/com/gxwebsoft/shop/controller/ShopOrderController.java index 15c4298..4866792 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/ShopOrderController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/ShopOrderController.java @@ -32,6 +32,7 @@ import com.gxwebsoft.shop.param.ShopOrderParam; import com.gxwebsoft.shop.service.*; import com.gxwebsoft.shop.service.impl.KuaiDi100Impl; 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.notification.NotificationConfig; 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 org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springdoc.api.annotations.ParameterObject; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.Authentication; @@ -140,6 +142,13 @@ public class ShopOrderController extends BaseController { return success(shopOrderService.getByIdRel(id)); } +// @PreAuthorize("hasAuthority('shop:shopOrder:list')") + @Operation(summary = "我已核销订单") + @GetMapping("/myVerifyOrder") + public ApiResult myVerifyOrder(@ParameterObject ShopOrderMyVerifyDto myVerifyDto) { + return success(shopOrderService.myVerifyOrder(myVerifyDto)); + } + @Operation(summary = "添加订单【单商品添加】") @PostMapping() public ApiResult save(@RequestBody OrderCreateRequest request) { diff --git a/src/main/java/com/gxwebsoft/shop/entity/ShopGoods.java b/src/main/java/com/gxwebsoft/shop/entity/ShopGoods.java index 4b67efb..ac86fb3 100644 --- a/src/main/java/com/gxwebsoft/shop/entity/ShopGoods.java +++ b/src/main/java/com/gxwebsoft/shop/entity/ShopGoods.java @@ -109,6 +109,12 @@ public class ShopGoods implements Serializable { @Schema(description = "推广核验佣金比率") private BigDecimal verifyRate; + @Schema(description = "推广核验上级/指定人") + private Integer verifyParentUserId; + + @Schema(description = "推广核验上级佣金比率/指定分佣") + private BigDecimal verifyParentRate; + @Schema(description = "库存计算方式(10下单减库存 20付款减库存)") @JsonAlias({"cdeductStockType"}) private Integer deductStockType; diff --git a/src/main/java/com/gxwebsoft/shop/entity/ShopOrder.java b/src/main/java/com/gxwebsoft/shop/entity/ShopOrder.java index 6ba76a0..67e8ffd 100644 --- a/src/main/java/com/gxwebsoft/shop/entity/ShopOrder.java +++ b/src/main/java/com/gxwebsoft/shop/entity/ShopOrder.java @@ -342,6 +342,12 @@ public class ShopOrder implements Serializable { @Schema(description = "推广核销佣金") private BigDecimal verifyMoney; + @Schema(description = "推广核验上级/指定人") + private Integer verifyParentUser; + + @Schema(description = "推广核验上级/指定人佣金") + private BigDecimal verifyParentMoney; + @Schema(description = "门店、服务商结算标识 0-未结算 1-已结算") private Integer teamSettlementFlag; diff --git a/src/main/java/com/gxwebsoft/shop/mapper/ShopOrderMapper.java b/src/main/java/com/gxwebsoft/shop/mapper/ShopOrderMapper.java index b905d29..f7a54f8 100644 --- a/src/main/java/com/gxwebsoft/shop/mapper/ShopOrderMapper.java +++ b/src/main/java/com/gxwebsoft/shop/mapper/ShopOrderMapper.java @@ -3,9 +3,12 @@ package com.gxwebsoft.shop.mapper; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; 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.param.ShopOrderParam; import com.gxwebsoft.shop.vo.ShopOrderGoodsVO; +import com.gxwebsoft.shop.vo.ShopOrderMyVerifyItemVO; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; @@ -67,4 +70,13 @@ public interface ShopOrderMapper extends BaseMapper { * @return */ List getOrderGoodsInfo(@Param("orderNo") String orderNo); + + /** + * 查询我的核销订单数据 + * @param page + * @param entity + * @return + */ + IPage getMyVerifyPageInfo(@Param("page") Page page, @Param("entity") ShopOrderMyVerifyDto entity); + } diff --git a/src/main/java/com/gxwebsoft/shop/mapper/xml/ShopOrderMapper.xml b/src/main/java/com/gxwebsoft/shop/mapper/xml/ShopOrderMapper.xml index bca22cf..f191dd9 100644 --- a/src/main/java/com/gxwebsoft/shop/mapper/xml/ShopOrderMapper.xml +++ b/src/main/java/com/gxwebsoft/shop/mapper/xml/ShopOrderMapper.xml @@ -342,8 +342,40 @@ AND c.is_open_commission = 1 AND a.order_no = #{orderNo} - - + + UPDATE shop_order diff --git a/src/main/java/com/gxwebsoft/shop/service/ShopOrderService.java b/src/main/java/com/gxwebsoft/shop/service/ShopOrderService.java index e7df2db..a9cd060 100644 --- a/src/main/java/com/gxwebsoft/shop/service/ShopOrderService.java +++ b/src/main/java/com/gxwebsoft/shop/service/ShopOrderService.java @@ -2,10 +2,12 @@ package com.gxwebsoft.shop.service; import com.baomidou.mybatisplus.extension.service.IService; import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.shop.dto.ShopOrderMyVerifyDto; import com.gxwebsoft.shop.dto.UserOrderStats; import com.gxwebsoft.shop.dto.VerifyShopOrderDto; import com.gxwebsoft.shop.entity.ShopOrder; import com.gxwebsoft.shop.param.ShopOrderParam; +import com.gxwebsoft.shop.vo.ShopOrderMyVerifyVO; import java.math.BigDecimal; import java.util.HashMap; @@ -43,6 +45,12 @@ public interface ShopOrderService extends IService { */ ShopOrder getByIdRel(Integer orderId); + /** + * 我已核销订单 + * @return + */ + ShopOrderMyVerifyVO myVerifyOrder(ShopOrderMyVerifyDto myVerifyDto); + HashMap createWxOrder(ShopOrder shopOrder); ShopOrder getByOutTradeNo(String outTradeNo); diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/ShopDealerUserServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/ShopDealerUserServiceImpl.java index e783c1c..6ccdcc0 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/ShopDealerUserServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/ShopDealerUserServiceImpl.java @@ -117,6 +117,7 @@ public class ShopDealerUserServiceImpl extends ServiceImpl pageInfo = baseMapper.getMyVerifyPageInfo(new Page<>(entity.getPage(), entity.getLimit()), entity); + myVerifyVO.setCount(Math.toIntExact(pageInfo.getTotal())); + if(CollectionUtils.isNotEmpty(pageInfo.getRecords())){ + List 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 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 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 public com.gxwebsoft.shop.dto.UserOrderStats getUserOrderStats(Integer userId, Integer tenantId, Integer type) { if (userId == null) { @@ -470,9 +524,16 @@ public class ShopOrderServiceImpl extends ServiceImpl orderGoodsList = shopOrderGoodsService.getListByOrderId(shopOrder.getOrderId()); if(CollectionUtils.isNotEmpty(orderGoodsList)){ @@ -481,20 +542,32 @@ public class ShopOrderServiceImpl extends ServiceImpl verifyMoney = new AtomicReference<>(BigDecimal.ZERO); + AtomicReference verifyParentMoney = new AtomicReference<>(BigDecimal.ZERO); orderGoodsList.forEach(orderGoods -> { ShopGoods shopGood = shopGoods.stream().filter(goods -> orderGoods.getGoodsId().equals(goods.getGoodsId()) && goods.getVerifyRate().compareTo(BigDecimal.ZERO) > 0).findFirst().orElse(null); if (shopGood != null) { - // 计算单商品核价金额 BigDecimal money = orderGoods.getPrice() .multiply(BigDecimal.valueOf(orderGoods.getTotalNum())) .multiply(shopGood.getVerifyRate()) + .multiply(rate) .divide(BigDecimal.valueOf(100), 3, RoundingMode.HALF_UP); // 除100,保留2位小数 - - // ✅ 原子更新(关键!) 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()); @@ -513,12 +586,27 @@ public class ShopOrderServiceImpl extends ServiceImpl 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){ shopOrder.setOrderStatus(1); shopOrder.setDeliveryStatus(20);