浏览代码

feat(ds): 增加ai商情分析功能

Signed-off-by: sunshihao <sunshihaoemail>
sunshihao 3 天之前
父节点
当前提交
f539df048f
共有 22 个文件被更改,包括 671 次插入6 次删除
  1. 35 1
      xinkeaboard-server/b2b2c-investment/pom.xml
  2. 18 0
      xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/bean/analysis/bo/CompanyBo.java
  3. 28 0
      xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/bean/analysis/dto/CompanyDTO.java
  4. 29 0
      xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/bean/analysis/dto/CompanyListDTO.java
  5. 25 0
      xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/bean/analysis/dto/PdfDTO.java
  6. 120 0
      xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/bean/analysis/vo/CompanyEntity.java
  7. 1 1
      xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/constant/InvestmentConst.java
  8. 97 4
      xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/controller/AnalysisController.java
  9. 56 0
      xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/datasource/InvestmentConfiguration.java
  10. 35 0
      xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/datasource/InvestmentProperties.java
  11. 23 0
      xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/mapper/BusinessAnalysisMapper.java
  12. 57 0
      xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/model/AnalysisModel.java
  13. 77 0
      xinkeaboard-server/b2b2c-investment/src/main/resources/mapper/BusinessAnalysisMapper.xml
  14. 1 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/config/StoreConfig.java
  15. 19 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/business/admin/AdminOrderInfoController.java
  16. 26 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/business/OrderProductModel.java
  17. 10 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/msg/MsgSendModel.java
  18. 1 0
      xinkeaboard-server/b2b2c-web/src/main/resources/application-dev.yml
  19. 1 0
      xinkeaboard-server/b2b2c-web/src/main/resources/application-prod.yml
  20. 1 0
      xinkeaboard-server/b2b2c-web/src/main/resources/application-test.yml
  21. 2 0
      xinkeaboard-server/b2b2c-web/src/main/resources/application.yml
  22. 9 0
      xinkeaboard-server/doc/DDL/update.sql

+ 35 - 1
xinkeaboard-server/b2b2c-investment/pom.xml

@@ -52,7 +52,16 @@
             <optional>true</optional>
         </dependency>
 
-
+        <dependency>
+            <groupId>com.slodon</groupId>
+            <artifactId>redis-slodon-starter</artifactId>
+            <version>3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.slodon</groupId>
+            <artifactId>datasource-slodon-starter</artifactId>
+            <version>3.0</version>
+        </dependency>
         <!-- Spring Boot Test Starter -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -90,4 +99,29 @@
 
     </dependencies>
 
+    <!-- b2b2c-investment/pom.xml -->
+    <build>
+        <resources>
+            <!-- 1. 打包 src/main/resources 下的所有资源(包括 XML) -->
+            <resource>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <!-- 确保包含 XML 文件,根据实际路径调整 -->
+                    <include>**/*.xml</include>
+                    <!-- 同时保留其他资源(如 properties、yml 等) -->
+                    <include>**/*.properties</include>
+                    <include>**/*.yml</include>
+                </includes>
+            </resource>
+
+            <!-- 2. 若 XML 放在 src/main/java 目录下(与 Mapper 接口同包),需额外添加 -->
+            <resource>
+                <directory>src/main/java</directory>
+                <includes>
+                    <include>**/*.xml</include> <!-- 打包 java 目录下的 XML -->
+                </includes>
+            </resource>
+        </resources>
+    </build>
+
 </project>

+ 18 - 0
xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/bean/analysis/bo/CompanyBo.java

@@ -0,0 +1,18 @@
+package com.slodon.b2b2c.investment.bean.analysis.bo;
+
+import lombok.Data;
+
+
+/**
+ * @description: TODO 
+ * @author sunshihao
+ * @date 2025/8/29 14:22
+ * @version 1.0
+ */
+@Data
+public class CompanyBo {
+    private String phone;
+
+    private String queryMonth;
+
+}

+ 28 - 0
xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/bean/analysis/dto/CompanyDTO.java

@@ -0,0 +1,28 @@
+package com.slodon.b2b2c.investment.bean.analysis.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.time.LocalDateTime;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author sunshihao
+ * @version 1.0
+ * @description: 留存信息对象
+ * @date 2025/8/29 13:23
+ */
+@Data
+public class CompanyDTO {
+    @ApiModelProperty("手机号")
+    @NotBlank(message = "手机号不能为空")
+    private String phone;
+
+    @ApiModelProperty("公司名称")
+    @NotBlank(message = "公司名称不能为空")
+    private String companyName;
+
+    @ApiModelProperty("验证码")
+    @NotBlank(message = "验证码不能为空")
+    private String verifyCode;
+}

+ 29 - 0
xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/bean/analysis/dto/CompanyListDTO.java

@@ -0,0 +1,29 @@
+package com.slodon.b2b2c.investment.bean.analysis.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.time.LocalDateTime;
+
+/**
+ * @author sunshihao
+ * @version 1.0
+ * @description: TODO
+ * @date 2025/9/1 10:11
+ */
+@Data
+public class CompanyListDTO {
+    @ApiModelProperty("手机号")
+    private String phone;
+
+    @ApiModelProperty("开始时间")
+    private LocalDateTime startTime;
+
+    @ApiModelProperty("结束时间")
+    private LocalDateTime endTime;
+
+    @ApiModelProperty("公司名称")
+    private String companyName;
+
+}

+ 25 - 0
xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/bean/analysis/dto/PdfDTO.java

@@ -0,0 +1,25 @@
+package com.slodon.b2b2c.investment.bean.analysis.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+
+/**
+ * @author sunshihao
+ * @version 1.0
+ * @description: pdf传参
+ * @date 2025/8/29 18:20
+ */
+@Data
+public class PdfDTO {
+    @ApiModelProperty("id")
+    @NotNull(message = "id不能为空")
+    private int id;
+
+    @ApiModelProperty("pdf存储路径")
+    @NotBlank(message = "pdf存储路径不能为空")
+    private String pdfUrl;
+}

+ 120 - 0
xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/bean/analysis/vo/CompanyEntity.java

@@ -0,0 +1,120 @@
+package com.slodon.b2b2c.investment.bean.analysis.vo;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author sunshihao
+ * @version 1.0
+ * @description: TODO
+ * @date 2025/8/29 14:23
+ */
+@Data
+public class CompanyEntity {
+    /**
+     * 主键ID(自增)
+     */
+    private Integer id;
+
+    /**
+     * 公司名称
+     */
+    private String companyName;
+
+    /**
+     * 手机号
+     */
+    private String phone;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 查询月(格式:YYYYMM,如202310)
+     */
+    private String queryMonth;
+    /**
+     * 本月消耗次数
+     */
+    private int usedCount;
+    /**
+     * 本月剩余次数
+     */
+    private int leftCount;
+    /**
+     * pdf地址
+     */
+    private String pdfUrl;
+
+    /**
+     * CompanyEntity的Builder构造器
+     */
+    public static class Builder {
+        private Integer id;
+        private String companyName;
+        private String phone;
+        private LocalDateTime createTime;
+        private String queryMonth;
+        private String pdfUrl;
+        private int usedCount;
+        private int leftCount;
+
+        public Builder id(Integer id) {
+            this.id = id;
+            return this;
+        }
+
+        public Builder companyName(String companyName) {
+            this.companyName = companyName;
+            return this;
+        }
+
+        public Builder phone(String phone) {
+            this.phone = phone;
+            return this;
+        }
+
+        public Builder createTime(LocalDateTime createTime) {
+            this.createTime = createTime;
+            return this;
+        }
+
+        public Builder queryMonth(String queryMonth) {
+            this.queryMonth = queryMonth;
+            return this;
+        }
+
+        public Builder usedCount(int usedCount) {
+            this.usedCount = usedCount;
+            return this;
+        }
+        public Builder leftCount(int leftCount) {
+            this.leftCount = leftCount;
+            return this;
+        }
+        public Builder pdfUrl(String pdfUrl) {
+            this.pdfUrl = pdfUrl;
+            return this;
+        }
+
+        public CompanyEntity build() {
+            CompanyEntity companyEntity = new CompanyEntity();
+            companyEntity.id = this.id;
+            companyEntity.companyName = this.companyName;
+            companyEntity.phone = this.phone;
+            companyEntity.createTime = this.createTime;
+            companyEntity.queryMonth = this.queryMonth;
+            companyEntity.usedCount = this.usedCount;
+            companyEntity.leftCount = this.leftCount;
+            companyEntity.pdfUrl = this.pdfUrl;
+            return companyEntity;
+        }
+    }
+
+    public static Builder builder() {
+        return new Builder();
+    }
+}

+ 1 - 1
xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/constant/InvestmentConst.java

@@ -84,6 +84,6 @@ public class InvestmentConst {
     public static final String PAGE = "page";
     public static final String TOTAL = "total";
 
-
+    public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
     public static final String DELETE_SUCCESS = "204\n";
 }

+ 97 - 4
xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/controller/AnalysisController.java

@@ -1,20 +1,27 @@
 package com.slodon.b2b2c.investment.controller;
 
 import com.slodon.b2b2c.core.response.JsonResult;
+import com.slodon.b2b2c.core.response.PageVO;
+import com.slodon.b2b2c.core.response.PagerInfo;
 import com.slodon.b2b2c.core.response.SldResponse;
-
-import com.slodon.b2b2c.investment.bean.analysis.dto.RivalDTO;
-import com.slodon.b2b2c.investment.bean.analysis.dto.SearchVolumeDTO;
+import com.slodon.b2b2c.core.util.AssertUtil;
+import com.slodon.b2b2c.core.util.WebUtil;
+import com.slodon.b2b2c.investment.bean.analysis.dto.*;
+import com.slodon.b2b2c.investment.bean.analysis.vo.CompanyEntity;
 import com.slodon.b2b2c.investment.bean.analysis.vo.KeyWordPartVO;
 import com.slodon.b2b2c.investment.bean.analysis.vo.RivalPartVO;
 import com.slodon.b2b2c.investment.bean.analysis.vo.SuggestionVO;
+import com.slodon.b2b2c.investment.constant.InvestmentConst;
 import com.slodon.b2b2c.investment.model.AnalysisModel;
 import io.swagger.annotations.Api;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
-
+import org.springframework.data.redis.core.StringRedisTemplate;
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.HashMap;
 import java.util.List;
 
@@ -31,9 +38,13 @@ import java.util.List;
 @RequestMapping("/analysis")
 @Slf4j
 public class AnalysisController {
+
     @Resource
     private AnalysisModel analysisModel;
 
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
+
     /***
      * @description: 接口1 返回页面左上 关键词搜索量 关键词难度
      * @param:
@@ -115,5 +126,87 @@ public class AnalysisController {
         return SldResponse.success(result);
     }
 
+    /***
+     * @description: ai商情客户留存信息记录
+     * @param:
+     * @param dto 参数
+     * @return: void
+     * @author sunshihao
+     * @date: 2025/9/1 9:45
+     */
+    @PostMapping("/record")
+    public JsonResult<Integer> record(@Valid @RequestBody CompanyDTO dto) {
+//        //开关开启需要验证
+//        String verifyCodeCheck = stringRedisTemplate.opsForValue().get("verification_code_check_is_enable");
+//        if ("1".equals(verifyCodeCheck)) {
+//            String verifySms = stringRedisTemplate.opsForValue().get(dto.getPhone());
+//            AssertUtil.isTrue(!dto.getVerifyCode().equals(verifySms), "验证码输入错误,请重试");
+//        }
+        int id;
+        try {
+            id = analysisModel.record(dto);
+        } catch (Exception e) {
+            log.error(e.getMessage(),e);
+            return SldResponse.fail(e.getMessage());
+        }
+        return SldResponse.success(id);
+    }
+
+    /***
+     * @description: 更新pdf地址
+     * @param:
+     * @param dto 参数
+     * @return: com.slodon.b2b2c.core.response.JsonResult<java.lang.String>
+     * @author sunshihao
+     * @date: 2025/9/1 9:46
+     */
+    @PostMapping("/savePdf")
+    public JsonResult<String> savePdf(@Valid @RequestBody PdfDTO dto) {
+        try {
+            analysisModel.savePdf(dto);
+        }catch (Exception e) {
+            log.error(e.getMessage(),e);
+            return SldResponse.fail( e.getMessage());
+        }
+        return SldResponse.success();
+    }
+
+    /***
+     * @description: ai商情分析任务列表
+     * @param: phone
+     * @return: com.slodon.b2b2c.core.response.JsonResult<java.util.List<com.slodon.b2b2c.investment.bean.analysis.vo.CompanyEntity>>
+     * @author sunshihao
+     * @date: 2025/9/1 10:26
+     */
+    @GetMapping("/aiList")
+    public JsonResult<PageVO<CompanyEntity>> aiList(HttpServletRequest request,
+                                                    @RequestParam(value = "phone", required = false) String phone,
+                                                    @RequestParam(value = "startTime", required = false) String startTime,
+                                                    @RequestParam(value = "endTime", required = false) String endTime,
+                                                    @RequestParam(value = "companyName", required = false) String companyName) {
+        List<CompanyEntity> list;
+        PagerInfo pager;
+        // 定义格式转换器
+        DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(InvestmentConst.YYYY_MM_DD_HH_MM_SS);
+        LocalDateTime stime = LocalDateTime.parse(startTime, FORMATTER);
+        LocalDateTime etime = LocalDateTime.parse(endTime, FORMATTER);
+        try {
+            pager = WebUtil.handlerPagerInfo(request);
+            CompanyListDTO dto = new CompanyListDTO();
+            dto.setPhone(phone);
+            dto.setStartTime(stime);
+            dto.setEndTime(etime);
+            dto.setCompanyName(companyName);
+            list = analysisModel.aiList(dto, pager);
+        }catch (Exception e) {
+            log.error(e.getMessage(),e);
+            return SldResponse.fail( e.getMessage());
+        }
+        return SldResponse.success(new PageVO<>(list, pager));
+    }
+
+
+
+
 
 }

+ 56 - 0
xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/datasource/InvestmentConfiguration.java

@@ -0,0 +1,56 @@
+package com.slodon.b2b2c.investment.datasource;
+
+import com.slodon.b2b2c.core.constant.StarterConfigConst;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.boot.jdbc.DataSourceBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+
+import javax.sql.DataSource;
+
+/**
+ * @author sunshihao
+ * @version 1.0
+ * @description: TODO
+ * @date 2025/8/29 15:14
+ */
+@Configuration(proxyBeanMethods = false)
+@EnableConfigurationProperties(InvestmentProperties.class)
+//数据源对象dao所在包-read
+@MapperScan(basePackages = "com.slodon.b2b2c.investment.mapper",sqlSessionFactoryRef = "sqlSessionFactoryInvestment")
+
+public class InvestmentConfiguration {
+
+    @Autowired
+    private InvestmentProperties investmentProperties;
+
+    /*-------------多数据源配置开始,配合properties文件配置数据源------------------*/
+
+    /**
+     * read数据源
+     * @return
+     */
+    @Bean(value = "dataSourceInvestment")
+    public DataSource dataSource0() {
+        return DataSourceBuilder.create()
+                .driverClassName(investmentProperties.getDriverClassName())
+                .url(investmentProperties.getUrl())
+                .username(investmentProperties.getUsername())
+                .password(investmentProperties.getPassword())
+                .build();
+    }
+
+    @Bean(value = "sqlSessionFactoryInvestment")
+    public SqlSessionFactory sqlSessionFactory0(@Qualifier("dataSourceInvestment") DataSource dataSource) throws Exception {
+        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
+        bean.setDataSource(dataSource);
+        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/**/*.xml"));
+        return bean.getObject();
+    }
+}

+ 35 - 0
xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/datasource/InvestmentProperties.java

@@ -0,0 +1,35 @@
+package com.slodon.b2b2c.investment.datasource;
+
+import com.slodon.b2b2c.core.config.DomainUrlUtil;
+import com.slodon.b2b2c.core.constant.StarterConfigConst;
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * 自定义配置
+ * 部分字段设置有默认值,也可以自定义配置
+ * 各个微服务引用此starter时,url字段必须配置
+ */
+@ConfigurationProperties(prefix = StarterConfigConst.DATASOURCE_PREFIX_READ)
+@Data
+public class InvestmentProperties {
+    /**
+     * jdbc驱动
+     */
+    private String driverClassName = "com.mysql.cj.jdbc.Driver";
+
+    /**
+     * 数据库连接url
+     */
+    private String url;
+
+    /**
+     * 数据库连接用户名
+     */
+    private String username = DomainUrlUtil.SLD_MYSQL_READ_USERNAME;
+
+    /**
+     * 数据库连接密码
+     */
+    private String password = DomainUrlUtil.SLD_MYSQL_READ_PASSWORD;
+}

+ 23 - 0
xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/mapper/BusinessAnalysisMapper.java

@@ -0,0 +1,23 @@
+package com.slodon.b2b2c.investment.mapper;
+
+import com.slodon.b2b2c.investment.bean.analysis.bo.CompanyBo;
+import com.slodon.b2b2c.investment.bean.analysis.dto.CompanyListDTO;
+import com.slodon.b2b2c.investment.bean.analysis.dto.PdfDTO;
+import com.slodon.b2b2c.investment.bean.analysis.vo.CompanyEntity;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface BusinessAnalysisMapper {
+    int countQueryTimes(CompanyBo bo);
+
+    int updateRecord(PdfDTO dto);
+
+    int insertRecord(CompanyEntity bo);
+
+    List<CompanyEntity> aiList(CompanyListDTO dto, @Param("start") int start,@Param("pageSize")int pageSize);
+
+    int countAiList(CompanyListDTO dto);
+}

+ 57 - 0
xinkeaboard-server/b2b2c-investment/src/main/java/com/slodon/b2b2c/investment/model/AnalysisModel.java

@@ -3,20 +3,27 @@ package com.slodon.b2b2c.investment.model;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+import com.slodon.b2b2c.core.response.PagerInfo;
 import com.slodon.b2b2c.core.util.HttpClientUtil;
 import com.slodon.b2b2c.investment.bean.analysis.bo.*;
+import com.slodon.b2b2c.investment.bean.analysis.dto.CompanyDTO;
+import com.slodon.b2b2c.investment.bean.analysis.dto.CompanyListDTO;
+import com.slodon.b2b2c.investment.bean.analysis.dto.PdfDTO;
 import com.slodon.b2b2c.investment.bean.analysis.dto.RivalDTO;
+import com.slodon.b2b2c.investment.bean.analysis.vo.CompanyEntity;
 import com.slodon.b2b2c.investment.bean.analysis.vo.KeyWordPartVO;
 import com.slodon.b2b2c.investment.bean.analysis.vo.RivalPartVO;
 import com.slodon.b2b2c.investment.bean.analysis.vo.SuggestionVO;
 import com.slodon.b2b2c.investment.config.AnalysisConfig;
 import com.slodon.b2b2c.investment.constant.InvestmentConst;
 import com.slodon.b2b2c.investment.constant.LocalLanguageEnum;
+import com.slodon.b2b2c.investment.mapper.BusinessAnalysisMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.nio.charset.StandardCharsets;
@@ -38,6 +45,10 @@ public class AnalysisModel {
     @Resource
     private AnalysisConfig analysisConfig;
 
+    @Resource
+    private BusinessAnalysisMapper businessAnalysisMapper;
+
+
 
 
 /***
@@ -462,6 +473,52 @@ public SuggestionVO KeywordForSuggestions(HashMap<String,String> header, String
             return input;
         }
     }
+
+    public int record(CompanyDTO dto) throws Exception {
+        // 查询是否达到3次
+        DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyyMM");
+        LocalDateTime currentTime = LocalDateTime.now();
+        String month = currentTime.format(format);
+        CompanyBo bo = new CompanyBo();
+        bo.setPhone(dto.getPhone());
+        bo.setQueryMonth(month);
+        int count = businessAnalysisMapper.countQueryTimes(bo);
+        if(count>=InvestmentConst.NUM_THREE){
+            throw new RuntimeException("该手机号已超过3次查询");
+        }
+        // 插入记录数据
+        CompanyEntity entity = CompanyEntity.builder()
+                .companyName(dto.getCompanyName())
+                .phone(dto.getPhone())
+                .createTime(currentTime)
+                .queryMonth(month)
+                .usedCount(InvestmentConst.NUM_ONE+count)
+                .leftCount(InvestmentConst.NUM_TWO-count)
+                .build();
+        int res = businessAnalysisMapper.insertRecord(entity);
+        if(InvestmentConst.NUM_ONE!=res){
+            throw new Exception("ai商情分析记录失败");
+        }
+        return entity.getId();
+    }
+
+    public void savePdf(PdfDTO dto) throws Exception {
+        int res = businessAnalysisMapper.updateRecord(dto);
+        if(InvestmentConst.NUM_ONE!=res){
+            throw new Exception("ai商情分析pdf地址更新失败");
+        }
+    }
+
+    public List<CompanyEntity> aiList(CompanyListDTO dto, PagerInfo pager) {
+        List<CompanyEntity> list = Collections.emptyList();
+        if (pager != null) {
+            pager.setRowsCount(businessAnalysisMapper.countAiList(dto));
+            list = businessAnalysisMapper.aiList(dto, pager.getStart(), pager.getPageSize());
+        }
+        return list;
+    }
+
+
 }
 
 

+ 77 - 0
xinkeaboard-server/b2b2c-investment/src/main/resources/mapper/BusinessAnalysisMapper.xml

@@ -0,0 +1,77 @@
+<?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="com.slodon.b2b2c.investment.mapper.BusinessAnalysisMapper">
+  <!-- 结果集映射:数据库字段与实体类属性的映射关系 -->
+  <resultMap id="BaseResultMap" type="com.slodon.b2b2c.investment.bean.analysis.vo.CompanyEntity">
+    <id column="id" property="id" jdbcType="INTEGER"/>
+    <id column="usedCount" property="usedCount" jdbcType="INTEGER"/>
+    <id column="leftCount" property="leftCount" jdbcType="INTEGER"/>
+    <result column="company_name" property="companyName" jdbcType="VARCHAR"/>
+    <result column="phone" property="phone" jdbcType="VARCHAR"/>
+    <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
+    <result column="pdf_url" property="pdfUrl" jdbcType="VARCHAR"/>
+    <result column="query_month" property="queryMonth" jdbcType="VARCHAR"/>
+  </resultMap>
+
+  <insert id="insertRecord" useGeneratedKeys="true" keyProperty="id">
+    INSERT INTO business_analysis_record(company_name, phone, create_time, query_month,usedCount,leftCount)
+    VALUES(#{companyName}, #{phone}, #{createTime}, #{queryMonth},#{usedCount},#{leftCount})
+  </insert>
+
+
+  <select id="countQueryTimes" resultType="java.lang.Integer" parameterType="com.slodon.b2b2c.investment.bean.analysis.bo.CompanyBo">
+    SELECT
+    count(id)
+    FROM business_analysis_record
+    WHERE phone = #{phone} and query_month = #{queryMonth}
+  </select>
+
+  <select id="aiList" resultMap="BaseResultMap">
+    SELECT
+    id, company_name, phone, create_time, query_month, usedCount,leftCount,pdf_url
+    FROM business_analysis_record
+    <where>
+      <if test="dto.companyName != null">
+        and company_name like concat('%',#{dto.companyName},'%')
+      </if>
+      <if test="dto.phone != null">
+        and phone = #{dto.phone}
+      </if>
+      <if test="dto.startTime != null">
+        and create_time  &gt;= #{dto.startTime}
+      </if>
+      <if test="dto.endTime != null">
+        and create_time  &lt;= #{dto.endTime}
+      </if>
+    </where>
+    ORDER BY create_time DESC
+    LIMIT #{start}, #{pageSize}
+  </select>
+
+  <select id="countAiList" resultType="java.lang.Integer">
+    SELECT count(id)
+    FROM business_analysis_record
+    <where>
+      <if test="companyName != null">
+        and company_name like concat('%',#{companyName},'%')
+      </if>
+      <if test="phone != null">
+        and phone = #{phone}
+      </if>
+      <if test="startTime != null">
+        and create_time  &gt;= #{startTime}
+      </if>
+      <if test="endTime != null">
+        and create_time  &lt;= #{endTime}
+      </if>
+    </where>
+  </select>
+
+
+  <update id="updateRecord">
+    UPDATE business_analysis_record
+    SET pdf_url = #{pdfUrl}
+    WHERE id = #{id}
+  </update>
+
+</mapper>

+ 1 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/config/StoreConfig.java

@@ -9,5 +9,6 @@ import org.springframework.stereotype.Component;
 @Data
 public class StoreConfig {
     private String url;
+    private String orderUrl;
     private String token;
 }

+ 19 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/business/admin/AdminOrderInfoController.java

@@ -403,4 +403,23 @@ public class AdminOrderInfoController extends BaseController {
         }
         return SldResponse.success(new PageVO<>(vos, pager));
     }
+
+    /***
+     * @description:订单信息
+     * @param day 近x天数据
+     * @return: com.slodon.b2b2c.core.response.JsonResult<java.lang.String>
+     * @author sunshihao
+     * @date: 2025/9/1 16:33
+     */
+    @GetMapping("/orderList")
+    public JsonResult<String> orderList(@RequestParam(value = "day", required = false) int day) {
+        String result;
+        try {
+            result = orderProductModel.orderList(day);
+        }catch (Exception e) {
+            log.error(e.getMessage(),e);
+            return SldResponse.fail("订单信息查询失败: " + e.getMessage());
+        }
+        return SldResponse.success(result);
+    }
 }

+ 26 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/business/OrderProductModel.java

@@ -1,17 +1,21 @@
 package com.slodon.b2b2c.model.business;
 
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.slodon.b2b2c.business.dto.OrderSubmitDTO;
 import com.slodon.b2b2c.business.example.OrderProductExample;
 import com.slodon.b2b2c.business.pojo.Order;
 import com.slodon.b2b2c.business.pojo.OrderProduct;
+import com.slodon.b2b2c.config.StoreConfig;
 import com.slodon.b2b2c.core.constant.GoodsConst;
 import com.slodon.b2b2c.core.constant.OrderConst;
 import com.slodon.b2b2c.core.constant.StoreConst;
 import com.slodon.b2b2c.core.exception.MallException;
 import com.slodon.b2b2c.core.response.PagerInfo;
 import com.slodon.b2b2c.core.util.AssertUtil;
+import com.slodon.b2b2c.core.util.HttpClientUtil;
 import com.slodon.b2b2c.core.util.StringUtil;
 import com.slodon.b2b2c.dao.read.business.OrderProductReadMapper;
 import com.slodon.b2b2c.dao.read.goods.GoodsCategoryReadMapper;
@@ -24,6 +28,7 @@ import com.slodon.b2b2c.dao.write.goods.ProductWriteMapper;
 import com.slodon.b2b2c.goods.pojo.Goods;
 import com.slodon.b2b2c.goods.pojo.GoodsCategory;
 import com.slodon.b2b2c.goods.pojo.Product;
+import com.slodon.b2b2c.investment.constant.InvestmentConst;
 import com.slodon.b2b2c.seller.example.StoreBindCategoryExample;
 import com.slodon.b2b2c.seller.pojo.StoreBindCategory;
 import lombok.extern.slf4j.Slf4j;
@@ -59,6 +64,8 @@ public class OrderProductModel {
     private GoodsReadMapper goodsReadMapper;
     @Resource
     private GoodsWriteMapper goodsWriteMapper;
+    @Resource
+    private StoreConfig storeConfig;
 
     /**
      * 新增订单货品明细表
@@ -346,4 +353,23 @@ public class OrderProductModel {
             goodsWriteMapper.updateByPrimaryKeySelective(updateGoods);
         });
     }
+
+    public String orderList(int day) throws Exception {
+        HashMap<String, String> headers = new HashMap<>();
+        headers.put(InvestmentConst.CONTENT_TYPE, InvestmentConst.APPLICATION_JSON);
+        headers.put(InvestmentConst.AUTHORIZATION, storeConfig.getToken());
+        String result;
+        try {
+            result = HttpClientUtil.httpGet(storeConfig.getOrderUrl() + "?days="+day,headers);
+            JSONObject jsonObject = JSONUtil.parseObj(result);
+            String data = jsonObject.getByPath("data",String.class);
+            if(StringUtils.isEmpty(data)){
+                return "";
+            }
+            return data;
+        } catch (Exception e) {
+            log.error(e.getMessage(), "苏豪获取订单统计信息接口出错");
+            throw new Exception("苏豪获取订单统计信息接口出错", e);
+        }
+    }
 }

+ 10 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/msg/MsgSendModel.java

@@ -12,6 +12,7 @@ import com.slodon.b2b2c.core.exception.MallException;
 import com.slodon.b2b2c.core.sms.SmsRequest;
 import com.slodon.b2b2c.core.sms.SmsResponse;
 import com.slodon.b2b2c.core.util.StringUtil;
+import com.slodon.b2b2c.sms.DySmsSender;
 import com.slodon.b2b2c.sms.TencentSmsSender;
 import com.slodon.b2b2c.sms.YunPianSmsSender;
 import com.slodon.b2b2c.sms.base.SmsSender;
@@ -62,6 +63,9 @@ public class MsgSendModel {
         SmsRequest smsRequest = new SmsRequest();
         smsRequest.setSmsType(SMSConst.VERIFY_SMS);
         smsRequest.setMobile(mobile);
+        smsRequest.setTemplateId("notification_sms_ali_register_sms_template");
+//        smsRequest.setSmsType("");
+//        smsRequest.setTemplateContent("【{1}】您的验证码是{2},请不要把验证码泄露给其他人。");
 
         SmsResponse smsResponse = null;
         try {
@@ -69,6 +73,8 @@ public class MsgSendModel {
                 pool = Executors.newFixedThreadPool(SMSConst.DEFAULT_RUN_THREAD_NUM);
             }
             smsResponse = (SmsResponse) pool.submit(new SmsCall(smsRequest)).get();
+            //将随机数存在redis中
+            stringRedisTemplate.opsForValue().set(mobile, smsResponse.getVerifyCode(), 60L * 5, TimeUnit.SECONDS);
         } catch (Exception e) {
             log.error("[MsgSendModel][sendVerifyCode]发送验证码短信异常:", e);
             //关闭线程池
@@ -196,6 +202,10 @@ public class MsgSendModel {
                     //云片发送
                     smsSender = new YunPianSmsSender(stringRedisTemplate);
                     break;
+                case 3:
+                    //阿里云发送
+                    smsSender = new DySmsSender(stringRedisTemplate);
+                    break;
                 default:
                     throw new MallException("参数错误");
             }

+ 1 - 0
xinkeaboard-server/b2b2c-web/src/main/resources/application-dev.yml

@@ -75,6 +75,7 @@ dify:
 #创建/获取商户订单URL
 store:
   url: https://xinke.sutextech.com/api/get_store_urls/
+  orderUrl: https://xinke.sutextech.com/api/get_order_by_time/
   token: Token 7858e42dcc68d1bb090438a0baab69b085f4b57e
 
 #产品创建/更新

+ 1 - 0
xinkeaboard-server/b2b2c-web/src/main/resources/application-prod.yml

@@ -73,6 +73,7 @@ dify:
 #创建/获取商户订单URL
 store:
   url: https://xinke.sutextech.com/api/get_store_urls/
+  orderUrl: https://xinke.sutextech.com/api/get_order_by_time/
   token: Token 7858e42dcc68d1bb090438a0baab69b085f4b57e
 
 #产品创建/更新

+ 1 - 0
xinkeaboard-server/b2b2c-web/src/main/resources/application-test.yml

@@ -73,6 +73,7 @@ dify:
 #创建/获取商户订单URL
 store:
   url: https://xinke.sutextech.com/api/get_store_urls/
+  orderUrl: https://xinke.sutextech.com/api/get_order_by_time/
   token: Token 7858e42dcc68d1bb090438a0baab69b085f4b57e
 
 #产品创建/更新

+ 2 - 0
xinkeaboard-server/b2b2c-web/src/main/resources/application.yml

@@ -48,6 +48,8 @@ secure:
       - "/analysis/**"
       - "/dify/**"
       - "/v3/statistics/screen/analysis/**"
+      - "/v3/business/admin/orderInfo/orderList"
+      - "/v3/temp/verification/code"
     #      - "/v3/seller/seller/enquiry/sendMsgStr"
     login-urls: #登录接口
       - "/v3/frontLogin/**"

+ 9 - 0
xinkeaboard-server/doc/DDL/update.sql

@@ -380,6 +380,15 @@ INSERT INTO `sys_system_resource`(`resource_id`, `pid`, `url`, `content`, `creat
 
 INSERT INTO `sys_system_resource_role`(`resource_role_id`, `resource_id`, `role_id`, `create_time`) VALUES (19174, 911, 1, '2021-07-21 21:49:09');
 
+INSERT INTO `sys_system_resource`( `pid`, `url`, `content`, `create_time`, `state`, `grade`, `front_path`, `sort`) VALUES ( 312, '/', 'ai商情分析列表', '2021-07-21 16:34:20', 1, 3, '/manage_order/ai_business_intelligence', 0);
+
+INSERT INTO `sys_system_resource_role`( `resource_id`, `role_id`, `create_time`) VALUES ( 912, 1, '2021-07-21 21:49:09');
+
+
+
+INSERT INTO `sys_system_resource`( `pid`, `url`, `content`, `create_time`, `state`, `grade`, `front_path`, `sort`) VALUES ( 297, '/', '订单管理', '2021-07-21 16:34:20', 1, 2, '/manage_order/order_manage_list', 27);
+
+INSERT INTO `sys_system_resource_role`( `resource_id`, `role_id`, `create_time`) VALUES ( 913, 1, '2021-07-21 21:49:09');