|
|
|
|
@ -34,15 +34,12 @@ import org.springblade.desk.oem.service.IOemStatementService; |
|
|
|
|
import org.springblade.desk.oem.service.IOemStatementTaskLogService; |
|
|
|
|
import org.springblade.desk.util.PriceMatcher; |
|
|
|
|
import org.springblade.erpdata.feign.IErpDataOemClient; |
|
|
|
|
import org.springblade.system.feign.IDictBizClient; |
|
|
|
|
import org.springblade.system.feign.IDictClient; |
|
|
|
|
import org.springblade.system.pojo.entity.Dict; |
|
|
|
|
import org.springblade.system.pojo.entity.DictBiz; |
|
|
|
|
import org.springframework.beans.BeanUtils; |
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
|
import java.text.ParseException; |
|
|
|
|
import java.text.SimpleDateFormat; |
|
|
|
|
import java.time.LocalDate; |
|
|
|
|
import java.time.ZoneId; |
|
|
|
|
@ -81,6 +78,8 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
public static final String MANUAL_AUTO = "0"; |
|
|
|
|
public static final String MANUAL_HAND = "1"; |
|
|
|
|
|
|
|
|
|
public static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd"); |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public IPage<StatementVO> selectOemStatementPage(IPage<StatementVO> page, StatementQuery mesOemStatement) { |
|
|
|
|
return page.setRecords(baseMapper.selectOemStatementPage(page, mesOemStatement)); |
|
|
|
|
@ -102,7 +101,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
AtomicInteger totalSuccess = new AtomicInteger(0); |
|
|
|
|
AtomicInteger totalError = new AtomicInteger(0); |
|
|
|
|
//按照镀后入库日期分组后,调用结算方法
|
|
|
|
|
Map<String, List<StatementVO>> groupedMap = statementVOS.stream().filter(vo -> vo.getPutStoreTime() != null && !vo.getPutStoreTime().trim().isEmpty()).collect(Collectors.groupingBy(StatementVO::getPutStoreTime)); |
|
|
|
|
Map<String, List<StatementVO>> groupedMap = statementVOS.stream().filter(vo -> vo.getPutStoreDate() != null && !vo.getPutStoreDate().trim().isEmpty()).collect(Collectors.groupingBy(StatementVO::getPutStoreDate)); |
|
|
|
|
groupedMap.entrySet().forEach(stringListEntry -> { |
|
|
|
|
R result = oemSettleAccounts(stringListEntry.getValue(), price, LocalDate.parse(stringListEntry.getKey())); |
|
|
|
|
|
|
|
|
|
@ -867,8 +866,8 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
//如总价大于0,则报价成功
|
|
|
|
|
if (totalPrice.compareTo(BigDecimal.ZERO) > 0) { |
|
|
|
|
statementVO.setRosStatus(StatementVO.IN_SETTLEMENT); |
|
|
|
|
statementVO.setTotalPrice(totalPrice); |
|
|
|
|
statementVO.setMemo("结算中"); |
|
|
|
|
statementVO.setTotalPrice(totalPrice); |
|
|
|
|
statementVO.setQuotation(quotation); |
|
|
|
|
return true; |
|
|
|
|
} else { |
|
|
|
|
@ -1033,10 +1032,10 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
BigDecimal unitPrice = new BigDecimal(priceSheet.getPrice()); |
|
|
|
|
BigDecimal qty = statementVO.getMakeQty(); |
|
|
|
|
statementVO.setRosStatus(StatementVO.IN_SETTLEMENT); |
|
|
|
|
statementVO.setMemo("结算中"); |
|
|
|
|
statementVO.setUnitPrice(unitPrice); |
|
|
|
|
statementVO.setUnit(priceSheet.getPrtum()); |
|
|
|
|
statementVO.setTotalPrice(unitPrice.multiply(qty)); |
|
|
|
|
statementVO.setMemo("结算中"); |
|
|
|
|
statementVO.setQuotation(priceSheet.getSeqid()); |
|
|
|
|
//使用此报价
|
|
|
|
|
return true; |
|
|
|
|
@ -1073,10 +1072,10 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
BigDecimal unitPrice = new BigDecimal(priceSheet.getPrice()); |
|
|
|
|
BigDecimal qty = statementVO.getMakeQty(); |
|
|
|
|
statementVO.setRosStatus(StatementVO.IN_SETTLEMENT); |
|
|
|
|
statementVO.setMemo("结算中"); |
|
|
|
|
statementVO.setUnitPrice(unitPrice); |
|
|
|
|
statementVO.setUnit(priceSheet.getPrtum()); |
|
|
|
|
statementVO.setTotalPrice(unitPrice.multiply(qty)); |
|
|
|
|
statementVO.setMemo("结算中"); |
|
|
|
|
statementVO.setQuotation(priceSheet.getSeqid()); |
|
|
|
|
return true; |
|
|
|
|
} else if (StairPriceSheetMap.keySet().contains("单批阶梯价(按单件面积)")) { |
|
|
|
|
@ -1101,10 +1100,10 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
BigDecimal unitPrice = new BigDecimal(priceSheet.getPrice()); |
|
|
|
|
BigDecimal qty = statementVO.getMakeQty(); |
|
|
|
|
statementVO.setRosStatus(StatementVO.IN_SETTLEMENT); |
|
|
|
|
statementVO.setMemo("结算中"); |
|
|
|
|
statementVO.setUnitPrice(unitPrice); |
|
|
|
|
statementVO.setUnit(priceSheet.getPrtum()); |
|
|
|
|
statementVO.setTotalPrice(unitPrice.multiply(qty)); |
|
|
|
|
statementVO.setMemo("结算中"); |
|
|
|
|
statementVO.setQuotation(priceSheet.getSeqid()); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
@ -1135,10 +1134,10 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
BigDecimal unitPrice = new BigDecimal(priceSheet.getPrice()); |
|
|
|
|
BigDecimal qty = statementVO.getMakeQty(); |
|
|
|
|
statementVO.setRosStatus(StatementVO.IN_SETTLEMENT); |
|
|
|
|
statementVO.setMemo("结算中"); |
|
|
|
|
statementVO.setUnitPrice(unitPrice); |
|
|
|
|
statementVO.setUnit(priceSheet.getPrtum()); |
|
|
|
|
statementVO.setTotalPrice(unitPrice.multiply(qty)); |
|
|
|
|
statementVO.setMemo("结算中"); |
|
|
|
|
statementVO.setQuotation(priceSheet.getSeqid()); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
@ -1196,7 +1195,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
public R generateSettlement() { |
|
|
|
|
List<OemStatementEntity> saves = new ArrayList<>(); |
|
|
|
|
// 查询未生成的结算数据
|
|
|
|
|
List<StatementVO> statementVOS = selectUnsettled(); |
|
|
|
|
List<StatementVO> statementVOS = selectUnsettled(new StatementQuery()); |
|
|
|
|
if (CollectionUtils.isEmpty(statementVOS)) { |
|
|
|
|
return R.fail("没有需要结算的记录"); |
|
|
|
|
} |
|
|
|
|
@ -1216,11 +1215,10 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
} |
|
|
|
|
// 获取最大镀后入库时间
|
|
|
|
|
Date maxPutStoreTimeDate = getMaxPutStoreTimeDate(statementVOS); |
|
|
|
|
// 记录结算数据
|
|
|
|
|
this.saveOrUpdateBatch(saves); |
|
|
|
|
// 记录结算日志
|
|
|
|
|
oemStatementTaskLogService.saveMaxPutStoreTime(maxPutStoreTimeDate); |
|
|
|
|
return R.success(); |
|
|
|
|
// 记录结算数据
|
|
|
|
|
return R.status(this.saveOrUpdateBatch(saves)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
@ -1228,8 +1226,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
* |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private List<StatementVO> selectUnsettled() { |
|
|
|
|
StatementQuery query = new StatementQuery(); |
|
|
|
|
private List<StatementVO> selectUnsettled(StatementQuery query) { |
|
|
|
|
Date lastMaxPutStoreTime = oemStatementTaskLogService.getLastMaxPutStoreTime(); |
|
|
|
|
if (lastMaxPutStoreTime != null) { |
|
|
|
|
query.setPostPlatingStorageTimeStart(lastMaxPutStoreTime.toInstant() |
|
|
|
|
@ -1635,7 +1632,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
private boolean isValid(StatementVO statementVO, PriceSheetVO priceSheetVO, boolean preFlag) { |
|
|
|
|
String startTime = priceSheetVO.getStartdat(); |
|
|
|
|
String validTime = priceSheetVO.getValiddat(); |
|
|
|
|
String putStoreTime = statementVO.getPutStoreTime(); |
|
|
|
|
String putStoreTime = statementVO.getPutStoreDate(); |
|
|
|
|
if (startTime == null || validTime == null || putStoreTime == null) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
@ -1671,9 +1668,9 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
String psName = statementVO.getPsName(); |
|
|
|
|
String partCode = statementVO.getPartCode(); |
|
|
|
|
String prodIdent = statementVO.getProductIdent(); |
|
|
|
|
String woCode = statementVO.getWoCode(); |
|
|
|
|
String ypCode = statementVO.getYpCode(); |
|
|
|
|
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(), woCode); |
|
|
|
|
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) { |
|
|
|
|
// TODO 金银价格字段缺失
|
|
|
|
|
match = PriceMatcher.isContainsPrice(sheet.getRemark(), price); |
|
|
|
|
@ -1733,9 +1730,9 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
} |
|
|
|
|
String ocCode = statementVO.getOcCode(); |
|
|
|
|
String prodIdent = statementVO.getProductIdent(); |
|
|
|
|
String woCode = statementVO.getYpCode(); |
|
|
|
|
String ypCode = statementVO.getYpCode(); |
|
|
|
|
for (PriceSheetVO sheet : priceSheetList) { |
|
|
|
|
boolean match = StringUtils.equals(sheet.getSplycode(), ocCode) && StringUtils.equals(sheet.getPrtlotno(), prodIdent) && StringUtils.equals(sheet.getWono(), woCode) |
|
|
|
|
boolean match = StringUtils.equals(sheet.getSplycode(), ocCode) && StringUtils.equals(sheet.getPrtlotno(), prodIdent) && StringUtils.equals(sheet.getWono(), ypCode) |
|
|
|
|
// TODO 报价单标准工艺代码没加
|
|
|
|
|
&& StringUtils.equals(sheet.getWono(), standardProcessCode); |
|
|
|
|
if (match && ruleTieredPricing(statementVO, sheet)) { |
|
|
|
|
@ -1837,11 +1834,11 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
totalPrice = unitPrice.multiply(qty); |
|
|
|
|
} |
|
|
|
|
statementVO.setRosStatus(StatementVO.IN_SETTLEMENT); |
|
|
|
|
statementVO.setMemo("结算中"); |
|
|
|
|
statementVO.setSettleTime(new Date()); |
|
|
|
|
statementVO.setUnitPrice(unitPrice); |
|
|
|
|
statementVO.setUnit(sheet.getPrtum()); |
|
|
|
|
statementVO.setTotalPrice(totalPrice); |
|
|
|
|
statementVO.setMemo("结算中"); |
|
|
|
|
statementVO.setQuotation(sheet.getSeqid()); |
|
|
|
|
return true; |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
@ -1884,33 +1881,41 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
//报价单号
|
|
|
|
|
String quotation = ""; |
|
|
|
|
if (tjtNum > 0) { |
|
|
|
|
List<PriceSheetVO> tjtPriceSheetList = coatingDescPriceSheetMap.get("涂箭头"); |
|
|
|
|
BigDecimal unitPrice = new BigDecimal(tjtPriceSheetList.get(0).getPrice()); |
|
|
|
|
BigDecimal itemTotalPrice = unitPrice.multiply(BigDecimal.valueOf(tjtNum)); |
|
|
|
|
StringBuilder quotationSb = new StringBuilder(); |
|
|
|
|
String prtum = ""; |
|
|
|
|
if (tsbNum > 0) { |
|
|
|
|
List<PriceSheetVO> tsbPriceSheetList = coatingDescPriceSheetMap.get("涂色标"); |
|
|
|
|
BigDecimal unitPrice = new BigDecimal(tsbPriceSheetList.get(0).getPrice()); |
|
|
|
|
BigDecimal itemTotalPrice = unitPrice.multiply(BigDecimal.valueOf(tsbNum)); |
|
|
|
|
totalPrice = totalPrice.add(itemTotalPrice); |
|
|
|
|
quotation = tjtPriceSheetList.get(0).getSeqid(); |
|
|
|
|
quotationSb.append(tsbPriceSheetList.get(0).getSeqid()).append("、"); |
|
|
|
|
prtum = tsbPriceSheetList.get(0).getPrtum(); |
|
|
|
|
} |
|
|
|
|
if (tsdNum > 0) { |
|
|
|
|
List<PriceSheetVO> tsdPriceSheetList = coatingDescPriceSheetMap.get("涂色带"); |
|
|
|
|
BigDecimal unitPrice = new BigDecimal(tsdPriceSheetList.get(0).getPrice()); |
|
|
|
|
BigDecimal itemTotalPrice = unitPrice.multiply(BigDecimal.valueOf(tsdNum)); |
|
|
|
|
totalPrice = totalPrice.add(itemTotalPrice); |
|
|
|
|
quotation = tsdPriceSheetList.get(0).getSeqid(); |
|
|
|
|
quotationSb.append(tsdPriceSheetList.get(0).getSeqid()).append("、"); |
|
|
|
|
prtum = tsdPriceSheetList.get(0).getPrtum(); |
|
|
|
|
} |
|
|
|
|
if (tsbNum > 0) { |
|
|
|
|
List<PriceSheetVO> tsbPriceSheetList = coatingDescPriceSheetMap.get("涂色标"); |
|
|
|
|
//唯一使用此报价单**结算**
|
|
|
|
|
BigDecimal unitPrice = new BigDecimal(tsbPriceSheetList.get(0).getPrice()); |
|
|
|
|
BigDecimal itemTotalPrice = unitPrice.multiply(BigDecimal.valueOf(tsbNum)); |
|
|
|
|
if (tjtNum > 0) { |
|
|
|
|
List<PriceSheetVO> tjtPriceSheetList = coatingDescPriceSheetMap.get("涂箭头"); |
|
|
|
|
BigDecimal unitPrice = new BigDecimal(tjtPriceSheetList.get(0).getPrice()); |
|
|
|
|
BigDecimal itemTotalPrice = unitPrice.multiply(BigDecimal.valueOf(tjtNum)); |
|
|
|
|
totalPrice = totalPrice.add(itemTotalPrice); |
|
|
|
|
quotation = tsbPriceSheetList.get(0).getSeqid(); |
|
|
|
|
quotationSb.append(tjtPriceSheetList.get(0).getSeqid()).append("、"); |
|
|
|
|
prtum = tjtPriceSheetList.get(0).getPrtum(); |
|
|
|
|
} |
|
|
|
|
String quotation = quotationSb.length() > 0 |
|
|
|
|
? quotationSb.substring(0, quotationSb.length() - 1) |
|
|
|
|
: ""; |
|
|
|
|
statementVO.setRosStatus(StatementVO.IN_SETTLEMENT); |
|
|
|
|
statementVO.setMemo("结算中"); |
|
|
|
|
statementVO.setSettleTime(new Date()); |
|
|
|
|
statementVO.setUnitPrice(totalPrice); |
|
|
|
|
statementVO.setUnit(prtum); |
|
|
|
|
statementVO.setTotalPrice(totalPrice); |
|
|
|
|
statementVO.setMemo("结算中"); |
|
|
|
|
statementVO.setQuotation(quotation); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
@ -1972,22 +1977,12 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
public static Date getMaxPutStoreTimeDate(List<StatementVO> list) { |
|
|
|
|
SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd"); |
|
|
|
|
if (list == null || list.isEmpty()) { |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
return list.stream() |
|
|
|
|
.map(StatementVO::getPutStoreTime) |
|
|
|
|
.filter(Objects::nonNull) |
|
|
|
|
.filter(s -> !s.isBlank()) |
|
|
|
|
.map(s -> { |
|
|
|
|
try { |
|
|
|
|
return SDF.parse(s); |
|
|
|
|
} catch (ParseException e) { |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
.filter(Objects::nonNull) |
|
|
|
|
.max(Date::compareTo) |
|
|
|
|
.orElse(null); |
|
|
|
|
} |
|
|
|
|
@ -1997,6 +1992,12 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
IPage<StatementVO> page = new Page<>(); |
|
|
|
|
page.setSize(999); |
|
|
|
|
List<StatementVO> statementVOS = baseMapper.selectOemStatementPage(page, mesOemStatement); |
|
|
|
|
statementVOS = statementVOS.stream().filter(vo -> { |
|
|
|
|
String memo = vo.getMemo(); |
|
|
|
|
return !"无需结算".equals(memo) |
|
|
|
|
&& !"重复镀后入库".equals(memo); |
|
|
|
|
}) |
|
|
|
|
.collect(Collectors.toList()); |
|
|
|
|
List<OemStatementEntity> saves = new ArrayList<>(); |
|
|
|
|
BigDecimal price = BigDecimal.ZERO; |
|
|
|
|
if (mesOemStatement.getPrice() != null) { |
|
|
|
|
@ -2032,6 +2033,17 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
price = mesOemStatement.getPrice(); |
|
|
|
|
} |
|
|
|
|
List<StatementVO> settlementList = settlement(statementVOS, price, true); |
|
|
|
|
settlementList.forEach(vo -> { |
|
|
|
|
if (vo.getPutStoreTime() != null) { |
|
|
|
|
vo.setPutStoreDate(SDF.format(vo.getPutStoreTime())); |
|
|
|
|
} |
|
|
|
|
if (vo.getSettleTime() != null) { |
|
|
|
|
vo.setSettleDate(SDF.format(vo.getSettleTime())); |
|
|
|
|
} |
|
|
|
|
if(vo.getRosStatus() != 3){ |
|
|
|
|
vo.setMemo(""); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
return settlementList; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -2136,4 +2148,30 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
return R.success(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public R supSettlement(StatementQuery mesOemStatement) { |
|
|
|
|
List<OemStatementEntity> saves = new ArrayList<>(); |
|
|
|
|
// 查询未生成的结算数据
|
|
|
|
|
List<StatementVO> statementVOS = selectUnsettled(new StatementQuery()); |
|
|
|
|
if (CollectionUtils.isEmpty(statementVOS)) { |
|
|
|
|
return R.fail("没有需要结算的记录"); |
|
|
|
|
} |
|
|
|
|
// 处理重复镀后入库
|
|
|
|
|
statementVOS = duplicatePutStore(statementVOS, saves); |
|
|
|
|
// 处理不结算数据
|
|
|
|
|
statementVOS = noSettlement(statementVOS); |
|
|
|
|
if (CollectionUtils.isEmpty(statementVOS)) { |
|
|
|
|
return R.fail("没有需要结算的记录"); |
|
|
|
|
} |
|
|
|
|
// 匹配标准工序代码
|
|
|
|
|
matchStandardProcess(statementVOS); |
|
|
|
|
// 结算处理
|
|
|
|
|
settlementProcess(statementVOS, saves); |
|
|
|
|
if (CollectionUtils.isEmpty(saves)) { |
|
|
|
|
return R.fail("没有需要结算的记录"); |
|
|
|
|
} |
|
|
|
|
// 记录结算数据
|
|
|
|
|
return R.status(this.saveOrUpdateBatch(saves)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|