Jelajahi Sumber

分销商广告金分成

贺立强 4 bulan lalu
induk
melakukan
c0a79af31b

+ 23 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/controller/AdvBudgetController.java

@@ -0,0 +1,23 @@
+package cn.com.ctop.job.adq.controller;
+
+
+import cn.com.ctop.job.adq.data.service.IAdvBudgetService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/advBudget")
+@Slf4j
+public class AdvBudgetController {
+
+    @Autowired
+    private IAdvBudgetService advBudgetService;
+
+    @GetMapping("/sumPayAmountByPeriodAndMerchant")
+    public void sumPayAmountByPeriodAndMerchant() {
+        advBudgetService.sumPayAmountByPeriodAndMerchant();
+    }
+}

+ 42 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/mapper/AdvBudgetMapper.java

@@ -0,0 +1,42 @@
+package cn.com.ctop.job.adq.data.mapper;
+
+
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+
+public interface AdvBudgetMapper {
+
+    /**
+     * 按 app_id 和 settle_begin 分组汇总广告金发放情况
+     * @param params 查询参数 Map
+     * @return List<Map<String, Object>>
+     */
+    List<Map<String, Object>> groupByAppIdAndSettleBegin(Map<String, Object> params);
+
+    /**
+     * 查询分销商
+     * @return List<Map<String, Object>>
+     */
+    List<Map<String, Object>> listTopLevelDistributors();
+
+    /**
+     * 查询订单
+     * @param payMerchant
+     * @param settleBegin
+     * @param settleEnd
+     * @param personId
+     * @return
+     */
+    Long sumPayAmountByPeriodAndMerchant(
+            @Param("payMerchant")   Integer payMerchant,    // 可传 null
+            @Param("settleBegin")   Long settleBegin,       // 可传 null
+            @Param("settleEnd")     Long settleEnd,         // 可传 null
+            @Param("personId")      Integer personId,       // 可传 null
+            @Param("appId")      String appId
+    );
+
+    int replaceAdvBudget(Map<String, Object> params);
+}

+ 103 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/mapper/xml/AdvBudgetMapper.xml

@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="cn.com.ctop.job.adq.data.mapper.AdvBudgetMapper">
+
+    <select id="listTopLevelDistributors" resultType="map">
+        SELECT
+        id,
+        name
+        FROM thirtpart.ly_responsibility_person
+        WHERE is_distributor = 1
+        AND pid IS NULL
+    </select>
+
+    <select id="groupByAppIdAndSettleBegin" resultType="map">
+        SELECT
+        app_id,
+        settle_begin,
+        settle_end,
+        SUM(CASE WHEN fund_type = 0 THEN remain_amount ELSE 0 END)   AS total_amount_a,   -- 通用赠送
+        SUM(CASE WHEN fund_type = 1 THEN remain_amount ELSE 0 END)   AS total_amount_b,   -- 广告激励
+        SUM(CASE WHEN fund_type = 2 THEN remain_amount ELSE 0 END)   AS total_amount_c,   -- 定向激励
+        expire_time,
+        SUM(CASE
+        WHEN expire_time &lt; UNIX_TIMESTAMP(NOW())
+        AND remain_amount > 0
+        THEN remain_amount
+        ELSE 0
+        END)                                                    AS expired_available_amount
+        FROM adq_vp_ad_fund
+        <where>
+            <if test="appId != null">
+                AND app_id = #{appId}
+            </if>
+            <if test="settleBeginStart != null">
+                AND settle_begin &gt;= #{settleBeginStart}
+            </if>
+            <if test="settleBeginEnd != null">
+                AND settle_begin &lt;= #{settleBeginEnd}
+            </if>
+            <if test="fundType != null">
+                AND fund_type = #{fundType}
+            </if>
+        </where>
+        GROUP BY app_id, settle_begin
+        HAVING total_amount_a > 0
+        OR total_amount_b > 0
+        OR total_amount_c > 0
+        OR expired_available_amount > 0
+        ORDER BY settle_begin DESC
+    </select>
+
+    <select id="sumPayAmountByPeriodAndMerchant" resultType="java.lang.Long">
+        SELECT
+        COALESCE(SUM(total_fee) * 100, 0) AS total_fee
+        FROM thirtpart.ly_pay_record
+        LEFT JOIN thirtpart.ly_official_accounts loa
+        ON ly_pay_record.official_account_id = loa.id
+        <where>
+            link_id IS NOT NULL
+            <if test="payMerchant != null">
+                AND pay_merchant = #{payMerchant}
+            </if>
+            <if test="appId != null">
+                AND loa.app_id = #{appId}
+            </if>
+            <if test="settleBegin != null">
+                AND pay_time &gt;= #{settleBegin}
+            </if>
+            <if test="settleEnd != null">
+                AND pay_time &lt;= #{settleEnd}
+            </if>
+            <if test="personId != null">
+                AND (person_bility_id = #{personId} OR person_id = #{personId})
+            </if>
+            AND status = 1
+        </where>
+    </select>
+
+    <insert id="replaceAdvBudget" parameterType="map">
+        REPLACE INTO thirtpart.adv_budget (
+            person_id,
+            app_id,
+            settle_begin,
+            settle_end,
+            fund_money_a,
+            fund_money_b,
+            fund_money_c,
+            expire_time,
+            scale
+        ) VALUES (
+                     #{personId},
+                     #{appId},
+                     #{settleBegin},
+                     #{settleEnd},
+                     #{fundMoneyA},
+                     #{fundMoneyB},
+                     #{fundMoneyC},
+                     #{expireTime},
+                     #{scale}
+                 )
+    </insert>
+
+</mapper>

+ 9 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/service/IAdvBudgetService.java

@@ -0,0 +1,9 @@
+package cn.com.ctop.job.adq.data.service;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public interface IAdvBudgetService {
+
+    void sumPayAmountByPeriodAndMerchant();
+}

+ 102 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/service/impl/AdvBudgetServiceImpl.java

@@ -0,0 +1,102 @@
+package cn.com.ctop.job.adq.data.service.impl;
+
+import cn.com.ctop.job.adq.data.mapper.AdvBudgetMapper;
+import cn.com.ctop.job.adq.data.service.IAdvBudgetService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+@Service
+public class AdvBudgetServiceImpl implements IAdvBudgetService {
+
+    @Autowired
+    private AdvBudgetMapper advBudgetMapper;
+
+    public void sumPayAmountByPeriodAndMerchant() {
+        //广告金数据
+        List<Map<String, Object>> adFund = advBudgetMapper.groupByAppIdAndSettleBegin(null);
+
+        //分销商数据
+        List<Map<String, Object>> fx = advBudgetMapper.listTopLevelDistributors();
+
+        for (Map<String, Object> adFundItem : adFund){
+            //周期开始时间
+            Long settleBegin = (Long) adFundItem.get("settle_begin");
+            //周期结束时间
+            Long settleEnd = (Long) adFundItem.get("settle_end");
+            //小程序ID
+            String appId = (String) adFundItem.get("app_id");
+
+            //总通用广告金金额
+            Long totalAmountA = ((Number) adFundItem.get("total_amount_a")).longValue();
+            //总广告激励金金额
+            Long totalAmountB = ((Number) adFundItem.get("total_amount_b")).longValue();
+            //总定向激励金额
+            Long totalAmountC = ((Number) adFundItem.get("total_amount_c")).longValue();
+
+            //过期时间
+            Long expireTime = (Long) adFundItem.get("expire_time");
+
+            //虚拟支付总收入数据
+            Long sum = advBudgetMapper.sumPayAmountByPeriodAndMerchant(15, settleBegin, settleEnd, null, appId);
+
+            //循环分销商数据
+            for (Map<String, Object> fxItem : fx) {
+                //分销商ID
+                Integer distributorId = (Integer) fxItem.get("id");
+                //虚拟支付分销商数据
+                Long fxsum = advBudgetMapper.sumPayAmountByPeriodAndMerchant(15, settleBegin, settleEnd, distributorId, appId);
+
+                if(fxsum > 0){
+                    //比例
+                    BigDecimal percent = BigDecimal.valueOf(fxsum).divide(BigDecimal.valueOf(sum), 4, RoundingMode.HALF_UP);
+                    Double fxPercent = percent.setScale(5, RoundingMode.HALF_UP).doubleValue();
+
+                    // 通用广告金金额
+                    Integer amountA = (int)(totalAmountA * fxPercent);
+                    // 广告激励金金额
+                    Integer amountB = (int)(totalAmountB * fxPercent);
+                    // 定向激励金额
+                    Integer amountC = (int)(totalAmountC * fxPercent);
+
+//                    System.err.println("小程序周期内总收入:"+sum);
+//                    System.err.println("分销商小程序周期内总收入:"+fxsum);
+//                    System.err.println("精确比例:"+percent);
+//                    System.err.println("四舍五入比例:"+fxPercent);
+//                    System.err.println("可用通用广告金金额:"+totalAmountA);
+//                    System.err.println("分销商通用广告金金额:"+amountA);
+//                    System.err.println("可用广告激励金金额:"+totalAmountB);
+//                    System.err.println("分销商广告激励金金额:"+amountB);
+//                    System.err.println("可用定向激励金额:"+totalAmountC);
+//                    System.err.println("分销商定向激励金额:"+amountC);
+
+                    Map<String, Object> data = new HashMap<>();
+                    data.put("appId", appId);
+                    data.put("personId", distributorId);
+                    data.put("settleBegin", settleBegin);
+                    data.put("settleEnd", settleEnd);
+                    data.put("fundMoneyA", amountA);
+                    data.put("fundMoneyB", amountB);
+                    data.put("fundMoneyC", amountC);
+                    data.put("expireTime", expireTime);
+                    data.put("scale", fxPercent);
+                    int rows =advBudgetMapper.replaceAdvBudget(data);
+//                    if (rows == 1) {
+//                        System.err.println("成功插入新记录");
+//                    } else if (rows == 2) {
+//                        System.err.println("成功覆盖旧记录");
+//                    } else if (rows == 0) {
+//                        System.err.println("没有任何变化");
+//                    }
+//                    System.err.println("----------分割线------------");
+                }
+
+            }
+        }
+    }
+}