Commit d4259566 sunke

移远料号两种规格处理

料仓温湿度单独页面展示
确认尺寸有误时,重新获取刷新
需求单中包装料架清理
3天前工单自动关闭
发送Qisda时,状态为0和-1都进行重发
大于7寸的盘使用完全兼容,7寸盘使用同尺寸兼容
包装料仓优先放入当前仓中
包装料出库按生成时间顺序
1 个父辈 da869e65
正在显示 28 个修改的文件 包含 688 行增加169 行删除
......@@ -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){
boolean clearResult = false;
if(hSerial != null){
......
......@@ -36,9 +36,13 @@ public abstract class AbstractMongoDao implements IMongoDao {
if (bean.getId() == null || "".equals(bean.getId())) {
bean.setId(getNextId(getEntityClass().getName()));
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);
log.debug("Bean " + getEntityClass() + " is saved with id " + bean.getId());
return bean;
......@@ -49,8 +53,8 @@ public abstract class AbstractMongoDao implements IMongoDao {
if(beanList != null && !beanList.isEmpty()){
for (T t:beanList){
t.setId(getNextId(getEntityClass().getName()));
t.setCreateDate(new Date(System.currentTimeMillis()));
t.setUpdateDate(new Date(System.currentTimeMillis()));
t.setCreateDate(new Date());
t.setUpdateDate(new Date());
}
getMongoTemplate().insertAll(beanList);
}
......
......@@ -42,7 +42,7 @@ public interface IStoragePosManager extends IManager<StoragePos> {
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;
......
......@@ -91,54 +91,54 @@ public class StoragePosManagerImpl implements IStoragePosManager {
return storagePosList;
}
@Override
public List<StoragePos> getEmptyPosList(List<Storage> storageList, Barcode barcode, Collection<String> excludePosIds){
List<String> exactMatchStorageIdList = new ArrayList<>();
List<String> sizeCompatibleStorageIdList = new ArrayList<>();
List<String> heightCompatibleStorageIdList = new ArrayList<>();
for (Storage storage : storageList) {
StorageConstants.COMPATIBLE_TYPE compatibleType = storage.getCompatibleType();
if(compatibleType == StorageConstants.COMPATIBLE_TYPE.EXACT_MATCH) {//完全匹配
exactMatchStorageIdList.add(storage.getId());
}else if(compatibleType == StorageConstants.COMPATIBLE_TYPE.FULLY_COMPATIBLE){//同厚度兼容
if(barcode.getPlateSize() != 7){
heightCompatibleStorageIdList.add(storage.getId());
}else{
//=7寸使用完全匹配
exactMatchStorageIdList.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);
// }
// @Override
// public List<StoragePos> getEmptyPosList(List<Storage> storageList, Barcode barcode, Collection<String> excludePosIds){
// List<String> exactMatchStorageIdList = new ArrayList<>();
// List<String> sizeCompatibleStorageIdList = new ArrayList<>();
// List<String> heightCompatibleStorageIdList = new ArrayList<>();
// for (Storage storage : storageList) {
// StorageConstants.COMPATIBLE_TYPE compatibleType = storage.getCompatibleType();
// if(compatibleType == StorageConstants.COMPATIBLE_TYPE.EXACT_MATCH) {//完全匹配
// exactMatchStorageIdList.add(storage.getId());
// }else if(compatibleType == StorageConstants.COMPATIBLE_TYPE.FULLY_COMPATIBLE){//同厚度兼容
// if(barcode.getPlateSize() != 7){
// heightCompatibleStorageIdList.add(storage.getId());
// }else{
// //=7寸使用完全匹配
// sizeCompatibleStorageIdList.add(storage.getId());
// }
//
// if(!sizeCompatibleStorageIdList.isEmpty()){
Criteria sizeCompatibleCriteria = Criteria.where("storageId").in(sizeCompatibleStorageIdList).and("w").is(barcode.getPlateSize()).and("h").gte(barcode.getHeight());
// conditionCriteria.orOperator(sizeCompatibleCriteria);
// }else if(compatibleType == StorageConstants.COMPATIBLE_TYPE.SIZE_COMPATIBLE){//同尺寸兼容
// sizeCompatibleStorageIdList.add(storage.getId());
// }
// }
//
// if(!heightCompatibleStorageIdList.isEmpty()){
Criteria heightCompatibleCriteria = Criteria.where("storageId").in(heightCompatibleStorageIdList).and("w").gte(barcode.getPlateSize()).and("h").is(barcode.getHeight());
// conditionCriteria.orOperator(heightCompatibleCriteria);
// }
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);
}
// 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);
//// }
//
//
// 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
public StoragePos getEmptyPosByStorage(Storage storage, Barcode barcode, Collection<String> excludePosIds) throws ValidateException {
......@@ -156,10 +156,10 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}else if(compatibleType == StorageConstants.COMPATIBLE_TYPE.FULLY_COMPATIBLE){//同厚度兼容
//c = c.and("w").gte(barcode.getPlateSize()).and("h").gte(barcode.getHeight());//宽度大于等于料盘宽度,高度大于等于料盘高度
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{
//=7寸使用完全匹配
c = c.and("w").is(barcode.getPlateSize()).and("h").is(barcode.getHeight());
//=7寸使用同尺寸兼容
c = c.and("w").is(barcode.getPlateSize()).and("h").gte(barcode.getHeight());
}
}else if(compatibleType == StorageConstants.COMPATIBLE_TYPE.SIZE_COMPATIBLE){//同尺寸兼容
......
......@@ -441,9 +441,19 @@ public class BarcodeRule {
return codeBean;
}
String supplier = supplier_item.getStrValue(codeArr);
//移远物料,需要进行料号转换
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 {
partNumber = QisdaApi.PartNoMapping(partNumber);
} catch (ApiException e) {
......@@ -494,7 +504,6 @@ public class BarcodeRule {
//expireDate = c.getTime();
}
}
String supplier = supplier_item.getStrValue(codeArr);
//南瑞使用整个条码作为唯一码
if(DataCache.isProductionFor(DataCache.CUSTOMER.NANRUI)){
......@@ -577,6 +586,8 @@ public class BarcodeRule {
codeStr = "=7x8=L00002019090199951797;E20190901 0365;B8C.R2003.V81506072019090103000;R506072019102200356";
codeStr = "=7x8=L0000000000000BF5NT8R;E20190605 0730 ;B7H.10524.5B1035042019060504000 ;R035042019060510182##";
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);
Barcode barcode = br.toCodeBean(codeStr).getBarcode();
if(barcode != null){
......
......@@ -315,7 +315,7 @@ public class QisdaApi {
paramMap.put("reelid",reelid);
paramMap.put("partNum",partNum);
log.info("纯入库判断参数:reelid=" + reelid);
log.info("纯入库判断参数:reelid=" + reelid + " partNum=" + partNum);
try {
//0+提示信息/1+工单 0:为NG ;1:为OK 工单号码则表示该料卷被绑定在此工单上;-1为内部异常
String result = HttpHelper.postParam(url,paramMap);
......@@ -419,8 +419,8 @@ public class QisdaApi {
String result = HttpHelper.postParam(url,paramMap);
log.info(reelID + "纯入库操作完成时通知Qisda接口(VMILocationIn)返回:" + result);
String resultStr = XmlUtil.getNodeBody("string", result);
if(resultStr.startsWith("-1")){
log.info("Qisda接口内部异常,需要进行重发");
if(resultStr.startsWith("-1") || resultStr.startsWith("0")){
log.info(reelID + "Qisda接口调用失败,需要进行重发");
}else{
QisdaCache.removeFailedRequest(apiRequest);
return;
......@@ -465,8 +465,8 @@ public class QisdaApi {
String result = HttpHelper.postParam(url,paramMap);
log.info("DN单收料或Facility收料["+barcode.getBarcode()+"]接口返回:" + result);
String resultStr = XmlUtil.getNodeBody("string", result);
if(resultStr.startsWith("-1")){
log.info("Qisda接口内部异常,需要进行重发");
if(resultStr.startsWith("-1") || resultStr.startsWith("0")){
log.info(barcode.getBarcode() + "Qisda接口调用失败,需要进行重发");
}else{
QisdaCache.removeFailedRequest(apiRequest);
return;
......@@ -498,8 +498,8 @@ public class QisdaApi {
String result = HttpHelper.postParam(url,paramMap);
log.info(reelId + "出仓完成时通知Qisda(VMILocationOut)返回:" + result);
String resultStr = XmlUtil.getNodeBody("string", result);
if(resultStr.startsWith("-1")){
log.info("Qisda接口内部异常,需要进行重发");
if(resultStr.startsWith("-1") || resultStr.startsWith("0")){
log.info(reelId + "Qisda接口调用失败,需要进行重发");
}else{
QisdaCache.removeFailedRequest(apiRequest);
return;
......@@ -569,8 +569,8 @@ public class QisdaApi {
String result = HttpHelper.postParam(url,paramMap);
log.info(task.getBarcode() + "物料放上小车时通知Qisda(VMIMateriaRecAss)返回:" + result);
String resultStr = XmlUtil.getNodeBody("string", result);
if(resultStr.startsWith("-1")){
log.info("Qisda接口内部异常,需要进行重发");
if(resultStr.startsWith("-1") || resultStr.startsWith("0")){
log.info(task.getBarcode() + "Qisda接口调用失败,需要进行重发");
}else{
QisdaCache.removeFailedRequest(apiRequest);
return;
......
......@@ -526,7 +526,7 @@ public class StorageConstants {
/**
* 完全兼容
*/
FULLY_COMPATIBLE("11,13,15同厚度兼容"),
FULLY_COMPATIBLE("11,13,15完全兼容"),
/**
* 同尺寸兼容
*/
......
......@@ -93,6 +93,8 @@ public class OutInfoCache {
public void executeOutTask(){
long now = System.currentTimeMillis();
for (OutInfo unEndOutInfo : getCachedOutInfos()) {
......@@ -527,6 +529,16 @@ public class OutInfoCache {
public void updateMustExeOutInfo(){
Date now = new Date();
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){
boolean needToWaitQueue = false;
//未执行过的,已到达必须执行时间,任务提前到优先执行中
......@@ -691,7 +703,10 @@ public class OutInfoCache {
}
});
Date itemUpdateTime = new Date();
for (OutItem outItem : itemList) {
outItem.setUpdateDate(itemUpdateTime);
List<DataLog> itemTasks = new ArrayList<>();
//首盘料需求单
if(outItem.isFirstReelAction()){
......@@ -708,8 +723,9 @@ public class OutInfoCache {
for (DataLog itemTask : itemTasks) {
tasks.add(itemTask);
}
resetTaskNum(hSerial, tasks.size(),outInfoExecuted);
updateOutItem(outItem.getId());
}
updateOutItem(outItem.getId());
}
......@@ -971,6 +987,8 @@ public class OutInfoCache {
DataLog task = new DataLog();
task.setType(StorageConstants.OP.CHECKOUT);
task.setStatus(StorageConstants.OP_STATUS.WAIT.name());
//同一批的设置一样的创建时间,用于包装仓出库
task.setCreateDate(outItem.getUpdateDate());
Barcode barcode = pos.getBarcode();
if(barcode != null){
......
......@@ -70,6 +70,12 @@ public class BoxChartController extends BaseController {
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")
public String showChart(HttpServletRequest request) {
......
......@@ -2,6 +2,7 @@ package com.myproject.webapp.controller.storage;
import com.google.common.base.Strings;
import com.myproject.Constants;
import com.myproject.bean.CodeBean;
import com.myproject.bean.update.Barcode;
import com.myproject.bean.update.Component;
import com.myproject.bean.update.StoragePos;
......@@ -10,6 +11,8 @@ import com.myproject.dao.mongo.IStoragePosDao;
import com.myproject.exception.ValidateException;
import com.myproject.manager.IComponentManager;
import com.myproject.util.DateUtil;
import com.myproject.util.PLATE_SIZE;
import com.myproject.util.QisdaApi;
import com.myproject.util.StorageConstants;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -21,6 +24,7 @@ import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
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.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
......
......@@ -119,23 +119,9 @@ public class RunStatusController extends BaseController{
request.setAttribute("inOutData", storageManager.getRunStatusData(startDay, endDay, pn));
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);
request.setAttribute("inOutChartJsonData", inOutJsonChart);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
// String inOutJsonChart = getPcbInOutJsonChart(startDay, endDay,request);
// request.setAttribute("inOutChartJsonData", inOutJsonChart);
request.setAttribute("alarmTypeData",alarmInfoDao.alarmChartByType(startDay,endDay));
request.setAttribute("alarmBoxData",alarmInfoDao.alarmChartByBox(startDay,endDay));
......@@ -145,5 +131,49 @@ public class RunStatusController extends BaseController{
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{
try {
Component component = getComponent(barcode);
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) {
codeBeanFromRule.setError(e.getMessage());
......
......@@ -401,11 +401,11 @@ public class QisdaCache {
String result = HttpHelper.postParam(apiRequest.getUrl(),apiRequest.getParamMap());
log.info("重发通知指令[" + apiRequest.getMapKey() + "]到Qisda返回:" + result);
String resultStr = XmlUtil.getNodeBody("string", result);
if(resultStr.startsWith("-1")){
log.info("Qisda接口内部异常,需要进行重发");
return;
if(resultStr.startsWith("-1") || resultStr.startsWith("0")){
log.info(apiRequest.getMapKey() + "Qisda接口调用失败,需要进行重发");
}else{
QisdaCache.removeFailedRequest(apiRequest);
return;
}
}
}
......
......@@ -192,16 +192,30 @@ public class QisdaDeviceController extends BaseController {
@ResponseBody
public Object arriveRobot(HttpServletRequest request){
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){
try{
Barcode barcode = dataCache.resolveOneValideBarcode(codeStr);
if(robotIndex.equals("1")){
//1号位机器人
boolean firstRobtoSame = isSameTask(barcode,firstRobotTask);
if(firstRobtoSame){
//已经到达过一次,直接忽略
log.info("机器人["+robotIndex+"]当前取料任务与条码["+barcode.getBarcode()+"]一致,不再更新位置任务");
return "OK";
}
firstRobotTask = firstScanTask;
log.info("将扫码任务["+firstRobotTask.getBarcode()+"]设置到机器人["+robotIndex+"]取料任务");
}else if(robotIndex.equals("2")){
boolean secondRobtoSame = isSameTask(barcode,secondRobotTask);
if(secondRobtoSame){
//已经到达过一次,直接忽略
log.info("机器人["+robotIndex+"]当前取料任务与条码["+barcode.getBarcode()+"]一致,不再更新位置任务");
return "OK";
}
secondRobotTask = secondScanTask;
log.info("将扫码任务["+secondRobotTask.getBarcode()+"]设置到机器人["+robotIndex+"]取料任务");
}
......@@ -635,12 +649,16 @@ public class QisdaDeviceController extends BaseController {
//总的分盘和紧急料数量
int totalCutTask = 0;
int totalUrgentTask = 0;
int totalPackageCutTask = 0;
int totalPackageUrgentTask = 0;
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog unFinishedTask : allTasks) {
if(!unFinishedTask.isFinished() && !unFinishedTask.isCancel() && unFinishedTask.isCheckOutTask()){
if(unFinishedTask.isCutReel()){
totalCutTask = totalCutTask + 1;
if(unFinishedTask.isPackageReel()){
totalPackageCutTask = totalPackageCutTask + 1;
if(unFinishedTask.getCid().equals(cid)){
//当前包装料仓的分盘任务
cutPackageTask = cutPackageTask + 1;
......@@ -652,6 +670,7 @@ public class QisdaDeviceController extends BaseController {
}else if(unFinishedTask.isUrgentReel() || unFinishedTask.isLessSendReel() || unFinishedTask.getAppendInfo().isCheckAction()){
totalUrgentTask = totalUrgentTask + 1;
if(unFinishedTask.isPackageReel()) {
totalPackageUrgentTask = totalPackageUrgentTask + 1;
if (unFinishedTask.getCid().equals(cid)) {
urgentPackageTask = urgentPackageTask + 1;
}
......@@ -659,23 +678,6 @@ public class QisdaDeviceController extends BaseController {
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 {
//剩余任务数
String taskCid = task.getCid();
Date taskDate = task.getCreateDate();
Collection<DataLog> waitTasks = taskService.getQueueTasks();
int taskCount = 0;
int packageCutShelf = 0;
int packageUrgentTask = 0;
//同一个料仓的出库任务(等待中和正在执行的)
for (DataLog waitTask : waitTasks) {
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;
}
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<>();
resultMap.put("taskCount",taskCount+"");
return ResultBean.newOkResult(resultMap);
......@@ -1094,10 +1122,28 @@ public class QisdaDeviceController extends BaseController {
Map<String, Storage> allStorage = dataCache.getAllStorage();
for (Storage storage : allStorage.values()) {
if(storage.isPackage()){
String cidTaskCountKey = storage.getCid() + "-taskCount";
//包装料仓
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){
log.error("获取包装料空闲仓位时,计算任务数出错",e);
}
}catch (Exception e){
log.error("获取包装料仓空闲仓位出错",e);
}
......@@ -1116,18 +1162,15 @@ public class QisdaDeviceController extends BaseController {
int taskCount = 0;
String msg = "ok";
if(shelfInfo != null){
Map<Integer, ShelfLoc> locMap = shelfInfo.getLocMap();
for (ShelfLoc shelfLoc : locMap.values()) {
if(shelfLoc.isEmpty()){
taskCount = taskCount + 1;
}
}
taskCount = shelfInfo.getEmptyLocCount();
}else{
log.info("AGV获取料架["+rfid+"]中的剩余任务数时未找到包装料架");
msg = "未找到包装料架"+rfid;
}
Map<String,Object> resultMap = new HashMap<>();
resultMap.put("taskCount",taskCount);
resultMap.put("rfid",rfid);
log.info("AGV获取料架["+rfid+"]中的剩余任务数:" + taskCount);
return ResultBean.newOkResult(msg, resultMap);
}
......
......@@ -17,11 +17,14 @@ import com.myproject.dao.mongo.ILiteOrderDao;
import com.myproject.dao.mongo.ILiteOrderItemDao;
import com.myproject.exception.ValidateException;
import com.myproject.manager.IBarcodeManager;
import com.myproject.manager.IComponentManager;
import com.myproject.manager.IStorageManager;
import com.myproject.manager.IStoragePosManager;
import com.myproject.model.User;
import com.myproject.service.UserManager;
import com.myproject.util.DateUtil;
import com.myproject.util.PLATE_SIZE;
import com.myproject.util.QisdaApi;
import com.myproject.util.StorageConstants;
import com.myproject.webapp.controller.storage.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -82,16 +85,19 @@ public class StorageDataController extends BaseController {
@Autowired
private IAlarmInfoDao alarmInfoDao;
@RequestMapping(value = "/testEmail")
@ResponseBody
public List<StoragePos> testEmail(HttpServletRequest request){
String b = request.getParameter("b");
Barcode barcode = barcodeManager.findByBarcode(b);
Collection<Storage> allStorage = dataCache.getAllStorage().values();
List<StoragePos> posList = storagePosManager.getEmptyPosList(new ArrayList<Storage>(allStorage), barcode, new ArrayList<String>());
return posList;
}
@Autowired
private IComponentManager componentmanager;
// @RequestMapping(value = "/testEmail")
// @ResponseBody
// public List<StoragePos> testEmail(HttpServletRequest request){
// String b = request.getParameter("b");
// Barcode barcode = barcodeManager.findByBarcode(b);
//
// Collection<Storage> allStorage = dataCache.getAllStorage().values();
// List<StoragePos> posList = storagePosManager.getEmptyPosList(new ArrayList<Storage>(allStorage), barcode, new ArrayList<String>());
// return posList;
// }
@RequestMapping(value = "/countExpirePcb")
@ResponseBody
......@@ -843,4 +849,30 @@ public class StorageDataController extends BaseController {
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,14 +557,27 @@ public class TaskService implements ITaskService {
}
private synchronized StoragePos findEmptyPosInStorages(Barcode barcode, List<Storage> availbleStorageList, final Map<String,Integer> executingTaskCountMap){
availbleStorageList.sort(new Comparator<Storage>() {
@Override
public int compare(Storage o1, Storage o2) {
Integer taskCount1 = executingTaskCountMap.get(o1.getId());
Integer taskCount2 = executingTaskCountMap.get(o2.getId());
return taskCount1.compareTo(taskCount2);
boolean isPackingStorage = false;
for (Storage storage : availbleStorageList) {
if(storage.isPackage()){
isPackingStorage = true;
break;
}
});
}
//不是包装料仓才需要按任务数排序,包装料仓优先放入第一个仓中
if(!isPackingStorage){
availbleStorageList.sort(new Comparator<Storage>() {
@Override
public int compare(Storage o1, Storage o2) {
Integer taskCount1 = executingTaskCountMap.get(o1.getId());
Integer taskCount2 = executingTaskCountMap.get(o2.getId());
return taskCount1.compareTo(taskCount2);
}
});
}
Collection<String> operatingPosIds = excludePosIds();
for (Storage storage : availbleStorageList) {
try{
......@@ -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)){
//分盘料,按时间顺序进行出库
......@@ -884,7 +906,7 @@ public class TaskService implements ITaskService {
for (DataLog task : waitTasks) {
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())){
urgentTask = task;
}
......@@ -892,7 +914,7 @@ public class TaskService implements ITaskService {
}
}
if(urgentTask != null){
log.info("出库最先生成的分盘/紧急/包装料任务"+urgentTask.getBarcode()+"["+urgentTask.getPosName()+"]");
log.info("出库最先生成的分盘/紧急任务"+urgentTask.getBarcode()+"["+urgentTask.getPosName()+"]");
return urgentTask;
}
......@@ -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 @@
</decorator>
<decorator name="metroEmpty" page="metroEmpty.jsp">
<pattern>/login</pattern>
<pattern>/boxShow/**</pattern>
</decorator>
<decorator name="default" page="metroEmpty.jsp">
......
......@@ -105,6 +105,11 @@
<%--<display:column property="type" titleKey="类型"/>--%>
<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
key="component.item.name"/></display:setProperty>
<display:setProperty name="paging.banner.items_name"><fmt:message
......@@ -356,4 +361,19 @@
<!-- END EXAMPLE TABLE PORTLET-->
</div>
</div>
</c:if>
\ No newline at end of file
</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
......@@ -165,9 +165,12 @@
<%--</display:column>--%>
<%--<display:column titleKey="dataLog.batch" sortable="true" sortProperty="batchInfo" property="batchInfo"/>--%>
<%--<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"/>
</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
key="dataLog.item.name"/></display:setProperty>
......@@ -197,12 +200,12 @@
});
}
$('.date-picker').datepicker({
rtl: Metronic.isRTL(),
orientation: "left",
autoclose: true,
language:'zh-CN'
});
// $('.date-picker').datepicker({
// rtl: Metronic.isRTL(),
// orientation: "left",
// autoclose: true,
// language:'zh-CN'
// });
});
</script>
......
......@@ -32,6 +32,25 @@
<div class="clearfix">
</div>
<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="portlet light bordered">
......@@ -40,7 +59,7 @@
<i class="fa fa-list"></i>任务
</div>
</div>
<div class="portlet-body" style="height:713px;overflow: auto;">
<div class="portlet-body" style="height:300px;overflow: auto;">
<div class="task-content">
<ul class="feeds" id="task">
</ul>
......@@ -121,6 +140,23 @@
</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>
......@@ -131,12 +167,17 @@
<fmt:message key="boxView.taskWaiting" var="taskWaiting_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.out" var="out_label"/>
<fmt:message key="dataLog.orderSource" var="source_label"/>
<c:set var="scripts" scope="request">
<script src="${ctx}/scripts/echarts.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
function flushMsgs(){
......@@ -227,6 +268,101 @@
flushMsgs();
updateTasks();
}, 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>
</c:set>
\ No newline at end of file
......@@ -201,9 +201,9 @@
</c:when>
<c:otherwise>
<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: 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 class="portlet-body">
<div class="task-content">
......@@ -766,12 +766,16 @@
}
setInterval(function(){
flushLineMsg();
}, 1000);
setInterval(function(){
updateTasks("all");
flushStatus();
flushLineMsg();
//flushLineMsg();
flushUsageItem();
//flushLiteOrders();
}, 1000);
}, 2000);
});
......
......@@ -83,7 +83,7 @@
<div class="portlet-body" style="padding-left: 30px;">
<div class="col-md-12">
<div class="input-group">
<label class="control-label"><fmt:message key="系统更新,暂停出库"/> </label>
<label class="control-label"><fmt:message key="系统更新,暂停出库"/> </label>
<form:checkbox path="stopOut"/>
</div>
</div>
......
......@@ -12,6 +12,85 @@
<div class="row">
<div class="col-md-12">
<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">
<div class="timeline-time">
<span class="date">2020 </span>
......@@ -112,7 +191,7 @@
<li class="timeline-yellow">
<div class="timeline-time">
<span class="date">2020 </span>
<span class="time">04-20 </span>
<span class="time">06-16 </span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
......
......@@ -3,12 +3,13 @@ Login page
***/
/* bg color */
.login {
background-color: #364150 !important;
margin-top:10%;
/**background-color: #364150 !important;*/
}
.login .logo {
margin: 0 auto;
margin-top: 60px;
/*margin-top: 60px;*/
padding: 15px;
text-align: center;
}
......
......@@ -4,15 +4,14 @@
*/
;(function($){
$.fn.datepicker.dates['zh-CN'] = {
days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"],
daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"],
daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"],
months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
today: "今日",
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: ["\u5468\u65E5", "\u5468\u4E00", "\u5468\u4E8C", "\u5468\u4E09", "\u5468\u56DB", "\u5468\u4E94", "\u5468\u516D", "\u5468\u65E5"],
daysMin: ["\u65E5", "\u4E00", "\u4E8C", "\u4E09", "\u56DB", "\u4E94", "\u516D", "\u65E5"],
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: ["\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: "\u4ECA\u65E5",
weekStart: 1
};
$.fn.datepicker.dates['en'] = {
days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
......
......@@ -239,6 +239,7 @@
<div class="page-footer-inner">
2016&copy; <a href="${ctx}/updateHistory.html">SMD BOX</a>
</div>
<span class="right" style="color: #a3a3a3;">Version: 2020.08.24</span>
<div class="scroll-to-top">
<i class="icon-arrow-up"></i>
</div>
......
......@@ -29,7 +29,7 @@
<link href="${ctx}/assets/global/plugins/uniform/css/uniform.default.css" rel="stylesheet" type="text/css"/>
<!-- END GLOBAL MANDATORY 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 -->
<!-- BEGIN THEME STYLES -->
<link href="${ctx}/assets/global/css/components.css" id="style_components" rel="stylesheet" type="text/css"/>
......@@ -43,21 +43,10 @@
</head>
<!-- END HEAD -->
<!-- BEGIN BODY -->
<body class="login">
<!-- 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>
<body>
<!-- END LOGO -->
<!-- BEGIN LOGIN -->
<div class="content">
<decorator:body/>
</div>
<div class="copyright">
<%--Project--%>
......@@ -93,6 +82,7 @@
Demo.init();
});
</script>
<!-- END JAVASCRIPTS -->
<%= (request.getAttribute("scripts") != null) ? request.getAttribute("scripts") : "" %>
</body>
</html>
......@@ -4,8 +4,25 @@
<title><fmt:message key="login.title"/></title>
<meta name="menu" content="Login"/>
</head>
<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'/>"
onsubmit="saveUsername(this);return validateForm(this)" class="form-signin" autocomplete="off">
<h3 class="form-title">
......@@ -42,7 +59,9 @@
<%--<fmt:param><c:url value="/signup"/></fmt:param>--%>
<%--</fmt:message>--%>
<%--</p>--%>
</div>
</div>
<c:set var="scripts" scope="request">
<%@ include file="/scripts/login.js" %>
</c:set>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!