Commit d4259566 sunke

移远料号两种规格处理

料仓温湿度单独页面展示
确认尺寸有误时,重新获取刷新
需求单中包装料架清理
3天前工单自动关闭
发送Qisda时,状态为0和-1都进行重发
大于7寸的盘使用完全兼容,7寸盘使用同尺寸兼容
包装料仓优先放入当前仓中
包装料出库按生成时间顺序
1 个父辈 da869e65
正在显示 28 个修改的文件 包含 678 行增加159 行删除
...@@ -53,6 +53,26 @@ public class InquiryShelfBean { ...@@ -53,6 +53,26 @@ public class InquiryShelfBean {
} }
} }
/**
* 清理需求单中的A料架(主要是分盘料和紧急料)
*/
public static void clearPackageShelf(String hSerial){
if(hSerial != null){
Map<String, ShelfInfo> shelfMap = hSerialShelfMap.get(hSerial);
if(shelfMap != null){
Collection<ShelfInfo> allShelf = shelfMap.values();
for (ShelfInfo shelfInfo : allShelf) {
if(shelfInfo.isAShelf()){
log.info("清理["+hSerial+"]使用过的包装A料架["+shelfInfo.tempRfid()+"="+shelfInfo.tempRfid()+"]");
shelfMap.remove(shelfInfo.tempRfid());
}
}
hSerialShelfMap.put(hSerial,shelfMap);
QisdaCache.saveShelfMap(hSerialShelfMap);
}
}
}
public static boolean clearShelf(String hSerial, String rfid){ public static boolean clearShelf(String hSerial, String rfid){
boolean clearResult = false; boolean clearResult = false;
if(hSerial != null){ if(hSerial != null){
......
...@@ -36,9 +36,13 @@ public abstract class AbstractMongoDao implements IMongoDao { ...@@ -36,9 +36,13 @@ public abstract class AbstractMongoDao implements IMongoDao {
if (bean.getId() == null || "".equals(bean.getId())) { if (bean.getId() == null || "".equals(bean.getId())) {
bean.setId(getNextId(getEntityClass().getName())); bean.setId(getNextId(getEntityClass().getName()));
log.debug("Bean is created with id: " + bean.getId()); log.debug("Bean is created with id: " + bean.getId());
bean.setCreateDate(new Date(System.currentTimeMillis()));
} }
bean.setUpdateDate(new Date(System.currentTimeMillis()));
if(bean.getCreateDate() == null){
bean.setCreateDate(new Date());
}
bean.setUpdateDate(new Date());
getMongoTemplate().save(bean); getMongoTemplate().save(bean);
log.debug("Bean " + getEntityClass() + " is saved with id " + bean.getId()); log.debug("Bean " + getEntityClass() + " is saved with id " + bean.getId());
return bean; return bean;
...@@ -49,8 +53,8 @@ public abstract class AbstractMongoDao implements IMongoDao { ...@@ -49,8 +53,8 @@ public abstract class AbstractMongoDao implements IMongoDao {
if(beanList != null && !beanList.isEmpty()){ if(beanList != null && !beanList.isEmpty()){
for (T t:beanList){ for (T t:beanList){
t.setId(getNextId(getEntityClass().getName())); t.setId(getNextId(getEntityClass().getName()));
t.setCreateDate(new Date(System.currentTimeMillis())); t.setCreateDate(new Date());
t.setUpdateDate(new Date(System.currentTimeMillis())); t.setUpdateDate(new Date());
} }
getMongoTemplate().insertAll(beanList); getMongoTemplate().insertAll(beanList);
} }
......
...@@ -42,7 +42,7 @@ public interface IStoragePosManager extends IManager<StoragePos> { ...@@ -42,7 +42,7 @@ public interface IStoragePosManager extends IManager<StoragePos> {
List<StoragePos> getEmptyPosByLimitPn(String storageId, String limitPn); List<StoragePos> getEmptyPosByLimitPn(String storageId, String limitPn);
List<StoragePos> getEmptyPosList(List<Storage> storageList, Barcode barcode, Collection<String> excludePosIds); // List<StoragePos> getEmptyPosList(List<Storage> storageList, Barcode barcode, Collection<String> excludePosIds);
StoragePos getEmptyPosByStorage(Storage storage, Barcode barcode, Collection<String> excludePosIds) throws ValidateException; StoragePos getEmptyPosByStorage(Storage storage, Barcode barcode, Collection<String> excludePosIds) throws ValidateException;
......
...@@ -91,55 +91,55 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -91,55 +91,55 @@ public class StoragePosManagerImpl implements IStoragePosManager {
return storagePosList; return storagePosList;
} }
@Override // @Override
public List<StoragePos> getEmptyPosList(List<Storage> storageList, Barcode barcode, Collection<String> excludePosIds){ // public List<StoragePos> getEmptyPosList(List<Storage> storageList, Barcode barcode, Collection<String> excludePosIds){
List<String> exactMatchStorageIdList = new ArrayList<>(); // List<String> exactMatchStorageIdList = new ArrayList<>();
List<String> sizeCompatibleStorageIdList = new ArrayList<>(); // List<String> sizeCompatibleStorageIdList = new ArrayList<>();
List<String> heightCompatibleStorageIdList = new ArrayList<>(); // List<String> heightCompatibleStorageIdList = new ArrayList<>();
for (Storage storage : storageList) { // for (Storage storage : storageList) {
StorageConstants.COMPATIBLE_TYPE compatibleType = storage.getCompatibleType(); // StorageConstants.COMPATIBLE_TYPE compatibleType = storage.getCompatibleType();
if(compatibleType == StorageConstants.COMPATIBLE_TYPE.EXACT_MATCH) {//完全匹配 // if(compatibleType == StorageConstants.COMPATIBLE_TYPE.EXACT_MATCH) {//完全匹配
exactMatchStorageIdList.add(storage.getId()); // exactMatchStorageIdList.add(storage.getId());
}else if(compatibleType == StorageConstants.COMPATIBLE_TYPE.FULLY_COMPATIBLE){//同厚度兼容 // }else if(compatibleType == StorageConstants.COMPATIBLE_TYPE.FULLY_COMPATIBLE){//同厚度兼容
if(barcode.getPlateSize() != 7){ // if(barcode.getPlateSize() != 7){
heightCompatibleStorageIdList.add(storage.getId()); // heightCompatibleStorageIdList.add(storage.getId());
}else{ // }else{
//=7寸使用完全匹配 // //=7寸使用完全匹配
exactMatchStorageIdList.add(storage.getId()); // sizeCompatibleStorageIdList.add(storage.getId());
}
}else if(compatibleType == StorageConstants.COMPATIBLE_TYPE.SIZE_COMPATIBLE){//同尺寸兼容
sizeCompatibleStorageIdList.add(storage.getId());
}
}
Criteria c = Criteria.where("id").nin(excludePosIds).and("used").is(false).and("enabled").is(true);
//if(!exactMatchStorageIdList.isEmpty()){
Criteria exactMatchCriteria = Criteria.where("storageId").in(exactMatchStorageIdList).and("w").is(barcode.getPlateSize()).and("h").is(barcode.getHeight());
//conditionCriteria.orOperator(exactMatchCriteria);
//c.andOperator(exactMatchCriteria);
// } // }
// //
// if(!sizeCompatibleStorageIdList.isEmpty()){ // }else if(compatibleType == StorageConstants.COMPATIBLE_TYPE.SIZE_COMPATIBLE){//同尺寸兼容
Criteria sizeCompatibleCriteria = Criteria.where("storageId").in(sizeCompatibleStorageIdList).and("w").is(barcode.getPlateSize()).and("h").gte(barcode.getHeight()); // sizeCompatibleStorageIdList.add(storage.getId());
// conditionCriteria.orOperator(sizeCompatibleCriteria);
// } // }
// }
//
// Criteria c = Criteria.where("id").nin(excludePosIds).and("used").is(false).and("enabled").is(true);
// //if(!exactMatchStorageIdList.isEmpty()){
// Criteria exactMatchCriteria = Criteria.where("storageId").in(exactMatchStorageIdList).and("w").is(barcode.getPlateSize()).and("h").is(barcode.getHeight());
// //conditionCriteria.orOperator(exactMatchCriteria);
// //c.andOperator(exactMatchCriteria);
//// }
////
//// if(!sizeCompatibleStorageIdList.isEmpty()){
// Criteria sizeCompatibleCriteria = Criteria.where("storageId").in(sizeCompatibleStorageIdList).and("w").is(barcode.getPlateSize()).and("h").gte(barcode.getHeight());
//// conditionCriteria.orOperator(sizeCompatibleCriteria);
//// }
////
//// if(!heightCompatibleStorageIdList.isEmpty()){
// Criteria heightCompatibleCriteria = Criteria.where("storageId").in(heightCompatibleStorageIdList).and("w").gte(barcode.getPlateSize()).and("h").gte(barcode.getHeight());
//// conditionCriteria.orOperator(heightCompatibleCriteria);
//// }
//
// //
// if(!heightCompatibleStorageIdList.isEmpty()){ // Criteria conditionCriteria = new Criteria().orOperator(exactMatchCriteria,sizeCompatibleCriteria,heightCompatibleCriteria);
Criteria heightCompatibleCriteria = Criteria.where("storageId").in(heightCompatibleStorageIdList).and("w").gte(barcode.getPlateSize()).and("h").is(barcode.getHeight()); //
// conditionCriteria.orOperator(heightCompatibleCriteria); // Query query = new Query(new Criteria().andOperator(c, conditionCriteria));
// //优先放入最合适的位置(根据尺寸),相同尺寸按优先级排序
// query.with(new Sort(Sort.Direction.ASC, "w").and(new Sort(Sort.Direction.ASC, "h")).and(new Sort(Sort.Direction.DESC, "priority")));
// query.limit(1);
// return storagePosDao.findByQuery(query);
// } // }
Criteria conditionCriteria = new Criteria().orOperator(exactMatchCriteria,sizeCompatibleCriteria,heightCompatibleCriteria);
Query query = new Query(new Criteria().andOperator(c, conditionCriteria));
//优先放入最合适的位置(根据尺寸),相同尺寸按优先级排序
query.with(new Sort(Sort.Direction.ASC, "w").and(new Sort(Sort.Direction.ASC, "h")).and(new Sort(Sort.Direction.DESC, "priority")));
query.limit(1);
return storagePosDao.findByQuery(query);
}
@Override @Override
public StoragePos getEmptyPosByStorage(Storage storage, Barcode barcode, Collection<String> excludePosIds) throws ValidateException { public StoragePos getEmptyPosByStorage(Storage storage, Barcode barcode, Collection<String> excludePosIds) throws ValidateException {
...@@ -156,10 +156,10 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -156,10 +156,10 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}else if(compatibleType == StorageConstants.COMPATIBLE_TYPE.FULLY_COMPATIBLE){//同厚度兼容 }else if(compatibleType == StorageConstants.COMPATIBLE_TYPE.FULLY_COMPATIBLE){//同厚度兼容
//c = c.and("w").gte(barcode.getPlateSize()).and("h").gte(barcode.getHeight());//宽度大于等于料盘宽度,高度大于等于料盘高度 //c = c.and("w").gte(barcode.getPlateSize()).and("h").gte(barcode.getHeight());//宽度大于等于料盘宽度,高度大于等于料盘高度
if(barcode.getPlateSize() != 7){ if(barcode.getPlateSize() != 7){
c = c.and("w").gte(barcode.getPlateSize()).and("h").is(barcode.getHeight());//宽度不同(除7寸),高度相同,向上兼容 c = c.and("w").gte(barcode.getPlateSize()).and("h").gte(barcode.getHeight());//除7寸外,完全兼容
}else{ }else{
//=7寸使用完全匹配 //=7寸使用同尺寸兼容
c = c.and("w").is(barcode.getPlateSize()).and("h").is(barcode.getHeight()); c = c.and("w").is(barcode.getPlateSize()).and("h").gte(barcode.getHeight());
} }
}else if(compatibleType == StorageConstants.COMPATIBLE_TYPE.SIZE_COMPATIBLE){//同尺寸兼容 }else if(compatibleType == StorageConstants.COMPATIBLE_TYPE.SIZE_COMPATIBLE){//同尺寸兼容
......
...@@ -441,9 +441,19 @@ public class BarcodeRule { ...@@ -441,9 +441,19 @@ public class BarcodeRule {
return codeBean; return codeBean;
} }
String supplier = supplier_item.getStrValue(codeArr);
//移远物料,需要进行料号转换 //移远物料,需要进行料号转换
if(partNumber.startsWith("QT")){ if(partNumber.startsWith("QT")){
log.info("料号["+partNumber+"]为移远料号,进行料号转换"); //第二个分号和第3个分号之间的长度(除了B以外的)=29,则取前12位,否则取前13位
//移远的供应商固定就是82012
supplier = "82012";
if(codeArr[2].length() != 30){
partNumber = codeArr[2].substring(1,14);
log.info("移远料号第二个分号和第3个分号之间的长度(除了B以外的)!=29取前13位:" + partNumber);
}
log.info("料号["+partNumber+"]为移远料号,固定供应商为82012,同时进行料号转换");
try { try {
partNumber = QisdaApi.PartNoMapping(partNumber); partNumber = QisdaApi.PartNoMapping(partNumber);
} catch (ApiException e) { } catch (ApiException e) {
...@@ -494,7 +504,6 @@ public class BarcodeRule { ...@@ -494,7 +504,6 @@ public class BarcodeRule {
//expireDate = c.getTime(); //expireDate = c.getTime();
} }
} }
String supplier = supplier_item.getStrValue(codeArr);
//南瑞使用整个条码作为唯一码 //南瑞使用整个条码作为唯一码
if(DataCache.isProductionFor(DataCache.CUSTOMER.NANRUI)){ if(DataCache.isProductionFor(DataCache.CUSTOMER.NANRUI)){
...@@ -577,6 +586,8 @@ public class BarcodeRule { ...@@ -577,6 +586,8 @@ public class BarcodeRule {
codeStr = "=7x8=L00002019090199951797;E20190901 0365;B8C.R2003.V81506072019090103000;R506072019102200356"; codeStr = "=7x8=L00002019090199951797;E20190901 0365;B8C.R2003.V81506072019090103000;R506072019102200356";
codeStr = "=7x8=L0000000000000BF5NT8R;E20190605 0730 ;B7H.10524.5B1035042019060504000 ;R035042019060510182##"; codeStr = "=7x8=L0000000000000BF5NT8R;E20190605 0730 ;B7H.10524.5B1035042019060504000 ;R035042019060510182##";
codeStr = "=7x8=L0000000000SB1177082J;E20200316 0365;B7H.10421.2B1821872020031604000;R821872020031603034"; codeStr = "=7x8=L0000000000SB1177082J;E20200316 0365;B7H.10421.2B1821872020031604000;R821872020031603034";
codeStr = "=7x8=L365K000410;E20200524 0730;BQT0011000884C04192020052415000;R04192020053050254";
codeStr = "=7x8=L338J002486;E20190817 0730;BQT001100087104192019081715000;R04192019091281523";
BarcodeRule br = BarcodeRule.newRule(rule); BarcodeRule br = BarcodeRule.newRule(rule);
Barcode barcode = br.toCodeBean(codeStr).getBarcode(); Barcode barcode = br.toCodeBean(codeStr).getBarcode();
if(barcode != null){ if(barcode != null){
......
...@@ -315,7 +315,7 @@ public class QisdaApi { ...@@ -315,7 +315,7 @@ public class QisdaApi {
paramMap.put("reelid",reelid); paramMap.put("reelid",reelid);
paramMap.put("partNum",partNum); paramMap.put("partNum",partNum);
log.info("纯入库判断参数:reelid=" + reelid); log.info("纯入库判断参数:reelid=" + reelid + " partNum=" + partNum);
try { try {
//0+提示信息/1+工单 0:为NG ;1:为OK 工单号码则表示该料卷被绑定在此工单上;-1为内部异常 //0+提示信息/1+工单 0:为NG ;1:为OK 工单号码则表示该料卷被绑定在此工单上;-1为内部异常
String result = HttpHelper.postParam(url,paramMap); String result = HttpHelper.postParam(url,paramMap);
...@@ -419,8 +419,8 @@ public class QisdaApi { ...@@ -419,8 +419,8 @@ public class QisdaApi {
String result = HttpHelper.postParam(url,paramMap); String result = HttpHelper.postParam(url,paramMap);
log.info(reelID + "纯入库操作完成时通知Qisda接口(VMILocationIn)返回:" + result); log.info(reelID + "纯入库操作完成时通知Qisda接口(VMILocationIn)返回:" + result);
String resultStr = XmlUtil.getNodeBody("string", result); String resultStr = XmlUtil.getNodeBody("string", result);
if(resultStr.startsWith("-1")){ if(resultStr.startsWith("-1") || resultStr.startsWith("0")){
log.info("Qisda接口内部异常,需要进行重发"); log.info(reelID + "Qisda接口调用失败,需要进行重发");
}else{ }else{
QisdaCache.removeFailedRequest(apiRequest); QisdaCache.removeFailedRequest(apiRequest);
return; return;
...@@ -465,8 +465,8 @@ public class QisdaApi { ...@@ -465,8 +465,8 @@ public class QisdaApi {
String result = HttpHelper.postParam(url,paramMap); String result = HttpHelper.postParam(url,paramMap);
log.info("DN单收料或Facility收料["+barcode.getBarcode()+"]接口返回:" + result); log.info("DN单收料或Facility收料["+barcode.getBarcode()+"]接口返回:" + result);
String resultStr = XmlUtil.getNodeBody("string", result); String resultStr = XmlUtil.getNodeBody("string", result);
if(resultStr.startsWith("-1")){ if(resultStr.startsWith("-1") || resultStr.startsWith("0")){
log.info("Qisda接口内部异常,需要进行重发"); log.info(barcode.getBarcode() + "Qisda接口调用失败,需要进行重发");
}else{ }else{
QisdaCache.removeFailedRequest(apiRequest); QisdaCache.removeFailedRequest(apiRequest);
return; return;
...@@ -498,8 +498,8 @@ public class QisdaApi { ...@@ -498,8 +498,8 @@ public class QisdaApi {
String result = HttpHelper.postParam(url,paramMap); String result = HttpHelper.postParam(url,paramMap);
log.info(reelId + "出仓完成时通知Qisda(VMILocationOut)返回:" + result); log.info(reelId + "出仓完成时通知Qisda(VMILocationOut)返回:" + result);
String resultStr = XmlUtil.getNodeBody("string", result); String resultStr = XmlUtil.getNodeBody("string", result);
if(resultStr.startsWith("-1")){ if(resultStr.startsWith("-1") || resultStr.startsWith("0")){
log.info("Qisda接口内部异常,需要进行重发"); log.info(reelId + "Qisda接口调用失败,需要进行重发");
}else{ }else{
QisdaCache.removeFailedRequest(apiRequest); QisdaCache.removeFailedRequest(apiRequest);
return; return;
...@@ -569,8 +569,8 @@ public class QisdaApi { ...@@ -569,8 +569,8 @@ public class QisdaApi {
String result = HttpHelper.postParam(url,paramMap); String result = HttpHelper.postParam(url,paramMap);
log.info(task.getBarcode() + "物料放上小车时通知Qisda(VMIMateriaRecAss)返回:" + result); log.info(task.getBarcode() + "物料放上小车时通知Qisda(VMIMateriaRecAss)返回:" + result);
String resultStr = XmlUtil.getNodeBody("string", result); String resultStr = XmlUtil.getNodeBody("string", result);
if(resultStr.startsWith("-1")){ if(resultStr.startsWith("-1") || resultStr.startsWith("0")){
log.info("Qisda接口内部异常,需要进行重发"); log.info(task.getBarcode() + "Qisda接口调用失败,需要进行重发");
}else{ }else{
QisdaCache.removeFailedRequest(apiRequest); QisdaCache.removeFailedRequest(apiRequest);
return; return;
......
...@@ -526,7 +526,7 @@ public class StorageConstants { ...@@ -526,7 +526,7 @@ public class StorageConstants {
/** /**
* 完全兼容 * 完全兼容
*/ */
FULLY_COMPATIBLE("11,13,15同厚度兼容"), FULLY_COMPATIBLE("11,13,15完全兼容"),
/** /**
* 同尺寸兼容 * 同尺寸兼容
*/ */
......
...@@ -93,6 +93,8 @@ public class OutInfoCache { ...@@ -93,6 +93,8 @@ public class OutInfoCache {
public void executeOutTask(){ public void executeOutTask(){
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
for (OutInfo unEndOutInfo : getCachedOutInfos()) { for (OutInfo unEndOutInfo : getCachedOutInfos()) {
...@@ -527,6 +529,16 @@ public class OutInfoCache { ...@@ -527,6 +529,16 @@ public class OutInfoCache {
public void updateMustExeOutInfo(){ public void updateMustExeOutInfo(){
Date now = new Date(); Date now = new Date();
for (OutInfo outInfo : outInfoMap.values()) { for (OutInfo outInfo : outInfoMap.values()) {
if(now.getTime() - outInfo.getMdate().getTime() > 3 * 24 * 60 * 60 * 1000){
//3天前的需求单(非紧急料),关闭,并解绑
if(!outInfo.isUrgentAction()){
String so = outInfo.getSo();
log.info("需求单hSerial=["+outInfo.gethSerial()+"]工单so=["+so+"]soseq=["+outInfo.getSoseq()+"]的必须出库日期["+outInfo.getMdate()+"]为3天前,关闭并解绑工单");
closeSoSeq(outInfo.getSoseq());
continue;
}
}
if(outInfo.getFirstExecuteTime() == 0){ if(outInfo.getFirstExecuteTime() == 0){
boolean needToWaitQueue = false; boolean needToWaitQueue = false;
//未执行过的,已到达必须执行时间,任务提前到优先执行中 //未执行过的,已到达必须执行时间,任务提前到优先执行中
...@@ -691,7 +703,10 @@ public class OutInfoCache { ...@@ -691,7 +703,10 @@ public class OutInfoCache {
} }
}); });
Date itemUpdateTime = new Date();
for (OutItem outItem : itemList) { for (OutItem outItem : itemList) {
outItem.setUpdateDate(itemUpdateTime);
List<DataLog> itemTasks = new ArrayList<>(); List<DataLog> itemTasks = new ArrayList<>();
//首盘料需求单 //首盘料需求单
if(outItem.isFirstReelAction()){ if(outItem.isFirstReelAction()){
...@@ -708,9 +723,10 @@ public class OutInfoCache { ...@@ -708,9 +723,10 @@ public class OutInfoCache {
for (DataLog itemTask : itemTasks) { for (DataLog itemTask : itemTasks) {
tasks.add(itemTask); tasks.add(itemTask);
} }
} resetTaskNum(hSerial, tasks.size(),outInfoExecuted);
updateOutItem(outItem.getId()); updateOutItem(outItem.getId());
} }
}
int outReelNum = tasks.size(); int outReelNum = tasks.size();
...@@ -971,6 +987,8 @@ public class OutInfoCache { ...@@ -971,6 +987,8 @@ public class OutInfoCache {
DataLog task = new DataLog(); DataLog task = new DataLog();
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.setCreateDate(outItem.getUpdateDate());
Barcode barcode = pos.getBarcode(); Barcode barcode = pos.getBarcode();
if(barcode != null){ if(barcode != null){
......
...@@ -70,6 +70,12 @@ public class BoxChartController extends BaseController { ...@@ -70,6 +70,12 @@ public class BoxChartController extends BaseController {
return "storage/boxView"; return "storage/boxView";
} }
@RequestMapping("/boxShow/temperature/{cid}")
public String temperature(@PathVariable String cid, HttpServletRequest request){
request.getSession().setAttribute("show",cid);
return "storage/temperature";
}
@RequestMapping("/storage/boxChart.html") @RequestMapping("/storage/boxChart.html")
public String showChart(HttpServletRequest request) { public String showChart(HttpServletRequest request) {
......
...@@ -2,6 +2,7 @@ package com.myproject.webapp.controller.storage; ...@@ -2,6 +2,7 @@ package com.myproject.webapp.controller.storage;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.myproject.Constants; import com.myproject.Constants;
import com.myproject.bean.CodeBean;
import com.myproject.bean.update.Barcode; import com.myproject.bean.update.Barcode;
import com.myproject.bean.update.Component; import com.myproject.bean.update.Component;
import com.myproject.bean.update.StoragePos; import com.myproject.bean.update.StoragePos;
...@@ -10,6 +11,8 @@ import com.myproject.dao.mongo.IStoragePosDao; ...@@ -10,6 +11,8 @@ import com.myproject.dao.mongo.IStoragePosDao;
import com.myproject.exception.ValidateException; import com.myproject.exception.ValidateException;
import com.myproject.manager.IComponentManager; import com.myproject.manager.IComponentManager;
import com.myproject.util.DateUtil; import com.myproject.util.DateUtil;
import com.myproject.util.PLATE_SIZE;
import com.myproject.util.QisdaApi;
import com.myproject.util.StorageConstants; import com.myproject.util.StorageConstants;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -21,6 +24,7 @@ import org.springframework.ui.Model; ...@@ -21,6 +24,7 @@ import org.springframework.ui.Model;
import org.springframework.validation.BindingResult; import org.springframework.validation.BindingResult;
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;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.MultipartResolver; import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartFile; import org.springframework.web.multipart.commons.CommonsMultipartFile;
......
...@@ -119,23 +119,9 @@ public class RunStatusController extends BaseController{ ...@@ -119,23 +119,9 @@ public class RunStatusController extends BaseController{
request.setAttribute("inOutData", storageManager.getRunStatusData(startDay, endDay, pn)); request.setAttribute("inOutData", storageManager.getRunStatusData(startDay, endDay, pn));
ChartOption inOutChart = barcodeDao.inOutChart(startDay, endDay, StorageConstants.CHART_SHOW_TYPE.DAY); // String inOutJsonChart = getPcbInOutJsonChart(startDay, endDay,request);
Set<String> lengends = Sets.newHashSet(); // request.setAttribute("inOutChartJsonData", inOutJsonChart);
Collection<SeriesData> allSeries = inOutChart.getSeries();
for (SeriesData series : allSeries) {
String nameKey = series.getNameKey();
String name = super.getText(nameKey,request.getLocale());
series.setName(name);
lengends.add(name);
}
inOutChart.setLegend(lengends);
inOutChart.setSeries(allSeries);
try {
String inOutJsonChart = jsonMapper.writeValueAsString(inOutChart);
request.setAttribute("inOutChartJsonData", inOutJsonChart);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
request.setAttribute("alarmTypeData",alarmInfoDao.alarmChartByType(startDay,endDay)); request.setAttribute("alarmTypeData",alarmInfoDao.alarmChartByType(startDay,endDay));
request.setAttribute("alarmBoxData",alarmInfoDao.alarmChartByBox(startDay,endDay)); request.setAttribute("alarmBoxData",alarmInfoDao.alarmChartByBox(startDay,endDay));
...@@ -145,5 +131,49 @@ public class RunStatusController extends BaseController{ ...@@ -145,5 +131,49 @@ public class RunStatusController extends BaseController{
return "system/runStatus"; return "system/runStatus";
} }
@RequestMapping(value = "/service/store/inOutChartData")
@ResponseBody
public Collection<ChartItem> inOutChartJson(HttpServletRequest request) {
int dayNum = -7;
String daysStr = request.getParameter("days");
if(!Strings.isNullOrEmpty(daysStr)){
dayNum = 0 - Integer.valueOf(daysStr);
}
Date startDay = DateUtil.getNoTimeFromToday(dayNum);
Date endDay = new Date();
Collection<ChartItem> inOutData = storageManager.getRunStatusData(startDay, endDay, null);
return inOutData;
}
// private String getPcbInOutJsonChart(Date startDay, Date endDay, HttpServletRequest request){
// if(startDay == null){
// int dayNum = -7;
// startDay = DateUtil.getNoTimeFromToday(dayNum);
// }
//
// if(endDay == null){
// endDay = new Date();
// }
//
// ChartOption inOutChart = barcodeDao.inOutChart(startDay, endDay, StorageConstants.CHART_SHOW_TYPE.DAY);
// Set<String> lengends = Sets.newHashSet();
// Collection<SeriesData> allSeries = inOutChart.getSeries();
// for (SeriesData series : allSeries) {
// String nameKey = series.getNameKey();
// String name = super.getText(nameKey,request.getLocale());
// series.setName(name);
// lengends.add(name);
// }
// inOutChart.setLegend(lengends);
// inOutChart.setSeries(allSeries);
// try {
// String inOutJsonChart = jsonMapper.writeValueAsString(inOutChart);
// return inOutJsonChart;
// } catch (JsonProcessingException e) {
// e.printStackTrace();
// }
// return null;
// }
} }
...@@ -298,6 +298,18 @@ public class DataCache{ ...@@ -298,6 +298,18 @@ public class DataCache{
try { try {
Component component = getComponent(barcode); Component component = getComponent(barcode);
codeBeanFromRule.setError(null); codeBeanFromRule.setError(null);
if(codeBeanFromRule.isValid()){
Barcode barcodeFromCodeStr = codeBeanFromRule.getBarcode();
if(!barcode.getPartNumber().equals(barcodeFromCodeStr.getPartNumber())){
barcode.setPartNumber(barcodeFromCodeStr.getPartNumber());
barcode.setProvider(barcodeFromCodeStr.getProvider());
log.info("更新移远物料的PN为"+barcode.getPartNumber());
component = getComponent(barcode);
barcode = barcodeManager.save(barcode);
}
}
} catch (ValidateException e) { } catch (ValidateException e) {
codeBeanFromRule.setError(e.getMessage()); codeBeanFromRule.setError(e.getMessage());
......
...@@ -401,11 +401,11 @@ public class QisdaCache { ...@@ -401,11 +401,11 @@ public class QisdaCache {
String result = HttpHelper.postParam(apiRequest.getUrl(),apiRequest.getParamMap()); String result = HttpHelper.postParam(apiRequest.getUrl(),apiRequest.getParamMap());
log.info("重发通知指令[" + apiRequest.getMapKey() + "]到Qisda返回:" + result); log.info("重发通知指令[" + apiRequest.getMapKey() + "]到Qisda返回:" + result);
String resultStr = XmlUtil.getNodeBody("string", result); String resultStr = XmlUtil.getNodeBody("string", result);
if(resultStr.startsWith("-1")){ if(resultStr.startsWith("-1") || resultStr.startsWith("0")){
log.info("Qisda接口内部异常,需要进行重发"); log.info(apiRequest.getMapKey() + "Qisda接口调用失败,需要进行重发");
return;
}else{ }else{
QisdaCache.removeFailedRequest(apiRequest); QisdaCache.removeFailedRequest(apiRequest);
return;
} }
} }
} }
......
...@@ -192,16 +192,30 @@ public class QisdaDeviceController extends BaseController { ...@@ -192,16 +192,30 @@ public class QisdaDeviceController extends BaseController {
@ResponseBody @ResponseBody
public Object arriveRobot(HttpServletRequest request){ public Object arriveRobot(HttpServletRequest request){
String robotIndex = request.getParameter("robotIndex"); String robotIndex = request.getParameter("robotIndex");
String barcode = request.getParameter("barcode"); String codeStr = request.getParameter("barcode");
//更新位置任务,清空扫码任务 //更新位置任务,清空扫码任务
log.info("料盘["+barcode+"]到达机器人["+robotIndex+"]取料位置,更新位置任务,清空扫码任务"); log.info("料盘["+codeStr+"]到达机器人["+robotIndex+"]取料位置,更新位置任务,清空扫码任务");
if(robotIndex != null){ if(robotIndex != null){
try{ try{
Barcode barcode = dataCache.resolveOneValideBarcode(codeStr);
if(robotIndex.equals("1")){ if(robotIndex.equals("1")){
//1号位机器人 //1号位机器人
boolean firstRobtoSame = isSameTask(barcode,firstRobotTask);
if(firstRobtoSame){
//已经到达过一次,直接忽略
log.info("机器人["+robotIndex+"]当前取料任务与条码["+barcode.getBarcode()+"]一致,不再更新位置任务");
return "OK";
}
firstRobotTask = firstScanTask; firstRobotTask = firstScanTask;
log.info("将扫码任务["+firstRobotTask.getBarcode()+"]设置到机器人["+robotIndex+"]取料任务"); log.info("将扫码任务["+firstRobotTask.getBarcode()+"]设置到机器人["+robotIndex+"]取料任务");
}else if(robotIndex.equals("2")){ }else if(robotIndex.equals("2")){
boolean secondRobtoSame = isSameTask(barcode,secondRobotTask);
if(secondRobtoSame){
//已经到达过一次,直接忽略
log.info("机器人["+robotIndex+"]当前取料任务与条码["+barcode.getBarcode()+"]一致,不再更新位置任务");
return "OK";
}
secondRobotTask = secondScanTask; secondRobotTask = secondScanTask;
log.info("将扫码任务["+secondRobotTask.getBarcode()+"]设置到机器人["+robotIndex+"]取料任务"); log.info("将扫码任务["+secondRobotTask.getBarcode()+"]设置到机器人["+robotIndex+"]取料任务");
} }
...@@ -635,12 +649,16 @@ public class QisdaDeviceController extends BaseController { ...@@ -635,12 +649,16 @@ public class QisdaDeviceController extends BaseController {
//总的分盘和紧急料数量 //总的分盘和紧急料数量
int totalCutTask = 0; int totalCutTask = 0;
int totalUrgentTask = 0; int totalUrgentTask = 0;
int totalPackageCutTask = 0;
int totalPackageUrgentTask = 0;
List<DataLog> allTasks = taskService.getAllTasks(); List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog unFinishedTask : allTasks) { for (DataLog unFinishedTask : allTasks) {
if(!unFinishedTask.isFinished() && !unFinishedTask.isCancel() && unFinishedTask.isCheckOutTask()){ if(!unFinishedTask.isFinished() && !unFinishedTask.isCancel() && unFinishedTask.isCheckOutTask()){
if(unFinishedTask.isCutReel()){ if(unFinishedTask.isCutReel()){
totalCutTask = totalCutTask + 1; totalCutTask = totalCutTask + 1;
if(unFinishedTask.isPackageReel()){ if(unFinishedTask.isPackageReel()){
totalPackageCutTask = totalPackageCutTask + 1;
if(unFinishedTask.getCid().equals(cid)){ if(unFinishedTask.getCid().equals(cid)){
//当前包装料仓的分盘任务 //当前包装料仓的分盘任务
cutPackageTask = cutPackageTask + 1; cutPackageTask = cutPackageTask + 1;
...@@ -652,6 +670,7 @@ public class QisdaDeviceController extends BaseController { ...@@ -652,6 +670,7 @@ public class QisdaDeviceController extends BaseController {
}else if(unFinishedTask.isUrgentReel() || unFinishedTask.isLessSendReel() || unFinishedTask.getAppendInfo().isCheckAction()){ }else if(unFinishedTask.isUrgentReel() || unFinishedTask.isLessSendReel() || unFinishedTask.getAppendInfo().isCheckAction()){
totalUrgentTask = totalUrgentTask + 1; totalUrgentTask = totalUrgentTask + 1;
if(unFinishedTask.isPackageReel()) { if(unFinishedTask.isPackageReel()) {
totalPackageUrgentTask = totalPackageUrgentTask + 1;
if (unFinishedTask.getCid().equals(cid)) { if (unFinishedTask.getCid().equals(cid)) {
urgentPackageTask = urgentPackageTask + 1; urgentPackageTask = urgentPackageTask + 1;
} }
...@@ -659,23 +678,6 @@ public class QisdaDeviceController extends BaseController { ...@@ -659,23 +678,6 @@ public class QisdaDeviceController extends BaseController {
urgentTask = urgentTask + 1; urgentTask = urgentTask + 1;
} }
} }
// if(unFinishedTask.isPackageReel()){
// if(unFinishedTask.getCid().equals(cid)){
// if(unFinishedTask.isCutReel()){
// cutPackageTask = cutPackageTask + 1;
// totalCutTask = totalCutTask + 1;
// }else if(unFinishedTask.isUrgentReel()){
// urgentPackageTask = urgentPackageTask + 1;
// totalUrgentTask = totalUrgentTask + 1;
// }
// }
// }else if(unFinishedTask.isCutReel()){
// cutTask = cutTask + 1;
// totalCutTask = totalCutTask + 1;
// }else if(unFinishedTask.isUrgentReel()){
// urgentTask = urgentTask + 1;
// totalUrgentTask = totalUrgentTask + 1;
// }
} }
} }
...@@ -759,15 +761,41 @@ public class QisdaDeviceController extends BaseController { ...@@ -759,15 +761,41 @@ public class QisdaDeviceController extends BaseController {
//剩余任务数 //剩余任务数
String taskCid = task.getCid(); String taskCid = task.getCid();
Date taskDate = task.getCreateDate();
Collection<DataLog> waitTasks = taskService.getQueueTasks(); Collection<DataLog> waitTasks = taskService.getQueueTasks();
int taskCount = 0; int taskCount = 0;
int packageCutShelf = 0;
int packageUrgentTask = 0;
//同一个料仓的出库任务(等待中和正在执行的) //同一个料仓的出库任务(等待中和正在执行的)
for (DataLog waitTask : waitTasks) { for (DataLog waitTask : waitTasks) {
String waitCid = waitTask.getCid(); String waitCid = waitTask.getCid();
if(waitTask.isCheckOutTask() && waitCid != null && waitCid.equals(taskCid)){ Date waitTaskDate = waitTask.getCreateDate();
if(waitTask.isCheckOutTask() && waitCid != null && waitCid.equals(taskCid) && waitTaskDate.equals(taskDate)){
taskCount = taskCount + 1; taskCount = taskCount + 1;
} }
if(waitTask.isCheckOutTask() && waitTask.isPackageReel()){
if(waitTask.isCutReel()){
packageCutShelf = packageCutShelf + 1;
}else if(waitTask.isUrgentReel() || waitTask.isLessSendReel() || waitTask.getAppendInfo().isCheckAction()){
packageUrgentTask = packageUrgentTask + 1;
}
}
} }
if(packageCutShelf == 0){
//log.info("已无分盘料任务,清空分盘料使用料架/料串");
InquiryShelfBean.clearPackageShelf(InquiryShelfBean.CUT_SHELF_MAP_KEY);
}
if(packageUrgentTask == 0){
//log.info("已无紧急料任务,清空紧急料使用料架/料串");
InquiryShelfBean.clearPackageShelf(InquiryShelfBean.URGENT_SHELF_MAP_KEY);
}
Map<String,Object> resultMap = new HashMap<>(); Map<String,Object> resultMap = new HashMap<>();
resultMap.put("taskCount",taskCount+""); resultMap.put("taskCount",taskCount+"");
return ResultBean.newOkResult(resultMap); return ResultBean.newOkResult(resultMap);
...@@ -1094,11 +1122,29 @@ public class QisdaDeviceController extends BaseController { ...@@ -1094,11 +1122,29 @@ public class QisdaDeviceController extends BaseController {
Map<String, Storage> allStorage = dataCache.getAllStorage(); Map<String, Storage> allStorage = dataCache.getAllStorage();
for (Storage storage : allStorage.values()) { for (Storage storage : allStorage.values()) {
if(storage.isPackage()){ if(storage.isPackage()){
String cidTaskCountKey = storage.getCid() + "-taskCount";
//包装料仓 //包装料仓
resultMap.put(storage.getCid(), storage.getEmptySlots()+""); resultMap.put(storage.getCid(), storage.getEmptySlots()+"");
resultMap.put(cidTaskCountKey, 0);
}
}
try{
Collection<DataLog> queueTasks = taskService.getQueueTasks();
for (DataLog queueTask : queueTasks) {
if(queueTask.isPackageReel()){
String cidTaskCountKey = queueTask.getCid() + "-taskCount";
Object cidTaskCountObj = resultMap.get(cidTaskCountKey);
Integer cidTaskCount = Integer.valueOf(cidTaskCountObj.toString());
cidTaskCount = cidTaskCount + 1;
resultMap.put(cidTaskCountKey, cidTaskCount);
} }
} }
}catch (Exception e){ }catch (Exception e){
log.error("获取包装料空闲仓位时,计算任务数出错",e);
}
}catch (Exception e){
log.error("获取包装料仓空闲仓位出错",e); log.error("获取包装料仓空闲仓位出错",e);
} }
...@@ -1116,18 +1162,15 @@ public class QisdaDeviceController extends BaseController { ...@@ -1116,18 +1162,15 @@ public class QisdaDeviceController extends BaseController {
int taskCount = 0; int taskCount = 0;
String msg = "ok"; String msg = "ok";
if(shelfInfo != null){ if(shelfInfo != null){
Map<Integer, ShelfLoc> locMap = shelfInfo.getLocMap(); taskCount = shelfInfo.getEmptyLocCount();
for (ShelfLoc shelfLoc : locMap.values()) {
if(shelfLoc.isEmpty()){
taskCount = taskCount + 1;
}
}
}else{ }else{
log.info("AGV获取料架["+rfid+"]中的剩余任务数时未找到包装料架");
msg = "未找到包装料架"+rfid; msg = "未找到包装料架"+rfid;
} }
Map<String,Object> resultMap = new HashMap<>(); Map<String,Object> resultMap = new HashMap<>();
resultMap.put("taskCount",taskCount); resultMap.put("taskCount",taskCount);
resultMap.put("rfid",rfid); resultMap.put("rfid",rfid);
log.info("AGV获取料架["+rfid+"]中的剩余任务数:" + taskCount);
return ResultBean.newOkResult(msg, resultMap); return ResultBean.newOkResult(msg, resultMap);
} }
......
...@@ -17,11 +17,14 @@ import com.myproject.dao.mongo.ILiteOrderDao; ...@@ -17,11 +17,14 @@ import com.myproject.dao.mongo.ILiteOrderDao;
import com.myproject.dao.mongo.ILiteOrderItemDao; import com.myproject.dao.mongo.ILiteOrderItemDao;
import com.myproject.exception.ValidateException; import com.myproject.exception.ValidateException;
import com.myproject.manager.IBarcodeManager; import com.myproject.manager.IBarcodeManager;
import com.myproject.manager.IComponentManager;
import com.myproject.manager.IStorageManager; import com.myproject.manager.IStorageManager;
import com.myproject.manager.IStoragePosManager; import com.myproject.manager.IStoragePosManager;
import com.myproject.model.User; import com.myproject.model.User;
import com.myproject.service.UserManager; import com.myproject.service.UserManager;
import com.myproject.util.DateUtil; import com.myproject.util.DateUtil;
import com.myproject.util.PLATE_SIZE;
import com.myproject.util.QisdaApi;
import com.myproject.util.StorageConstants; import com.myproject.util.StorageConstants;
import com.myproject.webapp.controller.storage.BaseController; import com.myproject.webapp.controller.storage.BaseController;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -82,16 +85,19 @@ public class StorageDataController extends BaseController { ...@@ -82,16 +85,19 @@ public class StorageDataController extends BaseController {
@Autowired @Autowired
private IAlarmInfoDao alarmInfoDao; private IAlarmInfoDao alarmInfoDao;
@RequestMapping(value = "/testEmail") @Autowired
@ResponseBody private IComponentManager componentmanager;
public List<StoragePos> testEmail(HttpServletRequest request){
String b = request.getParameter("b"); // @RequestMapping(value = "/testEmail")
Barcode barcode = barcodeManager.findByBarcode(b); // @ResponseBody
// public List<StoragePos> testEmail(HttpServletRequest request){
Collection<Storage> allStorage = dataCache.getAllStorage().values(); // String b = request.getParameter("b");
List<StoragePos> posList = storagePosManager.getEmptyPosList(new ArrayList<Storage>(allStorage), barcode, new ArrayList<String>()); // Barcode barcode = barcodeManager.findByBarcode(b);
return posList; //
} // Collection<Storage> allStorage = dataCache.getAllStorage().values();
// List<StoragePos> posList = storagePosManager.getEmptyPosList(new ArrayList<Storage>(allStorage), barcode, new ArrayList<String>());
// return posList;
// }
@RequestMapping(value = "/countExpirePcb") @RequestMapping(value = "/countExpirePcb")
@ResponseBody @ResponseBody
...@@ -843,4 +849,30 @@ public class StorageDataController extends BaseController { ...@@ -843,4 +849,30 @@ public class StorageDataController extends BaseController {
out.close(); out.close();
} }
@RequestMapping(value = "/fetchSize")
@ResponseBody
public String fetchSize(HttpServletRequest request) {
String componentId = request.getParameter("componentId");
Component component = componentmanager.get(componentId);
if(component != null){
try {
PLATE_SIZE plateSize = QisdaApi.PartNoRule(component.getPartNumber(), component.getProvider());
if(plateSize != null){
component.setPlateSize(plateSize.getW());
component.setHeight(plateSize.getH());
component.setSizeConfirmed(true);
}else{
component.setSizeConfirmed(false);
}
componentmanager.save(component);
return "尺寸确认信息已更新,刷新页面查看";
} catch (Exception e) {
log.error("尺寸确认获取出错",e);
return "获取尺寸出错:" + e.getMessage();
}
}
return "刷新尺寸确认结果失败";
}
} }
...@@ -557,6 +557,17 @@ public class TaskService implements ITaskService { ...@@ -557,6 +557,17 @@ public class TaskService implements ITaskService {
} }
private synchronized StoragePos findEmptyPosInStorages(Barcode barcode, List<Storage> availbleStorageList, final Map<String,Integer> executingTaskCountMap){ private synchronized StoragePos findEmptyPosInStorages(Barcode barcode, List<Storage> availbleStorageList, final Map<String,Integer> executingTaskCountMap){
boolean isPackingStorage = false;
for (Storage storage : availbleStorageList) {
if(storage.isPackage()){
isPackingStorage = true;
break;
}
}
//不是包装料仓才需要按任务数排序,包装料仓优先放入第一个仓中
if(!isPackingStorage){
availbleStorageList.sort(new Comparator<Storage>() { availbleStorageList.sort(new Comparator<Storage>() {
@Override @Override
public int compare(Storage o1, Storage o2) { public int compare(Storage o1, Storage o2) {
...@@ -565,6 +576,8 @@ public class TaskService implements ITaskService { ...@@ -565,6 +576,8 @@ public class TaskService implements ITaskService {
return taskCount1.compareTo(taskCount2); return taskCount1.compareTo(taskCount2);
} }
}); });
}
Collection<String> operatingPosIds = excludePosIds(); Collection<String> operatingPosIds = excludePosIds();
for (Storage storage : availbleStorageList) { for (Storage storage : availbleStorageList) {
try{ try{
...@@ -877,6 +890,15 @@ public class TaskService implements ITaskService { ...@@ -877,6 +890,15 @@ public class TaskService implements ITaskService {
} }
} }
if(storage.isPackage()){
//包装料按生成顺序进行出库
DataLog packageTask = findEarliestPackageTask(storage);
if(packageTask != null){
log.info("出库最早生成的包装料任务:" + packageTask.getBarcode()+"["+packageTask.getPosName()+"]");
}
return packageTask;
}
//if(DataCache.isProductionFor(DataCache.CUSTOMER.QISDA)){ //if(DataCache.isProductionFor(DataCache.CUSTOMER.QISDA)){
//分盘料,按时间顺序进行出库 //分盘料,按时间顺序进行出库
...@@ -884,7 +906,7 @@ public class TaskService implements ITaskService { ...@@ -884,7 +906,7 @@ public class TaskService implements ITaskService {
for (DataLog task : waitTasks) { for (DataLog task : waitTasks) {
if(cid.equals(task.getCid()) && task.isCheckOutTask() && task.isWait()) { if(cid.equals(task.getCid()) && task.isCheckOutTask() && task.isWait()) {
//分盘料,紧急料和包装料,可以按时间顺序先出 //分盘料,紧急料和包装料,可以按时间顺序先出
if(task.isCutReel() || task.isUrgentReel() || task.isPackageReel() || task.isLessSendReel() || task.getAppendInfo().isCheckAction()){ if(task.isCutReel() || task.isUrgentReel() || task.isLessSendReel() || task.getAppendInfo().isCheckAction()){
if(urgentTask == null || urgentTask.getCreateDate().after(task.getCreateDate())){ if(urgentTask == null || urgentTask.getCreateDate().after(task.getCreateDate())){
urgentTask = task; urgentTask = task;
} }
...@@ -892,7 +914,7 @@ public class TaskService implements ITaskService { ...@@ -892,7 +914,7 @@ public class TaskService implements ITaskService {
} }
} }
if(urgentTask != null){ if(urgentTask != null){
log.info("出库最先生成的分盘/紧急/包装料任务"+urgentTask.getBarcode()+"["+urgentTask.getPosName()+"]"); log.info("出库最先生成的分盘/紧急任务"+urgentTask.getBarcode()+"["+urgentTask.getPosName()+"]");
return urgentTask; return urgentTask;
} }
...@@ -949,6 +971,70 @@ public class TaskService implements ITaskService { ...@@ -949,6 +971,70 @@ public class TaskService implements ITaskService {
} }
/**
* 查找最早生成的且料架号最小的包装料任务
* @return
*/
private DataLog findEarliestPackageTask(Storage storage){
Collection<DataLog> waitTasks = taskMap.values();
DataLog earliestTask = null;
for (DataLog waitTask : waitTasks) {
if(waitTask.isCheckOutTask() && waitTask.isPackageReel()) {
if(earliestTask == null){
earliestTask = waitTask;
}else{
if(earliestTask.getCreateDate().after(waitTask.getCreateDate())){
//时间比当前的任务早
earliestTask = waitTask;
}else if(earliestTask.getCreateDate().equals(waitTask.getCreateDate())){
AppendInfo appendInfo = waitTask.getAppendInfo();
int rfidIndex = appendInfo.getRfidIndex();
if(rfidIndex < earliestTask.getAppendInfo().getRfidIndex()){
earliestTask = waitTask;
}
}
}
}
}
DataLog storageTask = null;
//创建最早,且与最小料架号一致的才出库
if(earliestTask != null){
// if(storage.getCid().equals(earliestTask.getCid())){
// return earliestTask;
// }
for (DataLog waitTask : waitTasks) {
if (storage.getCid().equals(waitTask.getCid()) && waitTask.isPackageReel() && waitTask.isCheckOutTask()) {
if(waitTask.getCreateDate().equals(earliestTask.getCreateDate())){
//与创建最早的任务同时创建的
AppendInfo appendInfo = waitTask.getAppendInfo();
int rfidIndex = appendInfo.getRfidIndex();
if(rfidIndex <= earliestTask.getAppendInfo().getRfidIndex()){
storageTask = waitTask;
break;
}
}
}
//与最小料架号一样的紧急料,修改其他紧急料的时间
// if(earliestTask.isUrgentReel() || earliestTask.isCutReel()){
// if(waitTask.isPackageReel() && waitTask.isWait()){
// if(waitTask.getTempRfid().equals(earliestTask.getTempRfid())){
// Date earliestTaskDate = earliestTask.getCreateDate();
// if(!waitTask.getCreateDate().equals(earliestTaskDate)){
// log.info("修改紧急包装料["+waitTask.getBarcode()+"]的任务创建时间与["+earliestTask.getBarcode()+"]保持一致");
// waitTask.setCreateDate(earliestTaskDate);
// taskMap.put(waitTask.getId(), waitTask);
// }
// }
// }
// }
}
}
return storageTask;
}
/** /**
* 查找包装料最小料架的任务 * 查找包装料最小料架的任务
*/ */
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
</decorator> </decorator>
<decorator name="metroEmpty" page="metroEmpty.jsp"> <decorator name="metroEmpty" page="metroEmpty.jsp">
<pattern>/login</pattern> <pattern>/login</pattern>
<pattern>/boxShow/**</pattern>
</decorator> </decorator>
<decorator name="default" page="metroEmpty.jsp"> <decorator name="default" page="metroEmpty.jsp">
......
...@@ -105,6 +105,11 @@ ...@@ -105,6 +105,11 @@
<%--<display:column property="type" titleKey="类型"/>--%> <%--<display:column property="type" titleKey="类型"/>--%>
<display:column property="amount" titleKey="component.amount"/> <display:column property="amount" titleKey="component.amount"/>
<display:column titleKey="">
<button class="btn default" type="button"
onclick="flushSize('${component.id}')">刷新尺寸</button>
</display:column>
<display:setProperty name="paging.banner.item_name"><fmt:message <display:setProperty name="paging.banner.item_name"><fmt:message
key="component.item.name"/></display:setProperty> key="component.item.name"/></display:setProperty>
<display:setProperty name="paging.banner.items_name"><fmt:message <display:setProperty name="paging.banner.items_name"><fmt:message
...@@ -357,3 +362,18 @@ ...@@ -357,3 +362,18 @@
</div> </div>
</div> </div>
</c:if> </c:if>
<c:set var="scripts" scope="request">
<script>
function flushSize(componentId) {
$.post("${ctx}/service/store/fetchSize", {componentId:componentId}, function (data) {
alert(data);
});
}
</script>
</c:set>
\ No newline at end of file \ No newline at end of file
...@@ -165,9 +165,12 @@ ...@@ -165,9 +165,12 @@
<%--</display:column>--%> <%--</display:column>--%>
<%--<display:column titleKey="dataLog.batch" sortable="true" sortProperty="batchInfo" property="batchInfo"/>--%> <%--<display:column titleKey="dataLog.batch" sortable="true" sortProperty="batchInfo" property="batchInfo"/>--%>
<%--<display:column property="operator" titleKey="dataLog.operator" sortable="true" sortProperty="operator"/>--%> <%--<display:column property="operator" titleKey="dataLog.operator" sortable="true" sortProperty="operator"/>--%>
<display:column titleKey="dataLog.date" sortable="true" sortProperty="updateDate"> <display:column titleKey="创建时间" sortable="true" sortProperty="createDate">
<fmt:formatDate value="${dataLog.createDate}" pattern="yyyy-MM-dd HH:mm"/> <fmt:formatDate value="${dataLog.createDate}" pattern="yyyy-MM-dd HH:mm"/>
</display:column> </display:column>
<display:column titleKey="更新时间" sortable="true" sortProperty="updateDate">
<fmt:formatDate value="${dataLog.updateDate}" pattern="yyyy-MM-dd HH:mm"/>
</display:column>
<display:setProperty name="paging.banner.item_name"><fmt:message <display:setProperty name="paging.banner.item_name"><fmt:message
key="dataLog.item.name"/></display:setProperty> key="dataLog.item.name"/></display:setProperty>
...@@ -197,12 +200,12 @@ ...@@ -197,12 +200,12 @@
}); });
} }
$('.date-picker').datepicker({ // $('.date-picker').datepicker({
rtl: Metronic.isRTL(), // rtl: Metronic.isRTL(),
orientation: "left", // orientation: "left",
autoclose: true, // autoclose: true,
language:'zh-CN' // language:'zh-CN'
}); // });
}); });
</script> </script>
......
...@@ -32,6 +32,25 @@ ...@@ -32,6 +32,25 @@
<div class="clearfix"> <div class="clearfix">
</div> </div>
<div class="row "> <div class="row ">
<!--出入库 -->
<div class="col-md-12">
<!-- BEGIN CHART PORTLET-->
<div class="portlet light bordered">
<div class="portlet-title">
<div class="caption">
<i class="icon-bar-chart font-green-haze"></i>
<span class="caption-subject bold uppercase font-green-haze"><fmt:message key="runStatus.throughput"/></span>
</div>
<div class="tools">
</div>
</div>
<div class="portlet-body">
<div id="inOutChart" class="chart" style="height: 350px; overflow: hidden;">
</div>
</div>
</div>
<!-- END CHART PORTLET-->
</div>
<!--任务 --> <!--任务 -->
<div class="col-md-4 col-sm-4"> <div class="col-md-4 col-sm-4">
<div class="portlet light bordered"> <div class="portlet light bordered">
...@@ -40,7 +59,7 @@ ...@@ -40,7 +59,7 @@
<i class="fa fa-list"></i>任务 <i class="fa fa-list"></i>任务
</div> </div>
</div> </div>
<div class="portlet-body" style="height:713px;overflow: auto;"> <div class="portlet-body" style="height:300px;overflow: auto;">
<div class="task-content"> <div class="task-content">
<ul class="feeds" id="task"> <ul class="feeds" id="task">
</ul> </ul>
...@@ -121,6 +140,23 @@ ...@@ -121,6 +140,23 @@
</div> </div>
</div> </div>
</div> </div>
<!--产线 AGV-->
<div class="col-md-4 col-sm-4">
<div class="portlet light bordered">
<div class="portlet-title">
<div class="caption">
<i class="fa fa-list"></i>产线 AGV
</div>
</div>
<div class="portlet-body" style="height:300px;overflow: auto;">
<div class="task-content">
<ul class="feeds" id="lineAgv">
</ul>
</div>
</div>
</div>
</div>
</div> </div>
...@@ -131,12 +167,17 @@ ...@@ -131,12 +167,17 @@
<fmt:message key="boxView.taskWaiting" var="taskWaiting_label"/> <fmt:message key="boxView.taskWaiting" var="taskWaiting_label"/>
<fmt:message key="boxView.cancelTask" var="cancelTask_label"/> <fmt:message key="boxView.cancelTask" var="cancelTask_label"/>
<fmt:message key="runStatus.throughput" var="label_throughput"/>
<fmt:message key="runStatus.stockOut" var="label_stockOut"/>
<fmt:message key="runStatus.stockIn" var="label_stockIn"/>
<fmt:message key="inOutList.in" var="in_label"/> <fmt:message key="inOutList.in" var="in_label"/>
<fmt:message key="inOutList.out" var="out_label"/> <fmt:message key="inOutList.out" var="out_label"/>
<fmt:message key="dataLog.orderSource" var="source_label"/> <fmt:message key="dataLog.orderSource" var="source_label"/>
<c:set var="scripts" scope="request"> <c:set var="scripts" scope="request">
<script src="${ctx}/scripts/echarts.min.js"></script>
<script type="text/javascript"> <script type="text/javascript">
$(document).ready(function(){ $(document).ready(function(){
function flushMsgs(){ function flushMsgs(){
...@@ -227,6 +268,101 @@ ...@@ -227,6 +268,101 @@
flushMsgs(); flushMsgs();
updateTasks(); updateTasks();
}, 1000); }, 1000);
flushInOutChart = function (){
$.post("${ctx}/service/store/inOutChartData", {days: 30}, function (data) {
var days = new Array();
var putIns = new Array();
var checkOuts = new Array();
for(var i in data){
var inOutItem = data[i];
days.push(inOutItem.label);
putIns.push(inOutItem.value);
checkOuts.push(inOutItem.value2);
}
var inOutOption = {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow',
crossStyle: {
color: '#999'
}
}
},
toolbox: {
feature: {
magicType: {show: true, type: ['stack', 'tiled']},
dataView: {show: true, readOnly: true},
saveAsImage: {show: true}
}
},
legend: {
data:['${label_stockIn}','${label_stockOut}']
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: [
{
type: 'category',
data: days,
axisPointer: {
type: 'shadow'
}
}
],
yAxis: [
{
type: 'value',
name: '${label_throughput}',
min: 0,
//max: 250,
//interval: 50,
minInterval: 10,
axisLabel: {
formatter: '{value} '
}
}
],
series: [
{
name:'${label_stockIn}',
type:'bar',
stack: '总量',
itemStyle:{
normal: {
color: '#9b59b6'
}
},
data:putIns
},
{
name:'${label_stockOut}',
type:'bar',
stack: '总量',
itemStyle:{
normal: {
color: '#dfba49'
}
},
data:checkOuts
}
]
};
var inOutChart = echarts.init(document.getElementById("inOutChart"));
inOutChart.setOption(inOutOption);
});
}
flushInOutChart();
setInterval(function(){
flushInOutChart();
}, 60000);
}); });
</script> </script>
</c:set> </c:set>
\ No newline at end of file \ No newline at end of file
...@@ -201,9 +201,9 @@ ...@@ -201,9 +201,9 @@
</c:when> </c:when>
<c:otherwise> <c:otherwise>
<div class="portlet-title"> <div class="portlet-title">
<div class="col-md-4"><span class="boxtemperature"><fmt:message key="allBoxView.temperature"/>:-</span><br>${minTemperature}-${maxTemperature}℃</div> <div class="col-md-4"><a style="color:#FFFFFF;" href="${ctx}/boxShow/temperature/${storage.cid}"><span class="boxtemperature"><fmt:message key="allBoxView.temperature"/>:-</span><br>${minTemperature}-${maxTemperature}℃</a></div>
<div class="col-md-4" style="text-align:center;font-size: 28px;"><a style="color:#FFFFFF;" href="${detailUrl}">${storage.name}</a></div> <div class="col-md-4" style="text-align:center;font-size: 28px;"><a style="color:#FFFFFF;" href="${detailUrl}">${storage.name}</a></div>
<div class="col-md-4" style="text-align: right;"><span class="boxhumidity"><fmt:message key="allBoxView.humidity"/>:-</span><br>${minHumidity}-${maxHumidity}%</div> <div class="col-md-4" style="text-align: right;"><a style="color:#FFFFFF;" href="${ctx}/boxShow/temperature/${storage.cid}"><span class="boxhumidity"><fmt:message key="allBoxView.humidity"/>:-</span><br>${minHumidity}-${maxHumidity}%</a></div>
</div> </div>
<div class="portlet-body"> <div class="portlet-body">
<div class="task-content"> <div class="task-content">
...@@ -766,12 +766,16 @@ ...@@ -766,12 +766,16 @@
} }
setInterval(function(){ setInterval(function(){
flushLineMsg();
}, 1000);
setInterval(function(){
updateTasks("all"); updateTasks("all");
flushStatus(); flushStatus();
flushLineMsg(); //flushLineMsg();
flushUsageItem(); flushUsageItem();
//flushLiteOrders(); //flushLiteOrders();
}, 1000); }, 2000);
}); });
......
...@@ -83,7 +83,7 @@ ...@@ -83,7 +83,7 @@
<div class="portlet-body" style="padding-left: 30px;"> <div class="portlet-body" style="padding-left: 30px;">
<div class="col-md-12"> <div class="col-md-12">
<div class="input-group"> <div class="input-group">
<label class="control-label"><fmt:message key="系统更新,暂停出库"/> </label> <label class="control-label"><fmt:message key="系统更新,暂停出库"/> </label>
<form:checkbox path="stopOut"/> <form:checkbox path="stopOut"/>
</div> </div>
</div> </div>
......
...@@ -12,6 +12,85 @@ ...@@ -12,6 +12,85 @@
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<ul class="timeline"> <ul class="timeline">
<li class="timeline-grey">
<div class="timeline-time">
<span class="date">2020 </span>
<span class="time">08-24 </span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<h2>版本: V2020080824</h2>
<div class="timeline-content">
<ul>
<li>移远料号两种规格处理</li>
<li>料仓温湿度单独页面展示</li>
<li>确认尺寸有误时,重新获取刷新</li>
<li>需求单中包装料架清理</li>
<li>3天前工单自动关闭</li>
<li>发送Qisda时,状态为0和-1都进行重发</li>
<li>大于7寸的盘使用完全兼容,7寸盘使用同尺寸兼容</li>
<li>包装料仓优先放入当前仓中</li>
<li>包装料出库按生成时间顺序</li>
</ul>
</div>
</div>
</li>
<li class="timeline-purple">
<div class="timeline-time">
<span class="date">2020 </span>
<span class="time">08-12 </span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<h2>版本: V2020081212</h2>
<div class="timeline-content">
<ul>
<li>包装料仓出完分盘和紧急料时,清理包装料架信息</li>
</ul>
</div>
</div>
</li>
<li class="timeline-green">
<div class="timeline-time">
<span class="date">2020</span>
<span class="time">08-03</span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<h2>版本: V2020080317</h2>
<div class="timeline-content">
<ul>
<li>包装料仓出库逻辑修改</li>
<li>移远料号不一致问题</li>
<li>11,13,15寸盘改为完全兼容,7寸改为同尺寸兼容</li>
</ul>
</div>
</div>
</li>
<li class="timeline-blue">
<div class="timeline-time">
<span class="date">2020 </span>
<span class="time">07-31 </span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<h2>版本: V2020073117</h2>
<div class="timeline-content">
<ul>
<li>尺寸确认信息手动更新</li>
<li>调用Qisda接口返回-1和0时进行重发</li>
</ul>
</div>
</div>
</li>
<li class="timeline-yellow"> <li class="timeline-yellow">
<div class="timeline-time"> <div class="timeline-time">
<span class="date">2020 </span> <span class="date">2020 </span>
...@@ -112,7 +191,7 @@ ...@@ -112,7 +191,7 @@
<li class="timeline-yellow"> <li class="timeline-yellow">
<div class="timeline-time"> <div class="timeline-time">
<span class="date">2020 </span> <span class="date">2020 </span>
<span class="time">04-20 </span> <span class="time">06-16 </span>
</div> </div>
<div class="timeline-icon"> <div class="timeline-icon">
<i class="fa fa-clock-o"></i> <i class="fa fa-clock-o"></i>
......
...@@ -3,12 +3,13 @@ Login page ...@@ -3,12 +3,13 @@ Login page
***/ ***/
/* bg color */ /* bg color */
.login { .login {
background-color: #364150 !important; margin-top:10%;
/**background-color: #364150 !important;*/
} }
.login .logo { .login .logo {
margin: 0 auto; margin: 0 auto;
margin-top: 60px; /*margin-top: 60px;*/
padding: 15px; padding: 15px;
text-align: center; text-align: center;
} }
......
...@@ -4,15 +4,14 @@ ...@@ -4,15 +4,14 @@
*/ */
;(function($){ ;(function($){
$.fn.datepicker.dates['zh-CN'] = { $.fn.datepicker.dates['zh-CN'] = {
days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"], days: ["\u661F\u671F\u65E5", "\u661F\u671F\u4E00", "\u661F\u671F\u4E8C", "\u661F\u671F\u4E09", "\u661F\u671F\u56DB", "\u661F\u671F\u4E94", "\u661F\u671F\u516D", "\u661F\u671F\u65E5"],
daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"], daysShort: ["\u5468\u65E5", "\u5468\u4E00", "\u5468\u4E8C", "\u5468\u4E09", "\u5468\u56DB", "\u5468\u4E94", "\u5468\u516D", "\u5468\u65E5"],
daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"], daysMin: ["\u65E5", "\u4E00", "\u4E8C", "\u4E09", "\u56DB", "\u4E94", "\u516D", "\u65E5"],
months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], months: ["\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708"],
monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], monthsShort: ["\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708"],
today: "今日", today: "\u4ECA\u65E5",
weekStart: 1 weekStart: 1
}; };
$.fn.datepicker.dates['en'] = { $.fn.datepicker.dates['en'] = {
days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
......
...@@ -239,6 +239,7 @@ ...@@ -239,6 +239,7 @@
<div class="page-footer-inner"> <div class="page-footer-inner">
2016&copy; <a href="${ctx}/updateHistory.html">SMD BOX</a> 2016&copy; <a href="${ctx}/updateHistory.html">SMD BOX</a>
</div> </div>
<span class="right" style="color: #a3a3a3;">Version: 2020.08.24</span>
<div class="scroll-to-top"> <div class="scroll-to-top">
<i class="icon-arrow-up"></i> <i class="icon-arrow-up"></i>
</div> </div>
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
<link href="${ctx}/assets/global/plugins/uniform/css/uniform.default.css" rel="stylesheet" type="text/css"/> <link href="${ctx}/assets/global/plugins/uniform/css/uniform.default.css" rel="stylesheet" type="text/css"/>
<!-- END GLOBAL MANDATORY STYLES --> <!-- END GLOBAL MANDATORY STYLES -->
<!-- BEGIN PAGE LEVEL STYLES --> <!-- BEGIN PAGE LEVEL STYLES -->
<link href="${ctx}/assets/admin/pages/css/login.css" rel="stylesheet" type="text/css"/> <link href="${ctx}/assets/admin/pages/css/login.css?id=3" rel="stylesheet" type="text/css"/>
<!-- END PAGE LEVEL SCRIPTS --> <!-- END PAGE LEVEL SCRIPTS -->
<!-- BEGIN THEME STYLES --> <!-- BEGIN THEME STYLES -->
<link href="${ctx}/assets/global/css/components.css" id="style_components" rel="stylesheet" type="text/css"/> <link href="${ctx}/assets/global/css/components.css" id="style_components" rel="stylesheet" type="text/css"/>
...@@ -43,21 +43,10 @@ ...@@ -43,21 +43,10 @@
</head> </head>
<!-- END HEAD --> <!-- END HEAD -->
<!-- BEGIN BODY --> <!-- BEGIN BODY -->
<body class="login"> <body>
<!-- BEGIN SIDEBAR TOGGLER BUTTON -->
<div class="menu-toggler sidebar-toggler">
</div>
<!-- BEGIN LOGO -->
<div class="logo">
<a href="/">
<img src="${ctx}/assets/admin/layout/img/smdboxlogo1.png" alt=""/>
</a>
</div>
<!-- END LOGO --> <!-- END LOGO -->
<!-- BEGIN LOGIN --> <!-- BEGIN LOGIN -->
<div class="content">
<decorator:body/> <decorator:body/>
</div>
<div class="copyright"> <div class="copyright">
<%--Project--%> <%--Project--%>
...@@ -93,6 +82,7 @@ ...@@ -93,6 +82,7 @@
Demo.init(); Demo.init();
}); });
</script> </script>
<!-- END JAVASCRIPTS -->
<%= (request.getAttribute("scripts") != null) ? request.getAttribute("scripts") : "" %>
</body> </body>
</html> </html>
...@@ -4,8 +4,25 @@ ...@@ -4,8 +4,25 @@
<title><fmt:message key="login.title"/></title> <title><fmt:message key="login.title"/></title>
<meta name="menu" content="Login"/> <meta name="menu" content="Login"/>
</head> </head>
<body id="login"> <body id="login">
<div class="login">
<div class="content">
<!-- BEGIN SIDEBAR TOGGLER BUTTON -->
<div class="menu-toggler sidebar-toggler">
</div>
<!-- BEGIN LOGO -->
<div class="logo">
<a href="/">
<img src="${ctx}/assets/admin/layout/img/smdboxlogo1.png" alt=""/>
</a>
</div>
<form method="post" id="loginForm" action="<c:url value='/j_security_check'/>" <form method="post" id="loginForm" action="<c:url value='/j_security_check'/>"
onsubmit="saveUsername(this);return validateForm(this)" class="form-signin" autocomplete="off"> onsubmit="saveUsername(this);return validateForm(this)" class="form-signin" autocomplete="off">
<h3 class="form-title"> <h3 class="form-title">
...@@ -42,7 +59,9 @@ ...@@ -42,7 +59,9 @@
<%--<fmt:param><c:url value="/signup"/></fmt:param>--%> <%--<fmt:param><c:url value="/signup"/></fmt:param>--%>
<%--</fmt:message>--%> <%--</fmt:message>--%>
<%--</p>--%> <%--</p>--%>
</div>
</div>
<c:set var="scripts" scope="request"> <c:set var="scripts" scope="request">
<%@ include file="/scripts/login.js" %> <%@ include file="/scripts/login.js" %>
</c:set> </c:set>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!