|
|
|
|
@ -33,6 +33,7 @@ import org.springblade.core.mp.base.BaseServiceImpl; |
|
|
|
|
import java.math.BigDecimal; |
|
|
|
|
import java.time.LocalDate; |
|
|
|
|
import java.util.*; |
|
|
|
|
import java.util.concurrent.CompletableFuture; |
|
|
|
|
import java.util.concurrent.atomic.AtomicInteger; |
|
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
|
|
@ -73,7 +74,31 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
AtomicInteger countError = new AtomicInteger(0); |
|
|
|
|
//1.以外协厂商分组的Map<厂家名称, 待结算工序结算单列表>
|
|
|
|
|
Map<String, List<StatementVO>> oemAndStatementMap = statementVOS.stream().collect(Collectors.groupingBy(StatementVO::getOcName)); |
|
|
|
|
// 创建CompletableFuture列表
|
|
|
|
|
List<CompletableFuture<Void>> futures = new ArrayList<>(); |
|
|
|
|
for (Map.Entry<String, List<StatementVO>> listEntry : oemAndStatementMap.entrySet()) { |
|
|
|
|
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> { |
|
|
|
|
try { |
|
|
|
|
processOemStatements(listEntry.getKey(), listEntry.getValue(), price, putStoreDate, |
|
|
|
|
countSuccess, countError); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
log.error(String.format("处理外协厂商{}的结算单时发生异常", listEntry.getKey()), e); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
futures.add(future); |
|
|
|
|
} |
|
|
|
|
// 等待所有任务完成
|
|
|
|
|
try { |
|
|
|
|
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
log.error("异步处理结算单时发生异常", e); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return R.data(Map.of( |
|
|
|
|
"success", countSuccess.get(), |
|
|
|
|
"error", countError.get() |
|
|
|
|
)); |
|
|
|
|
/*for (Map.Entry<String, List<StatementVO>> listEntry : oemAndStatementMap.entrySet()) { |
|
|
|
|
//外协厂商下全部需要结算的结算单
|
|
|
|
|
List<StatementVO> statementVOList = listEntry.getValue(); |
|
|
|
|
|
|
|
|
|
@ -81,71 +106,6 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
String oemName = listEntry.getKey(); |
|
|
|
|
List<PriceSheetVO> priceSheetAllList = getPriceSheets(oemName, putStoreDate); |
|
|
|
|
|
|
|
|
|
//假数据测试用
|
|
|
|
|
// List<PriceSheetVO> priceSheetAllList = new ArrayList<>();
|
|
|
|
|
// PriceSheetVO priceSheet1 = new PriceSheetVO();
|
|
|
|
|
// priceSheet1.setPrice("60");
|
|
|
|
|
// priceSheet1.setSplyname(oemName);
|
|
|
|
|
// priceSheet1.setPrtum("件");
|
|
|
|
|
// priceSheet1.setWono("WO-N2510424439-R002");
|
|
|
|
|
// priceSheet1.setSeqid("GXJG-20250228018");
|
|
|
|
|
// priceSheet1.setGxinfo("玻璃封接电化学抛光");
|
|
|
|
|
// priceSheetAllList.add(priceSheet1);
|
|
|
|
|
// PriceSheetVO priceSheet2 = new PriceSheetVO();
|
|
|
|
|
// priceSheet2.setPrice("26");
|
|
|
|
|
// priceSheet2.setSplyname(oemName);
|
|
|
|
|
// priceSheet2.setPrtum("件");
|
|
|
|
|
// priceSheet2.setSeqid("GXJG-20250228012");
|
|
|
|
|
// priceSheet2.setGxinfo("玻璃封接电镀去氧化皮");
|
|
|
|
|
// priceSheet2.setPrtlotno("JI和JHT");
|
|
|
|
|
// priceSheet2.setStairflag("单批阶梯价(按单件面积)");
|
|
|
|
|
// priceSheet2.setLower("5");
|
|
|
|
|
// priceSheet2.setUpper("0");
|
|
|
|
|
// priceSheet2.setPrtno("21E6-575-10724-%螺母");
|
|
|
|
|
// priceSheetAllList.add(priceSheet2);
|
|
|
|
|
// PriceSheetVO priceSheet3 = new PriceSheetVO();
|
|
|
|
|
// priceSheet3.setPrice("34");
|
|
|
|
|
// priceSheet3.setSplyname(oemName);
|
|
|
|
|
// priceSheet3.setPrtum("件");
|
|
|
|
|
// priceSheet3.setSeqid("GXJG-20250228012");
|
|
|
|
|
// priceSheet3.setGxinfo("玻璃封接电镀去氧化皮");
|
|
|
|
|
// priceSheet3.setPrtlotno("JI和JHT");
|
|
|
|
|
// priceSheet3.setStairflag("单批阶梯价(按单件面积)");
|
|
|
|
|
// priceSheet3.setLower("10");
|
|
|
|
|
// priceSheet3.setUpper("5.00001");
|
|
|
|
|
// priceSheet3.setPrtno("21E6-575-10724-%螺母");
|
|
|
|
|
// priceSheetAllList.add(priceSheet3);
|
|
|
|
|
// PriceSheetVO priceSheet4 = new PriceSheetVO();
|
|
|
|
|
// priceSheet4.setPrice("15");
|
|
|
|
|
// priceSheet4.setSplyname(oemName);
|
|
|
|
|
// priceSheet4.setPrtum("件");
|
|
|
|
|
// priceSheet4.setSeqid("GXJG-20250228012");
|
|
|
|
|
// priceSheet4.setGxinfo("玻璃封接电镀去氧化皮");
|
|
|
|
|
// priceSheet4.setPrtlotno("JHT");
|
|
|
|
|
// priceSheet4.setStairflag("非阶梯价");
|
|
|
|
|
// priceSheet4.setPrtno("21E6-575-10724-%螺母");
|
|
|
|
|
// priceSheetAllList.add(priceSheet4);
|
|
|
|
|
// PriceSheetVO priceSheet5 = new PriceSheetVO();
|
|
|
|
|
// priceSheet5.setPrice("99");
|
|
|
|
|
// priceSheet5.setSplyname(oemName);
|
|
|
|
|
// priceSheet5.setPrtum("件");
|
|
|
|
|
// priceSheet5.setSeqid("GXJG-20250228012");
|
|
|
|
|
// priceSheet5.setGxinfo("玻璃封接电镀去氧化皮");
|
|
|
|
|
// priceSheet5.setStairflag("非阶梯价");
|
|
|
|
|
// priceSheet5.setPrtno("21E6-575-10724-%螺母");
|
|
|
|
|
// priceSheet5.setRemark("氰化亚金钾380.01-400元/克(未税)");
|
|
|
|
|
// priceSheetAllList.add(priceSheet5);
|
|
|
|
|
// PriceSheetVO priceSheet6 = new PriceSheetVO();
|
|
|
|
|
// priceSheet6.setPrice("200");
|
|
|
|
|
// priceSheet6.setSplyname(oemName);
|
|
|
|
|
// priceSheet6.setPrtum("件");
|
|
|
|
|
// priceSheet6.setSeqid("GXJG-20250228012");
|
|
|
|
|
// priceSheet6.setGxinfo("玻璃封接电镀去氧化皮");
|
|
|
|
|
// priceSheet6.setStairflag("非阶梯价");
|
|
|
|
|
// priceSheet6.setPrtno("21E6-575-10724-%螺母");
|
|
|
|
|
// priceSheet6.setRemark("氰化亚金钾400.01-500元/克(未税)");
|
|
|
|
|
// priceSheetAllList.add(priceSheet6);
|
|
|
|
|
|
|
|
|
|
if (priceSheetAllList.isEmpty()) { |
|
|
|
|
//【结算异常】
|
|
|
|
|
statementVOList.forEach(statementVO -> { |
|
|
|
|
@ -155,43 +115,43 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
} else { |
|
|
|
|
//工序分组Map<工序, 报价列表>
|
|
|
|
|
Map<String, List<PriceSheetVO>> priceSheetMap = priceSheetAllList.stream().collect(Collectors.groupingBy(PriceSheetVO::getGxinfo)); |
|
|
|
|
/*statementVOList.forEach(statementVO -> { |
|
|
|
|
List<PriceSheetVO> matchedPriceSheets = MatchTheQuotations(statementVO, priceSheetMap); |
|
|
|
|
if (matchedPriceSheets.isEmpty()) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
statementVO.setPriceSheetList(matchedPriceSheets); |
|
|
|
|
});*/ |
|
|
|
|
//3.为每个结算单匹配报价集合
|
|
|
|
|
statementVOList.forEach(statementVO -> { |
|
|
|
|
List<PriceSheetVO> matchedPriceSheets = MatchTheQuotations(statementVO, priceSheetMap); |
|
|
|
|
if (null == matchedPriceSheets || matchedPriceSheets.isEmpty()) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
statementVO.setPriceSheetList(matchedPriceSheets); |
|
|
|
|
//4.匹配规则,过滤出唯一报价
|
|
|
|
|
//①.匹配车间订单号
|
|
|
|
|
if (ruleWoNo(statementVO, true)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//②.匹配物料名称和质量等级
|
|
|
|
|
if (rulePartNameAndProdIdent(statementVO)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//③.匹配金价银价
|
|
|
|
|
if (ruleGoldAndSilverPrices(statementVO, price)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//④.涂色标、涂色带、涂箭头
|
|
|
|
|
if (ruleColor(statementVO, true)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//⑤.物料号匹配
|
|
|
|
|
if (ruleGoods(statementVO)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//⑥.阶梯价匹配
|
|
|
|
|
if (ruleTieredPricing(statementVO, true)) { |
|
|
|
|
try { |
|
|
|
|
List<PriceSheetVO> matchedPriceSheets = MatchTheQuotations(statementVO, priceSheetMap); |
|
|
|
|
if (null == matchedPriceSheets || matchedPriceSheets.isEmpty()) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
statementVO.setPriceSheetList(matchedPriceSheets); |
|
|
|
|
//4.匹配规则,过滤出唯一报价
|
|
|
|
|
//①.匹配车间订单号
|
|
|
|
|
if (ruleWoNo(statementVO, true)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//②.匹配物料名称和质量等级
|
|
|
|
|
if (rulePartNameAndProdIdent(statementVO)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//③.匹配金价银价
|
|
|
|
|
if (ruleGoldAndSilverPrices(statementVO, price)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//④.涂色标、涂色带、涂箭头
|
|
|
|
|
if (ruleColor(statementVO, true)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//⑤.物料号匹配
|
|
|
|
|
if (ruleGoods(statementVO)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//⑥.阶梯价匹配
|
|
|
|
|
if (ruleTieredPricing(statementVO, true)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
}catch (Exception e){ |
|
|
|
|
log.error("结算单处理异常", e); |
|
|
|
|
statementVO.setRosStatus(StatementVO.ERR_SETTLEMENT); |
|
|
|
|
statementVO.setMemo("结算处理异常: " + e.getMessage()); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
@ -217,7 +177,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
return R.data(Map.of( |
|
|
|
|
"success", countSuccess, |
|
|
|
|
"error", countError |
|
|
|
|
)); |
|
|
|
|
));*/ |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -251,76 +211,6 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
String oemName = listEntry.getKey(); |
|
|
|
|
List<PriceSheetVO> priceSheetAllList = getPriceSheets(oemName); |
|
|
|
|
|
|
|
|
|
//假数据测试用
|
|
|
|
|
// List<PriceSheetVO> priceSheetAllList = new ArrayList<>();
|
|
|
|
|
// PriceSheetVO priceSheet1 = new PriceSheetVO();
|
|
|
|
|
// priceSheet1.setPrice("60");
|
|
|
|
|
// priceSheet1.setSplyname(oemName);
|
|
|
|
|
// priceSheet1.setPrtum("件");
|
|
|
|
|
// priceSheet1.setWono("WO-N2510424439-R002");
|
|
|
|
|
// priceSheet1.setSeqid("GXJG-20250228018");
|
|
|
|
|
// priceSheet1.setGxinfo("玻璃封接电化学抛光");
|
|
|
|
|
// priceSheet1.setStartdat("2026-01-15");
|
|
|
|
|
// priceSheetAllList.add(priceSheet1);
|
|
|
|
|
// PriceSheetVO priceSheet2 = new PriceSheetVO();
|
|
|
|
|
// priceSheet2.setPrice("26");
|
|
|
|
|
// priceSheet2.setSplyname(oemName);
|
|
|
|
|
// priceSheet2.setPrtum("件");
|
|
|
|
|
// priceSheet2.setSeqid("GXJG-20250228012");
|
|
|
|
|
// priceSheet2.setGxinfo("玻璃封接电镀去氧化皮");
|
|
|
|
|
// priceSheet2.setPrtlotno("JI和JHT");
|
|
|
|
|
// priceSheet2.setStairflag("单批阶梯价(按单件面积)");
|
|
|
|
|
// priceSheet2.setLower("5");
|
|
|
|
|
// priceSheet2.setUpper("0");
|
|
|
|
|
// priceSheet2.setPrtno("21E6-575-10724-%螺母");
|
|
|
|
|
// priceSheet2.setStartdat("2026-01-15");
|
|
|
|
|
// priceSheetAllList.add(priceSheet2);
|
|
|
|
|
// PriceSheetVO priceSheet3 = new PriceSheetVO();
|
|
|
|
|
// priceSheet3.setPrice("34");
|
|
|
|
|
// priceSheet3.setSplyname(oemName);
|
|
|
|
|
// priceSheet3.setPrtum("件");
|
|
|
|
|
// priceSheet3.setSeqid("GXJG-20250228012");
|
|
|
|
|
// priceSheet3.setGxinfo("玻璃封接电镀去氧化皮");
|
|
|
|
|
// priceSheet3.setPrtlotno("JI和JHT");
|
|
|
|
|
// priceSheet3.setStairflag("单批阶梯价(按单件面积)");
|
|
|
|
|
// priceSheet3.setLower("10");
|
|
|
|
|
// priceSheet3.setUpper("5.00001");
|
|
|
|
|
// priceSheet3.setPrtno("21E6-575-10724-%螺母");
|
|
|
|
|
// priceSheet3.setStartdat("2026-01-15");
|
|
|
|
|
// priceSheetAllList.add(priceSheet3);
|
|
|
|
|
// PriceSheetVO priceSheet4 = new PriceSheetVO();
|
|
|
|
|
// priceSheet4.setPrice("15");
|
|
|
|
|
// priceSheet4.setSplyname(oemName);
|
|
|
|
|
// priceSheet4.setPrtum("件");
|
|
|
|
|
// priceSheet4.setSeqid("GXJG-20250228012");
|
|
|
|
|
// priceSheet4.setGxinfo("玻璃封接电镀去氧化皮");
|
|
|
|
|
// priceSheet4.setPrtlotno("JHT");
|
|
|
|
|
// priceSheet4.setStairflag("非阶梯价");
|
|
|
|
|
// priceSheet4.setPrtno("21E6-575-10724-%螺母");
|
|
|
|
|
// priceSheet4.setStartdat("2026-01-15");
|
|
|
|
|
// priceSheetAllList.add(priceSheet4);
|
|
|
|
|
// PriceSheetVO priceSheet5 = new PriceSheetVO();
|
|
|
|
|
// priceSheet5.setPrice("99");
|
|
|
|
|
// priceSheet5.setSplyname(oemName);
|
|
|
|
|
// priceSheet5.setPrtum("件");
|
|
|
|
|
// priceSheet5.setSeqid("GXJG-20250228012");
|
|
|
|
|
// priceSheet5.setGxinfo("玻璃封接电镀去氧化皮");
|
|
|
|
|
// priceSheet5.setStairflag("非阶梯价");
|
|
|
|
|
// priceSheet5.setPrtno("21E6-575-10724-%螺母");
|
|
|
|
|
// priceSheet5.setRemark("氰化亚金钾380.01-400元/克(未税)");
|
|
|
|
|
// priceSheet5.setStartdat("2026-01-15");
|
|
|
|
|
// priceSheetAllList.add(priceSheet5);
|
|
|
|
|
// PriceSheetVO priceSheet6 = new PriceSheetVO();
|
|
|
|
|
// priceSheet6.setPrice("200");
|
|
|
|
|
// priceSheet6.setSplyname(oemName);
|
|
|
|
|
// priceSheet6.setPrtum("件");
|
|
|
|
|
// priceSheet6.setSeqid("GXJG-20250228012");
|
|
|
|
|
// priceSheet6.setGxinfo("玻璃封接电镀去氧化皮");
|
|
|
|
|
// priceSheet6.setStairflag("非阶梯价");
|
|
|
|
|
// priceSheet6.setPrtno("21E6-575-10724-%螺母");
|
|
|
|
|
// priceSheet6.setRemark("氰化亚金钾400.01-500元/克(未税)");
|
|
|
|
|
// priceSheet6.setStartdat("2026-01-16");
|
|
|
|
|
// priceSheetAllList.add(priceSheet6);
|
|
|
|
|
if (priceSheetAllList.isEmpty()) { |
|
|
|
|
//【结算异常】
|
|
|
|
|
statementVOList.forEach(statementVO -> { |
|
|
|
|
@ -345,40 +235,202 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
)); |
|
|
|
|
//3.为每个结算单匹配报价集合
|
|
|
|
|
statementVOList.forEach(statementVO -> { |
|
|
|
|
try { |
|
|
|
|
List<PriceSheetVO> matchedPriceSheets = MatchTheQuotations(statementVO, priceSheetMap); |
|
|
|
|
if (null == matchedPriceSheets || matchedPriceSheets.isEmpty()) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
statementVO.setPriceSheetList(matchedPriceSheets); |
|
|
|
|
//4.匹配规则,过滤出唯一报价
|
|
|
|
|
//①.匹配车间订单号
|
|
|
|
|
if (ruleWoNo(statementVO, false)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//②.匹配物料名称和质量等级
|
|
|
|
|
if (rulePartNameAndProdIdent(statementVO)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//③.匹配金价银价
|
|
|
|
|
if (ruleGoldAndSilverPrices(statementVO, price)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//④.涂色标、涂色带、涂箭头
|
|
|
|
|
if (ruleColor(statementVO, false)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//⑤.物料号匹配
|
|
|
|
|
if (ruleGoods(statementVO)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//⑥.阶梯价匹配
|
|
|
|
|
if (ruleTieredPricing(statementVO, false)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
log.error("结算单处理异常", e); |
|
|
|
|
statementVO.setRosStatus(StatementVO.ERR_SETTLEMENT); |
|
|
|
|
statementVO.setMemo("结算处理异常: " + e.getMessage()); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return statementVOS; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 以外协厂商分组结算 |
|
|
|
|
* |
|
|
|
|
* @param oemName |
|
|
|
|
* @param statementVOList |
|
|
|
|
* @param price |
|
|
|
|
* @param putStoreDate |
|
|
|
|
* @param countSuccess |
|
|
|
|
* @param countError |
|
|
|
|
*/ |
|
|
|
|
private void processOemStatements(String oemName, List<StatementVO> statementVOList, |
|
|
|
|
BigDecimal price, LocalDate putStoreDate, |
|
|
|
|
AtomicInteger countSuccess, AtomicInteger countError) { |
|
|
|
|
// 1. 查询报价单
|
|
|
|
|
List<PriceSheetVO> priceSheetAllList = getPriceSheets(oemName, putStoreDate); |
|
|
|
|
//假数据测试用
|
|
|
|
|
// List<PriceSheetVO> priceSheetAllList = new ArrayList<>();
|
|
|
|
|
// PriceSheetVO priceSheet1 = new PriceSheetVO();
|
|
|
|
|
// priceSheet1.setPrice("60");
|
|
|
|
|
// priceSheet1.setSplyname(oemName);
|
|
|
|
|
// priceSheet1.setPrtum("件");
|
|
|
|
|
// priceSheet1.setWono("WO-N2510424439-R002");
|
|
|
|
|
// priceSheet1.setSeqid("GXJG-20250228018");
|
|
|
|
|
// priceSheet1.setGxinfo("玻璃封接电化学抛光");
|
|
|
|
|
// priceSheetAllList.add(priceSheet1);
|
|
|
|
|
// PriceSheetVO priceSheet2 = new PriceSheetVO();
|
|
|
|
|
// priceSheet2.setPrice("26");
|
|
|
|
|
// priceSheet2.setSplyname(oemName);
|
|
|
|
|
// priceSheet2.setPrtum("件");
|
|
|
|
|
// priceSheet2.setSeqid("GXJG-20250228012");
|
|
|
|
|
// priceSheet2.setGxinfo("玻璃封接电镀去氧化皮");
|
|
|
|
|
// priceSheet2.setPrtlotno("JI和JHT");
|
|
|
|
|
// priceSheet2.setStairflag("单批阶梯价(按单件面积)");
|
|
|
|
|
// priceSheet2.setLower("5");
|
|
|
|
|
// priceSheet2.setUpper("0");
|
|
|
|
|
// priceSheet2.setPrtno("21E6-575-10724-%螺母");
|
|
|
|
|
// priceSheetAllList.add(priceSheet2);
|
|
|
|
|
// PriceSheetVO priceSheet3 = new PriceSheetVO();
|
|
|
|
|
// priceSheet3.setPrice("34");
|
|
|
|
|
// priceSheet3.setSplyname(oemName);
|
|
|
|
|
// priceSheet3.setPrtum("件");
|
|
|
|
|
// priceSheet3.setSeqid("GXJG-20250228012");
|
|
|
|
|
// priceSheet3.setGxinfo("玻璃封接电镀去氧化皮");
|
|
|
|
|
// priceSheet3.setPrtlotno("JI和JHT");
|
|
|
|
|
// priceSheet3.setStairflag("单批阶梯价(按单件面积)");
|
|
|
|
|
// priceSheet3.setLower("10");
|
|
|
|
|
// priceSheet3.setUpper("5.00001");
|
|
|
|
|
// priceSheet3.setPrtno("21E6-575-10724-%螺母");
|
|
|
|
|
// priceSheetAllList.add(priceSheet3);
|
|
|
|
|
// PriceSheetVO priceSheet4 = new PriceSheetVO();
|
|
|
|
|
// priceSheet4.setPrice("15");
|
|
|
|
|
// priceSheet4.setSplyname(oemName);
|
|
|
|
|
// priceSheet4.setPrtum("件");
|
|
|
|
|
// priceSheet4.setSeqid("GXJG-20250228012");
|
|
|
|
|
// priceSheet4.setGxinfo("玻璃封接电镀去氧化皮");
|
|
|
|
|
// priceSheet4.setPrtlotno("JHT");
|
|
|
|
|
// priceSheet4.setStairflag("非阶梯价");
|
|
|
|
|
// priceSheet4.setPrtno("21E6-575-10724-%螺母");
|
|
|
|
|
// priceSheetAllList.add(priceSheet4);
|
|
|
|
|
// PriceSheetVO priceSheet5 = new PriceSheetVO();
|
|
|
|
|
// priceSheet5.setPrice("99");
|
|
|
|
|
// priceSheet5.setSplyname(oemName);
|
|
|
|
|
// priceSheet5.setPrtum("件");
|
|
|
|
|
// priceSheet5.setSeqid("GXJG-20250228012");
|
|
|
|
|
// priceSheet5.setGxinfo("玻璃封接电镀去氧化皮");
|
|
|
|
|
// priceSheet5.setStairflag("非阶梯价");
|
|
|
|
|
// priceSheet5.setPrtno("21E6-575-10724-%螺母");
|
|
|
|
|
// priceSheet5.setRemark("氰化亚金钾380.01-400元/克(未税)");
|
|
|
|
|
// priceSheetAllList.add(priceSheet5);
|
|
|
|
|
// PriceSheetVO priceSheet6 = new PriceSheetVO();
|
|
|
|
|
// priceSheet6.setPrice("200");
|
|
|
|
|
// priceSheet6.setSplyname(oemName);
|
|
|
|
|
// priceSheet6.setPrtum("件");
|
|
|
|
|
// priceSheet6.setSeqid("GXJG-20250228012");
|
|
|
|
|
// priceSheet6.setGxinfo("玻璃封接电镀去氧化皮");
|
|
|
|
|
// priceSheet6.setStairflag("非阶梯价");
|
|
|
|
|
// priceSheet6.setPrtno("21E6-575-10724-%螺母");
|
|
|
|
|
// priceSheet6.setRemark("氰化亚金钾400.01-500元/克(未税)");
|
|
|
|
|
// priceSheetAllList.add(priceSheet6);
|
|
|
|
|
if (priceSheetAllList.isEmpty()) { |
|
|
|
|
// 【结算异常】
|
|
|
|
|
statementVOList.forEach(statementVO -> { |
|
|
|
|
statementVO.setRosStatus(StatementVO.ERR_SETTLEMENT); |
|
|
|
|
statementVO.setMemo(String.format("外协厂商【%s】匹配无报价记录", oemName)); |
|
|
|
|
}); |
|
|
|
|
} else { |
|
|
|
|
// 2. 工序分组Map<工序, 报价列表>
|
|
|
|
|
Map<String, List<PriceSheetVO>> priceSheetMap = priceSheetAllList.stream() |
|
|
|
|
.collect(Collectors.groupingBy(PriceSheetVO::getGxinfo)); |
|
|
|
|
|
|
|
|
|
// 3. 为每个结算单匹配报价集合
|
|
|
|
|
statementVOList.forEach(statementVO -> { |
|
|
|
|
try { |
|
|
|
|
List<PriceSheetVO> matchedPriceSheets = MatchTheQuotations(statementVO, priceSheetMap); |
|
|
|
|
if (null == matchedPriceSheets || matchedPriceSheets.isEmpty()) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
statementVO.setPriceSheetList(matchedPriceSheets); |
|
|
|
|
//4.匹配规则,过滤出唯一报价
|
|
|
|
|
//①.匹配车间订单号
|
|
|
|
|
if (ruleWoNo(statementVO, false)) { |
|
|
|
|
|
|
|
|
|
// 4. 匹配规则,过滤出唯一报价
|
|
|
|
|
// ①. 匹配车间订单号
|
|
|
|
|
if (ruleWoNo(statementVO, true)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//②.匹配物料名称和质量等级
|
|
|
|
|
// ②. 匹配物料名称和质量等级
|
|
|
|
|
if (rulePartNameAndProdIdent(statementVO)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//③.匹配金价银价
|
|
|
|
|
// ③. 匹配金价银价
|
|
|
|
|
if (ruleGoldAndSilverPrices(statementVO, price)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//④.涂色标、涂色带、涂箭头
|
|
|
|
|
if (ruleColor(statementVO, false)) { |
|
|
|
|
// ④. 涂色标、涂色带、涂箭头
|
|
|
|
|
if (ruleColor(statementVO, true)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//⑤.物料号匹配
|
|
|
|
|
// ⑤. 物料号匹配
|
|
|
|
|
if (ruleGoods(statementVO)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//⑥.阶梯价匹配
|
|
|
|
|
if (ruleTieredPricing(statementVO, false)) { |
|
|
|
|
// ⑥. 阶梯价匹配
|
|
|
|
|
if (ruleTieredPricing(statementVO, true)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
log.error("结算单处理异常", e); |
|
|
|
|
statementVO.setRosStatus(StatementVO.ERR_SETTLEMENT); |
|
|
|
|
statementVO.setMemo("结算处理异常: " + e.getMessage()); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 5. 批量保存
|
|
|
|
|
List<OemStatementEntity> saves = statementVOList.stream() |
|
|
|
|
.map(statementVO -> { |
|
|
|
|
// 统计数量
|
|
|
|
|
if (Objects.equals(OemStatementEntity.IN_SETTLEMENT, statementVO.getRosStatus())) { |
|
|
|
|
countSuccess.incrementAndGet(); |
|
|
|
|
} else if (Objects.equals(OemStatementEntity.ERR_SETTLEMENT, statementVO.getRosStatus())) { |
|
|
|
|
countError.incrementAndGet(); |
|
|
|
|
} |
|
|
|
|
OemStatementEntity entity = new OemStatementEntity(); |
|
|
|
|
BeanUtils.copyProperties(statementVO, entity); |
|
|
|
|
entity.setUpdateTime(new Date()); |
|
|
|
|
entity.setIsDeleted(0); |
|
|
|
|
return entity; |
|
|
|
|
}) |
|
|
|
|
.collect(Collectors.toList()); |
|
|
|
|
|
|
|
|
|
// 批量插入或更新
|
|
|
|
|
if (!saves.isEmpty()) { |
|
|
|
|
baseMapper.insertOrUpdate(saves); |
|
|
|
|
} |
|
|
|
|
return statementVOS; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
@ -468,17 +520,22 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
* 获取报价单列表 |
|
|
|
|
*/ |
|
|
|
|
private List<PriceSheetVO> getPriceSheets(String oemName, LocalDate putStoreDate) { |
|
|
|
|
PriceSheetQuery query = new PriceSheetQuery(); |
|
|
|
|
query.setOcName(oemName); |
|
|
|
|
query.setInDateStart(putStoreDate); |
|
|
|
|
query.setInDateEnd(putStoreDate); |
|
|
|
|
try { |
|
|
|
|
PriceSheetQuery query = new PriceSheetQuery(); |
|
|
|
|
query.setOcName(oemName); |
|
|
|
|
query.setInDateStart(putStoreDate); |
|
|
|
|
query.setInDateEnd(putStoreDate); |
|
|
|
|
|
|
|
|
|
R<Page<PriceSheetVO>> pageR = erpDataOemClient.priceSheetData(query, new Query() {{ |
|
|
|
|
setSize(99999); |
|
|
|
|
}}); |
|
|
|
|
R<Page<PriceSheetVO>> pageR = erpDataOemClient.priceSheetData(query, new Query() {{ |
|
|
|
|
setSize(99999); |
|
|
|
|
}}); |
|
|
|
|
|
|
|
|
|
if (pageR != null && pageR.getData() != null) { |
|
|
|
|
return pageR.getData().getRecords(); |
|
|
|
|
if (pageR != null && pageR.getData() != null) { |
|
|
|
|
return pageR.getData().getRecords(); |
|
|
|
|
} |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
log.error("获取报价单失败,失败原因:{}", e); |
|
|
|
|
return Collections.emptyList(); |
|
|
|
|
} |
|
|
|
|
return Collections.emptyList(); |
|
|
|
|
} |
|
|
|
|
|