Commit 145a23d8 zshaohui

1.其他工单正在执行中的,暂停工单不允许出库

2.盘点出库优化
3.看板优化
1 个父辈 544cc2b9
......@@ -666,15 +666,17 @@ public class LiteOrderCache {
List<DataLog> allTask=taskService.getAllTasks();
for (DataLog task:allTask
) {
if (OP.CHECKOUT == task.getType()&&(!task.isEnd())) {
if (OP.CHECKOUT == task.getType()) {
if (!task.isEnd() && !task.isFinished() && !task.isCancel()) {
//更新工单状态
String taskSourceName = task.getSourceName();
if (!Strings.isNullOrEmpty(taskSourceName) && orderNo.equals(taskSourceName)) {
log.info("关闭工单[" + orderNo + "]失败,有未完成的出库任务:"+task.getPosName());
log.info("关闭工单[" + orderNo + "]失败,有未完成的出库任务:" + task.getPosName());
return "smfcore.order.close.taskNotEnd";
}
}
}
}
//绑定料需要解绑
storagePosManager.clearLockPos(liteOrder.getOrderNo());
......@@ -895,7 +897,8 @@ public class LiteOrderCache {
Barcode barcode = pos.getBarcode();
List<Barcode> subCodeList = barcode.getSubCodeList();
//进行排序
subCodeList = subCodeList.stream().sorted(Comparator.comparing(Barcode::getPosName)).collect(Collectors.toList());
subCodeList = subCodeList.stream().sorted(Comparator.comparing(Barcode::getCreateDate)).collect(Collectors.toList());
subCodeList = subCodeList.stream().sorted(Comparator.comparing(Barcode::getAmount)).collect(Collectors.toList());
List<String> subCodeIds = new ArrayList<>();
for (Barcode subCode : subCodeList) {
if (outReelCount >= orderItem.getNeedReelCount() && outNumCount >= orderItem.getNeedNum()) {
......@@ -1069,6 +1072,20 @@ public class LiteOrderCache {
return "";
}
public boolean hasExecutingOrder(){
Collection<LiteOrder> liteOrders = getAllLiteOrder();
if (liteOrders != null && !liteOrders.isEmpty()){
for (LiteOrder liteOrder : liteOrders) {
if (liteOrder.isOutTails()){
return true;
}
}
}
return false;
}
/**
* 获取所有liteOrder
* @return
......
......@@ -565,7 +565,11 @@ public class OrderController {
@ApiOperation("工单恢复")
@RequestMapping("/restoreOrder")
public ResultBean restoreOrder(@RequestBody Map<String,String> paramMap) {
public ResultBean restoreOrder(@RequestBody Map<String, String> paramMap) {
if (liteOrderCache.hasExecutingOrder()) {
//throw new ValidateException("","有正在执行的工单,不允许恢复");
return ResultBean.newErrorResult(-1, "", "有正在执行的工单,不允许恢复");
}
String orderNo = paramMap.get("orderNo");
//根据orderNo得到正在执行的任务
Collection<DataLog> queueTasks = taskService.getQueueTasks();
......
......@@ -363,7 +363,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
@Override
public StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType, String warehouseCode, String brand, boolean isOut) {
Criteria c = Criteria.where("id").nin(excludePosIds);
// .and("enabled").is(true)//可用//.and("barcode.lockId").is(null);//没有被锁定的仓位;
c.and("enabled").is(true);//可用//.and("barcode.lockId").is(null);//没有被锁定的仓位;
if (storageIdList != null) {
c = c.and("storageId").in(storageIdList);
}
......
......@@ -1084,7 +1084,7 @@ public class TaskService {
private synchronized Barcode clearOut(Barcode barcode) {
if (barcode != null) {
List<Barcode> subCodeList = barcode.getSubCodeList();
if (subCodeList != null && !subCodeList.isEmpty()){
if (subCodeList != null && !subCodeList.isEmpty()) {
for (Barcode subCode : subCodeList) {
subCode = barcodeManager.get(subCode.getId());
if (subCode.isOut()) {
......@@ -1095,11 +1095,11 @@ public class TaskService {
subCode.setOrderItemId(null);
subCode = barcodeManager.save(subCode);
barcode.UpdateSubCode(subCode);
barcode = barcodeManager.save(barcode);
generateTask(subCode, OP_STATUS.CANCEL.name(), subCode.getAmount(),OP.CHECKOUT , orderItemId, "", ExtendType.TASK_CANNEL);
generateTask(subCode, OP_STATUS.CANCEL.name(), subCode.getAmount(), OP.CHECKOUT, orderItemId, "", ExtendType.TASK_CANNEL);
log.info("点击完成扫码并入库,任务取消,barcode:" + subCode.getBarcode() + ",OrderItemId为:" + orderItemId);
}
}
barcode = barcodeManager.save(barcode);
}
}
return barcode;
......
......@@ -280,7 +280,7 @@ public class InventoryController {
return ResultBean.newErrorResult(-1, "", "请点击开始盘点");
}
if (storagePosIdList == null || storagePosIdList.isEmpty()) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"ID"});
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"库位"});
}
if (storagePosIdList != null && !storagePosIdList.isEmpty()) {
List<StoragePos> storagePosList = storagePosManager.findByQuery(inventoryQuery(null, null, storagePosIdList));
......@@ -330,6 +330,21 @@ public class InventoryController {
/**
* 批量盘点出库
* @param posName
* @return
*/
@RequestMapping("/batchInventoryOut")
public ResultBean batchInventoryOut(String posName) {
Pattern pattern = Pattern.compile(QueryHelp.escapeExprSpecialWord(posName), Pattern.CASE_INSENSITIVE);
List<StoragePos> storagePosList = storagePosManager.findByQuery(new Query(Criteria.where("posName").regex(pattern)));
List<String> storagePosIdList = storagePosList.stream().map(item -> item.getId()).collect(Collectors.toList());
return inventoryOut(storagePosIdList);
}
/**
* 料箱信息
*
* @param name
......@@ -475,7 +490,9 @@ public class InventoryController {
if (StringUtils.isBlank(inventoryBatch) || "-1".equals(inventoryBatch)) {
pos = taskService.findEmptyPosForPutIn(storageList, boxBarcode, "", "");
} else {
InventoryData data = inventoryDataManager.findOne(new Query(Criteria.where("inventoryBatch").is(inventoryBatch).and("box").is(boxStr)));
InventoryData data = inventoryDataManager.findOne(
new Query(Criteria.where("inventoryBatch").is(inventoryBatch).and("box").is(boxStr))
.with(Sort.by(Sort.Direction.DESC, "createDate")));
String posName = data.getPosName();
pos = storagePosManager.getByPosName(posName);
}
......@@ -608,7 +625,9 @@ public class InventoryController {
if (StringUtils.isBlank(inventoryBatch) || "-1".equals(inventoryBatch)) {
return "当前没有要盘点的批次";
}
InventoryData data = inventoryDataManager.findOne(new Query(Criteria.where("inventoryBatch").is(inventoryBatch).and("boxPartition").is(posName)));
InventoryData data = inventoryDataManager.findOne(
new Query(Criteria.where("inventoryBatch").is(inventoryBatch).and("boxPartition").is(posName))
.with(Sort.by(Sort.Direction.DESC, "createDate")));
if (data != null) {
List<Barcode> barcodeList = data.getBarcodeList();
if (barcodeList != null && !barcodeList.isEmpty()) {
......@@ -657,7 +676,7 @@ public class InventoryController {
inventoryDataManager.save(data);
//同时,把当前料箱的盘点人,都改成当前登录人
List<InventoryData> inventoryDataList = inventoryDataManager.findByQuery(new Query(Criteria.where("inventoryBatch").is(inventoryBatch).and("box").is(boxStr)));
List<InventoryData> inventoryDataList = inventoryDataManager.findByQuery(new Query(Criteria.where("inventoryBatch").is(inventoryBatch).and("box").is(boxStr).and("oriPosName").is(data.getOriPosName())));
if (inventoryDataList != null && !inventoryDataList.isEmpty()){
for (InventoryData inventoryData : inventoryDataList) {
inventoryData.setCreator(SecurityUtils.getCurrentUsername());
......
......@@ -828,6 +828,7 @@ public class OutLineController {
posName = posName + "-" + pos.getId();
} else {
pos = new StoragePos();
pos.setStorageId(storage.getId());
pos = storagePosManager.save(pos);
posName = posName + "-" + pos.getId();
}
......
......@@ -263,8 +263,15 @@ public class InnerBoxRestController {
labelOrderItemMap.remove(cidKey);
}
} else {
if ("0000".equals(cid)) {
if (manualOrderItemIdList != null && !manualOrderItemIdList.isEmpty()) {
labelOrderItemId = manualOrderItemIdList.get(0);
manualOrderItemIdList.remove(0);
}
} else {
labelOrderItemId = labelOrderItemMap.get(cid);
}
}
Map<String, String> resultMap = getPrintLabel(labelOrderItemId);
if (resultMap == null || resultMap.isEmpty()) {
return ResultBean.newErrorResult(-1, "", "未找到需要打印的标签信息", null, false);
......
......@@ -155,6 +155,8 @@ public class InnerKanbanController {
int totalSlots = resultList.stream().mapToInt(Storage::getTotalSlots).sum();
int emptySlots = resultList.stream().mapToInt(Storage::getEmptySlots).sum();
usage = (int) (((double) (totalSlots - emptySlots) / totalSlots) * 100); //库位使用率
total = totalSlots;
use = totalSlots - emptySlots;
}
Map<String,Integer> resultMap = new HashMap<>();
resultMap.put("usage",usage);
......
package com.neotel.smfcore.custom.lizhen.kanban.utils;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.custom.lizhen.kanban.common.KanbanUtils;
import com.neotel.smfcore.custom.lizhen.kanban.utils.bean.AgvInfo;
import com.neotel.smfcore.custom.lizhen.kanban.utils.enums.Location;
......@@ -81,11 +82,18 @@ public class AgvStatusCache {
locList.addAll(getLocByType(2));
locCnList.addAll(getLocCnByType(2));
}
int type = 1;
for (AgvInfo agvInfo : agvInfoCacheList) {
String loc = agvInfo.getLoc();
if (StringUtils.isNotBlank(Location.getLoc(loc))) {
agvInfo.setLocCn(Location.getLoc(loc));
} else {
agvInfo.setLocCn(agvInfo.getLoc());
}
agvInfo.setLocList(locList);
agvInfo.setLocCnList(locCnList);
agvInfo.setType(type);
type ++;
}
return ResultBean.newOkResult(agvInfoCacheList);
}
......
......@@ -35,4 +35,6 @@ public class AgvInfo {
* 位置集合 中文
*/
private List<String> locCnList;
int type = 0;
}
......@@ -8,7 +8,7 @@ public enum Location {
//外仓点位
WAREHOUSE("仓库", 2),
TAKE("取料点", 2),
PUT("料点", 2),
PUT("料点", 2),
//内外仓,通用点位
STANDBY("待机点", 0),
......
package com.neotel.smfcore.custom.lizhen.util;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import java.util.Date;
public class ExpireDateUtil {
public static void main(String[] args) {
String barcodeStr = "138S00071-017425|FF2N14CY4-2302|10000|M1301742531BA1BCMZ|MURATA";
String pattern = "";
}
public static Date getExpireDate(String dateStr, String vendor) {
switch (vendor) {
case "UMT":
return getWWYYDate(dateStr);
case "AT&S":
return getWWYYDate(dateStr);
case "Compeq":
return getWWYYDate(dateStr);
case "Avary":
return getWWYYDate(dateStr);
case "AKMMV":
return getWWYYDate(dateStr);
case "HIROSE":
return getYYYYMMDDDate(dateStr);
case "SUNWAY":
return getYYMMDDDate(dateStr);
case "Fujikura":
return getYYWWDate(dateStr);
case "CCTC":
return getWWYYDate(dateStr);
case "Jones":
return getYYMMDDDate(dateStr);
case "Marian":
return getYYMMDDDate(dateStr);
case "Murata":
return getYYWWDate(dateStr);
case "JAE":
return getYYMMDate(dateStr);
case "UNISTEEL":
return getYYMMDDDate(dateStr);
case "PSM":
return getYYYYMMDDDate(dateStr);
case "HAMA":
return getYYMMDDDate(dateStr);
case "TRIUMPH/LY":
return getYYYYMMDDDate(dateStr);
case "Everwin":
return getYYMMDDDate(dateStr);
case "INTERPLEX":
return getYYMMDDDate(dateStr);
case "CYNTEC":
return getYYMMDDDate(dateStr);
case "YAGEO":
return getYYMMDDDate(dateStr);
case "Sony":
return getYYYYMMDDDate(dateStr);
case "Kioxia":
return getYYYYMMDDDate(dateStr);
case "Taiyo":
return getYYMMDate(dateStr);
case "Hynix":
return getYWWDate(dateStr);
case "Amkor":
return getYWWDDate(dateStr);
case "Qualcomm":
return getYYWWDate(dateStr);
case "Skyworks ":
return getYYWWDate(dateStr);
case "Qorvo":
return getYYWWDate(dateStr);
case "LG":
return getYYWWDate(dateStr);
case "ICT":
return getYYWWDate(dateStr);
case "USI-上海":
return getYYWWDate(dateStr);
case "JSCK":
return getYYWWDate(dateStr);
case "Kyocera":
return getYYWWDate(dateStr);
case "TDK":
return getYYWWDate(dateStr);
case "INFINEON":
return getYYWWDate(dateStr);
case "Epson":
return getYYWWDate(dateStr);
case "TXC":
return getYYWWDate(dateStr);
case "ON":
return getYYWWDate(dateStr);
case "TI":
return getYYWWDate(dateStr);
case "DIODES":
return getYYWWDate(dateStr);
case "TSMC":
return getYYWWDate(dateStr);
case "NXP":
return getYYWWDate(dateStr);
case "Cirrus":
return getYYWWDate(dateStr);
case "ADI":
return getYYWWDate(dateStr);
case "Broadcom ":
return getYYWWDate(dateStr);
case "ST":
return getYYWWDate(dateStr);
case "Bosch":
return getYYWWDate(dateStr);
case "SAMSUNG":
return getYYWWDate(dateStr);
case "WD":
return getYYWWDate(dateStr);
case "Richtek":
return getYYWWDate(dateStr);
case "Nexperia":
return getYYWWDate(dateStr);
case "GIGADEVICE":
return getYYWWDate(dateStr);
case "Winbond":
return getYYWWDate(dateStr);
case "Dialog/Renesas ":
return getYYWWDate(dateStr);
case "SITIME":
return getYYWWDate(dateStr);
case "ROHM":
return getYYWWDate(dateStr);
case "KDS":
return getYYWWDate(dateStr);
case "SEMTEC":
return getYYWWDate(dateStr);
}
return null;
}
public static Date getWWYYDate(String dateStr) {
DateTime dateTime = DateUtil.parse(dateStr, "wwyy");
return dateTime = DateUtil.beginOfWeek(dateTime);
}
public static Date getYYYYMMDDDate(String dateStr) {
return DateUtil.parse(dateStr, "yyyyMMdd");
}
public static Date getYYMMDDDate(String dateStr) {
return DateUtil.parse(dateStr, "yyMMdd");
}
public static Date getYYWWDate(String dateStr) {
DateTime dateTime = DateUtil.parse(dateStr, "yyww");
dateTime = DateUtil.beginOfWeek(dateTime);
return dateTime;
}
public static Date getYYMMDate(String dateStr) {
return DateUtil.parse(dateStr, "yyMM");
}
public static Date getYWWDate(String dateStr) {
int year = DateUtil.thisYear() / 10;
dateStr = dateStr.substring(0,dateStr.length() - 1);
DateTime dateTime = DateUtil.parse(year + dateStr, "yyyyww");
return DateUtil.beginOfWeek(dateTime);
}
public static Date getYWWDDate(String dateStr) {
int year = DateUtil.thisYear() / 10;
//获取到当前周
String currentDateStr = dateStr.substring(0, dateStr.length() - 1);
currentDateStr = year + currentDateStr;
DateTime dateTime = DateUtil.parse(currentDateStr, "yyyyww");
dateTime = DateUtil.beginOfWeek(dateTime);
//获取到第几天
int endDay = Integer.valueOf(dateStr.substring(dateStr.length() - 1));
dateTime = DateUtil.offsetDay(dateTime,endDay - 1);
return dateTime;
}
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!