Commit 02f5b187 zshaohui

半成品仓 功能提交

1 个父辈 fd84a2ee
......@@ -184,7 +184,7 @@ public class DataInitManager {
addNewFunctionMenu(10,poutOut, "safetyInventory", "安全库存", "safetyInventory", "system/safetyInventory/index", "safeInventory",functionMenuMap);
Menu raw = Menu.CreatePMenu("原材料仓", 2, "raw", 2, "", null);
Menu raw = Menu.CreatePMenu("原材料仓", 2, "raw", 2, "raw", null);
//Gr入库
addNewFunctionMenu(2, raw, "grStorage", "Gr入库", "grStorage", "grStorage/index", "grStorage", functionMenuMap);
......@@ -208,6 +208,17 @@ public class DataInitManager {
addNewFunctionMenu(8, raw, "manualWarehous", "手动入库", "manualWarehous", "manualWarehous/index", "manualWa", functionMenuMap);
Menu wip = Menu.CreatePMenu("半成品仓", 3, "wip", 2, "wip", null);
addNewFunctionMenu(1, wip, "manualWork", "人工作业", "manualWork", "SemiFinishProducts/manualWork/index", "manualWork", functionMenuMap);
addNewFunctionMenu(2, wip, "requisition", "领用", "requisition", "SemiFinishProducts/requisition/index", "requisition", functionMenuMap);
addNewFunctionMenu(3, wip, "Shipment", "出货", "Shipment", "SemiFinishProducts/Shipment/index", "Shipment", functionMenuMap);
addNewFunctionMenu(4, wip, "transferInventory", "转库", "transferInventory", "SemiFinishProducts/transferInventory/index", "transferInventory", functionMenuMap);
//MSD管理:MSD库存.MSD追溯性.MSD设置
Menu msd = Menu.CreatePMenu("MSD管理", 2, "msd", 2, "MSD",null);
addNewFunctionMenu(21, msd, "msdManage", "MSD库存", "msdManage", "neolight/msdManage/index", "MSDManager",functionMenuMap);
......
......@@ -902,8 +902,8 @@ public class BarcodeRule {
rule = "RI[0:6:2]PN[-1:2:-1]";
codeStr = "B0700001-01";
rule = "RI[0:11:0]PN[0:3:8]";
codeStr = "B0700001A";
rule = "RI[0:8:1]PN[0:3:6]";
//codeStr = "B0700001A";
//rule = "RI[0:8:1]PN[0:3:6]";
......
......@@ -191,6 +191,11 @@ public class Barcode extends BasePo implements Serializable {
*/
private String orderItemId;
/**
* 工单id
*/
private String orderId;
//半成品仓,增加的参数
......
......@@ -1152,6 +1152,9 @@ public class LiteOrderCache {
}
public synchronized List<String> findNeedOutBox(String orderNo, List<String> boxList) {
List<String> resultList = new ArrayList<>();
//1.判断工单是否存在
LiteOrder cacheOrder = liteOrderMap.get(orderNo);
if (cacheOrder == null) {
......@@ -1171,39 +1174,69 @@ public class LiteOrderCache {
cacheOrder.setFinishedReelCount(0);
cacheOrder.setStatus(LITEORDER_STATUS.TAILS);
//4.获取料仓id
List<String> storageIdList = new ArrayList<>();
for (Storage storage : dataCache.getAllStorage().values()) {
storageIdList.add(storage.getId());
}
//查找用户所输入的料箱信息
List<StoragePos> storagePosList = new ArrayList<>();
if (boxList != null && !boxList.isEmpty()) {
storagePosList = storagePosManager.findByQuery(new Query(Criteria.where("barcode.barcode").in(boxList)));
}
CHECKOUT_TYPE checkoutType = dataCache.getCheckOutType();
//4.开始循环处理
for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) {
//5.判断剩余数量
int remainNum = orderItem.getTotalOutNum() - orderItem.getOutNum();
int assignReelNum = 0;
while (remainNum > 0) {
if (assignReelNum >= remainNum) {
break;
}
String pn = orderItem.getPn();
String warehouseCode = orderItem.getWarehouseCode();
String pn = orderItem.getPn();
String warehouseCode = orderItem.getWarehouseCode();
//6.首先匹配用户输入的料箱信息
StoragePos pos = null;
while (assignReelNum <= remainNum) {
if (storagePosList != null && !storagePosList.isEmpty()) {
for (StoragePos storagePos : storagePosList) {
Barcode barcode = storagePos.getBarcode();
if (!storagePos.isLocked()) {
if (barcode.getPartNumber().equals(pn) && barcode.getWarehouseCode().equals(warehouseCode)) {
barcode.setOrderItemId(orderItem.getId());
barcode.setOrderId(cacheOrder.getId());
barcode.setLockId(cacheOrder.getId());
barcode.setLockName(cacheOrder.getOrderNo());
storagePos.setBarcode(barcode);
assignReelNum = assignReelNum + barcode.getAmount();
resultList.add(barcode.getPosName());
storagePosManager.save(storagePos);
barcodeManager.save(barcode);
}
}
}
}
break;
}
while (assignReelNum <= remainNum) {
Collection<String> excludePosIds = taskService.excludePosIds();
StoragePos storagePos = storagePosManager.findOdnPnInStorages(storageIdList,"" ,pn, excludePosIds, checkoutType);
if (storagePos == null) {
break;
}
Barcode barcode = storagePos.getBarcode();
barcode.setOrderItemId(orderItem.getId());
barcode.setOrderId(cacheOrder.getId());
barcode.setLockId(cacheOrder.getId());
barcode.setLockName(cacheOrder.getOrderNo());
storagePos.setBarcode(barcode);
assignReelNum = assignReelNum + barcode.getAmount();
resultList.add(barcode.getPosName());
storagePosManager.save(storagePos);
barcodeManager.save(barcode);
}
}
return null;
return resultList;
}
}
......@@ -33,6 +33,8 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType);
StoragePos findOdnPnInStorages(List<String> storageIdList,String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType);
StoragePos findPartNumberInStorages(List<String> storageIdList,String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType);
StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType,String brand);
......
......@@ -347,6 +347,31 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}
@Override
public StoragePos findOdnPnInStorages(List<String> storageIdList,String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType) {
Criteria c = Criteria.where("barcode.pn").is(pn)
.and("id").nin(excludePosIds)
.and("enabled").is(true)//可用
.and("barcode.lockId").is(null);//没有被锁定的仓位;
if (storageIdList != null) {
c = c.and("storageId").in(storageIdList);
}
if (ObjectUtil.isNotEmpty(labelId)) {
c.and("labelId").is(labelId);
}
Query q = new Query(c);
//Sort sort = getSortByCheckOutType(checkOutType);
Sort sort = Sort.by(Sort.Direction.ASC,"barcode.amount","barcode.putInDate");
q.with(sort);
StoragePos pos = storagePosDao.findOne(q);
if (pos == null) {
log.info("使用" + checkOutType + " 策略出库 partNumber=" + pn + ",未找到可以出库的物料 ");
} else {
log.info("使用" + checkOutType + " 策略出库 partNumber=" + pn + ",找到出仓位置【" + pos.getPosName() + "】,RI【" + pos.getBarcode().getBarcode() + "】 ");
}
return pos;
}
@Override
public StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType, String brand) {
Criteria c = Criteria.where("barcode.partNumber").is(pn)
.and("id").nin(excludePosIds)
......
......@@ -516,42 +516,7 @@ public class LuxsanApi extends DefaultSmfApiListener {
public static List<FetchMoveTicketResult> fetchMoveTicket(FetchMoveTicketRequest request) {
try {
log.info("fetchMoveTicket接口请求参数为:" + JSONObject.toJSONString(request));
//String resultStr = HttpHelper.postJson(fetchMoveTicketUrl, request);
String resultStr = "{\n" +
" \"MSGTY\": \"S\",\n" +
" \"MSGTX\": \"查询成功\",\n" +
" \"DETAIL\": null,\n" +
" \"DATA\": [\n" +
" {\n" +
" \"ticket_code\": \"REQ00001\",\n" +
" \"ticket_item\": \"1\",\n" +
" \"material_code\": \"pn001\",\n" +
" \"move_type\": \"311\",\n" +
" \"src_warehouse\": \"W101\",\n" +
" \"dst_warehouse\": \"W107\",\n" +
" \"src_plant\": \"W337\",\n" +
" \"dst_plant\": \"W337\",\n" +
" \"src_batch\": \"100000000E\",\n" +
" \"dst_batch\": \"100000000E\",\n" +
" \"qty\": 100\n" +
" },\n" +
" {\n" +
" \"ticket_code\": \"REQ00001\",\n" +
" \"ticket_item\": \"1\",\n" +
" \"material_code\": \"pn002\",\n" +
" \"move_type\": \"311\",\n" +
" \"src_warehouse\": \"W101\",\n" +
" \"dst_warehouse\": \"W107\",\n" +
" \"src_plant\": \"W337\",\n" +
" \"dst_plant\": \"W337\",\n" +
" \"src_batch\": \"100000000A\",\n" +
" \"dst_batch\": \"100000000A\",\n" +
" \"qty\": 200\n" +
" }\n" +
" ]\n" +
"}";
log.info("fetchMoveTicket接口返回结果为:" + resultStr);
String resultStr = HttpHelper.postJson(fetchMoveTicketUrl, request);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{apiResult.getMSGTX()});
......@@ -924,7 +889,7 @@ public class LuxsanApi extends DefaultSmfApiListener {
return resultList;
}
} catch (Exception e) {
} catch (ApiException e) {
log.error("fetchShipmentInfo接口请求失败:" + e.getMessage());
throw new ValidateException("smfcore.api.error", "接口请求失败[{0}]", new String[]{e.getMessage()});
}
......
......@@ -91,6 +91,10 @@ public class BoxHandleUtil {
//仓位状态
barcode.setCheckOutDate(new Date(), "");
barcode.setPosName("");
barcode.setOrderItemId("");
barcode.setOrderId("");
barcode.setLockName("");
barcode.setLockId("");
barcodeManager.save(barcode);
}
......
......@@ -11,4 +11,8 @@ public class CacheNameUtil {
public static final String CHCHE_TICKET_RETURN = "CHCHE_TICKET_RETURN";
public static final String CHCHE_MANUAL_PUTIN = "CHCHE_MANUAL_PUTIN";
public static final String CHCHE_UPLOAD_CARPALLINFO = "CHCHE_UPLOAD_CARPALLINFO";
public static final String CHCHE_MANUALWORK_PUTIN = "CHCHE_MANUALWORK_PUTIN";
}
package com.neotel.smfcore.custom.luxsan.factory_c.wipstor.controller;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.ReelLockPosUtil;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.util.BoxHandleUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Slf4j
@ApiOperation("AGV设备端")
@RestController
@RequestMapping("/agvDevice")
public class AgvDeviceController {
@Autowired
private TaskService taskService;
@ApiOperation("获取入库任务")
@RequestMapping("/getPutInTask")
@AnonymousAccess
public List<DataLog> getPutInTask() {
List<DataLog> dataLogList = new ArrayList<>();
for (DataLog dataLog : taskService.getAllTasks()) {
if (dataLog.isPutInTask() && dataLog.isWait()) {
dataLogList.add(dataLog);
}
}
return dataLogList;
}
@ApiOperation("获取出库任务")
@RequestMapping("/getCheckOutTask")
@AnonymousAccess
public List<DataLog> getCheckOutTask() {
List<DataLog> dataLogList = new ArrayList<>();
for (DataLog dataLog : taskService.getAllTasks()) {
if (dataLog.isCheckOutTask() && dataLog.isWait()) {
dataLogList.add(dataLog);
}
}
return dataLogList;
}
@ApiOperation("修改任务状态")
@RequestMapping("/updateTaskStatus")
@AnonymousAccess
public ResultBean updateTaskStatus(@RequestBody Map<String, String> paramMap) {
String boxStr = paramMap.get("boxStr");
String statusStr = paramMap.get("statusStr");
//1.判断任务是否存在
DataLog task = null;
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog dataLog : allTasks) {
if (boxStr.startsWith(dataLog.getBarcode())) {
if (!dataLog.isCancel() && !dataLog.isFinished()) {
task = dataLog;
break;
}
}
}
if (task == null) {
return ResultBean.newErrorResult(-1, "smfcore.task.notExist", "任务不存在");
}
statusStr = statusStr.toUpperCase();
log.info("更新料箱:" + boxStr + ",任务状态为:" + statusStr);
//2.判断更新状态和当前状态任务是否相同
if (task.getStatus().equals(statusStr)) {
return ResultBean.newErrorResult(-1, "smfcore.taskStatusHasUpdate", "任务{0}已经修改状态", new String[]{task.getBarcode()});
}
task.setStatus(statusStr);
//3.判断是出库,还是入库任务
if (task.isPutInTask()) {
if (OP_STATUS.FINISHED.name().equals(statusStr)) {
BoxHandleUtil.intoPos(task);
ReelLockPosUtil.removeReelLockPosInfo(task.getBarcode());
} else {
taskService.updateQueueTask(task);
}
} else {
//4.如果是出库任务
if (OP_STATUS.EXECUTING.name().equals(statusStr)) {
taskService.updateQueueTask(task);
} else {
if (!task.isOutFromPos()) {
BoxHandleUtil.outFromPos(task);
task.setOutFromPos(true);
}
taskService.updateFinishedTask(task);
}
}
return ResultBean.newOkResult("");
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.wipstor.controller;
import com.neotel.smfcore.common.bean.ReelLockPosInfo;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.ReelLockPosUtil;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
......@@ -8,6 +10,9 @@ import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
......@@ -17,7 +22,9 @@ import com.neotel.smfcore.custom.luxsan.api.bean.request.ValidCartonRequest;
import com.neotel.smfcore.custom.luxsan.api.bean.result.FetchPalletInfoResult;
import com.neotel.smfcore.custom.luxsan.api.bean.result.ValidCartonResult;
import com.neotel.smfcore.custom.luxsan.api.enums.PalletEnum;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CacheNameUtil;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CommonUtil;
import com.neotel.smfcore.custom.luxsan.factory_c.wipstor.util.ManualWorkUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
......@@ -29,10 +36,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
@Api(tags = "流水线接口")
@Slf4j
......@@ -55,6 +59,10 @@ public class LineController {
@Autowired
private TaskService taskService;
@Autowired
private IStoragePosManager storagePosManager;
/**
* 线体第一个扫码器扫码调用
*/
......@@ -64,13 +72,16 @@ public class LineController {
public ResultBean validCarton(@RequestBody Map<String, String> paramMap) {
String cartonId = paramMap.get("cartonId");
//1.解析条码
Barcode barcode = codeResolve.resolveCode(cartonId);
if (barcode == null) {
return ResultBean.newErrorResult(-1, "smfcore.error.barcode.invalid", "条码无效");
}
//如果是人工作业 直接返回ok
if (ManualWorkUtil.bindManualWork(barcode.getBarcode())) {
return ResultBean.newOkResult("");
}
try {
ValidCartonResult result = LuxsanApi.validCarton(new ValidCartonRequest("", cartonId, CommonUtil.plantCode));
//设置barcode的其他参数
......@@ -89,11 +100,9 @@ public class LineController {
barcode.setRegion(result.getREGION());
barcode.setStatus(result.getSTATUS());
barcode = barcodeManager.save(barcode);
} catch (Exception e) {
return ResultBean.newErrorResult(-1, "", e.getMessage());
}
return ResultBean.newOkResult("");
}
......@@ -103,7 +112,7 @@ public class LineController {
@ApiOperation("获取栈板信息")
@RequestMapping("/fetchPalletInfo")
@AnonymousAccess
public ResultBean fetchPalletInfo(@RequestBody Map<String, String> paramMap) {
public synchronized ResultBean fetchPalletInfo(@RequestBody Map<String, String> paramMap) {
String cartonId = paramMap.get("cartonId");
......@@ -114,26 +123,61 @@ public class LineController {
}
String palletId = barcode.getPalletId();
//2.请求接口判断是否过账
try {
FetchPalletInfoResult fetchPalletInfo = null;
List<FetchPalletInfoResult> fetchPalletList = LuxsanApi.fetchPalletInfo(new FetchPalletInfoRequest("", CommonUtil.plantCode, Arrays.asList(palletId)));
for (FetchPalletInfoResult result : fetchPalletList) {
if (palletId.equals(result.getPALLET_ID())){
fetchPalletInfo = result;
break;
//如果是人工作业的,直接入库
if (ManualWorkUtil.bindManualWork(barcode.getBarcode())){
} else {
//2.请求接口判断是否过账
try {
FetchPalletInfoResult fetchPalletInfo = null;
List<FetchPalletInfoResult> fetchPalletList = LuxsanApi.fetchPalletInfo(new FetchPalletInfoRequest("", CommonUtil.plantCode, Arrays.asList(palletId)));
for (FetchPalletInfoResult result : fetchPalletList) {
if (palletId.equals(result.getPALLET_ID())) {
fetchPalletInfo = result;
break;
}
}
if (fetchPalletInfo != null) {
if (fetchPalletInfo.getSTATUS() != PalletEnum.INVENTORY_IN_WAREHOUSE) {
return ResultBean.newErrorResult(-1, "", fetchPalletInfo.getPALLET_ID() + "不是在库库存状态,不允许入库");
}
}
} catch (Exception e) {
return ResultBean.newErrorResult(-1, "", e.getMessage());
}
if (fetchPalletInfo != null){
if (fetchPalletInfo.getSTATUS() == PalletEnum.INVENTORY_IN_WAREHOUSE){
return ResultBean.newOkResult("");
}
}
} catch (Exception e) {
return ResultBean.newErrorResult(-1, "", e.getMessage());
}
return ResultBean.newErrorResult(-1,"",cartonId+"未获取到对应的过账信息");
//生成入库任务
List<Storage> storageList = new ArrayList<>();
List<String> cidList = new ArrayList<>();
for (Storage storage : dataCache.getAllStorage().values()) {
storageList.add(storage);
cidList.add(storage.getCid());
}
StoragePos pos = taskService.findEmptyPosForPutIn(storageList, barcode, "", "");
if (pos == null) {
return ResultBean.newErrorResult(-1, "", cartonId + "未找到可用库位");
}
//3.锁定库位
Storage storage = dataCache.getStorageById(pos.getStorageId());
ReelLockPosInfo reelLocInfo = new ReelLockPosInfo();
reelLocInfo.setBarcode(barcode.getBarcode());
reelLocInfo.setCid(storage.getCid());
reelLocInfo.setLockPosName(pos.getPosName());
reelLocInfo.setLockPosId(pos.getId());
reelLocInfo = ReelLockPosUtil.addReelLockPosInfo(reelLocInfo, cidList);
if (reelLocInfo == null) {
return ResultBean.newErrorResult(-1, "", "[" + barcode.getBarcode() + "]库位[" + reelLocInfo.getLockPosName() + "]已被锁定,暂停入库", new String[]{});
}
//4.生成入库任务
DataLog dataLog = taskService.addPutInTaskToExecute(storage, barcode, pos);
return ResultBean.newOkResult("");
}
......@@ -172,4 +216,23 @@ public class LineController {
return ResultBean.newErrorResult(-1, "", "未找到对应的信息");
}
/**
* 传入栈板和料箱信息
*/
@ApiOperation("传入栈板和料箱信息")
@RequestMapping("/uploadCarPallInfo")
@AnonymousAccess
public ResultBean uploadCarPallInfo(@RequestBody Map<String, String> paramMap) {
String cartonId = paramMap.get("cartonId");
String palletId = paramMap.get("palletId");
Map<String, String> cacheMap = dataCache.getCache(CacheNameUtil.CHCHE_UPLOAD_CARPALLINFO);
if (cacheMap == null) {
cacheMap = new HashMap<>();
}
cacheMap.put(cartonId, palletId);
dataCache.updateCache(CacheNameUtil.CHCHE_UPLOAD_CARPALLINFO, cacheMap);
return ResultBean.newOkResult("");
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.wipstor.controller;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CacheNameUtil;
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.ArrayList;
import java.util.List;
@Api(tags = "人工作业")
@RequestMapping("/manualWork")
@RestController
public class ManualWorkController {
@Autowired
private CodeResolve codeResolve;
@Autowired
private DataCache dataCache;
@Autowired
private TaskService taskService;
@ApiOperation("人工入库")
@RequestMapping("/putIn")
@AnonymousAccess
public ResultBean putIn(String boxStr) {
Barcode boxBarcode = codeResolve.resolveOneValideBarcode(boxStr);
if (boxBarcode == null) {
throw new ValidateException("smfcore.error.barcode.invalid", "{0}不是有效的条码", new String[]{boxStr});
}
//判断是否在列表中
List<String> cacheList = dataCache.getCache(CacheNameUtil.CHCHE_MANUALWORK_PUTIN);
if (cacheList == null) {
cacheList = new ArrayList<>();
}
if (cacheList.contains(boxBarcode.getBarcode())) {
return ResultBean.newErrorResult(-1, "", boxStr + "已经存在人工作业列表中");
}
//判断有没有任务
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog dataLog : allTasks) {
if (!dataLog.isFinished() && !dataLog.isCancel()) {
if (dataLog.getBarcode().equals(boxBarcode.getBarcode())) {
return ResultBean.newErrorResult(-1, "", boxStr + "已经有正在执行中的任务");
}
}
}
cacheList.add(boxBarcode.getBarcode());
dataCache.updateCache(CacheNameUtil.CHCHE_MANUALWORK_PUTIN, cacheList);
return ResultBean.newOkResult("");
}
@ApiOperation("人工入库列表")
@RequestMapping("/manualWorkList")
@AnonymousAccess
public ResultBean manualWorkList() {
List<String> cacheList = dataCache.getCache(CacheNameUtil.CHCHE_MANUALWORK_PUTIN);
if (cacheList == null) {
cacheList = new ArrayList<>();
}
return ResultBean.newOkResult(cacheList);
}
@ApiOperation("移除人工作业列表")
@RequestMapping("/removeManualWork")
@AnonymousAccess
public ResultBean removeManualWork(String boxStr) {
List<String> cacheList = dataCache.getCache(CacheNameUtil.CHCHE_MANUALWORK_PUTIN);
if (cacheList == null) {
cacheList = new ArrayList<>();
}
cacheList.remove(boxStr);
return ResultBean.newOkResult("");
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.wipstor.controller;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.StringUtils;
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.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
......@@ -22,6 +29,8 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
......@@ -47,6 +56,15 @@ public class WipStorCheckOutController {
@Autowired
private TaskService taskService;
@Autowired
private CodeResolve codeResolve;
@Autowired
private IBarcodeManager barcodeManager;
@Autowired
private DataCache dataCache;
@ApiOperation("获取ODN详情")
@RequestMapping("/getOdnDetail")
......@@ -61,13 +79,16 @@ public class WipStorCheckOutController {
@RequestMapping("boxInStor")
@AnonymousAccess
public ResultBean boxInStor(String odn, String box) {
StoragePos pos = storagePosManager.getByBarcode(box);
if (pos == null) {
log.info("收到odn信息为:"+odn+",料箱信息为:"+box);
Barcode barcode = codeResolve.resolveOneValideBarcode(box);
if (barcode == null) {
throw new ValidateException("smfcore.error.barcode.invalid", "{0}不是有效的条码", new String[]{box});
}
if (StringUtils.isEmpty(barcode.getPosName())) {
return ResultBean.newErrorResult(-1, "", box + "不在库");
}
//判断是否锁定其他工单
Barcode barcode = pos.getBarcode();
if (StringUtils.isNotEmpty(barcode.getLockName()) && !barcode.getLockName().equals(odn)) {
return ResultBean.newErrorResult(-1, "", box + "已经锁定odn:" + barcode.getLockName());
}
......@@ -98,7 +119,7 @@ public class WipStorCheckOutController {
liteOrder = liteOrderManager.findByOrderNo(odn);
}
if (liteOrder != null) {
if (!liteOrder.isTaskFinished()) {
if (!liteOrder.isTaskFinished() && !liteOrder.isNew()) {
return ResultBean.newErrorResult(-1, "", odn + "任务未结束");
}
liteOrder.setOrderNo(odn + "_bak_" + System.currentTimeMillis());
......@@ -137,10 +158,68 @@ public class WipStorCheckOutController {
newOrder = liteOrderManager.createWithItems(newOrder);
liteOrderCache.addOrderToMap(newOrder);
liteOrderCache.findNeedOutBox(odn, boxList);
List<String> needOutBoxList = liteOrderCache.findNeedOutBox(odn, boxList);
if (needOutBoxList == null || needOutBoxList.isEmpty()){
return ResultBean.newErrorResult(-1,"","未找到可以出库的物料");
}
return ResultBean.newOkResult(needOutBoxList);
}
@ApiOperation("取消odn出库")
@RequestMapping("/cancelOdnOut")
@AnonymousAccess
public ResultBean cancelOdnOut(String odn) {
if (StringUtils.isEmpty(odn)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"odn"});
}
List<StoragePos> posList = storagePosManager.findByQuery(new Query(Criteria.where("barcode.lockName").is(odn)));
if (posList != null && !posList.isEmpty()){
for (StoragePos storagePos : posList) {
Barcode barcode = storagePos.getBarcode();
barcode.setOrderId("");
barcode.setOrderItemId("");
barcode.setLockId("");
barcode.setLockName("");
barcodeManager.save(barcode);
storagePos.setBarcode(barcode);
storagePosManager.save(storagePos);
}
}
return ResultBean.newOkResult("");
}
@ApiOperation("ODN确认出库")
@RequestMapping("/odnConfirmOut")
@AnonymousAccess
public synchronized ResultBean odnConfirmOut(String odn) {
//生成出库任务
List<StoragePos> posList = storagePosManager.findByQuery(new Query(Criteria.where("barcode.lockName").is(odn)));
for (StoragePos storagePos : posList) {
Storage storage = dataCache.getStorageById(storagePos.getStorageId());
Barcode barcode = storagePos.getBarcode();
DataLog dataLog = new DataLog(storage, barcode, storagePos);
dataLog.setSourceId(barcode.getLockId());
dataLog.setSourceName(barcode.getLockName());
dataLog.setSubSourceId(barcode.getOrderItemId());
dataLog.setType(OP.CHECKOUT);
dataLog.setStatus(OP_STATUS.WAIT.name());
taskService.updateQueueTask(dataLog);
}
return ResultBean.newOkResult("");
}
@ApiOperation("人员调用wms手动解绑")
@RequestMapping("/unBindPallet")
@AnonymousAccess
public ResultBean unBindPallet() {
return ResultBean.newOkResult("");
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.wipstor.util;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CacheNameUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
public class ManualWorkUtil {
private static DataCache dataCache;
@Autowired
public void setDataCache(DataCache cache){
ManualWorkUtil.dataCache = cache;
}
public static boolean bindManualWork(String boxStr){
List<String> cacheList = dataCache.getCache(CacheNameUtil.CHCHE_MANUALWORK_PUTIN);
if (cacheList == null) {
cacheList = new ArrayList<>();
}
return cacheList.contains(boxStr);
}
}
......@@ -103,5 +103,6 @@ app:
type: ""
menu:
show: grStorage,pkStorage,storageTransfer,docMaterialRe,docTransferWarehous,docReturn,manualWarehous
#show: grStorage,pkStorage,storageTransfer,docMaterialRe,docTransferWarehous,docReturn,manualWarehous
show: #manualWork,requisition,Shipment,transferInventory
hide:
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!