Commit 2e1dfce2 zshaohui

1.半成品仓单据出库bug修复

2.接收批量手动tower预警
3.原材料退库上架时,先去获取信息
4.原材料人工出库,调用发料接口
5.单据领料查询就保存
1 个父辈 1b95f712
...@@ -1560,13 +1560,15 @@ public class LiteOrderCache { ...@@ -1560,13 +1560,15 @@ public class LiteOrderCache {
} }
int taskReelCount = 0; int taskReelCount = 0;
int taskNum = 0;
//转库可以出hold,置为空 //转库可以出hold,置为空
//List<String> holdPosIdList = getHoldPosIdList(cacheOrder); //List<String> holdPosIdList = getHoldPosIdList(cacheOrder);
List<String> holdPosIdList = new ArrayList<>(); List<String> holdPosIdList = new ArrayList<>();
for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) { for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) {
int taskNum = 0;
int remainNum = orderItem.getNeedNum() - orderItem.getTotalOutNum(); int remainNum = orderItem.getNeedNum() - orderItem.getTotalOutNum();
if (remainNum <= 0) { if (remainNum <= 0) {
continue; continue;
......
...@@ -310,11 +310,11 @@ public class LizhenController { ...@@ -310,11 +310,11 @@ public class LizhenController {
@ApiOperation("手动发料信息转发Tower") @ApiOperation("手动发料信息转发Tower")
@RequestMapping("/manualTower") @RequestMapping("/manualTower")
@AnonymousAccess @AnonymousAccess
public Map<String, String> manualTower(@RequestBody List<ManualTower> itemList) { public Map<String, String> manualTower(@RequestBody JSONObject jsonObject) {
//转发到3楼料仓服务器 //转发到3楼料仓服务器
log.info("收到WMS手动发料数据为:" + JSON.toJSONString(itemList)); log.info("收到WMS手动发料数据为:" + JSON.toJSONString(jsonObject));
try { try {
String result = HttpHelper.postJson(manualTowerUrl, itemList); String result = HttpHelper.postJson(manualTowerUrl, jsonObject);
log.info("WMS手动发料转发结果为:" + result); log.info("WMS手动发料转发结果为:" + result);
return JSON.parseObject(result, Map.class); return JSON.parseObject(result, Map.class);
} catch (ApiException e) { } catch (ApiException e) {
......
...@@ -4,27 +4,30 @@ import lombok.Data; ...@@ -4,27 +4,30 @@ import lombok.Data;
@Data @Data
public class ManualTower { public class ManualTower {
private String PLANT_CODE; // 厂区 private String ROW_ID; // 假设这是一个唯一标识符,可以使用String
private String PICKING_ID; // 挑料编码 private int ITEM_NO; // 项目号,使用int,如果可能超出int范围,则使用long
private String PLANT_CODE; // 工厂代码
private String MATERIAL_CODE; // 料号 private String MATERIAL_CODE; // 料号
private String LINE; // 线别 private String LINE; // 线别
private String MACHINE_NAME; // 机台名 private String MACHINE_NAME; // 机台名
private String MACHINE; // 原为MACHINE,但为避免与机台名冲突,改为机台类型 private String MACHINE; // 机台(可能与MACHINE_NAME重复,但保持原样)
private String FACE; // 面别 private String FACE; // 面别
private String SLOT; // 料站 private String SLOT; // 料站
private String SUBSLOT; // 左右料站 private String SUBSLOT; // 左右料站
private String MO; // 工单 private String MO; // 工单
private String BRAND; // 制造商 private String BRAND; // 制造商
private String BATCH_CODE; // 批次号 private String BATCH_CODE; // 批次号
private int LEFT_QTY; // 剩余数量,假设为浮点数,根据需要可改为Integer private int LEFT_QTY; // 剩余数量,使用int,根据需求调整
private int LEFT_PCBS; // 剩余板数 private int LEFT_PCBS; // 剩余板数
private int LEFT_TIMES; // 剩余时间,假设为浮点数,根据需要可改为其他类型 private int LEFT_TIMES; // 剩余时间,根据时间单位可能需要调整为long或特定时间类型
private int PRIORITY; // 优先级 private int PRIORITY; // 优先级
private int PRODUCT_BOARDS; // 主板数 private int PRODUCT_BOARDS; // 主板数
private int STATUS; // 状态 private int STATUS; // 状态,如果状态值很多且有具体含义,考虑使用枚举
private String RECIEVE_TYPE; // 接收类型 private String MACHINE_TYPE; // 机台类型
private String RECIEVE_TYPE; // 接收类型,注意拼写错误,应为RECEIVE_TYPE
private String PITCH; // 摊位 private String PITCH; // 摊位
private int TAP_LENGTH; // 料盘长度,假设为浮点数 private double TAP_LENGTH; // 料盘长度,假设需要较高的精度
private int REQ_REEL; // 需求卷数 private int REQ_REEL; // 需求卷数
private int REQ_QTY; // 需求数量 private int REQ_QTY; // 需求数量
private String MODEL; // 机种
} }
...@@ -1137,6 +1137,42 @@ public class LuxsanApi extends DefaultSmfApiListener { ...@@ -1137,6 +1137,42 @@ public class LuxsanApi extends DefaultSmfApiListener {
} }
public static Barcode fetchReel(Barcode barcode) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("reel_code", barcode.getBarcode());
log.info(barcode.getBarcode() + "fetchReel调用参数为:" + JSON.toJSONString(paramMap));
try {
String resultStr = HttpHelper.postJson(fetchReelUrl, paramMap);
log.info(barcode.getBarcode() + "fetchReel调用结果为:" + resultStr);
JSONObject resultObj = JSONObject.parseObject(resultStr);
String msgty = resultObj.getString("MSGTY");
if ("S".equals(msgty)){
JSONObject dataObj = resultObj.getJSONObject("DATA");
String labelId = dataObj.getString("label_id");
int reelQty = dataObj.getIntValue("reel_qty");
String warehouseCode = dataObj.getString("warehouse_code");
if (StringUtils.isNotBlank(warehouseCode)){
barcode.setWarehouseCode(warehouseCode);
}
if (StringUtils.isNotBlank(labelId)){
barcode.setLabelId(labelId);
}
if (reelQty != 0){
barcode.setAmount(reelQty);
}
return barcode;
}
} catch (Exception e) {
log.info(barcode.getBarcode()+"fetchReel调用失败:"+e.getMessage());
}
return null;
}
@Override @Override
public void outTaskStatusChange(String outNotifyUrl, DataLog task) { public void outTaskStatusChange(String outNotifyUrl, DataLog task) {
//pickingIssue(new PickingIssueRequest()); //pickingIssue(new PickingIssueRequest());
...@@ -1148,6 +1184,15 @@ public class LuxsanApi extends DefaultSmfApiListener { ...@@ -1148,6 +1184,15 @@ public class LuxsanApi extends DefaultSmfApiListener {
} }
private static String fetchReelUrl;
@Value("${api.fetchReel}")
public void setFetchReelUrl(String url) {
LuxsanApi.fetchReelUrl = url;
}
private static String batchCheckReelUrl; private static String batchCheckReelUrl;
@Value("${api.batchCheckReel}") @Value("${api.batchCheckReel}")
......
...@@ -562,76 +562,79 @@ public class CDeviceController { ...@@ -562,76 +562,79 @@ public class CDeviceController {
String orderItemId = barcode.getOrderItemId(); String orderItemId = barcode.getOrderItemId();
LiteOrderItem orderItem = null;
if (StringUtils.isNotEmpty(orderItemId)) {
orderItem = liteOrderItemManager.get(orderItemId);
}
String orderNo = "";
String orderId = ""; String orderId = "";
int checkType = -1; String orderNo = "";
String pkItemId = "";
String face = "";
String brand = "";
String batchCode = "";
if(orderItem != null){
orderNo = orderItem.getOrderNo();
orderId = orderItem.getOrderId();
pkItemId = orderItem.getItemId();
face = orderItem.getFace();
brand = orderItem.getBrand();
if (!"N/A".equals(orderItem.getBatchCode())){
batchCode = orderItem.getBatchCode();
}
LiteOrder order = liteOrderManager.get(orderItem.getOrderId());
if (order != null){
checkType = order.getCheckType();
}
}
if (StringUtils.isNotEmpty(orderItemId)) {
//通知WMS int checkType = -1;
if (checkType == LiteorderCheckType.PICKING_CHECKOUT){ String pkItemId = "";
try { String face = "";
LuxsanApi.pickingIssue(new PickingIssueRequest(CommonUtil.plantCode, orderNo, pkItemId, barcode.getPartNumber() String brand = "";
, barcode.getWarehouseCode(), brand, face, batchCode, Arrays.asList(barcode.getBarcode()))); String batchCode = "";
} catch (Exception e) { LiteOrderItem orderItem = liteOrderItemManager.get(orderItemId);
log.info(barcode.getBarcode() + "PK发料失败:" + e.getMessage() + ",隔口:" + barcode.getPosName() + "需要清空出库信息"); if(orderItem != null){
orderNo = orderItem.getOrderNo();
orderId = orderItem.getOrderId();
pkItemId = orderItem.getItemId();
face = orderItem.getFace();
brand = orderItem.getBrand();
if (!"N/A".equals(orderItem.getBatchCode())){
batchCode = orderItem.getBatchCode();
}
LiteOrder order = liteOrderManager.get(orderItem.getOrderId());
if (order != null){
checkType = order.getCheckType();
}
}
List<Barcode> newSubCodeList = new ArrayList<>(); //通知WMS
for (Barcode subCode : boxBarcode.getSubCodeList()) { if (checkType == LiteorderCheckType.PICKING_CHECKOUT){
if (subCode.isOut()){ try {
if (barcode.getPosName().equals(subCode.getPosName())){ LuxsanApi.pickingIssue(new PickingIssueRequest(CommonUtil.plantCode, orderNo, pkItemId, barcode.getPartNumber()
newSubCodeList.add(subCode); , barcode.getWarehouseCode(), brand, face, batchCode, Arrays.asList(barcode.getBarcode())));
} catch (Exception e) {
log.info(barcode.getBarcode() + "PK发料失败:" + e.getMessage() + ",隔口:" + barcode.getPosName() + "需要清空出库信息");
List<Barcode> newSubCodeList = new ArrayList<>();
for (Barcode subCode : boxBarcode.getSubCodeList()) {
if (subCode.isOut()){
if (barcode.getPosName().equals(subCode.getPosName())){
newSubCodeList.add(subCode);
}
} }
} }
}
for (Barcode subCode : newSubCodeList) { for (Barcode subCode : newSubCodeList) {
if (subCode.isOut()){ if (subCode.isOut()){
if (barcode.getPosName().equals(subCode.getPosName())){ if (barcode.getPosName().equals(subCode.getPosName())){
String itemId = subCode.getOrderItemId(); String itemId = subCode.getOrderItemId();
subCode.setOut(false); subCode.setOut(false);
subCode.setSelectMsg(null); subCode.setSelectMsg(null);
subCode.setOrderItemId(null); subCode.setOrderItemId(null);
barcodeManager.save(subCode); barcodeManager.save(subCode);
boxBarcode.updateSubCodes(subCode); boxBarcode.updateSubCodes(subCode);
//生成任务 //生成任务
generateTask(subCode,OP_STATUS.CANCEL.name(),subCode.getAmount(),OP.CHECKOUT,itemId,"",0,false); generateTask(subCode,OP_STATUS.CANCEL.name(),subCode.getAmount(),OP.CHECKOUT,itemId,"",0,false);
log.info(subCode.getBarcode()+"隔口为:"+subCode.getPosName()+"需清除出库标记"); log.info(subCode.getBarcode()+"隔口为:"+subCode.getPosName()+"需清除出库标记");
}
} }
} }
barcodeManager.save(boxBarcode);
if (inPos != null){
inPos.setBarcode(boxBarcode);
storagePosManager.save(inPos);
}
return ResultBean.newErrorResult(-1, "", barcode.getBarcode() + "请求PK发料失败,隔口:" + barcode.getPosName() + "出库信息已清空");
} }
barcodeManager.save(boxBarcode);
if (inPos != null){
inPos.setBarcode(boxBarcode);
storagePosManager.save(inPos);
}
return ResultBean.newErrorResult(-1, "", barcode.getBarcode() + "请求PK发料失败,隔口:" + barcode.getPosName() + "出库信息已清空");
} }
} }
else {
//人工出库,
LuxsanApi.pickingIssue(new PickingIssueRequest(CommonUtil.plantCode, "SMFW"+System.currentTimeMillis(), "0", barcode.getPartNumber()
, barcode.getWarehouseCode(), "", "", "", Arrays.asList(barcode.getBarcode())));
}
DataLog dataLog = new DataLog(new Storage(), barcode, new StoragePos()); DataLog dataLog = new DataLog(new Storage(), barcode, new StoragePos());
dataLog.setSubSourceId(orderItemId); dataLog.setSubSourceId(orderItemId);
......
...@@ -72,8 +72,15 @@ public class ReturnTowerController { ...@@ -72,8 +72,15 @@ public class ReturnTowerController {
} }
String warehouseCode = barcode.getWarehouseCode(); String warehouseCode = barcode.getWarehouseCode();
if (StringUtils.isEmpty(warehouseCode)) { if (StringUtils.isEmpty(warehouseCode)){
return ResultBean.newErrorResult(-1, "", "未找到"+barcode.getBarcode()+"的库别信息"); Barcode reelBarcode = LuxsanApi.fetchReel(barcode);
if (reelBarcode == null){
return ResultBean.newErrorResult(-1, "", "未找到"+barcode.getBarcode()+"的库别信息");
}
warehouseCode = reelBarcode.getWarehouseCode();
if (StringUtils.isEmpty(warehouseCode)) {
return ResultBean.newErrorResult(-1, "", "未找到"+barcode.getBarcode()+"的库别信息");
}
} }
//获取尺寸信息 //获取尺寸信息
......
...@@ -65,27 +65,24 @@ public class TicketController { ...@@ -65,27 +65,24 @@ public class TicketController {
List<FetchMoveTicketResult> ticketList = new ArrayList<>(); List<FetchMoveTicketResult> ticketList = new ArrayList<>();
LiteOrder order = liteOrderCache.getOrderSortItems(ticket); LiteOrder order = liteOrderCache.getOrderSortItems(ticket);
if (order == null){ if (order == null) {
ticketList = LuxsanApi.fetchMoveTicket(new FetchMoveTicketRequest(CommonUtil.plantCode, ticket)); order = ticketToLiteOrder(ticket);
} else { }
for (LiteOrderItem orderItem : order.getOrderItems()) { for (LiteOrderItem orderItem : order.getOrderItems()) {
FetchMoveTicketResult result = new FetchMoveTicketResult(); FetchMoveTicketResult result = new FetchMoveTicketResult();
result.setTICKET_ITEM(orderItem.getTicketItem()); result.setTICKET_ITEM(orderItem.getTicketItem());
result.setMATERIAL_CODE(orderItem.getMaterialCode()); result.setMATERIAL_CODE(orderItem.getMaterialCode());
result.setSRC_PLANT(orderItem.getSrcPlant()); result.setSRC_PLANT(orderItem.getSrcPlant());
result.setDST_PLANT(orderItem.getDstPlant()); result.setDST_PLANT(orderItem.getDstPlant());
result.setSRC_WAREHOUSE(orderItem.getSrcWarehouse()); result.setSRC_WAREHOUSE(orderItem.getSrcWarehouse());
result.setDST_WAREHOUSE(orderItem.getDstWarehouse()); result.setDST_WAREHOUSE(orderItem.getDstWarehouse());
result.setSRC_BATCH(orderItem.getSrcBatch()); result.setSRC_BATCH(orderItem.getSrcBatch());
result.setDST_BATCH(orderItem.getDstBatch()); result.setDST_BATCH(orderItem.getDstBatch());
result.setQTY(orderItem.getQty()); result.setQTY(orderItem.getQty());
result.setMOVE_TYPE(orderItem.getMoveType()); result.setMOVE_TYPE(orderItem.getMoveType());
result.setBRAND(orderItem.getBrand()); result.setBRAND(orderItem.getBrand());
ticketList.add(result); ticketList.add(result);
}
} }
return ResultBean.newOkResult(FetchMoveTicketDto.convertFetchMoveTicketDto(ticketList)); return ResultBean.newOkResult(FetchMoveTicketDto.convertFetchMoveTicketDto(ticketList));
} }
...@@ -120,35 +117,7 @@ public class TicketController { ...@@ -120,35 +117,7 @@ public class TicketController {
} }
} else { } else {
liteOrder = new LiteOrder(); liteOrder = ticketToLiteOrder(ticket);
liteOrder.setOrderNo(ticket);
List<LiteOrderItem> itemList = new ArrayList<>();
List<FetchMoveTicketResult> ticketList = LuxsanApi.fetchMoveTicket(new FetchMoveTicketRequest(CommonUtil.plantCode, ticket));
for (FetchMoveTicketResult result : ticketList) {
LiteOrderItem item = new LiteOrderItem();
item.setNeedNum(result.getQTY());
item.setWarehouseCode(result.getSRC_WAREHOUSE());
item.setPn(result.getMATERIAL_CODE());
item.setTicketItem(result.getTICKET_ITEM());
item.setMaterialCode(result.getMATERIAL_CODE());
item.setSrcPlant(result.getSRC_PLANT());
item.setDstPlant(result.getDST_PLANT());
item.setSrcWarehouse(result.getSRC_WAREHOUSE());
item.setDstWarehouse(result.getDST_WAREHOUSE());
item.setSrcBatch(result.getSRC_BATCH());
item.setDstBatch(result.getDST_BATCH());
item.setQty(result.getQTY());
item.setMoveType(result.getMOVE_TYPE());
item.setBrand(result.getBRAND());
itemList.add(item);
}
liteOrder.setOrderItems(itemList);
liteOrder.setCheckType(LiteorderCheckType.TICKET_CHECKOUT);
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
} }
String result = ""; String result = "";
...@@ -358,4 +327,36 @@ public class TicketController { ...@@ -358,4 +327,36 @@ public class TicketController {
return ResultBean.newOkResult(""); return ResultBean.newOkResult("");
} }
private LiteOrder ticketToLiteOrder(String ticket) {
LiteOrder liteOrder = new LiteOrder();
liteOrder.setOrderNo(ticket);
List<LiteOrderItem> itemList = new ArrayList<>();
List<FetchMoveTicketResult> ticketList = LuxsanApi.fetchMoveTicket(new FetchMoveTicketRequest(CommonUtil.plantCode, ticket));
for (FetchMoveTicketResult result : ticketList) {
LiteOrderItem item = new LiteOrderItem();
item.setNeedNum(result.getQTY());
item.setWarehouseCode(result.getSRC_WAREHOUSE());
item.setPn(result.getMATERIAL_CODE());
item.setTicketItem(result.getTICKET_ITEM());
item.setMaterialCode(result.getMATERIAL_CODE());
item.setSrcPlant(result.getSRC_PLANT());
item.setDstPlant(result.getDST_PLANT());
item.setSrcWarehouse(result.getSRC_WAREHOUSE());
item.setDstWarehouse(result.getDST_WAREHOUSE());
item.setSrcBatch(result.getSRC_BATCH());
item.setDstBatch(result.getDST_BATCH());
item.setQty(result.getQTY());
item.setMoveType(result.getMOVE_TYPE());
item.setBrand(result.getBRAND());
itemList.add(item);
}
liteOrder.setOrderItems(itemList);
liteOrder.setCheckType(LiteorderCheckType.TICKET_CHECKOUT);
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
return liteOrder;
}
} }
...@@ -27,6 +27,8 @@ public class TicketUtil { ...@@ -27,6 +27,8 @@ public class TicketUtil {
item.setDstBatch(ticketResult.getDST_BATCH()); item.setDstBatch(ticketResult.getDST_BATCH());
item.setNeedNum(ticketResult.getQTY()); item.setNeedNum(ticketResult.getQTY());
item.setMoveType(ticketResult.getMOVE_TYPE()); item.setMoveType(ticketResult.getMOVE_TYPE());
item.setQty(ticketResult.getQTY());
item.setMaterialCode(ticketResult.getMATERIAL_CODE());
itemList.add(item); itemList.add(item);
} }
liteOrder.setOrderItems(itemList); liteOrder.setOrderItems(itemList);
......
...@@ -179,3 +179,5 @@ api: ...@@ -179,3 +179,5 @@ api:
#批量禁用料 #批量禁用料
batchCheckReel: http://10.68.27.68:8001/Npm/CheckReelBatch batchCheckReel: http://10.68.27.68:8001/Npm/CheckReelBatch
fetchReel: http://10.68.30.22:8082/api/mlb/FetchReel
...@@ -178,4 +178,6 @@ api: ...@@ -178,4 +178,6 @@ api:
manualPallet: http://10.42.220.171:8082/api/mlb/manualPallet manualPallet: http://10.42.220.171:8082/api/mlb/manualPallet
#批量禁用料 #批量禁用料
batchCheckReel: http://10.68.27.68:8001/Npm/CheckReelBatch
\ No newline at end of file \ No newline at end of file
batchCheckReel: http://10.68.27.68:8001/Npm/CheckReelBatch
fetchReel: http://10.42.220.171:8082/api/mlb/FetchReel
\ No newline at end of file \ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!