Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
smf-core
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 2046e95c
由
LN
编写于
2021-12-24 17:26:19 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
1. 获取库位号时若锁定库位不在请求的料仓列表中,重新查找库位。2.屏蔽空库位出库功能。
1 个父辈
3a775445
隐藏空白字符变更
内嵌
并排
正在显示
7 个修改的文件
包含
148 行增加
和
19 行删除
src/main/java/com/neotel/smfcore/common/utils/ReelLockPosUtil.java
src/main/java/com/neotel/smfcore/common/utils/UserCodeUtil.java
src/main/java/com/neotel/smfcore/core/device/handler/impl/BaseDeviceHandler.java
src/main/java/com/neotel/smfcore/core/device/rest/DeviceController.java
src/main/java/com/neotel/smfcore/core/device/util/DataCache.java
src/main/java/com/neotel/smfcore/core/system/rest/SettingsController.java
src/main/java/com/neotel/smfcore/core/system/util/TaskService.java
src/main/java/com/neotel/smfcore/common/utils/ReelLockPosUtil.java
查看文件 @
2046e95
package
com
.
neotel
.
smfcore
.
common
.
utils
;
import
com.google.common.collect.Lists
;
import
com.neotel.smfcore.core.device.util.DataCache
;
import
com.neotel.smfcore.common.bean.ReelLockPosInfo
;
import
org.apache.logging.log4j.LogManager
;
...
...
@@ -41,12 +42,18 @@ public class ReelLockPosUtil {
*
* @param reelLockPosInfo
*/
public
static
synchronized
ReelLockPosInfo
addReelLockPosInfo
(
ReelLockPosInfo
reelLockPosInfo
)
{
public
static
synchronized
ReelLockPosInfo
addReelLockPosInfo
(
ReelLockPosInfo
reelLockPosInfo
,
List
<
String
>
cidList
)
{
log
.
info
(
"为["
+
reelLockPosInfo
.
getBarcode
()
+
"]锁定库位["
+
reelLockPosInfo
.
getLockPosName
()
+
"]"
);
ReelLockPosInfo
oldLocInfo
=
reelLocKPosMap
.
get
(
reelLockPosInfo
.
getBarcode
());
if
(
oldLocInfo
!=
null
&&
oldLocInfo
.
getLockPosName
()
!=
null
)
{
log
.
info
(
"["
+
oldLocInfo
.
getBarcode
()
+
"]已有锁定库位["
+
oldLocInfo
.
getLockPosName
()
+
"],返回之前锁定的库位"
);
return
oldLocInfo
;
if
(
cidList
.
contains
(
oldLocInfo
.
getCid
())){
log
.
info
(
"["
+
oldLocInfo
.
getBarcode
()
+
"]已有锁定库位["
+
oldLocInfo
.
getLockPosName
()
+
"],返回之前锁定的库位"
);
return
oldLocInfo
;
}
else
{
//锁定库位不在cid列表中
log
.
info
(
"["
+
oldLocInfo
.
getBarcode
()
+
"]已有锁定库位["
+
oldLocInfo
.
getLockPosName
()
+
"],Cid["
+
oldLocInfo
.
getCid
()+
"]不在["
+
String
.
join
(
","
,
cidList
)+
"]中,清理原有锁定库位"
);
reelLocKPosMap
.
remove
(
reelLockPosInfo
.
getBarcode
());
}
}
for
(
ReelLockPosInfo
locInfo
:
reelLocKPosMap
.
values
())
{
if
(
locInfo
.
getLockPosId
().
equals
(
reelLockPosInfo
.
getLockPosId
())
&&
!
locInfo
.
getBarcode
().
equals
(
reelLockPosInfo
.
getBarcode
()))
{
...
...
src/main/java/com/neotel/smfcore/common/utils/UserCodeUtil.java
查看文件 @
2046e95
...
...
@@ -14,6 +14,7 @@ import java.util.List;
public
class
UserCodeUtil
{
public
static
void
main
(
String
[]
args
)
{
// FilePro();
CreateUserCode
(
);
}
public
static
void
CreateUserCode
(
)
{
...
...
@@ -114,4 +115,77 @@ public class UserCodeUtil {
log
.
info
(
"文件"
+
fileURL
+
"共解析到"
+
list
.
size
()+
"个用户"
);
return
list
;
}
// @Data
// @AllArgsConstructor
// public static class ErrorPos{
// private String riqi;
// private String shijian;
// private Integer storage;
// private String pos;
// }
// public static void FilePro(){
// try {
// String filePath = "F:\\";
// String fileName="Error.csv";
// Map<Integer,Map<String,ErrorPos>> map =new HashMap<>();
//
// CsvReader csvRead = CsvReader.newReader(filePath+fileName,"Pos","Pos");
//
// int DateIndex = getCsvIndex(csvRead,"Date","Date");
// int TimeIndex = getCsvIndex(csvRead,"Time","Time");
// int StorageIndex=getCsvIndex(csvRead,"Storage","Storage");
// int PosIndex=getCsvIndex(csvRead,"Pos","Pos");
//
// int row = 1;
// int newRowCount = 0;
// int updateRowCount = 0;
// String msg="";
// while(csvRead.readRecord()){
// row++;
// String[] lineValues = csvRead.getValues();
// String date = lineValues[DateIndex];
// String time = lineValues[TimeIndex];
// Integer storage= Convert.toInt(lineValues[StorageIndex].trim()) ;
// String pos=lineValues[PosIndex];
// if( pos.isEmpty()){
// log.warn("第"+row+"行中有空白内容,此行忽略");
// continue;
// }
// Map<String,ErrorPos> sMap=map.get(storage );
// if(sMap==null){
// sMap=new HashMap<>();
// }
// sMap.put(pos,new ErrorPos(date,time,storage,pos));
// map.put(storage,sMap);
// }
// log.info("文件"+filePath+fileName+"共解析到"+ map.size()+"数据");
//
// String targetFile=filePath+"更新后_"+fileName;
// if(FileUtil.exist(targetFile)){
// FileUtil.del(targetFile);
// }
// //重新保存
// CsvWriter writer=new CsvWriter(targetFile);
//
// String[] headers=new String[]{"日期","时间", "料仓", "库位"};
// writer.writeRecord(headers);
// for (Integer key :
// map.keySet()) {
// Map<String,ErrorPos> sMap=map.get(key );
// for (ErrorPos pos :
// sMap.values()) {
// String[] userStr=new String[]{pos.getRiqi(),pos.getShijian(),pos.getStorage().toString(),pos.getPos() };
//
// writer.writeRecord(userStr);
// }
// }
//
// writer.flush();
// writer.close();
// log.info("保存新用户信息到文件:"+filePath+"更新后_"+fileName);
// } catch (Exception ex) {
// log.error("出错:" + ex.toString());
// }
// }
}
src/main/java/com/neotel/smfcore/core/device/handler/impl/BaseDeviceHandler.java
查看文件 @
2046e95
...
...
@@ -649,7 +649,11 @@ public class BaseDeviceHandler implements IDeviceHandler {
Barcode
barcode
=
storagePos
.
getBarcode
();
if
(
barcode
==
null
)
{
log
.
warn
(
"任务:"
+
task
.
getId
()
+
" 仓位:"
+
task
.
getPosId
()
+
" 的 Barcode 为null, 之前可能处理过直接返回"
);
log
.
warn
(
"任务:"
+
task
.
getId
()
+
" 仓位:"
+
task
.
getPosId
()
+
" 的 Barcode 为null, 之前可能处理过,结束任务后直接返回"
);
//记录日志
task
.
setStatus
(
OP_STATUS
.
FINISHED
.
name
());
taskService
.
updateFinishedTask
(
task
);
return
;
}
...
...
@@ -771,10 +775,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
* @return
*/
protected
boolean
openLightGuide
(){
OrderSetting
orderSetting
=
dataCache
.
getCache
(
Constants
.
CACHE_OrderSetting
);
if
(
orderSetting
!=
null
&&
orderSetting
.
getShelfLightType
().
equals
(
1
)){
return
true
;
}
OrderSetting
orderSetting
=
dataCache
.
getOrderSetting
();
return
false
;
}
...
...
src/main/java/com/neotel/smfcore/core/device/rest/DeviceController.java
查看文件 @
2046e95
...
...
@@ -127,6 +127,7 @@ public class DeviceController {
resultMap
.
put
(
"msg"
,
"未指定料仓 cids "
);
}
else
{
List
<
Storage
>
storageList
=
Lists
.
newArrayList
();
List
<
String
>
cidList
=
Lists
.
newArrayList
();
for
(
String
cid:
cids
.
split
(
","
))
{
String
notIntoCids
=
dataCahche
.
getSettings
().
getNotIntoCids
();
if
(
notIntoCids
!=
null
){
...
...
@@ -138,6 +139,7 @@ public class DeviceController {
Storage
storage
=
dataCahche
.
getStorage
(
cid
);
if
(
storage
!=
null
){
storageList
.
add
(
storage
);
cidList
.
add
(
cid
);
}
}
if
(
storageList
.
isEmpty
()){
...
...
@@ -241,7 +243,7 @@ public class DeviceController {
reelLocInfo
.
setLockPosName
(
pos
.
getPosName
());
reelLocInfo
.
setLockPosId
(
pos
.
getId
());
reelLocInfo
=
ReelLockPosUtil
.
addReelLockPosInfo
(
reelLocInfo
);
reelLocInfo
=
ReelLockPosUtil
.
addReelLockPosInfo
(
reelLocInfo
,
cidList
);
if
(
reelLocInfo
==
null
){
errorMsg
=
"库位已被锁定,暂停入库"
;
lineMsg
=
errorMsg
;
...
...
src/main/java/com/neotel/smfcore/core/device/util/DataCache.java
查看文件 @
2046e95
...
...
@@ -16,6 +16,7 @@ import com.neotel.smfcore.core.language.util.MessageUtils;
import
com.neotel.smfcore.core.storage.bean.InventoryItem
;
import
com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE
;
import
com.neotel.smfcore.core.storage.service.po.StoragePos
;
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.ISettingsDao
;
import
com.neotel.smfcore.core.barcode.bean.PlateSizeBean
;
...
...
@@ -105,6 +106,14 @@ public class DataCache {
return
null
;
}
public
OrderSetting
getOrderSetting
()
{
OrderSetting
orderSetting
=
getCache
(
Constants
.
CACHE_OrderSetting
);
if
(
orderSetting
==
null
)
{
orderSetting
=
new
OrderSetting
();
}
return
orderSetting
;
}
public
List
<
LanguageInfo
>
getLanguageList
(){
List
<
LanguageInfo
>
lanList
=
getCache
(
Constants
.
CACHE_languageType
);
if
(
lanList
==
null
||
lanList
.
size
()
<=
0
)
{
...
...
src/main/java/com/neotel/smfcore/core/system/rest/SettingsController.java
查看文件 @
2046e95
...
...
@@ -164,10 +164,7 @@ public class SettingsController {
@GetMapping
(
"/order"
)
@PreAuthorize
(
"@el.check('orderSetting')"
)
public
OrderSetting
getOrderSetting
()
{
OrderSetting
orderSetting
=
dataCache
.
getCache
(
Constants
.
CACHE_OrderSetting
);
if
(
orderSetting
==
null
)
{
orderSetting
=
new
OrderSetting
();
}
OrderSetting
orderSetting
=
dataCache
.
getOrderSetting
();
orderSetting
.
setShowLightType
(
false
);
//判断是否有料架
List
<
Storage
>
storages
=
new
ArrayList
<>(
dataCache
.
getAllStorage
().
values
());
...
...
@@ -203,6 +200,23 @@ public class SettingsController {
throw
new
ValidateException
(
"smfcore.valueCanotNull"
,
"{0}不能为空"
,
new
String
[]{
"SO"
});
}
//判断文件夹是否正确
if
(
ObjectUtil
.
isNotEmpty
(
orderSetting
.
getOrderDir
())){
File
file
=
new
File
(
orderSetting
.
getOrderDir
());
if
(
file
.
exists
()&&
file
.
isDirectory
()){
}
else
{
//判断是不是远程文件夹
if
(
orderSetting
.
getOrderDir
().
toLowerCase
().
startsWith
(
"smb"
)){
}
else
{
throw
new
ValidateException
(
"smfcore.enterCorrectFolder"
,
"请输入正确的文件夹"
);
}
}
}
dataCache
.
updateCache
(
Constants
.
CACHE_OrderSetting
,
orderSetting
);
log
.
info
(
"更改工单设置:"
+
Constants
.
CACHE_OrderSetting
+
"="
+
orderSetting
.
toString
());
return
ResultBean
.
newOkResult
(
"保存成功"
);
...
...
@@ -220,10 +234,8 @@ public class SettingsController {
try
{
List
<
Map
<
String
,
Object
>>
maps
=
new
ArrayList
<>();
List
<
String
>
titles
=
new
ArrayList
<>();
OrderSetting
orderSetting
=
dataCache
.
getCache
(
Constants
.
CACHE_OrderSetting
);
if
(
orderSetting
==
null
)
{
orderSetting
=
new
OrderSetting
();
}
OrderSetting
orderSetting
=
dataCache
.
getOrderSetting
();
titles
.
add
(
orderSetting
.
getPn
()
);
titles
.
add
(
orderSetting
.
getFeeder
());
titles
.
add
((
orderSetting
.
getQty
()));
...
...
src/main/java/com/neotel/smfcore/core/system/util/TaskService.java
查看文件 @
2046e95
...
...
@@ -107,6 +107,24 @@ public class TaskService {
String
msg
=
"库位["
+
pos
.
getPosName
()
+
"]中已无物料,忽略"
;
log
.
info
(
msg
);
throw
new
ValidateException
(
"smfcore.allBoxView.noReel"
,
"库位{0}中无物料"
,
new
String
[]{
pos
.
getPosName
()});
// Barcode barcode=new Barcode();
// SimpleDateFormat formatter= new SimpleDateFormat("HHmmss");
// Date date = new Date(System.currentTimeMillis());
// barcode.setBarcode("EO-"+formatter.format(date)+pos.getId());
// log.info("库位[" + pos.getPosName() + "]中已无物料,空出,模拟条码:"+barcode.getBarcode());
// barcode.setHeight(pos.getH());
// barcode.setPlateSize(pos.getW());
// barcode.setAmount(999);
// DataLog task = new DataLog(storage, barcode, pos);
// task.setType(OP.CHECKOUT);
// task.setPutInDate(barcode.getPutInDate());
// task.setStatus(OP_STATUS.WAIT.name());
// task.setSingleOut(isSingleOut);
// task.setOperator(opUserName);
// addTaskToExecute(task);
// return "";
}
DataLog
task
=
new
DataLog
(
storage
,
pos
.
getBarcode
(),
pos
);
...
...
@@ -541,10 +559,12 @@ public class TaskService {
public
StoragePos
findEmptyPosForPutIn
(
List
<
Storage
>
storageList
,
Barcode
barcode
,
String
inRFID
,
String
lastPosId
)
throws
ValidateException
{
verifyBarcodePutIn
(
storageList
,
barcode
,
inRFID
);
List
<
String
>
storageIds
=
new
ArrayList
<>();
//查找任务数最少的料仓
final
Map
<
String
,
Integer
>
storageTaskCountMap
=
new
HashMap
<>();
for
(
Storage
storage
:
storageList
)
{
storageTaskCountMap
.
put
(
storage
.
getId
(),
0
);
storageIds
.
add
(
storage
.
getId
());
}
Set
<
String
>
hasOutTaskStorageIds
=
new
HashSet
<>();
...
...
@@ -578,7 +598,11 @@ public class TaskService {
pos
=
storagePosManager
.
get
(
lockPosId
);
if
(
pos
!=
null
)
{
if
(
pos
.
getW
()
<
barcode
.
getPlateSize
()
||
pos
.
getH
()
<
barcode
.
getHeight
())
{
if
(!
storageIds
.
contains
(
pos
.
getStorageId
())){
log
.
info
(
"条码["
+
barcode
.
getBarcode
()
+
"]已有锁定库位["
+
pos
.
getPosName
()
+
"],料仓ID["
+
pos
.
getStorageId
()+
"]不在请求列表["
+
String
.
join
(
","
,
storageIds
)+
"]中,重新查找库位"
);
pos
=
null
;
}
else
if
(
pos
.
getW
()
<
barcode
.
getPlateSize
()
||
pos
.
getH
()
<
barcode
.
getHeight
())
{
log
.
info
(
"条码["
+
barcode
.
getBarcode
()
+
"]尺寸已改变,无法放入已锁定库位["
+
pos
.
getPosName
()
+
"],重新查找库位"
);
pos
=
null
;
}
else
{
...
...
@@ -881,7 +905,6 @@ public class TaskService {
CHECKOUT_TYPE
checkoutType
=
dataCache
.
getCheckOutType
();
List
<
String
>
availableStorageIds
=
dataCache
.
getAvailableStorageIds
();
Collection
<
String
>
excludePosIds
=
excludePosIds
();
//其他出库模式一次性全部生成任务
for
(
TacticsOutDto
item
:
tacticsOutDtos
)
{
...
...
@@ -890,6 +913,7 @@ public class TaskService {
String
partNumber
=
item
.
getPartNumber
();
for
(
int
i
=
1
;
i
<=
item
.
getPlateNumber
();
i
++)
{
Collection
<
String
>
excludePosIds
=
excludePosIds
();
StoragePos
pos
=
null
;
if
(
item
.
getStorageId
()
!=
null
)
{
String
[]
storageIds
=
new
String
[]{
item
.
getStorageId
()};
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论