Commit 910d50a1 zshaohui

1.入库优化 2.单据修改

1 个父辈 7662f28c
正在显示 19 个修改的文件 包含 302 行增加55 行删除
......@@ -195,17 +195,28 @@ public class DataInitManager {
//储位转移
addNewFunctionMenu(4, raw, "storageTransfer", "储位转移", "storageTransfer", "storageTransfer/index", "transfer", functionMenuMap);
//手动入库
addNewFunctionMenu(8, raw, "manualWarehous", "手动入库", "manualWarehous", "manualWarehous/index", "manualWa", functionMenuMap);
Menu doc = Menu.CreatePMenu("单据操作", 9, "doc", 1, "docOp", raw);
//931单据领料
addNewFunctionMenu(5, raw, "docMaterialRe", "单据领料", "docMaterialRe", "receipt/docMaterialRe/index", "docMaterial", functionMenuMap);
addNewFunctionMenu(1, doc, "docMaterialRe", "单据领料", "docMaterialRe", "receipt/docMaterialRe/index", "docMaterial", functionMenuMap);
//单据转库
addNewFunctionMenu(6, raw, "docTransferWarehous", "单据转库", "docTransferWarehous", "receipt/docTransferWarehous/index", "docTransfer", functionMenuMap);
addNewFunctionMenu(2, doc, "docTransferWarehous", "单据转库", "docTransferWarehous", "receipt/docTransferWarehous/index", "docTransfer", functionMenuMap);
//单据退料
addNewFunctionMenu(7, raw, "docReturn", "单据退料", "docReturn", "receipt/docReturn/index", "docRe", functionMenuMap);
addNewFunctionMenu(3, doc, "docReturn", "单据退料", "docReturn", "receipt/docReturn/index", "docRe", functionMenuMap);
//手动出库
addNewFunctionMenu(4, doc,"outVir","手动出库","outVir","outVir/index","docOut",functionMenuMap);
//addNewFunctionMenu(132,null,"outPage","线外入库","outPage","outers/outPage/index","index",functionMenuMap);
//手动入库
addNewFunctionMenu(8, raw, "manualWarehous", "手动入库", "manualWarehous", "manualWarehous/index", "manualWa", functionMenuMap);
Menu wip = Menu.CreatePMenu("半成品仓", 3, "wip", 2, "wip", null);
......@@ -341,12 +352,6 @@ public class DataInitManager {
addNewFunctionMenu(131, s5, "outOperation/s5", "出库作业","outOperation/s5", "outers/outOperation/index","index",functionMenuMap);
addNewFunctionMenu(132, s5, "staWorkSurface/s5", "盘点作业","staWorkSurface/s5", "outers/staWorkSurface/index","index",functionMenuMap);
//线外入库
//Menu outPage = Menu.CreatePMenu("线外入库", 17, "", 1, "index", null);
addNewFunctionMenu(132,null,"outPage","线外入库","outPage","outers/outPage/index","index",functionMenuMap);
addNewFunctionMenu(133,null,"outVir","虚拟仓出库","outVir","outers/outVir/index","index",functionMenuMap);
//内仓线外入库
addNewFunctionMenu(134,null,"bcVirWarehous","虚拟仓","bcVirWarehous","virWarehous/virWarehous/index","feeding",functionMenuMap);
......
......@@ -419,7 +419,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
c.and("barcode.subCodeList.isOut").is(isOut);
}
//Sort sort = getSortByCheckOutType(checkOutType);
Sort sort = Sort.by(Sort.Direction.ASC, "barcode.subCodeList.createDate","barcode.subCodeList.amount"/*,"canCheckOutTime", "barcode.usedCount"*/);
Sort sort = Sort.by(Sort.Direction.ASC, "barcode.subCodeList.produceDate","barcode.subCodeList.createDate","barcode.subCodeList.amount"/*,"canCheckOutTime", "barcode.usedCount"*/);
Query q = new Query(c);
q.with(sort);
StoragePos pos = storagePosDao.findOne(q);
......
......@@ -373,6 +373,13 @@ public class DataLog extends BasePo implements Serializable {
//任务是否正常
private boolean normal = true;
private String currentLoc = "";
private boolean callEmptyBox = false;
public String getBarcode() {
if(barcode == null){
return "";
......
......@@ -479,7 +479,7 @@ public class OuterReportController {
}
if (queryCondition != null) {
query = QueryHelp.getQuery(queryCondition);
query.addCriteria(Criteria.where("posName").exists(true).ne("").and("partNumber").nin(Arrays.asList("CS", "CM", "CB")));
query.addCriteria(Criteria.where("posName").exists(true).ne("").and("partNumber").nin(Arrays.asList("C07", "C13", "C15")));
}
PageData<InventoryDto> resultData = new PageData<>();
PageData<Barcode> data = barcodeManager.findByPage(query, pageable);
......
......@@ -41,9 +41,9 @@ public class LuxsanApi extends DefaultSmfApiListener {
*/
public static List<QueryBinResult> queryBin(QueryBinRequest request) {
try {
log.info("queryBin接口请求参数为:" + JSONObject.toJSONString(request));
//log.info("queryBin接口请求参数为:" + JSONObject.toJSONString(request));
String resultStr = HttpHelper.postJson(queryBinUrl, request);
log.info("queryBin接口返回结果为:" + resultStr);
//log.info("queryBin接口返回结果为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
......
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean;
import lombok.Data;
import java.util.Map;
@Data
public class CtuStatus {
//ctu Id
private String ctuId;
//key为抽屉号, value为
private Map<String,String> usageMap;
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
@Data
@AllArgsConstructor
public class ValidBin {
private String boxCode;
private String boxLoc;
private String stackerLoc;
private List<String> validBinList;
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.controller;
import com.alibaba.fastjson.JSON;
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.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.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;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.CtuStatus;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.dto.CtuTask;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.enums.TaskCurrentLoc;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.util.BoxHandleUtil;
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 lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.ehcache.impl.internal.concurrent.ConcurrentHashMap;
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
......@@ -36,6 +46,9 @@ public class CtuDeviceController {
@Autowired
private DataCache dataCache;
@Autowired
private CodeResolve codeResolve;
@ApiOperation("原材料CTU获取线体到架子的入库任务(入满箱或出库后回库)")
@RequestMapping("/lineToShelfTasks")
......@@ -93,4 +106,130 @@ public class CtuDeviceController {
}
return ResultBean.newOkResult(shelfToLineTaskList);
}
@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();
String taskType = "入库";
if (task.isCheckOutTask()) {
taskType = "出库";
}
log.info("更新料箱[" + boxStr + "]的" + taskType + "任务[" + task.getId() + "]状态为:" + 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 (!OP_STATUS.FINISHED.name().equals(statusStr)) {
if (!task.isOutFromPos()) {
BoxHandleUtil.outFromPos(task);
task.setOutFromPos(true);
}
taskService.updateFinishedTask(task);
}
}
return ResultBean.newOkResult("");
}
@ApiOperation("根据料箱获取目的地")
@RequestMapping("/getOutTargetByBox")
@AnonymousAccess
public ResultBean getTargetByBox(String boxStr) {
if (StringUtils.isEmpty(boxStr)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"料箱信息"});
}
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog dataLog : allTasks) {
if (dataLog.isCheckOutTask() && !dataLog.isFinished() && !dataLog.isCancel()) {
if (boxStr.startsWith(dataLog.getBarcode())) {
return ResultBean.newOkResult(dataLog.getPosName());
}
}
}
return ResultBean.newErrorResult(-1, "", "未找到" + boxStr + "的入库库位");
}
@ApiOperation("更新入料机构缓存")
@RequestMapping("/updateBoxLoc")
@AnonymousAccess
public ResultBean updateMaterPutInCache(@RequestParam("boxStr") String boxStr,
@RequestParam("loc") String loc) {
DataLog dataLog = null;
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog task : allTasks) {
if (task.isCheckOutTask()) {
if (boxStr.startsWith(task.getBarcode())) {
dataLog = task;
break;
}
}
}
if (dataLog != null) {
dataLog.setCurrentLoc(loc);
if (TaskCurrentLoc.In1_FeedingInlet.equals(loc) || TaskCurrentLoc.In2_FeedingInlet.equals(loc)) {
dataLog.setStatus(loc);
}
if (dataLog.isExecuting() || dataLog.isWait()){
taskService.updateQueueTask(dataLog);
} else {
taskService.updateFinishedTask(dataLog);
}
} else {
Barcode barcode = codeResolve.resolveOneValideBarcode(boxStr);
StoragePos storagePos = BoxHandleUtil.locOnePos(barcode);
if (storagePos != null) {
Storage storage = dataCache.getStorageById(storagePos.getStorageId());
DataLog task = new DataLog(storage, storagePos.getBarcode(), storagePos);
task.setCallEmptyBox(true);
//task.setLoc(loc);
task.setCurrentLoc(loc);
task.setType(OP.CHECKOUT);
task.setStatus(loc);
taskService.updateFinishedTask(task);
}
}
return ResultBean.newOkResult("");
}
}
......@@ -18,6 +18,8 @@ import com.neotel.smfcore.custom.luxsan.api.enums.QueryGrStatusEnum;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.BindGrInfo;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.dto.QueryGrDto;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.dto.QueryGrStatusDto;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.util.BinCacheUtil;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.util.BoxHandleUtil;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CacheNameUtil;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CommonUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
......
......@@ -17,6 +17,7 @@ import com.neotel.smfcore.custom.luxsan.api.bean.request.FetchMoveTicketRequest;
import com.neotel.smfcore.custom.luxsan.api.bean.result.FetchMoveTicketResult;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.TicketReturn;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.dto.FetchMoveTicketDto;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.enums.LiteorderCheckType;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CacheNameUtil;
import com.neotel.smfcore.custom.luxsan.factory_c.util.CommonUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
......@@ -51,6 +52,11 @@ public class TicketController {
@RequestMapping("/fetchTicket")
@AnonymousAccess
public ResultBean fetchTicket(String ticket) {
if (StringUtils.isEmpty(ticket)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"单据号"});
}
List<FetchMoveTicketResult> ticketList = LuxsanApi.fetchMoveTicket(new FetchMoveTicketRequest(CommonUtil.plantCode, ticket));
return ResultBean.newOkResult(FetchMoveTicketDto.convertFetchMoveTicketDto(ticketList));
}
......@@ -64,7 +70,7 @@ public class TicketController {
String resultStr = liteOrderCache.hasExecutingOrder();
if (StringUtils.isNotEmpty(resultStr)) {
//throw new ValidateException("","有正在执行的工单,不允许恢复");
return ResultBean.newErrorResult(-1, "", "有正在执行的工单"+resultStr+",不允许出库");
return ResultBean.newErrorResult(-1, "", "有正在执行的工单" + resultStr + ",不允许出库");
}
if (StringUtils.isEmpty(ticket)) {
......@@ -95,12 +101,13 @@ public class TicketController {
}
liteOrder.setOrderItems(itemList);
liteOrder.setCheckType(LiteorderCheckType.TICKET_CHECKOUT);
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
}
String result = liteOrderCache.checkOutLiteOrderOut(ticket, false, null);
if (StringUtils.isNotEmpty(result)){
return ResultBean.newErrorResult(-1,"", MessageUtils.getText(result,new Locale(SecurityUtils.getCurrentUserLanguage()),result));
String result = liteOrderCache.rawTicketCheckOut(ticket, false, null);
if (StringUtils.isNotEmpty(result)) {
return ResultBean.newErrorResult(-1, "", MessageUtils.getText(result, new Locale(SecurityUtils.getCurrentUserLanguage()), result));
}
return ResultBean.newOkResult("");
}
......
......@@ -3,4 +3,6 @@ package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.enums;
public class LiteorderCheckType {
public static final int PICKING_CHECKOUT = 1;
public static final int TICKET_CHECKOUT = 2;
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.enums;
import lombok.Data;
@Data
public class TaskCurrentLoc {
public static final String In1_FeedingInlet = "In1_FeedingInlet";
public static final String In2_FeedingInlet = "In2_FeedingInlet";
public static final String In_FeedingInlet = "In_FeedingInlet";
public static final String Out1_FeedingInlet = "Out1_FeedingInlet";
public static final String Out2_FeedingInlet = "Out2_FeedingInlet";
public static final String Out_FeedingInlet = "Out_FeedingInlet";
public static final String In1_DischargeHole = "In1_DischargeHole";
public static final String In2_DischargeHole = "In2_DischargeHole";
public static final String Out1_DischargeHole = "Out1_DischargeHole";
public static final String Out2_DischargeHole = "Out2_DischargeHole";
//人工工位入料口
public static final String Manual_FeedingInlet = "Manual_FeedingInlet";
//人工工位出料口
public static final String Manual_DischargeHole = "Manual_DischargeHole";
}
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.util;
import com.neotel.smfcore.common.bean.ReelLockPosInfo;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.ReelLockPosUtil;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.enums.BARCODE_STATUS;
......@@ -22,10 +24,7 @@ import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
......@@ -134,12 +133,12 @@ public class BoxHandleUtil {
//storagePos.setUsed(false);
storagePosManager.save(storagePos);
log.info("出库完成,清空仓位: " + storagePos.getId() + "[" + storagePos.getPosName() + "]");
log.info(opTask.getBarcode() + "出库完成,清空仓位: " + storagePos.getId() + "[" + storagePos.getPosName() + "]");
taskService.moveTaskToFinished(opTask);
}
public static String callEmptyBox(String size,String outLet) {
public static StoragePos callEmptyBox(String size,String outLet,String wareHouseCode) {
String box = "";
if ("7".equals(size)) {
box = "C07";
......@@ -149,6 +148,14 @@ public class BoxHandleUtil {
box = "C15";
}
//判断有没有可用的料箱
List<String> boxList = BinCacheUtil.getBoxList(wareHouseCode);
if (boxList == null || boxList.isEmpty()){
log.info(wareHouseCode+"未找到可用料箱");
return null;
}
//排除掉正在使用的仓位
Criteria c = Criteria.where("barcode").exists(true).and("enabled").is(true);//可用
Collection<String> excludePosIds = taskService.excludePosIds();
......@@ -157,6 +164,7 @@ public class BoxHandleUtil {
}
c.and("barcode.partNumber").regex(Pattern.compile(QueryHelp.escapeExprSpecialWord(box), Pattern.CASE_INSENSITIVE));
c.and("barcode.status").is(BARCODE_STATUS.IN_STORE);
c.and("barcode.barcode").in(boxList);
List<StoragePos> storagePosList = storagePosManager.findByQuery(new Query(c).with(Sort.by(Sort.Direction.ASC, "barcode.amount")));
StoragePos storagePos = null;
......@@ -212,10 +220,10 @@ public class BoxHandleUtil {
}
}
generateTask(storage, storagePos.getBarcode(), storagePos, OP.CHECKOUT, OP_STATUS.WAIT.name(), toLoc, ExtendType.STORAGE_CHECKOUT);
return storagePos.getPosName();
return storagePos;
}
return "";
return null;
}
......@@ -228,6 +236,7 @@ public class BoxHandleUtil {
task.setOperator(SecurityUtils.getLoginUsername());
task.setBoxPosName(pos.getPosName());
task.setExtendType(extendType);
task.setCallEmptyBox(true);
if (barcode.getPutInTime() != -1) {
task.setFristPutInDate(new Date(barcode.getPutInTime()));
} else {
......@@ -239,14 +248,18 @@ public class BoxHandleUtil {
}
public static String getBoxStr(String code) {
public static String getBoxStr(String code,boolean suffix) {
if (code.endsWith("A") || code.endsWith("B")) {
code = code.substring(0, code.length() - 1);
code = code + "A";
if (suffix) {
code = code + "A";
}
}
if (code.contains("-")) {
code = code.substring(0, code.indexOf("-"));
code = code + "A";
if (suffix) {
code = code + "A";
}
}
return code;
}
......@@ -272,4 +285,45 @@ public class BoxHandleUtil {
}
return seq;
}
public static StoragePos locOnePos(Barcode boxBarcode){
//判断信息是否在已经在库位中(出入库只改变料箱位置状态,不从StoragePos表中清除)
StoragePos pos = storagePosManager.getByBarcode(boxBarcode.getBarcode());
if (pos != null){
return pos;
}
List<String> cidList = new ArrayList<>();
List<Storage> storageList = new ArrayList<>();
for (Storage storage : dataCache.getAllStorage().values()) {
storageList.add(storage);
cidList.add(storage.getCid());
}
pos = taskService.findEmptyPosForPutIn(storageList, boxBarcode, "", "");
if (pos == null) {
log.info(boxBarcode.getBarcode() + "未找到可用库位");
return null;
}else{
log.info("料箱["+boxBarcode.getBarcode()+"]信息加入库位["+pos.getPosName()+"]中");
pos.setBarcode(boxBarcode);
pos.setUsed(true);
storagePosManager.save(pos);
//3.锁定库位
Storage storage = dataCache.getStorageById(pos.getStorageId());
ReelLockPosInfo reelLocInfo = new ReelLockPosInfo();
reelLocInfo.setBarcode(boxBarcode.getBarcode());
reelLocInfo.setCid(storage.getCid());
reelLocInfo.setLockPosName(pos.getPosName());
reelLocInfo.setLockPosId(pos.getId());
reelLocInfo = ReelLockPosUtil.addReelLockPosInfo(reelLocInfo, cidList);
if (reelLocInfo == null) {
log.info("[" + boxBarcode.getBarcode() + "]库位锁定失败,暂停入库");
return null;
}
}
return pos;
}
}
......@@ -128,4 +128,14 @@ public class MaterialUtil {
}
return null;
}
public static String getMaterialSize(String materialStr) {
String size = "7";
if (materialStr.startsWith("B13")) {
size = "13";
} else if (materialStr.startsWith("B15")) {
size = "15";
}
return size;
}
}
......@@ -16,15 +16,7 @@ public class CacheNameUtil {
public static final String CHCHE_MANUALWORK_PUTIN = "CHCHE_MANUALWORK_PUTIN";
public static final String CHCHE_EXECUTINGPUTIN_BOX = "CHCHE_EXECUTINGPUTIN_BOX";
public static final String CHCHE_SHIPCANCELUPSHELF = "CHCHE_SHIPCANCELUPSHELF";
public static final String CHCHE_RESTOREREPLACE = "CHCHE_RESTOREREPLACE";
//CTU使用信息
public static final String CHCHE_CTUUSEINFO = "CHCHE_CTUUSEINFO";
//入料机构缓存
public static final String CHCHE_MATERIAL_PUTIN_CACHE = "CHCHE_MATERIAL_PUTIN_CACHE";
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!