From f335f052e8da4812e813d172a0f4ece0dd17f017 Mon Sep 17 00:00:00 2001 From: "@t2652009480" <2652009480@qq.com> Date: Fri, 16 Aug 2024 17:57:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E5=AD=97=E8=90=A5=E9=94=80=E5=AE=9E?= =?UTF-8?q?=E8=AE=AD=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StuDigitalMarketingModelController.java | 80 ++- .../marketing/entity/StuSpendingLevel.java | 64 +++ .../entity/StuSpendingLevelExample.java | 499 ++++++++++++++++++ .../marketing/entity/dto/AnalyzeDataDTO.java | 18 + .../entity/dto/ClusterScatterPlotDTO.java | 23 + .../mapper/StuSelectIndicatorsMapper.java | 2 +- .../mapper/StuSpendingLevelMapper.java | 35 ++ .../marketing/mapper/StuTableNameMapper.java | 2 +- .../mapper/StuUserAttributeMapper.java | 4 + .../mapper/StuUserBehaviorMapper.java | 2 + .../StuUserConsumptionAbilityMapper.java | 2 + .../mapper/StuUserLoginActiveMapper.java | 2 + .../StuDigitalMarketingModelService.java | 3 +- .../StuDigitalMarketingModelServiceImpl.java | 52 +- .../sztzjy/marketing/util/DataConverter.java | 29 + .../marketing/util/algorithm/KMeans.java | 23 +- .../mappers/StuSpendingLevelMapper.xml | 218 ++++++++ .../resources/mappers/StuTableNameMapper.xml | 1 + .../mappers/StuUserAttributeMapper.xml | 7 + .../mappers/StuUserBehaviorMapper.xml | 10 +- .../StuUserConsumptionAbilityMapper.xml | 10 +- .../mappers/StuUserLoginActiveMapper.xml | 10 +- 22 files changed, 1047 insertions(+), 49 deletions(-) create mode 100644 src/main/java/com/sztzjy/marketing/entity/StuSpendingLevel.java create mode 100644 src/main/java/com/sztzjy/marketing/entity/StuSpendingLevelExample.java create mode 100644 src/main/java/com/sztzjy/marketing/entity/dto/AnalyzeDataDTO.java create mode 100644 src/main/java/com/sztzjy/marketing/entity/dto/ClusterScatterPlotDTO.java create mode 100644 src/main/java/com/sztzjy/marketing/mapper/StuSpendingLevelMapper.java create mode 100644 src/main/java/com/sztzjy/marketing/util/DataConverter.java create mode 100644 src/main/resources/mappers/StuSpendingLevelMapper.xml diff --git a/src/main/java/com/sztzjy/marketing/controller/stu/StuDigitalMarketingModelController.java b/src/main/java/com/sztzjy/marketing/controller/stu/StuDigitalMarketingModelController.java index 22a963f..a14a448 100644 --- a/src/main/java/com/sztzjy/marketing/controller/stu/StuDigitalMarketingModelController.java +++ b/src/main/java/com/sztzjy/marketing/controller/stu/StuDigitalMarketingModelController.java @@ -2,15 +2,19 @@ package com.sztzjy.marketing.controller.stu; import com.sztzjy.marketing.annotation.AnonymousAccess; import com.sztzjy.marketing.config.exception.handler.DigitalEconomyxception; +import com.sztzjy.marketing.entity.StuSpendingLevel; import com.sztzjy.marketing.entity.StuTrainingOperateStepExample; import com.sztzjy.marketing.entity.StuTrainingOperateStepWithBLOBs; import com.sztzjy.marketing.entity.dto.*; +import com.sztzjy.marketing.mapper.StuSpendingLevelMapper; import com.sztzjy.marketing.service.StuDigitalMarketingModelService; +import com.sztzjy.marketing.util.DataConverter; import com.sztzjy.marketing.util.ResultEntity; import com.sztzjy.marketing.util.algorithm.Apriori; import com.sztzjy.marketing.util.algorithm.KMeans; import com.sztzjy.marketing.util.algorithm.LinearRegression; import com.sztzjy.marketing.util.algorithm.LogisticRegression; +import com.sztzjy.marketing.util.excel.ImportExcelUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; @@ -43,6 +47,8 @@ public class StuDigitalMarketingModelController { @Resource StuDigitalMarketingModelService modelService; + @Resource + StuSpendingLevelMapper stuSpendingLevelMapper; @ApiOperation("选择指标--下拉框") @PostMapping("/dropdownBox") @@ -65,11 +71,9 @@ public class StuDigitalMarketingModelController { @ApiOperation("选择指标--分析数据展示") @PostMapping("/viewAnalyzeData") @AnonymousAccess - public ResultEntity viewAnalyzeData(@ApiParam("用户ID") String userId, - @ApiParam("表格名") String tableName, - @ApiParam("指标列表") @RequestParam List fieldList) { + public ResultEntity viewAnalyzeData(@RequestBody AnalyzeDataDTO analyzeDataDTO) { - return modelService.viewAnalyzeData(userId,tableName,fieldList); + return modelService.viewAnalyzeData(analyzeDataDTO); } @@ -91,7 +95,7 @@ public class StuDigitalMarketingModelController { @AnonymousAccess public ResultEntity descriptiveStatistics(@ApiParam("数据集、需要计算的方式、用户ID")@RequestBody StatisticsDTO statisticsDTO) { - Map> map = statisticsDTO.getMap(); + Map> map = statisticsDTO.getMap(); List statistic = statisticsDTO.getStatistic(); String userId = statisticsDTO.getUserId(); @@ -102,17 +106,13 @@ public class StuDigitalMarketingModelController { @ApiOperation("聚类分析--散点图") @PostMapping("/clusterScatterPlot") @AnonymousAccess - public ResultEntity clusterScatterPlot(@ApiParam("簇数") Integer k, - @ApiParam("最大迭代次数") Integer t, - @ApiParam("最大迭代次数") String userId, - @RequestParam(required = false) @RequestPart MultipartFile file) { + public ResultEntity clusterScatterPlot(@RequestBody ClusterScatterPlotDTO clusterScatterPlotDTO) { -// //验证文件类型 -// if (!file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")).equals(".xls") && !file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")).equals(".xlsx")) { -// return new ResultEntity(HttpStatus.ACCEPTED, "文件类型有误!请上传Excel文件"); -// } + Integer t = clusterScatterPlotDTO.getT(); + Integer k = clusterScatterPlotDTO.getK(); + List> deduplicatedDataList = clusterScatterPlotDTO.getDeduplicatedDataList(); - List irisData = readIrisData(file); + List irisData = readIrisData(deduplicatedDataList); //获取数据集 KMeans kMeans = new KMeans(k, t, irisData); @@ -233,4 +233,56 @@ public class StuDigitalMarketingModelController { return modelService.emotionalAnalysis(userId,modelType,content); } + + @ApiOperation("批量导入") + @PostMapping("/batchImport") + @AnonymousAccess + public ResultEntity batchImport(@RequestPart MultipartFile file) { + + //验证文件类型 + if (!file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")).equals(".xls") && !file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")).equals(".xlsx")) { + return new ResultEntity<>(HttpStatus.ACCEPTED, "文件类型有误!请上传Excel文件"); + } + + + + try { + List stuSpendingLevels=new ArrayList<>(); + + //获取数据 + List> listByExcel = ImportExcelUtil.getListByExcel(file.getInputStream(), file.getOriginalFilename()); + //封装数据 + for (int i = 0; i < listByExcel.size(); i++) { + List list = listByExcel.get(i); + if (list.get(0) == "" || ("序号").equals(list.get(0))) { + continue; + } + + + + StuSpendingLevel stuSpendingLevel=new StuSpendingLevel(); + stuSpendingLevel.setId(Integer.valueOf((String) list.get(0))); + stuSpendingLevel.setGender(Integer.valueOf((String) list.get(0))); + stuSpendingLevel.setAge(Integer.valueOf((String) list.get(0))); + stuSpendingLevel.setAnnualIncome(Integer.valueOf((String) list.get(0))); + stuSpendingLevel.setSpendingScore(Integer.valueOf((String) list.get(0))); + + + + stuSpendingLevels.add(stuSpendingLevel); + } + stuSpendingLevelMapper.addList(stuSpendingLevels); + + + } catch (Exception e) { + e.printStackTrace(); + }finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + return new ResultEntity(HttpStatus.OK,"成功"); + } } diff --git a/src/main/java/com/sztzjy/marketing/entity/StuSpendingLevel.java b/src/main/java/com/sztzjy/marketing/entity/StuSpendingLevel.java new file mode 100644 index 0000000..784a73e --- /dev/null +++ b/src/main/java/com/sztzjy/marketing/entity/StuSpendingLevel.java @@ -0,0 +1,64 @@ +package com.sztzjy.marketing.entity; + +import io.swagger.annotations.ApiModelProperty; +/** + * + * @author whb + * stu_spending_level + */ +public class StuSpendingLevel { + @ApiModelProperty("ID") + private Integer id; + + @ApiModelProperty("性别(1、男 2、女)") + private Integer gender; + + @ApiModelProperty("年龄") + private Integer age; + + @ApiModelProperty("年收入(万)") + private Integer annualIncome; + + @ApiModelProperty("消费水平(1-100)") + private Integer spendingScore; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getGender() { + return gender; + } + + public void setGender(Integer gender) { + this.gender = gender; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public Integer getAnnualIncome() { + return annualIncome; + } + + public void setAnnualIncome(Integer annualIncome) { + this.annualIncome = annualIncome; + } + + public Integer getSpendingScore() { + return spendingScore; + } + + public void setSpendingScore(Integer spendingScore) { + this.spendingScore = spendingScore; + } +} \ No newline at end of file diff --git a/src/main/java/com/sztzjy/marketing/entity/StuSpendingLevelExample.java b/src/main/java/com/sztzjy/marketing/entity/StuSpendingLevelExample.java new file mode 100644 index 0000000..2776b29 --- /dev/null +++ b/src/main/java/com/sztzjy/marketing/entity/StuSpendingLevelExample.java @@ -0,0 +1,499 @@ +package com.sztzjy.marketing.entity; + +import java.util.ArrayList; +import java.util.List; + +public class StuSpendingLevelExample { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + public StuSpendingLevelExample() { + oredCriteria = new ArrayList<>(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList<>(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Integer value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Integer value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Integer value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Integer value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Integer value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Integer value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Integer value1, Integer value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Integer value1, Integer value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andGenderIsNull() { + addCriterion("gender is null"); + return (Criteria) this; + } + + public Criteria andGenderIsNotNull() { + addCriterion("gender is not null"); + return (Criteria) this; + } + + public Criteria andGenderEqualTo(Integer value) { + addCriterion("gender =", value, "gender"); + return (Criteria) this; + } + + public Criteria andGenderNotEqualTo(Integer value) { + addCriterion("gender <>", value, "gender"); + return (Criteria) this; + } + + public Criteria andGenderGreaterThan(Integer value) { + addCriterion("gender >", value, "gender"); + return (Criteria) this; + } + + public Criteria andGenderGreaterThanOrEqualTo(Integer value) { + addCriterion("gender >=", value, "gender"); + return (Criteria) this; + } + + public Criteria andGenderLessThan(Integer value) { + addCriterion("gender <", value, "gender"); + return (Criteria) this; + } + + public Criteria andGenderLessThanOrEqualTo(Integer value) { + addCriterion("gender <=", value, "gender"); + return (Criteria) this; + } + + public Criteria andGenderIn(List values) { + addCriterion("gender in", values, "gender"); + return (Criteria) this; + } + + public Criteria andGenderNotIn(List values) { + addCriterion("gender not in", values, "gender"); + return (Criteria) this; + } + + public Criteria andGenderBetween(Integer value1, Integer value2) { + addCriterion("gender between", value1, value2, "gender"); + return (Criteria) this; + } + + public Criteria andGenderNotBetween(Integer value1, Integer value2) { + addCriterion("gender not between", value1, value2, "gender"); + return (Criteria) this; + } + + public Criteria andAgeIsNull() { + addCriterion("age is null"); + return (Criteria) this; + } + + public Criteria andAgeIsNotNull() { + addCriterion("age is not null"); + return (Criteria) this; + } + + public Criteria andAgeEqualTo(Integer value) { + addCriterion("age =", value, "age"); + return (Criteria) this; + } + + public Criteria andAgeNotEqualTo(Integer value) { + addCriterion("age <>", value, "age"); + return (Criteria) this; + } + + public Criteria andAgeGreaterThan(Integer value) { + addCriterion("age >", value, "age"); + return (Criteria) this; + } + + public Criteria andAgeGreaterThanOrEqualTo(Integer value) { + addCriterion("age >=", value, "age"); + return (Criteria) this; + } + + public Criteria andAgeLessThan(Integer value) { + addCriterion("age <", value, "age"); + return (Criteria) this; + } + + public Criteria andAgeLessThanOrEqualTo(Integer value) { + addCriterion("age <=", value, "age"); + return (Criteria) this; + } + + public Criteria andAgeIn(List values) { + addCriterion("age in", values, "age"); + return (Criteria) this; + } + + public Criteria andAgeNotIn(List values) { + addCriterion("age not in", values, "age"); + return (Criteria) this; + } + + public Criteria andAgeBetween(Integer value1, Integer value2) { + addCriterion("age between", value1, value2, "age"); + return (Criteria) this; + } + + public Criteria andAgeNotBetween(Integer value1, Integer value2) { + addCriterion("age not between", value1, value2, "age"); + return (Criteria) this; + } + + public Criteria andAnnualIncomeIsNull() { + addCriterion("annual_income is null"); + return (Criteria) this; + } + + public Criteria andAnnualIncomeIsNotNull() { + addCriterion("annual_income is not null"); + return (Criteria) this; + } + + public Criteria andAnnualIncomeEqualTo(Integer value) { + addCriterion("annual_income =", value, "annualIncome"); + return (Criteria) this; + } + + public Criteria andAnnualIncomeNotEqualTo(Integer value) { + addCriterion("annual_income <>", value, "annualIncome"); + return (Criteria) this; + } + + public Criteria andAnnualIncomeGreaterThan(Integer value) { + addCriterion("annual_income >", value, "annualIncome"); + return (Criteria) this; + } + + public Criteria andAnnualIncomeGreaterThanOrEqualTo(Integer value) { + addCriterion("annual_income >=", value, "annualIncome"); + return (Criteria) this; + } + + public Criteria andAnnualIncomeLessThan(Integer value) { + addCriterion("annual_income <", value, "annualIncome"); + return (Criteria) this; + } + + public Criteria andAnnualIncomeLessThanOrEqualTo(Integer value) { + addCriterion("annual_income <=", value, "annualIncome"); + return (Criteria) this; + } + + public Criteria andAnnualIncomeIn(List values) { + addCriterion("annual_income in", values, "annualIncome"); + return (Criteria) this; + } + + public Criteria andAnnualIncomeNotIn(List values) { + addCriterion("annual_income not in", values, "annualIncome"); + return (Criteria) this; + } + + public Criteria andAnnualIncomeBetween(Integer value1, Integer value2) { + addCriterion("annual_income between", value1, value2, "annualIncome"); + return (Criteria) this; + } + + public Criteria andAnnualIncomeNotBetween(Integer value1, Integer value2) { + addCriterion("annual_income not between", value1, value2, "annualIncome"); + return (Criteria) this; + } + + public Criteria andSpendingScoreIsNull() { + addCriterion("spending_score is null"); + return (Criteria) this; + } + + public Criteria andSpendingScoreIsNotNull() { + addCriterion("spending_score is not null"); + return (Criteria) this; + } + + public Criteria andSpendingScoreEqualTo(Integer value) { + addCriterion("spending_score =", value, "spendingScore"); + return (Criteria) this; + } + + public Criteria andSpendingScoreNotEqualTo(Integer value) { + addCriterion("spending_score <>", value, "spendingScore"); + return (Criteria) this; + } + + public Criteria andSpendingScoreGreaterThan(Integer value) { + addCriterion("spending_score >", value, "spendingScore"); + return (Criteria) this; + } + + public Criteria andSpendingScoreGreaterThanOrEqualTo(Integer value) { + addCriterion("spending_score >=", value, "spendingScore"); + return (Criteria) this; + } + + public Criteria andSpendingScoreLessThan(Integer value) { + addCriterion("spending_score <", value, "spendingScore"); + return (Criteria) this; + } + + public Criteria andSpendingScoreLessThanOrEqualTo(Integer value) { + addCriterion("spending_score <=", value, "spendingScore"); + return (Criteria) this; + } + + public Criteria andSpendingScoreIn(List values) { + addCriterion("spending_score in", values, "spendingScore"); + return (Criteria) this; + } + + public Criteria andSpendingScoreNotIn(List values) { + addCriterion("spending_score not in", values, "spendingScore"); + return (Criteria) this; + } + + public Criteria andSpendingScoreBetween(Integer value1, Integer value2) { + addCriterion("spending_score between", value1, value2, "spendingScore"); + return (Criteria) this; + } + + public Criteria andSpendingScoreNotBetween(Integer value1, Integer value2) { + addCriterion("spending_score not between", value1, value2, "spendingScore"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/sztzjy/marketing/entity/dto/AnalyzeDataDTO.java b/src/main/java/com/sztzjy/marketing/entity/dto/AnalyzeDataDTO.java new file mode 100644 index 0000000..15cf5a8 --- /dev/null +++ b/src/main/java/com/sztzjy/marketing/entity/dto/AnalyzeDataDTO.java @@ -0,0 +1,18 @@ +package com.sztzjy.marketing.entity.dto; + +import io.swagger.annotations.ApiParam; +import lombok.Data; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * @author tz + * @date 2024/8/16 15:26 + */ +@Data +public class AnalyzeDataDTO { + private String userId; + private String tableName; + private List fieldList; +} diff --git a/src/main/java/com/sztzjy/marketing/entity/dto/ClusterScatterPlotDTO.java b/src/main/java/com/sztzjy/marketing/entity/dto/ClusterScatterPlotDTO.java new file mode 100644 index 0000000..afd42ce --- /dev/null +++ b/src/main/java/com/sztzjy/marketing/entity/dto/ClusterScatterPlotDTO.java @@ -0,0 +1,23 @@ +package com.sztzjy.marketing.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @author tz + * @date 2024/8/16 16:26 + */ +@Data +public class ClusterScatterPlotDTO { + @ApiModelProperty("簇数") + private Integer k; + @ApiModelProperty("最大迭代次数") + private Integer t; + @ApiModelProperty("用户ID") + private String userId; + @ApiModelProperty("数据集") + private List> deduplicatedDataList; +} diff --git a/src/main/java/com/sztzjy/marketing/mapper/StuSelectIndicatorsMapper.java b/src/main/java/com/sztzjy/marketing/mapper/StuSelectIndicatorsMapper.java index 620d282..109ef61 100644 --- a/src/main/java/com/sztzjy/marketing/mapper/StuSelectIndicatorsMapper.java +++ b/src/main/java/com/sztzjy/marketing/mapper/StuSelectIndicatorsMapper.java @@ -19,7 +19,7 @@ public interface StuSelectIndicatorsMapper { List getYHDLHYB(); - @Select("select COLUMN_NAME from information_schema.COLUMNS where table_name = 'stu_user_consumption_ability'") + @Select("select COLUMN_NAME from information_schema.COLUMNS where table_name = 'stu_spending_level'") List getYHXFNLB(); @Select("select COLUMN_NAME from information_schema.COLUMNS where table_name = 'stu_user_behavior'") diff --git a/src/main/java/com/sztzjy/marketing/mapper/StuSpendingLevelMapper.java b/src/main/java/com/sztzjy/marketing/mapper/StuSpendingLevelMapper.java new file mode 100644 index 0000000..2bc0659 --- /dev/null +++ b/src/main/java/com/sztzjy/marketing/mapper/StuSpendingLevelMapper.java @@ -0,0 +1,35 @@ +package com.sztzjy.marketing.mapper; + +import com.sztzjy.marketing.entity.StuSpendingLevel; +import com.sztzjy.marketing.entity.StuSpendingLevelExample; +import java.util.List; + +import com.sztzjy.marketing.util.ResultEntity; +import org.apache.ibatis.annotations.Param; + +public interface StuSpendingLevelMapper { + long countByExample(StuSpendingLevelExample example); + + int deleteByExample(StuSpendingLevelExample example); + + int deleteByPrimaryKey(Integer id); + + int insert(StuSpendingLevel record); + + int insertSelective(StuSpendingLevel record); + + List selectByExample(StuSpendingLevelExample example); + + StuSpendingLevel selectByPrimaryKey(Integer id); + + int updateByExampleSelective(@Param("record") StuSpendingLevel record, @Param("example") StuSpendingLevelExample example); + + int updateByExample(@Param("record") StuSpendingLevel record, @Param("example") StuSpendingLevelExample example); + + int updateByPrimaryKeySelective(StuSpendingLevel record); + + int updateByPrimaryKey(StuSpendingLevel record); + + void addList(@Param("stuSpendingLevels")List stuSpendingLevels); + +} \ No newline at end of file diff --git a/src/main/java/com/sztzjy/marketing/mapper/StuTableNameMapper.java b/src/main/java/com/sztzjy/marketing/mapper/StuTableNameMapper.java index 6782456..3a82a34 100644 --- a/src/main/java/com/sztzjy/marketing/mapper/StuTableNameMapper.java +++ b/src/main/java/com/sztzjy/marketing/mapper/StuTableNameMapper.java @@ -33,5 +33,5 @@ public interface StuTableNameMapper { List getTableName(String userId); - List> selectByFields(List fieldList, String table); + List> selectByFields(@Param("fieldList")List fieldList, String table); } \ No newline at end of file diff --git a/src/main/java/com/sztzjy/marketing/mapper/StuUserAttributeMapper.java b/src/main/java/com/sztzjy/marketing/mapper/StuUserAttributeMapper.java index 6ef0d9a..07f298e 100644 --- a/src/main/java/com/sztzjy/marketing/mapper/StuUserAttributeMapper.java +++ b/src/main/java/com/sztzjy/marketing/mapper/StuUserAttributeMapper.java @@ -3,6 +3,8 @@ package com.sztzjy.marketing.mapper; import com.sztzjy.marketing.entity.StuUserAttribute; import com.sztzjy.marketing.entity.StuUserAttributeExample; import java.util.List; +import java.util.Map; + import org.apache.ibatis.annotations.Param; public interface StuUserAttributeMapper { @@ -27,4 +29,6 @@ public interface StuUserAttributeMapper { int updateByPrimaryKeySelective(StuUserAttribute record); int updateByPrimaryKey(StuUserAttribute record); + + List> selectByFields(List fieldList, String table); } \ No newline at end of file diff --git a/src/main/java/com/sztzjy/marketing/mapper/StuUserBehaviorMapper.java b/src/main/java/com/sztzjy/marketing/mapper/StuUserBehaviorMapper.java index f0dba2e..1568b0a 100644 --- a/src/main/java/com/sztzjy/marketing/mapper/StuUserBehaviorMapper.java +++ b/src/main/java/com/sztzjy/marketing/mapper/StuUserBehaviorMapper.java @@ -29,4 +29,6 @@ public interface StuUserBehaviorMapper { int updateByPrimaryKeySelective(StuUserBehavior record); int updateByPrimaryKey(StuUserBehavior record); + + List selectByFields(List fieldList, String table); } \ No newline at end of file diff --git a/src/main/java/com/sztzjy/marketing/mapper/StuUserConsumptionAbilityMapper.java b/src/main/java/com/sztzjy/marketing/mapper/StuUserConsumptionAbilityMapper.java index 95c2c70..9b54c38 100644 --- a/src/main/java/com/sztzjy/marketing/mapper/StuUserConsumptionAbilityMapper.java +++ b/src/main/java/com/sztzjy/marketing/mapper/StuUserConsumptionAbilityMapper.java @@ -27,4 +27,6 @@ public interface StuUserConsumptionAbilityMapper { int updateByPrimaryKeySelective(StuUserConsumptionAbility record); int updateByPrimaryKey(StuUserConsumptionAbility record); + + List selectByFields(List fieldList, String table); } \ No newline at end of file diff --git a/src/main/java/com/sztzjy/marketing/mapper/StuUserLoginActiveMapper.java b/src/main/java/com/sztzjy/marketing/mapper/StuUserLoginActiveMapper.java index 76b0ecc..61fcd79 100644 --- a/src/main/java/com/sztzjy/marketing/mapper/StuUserLoginActiveMapper.java +++ b/src/main/java/com/sztzjy/marketing/mapper/StuUserLoginActiveMapper.java @@ -27,4 +27,6 @@ public interface StuUserLoginActiveMapper { int updateByPrimaryKeySelective(StuUserLoginActive record); int updateByPrimaryKey(StuUserLoginActive record); + + List selectByFields(List fieldList, String table); } \ No newline at end of file diff --git a/src/main/java/com/sztzjy/marketing/service/StuDigitalMarketingModelService.java b/src/main/java/com/sztzjy/marketing/service/StuDigitalMarketingModelService.java index e387be9..8a5357b 100644 --- a/src/main/java/com/sztzjy/marketing/service/StuDigitalMarketingModelService.java +++ b/src/main/java/com/sztzjy/marketing/service/StuDigitalMarketingModelService.java @@ -1,5 +1,6 @@ package com.sztzjy.marketing.service; +import com.sztzjy.marketing.entity.dto.AnalyzeDataDTO; import com.sztzjy.marketing.util.ResultEntity; import org.springframework.stereotype.Service; @@ -21,7 +22,7 @@ public interface StuDigitalMarketingModelService { List viewMetrics(String userId, String tableName); - ResultEntity viewAnalyzeData(String userId, String tableName, List fieldList); + ResultEntity viewAnalyzeData(AnalyzeDataDTO analyzeDataDTO); ResultEntity dataPreprocessing(String userId, String method, List> mapList); diff --git a/src/main/java/com/sztzjy/marketing/service/impl/StuDigitalMarketingModelServiceImpl.java b/src/main/java/com/sztzjy/marketing/service/impl/StuDigitalMarketingModelServiceImpl.java index 731e8c2..28ed716 100644 --- a/src/main/java/com/sztzjy/marketing/service/impl/StuDigitalMarketingModelServiceImpl.java +++ b/src/main/java/com/sztzjy/marketing/service/impl/StuDigitalMarketingModelServiceImpl.java @@ -5,11 +5,11 @@ import com.hankcs.hanlp.HanLP; import com.hankcs.hanlp.seg.common.Term; import com.sztzjy.marketing.config.Constant; import com.sztzjy.marketing.entity.*; +import com.sztzjy.marketing.entity.dto.AnalyzeDataDTO; import com.sztzjy.marketing.entity.dto.DescriptiveStatistics; import com.sztzjy.marketing.entity.dto.DescriptiveStatisticsDTO; import com.sztzjy.marketing.entity.dto.WordFrequencyDTO; -import com.sztzjy.marketing.mapper.StuSelectIndicatorsMapper; -import com.sztzjy.marketing.mapper.StuTableNameMapper; +import com.sztzjy.marketing.mapper.*; import com.sztzjy.marketing.service.StuDigitalMarketingModelService; import com.sztzjy.marketing.util.ResultEntity; import com.sztzjy.marketing.util.algorithm.DescriptiveStatisticsUtil; @@ -19,7 +19,10 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.IOException; +import java.time.Instant; import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; import java.util.*; import static com.sztzjy.marketing.util.algorithm.BaiDuZhiNengYun.getAccessToken; @@ -39,9 +42,15 @@ public class StuDigitalMarketingModelServiceImpl implements StuDigitalMarketingM @Resource StuSelectIndicatorsMapper indicatorsMapper; - @Resource - StuTableNameMapper tableNameMapper; + StuUserAttributeMapper userAttributeMapper; + @Resource + StuUserLoginActiveMapper userLoginActiveMapper; + @Resource + StuUserConsumptionAbilityMapper userConsumptionAbilityMapper; + @Resource + StuUserBehaviorMapper userBehaviorMapper; + @Override public List dropdownBox(String userId) { @@ -243,10 +252,14 @@ public class StuDigitalMarketingModelServiceImpl implements StuDigitalMarketingM List list=new ArrayList<>(); if(tableName.equals(Constant.YHSXB)){ - list=indicatorsMapper.getYHSXB(); +// list=indicatorsMapper.getYHSXB(); + list.add("id"); + list.add("role_gender"); + list.add("role_age"); } if(tableName.equals(Constant.YHDLHYB)){ list=indicatorsMapper.getYHDLHYB(); + } if(tableName.equals(Constant.YHXFNLB)){ list=indicatorsMapper.getYHXFNLB(); @@ -258,41 +271,46 @@ public class StuDigitalMarketingModelServiceImpl implements StuDigitalMarketingM } @Override - public ResultEntity viewAnalyzeData(String userId, String tableName, List fieldList) { + public ResultEntity viewAnalyzeData(AnalyzeDataDTO analyzeDataDTO) { String table=null; - if(tableName.equals(Constant.YHSXB)){ //查询用户属性表 + if(analyzeDataDTO.getTableName().equals(Constant.YHSXB)){ //查询用户属性表 table="stu_user_attribute"; } - if(tableName.equals(Constant.YHDLHYB)){ //查询用户登录活跃表 + if(analyzeDataDTO.getTableName().equals(Constant.YHDLHYB)){ //查询用户登录活跃表 table="stu_user_login_active"; } - if(tableName.equals(Constant.YHXFNLB)){ //查询用户消费能力表 - table="stu_user_consumption_ability"; + if(analyzeDataDTO.getTableName().equals(Constant.YHXFNLB)){ //查询用户消费能力表 + table="stu_spending_level"; } - if(tableName.equals(Constant.YHPLB) || tableName.equals(Constant.YHXWB)){ //查询用户评论或行为表 + if(analyzeDataDTO.getTableName().equals(Constant.YHPLB) || analyzeDataDTO.getTableName().equals(Constant.YHXWB)){ //查询用户评论或行为表 table="stu_user_behavior"; + } + List fieldList = analyzeDataDTO.getFieldList(); - List> attributes = tableNameMapper.selectByFields(fieldList,table); + List> attributes = stuTableNameMapper.selectByFields(fieldList,table); - //将日期类型转为string返回 + + //将日期类型转为时间戳返回 for (Map row : attributes) { for (Map.Entry entry : row.entrySet()) { if (entry.getValue() instanceof LocalDateTime) { - entry.setValue(entry.getValue().toString()); + LocalDateTime localDateTime = (LocalDateTime) entry.getValue(); + ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault()); + Instant instant = zonedDateTime.toInstant(); + entry.setValue(instant.toEpochMilli()); } } } - return new ResultEntity(HttpStatus.OK,attributes); } @@ -312,7 +330,7 @@ public class StuDigitalMarketingModelServiceImpl implements StuDigitalMarketingM //判断缺失值处理方式 - if(method.equals("剔除数据")){ + if(method.equals("缺失值处理--剔除数据")){ deduplicatedDataList.removeIf(record -> record.containsValue(null)); @@ -322,7 +340,7 @@ public class StuDigitalMarketingModelServiceImpl implements StuDigitalMarketingM - if(method.equals("均值代替")){ + if(method.equals("缺失值处理--均值代替")){ // // 均值代替处理 // for (Map record : deduplicatedDataList) { diff --git a/src/main/java/com/sztzjy/marketing/util/DataConverter.java b/src/main/java/com/sztzjy/marketing/util/DataConverter.java new file mode 100644 index 0000000..c21cf65 --- /dev/null +++ b/src/main/java/com/sztzjy/marketing/util/DataConverter.java @@ -0,0 +1,29 @@ +package com.sztzjy.marketing.util; + +import cn.hutool.http.HttpException; +import com.sztzjy.marketing.config.exception.handler.ServiceException; +import org.springframework.http.HttpStatus; + +import java.util.*; +import java.util.stream.Collectors; + +public class DataConverter { + + public static Map> convertToDouble(Map> originalMap) { + Map> convertedMap = new HashMap<>(); + for (Map.Entry> entry : originalMap.entrySet()) { + List convertedList = entry.getValue().stream() + .map(element -> { + try { + return Double.parseDouble(element.toString()); + } catch (NumberFormatException e) { + throw new ServiceException(HttpStatus.ACCEPTED,"指标选择错误"); + } + }) + .collect(Collectors.toList()); + convertedMap.put(entry.getKey(), convertedList); + } + return convertedMap; + } + +} \ No newline at end of file diff --git a/src/main/java/com/sztzjy/marketing/util/algorithm/KMeans.java b/src/main/java/com/sztzjy/marketing/util/algorithm/KMeans.java index 756a3f0..804853e 100644 --- a/src/main/java/com/sztzjy/marketing/util/algorithm/KMeans.java +++ b/src/main/java/com/sztzjy/marketing/util/algorithm/KMeans.java @@ -8,6 +8,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Random; public class KMeans { @@ -152,22 +153,20 @@ public class KMeans { // } // } - public static List readIrisData(MultipartFile file) { + public static List readIrisData(List> deduplicatedDataList) { List points = new ArrayList<>(); - try (BufferedReader br = new BufferedReader(new InputStreamReader(file.getInputStream()))) { - String line; + for (Map data : deduplicatedDataList) { + // 假设每个Map都有"x"和"y"键,并且它们的值是Double类型 + // 这里没有错误处理,你可能需要添加一些来确保键存在且值可以转换为Double + Double x = (Double) data.get("x"); + Double y = (Double) data.get("y"); - // 跳过标题行 - br.readLine(); - - while ((line = br.readLine()) != null) { - String[] values = line.split(","); - double x = Double.parseDouble(values[0]); // 假设第一列是数值 - double y = Double.parseDouble(values[1]); // 假设第二列是数值 + if (x != null && y != null) { points.add(new KMeans.Point(x, y)); + } else { + // 处理缺少x或y的情况,比如记录日志或抛出异常 + System.err.println("数据中缺少x或y: " + data); } - } catch (IOException e) { - e.printStackTrace(); } return points; } diff --git a/src/main/resources/mappers/StuSpendingLevelMapper.xml b/src/main/resources/mappers/StuSpendingLevelMapper.xml new file mode 100644 index 0000000..6a3b65b --- /dev/null +++ b/src/main/resources/mappers/StuSpendingLevelMapper.xml @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, gender, age, annual_income, spending_score + + + + + delete from stu_spending_level + where id = #{id,jdbcType=INTEGER} + + + delete from stu_spending_level + + + + + + insert into stu_spending_level (id, gender, age, + annual_income, spending_score) + values (#{id,jdbcType=INTEGER}, #{gender,jdbcType=INTEGER}, #{age,jdbcType=INTEGER}, + #{annualIncome,jdbcType=INTEGER}, #{spendingScore,jdbcType=INTEGER}) + + + insert into stu_spending_level + + + id, + + + gender, + + + age, + + + annual_income, + + + spending_score, + + + + + #{id,jdbcType=INTEGER}, + + + #{gender,jdbcType=INTEGER}, + + + #{age,jdbcType=INTEGER}, + + + #{annualIncome,jdbcType=INTEGER}, + + + #{spendingScore,jdbcType=INTEGER}, + + + + + + update stu_spending_level + + + id = #{record.id,jdbcType=INTEGER}, + + + gender = #{record.gender,jdbcType=INTEGER}, + + + age = #{record.age,jdbcType=INTEGER}, + + + annual_income = #{record.annualIncome,jdbcType=INTEGER}, + + + spending_score = #{record.spendingScore,jdbcType=INTEGER}, + + + + + + + + update stu_spending_level + set id = #{record.id,jdbcType=INTEGER}, + gender = #{record.gender,jdbcType=INTEGER}, + age = #{record.age,jdbcType=INTEGER}, + annual_income = #{record.annualIncome,jdbcType=INTEGER}, + spending_score = #{record.spendingScore,jdbcType=INTEGER} + + + + + + update stu_spending_level + + + gender = #{gender,jdbcType=INTEGER}, + + + age = #{age,jdbcType=INTEGER}, + + + annual_income = #{annualIncome,jdbcType=INTEGER}, + + + spending_score = #{spendingScore,jdbcType=INTEGER}, + + + where id = #{id,jdbcType=INTEGER} + + + update stu_spending_level + set gender = #{gender,jdbcType=INTEGER}, + age = #{age,jdbcType=INTEGER}, + annual_income = #{annualIncome,jdbcType=INTEGER}, + spending_score = #{spendingScore,jdbcType=INTEGER} + where id = #{id,jdbcType=INTEGER} + + + INSERT INTO tch_start_course_name_list (id, gender, age, annual_income, spending_score) + VALUES + + (#{stuSpendingLevel.id}, #{stuSpendingLevel.gender}, #{stuSpendingLevel.age}, #{stuSpendingLevel.annual_income}, #{stuSpendingLevel.spending_score}) + + + \ No newline at end of file diff --git a/src/main/resources/mappers/StuTableNameMapper.xml b/src/main/resources/mappers/StuTableNameMapper.xml index aeb9410..da0b640 100644 --- a/src/main/resources/mappers/StuTableNameMapper.xml +++ b/src/main/resources/mappers/StuTableNameMapper.xml @@ -214,6 +214,7 @@ + + SELECT + + ${field} + + FROM ${table} + \ No newline at end of file diff --git a/src/main/resources/mappers/StuUserBehaviorMapper.xml b/src/main/resources/mappers/StuUserBehaviorMapper.xml index 70541be..96a6c43 100644 --- a/src/main/resources/mappers/StuUserBehaviorMapper.xml +++ b/src/main/resources/mappers/StuUserBehaviorMapper.xml @@ -235,7 +235,8 @@ - + + update stu_user_behavior @@ -383,4 +384,11 @@ update_time = #{updateTime,jdbcType=TIMESTAMP} where id = #{id,jdbcType=INTEGER} + \ No newline at end of file diff --git a/src/main/resources/mappers/StuUserConsumptionAbilityMapper.xml b/src/main/resources/mappers/StuUserConsumptionAbilityMapper.xml index 5ea33f6..c9ae638 100644 --- a/src/main/resources/mappers/StuUserConsumptionAbilityMapper.xml +++ b/src/main/resources/mappers/StuUserConsumptionAbilityMapper.xml @@ -251,7 +251,8 @@ - + + update stu_user_consumption_ability @@ -415,4 +416,11 @@ update_time = #{updateTime,jdbcType=TIMESTAMP} where id = #{id,jdbcType=INTEGER} + \ No newline at end of file diff --git a/src/main/resources/mappers/StuUserLoginActiveMapper.xml b/src/main/resources/mappers/StuUserLoginActiveMapper.xml index 0f6f363..6c9580f 100644 --- a/src/main/resources/mappers/StuUserLoginActiveMapper.xml +++ b/src/main/resources/mappers/StuUserLoginActiveMapper.xml @@ -228,7 +228,8 @@ - + + update stu_user_login_active @@ -368,4 +369,11 @@ update_time = #{updateTime,jdbcType=TIMESTAMP} where id = #{id,jdbcType=INTEGER} + \ No newline at end of file