Commit fb24f881 张少辉

阳光电源新功能修改

1 个父辈 89d31afe
...@@ -118,6 +118,26 @@ public class DataLog extends BaseMongoBean /*implements Comparable<DataLog>*/ { ...@@ -118,6 +118,26 @@ public class DataLog extends BaseMongoBean /*implements Comparable<DataLog>*/ {
*/ */
private int mixTime; 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() { public String getStorageName() {
return storageName; return storageName;
} }
......
...@@ -96,9 +96,9 @@ public class BarcodeRule { ...@@ -96,9 +96,9 @@ public class BarcodeRule {
if(!Strings.isNullOrEmpty(ruleStr)){ if(!Strings.isNullOrEmpty(ruleStr)){
//先去除[prefix,length,suffix]这样的配置字段 //先去除[prefix,length,suffix]这样的配置字段
String canSplitStr =ruleStr.replaceAll("DATE.*?\\]",""); //String canSplitStr =ruleStr.replaceAll("DATE.*?\\]","");
canSplitStr = canSplitStr.replaceAll("\\[[^\\]]*?\\]",""); String canSplitStr = ruleStr.replaceAll("\\[[^\\]]*?\\]","");
//先找分割符,分割出来数组数量最多的放第一个 //先找分割符,分割出来数组数量最多的放第一个
String trySeparator = ""; String trySeparator = "";
//找最多的字符 //找最多的字符
...@@ -173,7 +173,7 @@ public class BarcodeRule { ...@@ -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)){ if(newRule.expireDate_item.matchRule(fieldValue,i)){
log.info("expireDate: 为" + newRule.expireDate_item.toString()); log.info("expireDate: 为" + newRule.expireDate_item.toString());
} }
...@@ -507,7 +507,27 @@ public class BarcodeRule { ...@@ -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); Date expireDate= expireDate_item.getDateValue(codeArr);
if(produceDate != null && expireDate == null){ if(produceDate != null && expireDate == null){
Calendar c = Calendar.getInstance(); Calendar c = Calendar.getInstance();
...@@ -530,7 +550,7 @@ public class BarcodeRule { ...@@ -530,7 +550,7 @@ public class BarcodeRule {
if(hasExpire){ if(hasExpire){
expireDate = c.getTime(); expireDate = c.getTime();
} }
} }*/
String supplier = supplier_item.getStrValue(codeArr); String supplier = supplier_item.getStrValue(codeArr);
String msl = msl_item.getStrValue(codeArr); String msl = msl_item.getStrValue(codeArr);
...@@ -633,8 +653,8 @@ public class BarcodeRule { ...@@ -633,8 +653,8 @@ public class BarcodeRule {
//803 //803
//rule = "PN[6:0:-1],EXPDATEyyyy-MM-dd[-1:0:-1],BATCH,RI"; //rule = "PN[6:0:-1],EXPDATEyyyy-MM-dd[-1:0:-1],BATCH,RI";
//codeStr = "ALPHA OL107E,2021-11-11,00714026Z,002"; //codeStr = "ALPHA OL107E,2021-11-11,00714026Z,002";
codeStr = "LOCTITE3609,20200930,001"; codeStr = "LOCTITE3609,201212,001";
rule = "PN,EXPDATEyyyyMMdd,RI"; rule = "PN,PRODATEyyMMdd,RI";
BarcodeRule br = BarcodeRule.newRule(rule); BarcodeRule br = BarcodeRule.newRule(rule);
Barcode b = br.toCodeBean(codeStr).getBarcode(); Barcode b = br.toCodeBean(codeStr).getBarcode();
......
...@@ -41,7 +41,7 @@ public class HttpHelper { ...@@ -41,7 +41,7 @@ public class HttpHelper {
return postJson(url,params,null, "http"); 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"); return get(url,params,null, "http");
} }
...@@ -229,8 +229,8 @@ public class HttpHelper { ...@@ -229,8 +229,8 @@ public class HttpHelper {
* 请求协议 "http" / "https" * 请求协议 "http" / "https"
* @return 服务器响应的请求结果 * @return 服务器响应的请求结果
*/ */
public static String get(String url, HashMap<String, String> params, public static String get(String url, Map<String, Object> params,
HashMap<String, String> cookies, String protocol) throws ApiException { HashMap<String, String> cookies, String protocol) throws ApiException, URIException {
// if (protocol.equalsIgnoreCase("https")) { // if (protocol.equalsIgnoreCase("https")) {
// Protocol httpsProtocol = new Protocol("https", new SecureProtocolSocketFactoryImpl(), 443); // Protocol httpsProtocol = new Protocol("https", new SecureProtocolSocketFactoryImpl(), 443);
// Protocol.registerProtocol("https", httpsProtocol); // Protocol.registerProtocol("https", httpsProtocol);
...@@ -242,12 +242,18 @@ public class HttpHelper { ...@@ -242,12 +242,18 @@ public class HttpHelper {
// 设置请求参数 // 设置请求参数
if (params != null && !params.isEmpty()) { if (params != null && !params.isEmpty()) {
// ========== 修改1:迭代器类型从 Entry<String,String> 改为 Entry<String,Object> ==========
NameValuePair[] data = new NameValuePair[params.size()]; 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; int i = 0;
while (iterator.hasNext()) { while (iterator.hasNext()) {
Entry<String, String> entry = iterator.next(); Entry<String, Object> entry = iterator.next();
data[i] = new NameValuePair(entry.getKey(), entry.getValue()); String key = entry.getKey();
// ========== 修改2:处理 Object 类型的 value 转为 String ==========
Object valueObj = entry.getValue();
String value = convertObjectToString(valueObj);
data[i] = new NameValuePair(key, value);
++i; ++i;
} }
getMethod.setQueryString(data); getMethod.setQueryString(data);
...@@ -461,4 +467,17 @@ public class HttpHelper { ...@@ -461,4 +467,17 @@ public class HttpHelper {
throw new ApiException("Request [" + url + "] failed:" + e.getMessage()); 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 { ...@@ -171,6 +171,8 @@ public class AccShelfController extends BaseController {
public String putInCode(HttpServletRequest request){ public String putInCode(HttpServletRequest request){
final String cid = request.getParameter("cid"); final String cid = request.getParameter("cid");
String code = request.getParameter("code"); String code = request.getParameter("code");
String workOrderNumber = request.getParameter("workOrderNumber");
String checkType = request.getParameter("checkType");
StoragePos lastPutinPos= lastPutinPosMap.get(cid); StoragePos lastPutinPos= lastPutinPosMap.get(cid);
Storage storage = dataCache.getStorage(cid); Storage storage = dataCache.getStorage(cid);
if(lastPutinPos != null){ if(lastPutinPos != null){
...@@ -219,7 +221,7 @@ public class AccShelfController extends BaseController { ...@@ -219,7 +221,7 @@ public class AccShelfController extends BaseController {
String color = "green"; String color = "green";
if(pos != null){ if(pos != null){
log.info(barcode.getPartNumber()+" [ "+barcode.getBarcode()+" ] " + "入库到:" + storage.getName()+"["+cid+"] " + pos.getPosName()); 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); openAndCloseLights(storage,pos.getPosName(),delayCloseTime,color);
lastPutinPosMap.put(cid,pos); lastPutinPosMap.put(cid,pos);
pos.setCanCheckOutTime(System.currentTimeMillis() + delayCloseTime); pos.setCanCheckOutTime(System.currentTimeMillis() + delayCloseTime);
......
...@@ -79,6 +79,8 @@ public class NLPShelfController extends BaseController { ...@@ -79,6 +79,8 @@ public class NLPShelfController extends BaseController {
public String putInCode(HttpServletRequest request){ public String putInCode(HttpServletRequest request){
final String cid = request.getParameter("cid"); final String cid = request.getParameter("cid");
String code = request.getParameter("code"); String code = request.getParameter("code");
String workOrderNumber = request.getParameter("workOrderNumber");
String checkType = request.getParameter("checkType");
Storage storage = dataCache.getStorage(cid); Storage storage = dataCache.getStorage(cid);
Collection<DataLog> queueTasks = taskService.getQueueTasks(); Collection<DataLog> queueTasks = taskService.getQueueTasks();
for (DataLog queueTask : queueTasks) { for (DataLog queueTask : queueTasks) {
...@@ -121,7 +123,7 @@ public class NLPShelfController extends BaseController { ...@@ -121,7 +123,7 @@ public class NLPShelfController extends BaseController {
List<Storage> storageList = Lists.newArrayList(storage); List<Storage> storageList = Lists.newArrayList(storage);
StoragePos pos = taskService.findEmptyPosForPutIn(storageList, barcode); StoragePos pos = taskService.findEmptyPosForPutIn(storageList, barcode);
if(pos != null){ if(pos != null){
putIn(StorageDataController.getLoginUsername(),storage.getId(),barcode); putIn(StorageDataController.getLoginUsername(),storage.getId(),barcode,workOrderNumber,checkType);
return "操作成功,请放入料架"; return "操作成功,请放入料架";
}else{ }else{
//库位没找到 //库位没找到
...@@ -144,7 +146,7 @@ public class NLPShelfController extends BaseController { ...@@ -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 pn = barcode.getPartNumber();
String reelId = barcode.getBarcode(); String reelId = barcode.getBarcode();
...@@ -164,6 +166,8 @@ public class NLPShelfController extends BaseController { ...@@ -164,6 +166,8 @@ public class NLPShelfController extends BaseController {
dataLog.setStorageId(storageId); dataLog.setStorageId(storageId);
dataLog.setMemo(barcode.getMemo()); dataLog.setMemo(barcode.getMemo());
dataLog.setOperator(loginUser); dataLog.setOperator(loginUser);
dataLog.setWorkOrderNumber(workOrderNumber);
dataLog.setCheckType(checkType);
if (!Strings.isNullOrEmpty(storageId)) { if (!Strings.isNullOrEmpty(storageId)) {
Storage storage = dataCache.getStorageById(storageId); Storage storage = dataCache.getStorageById(storageId);
if (storage != null) { if (storage != null) {
......
...@@ -66,6 +66,8 @@ public interface ITaskService { ...@@ -66,6 +66,8 @@ public interface ITaskService {
*/ */
String checkout(StoragePos pos, String subSourceId, boolean isSingleOut); 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; StoragePos findEmptyPosForPutIn(List<Storage> storageList, Barcode barcode) throws ValidateException;
//void checkOutInaction(String areaId, int day) throws ValidateException; //void checkOutInaction(String areaId, int day) throws ValidateException;
...@@ -74,6 +76,8 @@ public interface ITaskService { ...@@ -74,6 +76,8 @@ public interface ITaskService {
void addTaskToFinished(StoragePos pos, Barcode barcode, String opUser); void addTaskToFinished(StoragePos pos, Barcode barcode, String opUser);
void addTaskToFinished(StoragePos pos, Barcode barcode, String opUser,String checkType,String workOrderNumber);
void addTaskToExecute(DataLog task); void addTaskToExecute(DataLog task);
//入仓位完成 //入仓位完成
......
...@@ -29,6 +29,7 @@ import org.springframework.security.core.Authentication; ...@@ -29,6 +29,7 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
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.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
...@@ -266,7 +267,6 @@ public class StorageDataController extends BaseController { ...@@ -266,7 +267,6 @@ public class StorageDataController extends BaseController {
String isSingleOutStr = request.getParameter("single"); String isSingleOutStr = request.getParameter("single");
boolean isSingleOut = Boolean.valueOf(isSingleOutStr); boolean isSingleOut = Boolean.valueOf(isSingleOutStr);
if(!Strings.isNullOrEmpty(partnumber) || !Strings.isNullOrEmpty(type)){ if(!Strings.isNullOrEmpty(partnumber) || !Strings.isNullOrEmpty(type)){
Storage storage = dataCache.getStorage(cid); Storage storage = dataCache.getStorage(cid);
if(storage == null){ if(storage == null){
...@@ -303,6 +303,12 @@ public class StorageDataController extends BaseController { ...@@ -303,6 +303,12 @@ public class StorageDataController extends BaseController {
} }
else { else {
String checkType = request.getParameter("checkType");
if (StringUtils.isEmpty(checkType)){
return "出库选择不能为空";
}
String workOrderNumber = request.getParameter("workOrderNumber");
String pids = request.getParameter("pids"); String pids = request.getParameter("pids");
for(String pid : pids.split(";")){ for(String pid : pids.split(";")){
StoragePos pos = storagePosManager.get(pid); StoragePos pos = storagePosManager.get(pid);
...@@ -311,7 +317,7 @@ public class StorageDataController extends BaseController { ...@@ -311,7 +317,7 @@ public class StorageDataController extends BaseController {
} }
log.info("出库位置仓位【"+pos.getPosName()+"】"); log.info("出库位置仓位【"+pos.getPosName()+"】");
String outResult = taskService.checkout(pos, subSourceId, isSingleOut); String outResult = taskService.checkout(pos, subSourceId, isSingleOut,checkType,workOrderNumber);
if(!Strings.isNullOrEmpty(outResult)){ if(!Strings.isNullOrEmpty(outResult)){
return "1"+outResult; return "1"+outResult;
} }
......
...@@ -1463,7 +1463,7 @@ public class TaskService implements ITaskService { ...@@ -1463,7 +1463,7 @@ public class TaskService implements ITaskService {
} }
@Override @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(); Barcode barcode = pos.getBarcode();
if(barcode != null){ if(barcode != null){
...@@ -1495,6 +1495,8 @@ public class TaskService implements ITaskService { ...@@ -1495,6 +1495,8 @@ public class TaskService implements ITaskService {
task.setType(StorageConstants.OP.CHECKOUT); task.setType(StorageConstants.OP.CHECKOUT);
task.setStatus(StorageConstants.OP_STATUS.WAIT.name()); task.setStatus(StorageConstants.OP_STATUS.WAIT.name());
task.setSingleOut(isSingleOut); task.setSingleOut(isSingleOut);
task.setWorkOrderNumber(workOrderNumber);
task.setCheckType(checkType);
//工单出库任务 //工单出库任务
if(!Strings.isNullOrEmpty(subSourceId)){ if(!Strings.isNullOrEmpty(subSourceId)){
LiteOrderItem liteOrderItem = liteOrderItemDao.findOneById(subSourceId); LiteOrderItem liteOrderItem = liteOrderItemDao.findOneById(subSourceId);
...@@ -1537,9 +1539,18 @@ public class TaskService implements ITaskService { ...@@ -1537,9 +1539,18 @@ public class TaskService implements ITaskService {
return ""; return "";
} }
@Override
public String checkout(StoragePos pos, String subSourceId, boolean isSingleOut) {
return checkout(pos, subSourceId, isSingleOut, "", "");
}
@Override @Override
public void addTaskToFinished(StoragePos pos, Barcode barcode, String opUser){ 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{ try{
//当前库位或barcode有正在执行的任务,完成掉 //当前库位或barcode有正在执行的任务,完成掉
if(Strings.isNullOrEmpty(opUser)){ if(Strings.isNullOrEmpty(opUser)){
...@@ -1576,6 +1587,8 @@ public class TaskService implements ITaskService { ...@@ -1576,6 +1587,8 @@ public class TaskService implements ITaskService {
//没有正在执行的任务,直接添加一条已完成的任务 //没有正在执行的任务,直接添加一条已完成的任务
DataLog task = newTask(pos); DataLog task = newTask(pos);
task.setCheckType(checkType);
task.setWorkOrderNumber(workOrderNumber);
if(pos.getBarcode() == null){ if(pos.getBarcode() == null){
log.info(opUser + "入库【"+barcode.getBarcode()+"】到【"+pos.getPosName()+"】"); log.info(opUser + "入库【"+barcode.getBarcode()+"】到【"+pos.getPosName()+"】");
task.setType(StorageConstants.OP.PUT_IN); task.setType(StorageConstants.OP.PUT_IN);
...@@ -1633,9 +1646,12 @@ public class TaskService implements ITaskService { ...@@ -1633,9 +1646,12 @@ public class TaskService implements ITaskService {
Storage storage = dataCache.getStorage(task.getCid()); Storage storage = dataCache.getStorage(task.getCid());
if(storage != null){ if(storage != null){
if(task.isCheckOutTask()){ 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{ }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 { ...@@ -1747,7 +1763,7 @@ public class TaskService implements ITaskService {
Storage storage = dataCache.getStorage(task.getCid()); Storage storage = dataCache.getStorage(task.getCid());
if(storage != null){ 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 { ...@@ -1760,7 +1776,7 @@ public class TaskService implements ITaskService {
theFinishedTaskMap.put(task.getId(),task); 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 { try {
if(Strings.isNullOrEmpty(url)){ if(Strings.isNullOrEmpty(url)){
...@@ -1769,17 +1785,21 @@ public class TaskService implements ITaskService { ...@@ -1769,17 +1785,21 @@ public class TaskService implements ITaskService {
log.info("向 MES 通知【"+reelBarcode+"】的入库信息"); log.info("向 MES 通知【"+reelBarcode+"】的入库信息");
Barcode barcode = barcodeManager.findByBarcode(reelBarcode); Barcode barcode = barcodeManager.findByBarcode(reelBarcode);
Map<String, Object> params = new HashMap<String, Object>(); Map<String, Object> params = new HashMap<String, Object>();
params.put("RI",reelBarcode); params.put("ri",reelBarcode);
params.put("LOC",storageId); params.put("loc",storageId);
params.put("warehouseId","SG00001");
params.put("workNo",workOrderNumber);
params.put("storageType",checkType);
if(barcode != null){ if(barcode != null){
params.put("PN",barcode.getPartNumber()); params.put("pn",barcode.getPartNumber());
params.put("QTY",barcode.getAmount()); params.put("qty",barcode.getAmount());
params.put("PRODATE",barcode.getProduceDate()); params.put("prodate",barcode.getProduceDate());
params.put("EXPDATE",barcode.getExpireDate()); params.put("expdate",barcode.getExpireDate());
params.put("SP",barcode.getProvider()); params.put("sp",barcode.getProvider());
params.put("BATCH",barcode.getAmount()); params.put("batch",barcode.getAmount());
} }
String result = HttpHelper.postParam(url,params); String result = HttpHelper.get(url,params);
log.info("收到MES ["+ url+"]的关于["+reelBarcode+"]入库通知的反馈信息:"+result); log.info("收到MES ["+ url+"]的关于["+reelBarcode+"]入库通知的反馈信息:"+result);
return true; return true;
}catch (Exception e){ }catch (Exception e){
...@@ -1788,7 +1808,7 @@ public class TaskService implements ITaskService { ...@@ -1788,7 +1808,7 @@ public class TaskService implements ITaskService {
return false; 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 { try {
//log.info("出库完成,通知 Agv 小车开始取料"); //log.info("出库完成,通知 Agv 小车开始取料");
// AgvUtil.ArmGet(); // AgvUtil.ArmGet();
...@@ -1797,8 +1817,12 @@ public class TaskService implements ITaskService { ...@@ -1797,8 +1817,12 @@ public class TaskService implements ITaskService {
} }
log.info("向 MES 通知【"+reelBarcode+"】的出库信息"); log.info("向 MES 通知【"+reelBarcode+"】的出库信息");
Map<String, Object> params = new HashMap<String, Object>(); Map<String, Object> params = new HashMap<String, Object>();
params.put("ReelID",reelBarcode); params.put("reelId",reelBarcode);
String result = HttpHelper.postParam(url,params); 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); log.info("收到MES ["+ url+"]的关于["+reelBarcode+"]出库通知的反馈信息:"+result);
return true; return true;
}catch (Exception e){ }catch (Exception e){
...@@ -1857,7 +1881,11 @@ public class TaskService implements ITaskService { ...@@ -1857,7 +1881,11 @@ public class TaskService implements ITaskService {
//通知消息 //通知消息
Storage storage = dataCache.getStorage(task.getCid()); Storage storage = dataCache.getStorage(task.getCid());
if(storage != null){ 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 { ...@@ -1903,7 +1931,7 @@ public class TaskService implements ITaskService {
liteOrderItem.setOutNum(liteOrderItem.getOutNum() + task.getNum()); liteOrderItem.setOutNum(liteOrderItem.getOutNum() + task.getNum());
liteOrderItem.setOutReelCount(liteOrderItem.getOutReelCount() + 1); liteOrderItem.setOutReelCount(liteOrderItem.getOutReelCount() + 1);
liteOrderItem = liteOrderItemDao.save(liteOrderItem); liteOrderItem = liteOrderItemDao.save(liteOrderItem);
Barcode barcode = barcodeManager.findByBarcode(task.getBarcode()); /* Barcode barcode = barcodeManager.findByBarcode(task.getBarcode());
if(barcode != null){ if(barcode != null){
int barcodeRemainNum = liteOrderItem.getOutNum() - liteOrderItem.getNeedNum(); int barcodeRemainNum = liteOrderItem.getOutNum() - liteOrderItem.getNeedNum();
if(barcodeRemainNum < 0){ if(barcodeRemainNum < 0){
...@@ -1916,7 +1944,7 @@ public class TaskService implements ITaskService { ...@@ -1916,7 +1944,7 @@ public class TaskService implements ITaskService {
} catch (ValidateException e) { } catch (ValidateException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }*/
} }
items.add(liteOrderItem); items.add(liteOrderItem);
} }
......
...@@ -369,4 +369,13 @@ settings.restore.success=\u64CD\u4F5C\u6210\u529F ...@@ -369,4 +369,13 @@ settings.restore.success=\u64CD\u4F5C\u6210\u529F
checkout.sucess=\u52A0\u5165\u51FA\u5E93\u4EFB\u52A1\u5217\u8868\u6210\u529F checkout.sucess=\u52A0\u5165\u51FA\u5E93\u4EFB\u52A1\u5217\u8868\u6210\u529F
runStatus.stockOut=\u51FA\u5E93\u91CF runStatus.stockOut=\u51FA\u5E93\u91CF
runStatus.stockIn=\u5165\u5E93\u91CF runStatus.stockIn=\u5165\u5E93\u91CF
checkoutSettings.mode.produceDate=\u751F\u4EA7\u65E5\u671F\u4F18\u5148
\ No newline at end of file \ 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 \ No newline at end of file
...@@ -124,12 +124,44 @@ ...@@ -124,12 +124,44 @@
</form:form> </form:form>
<div class="table-toolbar"> <div class="table-toolbar">
<div class="col-md-4"> <div class="col-md-4">
<div class="btn-group"> <div class="col-md-4" style="margin-left: 15px; padding-left: 0;">
<button class="btn yellow" id="checkoutBtn"> <div class="btn-group" style="display: flex; align-items: center; gap: 8px; flex-wrap: nowrap; width: auto;">
<i class="fa fa-sign-out"></i><fmt:message key="storagePosFind.outSelect"/></button> <!-- 出库类型标签 -->
<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>
<div class="col-md-4"> <div class="col-md-4">
</div> </div>
...@@ -215,6 +247,9 @@ ...@@ -215,6 +247,9 @@
<fmt:formatDate value="${pos.barcode.expireDate}" pattern="yyyy-MM-dd"/> <fmt:formatDate value="${pos.barcode.expireDate}" pattern="yyyy-MM-dd"/>
</display:column> </display:column>
<display:column property="barcode.memo" titleKey="barcode.memo"/> <display:column property="barcode.memo" titleKey="barcode.memo"/>
<display:column titleKey="checkOut.operate" media="html"> <display:column titleKey="checkOut.operate" media="html">
<c:if test="${!limitCheckOut}"> <c:if test="${!limitCheckOut}">
<button class="btn yellow limit" id="btn${pos.id}" <button class="btn yellow limit" id="btn${pos.id}"
...@@ -271,7 +306,7 @@ ...@@ -271,7 +306,7 @@
$("#checkoutBtn").click(function(){ $("#checkoutBtn").click(function(){
var str= ""; var str= "";
$("[name=posIds]").each(function(){ $("[name=posIds]:visible").each(function(){
if($(this).attr("checked")){ if($(this).attr("checked")){
str+=$(this).val()+";"; str+=$(this).val()+";";
} }
...@@ -305,7 +340,9 @@ ...@@ -305,7 +340,9 @@
$("#btn"+ids[i]).attr("disabled","true"); $("#btn"+ids[i]).attr("disabled","true");
$("#check"+ids[i]).parent().attr("class","hide"); $("#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); alert(data);
}); });
} }
......
...@@ -24,10 +24,90 @@ ...@@ -24,10 +24,90 @@
overflow-y: auto; 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> </style>
<link href="${ctx}/scripts/lobibox/css/lobibox.min.css?id=2" rel="stylesheet" type="text/css"/> <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="row" id="codeBox">
<div class="col-md-6 col-sm-6"> <div class="col-md-6 col-sm-6">
<input type="text" class="form-control" id="scan-code"/> <input type="text" class="form-control" id="scan-code"/>
...@@ -162,6 +242,28 @@ ...@@ -162,6 +242,28 @@
<c:set var="scripts" scope="request"> <c:set var="scripts" scope="request">
<script type="text/javascript"> <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){ function showMsg(msg){
if(msg == ""){ if(msg == ""){
$("#msg").attr("class",""); $("#msg").attr("class","");
...@@ -191,10 +293,12 @@ ...@@ -191,10 +293,12 @@
$("#scan-code").change(function () { $("#scan-code").change(function () {
var codeValue = $(this).val(); var codeValue = $(this).val();
var workOrder = $.trim($("#work-order-input").val());
var checkType = $(".tab-item.active").find("a").text();
$(this).val(""); $(this).val("");
showMsg(""); showMsg("");
$(this).attr("placeholder", codeValue); $(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); showMsg(data);
if(data.indexOf("x") == 0){ if(data.indexOf("x") == 0){
//弹框,添加=7x8=尺寸信息后重新请求 //弹框,添加=7x8=尺寸信息后重新请求
...@@ -217,6 +321,11 @@ ...@@ -217,6 +321,11 @@
setInterval(function(){ setInterval(function(){
// 核心判断:如果工单号输入框正被聚焦(用户点击了),则不执行后续聚焦逻辑
if ($("#work-order-input").is(":focus")) {
return; // 直接返回,保留焦点在工单号输入框
}
if($('#allPartNumbers').is(':visible')) { if($('#allPartNumbers').is(':visible')) {
$("#searchPn").focus(); $("#searchPn").focus();
}else{ }else{
...@@ -225,6 +334,22 @@ ...@@ -225,6 +334,22 @@
}, 1000); }, 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开始 //页码从0开始
......
...@@ -167,11 +167,12 @@ ...@@ -167,11 +167,12 @@
<c:if test="${storage.cabinet}"> <c:if test="${storage.cabinet}">
<c:set var="detailUrl" value="${ctx}/cabinet/${storage.cid}"/> <c:set var="detailUrl" value="${ctx}/cabinet/${storage.cid}"/>
</c:if> </c:if>
<c:if test="${storage.shelf}"> <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>
<c:if test="${storage.accShelf}"> <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>
<c:if test="${storage.codeShelf}"> <c:if test="${storage.codeShelf}">
......
...@@ -24,10 +24,91 @@ ...@@ -24,10 +24,91 @@
overflow-y: auto; 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> </style>
<link href="${ctx}/scripts/lobibox/css/lobibox.min.css?id=2" rel="stylesheet" type="text/css"/> <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="row" id="codeBox">
<div class="col-md-6 col-sm-6"> <div class="col-md-6 col-sm-6">
<input type="text" class="form-control" id="scan-code"/> <input type="text" class="form-control" id="scan-code"/>
...@@ -162,6 +243,31 @@ ...@@ -162,6 +243,31 @@
<c:set var="scripts" scope="request"> <c:set var="scripts" scope="request">
<script type="text/javascript"> <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){ function showMsg(msg){
if(msg == ""){ if(msg == ""){
$("#msg").attr("class",""); $("#msg").attr("class","");
...@@ -191,10 +297,12 @@ ...@@ -191,10 +297,12 @@
$("#scan-code").change(function () { $("#scan-code").change(function () {
var codeValue = $(this).val(); var codeValue = $(this).val();
var workOrder = $.trim($("#work-order-input").val());
var checkType = $(".tab-item.active").find("a").text();
$(this).val(""); $(this).val("");
showMsg(""); showMsg("");
$(this).attr("placeholder", codeValue); $(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); showMsg(data);
if(data.indexOf("x") == 0){ if(data.indexOf("x") == 0){
//弹框,添加=7x8=尺寸信息后重新请求 //弹框,添加=7x8=尺寸信息后重新请求
...@@ -217,6 +325,11 @@ ...@@ -217,6 +325,11 @@
setInterval(function(){ setInterval(function(){
// 核心判断:如果工单号输入框正被聚焦(用户点击了),则不执行后续聚焦逻辑
if ($("#work-order-input").is(":focus")) {
return; // 直接返回,保留焦点在工单号输入框
}
if($('#allPartNumbers').is(':visible')) { if($('#allPartNumbers').is(':visible')) {
$("#searchPn").focus(); $("#searchPn").focus();
}else{ }else{
...@@ -224,7 +337,22 @@ ...@@ -224,7 +337,22 @@
} }
}, 1000); }, 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开始 //页码从0开始
......
...@@ -229,7 +229,7 @@ RI,PN,QTY ...@@ -229,7 +229,7 @@ RI,PN,QTY
,CT41-0805-2R1-50V-104K,281 ,CT41-0805-2R1-50V-104K,281
,CT41-0603-2R1-50V-104K,282 ,CT41-0603-2R1-50V-104K,282
,CT41-1206-2R1-50V-334K,283 ,CT41-1206-2R1-50V-334K,283
,3DK2B(쫄),284 ,3DK2B?쫄),284
,TLP281-4,285 ,TLP281-4,285
,RMK1608(0603)-0.063W-K-B-222J(RMK1608(0603)-0.1W-K-B-222J),286 ,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 ,RMK1608(0603)-0.063W-K-B-100J(RMK1608(0603)-0.1W-K-B-100J),287
...@@ -265,7 +265,7 @@ RI,PN,QTY ...@@ -265,7 +265,7 @@ RI,PN,QTY
,1N4004,317 ,1N4004,317
,RMK3216(1206)-0.25W-K-B-104J,318 ,RMK3216(1206)-0.25W-K-B-104J,318
,RMK3216(1206)-0.25W-K-B-511J,319 ,RMK3216(1206)-0.25W-K-B-511J,319
,3DK2B(쫄),320 ,3DK2B?쫄),320
,CT41-2220-2R1-50V-106M,321 ,CT41-2220-2R1-50V-106M,321
,J28C-96T2J,322 ,J28C-96T2J,322
,JZC-200MD/027-01(토없鍍득),323 ,JZC-200MD/027-01(토없鍍득),323
...@@ -304,4 +304,4 @@ RI,PN,QTY ...@@ -304,4 +304,4 @@ RI,PN,QTY
,16XSZ3112-03/2,361 ,16XSZ3112-03/2,361
,54HC138,362 ,54HC138,362
,SN74HC573D(욱룐陋),363 ,SN74HC573D(욱룐陋),363
,,齡데훙:HJYAN
\ No newline at end of file \ No newline at end of file
,,齡데훙:HJYAN
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!