Commit 8ce63ff1 sunke

去除缺料自动重发功能

入库时不再绑定已关闭的工单(分完盘入库的料也不再绑定)
如果需求单是工单的最后一个需求单,完成时关闭并解绑整个工单
如果需求单不是工单的最后一个需求单,完成时关闭需求单
单个料盘解绑功能(暂未启用)
取消10天前工单解绑功能
Setting中增加某台料仓只出不入功能
1 个父辈 d180a30f
package com.myproject.bean.qisda;
import com.myproject.util.StorageConstants;
import org.apache.logging.log4j.util.Strings;
import java.util.HashMap;
import java.util.Map;
......@@ -351,6 +352,13 @@ public class AppendInfo {
this.cisIn = cisIn;
}
/**
* 是否已经绑定工单
*/
public boolean isBindToSo(){
return Strings.isNotBlank(so);
}
@Override
public String toString() {
return "AppendInfo{" +
......
......@@ -95,6 +95,13 @@ public class RequestOutItemBean {
*/
private String line;
/**
* 是否是工单的最后一个需求单
*/
private String endOutInfo = "N";
public String getAction() {
return action;
}
......@@ -252,6 +259,14 @@ public class RequestOutItemBean {
this.line = line;
}
public String getEndOutInfo() {
return endOutInfo;
}
public void setEndOutInfo(String endOutInfo) {
this.endOutInfo = endOutInfo;
}
@Override
public String toString() {
return "RequestOutItemBean{" +
......
......@@ -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为空)
*/
public boolean hasCutInfo(){
......
......@@ -174,6 +174,11 @@ public class Settings extends BaseMongoBean {
*/
private boolean stopJob = false;
/**
* 不入库的料仓列表
*/
private String notIntoCids = "";
public Date getLastPcbCheckDate() {
return lastPcbCheckDate;
}
......@@ -413,5 +418,13 @@ public class Settings extends BaseMongoBean {
public void setStopJob(boolean 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 {
}
this.taskNeedOutDate = needOutDate;
this.mdate = outItem.getMdate();
this.endOutInfo = outItem.isTheEndOutInfo();
}
/**
......@@ -121,6 +122,12 @@ public class OutInfo extends BaseMongoBean {
*/
private Date taskNeedOutDate;
/**
* 是否为工单的最后一个需求单
*/
private boolean endOutInfo = false;
@Transient
private Map<String, OutItem> outItemMap = new HashMap<>();
......@@ -456,6 +463,14 @@ public class OutInfo extends BaseMongoBean {
this.taskNeedOutDate = taskNeedOutDate;
}
public boolean isEndOutInfo() {
return endOutInfo;
}
public void setEndOutInfo(boolean endOutInfo) {
this.endOutInfo = endOutInfo;
}
@Override
public String toString() {
return "OutInfo{" +
......
......@@ -27,6 +27,7 @@ public class OutItem extends BaseMongoBean {
this.reelID = itemBean.getReelID();
this.line = itemBean.getLine();
this.location = itemBean.getLocation();
this.endOutInfo = itemBean.getEndOutInfo();
String sdateStr = itemBean.getSdte() + itemBean.getStme();
String mdateStr = itemBean.getMdte() + itemBean.getMtme();
this.sdate = DateUtil.toDate(sdateStr, "yyyyMMddHHmmss");
......@@ -134,6 +135,11 @@ public class OutItem extends BaseMongoBean {
private String line;
/**
* 是否是工单的最后一个需求单
*/
private String endOutInfo = "N";
/**
* 出库缺料情况
*/
public int outLessQty(){
......@@ -477,4 +483,19 @@ public class OutItem extends BaseMongoBean {
public void setLine(String 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
@Override
public StoragePos unbindReel(StoragePos storagePos){
Barcode barcode = storagePos.getBarcode();
AppendInfo appendInfo = barcode.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);
barcode.setAppendInfo(appendInfo);
barcode = barcode.removeBindInfo();
barcode.setAmount(barcode.getInitialAmount());
barcode = barcodeDao.save(barcode);
storagePos.setBarcode(barcode);
......
......@@ -3,6 +3,8 @@ package com.myproject.webapp.controller.qisda;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
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.DNItem;
import com.myproject.bean.update.qisda.OutInfo;
......@@ -58,10 +60,12 @@ public class QisdaController extends BaseController {
@Autowired
private IOutItemDao outItemDao;
@Autowired
private OutInfoCache outInfoCache;
@Autowired
private IStoragePosDao storagePosDao;
/**
* DN单收料
* @param request
......@@ -129,6 +133,25 @@ public class QisdaController extends BaseController {
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,19 +204,21 @@ public class OutInfoCache {
List<OutInfo> unEndOutInfoList = outInfoDao.findUnEndOutInfos();
long now = System.currentTimeMillis();
for (OutInfo outInfo : unEndOutInfoList) {
if(now - outInfo.getMdate().getTime() > 10 * 24 * 60 * 60 * 1000){
//10天前的需求单(非紧急料),关闭,并解绑
if(!outInfo.isUrgentAction()){
String so = outInfo.getSo();
String mDataStr = DateUtil.toDateString(outInfo.getMdate(),"yyyy-MM-dd HH:mm");
log.info("需求单hSerial=["+outInfo.gethSerial()+"]工单so=["+so+"]soseq=["+outInfo.getSoseq()+"]的必须出库日期["+mDataStr+"]为10天前,关闭并解绑工单");
closeSoSeq(outInfo.getSoseq());
}
}else{
addOutInfo(outInfo);
updateSendStatus(outInfo.gethSerial());
}
// if(now - outInfo.getMdate().getTime() > 10 * 24 * 60 * 60 * 1000){
// //10天前的需求单(非紧急料),关闭,并解绑
// if(!outInfo.isUrgentAction()){
// String so = outInfo.getSo();
// String mDataStr = DateUtil.toDateString(outInfo.getMdate(),"yyyy-MM-dd HH:mm");
// log.info("需求单hSerial=["+outInfo.gethSerial()+"]工单so=["+so+"]soseq=["+outInfo.getSoseq()+"]的必须出库日期["+mDataStr+"]为10天前,关闭并解绑工单");
// closeSoSeq(outInfo.getSoseq());
// }
//
// }else{
// addOutInfo(outInfo);
// updateSendStatus(outInfo.gethSerial());
// }
addOutInfo(outInfo);
updateSendStatus(outInfo.gethSerial());
}
}
......@@ -542,15 +544,15 @@ public class OutInfoCache {
public void updateMustExeOutInfo(){
Date now = new Date();
for (OutInfo outInfo : outInfoMap.values()) {
if(now.getTime() - outInfo.getMdate().getTime() > 10 * 24 * 60 * 60 * 1000){
//10天前的需求单(非紧急料),关闭,并解绑
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(now.getTime() - outInfo.getMdate().getTime() > 10 * 24 * 60 * 60 * 1000){
// //10天前的需求单(非紧急料),关闭,并解绑
// 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;
......@@ -712,10 +714,16 @@ public class OutInfoCache {
QisdaCache.setCurrentOrderHSerial(outInfo.gethSerial());
}
}else{
//已经执行过的首盘和补料,关闭需求
//已经执行过的首盘和补料,如果是工单的最后一个需求单,关闭工
if(outInfo.isFirstReelAction() || outInfo.isTailAction()){
//log.info("需求单["+outInfo.gethSerial()+"]已执行过,关闭");
//closeHSerial(outInfo.gethSerial());
if(outInfo.isEndOutInfo()){
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 {
*/
private List<DataLog> checkOutTail(OutItem outItem, boolean lessSend){
List<DataLog> tasks = new ArrayList<>();
if(lessSend){
//不再进行缺料重发
return tasks;
}
if(outItem.getSendQty() > outItem.getQty()){
//出经发完料
return tasks;
......@@ -912,10 +926,10 @@ public class OutInfoCache {
updateOutItem(outItem.getId());
return tasks;
}
if(totalOutInfo.getOutQty() == 0){
//首盘未出,需要预留一盘最大的给首盘
maxQtyReelPos = storagePosDao.findMaxQtyBindReel(outItem.getSoseq(), outItem.getSlotlocation());
}
// if(totalOutInfo.getOutQty() == 0){
// //首盘未出,需要预留一盘最大的给首盘
// maxQtyReelPos = storagePosDao.findMaxQtyBindReel(outItem.getSoseq(), outItem.getSlotlocation());
// }
}
//没有顺序
......@@ -966,6 +980,10 @@ public class OutInfoCache {
*/
private List<DataLog> checkOutFirst(OutItem outItem, boolean lessSend){
List<DataLog> tasks = new ArrayList<>();
if(lessSend){
//不再进行缺料重发
return tasks;
}
if(outItem.getSendQty() > 0){
//出经发完料
return tasks;
......
......@@ -35,8 +35,17 @@ public class SettingsController extends BaseUpdateController {
Model model = new ExtendedModelMap();
initMessage(request);
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");
if(!Strings.isNullOrEmpty(product)){
log.info("设置product=" + product);
settings.setProductCustom(product);
......
......@@ -335,54 +335,58 @@ public class QisdaBindService {
isCutReelIn = true;
}
if(cutItem != null){
//分盘料
if(cutItem.isCutMaterial()){
int preBindQty = cutItem.getLockQty();
if(!isCutReelIn){
//不是分完盘入库的,需要先进行预绑定
preBindQty = cutItem.getLockQty() + barcode.getAmount();
if(preBindQty > cutItem.getQty()){
int reelRemainNum = barcode.cutCount(cutItem);
if(reelRemainNum > 0){
//母盘还有剩余,说明该需求slot已经满足
preBindQty = cutItem.getQty();
}else {
//母盘正好用完或全部用完也达不到需求量,此母盘绑定slot后,需要继续寻找其他盘进行绑定
preBindQty = preBindQty + barcode.getAmount();
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(!isCutReelIn){
//不是分完盘入库的,需要先进行预绑定
int preBindQty = cutItem.getLockQty() + barcode.getAmount();
if(preBindQty > cutItem.getQty()){
int reelRemainNum = barcode.cutCount(cutItem);
if(reelRemainNum > 0){
//母盘还有剩余,说明该需求slot已经满足
preBindQty = cutItem.getQty();
}else {
//母盘正好用完或全部用完也达不到需求量,此母盘绑定slot后,需要继续寻找其他盘进行绑定
preBindQty = preBindQty + barcode.getAmount();
}
}
}
cutItem.setLockQty(preBindQty);
soseqCache.udpateTotalPreLockQty(cutItem,preBindQty);
cutItem.setLockQty(preBindQty);
soseqCache.udpateTotalPreLockQty(cutItem,preBindQty);
log.info("\t分盘料"+barcode.getBarcode()+"["+barcode.getPartNumber()+"]绑定到soseq=["+cutItem.getSoseq()+"]so=["+cutItem.getSo()+"]的["+cutItem.getSlotlocation()+"] 数量:" + preBindQty +"/" + cutItem.getQty());
}
log.info("\t分盘料"+barcode.getBarcode()+"["+barcode.getPartNumber()+"]绑定到soseq=["+cutItem.getSoseq()+"]so=["+cutItem.getSo()+"]的["+cutItem.getSlotlocation()+"] 数量:" + preBindQty +"/" + cutItem.getQty());
}
if(!barcode.hasCutInfo()){
//没有分盘信息,可以直接绑定
if(!barcode.hasCutInfo()){
//没有分盘信息,可以直接绑定
barcode.realBindItem(cutItem);
int realBindQty = cutItem.getRealLockQty() + barcode.getAmount();
cutItem.setRealLockQty(realBindQty);
soseqCache.updateTotalRealLockQty(cutItem,realBindQty);
}else{
AppendInfo appendInfo = barcode.getAppendInfo();
appendInfo.setSlotIndex(cutItem.getSlotlocation());
appendInfo.setSo(cutItem.getSo());
appendInfo.setSoseq(cutItem.getSoseq());
barcode.setAppendInfo(appendInfo);
log.info("分盘料["+barcode.getBarcode()+"]分盘信息:" + barcode.getAppendInfo().getCutMap());
}
}else{
//绑定
barcode.realBindItem(cutItem);
int realBindQty = cutItem.getRealLockQty() + barcode.getAmount();
cutItem.setRealLockQty(realBindQty);
soseqCache.updateTotalRealLockQty(cutItem,realBindQty);
}else{
AppendInfo appendInfo = barcode.getAppendInfo();
appendInfo.setSlotIndex(cutItem.getSlotlocation());
appendInfo.setSo(cutItem.getSo());
appendInfo.setSoseq(cutItem.getSoseq());
barcode.setAppendInfo(appendInfo);
log.info("分盘料["+barcode.getBarcode()+"]分盘信息:" + barcode.getAppendInfo().getCutMap());
log.info(barcode.getBarcode() + "["+barcode.getPartNumber()+"]入库完成,工单so=["+cutItem.getSo()+"] soseq=["+cutItem.getSoseq()+"]slotSeq=["+cutItem.getSlotlocation()+"]绑定数量增加"+barcode.getAmount()+"="+ realBindQty);
}
}else{
//绑定
barcode.realBindItem(cutItem);
int realBindQty = cutItem.getRealLockQty() + barcode.getAmount();
cutItem.setRealLockQty(realBindQty);
soseqCache.updateTotalRealLockQty(cutItem,realBindQty);
log.info(barcode.getBarcode() + "["+barcode.getPartNumber()+"]入库完成,工单so=["+cutItem.getSo()+"] soseq=["+cutItem.getSoseq()+"]slotSeq=["+cutItem.getSlotlocation()+"]绑定数量增加"+barcode.getAmount()+"="+ realBindQty);
}
unbindSurplusReel(cutItem);
unbindSurplusReel(cutItem);
}
}
barcode = barcodeDao.save(barcode);
......
......@@ -576,6 +576,13 @@ public class StorageDataController extends BaseController {
}else{
List<Storage> storageList = Lists.newArrayList();
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);
if(storage != null){
storageList.add(storage);
......
......@@ -467,11 +467,11 @@ public class TaskService implements ITaskService {
* @return
*/
@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);
//查找任务数最少的料仓
Map<String,Integer> storageTaskCountMap = new HashMap<>();
final Map<String,Integer> storageTaskCountMap = new HashMap<>();
for (Storage storage : storageList) {
storageTaskCountMap.put(storage.getId(), 0);
}
......@@ -553,10 +553,7 @@ public class TaskService implements ITaskService {
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;
for (Storage storage : availbleStorageList) {
......@@ -571,16 +568,21 @@ public class TaskService implements ITaskService {
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());
Integer taskCount1 = storageTaskCountMap.get(o1.getId());
Integer taskCount2 = storageTaskCountMap.get(o2.getId());
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) {
try{
Collection<String> operatingPosIds = excludePosIds();
log.debug("尝试从["+storage.getCid()+"]中为["+barcode.getBarcode()+"]查找空位");
StoragePos pos = storagePosManager.getEmptyPosByStorage(storage, barcode , operatingPosIds);
if(pos != null){
......@@ -680,6 +682,8 @@ public class TaskService implements ITaskService {
dataLogDao.save(task);
log.info("出库"+storage.getName()+"["+posName+"]物料["+task.getBarcode()+"]"+isSingleOut+"发送到客户端" + cid);
//清空展示的消息
serverMsgs.put(storage.getCid(),"");
}
}
......@@ -1780,7 +1784,7 @@ public class TaskService implements ITaskService {
* 加入要执行的任务
*/
@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();
for (DataLog task : tasks) {
boolean sameBarcode = task.getBarcode().equals(barcode.getBarcode());
......@@ -1825,8 +1829,11 @@ public class TaskService implements ITaskService {
dataLog.setSourceName(barcode.getAppendInfo().getDnNo());
dataLogDao.save(dataLog);
taskMap.put(dataLog.getId(), dataLog);
log.info("cid:[" + storage.getCid() + "] barcode:[" + barcode.getBarcode() + "] partNumber:[" + dataLog.getPartNumber() + "]位置[" + storagePos.getPosName() + "]的入库操作成功加入队列");
synchronized (taskMap){
taskMap.put(dataLog.getId(), dataLog);
log.info("cid:[" + storage.getCid() + "] barcode:[" + barcode.getBarcode() + "] partNumber:[" + dataLog.getPartNumber() + "]位置[" + storagePos.getPosName() + "]的入库操作成功加入队列");
}
return dataLog;
}
......
......@@ -189,7 +189,13 @@
<%--${pos.barcode.appendInfo.soseq}--%>
<%--</display:column>--%>
<display:column titleKey="工单" sortProperty="barcode.appendInfo.so" sortable="true">
${pos.barcode.appendInfo.so}
<div id="bindInfo${pos.id}">
<c:if test="${pos.barcode.appendInfo.bindToSo}">
${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 titleKey="Slot" sortProperty="barcode.appendInfo.slotIndex" sortable="true">
${pos.barcode.appendInfo.slotIndex}
......@@ -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) {
var ids = posId.split(";");
for (var i=0;i<ids.length;i++)
......
......@@ -78,10 +78,14 @@
<display:table name="searchCriteria.pageList" requestURI=""
sort="external"
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">
<a href="#" onclick="showDetail('${outInfo.hSerial}')">${outInfo.hSerial}</a>
</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">
${outInfo.so}<c:if test="${outInfo.soseq != null}">(${outInfo.soseq})</c:if>
</display:column>
......
......@@ -514,7 +514,7 @@
// position = 'bottom left';
// }
// }
if(data[item].timeout){
if(data[item].timeout && !data[item].wait){
position = 'bottom left';
}
......
......@@ -13,6 +13,29 @@
<div class="col-md-12">
<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">
<div class="timeline-time">
<span class="date">2020 </span>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!