Commit 1b95f712 zshaohui

sorting提交

1 个父辈 7587335d
......@@ -1642,6 +1642,465 @@ public class LiteOrderCache {
}
public synchronized String ticketOutByNoSorting(String orderNo){
//1.判断工单是否存在
LiteOrder liteOrder = liteOrderMap.get(orderNo);
if (liteOrder == null) {
liteOrder = liteOrderManager.findByOrderNo(orderNo);
}
if (liteOrder == null) {
return "smfcore.order.out.notFound";
}
//2.判断工单状态是否正常
if (liteOrder.isClosed()) {
return "smfcore.order.hasClose";
}
if (!liteOrder.isTaskFinished() && !liteOrder.isNew()) {
return "smfcore.order.out.executing";
}
List<String> storageIdList = new ArrayList<>();
for (Storage storage : dataCache.getAllStorage().values()) {
storageIdList.add(storage.getId());
}
//3.设置工单其他信息
liteOrder.setStartDate(new Date());
liteOrder.setTaskReelCount(0);
liteOrder.setTaskFinishedTime(-1);
liteOrder.setFinishedReelCount(0);
liteOrder.setStatus(LITEORDER_STATUS.TAILS);
//5.开始处理工单详情
List<StoragePos> needOutPosList = new ArrayList<>();
//禁用料信息
List<String> disablePosNameList = new ArrayList<>();
int orderTaskReelCount = 0;
List<String> pnList = liteOrder.getOrderItems().stream().map(LiteOrderItem::getPn).collect(Collectors.toList());
List<StoragePos> allStoragePosList = storagePosManager.findStoragePosByPartNumber(pnList);
for (LiteOrderItem orderItem : liteOrder.getOrderItems()){
//6.排除的仓位信息
Collection excludeIdList = excludeOutPosIds();
//8.设置出库数量和出库盘数(超发和不超发)
int outReelCount = 0;
int outNumCount = 0;
if (liteOrder.isExcess()) {
if (orderItem.getOutNum() >= orderItem.getNeedNum() && orderItem.getOutReelCount() >= orderItem.getNeedReelCount()) {
continue;
}
outNumCount = orderItem.getOutNum();
outReelCount = orderItem.getOutReelCount();
}
//如果不是超发,则满足其中一个即可
else {
if (orderItem.getTotalOutNum() >= orderItem.getNeedNum() && orderItem.getTotalOutReelCount() >= orderItem.getNeedReelCount()) {
continue;
}
outNumCount = orderItem.getTotalOutNum();
outReelCount = orderItem.getTotalOutReelCount();
}
//9.开始挑料
while (outReelCount < orderItem.getNeedReelCount() || outNumCount < orderItem.getNeedNum()) {
//根据查询条件,查找新的库位
boolean hasOutReel = false;
String warehouseCode = orderItem.getWarehouseCode(); //厂别
String brand = orderItem.getBrand(); //供应商
String pn = orderItem.getPn(); //料号
StoragePos pos = getStoragePosByPartNumberAndBrand(allStoragePosList, pn, excludeIdList);
if (pos == null) {
log.info(orderItem.getOrderId() + "厂商:" + warehouseCode + ",供应商:" + brand + ",料号:" + pn + "未找到存在库位,跳过");
break;
}
Barcode barcode = pos.getBarcode();
log.info(orderItem.getId() + "厂商:" + warehouseCode + ",供应商:" + brand + ",料号:" + pn + "找到的库位是:"+pos.getPosName()+",箱子号为:"+barcode.getBarcode());
List<Barcode> subCodeList = barcode.getSubCodeList();
//进行排序
subCodeList = subCodeList.stream().sorted(Comparator.comparing(Barcode::getCreateDate)).collect(Collectors.toList());
subCodeList = subCodeList.stream().sorted(Comparator.comparing(Barcode::getAmount)).collect(Collectors.toList());
//禁用的物料信息
List<String> batchCheckReelList = LuxsanApi.batchCheckReel(subCodeList);
if (batchCheckReelList != null && !batchCheckReelList.isEmpty()){
for (Barcode subCode : subCodeList){
if (disablePosNameList.contains(subCode.getPosName())) {
continue;
}
if (batchCheckReelList.contains(subCode.getBarcode())){
log.info(subCode.getBarcode()+"为禁用料,禁用库位为:"+subCode.getPosName());
disablePosNameList.add(subCode.getPosName());
}
}
}
List<String> subCodeIds = new ArrayList<>();
for (Barcode subCode : subCodeList) {
if (disablePosNameList != null && !disablePosNameList.isEmpty()){
if (disablePosNameList.contains(subCode.getPosName())) {
continue;
}
}
if (outReelCount >= orderItem.getNeedReelCount() && outNumCount >= orderItem.getNeedNum()) {
break;
}
if (subCode.isOut()) {
continue;
}
//判断厂别
if (StringUtils.isNotBlank(warehouseCode)) {
if (!warehouseCode.equals(subCode.getWarehouseCode())) {
continue;
}
}
//判断供应商
if (StringUtils.isNotBlank(brand)) {
if (!brand.equals(subCode.getProvider())) {
continue;
}
}
//判断料号
if (StringUtils.isNotBlank(pn)) {
if (!pn.equals(subCode.getPartNumber())) {
continue;
}
}
subCode.setOut(true);
subCode.setOrderItemId(orderItem.getId());
barcode.UpdateSubCode(subCode);
subCodeIds.add(subCode.getId());
orderTaskReelCount ++;
hasOutReel = true;
//判断是否超发,如果超发,先判断是否满足数量.再判断是否满足卷数
if (liteOrder.isExcess()) {
if (outNumCount >= orderItem.getNeedNum()) {
outReelCount++;
} else {
outNumCount = outNumCount + subCode.getAmount();
}
}
//如果不是超发订单,
else {
outReelCount++;
outNumCount = outNumCount + subCode.getAmount();
}
}
if (subCodeIds != null && !subCodeIds.isEmpty()) {
Query query = new Query(Criteria.where("id").in(subCodeIds));
Update update = new Update().set("isOut", true).set("orderItemId", orderItem.getId());
barcodeManager.updateBarcode(query, update);
}
barcodeManager.save(barcode);
log.info("保存barcode时间结束");
excludeIdList.add(pos.getId());
if (hasOutReel) {
needOutPosList.add(pos);
pos.setBarcode(barcode);
storagePosManager.save(pos);
}
}
}
if (needOutPosList != null && !needOutPosList.isEmpty()) {
log.info("开始生成料箱出库任务");
for (StoragePos pos : needOutPosList) {
Barcode barcode = pos.getBarcode();
log.info("barcode:"+barcode.getBarcode()+",状态为:"+barcode.getStatus());
if (barcode.getStatus() == BARCODE_STATUS.IN_STORE) {
Storage storage = dataCache.getStorageById(pos.getStorageId());
log.info(pos.getPosName() + "出库,料箱号为:" + barcode.getBarcode());
DataLog task = new DataLog(storage, barcode, pos);
task.setSourceId(liteOrder.getId());
task.setSourceName(liteOrder.getOrderNo());
task.setSubSourceId(barcode.getLockName());
task.setSubSourceInfo(barcode.getLockName());
task.setType(OP.CHECKOUT);
task.setCreator(SecurityUtils.getCurrentUsername());
task.setStatus(OP_STATUS.WAIT.name());
//判断是去人工出料口,还是机器
if (LiteorderCheckType.TICKET_CHECKOUT == liteOrder.getCheckType()){
task.setLoc(TaskCurrentLoc.Manual_FeedingInlet);
}
Map<String,Long> outMap = new HashMap<>();
List<Barcode> subCodeList = barcode.getSubCodeList();
if (subCodeList != null && !subCodeList.isEmpty()) {
outMap = subCodeList.stream().filter(Barcode::isOut).collect(Collectors.groupingBy(Barcode::getPosName, Collectors.counting()));
}
task.updateExtraDataMap("outCount",outMap);
try {
taskService.addTaskToExecute(task);
} catch (Exception e) {
e.getMessage();
}
}
}
}
liteOrder.setTaskReelCount(orderTaskReelCount);
liteOrder.setTotalTaskReelCount(liteOrder.getTotalTaskReelCount() + orderTaskReelCount);
liteOrder.setEndDate(new Date());
log.info("工单[" + orderNo + "]任务分配结束,任务数[" + orderTaskReelCount + "]");
smfApi.onOrderStatusChange(liteOrder);
if (orderTaskReelCount <= 0) {
finishedOrderTasks(liteOrder);
}
liteOrderManager.save(liteOrder);
liteOrderMap.put(liteOrder.getOrderNo(), liteOrder);
if (orderTaskReelCount <= 0) {
return "smfcore.order.out.noTask";
}
return "";
}
public synchronized String ticketOutBySorting(String orderNo) {
//1.判断工单是否存在
LiteOrder liteOrder = liteOrderMap.get(orderNo);
if (liteOrder == null) {
liteOrder = liteOrderManager.findByOrderNo(orderNo);
}
if (liteOrder == null) {
return "smfcore.order.out.notFound";
}
//2.判断工单状态是否正常
if (liteOrder.isClosed()) {
return "smfcore.order.hasClose";
}
if (!liteOrder.isTaskFinished() && !liteOrder.isNew()) {
return "smfcore.order.out.executing";
}
List<String> storageIdList = new ArrayList<>();
for (Storage storage : dataCache.getAllStorage().values()) {
storageIdList.add(storage.getId());
}
//3.设置工单其他信息
liteOrder.setStartDate(new Date());
liteOrder.setTaskReelCount(0);
liteOrder.setTaskFinishedTime(-1);
liteOrder.setFinishedReelCount(0);
liteOrder.setStatus(LITEORDER_STATUS.TAILS);
//5.开始处理工单详情
List<StoragePos> needOutPosList = new ArrayList<>();
//禁用料信息
List<String> disableReelList = new ArrayList<>();
int orderTaskReelCount = 0;
List<String> pnList = liteOrder.getOrderItems().stream().map(LiteOrderItem::getPn).collect(Collectors.toList());
List<StoragePos> allStoragePosList = storagePosManager.findStoragePosByPartNumber(pnList);
for (LiteOrderItem orderItem : liteOrder.getOrderItems()) {
//6.排除的仓位信息
Collection excludeIdList = excludeOutPosIds();
//8.设置出库数量和出库盘数(超发和不超发)
int outReelCount = 0;
int outNumCount = 0;
if (liteOrder.isExcess()) {
if (orderItem.getOutNum() >= orderItem.getNeedNum() && orderItem.getOutReelCount() >= orderItem.getNeedReelCount()) {
continue;
}
outNumCount = orderItem.getOutNum();
outReelCount = orderItem.getOutReelCount();
}
//如果不是超发,则满足其中一个即可
else {
if (orderItem.getTotalOutNum() >= orderItem.getNeedNum() && orderItem.getTotalOutReelCount() >= orderItem.getNeedReelCount()) {
continue;
}
outNumCount = orderItem.getTotalOutNum();
outReelCount = orderItem.getTotalOutReelCount();
}
//9.开始挑料
while (outReelCount < orderItem.getNeedReelCount() || outNumCount < orderItem.getNeedNum()) {
//根据查询条件,查找新的库位
boolean hasOutReel = false;
String warehouseCode = orderItem.getWarehouseCode(); //厂别
String brand = orderItem.getBrand(); //供应商
String pn = orderItem.getPn(); //料号
StoragePos pos = getStoragePosByPartNumberAndBrand(allStoragePosList, pn, excludeIdList);
if (pos == null) {
log.info(orderItem.getOrderId() + "厂商:" + warehouseCode + ",供应商:" + brand + ",料号:" + pn + "未找到存在库位,跳过");
break;
}
Barcode barcode = pos.getBarcode();
log.info(orderItem.getId() + "厂商:" + warehouseCode + ",供应商:" + brand + ",料号:" + pn + "找到的库位是:" + pos.getPosName() + ",箱子号为:" + barcode.getBarcode());
List<Barcode> subCodeList = barcode.getSubCodeList();
//进行排序
subCodeList = subCodeList.stream().sorted(Comparator.comparing(Barcode::getCreateDate)).collect(Collectors.toList());
subCodeList = subCodeList.stream().sorted(Comparator.comparing(Barcode::getAmount)).collect(Collectors.toList());
//禁用的物料信息
List<String> batchCheckReelList = LuxsanApi.batchCheckReel(subCodeList);
if (batchCheckReelList != null && !batchCheckReelList.isEmpty()) {
for (String reelId : batchCheckReelList) {
if (!disableReelList.contains(reelId)) {
disableReelList.add(reelId);
}
}
}
List<String> subCodeIds = new ArrayList<>();
for (Barcode subCode : subCodeList) {
if (disableReelList != null && !disableReelList.isEmpty()) {
if (!disableReelList.contains(subCode.getBarcode())){
continue;
}
}
if (outReelCount >= orderItem.getNeedReelCount() && outNumCount >= orderItem.getNeedNum()) {
break;
}
if (subCode.isOut()) {
continue;
}
//判断厂别
if (StringUtils.isNotBlank(warehouseCode)) {
if (!warehouseCode.equals(subCode.getWarehouseCode())) {
continue;
}
}
//判断供应商
if (StringUtils.isNotBlank(brand)) {
if (!brand.equals(subCode.getProvider())) {
continue;
}
}
//判断料号
if (StringUtils.isNotBlank(pn)) {
if (!pn.equals(subCode.getPartNumber())) {
continue;
}
}
subCode.setOut(true);
subCode.setOrderItemId(orderItem.getId());
barcode.UpdateSubCode(subCode);
subCodeIds.add(subCode.getId());
orderTaskReelCount++;
hasOutReel = true;
//判断是否超发,如果超发,先判断是否满足数量.再判断是否满足卷数
if (liteOrder.isExcess()) {
if (outNumCount >= orderItem.getNeedNum()) {
outReelCount++;
} else {
outNumCount = outNumCount + subCode.getAmount();
}
}
//如果不是超发订单,
else {
outReelCount++;
outNumCount = outNumCount + subCode.getAmount();
}
}
if (subCodeIds != null && !subCodeIds.isEmpty()) {
Query query = new Query(Criteria.where("id").in(subCodeIds));
Update update = new Update().set("isOut", true).set("orderItemId", orderItem.getId());
barcodeManager.updateBarcode(query, update);
}
barcodeManager.save(barcode);
log.info("保存barcode时间结束");
excludeIdList.add(pos.getId());
if (hasOutReel) {
needOutPosList.add(pos);
pos.setBarcode(barcode);
storagePosManager.save(pos);
}
}
}
if (needOutPosList != null && !needOutPosList.isEmpty()) {
log.info("开始生成料箱出库任务");
for (StoragePos pos : needOutPosList) {
Barcode barcode = pos.getBarcode();
log.info("barcode:" + barcode.getBarcode() + ",状态为:" + barcode.getStatus());
if (barcode.getStatus() == BARCODE_STATUS.IN_STORE) {
Storage storage = dataCache.getStorageById(pos.getStorageId());
log.info(pos.getPosName() + "出库,料箱号为:" + barcode.getBarcode());
DataLog task = new DataLog(storage, barcode, pos);
task.setSourceId(liteOrder.getId());
task.setSourceName(liteOrder.getOrderNo());
task.setSubSourceId(barcode.getLockName());
task.setSubSourceInfo(barcode.getLockName());
task.setType(OP.CHECKOUT);
task.setCreator(SecurityUtils.getCurrentUsername());
task.setStatus(OP_STATUS.WAIT.name());
//判断是去人工出料口,还是机器
if (LiteorderCheckType.TICKET_CHECKOUT == liteOrder.getCheckType()) {
task.setLoc(TaskCurrentLoc.Manual_FeedingInlet);
}
Map<String, Long> outMap = new HashMap<>();
List<Barcode> subCodeList = barcode.getSubCodeList();
if (subCodeList != null && !subCodeList.isEmpty()) {
outMap = subCodeList.stream().filter(Barcode::isOut).collect(Collectors.groupingBy(Barcode::getPosName, Collectors.counting()));
}
task.updateExtraDataMap("outCount", outMap);
try {
taskService.addTaskToExecute(task);
} catch (Exception e) {
e.getMessage();
}
}
}
}
liteOrder.setTaskReelCount(orderTaskReelCount);
liteOrder.setTotalTaskReelCount(liteOrder.getTotalTaskReelCount() + orderTaskReelCount);
liteOrder.setEndDate(new Date());
log.info("工单[" + orderNo + "]任务分配结束,任务数[" + orderTaskReelCount + "]");
smfApi.onOrderStatusChange(liteOrder);
if (orderTaskReelCount <= 0) {
finishedOrderTasks(liteOrder);
}
liteOrderManager.save(liteOrder);
liteOrderMap.put(liteOrder.getOrderNo(), liteOrder);
if (orderTaskReelCount <= 0) {
return "smfcore.order.out.noTask";
}
return "";
}
private List<String> getHoldPosIdList(LiteOrder cacheOrder) {
//如果是hold的,判断有没有符合的条件
List<String> holdPosIdList = new ArrayList<>();
......
......@@ -150,7 +150,19 @@ public class TicketController {
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
}
String result = liteOrderCache.checkOutLiteOrderOut(ticket, false, null);
String result = "";
boolean sorting = false;
if (sorting) {
log.info(ticket + "是SortIng出库:" + sorting);
result = liteOrderCache.ticketOutBySorting(ticket);
} else {
log.info(ticket + "不是SortIng出库:" + sorting);
result = liteOrderCache.ticketOutByNoSorting(ticket);
}
if (StringUtils.isNotEmpty(result)) {
return ResultBean.newErrorResult(-1, "", MessageUtils.getText(result, new Locale(SecurityUtils.getCurrentUserLanguage()), result));
}
......
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.controller;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.enums.BARCODE_STATUS;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.util.BoxHandleUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
import java.util.stream.Collectors;
@Api(tags = "单据sorting")
@RestController
@RequestMapping("/ticketSortIng")
public class TicketSortingController {
@Autowired
private CodeResolve codeResolve;
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private IBarcodeManager barcodeManager;
@ApiOperation("获取料箱信息")
@RequestMapping("/boxInfo")
@AnonymousAccess
public ResultBean boxInfo(String boxStr) {
if (StringUtils.isEmpty(boxStr)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"料箱信息"});
}
boxStr = boxStr.toUpperCase(Locale.ROOT);
//如果不是C07,C13,C15开头的 报错
if (!boxStr.startsWith("C07") && !boxStr.startsWith("C13") && !boxStr.startsWith("C15")) {
return ResultBean.newErrorResult(-1, "", boxStr + "不是有效的料箱条码");
}
//如果不是以A/B结尾的,则提示
if (!boxStr.endsWith("A") && !boxStr.endsWith("B")) {
return ResultBean.newErrorResult(-1, "", boxStr + "请输入完整的料箱条码");
}
Barcode barcode = codeResolve.resolveCode(boxStr);
if (barcode != null) {
StoragePos pos = storagePosManager.getByBarcode(barcode.getBarcode());
if (pos != null) {
barcode = pos.getBarcode();
barcode.setStatus(BARCODE_STATUS.OUT_NORMAL); //设置成 不在库
barcodeManager.save(barcode);
pos.setBarcode(barcode);
storagePosManager.save(pos);
}
}
Map<String, Long> allCountMap = new HashMap<>();
Map<String, Long> needOutCountMap = new HashMap<>();
Map<String, String> pnMap = new HashMap<>();
//获取料箱要出库的集合
List<Barcode> subCodeList = barcode.getSubCodeList();
if (subCodeList != null && !subCodeList.isEmpty()) {
//隔口对应的数量
allCountMap = subCodeList.stream().collect(Collectors.groupingBy(Barcode::getPosName, Collectors.counting()));
//隔口需要对应的出库数量
List<Barcode> outSubCodeList = subCodeList.stream().filter(s -> s.isOut()).collect(Collectors.toList());
if (outSubCodeList != null && !outSubCodeList.isEmpty()) {
needOutCountMap = outSubCodeList.stream().collect(Collectors.groupingBy(Barcode::getPosName, Collectors.counting()));
}
//对应的pn
for (Barcode subCode : subCodeList) {
pnMap.put(subCode.getPosName(), subCode.getPartNumber());
}
}
List<List<Object>> boxInfoList = new ArrayList<>();
String box = barcode.getBarcode();
for (int i = 1; i < 7; i++) {
List<Object> list = new ArrayList<>();
list.add(BoxHandleUtil.getCountByPartition(allCountMap, box + "-0"+i)); //隔口总的数量
list.add(BoxHandleUtil.getCountByPartition(needOutCountMap, box + "-0"+i)); //隔口出库的数量
String pn = pnMap.get(box+"-0"+i) == null ? "": pnMap.get(box+"-0"+i); //隔口pn
list.add(pn);
list.add(i); //隔口号
boxInfoList.add(list);
}
if (boxStr.startsWith("C07")) {
if (boxStr.endsWith("A")) {
boxInfoList.add(boxInfoList.get(1));
boxInfoList.add(boxInfoList.get(3));
boxInfoList.add(boxInfoList.get(5));
boxInfoList.add(boxInfoList.get(0));
boxInfoList.add(boxInfoList.get(2));
boxInfoList.add(boxInfoList.get(4));
} else {
boxInfoList.add(boxInfoList.get(4));
boxInfoList.add(boxInfoList.get(2));
boxInfoList.add(boxInfoList.get(0));
boxInfoList.add(boxInfoList.get(5));
boxInfoList.add(boxInfoList.get(3));
boxInfoList.add(boxInfoList.get(1));
}
} else if (boxStr.startsWith("C13")) {
if (boxStr.endsWith("A")) {
boxInfoList.add(boxInfoList.get(0));
boxInfoList.add(boxInfoList.get(1));
boxInfoList.add(boxInfoList.get(2));
} else {
boxInfoList.add(boxInfoList.get(2));
boxInfoList.add(boxInfoList.get(1));
boxInfoList.add(boxInfoList.get(0));
}
} else if (boxStr.startsWith("C15")) {
if (boxStr.endsWith("A")) {
boxInfoList.add(boxInfoList.get(0));
boxInfoList.add(boxInfoList.get(1));
boxInfoList.add(boxInfoList.get(2));
} else {
boxInfoList.add(boxInfoList.get(2));
boxInfoList.add(boxInfoList.get(1));
boxInfoList.add(boxInfoList.get(0));
}
}
return ResultBean.newOkResult(boxInfoList);
}
}
......@@ -520,7 +520,7 @@ public class BoxHandleUtil {
return resultMap;
}
private static int getCountByPartition(Map<String, Long> paramMap, String partition) {
public static int getCountByPartition(Map<String, Long> paramMap, String partition) {
return paramMap.get(partition) == null ? 0 : paramMap.get(partition).intValue();
}
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!