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 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 数据的