Commit 8ce63ff1 sunke

去除缺料自动重发功能

入库时不再绑定已关闭的工单(分完盘入库的料也不再绑定)
如果需求单是工单的最后一个需求单,完成时关闭并解绑整个工单
如果需求单不是工单的最后一个需求单,完成时关闭需求单
单个料盘解绑功能(暂未启用)
取消10天前工单解绑功能
Setting中增加某台料仓只出不入功能
1 个父辈 d180a30f
package com.myproject.bean.qisda; package com.myproject.bean.qisda;
import com.myproject.util.StorageConstants; import com.myproject.util.StorageConstants;
import org.apache.logging.log4j.util.Strings;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
...@@ -351,6 +352,13 @@ public class AppendInfo { ...@@ -351,6 +352,13 @@ public class AppendInfo {
this.cisIn = cisIn; this.cisIn = cisIn;
} }
/**
* 是否已经绑定工单
*/
public boolean isBindToSo(){
return Strings.isNotBlank(so);
}
@Override @Override
public String toString() { public String toString() {
return "AppendInfo{" + return "AppendInfo{" +
......
...@@ -95,6 +95,13 @@ public class RequestOutItemBean { ...@@ -95,6 +95,13 @@ public class RequestOutItemBean {
*/ */
private String line; private String line;
/**
* 是否是工单的最后一个需求单
*/
private String endOutInfo = "N";
public String getAction() { public String getAction() {
return action; return action;
} }
...@@ -252,6 +259,14 @@ public class RequestOutItemBean { ...@@ -252,6 +259,14 @@ public class RequestOutItemBean {
this.line = line; this.line = line;
} }
public String getEndOutInfo() {
return endOutInfo;
}
public void setEndOutInfo(String endOutInfo) {
this.endOutInfo = endOutInfo;
}
@Override @Override
public String toString() { public String toString() {
return "RequestOutItemBean{" + return "RequestOutItemBean{" +
......
...@@ -668,6 +668,27 @@ public class Barcode extends BaseMongoBean { ...@@ -668,6 +668,27 @@ public class Barcode extends BaseMongoBean {
// } // }
/** /**
* 清理绑定信息
*/
public Barcode removeBindInfo(){
AppendInfo appendInfo = getAppendInfo();
appendInfo.setCutMap(null);
appendInfo.setPreBindSlot(null);
appendInfo.setRfidLoc(-1);
appendInfo.setAction(null);
appendInfo.sethSerial(null);
appendInfo.setRefno(null);
appendInfo.setSo(null);
appendInfo.setSoseq(null);
appendInfo.setBindSlot(null);
appendInfo.setPreBindSlot(null);
appendInfo.setSlotStr(null);
appendInfo.setSlotIndex(-1);
setAppendInfo(appendInfo);
return this;
}
/**
* 是否有待分盘信息(cutMap为空) * 是否有待分盘信息(cutMap为空)
*/ */
public boolean hasCutInfo(){ public boolean hasCutInfo(){
......
...@@ -174,6 +174,11 @@ public class Settings extends BaseMongoBean { ...@@ -174,6 +174,11 @@ public class Settings extends BaseMongoBean {
*/ */
private boolean stopJob = false; private boolean stopJob = false;
/**
* 不入库的料仓列表
*/
private String notIntoCids = "";
public Date getLastPcbCheckDate() { public Date getLastPcbCheckDate() {
return lastPcbCheckDate; return lastPcbCheckDate;
} }
...@@ -413,5 +418,13 @@ public class Settings extends BaseMongoBean { ...@@ -413,5 +418,13 @@ public class Settings extends BaseMongoBean {
public void setStopJob(boolean stopJob) { public void setStopJob(boolean stopJob) {
this.stopJob = stopJob; this.stopJob = stopJob;
} }
public String getNotIntoCids() {
return notIntoCids;
}
public void setNotIntoCids(String notIntoCids) {
this.notIntoCids = notIntoCids;
}
} }
...@@ -30,6 +30,7 @@ public class OutInfo extends BaseMongoBean { ...@@ -30,6 +30,7 @@ public class OutInfo extends BaseMongoBean {
} }
this.taskNeedOutDate = needOutDate; this.taskNeedOutDate = needOutDate;
this.mdate = outItem.getMdate(); this.mdate = outItem.getMdate();
this.endOutInfo = outItem.isTheEndOutInfo();
} }
/** /**
...@@ -121,6 +122,12 @@ public class OutInfo extends BaseMongoBean { ...@@ -121,6 +122,12 @@ public class OutInfo extends BaseMongoBean {
*/ */
private Date taskNeedOutDate; private Date taskNeedOutDate;
/**
* 是否为工单的最后一个需求单
*/
private boolean endOutInfo = false;
@Transient @Transient
private Map<String, OutItem> outItemMap = new HashMap<>(); private Map<String, OutItem> outItemMap = new HashMap<>();
...@@ -456,6 +463,14 @@ public class OutInfo extends BaseMongoBean { ...@@ -456,6 +463,14 @@ public class OutInfo extends BaseMongoBean {
this.taskNeedOutDate = taskNeedOutDate; this.taskNeedOutDate = taskNeedOutDate;
} }
public boolean isEndOutInfo() {
return endOutInfo;
}
public void setEndOutInfo(boolean endOutInfo) {
this.endOutInfo = endOutInfo;
}
@Override @Override
public String toString() { public String toString() {
return "OutInfo{" + return "OutInfo{" +
......
...@@ -27,6 +27,7 @@ public class OutItem extends BaseMongoBean { ...@@ -27,6 +27,7 @@ public class OutItem extends BaseMongoBean {
this.reelID = itemBean.getReelID(); this.reelID = itemBean.getReelID();
this.line = itemBean.getLine(); this.line = itemBean.getLine();
this.location = itemBean.getLocation(); this.location = itemBean.getLocation();
this.endOutInfo = itemBean.getEndOutInfo();
String sdateStr = itemBean.getSdte() + itemBean.getStme(); String sdateStr = itemBean.getSdte() + itemBean.getStme();
String mdateStr = itemBean.getMdte() + itemBean.getMtme(); String mdateStr = itemBean.getMdte() + itemBean.getMtme();
this.sdate = DateUtil.toDate(sdateStr, "yyyyMMddHHmmss"); this.sdate = DateUtil.toDate(sdateStr, "yyyyMMddHHmmss");
...@@ -134,6 +135,11 @@ public class OutItem extends BaseMongoBean { ...@@ -134,6 +135,11 @@ public class OutItem extends BaseMongoBean {
private String line; private String line;
/** /**
* 是否是工单的最后一个需求单
*/
private String endOutInfo = "N";
/**
* 出库缺料情况 * 出库缺料情况
*/ */
public int outLessQty(){ public int outLessQty(){
...@@ -477,4 +483,19 @@ public class OutItem extends BaseMongoBean { ...@@ -477,4 +483,19 @@ public class OutItem extends BaseMongoBean {
public void setLine(String line) { public void setLine(String line) {
this.line = line; this.line = line;
} }
public String getEndOutInfo() {
return endOutInfo;
}
public void setEndOutInfo(String endOutInfo) {
this.endOutInfo = endOutInfo;
}
public boolean isTheEndOutInfo(){
if(endOutInfo != null && endOutInfo.equalsIgnoreCase("Y")){
return true;
}
return false;
}
} }
...@@ -441,20 +441,7 @@ public class StoragePosDaoImpl extends AbstractMongoDao implements IStoragePosDa ...@@ -441,20 +441,7 @@ public class StoragePosDaoImpl extends AbstractMongoDao implements IStoragePosDa
@Override @Override
public StoragePos unbindReel(StoragePos storagePos){ public StoragePos unbindReel(StoragePos storagePos){
Barcode barcode = storagePos.getBarcode(); Barcode barcode = storagePos.getBarcode();
AppendInfo appendInfo = barcode.getAppendInfo(); barcode = barcode.removeBindInfo();
appendInfo.setCutMap(null);
appendInfo.setPreBindSlot(null);
appendInfo.setRfidLoc(-1);
appendInfo.setAction(null);
appendInfo.sethSerial(null);
appendInfo.setRefno(null);
appendInfo.setSo(null);
appendInfo.setSoseq(null);
appendInfo.setBindSlot(null);
appendInfo.setPreBindSlot(null);
appendInfo.setSlotStr(null);
appendInfo.setSlotIndex(-1);
barcode.setAppendInfo(appendInfo);
barcode.setAmount(barcode.getInitialAmount()); barcode.setAmount(barcode.getInitialAmount());
barcode = barcodeDao.save(barcode); barcode = barcodeDao.save(barcode);
storagePos.setBarcode(barcode); storagePos.setBarcode(barcode);
......
...@@ -3,6 +3,8 @@ package com.myproject.webapp.controller.qisda; ...@@ -3,6 +3,8 @@ package com.myproject.webapp.controller.qisda;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.myproject.bean.qisda.*; import com.myproject.bean.qisda.*;
import com.myproject.bean.update.Barcode;
import com.myproject.bean.update.StoragePos;
import com.myproject.bean.update.qisda.DNInfo; import com.myproject.bean.update.qisda.DNInfo;
import com.myproject.bean.update.qisda.DNItem; import com.myproject.bean.update.qisda.DNItem;
import com.myproject.bean.update.qisda.OutInfo; import com.myproject.bean.update.qisda.OutInfo;
...@@ -58,10 +60,12 @@ public class QisdaController extends BaseController { ...@@ -58,10 +60,12 @@ public class QisdaController extends BaseController {
@Autowired @Autowired
private IOutItemDao outItemDao; private IOutItemDao outItemDao;
@Autowired @Autowired
private OutInfoCache outInfoCache; private OutInfoCache outInfoCache;
@Autowired
private IStoragePosDao storagePosDao;
/** /**
* DN单收料 * DN单收料
* @param request * @param request
...@@ -129,6 +133,25 @@ public class QisdaController extends BaseController { ...@@ -129,6 +133,25 @@ public class QisdaController extends BaseController {
return "OK"; return "OK";
} }
/**
* 解除料盘的绑定
*/
@RequestMapping("/service/store/qisda/unbindReel")
@ResponseBody
public String unbindReel(HttpServletRequest request){
String pid = request.getParameter("pid");
Collection<String> excludePosIds = taskService.excludePosIds();
if(!excludePosIds.contains(pid)){
StoragePos pos = storagePosDao.findOneById(pid);
Barcode barcode = pos.getBarcode();
log.info("手动解绑料盘"+barcode.getBarcode()+"["+barcode.getPartNumber()+"]绑定的工单信息:so="+barcode.getAppendInfo().getSo());
storagePosDao.unbindReel(pos);
return "解绑成功";
}else{
return "解绑失败: 当前库位有正在执行的任务";
}
}
/** /**
* 清除所有的绑定信息 * 清除所有的绑定信息
......
...@@ -204,21 +204,23 @@ public class OutInfoCache { ...@@ -204,21 +204,23 @@ public class OutInfoCache {
List<OutInfo> unEndOutInfoList = outInfoDao.findUnEndOutInfos(); List<OutInfo> unEndOutInfoList = outInfoDao.findUnEndOutInfos();
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
for (OutInfo outInfo : unEndOutInfoList) { for (OutInfo outInfo : unEndOutInfoList) {
if(now - outInfo.getMdate().getTime() > 10 * 24 * 60 * 60 * 1000){ // if(now - outInfo.getMdate().getTime() > 10 * 24 * 60 * 60 * 1000){
//10天前的需求单(非紧急料),关闭,并解绑 // //10天前的需求单(非紧急料),关闭,并解绑
if(!outInfo.isUrgentAction()){ // if(!outInfo.isUrgentAction()){
String so = outInfo.getSo(); // String so = outInfo.getSo();
String mDataStr = DateUtil.toDateString(outInfo.getMdate(),"yyyy-MM-dd HH:mm"); // String mDataStr = DateUtil.toDateString(outInfo.getMdate(),"yyyy-MM-dd HH:mm");
log.info("需求单hSerial=["+outInfo.gethSerial()+"]工单so=["+so+"]soseq=["+outInfo.getSoseq()+"]的必须出库日期["+mDataStr+"]为10天前,关闭并解绑工单"); // log.info("需求单hSerial=["+outInfo.gethSerial()+"]工单so=["+so+"]soseq=["+outInfo.getSoseq()+"]的必须出库日期["+mDataStr+"]为10天前,关闭并解绑工单");
closeSoSeq(outInfo.getSoseq()); // closeSoSeq(outInfo.getSoseq());
} // }
//
}else{ // }else{
// addOutInfo(outInfo);
// updateSendStatus(outInfo.gethSerial());
// }
addOutInfo(outInfo); addOutInfo(outInfo);
updateSendStatus(outInfo.gethSerial()); updateSendStatus(outInfo.gethSerial());
} }
} }
}
/** /**
* 仅关闭需求单(不解除绑定),并从缓存中清除 * 仅关闭需求单(不解除绑定),并从缓存中清除
...@@ -542,15 +544,15 @@ public class OutInfoCache { ...@@ -542,15 +544,15 @@ 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() > 10 * 24 * 60 * 60 * 1000){ // if(now.getTime() - outInfo.getMdate().getTime() > 10 * 24 * 60 * 60 * 1000){
//10天前的需求单(非紧急料),关闭,并解绑 // //10天前的需求单(非紧急料),关闭,并解绑
if(!outInfo.isUrgentAction()){ // if(!outInfo.isUrgentAction()){
String so = outInfo.getSo(); // String so = outInfo.getSo();
log.info("需求单hSerial=["+outInfo.gethSerial()+"]工单so=["+so+"]soseq=["+outInfo.getSoseq()+"]的必须出库日期["+outInfo.getMdate()+"]为3天前,关闭并解绑工单"); // log.info("需求单hSerial=["+outInfo.gethSerial()+"]工单so=["+so+"]soseq=["+outInfo.getSoseq()+"]的必须出库日期["+outInfo.getMdate()+"]为3天前,关闭并解绑工单");
closeSoSeq(outInfo.getSoseq()); // closeSoSeq(outInfo.getSoseq());
continue; // continue;
} // }
} // }
if(outInfo.getFirstExecuteTime() == 0){ if(outInfo.getFirstExecuteTime() == 0){
boolean needToWaitQueue = false; boolean needToWaitQueue = false;
...@@ -712,10 +714,16 @@ public class OutInfoCache { ...@@ -712,10 +714,16 @@ public class OutInfoCache {
QisdaCache.setCurrentOrderHSerial(outInfo.gethSerial()); QisdaCache.setCurrentOrderHSerial(outInfo.gethSerial());
} }
}else{ }else{
//已经执行过的首盘和补料,关闭需求 //已经执行过的首盘和补料,如果是工单的最后一个需求单,关闭工
if(outInfo.isFirstReelAction() || outInfo.isTailAction()){ if(outInfo.isFirstReelAction() || outInfo.isTailAction()){
//log.info("需求单["+outInfo.gethSerial()+"]已执行过,关闭"); if(outInfo.isEndOutInfo()){
//closeHSerial(outInfo.gethSerial()); log.info("需求单["+outInfo.gethSerial()+"]已执行过,且是工单的最后一个需求单,关闭工单"+outInfo.getSo()+"["+outInfo.getSoseq()+"]");
closeSoSeq(outInfo.getSoseq());
}else{
log.info("需求单["+outInfo.gethSerial()+"]已执行过,关闭需求单,不再自动缺料重发");
closeHSerial(outInfo.gethSerial());
}
} }
} }
...@@ -897,6 +905,12 @@ public class OutInfoCache { ...@@ -897,6 +905,12 @@ public class OutInfoCache {
*/ */
private List<DataLog> checkOutTail(OutItem outItem, boolean lessSend){ private List<DataLog> checkOutTail(OutItem outItem, boolean lessSend){
List<DataLog> tasks = new ArrayList<>(); List<DataLog> tasks = new ArrayList<>();
if(lessSend){
//不再进行缺料重发
return tasks;
}
if(outItem.getSendQty() > outItem.getQty()){ if(outItem.getSendQty() > outItem.getQty()){
//出经发完料 //出经发完料
return tasks; return tasks;
...@@ -912,10 +926,10 @@ public class OutInfoCache { ...@@ -912,10 +926,10 @@ public class OutInfoCache {
updateOutItem(outItem.getId()); updateOutItem(outItem.getId());
return tasks; return tasks;
} }
if(totalOutInfo.getOutQty() == 0){ // if(totalOutInfo.getOutQty() == 0){
//首盘未出,需要预留一盘最大的给首盘 // //首盘未出,需要预留一盘最大的给首盘
maxQtyReelPos = storagePosDao.findMaxQtyBindReel(outItem.getSoseq(), outItem.getSlotlocation()); // maxQtyReelPos = storagePosDao.findMaxQtyBindReel(outItem.getSoseq(), outItem.getSlotlocation());
} // }
} }
//没有顺序 //没有顺序
...@@ -966,6 +980,10 @@ public class OutInfoCache { ...@@ -966,6 +980,10 @@ public class OutInfoCache {
*/ */
private List<DataLog> checkOutFirst(OutItem outItem, boolean lessSend){ private List<DataLog> checkOutFirst(OutItem outItem, boolean lessSend){
List<DataLog> tasks = new ArrayList<>(); List<DataLog> tasks = new ArrayList<>();
if(lessSend){
//不再进行缺料重发
return tasks;
}
if(outItem.getSendQty() > 0){ if(outItem.getSendQty() > 0){
//出经发完料 //出经发完料
return tasks; return tasks;
......
...@@ -35,8 +35,17 @@ public class SettingsController extends BaseUpdateController { ...@@ -35,8 +35,17 @@ public class SettingsController extends BaseUpdateController {
Model model = new ExtendedModelMap(); Model model = new ExtendedModelMap();
initMessage(request); initMessage(request);
Settings settings = dataCache.getSettings(); Settings settings = dataCache.getSettings();
String notIntoCids = request.getParameter("notIntoCids");
if(!Strings.isNullOrEmpty(notIntoCids)){
log.info("设置不入库料仓:" + notIntoCids);
settings.setNotIntoCids(notIntoCids);
settings = dataCache.updateSettings(settings);
}
//指定软件是为哪个客户单独定制的 //指定软件是为哪个客户单独定制的
String product = request.getParameter("pro"); String product = request.getParameter("pro");
if(!Strings.isNullOrEmpty(product)){ if(!Strings.isNullOrEmpty(product)){
log.info("设置product=" + product); log.info("设置product=" + product);
settings.setProductCustom(product); settings.setProductCustom(product);
......
...@@ -335,12 +335,16 @@ public class QisdaBindService { ...@@ -335,12 +335,16 @@ public class QisdaBindService {
isCutReelIn = true; isCutReelIn = true;
} }
if(cutItem != null){ if(cutItem != null){
OutInfo cutOutInfo = soseqCache.getCutActionInfoFromCache(cutItem.getSoseq());
if(cutOutInfo != null && cutOutInfo.isClosed()){
log.info("工单["+cutOutInfo.getSo()+"]已关闭,不再绑定料盘["+barcode.getBarcode()+"]");
barcode = barcode.removeBindInfo();
}else{
//分盘料 //分盘料
if(cutItem.isCutMaterial()){ if(cutItem.isCutMaterial()){
int preBindQty = cutItem.getLockQty();
if(!isCutReelIn){ if(!isCutReelIn){
//不是分完盘入库的,需要先进行预绑定 //不是分完盘入库的,需要先进行预绑定
preBindQty = cutItem.getLockQty() + barcode.getAmount(); int preBindQty = cutItem.getLockQty() + barcode.getAmount();
if(preBindQty > cutItem.getQty()){ if(preBindQty > cutItem.getQty()){
int reelRemainNum = barcode.cutCount(cutItem); int reelRemainNum = barcode.cutCount(cutItem);
if(reelRemainNum > 0){ if(reelRemainNum > 0){
...@@ -382,7 +386,7 @@ public class QisdaBindService { ...@@ -382,7 +386,7 @@ public class QisdaBindService {
} }
unbindSurplusReel(cutItem); unbindSurplusReel(cutItem);
}
} }
barcode = barcodeDao.save(barcode); barcode = barcodeDao.save(barcode);
......
...@@ -576,6 +576,13 @@ public class StorageDataController extends BaseController { ...@@ -576,6 +576,13 @@ public class StorageDataController extends BaseController {
}else{ }else{
List<Storage> storageList = Lists.newArrayList(); List<Storage> storageList = Lists.newArrayList();
for (String cid: cids.split(",")) { for (String cid: cids.split(",")) {
String notIntoCids = dataCache.getSettings().getNotIntoCids();
if(notIntoCids != null){
if(notIntoCids.contains(cid)){
log.info("料仓["+cid+"]已被屏蔽入库");
continue;
}
}
Storage storage = dataCache.getStorage(cid); Storage storage = dataCache.getStorage(cid);
if(storage != null){ if(storage != null){
storageList.add(storage); storageList.add(storage);
......
...@@ -467,11 +467,11 @@ public class TaskService implements ITaskService { ...@@ -467,11 +467,11 @@ public class TaskService implements ITaskService {
* @return * @return
*/ */
@Override @Override
public synchronized StoragePos findEmptyPosForPutIn(List<Storage> storageList, Barcode barcode, String inRFID) throws ValidateException{ public StoragePos findEmptyPosForPutIn(List<Storage> storageList, Barcode barcode, String inRFID) throws ValidateException{
verifyBarcodePutIn(storageList ,barcode, inRFID); verifyBarcodePutIn(storageList ,barcode, inRFID);
//查找任务数最少的料仓 //查找任务数最少的料仓
Map<String,Integer> storageTaskCountMap = new HashMap<>(); final Map<String,Integer> storageTaskCountMap = new HashMap<>();
for (Storage storage : storageList) { for (Storage storage : storageList) {
storageTaskCountMap.put(storage.getId(), 0); storageTaskCountMap.put(storage.getId(), 0);
} }
...@@ -553,10 +553,7 @@ public class TaskService implements ITaskService { ...@@ -553,10 +553,7 @@ public class TaskService implements ITaskService {
throw new ValidateException("料仓列表中未找到可用的料仓"); throw new ValidateException("料仓列表中未找到可用的料仓");
} }
return findEmptyPosInStorages(barcode, availbleStorageList, storageTaskCountMap);
}
private synchronized StoragePos findEmptyPosInStorages(Barcode barcode, List<Storage> availbleStorageList, final Map<String,Integer> executingTaskCountMap){
boolean isPackingStorage = false; boolean isPackingStorage = false;
for (Storage storage : availbleStorageList) { for (Storage storage : availbleStorageList) {
...@@ -571,16 +568,21 @@ public class TaskService implements ITaskService { ...@@ -571,16 +568,21 @@ public class TaskService implements ITaskService {
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) {
Integer taskCount1 = executingTaskCountMap.get(o1.getId()); Integer taskCount1 = storageTaskCountMap.get(o1.getId());
Integer taskCount2 = executingTaskCountMap.get(o2.getId()); Integer taskCount2 = storageTaskCountMap.get(o2.getId());
return taskCount1.compareTo(taskCount2); return taskCount1.compareTo(taskCount2);
} }
}); });
} }
Collection<String> operatingPosIds = excludePosIds(); return findEmptyPosInStorages(barcode, availbleStorageList, storageTaskCountMap);
}
private synchronized StoragePos findEmptyPosInStorages(Barcode barcode, List<Storage> availbleStorageList, final Map<String,Integer> executingTaskCountMap){
for (Storage storage : availbleStorageList) { for (Storage storage : availbleStorageList) {
try{ try{
Collection<String> operatingPosIds = excludePosIds();
log.debug("尝试从["+storage.getCid()+"]中为["+barcode.getBarcode()+"]查找空位"); log.debug("尝试从["+storage.getCid()+"]中为["+barcode.getBarcode()+"]查找空位");
StoragePos pos = storagePosManager.getEmptyPosByStorage(storage, barcode , operatingPosIds); StoragePos pos = storagePosManager.getEmptyPosByStorage(storage, barcode , operatingPosIds);
if(pos != null){ if(pos != null){
...@@ -680,6 +682,8 @@ public class TaskService implements ITaskService { ...@@ -680,6 +682,8 @@ public class TaskService implements ITaskService {
dataLogDao.save(task); dataLogDao.save(task);
log.info("出库"+storage.getName()+"["+posName+"]物料["+task.getBarcode()+"]"+isSingleOut+"发送到客户端" + cid); log.info("出库"+storage.getName()+"["+posName+"]物料["+task.getBarcode()+"]"+isSingleOut+"发送到客户端" + cid);
//清空展示的消息
serverMsgs.put(storage.getCid(),"");
} }
} }
...@@ -1780,7 +1784,7 @@ public class TaskService implements ITaskService { ...@@ -1780,7 +1784,7 @@ public class TaskService implements ITaskService {
* 加入要执行的任务 * 加入要执行的任务
*/ */
@Override @Override
public synchronized DataLog addPutInTaskToExecute(Storage storage, Barcode barcode, StoragePos storagePos, String trayRfid) throws ValidateException { public DataLog addPutInTaskToExecute(Storage storage, Barcode barcode, StoragePos storagePos, String trayRfid) throws ValidateException {
Collection<DataLog> tasks = taskMap.values(); Collection<DataLog> tasks = taskMap.values();
for (DataLog task : tasks) { for (DataLog task : tasks) {
boolean sameBarcode = task.getBarcode().equals(barcode.getBarcode()); boolean sameBarcode = task.getBarcode().equals(barcode.getBarcode());
...@@ -1825,8 +1829,11 @@ public class TaskService implements ITaskService { ...@@ -1825,8 +1829,11 @@ public class TaskService implements ITaskService {
dataLog.setSourceName(barcode.getAppendInfo().getDnNo()); dataLog.setSourceName(barcode.getAppendInfo().getDnNo());
dataLogDao.save(dataLog); dataLogDao.save(dataLog);
synchronized (taskMap){
taskMap.put(dataLog.getId(), dataLog); taskMap.put(dataLog.getId(), dataLog);
log.info("cid:[" + storage.getCid() + "] barcode:[" + barcode.getBarcode() + "] partNumber:[" + dataLog.getPartNumber() + "]位置[" + storagePos.getPosName() + "]的入库操作成功加入队列"); log.info("cid:[" + storage.getCid() + "] barcode:[" + barcode.getBarcode() + "] partNumber:[" + dataLog.getPartNumber() + "]位置[" + storagePos.getPosName() + "]的入库操作成功加入队列");
}
return dataLog; return dataLog;
} }
......
...@@ -189,7 +189,13 @@ ...@@ -189,7 +189,13 @@
<%--${pos.barcode.appendInfo.soseq}--%> <%--${pos.barcode.appendInfo.soseq}--%>
<%--</display:column>--%> <%--</display:column>--%>
<display:column titleKey="工单" sortProperty="barcode.appendInfo.so" sortable="true"> <display:column titleKey="工单" sortProperty="barcode.appendInfo.so" sortable="true">
<div id="bindInfo${pos.id}">
<c:if test="${pos.barcode.appendInfo.bindToSo}">
${pos.barcode.appendInfo.so} ${pos.barcode.appendInfo.so}
<%--&nbsp;&nbsp;<button class="btn red" onclick="unbindReel('${pos.id}')">--%>
<%--<i class="fa fa fa-trash-o"></i><fmt:message key="解绑"/></button>--%>
</c:if>
</div>
</display:column> </display:column>
<display:column titleKey="Slot" sortProperty="barcode.appendInfo.slotIndex" sortable="true"> <display:column titleKey="Slot" sortProperty="barcode.appendInfo.slotIndex" sortable="true">
${pos.barcode.appendInfo.slotIndex} ${pos.barcode.appendInfo.slotIndex}
...@@ -285,6 +291,13 @@ ...@@ -285,6 +291,13 @@
}); });
function unbindReel(posId){
$.post("${ctx}/service/store/qisda/unbindReel", {pid: posId}, function (data) {
$("#bindInfo"+posId).html("");
alert(data);
});
}
function checkoutStorage(posId) { function checkoutStorage(posId) {
var ids = posId.split(";"); var ids = posId.split(";");
for (var i=0;i<ids.length;i++) for (var i=0;i<ids.length;i++)
......
...@@ -78,10 +78,14 @@ ...@@ -78,10 +78,14 @@
<display:table name="searchCriteria.pageList" requestURI="" <display:table name="searchCriteria.pageList" requestURI=""
sort="external" sort="external"
defaultsort="1" class="table table-striped table-bordered table-hover" export="false" id="outInfo"> defaultsort="1" class="table table-striped table-bordered table-hover" export="false" id="outInfo">
<c:set var="endOutInfoClass" value=""/>
<c:if test="${outInfo.endOutInfo}">
<c:set var="endOutInfoClass" value="bg-yellow"/>
</c:if>
<display:column titleKey="需求单号" sortable="true" sortProperty="hSerial"> <display:column titleKey="需求单号" sortable="true" sortProperty="hSerial">
<a href="#" onclick="showDetail('${outInfo.hSerial}')">${outInfo.hSerial}</a> <a href="#" onclick="showDetail('${outInfo.hSerial}')">${outInfo.hSerial}</a>
</display:column> </display:column>
<display:column titleKey="动作" property="action" sortable="true" sortProperty="action"/> <display:column titleKey="动作" property="action" sortable="true" sortProperty="action" class="${endOutInfoClass}"/>
<display:column titleKey="工单" sortable="true" sortProperty="so"> <display:column titleKey="工单" sortable="true" sortProperty="so">
${outInfo.so}<c:if test="${outInfo.soseq != null}">(${outInfo.soseq})</c:if> ${outInfo.so}<c:if test="${outInfo.soseq != null}">(${outInfo.soseq})</c:if>
</display:column> </display:column>
......
...@@ -514,7 +514,7 @@ ...@@ -514,7 +514,7 @@
// position = 'bottom left'; // position = 'bottom left';
// } // }
// } // }
if(data[item].timeout){ if(data[item].timeout && !data[item].wait){
position = 'bottom left'; position = 'bottom left';
} }
......
...@@ -13,6 +13,29 @@ ...@@ -13,6 +13,29 @@
<div class="col-md-12"> <div class="col-md-12">
<ul class="timeline"> <ul class="timeline">
<li class="timeline-green">
<div class="timeline-time">
<span class="date">2020</span>
<span class="time">09-24</span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<h2>版本: V2020092415</h2>
<div class="timeline-content">
<ul>
<li>去除缺料自动重发功能</li>
<li>入库时不再绑定已关闭的工单(分完盘入库的料也不再绑定)</li>
<li>如果需求单是工单的最后一个需求单,完成时关闭并解绑整个工单</li>
<li>如果需求单不是工单的最后一个需求单,完成时关闭需求单</li>
<li>单个料盘解绑功能(暂未启用)</li>
<li>取消10天前工单解绑功能</li>
<li>Setting中增加某台料仓只出不入功能</li>
</ul>
</div>
</div>
</li>
<li class="timeline-blue"> <li class="timeline-blue">
<div class="timeline-time"> <div class="timeline-time">
<span class="date">2020 </span> <span class="date">2020 </span>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!