|
@@ -11,11 +11,13 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.iotlockstock.IotLockStockDO;
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotmaterial.IotMaterialDO;
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotmaterial.IotMaterialDO;
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotsappickinglist.IotSapPickingListDO;
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotsappickinglist.IotSapPickingListDO;
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotsapstock.IotSapStockDO;
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotsapstock.IotSapStockDO;
|
|
|
|
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotsapstocklog.IotSapStockLogDO;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotlockstock.IotLockStockMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotlockstock.IotLockStockMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotmaterial.IotMaterialMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotmaterial.IotMaterialMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotmaterial.IotSapMaterialMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotmaterial.IotSapMaterialMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotsappickinglist.IotSapPickingListMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotsappickinglist.IotSapPickingListMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotsapstock.IotSapStockMapper;
|
|
import cn.iocoder.yudao.module.pms.dal.mysql.iotsapstock.IotSapStockMapper;
|
|
|
|
+import cn.iocoder.yudao.module.pms.dal.mysql.iotsapstocklog.IotSapStockLogMapper;
|
|
import cn.iocoder.yudao.module.pms.sap.vo.*;
|
|
import cn.iocoder.yudao.module.pms.sap.vo.*;
|
|
import cn.iocoder.yudao.module.supplier.dal.dataobject.product.SupplierDO;
|
|
import cn.iocoder.yudao.module.supplier.dal.dataobject.product.SupplierDO;
|
|
import cn.iocoder.yudao.module.supplier.dal.mysql.product.SupplierMapper;
|
|
import cn.iocoder.yudao.module.supplier.dal.mysql.product.SupplierMapper;
|
|
@@ -23,6 +25,7 @@ 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;
|
|
@@ -65,6 +68,8 @@ public class IotSapServiceImpl implements IotSapService {
|
|
@Autowired
|
|
@Autowired
|
|
private IotSapStockMapper iotSapStockMapper;
|
|
private IotSapStockMapper iotSapStockMapper;
|
|
@Autowired
|
|
@Autowired
|
|
|
|
+ private IotSapStockLogMapper iotSapStockLogMapper;
|
|
|
|
+ @Autowired
|
|
private IotSapPickingListMapper iotSapPickingListMapper;
|
|
private IotSapPickingListMapper iotSapPickingListMapper;
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -564,20 +569,21 @@ public class IotSapServiceImpl implements IotSapService {
|
|
});
|
|
});
|
|
}
|
|
}
|
|
});
|
|
});
|
|
- // 查询所有SAP库存集合A,以 ‘库存地点id+物料编码’ 为唯一key 如果 sapStocks 中有物料不在A中 新增物料
|
|
|
|
|
|
+ // 查询所有SAP库存集合A,以 ‘工厂编码+库存地点code+物料编码’ 为唯一key 如果 sapStocks 中有物料不在A中 新增物料
|
|
Set<String> existStockKeys = new HashSet<>();
|
|
Set<String> existStockKeys = new HashSet<>();
|
|
List<IotSapStockDO> existStocks = TenantUtils.execute(1L, () -> iotSapStockMapper.selectList());
|
|
List<IotSapStockDO> existStocks = TenantUtils.execute(1L, () -> iotSapStockMapper.selectList());
|
|
if (CollUtil.isNotEmpty(existStocks)) {
|
|
if (CollUtil.isNotEmpty(existStocks)) {
|
|
existStockKeys = existStocks.stream()
|
|
existStockKeys = existStocks.stream()
|
|
// 过滤非空对象和非空code
|
|
// 过滤非空对象和非空code
|
|
- .filter(stk -> ObjUtil.isNotEmpty(stk) && StrUtil.isNotBlank(stk.getMaterialCode()) && ObjUtil.isNotEmpty(stk.getStorageLocationId()))
|
|
|
|
- .map(stk -> StrUtil.join("-", String.valueOf(stk.getStorageLocationId()), stk.getMaterialCode()))
|
|
|
|
|
|
+ .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());
|
|
.collect(Collectors.toSet());
|
|
}
|
|
}
|
|
System.out.println(factoryCode + "当前库中已有sap库存数量:" + existStockKeys.size());
|
|
System.out.println(factoryCode + "当前库中已有sap库存数量:" + existStockKeys.size());
|
|
|
|
|
|
// todo 没有维护SAP工厂 库存地点的组织 已经存在的库存数据
|
|
// todo 没有维护SAP工厂 库存地点的组织 已经存在的库存数据
|
|
- Set<String> noFactoryExistStockKeys = new HashSet<>();
|
|
|
|
|
|
+ /* Set<String> noFactoryExistStockKeys = new HashSet<>();
|
|
if (CollUtil.isNotEmpty(existStocks)) {
|
|
if (CollUtil.isNotEmpty(existStocks)) {
|
|
noFactoryExistStockKeys = existStocks.stream()
|
|
noFactoryExistStockKeys = existStocks.stream()
|
|
// 过滤非空对象和非空code
|
|
// 过滤非空对象和非空code
|
|
@@ -585,16 +591,16 @@ public class IotSapServiceImpl implements IotSapService {
|
|
&& StrUtil.isNotBlank(stk.getFactoryCode()) && StrUtil.isNotBlank(stk.getStorageLocationCode()))
|
|
&& StrUtil.isNotBlank(stk.getFactoryCode()) && StrUtil.isNotBlank(stk.getStorageLocationCode()))
|
|
.map(stk -> StrUtil.join("-", stk.getFactoryCode(), stk.getStorageLocationCode(), stk.getMaterialCode()))
|
|
.map(stk -> StrUtil.join("-", stk.getFactoryCode(), stk.getStorageLocationCode(), stk.getMaterialCode()))
|
|
.collect(Collectors.toSet());
|
|
.collect(Collectors.toSet());
|
|
- }
|
|
|
|
|
|
+ } */
|
|
|
|
|
|
// 将已经存在的库存数据 设置成 Map<String, IotSapStockDO> 的形式 便于后续更新
|
|
// 将已经存在的库存数据 设置成 Map<String, IotSapStockDO> 的形式 便于后续更新
|
|
- // key库存地点id-物料编码 value库存对象 从此集合中筛选将要被更新的库存对象
|
|
|
|
|
|
+ // key工厂code-库存地点code-物料编码 value库存对象 从此集合中筛选将要被更新的库存对象
|
|
Map<String, IotSapStockDO> tobeUpdatedStockPair = new HashMap<>();
|
|
Map<String, IotSapStockDO> tobeUpdatedStockPair = new HashMap<>();
|
|
tobeUpdatedStockPair = existStocks.stream()
|
|
tobeUpdatedStockPair = existStocks.stream()
|
|
- .filter(stk -> StrUtil.isNotBlank(stk.getMaterialCode()) && ObjUtil.isNotEmpty(stk.getStorageLocationId())
|
|
|
|
- && stockLocationCodeIdPair.containsKey(stk.getStorageLocationId()))
|
|
|
|
|
|
+ .filter(stk -> StrUtil.isNotBlank(stk.getMaterialCode()) && StrUtil.isNotBlank(stk.getFactoryCode())
|
|
|
|
+ && StrUtil.isNotBlank(stk.getStorageLocationCode()))
|
|
.collect(Collectors.toMap(
|
|
.collect(Collectors.toMap(
|
|
- stk -> StrUtil.join("-", stk.getStorageLocationId(), stk.getMaterialCode()),
|
|
|
|
|
|
+ stk -> StrUtil.join("-", stk.getFactoryCode(), stk.getStorageLocationCode(), stk.getMaterialCode()),
|
|
stk -> stk, // 值为对象本身
|
|
stk -> stk, // 值为对象本身
|
|
(existing, replacement) -> existing // 处理键冲突: 保留先出现的元素
|
|
(existing, replacement) -> existing // 处理键冲突: 保留先出现的元素
|
|
));
|
|
));
|
|
@@ -602,7 +608,7 @@ public class IotSapServiceImpl implements IotSapService {
|
|
// todo 没有配置SAP 工厂 库存地点 的组织库存更新
|
|
// todo 没有配置SAP 工厂 库存地点 的组织库存更新
|
|
// 将已经存在的库存数据 设置成 Map<String, IotSapStockDO> 的形式 便于后续更新
|
|
// 将已经存在的库存数据 设置成 Map<String, IotSapStockDO> 的形式 便于后续更新
|
|
// key工厂code-库存地点code-物料编码 value库存对象 从此集合中筛选将要被更新的库存对象
|
|
// key工厂code-库存地点code-物料编码 value库存对象 从此集合中筛选将要被更新的库存对象
|
|
- Map<String, IotSapStockDO> noFactoryTobeUpdatedStockPair = new HashMap<>();
|
|
|
|
|
|
+ /* Map<String, IotSapStockDO> noFactoryTobeUpdatedStockPair = new HashMap<>();
|
|
noFactoryTobeUpdatedStockPair = existStocks.stream()
|
|
noFactoryTobeUpdatedStockPair = existStocks.stream()
|
|
.filter(stk -> StrUtil.isNotBlank(stk.getMaterialCode()) && StrUtil.isNotBlank(stk.getFactoryCode())
|
|
.filter(stk -> StrUtil.isNotBlank(stk.getMaterialCode()) && StrUtil.isNotBlank(stk.getFactoryCode())
|
|
&& StrUtil.isNotBlank(stk.getStorageLocationCode()))
|
|
&& StrUtil.isNotBlank(stk.getStorageLocationCode()))
|
|
@@ -610,7 +616,7 @@ public class IotSapServiceImpl implements IotSapService {
|
|
stk -> StrUtil.join("-", stk.getFactoryCode(), stk.getStorageLocationCode(), stk.getMaterialCode()),
|
|
stk -> StrUtil.join("-", stk.getFactoryCode(), stk.getStorageLocationCode(), stk.getMaterialCode()),
|
|
stk -> stk, // 值为对象本身
|
|
stk -> stk, // 值为对象本身
|
|
(existing, replacement) -> existing // 处理键冲突: 保留先出现的元素
|
|
(existing, replacement) -> existing // 处理键冲突: 保留先出现的元素
|
|
- ));
|
|
|
|
|
|
+ )); */
|
|
|
|
|
|
// 找出需要新增的库存(SAP物料编码去掉前导零后,不在现有物料集合中的记录)
|
|
// 找出需要新增的库存(SAP物料编码去掉前导零后,不在现有物料集合中的记录)
|
|
Set<String> finalExistStockKeys = existStockKeys;
|
|
Set<String> finalExistStockKeys = existStockKeys;
|
|
@@ -621,8 +627,9 @@ public class IotSapServiceImpl implements IotSapService {
|
|
// 处理前导零:移除MATNR前的 00000000
|
|
// 处理前导零:移除MATNR前的 00000000
|
|
String processedCode = stk.getMATNR().replaceFirst("^0+", "");
|
|
String processedCode = stk.getMATNR().replaceFirst("^0+", "");
|
|
// 本地已经配置过库存地点 包含SAP库存接口返回的库存地点
|
|
// 本地已经配置过库存地点 包含SAP库存接口返回的库存地点
|
|
- Long storageLocationId = storageLocationIdPair.get(StrUtil.join("-", stk.getWERKS(), stk.getLGORT()));
|
|
|
|
- return !finalExistStockKeys.contains(StrUtil.join("-", storageLocationId, processedCode));
|
|
|
|
|
|
+ // Long storageLocationId = storageLocationIdPair.get(StrUtil.join("-", stk.getWERKS(), stk.getLGORT()));
|
|
|
|
+ String uniqueKey = StrUtil.join("-", stk.getWERKS(), stk.getLGORT());
|
|
|
|
+ return !finalExistStockKeys.contains(StrUtil.join("-", uniqueKey, processedCode));
|
|
})
|
|
})
|
|
.collect(Collectors.toList());
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
@@ -630,7 +637,7 @@ public class IotSapServiceImpl implements IotSapService {
|
|
|
|
|
|
// todo 没有维护SAP工厂 库存地点的组织 新增的库存数据
|
|
// todo 没有维护SAP工厂 库存地点的组织 新增的库存数据
|
|
// 找出需要新增的库存(SAP物料编码去掉前导零后,不在现有物料集合中的记录)
|
|
// 找出需要新增的库存(SAP物料编码去掉前导零后,不在现有物料集合中的记录)
|
|
- Set<String> noFactoryFinalExistStockKeys = noFactoryExistStockKeys;
|
|
|
|
|
|
+ /* Set<String> noFactoryFinalExistStockKeys = noFactoryExistStockKeys;
|
|
List<IotSapStockVO> noFactoryNewStocks = sapStocks.stream()
|
|
List<IotSapStockVO> noFactoryNewStocks = sapStocks.stream()
|
|
.filter(stk -> StrUtil.isNotBlank(stk.getMATNR()) && StrUtil.isNotBlank(stk.getLGORT()) && StrUtil.isNotBlank(stk.getWERKS()))
|
|
.filter(stk -> StrUtil.isNotBlank(stk.getMATNR()) && StrUtil.isNotBlank(stk.getLGORT()) && StrUtil.isNotBlank(stk.getWERKS()))
|
|
.filter(stk -> {
|
|
.filter(stk -> {
|
|
@@ -639,7 +646,7 @@ public class IotSapServiceImpl implements IotSapService {
|
|
// 本地已经配置过库存地点 包含SAP库存接口返回的库存地点
|
|
// 本地已经配置过库存地点 包含SAP库存接口返回的库存地点
|
|
return !noFactoryFinalExistStockKeys.contains(StrUtil.join("-", stk.getWERKS(), stk.getLGORT(), processedCode));
|
|
return !noFactoryFinalExistStockKeys.contains(StrUtil.join("-", stk.getWERKS(), stk.getLGORT(), processedCode));
|
|
})
|
|
})
|
|
- .collect(Collectors.toList());
|
|
|
|
|
|
+ .collect(Collectors.toList()); */
|
|
|
|
|
|
// 新增SAP库存数据
|
|
// 新增SAP库存数据
|
|
List<IotSapStockDO> tobeAddedStocks = new ArrayList<>();
|
|
List<IotSapStockDO> tobeAddedStocks = new ArrayList<>();
|
|
@@ -647,69 +654,76 @@ public class IotSapServiceImpl implements IotSapService {
|
|
newStocks.forEach(stock -> {
|
|
newStocks.forEach(stock -> {
|
|
// 只保存pms维护过库存地点的数据
|
|
// 只保存pms维护过库存地点的数据
|
|
String uniqueKey = StrUtil.join("-", stock.getWERKS(), stock.getLGORT());
|
|
String uniqueKey = StrUtil.join("-", stock.getWERKS(), stock.getLGORT());
|
|
|
|
+ IotSapStockDO sapStock = new IotSapStockDO();
|
|
|
|
+ // 部门id 已经关联的组织部门的SAP工厂 库存地点
|
|
if (locationCodeDeptIdPair.containsKey(uniqueKey)) {
|
|
if (locationCodeDeptIdPair.containsKey(uniqueKey)) {
|
|
- IotSapStockDO sapStock = new IotSapStockDO();
|
|
|
|
- // 部门id
|
|
|
|
sapStock.setDeptId(locationCodeDeptIdPair.get(uniqueKey));
|
|
sapStock.setDeptId(locationCodeDeptIdPair.get(uniqueKey));
|
|
- // 工厂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(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());
|
|
|
|
- tobeAddedStocks.add(sapStock);
|
|
|
|
|
|
+ } else {
|
|
|
|
+ // 没有关联组织部门的SAP工厂 库存地点 暂时设置部门 为 163 科瑞石油技术
|
|
|
|
+ sapStock.setDeptId(163l);
|
|
|
|
+ }
|
|
|
|
+ // 工厂id
|
|
|
|
+ if (factoryIdPair.containsKey(stock.getWERKS())) {
|
|
|
|
+ sapStock.setFactoryId(factoryIdPair.get(stock.getWERKS()));
|
|
|
|
+ }
|
|
|
|
+ // 工厂 code
|
|
|
|
+ sapStock.setFactoryCode(stock.getWERKS());
|
|
|
|
+ // 工厂名称
|
|
|
|
+ if (factoryNamePair.containsKey(stock.getWERKS())) {
|
|
|
|
+ sapStock.setFactory(factoryNamePair.get(stock.getWERKS()));
|
|
|
|
+ }
|
|
|
|
+ // 库存地点id
|
|
|
|
+ if (storageLocationIdPair.containsKey(uniqueKey)) {
|
|
|
|
+ sapStock.setStorageLocationId(storageLocationIdPair.get(uniqueKey));
|
|
|
|
+ }
|
|
|
|
+ // 库存地点code
|
|
|
|
+ sapStock.setStorageLocationCode(stock.getLGORT());
|
|
|
|
+ // 库存地点名称
|
|
|
|
+ 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());
|
|
|
|
+ tobeAddedStocks.add(sapStock);
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
// todo 新增 没有配置组织部门的 SAP库存数据
|
|
// todo 新增 没有配置组织部门的 SAP库存数据
|
|
- List<IotSapStockDO> noFactoryTobeAddedStocks = new ArrayList<>();
|
|
|
|
|
|
+ /** List<IotSapStockDO> noFactoryTobeAddedStocks = new ArrayList<>();
|
|
if (CollUtil.isNotEmpty(noFactoryNewStocks)) {
|
|
if (CollUtil.isNotEmpty(noFactoryNewStocks)) {
|
|
noFactoryNewStocks.forEach(stock -> {
|
|
noFactoryNewStocks.forEach(stock -> {
|
|
// 只保存pms维护过库存地点的数据
|
|
// 只保存pms维护过库存地点的数据
|
|
String uniqueKey = StrUtil.join("-", stock.getWERKS(), stock.getLGORT());
|
|
String uniqueKey = StrUtil.join("-", stock.getWERKS(), stock.getLGORT());
|
|
IotSapStockDO sapStock = new IotSapStockDO();
|
|
IotSapStockDO sapStock = new IotSapStockDO();
|
|
// 部门统一设置为 科瑞石油技术
|
|
// 部门统一设置为 科瑞石油技术
|
|
- sapStock.setDeptId(156l);
|
|
|
|
|
|
+ sapStock.setDeptId(156l); **/
|
|
// 工厂id
|
|
// 工厂id
|
|
/* if (factoryIdPair.containsKey(stock.getWERKS())) {
|
|
/* if (factoryIdPair.containsKey(stock.getWERKS())) {
|
|
sapStock.setFactoryId(factoryIdPair.get(stock.getWERKS()));
|
|
sapStock.setFactoryId(factoryIdPair.get(stock.getWERKS()));
|
|
} */
|
|
} */
|
|
- sapStock.setFactoryCode(stock.getWERKS());
|
|
|
|
|
|
+ /** sapStock.setFactoryCode(stock.getWERKS());
|
|
// 工厂名称
|
|
// 工厂名称
|
|
if (factoryNamePair.containsKey(stock.getWERKS())) {
|
|
if (factoryNamePair.containsKey(stock.getWERKS())) {
|
|
sapStock.setFactory(factoryNamePair.get(stock.getWERKS()));
|
|
sapStock.setFactory(factoryNamePair.get(stock.getWERKS()));
|
|
}
|
|
}
|
|
// 库存地点 code
|
|
// 库存地点 code
|
|
- sapStock.setStorageLocationCode(stock.getLGORT());
|
|
|
|
|
|
+ sapStock.setStorageLocationCode(stock.getLGORT()); **/
|
|
// 库存地点id
|
|
// 库存地点id
|
|
/* if (storageLocationIdPair.containsKey(uniqueKey)) {
|
|
/* if (storageLocationIdPair.containsKey(uniqueKey)) {
|
|
sapStock.setStorageLocationId(storageLocationIdPair.get(uniqueKey));
|
|
sapStock.setStorageLocationId(storageLocationIdPair.get(uniqueKey));
|
|
} */
|
|
} */
|
|
// 库存地点名称
|
|
// 库存地点名称
|
|
- if (stockLocationNamePair.containsKey(uniqueKey)) {
|
|
|
|
|
|
+ /** if (stockLocationNamePair.containsKey(uniqueKey)) {
|
|
sapStock.setProjectDepartment(stockLocationNamePair.get(uniqueKey));
|
|
sapStock.setProjectDepartment(stockLocationNamePair.get(uniqueKey));
|
|
}
|
|
}
|
|
// 物料编码 需要去掉前缀 00000000
|
|
// 物料编码 需要去掉前缀 00000000
|
|
@@ -726,10 +740,10 @@ public class IotSapServiceImpl implements IotSapService {
|
|
sapStock.setSyncTime(LocalDateTime.now());
|
|
sapStock.setSyncTime(LocalDateTime.now());
|
|
noFactoryTobeAddedStocks.add(sapStock);
|
|
noFactoryTobeAddedStocks.add(sapStock);
|
|
});
|
|
});
|
|
- }
|
|
|
|
|
|
+ } **/
|
|
|
|
|
|
// 使用返回的SAP库存数据更新已有的 库存数据
|
|
// 使用返回的SAP库存数据更新已有的 库存数据
|
|
- // pms中已有 SAP返回数据中也存在 则更新
|
|
|
|
|
|
+ // pms中已有 SAP返回数据中也存在 则更新 再次判断更新deptId 因为有可能又将SAP库存地点关联到了 组织部门
|
|
List<IotSapStockDO> actualUpdatedStocks = new ArrayList<>();
|
|
List<IotSapStockDO> actualUpdatedStocks = new ArrayList<>();
|
|
// key库存id-物料编码 value库存对象
|
|
// key库存id-物料编码 value库存对象
|
|
Map<String, IotSapStockVO> existStockPair = createExistStockMap(sapStocks, existStockKeys, storageLocationIdPair);
|
|
Map<String, IotSapStockVO> existStockPair = createExistStockMap(sapStocks, existStockKeys, storageLocationIdPair);
|
|
@@ -737,7 +751,12 @@ public class IotSapServiceImpl implements IotSapService {
|
|
Map<String, IotSapStockDO> finalTobeUpdatedStockPair = tobeUpdatedStockPair;
|
|
Map<String, IotSapStockDO> finalTobeUpdatedStockPair = tobeUpdatedStockPair;
|
|
existStockPair.forEach((k, v) -> {
|
|
existStockPair.forEach((k, v) -> {
|
|
if (finalTobeUpdatedStockPair.containsKey(k)) {
|
|
if (finalTobeUpdatedStockPair.containsKey(k)) {
|
|
|
|
+ // 再次查询当前 工厂-库存地点-物料编码 是否已经关联了组织部门
|
|
IotSapStockDO sapStock = finalTobeUpdatedStockPair.get(k);
|
|
IotSapStockDO sapStock = finalTobeUpdatedStockPair.get(k);
|
|
|
|
+ String uniqueKey = StrUtil.join("-", sapStock.getFactoryCode(), sapStock.getStorageLocationCode());
|
|
|
|
+ if (locationCodeDeptIdPair.containsKey(uniqueKey)) {
|
|
|
|
+ sapStock.setDeptId(locationCodeDeptIdPair.get(uniqueKey));
|
|
|
|
+ }
|
|
sapStock.setUnitPrice(v.getJIAGE()); // 更新库存价格
|
|
sapStock.setUnitPrice(v.getJIAGE()); // 更新库存价格
|
|
sapStock.setQuantity(v.getLABST()); // 更新库存数量
|
|
sapStock.setQuantity(v.getLABST()); // 更新库存数量
|
|
sapStock.setUnit(v.getMEINS()); // 更新基本单位
|
|
sapStock.setUnit(v.getMEINS()); // 更新基本单位
|
|
@@ -747,9 +766,30 @@ public class IotSapServiceImpl implements IotSapService {
|
|
}
|
|
}
|
|
System.out.println(factoryCode + "需要更新的SAP库存数量:" + actualUpdatedStocks.size());
|
|
System.out.println(factoryCode + "需要更新的SAP库存数量:" + actualUpdatedStocks.size());
|
|
|
|
|
|
|
|
+ // 每次请求都 保存 SAP接口返回的原始库存数据
|
|
|
|
+ List<IotSapStockLogDO> tobeAddedSapStockLogs = new ArrayList<>();
|
|
|
|
+ if (CollUtil.isNotEmpty(sapStocks)) {
|
|
|
|
+ sapStocks.forEach(stock -> {
|
|
|
|
+ IotSapStockLogDO sapStockLog = new IotSapStockLogDO();
|
|
|
|
+ sapStockLog.setFactoryCode(stock.getWERKS());
|
|
|
|
+ sapStockLog.setStorageLocationCode(stock.getLGORT());
|
|
|
|
+ sapStockLog.setMaterialCode(stock.getMATNR().replaceFirst("^0+", ""));
|
|
|
|
+ sapStockLog.setMaterialName(stock.getMAKTX());
|
|
|
|
+ // 库存数量
|
|
|
|
+ sapStockLog.setQuantity(stock.getLABST());
|
|
|
|
+ // 单价
|
|
|
|
+ sapStockLog.setUnitPrice(stock.getJIAGE());
|
|
|
|
+ // 基本单位
|
|
|
|
+ sapStockLog.setUnit(stock.getMEINS());
|
|
|
|
+ // 同步时间
|
|
|
|
+ sapStockLog.setSyncTime(LocalDateTime.now());
|
|
|
|
+ tobeAddedSapStockLogs.add(sapStockLog);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
// todo sap 工厂 库存地点 未关联组织部门
|
|
// todo sap 工厂 库存地点 未关联组织部门
|
|
// 使用返回的SAP库存数据更新已有的 库存数据 pms中已有 SAP返回数据中也存在 则更新
|
|
// 使用返回的SAP库存数据更新已有的 库存数据 pms中已有 SAP返回数据中也存在 则更新
|
|
- List<IotSapStockDO> noFactoryActualUpdatedStocks = new ArrayList<>();
|
|
|
|
|
|
+ /* List<IotSapStockDO> noFactoryActualUpdatedStocks = new ArrayList<>();
|
|
// key工厂code-库存地点code-物料编码 value库存对象
|
|
// key工厂code-库存地点code-物料编码 value库存对象
|
|
Map<String, IotSapStockVO> noFactoryExistStockPair = createNoFactoryExistStockMap(sapStocks, noFactoryExistStockKeys, storageLocationIdPair);
|
|
Map<String, IotSapStockVO> noFactoryExistStockPair = createNoFactoryExistStockMap(sapStocks, noFactoryExistStockKeys, storageLocationIdPair);
|
|
if (CollUtil.isNotEmpty(noFactoryExistStockPair)) {
|
|
if (CollUtil.isNotEmpty(noFactoryExistStockPair)) {
|
|
@@ -764,7 +804,7 @@ public class IotSapServiceImpl implements IotSapService {
|
|
}
|
|
}
|
|
});
|
|
});
|
|
}
|
|
}
|
|
- System.out.println(factoryCode + "SAP工厂库存地点未关联组织部门-需要更新的SAP库存数量:" + noFactoryActualUpdatedStocks.size());
|
|
|
|
|
|
+ System.out.println(factoryCode + "SAP工厂库存地点未关联组织部门-需要更新的SAP库存数量:" + noFactoryActualUpdatedStocks.size()); */
|
|
|
|
|
|
// pms中已有 但是 SAP返回数据不存在 如果设置了安全库存,则库存为0,若没有设置安全库存,则可以删除
|
|
// pms中已有 但是 SAP返回数据不存在 如果设置了安全库存,则库存为0,若没有设置安全库存,则可以删除
|
|
|
|
|
|
@@ -807,22 +847,28 @@ public class IotSapServiceImpl implements IotSapService {
|
|
tobeSapStocks.add(sapStock);
|
|
tobeSapStocks.add(sapStock);
|
|
}
|
|
}
|
|
}); */
|
|
}); */
|
|
|
|
+ // 保存SAP库存原始数据 先删除 再新增
|
|
|
|
+ QueryWrapper<IotSapStockLogDO> queryWrapper = new QueryWrapper<>();
|
|
|
|
+ TenantUtils.execute(1L, () -> iotSapStockLogMapper.delete(queryWrapper));
|
|
|
|
+ if (CollUtil.isNotEmpty(tobeAddedSapStockLogs)) {
|
|
|
|
+ TenantUtils.execute(1L, () -> iotSapStockLogMapper.insertBatch(tobeAddedSapStockLogs));
|
|
|
|
+ }
|
|
// 本地库存 初始化 批量插入SAP 库存 工厂 库存地点 已经关联了组织架构部门
|
|
// 本地库存 初始化 批量插入SAP 库存 工厂 库存地点 已经关联了组织架构部门
|
|
if (CollUtil.isNotEmpty(tobeAddedStocks)) {
|
|
if (CollUtil.isNotEmpty(tobeAddedStocks)) {
|
|
TenantUtils.execute(1L, () -> iotSapStockMapper.insertBatch(tobeAddedStocks));
|
|
TenantUtils.execute(1L, () -> iotSapStockMapper.insertBatch(tobeAddedStocks));
|
|
}
|
|
}
|
|
// 本地库存 初始化 批量插入本地库存 记录 工厂 库存地点 未关联了组织架构部门
|
|
// 本地库存 初始化 批量插入本地库存 记录 工厂 库存地点 未关联了组织架构部门
|
|
- if (CollUtil.isNotEmpty(noFactoryTobeAddedStocks)) {
|
|
|
|
|
|
+ /* if (CollUtil.isNotEmpty(noFactoryTobeAddedStocks)) {
|
|
TenantUtils.execute(1L, () -> iotSapStockMapper.insertBatch(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接口也返回的库存数据:更新 工厂 库存地点 未关联了组织架构部门
|
|
// pms中存在而且SAP接口也返回的库存数据:更新 工厂 库存地点 未关联了组织架构部门
|
|
- if (CollUtil.isNotEmpty(noFactoryActualUpdatedStocks)) {
|
|
|
|
|
|
+ /* if (CollUtil.isNotEmpty(noFactoryActualUpdatedStocks)) {
|
|
TenantUtils.execute(1L, () -> iotSapStockMapper.updateBatch(noFactoryActualUpdatedStocks));
|
|
TenantUtils.execute(1L, () -> iotSapStockMapper.updateBatch(noFactoryActualUpdatedStocks));
|
|
- }
|
|
|
|
|
|
+ } */
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -879,7 +925,8 @@ public class IotSapServiceImpl implements IotSapService {
|
|
* @param storageLocationIdPair key库存地点code value库存地点id
|
|
* @param storageLocationIdPair key库存地点code value库存地点id
|
|
* @return 物料编码到描述的映射
|
|
* @return 物料编码到描述的映射
|
|
*/
|
|
*/
|
|
- private Map<String, IotSapStockVO> createExistStockMap(List<IotSapStockVO> sapStocks, Set<String> existStockKeys, Map<String, Long> storageLocationIdPair) {
|
|
|
|
|
|
+ private Map<String, IotSapStockVO> createExistStockMap(List<IotSapStockVO> sapStocks, Set<String> existStockKeys,
|
|
|
|
+ Map<String, Long> storageLocationIdPair) {
|
|
return sapStocks.stream()
|
|
return sapStocks.stream()
|
|
.filter(sapStock -> StrUtil.isNotBlank(sapStock.getMATNR()) &&
|
|
.filter(sapStock -> StrUtil.isNotBlank(sapStock.getMATNR()) &&
|
|
StrUtil.isNotBlank(sapStock.getLGORT()) &&
|
|
StrUtil.isNotBlank(sapStock.getLGORT()) &&
|
|
@@ -888,8 +935,9 @@ public class IotSapServiceImpl implements IotSapService {
|
|
// 处理前导零:移除MATNR前的 00000000
|
|
// 处理前导零:移除MATNR前的 00000000
|
|
String processedCode = sapStock.getMATNR().replaceFirst("^0+", "");
|
|
String processedCode = sapStock.getMATNR().replaceFirst("^0+", "");
|
|
// 本地已经配置过库存地点 包含SAP库存接口返回的库存地点
|
|
// 本地已经配置过库存地点 包含SAP库存接口返回的库存地点
|
|
- Long storageLocationId = storageLocationIdPair.get(StrUtil.join("-", sapStock.getWERKS(), sapStock.getLGORT()));
|
|
|
|
- return new AbstractMap.SimpleEntry<>(StrUtil.join("-", storageLocationId, processedCode), sapStock);
|
|
|
|
|
|
+ // Long storageLocationId = storageLocationIdPair.get(StrUtil.join("-", sapStock.getWERKS(), sapStock.getLGORT()));
|
|
|
|
+ String uniqueKey = StrUtil.join("-", sapStock.getWERKS(), sapStock.getLGORT());
|
|
|
|
+ return new AbstractMap.SimpleEntry<>(StrUtil.join("-", uniqueKey, processedCode), sapStock);
|
|
})
|
|
})
|
|
.filter(entry -> existStockKeys.contains(entry.getKey()))
|
|
.filter(entry -> existStockKeys.contains(entry.getKey()))
|
|
.collect(Collectors.toMap(
|
|
.collect(Collectors.toMap(
|