外协结算

liweidong
maxiangong 22 hours ago
parent a8564ffafe
commit d9f5b25cc7
  1. 7
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/vo/PriceSheetVO.java
  2. 49
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/util/PriceMatcher.java
  3. 30
      blade-service/blade-desk/src/main/java/org/springblade/desk/oem/service/impl/OemStatementServiceImpl.java
  4. 5
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpDataOemMapper.xml

@ -138,7 +138,7 @@ public class PriceSheetVO {
* 镀种描述
*/
@Schema(description = "镀种描述")
private String coating_desc;
private String coatingDesc;
/**
* 阶梯价计量单位
*/
@ -146,6 +146,9 @@ public class PriceSheetVO {
private String stairunit;
@Schema(description = "金银价格")
private String au_ag_price;
private String auAgPrice;
@Schema(description = "标准工艺代码")
private String standardProcessCode;
}

@ -89,6 +89,53 @@ public class PriceMatcher {
return false;
}
/**
* 判断备注是否包含目标价格
*/
private static boolean containsPriceNew(String remark, BigDecimal targetPrice) {
if(StringUtils.isEmpty(remark)){
return false;
}
// 正则表达式匹配价格范围或单价
// 匹配如:350.01-360、467.5、100.5-200.8
String regex = "(\\d+(?:\\.\\d+)?)(?:,(\\d+(?:\\.\\d+)?))?";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(remark);
while (matcher.find()) {
String startPriceStr = matcher.group(1);
String endPriceStr = matcher.group(2);
try {
if (endPriceStr != null) {
// 价格范围,如 "350.01-360"
BigDecimal startPrice = new BigDecimal(startPriceStr);
BigDecimal endPrice = new BigDecimal(endPriceStr);
// 检查目标价格是否在范围内
if (targetPrice.compareTo(startPrice) >= 0 &&
targetPrice.compareTo(endPrice) <= 0) {
return true;
}
} else {
// 单一价格,如 "467.5"
BigDecimal singlePrice = new BigDecimal(startPriceStr);
// 检查目标价格是否等于这个价格
if (targetPrice.compareTo(singlePrice) == 0) {
return true;
}
}
} catch (NumberFormatException e) {
// 解析失败,跳过这个匹配
continue;
}
}
return false;
}
/**
* 使用Stream API的版本
*/
@ -111,6 +158,6 @@ public class PriceMatcher {
* @return
*/
public static boolean isContainsPrice(String remark, BigDecimal targetPrice) {
return containsPrice(remark, targetPrice);
return containsPriceNew(remark, targetPrice);
}
}

@ -827,9 +827,9 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
}
//涂色标、涂色带、涂箭头的报价集合
Map<String, List<PriceSheetVO>> coatingDescPriceSheetMap = priceSheetList.stream().filter(priceSheet -> {
String coatingDesc = priceSheet.getCoating_desc();
String coatingDesc = priceSheet.getCoatingDesc();
return coatingDesc != null && !coatingDesc.trim().isEmpty() && ("涂色标".equals(coatingDesc) || "涂色带".equals(coatingDesc) || "涂箭头".equals(coatingDesc));
}).collect(Collectors.groupingBy(PriceSheetVO::getCoating_desc, Collectors.toList()));
}).collect(Collectors.groupingBy(PriceSheetVO::getCoatingDesc, Collectors.toList()));
// 如果没有任何报价记录
if (coatingDescPriceSheetMap.isEmpty()) {
//结算异常:无报价记录结算结果
@ -1759,7 +1759,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
for (PriceSheetVO sheet : priceSheetList) {
boolean match = StringUtils.equals(sheet.getSplycode(), ocCode) && StringUtils.equals(sheet.getGxinfo(), psName) && StringUtils.equals(sheet.getPrtno(), partCode) && StringUtils.equals(sheet.getPrtlotno(), prodIdent) && StringUtils.equals(sheet.getWono(), ypCode);
if (match && price != null && price.compareTo(BigDecimal.ZERO) != 0) {
match = PriceMatcher.isContainsPrice(sheet.getAu_ag_price(), price);
match = PriceMatcher.isContainsPrice(sheet.getAuAgPrice(), price);
}
if (match && ruleTieredPricing(statementVO, sheet)) {
return setSettlementInfo(statementVO, sheet);
@ -1788,7 +1788,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
for (PriceSheetVO sheet : priceSheetList) {
boolean match = StringUtils.equals(sheet.getSplycode(), ocCode) && StringUtils.equals(sheet.getGxinfo(), psName) && StringUtils.equals(sheet.getPrtno(), partCode) && StringUtils.equals(sheet.getWono(), ypCode);
if (match && price != null && price.compareTo(BigDecimal.ZERO) != 0) {
match = PriceMatcher.isContainsPrice(sheet.getAu_ag_price(), price);
match = PriceMatcher.isContainsPrice(sheet.getAuAgPrice(), price);
}
if (match && ruleTieredPricing(statementVO, sheet)) {
return setSettlementInfo(statementVO, sheet);
@ -1817,7 +1817,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
for (PriceSheetVO sheet : priceSheetList) {
boolean match = StringUtils.equals(sheet.getSplycode(), ocCode) && StringUtils.equals(sheet.getGxinfo(), psName) && StringUtils.equals(sheet.getPrtno(), partCode) && StringUtils.equals(sheet.getPrtlotno(), prodIdent);
if (match && price != null && price.compareTo(BigDecimal.ZERO) != 0) {
match = PriceMatcher.isContainsPrice(sheet.getAu_ag_price(), price);
match = PriceMatcher.isContainsPrice(sheet.getAuAgPrice(), price);
}
if (match && ruleTieredPricing(statementVO, sheet)) {
return setSettlementInfo(statementVO, sheet);
@ -1845,7 +1845,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
for (PriceSheetVO sheet : priceSheetList) {
boolean match = StringUtils.equals(sheet.getSplycode(), ocCode) && StringUtils.equals(sheet.getGxinfo(), psName) && StringUtils.equals(sheet.getPrtno(), partCode);
if (match && price != null && price.compareTo(BigDecimal.ZERO) != 0) {
match = PriceMatcher.isContainsPrice(sheet.getAu_ag_price(), price);
match = PriceMatcher.isContainsPrice(sheet.getAuAgPrice(), price);
}
if (match && ruleTieredPricing(statementVO, sheet)) {
return setSettlementInfo(statementVO, sheet);
@ -1874,9 +1874,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
String prodIdent = statementVO.getProductIdent();
String ypCode = statementVO.getYpCode();
for (PriceSheetVO sheet : priceSheetList) {
boolean match = StringUtils.equals(sheet.getSplycode(), ocCode) && StringUtils.equals(sheet.getPrtlotno(), prodIdent) && StringUtils.equals(sheet.getWono(), ypCode)
// TODO 报价单标准工艺代码没加
&& StringUtils.equals(sheet.getWono(), standardProcessCode);
boolean match = StringUtils.equals(sheet.getSplycode(), ocCode) && StringUtils.equals(sheet.getPrtlotno(), prodIdent) && StringUtils.equals(sheet.getWono(), ypCode) && StringUtils.equals(sheet.getStandardProcessCode(), standardProcessCode);
if (match && ruleTieredPricing(statementVO, sheet)) {
return setSettlementInfo(statementVO, sheet);
}
@ -1903,9 +1901,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
String ocCode = statementVO.getOcCode();
String prodIdent = statementVO.getProductIdent();
for (PriceSheetVO sheet : priceSheetList) {
boolean match = StringUtils.equals(sheet.getSplycode(), ocCode) && StringUtils.equals(sheet.getPrtlotno(), prodIdent)
// TODO 报价单标准工艺代码没加
&& StringUtils.equals(sheet.getWono(), standardProcessCode);
boolean match = StringUtils.equals(sheet.getSplycode(), ocCode) && StringUtils.equals(sheet.getPrtlotno(), prodIdent) && StringUtils.equals(sheet.getStandardProcessCode(), standardProcessCode);
if (match && ruleTieredPricing(statementVO, sheet)) {
return setSettlementInfo(statementVO, sheet);
}
@ -1933,11 +1929,9 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
String ocCode = statementVO.getOcCode();
List<PriceSheetVO> colorPriceSheetVOS = new ArrayList<>();
for (PriceSheetVO sheet : priceSheetList) {
boolean match = StringUtils.equals(sheet.getSplycode(), ocCode)
// TODO 报价单标准工艺代码没加
&& StringUtils.equals(sheet.getWono(), standardProcessCode);
boolean match = StringUtils.equals(sheet.getSplycode(), ocCode) && StringUtils.equals(sheet.getStandardProcessCode(), standardProcessCode);
if (match && price != null && price.compareTo(BigDecimal.ZERO) != 0) {
match = PriceMatcher.isContainsPrice(sheet.getAu_ag_price(), price);
match = PriceMatcher.isContainsPrice(sheet.getAuAgPrice(), price);
}
if (match) {
if (hasColorCount(statementVO)) {
@ -2003,9 +1997,9 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
}
//涂色标、涂色带、涂箭头的报价集合
Map<String, List<PriceSheetVO>> coatingDescPriceSheetMap = priceSheetList.stream().filter(priceSheet -> {
String coatingDesc = priceSheet.getCoating_desc();
String coatingDesc = priceSheet.getCoatingDesc();
return coatingDesc != null && !coatingDesc.trim().isEmpty() && ("涂色标".equals(coatingDesc) || "涂色带".equals(coatingDesc) || "涂箭头".equals(coatingDesc));
}).collect(Collectors.groupingBy(PriceSheetVO::getCoating_desc, Collectors.toList()));
}).collect(Collectors.groupingBy(PriceSheetVO::getCoatingDesc, Collectors.toList()));
// 如果没有任何报价记录
if (coatingDescPriceSheetMap.isEmpty()) {
return false;

@ -5,7 +5,10 @@
<select id="priceSheetData" resultType="org.springblade.desk.oem.pojo.vo.PriceSheetVO">
SELECT
a.*
a.*,
a.coating_desc as coatingDesc,
a.AU_AG_PRICE as auAgPrice,
a.STANDARD_PROCESS_CODE as standardProcessCode
FROM
dba_mgr.v_mes_rb_prtprice a
<where>

Loading…
Cancel
Save