Commit fb24f881 张少辉

阳光电源新功能修改

1 个父辈 89d31afe
......@@ -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;
}
......
......@@ -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 = canSplitStr.replaceAll("\\[[^\\]]*?\\]","");
String canSplitStr = ruleStr.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,20200930,001";
rule = "PN,EXPDATEyyyyMMdd,RI";
codeStr = "LOCTITE3609,201212,001";
rule = "PN,PRODATEyyMMdd,RI";
BarcodeRule br = BarcodeRule.newRule(rule);
Barcode b = br.toCodeBean(codeStr).getBarcode();
......
......@@ -41,7 +41,7 @@ public class HttpHelper {
return postJson(url,params,null, "http");
}
public static String get(String url,HashMap<String, String> params) throws ApiException {
public static String get(String url,Map<String, Object> params) throws ApiException, URIException {
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 ApiException {
public static String get(String url, Map<String, Object> params,
HashMap<String, String> cookies, String protocol) throws ApiException, URIException {
// 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();
}
}
......@@ -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);
......
......@@ -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) {
......
......@@ -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);
//入仓位完成
......
......@@ -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;
}
......
......@@ -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);
}
......
......@@ -369,4 +369,13 @@ settings.restore.success=\u64CD\u4F5C\u6210\u529F
checkout.sucess=\u52A0\u5165\u51FA\u5E93\u4EFB\u52A1\u5217\u8868\u6210\u529F
runStatus.stockOut=\u51FA\u5E93\u91CF
runStatus.stockIn=\u5165\u5E93\u91CF
checkoutSettings.mode.produceDate=\u751F\u4EA7\u65E5\u671F\u4F18\u5148
\ No newline at end of file
checkoutSettings.mode.produceDate=\u751F\u4EA7\u65E5\u671F\u4F18\u5148
storagePosFind.checkType=\u51FA\u5E93\u9009\u9879
checkType.return2003=\u53D12003
checkType.return2006=\u53D12006
checkType.returnCenter=\u9000\u4E3B\u4ED3
storagePosFind.workOrderNo=\u5DE5\u5355\u53F7
storagePosFind.enterWorkOrderNo=\u8BF7\u8F93\u5165\u5DE5\u5355\u53F7
tab.zhongzhuanIn=\u4E2D\u8F6C\u4ED3\u5165\u5E93
tab.return2003=2003\u9000\u5E93
tab.return2006=2006\u9000\u5E93
\ No newline at end of file
......@@ -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);
});
}
......
......@@ -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开始
......
......@@ -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}">
......
......@@ -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开始
......
......@@ -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!