|
@@ -0,0 +1,344 @@
|
|
|
+package com.ruixuan.isc.service.impl;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.ruixuan.common.utils.Check;
|
|
|
+import com.ruixuan.common.utils.DateUtils;
|
|
|
+import com.ruixuan.isc.entity.KuaishouRuleSettlementData;
|
|
|
+import com.ruixuan.isc.entity.KuaishouSettlementRules;
|
|
|
+import com.ruixuan.isc.mapper.KuaishouRuleSettlementDataMapper;
|
|
|
+import com.ruixuan.isc.service.IKuaishouRuleSettlementDataService;
|
|
|
+import com.ruixuan.isc.service.IKuaishouSettlementRulesService;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * 【请填写功能名称】Service业务层处理
|
|
|
+ *
|
|
|
+ * @author ruoyi
|
|
|
+ * @date 2023-05-16
|
|
|
+ */
|
|
|
+@Service
|
|
|
+@Slf4j
|
|
|
+public class KuaishouRuleSettlementDataServiceImpl implements IKuaishouRuleSettlementDataService {
|
|
|
+ @Autowired
|
|
|
+ private KuaishouRuleSettlementDataMapper kuaishouRuleSettlementDataMapper;
|
|
|
+ @Autowired
|
|
|
+ private IKuaishouSettlementRulesService settlementRulesService;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询【请填写功能名称】
|
|
|
+ *
|
|
|
+ * @param id 【请填写功能名称】主键
|
|
|
+ * @return 【请填写功能名称】
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public KuaishouRuleSettlementData selectKuaishouRuleSettlementDataById(Long id) {
|
|
|
+ return kuaishouRuleSettlementDataMapper.selectKuaishouRuleSettlementDataById(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询【请填写功能名称】列表
|
|
|
+ *
|
|
|
+ * @param kuaishouRuleSettlementData 【请填写功能名称】
|
|
|
+ * @return 【请填写功能名称】
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<KuaishouRuleSettlementData> selectKuaishouRuleSettlementDataList(KuaishouRuleSettlementData kuaishouRuleSettlementData) {
|
|
|
+ return kuaishouRuleSettlementDataMapper.selectKuaishouRuleSettlementDataList(kuaishouRuleSettlementData);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 新增【请填写功能名称】
|
|
|
+ *
|
|
|
+ * @param kuaishouRuleSettlementData 【请填写功能名称】
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int insertKuaishouRuleSettlementData(KuaishouRuleSettlementData kuaishouRuleSettlementData) {
|
|
|
+ kuaishouRuleSettlementData.setCreateTime(DateUtils.getNowDate());
|
|
|
+ return kuaishouRuleSettlementDataMapper.insertKuaishouRuleSettlementData(kuaishouRuleSettlementData);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改【请填写功能名称】
|
|
|
+ *
|
|
|
+ * @param kuaishouRuleSettlementData 【请填写功能名称】
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int updateKuaishouRuleSettlementData(KuaishouRuleSettlementData kuaishouRuleSettlementData) {
|
|
|
+ kuaishouRuleSettlementData.setUpdateTime(DateUtils.getNowDate());
|
|
|
+ return kuaishouRuleSettlementDataMapper.updateKuaishouRuleSettlementData(kuaishouRuleSettlementData);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量删除【请填写功能名称】
|
|
|
+ *
|
|
|
+ * @param ids 需要删除的【请填写功能名称】主键
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int deleteKuaishouRuleSettlementDataByIds(Long[] ids) {
|
|
|
+ return kuaishouRuleSettlementDataMapper.deleteKuaishouRuleSettlementDataByIds(ids);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除【请填写功能名称】信息
|
|
|
+ *
|
|
|
+ * @param id 【请填写功能名称】主键
|
|
|
+ * @return 结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public int deleteKuaishouRuleSettlementDataById(Long id) {
|
|
|
+ return kuaishouRuleSettlementDataMapper.deleteKuaishouRuleSettlementDataById(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void data(Long statDate, JSONArray dataArr) {
|
|
|
+ if (!Check.isNull(dataArr)) {
|
|
|
+ List<KuaishouRuleSettlementData> adds = new ArrayList<>();
|
|
|
+ for (int i = 0; i < dataArr.size(); i++) {
|
|
|
+ JSONObject dataJson = dataArr.getJSONObject(i);
|
|
|
+ KuaishouRuleSettlementData settlementData = new KuaishouRuleSettlementData();
|
|
|
+ Long relateId = dataJson.getLong("relateId");
|
|
|
+ Long ruleId = dataJson.getLong("ruleId");
|
|
|
+ String itemIds = dataJson.getString("itemIds");
|
|
|
+ Long promoterId = dataJson.getLong("promoterId");
|
|
|
+ String promoterName = dataJson.getString("promoterName");
|
|
|
+ Long itemCreateId = dataJson.getLong("itemCreateId");
|
|
|
+ String itemCreateName = dataJson.getString("itemCreateName");
|
|
|
+ Long promoterCreateId = dataJson.getLong("promoterCreateId");
|
|
|
+ String promoterCreateName = dataJson.getString("promoterCreateName");
|
|
|
+ Long orderNum = dataJson.getLong("orderNum");
|
|
|
+ Long validOrderNum = dataJson.getLong("validOrderNum");
|
|
|
+ if (validOrderNum == 0 || Check.isNull(validOrderNum)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ Long yesterdayOrderNum = dataJson.getLong("yesterdayOrderNum");
|
|
|
+ Long yesterdayValidOrderNum = dataJson.getLong("yesterdayValidOrderNum");
|
|
|
+ JSONObject ruleData = getRuleData(relateId, promoterId, ruleId, orderNum, validOrderNum, yesterdayOrderNum, yesterdayValidOrderNum);
|
|
|
+ settlementData.setRuleId(ruleId);
|
|
|
+ settlementData.setRuleName(ruleData.getString("ruleName"));
|
|
|
+ settlementData.setSonRuleId(ruleData.getLong("sonRuleId"));
|
|
|
+ settlementData.setRelateId(relateId);
|
|
|
+ settlementData.setItemIds(itemIds);
|
|
|
+ settlementData.setPromoterId(promoterId);
|
|
|
+ settlementData.setPromoterName(promoterName);
|
|
|
+ settlementData.setItemCreateId(itemCreateId);
|
|
|
+ settlementData.setItemCreateName(itemCreateName);
|
|
|
+ settlementData.setPromoterCreateId(promoterCreateId);
|
|
|
+ settlementData.setPromoterCreateName(promoterCreateName);
|
|
|
+ settlementData.setOrderNum(orderNum);
|
|
|
+ settlementData.setValidOrderNum(validOrderNum);
|
|
|
+ settlementData.setYesterdayOrderNum(yesterdayOrderNum);
|
|
|
+ settlementData.setYesterdayValidOrderNum(yesterdayValidOrderNum);
|
|
|
+ settlementData.setStatDate(statDate);
|
|
|
+ settlementData.setAnchorAmount(ruleData.getBigDecimal("anchorAmount"));
|
|
|
+ settlementData.setReferenceAmount(ruleData.getBigDecimal("referenceAmount"));
|
|
|
+ settlementData.setSettlementStatus(ruleData.getInteger("settlementStatus"));
|
|
|
+ settlementData.setLastSettlementOrderNum(ruleData.getLong("lastSettlementOrderNum"));
|
|
|
+ adds.add(settlementData);
|
|
|
+ }
|
|
|
+ kuaishouRuleSettlementDataMapper.replaceDatas(adds);
|
|
|
+ log.info("结算信息入库完成,时间:{},数据量:{}", statDate, adds.size());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public JSONObject getRuleData(Long relateId, Long promoterId, Long ruleId, Long orderNum, Long validOrderNum, Long yesterdayOrderNum, Long yesterdayValidOrderNum) {
|
|
|
+ JSONObject returnJson = new JSONObject();
|
|
|
+ BigDecimal anchorAmount = new BigDecimal(0); // 达人激励
|
|
|
+ BigDecimal referenceAmount = new BigDecimal(0); // 推荐人激励
|
|
|
+ KuaishouSettlementRules kuaishouSettlementRules = settlementRulesService.selectKuaishouSettlementRulesById(ruleId);
|
|
|
+ returnJson.put("ruleId", ruleId);
|
|
|
+ returnJson.put("ruleName", kuaishouSettlementRules.getRuleName());
|
|
|
+ List<JSONObject> ruleList = kuaishouRuleSettlementDataMapper.getRuleList(ruleId);
|
|
|
+ JSONObject lastRule = kuaishouRuleSettlementDataMapper.lastRule(relateId, promoterId, ruleId); //上次结算命中的规则
|
|
|
+ Long lastValidOrderNum;
|
|
|
+ if (Check.isNull(lastRule)) {
|
|
|
+ lastValidOrderNum = 0L;
|
|
|
+ } else {
|
|
|
+ lastValidOrderNum = lastRule.getLong("lastRule");
|
|
|
+ }
|
|
|
+
|
|
|
+ JSONObject ruleJson = new JSONObject();
|
|
|
+ if (validOrderNum <= lastValidOrderNum) { // 有效订单数据小于等于昨天 不做结算
|
|
|
+ returnJson.put("ruleId", ruleId);
|
|
|
+ returnJson.put("sonRuleId", 0);
|
|
|
+ returnJson.put("ruleName", "未命中结算规则");
|
|
|
+ returnJson.put("anchorAmount", anchorAmount);
|
|
|
+ returnJson.put("referenceAmount", referenceAmount);
|
|
|
+ returnJson.put("settlementStatus", 1);
|
|
|
+ returnJson.put("lastSettlementOrderNum", lastValidOrderNum);
|
|
|
+ return returnJson;
|
|
|
+ } else if (validOrderNum < 10000) { // 单量 小于等于1w 在第一个结算周期内
|
|
|
+ for (int i = 0; i < ruleList.size(); i++) {
|
|
|
+ JSONObject rule = ruleList.get(i);
|
|
|
+ Long startItemCount = rule.getLong("startItemCount");
|
|
|
+ Long endItemCount = rule.getLong("endItemCount");
|
|
|
+ if (validOrderNum >= startItemCount && validOrderNum <= endItemCount) {
|
|
|
+ ruleJson = rule;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (Check.isNull(ruleJson) || ruleJson.size() == 0) {
|
|
|
+ returnJson.put("sonRuleId", 0);
|
|
|
+ returnJson.put("anchorAmount", anchorAmount);
|
|
|
+ returnJson.put("referenceAmount", referenceAmount);
|
|
|
+ returnJson.put("settlementStatus", 1);
|
|
|
+ returnJson.put("lastSettlementOrderNum", lastValidOrderNum);
|
|
|
+ return returnJson;
|
|
|
+ }
|
|
|
+ Integer lastSortCount = null;
|
|
|
+ if (Check.isNull(lastRule)) {
|
|
|
+ lastSortCount = 0;
|
|
|
+ }
|
|
|
+ if (!Check.isNull(lastRule)) {
|
|
|
+ Integer sortCount = lastRule.getInteger("sortCount"); // 上次结算命中的规则序号
|
|
|
+ if (Check.isNull(sortCount)) {
|
|
|
+ lastSortCount = 0;
|
|
|
+ } else {
|
|
|
+ lastSortCount = sortCount;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Integer currentSortCount = ruleJson.getInteger("sortCount"); // 当前结算命中的规则序号
|
|
|
+ if (currentSortCount <= lastSortCount) {
|
|
|
+ returnJson.put("sonRuleId", 0);
|
|
|
+ returnJson.put("anchorAmount", anchorAmount);
|
|
|
+ returnJson.put("referenceAmount", referenceAmount);
|
|
|
+ returnJson.put("settlementStatus", 1);
|
|
|
+ returnJson.put("lastSettlementOrderNum", lastValidOrderNum);
|
|
|
+ return returnJson;
|
|
|
+ } else {
|
|
|
+ JSONObject totalAmount = kuaishouRuleSettlementDataMapper.getTotalAmount(ruleId, lastSortCount, currentSortCount);
|
|
|
+ returnJson.put("sonRuleId", ruleJson.getLong("id"));
|
|
|
+ returnJson.put("anchorAmount", totalAmount.getBigDecimal("anchorAmount"));
|
|
|
+ returnJson.put("referenceAmount", totalAmount.getBigDecimal("referenceAmount"));
|
|
|
+ returnJson.put("settlementStatus", 2);
|
|
|
+ returnJson.put("lastSettlementOrderNum", lastValidOrderNum);
|
|
|
+ return returnJson;
|
|
|
+ }
|
|
|
+ } else if (validOrderNum >= 10000) {
|
|
|
+ System.err.println(validOrderNum);
|
|
|
+ Integer incentivizedCount = (int) Math.floor(validOrderNum / 10000); // 需要 1w单结算次数
|
|
|
+ Integer lastIncentivizedCount = kuaishouRuleSettlementDataMapper.selectIncentiveLog(relateId, promoterId); // 一万单已结算次数
|
|
|
+ if (Check.isNull(lastIncentivizedCount)) {
|
|
|
+ lastIncentivizedCount = 0;
|
|
|
+ }
|
|
|
+ if (incentivizedCount > lastIncentivizedCount) {
|
|
|
+ BigDecimal count = new BigDecimal(incentivizedCount - lastIncentivizedCount);
|
|
|
+ BigDecimal promoterRide = new BigDecimal(700); // 达人破万奖励金额
|
|
|
+ BigDecimal referenceRide = new BigDecimal(100); // 推荐人破万奖励金额
|
|
|
+ BigDecimal promoterIncentiveAmount = count.multiply(promoterRide); // 达人破万单奖励
|
|
|
+ BigDecimal referenceIncentiveAmount = count.multiply(referenceRide); // 推荐人破万单奖励
|
|
|
+ anchorAmount = anchorAmount.add(promoterIncentiveAmount);
|
|
|
+ referenceAmount = referenceAmount.add(referenceIncentiveAmount);
|
|
|
+ kuaishouRuleSettlementDataMapper.replaceIncentiveLog(relateId, promoterId, ruleId, incentivizedCount, lastIncentivizedCount);
|
|
|
+ }
|
|
|
+ if (Check.isNull(lastRule)) { //查询到上次命中的结算规则 则代表为新结算用户
|
|
|
+ JSONObject getTotalByCountAndRuleId = kuaishouRuleSettlementDataMapper.getTotalByCountAndRuleId(incentivizedCount, ruleId);
|
|
|
+ if (!Check.isNull(getTotalByCountAndRuleId)) {
|
|
|
+ anchorAmount = anchorAmount.add(getTotalByCountAndRuleId.getBigDecimal("anchorAmount"));
|
|
|
+ referenceAmount = referenceAmount.add(getTotalByCountAndRuleId.getBigDecimal("referenceAmount"));
|
|
|
+ }
|
|
|
+ BigDecimal decValidOrderNum = new BigDecimal(validOrderNum);
|
|
|
+ Long residueNum = decValidOrderNum.subtract(new BigDecimal(incentivizedCount).multiply(new BigDecimal(10000))).longValue(); // 新用户 剩余不到1w单的结算
|
|
|
+ for (int i = 0; i < ruleList.size(); i++) {
|
|
|
+ JSONObject rule = ruleList.get(i);
|
|
|
+ Long startItemCount = rule.getLong("startItemCount");
|
|
|
+ Long endItemCount = rule.getLong("endItemCount");
|
|
|
+ if (residueNum >= startItemCount && residueNum <= endItemCount) {
|
|
|
+ ruleJson = rule;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (Check.isNull(ruleJson) || ruleJson.size() == 0) { // 剩余单量未命中结算规则 直接跳出此次结算计算
|
|
|
+ returnJson.put("sonRuleId", 0);
|
|
|
+ returnJson.put("anchorAmount", anchorAmount);
|
|
|
+ returnJson.put("referenceAmount", referenceAmount);
|
|
|
+ returnJson.put("settlementStatus", 2);
|
|
|
+ returnJson.put("lastSettlementOrderNum", lastValidOrderNum);
|
|
|
+ return returnJson;
|
|
|
+ }
|
|
|
+ Integer currentSortCount = ruleJson.getInteger("sortCount"); // 当前结算命中的规则序号
|
|
|
+ JSONObject totalAmount = kuaishouRuleSettlementDataMapper.getTotalAmount(ruleId, 0, currentSortCount); // 新的规则 序号从0开始
|
|
|
+ returnJson.put("sonRuleId", ruleJson.getLong("id"));
|
|
|
+ anchorAmount = anchorAmount.add(totalAmount.getBigDecimal("anchorAmount"));
|
|
|
+ referenceAmount = referenceAmount.add(totalAmount.getBigDecimal("referenceAmount"));
|
|
|
+ returnJson.put("anchorAmount", anchorAmount);
|
|
|
+ returnJson.put("referenceAmount", referenceAmount);
|
|
|
+ returnJson.put("settlementStatus", 2);
|
|
|
+ returnJson.put("lastSettlementOrderNum", lastValidOrderNum);
|
|
|
+ return returnJson;
|
|
|
+ } else { // 非新结算达人
|
|
|
+ if (validOrderNum <= lastValidOrderNum) { // 当前结算有效订单 小于等于上次结算有效订单数 则不参与接下来的结算
|
|
|
+ returnJson.put("sonRuleId", 0);
|
|
|
+ returnJson.put("anchorAmount", 0);
|
|
|
+ returnJson.put("referenceAmount", 0);
|
|
|
+ returnJson.put("settlementStatus", 1);
|
|
|
+ returnJson.put("lastSettlementOrderNum", lastValidOrderNum);
|
|
|
+ return returnJson;
|
|
|
+ }
|
|
|
+ Integer lastSortCount = lastRule.getInteger("sortCount"); // 上次结算命中的规则序号
|
|
|
+ Integer ruleMaxCount = kuaishouRuleSettlementDataMapper.getMaxRuleCountByRuleId(ruleId); // 当前规则下最大的序号
|
|
|
+ Long complement = null;
|
|
|
+ if (lastValidOrderNum > 10000) {
|
|
|
+ String lastValidOrderNumStr = String.valueOf(lastValidOrderNum);
|
|
|
+ String substring = lastValidOrderNumStr.substring(lastValidOrderNumStr.length() - 4);
|
|
|
+ Long aLong = Long.valueOf(substring);
|
|
|
+ complement = 10000 - aLong;
|
|
|
+ } else {
|
|
|
+ complement = 10000 - lastValidOrderNum;
|
|
|
+ }
|
|
|
+ // 查询 上次结算补齐10000w需要激励的金额
|
|
|
+ JSONObject totalAmount = kuaishouRuleSettlementDataMapper.getTotalAmount(ruleId, lastSortCount, ruleMaxCount);
|
|
|
+ anchorAmount = anchorAmount.add(totalAmount.getBigDecimal("anchorAmount"));
|
|
|
+ referenceAmount = referenceAmount.add(totalAmount.getBigDecimal("referenceAmount"));
|
|
|
+ Long newValidOrderNum = validOrderNum - complement - lastValidOrderNum;
|
|
|
+ if (newValidOrderNum > 10000) { // 如果剩余单量大于一万单 计算完成1w周期内的结算金额
|
|
|
+ Integer newSettlementCount = (int) Math.floor(newValidOrderNum / 10000); // 补齐上次结算10000单后需要结算的完整次数
|
|
|
+ JSONObject totalByCountAndRuleId = kuaishouRuleSettlementDataMapper.getTotalByCountAndRuleId(newSettlementCount, ruleId);
|
|
|
+ anchorAmount = anchorAmount.add(totalByCountAndRuleId.getBigDecimal("anchorAmount"));
|
|
|
+ referenceAmount = referenceAmount.add(totalByCountAndRuleId.getBigDecimal("referenceAmount"));
|
|
|
+ newValidOrderNum = newValidOrderNum - (newSettlementCount * 10000);
|
|
|
+ }
|
|
|
+ for (int i = 0; i < ruleList.size(); i++) {
|
|
|
+ JSONObject rule = ruleList.get(i);
|
|
|
+ Long startItemCount = rule.getLong("startItemCount");
|
|
|
+ Long endItemCount = rule.getLong("endItemCount");
|
|
|
+ if (newValidOrderNum >= startItemCount && newValidOrderNum <= endItemCount) {
|
|
|
+ ruleJson = rule;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (Check.isNull(ruleJson) || ruleJson.size() == 0) { // 剩余单量未命中结算规则 直接跳出此次结算计算
|
|
|
+ returnJson.put("sonRuleId", 0);
|
|
|
+ returnJson.put("anchorAmount", anchorAmount);
|
|
|
+ returnJson.put("referenceAmount", referenceAmount);
|
|
|
+ returnJson.put("settlementStatus", 2);
|
|
|
+ returnJson.put("lastSettlementOrderNum", lastValidOrderNum);
|
|
|
+ return returnJson;
|
|
|
+ }
|
|
|
+ Integer currentSortCount = ruleJson.getInteger("sortCount"); // 当前结算命中的规则序号
|
|
|
+ JSONObject amount = kuaishouRuleSettlementDataMapper.getTotalAmount(ruleId, 0, currentSortCount); // 新的规则 序号从0开始
|
|
|
+ returnJson.put("sonRuleId", ruleJson.getLong("id"));
|
|
|
+ anchorAmount = anchorAmount.add(amount.getBigDecimal("anchorAmount"));
|
|
|
+ referenceAmount = referenceAmount.add(amount.getBigDecimal("referenceAmount"));
|
|
|
+ returnJson.put("anchorAmount", anchorAmount);
|
|
|
+ returnJson.put("referenceAmount", referenceAmount);
|
|
|
+ returnJson.put("settlementStatus", 2);
|
|
|
+ returnJson.put("lastSettlementOrderNum", lastValidOrderNum);
|
|
|
+ return returnJson;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return returnJson;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|