diff --git a/src/main/java/com/mixi/common/tasks/MiTuExportScheduledTask.java b/src/main/java/com/mixi/common/tasks/MiTuExportScheduledTask.java index faf45b2..4b65a26 100644 --- a/src/main/java/com/mixi/common/tasks/MiTuExportScheduledTask.java +++ b/src/main/java/com/mixi/common/tasks/MiTuExportScheduledTask.java @@ -2,6 +2,7 @@ package com.mixi.common.tasks; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.mixi.common.tasks.mituExportEntity.*; +import com.mixi.common.utils.CopyUtil; import com.mixi.common.utils.MinioUtil; import com.mixi.mapper.*; import com.mixi.mapper.entity.*; @@ -57,8 +58,8 @@ public class MiTuExportScheduledTask { // weeklySellThrReport(); // WeeklyHeavyStockReport(); // QuarterlyProductGroupingReport(); -// customerTypeAnalysis(); - getBestSell(); + customerTypeAnalysis(); +// getBestSell(); } // public static void main(String[] args) { @@ -1771,6 +1772,9 @@ public class MiTuExportScheduledTask { @Resource private MiTuMemberMapper miTuMemberMapper; + + public Map varianceMap = new HashMap<>(); + public Map mostFrequentColorMap = new HashMap<>(); private List getMemberType(List memberCodeList) { List miTuMemberList = new ArrayList<>(); for (String memberCode : memberCodeList) { @@ -1778,15 +1782,88 @@ public class MiTuExportScheduledTask { continue; } String memberType = getMemberTypeByMemberCode(memberCode); - MiTuMember miTuMember = new MiTuMember(); + MiTuMember member = getMember(memberCode); + MiTuMember miTuMember = CopyUtil.copyObject(member, MiTuMember.class); miTuMember.setMbrCode(memberCode); miTuMember.setMemberType(memberType); miTuMemberList.add(miTuMember); + } + // 计算顾客颜色方差的方差 + // 计算所有顾客方差值的方差 + double overallVariance = calculateOverallVariance(varianceMap); + for (MiTuMember miTuMember : miTuMemberList) { + if (miTuMember.getMemberType() == null) { + if (varianceMap.get(miTuMember.getMbrCode()) < overallVariance) { + miTuMember.setMemberType("Type D"); + miTuMember.setMostFrequentColor(mostFrequentColorMap.get(miTuMember.getMbrCode())); + }else { + miTuMember.setMemberType("Type S"); + } + } miTuMemberMapper.insert(miTuMember); } return miTuMemberList; } + private MiTuMember getMember(String memberCode) { + MiTuMember member = new MiTuMember(); + Connection conn = null; + Statement stmt = null; + try { + // 注册 JDBC 驱动器 + Class.forName(JDBC_DRIVER); + + // 打开一个连接 + System.out.println("连接数据库..."); + conn = DriverManager.getConnection(DB_URL, USER, PASS); + + // 执行查询 + System.out.println("创建声明..."); + stmt = conn.createStatement(); + String sql; + sql = "SELECT * FROM V_RW0095B\n" + + "WHERE mbr_code = '" + memberCode + "'"; + + ResultSet rs = stmt.executeQuery(sql); + // 处理结果集 + while (rs.next()) { + member.setMbrCode(rs.getString("mbr_code")); + member.setMbrName(rs.getString("mbr_name")); + member.setMbrMobile(rs.getString("mbr_mobile")); + member.setMbrGroup(rs.getString("mbr_group")); + member.setMbrStatus(rs.getString("mbr_status").charAt(0)); + member.setJoinDate(rs.getDate("join_date").toLocalDate()); + member.setMbrIssue(rs.getString("mbr_issue")); + member.setBirthMonth(rs.getInt("birth_m")); + member.setMbrSex(rs.getString("mbr_sex").charAt(0)); + member.setOffBonus(rs.getDouble("off_bonus")); + member.setEffBonus(rs.getDouble("eff_bonus")); + member.setSumBonus(rs.getDouble("sum_bonus")); + } + + // 清理环境 + rs.close(); + stmt.close(); + conn.close(); + } catch (SQLException | ClassNotFoundException e) { + // 处理异常 + e.printStackTrace(); + } + return member; + } + + private double calculateOverallVariance(Map varianceMap) { + // 计算平均值 + double mean = varianceMap.values().stream().mapToDouble(Double::doubleValue).average().orElse(0.0); + + // 计算方差 + double sumOfSquaredDifferences = varianceMap.values().stream() + .mapToDouble(value -> Math.pow(value - mean, 2)) + .sum(); + + return sumOfSquaredDifferences / varianceMap.size(); + } + private String getMemberTypeByMemberCode(String memberCode) { List transactionList = new ArrayList<>(); Connection conn = null; @@ -1838,10 +1915,10 @@ public class MiTuExportScheduledTask { e.printStackTrace(); } - return analysis(transactionList); + return analysis(transactionList, memberCode); } - private String analysis(List transactionList) { + private String analysis(List transactionList, String memberCode) { int discountNum = 0; int currentSeasonNum = 0; int leadingNum = 0; @@ -1858,9 +1935,15 @@ public class MiTuExportScheduledTask { // 计算每种颜色的出现频率 double mean = (double) totalCount / colorCountMap.size(); double varianceSum = 0; + String mostFrequentColor = null; + int maxCount = 0; for (Map.Entry entry : colorCountMap.entrySet()) { int count = entry.getValue(); varianceSum += Math.pow(count - mean, 2); + if (count > maxCount) { + maxCount = count; + mostFrequentColor = entry.getKey(); + } } // 计算方差 @@ -1879,10 +1962,13 @@ public class MiTuExportScheduledTask { if (currentSeasonNum >= transactionList.size() * 0.7) { return "Type i"; } - if (variance <= 0.2) { - return "Type D"; - } - return "Type S"; + varianceMap.put(memberCode, variance); + mostFrequentColorMap.put(memberCode, mostFrequentColor); + return null; +// if (variance <= 0.2) { +// return "Type D"; +// } +// return "Type S"; } private List getMemberCode() { diff --git a/src/main/java/com/mixi/mapper/entity/MiTuMember.java b/src/main/java/com/mixi/mapper/entity/MiTuMember.java index 2fe01ff..e70c4ab 100644 --- a/src/main/java/com/mixi/mapper/entity/MiTuMember.java +++ b/src/main/java/com/mixi/mapper/entity/MiTuMember.java @@ -27,4 +27,5 @@ public class MiTuMember implements Serializable { private Double effBonus; private Double sumBonus; private String memberType; + private String mostFrequentColor; } diff --git a/src/main/java/com/mixi/service/impl/MiTuExportServiceImpl.java b/src/main/java/com/mixi/service/impl/MiTuExportServiceImpl.java index 0282567..646f450 100644 --- a/src/main/java/com/mixi/service/impl/MiTuExportServiceImpl.java +++ b/src/main/java/com/mixi/service/impl/MiTuExportServiceImpl.java @@ -199,7 +199,5 @@ public class MiTuExportServiceImpl implements MiTuExportService { default : throw new BusinessException("Unknown memberType."); } - -// return null; } }