Commit 5a8586c2 zshaohui

1.工单关闭和清空库位增加权限密码

2.缺料预警设置指定时间生成出库任务
3.出库时调用不同的接口
4.解析物料供应商,批次修改
5.内外仓一键导入功能
6.外仓上传工单增加库别和线体
7.外仓工单出库优化
1 个父辈 0eebc292
正在显示 67 个修改的文件 包含 2795 行增加557 行删除
...@@ -235,6 +235,7 @@ public class DataInitManager { ...@@ -235,6 +235,7 @@ public class DataInitManager {
addNewFunctionMenu(88,pMenuReport,"innerIssueReport","发料","innerIssueReport","innerWarehouse/issueReport/index","IssueRe",functionMenuMap); addNewFunctionMenu(88,pMenuReport,"innerIssueReport","发料","innerIssueReport","innerWarehouse/issueReport/index","IssueRe",functionMenuMap);
addNewFunctionMenu(89,pMenuReport,"innerMaShortReport","缺料","innerMaShortReport","innerWarehouse/maShortReport/index","maShort",functionMenuMap); addNewFunctionMenu(89,pMenuReport,"innerMaShortReport","缺料","innerMaShortReport","innerWarehouse/maShortReport/index","maShort",functionMenuMap);
addNewFunctionMenu(90,pMenuReport,"innerProLimitReport","禁限用","innerProLimitReport","innerWarehouse/proLimitReport/index","proLimit",functionMenuMap); addNewFunctionMenu(90,pMenuReport,"innerProLimitReport","禁限用","innerProLimitReport","innerWarehouse/proLimitReport/index","proLimit",functionMenuMap);
addNewFunctionMenu(91,pMenuReport,"imDetailsReport","导入明细","imDetailsReport","innerWarehouse/imDetailsReport/index","feeding",functionMenuMap);
//可观测性:物料追踪 //可观测性:物料追踪
...@@ -307,6 +308,25 @@ public class DataInitManager { ...@@ -307,6 +308,25 @@ public class DataInitManager {
addNewFunctionMenu(1,null,"elecKanban", "电子看板","elecKanban", "elecKanban/index","kanban",functionMenuMap); addNewFunctionMenu(1,null,"elecKanban", "电子看板","elecKanban", "elecKanban/index","kanban",functionMenuMap);
addNewFunctionMenu(135,null,"sysInventory", "盘点出库","sysInventory", "system/sysInventory/index","mIDList",functionMenuMap); addNewFunctionMenu(135,null,"sysInventory", "盘点出库","sysInventory", "system/sysInventory/index","mIDList",functionMenuMap);
//汇总报表
Menu meMenuReport = Menu.CreatePMenu("汇总报表", 17, "meReport", 3, "inOutData",null);
Menu meOuterMenuReport = Menu.CreatePMenu("外仓", 18, "meOuterReport", 7, "inOutData",meMenuReport);
addNewFunctionMenu(136,meOuterMenuReport,"meIssueDetailsList","发料","meIssueDetailsList","report/mIssueDetailsList/index","IssueRe",functionMenuMap);
addNewFunctionMenu(137,meOuterMenuReport,"meProhibitedReport","禁限用","meProhibitedReport","report/prohibitedReport/index","proLimit",functionMenuMap);
addNewFunctionMenu(138,meOuterMenuReport,"meMPreListReport","备料清单","meMPreListReport","report/mPreListReport/index","mPreListReport",functionMenuMap);
addNewFunctionMenu(139,meOuterMenuReport,"meChangeReport","异动","meChangeReport","report/changeReport/index","chageReport",functionMenuMap);
addNewFunctionMenu(140,meOuterMenuReport,"meMShortageReport","缺料","meMShortageReport","report/mShortageReport/index","maShort",functionMenuMap);
addNewFunctionMenu(141,meOuterMenuReport,"mePkSearch","PK查询","mePkSearch","report/pkSearch/index","findOut",functionMenuMap);
addNewFunctionMenu(142,meOuterMenuReport,"meSysInReport","盘点","meSysInReport","report/sysInReport/index","mIDList",functionMenuMap);
Menu meInnerMenuReport = Menu.CreatePMenu("内仓", 19, "meInnerReport", 1, "inOutData",meMenuReport);
addNewFunctionMenu(143,meInnerMenuReport,"meInnerChangeReport","异动","meInnerChangeReport","report/inner/changeReport/index","chageReport",functionMenuMap);
addNewFunctionMenu(144,meInnerMenuReport,"meInnerMShortageReport","缺料","meInnerMShortageReport","report/inner/maShortReport/index","maShort",functionMenuMap);
addNewFunctionMenu(145,meInnerMenuReport,"meInnerProLimitReport","禁限用","meInnerProLimitReport","report/inner/proLimitReport/index","proLimit",functionMenuMap);
addNewFunctionMenu(136,meMenuReport,"meInventory","汇总库存","meInventory","report/inventory/index","inventory",functionMenuMap);
return functionMenuMap; return functionMenuMap;
} }
......
package com.neotel.smfcore.common.init; package com.neotel.smfcore.common.init;
import com.neotel.smfcore.common.utils.Constants;
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.system.service.manager.IDataLogManager; import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.DataLog; import com.neotel.smfcore.core.system.service.po.DataLog;
...@@ -29,19 +31,22 @@ public class MainTimer { ...@@ -29,19 +31,22 @@ public class MainTimer {
@Autowired @Autowired
LiteOrderCache liteOrderCache; LiteOrderCache liteOrderCache;
public void init() {
initTask(); @Autowired
DataCache dataCache;
public void init() {
initTask();
liteOrderCache.loadUnEndOrderInfos(); liteOrderCache.loadUnEndOrderInfos();
log.info("主定时器开启,60秒后开始执行, 每300s执行一次");
log.info("主定时器开启,60秒后开始执行");
//1 分钟之后执行,每秒钟执行一次 //1 分钟之后执行,每秒钟执行一次
scheduledThreadPool.scheduleAtFixedRate(new Runnable() { scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override @Override
public void run() { public void run() {
timerTask(); timerTask();
} }
}, 60, 300, TimeUnit.SECONDS); }, 5, 10, TimeUnit.SECONDS);
//log.info("如果是人工叫料,则每2分钟执行一次"); //log.info("如果是人工叫料,则每2分钟执行一次");
scheduledThreadPool.scheduleAtFixedRate(new Runnable() { scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
...@@ -49,7 +54,7 @@ public class MainTimer { ...@@ -49,7 +54,7 @@ public class MainTimer {
public void run() { public void run() {
timerTaskLz(); timerTaskLz();
} }
}, 60, 5, TimeUnit.SECONDS); }, 5, 10, TimeUnit.SECONDS);
} }
private void initTask() { private void initTask() {
log.info("开始加载未完成的任务..."); log.info("开始加载未完成的任务...");
...@@ -66,9 +71,13 @@ public class MainTimer { ...@@ -66,9 +71,13 @@ public class MainTimer {
log.info("加载未完成的任务完成,共[" + unExecuteTasks.size() + "]条数据..."); log.info("加载未完成的任务完成,共[" + unExecuteTasks.size() + "]条数据...");
} }
private void timerTask(){ private void timerTask() {
try{ if (!preGenerateTaskTime()) {
//log.info("机器叫料,每5分钟执行一次"); return;
}
lastPreGenerateTaskTime = System.currentTimeMillis();
try {
log.info("生成缺料预警任务");
PreWarningItemCache.runTimer(0); PreWarningItemCache.runTimer(0);
//liteOrderCache.runTimer(0); //liteOrderCache.runTimer(0);
//设备状态判断 //设备状态判断
...@@ -76,9 +85,9 @@ public class MainTimer { ...@@ -76,9 +85,9 @@ public class MainTimer {
//其他设备状态判断 //其他设备状态判断
EquipStatusUtil.runTimer(); EquipStatusUtil.runTimer();
}catch (Exception e){ } catch (Exception e) {
log.error("定时器执行出错",e); log.error("定时器执行出错", e);
}finally { } finally {
} }
} }
...@@ -94,4 +103,22 @@ public class MainTimer { ...@@ -94,4 +103,22 @@ public class MainTimer {
log.error("定时器执行出错", e); log.error("定时器执行出错", e);
} }
} }
//判断当前时间与上一次执行时间相差时间是否与配置相同
private static long lastPreGenerateTaskTime = 0l;
private boolean preGenerateTaskTime() {
int min = 0;
try {
min = dataCache.getCache(Constants.CACHE_preGenerateTask);
} catch (Exception e) {
e.printStackTrace();
log.error("设置缺料预警执行时间报错");
dataCache.updateCache(Constants.CACHE_preGenerateTask,0);
}
if (min == 0) {
min = 5;
}
return System.currentTimeMillis() - lastPreGenerateTaskTime >= min * 60 * 1000 ? true : false;
}
} }
...@@ -154,4 +154,20 @@ public class Constants { ...@@ -154,4 +154,20 @@ public class Constants {
* 上次自动存档时间 * 上次自动存档时间
*/ */
public static final String LAST_BACKUP_TIME_KEY = "db.backup.lastTime"; public static final String LAST_BACKUP_TIME_KEY = "db.backup.lastTime";
/**
* 缺料预警生成工单时间
*/
public static final String CACHE_preGenerateTask = "preGenerateTask";
/**
* 权限密码
*/
public static final String CACHE_permissionPassword = "permissionPassword";
/**
* 楼层
*/
public static final String CACHE_floor = "floor";
} }
...@@ -117,6 +117,18 @@ public class ReelLockPosUtil { ...@@ -117,6 +117,18 @@ public class ReelLockPosUtil {
return lockPosIds; return lockPosIds;
} }
public static boolean posIsLock(String posName){
boolean isLock = false;
for (ReelLockPosInfo info : reelLocKPosMap.values()) {
if (posName.equals(info.getLockPosName())){
isLock = true;
break;
}
}
return isLock;
}
public static Collection<ReelLockPosInfo> getAllReelLockPosInfo(){ public static Collection<ReelLockPosInfo> getAllReelLockPosInfo(){
return reelLocKPosMap.values(); return reelLocKPosMap.values();
} }
......
...@@ -8,6 +8,7 @@ import com.neotel.smfcore.core.api.bean.CodeValidateParam; ...@@ -8,6 +8,7 @@ import com.neotel.smfcore.core.api.bean.CodeValidateParam;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.service.po.LiteOrder; import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.system.service.po.DataLog; import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.custom.lizhen.LizhenApi;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings; import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -61,6 +62,9 @@ public class SmfApi { ...@@ -61,6 +62,9 @@ public class SmfApi {
@Value("${api.importUrl}") @Value("${api.importUrl}")
protected String importUrl; protected String importUrl;
@Autowired
private LizhenApi lizhenApi;
@PostConstruct @PostConstruct
public void init(){ public void init(){
apiName = dataCache.getConfigCache("api.name",apiName); apiName = dataCache.getConfigCache("api.name",apiName);
...@@ -178,4 +182,14 @@ public class SmfApi { ...@@ -178,4 +182,14 @@ public class SmfApi {
} }
return false; return false;
} }
public void outTaskStatusChange(List<DataLog> dataLogList) {
for (ISmfApiListener apiListener : apiListenerList) {
if (apiListener.isForThisApi(apiName)) {
if (isUrlExist(outNotifyUrl)) {
apiListener.outTaskStatusChange(outNotifyUrl, dataLogList);
}
}
}
}
} }
...@@ -82,6 +82,11 @@ public class DefaultSmfApiListener extends BaseSmfApiListener { ...@@ -82,6 +82,11 @@ public class DefaultSmfApiListener extends BaseSmfApiListener {
} }
} }
@Override
public void outTaskStatusChange(String outNotifyUrl, List<DataLog> dataLogList) {
}
private String getData(Map<String,Object> dataMap, String dataKey){ private String getData(Map<String,Object> dataMap, String dataKey){
Object data = dataMap.get(dataKey); Object data = dataMap.get(dataKey);
if(data == null){ if(data == null){
......
...@@ -6,6 +6,8 @@ import com.neotel.smfcore.core.api.bean.CodeValidateParam; ...@@ -6,6 +6,8 @@ import com.neotel.smfcore.core.api.bean.CodeValidateParam;
import com.neotel.smfcore.core.order.service.po.LiteOrder; import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.system.service.po.DataLog; import com.neotel.smfcore.core.system.service.po.DataLog;
import java.util.List;
public interface ISmfApiListener { public interface ISmfApiListener {
/** /**
...@@ -24,6 +26,9 @@ public interface ISmfApiListener { ...@@ -24,6 +26,9 @@ public interface ISmfApiListener {
*/ */
void outTaskStatusChange(String outNotifyUrl, DataLog task); void outTaskStatusChange(String outNotifyUrl, DataLog task);
void outTaskStatusChange(String outNotifyUrl, List<DataLog> dataLogList);
/** /**
* 是否可入库验证 * 是否可入库验证
*/ */
......
...@@ -556,14 +556,22 @@ public class BarcodeRule { ...@@ -556,14 +556,22 @@ public class BarcodeRule {
codeBean.setError("smfcore.error.barcode.noField",new String[]{"PN"}, "条码解析失败,未找到{0}字段"); codeBean.setError("smfcore.error.barcode.noField",new String[]{"PN"}, "条码解析失败,未找到{0}字段");
return codeBean; return codeBean;
} }
if(batch_item.hasThisField()){ if(batch_item.hasThisField()) {
String batch = batch_item.getStrValue(codeArr); String batch = batch_item.getStrValue(codeArr);
if (batch.indexOf("-") == -1){ if (batch.indexOf("-") == -1) {
log.info("条码解析失败,BATCH字段不合规则"); log.info("条码解析失败,BATCH字段不合规则");
codeBean.setError("smfcore.error.barcode.noField",new String[]{"BATCH"},"条码解析失败,未找到{0}字段"); codeBean.setError("smfcore.error.barcode.noField", new String[]{"BATCH"}, "条码解析失败,未找到{0}字段");
return codeBean; return codeBean;
} }
batch = batch.substring(0,batch.lastIndexOf("-")); if (batch.contains(",")) {
String[] batchStr = batch.split(",");
for (String str : batchStr) {
batch = str.substring(0, str.lastIndexOf("-"));
break;
}
} else {
batch = batch.substring(0, batch.lastIndexOf("-"));
}
b.setBatch(batch); b.setBatch(batch);
} }
int quantity = 0; int quantity = 0;
...@@ -574,6 +582,13 @@ public class BarcodeRule { ...@@ -574,6 +582,13 @@ public class BarcodeRule {
codeBean.setError("smfcore.error.barcode.noField",new String[]{"QTY"},"条码解析失败,未找到{0}字段"); codeBean.setError("smfcore.error.barcode.noField",new String[]{"QTY"},"条码解析失败,未找到{0}字段");
return codeBean; return codeBean;
} }
if (quantity == 0) {
if (!(codeStr.startsWith("CS") || codeStr.startsWith("CM") || codeStr.startsWith("CB"))) {
log.info("条码解析失败,未找到QTY 字段");
codeBean.setError("smfcore.error.barcode.noField", new String[]{"QTY"}, "条码解析失败,未找到{0}字段");
return codeBean;
}
}
} }
Date produceDate= produceDate_item.getDateValue(codeArr); Date produceDate= produceDate_item.getDateValue(codeArr);
...@@ -613,14 +628,28 @@ public class BarcodeRule { ...@@ -613,14 +628,28 @@ public class BarcodeRule {
b.setMemo(memo); b.setMemo(memo);
} }
if (dateCode_item.hasThisField()){ if (dateCode_item.hasThisField()) {
String dateCode = dateCode_item.getStrValue(codeArr); String dateCode = dateCode_item.getStrValue(codeArr);
if (dateCode.indexOf("-") == -1){ if (dateCode.indexOf("-") == -1) {
log.info("条码解析失败,DATECODE字段不合规则"); log.info("条码解析失败,DATECODE字段不合规则");
codeBean.setError("smfcore.error.barcode.noField",new String[]{"DATECODE"},"条码解析失败,未找到{0}字段"); codeBean.setError("smfcore.error.barcode.noField", new String[]{"DATECODE"}, "条码解析失败,未找到{0}字段");
return codeBean; return codeBean;
} }
dateCode = dateCode.substring(dateCode.lastIndexOf("-")+1); //判断是否包含","
if (dateCode.contains(",")) {
String newDateCode = "";
String[] dateCodeStr = dateCode.split(",");
for (String str : dateCodeStr) {
if (StringUtils.isBlank(newDateCode)) {
newDateCode = str.substring(str.lastIndexOf("-") + 1);
} else {
newDateCode = newDateCode + "/" + str.substring(str.lastIndexOf("-") + 1);
}
}
dateCode = newDateCode;
} else {
dateCode = dateCode.substring(dateCode.lastIndexOf("-") + 1);
}
b.setDateCode(dateCode); b.setDateCode(dateCode);
} }
...@@ -867,6 +896,9 @@ public class BarcodeRule { ...@@ -867,6 +896,9 @@ public class BarcodeRule {
codeStr = "353S03035-620140|F10-9FHLF6-2302|15000|M35620140022302AF|QORVO|"; codeStr = "353S03035-620140|F10-9FHLF6-2302|15000|M35620140022302AF|QORVO|";
rule = "PN[-1:50:-1]PROVIDERNUMBER[-1:50:-1]|BATCH[-1:50:-1]DATECODE[-1:50:-1]|QTY|RI|SP|6"; rule = "PN[-1:50:-1]PROVIDERNUMBER[-1:50:-1]|BATCH[-1:50:-1]DATECODE[-1:50:-1]|QTY|RI|SP|6";
codeStr = "=7X8=CS0010-1";
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();
if(b != null){ if(b != null){
......
...@@ -4,6 +4,7 @@ import com.google.common.base.Strings; ...@@ -4,6 +4,7 @@ import com.google.common.base.Strings;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.DateUtil; import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.bean.BarcodeRule; import com.neotel.smfcore.core.barcode.bean.BarcodeRule;
import com.neotel.smfcore.core.barcode.bean.CodeBean; import com.neotel.smfcore.core.barcode.bean.CodeBean;
import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE; import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE;
...@@ -20,6 +21,7 @@ import org.yaml.snakeyaml.comments.CommentType; ...@@ -20,6 +21,7 @@ import org.yaml.snakeyaml.comments.CommentType;
import java.util.Collection; import java.util.Collection;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale;
/** /**
* Created by sunke on 2021/7/13. * Created by sunke on 2021/7/13.
...@@ -52,7 +54,7 @@ public class CodeResolve { ...@@ -52,7 +54,7 @@ public class CodeResolve {
* 解析条码为单个 Barcode,自动保存到数据库 * 解析条码为单个 Barcode,自动保存到数据库
*/ */
public CodeBean resolveSingleCode(String barcodeItemStr,int type){ public CodeBean resolveSingleCode(String barcodeItemStr,int type){
//barcodeItemStr = barcodeItemStr.toUpperCase(Locale.ROOT);
if(barcodeRuleList == null || barcodeRuleList.isEmpty()){ if(barcodeRuleList == null || barcodeRuleList.isEmpty()){
CodeBean codeBean = new CodeBean(); CodeBean codeBean = new CodeBean();
codeBean.setBarcode(null); codeBean.setBarcode(null);
...@@ -94,7 +96,7 @@ public class CodeResolve { ...@@ -94,7 +96,7 @@ public class CodeResolve {
codeBeanFromRule.setShowImg(component.getShowImg()); codeBeanFromRule.setShowImg(component.getShowImg());
//如果已经确认尺寸,使用确认的尺寸 //如果已经确认尺寸,使用确认的尺寸
if (component.isSizeConfirmed() || ((component.hasSizeInfo()) && (!codeBeanFromRule.hasReelSizeInfo()))) { if (component.isSizeConfirmed() /*|| ((component.hasSizeInfo()) && (!codeBeanFromRule.hasReelSizeInfo()))*/) {
codeBeanFromRule.setReelWidth(component.getPlateSize()); codeBeanFromRule.setReelWidth(component.getPlateSize());
codeBeanFromRule.setReelHeight(component.getHeight()); codeBeanFromRule.setReelHeight(component.getHeight());
...@@ -154,10 +156,27 @@ public class CodeResolve { ...@@ -154,10 +156,27 @@ public class CodeResolve {
} }
} }
} }
//判断供应商代码是否为空
String providerNumber = barcodeFromRule.getProviderNumber();
if (StringUtils.isNotBlank(providerNumber)){
barcode.setProviderNumber(providerNumber);
needUpdate = true;
}
//判断日期代码
String dateCode = barcodeFromRule.getDateCode();
if (StringUtils.isNotBlank(dateCode)){
barcode.setDateCode(dateCode);
needUpdate = true;
}
//判断批次
String batch = barcodeFromRule.getBatch();
if (StringUtils.isNotBlank(batch)){
barcode.setBatch(batch);
needUpdate = true;
}
if(needUpdate){ if(needUpdate){
try { try {
barcodeManager.save(barcode); barcode = barcodeManager.save(barcode);
}catch (Exception e){ }catch (Exception e){
log.error("",e); log.error("",e);
} }
......
package com.neotel.smfcore.core.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.web.PageableHandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import java.util.List;
@Configuration
public class PageConfig extends WebMvcConfigurerAdapter {
private static final int PMP_MAX_PAGE_SIZE = 10000;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
resolver.setMaxPageSize(PMP_MAX_PAGE_SIZE);
argumentResolvers.add(resolver);
super.addArgumentResolvers(argumentResolvers);
}
}
...@@ -181,6 +181,7 @@ public class DeviceController { ...@@ -181,6 +181,7 @@ public class DeviceController {
StoragePos storagePos = storagePosManager.getByBarcode(barcode.getBarcode()); StoragePos storagePos = storagePosManager.getByBarcode(barcode.getBarcode());
if (storagePos != null) { if (storagePos != null) {
Storage storage = dataCache.getStorageById(storagePos.getStorageId()); Storage storage = dataCache.getStorageById(storagePos.getStorageId());
if (storage.isVirtual()) {
DataLog dataLog = new DataLog(storage, barcode, storagePos); DataLog dataLog = new DataLog(storage, barcode, storagePos);
dataLog.setStatus(OP_STATUS.FINISHED.name()); dataLog.setStatus(OP_STATUS.FINISHED.name());
dataLog.setExtendType(ExtendType.VIRTUAL_CHECKOUT); //虚拟出库 dataLog.setExtendType(ExtendType.VIRTUAL_CHECKOUT); //虚拟出库
...@@ -195,6 +196,7 @@ public class DeviceController { ...@@ -195,6 +196,7 @@ public class DeviceController {
storagePosManager.save(storagePos); storagePosManager.save(storagePos);
dataCache.updateInventory(storagePos, barcode); dataCache.updateInventory(storagePos, barcode);
} }
}
Barcode barcodeCanPutIn = smfApi.canPutInAfterResolve(barcode); Barcode barcodeCanPutIn = smfApi.canPutInAfterResolve(barcode);
if (barcodeCanPutIn != null){ if (barcodeCanPutIn != null){
......
...@@ -6,6 +6,7 @@ import com.google.common.collect.Lists; ...@@ -6,6 +6,7 @@ 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.core.barcode.bean.PlateSizeBean;
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;
...@@ -16,17 +17,15 @@ import com.neotel.smfcore.core.language.util.MessageUtils; ...@@ -16,17 +17,15 @@ 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.manager.IStorageManager;
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.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;
import com.neotel.smfcore.core.system.service.dao.ISettingsDao; import com.neotel.smfcore.core.system.service.dao.ISettingsDao;
import com.neotel.smfcore.core.barcode.bean.PlateSizeBean;
import com.neotel.smfcore.core.storage.service.manager.IStorageManager;
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 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;
...@@ -66,7 +65,6 @@ public class DataCache { ...@@ -66,7 +65,6 @@ public class DataCache {
@Autowired @Autowired
private IComponentManager componentManager; private IComponentManager componentManager;
/** /**
* 是否需要推送温湿度报警值 * 是否需要推送温湿度报警值
*/ */
......
...@@ -291,7 +291,9 @@ public class LiteOrderCache { ...@@ -291,7 +291,9 @@ public class LiteOrderCache {
} }
else if (task.isFinished()) { else if (task.isFinished()) {
order.setTotalFinishedReelCount(order.getTotalFinishedReelCount() + 1); order.setTotalFinishedReelCount(order.getTotalFinishedReelCount() + 1);
if (task.getExtendType() != ExtendType.MANUAL_FEEDING) {
order.setFinishedReelCount(order.getFinishedReelCount() + 1); order.setFinishedReelCount(order.getFinishedReelCount() + 1);
}
String orderItemId = task.getSubSourceId(); String orderItemId = task.getSubSourceId();
List<LiteOrderItem> orderItems = order.getOrderItems(); List<LiteOrderItem> orderItems = order.getOrderItems();
List<LiteOrderItem> liteOrderItems = new ArrayList<>(); List<LiteOrderItem> liteOrderItems = new ArrayList<>();
...@@ -544,10 +546,10 @@ public class LiteOrderCache { ...@@ -544,10 +546,10 @@ public class LiteOrderCache {
//PN //PN
do { do {
//首先按空闲料仓进行出库 //首先按空闲料仓进行出库
pos = storagePosManager.findPartNumberInStorages(freeStorageIds, partNumber, excludePosIds, checkoutType); pos = storagePosManager.findPartNumberInStorages(freeStorageIds, partNumber, excludePosIds, checkoutType,orderItem.getBrand());
//如果为空的话,则出全部的 //如果为空的话,则出全部的
if (pos == null) { if (pos == null) {
pos = storagePosManager.findPartNumberInStorages(availableStorageIds, partNumber, excludePosIds, checkoutType); pos = storagePosManager.findPartNumberInStorages(availableStorageIds, partNumber, excludePosIds, checkoutType,orderItem.getBrand());
} }
if (pos == null) { if (pos == null) {
break; break;
...@@ -557,6 +559,7 @@ public class LiteOrderCache { ...@@ -557,6 +559,7 @@ public class LiteOrderCache {
} catch (ValidateException e) { } catch (ValidateException e) {
e.printStackTrace(); e.printStackTrace();
log.error(pos.getBarcode().getBarcode() + ":" + e.getMessage()); log.error(pos.getBarcode().getBarcode() + ":" + e.getMessage());
excludePosIds.add(pos.getId());
pos = null; pos = null;
} }
} while (pos == null); } while (pos == null);
...@@ -769,7 +772,7 @@ public class LiteOrderCache { ...@@ -769,7 +772,7 @@ public class LiteOrderCache {
} }
public synchronized String checkOutLiteOrderOut(String orderNo, boolean outBom,List<String> orderItemIds) { public String checkOutLiteOrderOut(String orderNo, boolean outBom,List<String> orderItemIds) {
LiteOrder cacheOrder = liteOrderMap.get(orderNo); LiteOrder cacheOrder = liteOrderMap.get(orderNo);
if (cacheOrder == null) { if (cacheOrder == null) {
cacheOrder = liteOrderManager.findByOrderNo(orderNo); cacheOrder = liteOrderManager.findByOrderNo(orderNo);
...@@ -969,7 +972,8 @@ public class LiteOrderCache { ...@@ -969,7 +972,8 @@ public class LiteOrderCache {
if (needOutPoss != null && !needOutPoss.isEmpty()) { if (needOutPoss != null && !needOutPoss.isEmpty()) {
for (StoragePos pos : needOutPoss) { for (StoragePos pos : needOutPoss) {
Barcode barcode = pos.getBarcode(); Barcode barcode = pos.getBarcode();
DataLog task = new DataLog(dataCache.getStorageById(pos.getStorageId()), barcode, pos); Storage storage = dataCache.getStorageById(pos.getStorageId());
DataLog task = new DataLog(storage, barcode, pos);
task.setSourceId(cacheOrder.getId()); task.setSourceId(cacheOrder.getId());
task.setSourceName(cacheOrder.getOrderNo()); task.setSourceName(cacheOrder.getOrderNo());
task.setSubSourceId(barcode.getLockName()); task.setSubSourceId(barcode.getLockName());
...@@ -977,6 +981,11 @@ public class LiteOrderCache { ...@@ -977,6 +981,11 @@ public class LiteOrderCache {
task.setType(OP.CHECKOUT); task.setType(OP.CHECKOUT);
task.setCreator(SecurityUtils.getCurrentUsername()); task.setCreator(SecurityUtils.getCurrentUsername());
task.setStatus(OP_STATUS.WAIT.name()); task.setStatus(OP_STATUS.WAIT.name());
if (storage.isVirtual()){
task.setExtendType(ExtendType.VIRTUAL_CHECKOUT);
} else {
task.setExtendType(ExtendType.STORAGE_CHECKOUT);
}
try { try {
log.info("生成任务开始"); log.info("生成任务开始");
taskService.addTaskToExecute(task); taskService.addTaskToExecute(task);
......
...@@ -3,6 +3,7 @@ package com.neotel.smfcore.core.order.listener; ...@@ -3,6 +3,7 @@ package com.neotel.smfcore.core.order.listener;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.neotel.smfcore.common.csv.CsvReader; import com.neotel.smfcore.common.csv.CsvReader;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.device.util.DataCache; 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.enums.LITEORDER_SOURCE; import com.neotel.smfcore.core.order.enums.LITEORDER_SOURCE;
...@@ -18,6 +19,7 @@ import org.springframework.stereotype.Service; ...@@ -18,6 +19,7 @@ import org.springframework.stereotype.Service;
import java.io.File; import java.io.File;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
/** /**
* Created by sunke on 2021/7/12. * Created by sunke on 2021/7/12.
...@@ -38,11 +40,6 @@ public class DefaultOrderFileListener implements IOrderFileListener { ...@@ -38,11 +40,6 @@ public class DefaultOrderFileListener implements IOrderFileListener {
@Override @Override
public boolean handleOrderFile(File orderFile) { public boolean handleOrderFile(File orderFile) {
String fileName = orderFile.getName(); String fileName = orderFile.getName();
//String backupFileName = fileName +"_" + System.currentTimeMillis();
//看数据库是否已有此工单
// if(!fileName.endsWith(".process") && fileName.endsWith("_result.txt")){
//
// }
if(isFileType(fileName,"csv")){ if(isFileType(fileName,"csv")){
LiteOrder fileNameOrder = liteOrderManager.findBySource(fileName); LiteOrder fileNameOrder = liteOrderManager.findBySource(fileName);
if(fileNameOrder == null){ if(fileNameOrder == null){
...@@ -75,25 +72,76 @@ public class DefaultOrderFileListener implements IOrderFileListener { ...@@ -75,25 +72,76 @@ public class DefaultOrderFileListener implements IOrderFileListener {
} }
} }
log.info("watchOrderDir:新增加订单:" + liteOrder.getOrderNo() + ",共" + liteOrderItems.size() + "条工单详情"); log.info("watchOrderDir:新增加订单:" + liteOrder.getOrderNo() + ",共" + liteOrderItems.size() + "条工单详情");
String lineStr = "";
for (LiteOrderItem liteOrderItem : liteOrderItems) {
String line = liteOrderItem.getLine();
if (lineStr.contains(line)) {
continue;
} else {
if (StringUtils.isNotBlank(lineStr)) {
lineStr = lineStr + "," + line;
} else {
lineStr = line;
}
}
}
liteOrder.setLine(lineStr);
liteOrder.setSource(LITEORDER_SOURCE.OUTTER.name()); liteOrder.setSource(LITEORDER_SOURCE.OUTTER.name());
liteOrder = liteOrderManager.createWithItems(liteOrder); liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder); liteOrderCache.addOrderToMap(liteOrder);
//resultFile = new File(localDir+File.separator + "sucess",backupFileName);
return true; return true;
} }
} }
}catch (Exception e){ }catch (Exception e){
log.error("read order from file ["+orderFile.getAbsolutePath()+"] :",e); log.error("read order from file ["+orderFile.getAbsolutePath()+"] :",e);
//resultFile = new File(localDir+File.separator + "error",backupFileName);
} }
} }
//resultFile = new File(localDir+File.separator + "sucess",backupFileName);
} }
return false; return false;
}
@Override
public String verifyOrderFile(File orderFile) {
String fileName = orderFile.getName();
if (isFileType(fileName, "csv")) {
LiteOrder fileNameOrder = liteOrderManager.findBySource(fileName);
if (fileNameOrder == null) {
return verifyOrderFile(fileName,orderFile.getAbsolutePath());
}
}
return "";
}
private String verifyOrderFile(String fileName, String fileURL) {
CsvReader csvRead = null;
try {
OrderSetting orderSetting = dataCache.getOrderSetting();
csvRead = CsvReader.newReader(fileURL, "PN", orderSetting.getPn());
int lineIndex = csvRead.getIndex("LINE", orderSetting.getLine());
int warehouseCodeIndex = csvRead.getIndex("WAREHOUSECODE", orderSetting.getWarehouseCode());
while (csvRead.readRecord()) {
String[] lineValues = csvRead.getValues();
if (lineIndex != -1) {
String lineValue = lineValues[lineIndex];
if (StringUtils.isBlank(lineValue)) {
return "线别Line不能为空";
}
}
if (warehouseCodeIndex != -1){
String lineValue = lineValues[warehouseCodeIndex];
if (StringUtils.isBlank(lineValue)){
return "库别不能为空";
}
}
}
} catch (Exception ex) {
log.error("解析上传的工单出错:" + ex.toString());
} finally {
if (csvRead != null) {
csvRead.close();
}
}
return "";
} }
public Map<String , List<LiteOrderItem>> readCsvFile(String fileName, String fileURL) { public Map<String , List<LiteOrderItem>> readCsvFile(String fileName, String fileURL) {
...@@ -102,16 +150,13 @@ public class DefaultOrderFileListener implements IOrderFileListener { ...@@ -102,16 +150,13 @@ public class DefaultOrderFileListener implements IOrderFileListener {
fileName=fileName.replace(".csv",""); fileName=fileName.replace(".csv","");
Map<String ,List<LiteOrderItem>> itemMap=new HashMap<>(); Map<String ,List<LiteOrderItem>> itemMap=new HashMap<>();
List<LiteOrderItem> items = Lists.newArrayList(); List<LiteOrderItem> items = Lists.newArrayList();
OrderSetting orderSetting = dataCache.getOrderSetting(); OrderSetting orderSetting = dataCache.getOrderSetting();
csvRead = CsvReader.newReader(fileURL,"PN", orderSetting.getPn()); csvRead = CsvReader.newReader(fileURL,"PN", orderSetting.getPn());
int partNumberIndex = csvRead.getIndex("PN", orderSetting.getPn()); int partNumberIndex = csvRead.getIndex("PN", orderSetting.getPn());
//int qtyIndex = csvRead.getIndex("QTY", orderSetting.getQty());
//int feederIndex = csvRead.getIndex("FEEDER", orderSetting.getFeeder());
//int riIndex = csvRead.getIndex("RI",orderSetting.getRi());
int soIndex = csvRead.getIndex("SO", orderSetting.getSo()); int soIndex = csvRead.getIndex("SO", orderSetting.getSo());
int reelCountIndex = csvRead.getIndex("REELCOUNT", orderSetting.getSo()); int reelCountIndex = csvRead.getIndex("REELCOUNT", orderSetting.getSo());
int lineIndex = csvRead.getIndex("LINE", orderSetting.getLine());
int warehouseCodeIndex = csvRead.getIndex("WAREHOUSECODE", orderSetting.getWarehouseCode());
int row = 1; int row = 1;
int newRowCount = 0; int newRowCount = 0;
...@@ -121,30 +166,10 @@ public class DefaultOrderFileListener implements IOrderFileListener { ...@@ -121,30 +166,10 @@ public class DefaultOrderFileListener implements IOrderFileListener {
row++; row++;
String[] lineValues = csvRead.getValues(); String[] lineValues = csvRead.getValues();
String partNumber = lineValues[partNumberIndex]; String partNumber = lineValues[partNumberIndex];
//String ri="";
/*if(riIndex!=-1){
ri=lineValues[riIndex];
}*/
if (partNumber.isEmpty()/*&&ri.isEmpty()*/) { if (partNumber.isEmpty()/*&&ri.isEmpty()*/) {
log.warn("行[partNumber=" + partNumber + "]中PN和RI都 为空,此行忽略"); log.warn("行[partNumber=" + partNumber + "]中PN和RI都 为空,此行忽略");
} else { } else {
//int num = 1;
/*if (qtyIndex != -1) {
String numStr = lineValues[qtyIndex];
if (Strings.isNotBlank(numStr)) {
try {
num = Integer.valueOf(numStr);
} catch (Exception e) {
log.error(partNumber + "的数量:" + numStr + " 不是数字,使用1");
}
}
}
String feeder = "";
if (feederIndex != -1) {
feeder = lineValues[feederIndex];
}*/
String so=fileName; String so=fileName;
if(soIndex!=-1){ if(soIndex!=-1){
so=lineValues[soIndex]; so=lineValues[soIndex];
} }
...@@ -152,15 +177,11 @@ public class DefaultOrderFileListener implements IOrderFileListener { ...@@ -152,15 +177,11 @@ public class DefaultOrderFileListener implements IOrderFileListener {
so=fileName; so=fileName;
} }
LiteOrderItem item = new LiteOrderItem(); LiteOrderItem item = new LiteOrderItem();
item.setManualUpload(true);
item.setPn(partNumber); item.setPn(partNumber);
if(partNumber.isEmpty()){ if(partNumber.isEmpty()){
item.setNeedReelCount(1); item.setNeedReelCount(1);
} }
//item.setNeedNum(num);
//item.setFeederInfo(feeder);
//item.setRi(ri);
int count = 1; int count = 1;
if (reelCountIndex != -1) { if (reelCountIndex != -1) {
String countStr = lineValues[reelCountIndex]; String countStr = lineValues[reelCountIndex];
...@@ -174,12 +195,18 @@ public class DefaultOrderFileListener implements IOrderFileListener { ...@@ -174,12 +195,18 @@ public class DefaultOrderFileListener implements IOrderFileListener {
} }
item.setNeedReelCount(count); item.setNeedReelCount(count);
if (lineIndex != -1){
String lineValue = lineValues[lineIndex];
item.setLine(lineValue);
}
if (warehouseCodeIndex != -1){
String warehouseCodeValue = lineValues[warehouseCodeIndex];
item.setWarehouseCode(warehouseCodeValue);
}
if(!itemMap.containsKey(so)){ if(!itemMap.containsKey(so)){
itemMap.put(so,new ArrayList<LiteOrderItem>()); itemMap.put(so,new ArrayList<LiteOrderItem>());
} }
itemMap.get(so).add(item); itemMap.get(so).add(item);
items.add(item); items.add(item);
} }
} }
......
...@@ -9,4 +9,5 @@ public interface IOrderFileListener { ...@@ -9,4 +9,5 @@ public interface IOrderFileListener {
boolean handleOrderFile(File orderFile); boolean handleOrderFile(File orderFile);
String verifyOrderFile(File orderFile);
} }
...@@ -3,6 +3,7 @@ package com.neotel.smfcore.core.order.rest; ...@@ -3,6 +3,7 @@ package com.neotel.smfcore.core.order.rest;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
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.bean.ResultBean; import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
...@@ -16,6 +17,7 @@ import com.neotel.smfcore.core.barcode.service.po.Barcode; ...@@ -16,6 +17,7 @@ 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;
import com.neotel.smfcore.core.device.enums.OP_STATUS; import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache; import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_SOURCE; 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;
...@@ -57,10 +59,13 @@ import org.springframework.web.bind.annotation.*; ...@@ -57,10 +59,13 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
@Slf4j @Slf4j
...@@ -111,6 +116,11 @@ public class OrderController { ...@@ -111,6 +116,11 @@ public class OrderController {
@Autowired @Autowired
SmfApi smfApi; SmfApi smfApi;
@Autowired
DataCache dataCache;
Map<String,Long> onClickWorkOrderOut = Maps.newConcurrentMap();
// @ApiOperation("导出用户数据") // @ApiOperation("导出用户数据")
// @GetMapping(value = "/download") // @GetMapping(value = "/download")
// @PreAuthorize("@el.check('user:list')") // @PreAuthorize("@el.check('user:list')")
...@@ -131,48 +141,18 @@ public class OrderController { ...@@ -131,48 +141,18 @@ public class OrderController {
} }
File folder = new File(properties.getPath(), "pos"); File folder = new File(properties.getPath(), "pos");
File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath()); File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath());
String result = orderFileWatch.verifyOrderFile(localFile);
if (StringUtils.isNotBlank(result)){
return ResultBean.newErrorResult(-1,"",result);
}
orderFileWatch.handleOrderFile(localFile); orderFileWatch.handleOrderFile(localFile);
// Map<String, List<LiteOrderItem>> itemMap = orderFileWatch.readCsvFile(fileName, localFile.getAbsolutePath());
//
// if (itemMap == null || itemMap.size() <= 0) {
// throw new ValidateException("smfcore.fileError", "文件解析失败");
// }
//
// for (String so : itemMap.keySet()
// ) {
//
// List<LiteOrderItem> liteOrderItems = itemMap.get(so);
// if (liteOrderItems.size() <= 0) {
// continue;
// }
// LiteOrder liteOrder = new LiteOrder(so, liteOrderItems);
// liteOrder.setSource(localFile.getName());
// LiteOrder dbOrder = liteOrderManager.findByOrderNo(liteOrder.getOrderNo());
// if (dbOrder != null) {
//
// SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
// //把名字改为带时间的
// String newOrderNo = liteOrder.getOrderNo() + "-" + format.format(new Date());
// dbOrder = liteOrderManager.findByOrderNo(newOrderNo);
// if (dbOrder == null) {
// liteOrder.setOrderNo(newOrderNo);
// } else {
// log.info("数据库中已存在工单号为[" + liteOrder.getOrderNo() + "],忽略文件:" + localFile.getAbsolutePath());
// return ResultBean.newErrorResult(-1, "smfcore.order.ameExists", "工单名称[{0}]已存在", new String[]{liteOrder.getOrderNo()});
// }
// }
// log.info("新增加订单:" + liteOrder.getOrderNo() + ",共" + liteOrderItems.size() + "条工单详情");
// liteOrder = liteOrderManager.createWithItems(liteOrder);
// liteOrderCache.addOrderToMap(liteOrder);
// }
return ResultBean.newOkResult("smfcore.order.uploadOK", "工单上传成功", ""); return ResultBean.newOkResult("smfcore.order.uploadOK", "工单上传成功", "");
} }
@ApiOperation("工单出库") @ApiOperation("工单出库")
@PostMapping(value = "/out") @PostMapping(value = "/out")
@PreAuthorize("@el.check('workOrder')") @PreAuthorize("@el.check('workOrder')")
public synchronized ResultBean checkOut(@RequestBody Map<String, String> mapValues) { public ResultBean checkOut(@RequestBody Map<String, String> mapValues) {
String orderNo = mapValues.get("orderNo"); String orderNo = mapValues.get("orderNo");
if (orderNo == null) { if (orderNo == null) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"orderNo"}); throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
...@@ -181,13 +161,21 @@ public class OrderController { ...@@ -181,13 +161,21 @@ 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});
} }
synchronized (this) {
Long time = onClickWorkOrderOut.get(orderNo);
if (time != null && System.currentTimeMillis() - time < 1000 * 1 * 60 * 60) {
return ResultBean.newErrorResult(-1, "", orderNo + "已经在执行工单出库,请勿重复点击");
}
onClickWorkOrderOut.put(orderNo, System.currentTimeMillis());
}
log.info("开始执行工单出库:" + orderNo);
String result = ""; String result = "";
if (LITEORDER_SOURCE.OUTTER.name().equals(liteOrder.getSource())) { if (LITEORDER_SOURCE.OUTTER.name().equals(liteOrder.getSource())) {
result = liteOrderCache.checkOutLiteOrderOut(liteOrder.getOrderNo(),false,null); result = liteOrderCache.checkOutLiteOrderOut(liteOrder.getOrderNo(), false, null);
} else { } else {
result = liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(), false); result = liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(), false);
} }
onClickWorkOrderOut.remove(orderNo);
if (ObjectUtil.isEmpty(result)) { if (ObjectUtil.isEmpty(result)) {
return ResultBean.newOkResult(result); return ResultBean.newOkResult(result);
} else { } else {
...@@ -417,7 +405,17 @@ public class OrderController { ...@@ -417,7 +405,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 permissionPasswordCache = dataCache.getCache(Constants.CACHE_permissionPassword);
if (StringUtils.isNotBlank(permissionPasswordCache)) {
String permissionPassword = mapValues.get("permissionPassword");
if (StringUtils.isBlank(permissionPassword)) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"permissionPassword"});
}
if (!permissionPasswordCache.equals(permissionPassword)) {
throw new ValidateException("smfcore.error.permissionPassword", "权限密码错误");
}
}
String result = liteOrderCache.closeOrder(orderNo); String result = liteOrderCache.closeOrder(orderNo);
if (ObjectUtil.isEmpty(result)) { if (ObjectUtil.isEmpty(result)) {
return ResultBean.newOkResult(result, result, result); return ResultBean.newOkResult(result, result, result);
......
...@@ -134,6 +134,7 @@ public class LiteOrder extends BasePo implements Serializable { ...@@ -134,6 +134,7 @@ public class LiteOrder extends BasePo implements Serializable {
*/ */
private boolean confirmExcess = false; private boolean confirmExcess = false;
public void setClosed(boolean value){ public void setClosed(boolean value){
this.closed=value; this.closed=value;
if(value){ if(value){
......
...@@ -198,6 +198,11 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li ...@@ -198,6 +198,11 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
private String reel; private String reel;
/** /**
* 是否人工上传
*/
private boolean isManualUpload = false;
/**
* 出库是否满足要求,已出库数量大于需求数量 * 出库是否满足要求,已出库数量大于需求数量
*/ */
public boolean isOutFinished(){ public boolean isOutFinished(){
......
...@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil; ...@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.neotel.smfcore.common.csv.CsvReader; import com.neotel.smfcore.common.csv.CsvReader;
import com.neotel.smfcore.common.utils.SmbUtil; import com.neotel.smfcore.common.utils.SmbUtil;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.device.util.DataCache; 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.listener.IOrderFileListener; import com.neotel.smfcore.core.order.listener.IOrderFileListener;
...@@ -128,6 +129,7 @@ public class OrderFileWatch { ...@@ -128,6 +129,7 @@ public class OrderFileWatch {
private String getLocalDir(String orderDir){ private String getLocalDir(String orderDir){
//String[] fileTypes=new String[]{"csv","xml","txt"}; //String[] fileTypes=new String[]{"csv","xml","txt"};
String localDir = orderDir; String localDir = orderDir;
...@@ -178,4 +180,16 @@ public class OrderFileWatch { ...@@ -178,4 +180,16 @@ public class OrderFileWatch {
} }
return localDir; return localDir;
} }
//校验工单文件数据
public String verifyOrderFile(File orderFile) {
log.info("开始处理Order文件:" + orderFile.getAbsolutePath());
for (IOrderFileListener orderFileListener : orderFileListenerList) {
String result = orderFileListener.verifyOrderFile(orderFile);
if (StringUtils.isNotBlank(result)) {
return result;
}
}
return "";
}
} }
...@@ -32,6 +32,7 @@ import com.neotel.smfcore.core.storage.service.po.Storage; ...@@ -32,6 +32,7 @@ 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.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService; import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType;
import com.neotel.smfcore.custom.siemens.SiemensApi; import com.neotel.smfcore.custom.siemens.SiemensApi;
import com.neotel.smfcore.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
...@@ -113,6 +114,9 @@ public class StoragePosController { ...@@ -113,6 +114,9 @@ public class StoragePosController {
Storage storage=dataCache.getStorageById(StoragePosDtos.get(i).getStorageId()); Storage storage=dataCache.getStorageById(StoragePosDtos.get(i).getStorageId());
if(storage!=null){ if(storage!=null){
StoragePosDtos.get(i).setStorageName(storage.getName()); StoragePosDtos.get(i).setStorageName(storage.getName());
if (!storage.isVirtual()){
StoragePosDtos.get(i).setNeedPermissionPassword(true);
}
} }
} }
return new PageData(StoragePosDtos, pages.getTotalElements()); return new PageData(StoragePosDtos, pages.getTotalElements());
...@@ -198,6 +202,21 @@ public class StoragePosController { ...@@ -198,6 +202,21 @@ public class StoragePosController {
if (storagePos != null) { if (storagePos != null) {
try { try {
log.info("开始手动清空库位[" + storagePos.getPosName() + "]"); log.info("开始手动清空库位[" + storagePos.getPosName() + "]");
//排除虚拟仓密码加密
Storage storage = dataCache.getStorageById(storagePos.getStorageId());
if (!storage.isVirtual()) {
//判断是否有权限密码
String permissionPasswordCache = dataCache.getCache(Constants.CACHE_permissionPassword);
if (StringUtils.isNotBlank(permissionPasswordCache)) {
String permissionPassword = map.get("permissionPassword");
if (StringUtils.isBlank(permissionPassword)) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"permissionPassword"});
}
if (!permissionPasswordCache.equals(permissionPassword)) {
throw new ValidateException("smfcore.error.permissionPassword", "权限密码错误");
}
}
}
// QisdaApi.ClearStockBy(storagePos.getPosName()); // QisdaApi.ClearStockBy(storagePos.getPosName());
Barcode barcode = storagePos.getBarcode(); Barcode barcode = storagePos.getBarcode();
if (barcode != null) { if (barcode != null) {
...@@ -319,15 +338,12 @@ public class StoragePosController { ...@@ -319,15 +338,12 @@ public class StoragePosController {
map.put("是否可用", pos.isEnabled() ? "是" : "否"); map.put("是否可用", pos.isEnabled() ? "是" : "否");
map.put("条码", null); map.put("条码", null);
map.put("料件编号", null); map.put("料件编号", null);
map.put("是否锁定", null); boolean isLock = ReelLockPosUtil.posIsLock(pos.getPosName());
map.put("是否锁定", isLock ? "是" : "否");
Barcode barcode = pos.getBarcode(); Barcode barcode = pos.getBarcode();
if (barcode != null) { if (barcode != null) {
map.put("条码", barcode.getBarcode()); map.put("条码", barcode.getBarcode());
map.put("料件编号", barcode.getPartNumber()); map.put("料件编号", barcode.getPartNumber());
String reelLockPosId = ReelLockPosUtil.getReelLockPosId(barcode.getBarcode());
if (StringUtils.isNotBlank(reelLockPosId)) {
map.put("是否锁定", "是");
}
} }
list.add(map); list.add(map);
} }
...@@ -498,7 +514,8 @@ public class StoragePosController { ...@@ -498,7 +514,8 @@ public class StoragePosController {
} }
if (hasOutReel) { if (hasOutReel) {
DataLog task = new DataLog(dataCache.getStorageById(pos.getStorageId()), pos.getBarcode(), pos); Storage storage = dataCache.getStorageById(pos.getStorageId());
DataLog task = new DataLog(storage, pos.getBarcode(), pos);
task.setType(OP.CHECKOUT); task.setType(OP.CHECKOUT);
task.setPutInDate(pos.getBarcode().getPutInDate()); task.setPutInDate(pos.getBarcode().getPutInDate());
task.setStatus(OP_STATUS.WAIT.name()); task.setStatus(OP_STATUS.WAIT.name());
...@@ -509,6 +526,11 @@ public class StoragePosController { ...@@ -509,6 +526,11 @@ public class StoragePosController {
task.setLoc(stationName); task.setLoc(stationName);
} }
task.setBoxPosName(pos.getPosName()); task.setBoxPosName(pos.getPosName());
if (storage.isVirtual()){
task.setExtendType(ExtendType.VIRTUAL_CHECKOUT);
} else {
task.setExtendType(ExtendType.STORAGE_CHECKOUT);
}
//task.setPosId(pos.getId()); //task.setPosId(pos.getId());
taskService.updateQueueTask(task); taskService.updateQueueTask(task);
} }
......
...@@ -12,6 +12,7 @@ import java.util.List; ...@@ -12,6 +12,7 @@ import java.util.List;
@Getter @Getter
@Setter @Setter
public class StoragePosDto implements Serializable { public class StoragePosDto implements Serializable {
@ApiModelProperty("库位ID") @ApiModelProperty("库位ID")
private String id; private String id;
...@@ -80,4 +81,10 @@ public class StoragePosDto implements Serializable { ...@@ -80,4 +81,10 @@ public class StoragePosDto implements Serializable {
@ApiModelProperty("盘点状态") @ApiModelProperty("盘点状态")
private String inventoryStatus = ""; private String inventoryStatus = "";
@ApiModelProperty("是否需要权限密码")
private boolean needPermissionPassword = false;
@ApiModelProperty("来源")
public String source;
} }
...@@ -33,6 +33,8 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> { ...@@ -33,6 +33,8 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
StoragePos findPartNumberInStorages(List<String> storageIdList,String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType); StoragePos findPartNumberInStorages(List<String> storageIdList,String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType);
StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType,String brand);
List<StoragePos> findByQuery(Query query, Pageable pageable); List<StoragePos> findByQuery(Query query, Pageable pageable);
void removePosByStorageId(String storageId); void removePosByStorageId(String storageId);
......
...@@ -334,6 +334,31 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -334,6 +334,31 @@ 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 brand) {
Criteria c = Criteria.where("barcode.partNumber").is(pn)
.and("id").nin(excludePosIds)
.and("enabled").is(true)//可用
.and("barcode.lockId").is(null);//没有被锁定的仓位;
if (storageIdList != null) {
c = c.and("storageId").in(storageIdList);
}
if (StringUtils.isNotBlank(brand)) {
c.and("barcode.provider").is(brand);
}
Query q = new Query(c);
//Sort sort = getSortByCheckOutType(checkOutType);
Sort sort = Sort.by(Sort.Direction.ASC, "barcode.amount", "barcode.putInDate");
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;
}
@Override @Override
public StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType, String warehouseCode, String brand, boolean isOut) { public StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType, String warehouseCode, String brand, boolean isOut) {
......
...@@ -137,6 +137,11 @@ public class StoragePos extends BasePo implements Serializable { ...@@ -137,6 +137,11 @@ public class StoragePos extends BasePo implements Serializable {
*/ */
private String inventoryStatus = ""; private String inventoryStatus = "";
/**
* 来源
*/
private String source;
public String getLabelStr(){ public String getLabelStr(){
String posNameLabel = posName; String posNameLabel = posName;
int index = posNameLabel.lastIndexOf(":"); int index = posNameLabel.lastIndexOf(":");
......
...@@ -25,6 +25,10 @@ public class OrderSetting implements Serializable { ...@@ -25,6 +25,10 @@ public class OrderSetting implements Serializable {
public String reelCount = "REELCOUNT"; public String reelCount = "REELCOUNT";
private String line = "LINE";
private String warehouseCode = "WAREHOUSECODE";
/** /**
* 是否显示料架亮灯方式 * 是否显示料架亮灯方式
*/ */
......
...@@ -72,10 +72,16 @@ public class SettingsController { ...@@ -72,10 +72,16 @@ public class SettingsController {
boolean stopOut = dataCache.getCache(Constants.CACHE_StopOut); boolean stopOut = dataCache.getCache(Constants.CACHE_StopOut);
boolean startJob = dataCache.getCache(Constants.CACHE_StartJob); boolean startJob = dataCache.getCache(Constants.CACHE_StartJob);
Integer backUpMonth = dataCache.getCache(Constants.BACKUP_MONTH_KEY); Integer backUpMonth = dataCache.getCache(Constants.BACKUP_MONTH_KEY);
Integer preGenerateTask = dataCache.getCache(Constants.CACHE_preGenerateTask);
String permissionPassword = dataCache.getCache(Constants.CACHE_permissionPassword);
String floor = dataCache.getCache(Constants.CACHE_floor);
SysSettingsDto dto = new SysSettingsDto(); SysSettingsDto dto = new SysSettingsDto();
dto.setStartJob(startJob); dto.setStartJob(startJob);
dto.setStopOut(stopOut); dto.setStopOut(stopOut);
dto.setBackUpMonth(backUpMonth); dto.setBackUpMonth(backUpMonth);
dto.setPreGenerateTask(preGenerateTask);
dto.setPermissionPassword(permissionPassword);
dto.setFloor(floor);
return dto; return dto;
} }
...@@ -85,10 +91,17 @@ public class SettingsController { ...@@ -85,10 +91,17 @@ public class SettingsController {
public ResultBean updateSysSettings(@Validated @RequestBody SysSettingsDto sysSettingsDto) { public ResultBean updateSysSettings(@Validated @RequestBody SysSettingsDto sysSettingsDto) {
dataCache.updateCache(Constants.CACHE_StopOut, sysSettingsDto.isStopOut()); dataCache.updateCache(Constants.CACHE_StopOut, sysSettingsDto.isStopOut());
dataCache.updateCache(Constants.CACHE_StartJob, sysSettingsDto.isStartJob()); dataCache.updateCache(Constants.CACHE_StartJob, sysSettingsDto.isStartJob());
dataCache.updateCache(Constants.BACKUP_MONTH_KEY,sysSettingsDto.getBackUpMonth()); dataCache.updateCache(Constants.BACKUP_MONTH_KEY, sysSettingsDto.getBackUpMonth());
log.info("更改系统设置:stopout=" + sysSettingsDto.isStopOut() + ",stopjob=" + sysSettingsDto.isStartJob()+",backUpMonth="+sysSettingsDto.getBackUpMonth()); dataCache.updateCache(Constants.CACHE_preGenerateTask, sysSettingsDto.getPreGenerateTask());
dataCache.updateCache(Constants.CACHE_permissionPassword,sysSettingsDto.getPermissionPassword());
dataCache.updateCache(Constants.CACHE_floor,sysSettingsDto.getFloor());
log.info("更改系统设置:stopout=" + sysSettingsDto.isStopOut() + ",stopjob=" + sysSettingsDto.isStartJob()
+ ",backUpMonth=" + sysSettingsDto.getBackUpMonth()
+ ",preGenerateTask=" + sysSettingsDto.getPreGenerateTask()
+ ",permissionPassword=" + sysSettingsDto.getPermissionPassword()
+ ",floor=" + sysSettingsDto.getFloor()
);
return ResultBean.newOkResult("保存成功"); return ResultBean.newOkResult("保存成功");
} }
@ApiOperation("获取出库策略信息") @ApiOperation("获取出库策略信息")
...@@ -196,6 +209,8 @@ public class SettingsController { ...@@ -196,6 +209,8 @@ public class SettingsController {
titles.add(orderSetting.getRi()); titles.add(orderSetting.getRi());
titles.add(orderSetting.getSo());*/ titles.add(orderSetting.getSo());*/
titles.add(orderSetting.getReelCount()); titles.add(orderSetting.getReelCount());
titles.add(orderSetting.getLine());
titles.add(orderSetting.getWarehouseCode());
for(int i=1;i<=10;i++) { for(int i=1;i<=10;i++) {
Map<String, Object> map = new LinkedHashMap<>(); Map<String, Object> map = new LinkedHashMap<>();
...@@ -206,6 +221,8 @@ public class SettingsController { ...@@ -206,6 +221,8 @@ public class SettingsController {
map.put(orderSetting.getRi(),""); map.put(orderSetting.getRi(),"");
map.put(orderSetting.getSo(),"WO1001" );*/ map.put(orderSetting.getSo(),"WO1001" );*/
map.put(orderSetting.getReelCount(),i); map.put(orderSetting.getReelCount(),i);
map.put(orderSetting.getLine(),"line");
map.put(orderSetting.getWarehouseCode(),"W10B");
} }
else{ else{
map.put(orderSetting.getPn(),"PN2"+i); map.put(orderSetting.getPn(),"PN2"+i);
...@@ -214,6 +231,8 @@ public class SettingsController { ...@@ -214,6 +231,8 @@ public class SettingsController {
map.put(orderSetting.getRi(),""); map.put(orderSetting.getRi(),"");
map.put(orderSetting.getSo(),"WO1002" );*/ map.put(orderSetting.getSo(),"WO1002" );*/
map.put(orderSetting.getReelCount(),i); map.put(orderSetting.getReelCount(),i);
map.put(orderSetting.getLine(),"line");
map.put(orderSetting.getWarehouseCode(),"W10B");
} }
maps.add(map); maps.add(map);
} }
......
...@@ -104,56 +104,44 @@ public class TaskController { ...@@ -104,56 +104,44 @@ public class TaskController {
@PreAuthorize("@el.check('taskLog')") @PreAuthorize("@el.check('taskLog')")
public void download(HttpServletResponse response, TaskQueryCondition criteria, Pageable pageable, HttpServletRequest request) throws IOException { public void download(HttpServletResponse response, TaskQueryCondition criteria, Pageable pageable, HttpServletRequest request) throws IOException {
Query query = getQuery(criteria); Query query = getQuery(criteria);
FileUtil.downloadExcel(query, pageable, response, new IExcelDownLoad() {
//dataLogManager.download(query, pageable, response,request.getLocale()); @Override
public List<List<String>> getHeader() {
// FileUtil.downloadExcel(query, pageable, response, new IExcelDownLoad() { List<List<String>> headerList = new ArrayList<>();
// @Override headerList.add(Lists.newArrayList("料件编号"));
// public List<List<String>> getHeader() { headerList.add(Lists.newArrayList("条码编号"));
// List<List<String>> header = new ArrayList<>(); headerList.add(Lists.newArrayList("料仓名称"));
// header.add(Lists.newArrayList("类型")); headerList.add(Lists.newArrayList("数量"));
// header.add(Lists.newArrayList("单号")); headerList.add(Lists.newArrayList("类型"));
// header.add(Lists.newArrayList("料仓名称")); headerList.add(Lists.newArrayList("来源"));
// header.add(Lists.newArrayList("条码编号")); headerList.add(Lists.newArrayList("状态"));
// header.add(Lists.newArrayList("料件编号")); headerList.add(Lists.newArrayList("操作人"));
// header.add(Lists.newArrayList("批次")); headerList.add(Lists.newArrayList("创建时间"));
// header.add(Lists.newArrayList("数量")); headerList.add(Lists.newArrayList("更新时间"));
// header.add(Lists.newArrayList("用户")); return headerList;
// }
// header.add(Lists.newArrayList("供应商"));
// header.add(Lists.newArrayList("来源二")); @Override
// header.add(Lists.newArrayList("状态")); public List<List<Object>> getPageData(Query query, Pageable pageable) {
// header.add(Lists.newArrayList("更新时间")); List<List<Object>> dataList = new ArrayList<>();
// return header; PageData<DataLog> data = dataLogManager.findByPage(query, pageable);
// } for (DataLog dataLog : data.getContent()) {
// List<Object> result = new ArrayList<>();
// @Override result.add(dataLog.getPartNumber());
// public List<List<Object>> getPageData(Query query, Pageable pageable) { result.add(dataLog.getBarcode());
// List<List<Object>> dataList = new ArrayList<>(); result.add(dataLog.getPosName()+" "+dataLog.getStorageName());
// List<DataLog> dataLogList = dataLogManager.findByQuery(query, pageable); result.add(dataLog.getNum());
// DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); result.add(dataLog.getType() == 1 ? "入库" : "出库");
// for (DataLog dataLog : dataLogList) { result.add(dataLog.getSourceName());
// List<Object> data = new ArrayList<>(); result.add(dataLog.getStatus());
// result.add(dataLog.getCreator());
// data.add(dataLog.getDetailTypeStr());//"类型" result.add(dataLog.getCreateDate());
// data.add(dataLog.getSourceName());//"单号" result.add(dataLog.getUpdateDate());
// data.add(dataLog.getPosName());//"料仓名称" dataList.add(result);
// data.add(dataLog.getBarcode());//"条码编号" }
// data.add(dataLog.getPartNumber());//"料件编号" return dataList;
// data.add(dataLog.getBatchInfo());//"批次" }
// data.add(dataLog.getReelQty());//"数量" });
// data.add(dataLog.getOperator());//"用户"
//
// data.add(dataLog.getProvider());//"供应商"
// data.add(dataLog.getSubSourceInfo());//"来源二"
// data.add(dataLog.getStatusStr());//"状态"
// String updateTimeStr = dateFormat.format(dataLog.getUpdateDate());
// data.add(updateTimeStr);//"更新时间"
// dataList.add(data);
// }
// return dataList;
// }
// });
} }
@ApiOperation("获取某个分组队列中的任务") @ApiOperation("获取某个分组队列中的任务")
......
...@@ -17,5 +17,14 @@ public class SysSettingsDto implements Serializable { ...@@ -17,5 +17,14 @@ public class SysSettingsDto implements Serializable {
private boolean startJob = false; private boolean startJob = false;
@ApiModelProperty("备份时间") @ApiModelProperty("备份时间")
private Integer backUpMonth=0; private Integer backUpMonth = 0;
@ApiModelProperty("缺料预警生成工单时间")
private Integer preGenerateTask = 0;
@ApiModelProperty("权限密码")
private String permissionPassword = "";
@ApiModelProperty("楼层信息")
private String floor="";
} }
...@@ -3,6 +3,7 @@ package com.neotel.smfcore.core.system.service.manager; ...@@ -3,6 +3,7 @@ package com.neotel.smfcore.core.system.service.manager;
import com.neotel.smfcore.common.base.IBaseManager; import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.system.service.po.DataLog; import com.neotel.smfcore.core.system.service.po.DataLog;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
...@@ -15,4 +16,8 @@ public interface IDataLogManager extends IBaseManager<DataLog> { ...@@ -15,4 +16,8 @@ public interface IDataLogManager extends IBaseManager<DataLog> {
List<DataLog> getDatalogs(String orderNo, String line, Pageable pageable); List<DataLog> getDatalogs(String orderNo, String line, Pageable pageable);
int getInOutData(Date startDate, Date endDate, int type,String stationName); int getInOutData(Date startDate, Date endDate, int type,String stationName);
int countBySourceName(String barcodeStr, String orderNo);
int countByQuery(Query subSourceId);
} }
...@@ -100,6 +100,7 @@ public class DataLogManagerImpl implements IDataLogManager { ...@@ -100,6 +100,7 @@ public class DataLogManagerImpl implements IDataLogManager {
Pattern p = Pattern.compile(QueryHelp.escapeExprSpecialWord(line), Pattern.CASE_INSENSITIVE); Pattern p = Pattern.compile(QueryHelp.escapeExprSpecialWord(line), Pattern.CASE_INSENSITIVE);
c.and("line").regex(p); c.and("line").regex(p);
} }
c.and("status").is(OP_STATUS.FINISHED.name());
PageData<DataLog> data = findByPage(new Query(c), pageable); PageData<DataLog> data = findByPage(new Query(c), pageable);
//log.info("orderNo:"+orderNo+",line:"+line+",数量为:"+data.getTotalElements()); //log.info("orderNo:"+orderNo+",line:"+line+",数量为:"+data.getTotalElements());
return data.getContent(); return data.getContent();
...@@ -116,4 +117,16 @@ public class DataLogManagerImpl implements IDataLogManager { ...@@ -116,4 +117,16 @@ public class DataLogManagerImpl implements IDataLogManager {
} }
return dataLogDao.countByQuery(query.addCriteria(criteria)); return dataLogDao.countByQuery(query.addCriteria(criteria));
} }
@Override
public int countBySourceName(String barcodeStr, String orderNo) {
Query query = new Query();
Criteria criteria = Criteria.where("sourceName").is(orderNo).and("barcode").is(barcodeStr);
return dataLogDao.countByQuery(query.addCriteria(criteria));
}
@Override
public int countByQuery(Query query) {
return dataLogDao.countByQuery(query);
}
} }
...@@ -318,9 +318,20 @@ public class DataLog extends BasePo implements Serializable { ...@@ -318,9 +318,20 @@ public class DataLog extends BasePo implements Serializable {
private MSDAppendInfo msdAppendInfo; private MSDAppendInfo msdAppendInfo;
/** /**
* 是否人工上传
*/
private boolean isManualUpload = false;
/**
* 是否整箱出库
*/
private boolean isBoxOut = false;
/**
* 出库类型(手动喂料,清空库位,智能仓储出库,手动出库,虚拟仓入库,虚拟仓出库,智能仓储入库) * 出库类型(手动喂料,清空库位,智能仓储出库,手动出库,虚拟仓入库,虚拟仓出库,智能仓储入库)
*/ */
private int extendType; private int extendType = -1;
public String getBarcode() { public String getBarcode() {
if(barcode == null){ if(barcode == null){
...@@ -351,6 +362,10 @@ public class DataLog extends BasePo implements Serializable { ...@@ -351,6 +362,10 @@ public class DataLog extends BasePo implements Serializable {
return OP_STATUS.EXECUTING.name().equals(status); return OP_STATUS.EXECUTING.name().equals(status);
} }
public boolean isOnInnerLine(){
return OP_STATUS.ON_INNER_LINE.name().equals(status);
}
public boolean isFinished(){ public boolean isFinished(){
return OP_STATUS.FINISHED.name().equals(status); return OP_STATUS.FINISHED.name().equals(status);
} }
......
...@@ -13,6 +13,7 @@ import com.neotel.smfcore.core.system.service.dao.IAlarmInfoDao; ...@@ -13,6 +13,7 @@ import com.neotel.smfcore.core.system.service.dao.IAlarmInfoDao;
import com.neotel.smfcore.core.system.service.po.AlarmInfo; 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.service.po.Humiture; import com.neotel.smfcore.core.system.service.po.Humiture;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.VirImportLog;
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.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
...@@ -59,12 +60,12 @@ public class DbBackupService { ...@@ -59,12 +60,12 @@ public class DbBackupService {
if(dbBackupMonth != null && dbBackupMonth > 0){ if(dbBackupMonth != null && dbBackupMonth > 0){
Date lastBackupTime = dataCache.getCache(Constants.LAST_BACKUP_TIME_KEY); Date lastBackupTime = dataCache.getCache(Constants.LAST_BACKUP_TIME_KEY);
boolean needBackup = false; boolean needBackup = false;
if(lastBackupTime == null){ if(lastBackupTime == null) {
needBackup = true; needBackup = true;
}else{ }else {
long monthNum = cn.hutool.core.date.DateUtil.betweenMonth(lastBackupTime, new Date(), true); long dayNum = cn.hutool.core.date.DateUtil.betweenDay(lastBackupTime, new Date(), true);
if(monthNum >= 1){ if (dayNum >= 7) {
//未备份过的或上次备份时间距当前一个月的,进行备份 //备份超过7天就进行备份
needBackup = true; needBackup = true;
} }
} }
...@@ -93,7 +94,7 @@ public class DbBackupService { ...@@ -93,7 +94,7 @@ public class DbBackupService {
processing = true; processing = true;
Integer dbBackupMonth = dataCache.getCache(Constants.BACKUP_MONTH_KEY); Integer dbBackupMonth = dataCache.getCache(Constants.BACKUP_MONTH_KEY);
if(dbBackupMonth == null){ if(dbBackupMonth == null){
dbBackupMonth = 12;//默认备份12个月前的数据 dbBackupMonth = 6;//默认备份6个月前的数据
dataCache.updateCache(Constants.BACKUP_MONTH_KEY,dbBackupMonth); dataCache.updateCache(Constants.BACKUP_MONTH_KEY,dbBackupMonth);
} }
backupTable(dbBackupMonth, backupTable(dbBackupMonth,
...@@ -104,7 +105,8 @@ public class DbBackupService { ...@@ -104,7 +105,8 @@ public class DbBackupService {
InList.class, InList.class,
InListItem.class, InListItem.class,
Message.class, Message.class,
AlarmInfo.class AlarmInfo.class,
VirImportLog.class
); );
dataCache.updateCache(Constants.LAST_BACKUP_TIME_KEY,new Date()); dataCache.updateCache(Constants.LAST_BACKUP_TIME_KEY,new Date());
processing = false; processing = false;
......
...@@ -19,6 +19,7 @@ import com.neotel.smfcore.core.device.enums.OP_STATUS; ...@@ -19,6 +19,7 @@ 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.message.util.DeviceMessageUtil; import com.neotel.smfcore.core.message.util.DeviceMessageUtil;
import com.neotel.smfcore.core.order.LiteOrderCache; import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder; import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem; import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE; import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE;
...@@ -30,7 +31,9 @@ import com.neotel.smfcore.core.storage.service.po.StoragePos; ...@@ -30,7 +31,9 @@ import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.bean.MSDAppendInfo; import com.neotel.smfcore.core.system.bean.MSDAppendInfo;
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.custom.lizhen.LizhenApi;
import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType; import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType;
import lombok.Data;
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;
...@@ -59,6 +62,12 @@ public class TaskService { ...@@ -59,6 +62,12 @@ public class TaskService {
@Autowired @Autowired
private SmfApi smfApi; private SmfApi smfApi;
@Autowired
private ILiteOrderItemManager liteOrderItemManager;
@Autowired
private LizhenApi lizhenApi;
/** /**
* 任务队列,Key 为dataLog的ID,value 为本区域待执行的任务 * 任务队列,Key 为dataLog的ID,value 为本区域待执行的任务
*/ */
...@@ -74,6 +83,12 @@ public class TaskService { ...@@ -74,6 +83,12 @@ public class TaskService {
*/ */
private static Map<String,String> posSideMap = Maps.newConcurrentMap(); private static Map<String,String> posSideMap = Maps.newConcurrentMap();
/**
* key为料箱号,value库位号
*/
private static Map<String,String> boxPosName = Maps.newConcurrentMap();
// public TaskService(List<ITaskListener> listenerList){ // public TaskService(List<ITaskListener> listenerList){
// for (ITaskListener taskListener: listenerList) { // for (ITaskListener taskListener: listenerList) {
// taskListenerList.add(taskListener); // taskListenerList.add(taskListener);
...@@ -283,6 +298,15 @@ public class TaskService { ...@@ -283,6 +298,15 @@ public class TaskService {
log.info("任务取消,屏蔽库位:库位号[" + pos.getId() + "][" + pos.getPosName() + "]barcode[" + task.getBarcode() + "]"); log.info("任务取消,屏蔽库位:库位号[" + pos.getId() + "][" + pos.getPosName() + "]barcode[" + task.getBarcode() + "]");
DeviceMessageUtil.addEnabledPosMessage(pos, SecurityUtils.getCurrentUsername()); DeviceMessageUtil.addEnabledPosMessage(pos, SecurityUtils.getCurrentUsername());
} }
//清除标记
Barcode barcode = clearOut(pos.getBarcode());
//如果是出库任务,同时更新库位信息
if (task.isCheckOutTask()) {
if (pos.getBarcode() != null) {
pos.setBarcode(barcode);
storagePosManager.save(pos);
}
}
} }
} }
//解除绑定 //解除绑定
...@@ -431,7 +455,20 @@ public class TaskService { ...@@ -431,7 +455,20 @@ public class TaskService {
log.info("分配优先(单盘或无工单)出库任务" + singleOutTask.getBarcode() + "[" + singleOutTask.getPosName() + "]到 " + cid); log.info("分配优先(单盘或无工单)出库任务" + singleOutTask.getBarcode() + "[" + singleOutTask.getPosName() + "]到 " + cid);
return singleOutTask; return singleOutTask;
} }
//判断发送的任务与当前执行的工单是否一致
if (outTask != null) {
for (DataLog task : allTasks) {
if (outTask.getCid().equals(task.getCid())) {
if (StringUtils.isNotBlank(outTask.getSourceName())) {
if (!outTask.getSourceName().equals(task.getSourceName())) {
if (task.isExecuting() || task.isOnInnerLine()) {
return null;
}
}
}
}
}
}
return outTask; return outTask;
} }
...@@ -1042,4 +1079,80 @@ public class TaskService { ...@@ -1042,4 +1079,80 @@ public class TaskService {
taskMap.remove(task.getId()); taskMap.remove(task.getId());
theFinishedTaskMap.put(task.getId(), task); theFinishedTaskMap.put(task.getId(), task);
} }
private synchronized Barcode clearOut(Barcode barcode) {
if (barcode != null) {
List<Barcode> subCodeList = barcode.getSubCodeList();
if (subCodeList != null && !subCodeList.isEmpty()){
for (Barcode subCode : subCodeList) {
subCode = barcodeManager.get(subCode.getId());
if (subCode.isOut()) {
log.info("出库任务取消,清除标记");
String orderItemId = subCode.getOrderItemId();
subCode.setOut(false);
subCode.setSelectMsg(null);
subCode.setOrderItemId(null);
subCode = barcodeManager.save(subCode);
barcode.UpdateSubCode(subCode);
barcode = barcodeManager.save(barcode);
generateTask(subCode, OP_STATUS.CANCEL.name(), subCode.getAmount(),OP.CHECKOUT , orderItemId, "", ExtendType.TASK_CANNEL);
log.info("点击完成扫码并入库,任务取消,barcode:" + subCode.getBarcode() + ",OrderItemId为:" + orderItemId);
}
}
}
}
return barcode;
}
private void generateTask(Barcode barcode, String opStatus, int opQty, int opType, String orderItemId,String name,int extendType) {
//生成任务
DataLog task = new DataLog();
task.setStatus(opStatus);
task.setPartNumber(barcode.getPartNumber());
task.setBarcode(barcode.getBarcode());
task.setNum(opQty);
task.setType(opType);
task.setPosName(barcode.getPosName());
task.setOperator(SecurityUtils.getCurrentUsername());
task.setDateCode(barcode.getDateCode());
task.setBatchInfo(barcode.getBatch());
task.setProvider(barcode.getProvider());
task.setProviderNumber(barcode.getProviderNumber());
task.setKeeperCode(barcode.getKeeperCode());
//task.setReelPosName(barcode.getPosName());
task.setSubSourceId(orderItemId);
task.setWarehouseCode(barcode.getWarehouseCode());
task.setStationName(name);
task.setExtendType(extendType);
if (StringUtils.isNotBlank(orderItemId)) {
LiteOrderItem orderItem = liteOrderItemManager.get(orderItemId);
if (orderItem != null) {
task.setSourceName(orderItem.getOrderNo());
task.setLine(orderItem.getLine());
task.setMo(orderItem.getMo());
task.setSide(orderItem.getSide());
task.setPlantCode(orderItem.getPlantCode());
task.setOrderNo(orderItem.getOrderNo());
task.setSubSourceId(orderItem.getId());
}
}
updateFinishedTask(task);
}
public void addBoxPosName(DataLog dataLog){
boxPosName.put(dataLog.getBarcode(),dataLog.getPosName());
}
public void removePosName(String boxStr){
boxPosName.remove(boxStr);
}
public String getPosName(String boxStr){
return boxPosName.get(boxStr);
}
public void outTaskStatusChange(List<DataLog> dataLogList) {
smfApi.outTaskStatusChange(dataLogList);
}
} }
...@@ -243,6 +243,11 @@ public class AdvantechApi extends BaseSmfApiListener { ...@@ -243,6 +243,11 @@ public class AdvantechApi extends BaseSmfApiListener {
} }
} }
@Override
public void outTaskStatusChange(String outNotifyUrl, List<DataLog> dataLogList) {
}
/** /**
* { * {
* "webServiceType": "AKMU1", * "webServiceType": "AKMU1",
......
...@@ -4,10 +4,13 @@ import com.neotel.smfcore.common.exception.ValidateException; ...@@ -4,10 +4,13 @@ import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.api.listener.BaseSmfApiListener; import com.neotel.smfcore.core.api.listener.BaseSmfApiListener;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.api.bean.CodeValidateParam; import com.neotel.smfcore.core.api.bean.CodeValidateParam;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.custom.hella.tcp.HellaTcpClient; import com.neotel.smfcore.custom.hella.tcp.HellaTcpClient;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
@Service @Service
public class HellaApiHandler extends BaseSmfApiListener { public class HellaApiHandler extends BaseSmfApiListener {
...@@ -31,6 +34,11 @@ public class HellaApiHandler extends BaseSmfApiListener { ...@@ -31,6 +34,11 @@ public class HellaApiHandler extends BaseSmfApiListener {
} }
@Override @Override
public void outTaskStatusChange(String outNotifyUrl, List<DataLog> dataLogList) {
}
@Override
public Barcode canPutIn(String inCheckUrl, Barcode barcode) throws ValidateException { public Barcode canPutIn(String inCheckUrl, Barcode barcode) throws ValidateException {
if (!HellaTcpClient.isEnable()) { if (!HellaTcpClient.isEnable()) {
return null; return null;
......
...@@ -578,6 +578,11 @@ public class HellaServiceHandler extends BaseSmfApiListener implements IoHandler ...@@ -578,6 +578,11 @@ public class HellaServiceHandler extends BaseSmfApiListener implements IoHandler
} }
@Override @Override
public void outTaskStatusChange(String outNotifyUrl, List<DataLog> dataLogList) {
}
@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());
} }
......
...@@ -29,6 +29,7 @@ import org.springframework.stereotype.Service; ...@@ -29,6 +29,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
@Slf4j @Slf4j
@Service @Service
...@@ -151,12 +152,16 @@ public class LizhenApi extends DefaultSmfApiListener { ...@@ -151,12 +152,16 @@ public class LizhenApi extends DefaultSmfApiListener {
* @return * @return
*/ */
public Barcode barcodeInfo(Barcode barcode) { public Barcode barcodeInfo(Barcode barcode) {
if (barcodeInfoUrl == null){ if (barcodeInfoUrl == null) {
return null; return null;
} }
log.info("获取MES物料数量入参为:" + barcode.getBarcode()); log.info("获取MES物料数量入参为:" + barcode.getBarcode());
String result = "";
try { try {
String result = HttpHelper.postJson(barcodeInfoUrl, barcode.getBarcode()); result = HttpHelper.postJson(barcodeInfoUrl, barcode.getBarcode());
} catch (ApiException e) {
e.printStackTrace();
}
log.info("获取MES物料数量出参为:" + result); log.info("获取MES物料数量出参为:" + result);
JSONObject resultJson = JsonUtil.toObj(result, JSONObject.class); JSONObject resultJson = JsonUtil.toObj(result, JSONObject.class);
Integer status = resultJson.getInteger("status"); Integer status = resultJson.getInteger("status");
...@@ -181,6 +186,9 @@ public class LizhenApi extends DefaultSmfApiListener { ...@@ -181,6 +186,9 @@ public class LizhenApi extends DefaultSmfApiListener {
barcode.setPartNumber(partNum); barcode.setPartNumber(partNum);
}*/ }*/
if (StringUtils.isNotBlank(reelID)) { if (StringUtils.isNotBlank(reelID)) {
if (qty == 0) {
throw new ValidateException("smfcore.mesApi.inCheck.ng", reelID + "mes数量返回为0,不允许进行入库");
}
if (qty != 0) { if (qty != 0) {
barcode.setAmount(qty); barcode.setAmount(qty);
} }
...@@ -197,15 +205,13 @@ public class LizhenApi extends DefaultSmfApiListener { ...@@ -197,15 +205,13 @@ public class LizhenApi extends DefaultSmfApiListener {
if (StringUtils.isNotBlank(lotCode)){ if (StringUtils.isNotBlank(lotCode)){
barcode.setBatch(lotCode); barcode.setBatch(lotCode);
}*/ }*/
if (StringUtils.isNotBlank(partSpec)){ if (StringUtils.isNotBlank(partSpec)) {
barcode.setDescribe(partSpec); barcode.setDescribe(partSpec);
} }
return barcode; return barcode;
} }
} }
} catch (ApiException e) {
e.printStackTrace();
}
return null; return null;
} }
...@@ -317,15 +323,15 @@ public class LizhenApi extends DefaultSmfApiListener { ...@@ -317,15 +323,15 @@ public class LizhenApi extends DefaultSmfApiListener {
|| task.getBarcode().startsWith("CB")) { || task.getBarcode().startsWith("CB")) {
return; return;
} }
if (!task.isFinished()) { if (!task.isFinished()) {
return; return;
} }
if (task.isBoxOut()){
return;
}
Map<String, Object> dataMap = new HashMap<>(); Map<String, Object> dataMap = new HashMap<>();
dataMap.put("pickingid", ""); dataMap.put("pickingid", "");
if (StringUtils.isNotBlank(task.getSourceName()) && StringUtils.isNotBlank(task.getLine())) { if (StringUtils.isNotBlank(task.getSourceName()) && StringUtils.isNotBlank(task.getLine()) && !task.isManualUpload()) {
dataMap.put("pickingid", task.getSourceName()); dataMap.put("pickingid", task.getSourceName());
outNotifyUrl = outNotifyUrlPK; outNotifyUrl = outNotifyUrlPK;
log.info("出库pk不为空:"+outNotifyUrl); log.info("出库pk不为空:"+outNotifyUrl);
...@@ -334,15 +340,11 @@ public class LizhenApi extends DefaultSmfApiListener { ...@@ -334,15 +340,11 @@ public class LizhenApi extends DefaultSmfApiListener {
dataMap.put("reelno", task.getBarcode()); dataMap.put("reelno", task.getBarcode());
dataMap.put("ipn", task.getPartNumber()); dataMap.put("ipn", task.getPartNumber());
dataMap.put("qty", task.getNum()); dataMap.put("qty", task.getNum());
dataMap.put("datecode", task.getDateCode());
Barcode barcode = barcodeManager.findByBarcode(task.getBarcode()); dataMap.put("lot", task.getBatchInfo());
if (barcode != null) { dataMap.put("vendor", task.getProvider());
dataMap.put("datecode", barcode.getDateCode());
dataMap.put("lot", barcode.getBatch());
dataMap.put("vendor", barcode.getProvider());
dataMap.put("batch", ""); dataMap.put("batch", "");
dataMap.put("vendorcode",barcode.getProviderNumber()); dataMap.put("vendorcode", task.getProviderNumber());
}
dataMap.put("werks", werks); dataMap.put("werks", werks);
dataMap.put("reelid", ""); dataMap.put("reelid", "");
if (outNotifyUrl == outNotifyUrlPK) { if (outNotifyUrl == outNotifyUrlPK) {
...@@ -357,7 +359,7 @@ public class LizhenApi extends DefaultSmfApiListener { ...@@ -357,7 +359,7 @@ public class LizhenApi extends DefaultSmfApiListener {
log.info("保存物料出参为:" + result); log.info("保存物料出参为:" + result);
} catch (ApiException e) { } catch (ApiException e) {
e.printStackTrace(); e.printStackTrace();
log.info(barcode.getBarcode() + "保存物料异常:" + e.getMessage()); log.info(task.getBarcode() + "保存物料异常:" + e.getMessage());
} }
} else { } else {
String param = JsonUtil.toJsonStr(Arrays.asList(dataMap)); String param = JsonUtil.toJsonStr(Arrays.asList(dataMap));
...@@ -367,10 +369,92 @@ public class LizhenApi extends DefaultSmfApiListener { ...@@ -367,10 +369,92 @@ public class LizhenApi extends DefaultSmfApiListener {
log.info("保存物料出参为:" + result); log.info("保存物料出参为:" + result);
} catch (ApiException e) { } catch (ApiException e) {
e.printStackTrace(); e.printStackTrace();
log.info(barcode.getBarcode() + "保存物料异常:" + e.getMessage()); log.info(task.getBarcode() + "保存物料异常:" + e.getMessage());
}
}
}
/**
* 保存物料接口
*
* @param outNotifyUrl
* @param taskList
*/
public void outTaskStatusChange(String outNotifyUrl, List<DataLog> taskList) {
List<DataLog> resultList = new ArrayList<>();
for (DataLog task : taskList) {
if (task.getBarcode().startsWith("CS")
|| task.getBarcode().startsWith("CM")
|| task.getBarcode().startsWith("CB")) {
continue;
}
if (!task.isFinished()) {
continue;
}
resultList.add(task);
}
//构造入参
List<Map<String, Object>> paramList = new ArrayList();
for (DataLog task : resultList) {
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("pickingid", "");
if (StringUtils.isNotBlank(task.getSourceName()) && StringUtils.isNotBlank(task.getLine()) && !task.isManualUpload()) {
dataMap.put("pickingid", task.getSourceName());
}
dataMap.put("wo", "");
dataMap.put("reelno", task.getBarcode());
dataMap.put("ipn", task.getPartNumber());
dataMap.put("qty", task.getNum());
dataMap.put("datecode", task.getDateCode());
dataMap.put("lot", task.getBatchInfo());
dataMap.put("vendor", task.getProvider());
dataMap.put("batch", "");
dataMap.put("vendorcode", task.getProviderNumber());
dataMap.put("werks", werks);
dataMap.put("reelid", "");
paramList.add(dataMap);
}
//有pickingid的任务
List<Map<String, Object>> hasPickingidList = paramList.stream().filter(item -> {
String pickingid = (String) item.get("pickingid");
return StringUtils.isNotBlank(pickingid);
}).collect(Collectors.toList());
if (hasPickingidList != null && !hasPickingidList.isEmpty()) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("data", paramList);
String param = JsonUtil.toJsonStr(jsonObject);
log.info("保存物料入参为:" + param + "地址为:" + outNotifyUrlPK);
try {
String result = HttpHelper.postJson(outNotifyUrlPK, jsonObject);
log.info("保存物料出参为:" + result);
} catch (ApiException e) {
e.printStackTrace();
log.info("保存物料异常:" + e.getMessage());
} }
} }
//无picking的任务
List<Map<String, Object>> noPickingidList = paramList.stream().filter(item -> {
String pickingid = (String) item.get("pickingid");
return StringUtils.isBlank(pickingid);
}).collect(Collectors.toList());
if (noPickingidList != null && !noPickingidList.isEmpty()){
String param = JsonUtil.toJsonStr(paramList);
log.info("保存物料入参为:" + param + "地址为:" + outNotifyUrl);
try {
String result = HttpHelper.postJson(outNotifyUrl, paramList);
log.info("保存物料出参为:" + result);
} catch (ApiException e) {
e.printStackTrace();
log.info("保存物料异常:" + e.getMessage());
}
} }
}
/** /**
* 获取到需求单数据 * 获取到需求单数据
......
package com.neotel.smfcore.custom.lizhen; package com.neotel.smfcore.custom.lizhen;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.neotel.smfcore.common.bean.ResultBean; import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ApiException; import com.neotel.smfcore.common.exception.ApiException;
...@@ -208,6 +209,7 @@ public class LizhenController { ...@@ -208,6 +209,7 @@ public class LizhenController {
item.setItemId(data.get("ID")); item.setItemId(data.get("ID"));
item.setPriority(Integer.valueOf(data.get("PRIORITY"))); item.setPriority(Integer.valueOf(data.get("PRIORITY")));
item.setReel(data.get("REEL")); item.setReel(data.get("REEL"));
item.setBrand(data.get("VENDOR"));
PreWarningItemCache.addItems(Arrays.asList(item)); PreWarningItemCache.addItems(Arrays.asList(item));
return ResultBean.newOkResult(""); return ResultBean.newOkResult("");
} }
......
package com.neotel.smfcore.custom.lizhen.agvBox.bean.query;
import com.neotel.smfcore.common.annotation.QueryCondition;
import com.neotel.smfcore.common.bean.BetweenData;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
public class InventoryQuery {
@QueryCondition(type = QueryCondition.Type.BETWEEN, propName = "createDate")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private BetweenData<Date> createDate;
private String type;
}
package com.neotel.smfcore.custom.lizhen.agvBox.enums;
/**
* 异动类型
*/
public enum CHANGE_TYPE {
PICKING_DETAIL("PK发料"),
GR_PUTIN("GR入库"),
MANUAL_PUTIN("手动入库"),
MANUAL_CHECKOUT("手动出库"),
TASK_CANNEL("任务取消"),
VIRTUAL_PICKING_DETAIL("虚拟仓PK发料"),
VIRTUAL_CHECKOUT("虚拟仓出库");
private final String name;
CHANGE_TYPE(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
...@@ -391,6 +391,7 @@ public class AgvBoxDeviceClientController { ...@@ -391,6 +391,7 @@ public class AgvBoxDeviceClientController {
lockRfidTarget.remove(opTask.getBarcode()); lockRfidTarget.remove(opTask.getBarcode());
//已完成,从完成缓存中清除 //已完成,从完成缓存中清除
taskService.removeFinishedTask(opTask); taskService.removeFinishedTask(opTask);
taskService.addBoxPosName(opTask);
} }
} }
......
package com.neotel.smfcore.custom.lizhen.agvBox.rest; package com.neotel.smfcore.custom.lizhen.agvBox.rest;
import cn.hutool.core.date.DateTime;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.neotel.smfcore.common.bean.BetweenData;
import com.neotel.smfcore.common.bean.ReelLockPosInfo; import com.neotel.smfcore.common.bean.ReelLockPosInfo;
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.utils.*; import com.neotel.smfcore.common.utils.*;
import com.neotel.smfcore.core.barcode.bean.CodeBean; import com.neotel.smfcore.core.barcode.bean.CodeBean;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager; import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
...@@ -24,12 +25,12 @@ import com.neotel.smfcore.custom.lizhen.agvBox.bean.InventoryData; ...@@ -24,12 +25,12 @@ import com.neotel.smfcore.custom.lizhen.agvBox.bean.InventoryData;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.PartitionInfo; import com.neotel.smfcore.custom.lizhen.agvBox.bean.PartitionInfo;
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.bean.enums.InventoryStatus; import com.neotel.smfcore.custom.lizhen.agvBox.bean.enums.InventoryStatus;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.query.InventoryQuery;
import com.neotel.smfcore.custom.lizhen.agvBox.service.manager.InventoryDataManager; import com.neotel.smfcore.custom.lizhen.agvBox.service.manager.InventoryDataManager;
import com.neotel.smfcore.custom.lizhen.agvBox.util.BoxUtil; import com.neotel.smfcore.custom.lizhen.agvBox.util.BoxUtil;
import com.neotel.smfcore.custom.lizhen.agvBox.util.StationCacheUtil; import com.neotel.smfcore.custom.lizhen.agvBox.util.StationCacheUtil;
import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType; import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType;
import com.neotel.smfcore.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.sun.org.apache.regexp.internal.RE;
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.data.domain.Sort; import org.springframework.data.domain.Sort;
...@@ -37,11 +38,10 @@ import org.springframework.data.mongodb.core.query.Criteria; ...@@ -37,11 +38,10 @@ import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.swing.*;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -85,7 +85,7 @@ public class InventoryController { ...@@ -85,7 +85,7 @@ public class InventoryController {
* @return * @return
*/ */
@RequestMapping("/getInventoryStatus") @RequestMapping("/getInventoryStatus")
@AnonymousAccess //@AnonymousAccess
public Map<String, String> getInventoryStatus() { public Map<String, String> getInventoryStatus() {
Map<String, String> resultMap = new LinkedHashMap<>(); Map<String, String> resultMap = new LinkedHashMap<>();
for (InventoryStatus status : InventoryStatus.values()) { for (InventoryStatus status : InventoryStatus.values()) {
...@@ -100,7 +100,7 @@ public class InventoryController { ...@@ -100,7 +100,7 @@ public class InventoryController {
* @return * @return
*/ */
@RequestMapping("/getInventoryInfo") @RequestMapping("/getInventoryInfo")
@AnonymousAccess //@AnonymousAccess
public ResultBean getInventoryInfo() { public ResultBean getInventoryInfo() {
Map<String, Object> resultMap = new HashMap<>(); Map<String, Object> resultMap = new HashMap<>();
int inventoryCount = 0; int inventoryCount = 0;
...@@ -162,11 +162,11 @@ public class InventoryController { ...@@ -162,11 +162,11 @@ public class InventoryController {
* @return * @return
*/ */
@RequestMapping("/inventoryStart") @RequestMapping("/inventoryStart")
@AnonymousAccess //@AnonymousAccess
public ResultBean inventoryStart() { public ResultBean inventoryStart() {
String inventoryBatch = dataCache.getCache(INVENTORY_DATA) + ""; String inventoryBatch = dataCache.getCache(INVENTORY_DATA) + "";
if (StringUtils.isBlank(inventoryBatch) || "-1".equals(inventoryBatch)) { if (StringUtils.isBlank(inventoryBatch) || "-1".equals(inventoryBatch)) {
inventoryBatch = DateUtil.toDateString(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss.SSS"); inventoryBatch = com.neotel.smfcore.common.utils.DateUtil.toDateString(System.currentTimeMillis(), "yyyyMMddHHmmssSSS");
dataCache.updateCache(INVENTORY_DATA, inventoryBatch); dataCache.updateCache(INVENTORY_DATA, inventoryBatch);
} }
log.info(SecurityUtils.getCurrentUsername() + "开始盘点,批次为:" + inventoryBatch); log.info(SecurityUtils.getCurrentUsername() + "开始盘点,批次为:" + inventoryBatch);
...@@ -181,7 +181,7 @@ public class InventoryController { ...@@ -181,7 +181,7 @@ public class InventoryController {
* @return * @return
*/ */
@RequestMapping("/inventoryEnd") @RequestMapping("/inventoryEnd")
@AnonymousAccess //@AnonymousAccess
public ResultBean inventoryEnd(int type) { public ResultBean inventoryEnd(int type) {
log.info(SecurityUtils.getCurrentUsername() + "盘点结束,type为:" + type); log.info(SecurityUtils.getCurrentUsername() + "盘点结束,type为:" + type);
String inventoryBatch = dataCache.getCache(INVENTORY_DATA) + ""; String inventoryBatch = dataCache.getCache(INVENTORY_DATA) + "";
...@@ -227,7 +227,7 @@ public class InventoryController { ...@@ -227,7 +227,7 @@ public class InventoryController {
* @return * @return
*/ */
@RequestMapping("/getStoragePosData") @RequestMapping("/getStoragePosData")
@AnonymousAccess //@AnonymousAccess
public List<StoragePosDto> getStoragePosData(String posName) { public List<StoragePosDto> getStoragePosData(String posName) {
List<Storage> storageList = new ArrayList<>(); List<Storage> storageList = new ArrayList<>();
for (Storage storage : dataCache.getAllStorage().values()) { for (Storage storage : dataCache.getAllStorage().values()) {
...@@ -272,8 +272,9 @@ public class InventoryController { ...@@ -272,8 +272,9 @@ public class InventoryController {
* @return * @return
*/ */
@RequestMapping("/inventoryOut") @RequestMapping("/inventoryOut")
@AnonymousAccess //@AnonymousAccess
public ResultBean inventoryOut(@RequestBody List<String> storagePosIdList) { public synchronized ResultBean inventoryOut(@RequestBody List<String> storagePosIdList) {
String msg = "";
String inventoryBatch = dataCache.getCache(INVENTORY_DATA) + ""; String inventoryBatch = dataCache.getCache(INVENTORY_DATA) + "";
if (StringUtils.isBlank(inventoryBatch) || "-1".equals(inventoryBatch)) { if (StringUtils.isBlank(inventoryBatch) || "-1".equals(inventoryBatch)) {
return ResultBean.newErrorResult(-1, "", "请点击开始盘点"); return ResultBean.newErrorResult(-1, "", "请点击开始盘点");
...@@ -292,14 +293,14 @@ public class InventoryController { ...@@ -292,14 +293,14 @@ public class InventoryController {
if (dataList != null && !dataList.isEmpty()) { if (dataList != null && !dataList.isEmpty()) {
List<String> dataPosNameList = dataList.stream().map(InventoryData::getPosName).collect(Collectors.toList()); List<String> dataPosNameList = dataList.stream().map(InventoryData::getPosName).collect(Collectors.toList());
dataPosNameList = dataPosNameList.stream().distinct().collect(Collectors.toList()); dataPosNameList = dataPosNameList.stream().distinct().collect(Collectors.toList());
return ResultBean.newErrorResult(-1,"",JsonUtil.toJsonStr(dataPosNameList)+"已经进行过盘点出库,请核实"); return ResultBean.newErrorResult(-1, "", JsonUtil.toJsonStr(dataPosNameList) + "已经进行过盘点出库,请核实");
} }
for (StoragePos pos : storagePosList) { for (StoragePos pos : storagePosList) {
log.info("盘点出库的库位为:"+pos.getPosName()); log.info("盘点出库的库位为:" + pos.getPosName());
Barcode barcode = pos.getBarcode(); Barcode barcode = pos.getBarcode();
if (barcode != null) { if (barcode != null) {
log.info("盘点出库的物料为:"+barcode.getBarcode()); log.info("盘点出库的物料为:" + barcode.getBarcode());
Storage storage = dataCache.getStorageById(pos.getStorageId()); Storage storage = dataCache.getStorageById(pos.getStorageId());
barcode.setInventory(true); barcode.setInventory(true);
barcode = barcodeManager.save(barcode); barcode = barcodeManager.save(barcode);
...@@ -312,6 +313,7 @@ public class InventoryController { ...@@ -312,6 +313,7 @@ public class InventoryController {
taskService.addTaskToExecute(dataLog); taskService.addTaskToExecute(dataLog);
} catch (Exception e) { } catch (Exception e) {
log.error("盘点出库失败:" + e.getMessage()); log.error("盘点出库失败:" + e.getMessage());
msg = StringUtils.isBlank(msg) ? dataLog.getBarcode() : msg + "," + dataLog.getBarcode();
continue; continue;
} }
} }
...@@ -319,6 +321,10 @@ public class InventoryController { ...@@ -319,6 +321,10 @@ public class InventoryController {
generateInventoryData(barcode, pos); generateInventoryData(barcode, pos);
} }
} }
if (StringUtils.isNotBlank(msg)){
msg = msg +"已经有出入库任务请核实";
return ResultBean.newOkResult("","",msg);
}
return ResultBean.newOkResult(""); return ResultBean.newOkResult("");
} }
...@@ -330,7 +336,7 @@ public class InventoryController { ...@@ -330,7 +336,7 @@ public class InventoryController {
* @return * @return
*/ */
@RequestMapping("/inventoryBoxInfo") @RequestMapping("/inventoryBoxInfo")
@AnonymousAccess //@AnonymousAccess
public ResultBean inventoryBoxInfo(String name) { public ResultBean inventoryBoxInfo(String name) {
//根据名称获取当前工位上的箱子 //根据名称获取当前工位上的箱子
Station station = StationCacheUtil.getStation(name); Station station = StationCacheUtil.getStation(name);
...@@ -383,8 +389,8 @@ public class InventoryController { ...@@ -383,8 +389,8 @@ public class InventoryController {
* @return * @return
*/ */
@RequestMapping("/inventoryReel") @RequestMapping("/inventoryReel")
@AnonymousAccess //@AnonymousAccess
public ResultBean inventoryReel(@RequestBody Map<String, String> paramMap) { public synchronized ResultBean inventoryReel(@RequestBody Map<String, String> paramMap) {
String name = paramMap.get("name"); String name = paramMap.get("name");
String bacodeStr = paramMap.get("bacodeStr"); String bacodeStr = paramMap.get("bacodeStr");
log.info("盘点人:" + SecurityUtils.getCurrentUsername() + ",工位为:" + name + ",物料编码为:" + bacodeStr); log.info("盘点人:" + SecurityUtils.getCurrentUsername() + ",工位为:" + name + ",物料编码为:" + bacodeStr);
...@@ -411,7 +417,7 @@ public class InventoryController { ...@@ -411,7 +417,7 @@ public class InventoryController {
* @return * @return
*/ */
@RequestMapping("/inventoryFinished") @RequestMapping("/inventoryFinished")
@AnonymousAccess //@AnonymousAccess
public ResultBean inventoryFinished(@RequestBody Map<String, String> paramMap) { public ResultBean inventoryFinished(@RequestBody Map<String, String> paramMap) {
String code = paramMap.get("barcode"); //料箱条码 String code = paramMap.get("barcode"); //料箱条码
String name = paramMap.get("name"); //工位名称 String name = paramMap.get("name"); //工位名称
...@@ -502,6 +508,63 @@ public class InventoryController { ...@@ -502,6 +508,63 @@ public class InventoryController {
return ResultBean.newOkResult(""); return ResultBean.newOkResult("");
} }
/**
* 未盘点出库的箱子进行出库
*/
@RequestMapping("/noInventoryOut")
@AnonymousAccess
public ResultBean noInventoryOut(InventoryQuery query) {
//判断时间是否为空
BetweenData<Date> createDateBetween = query.getCreateDate();
if (createDateBetween == null || createDateBetween.isEmpty()) {
return ResultBean.newErrorResult(-1, "", "所选时间为空");
}
if (createDateBetween.getFrom().getTime() == createDateBetween.getTo().getTime()) {
createDateBetween.set(1, DateUtil.addDays(createDateBetween.getTo(),1));
query.setCreateDate(createDateBetween);
}
//判断批次是否为空
String inventoryBatch = dataCache.getCache(INVENTORY_DATA) + "";
if (StringUtils.isNotBlank(inventoryBatch)) {
return ResultBean.newErrorResult(-1, "", "请结束上一次盘点,再进行操作");
}
List<InventoryData> inventoryDataList = inventoryDataManager.findByQuery(QueryHelp.getQuery(query));
if (inventoryDataList == null || inventoryDataList.isEmpty()) {
return ResultBean.newErrorResult(-1, "", "所选时间内没有盘点过的料箱,请核实");
}
List<String> inventoryBoxList = inventoryDataList.stream().map(item -> item.getBox()).distinct().collect(Collectors.toList());
//2.得到agv料箱
Storage storage = null;
for (Storage stor : dataCache.getAllStorage().values()) {
if (stor.isStorage(DeviceType.AGV_BOX)) {
storage = stor;
break;
}
}
List<StoragePos> storagePosList = storagePosManager.findNotEmptyByStorageId(storage.getId());
List<String> storagePosIdList = storagePosList.stream().filter(item -> {
String barcode = item.getBarcode().getBarcode();
if (!inventoryBoxList.contains(barcode)) {
return true;
}
return false;
}).map(item -> item.getId()).collect(Collectors.toList());
//如果type == 1时,提醒要出库的物料
if ("1".equals(query.getType())) {
return ResultBean.newErrorResult(1, "", "当前需要盘点的料箱数量为:" + (storagePosIdList == null ? 0 : storagePosIdList.size()));
}
synchronized (this) {
//判断批次是否为空
String newBatch = dataCache.getCache(INVENTORY_DATA) + "";
if (StringUtils.isNotBlank(newBatch)) {
return ResultBean.newErrorResult(-1, "", "当前正在进行盘点出库,请核实");
}
dataCache.updateCache(INVENTORY_DATA, com.neotel.smfcore.common.utils.DateUtil.toDateString(System.currentTimeMillis(), "yyyyMMddHHmmssSSS"));
}
return inventoryOut(storagePosIdList);
}
private void generateTask(Storage storage, Barcode barcode, StoragePos pos, int type, String status,int extendType) { private void generateTask(Storage storage, Barcode barcode, StoragePos pos, int type, String status,int extendType) {
//开始入库任务 //开始入库任务
DataLog task = new DataLog(storage, barcode, pos); DataLog task = new DataLog(storage, barcode, pos);
...@@ -538,6 +601,7 @@ public class InventoryController { ...@@ -538,6 +601,7 @@ public class InventoryController {
if (!posName.startsWith(boxStr)) { if (!posName.startsWith(boxStr)) {
return barcode.getBarcode() + "存在料箱中:" + barcode.getPosName() + "与当前工位上的料箱:" + boxStr + "不一致"; return barcode.getBarcode() + "存在料箱中:" + barcode.getPosName() + "与当前工位上的料箱:" + boxStr + "不一致";
} }
log.info(barcode.getBarcode() + "隔口信息:" + barcode.getPosName());
//开始查询盘点数据 //开始查询盘点数据
//盘点批次 //盘点批次
String inventoryBatch = dataCache.getCache(INVENTORY_DATA) + ""; String inventoryBatch = dataCache.getCache(INVENTORY_DATA) + "";
...@@ -578,17 +642,28 @@ public class InventoryController { ...@@ -578,17 +642,28 @@ public class InventoryController {
data.setInventoryAmout(data.getInventoryAmout() + barcode.getAmount()); data.setInventoryAmout(data.getInventoryAmout() + barcode.getAmount());
data.updateBarcodeList(barcode); data.updateBarcodeList(barcode);
//判断是否完成 //判断是否完成
if (data.getReelCount() == data.getInventoryReelCount() && data.getInventoryAmout() == data.getAmout()) { if (data.getInventoryReelCount() >= data.getReelCount() && data.getInventoryAmout() >= data.getAmout()) {
data.setStatus(InventoryStatus.FINISHED.name()); data.setStatus(InventoryStatus.FINISHED.name());
data.setMatch(true); data.setMatch(true);
} else { } else {
data.setStatus(InventoryStatus.EXECUTING.name()); data.setStatus(InventoryStatus.EXECUTING.name());
} }
//判断data是否需要盘点,如果不是,则改成需要盘点 //判断data是否需要盘点,如果不是,则改成需要盘点
if (!data.isNeedInventory()){ if (!data.isNeedInventory()) {
data.setNeedInventory(true); data.setNeedInventory(true);
} }
//设置创建人为当前盘点人
data.setCreator(SecurityUtils.getCurrentUsername());
inventoryDataManager.save(data); inventoryDataManager.save(data);
//同时,把当前料箱的盘点人,都改成当前登录人
List<InventoryData> inventoryDataList = inventoryDataManager.findByQuery(new Query(Criteria.where("inventoryBatch").is(inventoryBatch).and("box").is(boxStr)));
if (inventoryDataList != null && !inventoryDataList.isEmpty()){
for (InventoryData inventoryData : inventoryDataList) {
inventoryData.setCreator(SecurityUtils.getCurrentUsername());
inventoryDataManager.save(inventoryData);
}
}
return errorMsg; return errorMsg;
} }
...@@ -599,7 +674,7 @@ public class InventoryController { ...@@ -599,7 +674,7 @@ public class InventoryController {
* @param barcode * @param barcode
* @param pos * @param pos
*/ */
private void generateInventoryData(Barcode barcode, StoragePos pos) { private synchronized void generateInventoryData(Barcode barcode, StoragePos pos) {
//判断盘点批次是否存在 //判断盘点批次是否存在
String inventoryBatch = dataCache.getCache(INVENTORY_DATA); String inventoryBatch = dataCache.getCache(INVENTORY_DATA);
//获取原始库位 //获取原始库位
...@@ -620,7 +695,7 @@ public class InventoryController { ...@@ -620,7 +695,7 @@ public class InventoryController {
List<Barcode> subCodeList = barcode.getSubCodeList(); List<Barcode> subCodeList = barcode.getSubCodeList();
String partition = getInventoryPartition(subCodeList); String partition = getInventoryPartition(subCodeList);
String boxStr = barcode.getBarcode(); String boxStr = barcode.getBarcode();
int count = boxStr.startsWith("CS") ? 8 : 2; //CS开头的8个隔口,其他是2个 int count = boxStr.startsWith("CS") || boxStr.startsWith("CB") ? 8 : 2; //CS开头的8个隔口,其他是2个
for (int i = 1; i <= count; i++) { for (int i = 1; i <= count; i++) {
String priPartition = boxStr + "-" + i; String priPartition = boxStr + "-" + i;
InventoryData data = new InventoryData(); InventoryData data = new InventoryData();
...@@ -639,7 +714,6 @@ public class InventoryController { ...@@ -639,7 +714,6 @@ public class InventoryController {
//数量 //数量
int partitionNum = BoxUtil.getPartitionNum(priPartition, subCodeList); int partitionNum = BoxUtil.getPartitionNum(priPartition, subCodeList);
data.setAmout(partitionNum); data.setAmout(partitionNum);
data.setCreator(SecurityUtils.getCurrentUsername());
data.setInventoryBatch(inventoryBatch); data.setInventoryBatch(inventoryBatch);
data.setOriPosName(oriPosName); data.setOriPosName(oriPosName);
if (partition.equals(boxStr + "-" + i)) { if (partition.equals(boxStr + "-" + i)) {
......
...@@ -4,7 +4,10 @@ import com.google.common.collect.Lists; ...@@ -4,7 +4,10 @@ import com.google.common.collect.Lists;
import com.neotel.smfcore.common.bean.ReelLockPosInfo; import com.neotel.smfcore.common.bean.ReelLockPosInfo;
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.*; import com.neotel.smfcore.common.utils.JsonUtil;
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.api.SmfApi;
import com.neotel.smfcore.core.barcode.bean.CodeBean; import com.neotel.smfcore.core.barcode.bean.CodeBean;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager; import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
...@@ -22,13 +25,10 @@ import com.neotel.smfcore.core.storage.service.po.StoragePos; ...@@ -22,13 +25,10 @@ import com.neotel.smfcore.core.storage.service.po.StoragePos;
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.custom.lizhen.LizhenApi; import com.neotel.smfcore.custom.lizhen.LizhenApi;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.Station;
import com.neotel.smfcore.custom.lizhen.agvBox.enums.CHANGE_TYPE;
import com.neotel.smfcore.custom.lizhen.agvBox.enums.INOUT_TYPE; import com.neotel.smfcore.custom.lizhen.agvBox.enums.INOUT_TYPE;
import com.neotel.smfcore.custom.lizhen.agvBox.util.BoxUtil; import com.neotel.smfcore.custom.lizhen.agvBox.util.BoxUtil;
import com.neotel.smfcore.custom.lizhen.agvBox.util.StationCacheUtil; import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType;
import com.neotel.smfcore.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.sun.org.apache.regexp.internal.RE;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -36,12 +36,10 @@ import org.springframework.data.mongodb.core.query.Criteria; ...@@ -36,12 +36,10 @@ import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Slf4j @Slf4j
...@@ -98,7 +96,7 @@ public class OutLineController { ...@@ -98,7 +96,7 @@ public class OutLineController {
@ApiOperation("线外扫码入库") @ApiOperation("线外扫码入库")
@RequestMapping("/operatePos") @RequestMapping("/operatePos")
@AnonymousAccess @AnonymousAccess
public ResultBean operatePos(@RequestBody Map<String, String> paramMap) { public synchronized ResultBean operatePos(@RequestBody Map<String, String> paramMap) {
String name = paramMap.get("name"); //当前工位名称 String name = paramMap.get("name"); //当前工位名称
String code = paramMap.get("code"); //传入的物料信息 String code = paramMap.get("code"); //传入的物料信息
String size = paramMap.get("size"); //尺寸信息 String size = paramMap.get("size"); //尺寸信息
...@@ -112,6 +110,7 @@ public class OutLineController { ...@@ -112,6 +110,7 @@ public class OutLineController {
if (StringUtils.isBlank(code)) { if (StringUtils.isBlank(code)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"条码编号"}); return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"条码编号"});
} }
code = code.toUpperCase();
if (StringUtils.isBlank(warehouseCode)) { if (StringUtils.isBlank(warehouseCode)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"库别"}); return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"库别"});
} }
...@@ -143,20 +142,19 @@ public class OutLineController { ...@@ -143,20 +142,19 @@ public class OutLineController {
String boxPartition = ""; String boxPartition = "";
//判断是否隔口或者是物料 //判断是否隔口或者是物料
if (isBoxPartition(barcode.getPartNumber())) { if (isBoxPartition(barcode.getPartNumber())) {
boolean canPutIn = BoxUtil.isCanPutIn(code);
if (!canPutIn){
return ResultBean.newErrorResult(-1,"","无效的隔口码:"+code);
}
//如果是隔口,获取到料箱号 //如果是隔口,获取到料箱号
boxStr = barcode.getBarcode(); boxStr = barcode.getBarcode();
//判断尺寸与箱子是否一致 //判断尺寸与箱子是否一致
if (platSize == 7) { if (platSize == 7) {
if (!code.startsWith("CS")) { if (!code.startsWith("CS") && !code.startsWith("CB")) {
return ResultBean.newErrorResult(-1, "", "物料规格为7寸与当前工位上的料箱:" + boxStr + "不匹配"); return ResultBean.newErrorResult(-1, "", "物料规格为7寸与当前工位上的料箱:" + boxStr + "不匹配");
} }
} /*else if (platSize == 13) { } else if (platSize == 15) {
if (!code.startsWith("CM")) { if (!code.startsWith("CM")) {
return ResultBean.newErrorResult(-1, "", "物料规格为13寸与当前工位上的料箱:" + boxStr + "不匹配");
}
}*/ else if (platSize == 15) {
if (!code.startsWith("CB") && !code.startsWith("CM")) {
return ResultBean.newErrorResult(-1, "", "物料规格为15寸与当前工位上的料箱:" + boxStr + "不匹配"); return ResultBean.newErrorResult(-1, "", "物料规格为15寸与当前工位上的料箱:" + boxStr + "不匹配");
} }
} }
...@@ -239,7 +237,8 @@ public class OutLineController { ...@@ -239,7 +237,8 @@ public class OutLineController {
Date date = new Date(); Date date = new Date();
barcode.setPutInTime(date.getTime()); barcode.setPutInTime(date.getTime());
barcode.setPutInDate(date); barcode.setPutInDate(date);
String result = finishTask(boxStr, OP.PUT_IN, barcode, barcode.getAmount(), OP_STATUS.FINISHED.name()); barcode.setCreator(SecurityUtils.getCurrentUsername());
String result = finishTask(boxStr, OP.PUT_IN, barcode, barcode.getAmount(), OP_STATUS.FINISHED.name(), ExtendType.MANUAL_PUTIN);
if (StringUtils.isNotBlank(result)) { if (StringUtils.isNotBlank(result)) {
return ResultBean.newErrorResult(-1, "", result); return ResultBean.newErrorResult(-1, "", result);
} }
...@@ -251,7 +250,7 @@ public class OutLineController { ...@@ -251,7 +250,7 @@ public class OutLineController {
@ApiOperation("完成装箱并入库") @ApiOperation("完成装箱并入库")
@RequestMapping("/finishBoxPutIn") @RequestMapping("/finishBoxPutIn")
@AnonymousAccess @AnonymousAccess
public ResultBean finishBoxPutIn(@RequestBody Map<String, String> paramMap) { public synchronized ResultBean finishBoxPutIn(@RequestBody Map<String, String> paramMap) {
String code = paramMap.get("barcode"); //料箱条码 String code = paramMap.get("barcode"); //料箱条码
String name = paramMap.get("name"); //工位名称 String name = paramMap.get("name"); //工位名称
String cids = paramMap.get("cids"); String cids = paramMap.get("cids");
...@@ -301,9 +300,9 @@ public class OutLineController { ...@@ -301,9 +300,9 @@ public class OutLineController {
Barcode boxBarcode = barcodeManager.findByBarcode(boxStr); Barcode boxBarcode = barcodeManager.findByBarcode(boxStr);
//校验是否已经存在库位 //校验是否已经存在库位
if (StringUtils.isNotBlank(boxBarcode.getPosName())) { /*if (StringUtils.isNotBlank(boxBarcode.getPosName())) {
return ResultBean.newErrorResult(-1, "smfcore.storagePos.existBarcode", "{}已存在库位{}中", new String[]{boxBarcode.getBarcode(), boxBarcode.getPosName()}); return ResultBean.newErrorResult(-1, "smfcore.storagePos.existBarcode", "{}已存在库位{}中", new String[]{boxBarcode.getBarcode(), boxBarcode.getPosName()});
} }*/
StoragePos storagePos = storagePosManager.getByBarcode(boxBarcode.getBarcode()); StoragePos storagePos = storagePosManager.getByBarcode(boxBarcode.getBarcode());
if (storagePos != null){ if (storagePos != null){
...@@ -346,17 +345,19 @@ public class OutLineController { ...@@ -346,17 +345,19 @@ public class OutLineController {
//生成任务 //生成任务
finishTask(boxStr, OP.CHECKOUT, null, OP_STATUS.CANCEL.name(), INOUT_TYPE.CANCEL_ONE.name()); finishTask(boxStr, OP.CHECKOUT, null, OP_STATUS.CANCEL.name(), INOUT_TYPE.CANCEL_ONE.name());
boxAllCountMap.remove(boxStr); boxAllCountMap.remove(boxStr);
generateTask(dataCache.getStorageById(pos.getStorageId()), boxBarcode, pos, OP.PUT_IN, OP_STATUS.WAIT.name(), null); generateTask(dataCache.getStorageById(pos.getStorageId()), boxBarcode, pos, OP.PUT_IN, OP_STATUS.WAIT.name(), null,ExtendType.STORAGE_PUTIN);
taskService.removePosName(boxStr);
} else { //入虚拟仓 } else { //入虚拟仓
finishTask(boxStr, OP.CHECKOUT, null, OP_STATUS.CANCEL.name(), INOUT_TYPE.CANCEL_ONE.name()); finishTask(boxStr, OP.CHECKOUT, null, OP_STATUS.CANCEL.name(), INOUT_TYPE.CANCEL_ONE.name());
boxAllCountMap.remove(boxStr); boxAllCountMap.remove(boxStr);
boxSideMap.remove(boxStr); boxSideMap.remove(boxStr);
boxBarcode = barcodeManager.findByBarcode(boxStr); boxBarcode = barcodeManager.findByBarcode(boxStr);
StoragePos pos = intoVirtualPos(boxBarcode,posName); StoragePos pos = intoVirtualPos(boxBarcode,posName);
DataLog task = generateTask(dataCache.getStorageById(pos.getStorageId()), boxBarcode, pos, OP.PUT_IN, OP_STATUS.FINISHED.name(), null); DataLog task = generateTask(dataCache.getStorageById(pos.getStorageId()), boxBarcode, pos, OP.PUT_IN, OP_STATUS.FINISHED.name(), null,ExtendType.VIRTUAL_PUTIN);
taskService.moveTaskToFinished(task); taskService.moveTaskToFinished(task);
taskService.updateFinishedTask(task); taskService.updateFinishedTask(task);
taskService.removeFinishedTask(task); taskService.removeFinishedTask(task);
taskService.removePosName(boxStr);
} }
return ResultBean.newOkResult(""); return ResultBean.newOkResult("");
} }
...@@ -367,6 +368,7 @@ public class OutLineController { ...@@ -367,6 +368,7 @@ public class OutLineController {
//@AnonymousAccess //@AnonymousAccess
public ResultBean checkOut(@RequestBody Map<String, String> paramMap) { public ResultBean checkOut(@RequestBody Map<String, String> paramMap) {
String code = paramMap.get("code"); String code = paramMap.get("code");
code = code.toUpperCase();
//判断是否整箱出库 //判断是否整箱出库
if (isBoxPartition(code) && (code.endsWith("A") || code.endsWith("B"))) { if (isBoxPartition(code) && (code.endsWith("A") || code.endsWith("B"))) {
return finishTask(code, OP.CHECKOUT, null, OP_STATUS.FINISHED.name(), INOUT_TYPE.OUT_BOX.name()); return finishTask(code, OP.CHECKOUT, null, OP_STATUS.FINISHED.name(), INOUT_TYPE.OUT_BOX.name());
...@@ -404,6 +406,8 @@ public class OutLineController { ...@@ -404,6 +406,8 @@ public class OutLineController {
return ResultBean.newErrorResult(-1, "", pidBarcode.getBarcode() + "不允许全部取出,请核实"); return ResultBean.newErrorResult(-1, "", pidBarcode.getBarcode() + "不允许全部取出,请核实");
} }
} }
finishVirtualTask(boxStr);
List<DataLog> dataLogList = new ArrayList<>();
//开始循环,生成任务 //开始循环,生成任务
for (int index = 0; index < subCodes.size();/*; index++*/) { for (int index = 0; index < subCodes.size();/*; index++*/) {
Barcode subCode = subCodes.get(index); Barcode subCode = subCodes.get(index);
...@@ -430,14 +434,18 @@ public class OutLineController { ...@@ -430,14 +434,18 @@ public class OutLineController {
pidBarcode.setReelAmount(pidBarcode.getReelAmount() - 1); pidBarcode.setReelAmount(pidBarcode.getReelAmount() - 1);
pidBarcode.setAmount(pidBarcode.getAmount() - amount); pidBarcode.setAmount(pidBarcode.getAmount() - amount);
pidBarcode = barcodeManager.save(pidBarcode); pidBarcode = barcodeManager.save(pidBarcode);
generateTask(subCode, opStatus, amount, opType, orderItemId); int extendType = StringUtils.isNotBlank(subCode.getOrderItemId()) ? ExtendType.VIRTUAL_PICKING_DETAIL : ExtendType.VIRTUAL_CHECKOUT;
DataLog dataLog = generateTask(subCode, opStatus, amount, opType, orderItemId, extendType, true);
dataLogList.add(dataLog);
log.info("整箱出库,生成出库任务,barcode:" + subCode.getBarcode() + ",料箱号为:" + pidBarcode.getBarcode()); log.info("整箱出库,生成出库任务,barcode:" + subCode.getBarcode() + ",料箱号为:" + pidBarcode.getBarcode());
if (subCode.getAmount() <= 0) { if (subCode.getAmount() <= 0) {
barcodeManager.delete(subCode); barcodeManager.delete(subCode);
} }
} }
if (dataLogList != null && !dataLogList.isEmpty()) {
taskService.outTaskStatusChange(dataLogList);
}
resultBean.setData(getBoxInfo(boxStr)); resultBean.setData(getBoxInfo(boxStr));
finishVirtualTask(boxStr);
if (hasBrand) { if (hasBrand) {
resultBean.setCode(3); resultBean.setCode(3);
return resultBean; return resultBean;
...@@ -472,6 +480,8 @@ public class OutLineController { ...@@ -472,6 +480,8 @@ public class OutLineController {
return ResultBean.newErrorResult(-1, "", boxStr + "不允许全部出库,请核实"); return ResultBean.newErrorResult(-1, "", boxStr + "不允许全部出库,请核实");
} }
} }
finishVirtualTask(boxStr);
List<DataLog> dataLogList = new ArrayList<>();
for (int index = 0; index < needOutBarcodes.size(); index++) { for (int index = 0; index < needOutBarcodes.size(); index++) {
Barcode subCode = needOutBarcodes.get(index); Barcode subCode = needOutBarcodes.get(index);
String orderItemId = subCode.getOrderItemId(); String orderItemId = subCode.getOrderItemId();
...@@ -495,7 +505,9 @@ public class OutLineController { ...@@ -495,7 +505,9 @@ public class OutLineController {
pidBarcode.setReelAmount(pidBarcode.getReelAmount() - 1); pidBarcode.setReelAmount(pidBarcode.getReelAmount() - 1);
pidBarcode.setAmount(pidBarcode.getAmount() - amount); pidBarcode.setAmount(pidBarcode.getAmount() - amount);
pidBarcode = barcodeManager.save(pidBarcode); pidBarcode = barcodeManager.save(pidBarcode);
generateTask(subCode, opStatus, amount, opType, orderItemId); int extendType = StringUtils.isNotBlank(subCode.getOrderItemId()) ? ExtendType.VIRTUAL_PICKING_DETAIL : ExtendType.VIRTUAL_CHECKOUT;
DataLog dataLog = generateTask(subCode, opStatus, amount, opType, orderItemId, extendType, true);
dataLogList.add(dataLog);
log.info("隔口出库,生成出库任务,barcode:" + subCode.getBarcode() + ",料箱号为:" + subCode.getPosName()); log.info("隔口出库,生成出库任务,barcode:" + subCode.getBarcode() + ",料箱号为:" + subCode.getPosName());
log.info("箱子数量为:" + pidBarcode.getAmount() + ",物料数量为:" + pidBarcode.getReelAmount() + "箱号为:" + pidBarcode.getBarcode()); log.info("箱子数量为:" + pidBarcode.getAmount() + ",物料数量为:" + pidBarcode.getReelAmount() + "箱号为:" + pidBarcode.getBarcode());
if (subCode.getAmount() <= 0) { if (subCode.getAmount() <= 0) {
...@@ -503,8 +515,10 @@ public class OutLineController { ...@@ -503,8 +515,10 @@ public class OutLineController {
} }
//} //}
} }
if (dataLogList != null && !dataLogList.isEmpty()){
taskService.outTaskStatusChange(dataLogList);
}
resultBean.setData(getBoxInfo(boxStr)); resultBean.setData(getBoxInfo(boxStr));
finishVirtualTask(boxStr);
if (hasBrand) { if (hasBrand) {
resultBean.setCode(3); resultBean.setCode(3);
return resultBean; return resultBean;
...@@ -564,6 +578,7 @@ public class OutLineController { ...@@ -564,6 +578,7 @@ public class OutLineController {
return ResultBean.newErrorResult(-1, "", "请核实与查询条件:" + selectMsg + "是否一致"); return ResultBean.newErrorResult(-1, "", "请核实与查询条件:" + selectMsg + "是否一致");
} }
} }
finishVirtualTask(boxStr);
//判断当前隔口是否有要出的任务 //判断当前隔口是否有要出的任务
boolean isOut = false; boolean isOut = false;
if (barcode.isOut()) { if (barcode.isOut()) {
...@@ -589,7 +604,8 @@ public class OutLineController { ...@@ -589,7 +604,8 @@ public class OutLineController {
pidBarcode.setReelAmount(pidBarcode.getReelAmount() - 1); pidBarcode.setReelAmount(pidBarcode.getReelAmount() - 1);
pidBarcode.setAmount(pidBarcode.getAmount() - amount); pidBarcode.setAmount(pidBarcode.getAmount() - amount);
pidBarcode = barcodeManager.save(pidBarcode); pidBarcode = barcodeManager.save(pidBarcode);
generateTask(barcode, opStatus, amount, opType, orderItemId); int extendType = StringUtils.isNotBlank(barcode.getOrderItemId()) ? ExtendType.VIRTUAL_PICKING_DETAIL : ExtendType.VIRTUAL_CHECKOUT;
generateTask(barcode, opStatus, amount, opType, orderItemId,extendType,false);
log.info("物料出库,生成出库任务,barcode:" + barcode.getBarcode() + ",隔口号为:" + barcode.getPosName()); log.info("物料出库,生成出库任务,barcode:" + barcode.getBarcode() + ",隔口号为:" + barcode.getPosName());
if (barcode.getAmount() <= 0) { if (barcode.getAmount() <= 0) {
barcodeManager.delete(barcode); barcodeManager.delete(barcode);
...@@ -625,7 +641,8 @@ public class OutLineController { ...@@ -625,7 +641,8 @@ public class OutLineController {
pidBarcode.setAmount(pidBarcode.getAmount() - amount); pidBarcode.setAmount(pidBarcode.getAmount() - amount);
pidBarcode.UpdateSubCode(barcode); pidBarcode.UpdateSubCode(barcode);
pidBarcode = barcodeManager.save(pidBarcode); pidBarcode = barcodeManager.save(pidBarcode);
generateTask(barcode, opStatus, amount, opType, orderItemId); int extendType = StringUtils.isNotBlank(barcode.getOrderItemId()) ? ExtendType.VIRTUAL_PICKING_DETAIL : ExtendType.VIRTUAL_CHECKOUT;
generateTask(barcode, opStatus, amount, opType, orderItemId,extendType,false);
log.info(barcode.getBarcode() + "不是出库任务," + barcodeByOut.getBarcode() + "需更改out为false"); log.info(barcode.getBarcode() + "不是出库任务," + barcodeByOut.getBarcode() + "需更改out为false");
log.info("物料出库,生成出库任务,barcode:" + barcode.getBarcode() + ",隔口号为:" + barcode.getPosName()); log.info("物料出库,生成出库任务,barcode:" + barcode.getBarcode() + ",隔口号为:" + barcode.getPosName());
if (barcode.getAmount() <= 0) { if (barcode.getAmount() <= 0) {
...@@ -653,7 +670,6 @@ public class OutLineController { ...@@ -653,7 +670,6 @@ public class OutLineController {
return ResultBean.newErrorResult(-1, "", barcode.getBarcode() + "不需要出库"); return ResultBean.newErrorResult(-1, "", barcode.getBarcode() + "不需要出库");
} }
resultBean.setData(getBoxInfo(boxStr)); resultBean.setData(getBoxInfo(boxStr));
finishVirtualTask(boxStr);
if (hasBrand) { if (hasBrand) {
log.info("hasBrand--" + hasBrand); log.info("hasBrand--" + hasBrand);
resultBean.setCode(3); resultBean.setCode(3);
...@@ -682,7 +698,7 @@ public class OutLineController { ...@@ -682,7 +698,7 @@ public class OutLineController {
subCode = barcodeManager.save(subCode); subCode = barcodeManager.save(subCode);
pidBarcode.UpdateSubCode(subCode); pidBarcode.UpdateSubCode(subCode);
pidBarcode = barcodeManager.save(pidBarcode); pidBarcode = barcodeManager.save(pidBarcode);
generateTask(subCode, opStatus, subCode.getAmount(), opType, orderItemId); generateTask(subCode, opStatus, subCode.getAmount(), opType, orderItemId,ExtendType.TASK_CANNEL,false);
log.info("点击完成扫码并入库,任务取消,barcode:" + subCode.getBarcode() + ",OrderItemId为:" + orderItemId); log.info("点击完成扫码并入库,任务取消,barcode:" + subCode.getBarcode() + ",OrderItemId为:" + orderItemId);
} }
} }
...@@ -692,7 +708,7 @@ public class OutLineController { ...@@ -692,7 +708,7 @@ public class OutLineController {
} }
private void generateTask(Barcode barcode, String opStatus, int opQty, int opType, String orderItemId) { private DataLog generateTask(Barcode barcode, String opStatus, int opQty, int opType, String orderItemId,int extendType,boolean isBoxOut) {
//生成任务 //生成任务
DataLog task = new DataLog(); DataLog task = new DataLog();
task.setStatus(opStatus); task.setStatus(opStatus);
...@@ -710,23 +726,7 @@ public class OutLineController { ...@@ -710,23 +726,7 @@ public class OutLineController {
//task.setReelPosName(barcode.getPosName()); //task.setReelPosName(barcode.getPosName());
task.setSubSourceId(orderItemId); task.setSubSourceId(orderItemId);
task.setWarehouseCode(barcode.getWarehouseCode()); task.setWarehouseCode(barcode.getWarehouseCode());
task.setExtendType(extendType);
//如果是入库任务
if (task.isPutInTask()) {
if (StringUtils.isNotBlank(barcode.getGrLabel())) {
task.setChangeType(CHANGE_TYPE.GR_PUTIN.getName());
} else {
task.setChangeType(CHANGE_TYPE.MANUAL_PUTIN.getName());
}
}
//如果是出库任务
if (task.isCheckOutTask()) {
task.setChangeType(CHANGE_TYPE.MANUAL_CHECKOUT.getName());
}
//任务取消
if (task.isCancel()) {
task.setChangeType(CHANGE_TYPE.TASK_CANNEL.getName());
}
if (StringUtils.isNotBlank(orderItemId)) { if (StringUtils.isNotBlank(orderItemId)) {
LiteOrderItem orderItem = liteOrderItemManager.get(orderItemId); LiteOrderItem orderItem = liteOrderItemManager.get(orderItemId);
if (orderItem != null) { if (orderItem != null) {
...@@ -736,15 +736,19 @@ public class OutLineController { ...@@ -736,15 +736,19 @@ public class OutLineController {
task.setSide(orderItem.getSide()); task.setSide(orderItem.getSide());
task.setPlantCode(orderItem.getPlantCode()); task.setPlantCode(orderItem.getPlantCode());
task.setOrderNo(orderItem.getOrderNo()); task.setOrderNo(orderItem.getOrderNo());
//如果是出库任务,则更新为发料 task.setManualUpload(orderItem.isManualUpload());
if (task.isCheckOutTask()) {
task.setChangeType(CHANGE_TYPE.VIRTUAL_CHECKOUT.getName());
} else if (task.isCancel()) {
task.setChangeType(CHANGE_TYPE.TASK_CANNEL.getName());
} }
} }
String boxStr = BoxUtil.getBoxStr(barcode.getPosName());
if (StringUtils.isNotBlank(boxStr)){
String posName = taskService.getPosName(boxStr);
if (StringUtils.isNotBlank(posName)){
task.setStoragePosName(posName);
} }
}
task.setBoxOut(isBoxOut);
taskService.updateFinishedTask(task); taskService.updateFinishedTask(task);
return task;
} }
@ApiOperation("获取虚拟仓正在出库的列表") @ApiOperation("获取虚拟仓正在出库的列表")
...@@ -783,8 +787,10 @@ public class OutLineController { ...@@ -783,8 +787,10 @@ public class OutLineController {
} }
} }
if (task != null) { if (task != null) {
taskService.addBoxPosName(task);
log.info("虚拟仓出库,已有出库任务,直接完成:" + task.getBarcode()); log.info("虚拟仓出库,已有出库任务,直接完成:" + task.getBarcode());
task.setStatus(OP_STATUS.FINISHED.name()); task.setStatus(OP_STATUS.FINISHED.name());
//task.setExtendType(ExtendType.VIRTUAL_CHECKOUT);
taskService.moveTaskToFinished(task); taskService.moveTaskToFinished(task);
taskService.updateFinishedTask(task); taskService.updateFinishedTask(task);
StoragePos pos = storagePosManager.getByBarcode(task.getBarcode()); StoragePos pos = storagePosManager.getByBarcode(task.getBarcode());
...@@ -911,7 +917,7 @@ public class OutLineController { ...@@ -911,7 +917,7 @@ public class OutLineController {
partition8.add(getCountByPartition(allCountMap, boxStr + "-8")); partition8.add(getCountByPartition(allCountMap, boxStr + "-8"));
//根据箱子面展示不同的隔扣 //根据箱子面展示不同的隔扣
if (boxStr.startsWith("CS")) { if (boxStr.startsWith("CS") || boxStr.startsWith("CB")) {
platsize = "7"; platsize = "7";
if ("A".equals(endStr)) { if ("A".equals(endStr)) {
boxPartitionCounts.add(partition8); boxPartitionCounts.add(partition8);
...@@ -932,7 +938,7 @@ public class OutLineController { ...@@ -932,7 +938,7 @@ public class OutLineController {
boxPartitionCounts.add(partition7); boxPartitionCounts.add(partition7);
boxPartitionCounts.add(partition8); boxPartitionCounts.add(partition8);
} }
} else if (boxStr.startsWith("CB") || boxStr.startsWith("CM")) { } else if (boxStr.startsWith("CM")) {
platsize = "15"; platsize = "15";
if ("A".equals(endStr)) { if ("A".equals(endStr)) {
boxPartitionCounts.add(partition2); boxPartitionCounts.add(partition2);
...@@ -1002,11 +1008,9 @@ public class OutLineController { ...@@ -1002,11 +1008,9 @@ public class OutLineController {
resultMap.put("boxStr", boxStr); resultMap.put("boxStr", boxStr);
resultMap.put("boxSideStr", boxSideStr); resultMap.put("boxSideStr", boxSideStr);
resultMap.put("boxPartition", boxPartition); resultMap.put("boxPartition", boxPartition);
if (boxStr.startsWith("CS")) { if (boxStr.startsWith("CS") || boxStr.startsWith("CB")) {
resultMap.put("platsize", 7); resultMap.put("platsize", 7);
} /*else if (boxStr.startsWith("CM")) { } else if (boxStr.startsWith("CM")) {
resultMap.put("platsize", 13);
}*/ else if (boxStr.startsWith("CB") || boxStr.startsWith("CM")) {
resultMap.put("platsize", 15); resultMap.put("platsize", 15);
} }
Map<String, Long> boxPartitionNumMap = new HashMap<>(); Map<String, Long> boxPartitionNumMap = new HashMap<>();
...@@ -1035,7 +1039,7 @@ public class OutLineController { ...@@ -1035,7 +1039,7 @@ public class OutLineController {
private List<Long> getInBoxPartitionCounts(String boxStr, String boxSideStr, Map<String, Long> boxPartitionNumMap) { private List<Long> getInBoxPartitionCounts(String boxStr, String boxSideStr, Map<String, Long> boxPartitionNumMap) {
List<Long> inBoxPartitionCounts = new ArrayList<>(); List<Long> inBoxPartitionCounts = new ArrayList<>();
if (boxStr.startsWith("CS")) { if (boxStr.startsWith("CS") || boxStr.startsWith("CB")) {
if ("A".equals(boxSideStr)) { if ("A".equals(boxSideStr)) {
inBoxPartitionCounts.add(boxPartitionNumMap.get(boxStr + "-8")); inBoxPartitionCounts.add(boxPartitionNumMap.get(boxStr + "-8"));
inBoxPartitionCounts.add(boxPartitionNumMap.get(boxStr + "-7")); inBoxPartitionCounts.add(boxPartitionNumMap.get(boxStr + "-7"));
...@@ -1055,17 +1059,7 @@ public class OutLineController { ...@@ -1055,17 +1059,7 @@ public class OutLineController {
inBoxPartitionCounts.add(boxPartitionNumMap.get(boxStr + "-7")); inBoxPartitionCounts.add(boxPartitionNumMap.get(boxStr + "-7"));
inBoxPartitionCounts.add(boxPartitionNumMap.get(boxStr + "-8")); inBoxPartitionCounts.add(boxPartitionNumMap.get(boxStr + "-8"));
} }
} /*else if (boxStr.startsWith("CM")) { } else if (boxStr.startsWith("CM")) {
if ("A".equals(boxSideStr)) {
inBoxPartitionCounts.add(boxPartitionNumMap.get(boxStr + "-1"));
inBoxPartitionCounts.add(boxPartitionNumMap.get(boxStr + "-2"));
inBoxPartitionCounts.add(boxPartitionNumMap.get(boxStr + "-3"));
} else {
inBoxPartitionCounts.add(boxPartitionNumMap.get(boxStr + "-3"));
inBoxPartitionCounts.add(boxPartitionNumMap.get(boxStr + "-2"));
inBoxPartitionCounts.add(boxPartitionNumMap.get(boxStr + "-1"));
}
}*/ else if (boxStr.startsWith("CB") || boxStr.startsWith("CM")) {
if ("A".equals(boxSideStr)) { if ("A".equals(boxSideStr)) {
inBoxPartitionCounts.add(boxPartitionNumMap.get(boxStr + "-2")); inBoxPartitionCounts.add(boxPartitionNumMap.get(boxStr + "-2"));
inBoxPartitionCounts.add(boxPartitionNumMap.get(boxStr + "-1")); inBoxPartitionCounts.add(boxPartitionNumMap.get(boxStr + "-1"));
...@@ -1078,7 +1072,7 @@ public class OutLineController { ...@@ -1078,7 +1072,7 @@ public class OutLineController {
} }
private synchronized String finishTask(String boxStr, int opType, Barcode barcode, int opQty, String opStatus) { private synchronized String finishTask(String boxStr, int opType, Barcode barcode, int opQty, String opStatus,int extendType) {
Barcode pidBarcode = barcodeManager.findByBarcode(boxStr); Barcode pidBarcode = barcodeManager.findByBarcode(boxStr);
int partitionCount = 0; int partitionCount = 0;
//判断隔口中的厂商,料号,库别是否一致 //判断隔口中的厂商,料号,库别是否一致
...@@ -1095,7 +1089,7 @@ public class OutLineController { ...@@ -1095,7 +1089,7 @@ public class OutLineController {
} }
} }
//如果是7寸箱子,最多只能放10盘 //如果是7寸箱子,最多只能放10盘
if (boxStr.startsWith("CS")) { if (boxStr.startsWith("CS") || boxStr.startsWith("CB")) {
if (partitionCount >= 10) { if (partitionCount >= 10) {
return "7寸物料每个隔口最多只允许放10盘"; return "7寸物料每个隔口最多只允许放10盘";
} }
...@@ -1114,7 +1108,7 @@ public class OutLineController { ...@@ -1114,7 +1108,7 @@ public class OutLineController {
pidBarcode = barcodeManager.save(pidBarcode); pidBarcode = barcodeManager.save(pidBarcode);
//判断料箱中有没有该料箱,如果有,则更新 //判断料箱中有没有该料箱,如果有,则更新
StoragePos pos = storagePosManager.getByBarcode(pidBarcode.getBarcode()); StoragePos pos = storagePosManager.getByBarcode(pidBarcode.getBarcode());
log.info(pidBarcode.getBarcode() +"查询的库位信息为:"+ JsonUtil.toJsonStr(pos)); //log.info(pidBarcode.getBarcode() +"查询的库位信息为:"+ JsonUtil.toJsonStr(pos));
if (pos != null){ if (pos != null){
pos.setBarcode(pidBarcode); pos.setBarcode(pidBarcode);
pos = storagePosManager.save(pos); pos = storagePosManager.save(pos);
...@@ -1126,18 +1120,19 @@ public class OutLineController { ...@@ -1126,18 +1120,19 @@ public class OutLineController {
task.setNum(opQty); task.setNum(opQty);
task.setType(opType); task.setType(opType);
task.setPosName(barcode.getPosName()); task.setPosName(barcode.getPosName());
//task.setOperator(SecurityUtils.getCurrentUsername()); task.setOperator(SecurityUtils.getCurrentUsername());
task.setDateCode(barcode.getDateCode()); task.setDateCode(barcode.getDateCode());
task.setBatchInfo(barcode.getBatch()); task.setBatchInfo(barcode.getBatch());
task.setProvider(barcode.getProvider()); task.setProvider(barcode.getProvider());
task.setProviderNumber(barcode.getProviderNumber()); task.setProviderNumber(barcode.getProviderNumber());
task.setKeeperCode(barcode.getKeeperCode()); task.setKeeperCode(barcode.getKeeperCode());
task.setReelPosName(barcode.getPosName()); task.setReelPosName(barcode.getPosName());
task.setExtendType(extendType);
taskService.updateFinishedTask(task); taskService.updateFinishedTask(task);
return ""; return "";
} }
private DataLog generateTask(Storage storage, Barcode barcode, StoragePos pos, int type, String status, String loc) { private DataLog generateTask(Storage storage, Barcode barcode, StoragePos pos, int type, String status, String loc,int extendType) {
//开始入库任务 //开始入库任务
DataLog task = new DataLog(storage, barcode, pos); DataLog task = new DataLog(storage, barcode, pos);
task.setType(type); task.setType(type);
...@@ -1145,6 +1140,7 @@ public class OutLineController { ...@@ -1145,6 +1140,7 @@ public class OutLineController {
task.setLoc(loc); task.setLoc(loc);
task.setOperator(SecurityUtils.getCurrentUsername()); task.setOperator(SecurityUtils.getCurrentUsername());
task.setBoxPosName(pos.getPosName()); task.setBoxPosName(pos.getPosName());
task.setExtendType(extendType);
taskService.addTaskToExecute(task); taskService.addTaskToExecute(task);
return task; return task;
} }
......
...@@ -24,11 +24,11 @@ import com.neotel.smfcore.core.system.util.TaskService; ...@@ -24,11 +24,11 @@ import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.lizhen.LizhenApi; import com.neotel.smfcore.custom.lizhen.LizhenApi;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.GrLabel; import com.neotel.smfcore.custom.lizhen.agvBox.bean.GrLabel;
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.enums.CHANGE_TYPE;
import com.neotel.smfcore.custom.lizhen.agvBox.enums.INOUT_TYPE; import com.neotel.smfcore.custom.lizhen.agvBox.enums.INOUT_TYPE;
import com.neotel.smfcore.custom.lizhen.agvBox.service.manager.GrLabelManager; import com.neotel.smfcore.custom.lizhen.agvBox.service.manager.GrLabelManager;
import com.neotel.smfcore.custom.lizhen.agvBox.util.BoxUtil; import com.neotel.smfcore.custom.lizhen.agvBox.util.BoxUtil;
import com.neotel.smfcore.custom.lizhen.agvBox.util.StationCacheUtil; import com.neotel.smfcore.custom.lizhen.agvBox.util.StationCacheUtil;
import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType;
import com.neotel.smfcore.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -274,18 +274,15 @@ public class WarehouseController { ...@@ -274,18 +274,15 @@ public class WarehouseController {
//判断当前料箱与入库的尺寸信息是否一致 //判断当前料箱与入库的尺寸信息是否一致
int platsize = station.getPlatsize(); int platsize = station.getPlatsize();
if (platsize == 7) { if (platsize == 7) {
if (!boxStr.startsWith("CS")) { if (!boxStr.startsWith("CS") && !boxStr.startsWith("CB")) {
return ResultBean.newErrorResult(-1, "", "物料规格为7寸与当前工位上的料箱:" + boxStr + "不匹配"); return ResultBean.newErrorResult(-1, "", "物料规格为7寸与当前工位上的料箱:" + boxStr + "不匹配");
} }
} /*else if (platsize == 13) { } else if (platsize == 15) {
if (!boxStr.startsWith("CM")) { if (!boxStr.startsWith("CM")) {
return ResultBean.newErrorResult(-1, "", "物料规格为13寸与当前工位上的料箱:" + boxStr + "不匹配");
}
}*/ else if (platsize == 15) {
if (!boxStr.startsWith("CB") && !boxStr.startsWith("CM")) {
return ResultBean.newErrorResult(-1, "", "物料规格为15寸与当前工位上的料箱:" + boxStr + "不匹配"); return ResultBean.newErrorResult(-1, "", "物料规格为15寸与当前工位上的料箱:" + boxStr + "不匹配");
} }
} }
code = code.toUpperCase();
//先判断是否料盒 //先判断是否料盒
String newCodeStr = "=" + station.getPlatsize() + "x" + station.getHeight() + "=" + code; String newCodeStr = "=" + station.getPlatsize() + "x" + station.getHeight() + "=" + code;
CodeBean codeBean = codeResolve.resolveSingleCode(newCodeStr); CodeBean codeBean = codeResolve.resolveSingleCode(newCodeStr);
...@@ -297,6 +294,10 @@ public class WarehouseController { ...@@ -297,6 +294,10 @@ public class WarehouseController {
ResultBean resultBean = ResultBean.newOkResult(""); ResultBean resultBean = ResultBean.newOkResult("");
//判断是否是料箱隔口码 //判断是否是料箱隔口码
if (isBox(partNumber)) { if (isBox(partNumber)) {
boolean canPutIn = BoxUtil.isCanPutIn(code);
if (!canPutIn){
return ResultBean.newErrorResult(-1,"","无效的隔口码:"+code);
}
//判断当前是否有正在执行的任务 //判断当前是否有正在执行的任务
DataLog dataLog = getExecutingTask(boxStr); DataLog dataLog = getExecutingTask(boxStr);
if (dataLog != null) { if (dataLog != null) {
...@@ -523,7 +524,8 @@ public class WarehouseController { ...@@ -523,7 +524,8 @@ public class WarehouseController {
finishTask(boxStr, OP.CHECKOUT, null, OP_STATUS.CANCEL.name(), INOUT_TYPE.CANCEL_ONE.name(), null, null,name); finishTask(boxStr, OP.CHECKOUT, null, OP_STATUS.CANCEL.name(), INOUT_TYPE.CANCEL_ONE.name(), null, null,name);
boxCount.remove(boxStr); boxCount.remove(boxStr);
//生成任务 //生成任务
generateTask(dataCache.getStorageById(pos.getStorageId()), boxBarcode, pos, OP.PUT_IN, OP_STATUS.WAIT.name(), null); generateTask(dataCache.getStorageById(pos.getStorageId()), boxBarcode, pos, OP.PUT_IN, OP_STATUS.WAIT.name(), null,ExtendType.STORAGE_PUTIN);
taskService.removePosName(boxStr);
return ResultBean.newOkResult(station); return ResultBean.newOkResult(station);
} }
...@@ -543,6 +545,7 @@ public class WarehouseController { ...@@ -543,6 +545,7 @@ public class WarehouseController {
if (StringUtils.isBlank(currentRfid)) { if (StringUtils.isBlank(currentRfid)) {
return ResultBean.newErrorResult(-1, "", name + "当前工位料箱信息未上传成功,请重试", new String[]{}); return ResultBean.newErrorResult(-1, "", name + "当前工位料箱信息未上传成功,请重试", new String[]{});
} }
barcodeStr = barcodeStr.toUpperCase();
//获取料箱中的物料信息 //获取料箱中的物料信息
String boxStr = getBoxInfoByRfid(currentRfid); String boxStr = getBoxInfoByRfid(currentRfid);
String result = ""; String result = "";
...@@ -654,7 +657,7 @@ public class WarehouseController { ...@@ -654,7 +657,7 @@ public class WarehouseController {
List<List<Integer>> boxPartitionCounts = new ArrayList<>(); //出库需要展示的数量 List<List<Integer>> boxPartitionCounts = new ArrayList<>(); //出库需要展示的数量
if (currentRfid.endsWith("A")) { if (currentRfid.endsWith("A")) {
if (currentRfid.startsWith("CS")) { if (currentRfid.startsWith("CS") || currentRfid.startsWith("CB") ) {
inBoxPartitionCounts.add(partition8); inBoxPartitionCounts.add(partition8);
inBoxPartitionCounts.add(partition7); inBoxPartitionCounts.add(partition7);
inBoxPartitionCounts.add(partition6); inBoxPartitionCounts.add(partition6);
...@@ -672,15 +675,7 @@ public class WarehouseController { ...@@ -672,15 +675,7 @@ public class WarehouseController {
boxPartitionCounts.add(boxPartitionCount2); boxPartitionCounts.add(boxPartitionCount2);
boxPartitionCounts.add(boxPartitionCount3); boxPartitionCounts.add(boxPartitionCount3);
boxPartitionCounts.add(boxPartitionCount4); boxPartitionCounts.add(boxPartitionCount4);
} /*else if (currentRfid.startsWith("CM")) { } else if (currentRfid.startsWith("CM")) {
inBoxPartitionCounts.add(partition1);
inBoxPartitionCounts.add(partition2);
inBoxPartitionCounts.add(partition3);
boxPartitionCounts.add(boxPartitionCount1);
boxPartitionCounts.add(boxPartitionCount2);
boxPartitionCounts.add(boxPartitionCount3);
}*/ else if (currentRfid.startsWith("CB") || currentRfid.startsWith("CM")) {
inBoxPartitionCounts.add(partition2); inBoxPartitionCounts.add(partition2);
inBoxPartitionCounts.add(partition1); inBoxPartitionCounts.add(partition1);
...@@ -688,7 +683,7 @@ public class WarehouseController { ...@@ -688,7 +683,7 @@ public class WarehouseController {
boxPartitionCounts.add(boxPartitionCount1); boxPartitionCounts.add(boxPartitionCount1);
} }
} else if (currentRfid.endsWith("B")) { } else if (currentRfid.endsWith("B")) {
if (currentRfid.startsWith("CS")) { if (currentRfid.startsWith("CS") || currentRfid.startsWith("CB") ) {
inBoxPartitionCounts.add(partition4); inBoxPartitionCounts.add(partition4);
inBoxPartitionCounts.add(partition3); inBoxPartitionCounts.add(partition3);
inBoxPartitionCounts.add(partition2); inBoxPartitionCounts.add(partition2);
...@@ -707,15 +702,7 @@ public class WarehouseController { ...@@ -707,15 +702,7 @@ public class WarehouseController {
boxPartitionCounts.add(boxPartitionCount6); boxPartitionCounts.add(boxPartitionCount6);
boxPartitionCounts.add(boxPartitionCount7); boxPartitionCounts.add(boxPartitionCount7);
boxPartitionCounts.add(boxPartitionCount8); boxPartitionCounts.add(boxPartitionCount8);
} /*else if (currentRfid.startsWith("CM")) { } else if (currentRfid.startsWith("CM")) {
inBoxPartitionCounts.add(partition3);
inBoxPartitionCounts.add(partition2);
inBoxPartitionCounts.add(partition1);
boxPartitionCounts.add(boxPartitionCount3);
boxPartitionCounts.add(boxPartitionCount2);
boxPartitionCounts.add(boxPartitionCount1);
}*/ else if (currentRfid.startsWith("CB") || currentRfid.startsWith("CM")) {
inBoxPartitionCounts.add(partition1); inBoxPartitionCounts.add(partition1);
inBoxPartitionCounts.add(partition2); inBoxPartitionCounts.add(partition2);
...@@ -753,6 +740,7 @@ public class WarehouseController { ...@@ -753,6 +740,7 @@ public class WarehouseController {
resultMap.put("lastScanBoxCode", station.getLastScanBoxCode()); resultMap.put("lastScanBoxCode", station.getLastScanBoxCode());
resultMap.put("inBoxPartitionCounts", inBoxPartitionCounts); resultMap.put("inBoxPartitionCounts", inBoxPartitionCounts);
resultMap.put("boxNum", station.getBoxNum()); resultMap.put("boxNum", station.getBoxNum());
resultMap.put("warehouseCode",station.getWarehouseCode());
return ResultBean.newOkResult(resultMap); return ResultBean.newOkResult(resultMap);
} }
...@@ -827,7 +815,7 @@ public class WarehouseController { ...@@ -827,7 +815,7 @@ public class WarehouseController {
* @param status * @param status
* @param loc * @param loc
*/ */
private DataLog generateTask(Storage storage, Barcode barcode, StoragePos pos, int type, String status, String loc) { private DataLog generateTask(Storage storage, Barcode barcode, StoragePos pos, int type, String status, String loc,int extendType) {
//开始入库任务 //开始入库任务
DataLog task = new DataLog(storage, barcode, pos); DataLog task = new DataLog(storage, barcode, pos);
task.setType(type); task.setType(type);
...@@ -835,6 +823,7 @@ public class WarehouseController { ...@@ -835,6 +823,7 @@ public class WarehouseController {
task.setLoc(loc); task.setLoc(loc);
task.setOperator(SecurityUtils.getCurrentUsername()); task.setOperator(SecurityUtils.getCurrentUsername());
task.setBoxPosName(pos.getPosName()); task.setBoxPosName(pos.getPosName());
task.setExtendType(extendType);
taskService.addTaskToExecute(task); taskService.addTaskToExecute(task);
return task; return task;
} }
...@@ -888,7 +877,7 @@ public class WarehouseController { ...@@ -888,7 +877,7 @@ public class WarehouseController {
} }
} }
//7寸箱子最多放10盘 //7寸箱子最多放10盘
if (lastScanBoxCode.startsWith("CS")) { if (lastScanBoxCode.startsWith("CS") || lastScanBoxCode.startsWith("CB")) {
if (barcodeCount >= 10) { if (barcodeCount >= 10) {
return ResultBean.newErrorResult(-1, "", "7寸物料每个隔口最多只允许放10盘"); return ResultBean.newErrorResult(-1, "", "7寸物料每个隔口最多只允许放10盘");
} }
...@@ -905,8 +894,10 @@ public class WarehouseController { ...@@ -905,8 +894,10 @@ public class WarehouseController {
pidBarcode.setAmount(pidBarcode.getAmount() + barcode.getAmount()); pidBarcode.setAmount(pidBarcode.getAmount() + barcode.getAmount());
pidBarcode.setReelAmount(pidBarcode.getReelAmount() + 1); pidBarcode.setReelAmount(pidBarcode.getReelAmount() + 1);
//生成入库任务 //生成入库任务
pidBarcode = barcodeManager.save(pidBarcode); barcodeManager.save(pidBarcode);
generateTask(barcode, opStatus, barcode.getAmount(), opType, barcode.getOrderItemId(),name); //判断是gr入库还是手动入库
int extendType = StringUtils.isNotBlank(barcode.getGrLabel()) ? ExtendType.GR_PUTIN : ExtendType.MANUAL_PUTIN;
generateTask(barcode, opStatus, barcode.getAmount(), opType, barcode.getOrderItemId(), name, extendType,false);
log.info("单盘出库生成入库信息,barcode:" + barcode.getBarcode() + "隔口信息为:" + barcode.getPosName()); log.info("单盘出库生成入库信息,barcode:" + barcode.getBarcode() + "隔口信息为:" + barcode.getPosName());
} }
//2.任务取消状态 //2.任务取消状态
...@@ -925,7 +916,7 @@ public class WarehouseController { ...@@ -925,7 +916,7 @@ public class WarehouseController {
subCode = barcodeManager.save(subCode); subCode = barcodeManager.save(subCode);
pidBarcode.UpdateSubCode(subCode); pidBarcode.UpdateSubCode(subCode);
pidBarcode = barcodeManager.save(pidBarcode); pidBarcode = barcodeManager.save(pidBarcode);
generateTask(subCode, opStatus, subCode.getAmount(), opType, orderItemId,name); generateTask(subCode, opStatus, subCode.getAmount(), opType, orderItemId, name, ExtendType.TASK_CANNEL,false);
log.info("点击完成扫码并入库,任务取消,barcode:" + subCode.getBarcode() + ",OrderItemId为:" + orderItemId); log.info("点击完成扫码并入库,任务取消,barcode:" + subCode.getBarcode() + ",OrderItemId为:" + orderItemId);
} }
} }
...@@ -948,6 +939,7 @@ public class WarehouseController { ...@@ -948,6 +939,7 @@ public class WarehouseController {
} }
} }
//开始循环,生成任务 //开始循环,生成任务
List<DataLog> dataLogList = new ArrayList<>();
for (int index = 0; index < subCodes.size();/*; index++*/) { for (int index = 0; index < subCodes.size();/*; index++*/) {
Barcode subCode = subCodes.get(index); Barcode subCode = subCodes.get(index);
String orderItemId = subCode.getOrderItemId(); String orderItemId = subCode.getOrderItemId();
...@@ -973,12 +965,18 @@ public class WarehouseController { ...@@ -973,12 +965,18 @@ public class WarehouseController {
pidBarcode.setReelAmount(pidBarcode.getReelAmount() - 1); pidBarcode.setReelAmount(pidBarcode.getReelAmount() - 1);
pidBarcode.setAmount(pidBarcode.getAmount() - amount); pidBarcode.setAmount(pidBarcode.getAmount() - amount);
pidBarcode = barcodeManager.save(pidBarcode); pidBarcode = barcodeManager.save(pidBarcode);
generateTask(subCode, opStatus, amount, opType, orderItemId,name); //判断是手动出库,还是pk出库
int extendType = StringUtils.isNotBlank(subCode.getOrderItemId()) ? ExtendType.PICKING_DETAIL : ExtendType.MANUAL_CHECKOUT;
DataLog dataLog = generateTask(subCode, opStatus, amount, opType, orderItemId, name, extendType, true);
dataLogList.add(dataLog);
log.info("整箱出库,生成出库任务,barcode:" + subCode.getBarcode() + ",料箱号为:" + pidBarcode.getBarcode()); log.info("整箱出库,生成出库任务,barcode:" + subCode.getBarcode() + ",料箱号为:" + pidBarcode.getBarcode());
if (subCode.getAmount() <= 0) { if (subCode.getAmount() <= 0) {
barcodeManager.delete(subCode); barcodeManager.delete(subCode);
} }
} }
if (dataLogList != null && !dataLogList.isEmpty()) {
taskService.outTaskStatusChange(dataLogList);
}
if (hasBrand) { if (hasBrand) {
ResultBean resultBean = ResultBean.newOkResult(""); ResultBean resultBean = ResultBean.newOkResult("");
resultBean.setCode(3); resultBean.setCode(3);
...@@ -1013,6 +1011,7 @@ public class WarehouseController { ...@@ -1013,6 +1011,7 @@ public class WarehouseController {
} }
//} //}
} }
List<DataLog> dataLogList = new ArrayList<>();
for (int index = 0; index < needOutBarcodes.size(); index++) { for (int index = 0; index < needOutBarcodes.size(); index++) {
Barcode subCode = needOutBarcodes.get(index); Barcode subCode = needOutBarcodes.get(index);
//if (lastScanBoxCode.equals(subCode.getPosName())) { //if (lastScanBoxCode.equals(subCode.getPosName())) {
...@@ -1037,7 +1036,9 @@ public class WarehouseController { ...@@ -1037,7 +1036,9 @@ public class WarehouseController {
pidBarcode.setReelAmount(pidBarcode.getReelAmount() - 1); pidBarcode.setReelAmount(pidBarcode.getReelAmount() - 1);
pidBarcode.setAmount(pidBarcode.getAmount() - amount); pidBarcode.setAmount(pidBarcode.getAmount() - amount);
pidBarcode = barcodeManager.save(pidBarcode); pidBarcode = barcodeManager.save(pidBarcode);
generateTask(subCode, opStatus, amount, opType, orderItemId,name); int extendType = StringUtils.isNotBlank(subCode.getOrderItemId()) ? ExtendType.PICKING_DETAIL : ExtendType.MANUAL_CHECKOUT;
DataLog dataLog = generateTask(subCode, opStatus, amount, opType, orderItemId, name, extendType, true);
dataLogList.add(dataLog);
log.info("隔口出库,生成出库任务,barcode:" + subCode.getBarcode() + ",料箱号为:" + subCode.getPosName()); log.info("隔口出库,生成出库任务,barcode:" + subCode.getBarcode() + ",料箱号为:" + subCode.getPosName());
log.info("箱子数量为:" + pidBarcode.getAmount() + ",物料数量为:" + pidBarcode.getReelAmount() + "箱号为:" + pidBarcode.getBarcode()); log.info("箱子数量为:" + pidBarcode.getAmount() + ",物料数量为:" + pidBarcode.getReelAmount() + "箱号为:" + pidBarcode.getBarcode());
if (subCode.getAmount() <= 0) { if (subCode.getAmount() <= 0) {
...@@ -1045,6 +1046,9 @@ public class WarehouseController { ...@@ -1045,6 +1046,9 @@ public class WarehouseController {
} }
//} //}
} }
if (dataLogList != null && !dataLogList.isEmpty()){
taskService.outTaskStatusChange(dataLogList);
}
if (hasBrand) { if (hasBrand) {
ResultBean resultBean = ResultBean.newOkResult(""); ResultBean resultBean = ResultBean.newOkResult("");
resultBean.setCode(3); resultBean.setCode(3);
...@@ -1125,7 +1129,8 @@ public class WarehouseController { ...@@ -1125,7 +1129,8 @@ public class WarehouseController {
pidBarcode.setReelAmount(pidBarcode.getReelAmount() - 1); pidBarcode.setReelAmount(pidBarcode.getReelAmount() - 1);
pidBarcode.setAmount(pidBarcode.getAmount() - amount); pidBarcode.setAmount(pidBarcode.getAmount() - amount);
pidBarcode = barcodeManager.save(pidBarcode); pidBarcode = barcodeManager.save(pidBarcode);
generateTask(barcode, opStatus, amount, opType, orderItemId,name); int extendType = StringUtils.isNotBlank(barcode.getOrderItemId()) ? ExtendType.PICKING_DETAIL : ExtendType.MANUAL_CHECKOUT;
generateTask(barcode, opStatus, amount, opType, orderItemId,name,extendType,false);
log.info("物料出库,生成出库任务,barcode:" + barcode.getBarcode() + ",隔口号为:" + barcode.getPosName()); log.info("物料出库,生成出库任务,barcode:" + barcode.getBarcode() + ",隔口号为:" + barcode.getPosName());
if (barcode.getAmount() <= 0) { if (barcode.getAmount() <= 0) {
barcodeManager.delete(barcode); barcodeManager.delete(barcode);
...@@ -1161,7 +1166,8 @@ public class WarehouseController { ...@@ -1161,7 +1166,8 @@ public class WarehouseController {
pidBarcode.setAmount(pidBarcode.getAmount() - amount); pidBarcode.setAmount(pidBarcode.getAmount() - amount);
pidBarcode.UpdateSubCode(barcode); pidBarcode.UpdateSubCode(barcode);
pidBarcode = barcodeManager.save(pidBarcode); pidBarcode = barcodeManager.save(pidBarcode);
generateTask(barcode, opStatus, amount, opType, orderItemId,name); int extendType = StringUtils.isNotBlank(barcode.getOrderItemId()) ? ExtendType.PICKING_DETAIL : ExtendType.MANUAL_CHECKOUT;
generateTask(barcode, opStatus, amount, opType, orderItemId,name,extendType,false);
log.info(barcode.getBarcode() + "不是出库任务," + barcodeByOut.getBarcode() + "需更改out为false"); log.info(barcode.getBarcode() + "不是出库任务," + barcodeByOut.getBarcode() + "需更改out为false");
log.info("物料出库,生成出库任务,barcode:" + barcode.getBarcode() + ",隔口号为:" + barcode.getPosName()); log.info("物料出库,生成出库任务,barcode:" + barcode.getBarcode() + ",隔口号为:" + barcode.getPosName());
if (barcode.getAmount() <= 0) { if (barcode.getAmount() <= 0) {
...@@ -1205,7 +1211,7 @@ public class WarehouseController { ...@@ -1205,7 +1211,7 @@ public class WarehouseController {
} }
private void generateTask(Barcode barcode, String opStatus, int opQty, int opType, String orderItemId,String name) { private DataLog generateTask(Barcode barcode, String opStatus, int opQty, int opType, String orderItemId,String name,int extendType,boolean isBoxOut) {
//生成任务 //生成任务
DataLog task = new DataLog(); DataLog task = new DataLog();
task.setStatus(opStatus); task.setStatus(opStatus);
...@@ -1224,22 +1230,7 @@ public class WarehouseController { ...@@ -1224,22 +1230,7 @@ public class WarehouseController {
task.setSubSourceId(orderItemId); task.setSubSourceId(orderItemId);
task.setWarehouseCode(barcode.getWarehouseCode()); task.setWarehouseCode(barcode.getWarehouseCode());
task.setStationName(name); task.setStationName(name);
//如果是入库任务 task.setExtendType(extendType);
if (task.isPutInTask()) {
if (StringUtils.isNotBlank(barcode.getGrLabel())) {
task.setChangeType(CHANGE_TYPE.GR_PUTIN.getName());
} else {
task.setChangeType(CHANGE_TYPE.MANUAL_PUTIN.getName());
}
}
//如果是出库任务
if (task.isCheckOutTask()) {
task.setChangeType(CHANGE_TYPE.MANUAL_CHECKOUT.getName());
}
//任务取消
if (task.isCancel()) {
task.setChangeType(CHANGE_TYPE.TASK_CANNEL.getName());
}
if (StringUtils.isNotBlank(orderItemId)) { if (StringUtils.isNotBlank(orderItemId)) {
LiteOrderItem orderItem = liteOrderItemManager.get(orderItemId); LiteOrderItem orderItem = liteOrderItemManager.get(orderItemId);
if (orderItem != null) { if (orderItem != null) {
...@@ -1250,15 +1241,20 @@ public class WarehouseController { ...@@ -1250,15 +1241,20 @@ public class WarehouseController {
task.setPlantCode(orderItem.getPlantCode()); task.setPlantCode(orderItem.getPlantCode());
task.setOrderNo(orderItem.getOrderNo()); task.setOrderNo(orderItem.getOrderNo());
task.setSubSourceId(orderItem.getId()); task.setSubSourceId(orderItem.getId());
//如果是出库任务,则更新为发料 task.setManualUpload(orderItem.isManualUpload());
if (task.isCheckOutTask()) {
task.setChangeType(CHANGE_TYPE.PICKING_DETAIL.getName());
} else if (task.isCancel()) {
task.setChangeType(CHANGE_TYPE.TASK_CANNEL.getName());
} }
} }
//如果是出库任务,增加库位
if (task.isCheckOutTask()) {
String boxStr = BoxUtil.getBoxStr(barcode.getPosName());
String posName = taskService.getPosName(boxStr);
if (StringUtils.isNotBlank(posName)) {
task.setStoragePosName(posName);
} }
}
task.setBoxOut(isBoxOut);
taskService.updateFinishedTask(task); taskService.updateFinishedTask(task);
return task;
} }
...@@ -1273,8 +1269,7 @@ public class WarehouseController { ...@@ -1273,8 +1269,7 @@ public class WarehouseController {
return Integer.valueOf(size.split("X")[index]); return Integer.valueOf(size.split("X")[index]);
} }
@AnonymousAccess
@RequestMapping("/getCallEmptyBoxTask")
private synchronized DataLog getCallEmptyBoxTask(String platsize, String name) { private synchronized DataLog getCallEmptyBoxTask(String platsize, String name) {
//获取料箱id //获取料箱id
String storageId = ""; String storageId = "";
...@@ -1295,29 +1290,19 @@ public class WarehouseController { ...@@ -1295,29 +1290,19 @@ public class WarehouseController {
if (StringUtils.isNotBlank(storageId)) { if (StringUtils.isNotBlank(storageId)) {
c.and("storageId").is(storageId); c.and("storageId").is(storageId);
} }
//料仓类型
/*if (StringUtils.isNotBlank(boxSuffix)) {
List<Criteria> orCriteriaList = new ArrayList<>();
String[] sufixS = boxSuffix.split(",");
for (String sufix : sufixS) {
Pattern pattern = Pattern.compile(QueryHelp.escapeExprSpecialWord(sufix), Pattern.CASE_INSENSITIVE);
orCriteriaList.add(Criteria.where("barcode.partNumber").regex(pattern));
}
c.andOperator(orCriteriaList);
}*/
//料盘数量小于70盘 //料盘数量小于70盘
c.and("barcode.reelAmount").lte(70); c.and("barcode.reelAmount").lte(70);
//进行排序方式 //进行排序方式
Query q = new Query(c).with(Sort.by(Sort.Direction.ASC, "barcode.amount")); Query q = new Query(c).with(Sort.by(Sort.Direction.ASC, "barcode.amount"));
StoragePos pos = null; StoragePos pos = null;
List<StoragePos> poss = new ArrayList<>(); List<StoragePos> poss = new ArrayList<>();
if ("15".equals(platsize)){ if ("15".equals(platsize)) {
poss = storagePosManager.findByQuery(q.addCriteria(Criteria.where("barcode.partNumber").regex(Pattern.compile(QueryHelp.escapeExprSpecialWord("CB"), Pattern.CASE_INSENSITIVE))));
if (poss == null || poss.isEmpty()){
poss = storagePosManager.findByQuery(q.addCriteria(Criteria.where("barcode.partNumber").regex(Pattern.compile(QueryHelp.escapeExprSpecialWord("CM"), Pattern.CASE_INSENSITIVE)))); poss = storagePosManager.findByQuery(q.addCriteria(Criteria.where("barcode.partNumber").regex(Pattern.compile(QueryHelp.escapeExprSpecialWord("CM"), Pattern.CASE_INSENSITIVE))));
}
} else { } else {
poss = storagePosManager.findByQuery(q.addCriteria(Criteria.where("barcode.partNumber").regex(Pattern.compile(QueryHelp.escapeExprSpecialWord("CS"), Pattern.CASE_INSENSITIVE)))); poss = storagePosManager.findByQuery(q.addCriteria(Criteria.where("barcode.partNumber").regex(Pattern.compile(QueryHelp.escapeExprSpecialWord("CS"), Pattern.CASE_INSENSITIVE))));
if (poss == null || poss.isEmpty()) {
poss = storagePosManager.findByQuery(q.addCriteria(Criteria.where("barcode.partNumber").regex(Pattern.compile(QueryHelp.escapeExprSpecialWord("CB"), Pattern.CASE_INSENSITIVE))));
}
} }
//找隔口中 没有物料的箱子 //找隔口中 没有物料的箱子
if (poss != null && !poss.isEmpty()) { if (poss != null && !poss.isEmpty()) {
...@@ -1340,15 +1325,7 @@ public class WarehouseController { ...@@ -1340,15 +1325,7 @@ public class WarehouseController {
} }
} }
} /*else if ("13".equals(platsize)) { } else if ("15".equals(platsize)) {
for (int par = 1; par < 4; par++) {
//箱子+隔口号
if (countMap.get(barcode.getBarcode() + "-" + par) == null || countMap.get(barcode.getBarcode() + "-" + par) == 0) {
hasBarcode = false;
break;
}
}
}*/ else if ("15".equals(platsize)) {
for (int par = 1; par < 3; par++) { for (int par = 1; par < 3; par++) {
//箱子+隔口号 //箱子+隔口号
if (countMap.get(barcode.getBarcode() + "-" + par) == null || countMap.get(barcode.getBarcode() + "-" + par) == 0) { if (countMap.get(barcode.getBarcode() + "-" + par) == null || countMap.get(barcode.getBarcode() + "-" + par) == 0) {
...@@ -1369,7 +1346,7 @@ public class WarehouseController { ...@@ -1369,7 +1346,7 @@ public class WarehouseController {
DataLog task = null; DataLog task = null;
if (pos != null) { if (pos != null) {
Storage storage = dataCache.getStorageById(pos.getStorageId()); Storage storage = dataCache.getStorageById(pos.getStorageId());
task = generateTask(storage, pos.getBarcode(), pos, OP.CHECKOUT, OP_STATUS.WAIT.name(), name); task = generateTask(storage, pos.getBarcode(), pos, OP.CHECKOUT, OP_STATUS.WAIT.name(), name,ExtendType.STORAGE_CHECKOUT);
} }
return task; return task;
} }
......
package com.neotel.smfcore.custom.lizhen.agvBox.rest; package com.neotel.smfcore.custom.lizhen.agvBox.rest;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONArray;
import com.neotel.smfcore.common.utils.HttpHelper;
import com.neotel.smfcore.common.utils.JsonUtil;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager; import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.DataLog; import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.custom.lizhen.report.merge.utils.FloorUtils;
import com.neotel.smfcore.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
...@@ -9,6 +15,7 @@ import org.springframework.web.bind.annotation.RequestMapping; ...@@ -9,6 +15,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 外仓外部接口控制类 * 外仓外部接口控制类
...@@ -19,6 +26,31 @@ public class WarehouseExtController { ...@@ -19,6 +26,31 @@ public class WarehouseExtController {
@Autowired @Autowired
private IDataLogManager dataLogManager; private IDataLogManager dataLogManager;
@Autowired
private FloorUtils floorUtils;
@RequestMapping("/forward/getDataLogs")
@AnonymousAccess
public List<DataLog> forwardGetDataLogs(String orderNo, String line, Pageable pageable){
String url = "";
Map<String, String> allFloor = floorUtils.getAllFloor(2);
for (String floor : allFloor.values()) {
if (floorUtils.isB15(floor)){
url = floorUtils.getUrlByFloor(floor);
break;
}
}
if (StringUtils.isNotBlank(url)){
url = url + "/ext/getDatalogs"+"?orderNo=" + orderNo + "&line=" + line + "&page=" + pageable.getPageNumber() + "&size=" + pageable.getPageSize();
String result = HttpUtil.get(url);
if (StringUtils.isNotBlank(result)){
return JSONArray.parseArray(result,DataLog.class);
}
}
return null;
}
@RequestMapping("/getDatalogs") @RequestMapping("/getDatalogs")
@AnonymousAccess @AnonymousAccess
public List<DataLog> getDatalogs(String orderNo, String line, Pageable pageable) { public List<DataLog> getDatalogs(String orderNo, String line, Pageable pageable) {
......
...@@ -46,6 +46,7 @@ public class BoxUtil { ...@@ -46,6 +46,7 @@ public class BoxUtil {
*/ */
public static String getBoxStr(String str) { public static String getBoxStr(String str) {
String boxStr = ""; String boxStr = "";
if (StringUtils.isNotBlank(str)) {
if (str.startsWith("CS") || str.startsWith("CM") || str.startsWith("CB")) { if (str.startsWith("CS") || str.startsWith("CM") || str.startsWith("CB")) {
if (str.endsWith("A") || str.endsWith("B")) { if (str.endsWith("A") || str.endsWith("B")) {
boxStr = str.substring(0, str.length() - 1); boxStr = str.substring(0, str.length() - 1);
...@@ -55,6 +56,7 @@ public class BoxUtil { ...@@ -55,6 +56,7 @@ public class BoxUtil {
boxStr = str; boxStr = str;
} }
} }
}
return boxStr; return boxStr;
} }
...@@ -131,7 +133,7 @@ public class BoxUtil { ...@@ -131,7 +133,7 @@ public class BoxUtil {
infoMap.put(partition, info); infoMap.put(partition, info);
} }
if (boxSideStr.endsWith("A")) { if (boxSideStr.endsWith("A")) {
if (boxSideStr.startsWith("CS")) { if (boxSideStr.startsWith("CS") || boxSideStr.startsWith("CB")) {
for (int i = 8; i > 4; i--) { for (int i = 8; i > 4; i--) {
String partition = boxStr + "-" + i; String partition = boxStr + "-" + i;
infoList.add(infoMap.get(partition)); infoList.add(infoMap.get(partition));
...@@ -147,7 +149,7 @@ public class BoxUtil { ...@@ -147,7 +149,7 @@ public class BoxUtil {
} }
} }
} else if (boxSideStr.endsWith("B")) { } else if (boxSideStr.endsWith("B")) {
if (boxSideStr.startsWith("CS")) { if (boxSideStr.startsWith("CS") || boxSideStr.startsWith("CB")) {
for (int i = 4; i > 0; i--) { for (int i = 4; i > 0; i--) {
String partition = boxStr + "-" + i; String partition = boxStr + "-" + i;
infoList.add(infoMap.get(partition)); infoList.add(infoMap.get(partition));
...@@ -187,4 +189,30 @@ public class BoxUtil { ...@@ -187,4 +189,30 @@ public class BoxUtil {
} }
return true; return true;
} }
/**
* 判断是否可以入库
* @param partitionStr
* @return
*/
public static boolean isCanPutIn(String partitionStr) {
List<String> partitionList = new ArrayList<>();
String boxStr = getBoxStr(partitionStr);
if (partitionStr.startsWith("CS") || partitionStr.startsWith("CB")) {
for (int i = 1; i < 9; i++) {
partitionList.add(boxStr+"-"+i);
}
} else {
for (int i = 1; i < 3; i++) {
partitionList.add(boxStr+"-"+i);
}
}
if (partitionList != null && !partitionList.isEmpty()){
if (partitionList.contains(partitionStr)){
return true;
}
}
return false;
}
} }
...@@ -29,7 +29,7 @@ public class PreWarningItem extends BasePo { ...@@ -29,7 +29,7 @@ public class PreWarningItem extends BasePo {
private String partnumber; private String partnumber;
private String itemId; private String itemId;
private String reel; private String reel;
private String brand;
/** /**
* 优先级,1:人工 0:机器 * 优先级,1:人工 0:机器
*/ */
......
package com.neotel.smfcore.custom.lizhen.innerBox.bean;
import com.neotel.smfcore.common.base.BasePo;
import lombok.Data;
/**
* 虚拟仓导入明细
*/
@Data
public class VirImportLog extends BasePo {
/**
* barcode
*/
private String barcode;
/**
* 提示信息
*/
private String msg;
/**
* 是否成功
*/
private boolean isSuccess = false;
/**
* 楼层
*/
private String floor;
/**
* 工单号(pickingId)
*/
private String orderNo;
/**
* 创建人
*/
private String creator;
}
...@@ -57,5 +57,89 @@ public class ExtendType { ...@@ -57,5 +57,89 @@ public class ExtendType {
/** /**
* 盘点入库 * 盘点入库
*/ */
public final static int INVENTORY_PUTIN = 9; public final static int INVENTORY_PUTIN = 10;
/**
* pk发料
*/
public final static int PICKING_DETAIL = 11;
/**
* GR入库
*/
public final static int GR_PUTIN = 12;
/**
* 手动入库
*/
public final static int MANUAL_PUTIN = 13;
/**
* 任务取消
*/
public final static int TASK_CANNEL = 14;
/**
* 虚拟仓pk发料
*/
public final static int VIRTUAL_PICKING_DETAIL = 15;
public static String getName(int type) {
String name = "";
switch (type) {
case 0:
name = "智能仓储入库";
break;
case 1:
name = "智能仓储出库";
break;
case 2:
name = "虚拟仓入库";
break;
case 3:
name = "虚拟仓出库";
break;
case 4:
name = "手动出库";
break;
case 5:
name = "手动喂料";
break;
case 6:
name = "清空库位";
break;
case 7:
name = "料架入库";
break;
case 8:
name = "料架出库";
break;
case 9:
name = "盘点出库";
break;
case 10:
name = "盘点入库";
break;
case 11:
name = "PK发料";
break;
case 12:
name = "GR入库";
break;
case 13:
name = "手动入库";
break;
case 14:
name = "任务取消";
break;
case 15:
name = "虚拟仓pk发料";
break;
}
return name;
}
} }
package com.neotel.smfcore.custom.lizhen.innerBox.rest; package com.neotel.smfcore.custom.lizhen.innerBox.rest;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.neotel.smfcore.common.bean.ResultBean; import com.neotel.smfcore.common.bean.ResultBean;
...@@ -19,10 +20,13 @@ import com.neotel.smfcore.core.order.service.po.LiteOrderItem; ...@@ -19,10 +20,13 @@ import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager; import com.neotel.smfcore.core.storage.service.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.manager.IDataLogManager;
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.custom.lizhen.LizhenApi; import com.neotel.smfcore.custom.lizhen.LizhenApi;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.VirImportLog;
import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType; import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType;
import com.neotel.smfcore.custom.lizhen.innerBox.service.manager.IVirImportLogManager;
import com.neotel.smfcore.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -36,6 +40,8 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -36,6 +40,8 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.*; import java.util.*;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/** /**
* 虚拟仓页面 * 虚拟仓页面
...@@ -71,6 +77,12 @@ public class VirtualRestController { ...@@ -71,6 +77,12 @@ public class VirtualRestController {
@Autowired @Autowired
private OrderItemMapper orderItemMapper; private OrderItemMapper orderItemMapper;
@Autowired
private IDataLogManager dataLogManager;
@Autowired
private IVirImportLogManager virImportLogManager;
@ApiOperation("虚拟入库") @ApiOperation("虚拟入库")
@RequestMapping("/virtual/putIn") @RequestMapping("/virtual/putIn")
...@@ -118,17 +130,8 @@ public class VirtualRestController { ...@@ -118,17 +130,8 @@ public class VirtualRestController {
if (pos != null) { if (pos != null) {
return ResultBean.newErrorResult(-1, "smfcore.storagePos.existBarcode", "{}已存在库位{}中", new String[]{barcode.getBarcode(), pos.getPosName()}); return ResultBean.newErrorResult(-1, "smfcore.storagePos.existBarcode", "{}已存在库位{}中", new String[]{barcode.getBarcode(), pos.getPosName()});
} }
//判断库位中是否已经存在3种料号
List<String> pnList = getExistPnByPosName(posName);
if (pnList != null && !pnList.isEmpty()) {
if (!pnList.contains(barcode.getPartNumber())){
if (pnList.size() >= 3){
return ResultBean.newErrorResult(-1,"",posName+"已经存在3种料号,请更换库位");
}
}
}
//放入虚拟仓 //放入虚拟仓
intoVirtualPos(posName,barcode); intoVirtualPos(posName,barcode,"");
return ResultBean.newOkResult(barcode.getBarcode()+"已经放入库位中:"+posName); return ResultBean.newOkResult(barcode.getBarcode()+"已经放入库位中:"+posName);
} }
...@@ -207,49 +210,104 @@ public class VirtualRestController { ...@@ -207,49 +210,104 @@ public class VirtualRestController {
@ApiOperation("一键导入") @ApiOperation("一键导入")
@RequestMapping("/virtual/import") @RequestMapping("/virtual/import")
@AnonymousAccess @AnonymousAccess
public ResultBean virImport(String floor, String orderNo) { public synchronized ResultBean virImport(@RequestBody Map<String,String> paramMap) {
try {
String floor = paramMap.get("floor");
String orderNo = paramMap.get("orderNo");
if (StringUtils.isBlank(floor)) { if (StringUtils.isBlank(floor)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"楼层"}); return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"楼层"});
} }
if (StringUtils.isBlank(orderNo)) { if (StringUtils.isBlank(orderNo)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"PickingId"}); return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"PickingId"});
} }
log.info("开始导入:楼层为-" + floor + "pickingId为-" + orderNo);
int page = 0; int page = 0;
final int size = 1000; final int size = 10000;
boolean hasDataLog = true; boolean hasDataLog = true;
List<DataLog> resultList = new ArrayList<>();
while (hasDataLog) { while (hasDataLog) {
String url = dataCache.getCache("api.importUrl"); String url = dataCache.getCache("api.importUrl");
url = url + "?orderNo=" + orderNo + "&line=" + floor + "&page=" + page + "&size=" + size; url = url + "?orderNo=" + orderNo + "&line=" + floor + "&page=" + page + "&size=" + size;
String result = HttpHelper.sendGet(url); String result = HttpUtil.get(url);
log.info(orderNo + "调用结果为:" + result);
if (StringUtils.isNotBlank(result)) { if (StringUtils.isNotBlank(result)) {
List<DataLog> dataLogs = JSONArray.parseArray(result, DataLog.class); List<DataLog> dataLogs = JSONArray.parseArray(result, DataLog.class);
if (dataLogs == null || dataLogs.isEmpty()) { if (dataLogs == null || dataLogs.isEmpty()) {
hasDataLog = false; hasDataLog = false;
if (page == 0){
return ResultBean.newErrorResult(-1,"","请核实pickingId是否正确");
}
} else { } else {
for (DataLog dataLog : dataLogs) { resultList.addAll(dataLogs);
String barcodeStr = dataLog.getBarcode(); page++;
//先判断有没有存在,如果有,就跳过
StoragePos pos = storagePosManager.getByBarcode(barcodeStr);
if (pos != null) {
log.info("barcode:" + barcodeStr + "已经存在库位:" + pos.getPosName() + ",跳过");
continue;
} }
Barcode barcode = new Barcode(); } else {
/** hasDataLog = false;
* 从配置取 }
*/ }
if (resultList != null && !resultList.isEmpty()){
List<StoragePos> notEmptyPos = storagePosManager.findNotEmpty();
//获取库位中,已经存在的barcode
List<String> posBarcodeList = notEmptyPos.stream().filter(item -> item.getBarcode() != null)
.map(item -> item.getBarcode().getBarcode()).collect(Collectors.toList());
//获取已经导入成功的barcode
List<VirImportLog> importLogList = virImportLogManager.findByQuery(new Query(Criteria.where("orderNo").is(orderNo).and("isSuccess").is(true)));
List<String> importBarcodeList = importLogList.stream().map(item -> item.getBarcode()).collect(Collectors.toList());
//判断虚拟仓对应的partNumber
Storage storage = null; Storage storage = null;
for (Storage stor : dataCache.getAllStorage().values()) { for (Storage stor : dataCache.getAllStorage().values()) {
if (stor.isVirtual()){ if (stor.isVirtual()) {
storage = stor; storage = stor;
break; break;
} }
} }
List<StoragePos> storagePosList = storagePosManager.findEmptyByStorageId(storage.getId());
List<String> partNumberList = storagePosList.stream().filter(item -> StringUtils.isNotBlank(item.getPartNumber()))
.map(item -> item.getPartNumber()).collect(Collectors.toList());
for (DataLog dataLog : resultList) {
String barcodeStr = dataLog.getBarcode();
if (posBarcodeList != null && !posBarcodeList.isEmpty()) {
if (posBarcodeList.contains(dataLog.getBarcode())) {
String msg = "barcode:" + barcodeStr + "已经存在库位中,请核实";
virImportLogManager.updateVirImportLog(barcodeStr, msg, true, floor, orderNo);
log.info(msg);
continue;
}
}
//判断是否导入成功
if (importBarcodeList != null && !importBarcodeList.isEmpty()) {
if (importBarcodeList.contains(dataLog.getBarcode())) {
String msg = "barcode:" + barcodeStr + "已经导入成功,请核实";
virImportLogManager.updateVirImportLog(barcodeStr, msg, true, floor, orderNo);
log.info(msg);
continue;
}
}
//判断是否有对应的库位
if (partNumberList == null || partNumberList.isEmpty()){
String msg = "barcode:" + barcodeStr + ",料号:" + dataLog.getPartNumber() + "未找到可用库位,跳过";
virImportLogManager.updateVirImportLog(barcodeStr, msg, false, floor, orderNo);
log.info(msg);
continue;
}
if (!partNumberList.contains(dataLog.getPartNumber())){
String msg = "barcode:" + barcodeStr + ",料号:" + dataLog.getPartNumber() + "未找到可用库位,跳过";
virImportLogManager.updateVirImportLog(barcodeStr, msg, false, floor, orderNo);
log.info(msg);
continue;
}
String posName = ""; String posName = "";
StoragePos storagePos = storagePosManager.getPosNameByPnAndStrId(dataLog.getPartNumber(),storage.getId()); for (StoragePos storagePos : storagePosList) {
if (storagePos != null){ if (dataLog.getPartNumber().equals(storagePos.getPartNumber())){
posName = storagePos.getPosName(); posName = storagePos.getPosName();
break;
}
} }
Barcode barcode = new Barcode();
barcode.setBarcode(barcodeStr); barcode.setBarcode(barcodeStr);
barcode.setAmount(dataLog.getNum()); barcode.setAmount(dataLog.getNum());
barcode.setDateCode(dataLog.getDateCode()); barcode.setDateCode(dataLog.getDateCode());
...@@ -258,22 +316,20 @@ public class VirtualRestController { ...@@ -258,22 +316,20 @@ public class VirtualRestController {
barcode.setProvider(dataLog.getProvider()); barcode.setProvider(dataLog.getProvider());
barcode.setProviderNumber(dataLog.getProviderNumber()); barcode.setProviderNumber(dataLog.getProviderNumber());
barcode = barcodeManager.save(barcode); barcode = barcodeManager.save(barcode);
intoVirtualPos(posName, barcode); intoVirtualPos(posName, barcode, orderNo);
} virImportLogManager.updateVirImportLog(barcodeStr, "导入成功", true, floor, orderNo);
page++;
} }
} else {
hasDataLog = false;
}
if (!hasDataLog) {
break;
} }
} catch (Exception e) {
e.printStackTrace();
log.error("导入失败:" + e.getMessage());
return ResultBean.newErrorResult(-1, "", "导入失败:" + e.getMessage());
} }
return ResultBean.newOkResult(null); return ResultBean.newOkResult(null);
} }
private synchronized void intoVirtualPos(String posName, Barcode barcode) { private void intoVirtualPos(String posName, Barcode barcode,String orderNo) {
//判断有没有空库位 //判断有没有空库位
Storage storage = null; Storage storage = null;
Collection<Storage> storages = dataCache.getAllStorage().values(); Collection<Storage> storages = dataCache.getAllStorage().values();
...@@ -304,8 +360,12 @@ public class VirtualRestController { ...@@ -304,8 +360,12 @@ public class VirtualRestController {
pos = storagePosManager.save(pos); pos = storagePosManager.save(pos);
DataLog dataLog = generateTask(storage, barcode, pos, OP.PUT_IN, OP_STATUS.FINISHED.name(), null); DataLog dataLog = generateTask(storage, barcode, pos, OP.PUT_IN, OP_STATUS.FINISHED.name(), null);
dataLog.setExtendType(ExtendType.VIRTUAL_PUTIN); //虚拟入库 dataLog.setExtendType(ExtendType.VIRTUAL_PUTIN); //虚拟入库
taskService.addTaskToExecute(dataLog); if (StringUtils.isNotBlank(orderNo)){
taskService.moveTaskToFinished(dataLog); dataLog.setSourceName(orderNo);
}
//taskService.addTaskToExecute(dataLog);
//taskService.moveTaskToFinished(dataLog);
taskService.updateFinishedTask(dataLog);
taskService.removeFinishedTask(dataLog); taskService.removeFinishedTask(dataLog);
//更改缓存信息 //更改缓存信息
dataCache.updateInventory(pos, barcode); dataCache.updateInventory(pos, barcode);
......
package com.neotel.smfcore.custom.lizhen.innerBox.service.dao;
import com.neotel.smfcore.common.base.IBaseDao;
public interface IVirImportLogDao extends IBaseDao {
}
package com.neotel.smfcore.custom.lizhen.innerBox.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.VirImportLog;
import com.neotel.smfcore.custom.lizhen.innerBox.service.dao.IVirImportLogDao;
import org.springframework.stereotype.Service;
@Service
public class IVirImportLogDaoImpl extends AbstractBaseDao implements IVirImportLogDao {
@Override
public Class getEntityClass() {
return VirImportLog.class;
}
}
package com.neotel.smfcore.custom.lizhen.innerBox.service.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.VirImportLog;
public interface IVirImportLogManager extends IBaseManager<VirImportLog> {
void updateVirImportLog(String barcodeStr, String msg, boolean isSuccess, String floor, String orderNo);
int countByBarcodeAndOrderNo(String barcodeStr, String orderNo);
}
package com.neotel.smfcore.custom.lizhen.innerBox.service.manager.impl;
import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.VirImportLog;
import com.neotel.smfcore.custom.lizhen.innerBox.service.dao.IVirImportLogDao;
import com.neotel.smfcore.custom.lizhen.innerBox.service.manager.IVirImportLogManager;
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 java.security.Security;
import java.util.Date;
import java.util.List;
@Service
public class IVirImportLogManagerImpl implements IVirImportLogManager {
@Autowired
private IVirImportLogDao virImportLogDao;
@Override
public VirImportLog get(String id) {
return null;
}
@Override
public VirImportLog save(VirImportLog object) throws ValidateException {
return null;
}
@Override
public void delete(VirImportLog object) throws ValidateException {
}
@Override
public PageData<VirImportLog> findByPage(Query query, Pageable pageable) {
int count = virImportLogDao.countByQuery(query);
List<VirImportLog> barcodes= virImportLogDao.findByQuery(query,pageable);
return new PageData(barcodes,count);
}
@Override
public List<VirImportLog> findByQuery(Query query) {
return virImportLogDao.findByQuery(query);
}
@Override
public void updateVirImportLog(String barcodeStr, String msg, boolean isSuccess, String floor, String orderNo) {
Query query = new Query();
Criteria criteria = Criteria.where("barcode").is(barcodeStr).and("orderNo").is(orderNo);
VirImportLog virImportLog = virImportLogDao.findOne(query.addCriteria(criteria));
if (virImportLog == null){
virImportLog = new VirImportLog();
}
virImportLog.setBarcode(barcodeStr);
virImportLog.setMsg(msg);
virImportLog.setSuccess(isSuccess);
virImportLog.setFloor(floor);
virImportLog.setOrderNo(orderNo);
virImportLog.setUpdateDate(new Date());
//virImportLog.setCreator(SecurityUtils.getCurrentUsername());
virImportLogDao.save(virImportLog);
}
@Override
public int countByBarcodeAndOrderNo(String barcodeStr, String orderNo) {
Query query = new Query();
Criteria criteria = Criteria.where("barcode").is(barcodeStr).and("orderNo").is(orderNo).and("isSuccess").is(true);
return virImportLogDao.countByQuery(query.addCriteria(criteria));
}
}
...@@ -140,6 +140,7 @@ public class PreWarningItemCache { ...@@ -140,6 +140,7 @@ public class PreWarningItemCache {
orderItem.setPriority(item.getPriority()); orderItem.setPriority(item.getPriority());
orderItem.setMachineName(item.getMachinename()); orderItem.setMachineName(item.getMachinename());
orderItem.setReel(item.getReel()); orderItem.setReel(item.getReel());
orderItem.setBrand(item.getBrand());
orderItems.add(orderItem); orderItems.add(orderItem);
} }
} }
......
...@@ -112,17 +112,17 @@ public class InnerKanbanController { ...@@ -112,17 +112,17 @@ public class InnerKanbanController {
status = bean.getStatus(); status = bean.getStatus();
} }
//出入库数据 //出入库数据
int inCount = dataLogManager.getInOutData(currentDate, endDate, OP.PUT_IN, "", -1, storage.getId()); //int inCount = dataLogManager.getInOutData(currentDate, endDate, OP.PUT_IN, "", -1, storage.getId());
int outCount = dataLogManager.getInOutData(currentDate, endDate, OP.CHECKOUT, "", -1, storage.getId()); //int outCount = dataLogManager.getInOutData(currentDate, endDate, OP.CHECKOUT, "", -1, storage.getId());
DevicesStatusDto dto = new DevicesStatusDto(); DevicesStatusDto dto = new DevicesStatusDto();
dto.setName(name); dto.setName(name);
dto.setPosUseCount(useSlots); dto.setPosUseCount(useSlots);
dto.setPosAllCount(totalSlots); dto.setPosAllCount(totalSlots);
dto.setInCount(inCount); //dto.setInCount(inCount);
dto.setOutCount(outCount); //dto.setOutCount(outCount);
dto.setUsage(usage); dto.setUsage(usage);
dto.setStauts(status); dto.setStatus(status);
if (storage.isNLShelf()){ if (storage.isNLShelf()){
dto.setType(0); dto.setType(0);
} else { } else {
...@@ -134,6 +134,30 @@ public class InnerKanbanController { ...@@ -134,6 +134,30 @@ public class InnerKanbanController {
return ResultBean.newOkResult(resultList); return ResultBean.newOkResult(resultList);
} }
/**
* 所有设备库位使率汇总
* @return
*/
@RequestMapping("/getAllUsage")
@AnonymousAccess
public ResultBean getAllUsage(){
int usage = 0;
List<Storage> resultList = new ArrayList<>();
Collection<Storage> collection = dataCache.getAllStorage().values();
for (Storage storage : collection) {
if (!storage.isVirtual()){
resultList.add(storage);
}
}
if (resultList != null && !resultList.isEmpty()){
int totalSlots = resultList.stream().mapToInt(Storage::getTotalSlots).sum();
int emptySlots = resultList.stream().mapToInt(Storage::getEmptySlots).sum();
usage = (int) (((double) (totalSlots - emptySlots) / totalSlots) * 100); //库位使用率
}
return ResultBean.newOkResult(usage);
}
public static void main(String[] args) { public static void main(String[] args) {
int i = (int) (((double) (99 - 88) / 99) * 100); int i = (int) (((double) (99 - 88) / 99) * 100);
System.out.println(i); System.out.println(i);
......
...@@ -31,7 +31,7 @@ public class DevicesStatusDto { ...@@ -31,7 +31,7 @@ public class DevicesStatusDto {
/** /**
* 设备状态 * 设备状态
*/ */
private int stauts; private int status;
/** /**
* 所有库位 * 所有库位
......
package com.neotel.smfcore.custom.lizhen.report.bean.dto;
import lombok.Data;
@Data
public class MergeInventoryDto extends InventoryDto{
}
...@@ -101,6 +101,15 @@ public class ReportQueryCondition { ...@@ -101,6 +101,15 @@ public class ReportQueryCondition {
private String status; private String status;
@ApiModelProperty("盘点批次") @ApiModelProperty("盘点批次")
@QueryCondition(type = QueryCondition.Type.EQ, propName = "inventoryBatch") @QueryCondition(blurry = "inventoryBatch")
private Long inventoryBatch; private String inventoryBatch;
//楼层
private String floor;
private int page;
private int size;
private String sort;
} }
...@@ -2,10 +2,7 @@ package com.neotel.smfcore.custom.lizhen.report.inner; ...@@ -2,10 +2,7 @@ package com.neotel.smfcore.custom.lizhen.report.inner;
import com.neotel.smfcore.common.bean.PageData; import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean; import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.DateUtil; import com.neotel.smfcore.common.utils.*;
import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.QueryHelp;
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.mapstruct.BarcodeMapper; import com.neotel.smfcore.core.barcode.rest.bean.mapstruct.BarcodeMapper;
...@@ -33,8 +30,11 @@ import com.neotel.smfcore.core.storage.service.po.StoragePos; ...@@ -33,8 +30,11 @@ import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager; import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
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.custom.lizhen.innerBox.bean.VirImportLog;
import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType; import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType;
import com.neotel.smfcore.custom.lizhen.innerBox.service.manager.IVirImportLogManager;
import com.neotel.smfcore.custom.lizhen.report.bean.query.ReportQueryCondition; import com.neotel.smfcore.custom.lizhen.report.bean.query.ReportQueryCondition;
import com.neotel.smfcore.custom.lizhen.report.merge.utils.FloorUtils;
import com.neotel.smfcore.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -103,6 +103,9 @@ public class InnerReportController { ...@@ -103,6 +103,9 @@ public class InnerReportController {
@Autowired @Autowired
private CodeResolve codeResolve; private CodeResolve codeResolve;
@Autowired
private IVirImportLogManager virImportLogManager;
@ApiOperation("喂料") @ApiOperation("喂料")
@RequestMapping("/feeding") @RequestMapping("/feeding")
@AnonymousAccess @AnonymousAccess
...@@ -175,10 +178,21 @@ public class InnerReportController { ...@@ -175,10 +178,21 @@ public class InnerReportController {
@RequestMapping("floorPullDown") @RequestMapping("floorPullDown")
@AnonymousAccess @AnonymousAccess
public ResultBean floorPullDown() { public ResultBean floorPullDown() {
String floor = dataCache.getCache(Constants.CACHE_floor);
Map<String, String> resultMap = new LinkedHashMap<>(); Map<String, String> resultMap = new LinkedHashMap<>();
if (StringUtils.isNotBlank(floor)) {
if (F2.equals(floor)) {
resultMap.put(F2, F2);
} else if (F3.equals(floor)) {
resultMap.put(F3, F3);
} else if (F5.equals(floor)) {
resultMap.put(F5, F5);
}
} else {
resultMap.put(F2, F2); resultMap.put(F2, F2);
resultMap.put(F3, F3); resultMap.put(F3, F3);
resultMap.put(F5, F5); resultMap.put(F5, F5);
}
return ResultBean.newOkResult(resultMap); return ResultBean.newOkResult(resultMap);
} }
...@@ -217,10 +231,21 @@ public class InnerReportController { ...@@ -217,10 +231,21 @@ public class InnerReportController {
if (pageable != null) { if (pageable != null) {
PageData<StoragePos> page = storagePosManager.findByPage(query, pageable); PageData<StoragePos> page = storagePosManager.findByPage(query, pageable);
resultData.setTotalElements(page.getTotalElements()); resultData.setTotalElements(page.getTotalElements());
resultData.setContent(storagePosMapper.toDto(page.getContent())); List<StoragePos> storagePosList = page.getContent();
storagePosList.stream().forEach(item -> {
String storageId = item.getStorageId();
Storage storage = dataCache.getStorageById(storageId);
item.setSource(storage.getName());
});
resultData.setContent(storagePosMapper.toDto(storagePosList));
} else { } else {
List<StoragePos> storagePosList = storagePosManager.findByQuery(query); List<StoragePos> storagePosList = storagePosManager.findByQuery(query);
if (storagePosList != null && !storagePosList.isEmpty()) { if (storagePosList != null && !storagePosList.isEmpty()) {
storagePosList.stream().forEach(item -> {
String storageId = item.getStorageId();
Storage storage = dataCache.getStorageById(storageId);
item.setSource(storage.getName());
});
resultData.setContent(storagePosMapper.toDto(storagePosList)); resultData.setContent(storagePosMapper.toDto(storagePosList));
resultData.setTotalElements(storagePosList.size()); resultData.setTotalElements(storagePosList.size());
} }
...@@ -440,6 +465,7 @@ public class InnerReportController { ...@@ -440,6 +465,7 @@ public class InnerReportController {
public PageData lackPicking(ReportQueryCondition queryCondition, Pageable pageable) { public PageData lackPicking(ReportQueryCondition queryCondition, Pageable pageable) {
Collection<LiteOrder> liteOrders = liteOrderCache.getAllLiteOrder(); Collection<LiteOrder> liteOrders = liteOrderCache.getAllLiteOrder();
PageData resultData = new PageData(); PageData resultData = new PageData();
resultData.setContent(new ArrayList());
if (liteOrders != null && !liteOrders.isEmpty()) { if (liteOrders != null && !liteOrders.isEmpty()) {
//先按创建时间进行升序 //先按创建时间进行升序
liteOrders = liteOrders.stream().sorted(Comparator.comparing(LiteOrder::getCreateDate)).collect(Collectors.toList()); liteOrders = liteOrders.stream().sorted(Comparator.comparing(LiteOrder::getCreateDate)).collect(Collectors.toList());
...@@ -626,6 +652,55 @@ public class InnerReportController { ...@@ -626,6 +652,55 @@ public class InnerReportController {
} }
} }
@ApiOperation("一键导入明细")
@RequestMapping("/virImportLog")
@AnonymousAccess
public PageData<VirImportLog> virImportLog(ReportQueryCondition queryCondition, Pageable pageable) {
Query query = QueryHelp.getQuery(queryCondition);
if (pageable != null) {
return virImportLogManager.findByPage(query, pageable);
} else {
List<VirImportLog> virImportLogList = virImportLogManager.findByQuery(query);
if (virImportLogList == null) {
virImportLogList = new ArrayList<>();
}
return new PageData<VirImportLog>(virImportLogList, virImportLogList.size());
}
}
@ApiOperation("一键导入明细导出")
@RequestMapping("/virImportLog/download")
@AnonymousAccess
public void virImportLogDownload(ReportQueryCondition queryCondition, HttpServletResponse response) {
PageData<VirImportLog> pageData = virImportLog(queryCondition, null);
if (pageData.getTotalElements() != 0) {
List<VirImportLog> importLogList = pageData.getContent();
List<Map<String, Object>> results = new ArrayList<>();
if (importLogList != null && !importLogList.isEmpty()) {
for (VirImportLog log : importLogList) {
Map<String, Object> resultMap = new LinkedHashMap<>();
resultMap.put("唯一码",log.getBarcode());
resultMap.put("提示信息",log.getMsg());
resultMap.put("是否成功",log.isSuccess() ? "是" : "否");
resultMap.put("楼层",log.getFloor());
resultMap.put("pickingId",log.getOrderNo());
resultMap.put("创建人",log.getCreator());
resultMap.put("创建时间",log.getCreateDate());
resultMap.put("修改时间",log.getUpdateDate());
results.add(resultMap);
}
}
try {
FileUtil.downloadExcel(results, response);
} catch (IOException e) {
e.printStackTrace();
log.info("内仓禁限用导出导出失败--" + e.getMessage());
}
}
}
private List<LiteOrderItem> getLackItems(Collection<LiteOrder> liteOrders, ReportQueryCondition queryCondition) { private List<LiteOrderItem> getLackItems(Collection<LiteOrder> liteOrders, ReportQueryCondition queryCondition) {
List<LiteOrderItem> lackItems = new ArrayList<>(); List<LiteOrderItem> lackItems = new ArrayList<>();
//排除虚拟仓的 //排除虚拟仓的
...@@ -667,7 +742,7 @@ public class InnerReportController { ...@@ -667,7 +742,7 @@ public class InnerReportController {
} }
InventoryItem inventoryItem = inventoryMap.get(orderItem.getPn()); InventoryItem inventoryItem = inventoryMap.get(orderItem.getPn());
if (inventoryItem != null) { if (inventoryItem != null) {
if (inventoryItem.getStockReel() - inventoryItem.getLockReel() - inventoryItem.getBindReel() > 0) { if (inventoryItem.getStockReel() /*- inventoryItem.getLockReel()*/ - inventoryItem.getBindReel() > 0) {
inventoryItem.setBindReel(inventoryItem.getBindReel() + 1); inventoryItem.setBindReel(inventoryItem.getBindReel() + 1);
} else { } else {
lackItems.add(orderItem); lackItems.add(orderItem);
......
package com.neotel.smfcore.custom.lizhen.report.merge;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.rest.bean.dto.BarcodeDto;
import com.neotel.smfcore.core.order.rest.bean.dto.OrderItemDto;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.rest.dto.StorageDto;
import com.neotel.smfcore.core.storage.rest.dto.StoragePosDto;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.InventoryData;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.enums.InventoryStatus;
import com.neotel.smfcore.custom.lizhen.report.bean.dto.InventoryDto;
import com.neotel.smfcore.custom.lizhen.report.bean.dto.MergeInventoryDto;
import com.neotel.smfcore.custom.lizhen.report.bean.query.ReportQueryCondition;
import com.neotel.smfcore.custom.lizhen.report.merge.utils.FloorUtils;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
/**
* 报表合并
*/
@RestController
@Slf4j
@RequestMapping("/reportMerge")
public class ReportMergeController {
@Autowired
private FloorUtils floorUtils;
/**
* 获取到所有楼层
*
* @return
*/
@RequestMapping("/getAllFloor")
@AnonymousAccess
public ResultBean getAllFloor(int type) {
Map<String, String> allFloor = floorUtils.getAllFloor(type);
return ResultBean.newOkResult(allFloor);
}
/**
* 库存
*
* @param queryCondition
* @return
*/
@RequestMapping("/inventory")
@AnonymousAccess
public PageData inventory(ReportQueryCondition queryCondition) {
PageData<MergeInventoryDto> pageData = new PageData();
pageData.setContent(new ArrayList());
String floor = queryCondition.getFloor();
if (StringUtils.isNotBlank(floor)) {
String url = floorUtils.getUrlByFloor(floor);
if (StringUtils.isNotBlank(url)) {
List<MergeInventoryDto> dtoList = new ArrayList<>();
//判断是外仓还是内仓
if (floorUtils.isB15(floor)) {
url = url + "/outer/report/inventory" + getQueryStr(queryCondition);
String result = HttpUtil.get(url);
PageData data = JSONObject.parseObject(result, PageData.class);
if (data.getContent() != null && !data.getContent().isEmpty()) {
List<InventoryDto> inventoryDtoList = JSONArray.parseArray(JSONObject.toJSONString(data.getContent()), InventoryDto.class);
dtoList = inventoryDtoList.stream().map(item -> {
MergeInventoryDto dto = new MergeInventoryDto();
BeanUtils.copyProperties(item, dto);
dto.setFloor(floor);
return dto;
}).collect(Collectors.toList());
pageData.setTotalElements(data.getTotalElements());
}
} else {
url = url + "/inner/report/inventory"+getQueryStr(queryCondition);
String result = HttpUtil.get(url);
PageData data = JSONObject.parseObject(result, PageData.class);
if (data.getContent() != null && !data.getContent().isEmpty()) {
List<StoragePosDto> storageDtoList = JSONArray.parseArray(JSONObject.toJSONString(data.getContent()), StoragePosDto.class);
dtoList = storageDtoList.stream().map(item -> {
MergeInventoryDto dto = new MergeInventoryDto();
dto.setStoragePosName(item.getPosName());
BarcodeDto barcode = item.getBarcode();
if (barcode != null) {
dto.setPartNumber(barcode.getPartNumber());
dto.setReelCount(1);
dto.setAmount(barcode.getAmount());
dto.setProvider(barcode.getProvider());
dto.setProviderNumber(barcode.getProviderNumber());
dto.setBarcode(barcode.getBarcode());
dto.setBatch(barcode.getBatch());
dto.setDateCode(barcode.getDateCode());
dto.setPutInDate(barcode.getPutInDate());
dto.setFirstPutInDate(barcode.getFirstPutInDate());
dto.setDisableMsg(barcode.getDisableMsg());
}
dto.setSource(item.getSource());
dto.setFloor(floor);
dto.setFactory("A5");
dto.setPlant("W337");
return dto;
}).collect(Collectors.toList());
pageData.setTotalElements(data.getTotalElements());
}
}
pageData.setContent(dtoList);
}
}
return pageData;
}
/**
* 库存导出
*
* @param queryCondition
* @return
*/
@RequestMapping("/inventory/download")
@AnonymousAccess
public void inventoryDownload(ReportQueryCondition queryCondition, HttpServletResponse response) {
List<MergeInventoryDto> dtoList = new ArrayList<>();
int page = 0;
while (true) {
log.info(page +"");
queryCondition.setPage(page);
queryCondition.setSize(20000);
PageData data = inventory(queryCondition);
if (data.getTotalElements() == 0) {
break;
}
dtoList.addAll(data.getContent());
page++;
}
if (dtoList != null && !dtoList.isEmpty()) {
//List<Map<String, Object>> dataList, List<String> titles, HttpServletResponse response
List<Map<String, Object>> dataList = new ArrayList<>();
for (MergeInventoryDto dto : dtoList) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("厂别",dto.getPlant());
map.put("厂区",dto.getFactory());
map.put("库别", dto.getWarehouseCode());
map.put("楼层",dto.getFloor());
map.put("隔口码",dto.getPosName());
map.put("唯一码",dto.getBarcode());
map.put("料号",dto.getPartNumber());
map.put("物料描述","");
map.put("隔口数量",dto.getPosNameCount());
map.put("卷数",dto.getReelCount());
map.put("每卷数量",dto.getAmount());
map.put("厂商",dto.getProvider());
map.put("厂商代码",dto.getProviderNumber());
map.put("LOT",dto.getBatch());
map.put("D/C",dto.getDateCode());
//map.put("批次代码"));
map.put("keeper",dto.getKeeperCode());
map.put("储位",dto.getStoragePosName());
map.put("禁用信息",dto.getDisableMsg());
map.put("首次入库时间",dto.getFirstPutInDate());
map.put("当前入库时间",dto.getPutInDate());
map.put("工号",dto.getCreator());
map.put("姓名","");
map.put("来源",dto.getSource());
dataList.add(map);
}
try {
FileUtil.downloadExcel(dataList, response);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 库存导出全部
*
* @param queryCondition
* @return
*/
@RequestMapping("/inventoryAll/download")
@AnonymousAccess
public void inventoryAllDownload(ReportQueryCondition queryCondition, HttpServletResponse response) {
List<MergeInventoryDto> dtoList = new ArrayList<>();
for (String floor : floorUtils.getAllFloor(0).values()) {
int page = 0;
queryCondition = new ReportQueryCondition();
queryCondition.setFloor(floor);
while (true) {
log.info(page+"");
queryCondition.setPage(page);
queryCondition.setSize(10000);
PageData data = inventory(queryCondition);
if (data.getTotalElements() == 0) {
break;
}
dtoList.addAll(data.getContent());
page++;
}
}
if (dtoList != null && !dtoList.isEmpty()) {
//List<Map<String, Object>> dataList, List<String> titles, HttpServletResponse response
List<Map<String, Object>> dataList = new ArrayList<>();
for (MergeInventoryDto dto : dtoList) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("厂别", dto.getPlant());
map.put("厂区", dto.getFactory());
map.put("库别", dto.getWarehouseCode());
map.put("楼层", dto.getFloor());
map.put("隔口码", dto.getPosName());
map.put("唯一码", dto.getBarcode());
map.put("料号", dto.getPartNumber());
map.put("物料描述", "");
map.put("隔口数量", dto.getPosNameCount());
map.put("卷数", dto.getReelCount());
map.put("每卷数量", dto.getAmount());
map.put("厂商", dto.getProvider());
map.put("厂商代码", dto.getProviderNumber());
map.put("LOT", dto.getBatch());
map.put("D/C", dto.getDateCode());
//map.put("批次代码"));
map.put("keeper", dto.getKeeperCode());
map.put("储位", dto.getStoragePosName());
map.put("禁用信息", dto.getDisableMsg());
map.put("首次入库时间", dto.getFirstPutInDate());
map.put("当前入库时间", dto.getPutInDate());
map.put("工号",dto.getCreator());
map.put("姓名","");
map.put("来源", dto.getSource());
dataList.add(map);
}
try {
FileUtil.downloadExcel(dataList, response);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 外仓发料
*
* @param queryCondition
* @return
*/
@RequestMapping("/pickingDetail")
@AnonymousAccess
public PageData pickingDetail(ReportQueryCondition queryCondition) {
PageData<DataLog> pageData = new PageData<>();
pageData.setContent(new ArrayList<>());
String floor = queryCondition.getFloor();
if (StringUtils.isNotBlank(floor)) {
String url = floorUtils.getUrlByFloor(floor);
if (StringUtils.isNotBlank(url)) {
url = url + "/outer/report/pickingDetail"+getQueryStr(queryCondition);
String result = HttpUtil.get(url);
pageData = JSONObject.parseObject(result, PageData.class);
}
}
return pageData;
}
private String getQueryStr(ReportQueryCondition queryCondition) {
String str = "";
String queryStr = JSONObject.toJSONString(queryCondition);
JSONObject queryJson = JSONObject.parseObject(queryStr);
for (Map.Entry<String, Object> entry : queryJson.entrySet()) {
Object value = entry.getValue();
if (value != null) {
if ("updateDate".equals(entry.getKey()) || "updateDateHHmm".equals(entry.getKey())) {
List<Date> updateList = JSONArray.parseArray(value.toString(), Date.class);
for (Date update : updateList) {
String updateStr = "";
if ("updateDate".equals(entry.getKey())) {
updateStr = DateUtil.toDateString(update, "yyyy-MM-dd");
} else if ("updateDateHHmm".equals(entry.getKey())){
updateStr = DateUtil.toDateString(update, "yyyy-MM-dd HH:mm");
}
if (StringUtils.isNotBlank(str)) {
str = str + "&" + entry.getKey() + "=" + updateStr;
} else {
str = "?" + entry.getKey() + "=" + updateStr;
}
}
} else {
if (StringUtils.isNotBlank(str)) {
str = str + "&" + entry.getKey() + "=" + entry.getValue();
} else {
str = "?" + entry.getKey() + "=" + entry.getValue();
}
}
}
}
return str;
}
/**
* 外仓发料导出
*
* @param queryCondition
* @return
*/
@RequestMapping("/pickingDetail/download")
@AnonymousAccess
public void pickingDetailDownload(ReportQueryCondition queryCondition,HttpServletResponse response) {
List<DataLog> dataLogList = new ArrayList<>();
int page = 0;
while (true) {
log.info(page+"");
queryCondition.setPage(page);
queryCondition.setSize(20000);
PageData<DataLog> pageData = pickingDetail(queryCondition);
if (pageData.getContent() == null || pageData.getContent().isEmpty()){
break;
}
List<DataLog> dataLogs = JSONArray.parseArray(JSONObject.toJSONString(pageData.getContent()), DataLog.class);
dataLogList.addAll(dataLogs);
page ++;
}
if (dataLogList != null && !dataLogList.isEmpty()) {
List results = new ArrayList();
for (DataLog dataLog : dataLogList) {
Map<String, Object> resultMap = new LinkedHashMap<>();
resultMap.put("厂别", getData(dataLog.getPlantCode()));
resultMap.put("厂区", getData(dataLog.getFactory()));
resultMap.put("库别", getData(dataLog.getWarehouseCode()));
resultMap.put("楼层", getData(dataLog.getLine()));
resultMap.put("挑料单号", getData(dataLog.getOrderNo()));
resultMap.put("工单号", getData(dataLog.getMo()));
resultMap.put("料号", getData(dataLog.getPartNumber()));
resultMap.put("物料描述", getData(null));
resultMap.put("储位", getData(dataLog.getPosName()));
resultMap.put("段别", getData(dataLog.getSide()));
resultMap.put("数量", getData(dataLog.getNum()));
resultMap.put("异动类型", getData(dataLog.getChangeType()));
resultMap.put("工号", getData(dataLog.getOperator()));
resultMap.put("姓名", getData(null));
resultMap.put("时间", getData(dataLog.getCreateDate()));
resultMap.put("ID NO.", getData(dataLog.getBarcode()));
resultMap.put("LOT", getData(dataLog.getBatchInfo()));
resultMap.put("D/C", getData(dataLog.getDateCode()));
resultMap.put("厂商", getData(dataLog.getProvider()));
resultMap.put("厂商代码", getData(dataLog.getProviderNumber()));
results.add(resultMap);
}
try {
FileUtil.downloadExcel(results, response);
} catch (IOException e) {
e.printStackTrace();
log.info("发料明细导出失败--" + e.getMessage());
}
}
}
/**
* 禁限用
*
* @param queryCondition
* @return
*/
@RequestMapping("/disable")
@AnonymousAccess
public PageData disable(ReportQueryCondition queryCondition) {
PageData<BarcodeDto> pageData = new PageData<>();
pageData.setContent(new ArrayList<>());
String floor = queryCondition.getFloor();
if (StringUtils.isNotBlank(floor)) {
String url = floorUtils.getUrlByFloor(floor);
if (StringUtils.isNotBlank(url)) {
url = url + "/outer/report/disable";
String result = HttpUtil.get(url+getQueryStr(queryCondition));
pageData = JSONObject.parseObject(result, PageData.class);
}
}
return pageData;
}
/**
* 外仓禁限用导出
*
* @param queryCondition
* @return
*/
@RequestMapping("/disable/download")
@AnonymousAccess
public void disableDownload(ReportQueryCondition queryCondition,HttpServletResponse response) {
List<BarcodeDto> barcodeDtoList = new ArrayList<>();
int page = 0;
while (true) {
log.info(page + "");
queryCondition.setPage(page);
queryCondition.setSize(200000);
PageData<BarcodeDto> pageData = disable(queryCondition);
if (pageData.getContent() == null || pageData.getContent().isEmpty()) {
break;
}
List<BarcodeDto> barcodeDtos = JSONArray.parseArray(JSONObject.toJSONString(pageData.getContent()), BarcodeDto.class);
barcodeDtoList.addAll(barcodeDtos);
page++;
}
if (barcodeDtoList != null && !barcodeDtoList.isEmpty()) {
List results = new ArrayList();
for (BarcodeDto dto : barcodeDtoList) {
Map<String, Object> resultMap = new LinkedHashMap<>();
resultMap.put("厂别", getData(dto.getPlant()));
resultMap.put("厂区", getData(dto.getFactory()));
resultMap.put("库别", getData(dto.getWarehouseCode()));
resultMap.put("料号", getData(dto.getPartNumber()));
resultMap.put("物料描述", getData(null));
resultMap.put("隔口码", getData(dto.getPosName()));
resultMap.put("储位", getData(dto.getStoragePosName()));
resultMap.put("Keeper", getData(dto.getKeeperCode()));
resultMap.put("数量", getData(dto.getAmount()));
resultMap.put("LOT", getData(dto.getBatch()));
resultMap.put("D/C", getData(dto.getDateCode()));
resultMap.put("厂商", getData(dto.getProvider()));
resultMap.put("厂商代码", getData(dto.getProviderNumber()));
resultMap.put("禁用信息", getData(dto.getDisableMsg()));
resultMap.put("入库时间", getData(dto.getPutInDate()));
results.add(resultMap);
}
try {
FileUtil.downloadExcel(results, response);
} catch (IOException e) {
e.printStackTrace();
log.info("禁限用导出失败--" + e.getMessage());
}
}
}
/**
* 备料
*
* @param queryCondition
* @return
*/
@RequestMapping("/preparePicking")
@AnonymousAccess
public PageData preparePicking(ReportQueryCondition queryCondition) {
PageData<OrderItemDto> pageData = new PageData<>();
pageData.setContent(new ArrayList<>());
String floor = queryCondition.getFloor();
if (StringUtils.isNotBlank(floor)) {
String url = floorUtils.getUrlByFloor(floor);
if (StringUtils.isNotBlank(url)) {
url = url + "/outer/report/preparePicking";
String result = HttpUtil.get(url+getQueryStr(queryCondition));
pageData = JSONObject.parseObject(result, PageData.class);
}
}
return pageData;
}
/**
* 外仓备料导出
*
* @param queryCondition
* @return
*/
@RequestMapping("/preparePicking/download")
@AnonymousAccess
public void preparePickingDownload(ReportQueryCondition queryCondition,HttpServletResponse response) {
List<OrderItemDto> orderItemDtoList = new ArrayList<>();
int page = 0;
while (true) {
log.info(page + "");
queryCondition.setPage(page);
queryCondition.setSize(20000);
PageData<BarcodeDto> pageData = preparePicking(queryCondition);
if (pageData.getContent() == null || pageData.getContent().isEmpty()) {
break;
}
List<OrderItemDto> orderItemDtos = JSONArray.parseArray(JSONObject.toJSONString(pageData.getContent()), OrderItemDto.class);
orderItemDtoList.addAll(orderItemDtos);
page++;
}
if (orderItemDtoList != null && !orderItemDtoList.isEmpty()) {
List results = new ArrayList();
for (OrderItemDto dto : orderItemDtoList) {
Map<String, Object> resultMap = new LinkedHashMap<>();
resultMap.put("厂别", getData(dto.getPlantCode()));
resultMap.put("厂区", getData(dto.getFactory()));
resultMap.put("库别", getData(dto.getWarehouseCode()));
resultMap.put("楼层", getData(dto.getLine()));
resultMap.put("挑料单号", getData(dto.getOrderNo()));
resultMap.put("工单号", getData(dto.getMo()));
resultMap.put("料号", getData(dto.getPn()));
resultMap.put("物料描述", getData(null));
resultMap.put("需求数", getData(dto.getNeedNum()));
resultMap.put("需求卷", getData(dto.getNeedReelCount()));
resultMap.put("实发数", getData(dto.getTotalOutNum()));
resultMap.put("实发卷", getData(dto.getTotalOutReelCount()));
resultMap.put("段别", getData(dto.getSide()));
resultMap.put("超发数量", getData(dto.getExcessOutNum()));
resultMap.put("超发卷数", getData(dto.getExcessOutReel()));
resultMap.put("是否超发", getData(dto.isExcess() ? "是" : "否"));
results.add(resultMap);
}
try {
FileUtil.downloadExcel(results, response);
} catch (IOException e) {
e.printStackTrace();
log.info("备料导出失败--" + e.getMessage());
}
}
}
/**
* 外仓异动
*
* @param queryCondition
* @return
*/
@RequestMapping("/change")
@AnonymousAccess
public PageData change(ReportQueryCondition queryCondition) {
PageData<DataLog> pageData = new PageData<>();
pageData.setContent(new ArrayList<>());
String floor = queryCondition.getFloor();
if (StringUtils.isNotBlank(floor)) {
String url = floorUtils.getUrlByFloor(floor);
if (StringUtils.isNotBlank(url)) {
url = url + "/outer/report/change";
String result = HttpUtil.get(url+getQueryStr(queryCondition));
pageData = JSONObject.parseObject(result, PageData.class);
}
}
return pageData;
}
/**
* 外仓异动导出
*
* @param queryCondition
* @return
*/
@RequestMapping("/change/download")
@AnonymousAccess
public void changeDownload(ReportQueryCondition queryCondition,HttpServletResponse response) {
List<DataLog> dataLogList = new ArrayList<>();
int page = 0;
while (true) {
log.info(page + "");
queryCondition.setPage(page);
queryCondition.setSize(20000);
PageData<DataLog> pageData = change(queryCondition);
if (pageData.getContent() == null || pageData.getContent().isEmpty()) {
break;
}
List<DataLog> dataLogs = JSONArray.parseArray(JSONObject.toJSONString(pageData.getContent()), DataLog.class);
dataLogList.addAll(dataLogs);
page++;
}
if (dataLogList != null && !dataLogList.isEmpty()) {
List results = new ArrayList();
for (DataLog dataLog : dataLogList) {
Map<String, Object> resultMap = new LinkedHashMap<>();
resultMap.put("厂别", getData(dataLog.getPlantCode()));
resultMap.put("厂区", getData(dataLog.getFactory()));
resultMap.put("料号", getData(dataLog.getPartNumber()));
resultMap.put("物料描述", getData(null));
resultMap.put("隔口码", getData(dataLog.getPosName()));
resultMap.put("异动数量", getData(dataLog.getNum()));
resultMap.put("储位", getData(dataLog.getStoragePosName()));
resultMap.put("异动类型", getData(dataLog.getChangeType()));
resultMap.put("ID NO", getData(dataLog.getBarcode()));
resultMap.put("LOT", getData(dataLog.getBatchInfo()));
resultMap.put("D/C", getData(dataLog.getDateCode()));
resultMap.put("厂商", getData(dataLog.getProvider()));
resultMap.put("厂商代码", getData(dataLog.getProviderNumber()));
resultMap.put("Keeper", getData(dataLog.getKeeperCode()));
resultMap.put("原始库别", getData(dataLog.getWarehouseCode()));
resultMap.put("目的库别", getData(null));
resultMap.put("事务日期", getData(dataLog.getCreator()));
resultMap.put("工号", getData(dataLog.getOperator()));
resultMap.put("姓名", getData(null));
results.add(resultMap);
}
try {
FileUtil.downloadExcel(results, response);
} catch (IOException e) {
e.printStackTrace();
log.info("异动导出失败--" + e.getMessage());
}
}
}
/**
* 外仓缺料
*
* @param queryCondition
* @return
*/
@RequestMapping("/lackPicking")
@AnonymousAccess
public PageData lackPicking(ReportQueryCondition queryCondition) {
PageData<OrderItemDto> pageData = new PageData<>();
pageData.setContent(new ArrayList<>());
String floor = queryCondition.getFloor();
if (StringUtils.isNotBlank(floor)) {
String url = floorUtils.getUrlByFloor(floor);
if (StringUtils.isNotBlank(url)) {
url = url + "/outer/report/lackPicking";
String result = HttpUtil.get(url+getQueryStr(queryCondition));
pageData = JSONObject.parseObject(result, PageData.class);
}
}
return pageData;
}
/**
* 外仓缺料导出
*
* @param queryCondition
* @return
*/
@RequestMapping("/lackPicking/download")
@AnonymousAccess
public void lackPickingDownload(ReportQueryCondition queryCondition,HttpServletResponse response) {
List<OrderItemDto> orderItemDtoList = new ArrayList<>();
PageData<DataLog> pageData = lackPicking(queryCondition);
if (pageData.getContent() == null || pageData.getContent().isEmpty()) {
return;
}
List<OrderItemDto> orderItemDtos = JSONArray.parseArray(JSONObject.toJSONString(pageData.getContent()), OrderItemDto.class);
orderItemDtoList.addAll(orderItemDtos);
if (orderItemDtoList != null && !orderItemDtoList.isEmpty()) {
List results = new ArrayList();
for (OrderItemDto dto : orderItemDtoList) {
Map<String, Object> resultMap = new LinkedHashMap<>();
resultMap.put("厂别", getData(dto.getPlantCode()));
resultMap.put("厂区", getData(dto.getFactory()));
resultMap.put("库别", getData(dto.getWarehouseCode()));
resultMap.put("楼层", getData(dto.getLine()));
resultMap.put("Picking ID", getData(dto.getOrderNo()));
resultMap.put("工单号", getData(dto.getMo()));
resultMap.put("55料号", getData(null));
resultMap.put("工单套数", getData(null));
resultMap.put("料号", getData(dto.getPn()));
resultMap.put("描述", getData(null));
resultMap.put("需求站别", getData(dto.getSide()));
resultMap.put("需求数量", getData(dto.getNeedNum()));
resultMap.put("需求卷数", getData(dto.getNeedReelCount()));
resultMap.put("发料数量", getData(dto.getTotalOutNum()));
resultMap.put("发料卷数", getData(dto.getTotalOutReelCount()));
resultMap.put("缺料数量", getData(dto.getLackNum()));
resultMap.put("缺料卷数", getData(dto.getLackReel()));
resultMap.put("是否超发", dto.isExcess() ? "是" : "否");
results.add(resultMap);
}
try {
FileUtil.downloadExcel(results, response);
} catch (IOException e) {
e.printStackTrace();
log.info("缺料导出失败--" + e.getMessage());
}
}
}
/**
* 外仓PK查询
*
* @param queryCondition
* @return
*/
@RequestMapping("/pickingSearch")
@AnonymousAccess
public PageData pickingSearch(ReportQueryCondition queryCondition) {
PageData<OrderItemDto> pageData = new PageData<>();
pageData.setContent(new ArrayList<>());
String floor = queryCondition.getFloor();
if (StringUtils.isNotBlank(floor)) {
String url = floorUtils.getUrlByFloor(floor);
if (StringUtils.isNotBlank(url)) {
url = url + "/outer/report/pickingSearch";
String result = HttpUtil.get(url+getQueryStr(queryCondition));
pageData = JSONObject.parseObject(result, PageData.class);
}
}
return pageData;
}
/**
* 外仓pk查询
*
* @param queryCondition
* @return
*/
@RequestMapping("/pickingSearch/download")
@AnonymousAccess
public void pickingSearchDownload(ReportQueryCondition queryCondition,HttpServletResponse response) {
List<OrderItemDto> orderItemDtoList = new ArrayList<>();
int page = 0;
while (true) {
log.info(page + "");
queryCondition.setPage(page);
queryCondition.setSize(20000);
PageData<OrderItemDto> pageData = pickingSearch(queryCondition);
if (pageData.getContent() == null || pageData.getContent().isEmpty()) {
break;
}
List<OrderItemDto> orderItemDtos = JSONArray.parseArray(JSONObject.toJSONString(pageData.getContent()), OrderItemDto.class);
orderItemDtoList.addAll(orderItemDtos);
page++;
}
if (orderItemDtoList != null && !orderItemDtoList.isEmpty()) {
List results = new ArrayList();
for (OrderItemDto orderItemDto : orderItemDtoList) {
Map<String, Object> resultMap = new LinkedHashMap<>();
resultMap.put("厂别", getData(orderItemDto.getPlantCode()));
resultMap.put("厂区", getData(orderItemDto.getFactory()));
resultMap.put("库别", getData(orderItemDto.getWarehouseCode()));
resultMap.put("楼层", getData(orderItemDto.getLine()));
resultMap.put("PK ID", getData(orderItemDto.getOrderNo()));
resultMap.put("工单号", getData(orderItemDto.getMo()));
resultMap.put("板子料号", getData(null));
resultMap.put("套数", getData(null));
results.add(resultMap);
}
try {
FileUtil.downloadExcel(results, response);
} catch (IOException e) {
e.printStackTrace();
log.info("PK查询导出失败--" + e.getMessage());
}
}
}
/**
* 盘点
*
* @param queryCondition
* @return
*/
@RequestMapping("/inventoryData")
@AnonymousAccess
public PageData inventoryData(ReportQueryCondition queryCondition) {
PageData<InventoryData> pageData = new PageData<>();
pageData.setContent(new ArrayList<>());
String floor = queryCondition.getFloor();
if (StringUtils.isNotBlank(floor)) {
String url = floorUtils.getUrlByFloor(floor);
if (StringUtils.isNotBlank(url)) {
url = url + "/outer/report/inventoryData";
String result = HttpUtil.get(url+getQueryStr(queryCondition));
pageData = JSONObject.parseObject(result, PageData.class);
}
}
return pageData;
}
/**
* 外仓盘点导出
*
* @param queryCondition
* @return
*/
@RequestMapping("/inventoryData/download")
@AnonymousAccess
public void inventoryDataDownload(ReportQueryCondition queryCondition,HttpServletResponse response) {
List<InventoryData> inventoryDataList = new ArrayList<>();
int page = 0;
while (true) {
log.info(page + "");
queryCondition.setPage(page);
queryCondition.setSize(20000);
PageData<InventoryData> pageData = inventoryData(queryCondition);
if (pageData.getContent() == null || pageData.getContent().isEmpty()) {
break;
}
List<InventoryData> inventoryDatas = JSONArray.parseArray(JSONObject.toJSONString(pageData.getContent()), InventoryData.class);
inventoryDataList.addAll(inventoryDatas);
page++;
}
if (inventoryDataList != null && !inventoryDataList.isEmpty()) {
List results = new ArrayList();
for (InventoryData data : inventoryDataList) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("料箱", data.getBox());
map.put("隔口", data.getBoxPartition());
map.put("料号", data.getPartNumber());
map.put("描述", "");
//map.put("原储位",data.getOriPosName());
map.put("储位", data.getPosName());
map.put("卷数", data.getReelCount());
map.put("数量", data.getAmout());
map.put("已盘点卷数", data.getInventoryReelCount());
map.put("已盘点数量", data.getInventoryAmout());
map.put("是否匹配", data.isMatch() ? "是" : "否");
map.put("盘点人", data.getCreator());
map.put("盘点状态", InventoryStatus.getValue(data.getStatus()));
map.put("盘点批次", data.getInventoryBatch());
map.put("人工是否确认", data.isNeedInventory() ? "是" : "否");
map.put("创建时间",data.getCreateDate());
results.add(map);
}
try {
FileUtil.downloadExcel(results, response);
} catch (IOException e) {
e.printStackTrace();
log.info("PK查询导出失败--" + e.getMessage());
}
}
}
/**
* 内仓异动
*
* @param queryCondition
* @return
*/
@RequestMapping("/innerChange")
@AnonymousAccess
public PageData innerChange(ReportQueryCondition queryCondition) {
PageData<DataLog> pageData = new PageData<>();
pageData.setContent(new ArrayList<>());
String floor = queryCondition.getFloor();
if (StringUtils.isNotBlank(floor)) {
String url = floorUtils.getUrlByFloor(floor);
if (StringUtils.isNotBlank(url)) {
url = url + "/inner/report/change";
String result = HttpUtil.get(url+getQueryStr(queryCondition));
pageData = JSONObject.parseObject(result, PageData.class);
}
}
return pageData;
}
/**
* 内仓异动导出
*
* @param queryCondition
* @return
*/
@RequestMapping("/innerChange/download")
@AnonymousAccess
public void innerChangeDownload(ReportQueryCondition queryCondition,HttpServletResponse response) {
List<DataLog> dataLogList = new ArrayList<>();
int page = 0;
while (true) {
log.info(page + "");
queryCondition.setPage(page);
queryCondition.setSize(20000);
PageData<DataLog> pageData = innerChange(queryCondition);
if (pageData.getContent() == null || pageData.getContent().isEmpty()) {
break;
}
List<DataLog> dataLogs = JSONArray.parseArray(JSONObject.toJSONString(pageData.getContent()), DataLog.class);
dataLogList.addAll(dataLogs);
page++;
}
if (dataLogList != null && !dataLogList.isEmpty()) {
List results = new ArrayList();
for (DataLog dataLog : dataLogList) {
Map<String, Object> resultMap = new LinkedHashMap<>();
resultMap.put("线别", getData(dataLog.getLine()));
resultMap.put("机器", getData(dataLog.getMachineName()));
resultMap.put("站点", getData(dataLog.getTableNo()));
resultMap.put("站位", getData(dataLog.getSlot()));
resultMap.put("点位", getData(dataLog.getSubSlot()));
resultMap.put("面别", getData(dataLog.getSide()));
resultMap.put("工单号", getData(dataLog.getSourceName()));
resultMap.put("类型", getData(dataLog.getType()));
resultMap.put("料号", getData(dataLog.getPartNumber()));
resultMap.put("储位", getData(dataLog.getPosName()));
resultMap.put("数量", getData(dataLog.getNum()));
resultMap.put("时间", getData(dataLog.getCreateDate()));
resultMap.put("ID NO", getData(dataLog.getBarcode()));
resultMap.put("D/C", getData(dataLog.getDateCode()));
resultMap.put("L/C", getData(dataLog.getBatchInfo()));
resultMap.put("厂商代码", getData(dataLog.getProviderNumber()));
resultMap.put("厂商", getData(dataLog.getProvider()));
resultMap.put("状态", getData(dataLog.getStatus()));
results.add(resultMap);
}
try {
FileUtil.downloadExcel(results, response);
} catch (IOException e) {
e.printStackTrace();
log.info("PK查询导出失败--" + e.getMessage());
}
}
}
/**
* 内仓缺料
*
* @param queryCondition
* @return
*/
@RequestMapping("/innerLackPicking")
@AnonymousAccess
public PageData innerLackPicking(ReportQueryCondition queryCondition) {
PageData<OrderItemDto> pageData = new PageData<>();
pageData.setContent(new ArrayList<>());
String floor = queryCondition.getFloor();
if (StringUtils.isNotBlank(floor)) {
String url = floorUtils.getUrlByFloor(floor);
if (StringUtils.isNotBlank(url)) {
url = url + "/inner/report/lackPicking";
String result = HttpUtil.get(url+getQueryStr(queryCondition));
pageData = JSONObject.parseObject(result, PageData.class);
}
}
return pageData;
}
/**
* 内仓缺料导出
*
* @param queryCondition
* @return
*/
@RequestMapping("/innerLackPicking/download")
@AnonymousAccess
public void innerLackPickingDownload(ReportQueryCondition queryCondition,HttpServletResponse response) {
List<OrderItemDto> orderItemDtoList = new ArrayList<>();
PageData<OrderItemDto> pageData = innerLackPicking(queryCondition);
if (pageData.getContent() == null || pageData.getContent().isEmpty()) {
return;
}
List<OrderItemDto> orderItemDtos = JSONArray.parseArray(JSONObject.toJSONString(pageData.getContent()), OrderItemDto.class);
orderItemDtoList.addAll(orderItemDtos);
if (orderItemDtoList != null && !orderItemDtoList.isEmpty()) {
List results = new ArrayList();
for (OrderItemDto dto : orderItemDtoList) {
Map<String, Object> resultMap = new LinkedHashMap<>();
resultMap.put("线别", dto.getLine());
resultMap.put("工单号", dto.getOrderNo());
resultMap.put("料号", dto.getPn());
resultMap.put("机器", dto.getMachineName());
resultMap.put("站点", dto.getTableNo());
resultMap.put("站位", dto.getSlot());
resultMap.put("点位", dto.getSubSlot());
resultMap.put("面别", dto.getSide());
resultMap.put("需求卷", dto.getNeedReelCount());
results.add(resultMap);
}
try {
FileUtil.downloadExcel(results, response);
} catch (IOException e) {
e.printStackTrace();
log.info("缺料导出失败--" + e.getMessage());
}
}
}
/**
* 禁限用
*
* @param queryCondition
* @return
*/
@RequestMapping("/innerDisable")
@AnonymousAccess
public PageData innerDisable(ReportQueryCondition queryCondition) {
PageData<BarcodeDto> pageData = new PageData<>();
pageData.setContent(new ArrayList<>());
String floor = queryCondition.getFloor();
if (StringUtils.isNotBlank(floor)) {
String url = floorUtils.getUrlByFloor(floor);
if (StringUtils.isNotBlank(url)) {
url = url + "/inner/report/disable";
String result = HttpUtil.get(url+getQueryStr(queryCondition));
pageData = JSONObject.parseObject(result, PageData.class);
}
}
return pageData;
}
/**
* 内仓禁限用导出
*
* @param queryCondition
* @return
*/
@RequestMapping("/innerDisable/download")
@AnonymousAccess
public void innerDisableDownload(ReportQueryCondition queryCondition,HttpServletResponse response) {
List<BarcodeDto> barcodeDtoList = new ArrayList<>();
int page = 0;
while (true) {
log.info(page + "");
queryCondition.setPage(page);
queryCondition.setSize(200000);
PageData<BarcodeDto> pageData = innerDisable(queryCondition);
if (pageData.getContent() == null || pageData.getContent().isEmpty()) {
break;
}
List<BarcodeDto> barcodeDtos = JSONArray.parseArray(JSONObject.toJSONString(pageData.getContent()), BarcodeDto.class);
barcodeDtoList.addAll(barcodeDtos);
page++;
}
if (barcodeDtoList != null && !barcodeDtoList.isEmpty()) {
List results = new ArrayList();
for (BarcodeDto dto : barcodeDtoList) {
Map<String, Object> resultMap = new LinkedHashMap<>();
resultMap.put("ID NO", dto.getBarcode());
resultMap.put("料号", dto.getPartNumber());
resultMap.put("D/C", dto.getDateCode());
resultMap.put("L/C", dto.getBatch());
resultMap.put("厂商代码", dto.getProviderNumber());
resultMap.put("厂商", dto.getProvider());
resultMap.put("数量", dto.getAmount());
resultMap.put("禁用信息", dto.getDisableMsg());
results.add(resultMap);
}
try {
FileUtil.downloadExcel(results, response);
} catch (IOException e) {
e.printStackTrace();
log.info("禁限用导出失败--" + e.getMessage());
}
}
}
private Object getData(Object data) {
return data == null ? "" : data;
}
}
package com.neotel.smfcore.custom.lizhen.report.merge.utils;
import com.neotel.smfcore.core.device.util.DataCache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 楼层工具类
*/
@Service
public class FloorUtils {
@Autowired
private DataCache dataCache;
@Value("${forward.f2.name}")
private String forwardF2Name;
@Value("${forward.f2.url}")
private String forwardF2Url;
@Value("${forward.f3.name}")
private String forwardF3Name;
@Value("${forward.f3.url}")
private String forwardF3Url;
@Value("${forward.f5.name}")
private String forwardF5Name;
@Value("${forward.f5.url}")
private String forwardF5Url;
@Value("${forward.b15.name}")
private String forwardB15Name;
@Value("${forward.b15.url}")
private String forwardB15Url;
@PostConstruct
public void init() {
forwardF2Name = dataCache.getConfigCache("forward.f2.name", forwardF2Name);
forwardF2Url = dataCache.getConfigCache("forward.f2.url", forwardF2Url);
forwardF3Name = dataCache.getConfigCache("forward.f3.name", forwardF3Name);
forwardF3Url = dataCache.getConfigCache("forward.f3.url", forwardF3Url);
forwardF5Name = dataCache.getConfigCache("forward.f5.name", forwardF5Name);
forwardF5Url = dataCache.getConfigCache("forward.f5.url", forwardF5Url);
forwardB15Name = dataCache.getConfigCache("forward.b15.name", forwardB15Name);
forwardB15Url = dataCache.getConfigCache("forward.b15.url", forwardB15Url);
}
public Map<String, String> getAllFloor(int type) {
Map<String, String> resultMap = new LinkedHashMap<>();
if (type == 0) {
resultMap.put(forwardF2Name, forwardF2Name);
resultMap.put(forwardF3Name, forwardF3Name);
resultMap.put(forwardF5Name, forwardF5Name);
resultMap.put(forwardB15Name, forwardB15Name);
} else if (type == 1){
resultMap.put(forwardF2Name, forwardF2Name);
resultMap.put(forwardF3Name, forwardF3Name);
resultMap.put(forwardF5Name, forwardF5Name);
} else if (type == 2){
resultMap.put(forwardB15Name, forwardB15Name);
}
return resultMap;
}
public String getUrlByFloor(String floor) {
String url = "";
if (forwardF2Name.equals(floor)) {
url = forwardF2Url;
} else if (forwardF3Name.equals(floor)) {
url = forwardF3Url;
} else if (forwardF5Name.equals(floor)) {
url = forwardF5Url;
} else if (forwardB15Name.equals(floor)) {
url = forwardB15Url;
}
return url;
}
public boolean isB15(String floor){
return floor.equals(forwardB15Name);
}
}
...@@ -11,16 +11,15 @@ import com.neotel.smfcore.core.barcode.rest.bean.mapstruct.BarcodeMapper; ...@@ -11,16 +11,15 @@ import com.neotel.smfcore.core.barcode.rest.bean.mapstruct.BarcodeMapper;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager; 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.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.util.DataCache; 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.rest.bean.dto.OrderItemDto; import com.neotel.smfcore.core.order.rest.bean.dto.OrderItemDto;
import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderItemMapper; 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.ILiteOrderItemManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder; import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem; import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.bean.InventoryItem; import com.neotel.smfcore.core.storage.bean.InventoryItem;
import com.neotel.smfcore.core.storage.rest.mapstruct.StoragePosMapper;
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;
...@@ -29,6 +28,7 @@ import com.neotel.smfcore.core.system.service.po.DataLog; ...@@ -29,6 +28,7 @@ import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.InventoryData; import com.neotel.smfcore.custom.lizhen.agvBox.bean.InventoryData;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.enums.InventoryStatus; import com.neotel.smfcore.custom.lizhen.agvBox.bean.enums.InventoryStatus;
import com.neotel.smfcore.custom.lizhen.agvBox.service.manager.InventoryDataManager; import com.neotel.smfcore.custom.lizhen.agvBox.service.manager.InventoryDataManager;
import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType;
import com.neotel.smfcore.custom.lizhen.report.bean.dto.InventoryDto; import com.neotel.smfcore.custom.lizhen.report.bean.dto.InventoryDto;
import com.neotel.smfcore.custom.lizhen.report.bean.query.ReportQueryCondition; import com.neotel.smfcore.custom.lizhen.report.bean.query.ReportQueryCondition;
import com.neotel.smfcore.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
...@@ -40,11 +40,9 @@ import org.springframework.data.domain.Pageable; ...@@ -40,11 +40,9 @@ import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.*;
...@@ -74,15 +72,9 @@ public class OuterReportController { ...@@ -74,15 +72,9 @@ public class OuterReportController {
private IStoragePosManager storagePosManager; private IStoragePosManager storagePosManager;
@Autowired @Autowired
private StoragePosMapper storagePosMapper;
@Autowired
private LiteOrderCache liteOrderCache; private LiteOrderCache liteOrderCache;
@Autowired @Autowired
private OrderMapper orderMapper;
@Autowired
private DataCache dataCache; private DataCache dataCache;
@Autowired @Autowired
...@@ -115,7 +107,7 @@ public class OuterReportController { ...@@ -115,7 +107,7 @@ public class OuterReportController {
} }
Query query = QueryHelp.getQuery(queryCondition); Query query = QueryHelp.getQuery(queryCondition);
//subSourceId存的是itemId //subSourceId存的是itemId
Criteria criteria = Criteria.where("subSourceId").exists(true).and("type").is(OP.CHECKOUT); Criteria criteria = Criteria.where("subSourceId").exists(true).and("type").is(OP.CHECKOUT).and("status").is(OP_STATUS.FINISHED.name());
PageData<DataLog> pageData = new PageData<>(); PageData<DataLog> pageData = new PageData<>();
if (pageable != null) { if (pageable != null) {
pageData = dataLogManager.findByPage(query.addCriteria(criteria), pageable); pageData = dataLogManager.findByPage(query.addCriteria(criteria), pageable);
...@@ -132,6 +124,9 @@ public class OuterReportController { ...@@ -132,6 +124,9 @@ public class OuterReportController {
for (DataLog dataLog : dataLogs) { for (DataLog dataLog : dataLogs) {
dataLog.setPlantCode(plant); dataLog.setPlantCode(plant);
dataLog.setFactory(factory); dataLog.setFactory(factory);
if (StringUtils.isBlank(dataLog.getChangeType())){
dataLog.setChangeType(ExtendType.getName(dataLog.getExtendType()));
}
} }
} }
return pageData; return pageData;
...@@ -161,8 +156,8 @@ public class OuterReportController { ...@@ -161,8 +156,8 @@ public class OuterReportController {
resultMap.put("段别", getData(dataLog.getSide())); resultMap.put("段别", getData(dataLog.getSide()));
resultMap.put("数量", getData(dataLog.getNum())); resultMap.put("数量", getData(dataLog.getNum()));
resultMap.put("异动类型", getData(dataLog.getChangeType())); resultMap.put("异动类型", getData(dataLog.getChangeType()));
resultMap.put("工号", getData(null)); resultMap.put("工号", getData(dataLog.getOperator()));
resultMap.put("姓名", getData(dataLog.getCreator())); resultMap.put("姓名", getData(null));
resultMap.put("时间", getData(dataLog.getCreateDate())); resultMap.put("时间", getData(dataLog.getCreateDate()));
resultMap.put("ID NO.", getData(dataLog.getBarcode())); resultMap.put("ID NO.", getData(dataLog.getBarcode()));
resultMap.put("LOT", getData(dataLog.getBatchInfo())); resultMap.put("LOT", getData(dataLog.getBatchInfo()));
...@@ -191,6 +186,7 @@ public class OuterReportController { ...@@ -191,6 +186,7 @@ public class OuterReportController {
List<LiteOrderItem> lackItems = getLackItems(liteOrders, queryCondition); List<LiteOrderItem> lackItems = getLackItems(liteOrders, queryCondition);
if (lackItems != null && !lackItems.isEmpty()) { if (lackItems != null && !lackItems.isEmpty()) {
for (LiteOrderItem lackItem : lackItems) { for (LiteOrderItem lackItem : lackItems) {
lackItem.setPlantCode(plant);
lackItem.setFactory(factory); lackItem.setFactory(factory);
} }
} }
...@@ -262,15 +258,21 @@ public class OuterReportController { ...@@ -262,15 +258,21 @@ public class OuterReportController {
dto.setFactory(factory); dto.setFactory(factory);
//判断是否超发 //判断是否超发
if (dto.isExcess()) { if (dto.isExcess()) {
dto.setExcessOutReel(dto.getOutReelCount() - dto.getNeedReelCount()); if (dto.getTotalOutNum() - dto.getNeedNum() > 0) {
dto.setExcessOutNum(dto.getOutNum() - dto.getNeedNum()); dto.setExcessOutNum(dto.getTotalOutNum() - dto.getNeedNum());
dto.setTotalOutNum(dto.getNeedNum()); dto.setExcessOutReel(1 + dto.getOutReelCount());
}
dto.setTotalOutNum(dto.getTotalOutNum());
dto.setTotalOutReelCount(dto.getTotalOutReelCount()); dto.setTotalOutReelCount(dto.getTotalOutReelCount());
} else { } else {
if (dto.getTotalOutNum() - dto.getNeedNum() > 0) {
if (dto.getTotalOutReelCount() - dto.getNeedReelCount() > 0){
dto.setExcessOutReel(dto.getTotalOutReelCount() - dto.getNeedReelCount()); dto.setExcessOutReel(dto.getTotalOutReelCount() - dto.getNeedReelCount());
}
dto.setExcessOutNum(dto.getTotalOutNum() - dto.getNeedNum()); dto.setExcessOutNum(dto.getTotalOutNum() - dto.getNeedNum());
} }
} }
}
return resultData; return resultData;
} }
...@@ -401,6 +403,9 @@ public class OuterReportController { ...@@ -401,6 +403,9 @@ public class OuterReportController {
dataLog.setStoragePosName(dataLog.getPosName()); dataLog.setStoragePosName(dataLog.getPosName());
dataLog.setPosName(null); dataLog.setPosName(null);
} }
if (StringUtils.isBlank(dataLog.getChangeType())) {
dataLog.setChangeType(ExtendType.getName(dataLog.getExtendType()));
}
} }
} }
return resultData; return resultData;
...@@ -432,9 +437,9 @@ public class OuterReportController { ...@@ -432,9 +437,9 @@ public class OuterReportController {
resultMap.put("Keeper", getData(dataLog.getKeeperCode())); resultMap.put("Keeper", getData(dataLog.getKeeperCode()));
resultMap.put("原始库别", getData(dataLog.getWarehouseCode())); resultMap.put("原始库别", getData(dataLog.getWarehouseCode()));
resultMap.put("目的库别", getData(null)); resultMap.put("目的库别", getData(null));
resultMap.put("事务日期", getData(dataLog.getCreator())); resultMap.put("事务日期", getData(dataLog.getCreateDate()));
resultMap.put("工号", getData(null)); resultMap.put("工号", getData(dataLog.getOperator()));
resultMap.put("姓名", getData(dataLog.getOperator())); resultMap.put("姓名", getData(null));
results.add(resultMap); results.add(resultMap);
} }
try { try {
...@@ -455,17 +460,14 @@ public class OuterReportController { ...@@ -455,17 +460,14 @@ public class OuterReportController {
public PageData inventory(ReportQueryCondition queryCondition, Query query, Pageable pageable) { public PageData inventory(ReportQueryCondition queryCondition, Query query, Pageable pageable) {
posMap.clear(); posMap.clear();
countMap.clear(); countMap.clear();
if (queryCondition != null) {
query = QueryHelp.getQuery(queryCondition);
query.addCriteria(Criteria.where("posName").exists(true).ne("").and("partNumber").nin(Arrays.asList("CS", "CM", "CB")));
} else {
if (posMap == null || posMap.isEmpty()) {
List<StoragePos> storagePosList = storagePosManager.findNotEmptyPosName(); List<StoragePos> storagePosList = storagePosManager.findNotEmptyPosName();
for (StoragePos pos : storagePosList) { for (StoragePos pos : storagePosList) {
Barcode barcode = pos.getBarcode(); Barcode barcode = pos.getBarcode();
posMap.put(barcode.getBarcode(), pos); posMap.put(barcode.getBarcode(), pos);
} }
} if (queryCondition != null) {
query = QueryHelp.getQuery(queryCondition);
query.addCriteria(Criteria.where("posName").exists(true).ne("").and("partNumber").nin(Arrays.asList("CS", "CM", "CB")));
} }
PageData<InventoryDto> resultData = new PageData<>(); PageData<InventoryDto> resultData = new PageData<>();
PageData<Barcode> data = barcodeManager.findByPage(query, pageable); PageData<Barcode> data = barcodeManager.findByPage(query, pageable);
...@@ -486,15 +488,18 @@ public class OuterReportController { ...@@ -486,15 +488,18 @@ public class OuterReportController {
StoragePos pos = null; StoragePos pos = null;
if (posMap.get(newPosName) != null) { if (posMap.get(newPosName) != null) {
pos = posMap.get(newPosName); pos = posMap.get(newPosName);
} else { } /*else {
pos = storagePosManager.getByBarcode(newPosName); pos = storagePosManager.getByBarcode(newPosName);
if (pos == null) { if (pos == null) {
pos = new StoragePos(); pos = new StoragePos();
posMap.put(newPosName, pos); posMap.put(newPosName, pos);
} }
} }*/
//获取隔口信息 //获取隔口信息
if (countMap.get(posName) == null) { if (countMap.get(posName) == null) {
if (pos == null){
pos = new StoragePos();
}
Barcode pidBarcode = pos.getBarcode(); Barcode pidBarcode = pos.getBarcode();
if (pidBarcode == null) { if (pidBarcode == null) {
pidBarcode = barcodeManager.findByBarcode(newPosName); pidBarcode = barcodeManager.findByBarcode(newPosName);
...@@ -618,8 +623,8 @@ public class OuterReportController { ...@@ -618,8 +623,8 @@ public class OuterReportController {
result.add(dto.getDisableMsg()); result.add(dto.getDisableMsg());
result.add(dto.getFirstPutInDate()); result.add(dto.getFirstPutInDate());
result.add(dto.getPutInDate()); result.add(dto.getPutInDate());
result.add("");
result.add(dto.getCreator()); result.add(dto.getCreator());
result.add("");
result.add(dto.getSource()); result.add(dto.getSource());
results.add(result); results.add(result);
} }
...@@ -777,14 +782,41 @@ public class OuterReportController { ...@@ -777,14 +782,41 @@ public class OuterReportController {
if (orderItems != null && !orderItems.isEmpty()) { if (orderItems != null && !orderItems.isEmpty()) {
if (!liteOrder.isClosed() && liteOrder.isConfirmExcess() && !liteOrder.isOutTails()) { if (!liteOrder.isClosed() && liteOrder.isConfirmExcess() && !liteOrder.isOutTails()) {
for (LiteOrderItem orderItem : orderItems) { for (LiteOrderItem orderItem : orderItems) {
orderItem.setExcess(liteOrder.isExcess());
String pn = orderItem.getPn(); String pn = orderItem.getPn();
//判断料号是否存在
if (StringUtils.isNotBlank(queryCondition.getPn())) {
if (!queryCondition.getPn().equals(pn)) {
continue;
}
}
//判断库别是否存在
if (StringUtils.isNotBlank(queryCondition.getWarehouseCode())) {
if (!queryCondition.getWarehouseCode().equals(orderItem.getWarehouseCode())) {
continue;
}
}
//判断楼层是否存在
if (StringUtils.isNotBlank(queryCondition.getLine())) {
if (!queryCondition.getLine().equals(orderItem.getLine())) {
continue;
}
}
//判断工单号是否存在
if (StringUtils.isNotBlank(queryCondition.getOrderNo())) {
if (!queryCondition.getOrderNo().equals(orderItem.getOrderNo())) {
continue;
}
}
if (StringUtils.isNotBlank(queryCondition.getMo())) {
if (!queryCondition.getMo().equals(orderItem.getMo())) {
continue;
}
}
//1 先判断是否有库存 //1 先判断是否有库存
InventoryItem inventoryItem = inventory.get(pn); InventoryItem inventoryItem = inventory.get(pn);
if (inventoryItem == null) { if (inventoryItem == null) {
orderItem.setLackNum(orderItem.getNeedNum()); inventoryItem = new InventoryItem();
orderItem.setLackReel(orderItem.getNeedReelCount());
items.add(orderItem);
continue;
} }
//2 计算每一个partNumber的数量 //2 计算每一个partNumber的数量
...@@ -795,68 +827,44 @@ public class OuterReportController { ...@@ -795,68 +827,44 @@ public class OuterReportController {
} else { } else {
pnAmount = partNumberAmount.get(pn); pnAmount = partNumberAmount.get(pn);
} }
if (pnAmount == 0 || !liteOrder.isExcess()) {
//3 处理不是超发 orderItem.setLackNum(orderItem.getNeedNum() - orderItem.getTotalOutNum());
if (!liteOrder.isExcess()) { orderItem.setLackReel(orderItem.getNeedReelCount() - orderItem.getTotalOutReelCount());
int needNum = orderItem.getNeedNum() - orderItem.getTotalOutNum(); if (orderItem.getLackNum() > 0 || orderItem.getLackReel() > 0) {
int needNumReel = needNum / pnAmount; items.add(orderItem);
if (needNumReel <= (orderItem.getTotalOutReelCount() - orderItem.getNeedReelCount())) {
needNumReel = orderItem.getNeedReelCount();
} }
//判断是否全部已出数量大于需要出库的数量,如果有,则跳过
if (orderItem.getTotalOutReelCount() >= needNumReel) {
continue; continue;
} }
//判断是不是超发情况
if (liteOrder.isExcess()) {
boolean isLack = false;
//先判断是否满足盘数
int needReelCount = orderItem.getNeedReelCount() - orderItem.getOutReelCount();
if (needReelCount >= 0) {
int avaiReel = inventoryItem.getStockReel() - inventoryItem.getLockReel() - inventoryItem.getBindReel(); //可用盘数 int avaiReel = inventoryItem.getStockReel() - inventoryItem.getLockReel() - inventoryItem.getBindReel(); //可用盘数
avaiReel = avaiReel < 0 ? 0 : avaiReel; avaiReel = avaiReel < 0 ? 0 : avaiReel;
if (avaiReel - needNumReel < 0) { if (avaiReel - needReelCount < 0) {
int lackReel = orderItem.getNeedReelCount() - (avaiReel - (avaiReel - needNumReel)); isLack = true;
int lackNum = orderItem.getNeedNum() - (avaiReel - (avaiReel - needNumReel)) * pnAmount; orderItem.setLackReel(needReelCount - avaiReel);
orderItem.setLackReel(lackReel);
orderItem.setLackNum(lackNum);
items.add(orderItem);
} else {
inventoryItem.setBindReel(inventoryItem.getBindReel() + needNumReel);
inventory.put(pn, inventoryItem);
} }
inventoryItem.setBindReel(needReelCount);
inventory.put(pn, inventoryItem);
} }
//4 超发情况 //再判断是否满足数量
else {
int needNum = orderItem.getNeedNum() - orderItem.getOutNum(); int needNum = orderItem.getNeedNum() - orderItem.getOutNum();
int needNumReel = needNum / pnAmount; if (needNum > 0) {
int needReel = orderItem.getNeedReelCount() - orderItem.getOutReelCount(); int needNumReel = (int) Math.ceil(needNum / pnAmount);
//先判断是否满足数量 needNumReel = needNumReel == 0 ? needNumReel + 1 : needNumReel;
if (needNumReel <= 0 && needReel <= 0) {
continue;
} else {
//判断可用需求数量
if (needNumReel > 0) {
int avaiReel = inventoryItem.getStockReel() - inventoryItem.getLockReel() - inventoryItem.getBindReel(); //可用盘数 int avaiReel = inventoryItem.getStockReel() - inventoryItem.getLockReel() - inventoryItem.getBindReel(); //可用盘数
avaiReel = avaiReel < 0 ? 0 : avaiReel; if (needNumReel - avaiReel > 0) {
if (avaiReel - needNumReel < 0) { isLack = true;
//int lackReel = orderItem.getNeedReelCount() - (avaiReel - (avaiReel - needNumReel)); orderItem.setLackNum(needNum - avaiReel * pnAmount);
int lackNum = orderItem.getNeedNum() - (avaiReel - (avaiReel - needNumReel)) * pnAmount;
orderItem.setLackReel(orderItem.getNeedReelCount());
orderItem.setLackNum(lackNum);
items.add(orderItem);
continue;
} else {
inventoryItem.setBindReel(inventoryItem.getBindReel() + needNumReel);
inventory.put(pn, inventoryItem);
} }
} inventoryItem.setBindReel(needNumReel);
//判断需求盘数
if (needReel > 0) {
int avaiReel = inventoryItem.getStockReel() - inventoryItem.getLockReel() - inventoryItem.getBindReel(); //可用盘数
avaiReel = avaiReel < 0 ? 0 : avaiReel;
if (avaiReel - needReel < 0) {
orderItem.setLackReel(-(avaiReel - needReel));
items.add(orderItem);
} else {
inventoryItem.setBindReel(inventoryItem.getBindReel() + needNumReel);
inventory.put(pn, inventoryItem); inventory.put(pn, inventoryItem);
} }
} if (isLack){
items.add(orderItem);
} }
} }
} }
......
...@@ -448,6 +448,11 @@ public class PanaApiController extends BaseSmfApiListener { ...@@ -448,6 +448,11 @@ public class PanaApiController extends BaseSmfApiListener {
} }
} }
@Override
public void outTaskStatusChange(String outNotifyUrl, List<DataLog> dataLogList) {
}
/** /**
* 入库完成通知 * 入库完成通知
......
...@@ -20,6 +20,7 @@ import org.springframework.stereotype.Component; ...@@ -20,6 +20,7 @@ import org.springframework.stereotype.Component;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
...@@ -70,6 +71,11 @@ public class SiemensApi extends BaseSmfApiListener { ...@@ -70,6 +71,11 @@ public class SiemensApi extends BaseSmfApiListener {
} }
} }
@Override
public void outTaskStatusChange(String outNotifyUrl, List<DataLog> dataLogList) {
}
private static boolean lotInOut(String url, String lot,int inoutType,String deviceId) { private static boolean lotInOut(String url, String lot,int inoutType,String deviceId) {
//String url=config.url; //String url=config.url;
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN"> <configuration status="WARN">
<Properties> <Properties>
<Property name="LOG_HOME">logs</Property> <Property name="LOG_HOME">D:/Smflogs</Property>
<Property name="LOG_NAME">smf.txt</Property> <Property name="LOG_NAME">smf.txt</Property>
</Properties> </Properties>
<appenders> <appenders>
......
...@@ -264,7 +264,7 @@ smfcore.error.virtualOut.noItem=\u5DE5\u5355{0}\u4E2D\u672A\u627E\u5230\u5BF9\u5 ...@@ -264,7 +264,7 @@ smfcore.error.virtualOut.noItem=\u5DE5\u5355{0}\u4E2D\u672A\u627E\u5230\u5BF9\u5
smfcore.error.mimo.outFial=\u672A\u627E\u5230\u53EF\u51FA\u5E93\u7684\u7269\u6599 smfcore.error.mimo.outFial=\u672A\u627E\u5230\u53EF\u51FA\u5E93\u7684\u7269\u6599
smfcore.error.getMaterialLot.in=\u6761\u7801[{0}]\u9A8C\u8BC1\u5931\u8D25\uFF0C\u65E0\u6CD5\u5165\u5E93 smfcore.error.getMaterialLot.in=\u6761\u7801[{0}]\u9A8C\u8BC1\u5931\u8D25\uFF0C\u65E0\u6CD5\u5165\u5E93
smfcore.error.getMaterialLot.out=\u6761\u7801[{0}]\u9A8C\u8BC1\u5931\u8D25\uFF0C\u65E0\u6CD5\u51FA\u5E93 smfcore.error.getMaterialLot.out=\u6761\u7801[{0}]\u9A8C\u8BC1\u5931\u8D25\uFF0C\u65E0\u6CD5\u51FA\u5E93
smfcore.error.permissionPassword = \u6743\u9650\u5BC6\u7801\u9519\u8BEF;
#smfclient.nlp.onlyOneTray=\u4E0D\u53EF\u540C\u65F6\u653E\u5165\u591A\u76D8\u7269\u6599:{0} #smfclient.nlp.onlyOneTray=\u4E0D\u53EF\u540C\u65F6\u653E\u5165\u591A\u76D8\u7269\u6599:{0}
#smfclient.nlp.cannotFindPos={0}\u672A\u627E\u5230\u5E93\u4F4D:{1} #smfclient.nlp.cannotFindPos={0}\u672A\u627E\u5230\u5E93\u4F4D:{1}
#smfclient.nlp.inputOk={0}\u5165\u5E93\u5230{1}\u6210\u529F #smfclient.nlp.inputOk={0}\u5165\u5E93\u5230{1}\u6210\u529F
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!