diff --git a/pom.xml b/pom.xml
index bb1eea9..097f3d6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -216,6 +216,25 @@
+
+
+ com.mysema.maven
+ apt-maven-plugin
+ 1.1.3
+
+
+
+ process
+
+
+ src/main/generated
+ com.querydsl.apt.jpa.JPAAnnotationProcessor
+
+
+
+
+
+
com.mysema.maven
apt-maven-plugin
diff --git a/src/main/generated/cn/stock/market/infrastructure/db/po/QStockIpoPO.java b/src/main/generated/cn/stock/market/infrastructure/db/po/QStockIpoPO.java
new file mode 100644
index 0000000..b29a919
--- /dev/null
+++ b/src/main/generated/cn/stock/market/infrastructure/db/po/QStockIpoPO.java
@@ -0,0 +1,63 @@
+package cn.stock.market.infrastructure.db.po;
+
+import static com.querydsl.core.types.PathMetadataFactory.*;
+
+import com.querydsl.core.types.dsl.*;
+
+import com.querydsl.core.types.PathMetadata;
+import javax.annotation.Generated;
+import com.querydsl.core.types.Path;
+
+
+/**
+ * QStockIpoPO is a Querydsl query type for StockIpoPO
+ */
+@Generated("com.querydsl.codegen.EntitySerializer")
+public class QStockIpoPO extends EntityPathBase {
+
+ private static final long serialVersionUID = 1023664740L;
+
+ public static final QStockIpoPO stockIpoPO = new QStockIpoPO("stockIpoPO");
+
+ public final StringPath apply = createString("apply");
+
+ public final DateTimePath createDate = createDateTime("createDate", java.util.Date.class);
+
+ public final NumberPath id = createNumber("id", Integer.class);
+
+ public final NumberPath isList = createNumber("isList", Integer.class);
+
+ public final NumberPath isShow = createNumber("isShow", Integer.class);
+
+ public final DateTimePath listingDate = createDateTime("listingDate", java.util.Date.class);
+
+ public final NumberPath peRatio = createNumber("peRatio", java.math.BigDecimal.class);
+
+ public final StringPath sourceType = createString("sourceType");
+
+ public final StringPath stockCode = createString("stockCode");
+
+ public final StringPath stockName = createString("stockName");
+
+ public final NumberPath stockPrice = createNumber("stockPrice", java.math.BigDecimal.class);
+
+ public final DateTimePath subscriptionDate = createDateTime("subscriptionDate", java.util.Date.class);
+
+ public final NumberPath totalNumber = createNumber("totalNumber", Integer.class);
+
+ public final DateTimePath updateDate = createDateTime("updateDate", java.util.Date.class);
+
+ public QStockIpoPO(String variable) {
+ super(StockIpoPO.class, forVariable(variable));
+ }
+
+ public QStockIpoPO(Path extends StockIpoPO> path) {
+ super(path.getType(), path.getMetadata());
+ }
+
+ public QStockIpoPO(PathMetadata metadata) {
+ super(StockIpoPO.class, metadata);
+ }
+
+}
+
diff --git a/src/main/java/cn/stock/market/application/assembler/StockIpoAssembler.java b/src/main/java/cn/stock/market/application/assembler/StockIpoAssembler.java
new file mode 100644
index 0000000..1afe643
--- /dev/null
+++ b/src/main/java/cn/stock/market/application/assembler/StockIpoAssembler.java
@@ -0,0 +1,35 @@
+package cn.stock.market.application.assembler;
+
+import cn.qutaojing.common.utils.Beans;
+import cn.qutaojing.common.utils.SpringUtils;
+import cn.stock.market.domain.basic.entity.StockIpo;
+import cn.stock.market.dto.StockIpoDTO;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+/**
+ * StockIpoAssembler
+ *
+ * @author rplees
+ * @email rplees.i.ly@gmail.com
+ * @created 2023/12/28
+ */
+@Component
+@Lazy
+public class StockIpoAssembler {
+ public StockIpoDTO toDTO(StockIpo e) {
+ StockIpoDTO dto = Beans.mapper(e, StockIpoDTO.class);
+ if(dto == null) return dto;
+ fill(e, dto);
+ return dto;
+ }
+
+ protected void fill(StockIpo e, StockIpoDTO dto) {
+ if(dto == null) return;
+ return;
+ }
+
+ public static StockIpoAssembler of() {
+ return SpringUtils.getBean(StockIpoAssembler.class);
+ }
+}
diff --git a/src/main/java/cn/stock/market/domain/basic/convert/StockIpoConvert.java b/src/main/java/cn/stock/market/domain/basic/convert/StockIpoConvert.java
new file mode 100644
index 0000000..1cfec5a
--- /dev/null
+++ b/src/main/java/cn/stock/market/domain/basic/convert/StockIpoConvert.java
@@ -0,0 +1,23 @@
+package cn.stock.market.domain.basic.convert;
+
+import cn.qutaojing.common.domain.convert.SimpleEntityPOConvert;
+import cn.qutaojing.common.utils.SpringUtils;
+import cn.stock.market.domain.basic.entity.StockIpo;
+import cn.stock.market.infrastructure.db.po.StockIpoPO;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+/**
+ * StockIpoConvert
+ *
+ * @author rplees
+ * @email rplees.i.ly@gmail.com
+ * @created 2023/12/28
+ */
+@Component
+@Lazy
+public class StockIpoConvert extends SimpleEntityPOConvert {
+ public static StockIpoConvert of() {
+ return SpringUtils.getBean(StockIpoConvert.class);
+ }
+}
diff --git a/src/main/java/cn/stock/market/domain/basic/entity/StockIpo.java b/src/main/java/cn/stock/market/domain/basic/entity/StockIpo.java
new file mode 100644
index 0000000..7ba804c
--- /dev/null
+++ b/src/main/java/cn/stock/market/domain/basic/entity/StockIpo.java
@@ -0,0 +1,28 @@
+package cn.stock.market.domain.basic.entity;
+
+import cn.qutaojing.common.utils.Beans;
+import cn.stock.market.dto.command.StockIpoCreateCommand;
+import cn.stock.market.infrastructure.db.po.StockIpoPO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * StockIpo
+ *
+ * @author rplees
+ * @email rplees.i.ly@gmail.com
+ * @created 2023/12/28
+ */
+@Data
+@NoArgsConstructor
+@SuperBuilder
+@EqualsAndHashCode(
+ callSuper = false
+)
+public class StockIpo extends StockIpoPO {
+ public void update(StockIpoCreateCommand cmd) {
+ Beans.copyProperties(cmd, this);
+ }
+}
diff --git a/src/main/java/cn/stock/market/domain/basic/factory/StockIpoFactory.java b/src/main/java/cn/stock/market/domain/basic/factory/StockIpoFactory.java
new file mode 100644
index 0000000..a451316
--- /dev/null
+++ b/src/main/java/cn/stock/market/domain/basic/factory/StockIpoFactory.java
@@ -0,0 +1,28 @@
+package cn.stock.market.domain.basic.factory;
+
+import cn.qutaojing.common.utils.SpringUtils;
+import cn.stock.market.domain.basic.entity.StockIpo;
+import cn.stock.market.dto.command.StockIpoCreateCommand;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+/**
+ * StockIpoFactory
+ *
+ * @author rplees
+ * @email rplees.i.ly@gmail.com
+ * @created 2023/12/28
+ */
+@Component
+@Lazy
+public class StockIpoFactory {
+ public static StockIpoFactory of() {
+ return SpringUtils.getBean(StockIpoFactory.class);
+ }
+
+ public StockIpo from(StockIpoCreateCommand cmd) {
+ StockIpo e = StockIpo.builder().build();
+ e.update(cmd);
+ return e;
+ }
+}
diff --git a/src/main/java/cn/stock/market/domain/basic/repository/StockIpoRepository.java b/src/main/java/cn/stock/market/domain/basic/repository/StockIpoRepository.java
new file mode 100644
index 0000000..c3c7c9a
--- /dev/null
+++ b/src/main/java/cn/stock/market/domain/basic/repository/StockIpoRepository.java
@@ -0,0 +1,46 @@
+package cn.stock.market.domain.basic.repository;
+
+import cn.qutaojing.common.domain.convert.IEntityPOConvert;
+import cn.qutaojing.common.domain.respostory.SimplePoConvertEntityRepository;
+import cn.qutaojing.common.utils.SpringUtils;
+import cn.stock.market.domain.basic.convert.StockIpoConvert;
+import cn.stock.market.domain.basic.entity.StockIpo;
+import cn.stock.market.infrastructure.db.po.StockIpoPO;
+import cn.stock.market.infrastructure.db.repo.StockIpoRepo;
+import com.rp.spring.jpa.GenericJpaRepository;
+import java.lang.Integer;
+import java.lang.Override;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+
+/**
+ * StockIpoRepository
+ *
+ * @author rplees
+ * @email rplees.i.ly@gmail.com
+ * @created 2023/12/28
+ */
+@Repository
+@RequiredArgsConstructor(
+ onConstructor = @__(@Autowired)
+)
+public class StockIpoRepository extends SimplePoConvertEntityRepository {
+ final StockIpoRepo repo;
+
+ final StockIpoConvert convert;
+
+ @Override
+ public GenericJpaRepository repo() {
+ return repo;
+ }
+
+ @Override
+ public IEntityPOConvert convert() {
+ return convert;
+ }
+
+ public static StockIpoRepository of() {
+ return SpringUtils.getBean(StockIpoRepository.class);
+ }
+}
diff --git a/src/main/java/cn/stock/market/domain/basic/service/StockIpoService.java b/src/main/java/cn/stock/market/domain/basic/service/StockIpoService.java
new file mode 100644
index 0000000..81a2a48
--- /dev/null
+++ b/src/main/java/cn/stock/market/domain/basic/service/StockIpoService.java
@@ -0,0 +1,33 @@
+package cn.stock.market.domain.basic.service;
+
+import cn.qutaojing.common.utils.SpringUtils;
+import cn.stock.market.domain.basic.factory.StockIpoFactory;
+import cn.stock.market.domain.basic.repository.StockIpoRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * StockIpoService
+ *
+ * @author rplees
+ * @email rplees.i.ly@gmail.com
+ * @created 2023/12/28
+ */
+@Service
+@RequiredArgsConstructor(
+ onConstructor = @__(@Autowired)
+)
+public class StockIpoService {
+ final StockIpoRepository repository;
+
+ final StockIpoFactory factory;
+
+ public StockIpoRepository repository() {
+ return repository;
+ }
+
+ public static StockIpoService of() {
+ return SpringUtils.getBean(StockIpoService.class);
+ }
+}
diff --git a/src/main/java/cn/stock/market/dto/StockIpoDTO.java b/src/main/java/cn/stock/market/dto/StockIpoDTO.java
new file mode 100644
index 0000000..8d3cb67
--- /dev/null
+++ b/src/main/java/cn/stock/market/dto/StockIpoDTO.java
@@ -0,0 +1,23 @@
+package cn.stock.market.dto;
+
+import cn.stock.market.infrastructure.db.po.StockIpoPO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * StockIpoDTO
+ *
+ * @author rplees
+ * @email rplees.i.ly@gmail.com
+ * @created 2023/12/28
+ */
+@Data
+@NoArgsConstructor
+@SuperBuilder
+@EqualsAndHashCode(
+ callSuper = false
+)
+public class StockIpoDTO extends StockIpoPO {
+}
diff --git a/src/main/java/cn/stock/market/dto/command/StockIpoCreateCommand.java b/src/main/java/cn/stock/market/dto/command/StockIpoCreateCommand.java
new file mode 100644
index 0000000..ba75cc2
--- /dev/null
+++ b/src/main/java/cn/stock/market/dto/command/StockIpoCreateCommand.java
@@ -0,0 +1,69 @@
+package cn.stock.market.dto.command;
+
+import java.lang.Integer;
+import java.lang.String;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * StockIpoCreateCommand
+ *
+ * @author rplees
+ * @email rplees.i.ly@gmail.com
+ * @created 2023/12/28
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+public class StockIpoCreateCommand {
+ Integer id;
+
+ /**
+ * 股票代码 */
+ String stockCode;
+
+ /**
+ * 股票名称 */
+ String stockName;
+
+ /**
+ * 发行价格 */
+ BigDecimal stockPrice;
+
+ /**
+ * 申购日期 */
+ Date subscriptionDate;
+
+ /**
+ * 上市日期 */
+ Date listingDate;
+
+ /**
+ * 是否显示【1 显示,2 不显示】 */
+ Integer isShow;
+
+ /**
+ * 是否上市【1 未上市,2 已上市】 */
+ Integer isList;
+
+ Date createDate;
+
+ Date updateDate;
+
+ /**
+ * 发行总数 */
+ Integer totalNumber;
+
+ /**
+ * 申请总额 */
+ String apply;
+
+ /**
+ * 市盈率 */
+ BigDecimal peRatio;
+
+ String sourceType;
+}
diff --git a/src/main/java/cn/stock/market/dto/command/StockIpoModifyCommand.java b/src/main/java/cn/stock/market/dto/command/StockIpoModifyCommand.java
new file mode 100644
index 0000000..005dbd4
--- /dev/null
+++ b/src/main/java/cn/stock/market/dto/command/StockIpoModifyCommand.java
@@ -0,0 +1,24 @@
+package cn.stock.market.dto.command;
+
+import java.lang.Integer;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * StockIpoModifyCommand
+ *
+ * @author rplees
+ * @email rplees.i.ly@gmail.com
+ * @created 2023/12/28
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@EqualsAndHashCode(
+ callSuper = false
+)
+public class StockIpoModifyCommand extends StockIpoCreateCommand {
+ Integer id;
+}
diff --git a/src/main/java/cn/stock/market/infrastructure/db/po/StockIpoPO.java b/src/main/java/cn/stock/market/infrastructure/db/po/StockIpoPO.java
new file mode 100644
index 0000000..b228275
--- /dev/null
+++ b/src/main/java/cn/stock/market/infrastructure/db/po/StockIpoPO.java
@@ -0,0 +1,87 @@
+package cn.stock.market.infrastructure.db.po;
+
+import java.lang.Integer;
+import java.lang.String;
+import java.math.BigDecimal;
+import java.util.Date;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+import org.hibernate.annotations.DynamicInsert;
+import org.hibernate.annotations.DynamicUpdate;
+
+/**
+ * StockIpoPO
+ *
+ * @author rplees
+ * @email rplees.i.ly@gmail.com
+ * @created 2023/12/28
+ */
+@SuperBuilder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Entity
+@DynamicInsert
+@DynamicUpdate
+@Table(
+ name = "stock_ipo"
+)
+public class StockIpoPO {
+ @Id
+ @GeneratedValue(
+ strategy = javax.persistence.GenerationType.IDENTITY
+ )
+ Integer id;
+
+ /**
+ * 股票代码 */
+ String stockCode;
+
+ /**
+ * 股票名称 */
+ String stockName;
+
+ /**
+ * 发行价格 */
+ BigDecimal stockPrice;
+
+ /**
+ * 申购日期 */
+ Date subscriptionDate;
+
+ /**
+ * 上市日期 */
+ Date listingDate;
+
+ /**
+ * 是否显示【1 显示,2 不显示】 */
+ Integer isShow;
+
+ /**
+ * 是否上市【1 未上市,2 已上市】 */
+ Integer isList;
+
+ Date createDate;
+
+ Date updateDate;
+
+ /**
+ * 发行总数 */
+ Integer totalNumber;
+
+ /**
+ * 申请总额 */
+ String apply;
+
+ /**
+ * 市盈率 */
+ BigDecimal peRatio;
+
+ String sourceType;
+}
diff --git a/src/main/java/cn/stock/market/infrastructure/db/repo/StockIpoRepo.java b/src/main/java/cn/stock/market/infrastructure/db/repo/StockIpoRepo.java
new file mode 100644
index 0000000..3e47807
--- /dev/null
+++ b/src/main/java/cn/stock/market/infrastructure/db/repo/StockIpoRepo.java
@@ -0,0 +1,15 @@
+package cn.stock.market.infrastructure.db.repo;
+
+import cn.stock.market.infrastructure.db.po.StockIpoPO;
+import com.rp.spring.jpa.GenericJpaRepository;
+import java.lang.Integer;
+
+/**
+ * StockIpoRepo
+ *
+ * @author rplees
+ * @email rplees.i.ly@gmail.com
+ * @created 2023/12/28
+ */
+public interface StockIpoRepo extends GenericJpaRepository {
+}
diff --git a/src/main/java/cn/stock/market/infrastructure/job/Scraper.java b/src/main/java/cn/stock/market/infrastructure/job/Scraper.java
index 0ce8ba8..6dd747d 100644
--- a/src/main/java/cn/stock/market/infrastructure/job/Scraper.java
+++ b/src/main/java/cn/stock/market/infrastructure/job/Scraper.java
@@ -1,11 +1,24 @@
package cn.stock.market.infrastructure.job;
import cn.stock.market.domain.basic.entity.BtodayStock;
+import cn.stock.market.domain.basic.entity.StockIpo;
import cn.stock.market.domain.basic.repository.BtodayStockRepository;
+import cn.stock.market.domain.basic.repository.StockIpoRepository;
+import cn.stock.market.dto.StockIpoDTO;
+import cn.stock.market.infrastructure.db.po.QStockIpoPO;
+import cn.stock.market.infrastructure.db.po.StockIpoPO;
import cn.stock.market.infrastructure.db.repo.BtodayStockRepo;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
@@ -17,6 +30,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
+import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
@@ -33,6 +47,8 @@ public class Scraper {
@Autowired
private BtodayStockRepository btodayStockRepo;
+ @Autowired
+ private StockIpoRepository stockIpoRepository;
private final ExecutorService executorService = Executors.newFixedThreadPool(5);
@@ -80,6 +96,124 @@ public class Scraper {
}
}
+
+
+
+
+ @Scheduled(cron = "0 0 5 * * ?")
+ @RequestMapping("/testScraperGetMoneyControllerNewIPO")
+ public void schedule2() {
+ // 目标 URL
+ String url = "https://www.moneycontrol.com/ipo/open-upcoming-ipos";
+ // 创建 HttpClient 实例
+ HttpClient client = HttpClients.createDefault();
+ // 创建 HttpGet 请求
+ HttpGet request = new HttpGet(url);
+ try {
+ // 执行请求
+ HttpResponse response = client.execute(request);
+
+ // 检查请求是否成功
+ if (response.getStatusLine().getStatusCode() == 200) {
+ // 获取响应体
+ String responseBody = EntityUtils.toString(response.getEntity());
+
+ // 使用 Jsoup 解析 HTML
+ Document doc = Jsoup.parse(responseBody);
+
+ // 找到包含 JSON 数据的