Commit a20fc42c sunke

条码规则中日期解析失败时,认为不合规则

扫码料架逻辑优化
扫码料架多工单支持
1 个父辈 69e2c14e
正在显示 28 个修改的文件 包含 391 行增加59 行删除
...@@ -23,9 +23,9 @@ public class ShelfOperateBean { ...@@ -23,9 +23,9 @@ public class ShelfOperateBean {
private StoragePos posToClose; private StoragePos posToClose;
/** /**
* 一个库位的Id,用于自动推荐库位 * 一个库位的Id,用于自动推荐库位
*/ */
private String lastPosId; private String nextPosId;
public StoragePos getOpPos() { public StoragePos getOpPos() {
...@@ -67,13 +67,12 @@ public class ShelfOperateBean { ...@@ -67,13 +67,12 @@ public class ShelfOperateBean {
setUpdateTime(System.currentTimeMillis()); setUpdateTime(System.currentTimeMillis());
} }
public String getLastPosId() { public String getNextPosId() {
return lastPosId; return nextPosId;
} }
public void setLastPosId(String lastPosId) { public void setNextPosId(String nextPosId) {
updateOpTime(); this.nextPosId = nextPosId;
this.lastPosId = lastPosId;
} }
/** /**
......
...@@ -73,6 +73,11 @@ public class Component extends BaseMongoBean { ...@@ -73,6 +73,11 @@ public class Component extends BaseMongoBean {
//@NotEmpty(message = "{component.partNumber.empty}") //@NotEmpty(message = "{component.partNumber.empty}")
@NotEmpty(message = "{component.partNumber.empty}") @NotEmpty(message = "{component.partNumber.empty}")
private String partNumber; private String partNumber;
/**
* 供应商PN,用于扫码贴标机转换PN
*/
private String supplierPn;
//uid //uid
private String uid; private String uid;
...@@ -126,7 +131,7 @@ public class Component extends BaseMongoBean { ...@@ -126,7 +131,7 @@ public class Component extends BaseMongoBean {
/** /**
* 有效时长(生产日期+此天数为过期日期),设置默认有效期为2年 * 有效时长(生产日期+此天数为过期日期),设置默认有效期为2年
*/ */
private int validDay = 730; private int validDay = 0;
public Component() { public Component() {
//this.height = StorageConstants.DEFAULT_HEIGHT; //this.height = StorageConstants.DEFAULT_HEIGHT;
...@@ -393,4 +398,12 @@ public class Component extends BaseMongoBean { ...@@ -393,4 +398,12 @@ public class Component extends BaseMongoBean {
public boolean isSolder(){ public boolean isSolder(){
return type == StorageConstants.COMPONENT_TYPE.SOLDERPASTE; return type == StorageConstants.COMPONENT_TYPE.SOLDERPASTE;
} }
public String getSupplierPn() {
return supplierPn;
}
public void setSupplierPn(String supplierPn) {
this.supplierPn = supplierPn;
}
} }
...@@ -118,6 +118,11 @@ public class DataLog extends BaseMongoBean /*implements Comparable<DataLog>*/ { ...@@ -118,6 +118,11 @@ public class DataLog extends BaseMongoBean /*implements Comparable<DataLog>*/ {
*/ */
private int mixTime; private int mixTime;
/**
* 亮灯料架颜色
*/
private String lightColor = "FF0000";
public String getStorageName() { public String getStorageName() {
return storageName; return storageName;
} }
...@@ -352,7 +357,7 @@ public class DataLog extends BaseMongoBean /*implements Comparable<DataLog>*/ { ...@@ -352,7 +357,7 @@ public class DataLog extends BaseMongoBean /*implements Comparable<DataLog>*/ {
} }
/** /**
* 正在执行的出库任务,如果30秒还未完成,再次发送到客户端 * 正在执行的出库任务,如果60秒还未完成,再次发送到客户端
*/ */
public boolean needReSendToClient(){ public boolean needReSendToClient(){
if(isCheckOutTask() && isExecuting()){ if(isCheckOutTask() && isExecuting()){
...@@ -485,4 +490,12 @@ public class DataLog extends BaseMongoBean /*implements Comparable<DataLog>*/ { ...@@ -485,4 +490,12 @@ public class DataLog extends BaseMongoBean /*implements Comparable<DataLog>*/ {
public void setMixTime(int mixTime) { public void setMixTime(int mixTime) {
this.mixTime = mixTime; this.mixTime = mixTime;
} }
public String getLightColor() {
return lightColor;
}
public void setLightColor(String lightColor) {
this.lightColor = lightColor;
}
} }
...@@ -13,6 +13,8 @@ public interface IComponentManager extends IManager<Component> { ...@@ -13,6 +13,8 @@ public interface IComponentManager extends IManager<Component> {
List<Component> allNeedAlarmComponents(); List<Component> allNeedAlarmComponents();
List<Component> listPnBySupplierPn(String providerPn);
List<Component> findByType(int type); List<Component> findByType(int type);
//List<Component> listByPartNumber(String partNumber); //List<Component> listByPartNumber(String partNumber);
......
...@@ -47,6 +47,13 @@ public class ComponentManagerImpl implements IComponentManager { ...@@ -47,6 +47,13 @@ public class ComponentManagerImpl implements IComponentManager {
} }
@Override @Override
public List<Component> listPnBySupplierPn(String supplierPn){
Criteria c = Criteria.where("supplierPn").is(supplierPn);
Query query = Query.query(c);
return componentDao.findByQuery(query);
}
@Override
public PageList findByQuery(Query query, PageList pageList) public PageList findByQuery(Query query, PageList pageList)
{ {
......
...@@ -508,6 +508,11 @@ public class BarcodeRule { ...@@ -508,6 +508,11 @@ public class BarcodeRule {
} }
Date produceDate= produceDate_item.getDateValue(codeArr); Date produceDate= produceDate_item.getDateValue(codeArr);
if(produceDate_item.hasThisField() && produceDate == null){
log.info("条码解析失败,PRODATE字段不合规则");
codeBean.setError("error.barcode.noField",new String[]{"PRODATE"},"条码解析失败,未找到PRODATE字段");
return codeBean;
}
Date expireDate= expireDate_item.getDateValue(codeArr); Date expireDate= expireDate_item.getDateValue(codeArr);
if(produceDate != null && expireDate == null){ if(produceDate != null && expireDate == null){
Calendar c = Calendar.getInstance(); Calendar c = Calendar.getInstance();
...@@ -633,8 +638,10 @@ public class BarcodeRule { ...@@ -633,8 +638,10 @@ public class BarcodeRule {
//803 //803
//rule = "PN[6:0:-1],EXPDATEyyyy-MM-dd[-1:0:-1],BATCH,RI"; //rule = "PN[6:0:-1],EXPDATEyyyy-MM-dd[-1:0:-1],BATCH,RI";
//codeStr = "ALPHA OL107E,2021-11-11,00714026Z,002"; //codeStr = "ALPHA OL107E,2021-11-11,00714026Z,002";
codeStr = "LOCTITE3609,20200930,001"; codeStr = "IAC;6013A0073981;20200810;R2032E1128;10000;MI020A600568;";
rule = "PN,EXPDATEyyyyMMdd,RI"; //codeStr = "IAC;B23D45;20200204;DCRFFD;45;WER23;";
rule = "SP;PN;PRODATEyyw[0:4:0];BATCH;QTY;RI;";
//rule = "SP;PN;PRODATEyyyyMMdd[0:8:0];BATCH;QTY;RI;";
BarcodeRule br = BarcodeRule.newRule(rule); BarcodeRule br = BarcodeRule.newRule(rule);
Barcode b = br.toCodeBean(codeStr).getBarcode(); Barcode b = br.toCodeBean(codeStr).getBarcode();
......
...@@ -2,8 +2,7 @@ package com.myproject.util; ...@@ -2,8 +2,7 @@ package com.myproject.util;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import java.util.HashMap; import java.util.*;
import java.util.Map;
/** /**
* Created by kangmor on 2015/12/2. * Created by kangmor on 2015/12/2.
...@@ -477,7 +476,7 @@ public class StorageConstants { ...@@ -477,7 +476,7 @@ public class StorageConstants {
/** /**
* 夹具类型 * 夹具类型
*/ */
public static enum PACKAGE_TYPE{ public enum PACKAGE_TYPE{
PCB_FIXTURE("PCB 夹具",420,45,"PCB_FIXTURE"), SOLDER_FIXTURE("锡膏夹具",325,65, "SOLDER_FIXTURE"); PCB_FIXTURE("PCB 夹具",420,45,"PCB_FIXTURE"), SOLDER_FIXTURE("锡膏夹具",325,65, "SOLDER_FIXTURE");
private String showStr; private String showStr;
/** /**
...@@ -696,4 +695,68 @@ public class StorageConstants { ...@@ -696,4 +695,68 @@ public class StorageConstants {
*/ */
public static int RETREAT_STORAGE = 7; public static int RETREAT_STORAGE = 7;
} }
private static int currentColorIndex = -1;
/**
* 工单颜色, 入库绿色,出库红色,库位检查使用黄色, 其他颜色用于工单出库颜色
*/
public enum ORDER_COLOR{
//magenta,cyan,firebrick,purple,skyblue,pink,forestgreen,lightblue,indianred,darkgreen
//洋红,青色,砖红色,紫色,天蓝色,粉色,森林绿,浅蓝色,印度红,深绿色
BLUE("0000FF"),
MAGENTA("FF00FF"),
CYAN("00FFFF"),
FIREBRICK("B22222"),
PURPLE("A020F0"),
SKYBLUE("6CA6CD"),
PINK("FF1493"),
FORESTGREEN("228B22"),
LIGHTBLUE("8470FF"),
INDIANRED("8B3A3A"),
DARKGREEN("556B2F");
private String rgb;
ORDER_COLOR(String rgb){
this.rgb = rgb;
}
public String getRgb() {
return rgb;
}
public void setRgb(String rgb) {
this.rgb = rgb;
}
public static ORDER_COLOR fromRgb(String rgb){
for (ORDER_COLOR order_color : values()) {
if(order_color.getRgb().equals(rgb)){
return order_color;
}
}
return null;
}
public static ORDER_COLOR nextColor(Collection<String> excludeColors){
ORDER_COLOR[] allColors = values();
if (excludeColors.size() >= allColors.length){
return null;
}
int nextColorIndex = (currentColorIndex + 1) % allColors.length;
for (ORDER_COLOR color : allColors) {
if(!excludeColors.contains(color.getRgb()) && color.ordinal() >= nextColorIndex){
currentColorIndex = color.ordinal();
return color;
}
}
return null;
}
}
} }
...@@ -53,6 +53,9 @@ public class AccShelfController extends BaseController { ...@@ -53,6 +53,9 @@ public class AccShelfController extends BaseController {
public String cabinetView(@PathVariable String cid, HttpServletRequest request){ public String cabinetView(@PathVariable String cid, HttpServletRequest request){
request.getSession().setAttribute("show",cid); request.getSession().setAttribute("show",cid);
Storage storage = dataCache.getStorage(cid); Storage storage = dataCache.getStorage(cid);
if(storage.isCodeShelf()){
return "redirect:/storage/codeShelf";
}
request.setAttribute("storage",storage); request.setAttribute("storage",storage);
return "storage/accShelf"; return "storage/accShelf";
} }
...@@ -94,7 +97,7 @@ public class AccShelfController extends BaseController { ...@@ -94,7 +97,7 @@ public class AccShelfController extends BaseController {
if(pos != null){ if(pos != null){
log.info(pos.getBarcode().getBarcode() + " 从["+pos.getPosName()+"]出库,点亮对应库位"); log.info(pos.getBarcode().getBarcode() + " 从["+pos.getPosName()+"]出库,点亮对应库位");
int delayCloseTime = 30000; int delayCloseTime = 30000;
String color = "blue"; String color = "red";
openAndCloseLights(storage,pos.getPosName(),delayCloseTime,color); openAndCloseLights(storage,pos.getPosName(),delayCloseTime,color);
taskService.addTaskToFinished(pos,null,null); taskService.addTaskToFinished(pos,null,null);
return "OK" + getText("shelf.msg.outOk",new String[]{pos.getPosName()},request.getLocale(),"操作成功,请从库位["+pos.getPosName()+"]中取出物料"); return "OK" + getText("shelf.msg.outOk",new String[]{pos.getPosName()},request.getLocale(),"操作成功,请从库位["+pos.getPosName()+"]中取出物料");
...@@ -147,7 +150,7 @@ public class AccShelfController extends BaseController { ...@@ -147,7 +150,7 @@ public class AccShelfController extends BaseController {
} }
List<StoragePos> allPos = storagePosManager.findNotEmptyByStorageId(storage.getId()); List<StoragePos> allPos = storagePosManager.findNotEmptyByStorageId(storage.getId());
for (StoragePos pos : allPos) { for (StoragePos pos : allPos) {
opPosLight("open",storage,pos,"Green"); opPosLight("open",storage,pos,"yellow");
} }
return "OK"+getText("shelf.msg.opSucess",request.getLocale(),"操作成功"); return "OK"+getText("shelf.msg.opSucess",request.getLocale(),"操作成功");
} }
......
...@@ -325,6 +325,8 @@ public class BoxChartController extends BaseController { ...@@ -325,6 +325,8 @@ public class BoxChartController extends BaseController {
public List<DataLog> allTasks(HttpServletRequest request) throws Exception{ public List<DataLog> allTasks(HttpServletRequest request) throws Exception{
try{ try{
String cid = request.getParameter("cid"); String cid = request.getParameter("cid");
String codeShelf = request.getParameter("codeShelf");
Comparator<DataLog> comparator = new Comparator<DataLog>() { Comparator<DataLog> comparator = new Comparator<DataLog>() {
@Override @Override
public int compare(DataLog o1, DataLog o2) { public int compare(DataLog o1, DataLog o2) {
...@@ -351,10 +353,20 @@ public class BoxChartController extends BaseController { ...@@ -351,10 +353,20 @@ public class BoxChartController extends BaseController {
if(!Strings.isNullOrEmpty(cid)){ if(!Strings.isNullOrEmpty(cid)){
List<DataLog> cidTasks = Lists.newArrayList(); List<DataLog> cidTasks = Lists.newArrayList();
for (DataLog task: allTasks) { for (DataLog task: allTasks) {
if(task.getCid().equals(cid)){ String taskCid = task.getCid();
if(!Strings.isNullOrEmpty(codeShelf)){
//扫码料架
Storage storage = dataCache.getStorage(taskCid);
if(storage.isCodeShelf()){
cidTasks.add(task);
}
}else{
if(taskCid.equals(cid)){
cidTasks.add(task); cidTasks.add(task);
} }
} }
}
return cidTasks; return cidTasks;
} }
......
...@@ -10,6 +10,8 @@ import com.myproject.manager.IBarcodeManager; ...@@ -10,6 +10,8 @@ import com.myproject.manager.IBarcodeManager;
import com.myproject.manager.IStoragePosManager; import com.myproject.manager.IStoragePosManager;
import com.myproject.util.StorageConstants; import com.myproject.util.StorageConstants;
import com.myproject.webapp.controller.webService.DataCache; import com.myproject.webapp.controller.webService.DataCache;
import com.myproject.webapp.controller.webService.ITaskService;
import com.myproject.webapp.controller.webService.StorageDataController;
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;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
...@@ -34,6 +36,9 @@ public class StoragePosUpdateController extends BaseUpdateController { ...@@ -34,6 +36,9 @@ public class StoragePosUpdateController extends BaseUpdateController {
@Autowired @Autowired
private DataCache dataCache; private DataCache dataCache;
@Autowired
private ITaskService taskService;
private final static String UPDATE_VIEW = "storage/storagePosUpdate"; private final static String UPDATE_VIEW = "storage/storagePosUpdate";
@RequestMapping("/storage/getStoragePos") @RequestMapping("/storage/getStoragePos")
...@@ -66,18 +71,24 @@ public class StoragePosUpdateController extends BaseUpdateController { ...@@ -66,18 +71,24 @@ public class StoragePosUpdateController extends BaseUpdateController {
Barcode barcode = storagePos.getBarcode(); Barcode barcode = storagePos.getBarcode();
if(barcode != null){ if(barcode != null){
log.info("清理库位["+storagePos.getPosName()+"]中的库存"+barcode.getBarcode());
barcode = barcodeManager.findByBarcode(barcode.getBarcode()); String opUser = StorageDataController.getLoginUsername();
barcode.setPosName(""); log.info(opUser + "清理库位["+storagePos.getPosName()+"]");
barcodeManager.save(barcode); taskService.addTaskToFinished(storagePos,null,opUser+"-clear");
storagePos.setBarcode(null);
storagePos.setUsed(false); // log.info("清理库位["+storagePos.getPosName()+"]中的库存"+barcode.getBarcode());
storagePos = storagePosManager.save(storagePos); //
dataCache.updateInventory(storagePos,barcode); // barcode = barcodeManager.findByBarcode(barcode.getBarcode());
// barcode.setPosName("");
// barcodeManager.save(barcode);
// storagePos.setBarcode(null);
// storagePos.setUsed(false);
// storagePos = storagePosManager.save(storagePos);
// dataCache.updateInventory(storagePos,barcode);
} }
return ""; return "";
} catch (ValidateException e) { } catch (Exception e) {
return e.getMessage(); return e.getMessage();
} }
} }
......
...@@ -424,6 +424,16 @@ public class MesApiController extends BaseController { ...@@ -424,6 +424,16 @@ public class MesApiController extends BaseController {
return results; return results;
} }
@RequestMapping(value = "/listPnBySupplierPn")
@ResponseBody
public List<Component> getPnByProviderPn(HttpServletRequest request){
String supplierPn = request.getParameter("supplierPn");
if(Strings.isNullOrEmpty(supplierPn)){
return new ArrayList<>();
}
return componentManager.listPnBySupplierPn(supplierPn);
}
private Date toDate(String dateStr){ private Date toDate(String dateStr){
try { try {
......
...@@ -235,7 +235,7 @@ public class StorageDataController extends BaseController { ...@@ -235,7 +235,7 @@ public class StorageDataController extends BaseController {
if(Strings.isNullOrEmpty(result)){ if(Strings.isNullOrEmpty(result)){
return "0" + super.getText("checkout.sucess",request.getLocale()); return "0" + super.getText("checkout.sucess",request.getLocale());
} }
return "1" + result; return "1" + super.getText(result,request.getLocale());
} }
...@@ -783,6 +783,35 @@ public class StorageDataController extends BaseController { ...@@ -783,6 +783,35 @@ public class StorageDataController extends BaseController {
} }
/** /**
* 取消入库任务
*/
@RequestMapping(value = "/cancelPutInTask")
@ResponseBody
public ResultBean cancelPutInTask(HttpServletRequest request) {
String codeStr = request.getParameter("barcode");
try{
Collection<DataLog> tasks = taskService.getQueueTasks();
for (DataLog task : tasks) {
if(codeStr.contains(task.getBarcode())){
if(task.isPutInTask()){
boolean cancelResult = taskService.cancelTask(task.getId());
log.info("客户端取消["+codeStr+"]的入库任务结果:" + cancelResult);
return ResultBean.newOkResult(cancelResult);
}
// else{
// boolean hideResult = taskService.hideTask(task.getId());
// log.info("客户端取消["+codeStr+"]的出库任务结果:" + hideResult);
// return ResultBean.newOkResult(hideResult);
// }
}
}
}catch (Exception e){
return ResultBean.newErrorResult(2002, "客户端取消入库任务["+codeStr+"]失败:" + e.getMessage());
}
return ResultBean.newErrorResult(2003, "客户端取消任务["+codeStr+"]失败");
}
/**
* 备份的所有版本 * 备份的所有版本
*/ */
@RequestMapping("/backupVersions") @RequestMapping("/backupVersions")
......
...@@ -866,20 +866,32 @@ public class TaskService implements ITaskService { ...@@ -866,20 +866,32 @@ public class TaskService implements ITaskService {
return null; return null;
} }
@Override @Override
public synchronized String checkOutLiteOrder(String orderNo, boolean outBom){ public synchronized String checkOutLiteOrder(String orderNo, boolean outBom){
LiteOrder cacheOrder = liteOrderMap.get(orderNo); LiteOrder cacheOrder = liteOrderMap.get(orderNo);
if(cacheOrder != null && !cacheOrder.isTaskFinished() && !cacheOrder.isNew()){ if(cacheOrder != null && !cacheOrder.isTaskFinished() && !cacheOrder.isNew()){
log.info("工单["+orderNo+"]正在执行"); log.info("工单["+orderNo+"]正在执行");
return "当前工单正在执行"; return "order.out.executing";
} }
if(cacheOrder == null){ if(cacheOrder == null){
cacheOrder = liteOrderDao.findWithItemsByOrderNo(orderNo); cacheOrder = liteOrderDao.findWithItemsByOrderNo(orderNo);
} }
if(cacheOrder == null){ if(cacheOrder == null){
return "未找到工单"; return "order.out.notFound";
}
//设置颜色
Set<String> currentColors = new HashSet<>();
for (DataLog dataLog : getQueueTasks()) {
currentColors.add(dataLog.getLightColor());
}
StorageConstants.ORDER_COLOR nextColor = StorageConstants.ORDER_COLOR.nextColor(currentColors);
if(nextColor == null){
log.info("执行工单["+orderNo+"] outBom="+outBom+"时,已达最大可执行工单数");
return "order.out.maxOrder";
} }
log.info("开始执行工单["+orderNo+"] outBom="+outBom); log.info("开始执行工单["+orderNo+"] outBom="+outBom);
...@@ -901,6 +913,8 @@ public class TaskService implements ITaskService { ...@@ -901,6 +913,8 @@ public class TaskService implements ITaskService {
availableStorageIds.add(storage.getId()); availableStorageIds.add(storage.getId());
} }
} }
//其他出库模式一次性全部生成任务 //其他出库模式一次性全部生成任务
for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) { for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) {
//剩余未出数量 //剩余未出数量
...@@ -929,6 +943,7 @@ public class TaskService implements ITaskService { ...@@ -929,6 +943,7 @@ public class TaskService implements ITaskService {
task.setSubSourceId(orderItem.getId()); task.setSubSourceId(orderItem.getId());
task.setSubSourceInfo(orderItem.getFeederInfo()); task.setSubSourceInfo(orderItem.getFeederInfo());
task.setType(StorageConstants.OP.CHECKOUT); task.setType(StorageConstants.OP.CHECKOUT);
task.setLightColor(nextColor.getRgb());
task.setStatus(StorageConstants.OP_STATUS.WAIT.name()); task.setStatus(StorageConstants.OP_STATUS.WAIT.name());
task = dataLogDao.save(task); task = dataLogDao.save(task);
addTaskToExecute(task); addTaskToExecute(task);
...@@ -943,6 +958,7 @@ public class TaskService implements ITaskService { ...@@ -943,6 +958,7 @@ public class TaskService implements ITaskService {
if(taskReelCount <= 0){ if(taskReelCount <= 0){
cacheOrder.finishedTasks(); cacheOrder.finishedTasks();
} }
liteOrderDao.save(cacheOrder); liteOrderDao.save(cacheOrder);
liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder); liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder);
if(taskReelCount <= 0){ if(taskReelCount <= 0){
...@@ -1063,13 +1079,31 @@ public class TaskService implements ITaskService { ...@@ -1063,13 +1079,31 @@ public class TaskService implements ITaskService {
//出库任务开灯或者开门 //出库任务开灯或者开门
Collection<DataLog> areaWaitTasks = taskMap.values(); Collection<DataLog> areaWaitTasks = taskMap.values();
for (DataLog task : areaWaitTasks) { for (DataLog task : areaWaitTasks) {
if(storage.getCid().equals(task.getCid()) && task.isCheckOutTask() && task.isWait()){ if(storage.getCid().equals(task.getCid()) && task.isCheckOutTask()){
String lightColor = task.getLightColor();
String opValue = task.getPosName();
if(!Strings.isNullOrEmpty(lightColor)){
StorageConstants.ORDER_COLOR orderColor = StorageConstants.ORDER_COLOR.fromRgb(lightColor);
if(orderColor != null){
opValue = opValue + "=" + orderColor.name().toLowerCase();
}
}
if(task.isWait()){
//加入到正在执行的列表中 //加入到正在执行的列表中
statusBean.addData("open", task.getPosName()); log.info("执行开灯:"+opValue);
statusBean.addData("open", opValue);
//从等待列表中删除,加入到执行列表中 //从等待列表中删除,加入到执行列表中
task.setStatus(StorageConstants.OP_STATUS.EXECUTING.name()); task.setStatus(StorageConstants.OP_STATUS.EXECUTING.name());
taskMap.put(task.getId(), task); taskMap.put(task.getId(), task);
dataLogDao.save(task); dataLogDao.save(task);
}else if(task.isExecuting() && task.needReSendToClient()){
// log.error("cid["+storage.getCid() + "]的出库任务["+ task.getPosName()+"]超过60秒仍未完成,重新发送到客户端!");
// task.setUpdateDate(new Date());
// statusBean.addData("open", opValue);
// taskMap.put(task.getId(), task);
}
} }
} }
return statusBean; return statusBean;
...@@ -1174,7 +1208,7 @@ public class TaskService implements ITaskService { ...@@ -1174,7 +1208,7 @@ public class TaskService implements ITaskService {
//暂不处理 //暂不处理
} else if (StorageConstants.BOX_STATUS.OUT_FINISHED == status) {//出仓完成 } else if (StorageConstants.BOX_STATUS.OUT_FINISHED == status) {//出仓完成
DataLog task = findExecutingTask(statusBean.getCid(), boxStatus.getPosId()); DataLog task = findExecutingTask(statusBean.getCid(), boxStatus.getPosId());
if (task != null) { if (task != null && task.isCheckOutTask()) {
log.info(task.getBarcode() + "出仓位[" + task.getPosName() + "]完成"); log.info(task.getBarcode() + "出仓位[" + task.getPosName() + "]完成");
DataLog cancelTask = findFinishedTask(statusBean.getCid(), boxStatus.getPosId()); DataLog cancelTask = findFinishedTask(statusBean.getCid(), boxStatus.getPosId());
if(cancelTask != null && cancelTask.isCancel()){ if(cancelTask != null && cancelTask.isCancel()){
...@@ -1188,7 +1222,7 @@ public class TaskService implements ITaskService { ...@@ -1188,7 +1222,7 @@ public class TaskService implements ITaskService {
//log.error(operationKey + "触发仓位完成时,操作队列中不存在"); //log.error(operationKey + "触发仓位完成时,操作队列中不存在");
//从已完成列表中找,如果还找不到就忽略 //从已完成列表中找,如果还找不到就忽略
task = findFinishedTask(statusBean.getCid(), boxStatus.getPosId()); task = findFinishedTask(statusBean.getCid(), boxStatus.getPosId());
if (task != null) { if (task != null && task.isCheckOutTask()) {
if(task.isCancel()){//被取消的任务,客户端发完成信号过来,修改取消状态为已完成 if(task.isCancel()){//被取消的任务,客户端发完成信号过来,修改取消状态为已完成
log.info(task.getBarcode() + "出仓位[" + task.getPosName() + "]完成,但任务已被取消,修改为完成"); log.info(task.getBarcode() + "出仓位[" + task.getPosName() + "]完成,但任务已被取消,修改为完成");
checkoutFinished(task); checkoutFinished(task);
...@@ -1337,6 +1371,7 @@ public class TaskService implements ITaskService { ...@@ -1337,6 +1371,7 @@ public class TaskService implements ITaskService {
//清空 msg 的内容,因为客户端会据此决定命令是否执行 //清空 msg 的内容,因为客户端会据此决定命令是否执行
statusBean.setMsg(""); statusBean.setMsg("");
statusBean.setMsgEn("");
return statusBean; return statusBean;
} }
......
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
# to the other resource bundles. # to the other resource bundles.
webapp.name=BSP webapp.name=BSP
webapp.tagline=Providing integration and style to open source Java. webapp.tagline=Providing integration and style to open source Java.
webapp.version=Version ${pom.version} webapp.version=Version 1.0
company.name=Your Company Here company.name=Your Company Here
company.url=http://raibledesigns.com company.url=http://raibledesigns.com
copyright.year=${copyright.year} copyright.year=2003-2015
user.status=Logged in as: user.status=Logged in as:
......
...@@ -93,6 +93,7 @@ barcode.amount=Qty ...@@ -93,6 +93,7 @@ barcode.amount=Qty
barcode.plateSize=Diameter barcode.plateSize=Diameter
barcode.height=Height barcode.height=Height
barcode.provider=Supplier barcode.provider=Supplier
barcode.supplierPn=Supplier PN
barcode.batch=Batch barcode.batch=Batch
barcode.expireDate=Expiration Date barcode.expireDate=Expiration Date
barcode.saveSuccess=Barcode Saved barcode.saveSuccess=Barcode Saved
...@@ -339,8 +340,8 @@ batch.btn.singleOut=Single Out ...@@ -339,8 +340,8 @@ batch.btn.singleOut=Single Out
batch.btn.batchOut=Batch Out batch.btn.batchOut=Batch Out
batch.btn.singleIn=Single In batch.btn.singleIn=Single In
batch.btn.closeDoor=Close Door batch.btn.closeDoor=Close Door
alarm.inaction.title=Inaction Alarm alarm.inaction.title=Sluggish Material Alarm
alarm.inaction.msg=The amount of inaction material {0} days ago was [{1}] alarm.inaction.msg=The quantity of sluggish materials {0} days ago was [{1}], please deal with it in time
alarm.expire.title=Expire Alarm alarm.expire.title=Expire Alarm
alarm.expire.msg=The amount of expire material is [{0}] alarm.expire.msg=The amount of expire material is [{0}]
...@@ -365,9 +366,10 @@ shelf.msg.hasReel=There position [{0}] already has material ...@@ -365,9 +366,10 @@ shelf.msg.hasReel=There position [{0}] already has material
shelf.msg.tipScanReel=Please scan the material to put in [{0}] shelf.msg.tipScanReel=Please scan the material to put in [{0}]
shelf.msg.fastop=Barcode operate is too fast shelf.msg.fastop=Barcode operate is too fast
shelf.msg.scanPos=Please scan the position code shelf.msg.scanPos=Please scan the position code
shelf.nextPos.hasTask=Next Position [{0}] already has task, please scan a new position code. shelf.nextPos.hasTask=Location [{0}] already has an existing task, please scan a new location code.
shelf.nextPos.hasReel=Next Position [{0}] already has material, please scan a new position code. shelf.nextPos.hasReel=A material is already in the location [{0}], please scan a new location code.
shelf.nextPos.wrongSize=Next Position [{0}] size [{1}] is different from material size [{2}] please scan a new position code. shelf.nextPos.wrongSize=x The size [{1}] of location [{0}] does not match the material size [{2}], please scan a new location code.
shelf.error.orderError=The task does not match the specified order [{0}].
order.out.set=set of materials order.out.set=set of materials
order.out.surplus=surplus material order.out.surplus=surplus material
...@@ -423,6 +425,7 @@ error.barcode.noRule=There is no rule of the barcode is setted. ...@@ -423,6 +425,7 @@ error.barcode.noRule=There is no rule of the barcode is setted.
error.barcode.wrongLength=The code string [{0}] has wrong length. error.barcode.wrongLength=The code string [{0}] has wrong length.
error.barcode.noField=There is no {0} field in the code string. error.barcode.noField=There is no {0} field in the code string.
error.barcode.wrongPn=The partnumber is wrong error.barcode.wrongPn=The partnumber is wrong
error.barcode.wrongProduceDate=The manufacturing date is wrong
error.barcode.pnNotExist=x Component {0} does not exist error.barcode.pnNotExist=x Component {0} does not exist
error.barcode.errorSize=x The reel has no size. error.barcode.errorSize=x The reel has no size.
error.storage.noPosFind=No availble position is found. error.storage.noPosFind=No availble position is found.
...@@ -441,3 +444,6 @@ solder.status.4=Strring ...@@ -441,3 +444,6 @@ solder.status.4=Strring
solder.status.5=Waiting shipment solder.status.5=Waiting shipment
solder.status.6=Outting solder.status.6=Outting
solder.status.7=Retreat storage solder.status.7=Retreat storage
order.out.executing=The order is executing.
order.out.maxOrder=The maximum number of executable orders has been reached
order.out.noTask=The order has no reel to out.
\ No newline at end of file \ No newline at end of file
#For a list of settings you can customize, see
# http://displaytag.sourceforge.net/configuration.html
basic.empty.showtable=true
paging.banner.onepage=
basic.msg.empty_list=結果がありません。
basic.msg.empty_list_row=<tr class="empty"><td colspan="{0}">結果がありません。</td></tr></tr>
paging.banner.no_items_found=<span class="pagebanner">記録{0}が見つかりません。</span>
paging.banner.one_item_found=<span class="pagebanner">一個{0}の記録を見つかりました。</span>
paging.banner.all_items_found=<span class="pagebanner">{0}個の記録を見つかりました。{1}记录,显示所有{2}记录。</span>
paging.banner.some_items_found=<span class="pagebanner">{0}個{1}記録を見つかった、第{2}個から第{3}個まで表示しています。</span>
paging.banner.full=<span class="pagelinks">[<a href="{1}">トップページ</a>/<a href="{2}">前のページ</a>]{0}[<a href="{3}">次のページ</a>/<a href="{4}">最後のページ</a>]</span>
paging.banner.first=<span class="pagelinks">[トップページ/前のページ] {0}[<a href="{3}">次のページ</a>/<a href="{4}">最後のページ</a>]</span>
paging.banner.last=<span class="pagelinks">[<a href="{1}">トップページ</a>/<a href="{2}">前のページ</a>]{0} [次のページ/最後のページ]</span>
paging.banner.page.link=<a href="{1}" title="第{0}ページに行きます。">{0}</a>
paging.banner.item_name=
paging.banner.items_name=
paging.banner.placement=bottom
export.banner=<div style="float:right"> {0}まで出力</div>
...@@ -142,6 +142,11 @@ ...@@ -142,6 +142,11 @@
color:green; color:green;
} }
.lobibox-notify-wrapper{
max-height: 100%;
overflow-y: auto;
}
</style> </style>
<link href="${ctx}/scripts/lobibox/css/lobibox.min.css?id=2" rel="stylesheet" type="text/css"/> <link href="${ctx}/scripts/lobibox/css/lobibox.min.css?id=2" rel="stylesheet" type="text/css"/>
...@@ -517,10 +522,10 @@ ...@@ -517,10 +522,10 @@
for(var i in data){ for(var i in data){
var opStr = '<button class="btn yellow" onclick="checkoutByPartNumber(\''+data[i].pn+'\',\''+data[i].id+'\');"><i class="fa fa-upload"></i>补料</button>'; var opStr = '<button class="btn yellow" onclick="checkoutByPartNumber(\''+data[i].pn+'\',\''+data[i].id+'\');"><i class="fa fa-upload"></i>补料</button>';
if(data[i].inventoryNum <= 0 || data[i].outFinished ){ // if(data[i].inventoryNum <= 0 || data[i].outFinished ){
//已出完或库存不足 // //已出完或库存不足
opStr = ""; // opStr = "";
} // }
table.row.add( [ i, data[i].pn, data[i].feederInfo,data[i].outNum+"/"+data[i].needNum,data[i].inventoryNum,opStr] ); table.row.add( [ i, data[i].pn, data[i].feederInfo,data[i].outNum+"/"+data[i].needNum,data[i].inventoryNum,opStr] );
} }
table.order( [ 3, 'asc' ] ).draw(); table.order( [ 3, 'asc' ] ).draw();
...@@ -661,10 +666,10 @@ ...@@ -661,10 +666,10 @@
var opLabelMap={ var opLabelMap={
"op1":"${op_1}", "op1":"${op_1}",
"op1":"${op_2}", "op2":"${op_2}",
"op1":"${op_6}", "op6":"${op_6}",
"op1":"${op_7}", "op7":"${op_7}",
"op1":"${op_8}" "op8":"${op_8}"
} }
var allTasks = {}; var allTasks = {};
...@@ -689,8 +694,8 @@ ...@@ -689,8 +694,8 @@
//var showStr = partNumber + " ["+barcode+"] ${in_label}" + posStr; //var showStr = partNumber + " ["+barcode+"] ${in_label}" + posStr;
var opLabel = opLabelMap["op_"+data[item].type] var opLabel = opLabelMap["op"+data[item].type]
var showStr = posStr+ opLabel + partNumber + "["+barcode+"]"; var showStr = posStr+ opLabel + "<br/>"+partNumber + "["+barcode+"]";
var status = data[item].status.toLowerCase(); var status = data[item].status.toLowerCase();
options['status'] = status; options['status'] = status;
...@@ -1091,15 +1096,17 @@ ...@@ -1091,15 +1096,17 @@
} }
var statusHtml = "<span class='orderStatus'>["+statusStr+"]</span>"; var statusHtml = "<span class='orderStatus'>["+statusStr+"]</span>";
var titleStr = "<a href='#' onclick=\"showOrderDetail('"+orderNo+"')\">"+orderNo+"</a>"; var titleStr = "<a href='#' onclick=\"showOrderDetail('"+orderNo+"')\">"+orderNo+"</a>";
var msgStr = order.finishedReelCount + "/" + order.taskReelCount + statusHtml; var msgStr = "<div onclick=\"showOrderDetail('"+orderNo+"')\">" + order.finishedReelCount + "/" + order.taskReelCount + statusHtml+"</div>";
newOrders.push(orderNo); newOrders.push(orderNo);
orderOption['orderNo']=orderNo; orderOption['orderNo']=orderNo;
orderOption['onClose']= hideOrder; orderOption['onClose']= hideOrder;
var orderWindow = orderWindows[orderNo]; var orderWindow = orderWindows[orderNo];
if(!orderWindow){ if(!orderWindow){
orderOption.title=titleStr; orderOption.title=titleStr;
orderOption.msg = msgStr; orderOption.msg = msgStr;
orderWindow =Lobibox.notify('success', orderOption); orderWindow =Lobibox.notify('success', orderOption);
orderWindows[orderNo] = orderWindow; orderWindows[orderNo] = orderWindow;
}else{ }else{
......
...@@ -57,6 +57,39 @@ ...@@ -57,6 +57,39 @@
<%--<fmt:message key="shelf.btn.closeAll"/>--%> <%--<fmt:message key="shelf.btn.closeAll"/>--%>
<%--</button>--%> <%--</button>--%>
<div class="btn-group">
<a href="" class="btn grey-steel btn-sm dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">
<span id="currentOrderNo">All</span> <span class="fa fa-angle-down"></span>
</a>
<ul class="dropdown-menu pull-right" id="orderNoList">
<li>
<a href="javascript:;" style="background-color: #e9edef;">
All
</a>
</li>
<li>
<a href="javascript:;" style="background-color: #FF0000;">
Q1 2014
</a>
</li>
<li>
<a href="javascript:;" style="background-color: #FFFF00;">
Q2 2014
</a>
</li>
<li class="active">
<a href="javascript:;" style="background-color: #FF00FF;">
Q3 2014
</a>
</li>
<li>
<a href="javascript:;" style="background-color: #FFFF00;">
Q4 2014
</a>
</li>
</ul>
</div>
<button type="button" class="btn btn-fit-height yellow" onclick="showPartNumbers();"> <button type="button" class="btn btn-fit-height yellow" onclick="showPartNumbers();">
<i class="fa fa-sign-out"></i><fmt:message key="button.checkout"/> <i class="fa fa-sign-out"></i><fmt:message key="button.checkout"/>
</button> </button>
...@@ -69,6 +102,7 @@ ...@@ -69,6 +102,7 @@
<tr role="row"> <tr role="row">
<th><fmt:message key="barcode.barcode"/></th> <th><fmt:message key="barcode.barcode"/></th>
<th><fmt:message key="barcode.partNumber"/></th> <th><fmt:message key="barcode.partNumber"/></th>
<th><fmt:message key="dataLog.orderSource"/></th>
<th><fmt:message key="checkOut.pos"/></th> <th><fmt:message key="checkOut.pos"/></th>
<th><fmt:message key="dataLog.type"/></th> <th><fmt:message key="dataLog.type"/></th>
<th><fmt:message key="dataLog.status"/></th> <th><fmt:message key="dataLog.status"/></th>
...@@ -189,12 +223,39 @@ ...@@ -189,12 +223,39 @@
} }
} }
$(".dropdown-menu>li>a").live('click', function(){
var bgColor = $(this).attr("bgColor");
var text = $(this).text();
$("#currentOrderNo").css("background-color",bgColor);
$("#currentOrderNo").css("color","#FFFFFF;");
$("#currentOrderNo").parent().css("background-color",bgColor);
$("#currentOrderNo").text(text);
});
$(".dropdown-menu>li>a").live({
mouseenter:
function()
{
var bgColor = $(this).css("background-color");
$(this).attr("bgColor",bgColor);
$(this).css("background-color","#bfbfbf");
},
mouseleave:
function()
{
var bgColor = $(this).attr("bgColor");
$(this).attr("bgColor","");
$(this).css("background-color",bgColor);
}
});
$("#scan-code").change(function () { $("#scan-code").change(function () {
var codeValue = $(this).val(); var codeValue = $(this).val();
$(this).val(""); $(this).val("");
showMsg(""); showMsg("");
$(this).attr("placeholder", codeValue); $(this).attr("placeholder", codeValue);
$.post("${ctx}/service/store/codeShelf/codeIn", {cid: '${show}', code: codeValue}, function (data) { var currentOrderNo = $("#currentOrderNo").text();
$.post("${ctx}/service/store/codeShelf/codeIn", {code: codeValue,sourceName:currentOrderNo}, function (data) {
showMsg(data); showMsg(data);
if(data.indexOf("x") == 0){ if(data.indexOf("x") == 0){
//弹框,添加=7x8=尺寸信息后重新请求 //弹框,添加=7x8=尺寸信息后重新请求
...@@ -356,10 +417,12 @@ ...@@ -356,10 +417,12 @@
}); });
} }
function updateTasks(cid,seconds){ function updateTasks(cid){
//任务列表 //任务列表
$.post("${ctx}/service/store/tasks", {cid: cid, seconds:seconds}, function (data) { $.post("${ctx}/service/store/tasks", {cid: cid, codeShelf:true}, function (data) {
$(".dataTable").html(""); $(".dataTable").html("");
var currentOrderNo = $("#currentOrderNo").text();
var sourceArr = [];
for(var item in data){ for(var item in data){
var taskId = data[item].id; var taskId = data[item].id;
...@@ -367,11 +430,28 @@ ...@@ -367,11 +430,28 @@
var barcode = data[item].barcode; var barcode = data[item].barcode;
var posStr = data[item].posStr; var posStr = data[item].posStr;
var typeStr = "${in_label}"; var typeStr = "${in_label}";
var source = data[item].sourceStr;
var lightColor = "";
var sourceName = data[item].sourceName;
if(data[item].type == 2){//出库 if(data[item].type == 2){//出库
typeStr = "${out_label}"; typeStr = "${out_label}";
lightColor = "#"+data[item].lightColor;
if(sourceName){
var hasSourceName = false;
sourceArr.forEach(function(item,i){
if(item.sourceName === sourceName){
hasSourceName = true;
}
})
if(!hasSourceName){
var sourceData = {sourceName:sourceName, lightColor:lightColor};
sourceArr.push(sourceData);
}
}
} }
if(currentOrderNo == "All" || currentOrderNo == sourceName){
var statusStr = ""; var statusStr = "";
if(data[item].cancel){ if(data[item].cancel){
statusStr ="${op_status_cancel}"; statusStr ="${op_status_cancel}";
...@@ -387,9 +467,15 @@ ...@@ -387,9 +467,15 @@
var dateStr = data[item].updateDateStr; var dateStr = data[item].updateDateStr;
var style = "";
if(lightColor){
style = "background-color: " + lightColor+";color:#FFFFFF;";
}
var tdStr = var tdStr =
"<td>"+barcode+"</td>"+ "<td>"+barcode+"</td>"+
"<td>"+partNumber+"</td>"+ "<td>"+partNumber+"</td>"+
"<td style='"+style+"'>"+source+"</td>"+
"<td>"+posStr+"</td>"+ "<td>"+posStr+"</td>"+
"<td>"+typeStr+"</td>"+ "<td>"+typeStr+"</td>"+
"<td><span class='label label-sm label-"+data[item].status.toLowerCase()+"'>"+statusStr+"</span></td>"+ "<td><span class='label label-sm label-"+data[item].status.toLowerCase()+"'>"+statusStr+"</span></td>"+
...@@ -398,14 +484,24 @@ ...@@ -398,14 +484,24 @@
$(".dataTable").append(trStr); $(".dataTable").append(trStr);
} }
}
var sourceListHtml = '<li><a href="javascript:;" style="background-color: #95a5a6;color:#FFFFFF;">All</a></li>';
sourceArr.forEach(function(item,i){
var bgColor = item.lightColor;
sourceListHtml = sourceListHtml + '<li><a href="javascript:;" style="background-color:'+bgColor+';color:#FFFFFF; ">'+item.sourceName+'</a></li>';
})
$("#orderNoList").html(sourceListHtml);
}); });
} }
//updateTasks('${show}',-10*60); //updateTasks('${show}');
setInterval(function(){ setInterval(function(){
updateTasks('${show}',-10*60); updateTasks('${show}');
}, 1000); }, 1000);
waitting = function(){ waitting = function(){
......
...@@ -46,12 +46,12 @@ ...@@ -46,12 +46,12 @@
</div> </div>
</form:form> </form:form>
<display:table name="searchCriteria.pageList" id="storage" <display:table name="searchCriteria.pageList" id="storage"
defaultsort="1" class="table table-striped table-bordered table-hover" export="false"> defaultsort="1" class="table table-striped table-bordered table-hover" export="false" requestURI="storageSearch.html">
<display:column property="name" escapeXml="true" titleKey="storage.name"/> <display:column property="name" escapeXml="true" titleKey="storage.name"/>
<display:column titleKey="storage.type" property="type"/> <display:column titleKey="storage.type" property="type"/>
<display:column titleKey="storage.slotAmount"> <display:column titleKey="storage.slotAmount">
${storage.totalSlots - storage.emptySlots} / ${storage.totalSlots} ${storage.totalSlots}
</display:column> </display:column>
<display:setProperty name="paging.banner.items_name"><fmt:message <display:setProperty name="paging.banner.items_name"><fmt:message
key="storage.item.name"/></display:setProperty> key="storage.item.name"/></display:setProperty>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!