|
|
@@ -0,0 +1,88 @@
|
|
|
+package com.etotem.cfc.service;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.etotem.cfc.entity.FamilyCommission;
|
|
|
+import com.etotem.cfc.entity.PromotionBinding;
|
|
|
+import com.etotem.cfc.mapper.FamilyCommissionMapper;
|
|
|
+import com.etotem.cfc.mapper.PromotionBindingMapper;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class FamilyCommissionService {
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private FamilyCommissionMapper familyCommissionMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private PromotionBindingMapper promotionBindingMapper;
|
|
|
+
|
|
|
+ public FamilyCommission recordCommission(Long promoterFamilyId, Long buyerFamilyId, Long orderId, BigDecimal amount) {
|
|
|
+ BigDecimal rate = new BigDecimal("10.00");
|
|
|
+ BigDecimal commissionAmount = amount.multiply(rate).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
|
|
|
+
|
|
|
+ FamilyCommission commission = new FamilyCommission();
|
|
|
+ commission.setPromoterFamilyId(promoterFamilyId);
|
|
|
+ commission.setBuyerFamilyId(buyerFamilyId);
|
|
|
+ commission.setOrderId(orderId);
|
|
|
+ commission.setAmount(amount);
|
|
|
+ commission.setCommissionRate(rate);
|
|
|
+ commission.setCommissionAmount(commissionAmount);
|
|
|
+ commission.setStatus("pending");
|
|
|
+ commission.setCreatedAt(new Date());
|
|
|
+ familyCommissionMapper.insert(commission);
|
|
|
+ return commission;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Page<FamilyCommission> getCommissionList(Long familyId, int page, int size) {
|
|
|
+ Page<FamilyCommission> pageParam = new Page<>(page, size);
|
|
|
+ return familyCommissionMapper.selectPage(pageParam,
|
|
|
+ new LambdaQueryWrapper<FamilyCommission>()
|
|
|
+ .and(w -> w.eq(FamilyCommission::getPromoterFamilyId, familyId)
|
|
|
+ .or().eq(FamilyCommission::getBuyerFamilyId, familyId))
|
|
|
+ .orderByDesc(FamilyCommission::getCreatedAt)
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ public PromotionBinding bindByInviteCode(Long promoterFamilyId, String inviteCode) {
|
|
|
+ // 简化实现:直接创建绑定(邀请码校验可在后续迭代补充)
|
|
|
+ PromotionBinding binding = new PromotionBinding();
|
|
|
+ binding.setPromoterFamilyId(promoterFamilyId);
|
|
|
+ binding.setInviteCode(inviteCode);
|
|
|
+ binding.setBindingType("direct");
|
|
|
+ binding.setStatus("active");
|
|
|
+ binding.setCreatedAt(new Date());
|
|
|
+ promotionBindingMapper.insert(binding);
|
|
|
+ return binding;
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<PromotionBinding> getBindings(Long familyId) {
|
|
|
+ return promotionBindingMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<PromotionBinding>()
|
|
|
+ .and(w -> w.eq(PromotionBinding::getPromoterFamilyId, familyId)
|
|
|
+ .or().eq(PromotionBinding::getInviteeFamilyId, familyId))
|
|
|
+ .orderByDesc(PromotionBinding::getCreatedAt)
|
|
|
+ .last("LIMIT 100")
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ public BigDecimal getTotalEarnings(Long familyId) {
|
|
|
+ LambdaQueryWrapper<FamilyCommission> wrapper = new LambdaQueryWrapper<FamilyCommission>()
|
|
|
+ .eq(FamilyCommission::getPromoterFamilyId, familyId)
|
|
|
+ .eq(FamilyCommission::getStatus, "paid");
|
|
|
+ List<FamilyCommission> list = familyCommissionMapper.selectList(wrapper);
|
|
|
+ BigDecimal total = BigDecimal.ZERO;
|
|
|
+ for (FamilyCommission c : list) {
|
|
|
+ if (c.getCommissionAmount() != null) {
|
|
|
+ total = total.add(c.getCommissionAmount());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return total;
|
|
|
+ }
|
|
|
+}
|