wms和EBS库存数量对比,根据物料ID或者物料ID和批次分组统计

This commit is contained in:
15066119699 2025-03-02 16:13:00 +08:00
parent 347fbaeb6f
commit 9fb55091a8
2 changed files with 231 additions and 48 deletions

View File

@ -93,41 +93,65 @@ public class EbsConfirmController extends BaseController {
@PostMapping("/ebsConfirm/main")
@ResponseBody
public TableDataInfo ebsConfirmMain(EbsStock ebsStock) throws Exception {
logger.info("查询EBS现有量并对比本地开始===》》》》》》》》");
TMiStock stockForQuery = new TMiStock();
stockForQuery.setGoodsId(ebsStock.getGoodsId());
stockForQuery.setWhseloc(ebsStock.getSubInventory());
// 库存信息
List<TMiStock> stockList = tMiStockService.selectTMiStockOutList(stockForQuery);
logger.info("根据请求参数查询到的库存条数: {}", stockList.size());
// EBS现有量查询结果
List<EbsStock> ebsStockList = new LinkedList<>();
if (stockList.size() < 1) {
return getDataTable(ebsStockList);
}
// if (stockList.size() < 1) {
// return getDataTable(ebsStockList);
// }
// 获取token
JSONObject token = JSON.parseObject(HttpUtils.httpPostJson(configService.selectConfigByKey("token_ip"), "", ""));
// 一起查询
String params = JSON.toJSONString(createJsonList(stockList, ebsStock.getSubInventory(), EbsUtils.LOCATOR_AREA_MAP.get(ebsStock.getSubInventory())));
List<TMiStock> queryList = new ArrayList<>();
queryList.add(stockForQuery);
String params = JSON.toJSONString(createJsonList(queryList, ebsStock.getSubInventory(), EbsUtils.LOCATOR_AREA_MAP.get(ebsStock.getSubInventory())));
String result = HttpUtils.httpPostJson(configService.selectConfigByKey("ebs_ip"), params, token.get("access_token").toString());
logger.info("现有量查询参数:{},结果:{}", params, result);
JSONObject resultJson = (JSONObject) JSON.parseObject(result).get("obj");
List<ExistingStock> datas = JSON.parseArray(resultJson.getString("rows"), ExistingStock.class);
// 生成现有量数据
logger.info("返回的条数:{}", datas.size());
// 首先处理EBS响应中的所有商品
Map<String, ExistingStock> ebsItemMap = new HashMap<>();
for (ExistingStock existingStock : datas) {
String itemCode = existingStock.getItemCode();
if (ebsItemMap.containsKey(itemCode)) {
// 对同一商品的数量进行累加
ExistingStock existing = ebsItemMap.get(itemCode);
existing.setTransactionQuantity(existing.getTransactionQuantity() + existingStock.getTransactionQuantity());
} else {
ebsItemMap.put(itemCode, existingStock);
}
}
// 处理本地库存列表中的商品
Set<String> processedItems = new HashSet<>();
for (TMiStock stock : stockList) {
// 插入的EBS现有量数据
EbsStock temp = new EbsStock();
// 查询结果返回的总量
int sum = 0;
for (ExistingStock existingStock : datas) {
if (stock.getGoodsId().equals(existingStock.getItemCode())) {
sum += existingStock.getTransactionQuantity();
}
double sum = 0;
String goodsId = stock.getGoodsId();
processedItems.add(goodsId);
if (ebsItemMap.containsKey(goodsId)) {
sum = ebsItemMap.get(goodsId).getTransactionQuantity();
}
// 设定EBS现有量的数据
temp.setGoodsId(stock.getGoodsId());
temp.setGoodsId(goodsId);
temp.setGoodsName(stock.getGoodsName());
temp.setSubInventory(ebsStock.getSubInventory());
temp.setEbsNum(BigDecimal.valueOf(sum));
temp.setWmsNum(stock.getShelvesNum());
if (BigDecimal.valueOf(sum).compareTo(stock.getShelvesNum()) != 0) {
temp.setDiffNum(BigDecimal.valueOf(sum).subtract(stock.getShelvesNum()));
temp.setSts("0");
@ -138,6 +162,34 @@ public class EbsConfirmController extends BaseController {
ebsStockList.add(temp);
}
// 生成现有量数据
// for (TMiStock stock : stockList) {
// // 插入的EBS现有量数据
// EbsStock temp = new EbsStock();
// // 查询结果返回的总量
// int sum = 0;
// for (ExistingStock existingStock : datas) {
// if (stock.getGoodsId().equals(existingStock.getItemCode())) {
// sum += existingStock.getTransactionQuantity();
// }
// }
// // 设定EBS现有量的数据
// temp.setGoodsId(stock.getGoodsId());
// temp.setGoodsName(stock.getGoodsName());
// temp.setSubInventory(ebsStock.getSubInventory());
// temp.setEbsNum(BigDecimal.valueOf(sum));
// temp.setWmsNum(stock.getShelvesNum());
// if (BigDecimal.valueOf(sum).compareTo(stock.getShelvesNum()) != 0) {
// temp.setDiffNum(BigDecimal.valueOf(sum).subtract(stock.getShelvesNum()));
// temp.setSts("0");
// } else {
// temp.setDiffNum(BigDecimal.valueOf(sum).subtract(stock.getShelvesNum()));
// temp.setSts("1");
// }
// ebsStockList.add(temp);
// }
// 更新逻辑
// 1. 传参变化只传子库
// String params = JSON.toJSONString(createJsonGetAll(ebsStock.getSubInventory()));
@ -226,57 +278,96 @@ public class EbsConfirmController extends BaseController {
@PostMapping("/ebsConfirmLot/main")
@ResponseBody
public TableDataInfo ebsConfirmLotMain(EbsStock ebsStock) throws Exception {
logger.info("查询EBS现有量并对比本地开始===》》》》》》》》");
TMiStock stockForQuery = new TMiStock();
stockForQuery.setGoodsId(ebsStock.getGoodsId());
stockForQuery.setProduclotid(ebsStock.getLotNumber());
stockForQuery.setWhseloc(ebsStock.getSubInventory());
// 库存信息
List<TMiStock> stockList = tMiStockService.selectTMiStockOutListByLot(stockForQuery);
// EBS现有量查询结果
List<EbsStock> ebsStockList = new LinkedList<>();
if (stockList.size() < 1) {
return getDataTable(ebsStockList);
}
logger.info("根据请求参数查询到的库存条数: {}", stockList.size());
// if (stockList.size() < 1) {
// return getDataTable(ebsStockList);
// }
// 获取token
JSONObject token = JSON.parseObject(HttpUtils.httpPostJson(configService.selectConfigByKey("token_ip"), "", ""));
// TODO 分批查询
List<ExistingStock> datas = new ArrayList<>();
int batchNum = stockList.size()/200;
for (int i=0; i<=batchNum; i++) {
List<TMiStock> tempStockList;
if (i == batchNum) {
tempStockList = stockList.subList(i*200, stockList.size());
} else {
tempStockList = stockList.subList(i*200, (i+1)*200);
}
// int batchNum = stockList.size()/200;
// for (int i=0; i<=batchNum; i++) {
// List<TMiStock> tempStockList;
// if (i == batchNum) {
// tempStockList = stockList.subList(i*200, stockList.size());
// } else {
// tempStockList = stockList.subList(i*200, (i+1)*200);
// }
// 一起查询
String params = JSON.toJSONString(createJsonList(tempStockList, ebsStock.getSubInventory(), EbsUtils.LOCATOR_AREA_MAP.get(ebsStock.getSubInventory())));
List<TMiStock> queryList = new ArrayList<>();
queryList.add(stockForQuery);
String params = JSON.toJSONString(createJsonList(queryList, ebsStock.getSubInventory(), EbsUtils.LOCATOR_AREA_MAP.get(ebsStock.getSubInventory())));
String result = HttpUtils.httpPostJson(configService.selectConfigByKey("ebs_ip"), params, token.get("access_token").toString());
logger.info("现有量(按批次)查询参数:{},结果:{}", params, result);
JSONObject resultJson = (JSONObject) JSON.parseObject(result).get("obj");
// 添加数据
datas.addAll(JSON.parseArray(resultJson.getString("rows"), ExistingStock.class));
// datas.addAll(JSON.parseArray(resultJson.getString("rows"), ExistingStock.class));
datas = JSON.parseArray(resultJson.getString("rows"), ExistingStock.class);
logger.info("返回的条数:{}", datas.size());
// }
// 创建一个Map来存储EBS系统中的商品和批次信息
Map<String, Map<String, Double>> ebsItemLotMap = new HashMap<>();
for (ExistingStock existingStock : datas) {
String itemCode = existingStock.getItemCode();
String lotNumber = existingStock.getLotNumber();
String key = itemCode + "_" + lotNumber;
if (ebsItemLotMap.containsKey(itemCode)) {
Map<String, Double> lotMap = ebsItemLotMap.get(itemCode);
if (lotMap.containsKey(lotNumber)) {
// 对同一商品同一批次的数量进行累加
lotMap.put(lotNumber, lotMap.get(lotNumber) + existingStock.getTransactionQuantity());
} else {
lotMap.put(lotNumber, existingStock.getTransactionQuantity());
}
} else {
Map<String, Double> lotMap = new HashMap<>();
lotMap.put(lotNumber, existingStock.getTransactionQuantity());
ebsItemLotMap.put(itemCode, lotMap);
}
}
// 生成现有量数据
// 统计返回结果
List<EbsStock> ebsStockList = new LinkedList<>();
// 用于跟踪已处理的商品和批次组合
Set<String> processedItemLots = new HashSet<>();
// 处理本地库存列表中的商品
for (TMiStock stock : stockList) {
// 插入的EBS现有量数据
EbsStock temp = new EbsStock();
// 查询结果返回的总量
int sum = 0;
for (ExistingStock existingStock : datas) {
if (stock.getGoodsId().equals(existingStock.getItemCode()) && stock.getProduclotid().equals(existingStock.getLotNumber())) {
sum += existingStock.getTransactionQuantity();
}
double sum = 0;
String goodsId = stock.getGoodsId();
String lotNumber = stock.getProduclotid();
String key = goodsId + "_" + lotNumber;
processedItemLots.add(key);
if (ebsItemLotMap.containsKey(goodsId) && ebsItemLotMap.get(goodsId).containsKey(lotNumber)) {
sum = ebsItemLotMap.get(goodsId).get(lotNumber);
}
// 设定EBS现有量的数据
temp.setGoodsId(stock.getGoodsId());
temp.setGoodsId(goodsId);
temp.setGoodsName(stock.getGoodsName());
temp.setLotNumber(stock.getProduclotid());
temp.setLotNumber(lotNumber);
temp.setSubInventory(ebsStock.getSubInventory());
temp.setEbsNum(BigDecimal.valueOf(sum));
temp.setWmsNum(stock.getShelvesNum());
if (BigDecimal.valueOf(sum).compareTo(stock.getShelvesNum()) != 0) {
temp.setDiffNum(BigDecimal.valueOf(sum).subtract(stock.getShelvesNum()));
temp.setSts("0");
@ -287,6 +378,88 @@ public class EbsConfirmController extends BaseController {
ebsStockList.add(temp);
}
// 处理仅存在于EBS系统但不在本地系统中的商品和批次
for (Map.Entry<String, Map<String, Double>> itemEntry : ebsItemLotMap.entrySet()) {
String goodsId = itemEntry.getKey();
Map<String, Double> lotMap = itemEntry.getValue();
for (Map.Entry<String, Double> lotEntry : lotMap.entrySet()) {
String lotNumber = lotEntry.getKey();
String key = goodsId + "_" + lotNumber;
if (!processedItemLots.contains(key)) {
EbsStock temp = new EbsStock();
temp.setGoodsId(goodsId);
// 需要从某处获取商品名称 - 可能需要查询商品信息
temp.setGoodsName(getGoodsNameById(goodsId)); // 您需要实现这个方法
temp.setLotNumber(lotNumber);
temp.setSubInventory(ebsStock.getSubInventory());
temp.setEbsNum(BigDecimal.valueOf(lotEntry.getValue()));
temp.setWmsNum(BigDecimal.ZERO); // 本地数量为0
temp.setDiffNum(temp.getEbsNum()); // 差异就是EBS数量
temp.setSts("0"); // 状态为不同
ebsStockList.add(temp);
}
}
}
// TODO 分批查询
// List<ExistingStock> datas = new ArrayList<>();
// int batchNum = stockList.size()/200;
// for (int i=0; i<=batchNum; i++) {
// List<TMiStock> tempStockList;
// if (i == batchNum) {
// tempStockList = stockList.subList(i*200, stockList.size());
// } else {
// tempStockList = stockList.subList(i*200, (i+1)*200);
// }
// // 一起查询
// String params = JSON.toJSONString(createJsonList(tempStockList, ebsStock.getSubInventory(), EbsUtils.LOCATOR_AREA_MAP.get(ebsStock.getSubInventory())));
// String result = HttpUtils.httpPostJson(configService.selectConfigByKey("ebs_ip"), params, token.get("access_token").toString());
// logger.info("现有量(按批次)查询参数:{},结果:{}", params, result);
// JSONObject resultJson = (JSONObject) JSON.parseObject(result).get("obj");
// // 添加数据
// datas.addAll(JSON.parseArray(resultJson.getString("rows"), ExistingStock.class));
// }
//
// // 生成现有量数据
// for (TMiStock stock : stockList) {
// // 插入的EBS现有量数据
// EbsStock temp = new EbsStock();
// // 查询结果返回的总量
// int sum = 0;
// for (ExistingStock existingStock : datas) {
// if (stock.getGoodsId().equals(existingStock.getItemCode()) && stock.getProduclotid().equals(existingStock.getLotNumber())) {
// sum += existingStock.getTransactionQuantity();
// }
// }
// // 设定EBS现有量的数据
// temp.setGoodsId(stock.getGoodsId());
// temp.setGoodsName(stock.getGoodsName());
// temp.setLotNumber(stock.getProduclotid());
// temp.setSubInventory(ebsStock.getSubInventory());
// temp.setEbsNum(BigDecimal.valueOf(sum));
// temp.setWmsNum(stock.getShelvesNum());
// if (BigDecimal.valueOf(sum).compareTo(stock.getShelvesNum()) != 0) {
// temp.setDiffNum(BigDecimal.valueOf(sum).subtract(stock.getShelvesNum()));
// temp.setSts("0");
// } else {
// temp.setDiffNum(BigDecimal.valueOf(sum).subtract(stock.getShelvesNum()));
// temp.setSts("1");
// }
// ebsStockList.add(temp);
// }
// 更新逻辑
// 1. 传参变化只传子库
// String params = JSON.toJSONString(createJsonGetAll(ebsStock.getSubInventory()));
@ -382,6 +555,12 @@ public class EbsConfirmController extends BaseController {
return rspData;
}
private String getGoodsNameById(String goodsId) {
TBaseGoods tBaseGoods = goodsService.selectTBaseGoodsByGoodsId(goodsId);
if(tBaseGoods == null) return null;
return tBaseGoods.getGoodsName();
}
/**
* 导出EBS现有量记录
*/
@ -480,12 +659,16 @@ public class EbsConfirmController extends BaseController {
String lotNumber = "";
for (int i = 0; i < stocks.size(); i++) {
if (i == 0) {
itemCode = stocks.get(i).getGoodsId();
if(StringUtils.isNotBlank(stocks.get(i).getGoodsId())){
itemCode = stocks.get(i).getGoodsId();
}
if (StringUtils.isNotEmpty(stocks.get(i).getProduclotid())) {
lotNumber = stocks.get(i).getProduclotid();
}
} else {
itemCode += "," + stocks.get(i).getGoodsId();
if(StringUtils.isNotBlank(stocks.get(i).getGoodsId())){
itemCode += "," + stocks.get(i).getGoodsId();
}
if (StringUtils.isNotEmpty(stocks.get(i).getProduclotid())) {
lotNumber += "," + stocks.get(i).getProduclotid();
}
@ -555,11 +738,11 @@ public class EbsConfirmController extends BaseController {
this.originationDate = originationDate;
}
public int getTransactionQuantity() {
public Double getTransactionQuantity() {
return transactionQuantity;
}
public void setTransactionQuantity(int transactionQuantity) {
public void setTransactionQuantity(Double transactionQuantity) {
this.transactionQuantity = transactionQuantity;
}
@ -585,7 +768,7 @@ public class EbsConfirmController extends BaseController {
private String subinventoryCode;
private String expirationDate;
private String originationDate;
private int transactionQuantity;
private Double transactionQuantity;
private int pnalQty;
private int organizationId;
}

View File

@ -3,7 +3,7 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.business.mapper.TMiStockMapper">
<resultMap type="TMiStock" id="TMiStockResult">
<result property="stockId" column="STOCK_ID" />
<result property="putinId" column="PUTIN_ID" />
@ -129,11 +129,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectTMiStockOutList" parameterType="TMiStock" resultMap="TMiStockResult">
select GOODS_ID, GOODS_NAME, SUM(SHELVES_NUM) as SHELVES_NUM, WHSELOC from t_mi_stock
<where>
GOODS_ID &lt;&gt; "000000000"
<if test="goodsId != null and goodsId != ''"> and GOODS_ID like concat('%', #{goodsId}, '%')</if>
<if test="produclotid != null and produclotid != ''"> and PRODUCLOTID like concat('%', #{produclotid}, '%')</if>
<if test="whseloc != null and whseloc != ''"> and WHSELOC = #{whseloc}</if>
<if test="sts != null and sts != ''"> and STS = #{sts}</if>
and GOODS_ID != "000000000"
</where>
group by GOODS_ID
</select>
@ -141,15 +141,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectTMiStockOutListByLot" parameterType="TMiStock" resultMap="TMiStockResult">
select GOODS_ID, PRODUCLOTID, GOODS_NAME, SUM(SHELVES_NUM) as SHELVES_NUM, WHSELOC from t_mi_stock
<where>
GOODS_ID &lt;&gt; "000000000"
<if test="goodsId != null and goodsId != ''"> and GOODS_ID like concat('%', #{goodsId}, '%')</if>
<if test="produclotid != null and produclotid != ''"> and PRODUCLOTID like concat('%', #{produclotid}, '%')</if>
<if test="whseloc != null and whseloc != ''"> and WHSELOC = #{whseloc}</if>
<if test="sts != null and sts != ''"> and STS = #{sts}</if>
and GOODS_ID != "000000000"
</where>
group by PRODUCLOTID
group by GOODS_ID, PRODUCLOTID
</select>
<select id="selectTMiStockByStockId" parameterType="TMiStock" resultMap="TMiStockResult">
<include refid="selectTMiStockVo"/>
where STOCK_ID = #{stockId}
@ -186,7 +186,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectTMiStockVo"/>
where EXPIRATION_DATE &lt; now() and GOODS_ID != "000000000" and (STS = "0" or STS = "2")
</select>
<insert id="insertTMiStock" parameterType="TMiStock">
insert into t_mi_stock
<trim prefix="(" suffix=")" suffixOverrides=",">
@ -359,10 +359,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</delete>
<delete id="deleteTMiStockByStockIds" parameterType="String">
delete from t_mi_stock where STOCK_ID in
delete from t_mi_stock where STOCK_ID in
<foreach item="stockId" collection="array" open="(" separator="," close=")">
#{stockId}
</foreach>
</delete>
</mapper>
</mapper>