|
|
|
|
@ -1,6 +1,7 @@ |
|
|
|
|
package org.springblade.desk.oem.service.impl; |
|
|
|
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil; |
|
|
|
|
import cn.hutool.core.util.StrUtil; |
|
|
|
|
import com.alibaba.nacos.common.utils.CollectionUtils; |
|
|
|
|
import com.alibaba.nacos.shaded.com.google.common.collect.Lists; |
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.Wrapper; |
|
|
|
|
@ -33,6 +34,7 @@ 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.pojo.entity.DictBiz; |
|
|
|
|
import org.springframework.beans.BeanUtils; |
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
|
|
@ -549,16 +551,30 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
UpdateWrapper<OemStatementEntity> updateWrapper = new UpdateWrapper<>(); |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 2026/5/15 |
|
|
|
|
* ●审核不通过:结算状态更新为【结算异常】-【异常原因:MES结算审核不通过】 |
|
|
|
|
* ●审核通过:结算状态更新为【待推送】 |
|
|
|
|
* */ |
|
|
|
|
if (3 == oemSettleAccountsApproval.getApprovalStatus()) { |
|
|
|
|
//审核通过
|
|
|
|
|
updateWrapper.set("approval_status", OemStatementEntity.APPROVAL_STATUS_VIA).set("memo", "外协结算完成").set("ros_status", OemStatementEntity.OK_SETTLEMENT).in("id", ids); |
|
|
|
|
updateWrapper.set("approval_status", OemStatementEntity.APPROVAL_STATUS_VIA) |
|
|
|
|
.set("memo", "外协结算完成") |
|
|
|
|
.set("ros_status", OemStatementEntity.OK_SETTLEMENT) |
|
|
|
|
.in("id", ids); |
|
|
|
|
} else { |
|
|
|
|
//审核不通过:(1)原因为不需要结算的更新为【无需结算】(2)原因是基础数据有误的更新为【结算异常】
|
|
|
|
|
if (1 == oemSettleAccountsApproval.getReason()) { |
|
|
|
|
updateWrapper.set("approval_status", OemStatementEntity.APPROVAL_STATUS_VIA).set("memo", "无需结算").set("total_price", null).set("unit_price", null).set("quotation", "").set("ros_status", OemStatementEntity.NOT_NEED_SETTLEMENT).in("id", ids); |
|
|
|
|
updateWrapper.set("approval_status", OemStatementEntity.APPROVAL_STATUS_VIA) |
|
|
|
|
.set("memo", "无需结算").set("total_price", null).set("unit_price", null) |
|
|
|
|
.set("quotation", "") |
|
|
|
|
.set("ros_status", OemStatementEntity.NOT_NEED_SETTLEMENT) |
|
|
|
|
.in("id", ids); |
|
|
|
|
} else { |
|
|
|
|
updateWrapper.set("approval_status", OemStatementEntity.APPROVAL_STATUS_FAIL).set("memo", "基础数据有误").set("ros_status", OemStatementEntity.ERR_SETTLEMENT).in("id", ids); |
|
|
|
|
updateWrapper.set("approval_status", OemStatementEntity.APPROVAL_STATUS_FAIL) |
|
|
|
|
.set("memo", "基础数据有误") |
|
|
|
|
.set("ros_status", OemStatementEntity.ERR_SETTLEMENT) |
|
|
|
|
.in("id", ids); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -568,18 +584,20 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
@Override |
|
|
|
|
public R notNeedSettlement(List<StatementVO> list) { |
|
|
|
|
if (null != list && list.size() > 0) { |
|
|
|
|
List<OemStatementEntity> saves = list.stream().map(statementVO -> { |
|
|
|
|
OemStatementEntity entity = new OemStatementEntity(); |
|
|
|
|
BeanUtils.copyProperties(statementVO, entity); |
|
|
|
|
entity.setApprovalStatus(OemStatementEntity.APPROVAL_STATUS_VIA); |
|
|
|
|
entity.setRosStatus(OemStatementEntity.NOT_NEED_SETTLEMENT); |
|
|
|
|
entity.setMemo("无需结算"); |
|
|
|
|
entity.setTotalPrice(null); |
|
|
|
|
entity.setUnitPrice(null); |
|
|
|
|
entity.setQuotation(""); |
|
|
|
|
entity.setUpdateTime(new Date()); |
|
|
|
|
return entity; |
|
|
|
|
}).collect(Collectors.toList()); |
|
|
|
|
List<OemStatementEntity> saves = list.stream() |
|
|
|
|
.map(statementVO -> { |
|
|
|
|
OemStatementEntity entity = new OemStatementEntity(); |
|
|
|
|
BeanUtils.copyProperties(statementVO, entity); |
|
|
|
|
entity.setApprovalStatus(OemStatementEntity.APPROVAL_STATUS_VIA); |
|
|
|
|
entity.setRosStatus(OemStatementEntity.ERR_SETTLEMENT); |
|
|
|
|
entity.setMemo("无需结算"); |
|
|
|
|
entity.setTotalPrice(null); |
|
|
|
|
entity.setUnitPrice(null); |
|
|
|
|
entity.setQuotation(""); |
|
|
|
|
entity.setUpdateTime(new Date()); |
|
|
|
|
return entity; |
|
|
|
|
}) |
|
|
|
|
.collect(Collectors.toList()); |
|
|
|
|
|
|
|
|
|
// baseMapper.insertOrUpdate(saves);
|
|
|
|
|
// 逐条处理
|
|
|
|
|
@ -1188,7 +1206,42 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void generateSettlement() { |
|
|
|
|
public R generateSettlement() { |
|
|
|
|
List<OemStatementEntity> saves = new ArrayList<>(); |
|
|
|
|
// 查询未生成的结算数据
|
|
|
|
|
List<StatementVO> statementVOS = selectUnsettled(); |
|
|
|
|
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("没有需要结算的记录"); |
|
|
|
|
} |
|
|
|
|
// 获取最大镀后入库时间
|
|
|
|
|
Date maxPutStoreTimeDate = getMaxPutStoreTimeDate(statementVOS); |
|
|
|
|
// 记录结算数据
|
|
|
|
|
this.saveOrUpdateBatch(saves); |
|
|
|
|
// 记录结算日志
|
|
|
|
|
oemStatementTaskLogService.saveMaxPutStoreTime(maxPutStoreTimeDate); |
|
|
|
|
return R.success(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 查询未生成的结算数据 |
|
|
|
|
* |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private List<StatementVO> selectUnsettled() { |
|
|
|
|
StatementQuery query = new StatementQuery(); |
|
|
|
|
Date lastMaxPutStoreTime = oemStatementTaskLogService.getLastMaxPutStoreTime(); |
|
|
|
|
if (lastMaxPutStoreTime != null) { |
|
|
|
|
@ -1196,16 +1249,84 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
.atZone(ZoneId.systemDefault()) |
|
|
|
|
.toLocalDate()); |
|
|
|
|
} |
|
|
|
|
List<StatementVO> statementVOS = baseMapper.selectUnsettled(query); |
|
|
|
|
if (CollectionUtils.isEmpty(statementVOS)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
return baseMapper.selectUnsettled(query); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 查询工艺能力类型 |
|
|
|
|
* |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private Map<String, String> getProcessCapabilityTypeMap() { |
|
|
|
|
Map<String, String> dictMap = new HashMap<>(); |
|
|
|
|
R<List<DictBiz>> RProcessCapabilityType = dictBizClient.getList("ProcessCapabilityType"); |
|
|
|
|
if (RProcessCapabilityType.isSuccess()) { |
|
|
|
|
List<DictBiz> dictList = RProcessCapabilityType.getData(); |
|
|
|
|
dictMap = dictList.stream() |
|
|
|
|
.collect(Collectors.toMap( |
|
|
|
|
DictBiz::getDictKey, |
|
|
|
|
DictBiz::getDictValue, |
|
|
|
|
(oldVal, newVal) -> oldVal |
|
|
|
|
)); |
|
|
|
|
} |
|
|
|
|
return dictMap; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 处理重复镀后入库 |
|
|
|
|
* |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private List<StatementVO> duplicatePutStore(List<StatementVO> statementVOS, List<OemStatementEntity> saves) { |
|
|
|
|
// 校验车间订单工序是否存在结算数据
|
|
|
|
|
List<Long> woIds = statementVOS.stream() |
|
|
|
|
.filter(vo -> vo.getId() != null) |
|
|
|
|
.map(StatementVO::getWoId) |
|
|
|
|
.filter(woId -> woId != null) |
|
|
|
|
.collect(Collectors.toList()); |
|
|
|
|
// 查询存在已结算数据的订单
|
|
|
|
|
List<Long> settledWoIds = baseMapper.selectSettledWoIds(woIds); |
|
|
|
|
// 存在已结算数据的订单跳过,不存在已结算数据的订单标记为重复镀后入库
|
|
|
|
|
statementVOS = statementVOS.stream() |
|
|
|
|
.filter(vo -> { |
|
|
|
|
boolean needRemove = vo.getId() != null |
|
|
|
|
&& vo.getWoId() != null |
|
|
|
|
&& settledWoIds.contains(vo.getWoId()); |
|
|
|
|
return !needRemove; |
|
|
|
|
}) |
|
|
|
|
.map(vo -> { |
|
|
|
|
if (vo.getId() != null) { |
|
|
|
|
OemStatementEntity entity = new OemStatementEntity(); |
|
|
|
|
entity.setId(vo.getId()); |
|
|
|
|
entity.setRosStatus(OemStatementEntity.ERR_SETTLEMENT); |
|
|
|
|
entity.setMemo("重复镀后入库"); |
|
|
|
|
saves.add(entity); |
|
|
|
|
vo.setId(null); // 清空ID
|
|
|
|
|
} |
|
|
|
|
return vo; |
|
|
|
|
}) |
|
|
|
|
.collect(Collectors.toList()); |
|
|
|
|
return statementVOS; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 处理不结算数据 |
|
|
|
|
* |
|
|
|
|
* @param statementVOS |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private List<StatementVO> noSettlement(List<StatementVO> statementVOS) { |
|
|
|
|
List<StatementVO> settlementVOs = new ArrayList<>(); |
|
|
|
|
// 查询工艺能力类型
|
|
|
|
|
Map<String, String> dictMap = getProcessCapabilityTypeMap(); |
|
|
|
|
for (StatementVO statementVO : statementVOS) { |
|
|
|
|
statementVO.setWxLimitName(dictMap.get(statementVO.getWxLimit())); |
|
|
|
|
boolean isRework = !StringUtils.isEmpty(statementVO.getReworkCode()) && !StringUtils.isEmpty(statementVO.getReworkNo()); |
|
|
|
|
boolean isFj = statementVO.getWoCode() != null && statementVO.getWoCode().startsWith("FJ"); |
|
|
|
|
// TODO 如果是返工订单,审理单对应责任部门为3400,不结算
|
|
|
|
|
if (isRework && DEPT_CODE_REWORK.equals(statementVO.getPlanDeptcode())) { |
|
|
|
|
boolean isFj = statementVO.getYpCode() != null && statementVO.getYpCode().startsWith("FJ"); |
|
|
|
|
boolean isDjDy = !StringUtils.isEmpty(statementVO.getWxLimitName()) && (statementVO.getWxLimitName().contains("镀金") || statementVO.getWxLimitName().contains("镀银")); |
|
|
|
|
boolean checkPs = "浸保护剂".equals(statementVO.getPsName()) || "除镀层".equals(statementVO.getPsName()) || "清洗(返工)".equals(statementVO.getPsName()); |
|
|
|
|
// 如果是返工订单,审理单对应责任部门为3400,不结算
|
|
|
|
|
if (isRework && DEPT_CODE_REWORK.equals(statementVO.getResDept())) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
// 工序加工单位非外协厂家,不结算
|
|
|
|
|
@ -1223,89 +1344,60 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
if (!isContain) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
// TODO 如果工序为【浸保护剂、除镀层、清洗(返工)】:只计算返工订单 或 计划单号以“FJ”开头的订单(即:既不是返工单也不是以FJ开头的订单,不结算)
|
|
|
|
|
if ("浸保护剂".equals(statementVO.getPsName()) || "除镀层".equals(statementVO.getPsName()) || "清洗(返工)".equals(statementVO.getPsName())) { |
|
|
|
|
// 如果工序为【浸保护剂、除镀层、清洗(返工)】:只计算返工订单 或 计划单号以“FJ”开头的订单(即:既不是返工单也不是以FJ开头的订单,不结算)
|
|
|
|
|
if (checkPs) { |
|
|
|
|
boolean isNormalOrder = !isRework && !isFj; |
|
|
|
|
if (isNormalOrder) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// TODO 如果车间订单为【返工订单】并且工序对应工艺能力类型包含“镀金”、“镀银”,不结算
|
|
|
|
|
if (isRework) { |
|
|
|
|
if (!StringUtils.isEmpty(statementVO.getWxLimit())) { |
|
|
|
|
R<String> processCapabilityType = dictBizClient.getValue("ProcessCapabilityType", statementVO.getWxLimit()); |
|
|
|
|
String type = processCapabilityType.getData(); |
|
|
|
|
if (type.contains("镀金") || type.contains("镀银")) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// 如果车间订单为【返工订单】并且工序对应工艺能力类型包含“镀金”、“镀银”,不结算
|
|
|
|
|
if (isRework && isDjDy) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
statementVO.setRosStatus(OemStatementEntity.NO_SETTLEMENT); |
|
|
|
|
settlementVOs.add(statementVO); |
|
|
|
|
} |
|
|
|
|
// 匹配标准工序代码
|
|
|
|
|
if (CollectionUtils.isNotEmpty(settlementVOs)) { |
|
|
|
|
// 根据工序Id分组
|
|
|
|
|
Map<Long, List<StatementVO>> groupByPsId = settlementVOs.stream().collect(Collectors.groupingBy(StatementVO::getPsId)); |
|
|
|
|
Set<Long> psIds = groupByPsId.keySet(); |
|
|
|
|
final int batchSize = 500; |
|
|
|
|
List<OemStandardProcessEntity> allStandardList = new ArrayList<>(); |
|
|
|
|
List<List<Long>> splitPsIds = Lists.partition(new ArrayList<>(psIds), batchSize); |
|
|
|
|
for (List<Long> subPsIds : splitPsIds) { |
|
|
|
|
List<OemStandardProcessEntity> batchList = oemStandardProcessService.list(new LambdaQueryWrapper<OemStandardProcessEntity>().in(OemStandardProcessEntity::getProcessId, subPsIds)); |
|
|
|
|
allStandardList.addAll(batchList); |
|
|
|
|
} |
|
|
|
|
Map<Long, List<OemStandardProcessEntity>> standardMap = allStandardList.stream().collect(Collectors.groupingBy(OemStandardProcessEntity::getProcessId)); |
|
|
|
|
for (Map.Entry<Long, List<StatementVO>> entry : groupByPsId.entrySet()) { |
|
|
|
|
Long psId = entry.getKey(); |
|
|
|
|
List<OemStandardProcessEntity> standardProcessList = standardMap.getOrDefault(psId, Collections.emptyList()); |
|
|
|
|
for (StatementVO statementVO : entry.getValue()) { |
|
|
|
|
OemStandardProcessEntity oemStandardProcessEntity = matchStandardProcess(standardProcessList, statementVO); |
|
|
|
|
if (oemStandardProcessEntity != null) { |
|
|
|
|
statementVO.setStandardProcessCode(oemStandardProcessEntity.getStandardProcessCode()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
Map<String, List<StatementVO>> groupByManual = settlementVOs.stream().collect(Collectors.groupingBy(StatementVO::getManual)); |
|
|
|
|
List<OemStatementEntity> saves = new ArrayList<>(); |
|
|
|
|
for (Map.Entry<String, List<StatementVO>> entry : groupByManual.entrySet()) { |
|
|
|
|
String manual = entry.getKey(); |
|
|
|
|
// 自动结算
|
|
|
|
|
if (MANUAL_AUTO.equals(manual)) { |
|
|
|
|
List<StatementVO> autoStatementVOS = autoSettlement(entry.getValue()); |
|
|
|
|
for (StatementVO statementVO : autoStatementVOS) { |
|
|
|
|
OemStatementEntity entity = new OemStatementEntity(); |
|
|
|
|
BeanUtils.copyProperties(statementVO, entity); |
|
|
|
|
entity.setUpdateTime(new Date()); |
|
|
|
|
entity.setIsDeleted(0); |
|
|
|
|
saves.add(entity); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
for (StatementVO statementVO : entry.getValue()) { |
|
|
|
|
OemStatementEntity entity = new OemStatementEntity(); |
|
|
|
|
BeanUtils.copyProperties(statementVO, entity); |
|
|
|
|
entity.setUpdateTime(new Date()); |
|
|
|
|
entity.setIsDeleted(0); |
|
|
|
|
saves.add(entity); |
|
|
|
|
} |
|
|
|
|
return settlementVOs; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 匹配标准工序代码 |
|
|
|
|
* |
|
|
|
|
* @param settlementVOs |
|
|
|
|
*/ |
|
|
|
|
private void matchStandardProcess(List<StatementVO> settlementVOs) { |
|
|
|
|
// 根据工序Id分组
|
|
|
|
|
Map<Long, List<StatementVO>> groupByPsId = settlementVOs.stream().collect(Collectors.groupingBy(StatementVO::getPsId)); |
|
|
|
|
Set<Long> psIds = groupByPsId.keySet(); |
|
|
|
|
final int batchSize = 500; |
|
|
|
|
List<OemStandardProcessEntity> allStandardList = new ArrayList<>(); |
|
|
|
|
List<List<Long>> splitPsIds = Lists.partition(new ArrayList<>(psIds), batchSize); |
|
|
|
|
for (List<Long> subPsIds : splitPsIds) { |
|
|
|
|
List<OemStandardProcessEntity> batchList = oemStandardProcessService.list(new LambdaQueryWrapper<OemStandardProcessEntity>().in(OemStandardProcessEntity::getProcessId, subPsIds)); |
|
|
|
|
allStandardList.addAll(batchList); |
|
|
|
|
} |
|
|
|
|
Map<Long, List<OemStandardProcessEntity>> standardMap = allStandardList.stream().collect(Collectors.groupingBy(OemStandardProcessEntity::getProcessId)); |
|
|
|
|
for (Map.Entry<Long, List<StatementVO>> entry : groupByPsId.entrySet()) { |
|
|
|
|
Long psId = entry.getKey(); |
|
|
|
|
List<OemStandardProcessEntity> standardProcessList = standardMap.getOrDefault(psId, Collections.emptyList()); |
|
|
|
|
for (StatementVO statementVO : entry.getValue()) { |
|
|
|
|
OemStandardProcessEntity oemStandardProcessEntity = getStandardProcessCode(standardProcessList, statementVO); |
|
|
|
|
if (oemStandardProcessEntity != null) { |
|
|
|
|
statementVO.setStandardProcessCode(oemStandardProcessEntity.getStandardProcessCode()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (CollectionUtils.isNotEmpty(saves)) { |
|
|
|
|
Date maxPutStoreTimeDate = getMaxPutStoreTimeDate(settlementVOs); |
|
|
|
|
this.saveBatch(saves); |
|
|
|
|
oemStatementTaskLogService.saveMaxPutStoreTime(maxPutStoreTimeDate); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 匹配标准工序代码 |
|
|
|
|
* 获取标准工序代码 |
|
|
|
|
* |
|
|
|
|
* @param allStandardList |
|
|
|
|
* @param statementVO |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private OemStandardProcessEntity matchStandardProcess(List<OemStandardProcessEntity> allStandardList, StatementVO statementVO) { |
|
|
|
|
private OemStandardProcessEntity getStandardProcessCode(List<OemStandardProcessEntity> allStandardList, StatementVO statementVO) { |
|
|
|
|
if (CollectionUtils.isEmpty(allStandardList)) { |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
@ -1342,12 +1434,44 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 自动结算 |
|
|
|
|
* 结算处理 |
|
|
|
|
* |
|
|
|
|
* @param settlementVOs |
|
|
|
|
* @param saves |
|
|
|
|
*/ |
|
|
|
|
private void settlementProcess(List<StatementVO> settlementVOs, List<OemStatementEntity> saves) { |
|
|
|
|
Map<String, List<StatementVO>> groupByManual = settlementVOs.stream().collect(Collectors.groupingBy(StatementVO::getManual)); |
|
|
|
|
for (Map.Entry<String, List<StatementVO>> entry : groupByManual.entrySet()) { |
|
|
|
|
String manual = entry.getKey(); |
|
|
|
|
// 自动结算
|
|
|
|
|
if (MANUAL_AUTO.equals(manual)) { |
|
|
|
|
List<StatementVO> autoStatementVOS = settlement(entry.getValue(), BigDecimal.ZERO, false); |
|
|
|
|
for (StatementVO statementVO : autoStatementVOS) { |
|
|
|
|
OemStatementEntity entity = new OemStatementEntity(); |
|
|
|
|
BeanUtils.copyProperties(statementVO, entity); |
|
|
|
|
entity.setUpdateTime(new Date()); |
|
|
|
|
entity.setIsDeleted(0); |
|
|
|
|
saves.add(entity); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
for (StatementVO statementVO : entry.getValue()) { |
|
|
|
|
OemStatementEntity entity = new OemStatementEntity(); |
|
|
|
|
BeanUtils.copyProperties(statementVO, entity); |
|
|
|
|
entity.setUpdateTime(new Date()); |
|
|
|
|
entity.setIsDeleted(0); |
|
|
|
|
saves.add(entity); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 结算 |
|
|
|
|
* |
|
|
|
|
* @param statementVOS |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private List<StatementVO> autoSettlement(List<StatementVO> statementVOS) { |
|
|
|
|
private List<StatementVO> settlement(List<StatementVO> statementVOS, BigDecimal price, boolean preFlag) { |
|
|
|
|
// 1.以外协厂商分组的Map<厂家名称, 待结算工序结算单列表>
|
|
|
|
|
Map<String, List<StatementVO>> oemAndStatementMap = statementVOS.stream().collect(Collectors.groupingBy(StatementVO::getOcName)); |
|
|
|
|
for (Map.Entry<String, List<StatementVO>> listEntry : oemAndStatementMap.entrySet()) { |
|
|
|
|
@ -1355,7 +1479,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
List<StatementVO> statementVOList = listEntry.getValue(); |
|
|
|
|
//2.以外协名称查出的全部报价单
|
|
|
|
|
String oemName = listEntry.getKey(); |
|
|
|
|
List<PriceSheetVO> priceSheetAllList = getPriceSheets(oemName); |
|
|
|
|
List<PriceSheetVO> priceSheetAllList = getPriceSheetsWithCondition(oemName); |
|
|
|
|
if (priceSheetAllList.isEmpty()) { |
|
|
|
|
//【结算异常】
|
|
|
|
|
statementVOList.forEach(statementVO -> { |
|
|
|
|
@ -1372,30 +1496,33 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
//3.为每个结算单匹配报价集合
|
|
|
|
|
for (StatementVO statementVO : statementVOList) { |
|
|
|
|
try { |
|
|
|
|
List<PriceSheetVO> matchedPriceSheets = matchTheQuotationsWithCondition(statementVO, priceSheetMap); |
|
|
|
|
List<PriceSheetVO> matchedPriceSheets = matchTheQuotationsWithCondition(statementVO, priceSheetMap, preFlag); |
|
|
|
|
if (null == matchedPriceSheets || matchedPriceSheets.isEmpty()) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
statementVO.setPriceSheetList(matchedPriceSheets); |
|
|
|
|
// 4.匹配规则,过滤出唯一报价
|
|
|
|
|
// (1) 供应商代码 + 工序 + 零件号 + 生产标识 + 计划单号 + 现执行价格
|
|
|
|
|
if (rule1(statementVO, BigDecimal.ZERO)) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
// (2) 供应商代码 + 工序 + 零件号 + 生产标识 + 现执行价格
|
|
|
|
|
if (rule2(statementVO, BigDecimal.ZERO)) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
// (3) 供应商代码 + 生产标识 + 计划单号 + 标准工序代码
|
|
|
|
|
if (rule3(statementVO)) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
// (4) 供应商代码 + 生产标识 + 标准工序代码
|
|
|
|
|
if (rule4(statementVO)) { |
|
|
|
|
continue; |
|
|
|
|
// 涂色标跳过
|
|
|
|
|
if (!hasColorCount(statementVO)) { |
|
|
|
|
// (1) 供应商代码 + 工序 + 零件号 + 生产标识 + 计划单号 + 现执行价格
|
|
|
|
|
if (rule1(statementVO, price)) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
// (2) 供应商代码 + 工序 + 零件号 + 生产标识 + 现执行价格
|
|
|
|
|
if (rule2(statementVO, price)) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
// (3) 供应商代码 + 生产标识 + 计划单号 + 标准工序代码
|
|
|
|
|
if (rule3(statementVO)) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
// (4) 供应商代码 + 生产标识 + 标准工序代码
|
|
|
|
|
if (rule4(statementVO)) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// (5) 供应商代码 + 标准工序代码 + 现执行价格
|
|
|
|
|
if (rule5(statementVO, BigDecimal.ZERO)) { |
|
|
|
|
if (rule5(statementVO, price)) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
statementVO.setRosStatus(StatementVO.ERR_SETTLEMENT); |
|
|
|
|
@ -1411,6 +1538,28 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
return statementVOS; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 获取报价单列表 |
|
|
|
|
* |
|
|
|
|
* @param oemName |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private List<PriceSheetVO> getPriceSheetsWithCondition(String oemName) { |
|
|
|
|
PriceSheetQuery query = new PriceSheetQuery(); |
|
|
|
|
query.setOcName(oemName); |
|
|
|
|
query.setValidflags(Arrays.asList("有效", "无效")); |
|
|
|
|
query.setPapertype("外协定价"); |
|
|
|
|
query.setPricetype("工序协作"); |
|
|
|
|
R<Page<PriceSheetVO>> pageR = erpDataOemClient.priceSheetData(query, new Query() {{ |
|
|
|
|
setSize(99999); |
|
|
|
|
}}); |
|
|
|
|
|
|
|
|
|
if (pageR != null && pageR.getData() != null) { |
|
|
|
|
return pageR.getData().getRecords(); |
|
|
|
|
} |
|
|
|
|
return Collections.emptyList(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 匹配报价单 |
|
|
|
|
* |
|
|
|
|
@ -1418,7 +1567,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
* @param priceSheetMap |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private List<PriceSheetVO> matchTheQuotationsWithCondition(StatementVO statementVO, Map<String, List<PriceSheetVO>> priceSheetMap) { |
|
|
|
|
private List<PriceSheetVO> matchTheQuotationsWithCondition(StatementVO statementVO, Map<String, List<PriceSheetVO>> priceSheetMap, boolean preFlag) { |
|
|
|
|
String psName = statementVO.getPsName(); |
|
|
|
|
if (!priceSheetMap.containsKey(psName)) { |
|
|
|
|
//【结算异常】
|
|
|
|
|
@ -1429,7 +1578,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
List<PriceSheetVO> result = new ArrayList<>(); |
|
|
|
|
//获得外协厂商该工序下报价单列表
|
|
|
|
|
for (PriceSheetVO priceSheetVO : priceSheetMap.get(psName)) { |
|
|
|
|
if (isValid(statementVO, priceSheetVO)) { |
|
|
|
|
if (isValid(statementVO, priceSheetVO, preFlag)) { |
|
|
|
|
result.add(priceSheetVO); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -1446,15 +1595,10 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
* |
|
|
|
|
* @param statementVO |
|
|
|
|
* @param priceSheetVO |
|
|
|
|
* @param preFlag 是否预结算 |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private boolean isValid(StatementVO statementVO, PriceSheetVO priceSheetVO) { |
|
|
|
|
if (!"工序协作".equals(priceSheetVO.getPricetype())) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
if (!"有效".equals(priceSheetVO.getValidflag()) && !"无效".equals(priceSheetVO.getValidflag())) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
private boolean isValid(StatementVO statementVO, PriceSheetVO priceSheetVO, boolean preFlag) { |
|
|
|
|
String startTime = priceSheetVO.getStartdat(); |
|
|
|
|
String validTime = priceSheetVO.getValiddat(); |
|
|
|
|
String putStoreTime = statementVO.getPutStoreTime(); |
|
|
|
|
@ -1466,7 +1610,11 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
LocalDate startDate = LocalDate.parse(startTime, fmt); |
|
|
|
|
LocalDate validDate = LocalDate.parse(validTime, fmt); |
|
|
|
|
LocalDate putStoreDate = LocalDate.parse(putStoreTime, fmt); |
|
|
|
|
return !putStoreDate.isBefore(startDate) && !putStoreDate.isAfter(validDate); |
|
|
|
|
if (preFlag) { |
|
|
|
|
return !putStoreDate.isBefore(startDate); |
|
|
|
|
} else { |
|
|
|
|
return !putStoreDate.isBefore(startDate) && !putStoreDate.isAfter(validDate); |
|
|
|
|
} |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
@ -1480,10 +1628,6 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private boolean rule1(StatementVO statementVO, BigDecimal price) { |
|
|
|
|
// 涂色标跳过
|
|
|
|
|
if (hasColorCount(statementVO)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
List<PriceSheetVO> priceSheetList = statementVO.getPriceSheetList(); |
|
|
|
|
if (CollectionUtils.isEmpty(priceSheetList)) { |
|
|
|
|
return false; |
|
|
|
|
@ -1515,10 +1659,6 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private boolean rule2(StatementVO statementVO, BigDecimal price) { |
|
|
|
|
// 涂色标跳过
|
|
|
|
|
if (hasColorCount(statementVO)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
List<PriceSheetVO> priceSheetList = statementVO.getPriceSheetList(); |
|
|
|
|
if (CollectionUtils.isEmpty(priceSheetList)) { |
|
|
|
|
return false; |
|
|
|
|
@ -1548,24 +1688,22 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private boolean rule3(StatementVO statementVO) { |
|
|
|
|
// 涂色标跳过
|
|
|
|
|
if (hasColorCount(statementVO)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
List<PriceSheetVO> priceSheetList = statementVO.getPriceSheetList(); |
|
|
|
|
if (CollectionUtils.isEmpty(priceSheetList)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
// 结算单字段
|
|
|
|
|
String standardProcessCode = statementVO.getStandardProcessCode(); |
|
|
|
|
if (StringUtils.isEmpty(standardProcessCode)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
String ocCode = statementVO.getOcCode(); |
|
|
|
|
String prodIdent = statementVO.getProdIdent(); |
|
|
|
|
String woCode = statementVO.getWoCode(); |
|
|
|
|
String standardProcessCode = statementVO.getStandardProcessCode(); |
|
|
|
|
for (PriceSheetVO sheet : priceSheetList) { |
|
|
|
|
boolean match = StringUtils.equals(sheet.getSplycode(), ocCode) && StringUtils.equals(sheet.getPrtlotno(), prodIdent) && StringUtils.equals(sheet.getWono(), woCode) |
|
|
|
|
// TODO 报价单标准工艺代码没加
|
|
|
|
|
// && StringUtils.equals(sheet.getWono(), standardProcessCode)
|
|
|
|
|
; |
|
|
|
|
&& StringUtils.equals(sheet.getWono(), standardProcessCode); |
|
|
|
|
if (match && ruleTieredPricing(statementVO, sheet)) { |
|
|
|
|
return setSettlementInfo(statementVO, sheet); |
|
|
|
|
} |
|
|
|
|
@ -1580,23 +1718,21 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private boolean rule4(StatementVO statementVO) { |
|
|
|
|
// 涂色标跳过
|
|
|
|
|
if (hasColorCount(statementVO)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
List<PriceSheetVO> priceSheetList = statementVO.getPriceSheetList(); |
|
|
|
|
if (CollectionUtils.isEmpty(priceSheetList)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
// 结算单字段
|
|
|
|
|
String standardProcessCode = statementVO.getStandardProcessCode(); |
|
|
|
|
if (StringUtils.isEmpty(standardProcessCode)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
String ocCode = statementVO.getOcCode(); |
|
|
|
|
String prodIdent = statementVO.getProdIdent(); |
|
|
|
|
String standardProcessCode = statementVO.getStandardProcessCode(); |
|
|
|
|
for (PriceSheetVO sheet : priceSheetList) { |
|
|
|
|
boolean match = StringUtils.equals(sheet.getSplycode(), ocCode) && StringUtils.equals(sheet.getPrtlotno(), prodIdent) |
|
|
|
|
// TODO 报价单标准工艺代码没加
|
|
|
|
|
// && StringUtils.equals(sheet.getWono(), standardProcessCode)
|
|
|
|
|
; |
|
|
|
|
&& StringUtils.equals(sheet.getWono(), standardProcessCode); |
|
|
|
|
if (match && ruleTieredPricing(statementVO, sheet)) { |
|
|
|
|
return setSettlementInfo(statementVO, sheet); |
|
|
|
|
} |
|
|
|
|
@ -1616,15 +1752,17 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
if (CollectionUtils.isEmpty(priceSheetList)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
List<PriceSheetVO> colorPriceSheetVOS = new ArrayList<>(); |
|
|
|
|
// 结算单字段
|
|
|
|
|
String ocCode = statementVO.getOcCode(); |
|
|
|
|
String standardProcessCode = statementVO.getStandardProcessCode(); |
|
|
|
|
if (StringUtils.isEmpty(standardProcessCode)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
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)
|
|
|
|
|
; |
|
|
|
|
&& StringUtils.equals(sheet.getWono(), standardProcessCode); |
|
|
|
|
if (match && price != null && price.compareTo(BigDecimal.ZERO) != 0) { |
|
|
|
|
// TODO 金银价格字段缺失
|
|
|
|
|
match = PriceMatcher.isContainsPrice(sheet.getRemark(), price); |
|
|
|
|
@ -1658,12 +1796,14 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
BigDecimal qty = new BigDecimal(statementVO.getMakeQty() == null ? "0" : statementVO.getMakeQty().trim()); |
|
|
|
|
BigDecimal totalArea = new BigDecimal(statementVO.getTotalArea() == null ? "0" : statementVO.getTotalArea().trim()); |
|
|
|
|
BigDecimal totalPrice; |
|
|
|
|
if ("平方分米".equals(sheet.getPrtum())) { |
|
|
|
|
// 平方分米
|
|
|
|
|
if ("3".equals(sheet.getStairunit())) { |
|
|
|
|
totalPrice = unitPrice.multiply(totalArea); |
|
|
|
|
} else { |
|
|
|
|
totalPrice = unitPrice.multiply(qty); |
|
|
|
|
} |
|
|
|
|
statementVO.setRosStatus(StatementVO.IN_SETTLEMENT); |
|
|
|
|
statementVO.setSettleTime(new Date()); |
|
|
|
|
statementVO.setApprovalStatus(StatementVO.APPROVAL_STATUS_UNDER); |
|
|
|
|
statementVO.setUnitPrice(unitPrice); |
|
|
|
|
statementVO.setUnit(sheet.getPrtum()); |
|
|
|
|
@ -1737,6 +1877,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
//如总价大于0,则报价成功
|
|
|
|
|
if (totalPrice.compareTo(BigDecimal.ZERO) > 0) { |
|
|
|
|
statementVO.setRosStatus(StatementVO.IN_SETTLEMENT); |
|
|
|
|
statementVO.setSettleTime(new Date()); |
|
|
|
|
statementVO.setApprovalStatus(StatementVO.APPROVAL_STATUS_UNDER); |
|
|
|
|
statementVO.setTotalPrice(totalPrice); |
|
|
|
|
statementVO.setMemo("结算中"); |
|
|
|
|
@ -1759,17 +1900,22 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
*/ |
|
|
|
|
private boolean ruleTieredPricing(StatementVO statementVO, PriceSheetVO priceSheet) { |
|
|
|
|
//匹配阶梯价
|
|
|
|
|
if (priceSheet.getStairflag().equals("单批阶梯价(按件数)")) { |
|
|
|
|
// 单批阶梯价(按件数)
|
|
|
|
|
if (priceSheet.getStairflag().equals("4")) { |
|
|
|
|
double makeQty = Double.parseDouble(statementVO.getMakeQty()); |
|
|
|
|
double lower = Double.parseDouble(priceSheet.getLower()); |
|
|
|
|
double upper = Double.parseDouble(priceSheet.getUpper()); |
|
|
|
|
return makeQty >= upper && makeQty <= lower; |
|
|
|
|
} else if (priceSheet.getStairflag().equals("单批阶梯价(按单件面积)")) { |
|
|
|
|
} |
|
|
|
|
// 单批阶梯价(按单件面积)
|
|
|
|
|
else if (priceSheet.getStairflag().equals("5")) { |
|
|
|
|
double ypArea = Double.parseDouble(statementVO.getYpArea()); |
|
|
|
|
double lower = Double.parseDouble(priceSheet.getLower()); |
|
|
|
|
double upper = Double.parseDouble(priceSheet.getUpper()); |
|
|
|
|
return ypArea >= upper && ypArea <= lower; |
|
|
|
|
} else if (priceSheet.getStairflag().equals("单批阶梯价(按单批面积)")) { |
|
|
|
|
} |
|
|
|
|
// 单批阶梯价(按单批面积)
|
|
|
|
|
else if (priceSheet.getStairflag().equals("6")) { |
|
|
|
|
double totalArea = Double.parseDouble(statementVO.getTotalArea()); |
|
|
|
|
double lower = Double.parseDouble(priceSheet.getLower()); |
|
|
|
|
double upper = Double.parseDouble(priceSheet.getUpper()); |
|
|
|
|
@ -1806,4 +1952,95 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
.orElse(null); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public R manualSettlement(StatementQuery mesOemStatement) { |
|
|
|
|
IPage<StatementVO> page = new Page<>(); |
|
|
|
|
page.setSize(999); |
|
|
|
|
List<StatementVO> statementVOS = baseMapper.selectOemStatementPage(page, mesOemStatement); |
|
|
|
|
List<OemStatementEntity> saves = new ArrayList<>(); |
|
|
|
|
BigDecimal price = BigDecimal.ZERO; |
|
|
|
|
if (mesOemStatement.getPrice() != null) { |
|
|
|
|
price = mesOemStatement.getPrice(); |
|
|
|
|
} |
|
|
|
|
List<StatementVO> settlementList = settlement(statementVOS, price, false); |
|
|
|
|
for (StatementVO statementVO : settlementList) { |
|
|
|
|
OemStatementEntity entity = new OemStatementEntity(); |
|
|
|
|
BeanUtils.copyProperties(statementVO, entity); |
|
|
|
|
entity.setUpdateTime(new Date()); |
|
|
|
|
entity.setIsDeleted(0); |
|
|
|
|
saves.add(entity); |
|
|
|
|
} |
|
|
|
|
if (CollectionUtils.isEmpty(saves)) { |
|
|
|
|
return R.fail("没有需要结算的数据"); |
|
|
|
|
} |
|
|
|
|
return R.status(this.saveOrUpdateBatch(saves)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public List<StatementVO> manualPreSettlement(StatementQuery mesOemStatement) { |
|
|
|
|
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()); |
|
|
|
|
BigDecimal price = BigDecimal.ZERO; |
|
|
|
|
if (mesOemStatement.getPrice() != null) { |
|
|
|
|
price = mesOemStatement.getPrice(); |
|
|
|
|
} |
|
|
|
|
List<StatementVO> settlementList = settlement(statementVOS, price, true); |
|
|
|
|
return settlementList; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public R matchStandardProcessCode() { |
|
|
|
|
|
|
|
|
|
// 1. 查询所有【结算异常】状态的数据(带关联字段)
|
|
|
|
|
List<StatementVO> errorStatements = baseMapper.selectErrorStatements(); |
|
|
|
|
|
|
|
|
|
if (CollectionUtils.isEmpty(errorStatements)) { |
|
|
|
|
return R.success("没有需要匹配的结算异常数据"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 2. 过滤掉异常原因为"无需结算、重复镀后入库"的数据
|
|
|
|
|
List<StatementVO> needMatchList = errorStatements.stream() |
|
|
|
|
.filter(vo -> { |
|
|
|
|
String memo = vo.getMemo(); |
|
|
|
|
// 排除"无需结算"和"重复镀后入库"
|
|
|
|
|
return !StrUtil.contains(memo, "无需结算") |
|
|
|
|
&& !StrUtil.contains(memo, "重复镀后入库"); |
|
|
|
|
}) |
|
|
|
|
.collect(Collectors.toList()); |
|
|
|
|
|
|
|
|
|
if (CollectionUtils.isEmpty(needMatchList)) { |
|
|
|
|
return R.success("没有需要匹配标准工序代码的数据"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 3. 执行匹配逻辑
|
|
|
|
|
matchStandardProcess(needMatchList); |
|
|
|
|
|
|
|
|
|
// 4. 更新数据库
|
|
|
|
|
List<OemStatementEntity> updateList = needMatchList.stream() |
|
|
|
|
//.filter(vo -> StringUtils.isNotEmpty(vo.getStandardProcessCode()))
|
|
|
|
|
.map(vo -> { |
|
|
|
|
OemStatementEntity entity = new OemStatementEntity(); |
|
|
|
|
entity.setId(vo.getId()); |
|
|
|
|
entity.setStandardProcessCode(vo.getStandardProcessCode()); |
|
|
|
|
entity.setUpdateTime(new Date()); |
|
|
|
|
return entity; |
|
|
|
|
}) |
|
|
|
|
.collect(Collectors.toList()); |
|
|
|
|
|
|
|
|
|
if (!CollectionUtils.isEmpty(updateList)) { |
|
|
|
|
this.updateBatchById(updateList); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return R.success(); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|