Commit b5fa96fd zshaohui

1.工单出库,同步挑料箱中的信息

1 个父辈 9721d0c5
......@@ -253,4 +253,7 @@ public class BarcodeDto implements Serializable {
@ApiModelProperty("制造商物料编号")
private String mpn;
@ApiModelProperty("附加信息")
private Map<String,Object> appendData = new HashMap<>();
}
......@@ -480,6 +480,19 @@ public class Barcode extends BasePo implements Serializable {
return null;
}
public Barcode getSubCodeByBarcode(String barcodeStr) {
if (subCodeList == null) {
return null;
}
for (Barcode barcode : subCodeList
) {
if (barcode.getBarcode().equals(barcodeStr)) {
return barcode;
}
}
return null;
}
public void UpdateSubCode(Barcode barcode) {
if (subCodeList == null) {
......
......@@ -815,28 +815,36 @@ public class DataCache {
public List<String> getAvailableStorageIds() {
List<String> availableStorageIds = new ArrayList<>();
for (Storage storage : getAllStorage().values()) {
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (bean == null || bean.timeOut() || !bean.isAvailable()) {
continue;
if (!storage.isVirtual()) {
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (bean == null || bean.timeOut() || !bean.isAvailable()) {
continue;
}
availableStorageIds.add(storage.getId());
} else {
availableStorageIds.add(storage.getId());
}
availableStorageIds.add(storage.getId());
}
return availableStorageIds;
}
public List<String> getAvailableStorageIds(List<String> cidList) {
if(cidList==null||cidList.size()<=0){
return getAvailableStorageIds();
if (cidList == null || cidList.size() <= 0) {
return getAvailableStorageIds();
}
List<String> availableStorageIds = new ArrayList<>();
for (Storage storage : getAllStorage().values()) {
if(!cidList.contains(storage.getCid())){
if (!cidList.contains(storage.getCid())) {
continue;
}
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (bean == null || bean.timeOut() || !bean.isAvailable()) {
continue;
if (!storage.isVirtual()) {
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (bean == null || bean.timeOut() || !bean.isAvailable()) {
continue;
}
availableStorageIds.add(storage.getId());
} else {
availableStorageIds.add(storage.getId());
}
availableStorageIds.add(storage.getId());
}
return availableStorageIds;
}
......
......@@ -9,6 +9,7 @@ import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.api.SmfApi;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.enums.OP;
......@@ -57,9 +58,13 @@ public class LiteOrderCache {
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private SmfApi smfApi;
@Autowired
private IBarcodeManager barcodeManager;
// //最大工单数
// public int MaxOrderCount=1;
// public boolean SingleOrderMode(){
......@@ -496,6 +501,9 @@ public class LiteOrderCache {
}
List<String> availableStorageIds = dataCache.getAvailableStorageIds(cidList);
//需要出库的料箱信息
List<String> needOutPosId = new ArrayList<>();
boolean shortage=false;
//其他出库模式一次性全部生成任务
for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) {
......@@ -548,23 +556,58 @@ public class LiteOrderCache {
shortage=true;
break;
} else {
assignNum = assignNum + pos.getBarcode().getAmount();
assignReelCount = assignReelCount + 1;
taskReelCount = taskReelCount + 1;
log.info("工单[" + orderNo + "],任务数[" + taskReelCount + "]出库位置仓位【" + pos.getPosName() + "】RI=[" + pos.getBarcode().getBarcode() + "] PN=[" + partNumber + "] num:" + pos.getBarcode().getAmount());
DataLog task = newTask(pos) ;
task.setSourceId(cacheOrder.getId());
task.setSourceName(cacheOrder.getOrderNo());
task.setSubSourceId(orderItem.getId());
task.setSubSourceInfo(orderItem.getFeederInfo());
task.setType(OP.CHECKOUT);
task.setLightColor(nextColor.getRgb());
task.setStatus(OP_STATUS.WAIT.name());
task.setSingleOut(singleOut);
task.setLine(cacheOrder.getLine());
//判断是属于料箱还是料盘
Barcode posBarcode = pos.getBarcode();
List<Barcode> subCodeList = posBarcode.getSubCodeList();
if (subCodeList == null || subCodeList.isEmpty()) {
assignNum = assignNum + pos.getBarcode().getAmount();
assignReelCount = assignReelCount + 1;
taskReelCount = taskReelCount + 1;
log.info("工单[" + orderNo + "],任务数[" + taskReelCount + "]出库位置仓位【" + pos.getPosName() + "】RI=[" + pos.getBarcode().getBarcode() + "] PN=[" + partNumber + "] num:" + pos.getBarcode().getAmount());
DataLog task = newTask(pos);
task.setSourceId(cacheOrder.getId());
task.setSourceName(cacheOrder.getOrderNo());
task.setSubSourceId(orderItem.getId());
task.setSubSourceInfo(orderItem.getFeederInfo());
task.setType(OP.CHECKOUT);
task.setLightColor(nextColor.getRgb());
task.setStatus(OP_STATUS.WAIT.name());
task.setSingleOut(singleOut);
task.setLine(cacheOrder.getLine());
// task = dataLogDao.save(task);
taskService.addTaskToExecute(task);
taskService.addTaskToExecute(task);
} else {
Barcode subCode = null;
if (!Strings.isNullOrEmpty(reelId)) {
subCode = posBarcode.getSubCodeByBarcode(reelId);
} else if (Strings.isNullOrEmpty(reelId) && !Strings.isNullOrEmpty(partNumber)) {
subCode = posBarcode.getSubCode(partNumber);
}
if (subCode != null) {
//设置出库数量
int amount = subCode.getAmount();
int awaitingNum = remainNum - assignNum;
if (awaitingNum - amount >= 0) {
assignNum = assignNum + amount;
subCode.updateAppendData("awaiting", amount);
} else {
subCode.updateAppendData("awaiting", amount - awaitingNum);
assignNum = assignNum + amount - awaitingNum;
}
assignReelCount = assignReelCount + 1;
taskReelCount = taskReelCount + 1;
subCode.updateAppendData("orderItemId", orderItem.getId());
subCode.updateAppendData("orderNo", cacheOrder.getOrderNo());
subCode.updateAppendData("orderId", cacheOrder.getId());
posBarcode.UpdateSubCode(subCode);
barcodeManager.save(subCode);
barcodeManager.save(posBarcode);
pos.setBarcode(posBarcode);
storagePosManager.save(pos);
needOutPosId.add(pos.getId());
}
}
}
//如果是RI出库,只有一盘,出完就结束
if(!Strings.isNullOrEmpty(reelId)){
......@@ -575,6 +618,24 @@ public class LiteOrderCache {
}
if (needOutPosId != null && !needOutPosId.isEmpty()) {
needOutPosId = needOutPosId.stream().distinct().collect(Collectors.toList());
for (String posId : needOutPosId) {
StoragePos pos = storagePosManager.get(posId);
DataLog task = newTask(pos);
task.setSourceName(cacheOrder.getOrderNo());
task.setSourceId(cacheOrder.getId());
task.setType(OP.CHECKOUT);
task.setLightColor(nextColor.getRgb());
task.setStatus(OP_STATUS.WAIT.name());
task.setSingleOut(singleOut);
task.setLine(cacheOrder.getLine());
taskService.addTaskToExecute(task);
taskReelCount = taskReelCount + 1;
}
}
if(shortage){
cacheOrder.addAppendDate("shortage","true");
}else{
......
......@@ -230,8 +230,12 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}
@Override
public StoragePos getByBarcode(String barcode){
return storagePosDao.findOneByCondition(new String[]{"barcode.barcode"}, new String[]{barcode});
public StoragePos getByBarcode(String barcode) {
List<Criteria> orCriterialList = Lists.newArrayList();
orCriterialList.add(Criteria.where("barcode.barcode").is(barcode));
orCriterialList.add(Criteria.where("barcode.subCodeList.barcode").is(barcode));
Criteria c = new Criteria().orOperator(orCriterialList);
return storagePosDao.findOne(new Query(c));
}
@Override
......@@ -286,8 +290,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
String regex="^"+escapeExprSpecialWord(pn.toString())+".*";
Pattern pattern = Pattern.compile(regex );
Criteria c = Criteria.where("barcode.partNumber").regex(pattern)
.and("id").nin(excludePosIds)
Criteria c = Criteria.where("id").nin(excludePosIds)
.and("enabled").is(true)//可用
.and("barcode.lockId").is(null);//没有被锁定的仓位;
if (storageIdList != null) {
......@@ -297,6 +300,13 @@ public class StoragePosManagerImpl implements IStoragePosManager {
c.and("labelId").is(labelId);
}
c=addAppendData(c,appendDate);
//从料箱/料盘中查
List<Criteria> orCriterialList = Lists.newArrayList();
orCriterialList.add(Criteria.where("barcode.partNumber").regex(pattern));
orCriterialList.add(Criteria.where("barcode.subCodeList.partNumber").regex(pattern));
c.orOperator(orCriterialList);
Query q = new Query(c);
Sort sort = getSortByCheckOutType(checkOutType);
q.with(sort);
......
......@@ -156,7 +156,7 @@ public class VirtualOperateController {
}
subBarcode.setPutInTime(System.currentTimeMillis());
subBarcode = barcodeManager.save(subBarcode);
barcode = finishTask(barcode, opType, subBarcode, opQty);
barcode = finishTask(barcode, opType, subBarcode, opQty,OP_STATUS.FINISHED.name());
log.info("条码" + subBarcode.getBarcode() + "[" + subBarcode.getPartNumber() + "]入库到料盒[" + barcode.getBarcode() + "]数量:" + barcode.getAmount());
} else if ("ri".equals(putInType)) {
//解析条码
......@@ -164,17 +164,28 @@ public class VirtualOperateController {
if (subCode == null) {
throw new ValidateException("smfcore.error.barcode.invalid", "{0}不是有效的条码", new String[]{operageStr});
}
String hostBarcodeId = subCode.getHostBarcodeId();
if (StringUtils.isNotEmpty(hostBarcodeId)) {
if (!hostBarcodeId.equals(barcode.getId())) {
throw new ValidateException("smfcore.materialBox.inOtherBox", "物料已在料盒{0}中", new String[]{barcode.getBarcode()});
Barcode hostBarcode = barcodeManager.get(hostBarcodeId);
if (hostBarcode != null) {
throw new ValidateException("smfcore.materialBox.inOtherBox", "物料已在料盒{0}中", new String[]{hostBarcode.getBarcode()});
}
}
}
//判断物料是否存在料箱中
String posName = subCode.getPosName();
if (StringUtils.isNotEmpty(posName)) {
throw new ValidateException("smfcore.materialBox.inPos", "物料已在库位{0}中", new String[]{posName});
}
subCode.setHostBarcodeId(barcode.getId());
subCode.setAmount(opQty);
subCode.setPutInTime(System.currentTimeMillis());
barcodeManager.saveBarcode(subCode);
barcode = finishTask(barcode, opType, subCode, opQty);
barcode = finishTask(barcode, opType, subCode, opQty,OP_STATUS.FINISHED.name());
log.info("条码" + subCode.getBarcode() + "[" + subCode.getPartNumber() + "]入库到料盒[" + barcode.getBarcode() + "]数量:" + barcode.getAmount());
}
return ResultBean.newOkResult(barcodeMapper.toDto(barcode));
......@@ -192,6 +203,11 @@ public class VirtualOperateController {
if (barcode == null) {
throw new ValidateException("smfcore.error.barcode.invalid", "{0}不是有效的条码", new String[]{code});
}
//判断是否还在库位中
String posName = barcode.getPosName();
if (StringUtils.isNotEmpty(posName)) {
throw new ValidateException("smfcore.virtual.boxInPos", "[{0}]已在库位[{1}]中,请先取出", new String[]{barcode.getBarcode(), posName});
}
int opQty = Integer.valueOf(amountStr);
int opType = OP.NON_OP;
if (opQty > 0) {
......@@ -200,6 +216,7 @@ public class VirtualOperateController {
//请输入正确的数量
throw new ValidateException("smfcore.materialBox.qtyError", "请输入正确的数量");
}
//判断是pn还是ri出
if ("pn".equals(checkOutType)) {
//查看该库位中是否有相同的物料,有的话,数量累加
......@@ -211,11 +228,17 @@ public class VirtualOperateController {
if (oldAmount < opQty) {
throw new ValidateException("smfcore.materialBox.quantityshort", "物料数量不足");
}
Integer awaitingNum = subBarcode.getAppendData("awaiting");
if (awaitingNum != null) {
if (opQty < awaitingNum) {
throw new ValidateException("smfcore.virtual.quantityError", "取出数量应为[{0}]",new String[]{awaitingNum+""});
}
}
int newAmount = oldAmount - opQty;
subBarcode.setHostBarcodeId(barcode.getId());
subBarcode.setAmount(newAmount);
subBarcode = barcodeManager.save(subBarcode);
barcode = finishTask(barcode, opType, subBarcode, opQty);
barcode = finishTask(barcode, opType, subBarcode, opQty,OP_STATUS.FINISHED.name());
log.info(subBarcode.getPartNumber() + "从料盒[" + barcode.getPosName() + "]出库,物料数量:" + oldAmount + " - " + opQty + " = " + newAmount);
} else if ("ri".equals(checkOutType)) {
CodeBean codeBean = codeResolve.resolveSingleCode("=1x1="+operageStr);
......@@ -238,9 +261,16 @@ public class VirtualOperateController {
if (qty < 0) {
qty = 0;
}
Integer awaitingNum = subBarcode.getAppendData("awaiting");
if (awaitingNum != null) {
if (opQty < awaitingNum) {
throw new ValidateException("smfcore.virtual.quantityError", "取出数量应为[{0}]",new String[]{awaitingNum+""});
}
}
//出库
subBarcode.setAmount(qty);
finishTask(barcode, OP.CHECKOUT, subBarcode, qty);
subBarcode = barcodeManager.save(subBarcode);
finishTask(barcode, OP.CHECKOUT, subBarcode, opQty,OP_STATUS.FINISHED.name());
log.info("条码" + subBarcode.getBarcode() + "[" + subBarcode.getPartNumber() + "]从料盒[" + barcode.getBarcode() + "]出库,数量:" + qty);
}
return ResultBean.newOkResult("");
......@@ -278,6 +308,17 @@ public class VirtualOperateController {
throw new ValidateException("smfcore.pos.noVirtual", "[{0}]不是虚拟仓的库位", new String[]{posNameStr});
}
barcode.setDescribe(describe);
List<Barcode> subCodeList = barcode.getSubCodeList();
if (subCodeList != null && !subCodeList.isEmpty()) {
for (Barcode subCode : subCodeList) {
Integer awaiting = subCode.getAppendData("awaiting");
if (awaiting != null) {
barcode = finishTask(barcode, OP.CHECKOUT, subCode, awaiting, OP_STATUS.CANCEL.name());
}
}
}
//开始入库
taskService.addTaskToFinished(pos, barcode, SecurityUtils.getLoginUsername());
return ResultBean.newOkResult("");
......@@ -331,11 +372,12 @@ public class VirtualOperateController {
if (oldAmount < opQty) {
throw new ValidateException("smfcore.materialBox.quantityshort", "物料数量不足");
}
int newAmount = oldAmount - opQty;
subBarcode.setAmount(newAmount);
subBarcode = barcodeManager.save(subBarcode);
finishTask(barcode, OP.CHECKOUT, subBarcode, opQty);
finishTask(barcode, OP.CHECKOUT, subBarcode, opQty,OP_STATUS.FINISHED.name());
log.info(subBarcode.getPartNumber() + "从料盒[" + barcode.getPosName() + "]出库,物料数量:" + oldAmount + " - " + opQty + " = " + newAmount);
return ResultBean.newOkResult("");
}
......@@ -446,7 +488,17 @@ public class VirtualOperateController {
* @throws ValidateException*/
private Barcode finishTask(Barcode pidBarcode, int opType, Barcode subBarcode, int opQty) throws ValidateException {
private Barcode finishTask(Barcode pidBarcode, int opType, Barcode subBarcode, int opQty,String status) throws ValidateException {
String orderItemId = subBarcode.getAppendData("orderItemId");
String orderNo = subBarcode.getAppendData("orderNo");
String orderId = subBarcode.getAppendData("orderId");
subBarcode.updateAppendData("orderItemId",null);
subBarcode.updateAppendData("orderNo",null);
subBarcode.updateAppendData("orderId",null);
subBarcode.updateAppendData("awaiting",null);
barcodeManager.save(subBarcode);
//更新barcode缓存
pidBarcode.UpdateSubCode(subBarcode);
if (opType == OP.CHECKOUT && subBarcode.getAmount() <= 0) {
......@@ -455,7 +507,7 @@ public class VirtualOperateController {
}
barcodeManager.saveBarcode(pidBarcode);
DataLog task = new DataLog();
task.setStatus(OP_STATUS.FINISHED.name());
task.setStatus(status);
task.setPartNumber(subBarcode.getPartNumber());
task.setBarcode(subBarcode.getBarcode());
task.setNum(opQty);
......@@ -468,8 +520,17 @@ public class VirtualOperateController {
task.setPosName(pidBarcode.getBarcode());
task.setOperator(SecurityUtils.getLoginUsername());
task.setSourceType(BARCODE_SOURCE.VIRTUAL);
if (StringUtils.isNotEmpty(orderItemId)){
task.setSubSourceId(orderItemId);
}
if (StringUtils.isNotEmpty(orderNo)){
task.setSourceName(orderNo);
}
if (StringUtils.isNotEmpty(orderId)){
task.setSourceId(orderId);
}
task = dataLogManager.save(task);
taskService.moveTaskToFinished(task);
taskService.updateFinishedTask(task);
return pidBarcode;
}
......
......@@ -431,4 +431,6 @@ smfcore.virtual=\u865A\u62DF\u4ED3
smfcore.virtualManager=\u865A\u62DF\u4ED3\u7BA1\u7406
smfcore.virtualLocationManager=\u865A\u62DF\u5E93\u4F4D\u7BA1\u7406
smfcore.virtualOperations=\u865A\u62DF\u4ED3\u64CD\u4F5C
smfcore.equipment.view.ncgroup=Neo Counter
\ No newline at end of file
smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos=[{0}]\u5DF2\u5728\u5E93\u4F4D[{1}]\u4E2D,\u8BF7\u5148\u53D6\u51FA
smfcore.virtual.quantityError=\u53D6\u51FA\u6570\u91CF\u5E94\u4E3A[{0}]
\ No newline at end of file
......@@ -421,4 +421,6 @@ smfcore.virtual=Virtuelles Lager
smfcore.virtualManager=Verwaltung des virtuellen Lagers
smfcore.virtualLocationManager=Verwaltung virtueller Lagerpl\u00E4tze
smfcore.virtualOperations=Vorg\u00E4nge im virtuellen Lager
smfcore.equipment.view.ncgroup=Neo Counter
\ No newline at end of file
smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos=[{0}] befindet sich bereits im Lagerplatz [{1}]. Bitte entnehmen Sie es zuerst
smfcore.virtual.quantityError=Die zu entnehmende Menge sollte [{0}] betragen
\ No newline at end of file
......@@ -422,4 +422,6 @@ smfcore.virtual=Virtual Storage
smfcore.virtualManager=Virtual Storage Mgmt
smfcore.virtualLocationManager=Virtual Location Mgmt
smfcore.virtualOperations=Virtual Storage Op
smfcore.equipment.view.ncgroup=Neo Counter
\ No newline at end of file
smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos=[{0}] is already in location [{1}]. Please remove it first
smfcore.virtual.quantityError=The quantity to be removed should be [{0}]
\ No newline at end of file
......@@ -421,4 +421,6 @@ smfcore.virtual=Entrep\u00F4t virtuel
smfcore.virtualManager=Gestion de l'entrep\u00F4t virtuel
smfcore.virtualLocationManager=Gestion des emplacements virtuels
smfcore.virtualOperations=Op\u00E9rations de l'entrep\u00F4t virtuel
smfcore.equipment.view.ncgroup=Neo Counter
\ No newline at end of file
smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos=[{0}] est d\u00E9j\u00E0 dans l'emplacement [{1}]. Veuillez d'abord le retirer
smfcore.virtual.quantityError=La quantit\u00E9 \u00E0 retirer doit \u00EAtre [{0}]
\ No newline at end of file
......@@ -418,4 +418,6 @@ smfcore.virtual=\u4EEE\u60F3\u5009\u5EAB
smfcore.virtualManager=\u4EEE\u60F3\u5009\u5EAB\u7BA1\u7406
smfcore.virtualLocationManager=\u4EEE\u60F3\u30ED\u30B1\u30FC\u30B7\u30E7\u30F3\u7BA1\u7406
smfcore.virtualOperations=\u4EEE\u60F3\u5009\u5EAB\u64CD\u4F5C
smfcore.equipment.view.ncgroup=Neo Counter
\ No newline at end of file
smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos=[{0}] \u306F\u65E2\u306B\u30ED\u30B1\u30FC\u30B7\u30E7\u30F3 [{1}] \u306B\u3042\u308A\u307E\u3059\u3002\u5148\u306B\u53D6\u308A\u51FA\u3057\u3066\u304F\u3060\u3055\u3044
smfcore.virtual.quantityError=\u53D6\u308A\u51FA\u3057\u6570\u91CF\u306F[{0}]\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059
\ No newline at end of file
......@@ -418,4 +418,6 @@ smfcore.virtual=\u865A\u62DF\u4ED3
smfcore.virtualManager=\u865A\u62DF\u4ED3\u7BA1\u7406
smfcore.virtualLocationManager=\u865A\u62DF\u5E93\u4F4D\u7BA1\u7406
smfcore.virtualOperations=\u865A\u62DF\u4ED3\u64CD\u4F5C
smfcore.equipment.view.ncgroup=Neo Counter
\ No newline at end of file
smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos=[{0}]\u5DF2\u5728\u5E93\u4F4D[{1}]\u4E2D,\u8BF7\u5148\u53D6\u51FA
smfcore.virtual.quantityError=\u53D6\u51FA\u6570\u91CF\u5E94\u4E3A[{0}]
\ No newline at end of file
......@@ -418,4 +418,6 @@ smfcore.virtual=\u865B\u64EC\u5009
smfcore.virtualManager=\u865B\u64EC\u5009\u7BA1\u7406
smfcore.virtualLocationManager=\u865B\u64EC\u5EAB\u4F4D\u7BA1\u7406
smfcore.virtualOperations=\u865B\u64EC\u5009\u64CD\u4F5C
smfcore.equipment.view.ncgroup=Neo Counter
\ No newline at end of file
smfcore.equipment.view.ncgroup=Neo Counter
smfcore.virtual.boxInPos=[{0}]\u5DF2\u5728\u5EAB\u4F4D[{1}]\u4E2D,\u8ACB\u5148\u53D6\u51FA
smfcore.virtual.quantityError=\u53D6\u51FA\u6578\u91CF\u61C9\u70BA[{0}]
\ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!