Commit 99378dd1 zshaohui

立臻功能提交

1 个父辈 437a3c12
正在显示 68 个修改的文件 包含 1899 行增加154 行删除
......@@ -159,9 +159,10 @@ public class DataInitManager {
Menu poutOut = Menu.CreatePMenu("物料管理", 1, "order", 2, "workOrder", null);
Menu out = Menu.CreatePMenu("查找出库", 11, "searchOut", 2, "findOut",poutOut);
addNewFunctionMenu(1,out,"checkOut", "UID出库", "singleOuput", "neolight/singleOuput/index","export1",functionMenuMap);
addNewFunctionMenu(2, out,"tacticsOuput", "PN出库", "tacticsOuput", "neolight/tacticsOuput/index", "tacticsOuput",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,poutOut,"checkHandOut", "手动出库", "singleOuput", "neolight/singleOuput/index","export1",functionMenuMap);
addNewFunctionMenu(1,poutOut,"workOrder", "工单出库","workOrder", "neolight/workOrder/index","orderOut",functionMenuMap);
addNewFunctionMenu(2,poutOut,"posOutput", "库位出库", "posOutput", "system/posOutput/index", "swagger",functionMenuMap);
addNewFunctionMenu(3, poutOut, "labelOuput", "物料标签", "labelOuput", "neolight/labelOuput/index", "mgroup",functionMenuMap);
......@@ -211,6 +212,18 @@ public class DataInitManager {
Menu pMenuReport = Menu.CreatePMenu("报表", 7, "report", 2, "inOutData",null);
addNewFunctionMenu(71, pMenuReport, "inOutData", "出入库", "inOutData", "neolight/inOutData/index", "outPut",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);
......@@ -231,7 +244,7 @@ public class DataInitManager {
addNewFunctionMenu(105,poutSet, "translation", "资源翻译", "translation", "system/translation/index", "translation",functionMenuMap);
// Menu orderSet = new Menu(, "orderSetting", "工单设置", "orderSetting", "system/orderSetting/index", "sysSet");
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);
......
......@@ -29,19 +29,27 @@ public class MainTimer {
@Autowired
LiteOrderCache liteOrderCache;
public void init(){
public void init() {
initTask();
liteOrderCache.loadUnEndOrderInfos();
log.info("主定时器开启,60秒后开始执行, 每10s执行一次");
log.info("主定时器开启,60秒后开始执行, 每300s执行一次");
//1 分钟之后执行,每秒钟执行一次
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
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() {
log.info("开始加载未完成的任务...");
......@@ -60,8 +68,9 @@ public class MainTimer {
private void timerTask(){
try{
PreWarningItemCache.runTimer();
liteOrderCache.runTimer();
//log.info("机器叫料,每5分钟执行一次");
PreWarningItemCache.runTimer(0);
//liteOrderCache.runTimer(0);
//设备状态判断
DevicesStatusUtil.runTimer();
......@@ -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 {
* 缺料预警配置
*/
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 {
}
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 {
public LiteOrder fetchOrder(String fetchOrderUrl, String orderNumber, String username){
return null;
}
@Override
public Barcode barcodeInfo(String barcodeInfoUrl,Barcode barcode) {
return null;
}
}
......@@ -48,6 +48,4 @@ public interface ISmfApiListener {
* @return
*/
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;
import com.google.common.base.Strings;
import com.neotel.smfcore.common.utils.DateUtil;
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.custom.lizhen.agvBox.bean.GrLabel;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
......@@ -561,7 +563,7 @@ public class BarcodeRule {
}
b.setBatch(batch);
}
int quantity = 1;
int quantity = 0;
if(quantity_item.hasThisField()){
quantity = quantity_item.getIntValue(codeArr);
if(quantity == -1){
......@@ -619,7 +621,7 @@ public class BarcodeRule {
if (providerNumber_item.hasThisField()){
String providerNumber = providerNumber_item.getStrValue(codeArr);
if (providerNumber.indexOf("-") != -1){
providerNumber = providerNumber.substring(providerNumber.indexOf("-")+1,providerNumber.length());
providerNumber = providerNumber.substring(providerNumber.lastIndexOf("-")+1,providerNumber.length());
}
b.setProviderNumber(providerNumber);
}
......@@ -628,7 +630,7 @@ public class BarcodeRule {
codeBean.setCodeStr(reelId);
//如果是立臻的,则取-前面的
if (partNumber.indexOf("-") != -1){
partNumber = partNumber.substring(0,partNumber.indexOf("-"));
partNumber = partNumber.substring(0,partNumber.lastIndexOf("-"));
}
b.setPartNumber(partNumber);
b.setAmount(quantity);
......@@ -643,6 +645,76 @@ public class BarcodeRule {
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
......@@ -776,6 +848,15 @@ public class BarcodeRule {
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";
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);
Barcode b = br.toCodeBean(codeStr).getBarcode();
......
......@@ -247,4 +247,22 @@ public class BarcodeDto implements Serializable {
@ApiModelProperty("第一次入库时间")
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 {
// throw new ValidateException("smfcore.valueCanotNull","{0}不能为空",new String[]{"batch"} );
// throw new ValidateException("批次不能为空");
}
if (barcode.getAmount() <= 0) {
/*if (barcode.getAmount() <= 0) {
throw new ValidateException("smfcore.greaterThanZero","数量必须大于0",new String[]{"amout"} );
// throw new ValidateException("smfcore.valueCanotNull","{0}不能为空",new String[]{"amout"} );
// throw new ValidateException("["+barcode.getBarcode()+"]barcode.error.amount.negative" );
}
}*/
if (!validateUnique(barcode)) {
// throw new ValidateException("["+barcode.getBarcode()+"]barcode.error.unique" );
}
......
......@@ -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.SOLDER_STATUS;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.mapping.Document;
......@@ -152,6 +153,10 @@ public class Barcode extends BasePo implements Serializable {
private String dateCode;
/**
* 卷数
*/
private int reelAmount = 0;
/**
* 关联条码,夹具时关联相关的物料,用于入库完成时插入相关物料
*/
@Transient
......@@ -165,6 +170,21 @@ public class Barcode extends BasePo implements Serializable {
*/
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 {
* 呆滞到期时间(入库时间+呆滞日期)
*/
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 {
return null;
}
public void UpdateSubCode(Barcode barcode) {
public synchronized void UpdateSubCode(Barcode barcode) {
if (subCodeList == null) {
subCodeList = Lists.newArrayList();
......
......@@ -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.po.Barcode;
import com.neotel.smfcore.core.barcode.service.po.Component;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.GrLabel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -350,6 +351,7 @@ public class CodeResolve {
//return codeBeanMap.values();
return codeBeans;
}
public Barcode resolveOneValideBarcode(String codeStr ) throws ValidateException{
return resolveOneValideBarcode(codeStr,COMPONENT_TYPE.COMPONENT);
}
......@@ -384,4 +386,15 @@ public class CodeResolve {
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 {
ON_OUT_LINE,
GET_LABEL,
LABELED,
TO_BOX
TO_BOX,
/**
* 需要从流水线上拿走
*/
NEED_AWAY
}
......@@ -490,7 +490,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
task.setExecuteTime(executeTime);
updatePosExecuteTime(posName,executeTime);
}
log.info(task.getBarcode() + "入仓位[" + task.getPosName() + "]完成,执行时间["+executeTime+"]秒");
log.info(task.getBarcode() + "入仓位[" + task.getPosName() + "]完成,执行时间["+executeTime+"]秒");
ReelLockPosUtil.removeReelLockPosInfo(task.getBarcode());
DataLog cancelTask = taskService.findFinishedTask(cid, posName);
if (cancelTask != null && cancelTask.isCancel()) {
......@@ -842,8 +842,8 @@ public class BaseDeviceHandler implements IDeviceHandler {
log.info("ACCSHELF: sourceId=" + sourceId + "的工单[" + order.getOrderNo() + "]开始执行任务:[" + dataLog.getPosName() + "][" + dataLog.getPartNumber() + "][" + dataLog.getBarcode() + "]");
dataLogs.add(dataLog);
isFind = true;
break;
/*isFind = true;
break;*/
}
}
}
......
......@@ -194,7 +194,7 @@ public class MimoBoxHandler extends BaseDeviceHandler {
// }
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)) {
throw new ValidateException("smfcore.error", outResult);
}
......
......@@ -4,7 +4,9 @@ import cn.hutool.core.util.ObjectUtil;
import com.google.common.base.Strings;
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.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.api.bean.CodeValidateParam;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.bean.NLShelfOperateBean;
......@@ -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.util.DevicesStatusUtil;
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.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import net.bytebuddy.asm.Advice;
import org.omg.CORBA.PRIVATE_MEMBER;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.ObjectUtils;
......@@ -35,6 +39,7 @@ import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
@Api(tags = "SHELF: NL(智能料架/亮灯料架/普通料架)")
@RestController
......@@ -56,6 +61,9 @@ public class NLShelfHandler extends BaseDeviceHandler {
String putInColor = "green";
int delayCloseTime = 30000;
@Autowired
private InnerBoxRestController innerBoxRestController;
@Override
public StatusBean handleClientRequest(StatusBean statusBean, HttpServletRequest request) {
statusBean.setClientIp(request.getRemoteHost());
......@@ -71,10 +79,10 @@ public class NLShelfHandler extends BaseDeviceHandler {
String cid = statusBean.getCid();
List<DataLog> finishedTasks = taskService.getFinishedTasks();
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);
statusBean.addData("close",finishedTask.getPosName());
statusBean.addData("close", finishedTask.getPosName());
}
}
......@@ -84,35 +92,52 @@ public class NLShelfHandler extends BaseDeviceHandler {
}
//亮灯
List<DataLog> dataLogs = new ArrayList<>();
Collection<DataLog> queueTasks = taskService.getQueueTasks(statusBean.getCid());
for (DataLog queueTask : queueTasks) {
if (queueTask.isWait()) {
queueTask.setStatus(OP_STATUS.EXECUTING.name());
taskService.updateQueueTask(queueTask);
String rgb = queueTask.getLightColor();
ORDER_COLOR color = ORDER_COLOR.fromRgb(rgb);
if (color == null) {
if (queueTask.isPutInTask()) {
color = ORDER_COLOR.DARKGREEN;
} else if (openZhiYin && ObjectUtil.isNotEmpty(queueTask.getSourceId())) {
List<DataLog> dataLogList = outMap.get(queueTask.getSourceId());
if (dataLogList == null) {
dataLogList = new ArrayList<>();
if (queueTasks != null && !queueTasks.isEmpty()) {
//判断有没有正在执行的任务,如果有,则跳过
boolean hasExecutingTask = false;
for (DataLog queueTask : queueTasks) {
if (queueTask.isExecuting()) {
hasExecutingTask = true;
break;
}
}
if (!hasExecutingTask) {
//按创建时间进行排序,取第一条
queueTasks = queueTasks.stream().distinct().sorted(Comparator.comparing(DataLog::getCreateDate)).collect(Collectors.toList());
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) {
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;
}
......@@ -325,7 +350,13 @@ public class NLShelfHandler extends BaseDeviceHandler {
}
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());
if (inPos != null) {
Collection<DataLog> allTasks = taskService.getQueueTasks();
......@@ -340,6 +371,11 @@ public class NLShelfHandler extends BaseDeviceHandler {
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);
opPosLight("close", inPos, "");
log.info(code + " 出库完成, 库位[" + inPos.getPosName() + "]灭灯");
......
......@@ -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.util.DevicesStatusUtil;
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.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.device.handler.IDeviceHandler;
......@@ -62,6 +63,9 @@ public class DeviceController {
@Autowired
private SmfApi smfApi;
@Autowired
private LizhenApi lizhenApi;
private Map<String, IDeviceHandler> handlerMap = new HashMap<>();
public DeviceController(List<IDeviceHandler> deviceHandlerList) {
......@@ -111,7 +115,7 @@ public class DeviceController {
@PostMapping(value = "/service/store/emptyPosForPutin")
@ResponseBody
@AnonymousAccess
public Map<String, Object> emptyPosForPutin(HttpServletRequest request) {
public synchronized Map<String, Object> emptyPosForPutin(HttpServletRequest request) {
String code = request.getParameter("code");
String cids = request.getParameter("cids");
String rfid = request.getParameter("rfid");
......@@ -170,7 +174,7 @@ public class DeviceController {
barcode = barcodeCanPutIn;
}
Barcode barcodeApi = smfApi.barcodeInfo(barcode);
Barcode barcodeApi = lizhenApi.barcodeInfo(barcode);
if (barcodeApi != null){
barcode = barcodeApi;
}
......
......@@ -6,22 +6,16 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.neotel.smfcore.common.exception.ValidateException;
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.po.Barcode;
import com.neotel.smfcore.core.barcode.service.po.Component;
import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.inList.util.InListCache;
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.storage.bean.InventoryItem;
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.DeviceType;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.bean.OrderSetting;
import com.neotel.smfcore.core.system.service.dao.ICacheItemDao;
......@@ -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.Settings;
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.Logger;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -41,8 +34,6 @@ import org.springframework.stereotype.Repository;
import javax.annotation.PostConstruct;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 缓存
......@@ -74,6 +65,7 @@ public class DataCache {
@Autowired
private IComponentManager componentManager;
/**
* 是否需要推送温湿度报警值
*/
......@@ -155,8 +147,7 @@ public class DataCache {
List<String> ruleList=(List<String>)value;
codeResolve.updateBarcodeRuleList(ruleList);
}
log.info("updateCache ["+cacheKey+"]=["+value+"]");
//log.info("updateCache ["+cacheKey+"]=["+value+"]");
}
/**
......@@ -669,10 +660,10 @@ public class DataCache {
public List<String> getAvailableStorageIds(){
List<String> availableStorageIds = new ArrayList<>();
for (Storage storage : getAllStorage().values()) {
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
/*StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (bean == null || bean.timeOut() || !bean.isAvailable()) {
continue;
}
}*/
availableStorageIds.add(storage.getId());
}
return availableStorageIds;
......
......@@ -144,6 +144,7 @@ public class LanguageMsgController {
@ApiOperation("新增资源")
@PostMapping
@PreAuthorize("@el.check('translation')")
@AnonymousAccess
public ResponseEntity<Object> create( @RequestBody LanguageMsgDto resources) {
LanguageMsg msg=languageMsgMapper.toEntity(resources);
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;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
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.rest.bean.dto.OrderDto;
import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderItemMapper;
......@@ -179,7 +180,14 @@ public class OrderController {
if (liteOrder == null) {
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)) {
return ResultBean.newOkResult(result);
} else {
......@@ -196,7 +204,17 @@ public class OrderController {
if (orderNo == null) {
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)) {
return ResultBean.newOkResult(result);
} else {
......@@ -210,11 +228,25 @@ public class OrderController {
@PreAuthorize("@el.check('workOrder')")
public ResultBean outTails(@RequestBody Map<String, String> mapValues) {
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) {
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)) {
return ResultBean.newOkResult(result);
} else {
......@@ -281,20 +313,51 @@ public class OrderController {
@GetMapping("/detial")
@PreAuthorize("@el.check('workOrder:detial')")
@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)) {
LiteOrder liteOrder = liteOrderManager.get(id);
if (liteOrder != null) {
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;
}
} else if (!ObjectUtils.isEmpty(orderNo)) {
LiteOrder liteOrder = liteOrderManager.findByOrderNo(orderNo);
if (liteOrder != null) {
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;
}
}
......
......@@ -5,6 +5,8 @@ import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.Transient;
import java.util.Date;
@Getter
@Setter
public class OrderItemDto {
......@@ -51,4 +53,61 @@ public class OrderItemDto {
@Transient
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 {
@Override
public void delete(LiteOrderItem object) throws ValidateException {
liteOrderItemDao.removeOneById(object.getId());
}
@Override
......
......@@ -112,6 +112,17 @@ public class LiteOrder extends BasePo implements Serializable {
*/
private String boxNumber;
/**
* 工单优先级
*/
private int priority = 0;
/**
* 是否超发
*/
private String isExcess;
public void setClosed(boolean value){
this.closed=value;
if(value){
......
package com.neotel.smfcore.core.order.service.po;
import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import lombok.Data;
import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
import java.util.List;
@Data
@Document
public class LiteOrderItem extends BasePo implements Serializable ,Comparable<LiteOrderItem> {
......@@ -26,24 +29,30 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
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
*/
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;
@Data
public class ReportQuery implements Serializable {
@DateTimeFormat(pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private BetweenData<Date> updateDate;
private String pn;
}
......@@ -283,7 +283,7 @@ public class MaterialController {
}
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)) {
throw new ValidateException("smfcore.error", outResult);
}
......@@ -306,7 +306,7 @@ public class MaterialController {
}
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)) {
throw new ValidateException("smfcore.error", outResult);
}
......
......@@ -10,12 +10,16 @@ import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.FileUtil;
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.barcode.bean.CodeBean;
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.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.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.language.util.MessageUtils;
import com.neotel.smfcore.core.message.util.DeviceMessageUtil;
......@@ -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.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.siemens.SiemensApi;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
......@@ -76,6 +82,9 @@ public class StoragePosController {
@Autowired
private CodeMapper codeMapper;
@Autowired
private IBarcodeManager barcodeManager;
@ApiOperation("查询库位")
@GetMapping
......@@ -195,7 +204,7 @@ public class StoragePosController {
// QisdaApi.ClearStockBy(storagePos.getPosName());
Barcode barcode = storagePos.getBarcode();
if (barcode != null) {
barcode = barcodeManager.get(barcode.getId());
log.info("清理库位[" + storagePos.getPosName() + "]中的库存" + barcode.getBarcode());
String opUser = SecurityUtils.getCurrentUsername();
log.info(opUser + "清理库位[" + storagePos.getPosName() + "]中的库存" + barcode.getBarcode());
......@@ -288,6 +297,25 @@ public class StoragePosController {
if (ObjectUtil.isNotEmpty(criteria.getStorageId()) && criteria.getStorageId().equals("0")) {
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);
Criteria baseCriteria = Criteria.where("used").is(true);
......@@ -327,6 +355,136 @@ public class StoragePosController {
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("导出查找出库列表")
@GetMapping(value = "/find/download")
@PreAuthorize("@el.check('checkOut')")
......@@ -415,7 +573,7 @@ public class StoragePosController {
// }
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)) {
throw new ValidateException("smfcore.error", outResult);
}
......
......@@ -56,22 +56,52 @@ public class StoragePosFindCriteria {
@QueryCondition(blurry = "barcode.providerNumber" )
private String providerNumber;
@QueryCondition(blurry = "barcode.partNumber")
private String partNumber;
@QueryCondition(type = QueryCondition.Type.IN,propName = "barcode.subCodeList.partNumber")
private List<String> partNumberList;
@QueryCondition(blurry = "barcode.memo")
private String memo;
@QueryCondition(propName = "barcode.lockId")
private String lockId;
@QueryCondition(blurry = "barcode.batch")
@QueryCondition(blurry = "barcode.batch,barcode.subCodeList.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;
@QueryCondition(propName = "barcode.msl")
@ApiModelProperty("等级")
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(){
int componentType = getType();
if (componentType != -1) {
......
......@@ -67,5 +67,7 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
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;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException;
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.service.po.Barcode;
import com.neotel.smfcore.core.storage.bean.InventoryItem;
......@@ -30,6 +31,7 @@ import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Pattern;
@Service
@Slf4j
......@@ -275,6 +277,36 @@ public class StoragePosManagerImpl implements IStoragePosManager {
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
*/
......@@ -562,10 +594,54 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}
@Override
public StoragePos findByQueryOne(Query query) {
return storagePosDao.findOne(query);
public StoragePos getEmptyPosByStorage(Storage storage, Barcode barcode, Collection<String> excludePosIds, String lastPosId, String logo) throws ValidateException {
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)
*/
......@@ -589,4 +665,5 @@ public class StoragePosManagerImpl implements IStoragePosManager {
return prefixStr +String.format("%0"+posIndexStr.length()+"d",nextPosIndex);
}
}
......@@ -36,9 +36,9 @@ public class DataLogDaoImpl extends AbstractBaseDao implements IDataLogDao {
}
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.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());
if(Strings.isNotBlank(partNumber)){
c.and("partNumber").is(partNumber);
......
......@@ -211,6 +211,71 @@ public class DataLog extends BasePo implements Serializable {
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附加信息
*/
private MSDAppendInfo msdAppendInfo;
......@@ -252,6 +317,9 @@ public class DataLog extends BasePo implements Serializable {
return OP_STATUS.WAIT.name().equals(status);
}
public boolean isToBox(){
return OP_STATUS.TO_BOX.name().equals(status);
}
public boolean isEnd(){
return OP_STATUS.END.name().equals(status);
......
......@@ -8,6 +8,7 @@ import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.ReelLockPosUtil;
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.barcode.enums.COMPONENT_TYPE;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
......@@ -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.service.po.LiteOrder;
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.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
......@@ -64,6 +66,8 @@ public class TaskService {
*/
private static Map<String, DataLog> theFinishedTaskMap = Maps.newConcurrentMap();
private static String posLogo = "";
// public TaskService(List<ITaskListener> listenerList){
// for (ITaskListener taskListener: listenerList) {
// taskListenerList.add(taskListener);
......@@ -103,7 +107,7 @@ public class TaskService {
* @return
* @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) {
String msg = "库位[" + pos.getPosName() + "]中已无物料,忽略";
log.info(msg);
......@@ -135,6 +139,10 @@ public class TaskService {
task.setSingleOut(isSingleOut);
task.setOperator(opUserName);
task.setStorageId(storage.getId());
if (StringUtils.isNotBlank(stationName)){
task.setLoc(stationName);
}
task.setBoxPosName(pos.getPosName());
addTaskToExecute(task);
return "";
}
......@@ -213,13 +221,16 @@ public class TaskService {
* 获取所有任务
*/
public List<DataLog> getAllTasksByCid(String cid) {
List<DataLog> dataLogs = new ArrayList<>();
List<DataLog> allTasks = getAllTasks();
for (DataLog task : allTasks) {
if(task.getCid().equals(cid)){
allTasks.add(task);
if (allTasks != null && !allTasks.isEmpty()) {
for (DataLog task : allTasks) {
if (cid.equals(task.getCid())) {
dataLogs.add(task);
}
}
}
return allTasks;
return dataLogs;
}
/**
......@@ -402,7 +413,7 @@ public class TaskService {
}
String cid = storage.getCid();
//有入库任务的料仓不分配出库任务
if (!hasExecutingTask(cid, OP.PUT_IN)) {
//if (!hasExecutingTask(cid, OP.PUT_IN)) {
DataLog task = findCheckoutBoxTask(storage);
if (task != null) {
......@@ -433,7 +444,7 @@ public class TaskService {
statusBean.addPosInfo(task.getBarcode(), posName, plateW, plateH, isSingleOut);
log.info("出库" + storage.getName() + "[" + posName + "]物料[" + task.getBarcode() + "]" + isSingleOut + "发送到客户端" + cid);
}
}
// }
String posId = statusBean.getData().get("posId");
if (!Strings.isNullOrEmpty(posId)) {
log.info("SEQ:" + statusBean.getSeq() + "出库库位信息:[" + posId + "]发送到客户端");
......@@ -578,10 +589,12 @@ public class TaskService {
//如果有正在执行的任务,把库位发过去
Collection<DataLog> allTasks = taskMap.values();
for (DataLog task : allTasks) {
if (barcode.getBarcode().equals(task.getBarcode())) {
String posId = task.getPosId();
log.info(barcode.getBarcode() + " 已有任务,返回任务中的库位:" + task.getPosName());
return storagePosManager.get(posId);
if (task.isPutInTask() && !task.isFinished() && !task.isCancel()) {
if (barcode.getBarcode().equals(task.getBarcode())) {
String posId = task.getPosId();
log.info(barcode.getBarcode() + " 已有任务,返回任务中的库位:" + task.getPosName());
return storagePosManager.get(posId);
}
}
String storageId = task.getStorageId();
......@@ -660,7 +673,29 @@ public class TaskService {
try {
Collection<String> operatingPosIds = excludePosIds();
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) {
return pos;
}
......@@ -700,8 +735,10 @@ public class TaskService {
} else {
pos = storagePosManager.getByBarcodeId(barcodeSave.getId());
if (barcodeSave.getAmount() <= 0) {
throw new ValidateException("smfcore.error.barcode.wrongQty", "条码[{0}]对应的数量<=0为: {1}", new String[]{barcodeSave.getBarcode(), barcodeSave.getAmount() + ""});
if (!barcodeSave.getBarcode().startsWith("CS") && !barcodeSave.getBarcode().startsWith("CB") && !barcodeSave.getBarcode().startsWith("CM")) {
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 {
//如果已在库位中,那么自动将该库位的物料出库
log.info("出库已在库位中的物料[" + barcodeSave.getBarcode() + "]");
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()});
}
......@@ -745,7 +782,7 @@ public class TaskService {
Collection<DataLog> allTasks = taskMap.values();
if (pos.getBarcode() != null) {
barcode = pos.getBarcode();
//barcode = pos.getBarcode();
for (DataLog task : allTasks) {
if (task.isCheckOutTask()) {
String executeBarcode = task.getBarcode();
......@@ -801,7 +838,7 @@ public class TaskService {
//dataCache.updateStorage(task.getCid());
} else {
barcode = pos.getBarcode();
//barcode = pos.getBarcode();
log.info(opUser + "将【" + barcode.getBarcode() + "】从【" + pos.getPosName() + "】出库");
task.setType(OP.CHECKOUT);
barcode.setUsed(true);
......
......@@ -138,7 +138,7 @@ public class WebSocketServer {
}
/**
* 群发自定义消息
* 群发自定义消息ma
* */
private static void sendInfo(SocketMsg socketMsg,@PathParam("sid") String sid){
String message = JSONObject.toJSONString(socketMsg);
......
......@@ -392,11 +392,6 @@ public class AdvantechApi extends BaseSmfApiListener {
}
@Override
public Barcode barcodeInfo(String barcodeInfoUrl, Barcode barcode) {
return null;
}
@Override
public boolean isForThisApi(String apiName) {
return apiName != null && apiName.equalsIgnoreCase("Advantech");
}
......
......@@ -26,11 +26,6 @@ public class HellaApiHandler extends BaseSmfApiListener {
}
@Override
public Barcode barcodeInfo(String barcodeInfoUrl, Barcode barcode) {
return null;
}
@Override
public boolean isForThisApi(String apiName) {
return apiName != null && apiName.equalsIgnoreCase("Hella");
}
......
......@@ -213,7 +213,7 @@ public class HellaServiceHandler extends BaseSmfApiListener implements IoHandler
}else{
Storage storage = dataCache.getStorageById(storagePos.getStorageId());
try{
taskService.checkout(storage,storagePos,false,"");
taskService.checkout(storage,storagePos,false,"","");
}catch(ValidateException ve){
resultCode = "-3";
resultMsg = ve.getMessage();
......@@ -578,12 +578,6 @@ public class HellaServiceHandler extends BaseSmfApiListener implements IoHandler
}
@Override
public Barcode barcodeInfo(String barcodeInfoUrl, Barcode barcode) {
return null;
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
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;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author sunke
* @date 2022/9/22 4:32 PM
......@@ -54,11 +56,42 @@ public class Station {
*/
private int height;
/**
* GR标签
* gr标签
*/
private String grLabel;
/**
* gr行
*/
private String labelItem;
/**
* 上一个隔扣码
*/
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;
import com.neotel.smfcore.core.system.service.dao.IDataLogDao;
import com.neotel.smfcore.core.system.service.po.DataLog;
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.util.StationCacheUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
......@@ -70,6 +73,20 @@ public class AgvBoxDeviceClientController {
String stationName = "s" + i;
String rfid = request.getParameter(stationName);
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"]//需要线体升起阻挡进行入库的工位
List<String> needInStationList = new ArrayList<>();
......@@ -120,6 +137,10 @@ public class AgvBoxDeviceClientController {
Collection<DataLog> queueTasks = taskService.getQueueTasks();
List<Map<String, String>> taskToSend = new ArrayList<>();
for (DataLog queueTask : queueTasks) {
//小车限制,默认一次生成200个任务
if (taskToSend != null && taskToSend.size() >= 200) {
break;
}
if (queueTask.isCheckOutTask()) {
if (queueTask.isWait() || queueTask.isExecuting()) {
Storage storage = dataCache.getStorageById(queueTask.getStorageId());
......@@ -163,7 +184,7 @@ public class AgvBoxDeviceClientController {
}
}
}
String target = "0";
String target = "s0";
String barcode = "";
//"target": "1",//0=工位已有箱子;s1=工位1;s2=工位2;s3=工位3;s4=工位4;s5=工位5;其他值表示入库的目标库位
if (opTask != null) {
......@@ -200,6 +221,21 @@ public class AgvBoxDeviceClientController {
target = station.getName();
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 {
public synchronized ResultBean updateLocInfo(HttpServletRequest request) {
String rfid = request.getParameter("barcode");
String statusStr = request.getParameter("status");
String loc = request.getParameter("loc"); //工位
log.debug("收到料盘[" + rfid + "]更新位置指令[" + statusStr + "]");
if (statusStr == null) {
return ResultBean.newErrorResult(301, "smfcore.updateLoc.status.empty", "状态不能为空");
......@@ -273,12 +310,19 @@ public class AgvBoxDeviceClientController {
* FINISHED=任务完成(入库时AGV将料箱放入库位;出库时料箱到达工位)
*/
if (updateStatus != null) {
String statusOri = opTask.getStatus(); //任务的上一个状态
opTask.setStatus(statusStr);
if (opTask.isCheckOutTask()) {
if (OP_STATUS.EXECUTING.name().equals(statusStr)) {
//在执行队列中
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);
if (OP_STATUS.OUT_ON_AGV.name().equals(statusStr)) {
......@@ -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 {
private String slot;
private String subslot;
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 {
}
@Override
public Barcode barcodeInfo(String barcodeInfoUrl, Barcode barcode) {
return null;
}
@Override
public void inTaskStatusChange(String inNotifyUrl, DataLog task) {
if(task.isFinished()){
if(task.isPutInTask()){
......
......@@ -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) {
if (ObjectUtil.isEmpty(url)) {
log.info("没有配置Siemens,无需验证");
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!