From 4a95ae90c398794d2a0bae6f8599f900b5457757 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B8=B8=E7=86=9F=E5=90=B4=E5=BD=A6=E7=A5=96?= Date: Fri, 3 Jul 2026 10:11:57 +0800 Subject: [PATCH] 1 --- .../PartPriceAnalysisController.java | 31 +++++++ .../data/PartPriceAnalysisQueryVo.java | 24 ++++++ .../supplier/data/PartPriceAnalysisVo.java | 41 ++++++++++ .../mapper/PartPriceAnalysisMapper.java | 14 ++++ .../service/IPartPriceAnalysisService.java | 11 +++ .../impl/PartPriceAnalysisServiceImpl.java | 81 +++++++++++++++++++ .../supplier/PartPriceAnalysisMapper.xml | 40 +++++++++ 7 files changed, 242 insertions(+) create mode 100644 src/main/java/com/xujie/modules/supplier/controller/PartPriceAnalysisController.java create mode 100644 src/main/java/com/xujie/modules/supplier/data/PartPriceAnalysisQueryVo.java create mode 100644 src/main/java/com/xujie/modules/supplier/data/PartPriceAnalysisVo.java create mode 100644 src/main/java/com/xujie/modules/supplier/mapper/PartPriceAnalysisMapper.java create mode 100644 src/main/java/com/xujie/modules/supplier/service/IPartPriceAnalysisService.java create mode 100644 src/main/java/com/xujie/modules/supplier/service/impl/PartPriceAnalysisServiceImpl.java create mode 100644 src/main/resources/mapper/supplier/PartPriceAnalysisMapper.xml diff --git a/src/main/java/com/xujie/modules/supplier/controller/PartPriceAnalysisController.java b/src/main/java/com/xujie/modules/supplier/controller/PartPriceAnalysisController.java new file mode 100644 index 0000000..a17d5d2 --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/controller/PartPriceAnalysisController.java @@ -0,0 +1,31 @@ +package com.xujie.modules.supplier.controller; + +import com.xujie.common.utils.R; +import com.xujie.modules.supplier.data.PartPriceAnalysisQueryVo; +import com.xujie.modules.supplier.service.IPartPriceAnalysisService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Api(tags = "物料价格分析") +@RestController +@RequestMapping("/supplier/partPriceAnalysis") +public class PartPriceAnalysisController { + + @Autowired + private IPartPriceAnalysisService partPriceAnalysisService; + + @PostMapping("/list") + @ApiOperation("查询已接受报价记录") + public R list(@RequestBody PartPriceAnalysisQueryVo query) { + try { + return R.ok().put("list", partPriceAnalysisService.list(query)); + } catch (Exception e) { + return R.error(e.getMessage()); + } + } +} diff --git a/src/main/java/com/xujie/modules/supplier/data/PartPriceAnalysisQueryVo.java b/src/main/java/com/xujie/modules/supplier/data/PartPriceAnalysisQueryVo.java new file mode 100644 index 0000000..9a945aa --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/data/PartPriceAnalysisQueryVo.java @@ -0,0 +1,24 @@ +package com.xujie.modules.supplier.data; + +import lombok.Data; + +/** + * 物料价格分析查询条件 + */ +@Data +public class PartPriceAnalysisQueryVo { + + private String site; + + /** 开始时间(必填) */ + private String startDate; + + /** 结束时间(可选) */ + private String endDate; + + /** 物料编码(必填) */ + private String partNo; + + /** 供应商编码(可选,填写则按物料+供应商过滤) */ + private String supplierId; +} diff --git a/src/main/java/com/xujie/modules/supplier/data/PartPriceAnalysisVo.java b/src/main/java/com/xujie/modules/supplier/data/PartPriceAnalysisVo.java new file mode 100644 index 0000000..c46a0c9 --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/data/PartPriceAnalysisVo.java @@ -0,0 +1,41 @@ +package com.xujie.modules.supplier.data; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 物料价格分析结果 + */ +@Data +public class PartPriceAnalysisVo { + + private String partNo; + + private String partDesc; + + private BigDecimal price; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createdDate; + + private String supplierId; + + private String supplierName; + + /** 一级分类名称 */ + private String categoryName; + + /** 二级分类名称 */ + private String categoryLevel2Name; + + /** 三级分类名称 */ + private String categoryLevel3Name; + + /** 相对上一次报价涨跌幅,如 +5%、-5% */ + private String priceChangeRate; +} diff --git a/src/main/java/com/xujie/modules/supplier/mapper/PartPriceAnalysisMapper.java b/src/main/java/com/xujie/modules/supplier/mapper/PartPriceAnalysisMapper.java new file mode 100644 index 0000000..d06119d --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/mapper/PartPriceAnalysisMapper.java @@ -0,0 +1,14 @@ +package com.xujie.modules.supplier.mapper; + +import com.xujie.modules.supplier.data.PartPriceAnalysisQueryVo; +import com.xujie.modules.supplier.data.PartPriceAnalysisVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface PartPriceAnalysisMapper { + + List listAcceptedQuotes(@Param("query") PartPriceAnalysisQueryVo query); +} diff --git a/src/main/java/com/xujie/modules/supplier/service/IPartPriceAnalysisService.java b/src/main/java/com/xujie/modules/supplier/service/IPartPriceAnalysisService.java new file mode 100644 index 0000000..94a7895 --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/service/IPartPriceAnalysisService.java @@ -0,0 +1,11 @@ +package com.xujie.modules.supplier.service; + +import com.xujie.modules.supplier.data.PartPriceAnalysisQueryVo; +import com.xujie.modules.supplier.data.PartPriceAnalysisVo; + +import java.util.List; + +public interface IPartPriceAnalysisService { + + List list(PartPriceAnalysisQueryVo query); +} diff --git a/src/main/java/com/xujie/modules/supplier/service/impl/PartPriceAnalysisServiceImpl.java b/src/main/java/com/xujie/modules/supplier/service/impl/PartPriceAnalysisServiceImpl.java new file mode 100644 index 0000000..e9f45c4 --- /dev/null +++ b/src/main/java/com/xujie/modules/supplier/service/impl/PartPriceAnalysisServiceImpl.java @@ -0,0 +1,81 @@ +package com.xujie.modules.supplier.service.impl; + +import com.xujie.modules.supplier.data.PartPriceAnalysisQueryVo; +import com.xujie.modules.supplier.data.PartPriceAnalysisVo; +import com.xujie.modules.supplier.mapper.PartPriceAnalysisMapper; +import com.xujie.modules.supplier.service.IPartPriceAnalysisService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; + +@Service +public class PartPriceAnalysisServiceImpl implements IPartPriceAnalysisService { + + @Autowired + private PartPriceAnalysisMapper partPriceAnalysisMapper; + + @Override + public List list(PartPriceAnalysisQueryVo query) { + if (query == null) { + throw new RuntimeException("查询参数不能为空"); + } + if (!StringUtils.hasText(query.getStartDate())) { + throw new RuntimeException("开始时间不能为空"); + } + if (!StringUtils.hasText(query.getPartNo())) { + throw new RuntimeException("物料编码不能为空"); + } + if (!StringUtils.hasText(query.getSite())) { + throw new RuntimeException("工厂不能为空"); + } + + query.setSite(query.getSite().trim()); + query.setPartNo(query.getPartNo().trim()); + if (StringUtils.hasText(query.getSupplierId())) { + query.setSupplierId(query.getSupplierId().trim()); + } + + List list = partPriceAnalysisMapper.listAcceptedQuotes(query); + fillPriceChangeRate(list); + return list; + } + + /** + * 列表按报价时间倒序(最新在上),与下一条(时间上更早的一次报价)比较涨跌幅 + */ + private void fillPriceChangeRate(List list) { + if (list == null || list.isEmpty()) { + return; + } + for (int i = 0; i < list.size(); i++) { + PartPriceAnalysisVo current = list.get(i); + if (i >= list.size() - 1) { + current.setPriceChangeRate(null); + continue; + } + PartPriceAnalysisVo previous = list.get(i + 1); + current.setPriceChangeRate(calcPriceChangeRate(current.getPrice(), previous.getPrice())); + } + } + + private String calcPriceChangeRate(BigDecimal currentPrice, BigDecimal previousPrice) { + if (currentPrice == null || previousPrice == null || previousPrice.compareTo(BigDecimal.ZERO) == 0) { + return null; + } + BigDecimal changePercent = currentPrice.subtract(previousPrice) + .multiply(BigDecimal.valueOf(100)) + .divide(previousPrice, 2, RoundingMode.HALF_UP); + if (changePercent.compareTo(BigDecimal.ZERO) == 0) { + return "0%"; + } + String value = changePercent.stripTrailingZeros().toPlainString(); + if (changePercent.compareTo(BigDecimal.ZERO) > 0) { + return "+" + value + "%"; + } + return value + "%"; + } +} diff --git a/src/main/resources/mapper/supplier/PartPriceAnalysisMapper.xml b/src/main/resources/mapper/supplier/PartPriceAnalysisMapper.xml new file mode 100644 index 0000000..51f1d3f --- /dev/null +++ b/src/main/resources/mapper/supplier/PartPriceAnalysisMapper.xml @@ -0,0 +1,40 @@ + + + + + + +