Commit fd84a2ee zshaohui

原材料仓 功能提交

1 个父辈 ea01bade
正在显示 114 个修改的文件 包含 7259 行增加264 行删除
......@@ -184,6 +184,30 @@ public class DataInitManager {
addNewFunctionMenu(10,poutOut, "safetyInventory", "安全库存", "safetyInventory", "system/safetyInventory/index", "safeInventory",functionMenuMap);
Menu raw = Menu.CreatePMenu("原材料仓", 2, "raw", 2, "", null);
//Gr入库
addNewFunctionMenu(2, raw, "grStorage", "Gr入库", "grStorage", "grStorage/index", "grStorage", functionMenuMap);
//Pk出库
addNewFunctionMenu(3, raw, "pkStorage", "Pk出库", "pkStorage", "pkStorage/index", "pkStorage", functionMenuMap);
//储位转移
addNewFunctionMenu(4, raw, "storageTransfer", "储位转移", "storageTransfer", "storageTransfer/index", "transfer", functionMenuMap);
//931单据领料
addNewFunctionMenu(5, raw, "docMaterialRe", "单据领料", "docMaterialRe", "receipt/docMaterialRe/index", "docMaterial", functionMenuMap);
//单据转库
addNewFunctionMenu(6, raw, "docTransferWarehous", "单据转库", "docTransferWarehous", "receipt/docTransferWarehous/index", "docTransfer", functionMenuMap);
//单据退料
addNewFunctionMenu(7, raw, "docReturn", "单据退料", "docReturn", "receipt/docReturn/index", "docRe", functionMenuMap);
//手动入库
addNewFunctionMenu(8, raw, "manualWarehous", "手动入库", "manualWarehous", "manualWarehous/index", "manualWa", functionMenuMap);
//MSD管理:MSD库存.MSD追溯性.MSD设置
Menu msd = Menu.CreatePMenu("MSD管理", 2, "msd", 2, "MSD",null);
addNewFunctionMenu(21, msd, "msdManage", "MSD库存", "msdManage", "neolight/msdManage/index", "MSDManager",functionMenuMap);
......
......@@ -901,6 +901,16 @@ public class BarcodeRule {
codeStr = "=7X8=CS0010-1";
rule = "RI[0:6:2]PN[-1:2:-1]";
codeStr = "B0700001-01";
rule = "RI[0:11:0]PN[0:3:8]";
//codeStr = "B0700001A";
//rule = "RI[0:8:1]PN[0:3:6]";
//codeStr = "=7x8=131S00650-017131|20240422-0831|20000|L130171311724000EK|TAIYO|";
//rule = "PN[-1:50:-1]PROVIDERNUMBER[-1:50:-1]|BATCH[-1:50:-1]DATECODE[-1:50:-1]|QTY|RI|SP|6";
BarcodeRule br = BarcodeRule.newRule(rule);
Barcode b = br.toCodeBean(codeStr).getBarcode();
if(b != null){
......
......@@ -190,6 +190,51 @@ public class Barcode extends BasePo implements Serializable {
* 工单详情id
*/
private String orderItemId;
//半成品仓,增加的参数
// 厂区
private String plantCode;
// 箱号
private String cartonId;
// 栈板号
private String palletId;
// 料号
private String pn;
// 机种
private String modelFamily;
// 物料类型
private String materialType;
// 库别
private String warehouseCode;
// 是否HOLD
private int hold;
// 数量
private int qty;
// 满箱数量
private int fullQty;
// 包装类型
private String packType;
// 生产日期
private String createAt;
//区域
private String region;
private String barSource;
/**
* 是否是锡膏
*/
......@@ -260,18 +305,8 @@ public class Barcode extends BasePo implements Serializable {
*/
private String grLabel;
private String keeperCode;
/**
* 库别
*/
private String warehouseCode = "W10B";
/**
* 是否根据查询出库
*/
......@@ -295,6 +330,10 @@ public class Barcode extends BasePo implements Serializable {
*/
private boolean isInventory = false;
//记录序列号
private int seq = 0;
/**
* 添加相关联条码
*
......
......@@ -272,7 +272,7 @@ public class LiteOrderCache {
*/
private synchronized void finishedOrderTask(DataLog task) throws ValidateException {
String barcode = task.getBarcode();
if (barcode.startsWith("CS") || barcode.startsWith("CM") || barcode.startsWith("CB")){
if (barcode.startsWith("C07") || barcode.startsWith("C13") || barcode.startsWith("C15")){
return;
}
if (OP.CHECKOUT == task.getType()) {
......@@ -787,100 +787,138 @@ public class LiteOrderCache {
return null;
}
public String checkOutLiteOrderOut(String orderNo, boolean outBom,List<String> orderItemIds) {
LiteOrder cacheOrder = liteOrderMap.get(orderNo);
if (cacheOrder == null) {
cacheOrder = liteOrderManager.findByOrderNo(orderNo);
public synchronized void pauseOrder(String orderNo) {
LiteOrder liteOrder = liteOrderMap.get(orderNo);
//缓存里没有
if (liteOrder == null) {
log.info("缓存里没有找到该工单,从数据库中查询:" + orderNo);
liteOrder = liteOrderManager.findByOrderNo(orderNo);
}
if (cacheOrder == null) {
return "smfcore.order.out.notFound";
//记录原来的工单状态
liteOrder.setLastStatus(liteOrder.getStatus());
//工单状态改为暂停
liteOrder.setStatus(LITEORDER_STATUS.PAUSE);
liteOrderManager.save(liteOrder);
liteOrderMap.put(orderNo, liteOrder);
}
if (cacheOrder.isClosed()) {
log.info("工单[" + orderNo + "]已关闭,无法出库");
return "smfcore.order.hasClose";
public synchronized void restoreOrder(String orderNo) {
LiteOrder liteOrder = liteOrderMap.get(orderNo);
//缓存里没有
if (liteOrder == null) {
log.info("缓存里没有找到该工单,从数据库中查询:" + orderNo);
liteOrder = liteOrderManager.findByOrderNo(orderNo);
}
if (!cacheOrder.isTaskFinished() && !cacheOrder.isNew()) {
log.info("工单[" + orderNo + "]正在执行");
return "smfcore.order.out.executing";
//工单状态改为暂停
liteOrder.setStatus(liteOrder.getLastStatus());
liteOrderManager.save(liteOrder);
liteOrderMap.put(orderNo, liteOrder);
}
ORDER_COLOR nextColor = getNextColor();
if (nextColor == null) {
log.info("执行工单[" + orderNo + "] outBom=" + outBom + "时,已达最大可执行工单数");
return "smfcore.order.out.maxOrder";
public synchronized String excessOrder(String orderNo,boolean excess) {
LiteOrder liteOrder = liteOrderMap.get(orderNo);
//缓存里没有
if (liteOrder == null) {
log.info("缓存里没有找到该工单,从数据库中查询:" + orderNo);
liteOrder = liteOrderManager.findByOrderNo(orderNo);
}
//判断是否已经超发过
if (liteOrder.isConfirmExcess()){
return "smfcore.order.excessSuccess";
}
liteOrder.setExcess(excess);
liteOrder.setConfirmExcess(true);
//判断是否已经确认过超发
if (!cacheOrder.isConfirmExcess()) {
return "smfcore.order.confirmExcess";
//再判断orderitem是否为空
List<LiteOrderItem> orderItems = liteOrder.getOrderItems();
if (orderItems != null && !orderItems.isEmpty()) {
for (LiteOrderItem orderItem : orderItems) {
orderItem.setExcess(excess);
liteOrderItemManager.save(orderItem);
}
}
liteOrder.setOrderItems(orderItems);
liteOrderManager.save(liteOrder);
liteOrderMap.put(orderNo, liteOrder);
return "";
}
//限制当前执行的工单只有一个
if (liteOrderMap != null) {
for (LiteOrder liteOrder : liteOrderMap.values()) {
public boolean hasExecutingOrder() {
Collection<LiteOrder> liteOrders = getAllLiteOrder();
if (liteOrders != null && !liteOrders.isEmpty()) {
for (LiteOrder liteOrder : liteOrders) {
if (liteOrder.isOutTails()) {
return "smfcore.order.executing";
return true;
}
}
}
return false;
}
//设置工单点击时间
cacheOrder.setStartDate(new Date());
liteOrderManager.save(cacheOrder);
liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder);
//料仓信息
List<String> availableStorageIds = new ArrayList<>();
//String virtualId = "";
for (Storage storage : dataCache.getAllStorage().values()) {
/*if (storage.isVirtual()) {
virtualId = storage.getId();
} else {*/
availableStorageIds.add(storage.getId());
//}
/**
* 获取所有liteOrder
* @return
*/
public synchronized Collection<LiteOrder> getAllLiteOrder() {
return liteOrderMap.values();
}
//出库方式
CHECKOUT_TYPE checkoutType = dataCache.getCheckOutType();
public synchronized String checkOutLiteOrderOut(String orderNo, boolean outBom, List<String> orderItemIds) {
log.info("开始执行工单[" + orderNo + "] outBom=" + outBom);
cacheOrder.setTaskReelCount(0);
cacheOrder.setTaskFinishedTime(-1);
cacheOrder.setFinishedReelCount(0);
cacheOrder.setStatus(LITEORDER_STATUS.TAILS);
//1.判断工单是否存在
LiteOrder liteOrder = liteOrderMap.get(orderNo);
if (liteOrder == null) {
liteOrder = liteOrderManager.findByOrderNo(orderNo);
}
if (liteOrder == null) {
return "smfcore.order.out.notFound";
}
//提取所有的partNumber,获取所有的库位
List<String> partNumberList = cacheOrder.getOrderItems().stream().map(item -> item.getPn()).collect(Collectors.toList());
//2.判断工单状态是否正常
if (liteOrder.isClosed()) {
return "smfcore.order.hasClose";
}
if (!liteOrder.isTaskFinished() && !liteOrder.isNew()) {
return "smfcore.order.out.executing";
}
//3.设置工单其他信息
liteOrder.setStartDate(new Date());
liteOrder.setTaskReelCount(0);
liteOrder.setTaskFinishedTime(-1);
liteOrder.setFinishedReelCount(0);
liteOrder.setStatus(LITEORDER_STATUS.TAILS);
liteOrderMap.put(liteOrder.getOrderNo(), liteOrder);
//4.获取partNumber所在的库位信息
List<String> partNumberList = liteOrder.getOrderItems().stream().map(item -> item.getPn()).collect(Collectors.toList());
List<StoragePos> allStoragePosList = storagePosManager.findStoragePosByPartNumber(partNumberList);
List<StoragePos> needOutPoss = new ArrayList<>();
//5.开始处理工单详情
List<StoragePos> needOutPosList = new ArrayList<>();
int orderTaskReelCount = 0;
//开始循环处理工单详情
for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) {
//排除的仓位信息
for (LiteOrderItem orderItem : liteOrder.getOrderItems()){
//6.排除的仓位信息
List<String> excludeIdList = new ArrayList<>();
Collection<String> excludePosIds = taskService.excludePosIds();
List<String> excludeIds = new ArrayList<>();
for (String excludePosId : excludePosIds) {
excludeIds.add(excludePosId);
excludeIdList.add(excludePosId);
}
//判断是否包含需要出库的
//7.判断是否指定的itemId
if (orderItemIds != null && !orderItemIds.isEmpty()) {
if (!orderItemIds.contains(orderItem.getId())) {
continue;
}
}
//8.设置出库数量和出库盘数(超发和不超发)
int outReelCount = 0;
int outNumCount = 0;
//如果是超发情况
if (cacheOrder.isExcess()) {
if (liteOrder.isExcess()) {
if (orderItem.getOutNum() >= orderItem.getNeedNum() && orderItem.getOutReelCount() >= orderItem.getNeedReelCount()) {
continue;
}
......@@ -896,42 +934,24 @@ public class LiteOrderCache {
outReelCount = orderItem.getTotalOutReelCount();
}
//9.开始挑料
while (outReelCount < orderItem.getNeedReelCount() || outNumCount < orderItem.getNeedNum()) {
//根据查询条件,查找新的库位
boolean hasOutReel = false;
String warehouseCode = orderItem.getWarehouseCode(); //厂别
String brand = orderItem.getBrand(); //供应商
String pn = orderItem.getPn(); //料号
log.info("查询库位时间开始");
/*StoragePos pos = storagePosManager.findPartNumberInStorages(Arrays.asList(virtualId),pn, excludeIds, checkoutType, warehouseCode, brand,false);
if (pos == null){
pos = storagePosManager.findPartNumberInStorages(availableStorageIds, pn, excludeIds, checkoutType, warehouseCode, brand,true);
}*/
/*StoragePos pos = storagePosManager.findPartNumberInStorages(availableStorageIds, pn, excludeIds, checkoutType, warehouseCode, brand,true);
if (pos == null){
pos = storagePosManager.findPartNumberInStorages(availableStorageIds, pn, excludeIds, checkoutType, warehouseCode, brand,false);
}*/
StoragePos pos = getStoragePosByPartNumberAndBrand(allStoragePosList,pn,excludeIds);
log.info("查询库位时间结束");
StoragePos pos = getStoragePosByPartNumberAndBrand(allStoragePosList,pn,excludeIdList);
if (pos == null) {
log.info(orderItem.getOrderId() + "厂商:" + warehouseCode + ",供应商:" + brand + ",料号:" + pn + "未找到存在库位,跳过");
break;
}
//String barcodeStr = pos.getBarcode().getBarcode();
Barcode barcode = pos.getBarcode();
List<Barcode> subCodeList = barcode.getSubCodeList();
//进行排序
subCodeList = subCodeList.stream().sorted(Comparator.comparing(Barcode::getCreateDate)).collect(Collectors.toList());
subCodeList = subCodeList.stream().sorted(Comparator.comparing(Barcode::getAmount)).collect(Collectors.toList());
//调用批量禁用料接口
List<String> batchCheckList = new ArrayList<>();
try {
batchCheckList = lizhenApi.batchCheck(subCodeList);
}catch (Exception e){
e.printStackTrace();
}
List<String> subCodeIds = new ArrayList<>();
for (Barcode subCode : subCodeList) {
if (outReelCount >= orderItem.getNeedReelCount() && outNumCount >= orderItem.getNeedNum()) {
......@@ -940,11 +960,6 @@ public class LiteOrderCache {
if (subCode.isOut()) {
continue;
}
if (batchCheckList != null && !batchCheckList.isEmpty()) {
if (batchCheckList.contains(subCode.getBarcode())) {
log.info("禁用料:" + subCode.getBarcode() + "跳过");
}
}
//判断厂别
if (StringUtils.isNotBlank(warehouseCode)) {
if (!warehouseCode.equals(subCode.getWarehouseCode())) {
......@@ -963,23 +978,16 @@ public class LiteOrderCache {
continue;
}
}
//校验是否为禁用料
/*try {
smfApi.canPutInAfterResolve(subCode);
} catch (ValidateException e) {
e.printStackTrace();
log.info(subCode.getBarcode() + "为禁用料,校验失败:" + e.getMessage());
continue;
}*/
subCode.setOut(true);
subCode.setOrderItemId(orderItem.getId());
barcode.UpdateSubCode(subCode);
subCodeIds.add(subCode.getId());
orderTaskReelCount++;
log.info(subCode.getBarcode() + "---" + orderTaskReelCount);
orderTaskReelCount ++;
hasOutReel = true;
//判断是否超发,如果超发,先判断是否满足数量.再判断是否满足卷数
if (cacheOrder.isExcess()) {
if (liteOrder.isExcess()) {
if (outNumCount >= orderItem.getNeedNum()) {
outReelCount++;
} else {
......@@ -992,7 +1000,6 @@ public class LiteOrderCache {
outNumCount = outNumCount + subCode.getAmount();
}
}
log.info("保存barcode时间开始--"+barcode.getBarcode());
if (subCodeIds != null && !subCodeIds.isEmpty()) {
Query query = new Query(Criteria.where("id").in(subCodeIds));
Update update = new Update().set("isOut", true).set("orderItemId", orderItem.getId());
......@@ -1000,140 +1007,56 @@ public class LiteOrderCache {
}
barcodeManager.save(barcode);
log.info("保存barcode时间结束");
excludeIds.add(pos.getId());
excludeIdList.add(pos.getId());
if (hasOutReel) {
needOutPoss.add(pos);
needOutPosList.add(pos);
pos.setBarcode(barcode);
log.info("库位保存开始");
storagePosManager.save(pos);
log.info("库位保存结束");
}
}
}
if (needOutPoss != null && !needOutPoss.isEmpty()) {
for (StoragePos pos : needOutPoss) {
if (needOutPosList != null && !needOutPosList.isEmpty()) {
log.info("开始生成料箱出库任务");
for (StoragePos pos : needOutPosList) {
Barcode barcode = pos.getBarcode();
Storage storage = dataCache.getStorageById(pos.getStorageId());
log.info(pos.getPosName()+"出库,料箱号为:"+barcode.getBarcode());
DataLog task = new DataLog(storage, barcode, pos);
task.setSourceId(cacheOrder.getId());
task.setSourceName(cacheOrder.getOrderNo());
task.setSourceId(liteOrder.getId());
task.setSourceName(liteOrder.getOrderNo());
task.setSubSourceId(barcode.getLockName());
task.setSubSourceInfo(barcode.getLockName());
task.setType(OP.CHECKOUT);
task.setCreator(SecurityUtils.getCurrentUsername());
task.setStatus(OP_STATUS.WAIT.name());
if (storage.isVirtual()){
task.setExtendType(ExtendType.VIRTUAL_CHECKOUT);
} else {
task.setExtendType(ExtendType.STORAGE_CHECKOUT);
}
try {
log.info("生成任务开始");
taskService.addTaskToExecute(task);
log.info("生成任务结束");
} catch (Exception e) {
e.getMessage();
}
}
}
//cacheOrder.setIsExcess(isExcess);
cacheOrder.setTaskReelCount(orderTaskReelCount);
cacheOrder.setTotalTaskReelCount(cacheOrder.getTotalTaskReelCount() + orderTaskReelCount);
cacheOrder.setEndDate(new Date());
liteOrder.setTaskReelCount(orderTaskReelCount);
liteOrder.setTotalTaskReelCount(liteOrder.getTotalTaskReelCount() + orderTaskReelCount);
liteOrder.setEndDate(new Date());
log.info("工单[" + orderNo + "]任务分配结束,任务数[" + orderTaskReelCount + "]");
smfApi.onOrderStatusChange(cacheOrder);
//有需要出库的
if (orderTaskReelCount <= 0) {
finishedOrderTasks(cacheOrder);
}
liteOrderManager.save(cacheOrder);
liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder);
if (orderTaskReelCount <= 0) {
//return "工单无可执行的任务";
return "smfcore.order.out.noTask";
}
return "";
}
public synchronized void pauseOrder(String orderNo) {
LiteOrder liteOrder = liteOrderMap.get(orderNo);
//缓存里没有
if (liteOrder == null) {
log.info("缓存里没有找到该工单,从数据库中查询:" + orderNo);
liteOrder = liteOrderManager.findByOrderNo(orderNo);
}
//记录原来的工单状态
liteOrder.setLastStatus(liteOrder.getStatus());
//工单状态改为暂停
liteOrder.setStatus(LITEORDER_STATUS.PAUSE);
liteOrderManager.save(liteOrder);
liteOrderMap.put(orderNo, liteOrder);
}
smfApi.onOrderStatusChange(liteOrder);
public synchronized void restoreOrder(String orderNo) {
LiteOrder liteOrder = liteOrderMap.get(orderNo);
//缓存里没有
if (liteOrder == null) {
log.info("缓存里没有找到该工单,从数据库中查询:" + orderNo);
liteOrder = liteOrderManager.findByOrderNo(orderNo);
if (orderTaskReelCount <= 0) {
finishedOrderTasks(liteOrder);
}
//工单状态改为暂停
liteOrder.setStatus(liteOrder.getLastStatus());
liteOrderManager.save(liteOrder);
liteOrderMap.put(orderNo, liteOrder);
}
public synchronized String excessOrder(String orderNo,boolean excess) {
LiteOrder liteOrder = liteOrderMap.get(orderNo);
//缓存里没有
if (liteOrder == null) {
log.info("缓存里没有找到该工单,从数据库中查询:" + orderNo);
liteOrder = liteOrderManager.findByOrderNo(orderNo);
}
//判断是否已经超发过
if (liteOrder.isConfirmExcess()){
return "smfcore.order.excessSuccess";
liteOrderMap.put(liteOrder.getOrderNo(), liteOrder);
if (orderTaskReelCount <= 0) {
return "smfcore.order.out.noTask";
}
liteOrder.setExcess(excess);
liteOrder.setConfirmExcess(true);
//再判断orderitem是否为空
List<LiteOrderItem> orderItems = liteOrder.getOrderItems();
if (orderItems != null && !orderItems.isEmpty()) {
for (LiteOrderItem orderItem : orderItems) {
orderItem.setExcess(excess);
liteOrderItemManager.save(orderItem);
}
}
liteOrder.setOrderItems(orderItems);
liteOrderManager.save(liteOrder);
liteOrderMap.put(orderNo, liteOrder);
return "";
}
public boolean hasExecutingOrder() {
Collection<LiteOrder> liteOrders = getAllLiteOrder();
if (liteOrders != null && !liteOrders.isEmpty()) {
for (LiteOrder liteOrder : liteOrders) {
if (liteOrder.isOutTails()) {
return true;
}
}
}
return false;
}
/**
* 获取所有liteOrder
* @return
*/
public synchronized Collection<LiteOrder> getAllLiteOrder() {
return liteOrderMap.values();
}
public StoragePos getStoragePosByPartNumberAndBrand(List<StoragePos> allStoragePosList, String partNumber, List<String> excludeIdList) {
StoragePos storagePos = null;
......@@ -1182,6 +1105,9 @@ public class LiteOrderCache {
return storagePos;
}
public LiteOrder getLiteOrder(String orderNo) {
return liteOrderMap.get(orderNo);
}
public List<LiteOrderItem> getLackItems(Collection<LiteOrder> liteOrders) {
List<LiteOrderItem> lackItems = new ArrayList<>();
......@@ -1224,4 +1150,60 @@ public class LiteOrderCache {
}
return lackItems;
}
public synchronized List<String> findNeedOutBox(String orderNo, List<String> boxList) {
//1.判断工单是否存在
LiteOrder cacheOrder = liteOrderMap.get(orderNo);
if (cacheOrder == null) {
cacheOrder = liteOrderManager.findByOrderNo(orderNo);
}
if (cacheOrder == null) {
throw new ValidateException("smfcore.order.out.notFound", "未找到工单");
}
//2.判断工单任务是否结束
if (!cacheOrder.isTaskFinished() && !cacheOrder.isNew()) {
throw new ValidateException("smfcore.order.out.executing", "工单正在执行");
}
//3.设置工单状态
cacheOrder.setTaskReelCount(0);
cacheOrder.setFinishedReelCount(0);
cacheOrder.setStatus(LITEORDER_STATUS.TAILS);
//查找用户所输入的料箱信息
List<StoragePos> storagePosList = new ArrayList<>();
if (boxList != null && !boxList.isEmpty()) {
storagePosList = storagePosManager.findByQuery(new Query(Criteria.where("barcode.barcode").in(boxList)));
}
//4.开始循环处理
for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) {
//5.判断剩余数量
int remainNum = orderItem.getTotalOutNum() - orderItem.getOutNum();
int assignReelNum = 0;
while (remainNum > 0) {
if (assignReelNum >= remainNum) {
break;
}
String pn = orderItem.getPn();
String warehouseCode = orderItem.getWarehouseCode();
//6.首先匹配用户输入的料箱信息
StoragePos pos = null;
if (storagePosList != null && !storagePosList.isEmpty()) {
for (StoragePos storagePos : storagePosList) {
Barcode barcode = storagePos.getBarcode();
if (!storagePos.isLocked()) {
if (barcode.getPartNumber().equals(pn) && barcode.getWarehouseCode().equals(warehouseCode)) {
}
}
}
}
}
}
return null;
}
}
......@@ -131,4 +131,79 @@ public class OrderItemDto {
@ApiModelProperty("楼层")
private String floor;
/**
* 行号
*/
private String itemId;
/**
* 挑料单号
*/
private String pickingId;
/**
* 料号
*/
private String materialCode;
/**
* 库别
*/
private String warehouse;
/**
* 需求数量
*/
private int reqQty;
/**
* 需求卷数
*/
private int reqReel;
/**
* 传承数量
*/
private int cpQty;
/**
* 传承卷数
*/
private int cpReel;
/**
* 已发数量
*/
private int issuedQty;
/**
* 已发卷数
*/
private int issuedReel;
/**
* 退回数量
*/
private int retQty;
/**
* 面别
*/
private String face;
/**
* 创建日期
*/
private String createAt;
/**
* 更新日期
*/
private String updateAt;
/**
* BIN_CODE
*/
private String binCode;
}
......@@ -164,6 +164,8 @@ public class LiteOrder extends BasePo implements Serializable {
private boolean transReelBox = false;
//目的地
private String loc = "";
//迈征额外参数
private String guid;
......@@ -176,6 +178,10 @@ public class LiteOrder extends BasePo implements Serializable {
private String startTime;
private String reelBoxId;
/**
* 出库类型
*/
private int checkType = -1;
public void setClosed(boolean value){
......
......@@ -151,10 +151,6 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
*/
private String line;
/**
* 厂别
*/
private String plantCode;
/**
* 机器名称
......@@ -240,6 +236,156 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
private List<String> positionList;
/**
* 厂区
*/
private String plantCode;
/**
* 行号
*/
private String itemId;
/**
* 挑料单号
*/
private String pickingId;
/**
* 料号
*/
private String materialCode;
/**
* 库别
*/
private String warehouse;
/**
* 需求数量
*/
private int reqQty;
/**
* 需求卷数
*/
private int reqReel;
/**
* 传承数量
*/
private int cpQty;
/**
* 传承卷数
*/
private int cpReel;
/**
* 已发数量
*/
private int issuedQty;
/**
* 已发卷数
*/
private int issuedReel;
/**
* 退回数量
*/
private int retQty;
/**
* 面别
*/
private String face;
/**
* 创建日期
*/
private String createAt;
/**
* 更新日期
*/
private String updateAt;
/**
* BIN_CODE
*/
private String binCode;
//半成品仓增加的参数
/**
* 行ID
*/
private String rtvId;
/**
* 出货单号
*/
private String ticketCode;
/**
* 单据行号
*/
private String ticketItem;
/**
* 物料类型
*/
private String materialType;
/**
* 供应商代码
*/
private String vendorCode;
/**
* 单据数量
*/
private int qty;
/**
* 单位
*/
private String unit;
/**
* 状态
*/
private String status;
/**
* 原数量
*/
private int originQty;
/**
* 制造商
*/
private int manufacture;
/**
* 报关模式
*/
private String importMode;
/**
* 进口编号
*/
private String importCode;
/**
* 收货工厂
*/
private String shipTo;
public void setOutReelList(String reel) {
if (outReelList == null){
......
......@@ -363,6 +363,8 @@ public class DataLog extends BasePo implements Serializable {
private int height = 0;
private boolean outFromPos = false;
/**
* 出口位置
*/
......
......@@ -115,8 +115,7 @@ public class TaskService {
DataLog task = new DataLog(storage, barcode, storagePos);
task.setType(OP.PUT_IN);
task.setStatus(OP_STATUS.EXECUTING.name());
task.setExtendType(ExtendType.AUTO_PUTIN); //自动入库
task.setStatus(OP_STATUS.WAIT.name());
if (barcode != null) {
task.setWarehouseCode(barcode.getWarehouseCode());
task.setDescribe(barcode.getDescribe());
......@@ -125,6 +124,7 @@ public class TaskService {
task.setProvider(barcode.getProvider());
task.setProviderNumber(barcode.getProviderNumber());
task.setKeeperCode(barcode.getKeeperCode());
//task.setNum(barcode.getAmount());
barcode.setPutInTime(System.currentTimeMillis());
barcode.updateSluggishTime(dataCache.getPNsluggishDay(barcode.getPartNumber()));
barcodeManager.saveBarcode(barcode);
......@@ -882,6 +882,7 @@ public class TaskService {
List<Storage> availbleStorageList = new ArrayList<>();
for (Storage storage : storageList) {
log.info("收到料盘尺寸为:"+barcode.getPlateSize()+"X"+ barcode.getHeight());
if (storage.canPutIn(barcode.getPlateSize(), barcode.getHeight())) {
availbleStorageList.add(storage);
}
......@@ -977,7 +978,7 @@ public class TaskService {
} else {
pos = storagePosManager.getByBarcodeId(barcodeSave.getId());
if (!barcodeSave.getBarcode().startsWith("CS") && !barcodeSave.getBarcode().startsWith("CB") && !barcodeSave.getBarcode().startsWith("CM")) {
if (!barcodeSave.getBarcode().startsWith("C07") && !barcodeSave.getBarcode().startsWith("C13") && !barcodeSave.getBarcode().startsWith("C15")) {
if (barcodeSave.getAmount() <= 0) {
throw new ValidateException("smfcore.error.barcode.wrongQty", "条码[{0}]对应的数量<=0为: {1}", new String[]{barcodeSave.getBarcode(), barcodeSave.getAmount() + ""});
}
......
......@@ -42,7 +42,7 @@ import java.util.concurrent.TimeUnit;
@Slf4j
@RestController
@RequestMapping("/api/Mes")
@RequestMapping("wcs")
public class LizhenController {
@Autowired
......@@ -234,7 +234,7 @@ public class LizhenController {
@ApiOperation("内仓:机台叫料")
@PostMapping("/mPickingList")
@PostMapping("/ReelWarningInfo")
@AnonymousAccess
public ResultBean mPickingList(@RequestBody List<Map<String, String>> params) {
if (params == null || params.isEmpty()) {
......
......@@ -58,7 +58,7 @@ public class KafkaService {
/**
* 设备状态发送
*/
@Scheduled(fixedRate = 1000 * 60 * 1)
//@Scheduled(fixedRate = 1000 * 60 * 1)
public void setMachineStatus() {
log.info("发送设备状态开始");
Collection<Storage> storages = dataCache.getAllStorage().values();
......@@ -158,7 +158,7 @@ public class KafkaService {
/**
* 心跳数据发送
*/
@Scheduled(fixedRate = 1000 * 60 * 5)
//@Scheduled(fixedRate = 1000 * 60 * 5)
public void setHeartbeat() {
log.info("发送心跳开始");
//根据machineId,找到设备状态,是否正常
......@@ -203,7 +203,7 @@ public class KafkaService {
/**
* 设备状态发送
*/
@Scheduled(fixedRate = 1000 * 60 * 1)
//@Scheduled(fixedRate = 1000 * 60 * 1)
public void setStorageExportStatus() {
log.info("发送出料口信息开始");
......@@ -272,7 +272,7 @@ public class KafkaService {
/**
* 发送出料口心跳
*/
@Scheduled(fixedRate = 1000 * 60 * 5)
//@Scheduled(fixedRate = 1000 * 60 * 5)
public void setStorageHeartbeat() {
log.info("发送出料口心跳开始");
EquipStatusBean statusBean = EquipStatusUtil.getStatusBean(KafkaConfig.LINE_CID);
......@@ -308,7 +308,7 @@ public class KafkaService {
/**
* MachineParameter发送
*/
@Scheduled(fixedRate = 1000 * 60 * 5)
//@Scheduled(fixedRate = 1000 * 60 * 5)
public void setMachineParameter() {
log.info("MachineParameter开始发送");
List<String> machineIdList = getMachineIdList();
......
......@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.common.utils.HttpHelper;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.custom.lizhen.third.maicheng.bean.StationStatus;
......@@ -37,6 +38,9 @@ public class MaiZhengApi {
*/
public List<StationStatus> StationStatus() {
try {
if (StringUtils.isEmpty(stationStatusApi)){
return null;
}
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("SessionID", "0");
paramMap.put("MesType", "Get");
......@@ -57,6 +61,11 @@ public class MaiZhengApi {
public String transReelBox(LiteOrder liteOrder) {
if (StringUtils.isEmpty(transReelBoxApi)){
return null;
}
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("GUID", liteOrder.getGuid());
paramMap.put("CacheIndex", liteOrder.getCacheIndex());
......@@ -101,6 +110,11 @@ public class MaiZhengApi {
public void prepareReelBox(String guid, String result) {
if (StringUtils.isEmpty(prepareReelBoxApi)){
return;
}
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("GUID", guid);
paramMap.put("Result", result);
......@@ -115,6 +129,9 @@ public class MaiZhengApi {
}
public void workIdCancelApi(String guid) {
if (StringUtils.isEmpty(workIdCancleApi)){
return;
}
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("GUID", guid);
log.info("仓储请求取消工单入参为:" + JSON.toJSONString(paramMap));
......
package com.neotel.smfcore.custom.luxsan.api;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.HttpHelper;
import com.neotel.smfcore.common.utils.JsonUtil;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.api.listener.DefaultSmfApiListener;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.custom.luxsan.api.bean.request.*;
import com.neotel.smfcore.custom.luxsan.api.bean.result.*;
import com.neotel.smfcore.custom.luxsan.api.bean.util.LuxsanApiResult;
import com.neotel.smfcore.custom.luxsan.api.enums.LuxsanApiEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@Service
public class LuxsanApi extends DefaultSmfApiListener {
@Autowired
private IStoragePosManager storagePosManager;
/**
* QueryBin:储位查询
*
* @param request
* @return
*/
public static List<QueryBinResult> queryBin(QueryBinRequest request) {
try {
log.info("queryBin接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(queryBinUrl, request);
log.info("queryBin接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
List<QueryBinResult> resultList = JSONObject.parseArray(apiResult.getDATA(), QueryBinResult.class);
if (resultList != null && !resultList.isEmpty()) {
return resultList;
}
} catch (ApiException e) {
log.error("queryBin请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{"未找到对应的储位信息"});
}
/**
* UpdateBin:更新储位
*
* @param request
* @return
*/
public static void updateBin(UpdateBinRequest request) {
try {
log.info("updateBin接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(updateBinUrl, request);
log.info("updateBin接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
} catch (ApiException e) {
log.error("queryBin请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
}
/**
* Gr查询
*
* @param request
* @return
*/
public static List<QueryGrResult> queryGr(QueryGrRequest request) {
try {
log.info("queryGr接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(queryGrUrl, request);
log.info("queryGr接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
List<QueryGrResult> resultList = JSONObject.parseArray(apiResult.getDATA(), QueryGrResult.class);
if (resultList != null && !resultList.isEmpty()) {
return resultList;
}
} catch (ApiException e) {
log.error("queryGr请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{"未找到对应的Gr信息"});
}
/**
* 检验DC有效期
*
* @param request
* @return
*/
public static int getInDate(GetInDateRequest request) {
try {
log.info("getInDate接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(getInDateUrl, request);
log.info("getInDate接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
//判断是否过期
String data = apiResult.getDATA();
int days = NumberUtil.parseInt(data);
if (days < 0) {
throw new ValidateException("smfcore.error.barcode.expired", "物料已过期,无法入库.");
}
return days;
} catch (ApiException e) {
log.error("getInDate请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
}
/**
* GR过账状态查询
*
* @param request
* @return
*/
public static List<QueryGrStatusResult> queryGrStatus(QueryGrStatusRequest request) {
try {
log.info("queryGrStatus接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(queryGrStatusUrl, request);
log.info("queryGrStatus接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
List<QueryGrStatusResult> resultList = JSONObject.parseArray(apiResult.getDATA(), QueryGrStatusResult.class);
if (resultList != null && !resultList.isEmpty()) {
return resultList;
}
} catch (Exception e) {
log.error("queryGrStatus请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{"未找到对应的GR过账状态信息"});
}
/**
* 按GR生成标签码并上架
*
* @param request
* @return
*/
public static NewLabelToCellResult newLabelToCell(NewLabelToCellRequest request) {
try {
log.info("newLabelToCell接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(newLabelToCellUrl, request);
log.info("newLabelToCell接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
return JSONObject.parseObject(apiResult.getDATA(), NewLabelToCellResult.class);
} catch (ApiException e) {
log.error("newLabelToCell请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
}
/**
* 电子料入退库
*
* @param request
* @return
*/
public static List<BackToWarehouseResult> backToWarehouse(BackToWarehouseRequest request) {
try {
log.info("backToWarehouse接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(backToWarehouseUrl, request);
log.info("backToWarehouse接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
List<BackToWarehouseResult> resultList = JSONObject.parseArray(apiResult.getDATA(), BackToWarehouseResult.class);
if (resultList != null && !resultList.isEmpty()) {
return resultList;
}
} catch (ApiException e) {
log.error("backToWarehouse请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{"未找到对应的电子料入退库信息"});
}
/**
* Tower发料
*
* @param request
* @return
*/
public static void towerIssue(TowerIssueRequest request) {
try {
log.info("towerIssue接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(towerIssueUrl, request);
log.info("towerIssue接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
} catch (ApiException e) {
log.error("towerIssue请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
}
/**
* Picking发料
*
* @param request
* @return
*/
public static void pickingIssue(PickingIssueRequest request) {
try {
log.info("pickingIssue接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(pickingIssueUrl, request);
log.info("pickingIssue接口返回结果为:" + resultStr);
/*LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}*/
} catch (ApiException e) {
log.error("pickingIssue请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
}
/**
* 料卷退PK
*
* @param request
* @return
*/
public static ReturnToPKResult returnToPK(ReturnToPKRequest request) {
try {
log.info("returnToPK接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(returnToPKUrl, request);
log.info("returnToPK接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
return JSONObject.parseObject(apiResult.getDATA(), ReturnToPKResult.class);
} catch (ApiException e) {
log.error("returnToPK请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
}
/**
* 单据挑料
*
* @param request
* @return
*/
public static List<TicketPostResult> ticketPost(TicketPostRequest request) {
try {
log.info("ticketPost接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(ticketPostUrl, request);
log.info("ticketPost接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
List<TicketPostResult> resultList = JSONObject.parseArray(apiResult.getDATA(), TicketPostResult.class);
if (resultList != null && !resultList.isEmpty()) {
return resultList;
}
} catch (ApiException e) {
log.error("ticketPost请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{"未找到对应的单据挑料信息"});
}
/**
* 校验箱号信息
*
* @param request
* @return
*/
public static ValidCartonResult validCarton(ValidCartonRequest request) {
try {
log.info("validCarton接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(validCartonUrl, request);
log.info("validCarton接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
return JSONObject.parseObject(apiResult.getDATA(), ValidCartonResult.class);
} catch (ApiException e) {
log.error("validCarton请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
}
/**
* 获取栈板信息
*
* @param request
* @return
*/
public static List<FetchPalletInfoResult> fetchPalletInfo(FetchPalletInfoRequest request) {
try {
log.info("fetchPalletInfo接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(fetchPalletInfoUrl, request);
log.info("fetchPalletInfo接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
List<FetchPalletInfoResult> resultList = JSONObject.parseArray(apiResult.getDATA(), FetchPalletInfoResult.class);
if (resultList != null && !resultList.isEmpty()) {
return resultList;
}
} catch (ApiException e) {
log.error("fetchPalletInfo请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{"未找到对应的获取栈板信息"});
}
/**
* 获取栈板信息
*
* @param request
* @return
*/
public static void palletUpdate(PalletUpdateRequest request) {
try {
log.info("palletUpdate接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(palletUpdateUrl, request);
log.info("palletUpdate接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
} catch (ApiException e) {
log.error("palletUpdate请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
}
/**
* 获取可用库存
*
* @param request
* @return
*/
public static List<FetchValidInvResult> fetchValidInv(FetchValidInvRequest request) {
try {
log.info("fetchValidInv接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(fetchValidInvUrl, request);
log.info("fetchValidInv接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
List<FetchValidInvResult> resultList = JSONObject.parseArray(apiResult.getDATA(), FetchValidInvResult.class);
if (resultList != null && !resultList.isEmpty()) {
return resultList;
}
} catch (ApiException e) {
log.error("fetchValidInv请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{"未找到对应的可用库存信息"});
}
/**
* 栈板拆分
*
* @param request
* @return
*/
public static void palletSplit(PalletSplitRequest request) {
try {
log.info("palletSplit接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(palletSplitUrl, request);
log.info("palletSplite接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
} catch (ApiException e) {
log.error("palletSplit请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
}
/**
* 栈板合并
*
* @param request
* @return
*/
public static PalletMergeResult palletMerge(PalletMergeRequest request) {
try {
log.info("palletMerge接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(palletMergeUrl, request);
log.info("palletMerge接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
return JSONObject.parseObject(apiResult.getDATA(), PalletMergeResult.class);
} catch (ApiException e) {
log.error("palletMerge请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
}
/**
* 箱去向接口
*
* @param request
* @return
*/
public static CartonDstResult cartonDst(CartonDstRequest request) {
try {
log.info("cartonDst接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(cartonDstUrl, request);
log.info("cartonDst接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
return JSONObject.parseObject(apiResult.getDATA(), CartonDstResult.class);
} catch (ApiException e) {
log.error("palletMerge请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
}
/**
* 拉取转库单据
*
* @param request
* @return
*/
public static List<FetchMoveTicketResult> fetchMoveTicket(FetchMoveTicketRequest request) {
try {
log.info("fetchMoveTicket接口请求参数为:" + JSONObject.toJSONString(request));
//String resultStr = HttpHelper.postJson(fetchMoveTicketUrl, request);
String resultStr = "{\n" +
" \"MSGTY\": \"S\",\n" +
" \"MSGTX\": \"查询成功\",\n" +
" \"DETAIL\": null,\n" +
" \"DATA\": [\n" +
" {\n" +
" \"ticket_code\": \"REQ00001\",\n" +
" \"ticket_item\": \"1\",\n" +
" \"material_code\": \"pn001\",\n" +
" \"move_type\": \"311\",\n" +
" \"src_warehouse\": \"W101\",\n" +
" \"dst_warehouse\": \"W107\",\n" +
" \"src_plant\": \"W337\",\n" +
" \"dst_plant\": \"W337\",\n" +
" \"src_batch\": \"100000000E\",\n" +
" \"dst_batch\": \"100000000E\",\n" +
" \"qty\": 100\n" +
" },\n" +
" {\n" +
" \"ticket_code\": \"REQ00001\",\n" +
" \"ticket_item\": \"1\",\n" +
" \"material_code\": \"pn002\",\n" +
" \"move_type\": \"311\",\n" +
" \"src_warehouse\": \"W101\",\n" +
" \"dst_warehouse\": \"W107\",\n" +
" \"src_plant\": \"W337\",\n" +
" \"dst_plant\": \"W337\",\n" +
" \"src_batch\": \"100000000A\",\n" +
" \"dst_batch\": \"100000000A\",\n" +
" \"qty\": 200\n" +
" }\n" +
" ]\n" +
"}";
log.info("fetchMoveTicket接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
List<FetchMoveTicketResult> resultList = JSONObject.parseArray(apiResult.getDATA(), FetchMoveTicketResult.class);
if (resultList != null && !resultList.isEmpty()) {
return resultList;
}
} catch (Exception e) {
log.error("fetchMoveTicket请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{"未找到对应的拉取转库单据信息"});
}
/**
* 转库单据备料
*
* @param request
* @return
*/
public static void moveTicketPick(MoveTicketPickRequest request) {
try {
log.info("moveTicketPick接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(moveTicketPickUrl, request);
log.info("moveTicketPick接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
} catch (ApiException e) {
log.error("moveTicketPick请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
}
/**
* 转库单据过账
*
* @param request
* @return
*/
public static void moveTicketPost(MoveTicketPostRequest request) {
try {
log.info("moveTicketPost接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(moveTicketPostUrl, request);
log.info("moveTicketPost接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
} catch (ApiException e) {
log.error("moveTicketPost请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
}
/**
* Check检查站
*
* @param request
* @return
*/
public static void checkPassStation(CheckPassStationRequest request) {
try {
log.info("checkPassStation接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(checkPassStationUrl, request);
log.info("checkPassStation接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
} catch (ApiException e) {
log.error("checkPassStation请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
}
/**
* PPS CHECK检查结果
*
* @param request
* @return
*/
public static void checkLabelResult(CheckLabelRequest request) {
try {
log.info("checkLabelResult接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(checkLabelResultUrl, request);
log.info("checkLabelResult接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
} catch (ApiException e) {
log.error("checkLabelResult请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
}
/**
* 集货单锁定料箱查询
*
* @param request
* @return
*/
public static List<LockedCartonQueryResult> lockedCartonQuery(LockedCartonQueryRequest request) {
try {
log.info("lockedCartonQuery接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(lockedCartonQueryUrl, request);
log.info("lockedCartonQuery接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
List<LockedCartonQueryResult> resultList = JSONObject.parseArray(apiResult.getDATA(), LockedCartonQueryResult.class);
if (resultList != null && !resultList.isEmpty()) {
return resultList;
}
} catch (ApiException e) {
log.error("lockedCartonQuery请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{"未找到对应的集货单锁定料箱查询信息"});
}
/**
* 用栈板号获取箱信息清单
*
* @param request
* @return
*/
public static List<FetchPalletCartonResult> fetchPalletCarton(FetchPalletCartonRequest request) {
try {
log.info("fetchPalletCarton接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(fetchPalletCartonUrl, request);
log.info("fetchPalletCarton接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
List<FetchPalletCartonResult> resultList = JSONObject.parseArray(apiResult.getDATA(), FetchPalletCartonResult.class);
if (resultList != null && !resultList.isEmpty()) {
return resultList;
}
} catch (ApiException e) {
log.error("fetchPalletCarton请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{"未找到对应的用栈板号获取箱信息清单信息"});
}
/**
* PPS 按栈板获取箱清单
*
* @param request
* @return
*/
public static List<CheckPalletCartonResult> checkPalletCarton(CheckPalletCartonRequest request) {
try {
log.info("checkPalletCarton接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(checkPalletCartonUrl, request);
log.info("checkPalletCarton接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
List<CheckPalletCartonResult> resultList = JSONObject.parseArray(apiResult.getDATA(), CheckPalletCartonResult.class);
if (resultList != null && !resultList.isEmpty()) {
return resultList;
}
} catch (ApiException e) {
log.error("checkPalletCarton请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{"未找到对应的PPS 按栈板获取箱清单信息"});
}
/**
* 获取不可用(HOLD)库存信息
*
* @param request
* @return
*/
public static List<FetchHoldInfoResult> fetchHoldInfo(FetchHoldInfoRequest request) {
try {
log.info("fetchHoldInfo接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(fetchHoldInfoUrl, request);
log.info("fetchHoldInfo接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
List<FetchHoldInfoResult> resultList = JSONObject.parseArray(apiResult.getDATA(), FetchHoldInfoResult.class);
if (resultList != null && !resultList.isEmpty()) {
return resultList;
}
} catch (ApiException e) {
log.error("fetchHoldInfo请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{"未找到对应的获取不可用(HOLD)库存信息"});
}
/**
* 转库单据备料还原
*
* @param request
* @return
*/
public static void moveTicketRestore(MoveTicketRestoreRequest request) {
try {
log.info("moveTicketRestore接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(moveTicketRestoreUrl, request);
log.info("moveTicketRestore接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
} catch (ApiException e) {
log.error("moveTicketRestore请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
}
/**
* 重置转库单据
*
* @param request
* @return
*/
public static void resetMoveTicket(ResetMoveTicketRequest request) {
try {
log.info("resetMoveTicket接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(resetMoveTicketUrl, request);
log.info("resetMoveTicket接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
} catch (ApiException e) {
log.error("resetMoveTicket请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
}
public static List<QueryPickingResult> queryPicking(QueryPickingRequest request) {
try {
log.info("queryPicking接口请求参数为:" + JSON.toJSONString(request));
String resultStr = HttpHelper.postJson(queryPickingUrl, request);
log.info("queryPicking接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
List<QueryPickingResult> resultList = JSONObject.parseArray(apiResult.getDATA(), QueryPickingResult.class);
if (resultList != null && !resultList.isEmpty()) {
return resultList;
}
} catch (Exception e) {
log.error("queryPicking接口请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{"未找到对应的查询挑料单列表信息"});
}
public static List<GetPickingItemsResult> getPickingItems(GetPickingItemsRequest request) {
try {
log.info("getPickingItems接口请求参数为:" + JSON.toJSONString(request));
String resultStr = HttpHelper.postJson(getPickingItemsUrl, request);
log.info("getPickingItems接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
List<GetPickingItemsResult> resultList = JSONObject.parseArray(apiResult.getDATA(), GetPickingItemsResult.class);
if (resultList != null && !resultList.isEmpty()) {
return resultList;
}
} catch (Exception e) {
log.error("getPickingItems接口请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{"未找到对应的获取挑料单详情信息"});
}
public static BrandQtyResult brandQtyUrl(BrandQtyRequest request) {
log.info("brandQtyUrl接口请求参数为:" + JSON.toJSONString(request));
try {
String resultStr = HttpHelper.postJson(brandQtyUrl, request);
log.info("brandQtyUrl接口返回为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
if (apiResult.getDATA() != null) {
return JSONObject.parseObject(apiResult.getDATA(), BrandQtyResult.class);
}
} catch (ApiException e) {
e.printStackTrace();
}
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{"未找到料号信息"});
}
public static void binMove(BinMoveRequest request) {
log.info("binMoveUrl接口请求参数为:" + JSON.toJSONString(request));
try {
String resultStr = HttpHelper.postJson(binMoveUrl, request);
log.info("binMoveUrl接口返回为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
}
} catch (ApiException e) {
e.printStackTrace();
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
}
public static List<FetchShipmentInfoResult> fetchShipmentInfo(FetchShipmentInfoRequest request) {
try {
log.info("fetchShipmentInfo接口请求参数为:" + JSON.toJSONString(request));
String resultStr = HttpHelper.postJson(fetchShipmentInfoUrl, request);
log.info("fetchShipmentInfo接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
List<FetchShipmentInfoResult> resultList = JSONObject.parseArray(apiResult.getDATA(), FetchShipmentInfoResult.class);
if (resultList != null && !resultList.isEmpty()) {
return resultList;
}
} catch (Exception e) {
log.error("fetchShipmentInfo接口请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{"未找到对应的ODN信息"});
}
@Override
public Barcode canPutIn(String inCheckUrl, Barcode barcode) throws ValidateException {
String resultStr = "false";
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("ipn", barcode.getPartNumber());
paramMap.put("reelId", barcode.getBarcode());
paramMap.put("wo", "");
paramMap.put("datecode", barcode.getDateCode());
paramMap.put("lot", barcode.getBatch());
paramMap.put("vendor", barcode.getProvider());
String param = JsonUtil.toJsonStr(paramMap);
log.info("禁用料接口wmsCheckReelfob入参为:" + param);
try {
String result = HttpHelper.postJson(inCheckUrl, paramMap);
log.info(barcode.getBarcode() + "禁用料接口wmsCheckReelfob出参为:" + result);
JSONObject resultJson = JsonUtil.toObj(result, JSONObject.class);
if (resultJson != null) {
if (resultJson.getString("data") != null) {
JSONObject dataJson = resultJson.getJSONObject("data");
if (dataJson.get("result") != null && dataJson.getBoolean("result") == true) {
resultStr = "";
} else {
resultStr = dataJson.get("message").toString();
}
}
}
//log.info("禁用料接口wmsCheckReelfob出参为:" + result);
} catch (ApiException e) {
e.printStackTrace();
resultStr = e.getMessage();
log.info(barcode.getBarcode() + "wmsCheckReelfob异常:" + e.getMessage());
}
//保存禁用料记录
Barcode barcodeOri = barcodeManager.findByBarcode(barcode.getBarcode());
if (barcodeOri != null){
barcodeOri.setDisableMsg(resultStr);
barcode = barcodeManager.save(barcodeOri);
StoragePos storagePos = storagePosManager.getByBarcode(barcode.getBarcode());
if (storagePos != null){
storagePos.setBarcode(barcode);
storagePosManager.save(storagePos);
}
}
if (StringUtils.isNotBlank(resultStr)) {
throw new ValidateException("smfcore.mesApi.inCheck.ng", /*"MES验证失败:" + */barcode.getBarcode() + "验证失败:" + resultStr);
}
return barcode;
}
@Override
public void outTaskStatusChange(String outNotifyUrl, DataLog task) {
//pickingIssue(new PickingIssueRequest());
}
@Override
public boolean isForThisApi(String apiName) {
return "Luxsan".equals(apiName);
}
private static String queryBinUrl;
@Value("${api.queryBin}")
public void setQueryBinUrl(String url) {
LuxsanApi.queryBinUrl = url;
}
private static String updateBinUrl;
@Value("${api.updateBin}")
public void setUpdateBinUrl(String url) {
LuxsanApi.updateBinUrl = url;
}
private static String queryGrUrl;
@Value("${api.queryGr}")
public void setQueryGrUrl(String url) {
LuxsanApi.queryGrUrl = url;
}
private static String getInDateUrl;
@Value("${api.getInDate}")
public void setGetInDateUrl(String url) {
LuxsanApi.getInDateUrl = url;
}
private static String queryGrStatusUrl;
@Value("${api.queryGrStatus}")
public void setQueryGrStatusUrl(String url) {
LuxsanApi.queryGrStatusUrl = url;
}
private static String newLabelToCellUrl;
@Value("${api.newLabelToCell}")
public void setNewLabelToCellUrl(String url) {
LuxsanApi.newLabelToCellUrl = url;
}
private static String backToWarehouseUrl;
@Value("${api.backToWarehouse}")
public void setBackToWarehouseUrl(String url) {
LuxsanApi.backToWarehouseUrl = url;
}
private static String towerIssueUrl;
@Value("${api.towerIssue}")
public void setTowerIssueUrl(String url) {
LuxsanApi.towerIssueUrl = url;
}
private static String pickingIssueUrl;
@Value("${api.pickingIssue}")
public void setPickingIssueUrl(String url) {
LuxsanApi.pickingIssueUrl = url;
}
public static String returnToPKUrl;
@Value("${api.returnToPK}")
public void setReturnToPKUrl(String url) {
LuxsanApi.returnToPKUrl = url;
}
public static String ticketPostUrl;
@Value("${api.ticketPost}")
public void setTicketPostUrl(String url) {
LuxsanApi.ticketPostUrl = url;
}
public static String validCartonUrl;
@Value("${api.validCarton}")
public void setValidCartonUrl(String url) {
LuxsanApi.validCartonUrl = url;
}
public static String fetchPalletInfoUrl;
@Value("${api.fetchPalletInfo}")
public void setFetchPalletInfoUrl(String url) {
LuxsanApi.fetchPalletInfoUrl = url;
}
public static String palletUpdateUrl;
@Value("${api.palletUpdate}")
public void setPalletUpdateUrl(String url) {
LuxsanApi.palletUpdateUrl = url;
}
public static String fetchValidInvUrl;
@Value("${api.fetchValidInv}")
public void setFetchValidInvUrl(String url) {
LuxsanApi.fetchValidInvUrl = url;
}
public static String palletSplitUrl;
@Value("${api.palletSplit}")
public void setPalletSplitUrl(String url) {
LuxsanApi.palletSplitUrl = url;
}
public static String palletMergeUrl;
@Value("${api.palletMerge}")
public void setPalletMergeUrl(String url) {
LuxsanApi.palletMergeUrl = url;
}
public static String cartonDstUrl;
@Value("${api.cartonDst}")
public void setCartonDstUrl(String url) {
LuxsanApi.cartonDstUrl = url;
}
public static String fetchMoveTicketUrl;
@Value("${api.fetchMoveTicket}")
public void setFetchMoveTicketUrl(String url) {
LuxsanApi.fetchMoveTicketUrl = url;
}
public static String moveTicketPickUrl;
@Value("${api.moveTicketPick}")
public void setMoveTicketPickUrl(String url) {
LuxsanApi.moveTicketPickUrl = url;
}
public static String moveTicketPostUrl;
@Value("${api.moveTicketPost}")
public void setMoveTicketPostUrl(String url) {
LuxsanApi.moveTicketPostUrl = url;
}
public static String checkPassStationUrl;
@Value("${api.checkPassStation}")
public void setCheckPassStationUrl(String url) {
LuxsanApi.checkPassStationUrl = url;
}
public static String checkLabelResultUrl;
@Value("${api.checkLabelResult}")
public void setCheckLabelResultUrl(String url) {
LuxsanApi.checkLabelResultUrl = url;
}
public static String lockedCartonQueryUrl;
@Value("${api.lockedCartonQuery}")
public void setLockedCartonQueryUrl(String url) {
LuxsanApi.lockedCartonQueryUrl = url;
}
public static String fetchPalletCartonUrl;
@Value("${api.fetchPalletCarton}")
public void setFetchPalletCartonUrl(String url) {
LuxsanApi.fetchPalletCartonUrl = url;
}
public static String checkPalletCartonUrl;
@Value("${api.checkPalletCarton}")
public void setCheckPalletCartonUrl(String url) {
LuxsanApi.checkPalletCartonUrl = url;
}
public static String fetchHoldInfoUrl;
@Value("${api.fetchHoldInfo}")
public void setFetchHoldInfoUrl(String url) {
LuxsanApi.fetchHoldInfoUrl = url;
}
public static String moveTicketRestoreUrl;
@Value("${api.moveTicketRestore}")
public void setMoveTicketRestoreUrl(String url) {
LuxsanApi.moveTicketRestoreUrl = url;
}
public static String resetMoveTicketUrl;
@Value("${api.resetMoveTicket}")
public void setResetMoveTicketUrl(String url) {
LuxsanApi.resetMoveTicketUrl = url;
}
public static String queryPickingUrl;
@Value("${api.queryPicking}")
public void setQueryPickingUrl(String url) {
LuxsanApi.queryPickingUrl = url;
}
public static String getPickingItemsUrl;
@Value("${api.getPickingItems}")
public void setGetPickingItemsUrl(String url) {
LuxsanApi.getPickingItemsUrl = url;
}
public static String brandQtyUrl;
@Value("${api.brandQtyUrl}")
public void setBrandQtyUrl(String url) {
LuxsanApi.brandQtyUrl = url;
}
public static String fetchShipmentInfoUrl;
@Value("${api.fetchShipmentInfo}")
public void setFetchShipmentInfoUrl(String url) {
LuxsanApi.fetchShipmentInfoUrl = url;
}
public static String binMoveUrl;
@Value("${api.binMove}")
public void setBinMoveUrl(String url){
LuxsanApi.binMoveUrl = url;
}
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
import java.util.List;
/**
* 电子料入退库 请求
*/
@Data
public class BackToWarehouseRequest {
/**
* 厂区
*/
private String PLANT_CODE;
/**
* 目标储位
*/
private String BIN_CODE;
/**
* 料卷清单
*/
private List<String> REEL_LIST;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
@Data
@AllArgsConstructor
public class BinMoveRequest {
private String PLANT_CODE;
private String BIN_CODE;
private List<String> REEL_LIST;
private int QTY;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class BrandQtyRequest {
private String material_code;
private String brand;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
@Data
public class BrandQtyResult {
private String id;
private String material_code;
private String brand;
private int qty;
private int reel_size;
private String create_by;
private String create_at;
private String update_by;
private String update_at;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
/**
* 箱去向接口
*/
@Data
public class CartonDstRequest {
//厂区
private String PLANT;
//箱号
private String CARTON_ID;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
/**
* PPS CHECK检查结果
*/
@Data
public class CheckLabelRequest {
//箱号
private String CARTON_NO;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
/**
* PPS 按栈板获取箱清单
*/
@Data
public class CheckPalletCartonRequest {
//栈板号
private String PALLET_NO;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
@Data
public class CheckPassStationRequest {
// 出货栈板号
private String PALLET_NO;
// 箱号
private String CARTON_NO;
// SSCC/Tracking No
private String BARCODE;
// DN号
private String DN_NO;
// SHIPPINGLABEL/CARRIERLABEL打印类型
private String PRINT_TYPE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
/**
* 获取不可用(HOLD)库存信息
*/
@Data
public class FetchHoldInfoRequest {
//工厂代码
private String PLANT;
//库别代码
private String WAREHOUSE_CODE;
//物料编号
private String MATERIAL_CODE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* 拉取转库单据
*/
@Data
@AllArgsConstructor
public class FetchMoveTicketRequest {
//工厂代码
private String PLANT_CODE;
//单据号
private String TICKET_CODE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
/**
* 用栈板号获取箱信息清单
*/
@Data
public class FetchPalletCartonRequest {
//库存栈板号
private String PALLET_ID;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
/**
* 获取栈板信息 请求
*/
@Data
@AllArgsConstructor
public class FetchPalletInfoRequest {
private String REQUEST_ID;
private String PLANT;
private List<String> PALLET_LIST;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class FetchShipmentInfoRequest {
/**
* 工厂代码
*/
private String PLANT_CODE;
/**
* 出货单号
*/
private String TICKET_CODE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
/**
* 获取可用库存
*/
@Data
public class FetchValidInvRequest {
private String REQ_ID;
private String MATERIAL_CODE;
private String WAREHOUSE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* GetInDate 校验DC有效期
*/
@Data
@AllArgsConstructor
public class GetInDateRequest {
/**
* 厂区
*/
private String PLANT_CODE;
/**
* 料号
*/
private String MATERIAL_CODE;
/**
* 制造商
*/
private String BRAND;
/**
* 日期编码
*/
private String DATE_CODE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* GetPickingItems请求实体类
*/
@Data
@AllArgsConstructor
public class GetPickingItemsRequest {
/**
* 厂区
*/
private String PLANT_CODE;
/**
* 任务类型
*/
private String PICKING_ID;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
/**
* 集货单锁定料箱查询
*/
@Data
public class LockedCartonQueryRequest {
//出货单号
private String SHIPMENT_ID;
//出货栈板号
private String PALLET_NO;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
import java.util.List;
@Data
public class MoveTicketPickData {
// 工厂代码
private String PLANT_CODE;
// 单据号
private String TICKET_CODE;
// 单据行号
private String TICKET_ITEM;
// 料号
private String MATERIAL_CODE;
// 库存栈板清单
private List<String> LABEL_LIST;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
/**
* 转库单据备料
*/
@Data
public class MoveTicketPickRequest {
//工厂代码
private String PLANT_CODE;
//单据号
private String TICKET_CODE;
private MoveTicketPickData DATA;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
/**
* 转库单据过账
*/
@Data
public class MoveTicketPostRequest {
//工厂代码
private String PLANT_CODE;
//单据号
private String TICKET_CODE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
/**
* 转库单据备料还原
*/
@Data
public class MoveTicketRestoreRequest {
//工厂代码
private String PLANT_CODE;
//单据号
private String TICKET_CODE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
/**
* 按GR生成标签码并上架 请求
*/
@Data
@AllArgsConstructor
public class NewLabelToCellRequest {
/**
* 厂区
*/
private String PLANT_CODE;
/**
* 过账编码
*/
private List<String> UD_LIST;
/**
* 数量
*/
private int QTY;
/**
* 储位号
*/
private String BIN_CODE;
/**
* 料卷行
*/
private List<String> REEL_LIST;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
import java.util.List;
/**
* 栈板合并
*/
@Data
public class PalletMergeRequest {
// 合并到
private String MERGE_TO;
// 合并清单
private List<String> MERGE_LIST;
// 厂区
private String PLANT_CODE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
/**
* 栈板拆分
*/
@Data
public class PalletSplitRequest {
//库存栈板号
private String PALLET_ID;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
import java.util.List;
/**
* 栈板同库别转移
*/
@Data
public class PalletUpdateRequest {
// 请求标识
private String REQUEST_ID;
// 库存栈板号列表
private List<String> PALLET_LIST;
// 储位号
private String BIN_CODE;
// 业务类型
private String BIZ_TYPE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
/**
* PickingIssue请求
*/
@Data
@AllArgsConstructor
public class PickingIssueRequest {
/**
* 厂区
*/
private String PLANT_CODE;
/**
* 挑料单号
*/
private String PICKING_ID;
/**
* 行号
*/
private String ITEM_ID;
/**
* 料号
*/
private String MATERIAL_CODE;
/**
* 库别
*/
private String WAREHOUSE_CODE;
/**
* 制造商
*/
private String BRAND;
/**
* 面别
*/
private String FACE;
/**
* 批次码
*/
private String BATCH_CODE;
/**
* 料卷清单
*/
private List<String> REEL_LIST;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* QueryBin请求
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class QueryBinRequest {
/**
* 工厂代码
*/
private String PLANT_CODE;
/**
* 存储类型
*/
private String STORAGE_TYPE;
/**
* 储位状态
*/
private int BIN_STATUS;
/**
* 储位库别
*/
private String WAREHOUSE_CODE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* QueryGr请求实体类
*/
@Data
@AllArgsConstructor
public class QueryGrRequest {
/**
* 厂区
*/
private String PLANT_CODE;
/**
* 料号
*/
private String MATERIAL_CODE;
/**
* 供应商
*/
private String BRAND;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* GR过账状态查询 请求
*/
@Data
@AllArgsConstructor
public class QueryGrStatusRequest {
/**
* 厂区
*/
private String PLANT_CODE;
/**
* 供应商
*/
private String BRAND;
/**
* 料号
*/
private String MATERIAL_CODE;
/**
* 单据号
*/
private String GR_CODE;
/**
* 单据行
*/
private String GR_ITEM;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class QueryPickingRequest {
private String PLANT_CODE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
/**
* 重置转库单据
*/
@Data
public class ResetMoveTicketRequest {
//工厂代码
private String PLANT_CODE;
//单据号
private String TICKET_CODE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
import java.util.List;
/**
* 料卷退PK 请求
*/
@Data
public class ReturnToPKRequest {
// 厂区
private String PLANT_CODE;
// 挑料单号
private String PICKING_ID;
// 料号
private String MATERIAL_CODE;
// 目标储位
private String BIN_CODE;
// 料卷清单
private List<String> REEL_LIST;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
import java.util.List;
@Data
public class TicketPostRequest {
// 厂区
private String PLANT_CODE;
// 单据号
private String TICKET_CODE;
// 单据行
private String TICKET_ITEM;
// 料卷清单
private List<String> REEL_LIST;
// 数量
private int QTY;
// 储位号
private String BIN_CODE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.Data;
import java.util.List;
/**
* Tower发料 请求
*/
@Data
public class TowerIssueRequest {
// 厂区
private String PLANT_CODE;
// 挑料单号
private String PICKING_ID;
// 料号
private String MATERIAL_CODE;
// 库别
private String WAREHOUSE_CODE;
// 制造商
private String BRAND;
// 面别
private String FACE;
// 批次码
private String BATCH_CODE;
// 料卷清单
private List<String> REEL_LIST;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* UpdateBin 更新储位 请求
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UpdateBinRequest {
/**
* 工厂代码
*/
private String PLANT_CODE;
/**
* 储位代码
*/
private String BIN_CODE;
/**
* 储位库别
*/
private String WAREHOUSE_CODE;
/**
* 存储类型
*/
private String STORAGE_TYPE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* 校验箱号信息
*/
@Data
@AllArgsConstructor
public class ValidCartonRequest {
// 请求ID
private String REQUEST_ID;
// 卡板ID
private String CARTON_ID;
// 厂区
private String PLANT;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
/**
* 电子料入退库 结果
*/
@Data
public class BackToWarehouseResult {
/**
*厂区
*/
private String PLANT_CODE;
/**
*标签码
*/
private String LABEL_ID;
/**
*料号
*/
private String MATERIAL_CODE;
/**
*库别
*/
private String WAREHOUSE_CODE;
/**
*数量
*/
private int LABEL_QTY;
/**
*厂商代码
*/
private String VENDOR_CODE;
/**
*厂商名称
*/
private String VENDOR_NAME;
/**
*版本
*/
private String VERSION;
/**
*单据日期
*/
private String GR_DATE;
/**
*异动日期
*/
private String TRAN_DATE;
/**
*状态
*/
private int STATUS;
/**
*仓管员
*/
private String KEEPER_CODE;
/**
*制造商
*/
private String BRAND;
/**
*单位
*/
private String UNIT;
/**
*批次号
*/
private String BATCH_CODE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
@Data
public class BinMoveResult {
//厂区
private String PLANT_CODE;
// 描述: 标签码
private String LABEL_ID;
// 描述: 料号
private String MATERIAL_CODE;
// 描述: 库别
private String WAREHOUSE_CODE;
// 描述: 数量
private Integer LABEL_QTY;
// 描述: 厂商代码
private String VENDOR_CODE;
// 描述: 厂商名称
private String VENDOR_NAME;
// 描述: 版本
private String VERSION;
// 描述: 单据日期
private String GR_DATE;
// 描述: 异动日期
private String TRAN_DATE;
// 描述: 状态
private int STATUS;
// 描述: 仓管员
private String KEEPER_CODE;
// 描述: 制造商
private String BRAND;
// 描述: 单位
private String UNIT;
// 描述: 批次号
private String BATCH_CODE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
/**
* 箱去向接口
*/
@Data
public class CartonDstResult {
//目的地
private String DESTINATION;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
import java.util.List;
/**
* PPS 按栈板获取箱清单
*/
@Data
public class CheckPalletCartonResult {
// 箱号
private String CARTON_ID;
// 工厂代码
private String PLANT;
private String PART_NO;
// 库别
private String WAREHOUSE_CODE;
// 原产国
private String COO;
private List<String> PALLET_PACK_CODE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
/**
* 获取不可用(HOLD)库存信息
*/
@Data
public class FetchHoldInfoResult {
// 箱号
private String CARTON_ID;
// 工厂代码
private String PLANT_CODE;
// 批次
private String BATCH_CODE;
// 库存栈板号
private String PALLET_ID;
// 料号
private String MATERIAL_CODE;
// HOLD数量
private Integer HOLD;
// 数量(PCS)
private Integer QTY;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
/**
* 拉取转库单据
*/
@Data
public class FetchMoveTicketResult {
// 单据行号
private String TICKET_ITEM;
// 料号
private String MATERIAL_CODE;
// 源工厂
private String SRC_PLANT;
// 目的工厂
private String DST_PLANT;
// 来源库别
private String SRC_WAREHOUSE;
// 目的库别
private String DST_WAREHOUSE;
// 来源批次
private String SRC_BATCH;
// 目的批次
private String DST_BATCH;
// 数量
private int QTY;
// 移动类型
private String MOVE_TYPE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
/**
* 用栈板号获取箱信息清单
*/
@Data
public class FetchPalletCartonResult {
// 箱号
private String CARTON_ID;
// 工厂代码
private String PLANT;
// 料号
private String PN;
// 库存栈板号
private String PALLET_ID;
// 机种
private String MODEL_FAMILY;
// 库别
private String WAREHOUSE_CODE;
// 状态
private String STATUS;
// 是否 HOLD
private String HOLD;
// 数量(PCS)
private Integer QTY;
// 包规
private Integer FULL_QTY;
// 版本号
private String OS_VERSION;
// 原产国
private String COO;
// 包装类型
private String PACK_TYPE;
// 生产日期
private String CREATE_AT;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
/**
* 获取栈板信息 结果
*/
@Data
public class FetchPalletInfoResult {
// 厂区
private String PLANT;
// 库存栈板号
private String PALLET_ID;
// 机种
private String MODEL_FAMILY;
// 库别
private String WAREHOUSE_CODE;
// 生产日期
private String CREATED_TIME;
// 储位号
private String BIN_CODE;
// 数量
private int QTY;
// 批次
private String BATCH_CODE;
// 料号
private String MATERIAL_CODE;
// 物料类型
private String MATERIAL_TYPE;
// 原产国
private String COO;
// 版本
private String OS_VERSION;
// 包装类型
private String PACK_TYPE;
// 厂区(重复字段名,可能需要根据实际情况调整)
private String PLANT_CODE;
// 状态
private int STATUS;
// 禁用
private int HOLD;
// 失败说明
private String ERROR;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
@Data
public class FetchShipmentInfoResult {
/**
* 行ID
*/
private String RTV_ID;
/**
* 工厂代码
*/
private String PLANT_CODE;
/**
* 出货单号
*/
private String TICKET_CODE;
/**
* 单据行号
*/
private String TICKET_ITEM;
/**
* 料号
*/
private String MATERIAL_CODE;
/**
* 物料类型
*/
private String MATERIAL_TYPE;
/**
* 仓库代码
*/
private String WAREHOUSE_CODE;
/**
* 供应商代码
*/
private String VENDOR_CODE;
/**
* 单据数量
*/
private int QTY;
/**
* 单位
*/
private String UNIT;
/**
* 状态
*/
private String STATUS;
/**
* 原数量
*/
private int ORIGIN_QTY;
/**
* 制造商
*/
private int MANUFACTURE;
/**
* 报关模式
*/
private String IMPORT_MODE;
/**
* 进口编号
*/
private String IMPORT_CODE;
/**
* 收货工厂
*/
private String SHIP_TO;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
/**
* 获取可用库存
*/
@Data
public class FetchValidInvResult {
// 料号
private String MATERIAL_CODE;
// 库存栈板号
private String PALLET_ID;
// 数量
private int QTY;
// 扣货
private int HOLD;
// 储位
private String BIN_CODE;
// 库别
private String WAREHOUSE;
// 状态
private int STATUS;
// 批次
private String BATCH_CODE;
// 时间
private String CREATED_AT;
// 原产国
private String COO;
// 版本
private String OS_VERSION;
// 包装类型
private String PACK_TYPE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
/**
* GetPickingItems结果实体类
*/
@Data
public class GetPickingItemsResult {
/**
* 厂区
*/
private String PLANT_CODE;
/**
* 行号
*/
private String ITEM_ID;
/**
* 挑料单号
*/
private String PICKING_ID;
/**
* 料号
*/
private String MATERIAL_CODE;
/**
* 库别
*/
private String WAREHOUSE;
/**
* 需求数量
*/
private int REQ_QTY;
/**
* 需求卷数
*/
private int REQ_REEL;
/**
* 传承数量
*/
private int CP_QTY;
/**
* 传承卷数
*/
private int CP_REEL;
/**
* 已发数量
*/
private int ISSUED_QTY;
/**
* 已发卷数
*/
private int ISSUED_REEL;
/**
* 退回数量
*/
private int RET_QTY;
/**
* 面别
*/
private String FACE;
/**
* 批次
*/
private String BATCH_CODE;
/**
* 制造商
*/
private String BRAND;
/**
* 创建日期
*/
private String CREATE_AT;
/**
* 更新日期
*/
private String UPDATE_AT;
private String MO;
private String BIN_CODE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
/**
* 集货单锁定料箱查询
*/
@Data
public class LockedCartonQueryResult {
// 出货单号
private String SHIPMENT_ID;
// 出货栈板号
private String PALLET_NO;
// 行号
private String ROW_ID;
// 箱号
private String CARTON_ID;
// 锁定时间
private String CREATE_AT;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
/**
* 按GR生成标签码并上架 返回
*/
@Data
public class NewLabelToCellResult {
/**
* 厂区
*/
private String PLANT_CODE;
/**
* 标签码
*/
private String LABEL_ID;
/**
* 料号
*/
private String MATERIAL_CODE;
/**
* 库别
*/
private String WAREHOUSE_CODE;
/**
* 数量
*/
private int LABEL_QTY;
/**
* 厂商代码
*/
private String VENDOR_CODE;
/**
* 厂商名称
*/
private String VENDOR_NAME;
/**
* 版本
*/
private String VERSION;
/**
* 单据日期
*/
private String GR_DATE;
/**
* 异动日期
*/
private String TRAN_DATE;
/**
* 状态
*/
private int STATUS;
/**
* 仓管员
*/
private String KEEPER_CODE;
/**
* 制造商
*/
private String BRAND;
/**
* 单位
*/
private String UNIT;
/**
* 批次号
*/
private String BATCH_CODE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
/**
* 栈板合并
*/
@Data
public class PalletMergeResult {
// 库存栈板号
private String PALLET_ID;
// 机种
private String MODEL_FAMILY;
// 库别
private String WAREHOUSE_CODE;
// 生产日期
private String CREATED_TIME;
// 储位号
private String BIN_CODE;
// 数量
private int QTY;
// 批次
private String BATCH_CODE;
// 料号
private String MATERIAL_CODE;
// 物料类型
private String MATERIAL_TYPE;
// 原产国
private String COO;
// 版本
private String OS_VERSION;
// 包装类型
private String PACK_TYPE;
// 厂区
private String PLANT_CODE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
/**
* 栈板同库别转移
*/
@Data
public class PalletUpdateResult {
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
/**
* PickingIssue返回
*/
public class PickingIssueResult {
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
/**
* QueryBin返回
*/
@Data
public class QueryBinResult {
/**
* 储位代码
*/
private String BIN_CODE;
/**
* 储位类型
*/
private String BIN_TYPE;
/**
* 储位状态
*/
private int BIN_STATUS;
/**
* 容量
*/
private int BIN_SIZE;
/**
* 仓管员
*/
private String BIN_KEEPER;
/**
* 储位库别
*/
private String WAREHOUSE_CODE;
/**
* 存储类型
*/
private String STORAGE_TYPE;
/**
* 储位厂区
*/
private String PLANT_CODE;
/**
* 储位楼栋
*/
private String BUILDING;
/**
* 储位分类
*/
private String BIN_CATEGORY;
/**
* 储位点位
*/
private String BIN_ZONE;
/**
* 储位楼层
*/
private String BIN_FLOOR;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
/**
* QueryGr结果实体类
*/
@Data
public class QueryGrResult {
/**
* 厂区
*/
private String PLANT_CODE;
/**
* 单据号
*/
private String GR_CODE;
/**
* 单据行
*/
private String GR_ITEM;
/**
* 单据日期
*/
private String GR_DATE;
/**
* 料号
*/
private String MATERIAL_CODE;
/**
* 厂商代码
*/
private String VENDOR_CODE;
/**
* 厂商名称
*/
private String VENDOR_NAME;
/**
* 制造商
*/
private String BRAND;
/**
* 仓管员
*/
private String KEEPER_CODE;
/**
* 库别
*/
private String WAREHOUSE_CODE;
/**
* 批次
*/
private String BATCH_CODE;
/**
* 数量
*/
private int GR_QTY;
/**
* 单据状态
*/
private int POST_STATUS;
/**
* 异动日期
*/
private String POST_DATE;
/**
* 原单据
*/
private String ORIGIN_GR;
/**
* 保税标识
*/
private String MATERIAL_BONDED;
/**
* A级物料
*/
private String MATERIAL_CONTROL;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
/**
* GR过账状态查询 返回
*/
@Data
public class QueryGrStatusResult {
/**
* 厂区
*/
private String PLANT_CODE;
/**
* 单据号
*/
private String GR_CODE;
/**
* 单据行
*/
private String GR_ITEM;
/**
* 单据日期
*/
private String GR_DATE;
/**
* 料号
*/
private String MATERIAL_CODE;
/**
* 厂商代码
*/
private String VENDOR_CODE;
/**
* 厂商名称
*/
private String VENDOR_NAME;
/**
* 状态
*/
private String STATUS;
/**
* 供应商
*/
private String BRAND;
/**
* 仓管员
*/
private String KEEPER_CODE;
/**
* 库别
*/
private String WAREHOUSE_CODE;
/**
* 过账代码
*/
private String UD_CODE;
/**
* 过账数量
*/
private String UD_QTY;
/**
* 单据数量
*/
private String LOT_QTY;
/**
* 过账时间
*/
private String POST_DATE;
/**
* 批次
*/
private String BATCH_CODE;
/**
* 原单据
*/
private String ORIGIN_GR;
/**
* 保税标识
*/
private String MATERIAL_BONDED;
/**
* A级物料
*/
private String MATERIAL_CONTROL;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
/**
* 查询挑料单列表
*/
@Data
public class QueryPickingResult {
// 厂区
private String PLANT_CODE;
// 挑料单号
private String PICKING_ID;
// 线别
private String LINE;
// 状态
private Integer STATUS;
// 原单号
private String ORG_PICKING_ID;
// SMT料号
private String SMT_PN;
// 创建时间
private String CREATE_AT;
// 更新时间
private String UPDATE_AT;
// 更新工号
private String UPDATE_BY;
// 更新姓名
private String UPDATE_NAME;
private boolean checkOut = false;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
/**
* 料卷退PK 返回
*/
@Data
public class ReturnToPKResult {
// 厂区
private String PLANT_CODE;
// 标签码
private String LABEL_ID;
// 料号
private String MATERIAL_CODE;
// 库别
private String WAREHOUSE_CODE;
// 数量
private int LABEL_QTY;
// 厂商代码
private String VENDOR_CODE;
// 厂商名称
private String VENDOR_NAME;
// 版本
private String VERSION;
// 单据日期
private String GR_DATE;
// 异动日期
private String TRAN_DATE;
// 状态
private int STATUS;
// 仓管员
private String KEEPER_CODE;
// 制造商
private String BRAND;
// 单位
private String UNIT;
// 批次号
private String BATCH_CODE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
@Data
public class TicketPostResult {
// 厂区
private String PLANT_CODE;
// 标签码
private String LABEL_ID;
// 料号
private String MATERIAL_CODE;
// 库别
private String WAREHOUSE_CODE;
// 数量
private int LABEL_QTY;
// 厂商代码
private String VENDOR_CODE;
// 厂商名称
private String VENDOR_NAME;
// 版本
private String VERSION;
// 单据日期
private String GR_DATE;
// 异动日期
private String TRAN_DATE;
// 状态
private int STATUS;
// 仓管员
private String KEEPER_CODE;
// 制造商
private String BRAND;
// 单位
private String UNIT;
// 批次号
private String BATCH_CODE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
/**
* UpdateBin 更新储位 返回
*/
@Data
public class UpdateBinResult {
}
package com.neotel.smfcore.custom.luxsan.api.bean.result;
import lombok.Data;
import java.util.Date;
/**
* 校验箱号信息 返回
*/
@Data
public class ValidCartonResult {
// 厂区
private String PLANT;
// 箱号
private String CARTON_ID;
// 栈板号
private String PALLET_ID;
// 料号
private String PN;
// 机种
private String MODEL_FAMILY;
// 物料类型
private String MATERIAL_TYPE;
// 状态
private int STATUS;
// 库别
private String WAREHOUSE_CODE;
// 是否HOLD
private int HOLD;
// 数量
private int QTY;
// 满箱数量
private int FULL_QTY;
// 包装类型
private String PACK_TYPE;
// 生产日期
private String CREATE_AT;
// 区域
private String REGION;
}
package com.neotel.smfcore.custom.luxsan.api.bean.util;
import lombok.Data;
@Data
public class LuxsanApiResult {
private String MSGTY;
private String MSGTX;
private String DATA;
}
package com.neotel.smfcore.custom.luxsan.api.enums;
/**
* Bin 枚举
*/
public class BinEnum {
//R:货架, P:栈板, C:箱格, B:胶框, T:料塔
public static final String STORAGE_TYPE_R = "R";
public static final String STORAGE_TYPE_P = "P";
public static final String STORAGE_TYPE_C = "C";
public static final String STORAGE_TYPE_B = "B";
public static final String STORAGE_TYPE_T = "T";
//0:空闲, 1:占用, 2:锁定
public static final int BIN_STATUS_0 = 0;
public static final int BIN_STATUS_1 = 1;
public static final int BIN_STATUS_2 = 2;
}
package com.neotel.smfcore.custom.luxsan.api.enums;
public class LuxsanApiEnum {
public static final String SUCCESS = "S";
public static final String ERROR = "E";
}
package com.neotel.smfcore.custom.luxsan.api.enums;
public class PalletEnum {
//待入库
public static final int PENDING_STORAGE = 1;
//单据分配
public static final int DOCUMENT_ALLOCATION = 2;
//已挑料
public static final int MATERIAL_PICKED = 3;
//在库库存
public static final int INVENTORY_IN_WAREHOUSE = 4;
//出货已备料
public static final int SHIPMENT_MATERIALS_PREPARED = 5;
//已过账,待上架
public static final int POSTED_AND_PENDING_SHELVING = 6;
//已出货
public static final int SHIPPED = 7;
//已经生成栈板,待过账
public static final int PENDING_POSTING = 8;
//出货取消
public static final int SHIPMENT_CANCELLATION = 9;
}
package com.neotel.smfcore.custom.luxsan.api.enums;
public class QueryGrEnum {
// -1:已撤消,0:新单据, 1:已过账/待上架
public static final int cancel = -1;
public static final int newDoc = 0;
public static final int pending = 1;
public static String getStatusName(int status) {
if (status == cancel) {
return "已撤消";
} else if (status == newDoc) {
return "新单据";
} else if (status == pending) {
return "已过账/待上架";
}
return "";
}
}
package com.neotel.smfcore.custom.luxsan.api.enums;
public class QueryGrStatusEnum {
//status: -1 Cancel:已撤消,0 New:新单据, 1 PostIn:已过账/待上架
// 2 AllocBin:已分配/待上架 3 In:已上架/已结案 4 AllocInv:已分配待下架
// 5 Picked:已下架待过账 6 PostOut:已下架已过账 7 Out:已发料已结案
// 8 AllocLack:已分配但缺料 10 LackBin:未分配无库存 11 AllocAuto:已分配未完成
public static final String cancel = "Cancel";
public static final String newDoc = "New";
public static final String postIn = "PostIn";
public static final String allocBin = "AllocBin";
public static final String in = "In";
public static final String allocInv = "AllocInv";
public static final String picked = "Picked";
public static final String postOut = "PostOut";
public static final String out = "Out";
public static final String allocLack = "AllocLack";
public static final String lackBin = "LackBin";
public static final String allocAuto = "AllocAuto";
public static String getStatusName(String status) {
if (status.equals(cancel)) {
return "已撤消";
} else if (status.equals(newDoc)) {
return "新单据";
} else if (status.equals(postIn)) {
return "已过账/待上架";
} else if (status.equals(allocBin)) {
return "已分配/待上架";
} else if (status.equals(in)) {
return "已上架/已结案";
} else if (status.equals(allocInv)) {
return "已分配待下架";
} else if (status.equals(picked)) {
return "已下架待过账";
} else if (status.equals(postOut)) {
return "已下架已过账";
} else if (status.equals(out)) {
return "已发料已结案";
} else if (status.equals(allocLack)) {
return "已分配但缺料";
} else if (status.equals(lackBin)) {
return "未分配无库存";
} else if (status.equals(allocAuto)) {
return "已分配未完成";
}
return "";
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.common.bean.request;
import lombok.Data;
@Data
public class SendTicketInfo {
// 厂区
private String PLANT_CODE;
// 单据号
private String TICKET_CODE;
// 单据行号
private String TICKET_ITEM;
// 单据类型
private String TICKET_TYPE;
// 异动类型
private String MOVE_TYPE;
// 料号
private String MATERIAL_CODE;
// 数量
private Double QTY;
// 仓管员
private String KEEPER_CODE;
// 来源厂区
private String SRC_PLANT;
// 来源库别
private String SRC_WAREHOUSE;
// 目的厂区
private String DST_PLANT;
// 目的库别
private String DST_WAREHOUSE;
// 过账数量
private Double POST_QTY;
// 过账日期
private String POST_DATE;
// 状态
private String STATUS;
// 分配数量
private Double ALLOCATE_QTY;
// 挑料数量
private Double PICKED_QTY;
// 源批次
private String SRC_BATCH;
// 目的批次
private String DST_BATCH;
}
package com.neotel.smfcore.custom.luxsan.factory_c.common.bean.result;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class WcsResult {
@JsonProperty("MSGTY")
private String MSGTY;
@JsonProperty("MSGTX")
private String MSGTX;
}
package com.neotel.smfcore.custom.luxsan.factory_c.common.controller;
import com.neotel.smfcore.custom.luxsan.api.LuxsanApi;
import com.neotel.smfcore.custom.luxsan.api.bean.request.*;
import com.neotel.smfcore.custom.luxsan.api.bean.result.*;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CommonUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/luxsanApi")
public class LuxsanApiController {
@ApiOperation("3 GR查询")
@RequestMapping("/queryGr")
@AnonymousAccess
public List<QueryGrResult> queryGr(@RequestBody QueryGrRequest request) {
return LuxsanApi.queryGr(request);
}
@ApiOperation("5 GR过账状态查询")
@RequestMapping("/queryGrStatus")
@AnonymousAccess
public List<QueryGrStatusResult> queryGrStatus(@RequestBody QueryGrStatusRequest request) {
return LuxsanApi.queryGrStatus(request);
}
@ApiOperation("6 按GR生成标签码并上架")
@RequestMapping("/newLabelToCell")
@AnonymousAccess
public NewLabelToCellResult newLabelToCell(@RequestBody NewLabelToCellRequest request) {
return LuxsanApi.newLabelToCell(request);
}
@ApiOperation("11 查询挑料单列表")
@RequestMapping("/queryPicking")
@AnonymousAccess
public List<QueryPickingResult> queryPicking(@RequestBody QueryPickingRequest request) {
return LuxsanApi.queryPicking(request);
}
@ApiOperation("12 获取挑料单详情")
@RequestMapping("/getPickingItems")
@AnonymousAccess
public List<GetPickingItemsResult> getPickingItems(@RequestBody GetPickingItemsRequest request) {
return LuxsanApi.getPickingItems(request);
}
@ApiOperation("14 Picking发料")
@RequestMapping("/pickingIssue")
@AnonymousAccess
public void pickingIssue(@RequestBody PickingIssueRequest request) {
LuxsanApi.pickingIssue(request);
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.common.controller;
import com.alibaba.fastjson.JSON;
import com.neotel.smfcore.custom.luxsan.factory_c.common.bean.request.SendTicketInfo;
import com.neotel.smfcore.custom.luxsan.factory_c.common.bean.result.WcsResult;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Slf4j
@RequestMapping("/wcs")
@RestController
public class WcsController {
@ApiOperation("单据推送")
@RequestMapping("/SendTicketInfo")
@AnonymousAccess
public WcsResult sendTicketInfo(@RequestBody List<SendTicketInfo> paramList){
log.info("收到单据推送请求信息为:"+ JSON.toJSONString(paramList));
WcsResult wcsResult = new WcsResult();
wcsResult.setMSGTX("S");
wcsResult.setMSGTY("接收成功");
return wcsResult;
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean;
import lombok.Data;
/**
* 料串需要绑定的GR信息
*/
@Data
public class BindGrInfo {
//料串信息
private String materialStr;
// 厂区
private String plantCode;
// 单据号
private String grCode;
// 单据行
private String grItem;
// 单据日期
private String grDate;
// 料号
private String materialCode;
// 厂商代码
private String vendorCode;
// 厂商名称
private String vendorName;
// 状态
private String status;
// 供应商
private String brand;
// 仓管员
private String keeperCode;
// 库别
private String warehouseCode;
// 过账代码
private String udCode;
// 过账数量
private Double udQty;
// 单据数量
private Double lotQty;
// 过账时间
private String postDate;
// 批次
private String batchCode;
// 原单据
private String originGr;
// 保税标识
private String materialBonded;
// A级物料
private String materialControl;
private int h;
private int w;
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class TicketReturn {
private String material;
private String ticketCode;
private String ticketItem;
private String warehouseCode;
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.dto;
import com.neotel.smfcore.custom.luxsan.api.bean.result.FetchMoveTicketResult;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class FetchMoveTicketDto {
// 单据行号
private String ticketItem;
// 料号
private String materialCode;
// 源工厂
private String srcPlant;
// 目的工厂
private String dstPlant;
// 来源库别
private String srcWarehouse;
// 目的库别
private String dstWarehouse;
// 来源批次
private String srcBatch;
// 目的批次
private String dstBatch;
// 数量
private int qty;
// 移动类型
private String moveType;
public static FetchMoveTicketDto convertFetchMoveTicketDto(FetchMoveTicketResult result) {
FetchMoveTicketDto dto = new FetchMoveTicketDto();
dto.setTicketItem(result.getTICKET_ITEM());
dto.setMaterialCode(result.getMATERIAL_CODE());
dto.setSrcPlant(result.getSRC_PLANT());
dto.setDstPlant(result.getDST_PLANT());
dto.setSrcWarehouse(result.getSRC_WAREHOUSE());
dto.setDstWarehouse(result.getDST_WAREHOUSE());
dto.setSrcBatch(result.getSRC_BATCH());
dto.setDstBatch(result.getDST_BATCH());
dto.setQty(result.getQTY());
dto.setMoveType(result.getMOVE_TYPE());
return dto;
}
public static List<FetchMoveTicketDto> convertFetchMoveTicketDto(List<FetchMoveTicketResult> resultList) {
List<FetchMoveTicketDto> dtoList = new ArrayList<>();
for (FetchMoveTicketResult result : resultList) {
dtoList.add(convertFetchMoveTicketDto(result));
}
return dtoList;
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.dto;
import com.google.common.collect.Lists;
import com.neotel.smfcore.custom.luxsan.api.bean.result.GetPickingItemsResult;
import lombok.Data;
import java.util.List;
@Data
public class GetPickingItemsDto {
/**
* 厂区
*/
private String plantCode;
/**
* 行号
*/
private String itemId;
/**
* 挑料单号
*/
private String pickingId;
/**
* 料号
*/
private String materialCode;
/**
* 库别
*/
private String warehouse;
/**
* 需求数量
*/
private int reqQty;
/**
* 需求卷数
*/
private int reqReel;
/**
* 传承数量
*/
private int cpQty;
/**
* 传承卷数
*/
private int cpReel;
/**
* 已发数量
*/
private int issuedQty;
/**
* 已发卷数
*/
private int issuedReel;
/**
* 退回数量
*/
private int retQty;
/**
* 面别
*/
private String face;
/**
* 批次
*/
private String batchCode;
/**
* 制造商
*/
private String brand;
/**
* 创建日期
*/
private String createAt;
/**
* 更新日期
*/
private String updateAt;
private String mo;
private String binCode;
public static GetPickingItemsDto convertGetPickingItemsResultDto(GetPickingItemsResult result){
GetPickingItemsDto getPickingItemsResultDto = new GetPickingItemsDto();
getPickingItemsResultDto.setPlantCode(result.getPLANT_CODE());
getPickingItemsResultDto.setItemId(result.getITEM_ID());
getPickingItemsResultDto.setPickingId(result.getPICKING_ID());
getPickingItemsResultDto.setMaterialCode(result.getMATERIAL_CODE());
getPickingItemsResultDto.setWarehouse(result.getWAREHOUSE());
getPickingItemsResultDto.setReqQty(result.getREQ_QTY());
getPickingItemsResultDto.setReqReel(result.getREQ_REEL());
getPickingItemsResultDto.setCpQty(result.getCP_QTY());
getPickingItemsResultDto.setCpReel(result.getCP_REEL());
getPickingItemsResultDto.setIssuedQty(result.getISSUED_QTY());
getPickingItemsResultDto.setIssuedReel(result.getISSUED_REEL());
getPickingItemsResultDto.setRetQty(result.getRET_QTY());
getPickingItemsResultDto.setFace(result.getFACE());
getPickingItemsResultDto.setBatchCode(result.getBATCH_CODE());
getPickingItemsResultDto.setBrand(result.getBRAND());
getPickingItemsResultDto.setCreateAt(result.getCREATE_AT());
getPickingItemsResultDto.setUpdateAt(result.getUPDATE_AT());
getPickingItemsResultDto.setMo(result.getMO());
getPickingItemsResultDto.setBinCode(result.getBIN_CODE());
return getPickingItemsResultDto;
}
public static List<GetPickingItemsDto> convertGetPickingItemsResultDto(List<GetPickingItemsResult> resultList) {
List<GetPickingItemsDto> getPickingItemsResultDtolist=Lists.newArrayList();
for (GetPickingItemsResult getPickingItemsResult :resultList) {
getPickingItemsResultDtolist.add(convertGetPickingItemsResultDto(getPickingItemsResult));
}
return getPickingItemsResultDtolist;
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.dto;
import com.neotel.smfcore.custom.luxsan.api.bean.result.QueryGrResult;
import com.neotel.smfcore.custom.luxsan.api.enums.QueryGrEnum;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class QueryGrDto {
/**
* 厂区
*/
private String plantCode;
/**
* 单据号
*/
private String grCode;
/**
* 单据行
*/
private String grItem;
/**
* 单据日期
*/
private String grDate;
/**
* 料号
*/
private String materialCode;
/**
* 厂商代码
*/
private String vendorCode;
/**
* 厂商名称
*/
private String vendorName;
/**
* 制造商
*/
private String brand;
/**
* 仓管员
*/
private String keeperCode;
/**
* 库别
*/
private String warehouseCode;
/**
* 批次
*/
private String batchCode;
/**
* 数量
*/
private int grQty;
/**
* 单据状态
*/
private String postStatus;
/**
* 异动日期
*/
private String postDate;
/**
* 原单据
*/
private String originGr;
/**
* 保税标识
*/
private String materialBonded;
/**
* A级物料
*/
private String materialControl;
public static QueryGrDto convert(QueryGrResult result){
QueryGrDto queryGrResultDto = new QueryGrDto();
queryGrResultDto.setPlantCode(result.getPLANT_CODE());
queryGrResultDto.setGrCode(result.getGR_CODE());
queryGrResultDto.setGrItem(result.getGR_ITEM());
queryGrResultDto.setGrDate(result.getGR_DATE());
queryGrResultDto.setMaterialCode(result.getMATERIAL_CODE());
queryGrResultDto.setVendorCode(result.getVENDOR_CODE());
queryGrResultDto.setVendorName(result.getVENDOR_NAME());
queryGrResultDto.setBrand(result.getBRAND());
queryGrResultDto.setKeeperCode(result.getKEEPER_CODE());
queryGrResultDto.setWarehouseCode(result.getWAREHOUSE_CODE());
queryGrResultDto.setBatchCode(result.getBATCH_CODE());
queryGrResultDto.setGrQty(result.getGR_QTY());
queryGrResultDto.setPostStatus(QueryGrEnum.getStatusName(result.getPOST_STATUS()));
queryGrResultDto.setPostDate(result.getPOST_DATE());
queryGrResultDto.setOriginGr(result.getORIGIN_GR());
queryGrResultDto.setMaterialBonded(result.getMATERIAL_BONDED());
queryGrResultDto.setMaterialControl(result.getMATERIAL_CONTROL());
return queryGrResultDto;
}
public static List<QueryGrDto> convert(List<QueryGrResult> queryGrResultList){
List<QueryGrDto> resultList = new ArrayList<>();
for (QueryGrResult queryGrResult : queryGrResultList) {
resultList.add(convert(queryGrResult));
}
return resultList;
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.dto;
import com.neotel.smfcore.custom.luxsan.api.bean.result.QueryGrStatusResult;
import com.neotel.smfcore.custom.luxsan.api.enums.QueryGrStatusEnum;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class QueryGrStatusDto {
/**
* 厂区
*/
private String plantCode;
/**
* 单据号
*/
private String grCode;
/**
* 单据行
*/
private String grItem;
/**
* 单据日期
*/
private String grDate;
/**
* 料号
*/
private String materialCode;
/**
* 厂商代码
*/
private String vendorCode;
/**
* 厂商名称
*/
private String vendorName;
/**
* 状态
*/
private String status;
/**
* 供应商
*/
private String brand;
/**
* 仓管员
*/
private String keeperCode;
/**
* 库别
*/
private String warehouseCode;
/**
* 过账代码
*/
private String udCode;
/**
* 过账数量
*/
private String udQty;
/**
* 单据数量
*/
private String lotQty;
/**
* 过账时间
*/
private String postDate;
/**
* 批次
*/
private String batchCode;
/**
* 原单据
*/
private String originGr;
/**
* 保税标识
*/
private String materialBonded;
/**
* A级物料
*/
private String materialControl;
public static QueryGrStatusDto convertQueryGrStatusResultDto(QueryGrStatusResult result){
QueryGrStatusDto queryGrStatusResultDto = new QueryGrStatusDto();
queryGrStatusResultDto.setPlantCode(result.getPLANT_CODE());
queryGrStatusResultDto.setGrCode(result.getGR_CODE());
queryGrStatusResultDto.setGrItem(result.getGR_ITEM());
queryGrStatusResultDto.setGrDate(result.getGR_DATE());
queryGrStatusResultDto.setMaterialCode(result.getMATERIAL_CODE());
queryGrStatusResultDto.setVendorCode(result.getVENDOR_CODE());
queryGrStatusResultDto.setVendorName(result.getVENDOR_NAME());
queryGrStatusResultDto.setStatus(QueryGrStatusEnum.getStatusName(result.getSTATUS()));
queryGrStatusResultDto.setBrand(result.getBRAND());
queryGrStatusResultDto.setKeeperCode(result.getKEEPER_CODE());
queryGrStatusResultDto.setWarehouseCode(result.getWAREHOUSE_CODE());
queryGrStatusResultDto.setUdCode(result.getUD_CODE());
queryGrStatusResultDto.setUdQty(result.getUD_QTY());
queryGrStatusResultDto.setLotQty(result.getLOT_QTY());
queryGrStatusResultDto.setPostDate(result.getPOST_DATE());
queryGrStatusResultDto.setBatchCode(result.getBATCH_CODE());
queryGrStatusResultDto.setOriginGr(result.getORIGIN_GR());
queryGrStatusResultDto.setMaterialBonded(result.getMATERIAL_BONDED());
queryGrStatusResultDto.setMaterialControl(result.getMATERIAL_CONTROL());
return queryGrStatusResultDto;
}
public static List<QueryGrStatusDto> convertQueryGrStatusResultDto(List<QueryGrStatusResult> queryGrStatusResultList){
List<QueryGrStatusDto> resultList = new ArrayList<>();
for (QueryGrStatusResult queryGrStatusResult : queryGrStatusResultList) {
resultList.add(convertQueryGrStatusResultDto(queryGrStatusResult));
}
return resultList;
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.dto;
import com.neotel.smfcore.custom.luxsan.api.bean.result.QueryPickingResult;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class QueryPickingDto {
// 厂区
private String plantCode;
// 挑料单号
private String pickingId;
// 线别
private String line;
// 状态
private String status;
// 原单号
private String orgPickingId;
// SMT料号
private String smtPn;
// 创建时间
private String createAt;
// 更新时间
private String updateAt;
// 更新工号
private String updateBy;
// 更新姓名
private String updateName;
private boolean checkOut = false;
public static QueryPickingDto convertQueryPickingResultDto(QueryPickingResult result){
QueryPickingDto queryPickingResultDto = new QueryPickingDto();
queryPickingResultDto.setPlantCode(result.getPLANT_CODE());
queryPickingResultDto.setPickingId(result.getPICKING_ID());
queryPickingResultDto.setLine(result.getLINE());
queryPickingResultDto.setStatus(result.getSTATUS() == 4 ? "关闭" : "其他:可发料");
queryPickingResultDto.setOrgPickingId(result.getORG_PICKING_ID());
queryPickingResultDto.setSmtPn(result.getSMT_PN());
queryPickingResultDto.setCreateAt(result.getCREATE_AT());
queryPickingResultDto.setUpdateAt(result.getUPDATE_AT());
queryPickingResultDto.setUpdateBy(result.getUPDATE_BY());
queryPickingResultDto.setUpdateName(result.getUPDATE_NAME());
queryPickingResultDto.setCheckOut(result.isCheckOut());
return queryPickingResultDto;
}
public static List<QueryPickingDto> convertQueryPickingResultDto(List<QueryPickingResult> result) {
List<QueryPickingDto> resultList = new ArrayList<>();
for (QueryPickingResult queryPickingResult : result) {
resultList.add(convertQueryPickingResultDto(queryPickingResult));
}
return resultList;
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.controller;
import com.alibaba.fastjson.JSON;
import com.neotel.smfcore.common.bean.ReelLockPosInfo;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.ReelLockPosUtil;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.api.SmfApi;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.manager.IComponentManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.luxsan.api.LuxsanApi;
import com.neotel.smfcore.custom.luxsan.api.bean.request.NewLabelToCellRequest;
import com.neotel.smfcore.custom.luxsan.api.bean.request.PickingIssueRequest;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.BindGrInfo;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.enums.LiteorderCheckType;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.util.BinCacheUtil;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.util.BoxHandleUtil;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.util.MaterialUtil;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CacheNameUtil;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CommonUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
import java.util.stream.Collectors;
@Api(tags = "设备通信")
@Slf4j
@RestController
@RequestMapping("/cdevice")
public class CDeviceController {
@Autowired
private IBarcodeManager barcodeManager;
@Autowired
private CodeResolve codeResolve;
@Autowired
private DataCache dataCache;
@Autowired
private TaskService taskService;
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private IComponentManager componentManager;
@Autowired
private SmfApi smfApi;
@Autowired
private LiteOrderCache liteOrderCache;
@Autowired
private ILiteOrderItemManager liteOrderItemManager;
@Autowired
private ILiteOrderManager liteOrderManager;
@ApiOperation("获取料盘尺寸信息")
@RequestMapping("/partNumberComponent")
@AnonymousAccess
public ResultBean partNumberComponent(@RequestBody Map<String, String> paramMap) {
Map<String, Object> resultMap = new HashMap<>();
String codeStr = paramMap.get("codeStr");
//log.info(codeStr + ":获取尺寸信息");
if (MaterialUtil.bindGr(codeStr)) {
BindGrInfo bindGrInfo = MaterialUtil.getBindGrInfo(codeStr);
if (bindGrInfo != null) {
log.info(codeStr + ":绑定GR信息为:" + JSON.toJSONString(bindGrInfo));
resultMap.put("w", bindGrInfo.getW());
resultMap.put("h", bindGrInfo.getH());
}
}
return ResultBean.newOkResult(resultMap);
}
@ApiOperation("物料放入料格")
@RequestMapping("/putInMaterialBin")
@AnonymousAccess
public synchronized ResultBean putInMaterialBin(@RequestBody Map<String, String> paramMap) {
String binCode = paramMap.get("binCode"); //料格
String codeStr = paramMap.get("codeStr"); //物料条码
String materialStr = paramMap.get("materialStr"); //料串信息
//判断入参是否为空
if (StringUtils.isEmpty(binCode)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"料格信息"});
}
if (StringUtils.isEmpty(codeStr)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"物料信息"});
}
if (StringUtils.isEmpty(materialStr)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"料串信息"});
}
//判断条码是否正常
Barcode barcode = codeResolve.resolveOneValideBarcode(codeStr);
if (barcode == null) {
return ResultBean.newErrorResult(-1, "", "物料条码无效");
}
//判断料格是否正常
Barcode binBarcode = codeResolve.resolveOneValideBarcode(binCode);
if (binBarcode == null) {
return ResultBean.newErrorResult(-1, "", "料格条码无效");
}
//判断是否存在料箱中
if (StringUtils.isNotEmpty(barcode.getPosName())) {
log.info(barcode.getBarcode() + "已经存在料格" + barcode.getPosName());
ResultBean resultBean = ResultBean.newErrorResult(101, "", barcode.getBarcode() + "已经存在料格" + barcode.getPosName());
resultBean.setData(barcode.getPosName());
return resultBean;
}
//判断是否绑定其他料串
if (!MaterialUtil.bindInfo(materialStr)) {
return ResultBean.newErrorResult(-1, "", materialStr + "没有任何绑定信息");
}
//调用禁用料信息
barcode = smfApi.canPutInAfterResolve(barcode);
//获取库别
String warhouseCode = MaterialUtil.getWarhouseCode(materialStr);
barcode.setWarehouseCode(warhouseCode);
String soucre = "";
if (MaterialUtil.bindGr(materialStr)) {
soucre = MaterialUtil.getBindGrInfo(materialStr).getGrCode();
}
List<Barcode> subCodeList = binBarcode.getSubCodeList();
if (subCodeList != null && !subCodeList.isEmpty()) {
Barcode subCode = subCodeList.get(0);
String partNumber = barcode.getPartNumber();
String provider = barcode.getProvider();
String warehouseCode = barcode.getWarehouseCode();
if (partNumber.equals(subCode.getPartNumber())
&& provider.equals(subCode.getProvider())
&& subCode.getWarehouseCode().equals(warehouseCode)) {
//判断GR信息是否相同
log.info(barcode.getBarcode()+"当前物料的来源是:"+soucre+",料格"+binBarcode.getBarcode()+"的来源是:"+binBarcode.getBarSource());
if (StringUtils.isNotEmpty(soucre)){
if (!soucre.equals(binBarcode.getBarSource())){
return ResultBean.newErrorResult(-1,"",binCode+"的来源是:"+binBarcode.getBarSource()+"与当前入库的来源:"+soucre+"不一致");
}
}
} else {
return ResultBean.newErrorResult(-1, "",
"料号:" + partNumber + ",供应商:" + provider + ",库别:" + warehouseCode
+ "与料格中的料号:" + subCode.getPartNumber() + ",供应商:" + subCode.getProvider() + "库别:" + subCode.getWarehouseCode() + "不一致");
}
}
String boxStr = BoxHandleUtil.getBoxStr(binCode);
Barcode boxBarcode = codeResolve.resolveOneValideBarcode(boxStr);
//判断隔口是否可以放入
if (BinCacheUtil.canPutInBinCode(binCode, warhouseCode)) {
if (MaterialUtil.bindGr(materialStr)){
BindGrInfo bindGrInfo = MaterialUtil.getBindGrInfo(materialStr);
LuxsanApi.newLabelToCell(new NewLabelToCellRequest(
CommonUtil.plantCode,
Arrays.asList(bindGrInfo.getUdCode()),
barcode.getAmount(),
binCode,Arrays.asList(barcode.getFullCode())
));
}
generatePutInTask(barcode, binBarcode, OP.PUT_IN, soucre, warhouseCode,boxBarcode);
return ResultBean.newOkResult("");
}
return ResultBean.newErrorResult(-1, "", barcode.getBarcode() + "不可以放到料格:" + binCode);
}
@ApiOperation("物料放入料格完成")
@RequestMapping("/finishPutInMaterialBin")
@AnonymousAccess
public ResultBean finishPutInMaterialBin(@RequestBody Map<String, String> paramMap) {
String binCode = paramMap.get("binCode");
String materialStr = paramMap.get("materialStr");
log.info("料箱或者料串已经放满,收到料格信息为" + binCode + ",料串信息为:" + materialStr);
Barcode barcode = codeResolve.resolveOneValideBarcode(binCode);
if (barcode == null) {
throw new ValidateException("smfcore.error.barcode.invalid", "{0}不是有效的条码", new String[]{binCode});
}
return ResultBean.newOkResult("");
}
@ApiOperation("清空料串信息")
@RequestMapping("/clearMaterialStr")
@AnonymousAccess
public ResultBean clearMaterialStr(String materialStr) {
if (MaterialUtil.bindGr(materialStr)) {
log.info(materialStr+"绑定GR信息,需要清空");
Map<String, BindGrInfo> cacheMap = dataCache.getCache(CacheNameUtil.CACHE_BIND_GR);
cacheMap.remove(materialStr);
dataCache.updateCache(CacheNameUtil.CACHE_BIND_GR, cacheMap);
}
return ResultBean.newOkResult("");
}
@ApiOperation("料箱入库,生成任务")
@RequestMapping("/boxIntoPos")
@AnonymousAccess
public synchronized ResultBean boxIntoPos(String boxStr) {
log.info("料箱入库开始生成任务:"+boxStr);
if (StringUtils.isEmpty(boxStr)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"料箱信息"});
}
//1.判断有没有正在执行的任务
List<DataLog> taskList = taskService.getAllTasks();
for (DataLog dataLog : taskList) {
if (boxStr.startsWith(dataLog.getBarcode())) {
if (!dataLog.isFinished() && !dataLog.isCancel()) {
if (dataLog.isPutInTask()) {
return ResultBean.newOkResult(dataLog);
} else {
return ResultBean.newErrorResult(-1, "", boxStr + "已经有出库任务,请继续入库");
}
}
}
}
//2.获取空库位
List<String> cidList = new ArrayList<>();
List<Storage> storageList = new ArrayList<>();
for (Storage storage : dataCache.getAllStorage().values()) {
storageList.add(storage);
cidList.add(storage.getCid());
}
Barcode barcode = codeResolve.resolveOneValideBarcode(boxStr);
//判断有没有在库
if (StringUtils.isNotEmpty(barcode.getPosName())){
return ResultBean.newErrorResult(-1,"",boxStr+"已经存在库位:"+barcode.getPosName());
}
StoragePos pos = taskService.findEmptyPosForPutIn(storageList, barcode, "", "");
if (pos == null) {
return ResultBean.newErrorResult(-1, "", boxStr + "未找到可用库位");
}
//3.锁定库位
Storage storage = dataCache.getStorageById(pos.getStorageId());
ReelLockPosInfo reelLocInfo = new ReelLockPosInfo();
reelLocInfo.setBarcode(barcode.getBarcode());
reelLocInfo.setCid(storage.getCid());
reelLocInfo.setLockPosName(pos.getPosName());
reelLocInfo.setLockPosId(pos.getId());
reelLocInfo = ReelLockPosUtil.addReelLockPosInfo(reelLocInfo, cidList);
if (reelLocInfo == null) {
return ResultBean.newErrorResult(-1, "", "[" + barcode.getBarcode() + "]库位[" + reelLocInfo.getLockPosName() + "]已被锁定,暂停入库", new String[]{});
}
//4.生成入库任务
DataLog dataLog = taskService.addPutInTaskToExecute(storage, barcode, pos);
return ResultBean.newOkResult(dataLog);
}
@ApiOperation("获取出库任务")
@RequestMapping("/checkOutTask")
@AnonymousAccess
public List<DataLog> boxPutIn() {
List<DataLog> needSendList = new ArrayList<>();
List<DataLog> dataLogList = taskService.getAllTasks();
for (DataLog dataLog : dataLogList) {
if (dataLog.isWait() && dataLog.isCheckOutTask()) {
needSendList.add(dataLog);
}
}
return needSendList;
}
@ApiOperation("获取每个料格出的物料信息")
@RequestMapping("/getBoxOutInfo")
@AnonymousAccess
public synchronized ResultBean getBoxOutInfo(String boxStr) {
Map<String, Long> resultMap = new HashMap<>();
Barcode barcode = codeResolve.resolveOneValideBarcode(boxStr);
List<Barcode> subCodeList = barcode.getSubCodeList();
if (subCodeList != null && !subCodeList.isEmpty()) {
resultMap = subCodeList.stream().filter(Barcode::isOut).collect(Collectors.groupingBy(Barcode::getPosName, Collectors.counting()));
}
return ResultBean.newOkResult(resultMap);
}
@ApiOperation("料格中的物料开始出库")
@RequestMapping("/reelCheckOut")
@AnonymousAccess
public synchronized ResultBean reelCheckOut(String boxStr) {
//1.解析条码内容
Barcode binCode = codeResolve.resolveOneValideBarcode(boxStr);
//解析料箱信息
String box = BoxHandleUtil.getBoxStr(binCode.getBarcode());
Barcode boxBarcode = codeResolve.resolveOneValideBarcode(box);
//2.获取要出库的code
int seq = binCode.getSeq();
Barcode barcode = null;
for (Barcode subCode : boxBarcode.getSubCodeList()) {
if (seq == subCode.getSeq() && binCode.getBarcode().equals(subCode.getPosName())) {
barcode = subCode;
break;
}
}
List<Barcode> barcodeList = new ArrayList<>();
List<Barcode> subCodeList = boxBarcode.getSubCodeList();
for (Barcode subCode : subCodeList) {
if (binCode.getBarcode().equals(subCode.getPosName())){
barcodeList.add(subCode);
}
}
//判断barcode是否为需要出库的
if (!barcode.isOut()){
log.info(barcode.getBarcode()+"不是要出库的料盘");
Barcode needOutBarcode = null;
for (Barcode subCode : barcodeList) {
if (subCode.isOut()){
needOutBarcode = subCode;
break;
}
}
if (needOutBarcode != null){
String orderItemId = needOutBarcode.getOrderItemId();
needOutBarcode.setOrderItemId("");
needOutBarcode.setOut(false);
log.info(needOutBarcode.getBarcode()+"需要改成不需要出库");
barcodeManager.save(needOutBarcode);
binCode.updateSubCodes(needOutBarcode);
boxBarcode.updateSubCodes(needOutBarcode);
barcode.setOut(true);
barcode.setOrderItemId(orderItemId);
log.info(barcode.getBarcode()+"改成要出库,orderItemId为:"+orderItemId);
}
}
//3.判断barcode是否为空
if (barcode == null) {
return ResultBean.newErrorResult(-1, "", "未找到可以出库的物料");
}
//4.开始生成出库任务
log.info(barcode.getBarcode() + "从" + binCode.getBarcode() + "出库,序列号为:" + seq);
//4.生成出库任务
int checkType = -1;
String orderItemId = barcode.getOrderItemId();
String orderId = "";
String orderNo = "";
String pkItemId = "";
String face = "";
String brand = "";
String batchCode = "";
if (StringUtils.isNotEmpty(orderItemId)){
LiteOrderItem orderItem = liteOrderItemManager.get(orderItemId);
if (orderItem != null){
orderId = orderItem.getOrderId();
orderNo = orderItem.getOrderNo();
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();
}
}
int amount = barcode.getAmount();
String posName = barcode.getPosName();
barcode.setPosName("");
barcode.setAmount(0);
binCode.setSeq(binCode.getSeq()-1);
binCode.updateSubCodes(barcode);
binCode.setAmount(binCode.getAmount() - amount);
barcodeManager.save(binCode);
binCode.setAmount(boxBarcode.getAmount() - amount);
boxBarcode.updateSubCodes(barcode);
barcodeManager.save(boxBarcode);
barcode.setAmount(amount);
DataLog dataLog = new DataLog(new Storage(), barcode, new StoragePos());
dataLog.setSubSourceId(orderItemId);
dataLog.setSourceId(orderId);
dataLog.setSourceName(orderNo);
dataLog.setType(OP.CHECKOUT);
dataLog.setStatus(OP_STATUS.FINISHED.name());
dataLog.setPosName(posName);
taskService.updateFinishedTask(dataLog);
if (checkType == LiteorderCheckType.PICKING_CHECKOUT){
LuxsanApi.pickingIssue(new PickingIssueRequest(CommonUtil.plantCode,orderNo,pkItemId,barcode.getPartNumber()
,barcode.getWarehouseCode(),brand,face,batchCode,Arrays.asList(barcode.getBarcode())));
}
return ResultBean.newOkResult("");
}
//
@ApiOperation("修改任务状态")
@RequestMapping("/updateTaskStatus")
@AnonymousAccess
public ResultBean updateTaskStatus(@RequestBody Map<String, String> paramMap) {
String boxStr = paramMap.get("boxStr");
String statusStr = paramMap.get("statusStr");
//1.判断任务是否存在
DataLog task = null;
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog dataLog : allTasks) {
if (boxStr.startsWith(dataLog.getBarcode())) {
if (!dataLog.isCancel() && !dataLog.isFinished()) {
task = dataLog;
break;
}
}
}
if (task == null) {
return ResultBean.newErrorResult(-1, "smfcore.task.notExist", "任务不存在");
}
statusStr = statusStr.toUpperCase();
log.info("更新料箱:" + boxStr + ",任务状态为:" + statusStr);
//2.判断更新状态和当前状态任务是否相同
if (task.getStatus().equals(statusStr)) {
return ResultBean.newErrorResult(-1, "smfcore.taskStatusHasUpdate", "任务{0}已经修改状态", new String[]{task.getBarcode()});
}
task.setStatus(statusStr);
//3.判断是出库,还是入库任务
if (task.isPutInTask()) {
if (OP_STATUS.FINISHED.name().equals(statusStr)) {
BoxHandleUtil.intoPos(task);
ReelLockPosUtil.removeReelLockPosInfo(task.getBarcode());
} else {
taskService.updateQueueTask(task);
}
} else {
//4.如果是出库任务
if (OP_STATUS.EXECUTING.name().equals(statusStr)) {
taskService.updateQueueTask(task);
} else {
if (!task.isOutFromPos()) {
BoxHandleUtil.outFromPos(task);
task.setOutFromPos(true);
}
taskService.updateFinishedTask(task);
}
}
return ResultBean.newOkResult("");
}
@ApiOperation("根据料箱获取目的地")
@RequestMapping("/getTargetByBox")
@AnonymousAccess
public ResultBean getTargetByBox(String boxStr){
if (StringUtils.isEmpty(boxStr)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"料箱信息"});
}
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog dataLog : allTasks) {
if (dataLog.isPutInTask() && !dataLog.isFinished() && !dataLog.isCancel()){
if (boxStr.startsWith(dataLog.getBarcode())){
return ResultBean.newOkResult(dataLog.getPosName());
}
}
}
return ResultBean.newErrorResult(-1,"","未找到"+boxStr+"的入库库位");
}
@ApiOperation("返回Barcode信息")
@RequestMapping("/getBarcode")
@AnonymousAccess
public Barcode getBarcode(@RequestBody Map<String,String> paramMap){
String codeStr = paramMap.get("codeStr");
//解析条码为barcode
Barcode barcode = codeResolve.resolveCode(codeStr);
if (barcode == null) {
return null;
}
return barcode;
}
private void generatePutInTask(Barcode barcode, Barcode binBarcode, int type, String source, String warhouseCode,Barcode boxBarcode) {
DataLog dataLog = new DataLog();
dataLog.setPosId(binBarcode.getId());
dataLog.setPosName(binBarcode.getBarcode());
dataLog.setBarcode(barcode.getBarcode());
dataLog.setW(barcode.getPlateSize());
dataLog.setH(barcode.getHeight());
dataLog.setPartNumber(barcode.getPartNumber());
dataLog.setNum(barcode.getAmount());
dataLog.setType(type);
dataLog.setStatus(OP_STATUS.FINISHED.name());
dataLog.setBatchInfo(barcode.getBatch());
dataLog.setSourceName(source);
dataLog.setWarehouseCode(warhouseCode);
int seq = binBarcode.getSeq();
seq = seq + 1;
barcode.setSeq(seq);
barcode.setWarehouseCode(warhouseCode);
barcode.setPosName(binBarcode.getBarcode());
barcode = barcodeManager.save(barcode);
binBarcode.setSeq(seq);
binBarcode.setWarehouseCode(warhouseCode);
binBarcode.setAmount(binBarcode.getAmount()+barcode.getAmount());
binBarcode.setBarSource(source);
binBarcode.updateSubCodes(barcode);
barcodeManager.save(binBarcode);
boxBarcode.updateSubCodes(barcode);
boxBarcode.setAmount(boxBarcode.getAmount()+barcode.getAmount());
barcodeManager.save(boxBarcode);
taskService.updateFinishedTask(dataLog);
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.controller;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.service.manager.IComponentManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.service.po.Component;
import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.custom.luxsan.api.LuxsanApi;
import com.neotel.smfcore.custom.luxsan.api.bean.request.BrandQtyRequest;
import com.neotel.smfcore.custom.luxsan.api.bean.request.BrandQtyResult;
import com.neotel.smfcore.custom.luxsan.api.bean.request.QueryGrRequest;
import com.neotel.smfcore.custom.luxsan.api.bean.request.QueryGrStatusRequest;
import com.neotel.smfcore.custom.luxsan.api.bean.result.QueryGrResult;
import com.neotel.smfcore.custom.luxsan.api.bean.result.QueryGrStatusResult;
import com.neotel.smfcore.custom.luxsan.api.enums.QueryGrStatusEnum;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.BindGrInfo;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.dto.QueryGrDto;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.dto.QueryGrStatusDto;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CacheNameUtil;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CommonUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@RestController
@RequestMapping("/grPutIn")
public class GrPutInController {
@Autowired
private CodeResolve codeResolve;
@Autowired
private DataCache dataCache;
@Autowired
private IComponentManager componentManager;
@ApiOperation("判断料串是否已经绑定Gr信息")
@RequestMapping("/alreadyBindGr")
@AnonymousAccess
public ResultBean alreadyBindGr(String materialStr) {
//判断GR有没有绑定成功
Map<String, BindGrInfo> cacheMap = dataCache.getCache(CacheNameUtil.CACHE_BIND_GR);
if (cacheMap != null) {
BindGrInfo bindGrInfo = cacheMap.get(materialStr);
if (bindGrInfo != null) {
return ResultBean.newErrorResult(-1, "", materialStr + "已经绑定Gr信息,单据号为:" + bindGrInfo.getGrCode() + ",单据行为:" + bindGrInfo.getGrItem());
}
}
return ResultBean.newOkResult("");
}
@ApiOperation("获取Gr列表")
@RequestMapping("/grList")
@AnonymousAccess
public ResultBean grList(@RequestBody Map<String, String> paramMap) {
//料串
String materialStr = paramMap.get("materialStr");
if (StringUtils.isEmpty(materialStr)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"料串信息"});
}
//判断GR有没有绑定成功
Map<String, BindGrInfo> cacheMap = dataCache.getCache(CacheNameUtil.CACHE_BIND_GR);
if (cacheMap != null) {
BindGrInfo bindGrInfo = cacheMap.get(materialStr);
if (bindGrInfo != null) {
return ResultBean.newErrorResult(-1, "", materialStr + "已经绑定Gr信息,单据号为:" + bindGrInfo.getGrCode() + ",单据行为:" + bindGrInfo.getGrItem());
}
}
//物料
String codeStr = paramMap.get("codeStr");
if (StringUtils.isEmpty(codeStr)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"条码信息"});
}
//解析条码为barcode
Barcode barcode = codeResolve.resolveCode(codeStr);
if (barcode == null) {
return ResultBean.newErrorResult(-1, "smfcore.error.barcode.noValidCode", "条码无效");
}
//查询GR列表
QueryGrRequest request = new QueryGrRequest(CommonUtil.plantCode, barcode.getPartNumber(), barcode.getProvider());
List<QueryGrResult> queryGrResultList = LuxsanApi.queryGr(request);
return ResultBean.newOkResult(QueryGrDto.convert(queryGrResultList));
}
@ApiOperation("获取GR已过账的列表")
@RequestMapping("/grStatus")
@AnonymousAccess
public ResultBean grStatus(@RequestBody Map<String, String> paramMap) {
//料串
String materialStr = paramMap.get("materialStr");
if (StringUtils.isEmpty(materialStr)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"料串信息"});
}
//判断GR有没有绑定成功
Map<String, BindGrInfo> cacheMap = dataCache.getCache(CacheNameUtil.CACHE_BIND_GR);
if (cacheMap != null) {
BindGrInfo bindGrInfo = cacheMap.get(materialStr);
if (bindGrInfo != null) {
return ResultBean.newErrorResult(-1, "", materialStr + "已经绑定Gr信息,单据号为:" + bindGrInfo.getGrCode() + ",单据行为:" + bindGrInfo.getGrItem());
}
}
//物料
String codeStr = paramMap.get("codeStr");
if (StringUtils.isEmpty(codeStr)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"条码信息"});
}
log.info("获取GR过账信息,料串为:"+materialStr+",物料为:"+codeStr);
//解析条码为barcode
Barcode barcode = codeResolve.resolveCode(codeStr);
if (barcode == null) {
return ResultBean.newErrorResult(-1, "smfcore.error.barcode.noValidCode", "条码无效");
}
QueryGrStatusRequest request = new QueryGrStatusRequest(CommonUtil.plantCode, barcode.getProvider(), barcode.getPartNumber(),"","");
List<QueryGrStatusResult> queryGrStatusList = LuxsanApi.queryGrStatus(request);
return ResultBean.newOkResult(QueryGrStatusDto.convertQueryGrStatusResultDto(queryGrStatusList));
}
@ApiOperation("绑定GR信息")
@RequestMapping("/bindGr")
@AnonymousAccess
public synchronized ResultBean bindGr(@RequestBody BindGrInfo info) {
String materialStr = info.getMaterialStr();
if (StringUtils.isEmpty(materialStr)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"料串信息"});
}
//判断是不是已过账状态
log.info(info.getGrCode()+"状态为:"+info.getStatus());
if (!info.getStatus().equalsIgnoreCase(QueryGrStatusEnum.getStatusName(QueryGrStatusEnum.postIn))) {
if (!info.getStatus().equalsIgnoreCase(QueryGrStatusEnum.getStatusName(QueryGrStatusEnum.lackBin))) {
return ResultBean.newErrorResult(-1, "", info.getUdCode() + "不是已过账/待上架或者未分配无库存状态,不允许绑定");
}
}
//判断GR有没有绑定成功
Map<String, BindGrInfo> cacheMap = dataCache.getCache(CacheNameUtil.CACHE_BIND_GR);
if (cacheMap != null) {
BindGrInfo bindGrInfo = cacheMap.get(materialStr);
if (bindGrInfo != null) {
return ResultBean.newErrorResult(-1, "", materialStr + "已经绑定Gr信息,单据号为:" + bindGrInfo.getGrCode() + ",单据行为:" + bindGrInfo.getGrItem());
}
} else {
cacheMap = new HashMap<>();
}
//
Component component = componentManager.findByPartNumberAndProvider(info.getMaterialCode(), info.getBrand());
if (component == null) {
BrandQtyResult result = LuxsanApi.brandQtyUrl(new BrandQtyRequest(info.getMaterialCode(), info.getBrand()));
if (result == null) {
return ResultBean.newErrorResult(-1, "", "未找到对应的尺寸信息");
}
int reelSize = result.getReel_size();
int h = 0;
if (reelSize == 7) {
h = 8;
} else if (reelSize == 13) {
h = 24;
} else if (reelSize == 15) {
h = 32;
}
info.setW(reelSize);
info.setH(h);
} else {
info.setW(component.getPlateSize());
info.setH(component.getHeight());
}
cacheMap.put(materialStr, info);
dataCache.updateCache(CacheNameUtil.CACHE_BIND_GR, cacheMap);
return ResultBean.newOkResult("");
}
@ApiOperation("GR与料串绑定信息")
@RequestMapping("/bindGrInfo")
@AnonymousAccess
public synchronized ResultBean bindGrInfo() {
Map<String, BindGrInfo> cacheMap = dataCache.getCache(CacheNameUtil.CACHE_BIND_GR);
if (cacheMap != null){
return ResultBean.newOkResult(cacheMap.values());
}
return ResultBean.newOkResult(new ArrayList<>());
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.controller;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CacheNameUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.ehcache.impl.internal.concurrent.ConcurrentHashMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@Api(tags = "手动入库")
@Slf4j
@RestController
@RequestMapping("/manual")
public class ManualPutInController {
@Autowired
private DataCache dataCache;
@ApiOperation("手动入库")
@RequestMapping("/putIn")
@AnonymousAccess
public ResultBean putIn(@RequestBody Map<String, String> paramMap) {
String materialStr = paramMap.get("materialStr");
String warehouseCode = paramMap.get("warehouseCode");
Map<String, String> cacheMap = dataCache.getCache(CacheNameUtil.CHCHE_MANUAL_PUTIN);
if (cacheMap == null) {
cacheMap = new ConcurrentHashMap<>();
}
if (cacheMap.containsKey(materialStr)) {
return ResultBean.newErrorResult(-1, "", materialStr + "已经在手动入库列表中");
}
cacheMap.put(materialStr, warehouseCode);
dataCache.updateCache(CacheNameUtil.CHCHE_MANUAL_PUTIN, cacheMap);
return ResultBean.newOkResult("");
}
@ApiOperation("手动入库信息")
@RequestMapping("/putInInfo")
@AnonymousAccess
public ResultBean ticketReturnMaterialInfo() {
Map<String, String> cacheMap = dataCache.getCache(CacheNameUtil.CHCHE_MANUAL_PUTIN);
if (cacheMap == null) {
cacheMap = new ConcurrentHashMap<>();
}
return ResultBean.newOkResult(cacheMap);
}
@ApiOperation("手动入库信息移除")
@RequestMapping("/removePutInInfo")
@AnonymousAccess
public ResultBean removePutInInfo(String materialStr) {
Map<String, String> cacheMap = dataCache.getCache(CacheNameUtil.CHCHE_MANUAL_PUTIN);
if (cacheMap == null) {
cacheMap = new ConcurrentHashMap<>();
}
cacheMap.remove(materialStr);
return ResultBean.newOkResult("");
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.controller;
import cn.hutool.core.date.DateUtil;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_SOURCE;
import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderMapper;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.custom.luxsan.api.LuxsanApi;
import com.neotel.smfcore.custom.luxsan.api.bean.request.GetPickingItemsRequest;
import com.neotel.smfcore.custom.luxsan.api.bean.request.QueryPickingRequest;
import com.neotel.smfcore.custom.luxsan.api.bean.result.GetPickingItemsResult;
import com.neotel.smfcore.custom.luxsan.api.bean.result.QueryPickingResult;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.dto.GetPickingItemsDto;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.dto.QueryPickingDto;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.enums.LiteorderCheckType;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.util.CheckOutUtil;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CommonUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
@RestController
@RequestMapping("/pkCheckOut")
public class PkCheckOutController {
@Autowired
private LiteOrderCache liteOrderCache;
@Autowired
private ILiteOrderManager liteOrderManager;
@Autowired
private OrderMapper orderMapper;
@ApiOperation("出库目的地")
@RequestMapping("/checkLoc")
@AnonymousAccess
public ResultBean checkOutLoc() {
Map<String, String> resultMap = new HashMap<>();
resultMap.put(CheckOutUtil.loc_1F,CheckOutUtil.loc_1F);
resultMap.put(CheckOutUtil.loc_C2,CheckOutUtil.loc_C2);
resultMap.put(CheckOutUtil.loc_3F,CheckOutUtil.loc_3F);
return ResultBean.newOkResult(resultMap);
}
@ApiOperation("查询pk列表")
@RequestMapping("/queryPicking")
@AnonymousAccess
public ResultBean queryPicking() {
List<QueryPickingResult> pickingResultList = LuxsanApi.queryPicking(new QueryPickingRequest(CommonUtil.plantCode));
/*for (QueryPickingResult queryPickingResult : pickingResultList) {
String pickingId = queryPickingResult.getPICKING_ID();
LiteOrder liteOrder = liteOrderCache.getLiteOrder(pickingId);
if (liteOrder == null) {
liteOrder = liteOrderManager.findByOrderNo(pickingId);
}
if (liteOrder != null && !liteOrder.isNew()){
queryPickingResult.setCheckOut(true);
}
}*/
return ResultBean.newOkResult(QueryPickingDto.convertQueryPickingResultDto(pickingResultList));
}
@ApiOperation("查询pk详情")
@RequestMapping("/getPickingItems")
@AnonymousAccess
public ResultBean getPickingItems(@RequestParam("pickingId") String pickingId) {
if (StringUtils.isEmpty(pickingId)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"pickingId"});
}
List<GetPickingItemsResult> pickingItems = LuxsanApi.getPickingItems(new GetPickingItemsRequest(CommonUtil.plantCode, pickingId));
return ResultBean.newOkResult(GetPickingItemsDto.convertGetPickingItemsResultDto(pickingItems));
}
@ApiOperation("pk出库")
@RequestMapping("/checkOut")
//@AnonymousAccess
public ResultBean checkOut(@RequestParam("pickingId") String pickingId,
@RequestParam("confirmExcess") boolean confirmExcess,
@RequestParam("loc") String loc) {
List<QueryPickingResult> resultList = LuxsanApi.queryPicking(new QueryPickingRequest(CommonUtil.plantCode));
for (QueryPickingResult result : resultList) {
if (result.getPICKING_ID().equals(pickingId)){
if (result.getSTATUS() == 4) {
return ResultBean.newErrorResult(-1, "", pickingId + "已经关闭,不允许发料");
}
}
}
//1.判断是否存在
LiteOrder liteOrder = liteOrderCache.getLiteOrder(pickingId);
if (liteOrder == null) {
liteOrder = liteOrderManager.findByOrderNo(pickingId);
}
if (liteOrder != null) {
if (!liteOrder.isTaskFinished() && !liteOrder.isNew()) {
return ResultBean.newErrorResult(-1, "", pickingId + "正在执行中,不允许出库");
}
//2.如果存在,改个名字
liteOrder.setOrderNo(liteOrder.getOrderNo() + DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
liteOrderManager.createWithItems(liteOrder);
}
//3.获取pk详情
GetPickingItemsRequest request = new GetPickingItemsRequest(CommonUtil.plantCode, pickingId);
List<GetPickingItemsResult> pickingItemList = LuxsanApi.getPickingItems(request);
//4.循环新建工单
List<LiteOrderItem> itemList = new ArrayList<>();
for (GetPickingItemsResult pkItem : pickingItemList) {
LiteOrderItem item = new LiteOrderItem();
item.setPlantCode(pkItem.getPLANT_CODE());
item.setItemId(pkItem.getITEM_ID());
item.setPickingId(pkItem.getPICKING_ID());
item.setMaterialCode(pkItem.getMATERIAL_CODE());
item.setPn(pkItem.getMATERIAL_CODE());
item.setWarehouse(pkItem.getWAREHOUSE());
item.setWarehouseCode(pkItem.getWAREHOUSE());
item.setReqQty(pkItem.getREQ_QTY());
item.setReqReel(pkItem.getREQ_REEL());
item.setCpQty(pkItem.getCP_QTY());
item.setCpReel(pkItem.getCP_REEL());
item.setIssuedQty(pkItem.getISSUED_QTY());
item.setIssuedReel(pkItem.getISSUED_REEL());
item.setRetQty(pkItem.getRET_QTY());
item.setFace(pkItem.getFACE());
item.setBatchCode(pkItem.getBATCH_CODE());
item.setBrand(pkItem.getBRAND());
item.setCreateAt(pkItem.getCREATE_AT());
item.setUpdateAt(pkItem.getUPDATE_AT());
item.setMo(pkItem.getMO());
item.setBinCode(pkItem.getBIN_CODE());
//需要发料的数量
int needNum = pkItem.getREQ_QTY() - pkItem.getCP_QTY() - pkItem.getISSUED_QTY() + pkItem.getRET_QTY();
item.setNeedNum(needNum);
//需要发料的卷数
int needReelCount = pkItem.getREQ_REEL() - pkItem.getCP_REEL() + (pkItem.getRET_QTY() > 0 ? pkItem.getRET_QTY() : 0);
item.setNeedReelCount(needReelCount);
itemList.add(item);
}
//5.创建工单
LiteOrder newOrder = new LiteOrder();
newOrder.setOrderNo(pickingId);
newOrder.setSource(LITEORDER_SOURCE.OUTTER.name());
newOrder.setConfirmExcess(confirmExcess);
newOrder.setOrderItems(itemList);
newOrder.setLoc(loc);
newOrder.setCheckType(LiteorderCheckType.PICKING_CHECKOUT);
newOrder = liteOrderManager.createWithItems(newOrder);
liteOrderCache.addOrderToMap(newOrder);
//6.执行工单出库
String result = liteOrderCache.checkOutLiteOrderOut(pickingId, false, null);
if (StringUtils.isNotEmpty(result)){
return ResultBean.newErrorResult(-1,"", MessageUtils.getText(result,new Locale(SecurityUtils.getCurrentUserLanguage()),result));
}
return ResultBean.newOkResult("");
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.controller;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CacheNameUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.ehcache.impl.internal.concurrent.ConcurrentHashMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
@Api(tags = "W2 1F储位移转")
@Slf4j
@RequestMapping("/storTransfer")
@RestController
public class StorTransferController {
@Autowired
private DataCache dataCache;
@ApiOperation("刷料串,进行转移")
@RequestMapping("/inputMaterial")
@AnonymousAccess
public ResultBean inputMaterial(String materialStr, String warehouseCode) {
if (StringUtils.isEmpty(materialStr)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"料串信息"});
}
if (StringUtils.isEmpty(warehouseCode)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"库别信息"});
}
log.info(materialStr + "进行储位转移,库别为:" + warehouseCode);
//1.判断料仓信息是否在储位转移中
Map<String, String> cacheMap = dataCache.getCache(CacheNameUtil.CHCHE_STOR_TRANSFER);
if (cacheMap == null) {
cacheMap = new ConcurrentHashMap<>();
}
if (cacheMap.get(materialStr) != null) {
return ResultBean.newErrorResult(-1, "", materialStr + "已经在储位转移列表中");
}
cacheMap.put(materialStr, warehouseCode);
dataCache.updateCache(CacheNameUtil.CHCHE_STOR_TRANSFER, cacheMap);
return ResultBean.newOkResult("");
}
@ApiOperation("储位转移信息")
@RequestMapping("/transferInfo")
@AnonymousAccess
public ResultBean transferInfo() {
//1.判断料仓信息是否在储位转移中
Map<String, String> cacheMap = dataCache.getCache(CacheNameUtil.CHCHE_STOR_TRANSFER);
if (cacheMap == null){
cacheMap = new ConcurrentHashMap<>();
}
return ResultBean.newOkResult(cacheMap);
}
@ApiOperation("移除料串信息")
@RequestMapping("/removeMaterial")
@AnonymousAccess
public ResultBean removeMaterial(String materialStr) {
//1.判断料仓信息是否在储位转移中
Map<String, String> cacheMap = dataCache.getCache(CacheNameUtil.CHCHE_STOR_TRANSFER);
if (cacheMap == null){
cacheMap = new ConcurrentHashMap<>();
}
cacheMap.remove(materialStr);
return ResultBean.newOkResult(cacheMap);
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.controller;
import com.alibaba.fastjson.JSONObject;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.custom.luxsan.api.LuxsanApi;
import com.neotel.smfcore.custom.luxsan.api.bean.request.FetchMoveTicketRequest;
import com.neotel.smfcore.custom.luxsan.api.bean.result.FetchMoveTicketResult;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.TicketReturn;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.dto.FetchMoveTicketDto;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CacheNameUtil;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CommonUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.ehcache.impl.internal.concurrent.ConcurrentHashMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
@Api(tags = "931单据领料和932单据退料")
@Slf4j
@RestController
@RequestMapping("/ticket")
public class TicketController {
@Autowired
private DataCache dataCache;
@ApiOperation("拉取单据信息")
@RequestMapping("/fetchTicket")
@AnonymousAccess
public ResultBean fetchTicket(String ticket) {
List<FetchMoveTicketResult> ticketList = LuxsanApi.fetchMoveTicket(new FetchMoveTicketRequest(CommonUtil.plantCode, ticket));
return ResultBean.newOkResult(FetchMoveTicketDto.convertFetchMoveTicketDto(ticketList));
}
@ApiOperation("单据领料")
@RequestMapping("/checkOut")
@AnonymousAccess
public ResultBean checkOut(String ticket) {
return ResultBean.newOkResult("");
}
@ApiOperation("单据退料")
@RequestMapping("/ticketReturn")
@AnonymousAccess
public ResultBean ticketReturn(@RequestBody Map<String,String> paramMap) {
String ticket = paramMap.get("ticket");
String materialStr = paramMap.get("materialList");
String ticketItem = paramMap.get("ticketItem");
String warehouseCode = paramMap.get("warehouseCode");
Map<String, TicketReturn> cacheMap = dataCache.getCache(CacheNameUtil.CHCHE_TICKET_RETURN);
if (cacheMap == null) {
cacheMap = new ConcurrentHashMap<>();
}
List<String> materialList = JSONObject.parseArray(materialStr, String.class);
for (String material : materialList) {
if (cacheMap.containsKey(material)) {
return ResultBean.newErrorResult(-1, "", materialStr + "已经绑定单据:" + cacheMap.get(materialStr));
}
}
for (String material : materialList) {
cacheMap.put(material, new TicketReturn(material,ticket,ticketItem,warehouseCode));
}
dataCache.updateCache(CacheNameUtil.CHCHE_TICKET_RETURN, cacheMap);
return ResultBean.newOkResult("");
}
@ApiOperation("单据退料料串绑定信息")
@RequestMapping("/ticketReturnMaterialInfo")
@AnonymousAccess
public ResultBean ticketReturnMaterialInfo() {
Map<String, TicketReturn> cacheMap = dataCache.getCache(CacheNameUtil.CHCHE_TICKET_RETURN);
if (cacheMap == null) {
cacheMap = new ConcurrentHashMap<>();
}
return ResultBean.newOkResult(cacheMap.values());
}
@ApiOperation("单据退料移除料串绑定信息")
@RequestMapping("/ticketReturnRemoveMaterialInfo")
@AnonymousAccess
public ResultBean ticketReturnRemoveMaterialInfo(String materialStr) {
Map<String, TicketReturn> cacheMap = dataCache.getCache(CacheNameUtil.CHCHE_TICKET_RETURN);
if (cacheMap == null) {
cacheMap = new ConcurrentHashMap<>();
}
cacheMap.remove(materialStr);
return ResultBean.newOkResult("");
}
@ApiOperation("单据转库")
@RequestMapping("/ticketTransfer")
@AnonymousAccess
public ResultBean ticketTransfer(@RequestBody Map<String, String> paramMap) {
String ticketCode = paramMap.get("ticketCode");
String ticketItem = paramMap.get("ticketItem");
String materialStr = paramMap.get("materialList");
String warehouseCode = paramMap.get("warehouseCode");
log.info("收到单据号:"+ticketCode+",单据行:"+ticketItem+",料串信息为:"+materialStr+",库别为:"+warehouseCode);
List<String> materialList = JSONObject.parseArray(materialStr, String.class);
return ResultBean.newOkResult("");
}
@ApiOperation("单据转库返回结果")
@RequestMapping("/ticketTransferResult")
@AnonymousAccess
public PageData ticketTransferResult(Pageable pageable) {
PageData pageData = new PageData();
List<Map<String,Object>> content = new ArrayList<>();
for (int i = 0; i < 50; i++) {
Map<String,Object> map = new HashMap<>();
map.put("material","123");
map.put("ticketCode","ticketCode");
map.put("ticketItem","ticketItem");
map.put("binCode","binCode");
map.put("result","123");
map.put("warehouseCode","warehouseCode"+i);
content.add(map);
}
pageData.setContent(content);
pageData.setTotalElements(100);
return pageData;
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.enums;
public class LiteorderCheckType {
public static final int PICKING_CHECKOUT = 1;
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.util;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.custom.luxsan.api.LuxsanApi;
import com.neotel.smfcore.custom.luxsan.api.bean.request.QueryBinRequest;
import com.neotel.smfcore.custom.luxsan.api.bean.request.UpdateBinRequest;
import com.neotel.smfcore.custom.luxsan.api.bean.result.QueryBinResult;
import com.neotel.smfcore.custom.luxsan.api.enums.BinEnum;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CacheNameUtil;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CommonUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class BinCacheUtil {
private static DataCache dataCache;
private static long binCodeUpdateTime = 0l;
@Autowired
private void setDataCache(DataCache cache){
BinCacheUtil.dataCache = cache;
}
public static boolean canPutInBinCode(String binCode, String warehouseCode) {
Map<String, String> cacheMap = new HashMap<>();
if (binCodeUpdateTime == 0l || (System.currentTimeMillis() - binCodeUpdateTime >= 1000 * 60 * 60)) {
List<QueryBinResult> resultList = LuxsanApi.queryBin(new QueryBinRequest(CommonUtil.plantCode, BinEnum.STORAGE_TYPE_C, BinEnum.BIN_STATUS_0, warehouseCode));
for (QueryBinResult result : resultList) {
cacheMap.put(result.getBIN_CODE(), result.getWAREHOUSE_CODE());
}
List<QueryBinResult> useBinResultList = LuxsanApi.queryBin(new QueryBinRequest(CommonUtil.plantCode, BinEnum.STORAGE_TYPE_C, BinEnum.BIN_STATUS_1, warehouseCode));
for (QueryBinResult result : useBinResultList) {
cacheMap.put(result.getBIN_CODE(), result.getWAREHOUSE_CODE());
}
binCodeUpdateTime = System.currentTimeMillis();
dataCache.updateCache(CacheNameUtil.CHCHE_QUERY_BIN, cacheMap);
} else {
cacheMap = dataCache.getCache(CacheNameUtil.CHCHE_QUERY_BIN);
}
//判断code是否相同
String code = cacheMap.get(binCode);
if (StringUtils.isNotEmpty(code)) {
if (code.equals(warehouseCode)) {
//binCodeUpdateTime = System.currentTimeMillis();
return true;
} else {
LuxsanApi.updateBin(new UpdateBinRequest(CommonUtil.plantCode, binCode, warehouseCode, BinEnum.STORAGE_TYPE_C));
cacheMap.put(binCode, warehouseCode);
dataCache.updateCache(CacheNameUtil.CHCHE_QUERY_BIN, cacheMap);
binCodeUpdateTime = System.currentTimeMillis();
return true;
}
}
return false;
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.util;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
@Slf4j
@Service
public class BoxHandleUtil {
private static IBarcodeManager barcodeManager;
@Autowired
public void setBarcodeManager(IBarcodeManager manager) {
BoxHandleUtil.barcodeManager = manager;
}
private static IStoragePosManager storagePosManager;
@Autowired
public void setStoragePosManager(IStoragePosManager manager) {
BoxHandleUtil.storagePosManager = manager;
}
private static DataCache dataCache;
@Autowired
public void setDataCache(DataCache cache) {
BoxHandleUtil.dataCache = cache;
}
private static TaskService taskService;
@Autowired
public void setTaskService(TaskService service) {
BoxHandleUtil.taskService = service;
}
public static void intoPos(DataLog opTask) {
//已完成,加入库存,并且从完成队列中清除
StoragePos storagePos = storagePosManager.get(opTask.getPosId());
//二维码状态
Barcode barcode = barcodeManager.findByBarcode(opTask.getBarcode());
if (barcode != null) {
barcode.setUsedCount(barcode.getUsedCount() + 1);
barcode.setPutInTime(System.currentTimeMillis());
barcode.setInOpor("");
barcode.setCheckOutDate(null, "");
barcode.setPosName(opTask.getPosName());
barcode = barcodeManager.save(barcode);
}
storagePos.setBarcode(barcode);
storagePos.setUsed(true);
storagePos.setCanCheckOutTime(System.currentTimeMillis());
storagePosManager.save(storagePos);
taskService.moveTaskToFinished(opTask);
taskService.updateFinishedTask(opTask);
}
public static void outFromPos(DataLog opTask) {
//从队列里面移除操作
taskService.removeQueueTask(opTask);
StoragePos storagePos = storagePosManager.get(opTask.getPosId());
Barcode barcode = storagePos.getBarcode();
if (barcode == null) {
log.warn("任务:" + opTask.getId() + " 仓位:" + opTask.getPosId() + " 的 Barcode 为null, 之前可能处理过,结束任务后直接返回");
return;
}
barcode = barcodeManager.get(barcode.getId());
if (barcode != null) {
//二维码状态
barcode.setUsed(true);
barcode.setUsedDate(new Date());
//仓位状态
barcode.setCheckOutDate(new Date(), "");
barcode.setPosName("");
barcodeManager.save(barcode);
}
storagePos.setBarcode(null);
storagePos.setUsed(false);
storagePosManager.save(storagePos);
log.info("出库完成,清空仓位: " + storagePos.getId() + "[" + storagePos.getPosName() + "]");
taskService.moveTaskToFinished(opTask);
}
public static String getBoxStr(String code) {
if (code.endsWith("A") || code.endsWith("B")) {
code = code.substring(0, code.length() - 1);
code = code + "A";
}
if (code.contains("-")) {
code = code.substring(0, code.indexOf("-"));
code = code + "A";
}
return code;
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.util;
public class CheckOutUtil {
public static final String loc_C2 = "C2/3F/BG";
public static final String loc_3F = "C2/3F/CG";
public static final String loc_1F = "W2/1F";
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.util;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.BindGrInfo;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.TicketReturn;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CacheNameUtil;
import org.ehcache.impl.internal.concurrent.ConcurrentHashMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Component
public class MaterialUtil {
private static DataCache dataCache;
@Autowired
private void setDataCache(DataCache cache){
MaterialUtil.dataCache = cache;
}
public static boolean bindInfo(String materialStr) {
return bindGr(materialStr) || storTransfer(materialStr) || ticketReturn(materialStr) || manualPutIn(materialStr);
}
public static String getWarhouseCode(String materialStr) {
if (bindGr(materialStr)){
BindGrInfo bindGrInfo = getBindGrInfo(materialStr);
return bindGrInfo.getWarehouseCode();
} else if (storTransfer(materialStr)){
return getStorTransferInfo(materialStr);
} else if (ticketReturn(materialStr)){
TicketReturn returnInfo = getTicketReturnInfo(materialStr);
return returnInfo.getWarehouseCode();
} else if (manualPutIn(materialStr)){
return getManualPutInInfo(materialStr);
}
return "";
}
//是否绑定gr
public static boolean bindGr(String materialStr) {
Map<String, BindGrInfo> cacheMap = dataCache.getCache(CacheNameUtil.CACHE_BIND_GR);
if (cacheMap != null) {
if (cacheMap.get(materialStr) != null) {
return true;
}
}
return false;
}
public static BindGrInfo getBindGrInfo(String materialStr) {
Map<String, BindGrInfo> cacheMap = dataCache.getCache(CacheNameUtil.CACHE_BIND_GR);
if (cacheMap != null) {
if (cacheMap.get(materialStr) != null) {
return cacheMap.get(materialStr);
}
}
return null;
}
//是否储位转移
public static boolean storTransfer(String materialStr) {
//1.判断料仓信息是否在储位转移中
Map<String, String> cacheMap = dataCache.getCache(CacheNameUtil.CHCHE_STOR_TRANSFER);
if (cacheMap == null) {
cacheMap = new ConcurrentHashMap<>();
}
if (cacheMap.get(materialStr) != null) {
return true;
}
return false;
}
public static String getStorTransferInfo(String materialStr) {
Map<String, String> cacheMap = dataCache.getCache(CacheNameUtil.CHCHE_STOR_TRANSFER);
if (cacheMap != null) {
if (cacheMap.get(materialStr) != null) {
return cacheMap.get(materialStr);
}
}
return null;
}
//是否单据退料
public static boolean ticketReturn(String materialStr){
Map<String, TicketReturn> cacheMap = dataCache.getCache(CacheNameUtil.CHCHE_TICKET_RETURN);
if (cacheMap != null) {
if (cacheMap.get(materialStr) != null){
return true;
}
}
return false;
}
public static TicketReturn getTicketReturnInfo(String materialStr) {
Map<String, TicketReturn> cacheMap = dataCache.getCache(CacheNameUtil.CHCHE_TICKET_RETURN);
if (cacheMap != null) {
if (cacheMap.get(materialStr) != null){
return cacheMap.get(materialStr);
}
}
return null;
}
//是否手动入库
public static boolean manualPutIn(String materialStr) {
Map<String, String> cacheMap = dataCache.getCache(CacheNameUtil.CHCHE_MANUAL_PUTIN);
if (cacheMap != null) {
if (cacheMap.containsKey(materialStr)) {
return true;
}
}
return false;
}
public static String getManualPutInInfo(String materialStr) {
Map<String, String> cacheMap = dataCache.getCache(CacheNameUtil.CHCHE_MANUAL_PUTIN);
if (cacheMap != null) {
if (cacheMap.get(materialStr) != null) {
return cacheMap.get(materialStr);
}
}
return null;
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.util;
public class CacheNameUtil {
public static final String CACHE_BIND_GR = "CACHE_BIND_GR";
public static final String CHCHE_QUERY_BIN = "CHCHE_QUERY_BIN";
public static final String CHCHE_STOR_TRANSFER = "CHCHE_STOR_TRANSFER";
public static final String CHCHE_TICKET_RETURN = "CHCHE_TICKET_RETURN";
public static final String CHCHE_MANUAL_PUTIN = "CHCHE_MANUAL_PUTIN";
}
package com.neotel.smfcore.custom.luxsan.factory_c.util;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class CommonUtil {
public static String plantCode;
@Value("${luxsan.plantCode}")
private void setPlantCode(String code){
CommonUtil.plantCode = code;
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.wipstor.bean;
import lombok.Data;
import java.util.List;
@Data
public class OdnOut {
private String odn;
private List<String> boxList;
}
package com.neotel.smfcore.custom.luxsan.factory_c.wipstor.bean.dto;
import com.neotel.smfcore.custom.luxsan.api.bean.result.FetchShipmentInfoResult;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class FetchShipmentInfoDto {
/**
* 行ID
*/
private String rtvId;
/**
* 工厂代码
*/
private String plantCode;
/**
* 出货单号
*/
private String ticketCode;
/**
* 单据行号
*/
private String ticketItem;
/**
* 料号
*/
private String materialCode;
/**
* 物料类型
*/
private String materialType;
/**
* 仓库代码
*/
private String warehouseCode;
/**
* 供应商代码
*/
private String vendorCode;
/**
* 单据数量
*/
private int qty;
/**
* 单位
*/
private String unit;
/**
* 状态
*/
private String status;
/**
* 原数量
*/
private int originQty;
/**
* 制造商
*/
private int manufacture;
/**
* 报关模式
*/
private String importMode;
/**
* 进口编号
*/
private String importCode;
/**
* 收货工厂
*/
private String shipTo;
public static FetchShipmentInfoDto convertFetchShipmentInfoDto(FetchShipmentInfoResult result) {
FetchShipmentInfoDto dto = new FetchShipmentInfoDto();
dto.setRtvId(result.getRTV_ID());
dto.setPlantCode(result.getPLANT_CODE());
dto.setTicketCode(result.getTICKET_CODE());
dto.setTicketItem(result.getTICKET_ITEM());
dto.setMaterialCode(result.getMATERIAL_CODE());
dto.setMaterialType(result.getMATERIAL_TYPE());
dto.setWarehouseCode(result.getWAREHOUSE_CODE());
dto.setVendorCode(result.getVENDOR_CODE());
dto.setQty(result.getQTY());
dto.setUnit(result.getUNIT());
dto.setStatus(result.getSTATUS());
dto.setOriginQty(result.getORIGIN_QTY());
dto.setManufacture(result.getMANUFACTURE());
dto.setImportMode(result.getIMPORT_MODE());
dto.setImportCode(result.getIMPORT_CODE());
dto.setShipTo(result.getSHIP_TO());
return dto;
}
public static List<FetchShipmentInfoDto> convertFetchShipmentInfoDto(List<FetchShipmentInfoResult> resultList){
List<FetchShipmentInfoDto> dtoResultList = new ArrayList<>();
for (FetchShipmentInfoResult result : resultList) {
dtoResultList.add(convertFetchShipmentInfoDto(result));
}
return dtoResultList;
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.wipstor.controller;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ApiOperation("AGV设备端")
@RestController
@RequestMapping("/agvDevice")
public class AgvDeviceController {
}
package com.neotel.smfcore.custom.luxsan.factory_c.wipstor.controller;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.luxsan.api.LuxsanApi;
import com.neotel.smfcore.custom.luxsan.api.bean.request.FetchPalletInfoRequest;
import com.neotel.smfcore.custom.luxsan.api.bean.request.ValidCartonRequest;
import com.neotel.smfcore.custom.luxsan.api.bean.result.FetchPalletInfoResult;
import com.neotel.smfcore.custom.luxsan.api.bean.result.ValidCartonResult;
import com.neotel.smfcore.custom.luxsan.api.enums.PalletEnum;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CommonUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Api(tags = "流水线接口")
@Slf4j
@RestController
@RequestMapping("/line")
public class LineController {
@Autowired
private DataCache dataCache;
@Autowired
private CodeResolve codeResolve;
@Autowired
private IBarcodeManager barcodeManager;
@Autowired
private IDataLogManager dataLogManager;
@Autowired
private TaskService taskService;
/**
* 线体第一个扫码器扫码调用
*/
@ApiOperation("校验箱号")
@RequestMapping("/validCarton")
@AnonymousAccess
public ResultBean validCarton(@RequestBody Map<String, String> paramMap) {
String cartonId = paramMap.get("cartonId");
//1.解析条码
Barcode barcode = codeResolve.resolveCode(cartonId);
if (barcode == null) {
return ResultBean.newErrorResult(-1, "smfcore.error.barcode.invalid", "条码无效");
}
try {
ValidCartonResult result = LuxsanApi.validCarton(new ValidCartonRequest("", cartonId, CommonUtil.plantCode));
//设置barcode的其他参数
barcode.setPlantCode(result.getPLANT());
barcode.setCartonId(result.getCARTON_ID());
barcode.setPalletId(result.getPALLET_ID());
barcode.setPn(result.getPN());
barcode.setModelFamily(result.getMODEL_FAMILY());
barcode.setMaterialType(result.getMATERIAL_TYPE());
barcode.setWarehouseCode(result.getWAREHOUSE_CODE());
barcode.setHold(result.getHOLD());
barcode.setQty(result.getQTY());
barcode.setFullQty(result.getFULL_QTY());
barcode.setPackType(result.getPACK_TYPE());
barcode.setCreateAt(result.getCREATE_AT());
barcode.setRegion(result.getREGION());
barcode.setStatus(result.getSTATUS());
barcode = barcodeManager.save(barcode);
} catch (Exception e) {
return ResultBean.newErrorResult(-1, "", e.getMessage());
}
return ResultBean.newOkResult("");
}
/**
* 线体第二个扫码器扫码调用,判断是否过账
*/
@ApiOperation("获取栈板信息")
@RequestMapping("/fetchPalletInfo")
@AnonymousAccess
public ResultBean fetchPalletInfo(@RequestBody Map<String, String> paramMap) {
String cartonId = paramMap.get("cartonId");
//1.解析条码
Barcode barcode = codeResolve.resolveCode(cartonId);
if (barcode == null) {
return ResultBean.newErrorResult(-1, "smfcore.error.barcode.invalid", "条码无效");
}
String palletId = barcode.getPalletId();
//2.请求接口判断是否过账
try {
FetchPalletInfoResult fetchPalletInfo = null;
List<FetchPalletInfoResult> fetchPalletList = LuxsanApi.fetchPalletInfo(new FetchPalletInfoRequest("", CommonUtil.plantCode, Arrays.asList(palletId)));
for (FetchPalletInfoResult result : fetchPalletList) {
if (palletId.equals(result.getPALLET_ID())){
fetchPalletInfo = result;
break;
}
}
if (fetchPalletInfo != null){
if (fetchPalletInfo.getSTATUS() == PalletEnum.INVENTORY_IN_WAREHOUSE){
return ResultBean.newOkResult("");
}
}
} catch (Exception e) {
return ResultBean.newErrorResult(-1, "", e.getMessage());
}
return ResultBean.newErrorResult(-1,"",cartonId+"未获取到对应的过账信息");
}
/**
* 判断是否为最后一箱
*/
@ApiOperation("判断是否为最后一箱")
@RequestMapping("/odnReCartonQty")
@AnonymousAccess
public ResultBean odnReCartonQty(@RequestBody Map<String, String> paramMap) {
String cartonId = paramMap.get("cartonId");
DataLog dataLog = dataLogManager.findOne(new Query(Criteria.where("barcode").is(cartonId).and("type").is(OP.CHECKOUT)));
if (dataLog != null) {
if (dataLog.isCheckOutTask() && dataLog.isFinished()) {
String sourceId = dataLog.getSourceId();
if (StringUtils.isNotEmpty(sourceId)) {
int qty = 0;
Map<String, Object> resultMap = new HashMap<>();
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog task : allTasks) {
if (task.isCheckOutTask() && !task.isCancel() && !task.isFinished()) {
if (sourceId.equals(task.getSourceId())) {
qty++;
}
}
}
resultMap.put("odn", sourceId);
resultMap.put("qty", qty);
return ResultBean.newOkResult(resultMap);
}
}
}
return ResultBean.newErrorResult(-1, "", "未找到对应的信息");
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.wipstor.controller;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.luxsan.api.LuxsanApi;
import com.neotel.smfcore.custom.luxsan.api.bean.request.FetchShipmentInfoRequest;
import com.neotel.smfcore.custom.luxsan.api.bean.result.FetchShipmentInfoResult;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CommonUtil;
import com.neotel.smfcore.custom.luxsan.factory_c.wipstor.bean.OdnOut;
import com.neotel.smfcore.custom.luxsan.factory_c.wipstor.bean.dto.FetchShipmentInfoDto;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@Api(tags = "半成品出库")
@Slf4j
@RestController
@RequestMapping("/wipStorCheckOut")
public class WipStorCheckOutController {
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private LiteOrderCache liteOrderCache;
@Autowired
private ILiteOrderManager liteOrderManager;
@Autowired
private TaskService taskService;
@ApiOperation("获取ODN详情")
@RequestMapping("/getOdnDetail")
@AnonymousAccess
public ResultBean getOdnDetail(String odn) {
List<FetchShipmentInfoResult> resultList = LuxsanApi.fetchShipmentInfo(new FetchShipmentInfoRequest(CommonUtil.plantCode, odn));
return ResultBean.newOkResult(FetchShipmentInfoDto.convertFetchShipmentInfoDto(resultList));
}
@ApiOperation("判断料箱是否在库")
@RequestMapping("boxInStor")
@AnonymousAccess
public ResultBean boxInStor(String odn, String box) {
StoragePos pos = storagePosManager.getByBarcode(box);
if (pos == null) {
return ResultBean.newErrorResult(-1, "", box + "不在库");
}
//判断是否锁定其他工单
Barcode barcode = pos.getBarcode();
if (StringUtils.isNotEmpty(barcode.getLockName()) && !barcode.getLockName().equals(odn)) {
return ResultBean.newErrorResult(-1, "", box + "已经锁定odn:" + barcode.getLockName());
}
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog dataLog : allTasks) {
if (dataLog.getBarcode().equals(box)) {
if (!dataLog.isFinished() && !dataLog.isCancel()) {
return ResultBean.newErrorResult(-1, "", box + "有正在执行中的任务");
}
}
}
return ResultBean.newOkResult("");
}
@ApiOperation("ODN出库")
@RequestMapping("/odnOut")
@AnonymousAccess
public synchronized ResultBean odnOut(@RequestBody OdnOut odnOut) {
String odn = odnOut.getOdn();
List<String> boxList = odnOut.getBoxList();
//1.判断是否正在执行中
LiteOrder liteOrder = liteOrderCache.getLiteOrder(odn);
if (liteOrder == null) {
liteOrder = liteOrderManager.findByOrderNo(odn);
}
if (liteOrder != null) {
if (!liteOrder.isTaskFinished()) {
return ResultBean.newErrorResult(-1, "", odn + "任务未结束");
}
liteOrder.setOrderNo(odn + "_bak_" + System.currentTimeMillis());
liteOrderManager.createWithItems(liteOrder);
}
//2.生成工单任务
LiteOrder newOrder = new LiteOrder();
List<LiteOrderItem> itemList = new ArrayList<>();
List<FetchShipmentInfoResult> resultList = LuxsanApi.fetchShipmentInfo(new FetchShipmentInfoRequest(CommonUtil.plantCode, odn));
for (FetchShipmentInfoResult result : resultList) {
LiteOrderItem orderItem = new LiteOrderItem();
orderItem.setRtvId(result.getRTV_ID());
orderItem.setPlantCode(result.getPLANT_CODE());
orderItem.setTicketCode(result.getTICKET_CODE());
orderItem.setTicketItem(result.getTICKET_ITEM());
orderItem.setMaterialCode(result.getMATERIAL_CODE());
orderItem.setWarehouseCode(result.getWAREHOUSE_CODE());
orderItem.setVendorCode(result.getVENDOR_CODE());
orderItem.setQty(result.getQTY());
orderItem.setUnit(result.getUNIT());
orderItem.setStatus(result.getSTATUS());
orderItem.setOriginQty(result.getORIGIN_QTY());
orderItem.setManufacture(result.getMANUFACTURE());
orderItem.setImportMode(result.getIMPORT_MODE());
orderItem.setImportCode(result.getIMPORT_CODE());
orderItem.setShipTo(result.getSHIP_TO());
orderItem.setPn(result.getMATERIAL_CODE());
orderItem.setNeedNum(result.getQTY());
itemList.add(orderItem);
}
newOrder.setOrderNo(odn);
newOrder.setOrderItems(itemList);
newOrder = liteOrderManager.createWithItems(newOrder);
liteOrderCache.addOrderToMap(newOrder);
liteOrderCache.findNeedOutBox(odn, boxList);
return ResultBean.newOkResult("");
}
}
package com.neotel.smfcore.custom.luxsan.third.controller;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@RestController
@RequestMapping("/material/api")
public class MaterialRestController {
public static final String CACHE_MATERIAL_LOC = "CACHE_MATERIAL_LOC";
@Autowired
private DataCache dataCache;
@ApiOperation("更新料串位置")
@RequestMapping("/updateLoc")
@AnonymousAccess
public ResultBean updateLoc(@RequestBody Map<String,String> paramMap){
String materialStr = paramMap.get("materialStr");
String loc = paramMap.get("loc");
//log.info("收到料串位置更新,料串为:"+materialStr+",位置为:"+loc);
Map<String,String> cacheMap = dataCache.getCache(CACHE_MATERIAL_LOC);
if (cacheMap == null){
cacheMap = new HashMap<>();
}
cacheMap.put(materialStr,loc);
dataCache.updateCache(CACHE_MATERIAL_LOC,cacheMap);
return ResultBean.newOkResult("");
}
}
#厂区名称
luxsan:
plantCode: W339
#C区配置文件
api:
name: luxsan
#禁用料
inCheckUrl: http://10.190.25.124:8001/Npm/WmsCheckReelfob
#储位查询
queryBin: http://10.68.30.22:8082/api/mlb/QueryBin
#更新储位
updateBin: http://10.68.30.22:8082/api/mlb/UpdateBin
#GR查询
queryGr: http://10.68.30.22:8082/api/mlb/QueryGR
#校验DC有效期
getInDate: http://10.68.30.22:8082/api/mes/GetInDate
#GR过账状态查询
queryGrStatus: http://10.68.30.22:8082/api/mlb/QueryGrStatus
#按GR生成标签码并上架
newLabelToCell: http://10.68.30.22:8082/api/mlb/NewLabelToCell
#电子料入退库
backToWarehouse: http://10.68.30.22:8082/api/mlb/BackToWarehouse
#Tower发料
towerIssue: http://10.68.30.22:8082/api/mlb/TowerIssue;
#pk发料
pickingIssue: http://10.68.30.22:8082/api/mlb/PickingIssue
#料卷退PK
returnToPK: http://10.68.30.22:8082/api/mlb/ReturnToPK
#单据挑料
ticketPost: http://10.68.30.22:8082/api/mlb/TicketPost
#拆分标签码
splitLabelID:
#合并标签码
mergeLabelID:
#单据产生标签码
getLabelByTicket:
#标签码信息查询
queryLabelID:
#标签码上架
labelUpToShelf:
#PoDoSo挑料送WMS
dnIssueListToWMS:
#出退货还原
revoke:
#智能仓库存查询
queryIwInventory:
#查询所有库存标签码信息
queryInvLabelId:
#单据备料还原
ticketRevert:
#校验箱号信息
validCarton: http://10.68.30.22:8082/api/mlb/ValidCarton
#获取栈板信息
fetchPalletInfo: http://10.68.30.22:8082/api/mlb/FetchPalletInfo
#栈板同库别转移
palletUpdate: http://10.68.30.22:8082/api/mlb/PalletUpdate
#获取可用库存
fetchValidInv: http://10.68.30.22:8082/api/wcs/FetchValidInv
#栈板拆分
palletSplit: http://10.68.30.22:8082/api/wcs/PalletSplit
#栈板合并
palletMerge: http://10.68.30.22:8082/api/wcs/PalletMerge
#箱去向接口
cartonDst: http://10.68.30.22:8082/api/wcs/CartonDst
#挑料完成绑定栈板
bindPallet:
#挑料批量绑定栈板
bindPalletBulk:
#取消绑定栈板
unBindPallet:
#拉取转库单据
fetchMoveTicket: http://10.68.30.22:8082/api/wcs/FetchMoveTicket
#转库单据备料
moveTicketPick: http://10.68.30.22:8082/api/wcs/MoveTicketPick
#转库单据过账
moveTicketPost: http://10.68.30.22:8082/api/wcs/MoveTicketPost
#Check检查站
checkPassStation: http://10.68.30.22:8082/api/wcs/CheckPassStation
#PPS CHECK检查结果
checkLabelResult: http://10.68.30.22:8082/api/wcs/CheckLabelResult
#集货单锁定料箱查询
lockedCartonQuery: http://10.68.30.22:8082/api/wcs/LockedCartonQuery
#用栈板号获取箱信息清单
fetchPalletCarton: http://10.68.30.22:8082/api/wcs/FetchPalletCarton
#PPS 按栈板获取箱清单
checkPalletCarton: http://10.68.30.22:8082/api/wcs/CheckPalletCarton
#获取不可用(HOLD)库存信息
fetchHoldInfo: http://10.68.30.22:8082/api/wcs/FetchHoldInfo
#激活预分车任务信息
activeTruck:
#转库单据备料还原
moveTicketRestore: http://10.68.30.22:8082/api/wcs/MoveTicketRestore
#重置转库单据
resetMoveTicket: http://10.68.30.22:8082/api/wcs/ResetMoveTicket
#查询挑料单列表
queryPicking: http://10.68.30.22:8082/api/mlb/QueryPicking
#获取挑料单详情
getPickingItems: http://10.68.30.22:8082/api/mlb/GetPickingItems
#获取尺寸信息
brandQtyUrl: http://10.68.30.22:8082/api/wcs/brandQty
#自动仓获取ODN单信息
fetchShipmentInfo: http://10.68.30.22:8082/api/FetchShipment
#储位转移
binMove: http://10.68.30.22:8082/api/mlb/BinMove
\ No newline at end of file
#厂区名称
luxsan:
plantCode: W339
#C区配置文件
api:
name: luxsan
#禁用料
inCheckUrl: http://10.68.21.21:8001/Npm/WmsCheckReelfob
#储位查询
queryBin: http://10.42.220.171:8082/api/mlb/QueryBin
#更新储位
updateBin: http://10.42.220.171:8082/api/mlb/UpdateBin
#GR查询
queryGr: http://10.42.220.171:8082/api/mlb/QueryGR
#校验DC有效期
getInDate: http://10.42.220.171:8082/api/mes/GetInDate
#GR过账状态查询
queryGrStatus: http://10.42.220.171:8082/api/mlb/QueryGrStatus
#按GR生成标签码并上架
newLabelToCell: http://10.42.220.171:8082/api/mlb/NewLabelToCell
#电子料入退库
backToWarehouse: http://10.42.220.171:8082/api/mlb/BackToWarehouse
#Tower发料
towerIssue: http://10.42.220.171:8082/api/mlb/TowerIssue;
#pk发料
pickingIssue: http://10.42.220.171:8082/api/mlb/PickingIssue
#料卷退PK
returnToPK: http://10.42.220.171:8082/api/mlb/ReturnToPK
#单据挑料
ticketPost: http://10.42.220.171:8082/api/mlb/TicketPost
#拆分标签码
splitLabelID:
#合并标签码
mergeLabelID:
#单据产生标签码
getLabelByTicket:
#标签码信息查询
queryLabelID:
#标签码上架
labelUpToShelf:
#PoDoSo挑料送WMS
dnIssueListToWMS:
#出退货还原
revoke:
#智能仓库存查询
queryIwInventory:
#查询所有库存标签码信息
queryInvLabelId:
#单据备料还原
ticketRevert:
#校验箱号信息
validCarton: http://10.42.220.171:8082/api/mlb/ValidCarton
#获取栈板信息
fetchPalletInfo: http://10.42.220.171:8082/api/mlb/FetchPalletInfo
#栈板同库别转移
palletUpdate: http://10.42.220.171:8082/api/mlb/PalletUpdate
#获取可用库存
fetchValidInv: http://10.42.220.171:8082/api/wcs/FetchValidInv
#栈板拆分
palletSplit: http://10.42.220.171:8082/api/wcs/PalletSplit
#栈板合并
palletMerge: http://10.42.220.171:8082/api/wcs/PalletMerge
#箱去向接口
cartonDst: http://10.42.220.171:8082/api/wcs/CartonDst
#挑料完成绑定栈板
bindPallet:
#挑料批量绑定栈板
bindPalletBulk:
#取消绑定栈板
unBindPallet:
#拉取转库单据
fetchMoveTicket: http://10.42.220.171:8082/api/wcs/FetchMoveTicket
#转库单据备料
moveTicketPick: http://10.42.220.171:8082/api/wcs/MoveTicketPic
#转库单据过账
moveTicketPost: http://10.42.220.171:8082/api/wcs/MoveTicketPost
#Check检查站
checkPassStation: http://10.42.220.171:8082/api/wcs/CheckPassStation
#PPS CHECK检查结果
checkLabelResult: http://10.42.220.171:8082/api/wcs/CheckLabelResult
#集货单锁定料箱查询
lockedCartonQuery: http://10.42.220.171:8082/api/wcs/LockedCartonQuery
#用栈板号获取箱信息清单
fetchPalletCarton: http://10.42.220.171:8082/api/wcs/FetchPalletCarton
#PPS 按栈板获取箱清单
checkPalletCarton: http://10.42.220.171:8082/api/wcs/CheckPalletCarton
#获取不可用(HOLD)库存信息
fetchHoldInfo: http://10.42.220.171:8082/api/wcs/FetchHoldInfo
#激活预分车任务信息
activeTruck:
#转库单据备料还原
moveTicketRestore: http://10.42.220.171:8082/api/wcs/MoveTicketRestore
#重置转库单据
resetMoveTicket: http://10.42.220.171:8082/api/wcs/ResetMoveTicket
#查询挑料单列表
queryPicking: http://10.42.220.171:8082/api/mlb/QueryPicking
#获取挑料单详情
getPickingItems: http://10.42.220.171:8082/api/mlb/GetPickingItems
#获取尺寸信息
brandQtyUrl: http://10.42.220.171:8082/api/mlb/brandQty
#自动仓获取ODN单信息
fetchShipmentInfo: http://10.42.220.171:8082/api/FetchShipment
#储位转移
binMove: http://10.42.220.171:8082/api/mlb/BinMove
\ No newline at end of file
......@@ -11,17 +11,19 @@ login:
spring:
data:
mongodb:
host: localhost # 主机地址
host: 127.0.0.1
#host: 10.68.27.88 # 主机地址
port: 27017 # 端口
database: smf # 数据库
database: smf #原材料仓数据库
#database: wipsmf #半成品仓数据库
#kafka配置
kafka:
bootstrap-servers: 10.190.196.135:9092
consumer:
group-id: neotel
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
# kafka:
# bootstrap-servers: 10.190.196.135:9092
# consumer:
# group-id: neotel
# key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
# value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
#jwt
jwt:
......@@ -75,9 +77,9 @@ file:
#迈征配置
maizheng:
stationStatusApi: http://10.190.196.124:8300/API/MZSM
export: MU3_1
transReelBoxApi: http://10.190.196.124:52232/API/TransReelBoxAuto
prepareReelBoxApi: http://10.190.196.124:52232/API/PrepareReelBoxAuto
workIdCancleApi: http://10.190.196.124:52232/API/workIDCancle
stationStatusApi: #http://10.190.196.124:8300/API/MZSM
export: #MU3_1
transReelBoxApi: #http://10.190.196.124:52232/API/TransReelBoxAuto
prepareReelBoxApi: #http://10.190.196.124:52232/API/PrepareReelBoxAuto
workIdCancleApi: #http://10.190.196.124:52232/API/workIDCancle
......@@ -2,7 +2,7 @@ server:
port: 8800
api:
name: Lizhen
name: #Lizhen
inCheckUrl: #http://10.190.25.124:8001/Npm/WmsCheckReelfob #禁用料
batchCheckUrl: #http://172.30.60.117:8001/Npm/WmsCheckReelfob_Batch #批量禁用料
outNotifyUrl: #http://172.30.170.148:8082/SmtAutoWH/Save2DReelInfo #保存物料(外仓配置)
......@@ -14,53 +14,53 @@ api:
brandQtyUrl: #http://172.30.170.199:8082/api/wcs/brandQty #gr标签满卷数
importUrl: #http://10.42.222.52:8001/smf-core/ext/forward/getDataLogs #内仓导入外仓picking虚拟仓数据
checkReelMeasure: #http://10.190.25.124:8001/Sct/CheckReelMeasure #散料量测接口
plant: 2810
werks: 2810
plant: #2810
werks: #2810
outerFactory:
bc:
plant: 2810
factory: B3
plant: #2810
factory: #B3
#缺料预警对应的地址
lizhen:
F2:
name: 2F
line: A05-2FSMT-16S,A05-2FSMT-17S,A05-2FSMT-06S,A05-2FSMT-07S
url: http://172.30.88.19:8001/smf-core/api/Mes/machineCallMaterial
name: #2F
line: #A05-2FSMT-16S,A05-2FSMT-17S,A05-2FSMT-06S,A05-2FSMT-07S
url: #http://172.30.88.19:8001/smf-core/api/Mes/machineCallMaterial
F3:
name: 3F
line: A05-3FSMT-04S,A05-3FSMT-14S,A05-3FSMT-15S,A05-3FSMT-05S
url: http://172.30.97.99:8001/smf-core/api/Mes/machineCallMaterial
line:
url: http://10.68.27.85/smf-core/wcs/machineCallMaterial
F5:
name: 5F
line: A05-5FSMT-13S,A05-5FSMT-03S,A05-5FSMT-02S,A05-5FSMT-12S #,A05-5FARF-06,A05-5FSMT-01S,A05-5FSMT-11S
url: http://172.30.97.63:8001/smf-core/api/Mes/machineCallMaterial
name: #5F
line: #A05-5FSMT-13S,A05-5FSMT-03S,A05-5FSMT-02S,A05-5FSMT-12S #,A05-5FARF-06,A05-5FSMT-01S,A05-5FSMT-11S
url: #http://172.30.97.63:8001/smf-core/api/Mes/machineCallMaterial
F4:
name: 4F
line: B03-4FSMT-11,B03-4FSMT-01,B03-4FSMT-13,B03-4FSMT-03,B03-4FSMT-14,B03-4FSMT-04
url: http://172.25.252.12:8001/smf-core/api/Mes/machineCallMaterial
name: #4F
line: #B03-4FSMT-11,B03-4FSMT-01,B03-4FSMT-13,B03-4FSMT-03,B03-4FSMT-14,B03-4FSMT-04
url: #http://172.25.252.12:8001/smf-core/api/Mes/machineCallMaterial
#
#转发地址
forward:
f2:
name: 2F
url: http://172.30.88.19:8001/smf-core
name: #2F
url: #http://172.30.88.19:8001/smf-core
f3:
name: 3F
url: http://172.30.97.99:8001/smf-core
name: #3F
url: #http://172.30.97.99:8001/smf-core
f5:
name: 5F
url: http://172.30.97.63:8001/smf-core
name: #5F
url: #http://172.30.97.63:8001/smf-core
b15:
name: B15
url: http://10.42.176.209:8001/smf-core
name: #B15
url: #http://10.42.176.209:8001/smf-core
f4:
name: 4F
url: http://127.0.0.1:8800
name: #4F
url: #http://127.0.0.1:8800
#手动出库料箱
manualcheckout:
......@@ -80,6 +80,7 @@ spring:
check-template-location: false
profiles:
active: 'prod'
include: 21088test
jackson:
time-zone: GMT+8
data:
......@@ -102,5 +103,5 @@ app:
type: ""
menu:
show: #innerMaterial
show: grStorage,pkStorage,storageTransfer,docMaterialRe,docTransferWarehous,docReturn,manualWarehous
hide:
......@@ -283,3 +283,5 @@ smfcore.virtual.hasReelError=\u865A\u62DF\u4ED3\u4E2D\u6CA1\u6709\u7269\u6599,\u
smfcore.inventory.noBatch=\u5F53\u524D\u6CA1\u6709\u8981\u76D8\u70B9\u7684\u6279\u6B21,\u8BF7\u70B9\u51FB\u5F00\u59CB\u76D8\u70B9
smfcore.inventory.noReel=\u7269\u6599[{0}]\u4E0D\u5728\u5F53\u524D\u76D8\u70B9\u7684\u6279\u6B21{1}\u4E2D,\u8BF7\u68C0\u67E5
smfcore.inventory.finish=\u7269\u6599[{0}]\u5DF2\u76D8\u70B9\u5B8C\u6210,\u6279\u6B21\u4E3A{1},\u8BF7\u68C0\u67E5
smfcore.api.error=\u63A5\u53E3\u8BF7\u6C42\u5931\u8D25[{0}]
\ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!