Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
SmdBox
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit fb24f881
由
张少辉
编写于
2026-01-13 14:12:46 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
阳光电源新功能修改
1 个父辈
89d31afe
隐藏空白字符变更
内嵌
并排
正在显示
14 个修改的文件
包含
456 行增加
和
53 行删除
myproject/src/main/java/com/myproject/bean/update/DataLog.java
myproject/src/main/java/com/myproject/util/BarcodeRule.java
myproject/src/main/java/com/myproject/util/HttpHelper.java
myproject/src/main/java/com/myproject/webapp/controller/storage/AccShelfController.java
myproject/src/main/java/com/myproject/webapp/controller/storage/NLPShelfController.java
myproject/src/main/java/com/myproject/webapp/controller/webService/ITaskService.java
myproject/src/main/java/com/myproject/webapp/controller/webService/StorageDataController.java
myproject/src/main/java/com/myproject/webapp/controller/webService/TaskService.java
myproject/src/main/resources/ApplicationResources_zh.properties
myproject/src/main/webapp/WEB-INF/pages/component/storagePosFind.jsp
myproject/src/main/webapp/WEB-INF/pages/storage/accShelf.jsp
myproject/src/main/webapp/WEB-INF/pages/storage/allBoxView.jsp
myproject/src/main/webapp/WEB-INF/pages/storage/nlpShelf.jsp
myproject/src/main/webapp/resources/admin/Barcode.csv
myproject/src/main/java/com/myproject/bean/update/DataLog.java
查看文件 @
fb24f88
...
...
@@ -118,6 +118,26 @@ public class DataLog extends BaseMongoBean /*implements Comparable<DataLog>*/ {
*/
private
int
mixTime
;
private
String
checkType
;
private
String
workOrderNumber
;
public
String
getCheckType
()
{
return
checkType
;
}
public
void
setCheckType
(
String
checkType
)
{
this
.
checkType
=
checkType
;
}
public
String
getWorkOrderNumber
()
{
return
workOrderNumber
;
}
public
void
setWorkOrderNumber
(
String
workOrderNumber
)
{
this
.
workOrderNumber
=
workOrderNumber
;
}
public
String
getStorageName
()
{
return
storageName
;
}
...
...
myproject/src/main/java/com/myproject/util/BarcodeRule.java
查看文件 @
fb24f88
...
...
@@ -96,9 +96,9 @@ public class BarcodeRule {
if
(!
Strings
.
isNullOrEmpty
(
ruleStr
)){
//先去除[prefix,length,suffix]这样的配置字段
String
canSplitStr
=
ruleStr
.
replaceAll
(
"DATE.*?\\]"
,
""
);
//
String canSplitStr =ruleStr.replaceAll("DATE.*?\\]","");
canSplitStr
=
canSplit
Str
.
replaceAll
(
"\\[[^\\]]*?\\]"
,
""
);
String
canSplitStr
=
rule
Str
.
replaceAll
(
"\\[[^\\]]*?\\]"
,
""
);
//先找分割符,分割出来数组数量最多的放第一个
String
trySeparator
=
""
;
//找最多的字符
...
...
@@ -173,7 +173,7 @@ public class BarcodeRule {
}
}
if
(!
newRule
.
expireDate_item
.
matchRule
(
fieldValue
,
i
)){
if
(!
newRule
.
expireDate_item
.
hasThisField
(
)){
if
(
newRule
.
expireDate_item
.
matchRule
(
fieldValue
,
i
)){
log
.
info
(
"expireDate: 为"
+
newRule
.
expireDate_item
.
toString
());
}
...
...
@@ -507,7 +507,27 @@ public class BarcodeRule {
}
}
Date
produceDate
=
produceDate_item
.
getDateValue
(
codeArr
);
Date
produceDate
=
null
;
if
(
produceDate_item
.
hasThisField
()){
produceDate
=
produceDate_item
.
getDateValue
(
codeArr
);
if
(
produceDate
==
null
){
log
.
info
(
"解析生产日期出错"
);
codeBean
.
setError
(
"error.barcode.noField"
,
new
String
[]{
"produceDate"
},
"条码解析失败,生产日期格式错误"
);
return
codeBean
;
}
}
Date
expireDate
=
null
;
if
(
expireDate_item
.
hasThisField
()){
expireDate
=
expireDate_item
.
getDateValue
(
codeArr
);
if
(
expireDate
==
null
){
log
.
info
(
"解析过期日期出错"
);
codeBean
.
setError
(
"error.barcode.noField"
,
new
String
[]{
"produceDate"
},
"条码解析失败,过期日期格式错误"
);
return
codeBean
;
}
}
/*Date produceDate= produceDate_item.getDateValue(codeArr);
Date expireDate= expireDate_item.getDateValue(codeArr);
if(produceDate != null && expireDate == null){
Calendar c = Calendar.getInstance();
...
...
@@ -530,7 +550,7 @@ public class BarcodeRule {
if(hasExpire){
expireDate = c.getTime();
}
}
}
*/
String
supplier
=
supplier_item
.
getStrValue
(
codeArr
);
String
msl
=
msl_item
.
getStrValue
(
codeArr
);
...
...
@@ -633,8 +653,8 @@ public class BarcodeRule {
//803
//rule = "PN[6:0:-1],EXPDATEyyyy-MM-dd[-1:0:-1],BATCH,RI";
//codeStr = "ALPHA OL107E,2021-11-11,00714026Z,002";
codeStr
=
"LOCTITE3609,20
200930
,001"
;
rule
=
"PN,
EXPDATEyy
yyMMdd,RI"
;
codeStr
=
"LOCTITE3609,20
1212
,001"
;
rule
=
"PN,
PRODATE
yyMMdd,RI"
;
BarcodeRule
br
=
BarcodeRule
.
newRule
(
rule
);
Barcode
b
=
br
.
toCodeBean
(
codeStr
).
getBarcode
();
...
...
myproject/src/main/java/com/myproject/util/HttpHelper.java
查看文件 @
fb24f88
...
...
@@ -41,7 +41,7 @@ public class HttpHelper {
return
postJson
(
url
,
params
,
null
,
"http"
);
}
public
static
String
get
(
String
url
,
HashMap
<
String
,
String
>
params
)
throws
Api
Exception
{
public
static
String
get
(
String
url
,
Map
<
String
,
Object
>
params
)
throws
ApiException
,
URI
Exception
{
return
get
(
url
,
params
,
null
,
"http"
);
}
...
...
@@ -229,8 +229,8 @@ public class HttpHelper {
* 请求协议 "http" / "https"
* @return 服务器响应的请求结果
*/
public
static
String
get
(
String
url
,
HashMap
<
String
,
String
>
params
,
HashMap
<
String
,
String
>
cookies
,
String
protocol
)
throws
Api
Exception
{
public
static
String
get
(
String
url
,
Map
<
String
,
Object
>
params
,
HashMap
<
String
,
String
>
cookies
,
String
protocol
)
throws
ApiException
,
URI
Exception
{
// if (protocol.equalsIgnoreCase("https")) {
// Protocol httpsProtocol = new Protocol("https", new SecureProtocolSocketFactoryImpl(), 443);
// Protocol.registerProtocol("https", httpsProtocol);
...
...
@@ -242,12 +242,18 @@ public class HttpHelper {
// 设置请求参数
if
(
params
!=
null
&&
!
params
.
isEmpty
())
{
// ========== 修改1:迭代器类型从 Entry<String,String> 改为 Entry<String,Object> ==========
NameValuePair
[]
data
=
new
NameValuePair
[
params
.
size
()];
Iterator
<
Entry
<
String
,
String
>>
iterator
=
params
.
entrySet
().
iterator
();
Iterator
<
Entry
<
String
,
Object
>>
iterator
=
params
.
entrySet
().
iterator
();
int
i
=
0
;
while
(
iterator
.
hasNext
())
{
Entry
<
String
,
String
>
entry
=
iterator
.
next
();
data
[
i
]
=
new
NameValuePair
(
entry
.
getKey
(),
entry
.
getValue
());
Entry
<
String
,
Object
>
entry
=
iterator
.
next
();
String
key
=
entry
.
getKey
();
// ========== 修改2:处理 Object 类型的 value 转为 String ==========
Object
valueObj
=
entry
.
getValue
();
String
value
=
convertObjectToString
(
valueObj
);
data
[
i
]
=
new
NameValuePair
(
key
,
value
);
++
i
;
}
getMethod
.
setQueryString
(
data
);
...
...
@@ -461,4 +467,17 @@ public class HttpHelper {
throw
new
ApiException
(
"Request ["
+
url
+
"] failed:"
+
e
.
getMessage
());
}
}
// ========== 新增工具方法:Object转String(处理Date等类型) ==========
private
static
String
convertObjectToString
(
Object
valueObj
)
{
if
(
valueObj
==
null
)
{
return
""
;
}
// 处理Date类型(按你的业务格式格式化,这里用yyyyMMdd示例)
if
(
valueObj
instanceof
Date
)
{
return
new
java
.
text
.
SimpleDateFormat
(
"yyyyMMdd"
).
format
((
Date
)
valueObj
);
}
// 其他类型直接调用toString(数字、布尔、字符串等都适用)
return
valueObj
.
toString
();
}
}
myproject/src/main/java/com/myproject/webapp/controller/storage/AccShelfController.java
查看文件 @
fb24f88
...
...
@@ -171,6 +171,8 @@ public class AccShelfController extends BaseController {
public
String
putInCode
(
HttpServletRequest
request
){
final
String
cid
=
request
.
getParameter
(
"cid"
);
String
code
=
request
.
getParameter
(
"code"
);
String
workOrderNumber
=
request
.
getParameter
(
"workOrderNumber"
);
String
checkType
=
request
.
getParameter
(
"checkType"
);
StoragePos
lastPutinPos
=
lastPutinPosMap
.
get
(
cid
);
Storage
storage
=
dataCache
.
getStorage
(
cid
);
if
(
lastPutinPos
!=
null
){
...
...
@@ -219,7 +221,7 @@ public class AccShelfController extends BaseController {
String
color
=
"green"
;
if
(
pos
!=
null
){
log
.
info
(
barcode
.
getPartNumber
()+
" [ "
+
barcode
.
getBarcode
()+
" ] "
+
"入库到:"
+
storage
.
getName
()+
"["
+
cid
+
"] "
+
pos
.
getPosName
());
taskService
.
addTaskToFinished
(
pos
,
barcode
,
null
);
taskService
.
addTaskToFinished
(
pos
,
barcode
,
null
,
checkType
,
workOrderNumber
);
openAndCloseLights
(
storage
,
pos
.
getPosName
(),
delayCloseTime
,
color
);
lastPutinPosMap
.
put
(
cid
,
pos
);
pos
.
setCanCheckOutTime
(
System
.
currentTimeMillis
()
+
delayCloseTime
);
...
...
myproject/src/main/java/com/myproject/webapp/controller/storage/NLPShelfController.java
查看文件 @
fb24f88
...
...
@@ -79,6 +79,8 @@ public class NLPShelfController extends BaseController {
public
String
putInCode
(
HttpServletRequest
request
){
final
String
cid
=
request
.
getParameter
(
"cid"
);
String
code
=
request
.
getParameter
(
"code"
);
String
workOrderNumber
=
request
.
getParameter
(
"workOrderNumber"
);
String
checkType
=
request
.
getParameter
(
"checkType"
);
Storage
storage
=
dataCache
.
getStorage
(
cid
);
Collection
<
DataLog
>
queueTasks
=
taskService
.
getQueueTasks
();
for
(
DataLog
queueTask
:
queueTasks
)
{
...
...
@@ -121,7 +123,7 @@ public class NLPShelfController extends BaseController {
List
<
Storage
>
storageList
=
Lists
.
newArrayList
(
storage
);
StoragePos
pos
=
taskService
.
findEmptyPosForPutIn
(
storageList
,
barcode
);
if
(
pos
!=
null
){
putIn
(
StorageDataController
.
getLoginUsername
(),
storage
.
getId
(),
barcode
);
putIn
(
StorageDataController
.
getLoginUsername
(),
storage
.
getId
(),
barcode
,
workOrderNumber
,
checkType
);
return
"操作成功,请放入料架"
;
}
else
{
//库位没找到
...
...
@@ -144,7 +146,7 @@ public class NLPShelfController extends BaseController {
protected
ResultBean
putIn
(
String
loginUser
,
String
storageId
,
Barcode
barcode
)
{
protected
ResultBean
putIn
(
String
loginUser
,
String
storageId
,
Barcode
barcode
,
String
workOrderNumber
,
String
checkType
)
{
String
pn
=
barcode
.
getPartNumber
();
String
reelId
=
barcode
.
getBarcode
();
...
...
@@ -164,6 +166,8 @@ public class NLPShelfController extends BaseController {
dataLog
.
setStorageId
(
storageId
);
dataLog
.
setMemo
(
barcode
.
getMemo
());
dataLog
.
setOperator
(
loginUser
);
dataLog
.
setWorkOrderNumber
(
workOrderNumber
);
dataLog
.
setCheckType
(
checkType
);
if
(!
Strings
.
isNullOrEmpty
(
storageId
))
{
Storage
storage
=
dataCache
.
getStorageById
(
storageId
);
if
(
storage
!=
null
)
{
...
...
myproject/src/main/java/com/myproject/webapp/controller/webService/ITaskService.java
查看文件 @
fb24f88
...
...
@@ -66,6 +66,8 @@ public interface ITaskService {
*/
String
checkout
(
StoragePos
pos
,
String
subSourceId
,
boolean
isSingleOut
);
String
checkout
(
StoragePos
pos
,
String
subSourceId
,
boolean
isSingleOut
,
String
checkType
,
String
workOrderNumber
);
StoragePos
findEmptyPosForPutIn
(
List
<
Storage
>
storageList
,
Barcode
barcode
)
throws
ValidateException
;
//void checkOutInaction(String areaId, int day) throws ValidateException;
...
...
@@ -74,6 +76,8 @@ public interface ITaskService {
void
addTaskToFinished
(
StoragePos
pos
,
Barcode
barcode
,
String
opUser
);
void
addTaskToFinished
(
StoragePos
pos
,
Barcode
barcode
,
String
opUser
,
String
checkType
,
String
workOrderNumber
);
void
addTaskToExecute
(
DataLog
task
);
//入仓位完成
...
...
myproject/src/main/java/com/myproject/webapp/controller/webService/StorageDataController.java
查看文件 @
fb24f88
...
...
@@ -29,6 +29,7 @@ import org.springframework.security.core.Authentication;
import
org.springframework.security.core.context.SecurityContext
;
import
org.springframework.security.core.context.SecurityContextHolder
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.util.StringUtils
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMethod
;
...
...
@@ -266,7 +267,6 @@ public class StorageDataController extends BaseController {
String
isSingleOutStr
=
request
.
getParameter
(
"single"
);
boolean
isSingleOut
=
Boolean
.
valueOf
(
isSingleOutStr
);
if
(!
Strings
.
isNullOrEmpty
(
partnumber
)
||
!
Strings
.
isNullOrEmpty
(
type
)){
Storage
storage
=
dataCache
.
getStorage
(
cid
);
if
(
storage
==
null
){
...
...
@@ -303,6 +303,12 @@ public class StorageDataController extends BaseController {
}
else
{
String
checkType
=
request
.
getParameter
(
"checkType"
);
if
(
StringUtils
.
isEmpty
(
checkType
)){
return
"出库选择不能为空"
;
}
String
workOrderNumber
=
request
.
getParameter
(
"workOrderNumber"
);
String
pids
=
request
.
getParameter
(
"pids"
);
for
(
String
pid
:
pids
.
split
(
";"
)){
StoragePos
pos
=
storagePosManager
.
get
(
pid
);
...
...
@@ -311,7 +317,7 @@ public class StorageDataController extends BaseController {
}
log
.
info
(
"出库位置仓位【"
+
pos
.
getPosName
()+
"】"
);
String
outResult
=
taskService
.
checkout
(
pos
,
subSourceId
,
isSingleOut
);
String
outResult
=
taskService
.
checkout
(
pos
,
subSourceId
,
isSingleOut
,
checkType
,
workOrderNumber
);
if
(!
Strings
.
isNullOrEmpty
(
outResult
)){
return
"1"
+
outResult
;
}
...
...
myproject/src/main/java/com/myproject/webapp/controller/webService/TaskService.java
查看文件 @
fb24f88
...
...
@@ -1463,7 +1463,7 @@ public class TaskService implements ITaskService {
}
@Override
public
synchronized
String
checkout
(
StoragePos
pos
,
String
subSourceId
,
boolean
isSingleOut
){
public
synchronized
String
checkout
(
StoragePos
pos
,
String
subSourceId
,
boolean
isSingleOut
,
String
checkType
,
String
workOrderNumber
){
Barcode
barcode
=
pos
.
getBarcode
();
if
(
barcode
!=
null
){
...
...
@@ -1495,6 +1495,8 @@ public class TaskService implements ITaskService {
task
.
setType
(
StorageConstants
.
OP
.
CHECKOUT
);
task
.
setStatus
(
StorageConstants
.
OP_STATUS
.
WAIT
.
name
());
task
.
setSingleOut
(
isSingleOut
);
task
.
setWorkOrderNumber
(
workOrderNumber
);
task
.
setCheckType
(
checkType
);
//工单出库任务
if
(!
Strings
.
isNullOrEmpty
(
subSourceId
)){
LiteOrderItem
liteOrderItem
=
liteOrderItemDao
.
findOneById
(
subSourceId
);
...
...
@@ -1537,9 +1539,18 @@ public class TaskService implements ITaskService {
return
""
;
}
@Override
public
String
checkout
(
StoragePos
pos
,
String
subSourceId
,
boolean
isSingleOut
)
{
return
checkout
(
pos
,
subSourceId
,
isSingleOut
,
""
,
""
);
}
@Override
public
void
addTaskToFinished
(
StoragePos
pos
,
Barcode
barcode
,
String
opUser
){
addTaskToFinished
(
pos
,
barcode
,
opUser
,
""
,
""
);
}
@Override
public
void
addTaskToFinished
(
StoragePos
pos
,
Barcode
barcode
,
String
opUser
,
String
checkType
,
String
workOrderNumber
){
try
{
//当前库位或barcode有正在执行的任务,完成掉
if
(
Strings
.
isNullOrEmpty
(
opUser
)){
...
...
@@ -1576,6 +1587,8 @@ public class TaskService implements ITaskService {
//没有正在执行的任务,直接添加一条已完成的任务
DataLog
task
=
newTask
(
pos
);
task
.
setCheckType
(
checkType
);
task
.
setWorkOrderNumber
(
workOrderNumber
);
if
(
pos
.
getBarcode
()
==
null
){
log
.
info
(
opUser
+
"入库【"
+
barcode
.
getBarcode
()+
"】到【"
+
pos
.
getPosName
()+
"】"
);
task
.
setType
(
StorageConstants
.
OP
.
PUT_IN
);
...
...
@@ -1633,9 +1646,12 @@ public class TaskService implements ITaskService {
Storage
storage
=
dataCache
.
getStorage
(
task
.
getCid
());
if
(
storage
!=
null
){
if
(
task
.
isCheckOutTask
()){
postOutNotification
(
dataCache
.
getSettings
().
getOutNotifyApi
(),
task
.
getBarcode
(),
task
.
getCid
());
if
(
StringUtils
.
isEmpty
(
task
.
getWorkOrderNumber
())){
workOrderNumber
=
task
.
getSourceName
();
}
postOutNotification
(
dataCache
.
getSettings
().
getOutNotifyApi
(),
task
.
getBarcode
(),
task
.
getCid
(),
task
.
getCheckType
(),
workOrderNumber
);
}
else
{
postInNotification
(
dataCache
.
getSettings
().
getInNotifyApi
(),
task
.
getBarcode
(),
task
.
getStorageId
());
postInNotification
(
dataCache
.
getSettings
().
getInNotifyApi
(),
task
.
getBarcode
(),
task
.
getStorageId
()
,
task
.
getCheckType
(),
task
.
getWorkOrderNumber
()
);
}
}
...
...
@@ -1747,7 +1763,7 @@ public class TaskService implements ITaskService {
Storage
storage
=
dataCache
.
getStorage
(
task
.
getCid
());
if
(
storage
!=
null
){
postInNotification
(
dataCache
.
getSettings
().
getInNotifyApi
(),
task
.
getBarcode
(),
task
.
getStorageId
());
postInNotification
(
dataCache
.
getSettings
().
getInNotifyApi
(),
task
.
getBarcode
(),
task
.
getStorageId
()
,
task
.
getCheckType
(),
task
.
getWorkOrderNumber
()
);
}
...
...
@@ -1760,7 +1776,7 @@ public class TaskService implements ITaskService {
theFinishedTaskMap
.
put
(
task
.
getId
(),
task
);
}
private
boolean
postInNotification
(
String
url
,
String
reelBarcode
,
String
storageId
){
private
boolean
postInNotification
(
String
url
,
String
reelBarcode
,
String
storageId
,
String
checkType
,
String
workOrderNumber
){
try
{
if
(
Strings
.
isNullOrEmpty
(
url
)){
...
...
@@ -1769,17 +1785,21 @@ public class TaskService implements ITaskService {
log
.
info
(
"向 MES 通知【"
+
reelBarcode
+
"】的入库信息"
);
Barcode
barcode
=
barcodeManager
.
findByBarcode
(
reelBarcode
);
Map
<
String
,
Object
>
params
=
new
HashMap
<
String
,
Object
>();
params
.
put
(
"RI"
,
reelBarcode
);
params
.
put
(
"LOC"
,
storageId
);
params
.
put
(
"ri"
,
reelBarcode
);
params
.
put
(
"loc"
,
storageId
);
params
.
put
(
"warehouseId"
,
"SG00001"
);
params
.
put
(
"workNo"
,
workOrderNumber
);
params
.
put
(
"storageType"
,
checkType
);
if
(
barcode
!=
null
){
params
.
put
(
"
PN
"
,
barcode
.
getPartNumber
());
params
.
put
(
"
QTY
"
,
barcode
.
getAmount
());
params
.
put
(
"
PRODATE
"
,
barcode
.
getProduceDate
());
params
.
put
(
"
EXPDATE
"
,
barcode
.
getExpireDate
());
params
.
put
(
"
SP
"
,
barcode
.
getProvider
());
params
.
put
(
"
BATCH
"
,
barcode
.
getAmount
());
params
.
put
(
"
pn
"
,
barcode
.
getPartNumber
());
params
.
put
(
"
qty
"
,
barcode
.
getAmount
());
params
.
put
(
"
prodate
"
,
barcode
.
getProduceDate
());
params
.
put
(
"
expdate
"
,
barcode
.
getExpireDate
());
params
.
put
(
"
sp
"
,
barcode
.
getProvider
());
params
.
put
(
"
batch
"
,
barcode
.
getAmount
());
}
String
result
=
HttpHelper
.
postParam
(
url
,
params
);
String
result
=
HttpHelper
.
get
(
url
,
params
);
log
.
info
(
"收到MES ["
+
url
+
"]的关于["
+
reelBarcode
+
"]入库通知的反馈信息:"
+
result
);
return
true
;
}
catch
(
Exception
e
){
...
...
@@ -1788,7 +1808,7 @@ public class TaskService implements ITaskService {
return
false
;
}
private
boolean
postOutNotification
(
String
url
,
String
reelBarcode
,
String
cid
){
private
boolean
postOutNotification
(
String
url
,
String
reelBarcode
,
String
cid
,
String
checkType
,
String
workOrderNumber
){
try
{
//log.info("出库完成,通知 Agv 小车开始取料");
// AgvUtil.ArmGet();
...
...
@@ -1797,8 +1817,12 @@ public class TaskService implements ITaskService {
}
log
.
info
(
"向 MES 通知【"
+
reelBarcode
+
"】的出库信息"
);
Map
<
String
,
Object
>
params
=
new
HashMap
<
String
,
Object
>();
params
.
put
(
"ReelID"
,
reelBarcode
);
String
result
=
HttpHelper
.
postParam
(
url
,
params
);
params
.
put
(
"reelId"
,
reelBarcode
);
params
.
put
(
"ri"
,
reelBarcode
);
params
.
put
(
"warehouseId"
,
"SG00001"
);
params
.
put
(
"storageType"
,
checkType
);
params
.
put
(
"workNo"
,
workOrderNumber
);
String
result
=
HttpHelper
.
get
(
url
,
params
);
log
.
info
(
"收到MES ["
+
url
+
"]的关于["
+
reelBarcode
+
"]出库通知的反馈信息:"
+
result
);
return
true
;
}
catch
(
Exception
e
){
...
...
@@ -1857,7 +1881,11 @@ public class TaskService implements ITaskService {
//通知消息
Storage
storage
=
dataCache
.
getStorage
(
task
.
getCid
());
if
(
storage
!=
null
){
postOutNotification
(
dataCache
.
getSettings
().
getOutNotifyApi
(),
task
.
getBarcode
(),
task
.
getCid
());
String
workOrderNumber
=
task
.
getWorkOrderNumber
();
if
(
StringUtils
.
isEmpty
(
workOrderNumber
)){
workOrderNumber
=
task
.
getWorkOrderNumber
();
}
postOutNotification
(
dataCache
.
getSettings
().
getOutNotifyApi
(),
task
.
getBarcode
(),
task
.
getCid
(),
task
.
getCheckType
(),
workOrderNumber
);
}
...
...
@@ -1903,7 +1931,7 @@ public class TaskService implements ITaskService {
liteOrderItem
.
setOutNum
(
liteOrderItem
.
getOutNum
()
+
task
.
getNum
());
liteOrderItem
.
setOutReelCount
(
liteOrderItem
.
getOutReelCount
()
+
1
);
liteOrderItem
=
liteOrderItemDao
.
save
(
liteOrderItem
);
Barcode
barcode
=
barcodeManager
.
findByBarcode
(
task
.
getBarcode
());
/*
Barcode barcode = barcodeManager.findByBarcode(task.getBarcode());
if(barcode != null){
int barcodeRemainNum = liteOrderItem.getOutNum() - liteOrderItem.getNeedNum();
if(barcodeRemainNum < 0){
...
...
@@ -1916,7 +1944,7 @@ public class TaskService implements ITaskService {
} catch (ValidateException e) {
e.printStackTrace();
}
}
}
*/
}
items
.
add
(
liteOrderItem
);
}
...
...
myproject/src/main/resources/ApplicationResources_zh.properties
查看文件 @
fb24f88
...
...
@@ -369,4 +369,13 @@ settings.restore.success=\u64CD\u4F5C\u6210\u529F
checkout.sucess
=
\u
52A0
\u5165\u
51FA
\u
5E93
\u
4EFB
\u
52A1
\u5217\u8868\u6210\u
529F
runStatus.stockOut
=
\u
51FA
\u
5E93
\u
91CF
runStatus.stockIn
=
\u5165\u
5E93
\u
91CF
checkoutSettings.mode.produceDate
=
\u
751F
\u
4EA7
\u
65E5
\u
671F
\u
4F18
\u5148
\ No newline at end of file
checkoutSettings.mode.produceDate
=
\u
751F
\u
4EA7
\u
65E5
\u
671F
\u
4F18
\u5148
storagePosFind.checkType
=
\u
51FA
\u
5E93
\u9009\u9879
checkType.return2003
=
\u
53D12003
checkType.return2006
=
\u
53D12006
checkType.returnCenter
=
\u9000\u
4E3B
\u
4ED3
storagePosFind.workOrderNo
=
\u
5DE5
\u5355\u
53F7
storagePosFind.enterWorkOrderNo
=
\u
8BF7
\u
8F93
\u5165\u
5DE5
\u5355\u
53F7
tab.zhongzhuanIn
=
\u
4E2D
\u
8F6C
\u
4ED3
\u5165\u
5E93
tab.return2003
=
2003
\u9000\u
5E93
tab.return2006
=
2006
\u9000\u
5E93
\ No newline at end of file
myproject/src/main/webapp/WEB-INF/pages/component/storagePosFind.jsp
查看文件 @
fb24f88
...
...
@@ -124,12 +124,44 @@
</form:form>
<div class="table-toolbar">
<div class="col-md-4">
<div class="btn-group">
<button class="btn yellow" id="checkoutBtn">
<i class="fa fa-sign-out"></i><fmt:message key="storagePosFind.outSelect"/></button>
<div class="col-md-4" style="margin-left: 15px; padding-left: 0;">
<div class="btn-group" style="display: flex; align-items: center; gap: 8px; flex-wrap: nowrap; width: auto;">
<!-- 出库类型标签 -->
<label for="checkType" style="margin: 0; font-weight: normal; color: #333; white-space: nowrap;">
<fmt:message key="storagePosFind.checkType"/>:
</label>
<%-- 1. 先把配置文件中的文本存为变量 --%>
<c:set var="return2003Text"><fmt:message key="checkType.return2003"/></c:set>
<c:set var="return2006Text"><fmt:message key="checkType.return2006"/></c:set>
<c:set var="returnCenterText"><fmt:message key="checkType.returnCenter"/></c:set>
<!-- 下拉框:调整宽度适配同行,取消换行 -->
<select id="checkType" name="checkType" class="form-control" style="width: 150px; flex-shrink: 0;">
<%-- 2. value 赋值为对应的文本变量,和显示内容一致 --%>
<option value="${return2003Text}" selected="selected">${return2003Text}</option>
<option value="${return2006Text}">${return2006Text}</option>
<option value="${returnCenterText}">${returnCenterText}</option>
</select>
<!-- ========== 新增:工单号标签 ========== -->
<label for="workOrderNo" style="margin: 0; font-weight: normal; color: #333; white-space: nowrap;">
<fmt:message key="storagePosFind.workOrderNo"/>:
</label>
<!-- ========== 新增:工单号输入框 ========== -->
<input type="text" id="workOrderNo" name="workOrderNo"
class="form-control"
style="width: 180px; flex-shrink: 0;"
placeholder="<fmt:message key="storagePosFind.enterWorkOrderNo"/>">
<!-- 出库按钮:取消换行,保证在同一行 -->
<button class="btn yellow" id="checkoutBtn" style="flex-shrink: 0; white-space: nowrap;">
<i class="fa fa-sign-out"></i><fmt:message key="storagePosFind.outSelect"/>
</button>
</div>
</div>
</div>
<div class="col-md-4">
</div>
...
...
@@ -215,6 +247,9 @@
<fmt:formatDate value="${pos.barcode.expireDate}" pattern="yyyy-MM-dd"/>
</display:column>
<display:column property="barcode.memo" titleKey="barcode.memo"/>
<display:column titleKey="checkOut.operate" media="html">
<c:if test="${!limitCheckOut}">
<button class="btn yellow limit" id="btn${pos.id}"
...
...
@@ -271,7 +306,7 @@
$("#checkoutBtn").click(function(){
var str= "";
$("[name=posIds]").each(function(){
$("[name=posIds]
:visible
").each(function(){
if($(this).attr("checked")){
str+=$(this).val()+";";
}
...
...
@@ -305,7 +340,9 @@
$("#btn"+ids[i]).attr("disabled","true");
$("#check"+ids[i]).parent().attr("class","hide");
}
$.post("${ctx}/service/store/checkout.html", {pids: posId,single:'${singleOut}'}, function (data) {
var checkTypeValue = $("#checkType").val();
var workOrderNo = $("#workOrderNo").val().trim();
$.post("${ctx}/service/store/checkout.html", {pids: posId,single:'${singleOut}',checkType:checkTypeValue,workOrderNumber:workOrderNo}, function (data) {
alert(data);
});
}
...
...
myproject/src/main/webapp/WEB-INF/pages/storage/accShelf.jsp
查看文件 @
fb24f88
...
...
@@ -24,10 +24,90 @@
overflow-y: auto;
}
/* 核心修改:标签页容器恢复为块级布局,支持上下排列 */
.main-tabs {
margin-bottom: 15px;
border-bottom: 1px solid #e7ecf1;
padding-bottom: 8px;
display: block; /* 取消flex,改为块级布局,支持上下排列 */
}
/* 标签列表样式(保持原有,仅微调底部间距) */
.main-tabs > .nav-tabs {
margin-bottom: 10px; /* 标签列表和下方输入框的间距 */
}
.main-tabs > .nav-tabs > li {
margin-bottom: -1px;
}
.main-tabs > .nav-tabs > li > a {
padding: 10px 18px;
font-size: 14px;
color: #666;
border: none;
border-bottom: 2px solid transparent;
}
.main-tabs > .nav-tabs > li.active > a,
.main-tabs > .nav-tabs > li.active > a:hover {
color: #4b8df8;
border-bottom: 2px solid #4b8df8;
background: transparent;
}
.main-tabs > .nav-tabs > li > a:hover {
background: transparent;
border-bottom: 2px solid #eee;
}
/* 工单号输入框容器样式(放在标签页下方,左对齐) */
.work-order-box {
display: flex;
align-items: center;
gap: 8px; /* 文字和输入框间距 */
margin-left: 8px; /* 和标签页左对齐(微调) */
}
/* 工单号输入框样式(和scan-code统一) */
#work-order-input {
height: 34px;
padding: 6px 12px;
font-size: 14px;
border: 1px solid #ccc;
border-radius: 4px;
width: 200px; /* 可自定义宽度 */
}
</style>
<link href="${ctx}/scripts/lobibox/css/lobibox.min.css?id=2" rel="stylesheet" type="text/css"/>
<!-- 2. 定义国际化变量(可放在页面任意位置,建议在标签页上方) -->
<fmt:message key="tab.zhongzhuanIn" var="tab_zhongzhuanIn"/> <!-- 中转仓入库 -->
<fmt:message key="tab.return2003" var="tab_return2003"/> <!-- 2003退库 -->
<fmt:message key="tab.return2006" var="tab_return2006"/> <!-- 2006退库 -->
<fmt:message key="storagePosFind.workOrderNo" var="workOrder_label"/> <!-- 工单号(标签文字) -->
<fmt:message key="storagePosFind.enterWorkOrderNo" var="workOrder_placeholder"/> <!-- 请输入工单号(占位符) -->
<!-- 3. 标签页主体(data-tab标识与type参数值一致) -->
<div class="main-tabs">
<ul class="nav nav-tabs" id="businessTab">
<!-- 中转仓入库:data-tab=zhongzhuanIn 对应type=zhongzhuanIn -->
<li class="tab-item" data-tab="zhongzhuanIn" data-url="${ctx}/storage/accShelf/${show}?type=zhongzhuanIn">
<a href="javascript:;">${tab_zhongzhuanIn}</a>
</li>
<!-- 2003退库:data-tab=return2003 对应type=return2003 -->
<li class="tab-item" data-tab="return2003" data-url="${ctx}/storage/accShelf/${show}?type=return2003">
<a href="javascript:;">${tab_return2003}</a>
</li>
<!-- 2006退库:data-tab=return2006 对应type=return2006 -->
<li class="tab-item" data-tab="return2006" data-url="${ctx}/storage/accShelf/${show}?type=return2006">
<a href="javascript:;">${tab_return2006}</a>
</li>
</ul>
<!-- 工单号输入框(移至标签列表下方) -->
<div class="work-order-box">
<span>${workOrder_label}:</span>
<input type="text" id="work-order-input" class="form-control" placeholder="${workOrder_placeholder}">
</div>
</div>
<div class="row" id="codeBox">
<div class="col-md-6 col-sm-6">
<input type="text" class="form-control" id="scan-code"/>
...
...
@@ -162,6 +242,28 @@
<c:set var="scripts" scope="request">
<script type="text/javascript">
// ========== 新增:URL参数解析函数(用于获取type参数) ==========
function getUrlParam(paramName) {
var reg = new RegExp("(^|&)" + paramName + "=([^&]*)(&|$)");
var paramValue = window.location.search.substr(1).match(reg);
return paramValue ? decodeURIComponent(paramValue[2]) : null;
}
// ========== 新增:初始化标签选中状态(根据type参数) ==========
function initActiveTab() {
// 1. 获取URL中的type参数,无参数默认选中zhongzhuanIn(中转仓入库)
var targetType = getUrlParam("type") || "zhongzhuanIn";
// 2. 匹配标签并设置选中状态
$(".tab-item").each(function() {
var currentTabKey = $(this).data("tab");
if (currentTabKey === targetType) {
$(this).addClass("active");
} else {
$(this).removeClass("active");
}
});
}
function showMsg(msg){
if(msg == ""){
$("#msg").attr("class","");
...
...
@@ -191,10 +293,12 @@
$("#scan-code").change(function () {
var codeValue = $(this).val();
var workOrder = $.trim($("#work-order-input").val());
var checkType = $(".tab-item.active").find("a").text();
$(this).val("");
showMsg("");
$(this).attr("placeholder", codeValue);
$.post("${ctx}/service/store/accShelf/putInCode", {cid: '${show}', code: codeValue}, function (data) {
$.post("${ctx}/service/store/accShelf/putInCode", {cid: '${show}', code: codeValue
,workOrderNumber:workOrder,checkType:checkType
}, function (data) {
showMsg(data);
if(data.indexOf("x") == 0){
//弹框,添加=7x8=尺寸信息后重新请求
...
...
@@ -217,6 +321,11 @@
setInterval(function(){
// 核心判断:如果工单号输入框正被聚焦(用户点击了),则不执行后续聚焦逻辑
if ($("#work-order-input").is(":focus")) {
return; // 直接返回,保留焦点在工单号输入框
}
if($('#allPartNumbers').is(':visible')) {
$("#searchPn").focus();
}else{
...
...
@@ -225,6 +334,22 @@
}, 1000);
// ========== 新增:标签点击事件(页面元素加载后绑定) ==========
$(document).ready(function() {
// 初始化标签选中状态
initActiveTab();
// 标签点击跳转(带type参数,替换历史记录+刷新页面,避免回退到上一个标签)
$(".tab-item").click(function() {
var targetUrl = $(this).data("url");
if(targetUrl){
// 核心:替换当前历史记录,回退时不会保留本次点击的历史
history.replaceState(null, document.title, targetUrl);
// 刷新当前页面(加载新的type参数对应的内容)
window.location.reload();
}
});
});
//页码从0开始
...
...
myproject/src/main/webapp/WEB-INF/pages/storage/allBoxView.jsp
查看文件 @
fb24f88
...
...
@@ -167,11 +167,12 @@
<c:if test="${storage.cabinet}">
<c:set var="detailUrl" value="${ctx}/cabinet/${storage.cid}"/>
</c:if>
<c:if test="${storage.shelf}">
<c:set var="detailUrl" value="${ctx}/storage/nlp/${storage.cid}"/>
<c:set var="detailUrl" value="${ctx}/storage/nlp/${storage.cid}
?type=zhongzhuanIn
"/>
</c:if>
<c:if test="${storage.accShelf}">
<c:set var="detailUrl" value="${ctx}/storage/accShelf/${storage.cid}"/>
<c:set var="detailUrl" value="${ctx}/storage/accShelf/${storage.cid}
?type=zhongzhuanIn
"/>
</c:if>
<c:if test="${storage.codeShelf}">
...
...
myproject/src/main/webapp/WEB-INF/pages/storage/nlpShelf.jsp
查看文件 @
fb24f88
...
...
@@ -24,10 +24,91 @@
overflow-y: auto;
}
/* 核心修改:标签页容器恢复为块级布局,支持上下排列 */
.main-tabs {
margin-bottom: 15px;
border-bottom: 1px solid #e7ecf1;
padding-bottom: 8px;
display: block; /* 取消flex,改为块级布局,支持上下排列 */
}
/* 标签列表样式(保持原有,仅微调底部间距) */
.main-tabs > .nav-tabs {
margin-bottom: 10px; /* 标签列表和下方输入框的间距 */
}
.main-tabs > .nav-tabs > li {
margin-bottom: -1px;
}
.main-tabs > .nav-tabs > li > a {
padding: 10px 18px;
font-size: 14px;
color: #666;
border: none;
border-bottom: 2px solid transparent;
}
.main-tabs > .nav-tabs > li.active > a,
.main-tabs > .nav-tabs > li.active > a:hover {
color: #4b8df8;
border-bottom: 2px solid #4b8df8;
background: transparent;
}
.main-tabs > .nav-tabs > li > a:hover {
background: transparent;
border-bottom: 2px solid #eee;
}
/* 工单号输入框容器样式(放在标签页下方,左对齐) */
.work-order-box {
display: flex;
align-items: center;
gap: 8px; /* 文字和输入框间距 */
margin-left: 8px; /* 和标签页左对齐(微调) */
}
/* 工单号输入框样式(和scan-code统一) */
#work-order-input {
height: 34px;
padding: 6px 12px;
font-size: 14px;
border: 1px solid #ccc;
border-radius: 4px;
width: 200px; /* 可自定义宽度 */
}
</style>
<link href="${ctx}/scripts/lobibox/css/lobibox.min.css?id=2" rel="stylesheet" type="text/css"/>
<!-- 2. 定义国际化变量(可放在页面任意位置,建议在标签页上方) -->
<fmt:message key="tab.zhongzhuanIn" var="tab_zhongzhuanIn"/> <!-- 中转仓入库 -->
<fmt:message key="tab.return2003" var="tab_return2003"/> <!-- 2003退库 -->
<fmt:message key="tab.return2006" var="tab_return2006"/> <!-- 2006退库 -->
<fmt:message key="storagePosFind.workOrderNo" var="workOrder_label"/> <!-- 工单号(标签文字) -->
<fmt:message key="storagePosFind.enterWorkOrderNo" var="workOrder_placeholder"/> <!-- 请输入工单号(占位符) -->
<!-- 3. 标签页主体(data-tab标识与type参数值一致) -->
<div class="main-tabs">
<ul class="nav nav-tabs" id="businessTab">
<!-- 中转仓入库:data-tab=zhongzhuanIn 对应type=zhongzhuanIn -->
<li class="tab-item" data-tab="zhongzhuanIn" data-url="${ctx}/storage/nlp/${show}?type=zhongzhuanIn">
<a href="javascript:;">${tab_zhongzhuanIn}</a>
</li>
<!-- 2003退库:data-tab=return2003 对应type=return2003 -->
<li class="tab-item" data-tab="return2003" data-url="${ctx}/storage/nlp/${show}?type=return2003">
<a href="javascript:;">${tab_return2003}</a>
</li>
<!-- 2006退库:data-tab=return2006 对应type=return2006 -->
<li class="tab-item" data-tab="return2006" data-url="${ctx}/storage/nlp/${show}?type=return2006">
<a href="javascript:;">${tab_return2006}</a>
</li>
</ul>
<!-- 工单号输入框(移至标签列表下方) -->
<div class="work-order-box">
<span>${workOrder_label}:</span>
<input type="text" id="work-order-input" class="form-control" placeholder="${workOrder_placeholder}">
</div>
</div>
<div class="row" id="codeBox">
<div class="col-md-6 col-sm-6">
<input type="text" class="form-control" id="scan-code"/>
...
...
@@ -162,6 +243,31 @@
<c:set var="scripts" scope="request">
<script type="text/javascript">
// ========== 新增:URL参数解析函数(用于获取type参数) ==========
function getUrlParam(paramName) {
var reg = new RegExp("(^|&)" + paramName + "=([^&]*)(&|$)");
var paramValue = window.location.search.substr(1).match(reg);
return paramValue ? decodeURIComponent(paramValue[2]) : null;
}
// ========== 新增:初始化标签选中状态(根据type参数) ==========
function initActiveTab() {
// 1. 获取URL中的type参数,无参数默认选中zhongzhuanIn(中转仓入库)
var targetType = getUrlParam("type") || "zhongzhuanIn";
// 2. 匹配标签并设置选中状态
$(".tab-item").each(function() {
var currentTabKey = $(this).data("tab");
if (currentTabKey === targetType) {
$(this).addClass("active");
} else {
$(this).removeClass("active");
}
});
}
function showMsg(msg){
if(msg == ""){
$("#msg").attr("class","");
...
...
@@ -191,10 +297,12 @@
$("#scan-code").change(function () {
var codeValue = $(this).val();
var workOrder = $.trim($("#work-order-input").val());
var checkType = $(".tab-item.active").find("a").text();
$(this).val("");
showMsg("");
$(this).attr("placeholder", codeValue);
$.post("${ctx}/service/store/nlp/putInCode", {cid: '${show}', code: codeValue}, function (data) {
$.post("${ctx}/service/store/nlp/putInCode", {cid: '${show}', code: codeValue
,workOrderNumber:workOrder,checkType:checkType
}, function (data) {
showMsg(data);
if(data.indexOf("x") == 0){
//弹框,添加=7x8=尺寸信息后重新请求
...
...
@@ -217,6 +325,11 @@
setInterval(function(){
// 核心判断:如果工单号输入框正被聚焦(用户点击了),则不执行后续聚焦逻辑
if ($("#work-order-input").is(":focus")) {
return; // 直接返回,保留焦点在工单号输入框
}
if($('#allPartNumbers').is(':visible')) {
$("#searchPn").focus();
}else{
...
...
@@ -224,7 +337,22 @@
}
}, 1000);
// ========== 新增:标签点击事件(页面元素加载后绑定) ==========
$(document).ready(function() {
// 初始化标签选中状态
initActiveTab();
// 标签点击跳转(带type参数,替换历史记录+刷新页面,避免回退到上一个标签)
$(".tab-item").click(function() {
var targetUrl = $(this).data("url");
if(targetUrl){
// 核心:替换当前历史记录,回退时不会保留本次点击的历史
history.replaceState(null, document.title, targetUrl);
// 刷新当前页面(加载新的type参数对应的内容)
window.location.reload();
}
});
});
//页码从0开始
...
...
myproject/src/main/webapp/resources/admin/Barcode.csv
查看文件 @
fb24f88
...
...
@@ -229,7 +229,7 @@ RI,PN,QTY
,CT41-0805-2R1-50V-104K,281
,CT41-0603-2R1-50V-104K,282
,CT41-1206-2R1-50V-334K,283
,3DK2B
(
쫄),284
,3DK2B
?
쫄),284
,TLP281-4,285
,RMK1608(0603)-0.063W-K-B-222J(RMK1608(0603)-0.1W-K-B-222J),286
,RMK1608(0603)-0.063W-K-B-100J(RMK1608(0603)-0.1W-K-B-100J),287
...
...
@@ -265,7 +265,7 @@ RI,PN,QTY
,1N4004,317
,RMK3216(1206)-0.25W-K-B-104J,318
,RMK3216(1206)-0.25W-K-B-511J,319
,3DK2B
(
쫄),320
,3DK2B
?
쫄),320
,CT41-2220-2R1-50V-106M,321
,J28C-96T2J,322
,JZC-200MD/027-01(토없鍍득),323
...
...
@@ -304,4 +304,4 @@ RI,PN,QTY
,16XSZ3112-03/2,361
,54HC138,362
,SN74HC573D(욱룐陋),363
,,齡데훙:HJYAN
\ No newline at end of file
,,齡데훙:HJYAN
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论