Commit 9b70a0d7 sunke

首盘绑定时剔除与溢出数量最接近且日期一致的料盘

1 个父辈 992fe842
...@@ -62,7 +62,11 @@ public interface IStoragePosDao extends IMongoDao { ...@@ -62,7 +62,11 @@ public interface IStoragePosDao extends IMongoDao {
*/ */
List<StoragePos> findPreBindList(String so, int slotlocation); List<StoragePos> findPreBindList(String so, int slotlocation);
// int getCutCount(String so, String slot); StoragePos findSurplusPreBindReel(String soseq, int slotlocation, int surplusQty, String produceDateStr);
StoragePos findSurplusBindReel(String soseq, int slotlocation, int surplusQty, String produceDateStr);
StoragePos findMaxQtyBindReel(String soseq, int slotlocation);
List<StoragePos> findCutList(String so, int slotlocation, String soseq); List<StoragePos> findCutList(String so, int slotlocation, String soseq);
...@@ -76,4 +80,6 @@ public interface IStoragePosDao extends IMongoDao { ...@@ -76,4 +80,6 @@ public interface IStoragePosDao extends IMongoDao {
List<StoragePos> allBindPos(); List<StoragePos> allBindPos();
StoragePos findByBarcode(String barcode); StoragePos findByBarcode(String barcode);
StoragePos unbindReel(StoragePos storagePos);
} }
...@@ -8,13 +8,18 @@ import com.myproject.bean.json.ChartData; ...@@ -8,13 +8,18 @@ import com.myproject.bean.json.ChartData;
import com.myproject.bean.json.ChartItem; import com.myproject.bean.json.ChartItem;
import com.myproject.bean.json.InventoryItem; import com.myproject.bean.json.InventoryItem;
import com.myproject.bean.json.PlateSizeBean; import com.myproject.bean.json.PlateSizeBean;
import com.myproject.bean.qisda.AppendInfo;
import com.myproject.bean.qisda.AvailableInventoryBean; import com.myproject.bean.qisda.AvailableInventoryBean;
import com.myproject.bean.update.Barcode;
import com.myproject.bean.update.StoragePos; import com.myproject.bean.update.StoragePos;
import com.myproject.dao.mongo.AbstractMongoDao; import com.myproject.dao.mongo.AbstractMongoDao;
import com.myproject.dao.mongo.IBarcodeDao;
import com.myproject.dao.mongo.IStoragePosDao; import com.myproject.dao.mongo.IStoragePosDao;
import com.myproject.exception.ValidateException;
import com.myproject.util.PLATE_SIZE; import com.myproject.util.PLATE_SIZE;
import com.myproject.util.StorageConstants; import com.myproject.util.StorageConstants;
import com.myproject.util.StringHelper; import com.myproject.util.StringHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults; import org.springframework.data.mongodb.core.aggregation.AggregationResults;
...@@ -31,6 +36,9 @@ import java.util.*; ...@@ -31,6 +36,9 @@ import java.util.*;
@Repository @Repository
public class StoragePosDaoImpl extends AbstractMongoDao implements IStoragePosDao { public class StoragePosDaoImpl extends AbstractMongoDao implements IStoragePosDao {
@Autowired
private IBarcodeDao barcodeDao;
@Override @Override
public Class getEntityClass() { public Class getEntityClass() {
return StoragePos.class; return StoragePos.class;
...@@ -312,6 +320,52 @@ public class StoragePosDaoImpl extends AbstractMongoDao implements IStoragePosDa ...@@ -312,6 +320,52 @@ public class StoragePosDaoImpl extends AbstractMongoDao implements IStoragePosDa
} }
/** /**
* 查找某个预绑定站位,用于剔除站位多余绑定的料盘
* @param soseq 工单序号
* @param slotlocation 站位序号
* @param surplusQty 多绑的数量
* @param produceDateStr 最大盘的日期
* @return 符合条件的料盘
*/
@Override
public StoragePos findSurplusPreBindReel(String soseq, int slotlocation, int surplusQty, String produceDateStr){
String preBindSlot = "" + slotlocation;
//同一个预绑定站位,且与生产日期一致,小于盈余数量的一盘料
Criteria c = Criteria.where("barcode.appendInfo.soseq").is(soseq).and("barcode.appendInfo.preBindSlot").is(preBindSlot)
.and("barcode.appendInfo.bindSlot").is(null).and("barcode.produceDateStr").is(produceDateStr).and("barcode.amount").lte(surplusQty);
Query q = new Query(c);
q.with(new Sort(Sort.Direction.DESC, "barcode.amount"));
return findOne(q);
}
/**
* 查找某个绑定站位,用于剔除站位多余绑定的料盘
*/
@Override
public StoragePos findSurplusBindReel(String soseq, int slotlocation, int surplusQty, String produceDateStr){
String bindSlot = "" + slotlocation;
//同一个预绑定站位,且与生产日期一致,小于盈余数量的一盘料
Criteria c = Criteria.where("barcode.appendInfo.soseq").is(soseq).and("barcode.appendInfo.bindSlot").is(bindSlot)
.and("barcode.produceDateStr").is(produceDateStr).and("barcode.amount").lte(surplusQty);
Query q = new Query(c);
q.with(new Sort(Sort.Direction.DESC, "barcode.amount"));
return findOne(q);
}
/**
* 查找某个绑定站位最大的一盘料
*/
@Override
public StoragePos findMaxQtyBindReel(String soseq, int slotlocation){
String bindSlot = "" + slotlocation;
//同一个预绑定站位,且与生产日期一致,小于盈余数量的一盘料
Criteria c = Criteria.where("barcode.appendInfo.soseq").is(soseq).and("barcode.appendInfo.bindSlot").is(bindSlot);
Query q = new Query(c);
q.with(new Sort(Sort.Direction.DESC, "barcode.amount"));
return findOne(q);
}
/**
* 获取工单站位所有待分盘的料盘 * 获取工单站位所有待分盘的料盘
* @param so * @param so
* @param slotlocation * @param slotlocation
...@@ -378,4 +432,29 @@ public class StoragePosDaoImpl extends AbstractMongoDao implements IStoragePosDa ...@@ -378,4 +432,29 @@ public class StoragePosDaoImpl extends AbstractMongoDao implements IStoragePosDa
public StoragePos findByBarcode(String barcode){ public StoragePos findByBarcode(String barcode){
return findOneByCondition(new String[]{"barcode.barcode"}, new String[]{barcode}); return findOneByCondition(new String[]{"barcode.barcode"}, new String[]{barcode});
} }
@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.setAmount(barcode.getInitialAmount());
barcode = barcodeDao.save(barcode);
storagePos.setBarcode(barcode);
storagePos = save(storagePos);
return storagePos;
}
} }
...@@ -180,29 +180,7 @@ public class QisdaController extends BaseController { ...@@ -180,29 +180,7 @@ public class QisdaController extends BaseController {
log.info("开始解绑所有绑定工单的料盘"); log.info("开始解绑所有绑定工单的料盘");
List<StoragePos> bindPosList = storagePosDao.allBindPos(); List<StoragePos> bindPosList = storagePosDao.allBindPos();
for (StoragePos storagePos : bindPosList) { for (StoragePos storagePos : bindPosList) {
Barcode barcode = storagePos.getBarcode(); storagePosDao.unbindReel(storagePos);
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.setAmount(barcode.getInitialAmount());
try {
barcode = barcodeManager.save(barcode);
storagePos.setBarcode(barcode);
storagePosDao.save(storagePos);
} catch (ValidateException e) {
e.printStackTrace();
}
} }
log.info("清理绑定完成"); log.info("清理绑定完成");
return "OK"; return "OK";
......
...@@ -144,6 +144,8 @@ public class OutInfoCache { ...@@ -144,6 +144,8 @@ public class OutInfoCache {
OutInfo dbOutInfo = outInfoDao.findOneById(outInfo.getId()); OutInfo dbOutInfo = outInfoDao.findOneById(outInfo.getId());
if(dbOutInfo != null){ if(dbOutInfo != null){
if(dbOutInfo.getSendStatus() != outInfo.getSendStatus() || dbOutInfo.getBindStatus() != outInfo.getBindStatus()){ if(dbOutInfo.getSendStatus() != outInfo.getSendStatus() || dbOutInfo.getBindStatus() != outInfo.getBindStatus()){
dbOutInfo.setSendStatus(outInfo.getSendStatus());
dbOutInfo.setBindStatus(outInfo.getBindStatus());
outInfoDao.save(dbOutInfo); outInfoDao.save(dbOutInfo);
log.info("需求单["+hSerial+"]状态与数据库不一致,更新到数据库"); log.info("需求单["+hSerial+"]状态与数据库不一致,更新到数据库");
} }
......
...@@ -637,6 +637,25 @@ public class QisdaApiController extends BaseController { ...@@ -637,6 +637,25 @@ public class QisdaApiController extends BaseController {
} }
} }
//多出数量
int surplusQty = -needNum;
if(surplusQty >= 0){
//已经预绑定的所有料盘中与最大盘日期相同,且与超出数量最接近的料盘剔除掉
StoragePos maxBindReelPos = storagePosDao.findMaxQtyBindReel(outItem.getSoseq(), outItem.getSlotlocation());
if(maxBindReelPos != null){
Barcode maxQtyBindReelBarcode = maxBindReelPos.getBarcode();
StoragePos needToUnBindPos = storagePosDao.findSurplusBindReel(outItem.getSoseq(), outItem.getSlotlocation(), surplusQty, maxQtyBindReelBarcode.getProduceDateStr());
if(needToUnBindPos != null){
int unbindAmount = needToUnBindPos.getBarcode().getAmount();
log.info("找到与最大料盘["+maxQtyBindReelBarcode.getBarcode()+"]相同日期["+maxQtyBindReelBarcode.getProduceDateStr()+"]与超绑数量["+surplusQty+"]接近的料盘["+needToUnBindPos.getBarcode().getBarcode()+"]数量为["+unbindAmount+"]解除绑定");
storagePosDao.unbindReel(needToUnBindPos);
int newLockQty = outItem.getRealLockQty() - unbindAmount;
outItem.setLockQty(newLockQty);
outItem = outItemDao.save(outItem);
}
}
}
//首盘,如果此站位一盘也没有,查找是否有同工单不同站位的PN,如果有,抢一盘过来 //首盘,如果此站位一盘也没有,查找是否有同工单不同站位的PN,如果有,抢一盘过来
log.info("So=["+outItem.getSo()+"]hSerial=["+outItem.gethSerial()+"]+refno=["+outItem.getRefno()+"]的slot"+outItem.getSlotlocation()+"]pn=["+outItem.getPn()+"]真实绑定结束,当前数量:"+outItem.getSendQty()+"+"+ outItem.getRealLockQty() +"/" + outItem.getQty()); log.info("So=["+outItem.getSo()+"]hSerial=["+outItem.gethSerial()+"]+refno=["+outItem.getRefno()+"]的slot"+outItem.getSlotlocation()+"]pn=["+outItem.getPn()+"]真实绑定结束,当前数量:"+outItem.getSendQty()+"+"+ outItem.getRealLockQty() +"/" + outItem.getQty());
} }
...@@ -670,8 +689,20 @@ public class QisdaApiController extends BaseController { ...@@ -670,8 +689,20 @@ public class QisdaApiController extends BaseController {
storagePosDao.save(pos); storagePosDao.save(pos);
outItem.setLockQty(newLockQty); outItem.setLockQty(newLockQty);
outItem = outItemDao.save(outItem); outItem = outItemDao.save(outItem);
if(newLockQty > outItem.getQty()){ //多出数量
//已经满足需求了,直接跳出 int surplusQty = newLockQty - outItem.getQty();
if(surplusQty >= 0){
//已经满足需求了,剔除同日期的小料盘后直接跳出
//已经预绑定的所有料盘中与最大盘日期相同,且与超出数量最接近的料盘剔除掉
StoragePos needToUnBindPos = storagePosDao.findSurplusPreBindReel(outItem.getSoseq(), outItem.getSlotlocation(), surplusQty, barcode.getProduceDateStr());
if(needToUnBindPos != null){
int unbindAmount = needToUnBindPos.getBarcode().getAmount();
log.info("找到与最大料盘["+barcode.getBarcode()+"]相同日期["+barcode.getProduceDateStr()+"]与超绑数量["+surplusQty+"]接近的料盘["+needToUnBindPos.getBarcode().getBarcode()+"]数量为["+unbindAmount+"]解除预绑定");
storagePosDao.unbindReel(needToUnBindPos);
newLockQty = newLockQty - unbindAmount;
outItem.setLockQty(newLockQty);
outItem = outItemDao.save(outItem);
}
break; break;
} }
} }
...@@ -1298,12 +1329,13 @@ public class QisdaApiController extends BaseController { ...@@ -1298,12 +1329,13 @@ public class QisdaApiController extends BaseController {
allTasks.addAll(queueTasks); allTasks.addAll(queueTasks);
} }
//是滞有工单料任务
boolean hasOrderTask = false;
for (DataLog dataLog : allTasks) { for (DataLog dataLog : allTasks) {
if(dataLog.isCheckOutTask()){ if(dataLog.isCheckOutTask()){
//首盘和补料 if(!dataLog.isUrgentReel() && !dataLog.isCutReel()){
if(!outInfo.isReelCutAction() && !outInfo.isUrgentAction()){ //工单料(不是指定料也不是分盘料即首盘或补料)
//InquiryShelfBean.hSerialShelfMap.clear(); hasOrderTask = true;
return "全部任务完成后才可执行";
}else{ }else{
//分盘和紧急料 //分盘和紧急料
String taskHSerial = dataLog.getAppendInfo().gethSerial(); String taskHSerial = dataLog.getAppendInfo().gethSerial();
...@@ -1314,6 +1346,11 @@ public class QisdaApiController extends BaseController { ...@@ -1314,6 +1346,11 @@ public class QisdaApiController extends BaseController {
} }
} }
//首盘和补料
if(!outInfo.isReelCutAction() && !outInfo.isUrgentAction() && hasOrderTask){
return "全部任务完成后才可执行";
}
//如果是工单需求单,设置当前正在执行的工单需求单 //如果是工单需求单,设置当前正在执行的工单需求单
...@@ -1381,6 +1418,8 @@ public class QisdaApiController extends BaseController { ...@@ -1381,6 +1418,8 @@ public class QisdaApiController extends BaseController {
} }
} }
}else{
log.info("需求单"+outInfo.gethSerial()+"本次出库料盘数量为0");
} }
if(outInfo.isReelCutAction() || outInfo.isFirstReelAction()){ if(outInfo.isReelCutAction() || outInfo.isFirstReelAction()){
......
...@@ -127,16 +127,17 @@ public class QisdaDeviceController extends BaseController { ...@@ -127,16 +127,17 @@ public class QisdaDeviceController extends BaseController {
return ResultBean.newErrorResult(102, msg); return ResultBean.newErrorResult(102, msg);
} }
boolean firstScanSame = isSameTask(barcode,firstScanTask); //防止条码重复发送,现在已经不需要了
boolean firstRobtoSame = isSameTask(barcode,firstRobotTask); // boolean firstScanSame = isSameTask(barcode,firstScanTask);
boolean secondScanSame = isSameTask(barcode,secondScanTask); // boolean firstRobtoSame = isSameTask(barcode,firstRobotTask);
boolean secondRobtoSame = isSameTask(barcode,secondRobotTask); // boolean secondScanSame = isSameTask(barcode,secondScanTask);
if(firstScanSame || firstRobtoSame || secondScanSame || secondRobtoSame){ // boolean secondRobtoSame = isSameTask(barcode,secondRobotTask);
String msg = "条码["+barcode.getBarcode()+"]与已有任务重复,获取尺寸信息失败"; // if(firstScanSame || firstRobtoSame || secondScanSame || secondRobtoSame){
log.error(msg); // String msg = "条码["+barcode.getBarcode()+"]与已有任务重复,获取尺寸信息失败";
// log.error(msg);
return ResultBean.newErrorResult(105, msg); //
} // return ResultBean.newErrorResult(105, msg);
// }
DataLog task = taskService.getFinishedTask(barcode.getBarcode()); DataLog task = taskService.getFinishedTask(barcode.getBarcode());
......
...@@ -1353,7 +1353,7 @@ public class TaskService implements ITaskService { ...@@ -1353,7 +1353,7 @@ public class TaskService implements ITaskService {
if(!Strings.isNullOrEmpty(posName)){//客户端发一次完成之后,会发空的 posName,不需要处理 if(!Strings.isNullOrEmpty(posName)){//客户端发一次完成之后,会发空的 posName,不需要处理
if (StorageConstants.BOX_STATUS.IN_FINISHED == status) {//入仓完成 if (StorageConstants.BOX_STATUS.IN_FINISHED == status) {//入仓完成
DataLog task = findExecutingTask(statusBeanToSave.getCid(), boxStatus.getPosId()); DataLog task = findExecutingTask(statusBeanToSave.getCid(), boxStatus.getPosId());
if (task != null) { if (task != null && task.isPutInTask()) {
log.info(task.getBarcode() + "入仓位[" + task.getPosName() + "]完成"); log.info(task.getBarcode() + "入仓位[" + task.getPosName() + "]完成");
DataLog cancelTask = findFinishedTask(statusBeanToSave.getCid(), boxStatus.getPosId()); DataLog cancelTask = findFinishedTask(statusBeanToSave.getCid(), boxStatus.getPosId());
if(cancelTask != null && cancelTask.isCancel()){ if(cancelTask != null && cancelTask.isCancel()){
......
...@@ -74,9 +74,11 @@ ...@@ -74,9 +74,11 @@
</display:column> </display:column>
<display:column titleKey="checkOut.operate" media="html"> <display:column titleKey="checkOut.operate" media="html">
<c:if test="${outInfo.sendStatus != 2}">
<button class="btn yellow" id="btn${outInfo.hSerial}" <button class="btn yellow" id="btn${outInfo.hSerial}"
onclick="executeOut('${outInfo.hSerial}')"> onclick="executeOut('${outInfo.hSerial}')">
<i class="fa fa-sign-out"></i><fmt:message key="button.checkout"/></button> <i class="fa fa-sign-out"></i><fmt:message key="button.checkout"/></button>
</c:if>
</display:column> </display:column>
</display:table> </display:table>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!