|
|
|
|
@ -15,12 +15,16 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
|
|
|
|
import jakarta.annotation.Resource; |
|
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
|
import org.springblade.core.mp.base.BaseServiceImpl; |
|
|
|
|
import org.springblade.core.mp.support.Query; |
|
|
|
|
import org.springblade.core.secure.utils.AuthUtil; |
|
|
|
|
import org.springblade.core.tool.api.R; |
|
|
|
|
import org.springblade.core.tool.utils.Func; |
|
|
|
|
import org.springblade.desk.common.enums.MesApprovalRecordBizTypeEnum; |
|
|
|
|
import org.springblade.desk.common.factory.MesApprovalDetailFactory; |
|
|
|
|
import org.springblade.desk.common.feign.IMesNotifyMessageClient; |
|
|
|
|
import org.springblade.desk.common.pojo.entity.MesApprovalRecordEntity; |
|
|
|
|
import org.springblade.desk.common.pojo.entity.MesNotifyMessageEntity; |
|
|
|
|
import org.springblade.desk.common.service.ApprovalRecordDetailStrategy; |
|
|
|
|
import org.springblade.desk.common.service.IMesApprovalRecordService; |
|
|
|
|
import org.springblade.desk.oem.mapper.OemStatementMapper; |
|
|
|
|
import org.springblade.desk.oem.mapper.PlatingTypeRulesMapper; |
|
|
|
|
import org.springblade.desk.oem.pojo.entity.*; |
|
|
|
|
@ -95,6 +99,12 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
@Resource |
|
|
|
|
private IErpOemSettlementClient erpOemSettlementClient; |
|
|
|
|
|
|
|
|
|
@Resource |
|
|
|
|
private IMesApprovalRecordService mesApprovalRecordService; |
|
|
|
|
|
|
|
|
|
@Resource |
|
|
|
|
private MesApprovalDetailFactory mesApprovalDetailFactory; |
|
|
|
|
|
|
|
|
|
public static final String DEPT_CODE_REWORK = "3400"; |
|
|
|
|
public static final String MANUAL_AUTO = "0"; |
|
|
|
|
public static final String MANUAL_HAND = "1"; |
|
|
|
|
@ -582,21 +592,15 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
* */ |
|
|
|
|
if (3 == oemSettleAccountsApproval.getApprovalStatus()) { |
|
|
|
|
//审核通过
|
|
|
|
|
updateWrapper.set("ros_status", OemStatementEntity.PENDING_PUSH_SETTLEMENT) |
|
|
|
|
.set("memo", "外协结算完成") |
|
|
|
|
.in("id", ids); |
|
|
|
|
updateWrapper.set("ros_status", OemStatementEntity.PENDING_PUSH_SETTLEMENT).set("memo", "外协结算完成").in("id", ids); |
|
|
|
|
} else { |
|
|
|
|
//审核不通过:(1)原因为不需要结算的更新为【无需结算】(2)原因是基础数据有误的更新为【结算异常】
|
|
|
|
|
if (1 == oemSettleAccountsApproval.getReason()) { |
|
|
|
|
updateWrapper.set("ros_status", OemStatementEntity.ERR_SETTLEMENT) |
|
|
|
|
.set("memo", "无需结算").set("total_price", null).set("unit_price", null) |
|
|
|
|
.set("quotation", "") |
|
|
|
|
updateWrapper.set("ros_status", OemStatementEntity.ERR_SETTLEMENT).set("memo", "无需结算").set("total_price", null).set("unit_price", null).set("quotation", "") |
|
|
|
|
|
|
|
|
|
.in("id", ids); |
|
|
|
|
} else { |
|
|
|
|
updateWrapper.set("ros_status", OemStatementEntity.ERR_SETTLEMENT) |
|
|
|
|
.set("memo", "基础数据有误") |
|
|
|
|
.in("id", ids); |
|
|
|
|
updateWrapper.set("ros_status", OemStatementEntity.ERR_SETTLEMENT).set("memo", "基础数据有误").in("id", ids); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -606,22 +610,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.setRosStatus(OemStatementEntity.ERR_SETTLEMENT); |
|
|
|
|
entity.setMemo("无需结算"); |
|
|
|
|
entity.setTotalPrice(null); |
|
|
|
|
entity.setUnitPrice(null); |
|
|
|
|
entity.setQuotation(""); |
|
|
|
|
entity.setUpdateTime(new Date()); |
|
|
|
|
List<OemStatementEntity> saves = list.stream().map(statementVO -> { |
|
|
|
|
OemStatementEntity entity = new OemStatementEntity(); |
|
|
|
|
BeanUtils.copyProperties(statementVO, entity); |
|
|
|
|
entity.setRosStatus(OemStatementEntity.ERR_SETTLEMENT); |
|
|
|
|
entity.setMemo("无需结算"); |
|
|
|
|
entity.setTotalPrice(null); |
|
|
|
|
entity.setUnitPrice(null); |
|
|
|
|
entity.setQuotation(""); |
|
|
|
|
entity.setUpdateTime(new Date()); |
|
|
|
|
|
|
|
|
|
entity.setSettleTime(new Date()); |
|
|
|
|
entity.setSettleTime(new Date()); |
|
|
|
|
|
|
|
|
|
return entity; |
|
|
|
|
}) |
|
|
|
|
.collect(Collectors.toList()); |
|
|
|
|
return entity; |
|
|
|
|
}).collect(Collectors.toList()); |
|
|
|
|
|
|
|
|
|
// baseMapper.insertOrUpdate(saves);
|
|
|
|
|
// 逐条处理
|
|
|
|
|
@ -632,14 +634,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
} else { |
|
|
|
|
// 更新,使用UpdateWrapper确保null值被更新
|
|
|
|
|
LambdaUpdateWrapper<OemStatementEntity> wrapper = Wrappers.lambdaUpdate(); |
|
|
|
|
wrapper.set(OemStatementEntity::getTotalPrice, entity.getTotalPrice()) |
|
|
|
|
.set(OemStatementEntity::getUnitPrice, entity.getUnitPrice()) |
|
|
|
|
.set(OemStatementEntity::getQuotation, entity.getQuotation()) |
|
|
|
|
.set(OemStatementEntity::getRosStatus, entity.getRosStatus()) |
|
|
|
|
.set(OemStatementEntity::getMemo, entity.getMemo()) |
|
|
|
|
.set(OemStatementEntity::getUpdateTime, entity.getUpdateTime()) |
|
|
|
|
.set(OemStatementEntity::getSettleTime, entity.getSettleTime()) |
|
|
|
|
.eq(OemStatementEntity::getId, entity.getId()); |
|
|
|
|
wrapper.set(OemStatementEntity::getTotalPrice, entity.getTotalPrice()).set(OemStatementEntity::getUnitPrice, entity.getUnitPrice()).set(OemStatementEntity::getQuotation, entity.getQuotation()).set(OemStatementEntity::getRosStatus, entity.getRosStatus()).set(OemStatementEntity::getMemo, entity.getMemo()).set(OemStatementEntity::getUpdateTime, entity.getUpdateTime()).set(OemStatementEntity::getSettleTime, entity.getSettleTime()).eq(OemStatementEntity::getId, entity.getId()); |
|
|
|
|
|
|
|
|
|
baseMapper.update(null, wrapper); |
|
|
|
|
} |
|
|
|
|
@ -1218,6 +1213,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
@Transactional |
|
|
|
|
public R generateSettlement() { |
|
|
|
|
List<OemStatementEntity> saves = new ArrayList<>(); |
|
|
|
|
// 查询未生成的结算数据
|
|
|
|
|
@ -1244,7 +1240,11 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
// 记录结算日志
|
|
|
|
|
oemStatementTaskLogService.saveMaxPutStoreTime(maxPutStoreTimeDate); |
|
|
|
|
// 记录结算数据
|
|
|
|
|
return R.status(this.saveOrUpdateBatch(saves)); |
|
|
|
|
this.saveOrUpdateBatch(saves); |
|
|
|
|
for (OemStatementEntity save : saves) { |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
return R.success(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
@ -1255,9 +1255,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
private List<StatementVO> selectUnsettled(StatementQuery query) { |
|
|
|
|
Date lastMaxPutStoreTime = oemStatementTaskLogService.getLastMaxPutStoreTime(); |
|
|
|
|
if (lastMaxPutStoreTime != null) { |
|
|
|
|
query.setPostPlatingStorageTimeStart(lastMaxPutStoreTime.toInstant() |
|
|
|
|
.atZone(ZoneId.systemDefault()) |
|
|
|
|
.toLocalDate()); |
|
|
|
|
query.setPostPlatingStorageTimeStart(lastMaxPutStoreTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); |
|
|
|
|
} |
|
|
|
|
return baseMapper.selectUnsettled(query); |
|
|
|
|
} |
|
|
|
|
@ -1272,12 +1270,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
R<List<Dict>> RProcessCapabilityType = dictClient.getList("ProcessCapabilityType"); |
|
|
|
|
if (RProcessCapabilityType.isSuccess()) { |
|
|
|
|
List<Dict> dictList = RProcessCapabilityType.getData(); |
|
|
|
|
dictMap = dictList.stream() |
|
|
|
|
.collect(Collectors.toMap( |
|
|
|
|
Dict::getDictKey, |
|
|
|
|
Dict::getDictValue, |
|
|
|
|
(oldVal, newVal) -> oldVal |
|
|
|
|
)); |
|
|
|
|
dictMap = dictList.stream().collect(Collectors.toMap(Dict::getDictKey, Dict::getDictValue, (oldVal, newVal) -> oldVal)); |
|
|
|
|
} |
|
|
|
|
return dictMap; |
|
|
|
|
} |
|
|
|
|
@ -1289,34 +1282,25 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
*/ |
|
|
|
|
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> woIds = statementVOS.stream().filter(vo -> vo.getId() != null).map(StatementVO::getWoId).filter(woId -> woId != null).collect(Collectors.toList()); |
|
|
|
|
if (CollectionUtils.isNotEmpty(woIds)) { |
|
|
|
|
// 查询存在已结算数据的订单
|
|
|
|
|
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()); |
|
|
|
|
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; |
|
|
|
|
} |
|
|
|
|
@ -1400,7 +1384,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
for (Map.Entry<String, List<StatementVO>> entry : groupByPsName.entrySet()) { |
|
|
|
|
String psName = entry.getKey(); |
|
|
|
|
List<OemStandardProcessEntity> standardProcessList = standardMap.getOrDefault(psName, Collections.emptyList()); |
|
|
|
|
if(CollectionUtils.isEmpty(standardProcessList)){ |
|
|
|
|
if (CollectionUtils.isEmpty(standardProcessList)) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
for (StatementVO statementVO : entry.getValue()) { |
|
|
|
|
@ -1591,92 +1575,17 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
return listR.getData(); |
|
|
|
|
} |
|
|
|
|
return Collections.emptyList(); |
|
|
|
|
//假数据测试用
|
|
|
|
|
// //假数据测试用
|
|
|
|
|
// List<PriceSheetVO> priceSheetAllList = new ArrayList<>();
|
|
|
|
|
// PriceSheetVO priceSheet1 = new PriceSheetVO();
|
|
|
|
|
// priceSheet1.setPrice("60");
|
|
|
|
|
// priceSheet1.setSplycode("wx000001");
|
|
|
|
|
// priceSheet1.setSplyname(oemName);
|
|
|
|
|
// priceSheet1.setPrtum("件");
|
|
|
|
|
// priceSheet1.setWono("110");
|
|
|
|
|
// priceSheet1.setSeqid("GXJG-20250228018");
|
|
|
|
|
// priceSheet1.setGxinfo("光亮腐蚀");
|
|
|
|
|
// priceSheet1.setStartdat("2026-01-15");
|
|
|
|
|
// priceSheet1.setValiddat("2026-12-31");
|
|
|
|
|
// priceSheet1.setStairflag("1");
|
|
|
|
|
// priceSheet1.setCoating_desc("涂色标");
|
|
|
|
|
// priceSheet1.setPrtlotno("JHT");
|
|
|
|
|
// priceSheetAllList.add(priceSheet1);
|
|
|
|
|
// PriceSheetVO priceSheet2 = new PriceSheetVO();
|
|
|
|
|
// priceSheet2.setPrice("120");
|
|
|
|
|
// priceSheet2.setSplycode("wx000001");
|
|
|
|
|
// priceSheet2.setSplyname(oemName);
|
|
|
|
|
// priceSheet2.setPrtum("件");
|
|
|
|
|
// priceSheet2.setWono("110");
|
|
|
|
|
// priceSheet2.setSeqid("GXJG-20250228018");
|
|
|
|
|
// priceSheet2.setGxinfo("光亮腐蚀");
|
|
|
|
|
// priceSheet2.setStartdat("2026-01-15");
|
|
|
|
|
// priceSheet2.setValiddat("2026-12-31");
|
|
|
|
|
// priceSheet2.setStairflag("1");
|
|
|
|
|
// priceSheet2.setCoating_desc("涂色带");
|
|
|
|
|
// priceSheet2.setPrtlotno("JHT");
|
|
|
|
|
// priceSheetAllList.add(priceSheet2);
|
|
|
|
|
// PriceSheetVO priceSheet3 = new PriceSheetVO();
|
|
|
|
|
// priceSheet3.setPrice("180");
|
|
|
|
|
// priceSheet3.setSplycode("wx000001");
|
|
|
|
|
// priceSheet3.setSplyname(oemName);
|
|
|
|
|
// priceSheet3.setPrtum("件");
|
|
|
|
|
// priceSheet3.setWono("110");
|
|
|
|
|
// priceSheet3.setSeqid("GXJG-20250228018");
|
|
|
|
|
// priceSheet3.setGxinfo("光亮腐蚀");
|
|
|
|
|
// priceSheet3.setStartdat("2026-01-15");
|
|
|
|
|
// priceSheet3.setValiddat("2026-12-31");
|
|
|
|
|
// priceSheet3.setStairflag("1");
|
|
|
|
|
// priceSheet3.setCoating_desc("涂箭头");
|
|
|
|
|
// priceSheet3.setPrtlotno("JHT");
|
|
|
|
|
// priceSheetAllList.add(priceSheet3);
|
|
|
|
|
// PriceSheetVO priceSheet4 = new PriceSheetVO();
|
|
|
|
|
// priceSheet4.setPrice("60");
|
|
|
|
|
// priceSheet4.setSplycode("wx000001");
|
|
|
|
|
// priceSheet4.setSplyname(oemName);
|
|
|
|
|
// priceSheet4.setPrtum("件");
|
|
|
|
|
// priceSheet4.setWono("320");
|
|
|
|
|
// priceSheet4.setSeqid("GXJG-20250228018");
|
|
|
|
|
// priceSheet4.setGxinfo("热处理铜合金电镀低应力镍");
|
|
|
|
|
// priceSheet4.setStartdat("2026-01-15");
|
|
|
|
|
// priceSheet4.setValiddat("2026-12-31");
|
|
|
|
|
// priceSheet4.setStairflag("1");
|
|
|
|
|
// priceSheet4.setCoating_desc("涂色标");
|
|
|
|
|
// priceSheet4.setPrtlotno("JHT");
|
|
|
|
|
// priceSheetAllList.add(priceSheet4);
|
|
|
|
|
// PriceSheetVO priceSheet5 = new PriceSheetVO();
|
|
|
|
|
// priceSheet5.setPrice("60");
|
|
|
|
|
// priceSheet5.setSplycode("wx000001");
|
|
|
|
|
// priceSheet5.setSplyname(oemName);
|
|
|
|
|
// priceSheet5.setPrtum("件");
|
|
|
|
|
// priceSheet5.setWono("320");
|
|
|
|
|
// priceSheet5.setSeqid("GXJG-20250228018");
|
|
|
|
|
// priceSheet5.setGxinfo("热处理铜合金电镀低应力镍");
|
|
|
|
|
// priceSheet5.setStartdat("2026-01-15");
|
|
|
|
|
// priceSheet5.setValiddat("2026-12-31");
|
|
|
|
|
// priceSheet5.setStairflag("1");
|
|
|
|
|
// priceSheet5.setCoating_desc("涂色带");
|
|
|
|
|
// priceSheet5.setPrtlotno("JHT");
|
|
|
|
|
// priceSheetAllList.add(priceSheet5);
|
|
|
|
|
// PriceSheetVO priceSheet6 = new PriceSheetVO();
|
|
|
|
|
// priceSheet6.setPrice("60");
|
|
|
|
|
// priceSheet6.setSplycode("wx000001");
|
|
|
|
|
// priceSheet6.setSplyname(oemName);
|
|
|
|
|
// priceSheet6.setPrtum("件");
|
|
|
|
|
// priceSheet6.setWono("320");
|
|
|
|
|
// priceSheet6.setSeqid("GXJG-20250228018");
|
|
|
|
|
// priceSheet6.setGxinfo("热处理铜合金电镀低应力镍");
|
|
|
|
|
// priceSheet6.setStartdat("2026-01-15");
|
|
|
|
|
// priceSheet6.setValiddat("2026-12-31");
|
|
|
|
|
// priceSheet6.setStairflag("1");
|
|
|
|
|
// priceSheet6.setCoating_desc("涂箭头");
|
|
|
|
|
// priceSheet6.setPrtlotno("JHT");
|
|
|
|
|
// priceSheetAllList.add(priceSheet6);
|
|
|
|
|
// PriceSheetVO sheet = new PriceSheetVO();
|
|
|
|
|
// sheet.setStairflag("1");
|
|
|
|
|
// sheet.setSplycode("Y523");
|
|
|
|
|
// sheet.setGxinfo("化学钝化");
|
|
|
|
|
// sheet.setPrtno("21E8-004-30450-H1");
|
|
|
|
|
// sheet.setPrice("100");
|
|
|
|
|
// sheet.setStartdat("2026-01-01 00:00:00");
|
|
|
|
|
// sheet.setValiddat("2026-12-31 00:00:00");
|
|
|
|
|
// priceSheetAllList.add(sheet);
|
|
|
|
|
// return priceSheetAllList;
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -2045,9 +1954,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
quotationSb.append(tjtPriceSheetList.get(0).getSeqid()).append("、"); |
|
|
|
|
prtum = tjtPriceSheetList.get(0).getPrtum(); |
|
|
|
|
} |
|
|
|
|
String quotation = quotationSb.length() > 0 |
|
|
|
|
? quotationSb.substring(0, quotationSb.length() - 1) |
|
|
|
|
: ""; |
|
|
|
|
String quotation = quotationSb.length() > 0 ? quotationSb.substring(0, quotationSb.length() - 1) : ""; |
|
|
|
|
statementVO.setRosStatus(StatementVO.IN_SETTLEMENT); |
|
|
|
|
statementVO.setMemo("结算中"); |
|
|
|
|
statementVO.setSettleTime(new Date()); |
|
|
|
|
@ -2118,11 +2025,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
if (list == null || list.isEmpty()) { |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
return list.stream() |
|
|
|
|
.map(StatementVO::getPutStoreTime) |
|
|
|
|
.filter(Objects::nonNull) |
|
|
|
|
.max(Date::compareTo) |
|
|
|
|
.orElse(null); |
|
|
|
|
return list.stream().map(StatementVO::getPutStoreTime).filter(Objects::nonNull).max(Date::compareTo).orElse(null); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
@ -2131,11 +2034,9 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
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()); |
|
|
|
|
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) { |
|
|
|
|
@ -2152,7 +2053,9 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
if (CollectionUtils.isEmpty(saves)) { |
|
|
|
|
return R.fail("没有需要结算的数据"); |
|
|
|
|
} |
|
|
|
|
return R.status(this.saveOrUpdateBatch(saves)); |
|
|
|
|
// 记录结算数据
|
|
|
|
|
this.saveOrUpdateBatch(saves); |
|
|
|
|
return R.success(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
@ -2161,11 +2064,9 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
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()); |
|
|
|
|
String memo = vo.getMemo(); |
|
|
|
|
return !"无需结算".equals(memo) && !"重复镀后入库".equals(memo); |
|
|
|
|
}).collect(Collectors.toList()); |
|
|
|
|
BigDecimal price = BigDecimal.ZERO; |
|
|
|
|
if (mesOemStatement.getPrice() != null) { |
|
|
|
|
price = mesOemStatement.getPrice(); |
|
|
|
|
@ -2196,14 +2097,11 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 2. 过滤掉异常原因为"无需结算、重复镀后入库"的数据
|
|
|
|
|
List<StatementVO> needMatchList = errorStatements.stream() |
|
|
|
|
.filter(vo -> { |
|
|
|
|
String memo = vo.getMemo(); |
|
|
|
|
// 排除"无需结算"和"重复镀后入库"
|
|
|
|
|
return !StrUtil.contains(memo, "无需结算") |
|
|
|
|
&& !StrUtil.contains(memo, "重复镀后入库"); |
|
|
|
|
}) |
|
|
|
|
.collect(Collectors.toList()); |
|
|
|
|
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("没有需要匹配标准工序代码的数据"); |
|
|
|
|
@ -2222,8 +2120,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
entity.setStandardProcessCode(vo.getStandardProcessCode()); |
|
|
|
|
entity.setUpdateTime(new Date()); |
|
|
|
|
return entity; |
|
|
|
|
}) |
|
|
|
|
.collect(Collectors.toList()); |
|
|
|
|
}).collect(Collectors.toList()); |
|
|
|
|
|
|
|
|
|
if (!CollectionUtils.isEmpty(updateList)) { |
|
|
|
|
this.updateBatchById(updateList); |
|
|
|
|
@ -2309,7 +2206,8 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
return R.fail("没有需要结算的记录"); |
|
|
|
|
} |
|
|
|
|
// 记录结算数据
|
|
|
|
|
return R.status(this.saveOrUpdateBatch(saves)); |
|
|
|
|
this.saveOrUpdateBatch(saves); |
|
|
|
|
return R.success(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
@ -2385,12 +2283,8 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
|
|
|
|
|
// 计算汇总数据
|
|
|
|
|
int totalCount = statements.size(); |
|
|
|
|
BigDecimal totalArea = statements.stream() |
|
|
|
|
.map(s -> s.getTotalArea() != null ? s.getTotalArea() : BigDecimal.ZERO) |
|
|
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add); |
|
|
|
|
BigDecimal totalAmount = statements.stream() |
|
|
|
|
.map(s -> s.getTotalPrice() != null ? s.getTotalPrice() : BigDecimal.ZERO) |
|
|
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add); |
|
|
|
|
BigDecimal totalArea = statements.stream().map(s -> s.getTotalArea() != null ? s.getTotalArea() : BigDecimal.ZERO).reduce(BigDecimal.ZERO, BigDecimal::add); |
|
|
|
|
BigDecimal totalAmount = statements.stream().map(s -> s.getTotalPrice() != null ? s.getTotalPrice() : BigDecimal.ZERO).reduce(BigDecimal.ZERO, BigDecimal::add); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 审批主表记录
|
|
|
|
|
@ -2427,6 +2321,8 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
// 发送消息通知给“外协结算校对员”角色的用户
|
|
|
|
|
sendNotificationToProofreaders(approval); |
|
|
|
|
|
|
|
|
|
ApprovalRecordDetailStrategy strategy = mesApprovalDetailFactory.getStrategy(MesApprovalRecordBizTypeEnum.OEM_STATEMENT.getDesc()); |
|
|
|
|
strategy.createApproval(approval.getId()); |
|
|
|
|
return R.success(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -2436,9 +2332,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
*/ |
|
|
|
|
private void generateApprovalDetails(Long approvalId, List<OemStatementEntity> statements) { |
|
|
|
|
// 1. 按厂家ID和结算大类ID分组
|
|
|
|
|
Map<String, List<OemStatementEntity>> groupedMap = statements.stream() |
|
|
|
|
.filter(s -> s.getOcId() != null && s.getStatementCategoryId() != null) |
|
|
|
|
.collect(Collectors.groupingBy(s -> s.getOcId() + "_" + s.getStatementCategoryId())); |
|
|
|
|
Map<String, List<OemStatementEntity>> groupedMap = statements.stream().filter(s -> s.getOcId() != null && s.getStatementCategoryId() != null).collect(Collectors.groupingBy(s -> s.getOcId() + "_" + s.getStatementCategoryId())); |
|
|
|
|
|
|
|
|
|
if (groupedMap.isEmpty()) { |
|
|
|
|
throw new RuntimeException("没有符合条件的结算单生成分组明细,缺少外协厂家或结算大类数据"); |
|
|
|
|
@ -2475,12 +2369,8 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
|
|
|
|
|
// 计算分组的统计数据
|
|
|
|
|
int batchCount = groupStatements.size(); |
|
|
|
|
BigDecimal groupTotalArea = groupStatements.stream() |
|
|
|
|
.map(s -> s.getTotalArea() != null ? s.getTotalArea() : BigDecimal.ZERO) |
|
|
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add); |
|
|
|
|
BigDecimal groupTotalAmount = groupStatements.stream() |
|
|
|
|
.map(s -> s.getTotalPrice() != null ? s.getTotalPrice() : BigDecimal.ZERO) |
|
|
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add); |
|
|
|
|
BigDecimal groupTotalArea = groupStatements.stream().map(s -> s.getTotalArea() != null ? s.getTotalArea() : BigDecimal.ZERO).reduce(BigDecimal.ZERO, BigDecimal::add); |
|
|
|
|
BigDecimal groupTotalAmount = groupStatements.stream().map(s -> s.getTotalPrice() != null ? s.getTotalPrice() : BigDecimal.ZERO).reduce(BigDecimal.ZERO, BigDecimal::add); |
|
|
|
|
|
|
|
|
|
// 计算占比(按结算大类汇总,不按厂家)
|
|
|
|
|
BigDecimal totalAreaByCategory = categoryAreaMap.getOrDefault(categoryId, BigDecimal.ZERO); |
|
|
|
|
@ -2490,13 +2380,11 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
BigDecimal amountRatio = BigDecimal.ZERO; |
|
|
|
|
|
|
|
|
|
if (totalAreaByCategory.compareTo(BigDecimal.ZERO) > 0) { |
|
|
|
|
areaRatio = groupTotalArea.divide(totalAreaByCategory, 4, RoundingMode.HALF_UP) |
|
|
|
|
.multiply(new BigDecimal("100")); |
|
|
|
|
areaRatio = groupTotalArea.divide(totalAreaByCategory, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (totalAmountByCategory.compareTo(BigDecimal.ZERO) > 0) { |
|
|
|
|
amountRatio = groupTotalAmount.divide(totalAmountByCategory, 4, RoundingMode.HALF_UP) |
|
|
|
|
.multiply(new BigDecimal("100")); |
|
|
|
|
amountRatio = groupTotalAmount.divide(totalAmountByCategory, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 创建明细记录
|
|
|
|
|
@ -2546,32 +2434,12 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
String roleName = "外协结算校对员"; |
|
|
|
|
|
|
|
|
|
// 构建通知消息
|
|
|
|
|
String title = String.format("外协结算审批提醒 - %s", |
|
|
|
|
approval.getApprovalNo()); |
|
|
|
|
|
|
|
|
|
String content = String.format( |
|
|
|
|
"外协结算审批详情:\n" + |
|
|
|
|
"- 审批单号:%s\n" + |
|
|
|
|
"- 结算总批数:%d\n" + |
|
|
|
|
"- 结算总面积:%.2f dm²\n" + |
|
|
|
|
"- 结算总金额:%.2f 元\n" + |
|
|
|
|
"- 提交时间:%s\n" + |
|
|
|
|
"- 状态:待校对,请进行校对", |
|
|
|
|
approval.getApprovalNo(), |
|
|
|
|
approval.getTotalCount() != null ? approval.getTotalCount() : 0, |
|
|
|
|
approval.getTotalArea() != null ? approval.getTotalArea() : BigDecimal.ZERO, |
|
|
|
|
approval.getTotalAmount() != null ? approval.getTotalAmount() : BigDecimal.ZERO, |
|
|
|
|
approval.getSubmitTime() |
|
|
|
|
); |
|
|
|
|
String title = String.format("外协结算审批提醒 - %s", approval.getApprovalNo()); |
|
|
|
|
|
|
|
|
|
String content = String.format("外协结算审批详情:\n" + "- 审批单号:%s\n" + "- 结算总批数:%d\n" + "- 结算总面积:%.2f dm²\n" + "- 结算总金额:%.2f 元\n" + "- 提交时间:%s\n" + "- 状态:待校对,请进行校对", approval.getApprovalNo(), approval.getTotalCount() != null ? approval.getTotalCount() : 0, approval.getTotalArea() != null ? approval.getTotalArea() : BigDecimal.ZERO, approval.getTotalAmount() != null ? approval.getTotalAmount() : BigDecimal.ZERO, approval.getSubmitTime()); |
|
|
|
|
|
|
|
|
|
// 创建通知消息实体
|
|
|
|
|
MesNotifyMessageEntity notifyMessage = MesNotifyMessageEntity.builder() |
|
|
|
|
.title(title) |
|
|
|
|
.content(content) |
|
|
|
|
.receiveRoleId(proofreaderRoleId) |
|
|
|
|
.receiveRoleName(roleName) |
|
|
|
|
.receiveUserId(AuthUtil.getUserId()) |
|
|
|
|
.build(); |
|
|
|
|
MesNotifyMessageEntity notifyMessage = MesNotifyMessageEntity.builder().title(title).content(content).receiveRoleId(proofreaderRoleId).receiveRoleName(roleName).receiveUserId(AuthUtil.getUserId()).build(); |
|
|
|
|
|
|
|
|
|
// 调用Feign客户端保存通知消息
|
|
|
|
|
R result = mesNotifyMessageClient.save(notifyMessage); |
|
|
|
|
@ -2627,8 +2495,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper, |
|
|
|
|
log.info("推送成功,ID: {}, 车间订单号: {}", statement.getId(), statement.getWoCode()); |
|
|
|
|
} else { |
|
|
|
|
failCount++; |
|
|
|
|
String errorMsg = String.format("ID:%s, 错误:%s", statement.getId(), |
|
|
|
|
result != null ? result.getMsg() : "未知错误"); |
|
|
|
|
String errorMsg = String.format("ID:%s, 错误:%s", statement.getId(), result != null ? result.getMsg() : "未知错误"); |
|
|
|
|
errorMessages.add(errorMsg); |
|
|
|
|
log.error("推送失败,{}", errorMsg); |
|
|
|
|
} |
|
|
|
|
|