Commit 9b70a0d7 sunke

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

1 个父辈 992fe842
......@@ -62,7 +62,11 @@ public interface IStoragePosDao extends IMongoDao {
*/
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);
......@@ -76,4 +80,6 @@ public interface IStoragePosDao extends IMongoDao {
List<StoragePos> allBindPos();
StoragePos findByBarcode(String barcode);
StoragePos unbindReel(StoragePos storagePos);
}
......@@ -8,13 +8,18 @@ import com.myproject.bean.json.ChartData;
import com.myproject.bean.json.ChartItem;
import com.myproject.bean.json.InventoryItem;
import com.myproject.bean.json.PlateSizeBean;
import com.myproject.bean.qisda.AppendInfo;
import com.myproject.bean.qisda.AvailableInventoryBean;
import com.myproject.bean.update.Barcode;
import com.myproject.bean.update.StoragePos;
import com.myproject.dao.mongo.AbstractMongoDao;
import com.myproject.dao.mongo.IBarcodeDao;
import com.myproject.dao.mongo.IStoragePosDao;
import com.myproject.exception.ValidateException;
import com.myproject.util.PLATE_SIZE;
import com.myproject.util.StorageConstants;
import com.myproject.util.StringHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
......@@ -31,6 +36,9 @@ import java.util.*;
@Repository
public class StoragePosDaoImpl extends AbstractMongoDao implements IStoragePosDao {
@Autowired
private IBarcodeDao barcodeDao;
@Override
public Class getEntityClass() {
return StoragePos.class;
......@@ -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 slotlocation
......@@ -378,4 +432,29 @@ public class StoragePosDaoImpl extends AbstractMongoDao implements IStoragePosDa
public StoragePos findByBarcode(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 {
log.info("开始解绑所有绑定工单的料盘");
List<StoragePos> bindPosList = storagePosDao.allBindPos();
for (StoragePos storagePos : bindPosList) {
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());
try {
barcode = barcodeManager.save(barcode);
storagePos.setBarcode(barcode);
storagePosDao.save(storagePos);
} catch (ValidateException e) {
e.printStackTrace();
}
storagePosDao.unbindReel(storagePos);
}
log.info("清理绑定完成");
return "OK";
......
......@@ -144,6 +144,8 @@ public class OutInfoCache {
OutInfo dbOutInfo = outInfoDao.findOneById(outInfo.getId());
if(dbOutInfo != null){
if(dbOutInfo.getSendStatus() != outInfo.getSendStatus() || dbOutInfo.getBindStatus() != outInfo.getBindStatus()){
dbOutInfo.setSendStatus(outInfo.getSendStatus());
dbOutInfo.setBindStatus(outInfo.getBindStatus());
outInfoDao.save(dbOutInfo);
log.info("需求单["+hSerial+"]状态与数据库不一致,更新到数据库");
}
......
......@@ -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,如果有,抢一盘过来
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 {
storagePosDao.save(pos);
outItem.setLockQty(newLockQty);
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;
}
}
......@@ -1298,12 +1329,13 @@ public class QisdaApiController extends BaseController {
allTasks.addAll(queueTasks);
}
//是滞有工单料任务
boolean hasOrderTask = false;
for (DataLog dataLog : allTasks) {
if(dataLog.isCheckOutTask()){
//首盘和补料
if(!outInfo.isReelCutAction() && !outInfo.isUrgentAction()){
//InquiryShelfBean.hSerialShelfMap.clear();
return "全部任务完成后才可执行";
if(!dataLog.isUrgentReel() && !dataLog.isCutReel()){
//工单料(不是指定料也不是分盘料即首盘或补料)
hasOrderTask = true;
}else{
//分盘和紧急料
String taskHSerial = dataLog.getAppendInfo().gethSerial();
......@@ -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 {
}
}
}else{
log.info("需求单"+outInfo.gethSerial()+"本次出库料盘数量为0");
}
if(outInfo.isReelCutAction() || outInfo.isFirstReelAction()){
......
......@@ -127,16 +127,17 @@ public class QisdaDeviceController extends BaseController {
return ResultBean.newErrorResult(102, msg);
}
boolean firstScanSame = isSameTask(barcode,firstScanTask);
boolean firstRobtoSame = isSameTask(barcode,firstRobotTask);
boolean secondScanSame = isSameTask(barcode,secondScanTask);
boolean secondRobtoSame = isSameTask(barcode,secondRobotTask);
if(firstScanSame || firstRobtoSame || secondScanSame || secondRobtoSame){
String msg = "条码["+barcode.getBarcode()+"]与已有任务重复,获取尺寸信息失败";
log.error(msg);
return ResultBean.newErrorResult(105, msg);
}
//防止条码重复发送,现在已经不需要了
// boolean firstScanSame = isSameTask(barcode,firstScanTask);
// boolean firstRobtoSame = isSameTask(barcode,firstRobotTask);
// boolean secondScanSame = isSameTask(barcode,secondScanTask);
// boolean secondRobtoSame = isSameTask(barcode,secondRobotTask);
// if(firstScanSame || firstRobtoSame || secondScanSame || secondRobtoSame){
// String msg = "条码["+barcode.getBarcode()+"]与已有任务重复,获取尺寸信息失败";
// log.error(msg);
//
// return ResultBean.newErrorResult(105, msg);
// }
DataLog task = taskService.getFinishedTask(barcode.getBarcode());
......
......@@ -1353,7 +1353,7 @@ public class TaskService implements ITaskService {
if(!Strings.isNullOrEmpty(posName)){//客户端发一次完成之后,会发空的 posName,不需要处理
if (StorageConstants.BOX_STATUS.IN_FINISHED == status) {//入仓完成
DataLog task = findExecutingTask(statusBeanToSave.getCid(), boxStatus.getPosId());
if (task != null) {
if (task != null && task.isPutInTask()) {
log.info(task.getBarcode() + "入仓位[" + task.getPosName() + "]完成");
DataLog cancelTask = findFinishedTask(statusBeanToSave.getCid(), boxStatus.getPosId());
if(cancelTask != null && cancelTask.isCancel()){
......
......@@ -74,9 +74,11 @@
</display:column>
<display:column titleKey="checkOut.operate" media="html">
<c:if test="${outInfo.sendStatus != 2}">
<button class="btn yellow" id="btn${outInfo.hSerial}"
onclick="executeOut('${outInfo.hSerial}')">
<i class="fa fa-sign-out"></i><fmt:message key="button.checkout"/></button>
</c:if>
</display:column>
</display:table>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!