Commit 99378dd1 zshaohui

立臻功能提交

1 个父辈 437a3c12
正在显示 68 个修改的文件 包含 1899 行增加154 行删除
...@@ -159,9 +159,10 @@ public class DataInitManager { ...@@ -159,9 +159,10 @@ public class DataInitManager {
Menu poutOut = Menu.CreatePMenu("物料管理", 1, "order", 2, "workOrder", null); Menu poutOut = Menu.CreatePMenu("物料管理", 1, "order", 2, "workOrder", null);
Menu out = Menu.CreatePMenu("查找出库", 11, "searchOut", 2, "findOut",poutOut); Menu out = Menu.CreatePMenu("查找出库", 11, "searchOut", 2, "findOut",poutOut);
addNewFunctionMenu(1,out,"checkOut", "UID出库", "singleOuput", "neolight/singleOuput/index","export1",functionMenuMap); addNewFunctionMenu(1,out,"checkOut", "UID出库", "singleOuput", "neolight/singleOuput/index","export1",functionMenuMap);
addNewFunctionMenu(2, out,"tacticsOuput", "PN出库", "tacticsOuput", "neolight/tacticsOuput/index", "tacticsOuput",functionMenuMap); addNewFunctionMenu(2, out,"tacticsOuput", "PN出库", "tacticsOuput", "neolight/tacticsOuput/index", "tacticsOuput",functionMenuMap);
//addNewFunctionMenu(2,poutOut,"checkHandOut", "手动出库", "singleOuput", "neolight/singleOuput/index","export1",functionMenuMap);
addNewFunctionMenu(1,poutOut,"workOrder", "工单出库","workOrder", "neolight/workOrder/index","orderOut",functionMenuMap); addNewFunctionMenu(1,poutOut,"workOrder", "工单出库","workOrder", "neolight/workOrder/index","orderOut",functionMenuMap);
addNewFunctionMenu(2,poutOut,"posOutput", "库位出库", "posOutput", "system/posOutput/index", "swagger",functionMenuMap); addNewFunctionMenu(2,poutOut,"posOutput", "库位出库", "posOutput", "system/posOutput/index", "swagger",functionMenuMap);
addNewFunctionMenu(3, poutOut, "labelOuput", "物料标签", "labelOuput", "neolight/labelOuput/index", "mgroup",functionMenuMap); addNewFunctionMenu(3, poutOut, "labelOuput", "物料标签", "labelOuput", "neolight/labelOuput/index", "mgroup",functionMenuMap);
...@@ -211,6 +212,18 @@ public class DataInitManager { ...@@ -211,6 +212,18 @@ public class DataInitManager {
Menu pMenuReport = Menu.CreatePMenu("报表", 7, "report", 2, "inOutData",null); Menu pMenuReport = Menu.CreatePMenu("报表", 7, "report", 2, "inOutData",null);
addNewFunctionMenu(71, pMenuReport, "inOutData", "出入库", "inOutData", "neolight/inOutData/index", "outPut",functionMenuMap); addNewFunctionMenu(71, pMenuReport, "inOutData", "出入库", "inOutData", "neolight/inOutData/index", "outPut",functionMenuMap);
addNewFunctionMenu(72, pMenuReport,"inventory", "库存", "inventory", "neolight/inventory/index", "inventory",functionMenuMap); addNewFunctionMenu(72, pMenuReport,"inventory", "库存", "inventory", "neolight/inventory/index", "inventory",functionMenuMap);
addNewFunctionMenu(73, pMenuReport,"materialIssueDetailsList", "发料", "materialIssueDetailsList", "neolight/materialIssueDetailsList/index", "mIDList",functionMenuMap);
addNewFunctionMenu(74, pMenuReport,"overdueDelayReport", "过期延期", "overdueDelayReport", "neolight/overdueDelayReport/index", "oDReport",functionMenuMap);
addNewFunctionMenu(75, pMenuReport,"prohibitedReport", "禁限用", "prohibitedReport", "neolight/prohibitedReport/index", "workOrder",functionMenuMap);
addNewFunctionMenu(76, pMenuReport,"materialPreListReport", "备料清单", "materialPreListReport", "neolight/materialPreListReport/index", "mPreListReport",functionMenuMap);
addNewFunctionMenu(77, pMenuReport,"changeReport", "异动", "changeReport", "neolight/changeReport/index", "changeReport",functionMenuMap);
addNewFunctionMenu(78, pMenuReport,"materialReturnReport", "退料", "materialReturnReport", "neolight/materialReturnReport/index", "mReturnReport",functionMenuMap);
addNewFunctionMenu(79, pMenuReport,"OrderAutoInventoryReport", "内仓工单库存自动对比", "OrderAutoInventoryReport", "neolight/OrderAutoInventoryReport/index", "OAInventoryReport",functionMenuMap);
addNewFunctionMenu(80, pMenuReport,"inventoryReport", "库存", "inventoryReport", "neolight/inventoryReport/index", "BOM",functionMenuMap);
addNewFunctionMenu(81, pMenuReport,"materialShortageReport", "缺料", "materialShortageReport", "neolight/materialShortageReport/index", "mShortageReport",functionMenuMap);
addNewFunctionMenu(82,pMenuReport,"pkSearch","PK查询","pkSearch","neolight/pkSearch/index","findOut",functionMenuMap);
//addNewFunctionMenu(83,pMenuReport,"lackPicking","内仓缺料","lackPicking","neolight/lackPicking/index","mShortageReport",functionMenuMap);
addNewFunctionMenu(83,pMenuReport,"feeding","喂料","feeding","neolight/feeding/index","mShortageReport",functionMenuMap);
//可观测性:物料追踪 //可观测性:物料追踪
Menu guanceMenu = Menu.CreatePMenu("可观测性", 8, "observability", 2, "scanKey",null); Menu guanceMenu = Menu.CreatePMenu("可观测性", 8, "observability", 2, "scanKey",null);
...@@ -231,7 +244,7 @@ public class DataInitManager { ...@@ -231,7 +244,7 @@ public class DataInitManager {
addNewFunctionMenu(105,poutSet, "translation", "资源翻译", "translation", "system/translation/index", "translation",functionMenuMap); addNewFunctionMenu(105,poutSet, "translation", "资源翻译", "translation", "system/translation/index", "translation",functionMenuMap);
// Menu orderSet = new Menu(, "orderSetting", "工单设置", "orderSetting", "system/orderSetting/index", "sysSet"); // Menu orderSet = new Menu(, "orderSetting", "工单设置", "orderSetting", "system/orderSetting/index", "sysSet");
addNewFunctionMenu(106,poutSet, "shelfSetting", "料架设置", "shelfSetting", "system/shelfSetting/index", "translation",functionMenuMap); addNewFunctionMenu(106,poutSet, "shelfSetting", "料架设置", "shelfSetting", "system/shelfSetting/index", "translation",functionMenuMap);
addNewFunctionMenu(107,poutSet, "warehouseMaintenance", "库别维护", "warehouseMaintenance", "system/warehouseMaintenance/index", "translation",functionMenuMap);
//用户管理:用户管理,角色管理 //用户管理:用户管理,角色管理
Menu pMenuUser = Menu.CreatePMenu("用户管理", 11, "userManager", 2, "Steve-Jobs", null); Menu pMenuUser = Menu.CreatePMenu("用户管理", 11, "userManager", 2, "Steve-Jobs", null);
......
...@@ -29,19 +29,27 @@ public class MainTimer { ...@@ -29,19 +29,27 @@ public class MainTimer {
@Autowired @Autowired
LiteOrderCache liteOrderCache; LiteOrderCache liteOrderCache;
public void init(){ public void init() {
initTask(); initTask();
liteOrderCache.loadUnEndOrderInfos(); liteOrderCache.loadUnEndOrderInfos();
log.info("主定时器开启,60秒后开始执行, 每10s执行一次"); log.info("主定时器开启,60秒后开始执行, 每300s执行一次");
//1 分钟之后执行,每秒钟执行一次 //1 分钟之后执行,每秒钟执行一次
scheduledThreadPool.scheduleAtFixedRate(new Runnable() { scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override @Override
public void run() { public void run() {
timerTask(); timerTask();
} }
}, 60, 10, TimeUnit.SECONDS); }, 60, 300, TimeUnit.SECONDS);
//log.info("如果是人工叫料,则每2分钟执行一次");
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
timerTaskLz();
}
}, 60, 5, TimeUnit.SECONDS);
} }
private void initTask() { private void initTask() {
log.info("开始加载未完成的任务..."); log.info("开始加载未完成的任务...");
...@@ -60,8 +68,9 @@ public class MainTimer { ...@@ -60,8 +68,9 @@ public class MainTimer {
private void timerTask(){ private void timerTask(){
try{ try{
PreWarningItemCache.runTimer(); //log.info("机器叫料,每5分钟执行一次");
liteOrderCache.runTimer(); PreWarningItemCache.runTimer(0);
//liteOrderCache.runTimer(0);
//设备状态判断 //设备状态判断
DevicesStatusUtil.runTimer(); DevicesStatusUtil.runTimer();
...@@ -73,4 +82,16 @@ public class MainTimer { ...@@ -73,4 +82,16 @@ public class MainTimer {
} }
} }
private void timerTaskLz() {
try {
//log.info("人工叫料,每5s执行一次");
PreWarningItemCache.runTimer(1);
liteOrderCache.runTimer(1);
liteOrderCache.runTimer(0);
} catch (Exception e) {
e.printStackTrace();
log.error("定时器执行出错", e);
}
}
} }
...@@ -139,4 +139,9 @@ public class Constants { ...@@ -139,4 +139,9 @@ public class Constants {
* 缺料预警配置 * 缺料预警配置
*/ */
public static final String CACHE_preWarningItem = "preWarningItem"; public static final String CACHE_preWarningItem = "preWarningItem";
public static final String CACHE_outLotInfoMap = "outLotInfoMap";
public static final String CACHE_outLotInfos = "outLotInfos";
} }
...@@ -174,18 +174,4 @@ public class SmfApi { ...@@ -174,18 +174,4 @@ public class SmfApi {
} }
return false; return false;
} }
public Barcode barcodeInfo(Barcode barcode) {
if (isUrlExist(barcodeInfoUrl)) {
for (ISmfApiListener apiListener : apiListenerList) {
if (apiListener.isForThisApi(apiName)) {
Barcode responseBarcode = apiListener.barcodeInfo(barcodeInfoUrl,barcode);
if (responseBarcode != null) {
return responseBarcode;
}
}
}
}
return null;
}
} }
...@@ -246,9 +246,4 @@ public class DefaultSmfApiListener extends BaseSmfApiListener { ...@@ -246,9 +246,4 @@ public class DefaultSmfApiListener extends BaseSmfApiListener {
public LiteOrder fetchOrder(String fetchOrderUrl, String orderNumber, String username){ public LiteOrder fetchOrder(String fetchOrderUrl, String orderNumber, String username){
return null; return null;
} }
@Override
public Barcode barcodeInfo(String barcodeInfoUrl,Barcode barcode) {
return null;
}
} }
...@@ -48,6 +48,4 @@ public interface ISmfApiListener { ...@@ -48,6 +48,4 @@ public interface ISmfApiListener {
* @return * @return
*/ */
LiteOrder fetchOrder(String url, String orderNumber, String username); LiteOrder fetchOrder(String url, String orderNumber, String username);
Barcode barcodeInfo(String barcodeInfoUrl,Barcode barcode);
} }
...@@ -3,7 +3,9 @@ package com.neotel.smfcore.core.barcode.bean; ...@@ -3,7 +3,9 @@ package com.neotel.smfcore.core.barcode.bean;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.neotel.smfcore.common.utils.DateUtil; import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.common.utils.HttpHelper; import com.neotel.smfcore.common.utils.HttpHelper;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.GrLabel;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
...@@ -561,7 +563,7 @@ public class BarcodeRule { ...@@ -561,7 +563,7 @@ public class BarcodeRule {
} }
b.setBatch(batch); b.setBatch(batch);
} }
int quantity = 1; int quantity = 0;
if(quantity_item.hasThisField()){ if(quantity_item.hasThisField()){
quantity = quantity_item.getIntValue(codeArr); quantity = quantity_item.getIntValue(codeArr);
if(quantity == -1){ if(quantity == -1){
...@@ -619,7 +621,7 @@ public class BarcodeRule { ...@@ -619,7 +621,7 @@ public class BarcodeRule {
if (providerNumber_item.hasThisField()){ if (providerNumber_item.hasThisField()){
String providerNumber = providerNumber_item.getStrValue(codeArr); String providerNumber = providerNumber_item.getStrValue(codeArr);
if (providerNumber.indexOf("-") != -1){ if (providerNumber.indexOf("-") != -1){
providerNumber = providerNumber.substring(providerNumber.indexOf("-")+1,providerNumber.length()); providerNumber = providerNumber.substring(providerNumber.lastIndexOf("-")+1,providerNumber.length());
} }
b.setProviderNumber(providerNumber); b.setProviderNumber(providerNumber);
} }
...@@ -628,7 +630,7 @@ public class BarcodeRule { ...@@ -628,7 +630,7 @@ public class BarcodeRule {
codeBean.setCodeStr(reelId); codeBean.setCodeStr(reelId);
//如果是立臻的,则取-前面的 //如果是立臻的,则取-前面的
if (partNumber.indexOf("-") != -1){ if (partNumber.indexOf("-") != -1){
partNumber = partNumber.substring(0,partNumber.indexOf("-")); partNumber = partNumber.substring(0,partNumber.lastIndexOf("-"));
} }
b.setPartNumber(partNumber); b.setPartNumber(partNumber);
b.setAmount(quantity); b.setAmount(quantity);
...@@ -643,6 +645,76 @@ public class BarcodeRule { ...@@ -643,6 +645,76 @@ public class BarcodeRule {
return codeBean; return codeBean;
} }
public GrLabel toGrLable(String codeStr) {
log.info("开始解析条码[" + codeStr + "]");
String[] codeArr = new String[]{codeStr};
if (!Strings.isNullOrEmpty(separator)) {
codeArr = codeStr.split(separator, -1);
//条码与规则长度对应不上
if (codeArr.length != length) {
log.info("条码[" + codeStr + "]与规则【" + ruleStr + "】长度不同");
return null;
} else {
codeArr = codeStr.split(separator, length);
}
}
GrLabel grLabel = new GrLabel();
grLabel.setFullCode(codeStr);
//得到gr标签唯一与行号
String reelId = "";
if (whole_reelId_item.hasThisField()) {
reelId = codeStr;
} else {
reelId = reelId_item.getStrValue(codeArr);
}
if (Strings.isNullOrEmpty(reelId)) {
log.info("条码解析失败,未找到RI字段");
//codeBean.setError("smfcore.error.barcode.noField",new String[]{"RI"},"条码解析失败,未找到{0}字段");
return null;
}
grLabel.setLabelId(reelId);
String memo = "";
if (memo_item.hasThisField()) {
memo = memo_item.getStrValue(codeArr);
}
if (Strings.isNullOrEmpty(memo)){
log.info("条码解析失败,未找到MEMO字段");
return null;
}
grLabel.setLabelItem(memo);
String partNumber = partNumber_item.getStrValue(codeArr);
if (Strings.isNullOrEmpty(partNumber)) {
log.info("条码解析失败,未找到PN字段");
return null;
}
grLabel.setPartNumber(partNumber);
int quantity = 0;
if (quantity_item.hasThisField()) {
quantity = quantity_item.getIntValue(codeArr);
if (quantity == -1) {
log.info("条码解析失败,未找到QTY 字段");
return null;
}
}
grLabel.setAmount(quantity);
grLabel.setRemainingAmount(quantity);
String supplier = supplier_item.getStrValue(codeArr);
grLabel.setProvider(supplier);
return grLabel;
}
/** /**
* 转义正则特殊字符 ($()*+.[]?\^{} * 转义正则特殊字符 ($()*+.[]?\^{}
* @return * @return
...@@ -776,6 +848,15 @@ public class BarcodeRule { ...@@ -776,6 +848,15 @@ public class BarcodeRule {
codeStr = "138S00138-012207|2022-1015|41625|L130122074222008AL|KYOCERA|"; codeStr = "138S00138-012207|2022-1015|41625|L130122074222008AL|KYOCERA|";
rule = "PN[-1:20:-1]PROVIDERNUMBER[-1:20:-1]|BATCH[-1:20:-1]DATECODE[-1:20:-1]|QTY|RI|SP|6"; rule = "PN[-1:20:-1]PROVIDERNUMBER[-1:20:-1]|BATCH[-1:20:-1]DATECODE[-1:20:-1]|QTY|RI|SP|6";
codeStr = "103S00358";
//codeStr = "138S00138-012207";
rule = "RI[0:6:2]PN[-1:2:-1]";
/* codeStr = "5001809171|1|138S00139|MURATA|450000";
rule = "RI|MEMO|PN|SP|QTY";*/
codeStr = "=1x1=806-33328-1000015|220812A-220812|6000|M8010000153322U50F|EVERWIN";
rule = "RI[0:6:2]PN[-1:2:-1]";
BarcodeRule br = BarcodeRule.newRule(rule); BarcodeRule br = BarcodeRule.newRule(rule);
Barcode b = br.toCodeBean(codeStr).getBarcode(); Barcode b = br.toCodeBean(codeStr).getBarcode();
......
...@@ -247,4 +247,22 @@ public class BarcodeDto implements Serializable { ...@@ -247,4 +247,22 @@ public class BarcodeDto implements Serializable {
@ApiModelProperty("第一次入库时间") @ApiModelProperty("第一次入库时间")
private Date firstPutInDate; private Date firstPutInDate;
@ApiModelProperty("日期代码")
private String dateCode;
@ApiModelProperty("禁用信息")
private String disableMsg;
@ApiModelProperty("卷数")
private int reelAmount;
@ApiModelProperty("库别")
private String warehouseCode;
@ApiModelProperty("隔口数量")
private int partitionCount = 0;
@ApiModelProperty("创建人")
private String creator;
} }
...@@ -187,11 +187,11 @@ public class BarcodeManagerImpl implements IBarcodeManager { ...@@ -187,11 +187,11 @@ public class BarcodeManagerImpl implements IBarcodeManager {
// throw new ValidateException("smfcore.valueCanotNull","{0}不能为空",new String[]{"batch"} ); // throw new ValidateException("smfcore.valueCanotNull","{0}不能为空",new String[]{"batch"} );
// throw new ValidateException("批次不能为空"); // throw new ValidateException("批次不能为空");
} }
if (barcode.getAmount() <= 0) { /*if (barcode.getAmount() <= 0) {
throw new ValidateException("smfcore.greaterThanZero","数量必须大于0",new String[]{"amout"} ); throw new ValidateException("smfcore.greaterThanZero","数量必须大于0",new String[]{"amout"} );
// throw new ValidateException("smfcore.valueCanotNull","{0}不能为空",new String[]{"amout"} ); // throw new ValidateException("smfcore.valueCanotNull","{0}不能为空",new String[]{"amout"} );
// throw new ValidateException("["+barcode.getBarcode()+"]barcode.error.amount.negative" ); // throw new ValidateException("["+barcode.getBarcode()+"]barcode.error.amount.negative" );
} }*/
if (!validateUnique(barcode)) { if (!validateUnique(barcode)) {
// throw new ValidateException("["+barcode.getBarcode()+"]barcode.error.unique" ); // throw new ValidateException("["+barcode.getBarcode()+"]barcode.error.unique" );
} }
......
...@@ -8,6 +8,7 @@ import com.neotel.smfcore.core.barcode.enums.BARCODE_STATUS; ...@@ -8,6 +8,7 @@ import com.neotel.smfcore.core.barcode.enums.BARCODE_STATUS;
import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE; import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE;
import com.neotel.smfcore.core.barcode.enums.SOLDER_STATUS; import com.neotel.smfcore.core.barcode.enums.SOLDER_STATUS;
import io.swagger.annotations.ApiModelProperty;
import lombok.*; import lombok.*;
import org.springframework.data.annotation.Transient; import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Document;
...@@ -152,6 +153,10 @@ public class Barcode extends BasePo implements Serializable { ...@@ -152,6 +153,10 @@ public class Barcode extends BasePo implements Serializable {
private String dateCode; private String dateCode;
/** /**
* 卷数
*/
private int reelAmount = 0;
/**
* 关联条码,夹具时关联相关的物料,用于入库完成时插入相关物料 * 关联条码,夹具时关联相关的物料,用于入库完成时插入相关物料
*/ */
@Transient @Transient
...@@ -165,6 +170,21 @@ public class Barcode extends BasePo implements Serializable { ...@@ -165,6 +170,21 @@ public class Barcode extends BasePo implements Serializable {
*/ */
private List<Barcode> subCodeList; private List<Barcode> subCodeList;
/**
* 禁用标识
*/
private String disableMsg;
/**
* 是否需要出库
*/
private boolean isOut = false;
/**
* 工单详情id
*/
private String orderItemId;
/** /**
* 是否是锡膏 * 是否是锡膏
*/ */
...@@ -228,6 +248,36 @@ public class Barcode extends BasePo implements Serializable { ...@@ -228,6 +248,36 @@ public class Barcode extends BasePo implements Serializable {
* 呆滞到期时间(入库时间+呆滞日期) * 呆滞到期时间(入库时间+呆滞日期)
*/ */
private Date sluggishTime; private Date sluggishTime;
/**
* gr标签
*/
private String grLabel;
private String keeperCode;
/**
* 库别
*/
private String warehouseCode;
/**
* 是否根据查询出库
*/
private String selectMsg;
/**
* 创建人
*/
private String creator;
/** /**
* 添加相关联条码 * 添加相关联条码
* *
...@@ -454,7 +504,7 @@ public class Barcode extends BasePo implements Serializable { ...@@ -454,7 +504,7 @@ public class Barcode extends BasePo implements Serializable {
return null; return null;
} }
public void UpdateSubCode(Barcode barcode) { public synchronized void UpdateSubCode(Barcode barcode) {
if (subCodeList == null) { if (subCodeList == null) {
subCodeList = Lists.newArrayList(); subCodeList = Lists.newArrayList();
......
...@@ -11,6 +11,7 @@ import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager; ...@@ -11,6 +11,7 @@ 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.manager.IComponentManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.service.po.Component; import com.neotel.smfcore.core.barcode.service.po.Component;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.GrLabel;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -350,6 +351,7 @@ public class CodeResolve { ...@@ -350,6 +351,7 @@ public class CodeResolve {
//return codeBeanMap.values(); //return codeBeanMap.values();
return codeBeans; return codeBeans;
} }
public Barcode resolveOneValideBarcode(String codeStr ) throws ValidateException{ public Barcode resolveOneValideBarcode(String codeStr ) throws ValidateException{
return resolveOneValideBarcode(codeStr,COMPONENT_TYPE.COMPONENT); return resolveOneValideBarcode(codeStr,COMPONENT_TYPE.COMPONENT);
} }
...@@ -384,4 +386,15 @@ public class CodeResolve { ...@@ -384,4 +386,15 @@ public class CodeResolve {
return barcode; return barcode;
} }
public GrLabel resolveGrLable(String codeStr) {
for (BarcodeRule codeRule : barcodeRuleList) {
GrLabel grLabel = codeRule.toGrLable(codeStr);
if (grLabel != null) {
return grLabel;
}
}
return null;
}
} }
...@@ -61,5 +61,10 @@ public enum OP_STATUS { ...@@ -61,5 +61,10 @@ public enum OP_STATUS {
ON_OUT_LINE, ON_OUT_LINE,
GET_LABEL, GET_LABEL,
LABELED, LABELED,
TO_BOX TO_BOX,
/**
* 需要从流水线上拿走
*/
NEED_AWAY
} }
...@@ -490,7 +490,7 @@ public class BaseDeviceHandler implements IDeviceHandler { ...@@ -490,7 +490,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
task.setExecuteTime(executeTime); task.setExecuteTime(executeTime);
updatePosExecuteTime(posName,executeTime); updatePosExecuteTime(posName,executeTime);
} }
log.info(task.getBarcode() + "入仓位[" + task.getPosName() + "]完成,执行时间["+executeTime+"]秒"); log.info(task.getBarcode() + "入仓位[" + task.getPosName() + "]完成,执行时间["+executeTime+"]秒");
ReelLockPosUtil.removeReelLockPosInfo(task.getBarcode()); ReelLockPosUtil.removeReelLockPosInfo(task.getBarcode());
DataLog cancelTask = taskService.findFinishedTask(cid, posName); DataLog cancelTask = taskService.findFinishedTask(cid, posName);
if (cancelTask != null && cancelTask.isCancel()) { if (cancelTask != null && cancelTask.isCancel()) {
...@@ -842,8 +842,8 @@ public class BaseDeviceHandler implements IDeviceHandler { ...@@ -842,8 +842,8 @@ public class BaseDeviceHandler implements IDeviceHandler {
log.info("ACCSHELF: sourceId=" + sourceId + "的工单[" + order.getOrderNo() + "]开始执行任务:[" + dataLog.getPosName() + "][" + dataLog.getPartNumber() + "][" + dataLog.getBarcode() + "]"); log.info("ACCSHELF: sourceId=" + sourceId + "的工单[" + order.getOrderNo() + "]开始执行任务:[" + dataLog.getPosName() + "][" + dataLog.getPartNumber() + "][" + dataLog.getBarcode() + "]");
dataLogs.add(dataLog); dataLogs.add(dataLog);
isFind = true; /*isFind = true;
break; break;*/
} }
} }
} }
......
...@@ -194,7 +194,7 @@ public class MimoBoxHandler extends BaseDeviceHandler { ...@@ -194,7 +194,7 @@ public class MimoBoxHandler extends BaseDeviceHandler {
// } // }
log.info("根据PN单盘出库:【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】"); log.info("根据PN单盘出库:【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】");
String outResult = taskService.checkout(storage, pos, true, SecurityUtils.getCurrentUsername()); String outResult = taskService.checkout(storage, pos, true, SecurityUtils.getCurrentUsername(),"");
if (!Strings.isNullOrEmpty(outResult)) { if (!Strings.isNullOrEmpty(outResult)) {
throw new ValidateException("smfcore.error", outResult); throw new ValidateException("smfcore.error", outResult);
} }
......
...@@ -4,7 +4,9 @@ import cn.hutool.core.util.ObjectUtil; ...@@ -4,7 +4,9 @@ import cn.hutool.core.util.ObjectUtil;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.neotel.smfcore.common.bean.ResultBean; import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.JsonUtil;
import com.neotel.smfcore.common.utils.SecurityUtils; import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.api.bean.CodeValidateParam; import com.neotel.smfcore.core.api.bean.CodeValidateParam;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.bean.NLShelfOperateBean; import com.neotel.smfcore.core.device.bean.NLShelfOperateBean;
...@@ -21,12 +23,14 @@ import com.neotel.smfcore.core.system.bean.OrderSetting; ...@@ -21,12 +23,14 @@ import com.neotel.smfcore.core.system.bean.OrderSetting;
import com.neotel.smfcore.core.system.service.po.DataLog; import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil; import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.core.system.util.TaskService; import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.lizhen.innerBox.rest.InnerBoxRestController;
import com.neotel.smfcore.security.TokenProvider; import com.neotel.smfcore.security.TokenProvider;
import com.neotel.smfcore.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.bytebuddy.asm.Advice; import net.bytebuddy.asm.Advice;
import org.omg.CORBA.PRIVATE_MEMBER;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
...@@ -35,6 +39,7 @@ import org.springframework.web.bind.annotation.*; ...@@ -35,6 +39,7 @@ import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
@Api(tags = "SHELF: NL(智能料架/亮灯料架/普通料架)") @Api(tags = "SHELF: NL(智能料架/亮灯料架/普通料架)")
@RestController @RestController
...@@ -56,6 +61,9 @@ public class NLShelfHandler extends BaseDeviceHandler { ...@@ -56,6 +61,9 @@ public class NLShelfHandler extends BaseDeviceHandler {
String putInColor = "green"; String putInColor = "green";
int delayCloseTime = 30000; int delayCloseTime = 30000;
@Autowired
private InnerBoxRestController innerBoxRestController;
@Override @Override
public StatusBean handleClientRequest(StatusBean statusBean, HttpServletRequest request) { public StatusBean handleClientRequest(StatusBean statusBean, HttpServletRequest request) {
statusBean.setClientIp(request.getRemoteHost()); statusBean.setClientIp(request.getRemoteHost());
...@@ -71,10 +79,10 @@ public class NLShelfHandler extends BaseDeviceHandler { ...@@ -71,10 +79,10 @@ public class NLShelfHandler extends BaseDeviceHandler {
String cid = statusBean.getCid(); String cid = statusBean.getCid();
List<DataLog> finishedTasks = taskService.getFinishedTasks(); List<DataLog> finishedTasks = taskService.getFinishedTasks();
for (DataLog finishedTask : finishedTasks) { for (DataLog finishedTask : finishedTasks) {
if(finishedTask.getCid().equals(cid) && finishedTask.isCheckOutTask() && finishedTask.isCancel()){ if (finishedTask.getCid().equals(cid) && finishedTask.isCheckOutTask() && finishedTask.isCancel()) {
//取消的任务,需要关灯 //取消的任务,需要关灯
taskService.removeFinishedTask(finishedTask); taskService.removeFinishedTask(finishedTask);
statusBean.addData("close",finishedTask.getPosName()); statusBean.addData("close", finishedTask.getPosName());
} }
} }
...@@ -84,35 +92,52 @@ public class NLShelfHandler extends BaseDeviceHandler { ...@@ -84,35 +92,52 @@ public class NLShelfHandler extends BaseDeviceHandler {
} }
//亮灯 //亮灯
List<DataLog> dataLogs = new ArrayList<>();
Collection<DataLog> queueTasks = taskService.getQueueTasks(statusBean.getCid()); Collection<DataLog> queueTasks = taskService.getQueueTasks(statusBean.getCid());
for (DataLog queueTask : queueTasks) { if (queueTasks != null && !queueTasks.isEmpty()) {
if (queueTask.isWait()) { //判断有没有正在执行的任务,如果有,则跳过
queueTask.setStatus(OP_STATUS.EXECUTING.name()); boolean hasExecutingTask = false;
taskService.updateQueueTask(queueTask); for (DataLog queueTask : queueTasks) {
String rgb = queueTask.getLightColor(); if (queueTask.isExecuting()) {
ORDER_COLOR color = ORDER_COLOR.fromRgb(rgb); hasExecutingTask = true;
if (color == null) { break;
if (queueTask.isPutInTask()) { }
color = ORDER_COLOR.DARKGREEN; }
} else if (openZhiYin && ObjectUtil.isNotEmpty(queueTask.getSourceId())) { if (!hasExecutingTask) {
List<DataLog> dataLogList = outMap.get(queueTask.getSourceId()); //按创建时间进行排序,取第一条
if (dataLogList == null) { queueTasks = queueTasks.stream().distinct().sorted(Comparator.comparing(DataLog::getCreateDate)).collect(Collectors.toList());
dataLogList = new ArrayList<>(); DataLog task = null;
for (DataLog queueTask : queueTasks) {
if (task == null) {
task = queueTask;
}
if (task != null) {
String sourceId = task.getSourceId();
if (StringUtils.isNotBlank(sourceId)) {
if (sourceId.equals(queueTask.getSourceId())) {
dataLogs.add(queueTask);
}
} else {
if (StringUtils.isBlank(queueTask.getSourceId())) {
dataLogs.add(queueTask);
}
} }
dataLogList.add(queueTask);
outMap.put(queueTask.getSourceId(), dataLogList);
} else {
color = ORDER_COLOR.BLUE;
} }
} }
statusBean.addData("open",queueTask.getPosName()+"="+color.name());
log.info("库位[" + queueTask.getPosName() + "]["+queueTask.getType()+"]+亮灯:" + color.name());
} }
} }
List<DataLog> dataLogs = getLightGuideTask(outMap);
for (DataLog task : dataLogs) { for (DataLog task : dataLogs) {
statusBean.addData("open", task.getPosName() + "=" + ORDER_COLOR.fromRgb(task.getLightColor()).name()); task.setStatus(OP_STATUS.EXECUTING.name());
taskService.updateQueueTask(task);
String lightColor = task.getLightColor();
ORDER_COLOR color = ORDER_COLOR.fromRgb(lightColor);
if (color == null) {
color = ORDER_COLOR.BLUE;
}
log.info("料架亮灯:" + task.getPosName() + "=" + color.name());
statusBean.addData("open", task.getPosName() + "=" + color.name());
log.info(JsonUtil.toJsonStr(statusBean.getData()));
} }
return statusBean; return statusBean;
} }
...@@ -325,7 +350,13 @@ public class NLShelfHandler extends BaseDeviceHandler { ...@@ -325,7 +350,13 @@ public class NLShelfHandler extends BaseDeviceHandler {
} }
private ResultBean outProcess(String code, String sourceId, String loginUser){ private ResultBean outProcess(String code, String sourceId, String loginUser){
Barcode barcode = codeResolve.resolveOneValideBarcode(code); //判断是否有打印标签的需求,如果有,则返回错误
String nlLabelOrderItemId = innerBoxRestController.getLabelOrderItemId();
if (StringUtils.isNotBlank(nlLabelOrderItemId)){
return ResultBean.newErrorResult(1,"","上一个物料标签请打印完成后再进行出库操作");
}
String barcodeStr = "=1x1=" + code;
Barcode barcode = codeResolve.resolveOneValideBarcode(barcodeStr);
StoragePos inPos = storagePosManager.getByBarcode(barcode.getBarcode()); StoragePos inPos = storagePosManager.getByBarcode(barcode.getBarcode());
if (inPos != null) { if (inPos != null) {
Collection<DataLog> allTasks = taskService.getQueueTasks(); Collection<DataLog> allTasks = taskService.getQueueTasks();
...@@ -340,6 +371,11 @@ public class NLShelfHandler extends BaseDeviceHandler { ...@@ -340,6 +371,11 @@ public class NLShelfHandler extends BaseDeviceHandler {
return ResultBean.newErrorResult(1, "smfcore.shelf.error.orderError", "任务与指定工单[{0}]不一致", new String[]{sourceId}); return ResultBean.newErrorResult(1, "smfcore.shelf.error.orderError", "任务与指定工单[{0}]不一致", new String[]{sourceId});
} }
} }
//设置nlLable
if (StringUtils.isNotBlank(task.getSubSourceId())) {
log.info(task.getBarcode() + "设置的标签orderItemId:" + task.getSubSourceId());
innerBoxRestController.setLabelOrderItemId(task.getSubSourceId());
}
taskService.addTaskToFinished(inPos, null, loginUser); taskService.addTaskToFinished(inPos, null, loginUser);
opPosLight("close", inPos, ""); opPosLight("close", inPos, "");
log.info(code + " 出库完成, 库位[" + inPos.getPosName() + "]灭灯"); log.info(code + " 出库完成, 库位[" + inPos.getPosName() + "]灭灯");
......
...@@ -23,6 +23,7 @@ import com.neotel.smfcore.core.system.service.po.AlarmInfo; ...@@ -23,6 +23,7 @@ import com.neotel.smfcore.core.system.service.po.AlarmInfo;
import com.neotel.smfcore.core.system.service.po.DataLog; import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil; import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.core.system.util.TaskService; import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.lizhen.LizhenApi;
import com.neotel.smfcore.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.core.storage.enums.DeviceType; import com.neotel.smfcore.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.device.handler.IDeviceHandler; import com.neotel.smfcore.core.device.handler.IDeviceHandler;
...@@ -62,6 +63,9 @@ public class DeviceController { ...@@ -62,6 +63,9 @@ public class DeviceController {
@Autowired @Autowired
private SmfApi smfApi; private SmfApi smfApi;
@Autowired
private LizhenApi lizhenApi;
private Map<String, IDeviceHandler> handlerMap = new HashMap<>(); private Map<String, IDeviceHandler> handlerMap = new HashMap<>();
public DeviceController(List<IDeviceHandler> deviceHandlerList) { public DeviceController(List<IDeviceHandler> deviceHandlerList) {
...@@ -111,7 +115,7 @@ public class DeviceController { ...@@ -111,7 +115,7 @@ public class DeviceController {
@PostMapping(value = "/service/store/emptyPosForPutin") @PostMapping(value = "/service/store/emptyPosForPutin")
@ResponseBody @ResponseBody
@AnonymousAccess @AnonymousAccess
public Map<String, Object> emptyPosForPutin(HttpServletRequest request) { public synchronized Map<String, Object> emptyPosForPutin(HttpServletRequest request) {
String code = request.getParameter("code"); String code = request.getParameter("code");
String cids = request.getParameter("cids"); String cids = request.getParameter("cids");
String rfid = request.getParameter("rfid"); String rfid = request.getParameter("rfid");
...@@ -170,7 +174,7 @@ public class DeviceController { ...@@ -170,7 +174,7 @@ public class DeviceController {
barcode = barcodeCanPutIn; barcode = barcodeCanPutIn;
} }
Barcode barcodeApi = smfApi.barcodeInfo(barcode); Barcode barcodeApi = lizhenApi.barcodeInfo(barcode);
if (barcodeApi != null){ if (barcodeApi != null){
barcode = barcodeApi; barcode = barcodeApi;
} }
......
...@@ -6,22 +6,16 @@ import com.google.common.collect.Lists; ...@@ -6,22 +6,16 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.Constants; import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.common.utils.YmlUpdateUtil;
import com.neotel.smfcore.core.barcode.service.manager.IComponentManager; 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.Barcode;
import com.neotel.smfcore.core.barcode.service.po.Component; import com.neotel.smfcore.core.barcode.service.po.Component;
import com.neotel.smfcore.core.barcode.utils.CodeResolve; import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.inList.util.InListCache; import com.neotel.smfcore.core.inList.util.InListCache;
import com.neotel.smfcore.core.language.service.bean.LanguageInfo; import com.neotel.smfcore.core.language.service.bean.LanguageInfo;
import com.neotel.smfcore.core.language.service.po.LanguageMsg;
import com.neotel.smfcore.core.language.util.MessageUtils; import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.storage.bean.InventoryItem; import com.neotel.smfcore.core.storage.bean.InventoryItem;
import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE; import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE;
import com.neotel.smfcore.core.storage.enums.COMPATIBLE_TYPE; import com.neotel.smfcore.core.storage.enums.COMPATIBLE_TYPE;
import com.neotel.smfcore.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.storage.service.po.StoragePos; import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.bean.OrderSetting; import com.neotel.smfcore.core.system.bean.OrderSetting;
import com.neotel.smfcore.core.system.service.dao.ICacheItemDao; import com.neotel.smfcore.core.system.service.dao.ICacheItemDao;
...@@ -32,7 +26,6 @@ import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager; ...@@ -32,7 +26,6 @@ import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.system.service.po.CacheItem; import com.neotel.smfcore.core.system.service.po.CacheItem;
import com.neotel.smfcore.core.system.service.po.Settings; import com.neotel.smfcore.core.system.service.po.Settings;
import com.neotel.smfcore.core.storage.service.po.Storage; import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -41,8 +34,6 @@ import org.springframework.stereotype.Repository; ...@@ -41,8 +34,6 @@ import org.springframework.stereotype.Repository;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** /**
* 缓存 * 缓存
...@@ -74,6 +65,7 @@ public class DataCache { ...@@ -74,6 +65,7 @@ public class DataCache {
@Autowired @Autowired
private IComponentManager componentManager; private IComponentManager componentManager;
/** /**
* 是否需要推送温湿度报警值 * 是否需要推送温湿度报警值
*/ */
...@@ -155,8 +147,7 @@ public class DataCache { ...@@ -155,8 +147,7 @@ public class DataCache {
List<String> ruleList=(List<String>)value; List<String> ruleList=(List<String>)value;
codeResolve.updateBarcodeRuleList(ruleList); codeResolve.updateBarcodeRuleList(ruleList);
} }
//log.info("updateCache ["+cacheKey+"]=["+value+"]");
log.info("updateCache ["+cacheKey+"]=["+value+"]");
} }
/** /**
...@@ -669,10 +660,10 @@ public class DataCache { ...@@ -669,10 +660,10 @@ public class DataCache {
public List<String> getAvailableStorageIds(){ public List<String> getAvailableStorageIds(){
List<String> availableStorageIds = new ArrayList<>(); List<String> availableStorageIds = new ArrayList<>();
for (Storage storage : getAllStorage().values()) { for (Storage storage : getAllStorage().values()) {
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid()); /*StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (bean == null || bean.timeOut() || !bean.isAvailable()) { if (bean == null || bean.timeOut() || !bean.isAvailable()) {
continue; continue;
} }*/
availableStorageIds.add(storage.getId()); availableStorageIds.add(storage.getId());
} }
return availableStorageIds; return availableStorageIds;
......
...@@ -144,6 +144,7 @@ public class LanguageMsgController { ...@@ -144,6 +144,7 @@ public class LanguageMsgController {
@ApiOperation("新增资源") @ApiOperation("新增资源")
@PostMapping @PostMapping
@PreAuthorize("@el.check('translation')") @PreAuthorize("@el.check('translation')")
@AnonymousAccess
public ResponseEntity<Object> create( @RequestBody LanguageMsgDto resources) { public ResponseEntity<Object> create( @RequestBody LanguageMsgDto resources) {
LanguageMsg msg=languageMsgMapper.toEntity(resources); LanguageMsg msg=languageMsgMapper.toEntity(resources);
languageMsgManager.saveMsg(msg); languageMsgManager.saveMsg(msg);
......
package com.neotel.smfcore.core.order.enums;
public enum LITEORDER_SOURCE {
OUTTER,
INNER
}
...@@ -17,6 +17,7 @@ import com.neotel.smfcore.core.barcode.utils.CodeResolve; ...@@ -17,6 +17,7 @@ import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.enums.OP; import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS; import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.order.LiteOrderCache; import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_SOURCE;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS; import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.rest.bean.dto.OrderDto; import com.neotel.smfcore.core.order.rest.bean.dto.OrderDto;
import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderItemMapper; import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderItemMapper;
...@@ -179,7 +180,14 @@ public class OrderController { ...@@ -179,7 +180,14 @@ public class OrderController {
if (liteOrder == null) { if (liteOrder == null) {
throw new ValidateException("smfcore.valueNotFind", "未找到{0}[{1}]", new String[]{"orderNo", orderNo}); throw new ValidateException("smfcore.valueNotFind", "未找到{0}[{1}]", new String[]{"orderNo", orderNo});
} }
String result = liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(), false);
String result = "";
String isExcess = mapValues.get("isExcess");
if (LITEORDER_SOURCE.OUTTER.name().equals(liteOrder.getSource())) {
result = liteOrderCache.checkOutLiteOrderOut(liteOrder.getOrderNo(),false,null,isExcess);
} else {
result = liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(), false);
}
if (ObjectUtil.isEmpty(result)) { if (ObjectUtil.isEmpty(result)) {
return ResultBean.newOkResult(result); return ResultBean.newOkResult(result);
} else { } else {
...@@ -196,7 +204,17 @@ public class OrderController { ...@@ -196,7 +204,17 @@ public class OrderController {
if (orderNo == null) { if (orderNo == null) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"orderNo"}); throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
} }
String result = liteOrderCache.checkOutLiteOrder(orderNo, true); LiteOrder liteOrder = liteOrderManager.findByOrderNo(orderNo);
if (liteOrder == null) {
throw new ValidateException("smfcore.valueNotFind", "未找到{0}[{1}]", new String[]{"orderNo", orderNo});
}
String result = "";
if ("out".equals(""/*liteO"rder.getLogo()*/)) {
result = liteOrderCache.checkOutLiteOrderOut(liteOrder.getOrderNo(),true,null,"");
} else {
result = liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(), true);
}
if (ObjectUtil.isEmpty(result)) { if (ObjectUtil.isEmpty(result)) {
return ResultBean.newOkResult(result); return ResultBean.newOkResult(result);
} else { } else {
...@@ -210,11 +228,25 @@ public class OrderController { ...@@ -210,11 +228,25 @@ public class OrderController {
@PreAuthorize("@el.check('workOrder')") @PreAuthorize("@el.check('workOrder')")
public ResultBean outTails(@RequestBody Map<String, String> mapValues) { public ResultBean outTails(@RequestBody Map<String, String> mapValues) {
String orderNo = mapValues.get("orderNo"); String orderNo = mapValues.get("orderNo");
String orderItemId = mapValues.get("orderItemId");
List<String> orderItemIds = new ArrayList<>();
if (StringUtils.isNotBlank(orderItemId)){
orderItemIds = JsonUtil.toList(orderItemId,String.class);
}
if (orderNo == null) { if (orderNo == null) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"orderNo"}); throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
} }
String result = liteOrderCache.checkOutLiteOrder(orderNo, false); LiteOrder liteOrder = liteOrderManager.findByOrderNo(orderNo);
if (liteOrder == null) {
throw new ValidateException("smfcore.valueNotFind", "未找到{0}[{1}]", new String[]{"orderNo", orderNo});
}
String result = "";
if (LITEORDER_SOURCE.OUTTER.name().equals(liteOrder.getSource())) {
result = liteOrderCache.checkOutLiteOrderOut(liteOrder.getOrderNo(),false,orderItemIds,"");
} else {
result = liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(), false);
}
if (ObjectUtil.isEmpty(result)) { if (ObjectUtil.isEmpty(result)) {
return ResultBean.newOkResult(result); return ResultBean.newOkResult(result);
} else { } else {
...@@ -281,20 +313,51 @@ public class OrderController { ...@@ -281,20 +313,51 @@ public class OrderController {
@GetMapping("/detial") @GetMapping("/detial")
@PreAuthorize("@el.check('workOrder:detial')") @PreAuthorize("@el.check('workOrder:detial')")
@AnonymousAccess @AnonymousAccess
public OrderDto detial(@RequestParam(required = false) String id, @RequestParam(required = false) String orderNo) { public OrderDto detial(@RequestParam(required = false) String id, @RequestParam(required = false) String orderNo,
@RequestParam(required = false) String warehouseCode,@RequestParam(required = false) String brand) {
if (!ObjectUtils.isEmpty(id)) { if (!ObjectUtils.isEmpty(id)) {
LiteOrder liteOrder = liteOrderManager.get(id); LiteOrder liteOrder = liteOrderManager.get(id);
if (liteOrder != null) { if (liteOrder != null) {
OrderDto dto = orderMapper.toDto(liteOrder); OrderDto dto = orderMapper.toDto(liteOrder);
dto.setOrderItems(orderItemMapper.toDto(liteOrder.getOrderItems())); List<LiteOrderItem> orderItemsByWarehouseCode = new ArrayList<>();
List<LiteOrderItem> orderItems = liteOrder.getOrderItems();
for (LiteOrderItem orderItem : orderItems) {
if (StringUtils.isNotBlank(warehouseCode)) {
if (!warehouseCode.equals(orderItem.getWarehouseCode())) {
continue;
}
}
if (StringUtils.isNotBlank(brand)) {
if (!brand.equals(orderItem.getBrand())) {
continue;
}
}
orderItemsByWarehouseCode.add(orderItem);
}
dto.setOrderItems(orderItemMapper.toDto(orderItemsByWarehouseCode));
return dto; return dto;
} }
} else if (!ObjectUtils.isEmpty(orderNo)) { } else if (!ObjectUtils.isEmpty(orderNo)) {
LiteOrder liteOrder = liteOrderManager.findByOrderNo(orderNo); LiteOrder liteOrder = liteOrderManager.findByOrderNo(orderNo);
if (liteOrder != null) { if (liteOrder != null) {
OrderDto dto = orderMapper.toDto(liteOrder); OrderDto dto = orderMapper.toDto(liteOrder);
dto.setOrderItems(orderItemMapper.toDto(liteOrder.getOrderItems())); List<LiteOrderItem> orderItemsByWarehouseCode = new ArrayList<>();
List<LiteOrderItem> orderItems = liteOrder.getOrderItems();
for (LiteOrderItem orderItem : orderItems) {
if (StringUtils.isNotBlank(warehouseCode)) {
if (!warehouseCode.equals(orderItem.getWarehouseCode())) {
continue;
}
}
if (StringUtils.isNotBlank(brand)) {
if (!brand.equals(orderItem.getBrand())) {
continue;
}
}
orderItemsByWarehouseCode.add(orderItem);
}
dto.setOrderItems(orderItemMapper.toDto(orderItemsByWarehouseCode));
return dto; return dto;
} }
} }
......
...@@ -5,6 +5,8 @@ import lombok.Getter; ...@@ -5,6 +5,8 @@ import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.springframework.data.annotation.Transient; import org.springframework.data.annotation.Transient;
import java.util.Date;
@Getter @Getter
@Setter @Setter
public class OrderItemDto { public class OrderItemDto {
...@@ -51,4 +53,61 @@ public class OrderItemDto { ...@@ -51,4 +53,61 @@ public class OrderItemDto {
@Transient @Transient
private int inventoryNum = 0; private int inventoryNum = 0;
@ApiModelProperty("厂别")
private String plantCode;
@ApiModelProperty("全部已出数量")
private int totalOutNum;
@ApiModelProperty("工单号")
private String so;
@ApiModelProperty("线别")
private String line;
@ApiModelProperty("批次号")
private String batchCode;
@ApiModelProperty("全部已出盘数")
private String totalOutReelCount;
@ApiModelProperty("厂商")
private String brand;
@ApiModelProperty("库别")
private String warehouseCode;
@ApiModelProperty("超发数量")
private int excessOutNum =0;
@ApiModelProperty("超发卷数")
private int excessOutReel =0;
@ApiModelProperty("工单号")
private String mo;
@ApiModelProperty("缺失数量")
private int lackNum = 0;
@ApiModelProperty("缺失盘数")
private int lackReel = 0;
@ApiModelProperty("创建时间")
private Date createDate = new Date();
@ApiModelProperty("优先级")
private int priority = 0;
@ApiModelProperty("点位")
private String subSlot;
@ApiModelProperty("站位")
private String slot;
@ApiModelProperty("机器名称")
private String machineName;
@ApiModelProperty("是否缺料")
private boolean isLack = false;
} }
...@@ -43,7 +43,7 @@ public class LiteOrderItemManagerImpl implements ILiteOrderItemManager { ...@@ -43,7 +43,7 @@ public class LiteOrderItemManagerImpl implements ILiteOrderItemManager {
@Override @Override
public void delete(LiteOrderItem object) throws ValidateException { public void delete(LiteOrderItem object) throws ValidateException {
liteOrderItemDao.removeOneById(object.getId());
} }
@Override @Override
......
...@@ -112,6 +112,17 @@ public class LiteOrder extends BasePo implements Serializable { ...@@ -112,6 +112,17 @@ public class LiteOrder extends BasePo implements Serializable {
*/ */
private String boxNumber; private String boxNumber;
/**
* 工单优先级
*/
private int priority = 0;
/**
* 是否超发
*/
private String isExcess;
public void setClosed(boolean value){ public void setClosed(boolean value){
this.closed=value; this.closed=value;
if(value){ if(value){
......
package com.neotel.smfcore.core.order.service.po; package com.neotel.smfcore.core.order.service.po;
import com.neotel.smfcore.common.base.BasePo; import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import lombok.Data; import lombok.Data;
import org.springframework.data.annotation.Transient; import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
@Data @Data
@Document @Document
public class LiteOrderItem extends BasePo implements Serializable ,Comparable<LiteOrderItem> { public class LiteOrderItem extends BasePo implements Serializable ,Comparable<LiteOrderItem> {
...@@ -26,24 +29,30 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li ...@@ -26,24 +29,30 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
private int needNum = 0; private int needNum = 0;
/** /**
* 总需求料盘数 * 当前任务已出数量
*/ */
private int needReelCount = 0; private int outNum = 0;
/** /**
* 当前任务已出数量 * 累计已出数量
*/ */
private int outNum = 0; private int totalOutNum = 0;
/** /**
* 当前任务已出盘数 * 当前已出数量卷数总和
*/ */
private int outReelCount = 0; private int totalReelCountByOutNum = 0;
/** /**
* 累计已出数量 * 总需求料盘数
*/ */
private int totalOutNum = 0; private int needReelCount = 0;
/**
* 当前任务已出盘数
*/
private int outReelCount = 0;
/** /**
* 累计已出盘数 * 累计已出盘数
...@@ -86,6 +95,80 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li ...@@ -86,6 +95,80 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
*/ */
private String posName; private String posName;
/**
* 厂商
*/
private String brand;
/**
* 批次号
*/
private String batchCode;
/**
* 库别
*/
private String warehouseCode;
/**
* 操作人
*/
private String operator;
/**
* 任务单号
*/
private String mo;
/**
* 缺料预警id
*/
private String warningItemId;
/**
* 点位
*/
private String subSlot;
/**
* 站位
*/
private String slot;
/**
* 工单号
*/
private String orderNo;
/**
* 线别
*/
private String line;
/**
* 厂别
*/
private String plantCode;
/**
* 机器名称
*/
private String machineName;
/**
* 优先级
*/
private int priority = 0;
/**
* 是否缺料
*/
private boolean isLack = false;
/** /**
* 出库是否满足要求,已出库数量大于需求数量 * 出库是否满足要求,已出库数量大于需求数量
*/ */
......
...@@ -10,7 +10,7 @@ import java.util.Date; ...@@ -10,7 +10,7 @@ import java.util.Date;
@Data @Data
public class ReportQuery implements Serializable { public class ReportQuery implements Serializable {
@DateTimeFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private BetweenData<Date> updateDate; private BetweenData<Date> updateDate;
private String pn; private String pn;
} }
...@@ -283,7 +283,7 @@ public class MaterialController { ...@@ -283,7 +283,7 @@ public class MaterialController {
} }
log.info("出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】"); log.info("出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】");
String outResult = taskService.checkout(storage, pos, true, SecurityUtils.getCurrentUsername()); String outResult = taskService.checkout(storage, pos, true, SecurityUtils.getCurrentUsername(),"");
if (!Strings.isNullOrEmpty(outResult)) { if (!Strings.isNullOrEmpty(outResult)) {
throw new ValidateException("smfcore.error", outResult); throw new ValidateException("smfcore.error", outResult);
} }
...@@ -306,7 +306,7 @@ public class MaterialController { ...@@ -306,7 +306,7 @@ public class MaterialController {
} }
log.info("出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】"); log.info("出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】");
String outResult = taskService.checkout(storage, pos, true, SecurityUtils.getCurrentUsername()); String outResult = taskService.checkout(storage, pos, true, SecurityUtils.getCurrentUsername(),"");
if (!Strings.isNullOrEmpty(outResult)) { if (!Strings.isNullOrEmpty(outResult)) {
throw new ValidateException("smfcore.error", outResult); throw new ValidateException("smfcore.error", outResult);
} }
......
...@@ -10,12 +10,16 @@ import com.neotel.smfcore.common.exception.ValidateException; ...@@ -10,12 +10,16 @@ import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.FileUtil; import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.QueryHelp; import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.SecurityUtils; import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.bean.CodeBean; import com.neotel.smfcore.core.barcode.bean.CodeBean;
import com.neotel.smfcore.core.barcode.rest.bean.dto.BarcodeDto; import com.neotel.smfcore.core.barcode.rest.bean.dto.BarcodeDto;
import com.neotel.smfcore.core.barcode.rest.bean.dto.CodeDto; import com.neotel.smfcore.core.barcode.rest.bean.dto.CodeDto;
import com.neotel.smfcore.core.barcode.rest.bean.mapstruct.CodeMapper; import com.neotel.smfcore.core.barcode.rest.bean.mapstruct.CodeMapper;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.utils.CodeResolve; 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.device.util.DataCache;
import com.neotel.smfcore.core.language.util.MessageUtils; import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.message.util.DeviceMessageUtil; import com.neotel.smfcore.core.message.util.DeviceMessageUtil;
...@@ -29,8 +33,10 @@ import com.neotel.smfcore.core.storage.rest.query.StoragePosQueryCriteria; ...@@ -29,8 +33,10 @@ import com.neotel.smfcore.core.storage.rest.query.StoragePosQueryCriteria;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager; 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.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos; 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.core.system.util.TaskService;
import com.neotel.smfcore.custom.siemens.SiemensApi; import com.neotel.smfcore.custom.siemens.SiemensApi;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
...@@ -76,6 +82,9 @@ public class StoragePosController { ...@@ -76,6 +82,9 @@ public class StoragePosController {
@Autowired @Autowired
private CodeMapper codeMapper; private CodeMapper codeMapper;
@Autowired
private IBarcodeManager barcodeManager;
@ApiOperation("查询库位") @ApiOperation("查询库位")
@GetMapping @GetMapping
...@@ -195,7 +204,7 @@ public class StoragePosController { ...@@ -195,7 +204,7 @@ public class StoragePosController {
// QisdaApi.ClearStockBy(storagePos.getPosName()); // QisdaApi.ClearStockBy(storagePos.getPosName());
Barcode barcode = storagePos.getBarcode(); Barcode barcode = storagePos.getBarcode();
if (barcode != null) { if (barcode != null) {
barcode = barcodeManager.get(barcode.getId());
log.info("清理库位[" + storagePos.getPosName() + "]中的库存" + barcode.getBarcode()); log.info("清理库位[" + storagePos.getPosName() + "]中的库存" + barcode.getBarcode());
String opUser = SecurityUtils.getCurrentUsername(); String opUser = SecurityUtils.getCurrentUsername();
log.info(opUser + "清理库位[" + storagePos.getPosName() + "]中的库存" + barcode.getBarcode()); log.info(opUser + "清理库位[" + storagePos.getPosName() + "]中的库存" + barcode.getBarcode());
...@@ -288,6 +297,25 @@ public class StoragePosController { ...@@ -288,6 +297,25 @@ public class StoragePosController {
if (ObjectUtil.isNotEmpty(criteria.getStorageId()) && criteria.getStorageId().equals("0")) { if (ObjectUtil.isNotEmpty(criteria.getStorageId()) && criteria.getStorageId().equals("0")) {
criteria.setStorageId(null); criteria.setStorageId(null);
} }
if (ObjectUtil.isNotEmpty(criteria.getBatch())){
String batch = criteria.getBatch();
criteria.setBatchList(Arrays.asList(batch.split(",")));
criteria.setBatch(null);
}
if (ObjectUtil.isNotEmpty(criteria.getDateCode())){
String dateCode = criteria.getDateCode();
criteria.setDateCodeList(Arrays.asList(dateCode.split(",")));
criteria.setDateCode(null);
}
if (ObjectUtil.isNotEmpty(criteria.getPartNumber())){
String partNumber = criteria.getPartNumber();
criteria.setPartNumberList(Arrays.asList(partNumber.split(",")));
criteria.setPartNumber(null);
}
Query query = QueryHelp.getQuery(criteria); Query query = QueryHelp.getQuery(criteria);
Criteria baseCriteria = Criteria.where("used").is(true); Criteria baseCriteria = Criteria.where("used").is(true);
...@@ -327,6 +355,136 @@ public class StoragePosController { ...@@ -327,6 +355,136 @@ public class StoragePosController {
return new PageData(StoragePosDtos, pages.getTotalElements()); return new PageData(StoragePosDtos, pages.getTotalElements());
} }
@ApiOperation("根据条件查找出库")
@GetMapping("/out")
@AnonymousAccess
public ResultBean storagePosFind(StoragePosFindCriteria criteria) {
//判断查询条件是否为空
String provider = criteria.getProvider();
String batch = criteria.getBatch();
String dateCode = criteria.getDateCode();
String stationName = criteria.getStationName();
String warehouseCode = criteria.getWarehouseCode();
String box = criteria.getBox();
String partNumber = criteria.getPartNumber();
if (StringUtils.isBlank(stationName)) {
return ResultBean.newErrorResult(-1, "", "请选择对应的工位");
}
if (StringUtils.isBlank(partNumber) && StringUtils.isBlank(provider) && StringUtils.isBlank(batch) && StringUtils.isBlank(dateCode) && StringUtils.isBlank(warehouseCode)) {
return ResultBean.newErrorResult(-1, "", "请核实查询条件是否为空");
}
Query query = getPosFindCriteria(criteria);
List<StoragePos> storagePoss = storagePosManager.findByQuery(query);
if (storagePoss != null && !storagePoss.isEmpty()) {
String selectMsg = getSelectMsg(partNumber, provider, batch, dateCode);
for (StoragePos pos : storagePoss) {
//先把里边的物料进行标识
Barcode pidBarcode = pos.getBarcode();
if (StringUtils.isNotBlank(box)) {
if (!box.equals(pidBarcode.getBarcode())) {
continue;
}
}
//排除正在执行的库位
Collection<String> excludePosIds = taskService.excludePosIds();
if (excludePosIds != null && !excludePosIds.isEmpty() && excludePosIds.contains(pos.getId())) {
log.info("库位:" + pos.getPosName() + "正在执行,跳过");
continue;
}
//判断是否有出库任务
boolean hasOutReel = false;
List<Barcode> subCodeList = pidBarcode.getSubCodeList();
for (Barcode barcode : subCodeList) {
if (barcode.isOut()){
continue;
}
List<String> partNumberList = criteria.getPartNumberList();
if (partNumberList != null && !partNumberList.isEmpty()) {
if (!partNumberList.contains(barcode.getPartNumber())) {
continue;
}
}
if (StringUtils.isNotBlank(provider)) {
if (!barcode.getProvider().equals(provider)) {
continue;
}
}
List<String> batchList = criteria.getBatchList();
if (batchList != null && !batchList.isEmpty()) {
if (!batchList.contains(barcode.getBatch())) {
continue;
}
}
List<String> dateCodeList = criteria.getDateCodeList();
if (dateCodeList != null && !dateCodeList.isEmpty()) {
if (!dateCodeList.contains(barcode.getDateCode())) {
continue;
}
}
if (StringUtils.isNotBlank(warehouseCode)) {
if (!warehouseCode.equals(barcode.getWarehouseCode())) {
continue;
}
}
barcode.setOut(true);
barcode.setSelectMsg(selectMsg);
//保存信息
barcode = barcodeManager.save(barcode);
pidBarcode.UpdateSubCode(barcode);
barcodeManager.saveBarcode(pidBarcode);
hasOutReel = true;
}
if (hasOutReel) {
DataLog task = new DataLog(dataCache.getStorageById(pos.getStorageId()), pos.getBarcode(), pos);
task.setType(OP.CHECKOUT);
task.setPutInDate(pos.getBarcode().getPutInDate());
task.setStatus(OP_STATUS.WAIT.name());
task.setSingleOut(false);
task.setOperator(SecurityUtils.getCurrentUsername());
task.setStorageId(pos.getStorageId());
if (StringUtils.isNotBlank(stationName)) {
task.setLoc(stationName);
}
task.setBoxPosName(pos.getPosName());
taskService.addTaskToExecute(task);
}
}
return ResultBean.newOkResult("");
}
return ResultBean.newErrorResult(-1, "", "未找到可以出库的物料");
}
private String getSelectMsg(String partNumber, String provider, String batch, String dateCode) {
String selectMsg = "";
if (StringUtils.isNotBlank(partNumber)) {
selectMsg = selectMsg + "料号:" + partNumber;
}
if (StringUtils.isNotBlank(provider)) {
if (StringUtils.isNotBlank(selectMsg)) {
selectMsg = selectMsg + ",";
}
selectMsg = selectMsg + "供应商:" + provider;
}
if (StringUtils.isNotBlank(batch)) {
if (StringUtils.isNotBlank(selectMsg)) {
selectMsg = selectMsg + ",";
}
selectMsg = selectMsg + "批次:" + batch;
}
if (StringUtils.isNotBlank(dateCode)) {
if (StringUtils.isNotBlank(selectMsg)) {
selectMsg = selectMsg + ",";
}
selectMsg = selectMsg + "dateCode:" + dateCode;
}
return selectMsg;
}
@ApiOperation("导出查找出库列表") @ApiOperation("导出查找出库列表")
@GetMapping(value = "/find/download") @GetMapping(value = "/find/download")
@PreAuthorize("@el.check('checkOut')") @PreAuthorize("@el.check('checkOut')")
...@@ -415,7 +573,7 @@ public class StoragePosController { ...@@ -415,7 +573,7 @@ public class StoragePosController {
// } // }
log.info("出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】"); log.info("出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】");
String outResult = taskService.checkout(storage, pos, isSingleOut,SecurityUtils.getCurrentUsername()); String outResult = taskService.checkout(storage, pos, isSingleOut,SecurityUtils.getCurrentUsername(),null);
if (!Strings.isNullOrEmpty(outResult)) { if (!Strings.isNullOrEmpty(outResult)) {
throw new ValidateException("smfcore.error", outResult); throw new ValidateException("smfcore.error", outResult);
} }
......
...@@ -56,22 +56,52 @@ public class StoragePosFindCriteria { ...@@ -56,22 +56,52 @@ public class StoragePosFindCriteria {
@QueryCondition(blurry = "barcode.providerNumber" ) @QueryCondition(blurry = "barcode.providerNumber" )
private String providerNumber; private String providerNumber;
@QueryCondition(blurry = "barcode.partNumber") @QueryCondition(blurry = "barcode.partNumber")
private String partNumber; private String partNumber;
@QueryCondition(type = QueryCondition.Type.IN,propName = "barcode.subCodeList.partNumber")
private List<String> partNumberList;
@QueryCondition(blurry = "barcode.memo") @QueryCondition(blurry = "barcode.memo")
private String memo; private String memo;
@QueryCondition(propName = "barcode.lockId") @QueryCondition(propName = "barcode.lockId")
private String lockId; private String lockId;
@QueryCondition(blurry = "barcode.batch") @QueryCondition(blurry = "barcode.batch,barcode.subCodeList.batch")
private String batch; private String batch;
@QueryCondition(blurry = "barcode.provider")
@QueryCondition(type = QueryCondition.Type.IN,propName = "barcode.subCodeList.batch")
@ApiModelProperty("批次列表")
private List<String> batchList;
@QueryCondition(blurry = "barcode.provider,barcode.subCodeList.provider")
@ApiModelProperty("供应商")
private String provider; private String provider;
@QueryCondition(propName = "barcode.msl") @QueryCondition(propName = "barcode.msl")
@ApiModelProperty("等级") @ApiModelProperty("等级")
private String msl; private String msl;
@QueryCondition(propName = "barcode.subCodeList.dateCode")
@ApiModelProperty("日期代码")
private String dateCode;
@QueryCondition(type = QueryCondition.Type.IN,propName = "barcode.subCodeList.dateCode")
@ApiModelProperty("批次列表")
private List<String> dateCodeList;
@ApiModelProperty("工位名称")
private String stationName;
@QueryCondition(propName = "barcode.subCodeList.warehouseCode")
@ApiModelProperty("库别")
private String warehouseCode;
@ApiModelProperty("料箱号")
private String box;
public int getComponentType(){ public int getComponentType(){
int componentType = getType(); int componentType = getType();
if (componentType != -1) { if (componentType != -1) {
......
...@@ -67,5 +67,7 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> { ...@@ -67,5 +67,7 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
List<StoragePos> getSameSizeContinuityEmptyPosList(Storage storage, Barcode barcode) throws ValidateException; List<StoragePos> getSameSizeContinuityEmptyPosList(Storage storage, Barcode barcode) throws ValidateException;
StoragePos findByQueryOne(Query query); StoragePos getEmptyPosByStorage(Storage storage, Barcode barcode, Collection<String> excludePosIds, String lastPosId,String logo) throws ValidateException;
StoragePos findPartNumberInStorages(List<String> availableStorageIds, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkoutType, String warehouseCode, String brand);
} }
...@@ -7,6 +7,7 @@ import com.google.common.collect.Maps; ...@@ -7,6 +7,7 @@ import com.google.common.collect.Maps;
import com.neotel.smfcore.common.bean.PageData; import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.PointUtil; import com.neotel.smfcore.common.utils.PointUtil;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.bean.PlateSizeBean; import com.neotel.smfcore.core.barcode.bean.PlateSizeBean;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.storage.bean.InventoryItem; import com.neotel.smfcore.core.storage.bean.InventoryItem;
...@@ -30,6 +31,7 @@ import org.springframework.stereotype.Service; ...@@ -30,6 +31,7 @@ import org.springframework.stereotype.Service;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Pattern;
@Service @Service
@Slf4j @Slf4j
...@@ -275,6 +277,36 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -275,6 +277,36 @@ public class StoragePosManagerImpl implements IStoragePosManager {
return pos; return pos;
} }
@Override
public StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType, String warehouseCode, String brand) {
Criteria c = Criteria.where("id").nin(excludePosIds)
.and("enabled").is(true)//可用
.and("barcode.lockId").is(null);//没有被锁定的仓位;
if (storageIdList != null) {
c = c.and("storageId").in(storageIdList);
}
if (ObjectUtil.isNotEmpty(warehouseCode)) {
c.and("barcode.subCodeList.warehouseCode").is(warehouseCode);
}
if (ObjectUtil.isNotEmpty(brand)) {
c.and("barcode.subCodeList.provider").is(brand);
}
if (ObjectUtil.isNotEmpty(pn)) {
c.and("barcode.subCodeList.partNumber").is(pn);
}
Sort sort = getSortByCheckOutType(checkOutType);
Query q = new Query(c);
q.with(sort);
StoragePos pos = storagePosDao.findOne(q);
if (pos == null) {
log.info("使用" + checkOutType + " 策略出库 partNumber=" + pn + ",未找到可以出库的物料 ");
} else {
log.info("使用" + checkOutType + " 策略出库 partNumber=" + pn + ",找到出仓位置【" + pos.getPosName() + "】,RI【" + pos.getBarcode().getBarcode() + "】 ");
}
return pos;
}
/** /**
* 根据出库方式获取不同的 Sort * 根据出库方式获取不同的 Sort
*/ */
...@@ -562,10 +594,54 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -562,10 +594,54 @@ public class StoragePosManagerImpl implements IStoragePosManager {
} }
@Override @Override
public StoragePos findByQueryOne(Query query) { public StoragePos getEmptyPosByStorage(Storage storage, Barcode barcode, Collection<String> excludePosIds, String lastPosId, String logo) throws ValidateException {
return storagePosDao.findOne(query);
Criteria c = Criteria.where("storageId").is(storage.getId());
COMPATIBLE_TYPE compatibleType = storage.getCompatibleType();
if (compatibleType == COMPATIBLE_TYPE.EXACT_MATCH) {//完全匹配
c = c.and("w").is(barcode.getPlateSize()).and("h").is(barcode.getHeight());
} else if (compatibleType == COMPATIBLE_TYPE.FULLY_COMPATIBLE) {//同厚度兼容
c = c.and("w").gte(barcode.getPlateSize()).and("h").gte(barcode.getHeight());//除7寸外,完全兼容
} else if (compatibleType == COMPATIBLE_TYPE.SIZE_COMPATIBLE) {//同尺寸兼容
c = c.and("w").is(barcode.getPlateSize()).and("h").gte(barcode.getHeight());//宽度等于料盘宽度,高度大于等于料盘高度
}
c = c.and("enabled").is(true)//可用
.and("used").is(false);//未使用
//去除的仓位
if (excludePosIds != null && !excludePosIds.isEmpty()) {
c = c.and("id").nin(excludePosIds);
}
if (StringUtils.isNotBlank(logo)){
Pattern pattern=Pattern.compile("^.*"+logo+".*$", Pattern.CASE_INSENSITIVE);
c.and("posName").regex(pattern);
}
Query query = new Query(c);
String msg = "";
// if (lastPosId == null || lastPosId.equals("")) {
//优先放入最合适的位置(根据尺寸),相同尺寸按优先级排序
query.with(Sort.by(Sort.Direction.ASC, "w").and(Sort.by(Sort.Direction.ASC, "h")).and(Sort.by(Sort.Direction.DESC, "priority")));
// } else {
// Point point = PointUtil.getPosPoint(lastPosId, false);
// query.addCriteria(Criteria.where("coordinate").nearSphere(point));
// msg += "getEmptyPosByStorage 根据就近坐标查询[" + lastPosId + "][" + point.getX() + "," + point.getY() + "]";
// }
StoragePos pos = storagePosDao.findOne(query);
if ((!ObjectUtil.isNotEmpty(msg) )&& (pos != null)) {
Point targetP = PointUtil.getPosPoint(lastPosId, false);
log.info(msg + "结果:[" + pos.getPosName() + "][" + targetP.getX() + "," + targetP.getY() + "]");
}
return pos;
} }
/** /**
* 获取下一库位的库位名(后缀数字+1) * 获取下一库位的库位名(后缀数字+1)
*/ */
...@@ -589,4 +665,5 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -589,4 +665,5 @@ public class StoragePosManagerImpl implements IStoragePosManager {
return prefixStr +String.format("%0"+posIndexStr.length()+"d",nextPosIndex); return prefixStr +String.format("%0"+posIndexStr.length()+"d",nextPosIndex);
} }
} }
...@@ -36,9 +36,9 @@ public class DataLogDaoImpl extends AbstractBaseDao implements IDataLogDao { ...@@ -36,9 +36,9 @@ public class DataLogDaoImpl extends AbstractBaseDao implements IDataLogDao {
} }
private List<ChartItem> chart(Date fromTime, Date toTime, int type, String partNumber){ private List<ChartItem> chart(Date fromTime, Date toTime, int type, String partNumber){
Date addOneDayToTime = DateUtil.addOneDayNoTime(toTime); //Date addOneDayToTime = DateUtil.addOneDayNoTime(toTime);
Criteria c = new Criteria().andOperator(Criteria.where("updateDate").gte(fromTime), Criteria c = new Criteria().andOperator(Criteria.where("updateDate").gte(fromTime),
Criteria.where("updateDate").lt(addOneDayToTime)).and("type").is(type); Criteria.where("updateDate").lt(toTime)).and("type").is(type);
c.and("status").in(OP_STATUS.END.name(),OP_STATUS.FINISHED.name()); c.and("status").in(OP_STATUS.END.name(),OP_STATUS.FINISHED.name());
if(Strings.isNotBlank(partNumber)){ if(Strings.isNotBlank(partNumber)){
c.and("partNumber").is(partNumber); c.and("partNumber").is(partNumber);
......
...@@ -211,6 +211,71 @@ public class DataLog extends BasePo implements Serializable { ...@@ -211,6 +211,71 @@ public class DataLog extends BasePo implements Serializable {
private String loc = ""; private String loc = "";
/** /**
* 线别(楼层)
*/
private String line;
/**
* 需求单号(挑料单号)
*/
private String orderNo;
/**
* 工单号
*/
private String mo;
/**
* 面别(线别)
*/
private String side;
/**
* 库别
*/
private String warehouseCode;
/**
* 厂别
*/
private String plantCode;
/**
* D/C
*/
private String dateCode;
/**
* 供应商
*/
private String provider;
/**
* 供应商代码
*/
private String providerNumber;
/**
* keeperCode
*/
private String keeperCode;
/**
* 物料储位
*/
private String reelPosName;
/**
* 料箱储位
*/
private String boxPosName;
/**
* 隔口数量
*/
private int partitionCount = 0;
/**
* MSD附加信息 * MSD附加信息
*/ */
private MSDAppendInfo msdAppendInfo; private MSDAppendInfo msdAppendInfo;
...@@ -252,6 +317,9 @@ public class DataLog extends BasePo implements Serializable { ...@@ -252,6 +317,9 @@ public class DataLog extends BasePo implements Serializable {
return OP_STATUS.WAIT.name().equals(status); return OP_STATUS.WAIT.name().equals(status);
} }
public boolean isToBox(){
return OP_STATUS.TO_BOX.name().equals(status);
}
public boolean isEnd(){ public boolean isEnd(){
return OP_STATUS.END.name().equals(status); return OP_STATUS.END.name().equals(status);
......
...@@ -8,6 +8,7 @@ import com.neotel.smfcore.common.exception.ValidateException; ...@@ -8,6 +8,7 @@ import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.Constants; import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.ReelLockPosUtil; import com.neotel.smfcore.common.utils.ReelLockPosUtil;
import com.neotel.smfcore.common.utils.SecurityUtils; import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.api.SmfApi; import com.neotel.smfcore.core.api.SmfApi;
import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE; import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager; import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
...@@ -19,6 +20,7 @@ import com.neotel.smfcore.core.device.util.DataCache; ...@@ -19,6 +20,7 @@ import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache; import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.service.po.LiteOrder; import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE; import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE;
import com.neotel.smfcore.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.storage.rest.dto.TacticsOutDto; import com.neotel.smfcore.core.storage.rest.dto.TacticsOutDto;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager; 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.Storage;
...@@ -64,6 +66,8 @@ public class TaskService { ...@@ -64,6 +66,8 @@ public class TaskService {
*/ */
private static Map<String, DataLog> theFinishedTaskMap = Maps.newConcurrentMap(); private static Map<String, DataLog> theFinishedTaskMap = Maps.newConcurrentMap();
private static String posLogo = "";
// public TaskService(List<ITaskListener> listenerList){ // public TaskService(List<ITaskListener> listenerList){
// for (ITaskListener taskListener: listenerList) { // for (ITaskListener taskListener: listenerList) {
// taskListenerList.add(taskListener); // taskListenerList.add(taskListener);
...@@ -103,7 +107,7 @@ public class TaskService { ...@@ -103,7 +107,7 @@ public class TaskService {
* @return * @return
* @throws ValidateException * @throws ValidateException
*/ */
public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut, String opUserName) throws ValidateException { public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut, String opUserName,String stationName) throws ValidateException {
if (pos.getBarcode() == null) { if (pos.getBarcode() == null) {
String msg = "库位[" + pos.getPosName() + "]中已无物料,忽略"; String msg = "库位[" + pos.getPosName() + "]中已无物料,忽略";
log.info(msg); log.info(msg);
...@@ -135,6 +139,10 @@ public class TaskService { ...@@ -135,6 +139,10 @@ public class TaskService {
task.setSingleOut(isSingleOut); task.setSingleOut(isSingleOut);
task.setOperator(opUserName); task.setOperator(opUserName);
task.setStorageId(storage.getId()); task.setStorageId(storage.getId());
if (StringUtils.isNotBlank(stationName)){
task.setLoc(stationName);
}
task.setBoxPosName(pos.getPosName());
addTaskToExecute(task); addTaskToExecute(task);
return ""; return "";
} }
...@@ -213,13 +221,16 @@ public class TaskService { ...@@ -213,13 +221,16 @@ public class TaskService {
* 获取所有任务 * 获取所有任务
*/ */
public List<DataLog> getAllTasksByCid(String cid) { public List<DataLog> getAllTasksByCid(String cid) {
List<DataLog> dataLogs = new ArrayList<>();
List<DataLog> allTasks = getAllTasks(); List<DataLog> allTasks = getAllTasks();
for (DataLog task : allTasks) { if (allTasks != null && !allTasks.isEmpty()) {
if(task.getCid().equals(cid)){ for (DataLog task : allTasks) {
allTasks.add(task); if (cid.equals(task.getCid())) {
dataLogs.add(task);
}
} }
} }
return allTasks; return dataLogs;
} }
/** /**
...@@ -402,7 +413,7 @@ public class TaskService { ...@@ -402,7 +413,7 @@ public class TaskService {
} }
String cid = storage.getCid(); String cid = storage.getCid();
//有入库任务的料仓不分配出库任务 //有入库任务的料仓不分配出库任务
if (!hasExecutingTask(cid, OP.PUT_IN)) { //if (!hasExecutingTask(cid, OP.PUT_IN)) {
DataLog task = findCheckoutBoxTask(storage); DataLog task = findCheckoutBoxTask(storage);
if (task != null) { if (task != null) {
...@@ -433,7 +444,7 @@ public class TaskService { ...@@ -433,7 +444,7 @@ public class TaskService {
statusBean.addPosInfo(task.getBarcode(), posName, plateW, plateH, isSingleOut); statusBean.addPosInfo(task.getBarcode(), posName, plateW, plateH, isSingleOut);
log.info("出库" + storage.getName() + "[" + posName + "]物料[" + task.getBarcode() + "]" + isSingleOut + "发送到客户端" + cid); log.info("出库" + storage.getName() + "[" + posName + "]物料[" + task.getBarcode() + "]" + isSingleOut + "发送到客户端" + cid);
} }
} // }
String posId = statusBean.getData().get("posId"); String posId = statusBean.getData().get("posId");
if (!Strings.isNullOrEmpty(posId)) { if (!Strings.isNullOrEmpty(posId)) {
log.info("SEQ:" + statusBean.getSeq() + "出库库位信息:[" + posId + "]发送到客户端"); log.info("SEQ:" + statusBean.getSeq() + "出库库位信息:[" + posId + "]发送到客户端");
...@@ -578,10 +589,12 @@ public class TaskService { ...@@ -578,10 +589,12 @@ public class TaskService {
//如果有正在执行的任务,把库位发过去 //如果有正在执行的任务,把库位发过去
Collection<DataLog> allTasks = taskMap.values(); Collection<DataLog> allTasks = taskMap.values();
for (DataLog task : allTasks) { for (DataLog task : allTasks) {
if (barcode.getBarcode().equals(task.getBarcode())) { if (task.isPutInTask() && !task.isFinished() && !task.isCancel()) {
String posId = task.getPosId(); if (barcode.getBarcode().equals(task.getBarcode())) {
log.info(barcode.getBarcode() + " 已有任务,返回任务中的库位:" + task.getPosName()); String posId = task.getPosId();
return storagePosManager.get(posId); log.info(barcode.getBarcode() + " 已有任务,返回任务中的库位:" + task.getPosName());
return storagePosManager.get(posId);
}
} }
String storageId = task.getStorageId(); String storageId = task.getStorageId();
...@@ -660,7 +673,29 @@ public class TaskService { ...@@ -660,7 +673,29 @@ public class TaskService {
try { try {
Collection<String> operatingPosIds = excludePosIds(); Collection<String> operatingPosIds = excludePosIds();
log.debug("尝试从[" + storage.getCid() + "]中为[" + barcode.getBarcode() + "]查找空位"); log.debug("尝试从[" + storage.getCid() + "]中为[" + barcode.getBarcode() + "]查找空位");
StoragePos pos = storagePosManager.getEmptyPosByStorage(storage, barcode, operatingPosIds, lastPosId); StoragePos pos = null;
if (storage.isType(new DeviceType[]{DeviceType.SMD_XLR})) {
if (StringUtils.isNotBlank(posLogo)) {
if ("AA".equals(posLogo)) {
posLogo = "BB";
} else {
posLogo = "AA";
}
} else {
posLogo = "AA";
}
pos = storagePosManager.getEmptyPosByStorage(storage, barcode, operatingPosIds, lastPosId, posLogo);
if (pos == null) {
if ("AA".equals(posLogo)) {
posLogo = "BB";
} else {
posLogo = "AA";
}
pos = storagePosManager.getEmptyPosByStorage(storage, barcode, operatingPosIds, lastPosId, posLogo);
}
} else {
pos = storagePosManager.getEmptyPosByStorage(storage, barcode, operatingPosIds, lastPosId);
}
if (pos != null) { if (pos != null) {
return pos; return pos;
} }
...@@ -700,8 +735,10 @@ public class TaskService { ...@@ -700,8 +735,10 @@ public class TaskService {
} else { } else {
pos = storagePosManager.getByBarcodeId(barcodeSave.getId()); pos = storagePosManager.getByBarcodeId(barcodeSave.getId());
if (barcodeSave.getAmount() <= 0) { if (!barcodeSave.getBarcode().startsWith("CS") && !barcodeSave.getBarcode().startsWith("CB") && !barcodeSave.getBarcode().startsWith("CM")) {
throw new ValidateException("smfcore.error.barcode.wrongQty", "条码[{0}]对应的数量<=0为: {1}", new String[]{barcodeSave.getBarcode(), barcodeSave.getAmount() + ""}); if (barcodeSave.getAmount() <= 0) {
throw new ValidateException("smfcore.error.barcode.wrongQty", "条码[{0}]对应的数量<=0为: {1}", new String[]{barcodeSave.getBarcode(), barcodeSave.getAmount() + ""});
}
} }
} }
...@@ -709,7 +746,7 @@ public class TaskService { ...@@ -709,7 +746,7 @@ public class TaskService {
//如果已在库位中,那么自动将该库位的物料出库 //如果已在库位中,那么自动将该库位的物料出库
log.info("出库已在库位中的物料[" + barcodeSave.getBarcode() + "]"); log.info("出库已在库位中的物料[" + barcodeSave.getBarcode() + "]");
Storage storage = dataCache.getStorageById(pos.getStorageId()); Storage storage = dataCache.getStorageById(pos.getStorageId());
checkout(storage, pos, true, ""); checkout(storage, pos, true, "","");
throw new ValidateException("smfcore.error.barcode.exist", "[{0}}]已在{1}}[{2}}]中", new String[]{barcodeSave.getBarcode(), storage.getName(), pos.getPosName()}); throw new ValidateException("smfcore.error.barcode.exist", "[{0}}]已在{1}}[{2}}]中", new String[]{barcodeSave.getBarcode(), storage.getName(), pos.getPosName()});
} }
...@@ -745,7 +782,7 @@ public class TaskService { ...@@ -745,7 +782,7 @@ public class TaskService {
Collection<DataLog> allTasks = taskMap.values(); Collection<DataLog> allTasks = taskMap.values();
if (pos.getBarcode() != null) { if (pos.getBarcode() != null) {
barcode = pos.getBarcode(); //barcode = pos.getBarcode();
for (DataLog task : allTasks) { for (DataLog task : allTasks) {
if (task.isCheckOutTask()) { if (task.isCheckOutTask()) {
String executeBarcode = task.getBarcode(); String executeBarcode = task.getBarcode();
...@@ -801,7 +838,7 @@ public class TaskService { ...@@ -801,7 +838,7 @@ public class TaskService {
//dataCache.updateStorage(task.getCid()); //dataCache.updateStorage(task.getCid());
} else { } else {
barcode = pos.getBarcode(); //barcode = pos.getBarcode();
log.info(opUser + "将【" + barcode.getBarcode() + "】从【" + pos.getPosName() + "】出库"); log.info(opUser + "将【" + barcode.getBarcode() + "】从【" + pos.getPosName() + "】出库");
task.setType(OP.CHECKOUT); task.setType(OP.CHECKOUT);
barcode.setUsed(true); barcode.setUsed(true);
......
...@@ -138,7 +138,7 @@ public class WebSocketServer { ...@@ -138,7 +138,7 @@ public class WebSocketServer {
} }
/** /**
* 群发自定义消息 * 群发自定义消息ma
* */ * */
private static void sendInfo(SocketMsg socketMsg,@PathParam("sid") String sid){ private static void sendInfo(SocketMsg socketMsg,@PathParam("sid") String sid){
String message = JSONObject.toJSONString(socketMsg); String message = JSONObject.toJSONString(socketMsg);
......
...@@ -392,11 +392,6 @@ public class AdvantechApi extends BaseSmfApiListener { ...@@ -392,11 +392,6 @@ public class AdvantechApi extends BaseSmfApiListener {
} }
@Override @Override
public Barcode barcodeInfo(String barcodeInfoUrl, Barcode barcode) {
return null;
}
@Override
public boolean isForThisApi(String apiName) { public boolean isForThisApi(String apiName) {
return apiName != null && apiName.equalsIgnoreCase("Advantech"); return apiName != null && apiName.equalsIgnoreCase("Advantech");
} }
......
...@@ -26,11 +26,6 @@ public class HellaApiHandler extends BaseSmfApiListener { ...@@ -26,11 +26,6 @@ public class HellaApiHandler extends BaseSmfApiListener {
} }
@Override @Override
public Barcode barcodeInfo(String barcodeInfoUrl, Barcode barcode) {
return null;
}
@Override
public boolean isForThisApi(String apiName) { public boolean isForThisApi(String apiName) {
return apiName != null && apiName.equalsIgnoreCase("Hella"); return apiName != null && apiName.equalsIgnoreCase("Hella");
} }
......
...@@ -213,7 +213,7 @@ public class HellaServiceHandler extends BaseSmfApiListener implements IoHandler ...@@ -213,7 +213,7 @@ public class HellaServiceHandler extends BaseSmfApiListener implements IoHandler
}else{ }else{
Storage storage = dataCache.getStorageById(storagePos.getStorageId()); Storage storage = dataCache.getStorageById(storagePos.getStorageId());
try{ try{
taskService.checkout(storage,storagePos,false,""); taskService.checkout(storage,storagePos,false,"","");
}catch(ValidateException ve){ }catch(ValidateException ve){
resultCode = "-3"; resultCode = "-3";
resultMsg = ve.getMessage(); resultMsg = ve.getMessage();
...@@ -578,12 +578,6 @@ public class HellaServiceHandler extends BaseSmfApiListener implements IoHandler ...@@ -578,12 +578,6 @@ public class HellaServiceHandler extends BaseSmfApiListener implements IoHandler
} }
@Override @Override
public Barcode barcodeInfo(String barcodeInfoUrl, Barcode barcode) {
return null;
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception { public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
log.error("连接发生异常:" + cause.getMessage()); log.error("连接发生异常:" + cause.getMessage());
} }
......
package com.neotel.smfcore.custom.lizhen.agvBox.bean;
import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.core.barcode.bean.BarcodeRule;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class GrLabel extends BasePo {
/**
* 标签id
*/
private String labelId;
/**
* 行号
*/
private String labelItem;
/**
* 标签总数量
*/
private int amount = 0;
/**
* 剩余数量
*/
private int remainingAmount = 0;
/**
* 厂商
*/
private String provider;
/**
* pn
*/
private String partNumber;
/**
* keeperCode
*/
private String keeperCode;
/**
* 库别
*/
private String warehouseCode;
/**
* 完整二维码信息
*/
private String fullCode;
}
...@@ -4,6 +4,8 @@ import lombok.AllArgsConstructor; ...@@ -4,6 +4,8 @@ import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.util.List;
/** /**
* @author sunke * @author sunke
* @date 2022/9/22 4:32 PM * @date 2022/9/22 4:32 PM
...@@ -54,11 +56,42 @@ public class Station { ...@@ -54,11 +56,42 @@ public class Station {
*/ */
private int height; private int height;
/** /**
* GR标签 * gr标签
*/ */
private String grLabel; private String grLabel;
/**
* gr行
*/
private String labelItem;
/**
* 上一个隔扣码
*/
private String lastScanBoxCode = ""; private String lastScanBoxCode = "";
/**
* 是否已经入库
*/
private boolean isPutIn = true;
/**
* 料箱隔口数量
*/
private List<Integer> boxPartitionCounts;
/**
* 提示信息
*/
//private String msg;
/**
* 库别
*/
private String warehouseCode;
} }
package com.neotel.smfcore.custom.lizhen.agvBox.bean;
import com.neotel.smfcore.common.base.BasePo;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@Setter
@Getter
public class WareHouseCode extends BasePo implements Serializable {
/**
* 厂区
*/
private String plant;
/**
* 库别
*/
private String wareHouseCode;
/**
* 描述
*/
private String description;
/**
* 创建人
*/
private String createBy;
/**
* 修改人
*/
private String updateBy;
}
package com.neotel.smfcore.custom.lizhen.agvBox.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.io.Serializable;
@Getter
@Setter
@ToString
public class WareHouseCodeDto implements Serializable {
@ApiModelProperty("ID")
private String id;
@ApiModelProperty("厂别")
private String plant;
@ApiModelProperty("库别")
private String wareHouseCode;
@ApiModelProperty("描述")
private String description;
}
package com.neotel.smfcore.custom.lizhen.agvBox.bean.mapstruct;
import com.neotel.smfcore.common.base.BaseMapper;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.WareHouseCode;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.dto.WareHouseCodeDto;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring" ,unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface WareHouseCodeMapper extends BaseMapper<WareHouseCodeDto, WareHouseCode> {
}
package com.neotel.smfcore.custom.lizhen.agvBox.bean.query;
import com.neotel.smfcore.common.annotation.QueryCondition;
import lombok.Data;
@Data
public class WareHouseCodeQueryCriteria {
@QueryCondition(blurry = "plant,wareHouseCode,description,createBy,updateBy")
private String blurry;
}
...@@ -14,6 +14,9 @@ import com.neotel.smfcore.core.storage.service.po.StoragePos; ...@@ -14,6 +14,9 @@ import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.dao.IDataLogDao; import com.neotel.smfcore.core.system.service.dao.IDataLogDao;
import com.neotel.smfcore.core.system.service.po.DataLog; import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService; import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.core.system.websocket.MsgType;
import com.neotel.smfcore.core.system.websocket.SocketMsg;
import com.neotel.smfcore.core.system.websocket.WebSocketServer;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.Station; import com.neotel.smfcore.custom.lizhen.agvBox.bean.Station;
import com.neotel.smfcore.custom.lizhen.agvBox.util.StationCacheUtil; import com.neotel.smfcore.custom.lizhen.agvBox.util.StationCacheUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
...@@ -70,6 +73,20 @@ public class AgvBoxDeviceClientController { ...@@ -70,6 +73,20 @@ public class AgvBoxDeviceClientController {
String stationName = "s" + i; String stationName = "s" + i;
String rfid = request.getParameter(stationName); String rfid = request.getParameter(stationName);
StationCacheUtil.updateCurrentRfid(stationName, rfid); StationCacheUtil.updateCurrentRfid(stationName, rfid);
//判断当前工位箱子是否有正在执行出库工作的任务
/*List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog task : allTasks) {
if (task.isCheckOutTask() && !task.isCancel() && !task.isFinished()) {
if (rfid.startsWith(task.getBarcode())) {
log.info(task.getBarcode() + ":需要更新为状态已完成");
task.setStatus(OP_STATUS.FINISHED.name());
lockRfidTarget.remove(task.getBarcode());
//已完成,从完成缓存中清除
taskService.removeFinishedTask(task);
}
}
}*/
} }
//"needInStation": ["s1","s2"]//需要线体升起阻挡进行入库的工位 //"needInStation": ["s1","s2"]//需要线体升起阻挡进行入库的工位
List<String> needInStationList = new ArrayList<>(); List<String> needInStationList = new ArrayList<>();
...@@ -120,6 +137,10 @@ public class AgvBoxDeviceClientController { ...@@ -120,6 +137,10 @@ public class AgvBoxDeviceClientController {
Collection<DataLog> queueTasks = taskService.getQueueTasks(); Collection<DataLog> queueTasks = taskService.getQueueTasks();
List<Map<String, String>> taskToSend = new ArrayList<>(); List<Map<String, String>> taskToSend = new ArrayList<>();
for (DataLog queueTask : queueTasks) { for (DataLog queueTask : queueTasks) {
//小车限制,默认一次生成200个任务
if (taskToSend != null && taskToSend.size() >= 200) {
break;
}
if (queueTask.isCheckOutTask()) { if (queueTask.isCheckOutTask()) {
if (queueTask.isWait() || queueTask.isExecuting()) { if (queueTask.isWait() || queueTask.isExecuting()) {
Storage storage = dataCache.getStorageById(queueTask.getStorageId()); Storage storage = dataCache.getStorageById(queueTask.getStorageId());
...@@ -163,7 +184,7 @@ public class AgvBoxDeviceClientController { ...@@ -163,7 +184,7 @@ public class AgvBoxDeviceClientController {
} }
} }
} }
String target = "0"; String target = "s0";
String barcode = ""; String barcode = "";
//"target": "1",//0=工位已有箱子;s1=工位1;s2=工位2;s3=工位3;s4=工位4;s5=工位5;其他值表示入库的目标库位 //"target": "1",//0=工位已有箱子;s1=工位1;s2=工位2;s3=工位3;s4=工位4;s5=工位5;其他值表示入库的目标库位
if (opTask != null) { if (opTask != null) {
...@@ -200,6 +221,21 @@ public class AgvBoxDeviceClientController { ...@@ -200,6 +221,21 @@ public class AgvBoxDeviceClientController {
target = station.getName(); target = station.getName();
break; break;
} }
/*Collection<String> names = lockRfidTarget.values();
if (names != null && !names.isEmpty()){
if (!names.contains(station.getName())) {
//工位未分配过库位
log.info("分配料箱[" + opTask.getBarcode() + "]到" + station.getName());
lockRfidTarget.put(opTask.getBarcode(), station.getName());
target = station.getName();
break;
}
} else {
log.info("分配料箱[" + opTask.getBarcode() + "]到" + station.getName());
lockRfidTarget.put(opTask.getBarcode(), station.getName());
target = station.getName();
break;
}*/
} }
} }
...@@ -230,6 +266,7 @@ public class AgvBoxDeviceClientController { ...@@ -230,6 +266,7 @@ public class AgvBoxDeviceClientController {
public synchronized ResultBean updateLocInfo(HttpServletRequest request) { public synchronized ResultBean updateLocInfo(HttpServletRequest request) {
String rfid = request.getParameter("barcode"); String rfid = request.getParameter("barcode");
String statusStr = request.getParameter("status"); String statusStr = request.getParameter("status");
String loc = request.getParameter("loc"); //工位
log.debug("收到料盘[" + rfid + "]更新位置指令[" + statusStr + "]"); log.debug("收到料盘[" + rfid + "]更新位置指令[" + statusStr + "]");
if (statusStr == null) { if (statusStr == null) {
return ResultBean.newErrorResult(301, "smfcore.updateLoc.status.empty", "状态不能为空"); return ResultBean.newErrorResult(301, "smfcore.updateLoc.status.empty", "状态不能为空");
...@@ -273,12 +310,19 @@ public class AgvBoxDeviceClientController { ...@@ -273,12 +310,19 @@ public class AgvBoxDeviceClientController {
* FINISHED=任务完成(入库时AGV将料箱放入库位;出库时料箱到达工位) * FINISHED=任务完成(入库时AGV将料箱放入库位;出库时料箱到达工位)
*/ */
if (updateStatus != null) { if (updateStatus != null) {
String statusOri = opTask.getStatus(); //任务的上一个状态
opTask.setStatus(statusStr); opTask.setStatus(statusStr);
if (opTask.isCheckOutTask()) { if (opTask.isCheckOutTask()) {
if (OP_STATUS.EXECUTING.name().equals(statusStr)) { if (OP_STATUS.EXECUTING.name().equals(statusStr)) {
//在执行队列中 //在执行队列中
taskService.updateQueueTask(opTask); taskService.updateQueueTask(opTask);
} else { } else if (OP_STATUS.NEED_AWAY.name().equals(statusStr)){
//判断当前任务是否需要取走状态,如果已经是
if (!OP_STATUS.NEED_AWAY.name().equals(statusOri)) {
WebSocketServer.sendMsg(new SocketMsg(Arrays.asList(loc), rfid + "需出库到工位:" + loc + "上", MsgType.INFO, "", null));
}
}
else {
taskService.moveTaskToFinished(opTask); taskService.moveTaskToFinished(opTask);
if (OP_STATUS.OUT_ON_AGV.name().equals(statusStr)) { if (OP_STATUS.OUT_ON_AGV.name().equals(statusStr)) {
...@@ -407,4 +451,9 @@ public class AgvBoxDeviceClientController { ...@@ -407,4 +451,9 @@ public class AgvBoxDeviceClientController {
} }
public static void main(String[] args) {
Arrays.asList(null);
}
} }
package com.neotel.smfcore.custom.lizhen.agvBox.rest;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.JsonUtil;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils;
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.custom.lizhen.agvBox.bean.WareHouseCode;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.dto.WareHouseCodeDto;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.mapstruct.WareHouseCodeMapper;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.query.WareHouseCodeQueryCriteria;
import com.neotel.smfcore.custom.lizhen.agvBox.service.manager.WareHouseCodeManager;
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.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
@ApiOperation("库别维护页面")
@Slf4j
@RestController
@RequestMapping("/api/wareHouseCode")
public class WareHouseCodeController {
@Autowired
private WareHouseCodeManager codeManager;
@Autowired
private WareHouseCodeMapper codeMapper;
@Autowired
private ILiteOrderManager liteOrderManager;
@Autowired
private ILiteOrderItemManager liteOrderItemManager;
/*@ApiOperation("根据id查找库别信息")
@RequestMapping("/getById")
@AnonymousAccess
public ResultBean getWareHouseCodeById(String id) {
WareHouseCode wareHouseCode = codeManager.get(id);
return ResultBean.newOkResult(codeMapper.toDto(wareHouseCode));
}*/
@ApiOperation("保存库别信息")
@PostMapping
@AnonymousAccess
public ResultBean saveWareHouseCode(@RequestBody WareHouseCodeDto wareHouseCodeDto) {
WareHouseCode wareHouseCode = codeMapper.toEntity(wareHouseCodeDto);
wareHouseCode.setCreateBy(SecurityUtils.getCurrentUsername());
codeManager.save(wareHouseCode);
return ResultBean.newOkResult("");
}
@ApiOperation("修改库别信息")
@PutMapping
@AnonymousAccess
private ResultBean updateWareHouseCode(@RequestBody WareHouseCodeDto wareHouseCodeDto){
if (wareHouseCodeDto.getId() == null) {
return ResultBean.newErrorResult(-1,"smfcore.valueCanotNull","{0}不能为空",new String[]{"id"} );
}
WareHouseCode wareHouseCode = codeMapper.toEntity(wareHouseCodeDto);
wareHouseCode.setId(wareHouseCodeDto.getId());
wareHouseCode.setUpdateBy(SecurityUtils.getCurrentUsername());
wareHouseCode.setUpdateDate(new Date());
codeManager.save(wareHouseCode);
return ResultBean.newOkResult("");
}
@ApiOperation("删除库别信息")
@DeleteMapping
@AnonymousAccess
private ResultBean deleteWareHouseCodeById(@RequestBody Set<String> ids){
List<WareHouseCode> codes = new ArrayList<>();
for (String id : ids) {
if (id == null) {
return ResultBean.newErrorResult(-1,"smfcore.valueCanotNull","{0}不能为空",new String[]{"ID"} );
}
WareHouseCode wareHouseCode = codeManager.get(id);
if (wareHouseCode == null){
return ResultBean.newErrorResult(-1,"smfcore.valueNotExist","{0}[{1}]不存在",new String[]{"id",id});
}
codes.add(wareHouseCode);
}
for (WareHouseCode code : codes) {
log.info(SecurityUtils.getCurrentUsername()+"删除的信息为:"+ JsonUtil.toJsonStr(code));
codeManager.delete(code);
}
return ResultBean.newOkResult("");
}
@ApiOperation("库别列表")
@GetMapping("/list")
@AnonymousAccess
private PageData getWareHouseCodeList(WareHouseCodeQueryCriteria criteria, Pageable pageable){
Query query = QueryHelp.getQuery(criteria);
PageData<WareHouseCode> codePageData = codeManager.findByPage(query, pageable);
List<WareHouseCodeDto> codeDtos = new ArrayList<>();
List<WareHouseCode> codes = codePageData.getContent();
for (WareHouseCode code : codes) {
WareHouseCodeDto codeDto = codeMapper.toDto(code);
codeDto.setId(code.getId());
codeDtos.add(codeDto);
}
return new PageData(codeDtos,codePageData.getTotalElements());
}
@ApiOperation("获取库别列表下拉")
@RequestMapping("/pullDown")
@AnonymousAccess
private List<String> getWareHouseCodePullDown(String orderNo){
List<WareHouseCode> wareHouseCodes = codeManager.findAll();
List<String> pullDowns = new ArrayList<>();
List<String> warehouseCodes = new ArrayList<>();
if (StringUtils.isNotBlank(orderNo)){
LiteOrder liteOrder = liteOrderManager.findByOrderNo(orderNo);
if (liteOrder != null){
List<LiteOrderItem> orderItems = liteOrderItemManager.findOrderItems(liteOrder.getId());
for (LiteOrderItem orderItem : orderItems) {
if (StringUtils.isNotBlank(orderItem.getWarehouseCode())){
if (!warehouseCodes.contains(orderItem.getWarehouseCode())) {
warehouseCodes.add(orderItem.getWarehouseCode());
}
}
}
}
}
for (WareHouseCode wareHouseCode : wareHouseCodes) {
String code = wareHouseCode.getWareHouseCode();
if (warehouseCodes != null && !warehouseCodes.isEmpty()){
if (warehouseCodes.contains(code)) {
pullDowns.add(code);
}
} else {
pullDowns.add(code);
}
}
return pullDowns;
}
}
package com.neotel.smfcore.custom.lizhen.agvBox.service.dao;
import com.neotel.smfcore.common.base.IBaseDao;
public interface GrLabelDao extends IBaseDao {
}
package com.neotel.smfcore.custom.lizhen.agvBox.service.dao;
import com.neotel.smfcore.common.base.IBaseDao;
public interface WareHouseCodeDao extends IBaseDao {
}
package com.neotel.smfcore.custom.lizhen.agvBox.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.GrLabel;
import com.neotel.smfcore.custom.lizhen.agvBox.service.dao.GrLabelDao;
import org.springframework.stereotype.Service;
@Service
public class GrLabelDaoImpl extends AbstractBaseDao implements GrLabelDao {
@Override
public Class getEntityClass() {
return GrLabel.class;
}
}
package com.neotel.smfcore.custom.lizhen.agvBox.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.GrLabel;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.WareHouseCode;
import com.neotel.smfcore.custom.lizhen.agvBox.service.dao.GrLabelDao;
import com.neotel.smfcore.custom.lizhen.agvBox.service.dao.WareHouseCodeDao;
import org.springframework.stereotype.Service;
@Service
public class WareHouseCodeDaoImpl extends AbstractBaseDao implements WareHouseCodeDao {
@Override
public Class getEntityClass() {
return WareHouseCode.class;
}
}
package com.neotel.smfcore.custom.lizhen.agvBox.service.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.GrLabel;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Set;
public interface GrLabelManager extends IBaseManager<GrLabel> {
GrLabel findLabelBylabelId(String labelId,String labelItem);
}
package com.neotel.smfcore.custom.lizhen.agvBox.service.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.equipment.service.po.Equipment;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.WareHouseCode;
import java.util.List;
public interface WareHouseCodeManager extends IBaseManager<WareHouseCode> {
List<WareHouseCode> findAll();
}
package com.neotel.smfcore.custom.lizhen.agvBox.service.manager.impl;
import com.google.common.base.Strings;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.core.barcode.service.dao.IBarcodeDao;
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.service.po.Component;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.GrLabel;
import com.neotel.smfcore.custom.lizhen.agvBox.service.dao.GrLabelDao;
import com.neotel.smfcore.custom.lizhen.agvBox.service.manager.GrLabelManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;
@Slf4j
@Service
public class GrLabelManagerImpl implements GrLabelManager {
@Autowired
private GrLabelDao grLabelDao;
@Override
public GrLabel get(String id) {
return null;
}
@Override
public GrLabel save(GrLabel object) throws ValidateException {
return grLabelDao.save(object);
}
@Override
public void delete(GrLabel object) throws ValidateException {
}
@Override
public PageData<GrLabel> findByPage(Query query, Pageable pageable) {
return null;
}
@Override
public List<GrLabel> findByQuery(Query query) {
return null;
}
public GrLabel findLabelBylabelId(String labelId,String labelItem){
return grLabelDao.findOne(new Query(Criteria.where("labelId").is(labelId).and("labelItem").is(labelItem)));
}
}
package com.neotel.smfcore.custom.lizhen.agvBox.service.manager.impl;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.WareHouseCode;
import com.neotel.smfcore.custom.lizhen.agvBox.service.dao.WareHouseCodeDao;
import com.neotel.smfcore.custom.lizhen.agvBox.service.manager.WareHouseCodeManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class WareHouseCodeManagerImpl implements WareHouseCodeManager {
@Autowired
private WareHouseCodeDao codeDao;
@Override
public WareHouseCode get(String id) {
return codeDao.findOneById(id);
}
@Override
public WareHouseCode save(WareHouseCode object) throws ValidateException {
return codeDao.save(object);
}
@Override
public void delete(WareHouseCode object) throws ValidateException {
codeDao.removeOne(object);
}
@Override
public PageData<WareHouseCode> findByPage(Query query, Pageable pageable) {
int totalCount = codeDao.countByQuery(query);
List<WareHouseCode> wareHouseCodes= codeDao.findByQuery(query,pageable);
return new PageData(wareHouseCodes,totalCount);
}
@Override
public List<WareHouseCode> findByQuery(Query query) {
return null;
}
@Override
public List<WareHouseCode> findAll() {
return codeDao.findAll();
}
}
package com.neotel.smfcore.custom.lizhen.innerBox.bean;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
public class OutLotInfo {
/**
* 出口位置
*/
private String outlet = "";
/**
* 料仓cid
*/
private String cid = "";
/**
* 当前料箱号
*/
private String rfid = "";
/**
* 靠近rfid已放数量
*/
private int boxTCount = 0;
/**
* 不靠近rfid已放数量
*/
private int boxBCount = 0;
/**
* 工单序号
*/
private String hSerial = "";
/**
* 目的地(线体)
*/
private String line = "";
/**
* 当前料仓剩余未出的需求单数量
*/
private int remainTaskCount = 0;
/**
* 所属需求单剩余料架任务数
*/
private int rackTaskCount = 0;
}
...@@ -26,6 +26,12 @@ public class PreWarningItem { ...@@ -26,6 +26,12 @@ public class PreWarningItem {
private String slot; private String slot;
private String subslot; private String subslot;
private String partnumber; private String partnumber;
private String id;
/**
* 优先级,1:人工 0:机器
*/
private int priority = 0;
/** /**
* 接收时间 * 接收时间
......
package com.neotel.smfcore.custom.lizhen.innerBox.util;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.OutLotInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
@Slf4j
@Service
public class OutLotInfoCache {
private static DataCache dataCache;
//保存的料口信息缓存
private static Map<String, List<OutLotInfo>> outLotInfoMap = new ConcurrentHashMap<>();
//agv上箱子信息
private static List<OutLotInfo> outLotInfos = new CopyOnWriteArrayList<>();
@PostConstruct
public void getOutLotInfoMap(){
log.info("加载料口信息");
Object lotInfoMap = dataCache.getCache(Constants.CACHE_outLotInfoMap);
if (lotInfoMap != null) {
outLotInfoMap = (Map<String, List<OutLotInfo>>) lotInfoMap;
}
Object lotInfos = dataCache.getCache(Constants.CACHE_outLotInfos);
if (lotInfos != null){
List<OutLotInfo> newOutLotInfos = new ArrayList<>();
outLotInfos = (List<OutLotInfo>) lotInfos;
if (outLotInfos != null && !outLotInfos.isEmpty()){
for (OutLotInfo outLotInfo : outLotInfos) {
if (outLotInfo != null){
newOutLotInfos.add(outLotInfo);
}
}
outLotInfos = newOutLotInfos;
dataCache.updateCache(Constants.CACHE_outLotInfos,outLotInfos);
}
}
}
/**
* 根据cid获取料口状态信息
*
* @param cid
* @return
*/
public static List<OutLotInfo> getOutLotInfoByCid(String cid) {
List<OutLotInfo> outLotInfos = outLotInfoMap.get(cid);
if (outLotInfos == null) {
outLotInfos = new ArrayList<>();
}
return outLotInfos;
}
/**
* 修改缓存信息
* @param cid
* @param outLotInfos
*/
public static synchronized void updateOutLotInfo(String cid, List<OutLotInfo> outLotInfos) {
/* List<OutLotInfo> outLotInfos = outLotInfoMap.get(cid);
List<OutLotInfo> newOutLotInfos = new ArrayList<>();
boolean hasOutLot = false;
if (outLotInfos != null && !outLotInfos.isEmpty()) {
for (OutLotInfo lotInfo : outLotInfos) {
if (outLotInfo.getOutlet().equals(lotInfo.getOutlet())) {
lotInfo = outLotInfo;
hasOutLot = true;
}
newOutLotInfos.add(lotInfo);
}
}
if (!hasOutLot) {
newOutLotInfos.add(outLotInfo);
}*/
outLotInfoMap.put(cid, outLotInfos);
dataCache.updateCache(Constants.CACHE_outLotInfoMap, outLotInfoMap);
}
public static void clearRfidInfo(String rfid) {
if (outLotInfos != null && !outLotInfos.isEmpty()) {
for (OutLotInfo outLotInfo : outLotInfos) {
if (outLotInfo == null){
continue;
}
String lotInfoRfid = outLotInfo.getRfid();
if (StringUtils.isNotBlank(lotInfoRfid)) {
if (lotInfoRfid.startsWith(rfid)) {
outLotInfos.remove(outLotInfo);
break;
}
}
}
}
dataCache.updateCache(Constants.CACHE_outLotInfos,outLotInfos);
}
public static OutLotInfo getOutLotInfoByRfid(String rfid) {
OutLotInfo outLotInfo = new OutLotInfo();
if (outLotInfos != null && !outLotInfos.isEmpty()) {
for (OutLotInfo lotInfo : outLotInfos) {
if (lotInfo == null){
continue;
}
String lotInfoRfid = lotInfo.getRfid();
if (StringUtils.isNotBlank(lotInfoRfid)) {
if (lotInfo.getRfid().startsWith(rfid)) {
outLotInfo = lotInfo;
break;
}
}
}
}
return outLotInfo;
}
public static void outLotInfoMapToOutInfos(String outlet, String rfid) {
OutLotInfo outLotInfo = null;
for (Map.Entry<String, List<OutLotInfo>> outLotInfoEntry : outLotInfoMap.entrySet()) {
List<OutLotInfo> newOutLotInfos = new ArrayList<>();
List<OutLotInfo> outLotInfoValues = outLotInfoEntry.getValue();
for (OutLotInfo outLotInfoValue : outLotInfoValues) {
if (outLotInfoValue.getRfid().startsWith(rfid) /*&& outLotInfoValue.getOutlet().equals(outlet)*/) {
outLotInfo = outLotInfoValue;
} else {
newOutLotInfos.add(outLotInfoValue);
}
}
updateOutLotInfo(outLotInfoEntry.getKey(),newOutLotInfos);
}
boolean hasOutLotInfo = false;
for (OutLotInfo lotInfo : outLotInfos) {
if (lotInfo.getRfid().startsWith(rfid)) {
hasOutLotInfo = true;
break;
}
}
if (!hasOutLotInfo && outLotInfo != null) {
outLotInfos.add(outLotInfo);
}
dataCache.updateCache(Constants.CACHE_outLotInfos,outLotInfos);
}
@Autowired
public void setDataCache(DataCache dataCache){
OutLotInfoCache.dataCache = dataCache;
}
}
package com.neotel.smfcore.custom.lizhen.report.bean.query;
import com.neotel.smfcore.common.annotation.QueryCondition;
import com.neotel.smfcore.common.bean.BetweenData;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.List;
@Data
@ApiModel("查询条件")
public class ReportQueryCondition {
@QueryCondition(blurry = "pn,partNumber")
@ApiModelProperty("料号")
private String pn;
@QueryCondition(propName = "orderNo")
@ApiModelProperty("挑料单号")
private String orderNo;
@QueryCondition(propName = "mo")
@ApiModelProperty("工单号")
private String mo;
@QueryCondition(type = QueryCondition.Type.BETWEEN, propName = "updateDate")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private BetweenData<Date> updateDate;
@QueryCondition
@ApiModelProperty("厂别")
private String plantCode;
@QueryCondition
@ApiModelProperty("库别")
private String warehouse;
@QueryCondition
@ApiModelProperty("唯一码")
private String barcode;
@QueryCondition
@ApiModelProperty("库位")
private String posName;
@QueryCondition
@ApiModelProperty("批次")
private String batch;
@ApiModelProperty("线别")
@QueryCondition(propName = "line")
private String line;
}
package com.neotel.smfcore.custom.lizhen.report.inner;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderItemMapper;
import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderMapper;
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.system.util.TaskService;
import com.neotel.smfcore.custom.lizhen.report.bean.query.ReportQueryCondition;
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.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@ApiOperation("内仓报表")
@RequestMapping("/inner/report")
@RestController
public class InnerReportController {
@Autowired
private ILiteOrderManager liteOrderManager;
@Autowired
private ILiteOrderItemManager liteOrderItemManager;
@Autowired
private OrderItemMapper orderItemMapper;
@Autowired
private OrderMapper orderMapper;
@Autowired
private TaskService taskService;
@Autowired
private DataCache dataCache;
@ApiOperation("喂料")
@RequestMapping("/feeding")
@AnonymousAccess
public PageData feeding(ReportQueryCondition queryCondition, Pageable pageable) {
Query q = QueryHelp.getQuery(queryCondition);
//查询不是关闭状态的订单,新建的,尾料已完成的
List<Criteria> orCriterias = new ArrayList<>();
orCriterias.add(Criteria.where("status").is(LITEORDER_STATUS.NEW));
orCriterias.add(Criteria.where("status").is(LITEORDER_STATUS.TAILS_FINISHED));
Criteria c = Criteria.where("closed").is(false).orOperator(orCriterias);
PageData<LiteOrder> pageData = liteOrderManager.findByPage(q.addCriteria(c), pageable);
List<LiteOrder> liteOrders = pageData.getContent();
liteOrders = liteOrders.stream().sorted(Comparator.comparing(LiteOrder :: getPriority).reversed().thenComparing(LiteOrder :: getCreateDate)).collect(Collectors.toList());
PageData resultPageData = new PageData();
resultPageData.setTotalElements(pageData.getTotalElements());
resultPageData.setContent(liteOrders);
return resultPageData;
}
@ApiOperation("根据工单id获取工单详情")
@RequestMapping("/getItemsByOrderId")
@AnonymousAccess
public ResultBean getItemsByOrderId(String orderId){
LiteOrder liteOrder = liteOrderManager.get(orderId);
List<LiteOrderItem> orderItems = liteOrderItemManager.findOrderItems(orderId);
if (LITEORDER_STATUS.TAILS_FINISHED == liteOrder.getStatus()){
List<LiteOrderItem> newOrderItems = new ArrayList<>();
for (LiteOrderItem orderItem : orderItems) {
if (orderItem.getOutNum() == 0) {
orderItem.setLack(true);
newOrderItems.add(orderItem);
}
}
orderItems = newOrderItems;
}
//根据缺料排序
orderItems = orderItems.stream().sorted(Comparator.comparing(LiteOrderItem :: isLack).reversed()).collect(Collectors.toList());
return ResultBean.newOkResult(orderItemMapper.toDto(orderItems));
}
@ApiOperation("线别下拉")
@RequestMapping("linePullDown")
@AnonymousAccess
public ResultBean linePullDown() {
//得到每一个楼层的线体
String f2Line = dataCache.getCache("F2Line").toString();
String f3Line = dataCache.getCache("F3Line").toString();
String f5Line = dataCache.getCache("F5Line").toString();
Map<String, String> resultMap = new LinkedHashMap<>();
for (String line : f2Line.split(",")) {
resultMap.put(line,line);
}
for (String line : f3Line.split(",")) {
resultMap.put(line,line);
}
for (String line : f5Line.split(",")) {
resultMap.put(line,line);
}
return ResultBean.newOkResult(resultMap);
}
}
...@@ -427,11 +427,6 @@ public class PanaApiController extends BaseSmfApiListener { ...@@ -427,11 +427,6 @@ public class PanaApiController extends BaseSmfApiListener {
} }
@Override @Override
public Barcode barcodeInfo(String barcodeInfoUrl, Barcode barcode) {
return null;
}
@Override
public void inTaskStatusChange(String inNotifyUrl, DataLog task) { public void inTaskStatusChange(String inNotifyUrl, DataLog task) {
if(task.isFinished()){ if(task.isFinished()){
if(task.isPutInTask()){ if(task.isPutInTask()){
......
...@@ -190,11 +190,6 @@ public class SiemensApi extends BaseSmfApiListener { ...@@ -190,11 +190,6 @@ public class SiemensApi extends BaseSmfApiListener {
} }
} }
@Override
public Barcode barcodeInfo(String barcodeInfoUrl, Barcode barcode) {
return null;
}
public static LotCheckInfo lotCheckIn(String lot, String url,String deviceId) { public static LotCheckInfo lotCheckIn(String lot, String url,String deviceId) {
if (ObjectUtil.isEmpty(url)) { if (ObjectUtil.isEmpty(url)) {
log.info("没有配置Siemens,无需验证"); log.info("没有配置Siemens,无需验证");
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!