3
0
Fork 0

## Opt - 业绩独立大小区条件&市场动态列表接口

This commit is contained in:
sangelxiu1 2025-06-13 18:14:13 +08:00
parent 287cc279b4
commit f0a8c658f5
11 changed files with 168 additions and 22 deletions

View File

@ -181,7 +181,6 @@ public class ApiRetailHomePageController extends BaseController {
*/
@PostMapping("/market-dynamics")
public AjaxResult getMarketDynamics(@RequestBody MarketDynamicsQueryDateParam param) {
retailAchieveService.getMarketDynamics(param);
return AjaxResult.success();
return AjaxResult.success(retailAchieveService.getMarketDynamics(param));
}
}

View File

@ -2,8 +2,10 @@ package com.hzs.retail.member.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hzs.common.domain.member.achieve.CuMemberRetailRange;
import com.hzs.retail.member.param.MarketDynamicsQueryDateParam;
import com.hzs.retail.member.vo.CuMemberRetailAchieveVO;
import com.hzs.retail.member.vo.CuMemberRetailDataStatisticsDetailVO;
import com.hzs.retail.member.vo.MarketDynamicsDetailVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@ -174,6 +176,8 @@ public interface CuMemberRetailRangeMapper extends BaseMapper<CuMemberRetailRang
*/
List<CuMemberRetailDataStatisticsDetailVO> getRetailDataStatisticsDetail(CuMemberRetailAchieveVO cuMemberAchieveVO);
List<MarketDynamicsDetailVO> getMarketDynamicsDetail(@Param("param") MarketDynamicsQueryDateParam param);
/**
* 查询当天自己新增盒数
*

View File

@ -6,6 +6,7 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
@Data
@AllArgsConstructor
@ -17,6 +18,7 @@ import java.io.Serializable;
public class MarketDynamicsQueryDateParam implements Serializable {
private Long pkId;
private String nowDate;
private String yesterdayDate;
private String lastMonthDate;
/**
@ -24,10 +26,12 @@ public class MarketDynamicsQueryDateParam implements Serializable {
*/
private String currentMonthTableName;
/**
*
*
*/
private String lastMonthTableName;
private String currentDayTableName;
private List<Long> pkIdList;
/**
* 查询条件 (会员编号/会员姓名)
*/

View File

@ -3,6 +3,7 @@ package com.hzs.retail.member.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hzs.common.domain.member.achieve.CuMemberRetailRange;
import com.hzs.retail.member.param.MarketDynamicsQueryDateParam;
import com.hzs.retail.member.utils.PageResult;
import com.hzs.retail.member.vo.CuMemberRetailAchieveVO;
import com.hzs.retail.member.vo.CuMemberRetailDataStatisticsDetailVO;
import com.hzs.retail.member.vo.CuMemberRetailDataStatisticsResultVO;
@ -114,5 +115,5 @@ public interface ICuMemberRetailAchieveService extends IService<CuMemberRetailRa
*/
CuMemberRetailDataStatisticsResultVO getRetailDataStatisticsDetail(Long pkMember, Integer pkCountry, Integer systemType);
List<MarketDynamicsDetailVO> getMarketDynamics(MarketDynamicsQueryDateParam param);
PageResult<MarketDynamicsDetailVO> getMarketDynamics(MarketDynamicsQueryDateParam param);
}

View File

@ -19,6 +19,7 @@ import com.hzs.retail.member.mapper.CuMemberRetailRangeMapper;
import com.hzs.retail.member.param.MarketDynamicsQueryDateParam;
import com.hzs.retail.member.service.ICuMemberRetailAchieveService;
import com.hzs.retail.member.utils.DataStatisticsUtil;
import com.hzs.retail.member.utils.PageResult;
import com.hzs.retail.member.vo.CuMemberRetailAchieveVO;
import com.hzs.retail.member.vo.CuMemberRetailDataStatisticsDetailVO;
import com.hzs.retail.member.vo.CuMemberRetailDataStatisticsResultVO;
@ -307,18 +308,20 @@ public class CuMemberRetailAchieveServiceImpl extends ServiceImpl<CuMemberRetail
*/
private String getTableName() {
String localDate = LocalDate.now().minus(1, ChronoUnit.DAYS).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
int period = iCuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(localDate).getPkId();
if(ObjectUtil.isEmpty(period)){
CuMemberSettlePeriod cuMemberSettlePeriod =iCuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(localDate);
if(ObjectUtil.isEmpty(cuMemberSettlePeriod)){
return null;
}
int period = cuMemberSettlePeriod.getPkId();
return TableNameConstants.CU_MEMBER_RETAIL_RANGE + period;
}
private String getDayTableName() {
String localDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
int period = iCuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(localDate).getPkId();
if(ObjectUtil.isEmpty(period)){
CuMemberSettlePeriod cuMemberSettlePeriod =iCuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(localDate);
if(ObjectUtil.isEmpty(cuMemberSettlePeriod)){
return null;
}
int period = cuMemberSettlePeriod.getPkId();
return TableNameConstants.CU_MEMBER_RETAIL_S + period;
}
@ -586,19 +589,26 @@ public class CuMemberRetailAchieveServiceImpl extends ServiceImpl<CuMemberRetail
}
@Override
public List<MarketDynamicsDetailVO> getMarketDynamics(MarketDynamicsQueryDateParam param) {
public PageResult<MarketDynamicsDetailVO> getMarketDynamics(MarketDynamicsQueryDateParam param) {
Long pkMember = SecurityUtils.getUserId();
Integer systemType = SecurityUtils.getSystemType();
DataStatisticsUtil.setQueryDateParam(param);
param.setCurrentDayTableName(getDayTableName());
param.setCurrentMonthTableName(getDayTableName(param.getNowDate()));
param.setCurrentDayTableName(getDayTableName(param.getLastMonthDate()));
param.setCurrentMonthTableName(getDayTableName(param.getYesterdayDate()));
param.setLastMonthTableName(getDayTableName(param.getLastMonthDate()));
log.info("MarketDynamicsQueryDateParam : {}", JSONUtil.toJsonStr(param));
return Collections.emptyList();
List<Long> pkMemberList = baseMapper.selectDirectPushByPkMember(pkMember, systemType);
param.setPkIdList(pkMemberList);
List<MarketDynamicsDetailVO> detailVOList = baseMapper.getMarketDynamicsDetail(param);
log.info("detailVOList : {}", JSONUtil.toJsonStr(detailVOList));
return DataStatisticsUtil.getMarketDynamicsAssemblyData(detailVOList, param);
}
private String getDayTableName(String localDate) {
CuMemberSettlePeriod cuMemberSettlePeriod = iCuMemberSettlePeriodService.getCuMemberSettlePeriodByDate(localDate);
if(ObjectUtil.isEmpty(cuMemberSettlePeriod)){
return null;
return TableNameConstants.CU_MEMBER_RETAIL_RANGE;
}
int period = cuMemberSettlePeriod.getPkId();
return TableNameConstants.CU_MEMBER_RETAIL_RANGE + period;

View File

@ -1,11 +1,13 @@
package com.hzs.retail.member.utils;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.hzs.common.core.enums.EYesNo;
import com.hzs.common.domain.member.base.CuMember;
import com.hzs.retail.member.param.MarketDynamicsQueryDateParam;
import com.hzs.retail.member.vo.CuMemberRetailDataStatisticsDetailVO;
import com.hzs.retail.member.vo.CuMemberRetailDataStatisticsResultVO;
import com.hzs.retail.member.vo.MarketDynamicsDetailVO;
import java.math.BigDecimal;
import java.math.RoundingMode;
@ -17,6 +19,7 @@ import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 用户统计数据工具
@ -49,7 +52,8 @@ public class DataStatisticsUtil {
calcDetailVOTotalField(detailVOList, pkId);
addVirtualBranch(detailVOList, pkId);
CuMemberRetailDataStatisticsDetailVO total = getDetailVOByPKID(detailVOList, pkId);
CuMemberRetailDataStatisticsDetailVO bigRange = getBigRangeDetailVO(detailVOList, pkId);
CuMemberRetailDataStatisticsDetailVO bigRangeBox = getBigRangeBoxDetailVO(detailVOList, pkId);
CuMemberRetailDataStatisticsDetailVO bigRangePv = getBigRangePVDetailVO(detailVOList, pkId);
if(EYesNo.NO.getIntValue() == cuMember.getIsActivate()){
// 昨日非激活 排除昨日日结表数据
excludeDailySettlementData(detailVOList);
@ -57,19 +61,19 @@ public class DataStatisticsUtil {
// 排除注水数据
excludeWaterInjectionData(detailVOList, pkId);
}
Integer smallRangeTotalBoxNum = total.getTotalBoxNum() - bigRange.getTotalBoxNum();
Integer smallRangeTotalBoxNum = total.getTotalBoxNum() - bigRangeBox.getTotalBoxNum();
if(smallRangeTotalBoxNum < 0){
smallRangeTotalBoxNum = 0;
}
BigDecimal smallRangeTotalPv = total.getTotalPv().subtract(bigRange.getTotalPv());
BigDecimal smallRangeTotalPv = total.getTotalPv().subtract(bigRangePv.getTotalPv());
if(smallRangeTotalPv.compareTo(BigDecimal.ZERO) < 0){
smallRangeTotalPv = BigDecimal.ZERO;
}
return CuMemberRetailDataStatisticsResultVO.builder()
.totalBoxNum(total.getTotalBoxNum())
.totalPv(formatPV(total.getTotalPv()))
.bigRangeTotalBoxNum(bigRange.getTotalBoxNum())
.bigRangeTotalPv(formatPV(bigRange.getTotalPv()))
.bigRangeTotalBoxNum(bigRangeBox.getTotalBoxNum())
.bigRangeTotalPv(formatPV(bigRangePv.getTotalPv()))
.smallRangeTotalBoxNum(smallRangeTotalBoxNum)
.smallRangeTotalPv(formatPV(smallRangeTotalPv))
.build();
@ -219,6 +223,23 @@ public class DataStatisticsUtil {
return detailVOList.parallelStream().filter(o -> o.getPkId().equals(pkId)).findFirst().orElse(null);
}
/**
* 组装市场动态列表数据
* @param detailVOList
*/
public static PageResult<MarketDynamicsDetailVO> getMarketDynamicsAssemblyData(List<MarketDynamicsDetailVO> detailVOList, MarketDynamicsQueryDateParam param){
if(StrUtil.isNotEmpty(param.getKeyWords())){
detailVOList = detailVOList.parallelStream().filter(o -> param.getKeyWords().contains(o.getMemberCode()) || param.getKeyWords().contains(o.getMemberName())).collect(Collectors.toList());
}
MarketDynamicsDetailVO bigRange = detailVOList.parallelStream()
.max(Comparator.comparingInt(MarketDynamicsDetailVO::getTotalBoxNum))
.orElse(null);
detailVOList = detailVOList.parallelStream().filter(o -> !o.getPkId().equals(bigRange.getPkId())).collect(Collectors.toList());
PageResult<MarketDynamicsDetailVO> result = MemoryPageUtils.paginate(detailVOList, param.getPageNum(), param.getPageSize());
result.setBigRange(bigRange);
return result;
}
private static Integer getMaxTotalBoxNum(List<CuMemberRetailDataStatisticsDetailVO> detailVOList) {
return detailVOList.parallelStream()
.map(CuMemberRetailDataStatisticsDetailVO::getTotalBoxNum)
@ -226,12 +247,18 @@ public class DataStatisticsUtil {
.max(Integer::compare)
.orElse(null);
}
private static CuMemberRetailDataStatisticsDetailVO getBigRangeDetailVO(List<CuMemberRetailDataStatisticsDetailVO> detailVOList, Long pkId){
return detailVOList.parallelStream()
private static CuMemberRetailDataStatisticsDetailVO getBigRangeBoxDetailVO(List<CuMemberRetailDataStatisticsDetailVO> detailVOList, Long pkId){
return detailVOList.stream()
.filter(vo -> vo.getTotalBoxNum() != null && !vo.getPkId().equals(pkId))
.max(Comparator.comparingInt(CuMemberRetailDataStatisticsDetailVO::getTotalBoxNum))
.orElse(null);
}
private static CuMemberRetailDataStatisticsDetailVO getBigRangePVDetailVO(List<CuMemberRetailDataStatisticsDetailVO> detailVOList, Long pkId){
return detailVOList.stream()
.filter(vo -> vo.getTotalBoxNum() != null && !vo.getPkId().equals(pkId))
.max(Comparator.comparing(CuMemberRetailDataStatisticsDetailVO::getTotalPv))
.orElse(null);
}
public static BigDecimal formatPV(BigDecimal pv){
return pv.divide(
new BigDecimal("10000"),
@ -242,9 +269,11 @@ public class DataStatisticsUtil {
public static void setQueryDateParam(MarketDynamicsQueryDateParam param){
LocalDate.now(ZoneId.of("Asia/Shanghai"));
LocalDate currentDate = LocalDate.now();
LocalDate yesterdayDate = currentDate.minusDays(1);
LocalDate previousMonthDate = currentDate.minusMonths(1);
LocalDate lastDayOfPreviousMonth = previousMonthDate.with(TemporalAdjusters.lastDayOfMonth());
param.setNowDate(currentDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
param.setYesterdayDate(yesterdayDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
param.setLastMonthDate(lastDayOfPreviousMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
// System.out.println("当前日期: " + currentDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
// System.out.println("上一个月最后一天: " + lastDayOfPreviousMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));

View File

@ -0,0 +1,24 @@
package com.hzs.retail.member.utils;
import java.util.ArrayList;
import java.util.List;
public class MemoryPageUtils {
public static <T> PageResult<T> paginate(List<T> dataList, int pageNum, int pageSize) {
// 校验参数有效性
if (pageNum <= 0) pageNum = 1;
if (pageSize <= 0) pageSize = 10; // 默认每页10条
int total = dataList.size();
int start = (pageNum - 1) * pageSize;
if (start >= total) {
return new PageResult<>(total, new ArrayList<>());
}
// 计算结束索引避免超出列表长度
int end = Math.min(start + pageSize, total);
List<T> pageData = dataList.subList(start, end);
return new PageResult<>(total, pageData);
}
}

View File

@ -0,0 +1,20 @@
package com.hzs.retail.member.utils;
import com.hzs.retail.member.vo.MarketDynamicsDetailVO;
import lombok.Data;
import java.util.List;
@Data
public class PageResult<T> {
private long total;
private List<T> rows;
private MarketDynamicsDetailVO bigRange;
public PageResult(long total, List<T> rows) {
this.total = total;
this.rows = rows;
}
// getter/setter 省略
}

View File

@ -105,5 +105,13 @@ public class CuMemberRetailDataStatisticsDetailVO implements Serializable {
*/
private Integer smallBoxNum;
@Override
public CuMemberRetailDataStatisticsDetailVO clone() {
try {
return (CuMemberRetailDataStatisticsDetailVO) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}

View File

@ -17,6 +17,10 @@ import java.math.BigDecimal;
* 市场动态列表对象
*/
public class MarketDynamicsDetailVO implements Serializable {
/**
* 用户ID
*/
private Long pkId;
/**
* 用户编号
*/
@ -28,11 +32,13 @@ public class MarketDynamicsDetailVO implements Serializable {
/**
* 结算等级
*/
private String pkSettleGrade;
private Integer pkSettleGrade;
private String gradeName;
/**
* 真实奖衔
*/
private String pkAwards;
private Integer pkAwards;
private String awardsName;
/**
* 今日业绩
@ -71,4 +77,9 @@ public class MarketDynamicsDetailVO implements Serializable {
* 上月盒数
*/
private Integer lastMonthBoxNum;
/**
* 累计消费盒数
*/
private Integer totalBoxNum;
}

View File

@ -872,4 +872,40 @@
</if>
</where>
</select>
<select id="getMarketDynamicsDetail" resultType="com.hzs.retail.member.vo.MarketDynamicsDetailVO">
SELECT
cu.pk_id,
cu.MEMBER_CODE,
cu.MEMBER_NAME,
cu.PK_SETTLE_GRADE,
grade.GRADE_NAME,
cu.PK_AWARDS,
awards.AWARDS_NAME,
currentMonth.ENABLE_STATUS,
NVL( currentDay.NEW_CONSUME_PV + currentDay.TEAM_NEW_PV, 0 ) todayPv,
NVL( currentDay.NEW_BOX_NUM + currentDay.TEAM_NEW_BOX_NUM, 0 ) todayBoxNum,
NVL( currentMonth.NEW_CONSUME_PV + currentMonth.TEAM_NEW_PV, 0 ) yesterdayPv,
NVL( currentMonth.NEW_BOX_NUM + currentMonth.TEAM_NEW_BOX_NUM, 0 ) yesterdayBoxNum,
NVL( currentMonth.MONTH_CONSUME_PV, 0 ) currentMonthPv,
NVL( currentMonth.MONTH_BOX_NUM , 0 ) currentMonthBoxNum,
NVL( lastMonth.MONTH_CONSUME_PV, 0 ) lastMonthPv,
NVL( lastMonth.MONTH_BOX_NUM, 0 ) lastMonthBoxNum,
NVL( currentMonth.CONSUME_BOX_NUM + currentDay.NEW_BOX_NUM + currentDay.TEAM_NEW_BOX_NUM, 0 ) totalBoxNum
FROM
cu_member cu
LEFT JOIN ${param.currentDayTableName} currentDay ON cu.PK_ID = currentDay.PK_MEMBER
LEFT JOIN ${param.currentMonthTableName} currentMonth ON cu.PK_ID = currentMonth.PK_MEMBER AND cu.CATEGORY = 0
LEFT JOIN ${param.lastMonthTableName} lastMonth ON cu.PK_ID = lastMonth.PK_MEMBER AND cu.CATEGORY = 0
LEFT JOIN BD_GRADE grade on grade.PK_ID = cu.PK_SETTLE_GRADE
LEFT JOIN BD_AWARDS awards on awards.PK_ID = cu.PK_AWARDS
<where>
<if test="param.pkIdList != null and param.pkIdList.size > 0">
cu.pk_id in
<foreach collection="param.pkIdList" item="pkMember" separator="," open="(" close=")">
#{pkMember}
</foreach>
</if>
</where>
order by totalBoxNum desc, todayPv desc, cu.CREATION_TIME desc, cu.pk_id asc
</select>
</mapper>