From 14e7829a25fd9b79dbae2b35f852341e4b2122ef Mon Sep 17 00:00:00 2001 From: han0 Date: Thu, 21 Dec 2023 16:17:14 +0800 Subject: [PATCH] =?UTF-8?q?feat(public):=20=E6=96=B0=E5=A2=9E=E5=85=AC?= =?UTF-8?q?=E4=BC=97=E7=BD=91=E7=AB=99=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/controller/PublicController.java | 76 +++++++++++++ .../xinke/main/model/db/PricePublish.java | 25 +++++ .../xinke/main/model/vo/PublicResponse.java | 105 ++++++++++++++++++ .../main/model/vo/PublicTrendResponse.java | 95 ++++++++++++++++ .../main/service/PricePublishService.java | 3 + 5 files changed, 304 insertions(+) create mode 100644 src/main/java/mjkf/xinke/main/controller/PublicController.java create mode 100644 src/main/java/mjkf/xinke/main/model/vo/PublicResponse.java create mode 100644 src/main/java/mjkf/xinke/main/model/vo/PublicTrendResponse.java diff --git a/src/main/java/mjkf/xinke/main/controller/PublicController.java b/src/main/java/mjkf/xinke/main/controller/PublicController.java new file mode 100644 index 0000000..35d1651 --- /dev/null +++ b/src/main/java/mjkf/xinke/main/controller/PublicController.java @@ -0,0 +1,76 @@ +package mjkf.xinke.main.controller; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.jgy.xxs.core.http.resp.HttpResponse; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import mjkf.xinke.main.common.http.FuHttpResponse; +import mjkf.xinke.main.constant.PricePublishType; +import mjkf.xinke.main.model.db.PricePublish; +import mjkf.xinke.main.model.vo.PublicResponse; +import mjkf.xinke.main.model.vo.PublicTrendResponse; +import mjkf.xinke.main.service.PricePublishService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + *

+ * 公众网站 前端控制器 + *

+ * + * @author han0 + * @since 2023-12-19 + */ +@RestController +@RequestMapping("/public") +public class PublicController { + @Resource + PricePublishService pricePublishService; + + @ApiOperation("查询") + @GetMapping("/") + public HttpResponse list ( + @ApiParam(value = "地区") @RequestParam(value="region") String region, + @ApiParam(value = "年份") @RequestParam(value="year") Integer year, + @ApiParam(value = "月份") @RequestParam(value="month") Integer month, + @ApiParam(value = "关键字") @RequestParam(value="keyword", required = false) String keyword, + @ApiParam(value = "名称") @RequestParam(value="name", required = false) String name, + @ApiParam(value = "规格") @RequestParam(value="spec", required = false) String spec + ) throws Exception { + LambdaQueryWrapper query = pricePublishService.getQuery(year, month, null, name, spec, PricePublishType.CURRENT); + if (keyword != null && ObjectUtil.isNotEmpty(keyword)) { + query.and(e -> e + .like(PricePublish::getName, keyword).or() + .like(PricePublish::getSpec, keyword) + ); + } + var currentData = pricePublishService.list(query); + + LambdaQueryWrapper queryPrevious = pricePublishService.getQuery(year - 1, month, null, name, spec, PricePublishType.CURRENT); + var previousData = pricePublishService.list(queryPrevious); + + // 计算同比, 组合 + var result = PublicResponse.list(currentData, previousData, region); + + return FuHttpResponse.Builder().dataResponse(result).build(); + } + + @ApiOperation("走势") + @GetMapping("/{materialId}/trend") + public HttpResponse trend ( + @ApiParam(value = "地区") @RequestParam(value="region") String region, + @ApiParam(value = "材料id") @RequestParam(value="materialId") String materialId + ) throws Exception { + LambdaQueryWrapper query = pricePublishService.getQuery(null, null, materialId, null, null, PricePublishType.CURRENT); + var data = pricePublishService.list(query); + + var result = PublicTrendResponse.list(data, region); + + return FuHttpResponse.Builder().dataResponse(result).build(); + } +} diff --git a/src/main/java/mjkf/xinke/main/model/db/PricePublish.java b/src/main/java/mjkf/xinke/main/model/db/PricePublish.java index aa961b0..b21672e 100644 --- a/src/main/java/mjkf/xinke/main/model/db/PricePublish.java +++ b/src/main/java/mjkf/xinke/main/model/db/PricePublish.java @@ -199,4 +199,29 @@ public class PricePublish extends Model { this.updateUserName = user.getName(); this.updateUserId = user.getId(); } + + public BigDecimal getRegionPrice(String region) { + if (region.contains("福州")) { + return this.priceFuzhou; + } else if (region.contains("厦门")) { + return this.priceXiamen; + } else if (region.contains("莆田")) { + return this.pricePutian; + } else if (region.contains("三明")) { + return this.priceSanming; + } else if (region.contains("泉州")) { + return this.priceQuanzhou; + } else if (region.contains("漳州")) { + return this.priceZhangzhou; + } else if (region.contains("南平")) { + return this.priceNanpin; + } else if (region.contains("龙岩")) { + return this.priceLongyan; + } else if (region.contains("宁德")) { + return this.priceNingde; + } else if (region.contains("平潭")) { + return this.pricePintan; + } + return null; + } } diff --git a/src/main/java/mjkf/xinke/main/model/vo/PublicResponse.java b/src/main/java/mjkf/xinke/main/model/vo/PublicResponse.java new file mode 100644 index 0000000..b8832bb --- /dev/null +++ b/src/main/java/mjkf/xinke/main/model/vo/PublicResponse.java @@ -0,0 +1,105 @@ +package mjkf.xinke.main.model.vo; + +import com.fasterxml.jackson.databind.PropertyNamingStrategy; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import io.swagger.annotations.ApiModel; +import lombok.Getter; +import lombok.Setter; +import mjkf.xinke.main.model.db.PricePublish; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + + +/** + *

+ * 计算结果 + *

+ * + * @author han0 + * @since 2023-11-10 + */ +@Getter +@Setter +@ApiModel(value = "PublicResponse对象", description = "计算结果") +@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) +public class PublicResponse { + private String updateUserId; + + private String updateUserName; + + private LocalDateTime updateTime; + + private String createUserId; + + private String createUserName; + + private LocalDateTime createTime; + + private String deleteUserId; + + private String deleteUserName; + + private LocalDateTime deleteTime; + + private Integer id; + + private String materialId; + + private Integer year; + + private Integer month; + + private String name; + + private String spec; + + private BigDecimal price; + + private BigDecimal tax; + + private Integer status; + + private Integer type; + + private Float yoy; + + static public List list(List currentData, List previousData, String region) { + var previousPriceMap = previousData.stream().collect(Collectors.toMap(PricePublish::getMaterialId, item -> item.getRegionPrice(region))); + var result = currentData.stream().map(item -> new PublicResponse(item, previousPriceMap, region)).collect(Collectors.toList()); + return result; + } + + public PublicResponse(PricePublish item, Map previousPriceMap, String region) { + this.updateUserId = item.getUpdateUserId(); + this.updateUserName = item.getUpdateUserName(); + this.updateTime = item.getUpdateTime(); + this.createUserId = item.getCreateUserId(); + this.createUserName = item.getCreateUserName(); + this.createTime = item.getCreateTime(); + this.deleteUserId = item.getDeleteUserId(); + this.deleteUserName = item.getDeleteUserName(); + this.deleteTime = item.getDeleteTime(); + this.id = item.getId(); + this.materialId = item.getMaterialId(); + this.year = item.getYear(); + this.month = item.getMonth(); + this.name = item.getName(); + this.spec = item.getSpec(); + this.tax = item.getTax(); + this.status = item.getStatus(); + this.type = item.getType(); + + this.price = item.getRegionPrice(region); + + var previousPrice = previousPriceMap.getOrDefault(this.materialId, BigDecimal.valueOf(0)); + if (previousPrice.intValue() == 0) { + this.yoy = 0f; + } else { + this.yoy = (this.price.floatValue() - previousPrice.floatValue()) / previousPrice.floatValue(); + } + } +} diff --git a/src/main/java/mjkf/xinke/main/model/vo/PublicTrendResponse.java b/src/main/java/mjkf/xinke/main/model/vo/PublicTrendResponse.java new file mode 100644 index 0000000..05b0ad7 --- /dev/null +++ b/src/main/java/mjkf/xinke/main/model/vo/PublicTrendResponse.java @@ -0,0 +1,95 @@ +package mjkf.xinke.main.model.vo; + +import com.fasterxml.jackson.databind.PropertyNamingStrategy; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import io.swagger.annotations.ApiModel; +import lombok.Getter; +import lombok.Setter; +import mjkf.xinke.main.model.db.PricePublish; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + + +/** + *

+ * 计算结果 + *

+ * + * @author han0 + * @since 2023-11-10 + */ +@Getter +@Setter +@ApiModel(value = "PublicResponse对象", description = "计算结果") +@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) +public class PublicTrendResponse { + private String updateUserId; + + private String updateUserName; + + private LocalDateTime updateTime; + + private String createUserId; + + private String createUserName; + + private LocalDateTime createTime; + + private String deleteUserId; + + private String deleteUserName; + + private LocalDateTime deleteTime; + + private Integer id; + + private String materialId; + + private Integer year; + + private Integer month; + + private String name; + + private String spec; + + private BigDecimal price; + + private BigDecimal tax; + + private Integer status; + + private Integer type; + + static public List list(List data, String region) { + var result = data.stream().map(item -> new PublicTrendResponse(item, region)).collect(Collectors.toList()); + return result; + } + + public PublicTrendResponse(PricePublish item, String region) { + this.updateUserId = item.getUpdateUserId(); + this.updateUserName = item.getUpdateUserName(); + this.updateTime = item.getUpdateTime(); + this.createUserId = item.getCreateUserId(); + this.createUserName = item.getCreateUserName(); + this.createTime = item.getCreateTime(); + this.deleteUserId = item.getDeleteUserId(); + this.deleteUserName = item.getDeleteUserName(); + this.deleteTime = item.getDeleteTime(); + this.id = item.getId(); + this.materialId = item.getMaterialId(); + this.year = item.getYear(); + this.month = item.getMonth(); + this.name = item.getName(); + this.spec = item.getSpec(); + this.tax = item.getTax(); + this.status = item.getStatus(); + this.type = item.getType(); + + this.price = item.getRegionPrice(region); + } +} diff --git a/src/main/java/mjkf/xinke/main/service/PricePublishService.java b/src/main/java/mjkf/xinke/main/service/PricePublishService.java index ef2bfcf..1e09d55 100644 --- a/src/main/java/mjkf/xinke/main/service/PricePublishService.java +++ b/src/main/java/mjkf/xinke/main/service/PricePublishService.java @@ -31,6 +31,9 @@ public class PricePublishService extends ServiceImpl, P if (type != null) { query.eq(PricePublish::getType, type); } + if (spec != null) { + query.eq(PricePublish::getSpec, spec); + } return query; }