|
@@ -25,7 +25,6 @@ import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
|
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
|
|
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
|
|
import cn.iocoder.yudao.module.system.api.saporg.SapOrgApi;
|
|
import cn.iocoder.yudao.module.system.api.saporg.SapOrgApi;
|
|
import cn.iocoder.yudao.module.system.api.saporg.dto.SapOrgRespDTO;
|
|
import cn.iocoder.yudao.module.system.api.saporg.dto.SapOrgRespDTO;
|
|
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -582,17 +581,6 @@ public class IotSapServiceImpl implements IotSapService {
|
|
}
|
|
}
|
|
System.out.println(factoryCode + "当前库中已有sap库存数量:" + existStockKeys.size());
|
|
System.out.println(factoryCode + "当前库中已有sap库存数量:" + existStockKeys.size());
|
|
|
|
|
|
- // todo 没有维护SAP工厂 库存地点的组织 已经存在的库存数据
|
|
|
|
- /* Set<String> noFactoryExistStockKeys = new HashSet<>();
|
|
|
|
- if (CollUtil.isNotEmpty(existStocks)) {
|
|
|
|
- noFactoryExistStockKeys = existStocks.stream()
|
|
|
|
- // 过滤非空对象和非空code
|
|
|
|
- .filter(stk -> ObjUtil.isNotEmpty(stk) && StrUtil.isNotBlank(stk.getMaterialCode())
|
|
|
|
- && StrUtil.isNotBlank(stk.getFactoryCode()) && StrUtil.isNotBlank(stk.getStorageLocationCode()))
|
|
|
|
- .map(stk -> StrUtil.join("-", stk.getFactoryCode(), stk.getStorageLocationCode(), stk.getMaterialCode()))
|
|
|
|
- .collect(Collectors.toSet());
|
|
|
|
- } */
|
|
|
|
-
|
|
|
|
// 将已经存在的库存数据 设置成 Map<String, IotSapStockDO> 的形式 便于后续更新
|
|
// 将已经存在的库存数据 设置成 Map<String, IotSapStockDO> 的形式 便于后续更新
|
|
// key工厂code-库存地点code-物料编码 value库存对象 从此集合中筛选将要被更新的库存对象
|
|
// key工厂code-库存地点code-物料编码 value库存对象 从此集合中筛选将要被更新的库存对象
|
|
Map<String, IotSapStockDO> tobeUpdatedStockPair = new HashMap<>();
|
|
Map<String, IotSapStockDO> tobeUpdatedStockPair = new HashMap<>();
|
|
@@ -605,19 +593,6 @@ public class IotSapServiceImpl implements IotSapService {
|
|
(existing, replacement) -> existing // 处理键冲突: 保留先出现的元素
|
|
(existing, replacement) -> existing // 处理键冲突: 保留先出现的元素
|
|
));
|
|
));
|
|
|
|
|
|
- // todo 没有配置SAP 工厂 库存地点 的组织库存更新
|
|
|
|
- // 将已经存在的库存数据 设置成 Map<String, IotSapStockDO> 的形式 便于后续更新
|
|
|
|
- // key工厂code-库存地点code-物料编码 value库存对象 从此集合中筛选将要被更新的库存对象
|
|
|
|
- /* Map<String, IotSapStockDO> noFactoryTobeUpdatedStockPair = new HashMap<>();
|
|
|
|
- noFactoryTobeUpdatedStockPair = existStocks.stream()
|
|
|
|
- .filter(stk -> StrUtil.isNotBlank(stk.getMaterialCode()) && StrUtil.isNotBlank(stk.getFactoryCode())
|
|
|
|
- && StrUtil.isNotBlank(stk.getStorageLocationCode()))
|
|
|
|
- .collect(Collectors.toMap(
|
|
|
|
- stk -> StrUtil.join("-", stk.getFactoryCode(), stk.getStorageLocationCode(), stk.getMaterialCode()),
|
|
|
|
- stk -> stk, // 值为对象本身
|
|
|
|
- (existing, replacement) -> existing // 处理键冲突: 保留先出现的元素
|
|
|
|
- )); */
|
|
|
|
-
|
|
|
|
// 找出需要新增的库存(SAP物料编码去掉前导零后,不在现有物料集合中的记录)
|
|
// 找出需要新增的库存(SAP物料编码去掉前导零后,不在现有物料集合中的记录)
|
|
Set<String> finalExistStockKeys = existStockKeys;
|
|
Set<String> finalExistStockKeys = existStockKeys;
|
|
List<IotSapStockVO> newStocks = sapStocks.stream()
|
|
List<IotSapStockVO> newStocks = sapStocks.stream()
|
|
@@ -635,19 +610,6 @@ public class IotSapServiceImpl implements IotSapService {
|
|
|
|
|
|
System.out.println(factoryCode + "需要新增的sap库存数量:" + newStocks.size());
|
|
System.out.println(factoryCode + "需要新增的sap库存数量:" + newStocks.size());
|
|
|
|
|
|
- // todo 没有维护SAP工厂 库存地点的组织 新增的库存数据
|
|
|
|
- // 找出需要新增的库存(SAP物料编码去掉前导零后,不在现有物料集合中的记录)
|
|
|
|
- /* Set<String> noFactoryFinalExistStockKeys = noFactoryExistStockKeys;
|
|
|
|
- List<IotSapStockVO> noFactoryNewStocks = sapStocks.stream()
|
|
|
|
- .filter(stk -> StrUtil.isNotBlank(stk.getMATNR()) && StrUtil.isNotBlank(stk.getLGORT()) && StrUtil.isNotBlank(stk.getWERKS()))
|
|
|
|
- .filter(stk -> {
|
|
|
|
- // 处理前导零:移除MATNR前的 00000000
|
|
|
|
- String processedCode = stk.getMATNR().replaceFirst("^0+", "");
|
|
|
|
- // 本地已经配置过库存地点 包含SAP库存接口返回的库存地点
|
|
|
|
- return !noFactoryFinalExistStockKeys.contains(StrUtil.join("-", stk.getWERKS(), stk.getLGORT(), processedCode));
|
|
|
|
- })
|
|
|
|
- .collect(Collectors.toList()); */
|
|
|
|
-
|
|
|
|
// 新增SAP库存数据
|
|
// 新增SAP库存数据
|
|
List<IotSapStockDO> tobeAddedStocks = new ArrayList<>();
|
|
List<IotSapStockDO> tobeAddedStocks = new ArrayList<>();
|
|
if (CollUtil.isNotEmpty(newStocks)) {
|
|
if (CollUtil.isNotEmpty(newStocks)) {
|
|
@@ -698,50 +660,6 @@ public class IotSapServiceImpl implements IotSapService {
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
- // todo 新增 没有配置组织部门的 SAP库存数据
|
|
|
|
- /** List<IotSapStockDO> noFactoryTobeAddedStocks = new ArrayList<>();
|
|
|
|
- if (CollUtil.isNotEmpty(noFactoryNewStocks)) {
|
|
|
|
- noFactoryNewStocks.forEach(stock -> {
|
|
|
|
- // 只保存pms维护过库存地点的数据
|
|
|
|
- String uniqueKey = StrUtil.join("-", stock.getWERKS(), stock.getLGORT());
|
|
|
|
- IotSapStockDO sapStock = new IotSapStockDO();
|
|
|
|
- // 部门统一设置为 科瑞石油技术
|
|
|
|
- sapStock.setDeptId(156l); **/
|
|
|
|
- // 工厂id
|
|
|
|
- /* if (factoryIdPair.containsKey(stock.getWERKS())) {
|
|
|
|
- sapStock.setFactoryId(factoryIdPair.get(stock.getWERKS()));
|
|
|
|
- } */
|
|
|
|
- /** sapStock.setFactoryCode(stock.getWERKS());
|
|
|
|
- // 工厂名称
|
|
|
|
- if (factoryNamePair.containsKey(stock.getWERKS())) {
|
|
|
|
- sapStock.setFactory(factoryNamePair.get(stock.getWERKS()));
|
|
|
|
- }
|
|
|
|
- // 库存地点 code
|
|
|
|
- sapStock.setStorageLocationCode(stock.getLGORT()); **/
|
|
|
|
- // 库存地点id
|
|
|
|
- /* if (storageLocationIdPair.containsKey(uniqueKey)) {
|
|
|
|
- sapStock.setStorageLocationId(storageLocationIdPair.get(uniqueKey));
|
|
|
|
- } */
|
|
|
|
- // 库存地点名称
|
|
|
|
- /** if (stockLocationNamePair.containsKey(uniqueKey)) {
|
|
|
|
- sapStock.setProjectDepartment(stockLocationNamePair.get(uniqueKey));
|
|
|
|
- }
|
|
|
|
- // 物料编码 需要去掉前缀 00000000
|
|
|
|
- sapStock.setMaterialCode(stock.getMATNR().replaceFirst("^0+", ""));
|
|
|
|
- // 物料描述
|
|
|
|
- sapStock.setMaterialName(stock.getMAKTX());
|
|
|
|
- // 库存数量
|
|
|
|
- sapStock.setQuantity(stock.getLABST());
|
|
|
|
- // 单价
|
|
|
|
- sapStock.setUnitPrice(stock.getJIAGE());
|
|
|
|
- // 基本单位
|
|
|
|
- sapStock.setUnit(stock.getMEINS());
|
|
|
|
- // 同步时间
|
|
|
|
- sapStock.setSyncTime(LocalDateTime.now());
|
|
|
|
- noFactoryTobeAddedStocks.add(sapStock);
|
|
|
|
- });
|
|
|
|
- } **/
|
|
|
|
-
|
|
|
|
// 使用返回的SAP库存数据更新已有的 库存数据
|
|
// 使用返回的SAP库存数据更新已有的 库存数据
|
|
// pms中已有 SAP返回数据中也存在 则更新 再次判断更新deptId 因为有可能又将SAP库存地点关联到了 组织部门
|
|
// pms中已有 SAP返回数据中也存在 则更新 再次判断更新deptId 因为有可能又将SAP库存地点关联到了 组织部门
|
|
List<IotSapStockDO> actualUpdatedStocks = new ArrayList<>();
|
|
List<IotSapStockDO> actualUpdatedStocks = new ArrayList<>();
|
|
@@ -787,69 +705,10 @@ public class IotSapServiceImpl implements IotSapService {
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
- // todo sap 工厂 库存地点 未关联组织部门
|
|
|
|
- // 使用返回的SAP库存数据更新已有的 库存数据 pms中已有 SAP返回数据中也存在 则更新
|
|
|
|
- /* List<IotSapStockDO> noFactoryActualUpdatedStocks = new ArrayList<>();
|
|
|
|
- // key工厂code-库存地点code-物料编码 value库存对象
|
|
|
|
- Map<String, IotSapStockVO> noFactoryExistStockPair = createNoFactoryExistStockMap(sapStocks, noFactoryExistStockKeys, storageLocationIdPair);
|
|
|
|
- if (CollUtil.isNotEmpty(noFactoryExistStockPair)) {
|
|
|
|
- Map<String, IotSapStockDO> finalTobeUpdatedStockPair = noFactoryTobeUpdatedStockPair;
|
|
|
|
- noFactoryExistStockPair.forEach((k, v) -> {
|
|
|
|
- if (finalTobeUpdatedStockPair.containsKey(k)) {
|
|
|
|
- IotSapStockDO sapStock = finalTobeUpdatedStockPair.get(k);
|
|
|
|
- sapStock.setUnitPrice(v.getJIAGE()); // 更新库存价格
|
|
|
|
- sapStock.setQuantity(v.getLABST()); // 更新库存数量
|
|
|
|
- sapStock.setUnit(v.getMEINS()); // 更新基本单位
|
|
|
|
- noFactoryActualUpdatedStocks.add(sapStock);
|
|
|
|
- }
|
|
|
|
- });
|
|
|
|
- }
|
|
|
|
- System.out.println(factoryCode + "SAP工厂库存地点未关联组织部门-需要更新的SAP库存数量:" + noFactoryActualUpdatedStocks.size()); */
|
|
|
|
-
|
|
|
|
// pms中已有 但是 SAP返回数据不存在 如果设置了安全库存,则库存为0,若没有设置安全库存,则可以删除
|
|
// pms中已有 但是 SAP返回数据不存在 如果设置了安全库存,则库存为0,若没有设置安全库存,则可以删除
|
|
|
|
|
|
- // 遍历明细数据 新增 修改 SAP库存数据
|
|
|
|
- /* List<IotSapStockDO> tobeSapStocks = new ArrayList<>();
|
|
|
|
- sapStocks.forEach(stock -> {
|
|
|
|
- // 只保存pms维护过库存地点的数据
|
|
|
|
- if (locationCodeDeptIdPair.containsKey(stock.getLGORT())) {
|
|
|
|
- IotSapStockDO sapStock = new IotSapStockDO();
|
|
|
|
- // 部门id
|
|
|
|
- sapStock.setDeptId(locationCodeDeptIdPair.get(stock.getLGORT()));
|
|
|
|
- // 工厂id
|
|
|
|
- if (factoryIdPair.containsKey(stock.getWERKS())) {
|
|
|
|
- sapStock.setFactoryId(factoryIdPair.get(stock.getWERKS()));
|
|
|
|
- }
|
|
|
|
- // 工厂名称
|
|
|
|
- if (factoryNamePair.containsKey(stock.getWERKS())) {
|
|
|
|
- sapStock.setFactory(factoryNamePair.get(stock.getWERKS()));
|
|
|
|
- }
|
|
|
|
- // 库存地点id
|
|
|
|
- if (storageLocationIdPair.containsKey(stock.getLGORT())) {
|
|
|
|
- sapStock.setStorageLocationId(storageLocationIdPair.get(stock.getLGORT()));
|
|
|
|
- }
|
|
|
|
- // 库存地点名称
|
|
|
|
- if (stockLocationNamePair.containsKey(stock.getLGORT())) {
|
|
|
|
- sapStock.setProjectDepartment(stockLocationNamePair.get(stock.getLGORT()));
|
|
|
|
- }
|
|
|
|
- // 物料编码 需要去掉前缀 00000000
|
|
|
|
- sapStock.setMaterialCode(stock.getMATNR());
|
|
|
|
- // 物料描述
|
|
|
|
- sapStock.setMaterialName(stock.getMAKTX());
|
|
|
|
- // 库存数量
|
|
|
|
- sapStock.setQuantity(stock.getLABST());
|
|
|
|
- // 单价
|
|
|
|
- sapStock.setUnitPrice(stock.getJIAGE());
|
|
|
|
- // 基本单位
|
|
|
|
- sapStock.setUnit(stock.getMEINS());
|
|
|
|
- // 同步时间
|
|
|
|
- sapStock.setSyncTime(LocalDateTime.now());
|
|
|
|
- tobeSapStocks.add(sapStock);
|
|
|
|
- }
|
|
|
|
- }); */
|
|
|
|
- // 保存SAP库存原始数据 先删除 再新增
|
|
|
|
- QueryWrapper<IotSapStockLogDO> queryWrapper = new QueryWrapper<>();
|
|
|
|
- TenantUtils.execute(1L, () -> iotSapStockLogMapper.delete(queryWrapper));
|
|
|
|
|
|
+ // 保存SAP库存原始数据 先删除当前工厂下的数据 再新增
|
|
|
|
+ TenantUtils.execute(1L, () -> iotSapStockLogMapper.deleteSapStockLogs(factoryCode));
|
|
if (CollUtil.isNotEmpty(tobeAddedSapStockLogs)) {
|
|
if (CollUtil.isNotEmpty(tobeAddedSapStockLogs)) {
|
|
TenantUtils.execute(1L, () -> iotSapStockLogMapper.insertBatch(tobeAddedSapStockLogs));
|
|
TenantUtils.execute(1L, () -> iotSapStockLogMapper.insertBatch(tobeAddedSapStockLogs));
|
|
}
|
|
}
|
|
@@ -857,18 +716,11 @@ public class IotSapServiceImpl implements IotSapService {
|
|
if (CollUtil.isNotEmpty(tobeAddedStocks)) {
|
|
if (CollUtil.isNotEmpty(tobeAddedStocks)) {
|
|
TenantUtils.execute(1L, () -> iotSapStockMapper.insertBatch(tobeAddedStocks));
|
|
TenantUtils.execute(1L, () -> iotSapStockMapper.insertBatch(tobeAddedStocks));
|
|
}
|
|
}
|
|
- // 本地库存 初始化 批量插入本地库存 记录 工厂 库存地点 未关联了组织架构部门
|
|
|
|
- /* if (CollUtil.isNotEmpty(noFactoryTobeAddedStocks)) {
|
|
|
|
- TenantUtils.execute(1L, () -> iotSapStockMapper.insertBatch(noFactoryTobeAddedStocks));
|
|
|
|
- } */
|
|
|
|
|
|
+
|
|
// pms中存在而且SAP接口也返回的库存数据:更新
|
|
// pms中存在而且SAP接口也返回的库存数据:更新
|
|
if (CollUtil.isNotEmpty(actualUpdatedStocks)) {
|
|
if (CollUtil.isNotEmpty(actualUpdatedStocks)) {
|
|
TenantUtils.execute(1L, () -> iotSapStockMapper.updateBatch(actualUpdatedStocks));
|
|
TenantUtils.execute(1L, () -> iotSapStockMapper.updateBatch(actualUpdatedStocks));
|
|
}
|
|
}
|
|
- // pms中存在而且SAP接口也返回的库存数据:更新 工厂 库存地点 未关联了组织架构部门
|
|
|
|
- /* if (CollUtil.isNotEmpty(noFactoryActualUpdatedStocks)) {
|
|
|
|
- TenantUtils.execute(1L, () -> iotSapStockMapper.updateBatch(noFactoryActualUpdatedStocks));
|
|
|
|
- } */
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|