Commit a4c257e6 LN

工单调试问题修改。增加查找出库接口。

1 个父辈 635017c4
...@@ -3,16 +3,20 @@ package com.neotel.smfcore.core.order; ...@@ -3,16 +3,20 @@ package com.neotel.smfcore.core.order;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.neotel.smfcore.common.bean.ResultBean; import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.core.barcode.service.po.Barcode; 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; import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS; import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.enums.ORDER_COLOR; import com.neotel.smfcore.core.order.enums.ORDER_COLOR;
import com.neotel.smfcore.core.order.service.dao.ILiteOrderDao; import com.neotel.smfcore.core.order.service.dao.ILiteOrderDao;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager; import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager; 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.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem; import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager; 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.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos; import com.neotel.smfcore.core.storage.service.po.StoragePos;
...@@ -71,6 +75,9 @@ public class LiteOrderCache implements ITaskListener { ...@@ -71,6 +75,9 @@ public class LiteOrderCache implements ITaskListener {
ORDER_COLOR nextColor = ORDER_COLOR.nextColor(currentColors); ORDER_COLOR nextColor = ORDER_COLOR.nextColor(currentColors);
//其他出库模式一次性全部生成任务 //其他出库模式一次性全部生成任务
List<StoragePos> lockPosList = storagePosManager.findLockPos(liteOrder.getOrderNo()); List<StoragePos> lockPosList = storagePosManager.findLockPos(liteOrder.getOrderNo());
if(lockPosList==null){
throw new ValidateException("未找到锁定库位");
}
int taskReelCount = 0; int taskReelCount = 0;
for (StoragePos lockPos : lockPosList) { for (StoragePos lockPos : lockPosList) {
Storage storage = dataCache.getStorageById(lockPos.getStorageId()); Storage storage = dataCache.getStorageById(lockPos.getStorageId());
...@@ -183,4 +190,149 @@ public class LiteOrderCache implements ITaskListener { ...@@ -183,4 +190,149 @@ public class LiteOrderCache implements ITaskListener {
} }
} }
} }
/**
* 锁定物料
*/
public synchronized String checkOutLiteOrder(String orderNo, boolean outBom) {
LiteOrder cacheOrder = liteOrderMap.get(orderNo);
if (cacheOrder != null && !cacheOrder.isTaskFinished() && !cacheOrder.isNew()) {
log.info("工单[" + orderNo + "]正在执行");
return "order.out.executing";
}
if (cacheOrder == null) {
cacheOrder = liteOrderManager.findByOrderNo(orderNo);
}
if (cacheOrder == null) {
return "order.out.notFound";
}
//设置颜色
Set<String> currentColors = new HashSet<>();
for (DataLog dataLog : taskService.getQueueTasks()) {
currentColors.add(dataLog.getLightColor());
}
ORDER_COLOR nextColor = ORDER_COLOR.nextColor(currentColors);
if (nextColor == null) {
log.info("执行工单[" + orderNo + "] outBom=" + outBom + "时,已达最大可执行工单数");
return "order.out.maxOrder";
}
log.info("开始执行工单[" + orderNo + "] outBom=" + outBom);
cacheOrder.setTaskReelCount(0);
cacheOrder.setTaskFinishedTime(-1);
cacheOrder.setFinishedReelCount(0);
if (outBom) {
cacheOrder.setStatus(LITEORDER_STATUS.BOM);
} else {
cacheOrder.setStatus(LITEORDER_STATUS.TAILS);
}
//liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder);
int taskReelCount = 0;
CHECKOUT_TYPE checkoutType = dataCache.getCheckOutType();
List<String> availableStorageIds = new ArrayList<>();
for (Storage storage : dataCache.getAllStorage().values()) {
//默认所有料仓可用
// StatusBean statusBean =dataCache. getStatus(storage.getCid());
// if (statusBean.isAvailable())
{
availableStorageIds.add(storage.getId());
}
}
//其他出库模式一次性全部生成任务
for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) {
//剩余未出数量
Float totalNum = orderItem.getNeedNum() * cacheOrder.getOrderTimes();
int remainNum = totalNum.intValue() - orderItem.getOutNum();
//此PN未完成
if (remainNum > 0) {
if (outBom) {
//套料出库,设置剩余数量为1,这样就只会出一盘
remainNum = 1;
}
int assignNum = 0;
while (assignNum < remainNum) {
Collection<String> excludePosIds = excludePosIds();
String partNumber = orderItem.getPn();
StoragePos pos = storagePosManager.findPartNumberInStorages(availableStorageIds, partNumber, excludePosIds, checkoutType);
if (pos == null) {
log.error("未找到可以出库的物料[" + partNumber + "]");
break;
} else {
assignNum = assignNum + pos.getBarcode().getAmount();
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 = dataLogDao.save(task);
taskService.addTaskToExecute(task);
}
}
}
}
cacheOrder.setTaskReelCount(taskReelCount);
log.info("工单[" + orderNo + "]任务分配结束,任务数[" + taskReelCount + "]");
//有需要出库的
if (taskReelCount <= 0) {
cacheOrder.finishedTasks();
}
liteOrderManager.save(cacheOrder);
liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder);
if (taskReelCount <= 0) {
//return "工单无可执行的任务";
return "order.out.noTask";
}
return "";
}
/**
* 防止仓位任务重复,需要排除掉已经分配掉的仓位
*/
public Collection<String> excludePosIds() {
//排除掉正在执行的仓位
List<DataLog> allTasks = taskService.getAllTasks();
Collection<String> operatingPosIds = new HashSet<>();
for (DataLog task : allTasks) {
String posId = task.getPosId();
if (!Strings.isNullOrEmpty(posId)) {
operatingPosIds.add(task.getPosId());
}
}
return operatingPosIds;
}
public DataLog newTask(StoragePos pos) {
DataLog task = new DataLog();
Barcode barcode = pos.getBarcode();
if (barcode != null) {
task.setPartNumber(barcode.getPartNumber());
task.setBarcode(barcode.getBarcode());
task.setNum(barcode.getAmount());
task.setMemo(barcode.getMemo());
}
Storage storage = dataCache.getStorageById(pos.getStorageId());
task.setCid(storage.getCid());
task.setStorageId(storage.getId());
task.setStorageName(storage.getName());
task.setPosId(pos.getId());
task.setPosName(pos.getPosName());
return task;
}
} }
...@@ -13,6 +13,7 @@ import com.neotel.smfcore.common.utils.FileUtil; ...@@ -13,6 +13,7 @@ import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.QueryHelp; import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.SecurityUtils; import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.core.order.LiteOrderCache; import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.rest.bean.dto.OrderDto; import com.neotel.smfcore.core.order.rest.bean.dto.OrderDto;
import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderMapper; import com.neotel.smfcore.core.order.rest.bean.mapstruct.OrderMapper;
import com.neotel.smfcore.core.order.rest.bean.query.OrderQueryCondition; import com.neotel.smfcore.core.order.rest.bean.query.OrderQueryCondition;
...@@ -49,9 +50,11 @@ import org.springframework.validation.annotation.Validated; ...@@ -49,9 +50,11 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
...@@ -109,6 +112,7 @@ public class OrderController { ...@@ -109,6 +112,7 @@ public class OrderController {
LiteOrder liteOrder = new LiteOrder(localFile.getName(), liteOrderItems); LiteOrder liteOrder = new LiteOrder(localFile.getName(), liteOrderItems);
liteOrder.setSource(localFile.getAbsolutePath()); liteOrder.setSource(localFile.getAbsolutePath());
liteOrder.setStatus(LITEORDER_STATUS.NEW);
LiteOrder dbOrder = liteOrderManager.findByOrderNo(liteOrder.getOrderNo()); LiteOrder dbOrder = liteOrderManager.findByOrderNo(liteOrder.getOrderNo());
if (dbOrder == null) { if (dbOrder == null) {
log.info("新增加订单:" + liteOrder.getOrderNo()); log.info("新增加订单:" + liteOrder.getOrderNo());
...@@ -125,10 +129,18 @@ public class OrderController { ...@@ -125,10 +129,18 @@ public class OrderController {
@ApiOperation("工单出库") @ApiOperation("工单出库")
@PostMapping(value = "/out") @PostMapping(value = "/out")
@PreAuthorize("@el.check('order:out')") @PreAuthorize("@el.check('order:out')")
public ResultBean delete(@RequestBody String orderNo) { public ResultBean delete(@RequestBody Map<String,String> mapValues) {
String orderNo = mapValues.get("orderNo");
if (orderNo == null) {
throw new BadRequestException("工单号不能为空");
}
LiteOrder liteOrder = liteOrderManager.findByOrderNo(orderNo); LiteOrder liteOrder = liteOrderManager.findByOrderNo(orderNo);
ResultBean resultBean = liteOrderCache.checkOutOrder(liteOrder); if (liteOrder == null) {
return resultBean; throw new BadRequestException("未找到工单:" + orderNo);
}
// ResultBean resultBean = liteOrderCache.checkOutOrder(liteOrder);
String result = liteOrderCache.checkOutLiteOrder(orderNo, false);
return ResultBean.newOkResult(result);
} }
@ApiOperation("查询工单") @ApiOperation("查询工单")
......
package com.neotel.smfcore.core.order.rest.bean.dto; package com.neotel.smfcore.core.order.rest.bean.dto;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS; import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.springframework.data.annotation.Transient; import org.springframework.data.annotation.Transient;
...@@ -11,44 +12,61 @@ import java.util.List; ...@@ -11,44 +12,61 @@ import java.util.List;
@Getter @Getter
@Setter @Setter
public class OrderDto implements Serializable { public class OrderDto implements Serializable {
@ApiModelProperty(value = "ID")
private String id;
/** /**
* 订单号 * 订单号
*/ */
@ApiModelProperty("工单号")
private String orderNo; private String orderNo;
/** /**
* 当前任务盘数 * 当前任务盘数
*/ */
@ApiModelProperty("当前任务盘数")
private int taskReelCount = 0; private int taskReelCount = 0;
/** /**
* 当前任务已完成盘数 * 当前任务已完成盘数
*/ */
@ApiModelProperty("当前任务已完成盘数")
private int finishedReelCount = 0; private int finishedReelCount = 0;
/** /**
* 订单状态 * 订单状态
* 0=新建工单
* 1=首套料正在执行
* 2=首盘料已结束,等待出尾料
* 3=正在出尾料
* 4=尾料已完成
* 5=正在补料
* 6=补料已完成
*/ */
@ApiModelProperty("订单状态")
private int status = LITEORDER_STATUS.NEW; private int status = LITEORDER_STATUS.NEW;
/** /**
* 出库状态, 2表示已完成 * 出库状态, 2表示已完成
*/ */
@ApiModelProperty("出库状态, 2表示已完成")
private boolean closed = false; private boolean closed = false;
/** /**
* 工单来源 * 工单来源
*/ */
@ApiModelProperty("工单来源")
private String source = ""; private String source = "";
/** /**
* 任务完成时间(用于关闭页面显示) * 任务完成时间(用于关闭页面显示)
*/ */
@ApiModelProperty("任务完成时间(用于关闭页面显示)")
@Transient @Transient
private long taskFinishedTime = -1; private long taskFinishedTime = -1;
/** /**
* 套(倍)数 * 套(倍)数
*/ */
@ApiModelProperty("套(倍)数")
private float orderTimes = 1f; private float orderTimes = 1f;
} }
...@@ -31,7 +31,13 @@ public class LiteOrderManagerImpl implements ILiteOrderManager { ...@@ -31,7 +31,13 @@ public class LiteOrderManagerImpl implements ILiteOrderManager {
@Override @Override
public LiteOrder findByOrderNo(String orderNo) { public LiteOrder findByOrderNo(String orderNo) {
return liteOrderDao.findOneByCondition(new String[] {"orderNo"}, new String[] {orderNo}); LiteOrder order= liteOrderDao.findOneByCondition(new String[] {"orderNo"}, new String[] {orderNo});
if(order!=null&& order.getOrderItems()==null){
List<LiteOrderItem> items=liteOrderItemManager.findOrderItems(orderNo);
order.setOrderItems(items);
}
return order;
} }
@Override @Override
......
...@@ -205,9 +205,16 @@ public class StorageController { ...@@ -205,9 +205,16 @@ public class StorageController {
return ResultBean.newOkResult(resultMsg); return ResultBean.newOkResult(resultMsg);
} }
/**
* private int getCsvIndex(CsvReader csvReader, String titleName, String titleNameEn) {
*/ int index = csvReader.getIndex(titleName, titleNameEn);
if (index == -1) {
log.info("未包含【" + titleName + "】或【" + titleNameEn + "】列");
throw new ValidateException("必须包含[" + titleNameEn + "]列");
}
return index;
}
protected String handleStoragePos(String fileURL, String storageId) throws Exception protected String handleStoragePos(String fileURL, String storageId) throws Exception
{ {
log.info("开始更新料仓【"+storageId+"】的位置信息"); log.info("开始更新料仓【"+storageId+"】的位置信息");
...@@ -220,30 +227,15 @@ public class StorageController { ...@@ -220,30 +227,15 @@ public class StorageController {
log.error("Storage id is not exist"); log.error("Storage id is not exist");
throw new ValidateException("storage.error.notExist"); throw new ValidateException("storage.error.notExist");
} }
CsvReader csvRead = new CsvReader(fileURL); CsvReader csvRead = new CsvReader(fileURL);
csvRead.setSkipEmptyRecords(true);//忽略空行 csvRead.setSkipEmptyRecords(true);//忽略空行
csvRead.setTrimWhitespace(true);//去除空格 csvRead.setTrimWhitespace(true);//去除空格
csvRead.readHeaders(); csvRead.readHeaders();
int posIndex = csvRead.getIndex("位置","pos"); int posIndex =getCsvIndex(csvRead, "位置","pos");
if(posIndex == -1){ int priIndex = getCsvIndex(csvRead,"优先级","pri");
log.info("未包含【位置】或【pos】列"); int hIndex = getCsvIndex(csvRead,"高度","h");
throw new ValidateException("必须包含[位置]列"); int wIndex = getCsvIndex(csvRead,"宽度","w");
}
int priIndex = csvRead.getIndex("优先级","pri");
if (priIndex == -1){
log.info("未包含【优先级】或【pri】列");
throw new ValidateException("必须包含[优先级]列");
}
int hIndex = csvRead.getIndex("高度","h");
if (hIndex == -1){
log.info("未包含【高度】或【h】列");
throw new ValidateException("必须包含【高度】列");
}
int wIndex = csvRead.getIndex("宽度","w");
if (wIndex == -1){
log.info("未包含【宽度】或【w】列");
throw new ValidateException("必须包含【宽度】列");
}
int row = 1; int row = 1;
int newRowCount = 0; int newRowCount = 0;
...@@ -263,6 +255,7 @@ public class StorageController { ...@@ -263,6 +255,7 @@ public class StorageController {
if(posInfo == null){ if(posInfo == null){
posInfo = new StoragePos(); posInfo = new StoragePos();
posInfo.setPosName(posName); posInfo.setPosName(posName);
posInfo.setStorageId(storageId);
newRowCount++; newRowCount++;
}else{ }else{
updateRowCount++; updateRowCount++;
......
package com.neotel.smfcore.core.storage.rest; package com.neotel.smfcore.core.storage.rest;
import com.google.common.base.Strings;
import com.neotel.smfcore.common.bean.PageData; import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.BadRequestException; import com.neotel.smfcore.common.exception.BadRequestException;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.QueryHelp; import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.StorageConstants;
import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.storage.rest.dto.CheckOutDto;
import com.neotel.smfcore.core.storage.rest.dto.StoragePosDto; import com.neotel.smfcore.core.storage.rest.dto.StoragePosDto;
import com.neotel.smfcore.core.storage.rest.dto.StoragePosEnabledDto; import com.neotel.smfcore.core.storage.rest.dto.StoragePosEnabledDto;
import com.neotel.smfcore.core.storage.rest.dto.StoragePosSaveDto; import com.neotel.smfcore.core.storage.rest.dto.StoragePosSaveDto;
import com.neotel.smfcore.core.storage.rest.mapstruct.StoragePosMapper; import com.neotel.smfcore.core.storage.rest.mapstruct.StoragePosMapper;
import com.neotel.smfcore.core.storage.rest.query.StoragePosFindCriteria;
import com.neotel.smfcore.core.storage.rest.query.StoragePosQueryCriteria; import com.neotel.smfcore.core.storage.rest.query.StoragePosQueryCriteria;
import com.neotel.smfcore.core.storage.service.dao.IStoragePosDao; import com.neotel.smfcore.core.storage.service.dao.IStoragePosDao;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager; 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.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos; import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
...@@ -20,6 +28,7 @@ import lombok.RequiredArgsConstructor; ...@@ -20,6 +28,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
...@@ -27,9 +36,9 @@ import org.springframework.security.access.prepost.PreAuthorize; ...@@ -27,9 +36,9 @@ import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.ArrayList; import javax.servlet.http.HttpServletRequest;
import java.util.List; import java.util.*;
import java.util.Set; import java.util.regex.Pattern;
@Slf4j @Slf4j
@RestController @RestController
...@@ -46,6 +55,9 @@ public class StoragePosController { ...@@ -46,6 +55,9 @@ public class StoragePosController {
private final StoragePosMapper storagePosMapper; private final StoragePosMapper storagePosMapper;
@Autowired @Autowired
private DataCache dataCache; private DataCache dataCache;
@Autowired
private TaskService taskService;
@ApiOperation("查询库位") @ApiOperation("查询库位")
...@@ -144,4 +156,71 @@ public class StoragePosController { ...@@ -144,4 +156,71 @@ public class StoragePosController {
storagePosManager.deletePoss(ids); storagePosManager.deletePoss(ids);
return new ResponseEntity<>(HttpStatus.OK); return new ResponseEntity<>(HttpStatus.OK);
} }
@ApiOperation("查找出库列表")
@GetMapping("/find")
@PreAuthorize("@el.check('storage:list')")
public PageData<StoragePosDto> storagePosFind(StoragePosFindCriteria criteria, Pageable pageable,HttpServletRequest request){
Query query= QueryHelp.getQuery(criteria);
Criteria baseCriteria= Criteria.where("used").is(true);
int componentType = criteria.getType();
String name="";
if(componentType != -1){
int type = componentType;
request.setAttribute("type", componentType);
if(componentType == 41){//锡膏夹具
type = COMPONENT_TYPE.FIXTURE;
name = StorageConstants.PACKAGE_TYPE.SOLDER_FIXTURE.getCode();
}else if(componentType == 42){//PCB夹具
type = COMPONENT_TYPE.FIXTURE;
name = StorageConstants.PACKAGE_TYPE.PCB_FIXTURE.getCode();
}
baseCriteria.and("barcode.type").is(type);
}
String expire = criteria.getExpire();
if(!Strings.isNullOrEmpty(expire)){
if("solder".equalsIgnoreCase(expire)){
baseCriteria.and("barcode.expTime").lte(new Date());
}else if("pcb".equalsIgnoreCase(expire)){
baseCriteria.and("barcode.expireDate").lte(new Date());
}
request.setAttribute("expire",expire);
}
query.addCriteria(baseCriteria);
PageData<StoragePos> pages=storagePosManager.findByPage(query,pageable);
List<StoragePosDto> StoragePosDtos=storagePosMapper.toDto(pages.getContent());
return new PageData(StoragePosDtos,pages.getTotalElements());
}
@ApiOperation("查找出库")
@PutMapping("/checkout")
public ResponseEntity<Object> checkout(@Validated @RequestBody CheckOutDto checkOutDto) {
String isSingleOutStr = checkOutDto.getSingleOut();
boolean isSingleOut = Boolean.valueOf(isSingleOutStr);
String pids = checkOutDto.getPids();
for (String pid : pids.split(";")) {
StoragePos pos = storagePosManager.get(pid);
if (pos == null) {
throw new BadRequestException("位置[" + pid + "]不存在");
}
Storage storage = dataCache.getStorageById(pos.getStorageId());
if (storage == null) {
throw new BadRequestException("料仓[" + pos.getStorageId() + "]不存在");
}
log.info("出库料仓【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】");
String outResult = taskService.checkout(storage, pos, isSingleOut);
if (!Strings.isNullOrEmpty(outResult)) {
throw new BadRequestException(outResult);
}
}
return new ResponseEntity<>(HttpStatus.OK);
}
} }
package com.neotel.smfcore.core.storage.rest.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class CheckOutDto {
@ApiModelProperty("库位号,多个用;分隔")
private String pids;
@ApiModelProperty("是否是单盘出库")
private String singleOut;
}
package com.neotel.smfcore.core.storage.rest.dto; package com.neotel.smfcore.core.storage.rest.dto;
import com.neotel.smfcore.core.barcode.rest.bean.dto.BarcodeDto;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Getter; import lombok.Getter;
...@@ -18,7 +19,7 @@ public class StoragePosDto implements Serializable { ...@@ -18,7 +19,7 @@ public class StoragePosDto implements Serializable {
private String storageId; private String storageId;
@ApiModelProperty("条码") @ApiModelProperty("条码")
private Barcode barcode; private BarcodeDto barcode;
@ApiModelProperty("库位号") @ApiModelProperty("库位号")
private String posName; private String posName;
......
package com.neotel.smfcore.core.storage.rest.query;
import com.neotel.smfcore.common.annotation.QueryCondition;
import com.neotel.smfcore.common.bean.BetweenData;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
public class StoragePosFindCriteria {
@QueryCondition(blurry = "barcode,posName")
private String blurry;
@QueryCondition(type = QueryCondition.Type.BETWEEN, propName = "updateDate")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private BetweenData<Date> createDate;
@QueryCondition
@ApiModelProperty("料仓ID")
private String storageId;
@QueryCondition(propName = "barcode.barcode")
@ApiModelProperty("条码")
private String barcode;
@QueryCondition
@ApiModelProperty("库位号")
private String posName;
@ApiModelProperty("类型")
private int type =-1 ;
@ApiModelProperty("是否过期")
private String expire;
@QueryCondition(blurry = "barcode.providerNumber" )
private String providerNumber;
@QueryCondition(blurry = "barcode.partNumber")
private String partNumber;
@QueryCondition(blurry = "barcode.memo")
private String memo;
@QueryCondition(propName = "barcode.lockId")
private String lockId;
@QueryCondition(blurry = "barcode.batch")
private String batch;
@QueryCondition(blurry = "barcode.provider")
private String provider;
@QueryCondition(blurry = "barcode.otherField1")
private String otherField1;
@QueryCondition(blurry = "barcode.otherField2")
private String otherField2;
@QueryCondition(blurry = "barcode.otherField3")
private String otherField3;
@QueryCondition(blurry = "barcode.otherField4")
private String otherField4;
@QueryCondition(blurry = "barcode.otherField5")
private String otherField5;
}
...@@ -132,7 +132,10 @@ public class OnlineUserService { ...@@ -132,7 +132,10 @@ public class OnlineUserService {
public OnlineUserDto getOne(String key) { public OnlineUserDto getOne(String key) {
OnlineUserDto dto = null; OnlineUserDto dto = null;
dto = (OnlineUserDto) onlineUserMap.get(key); dto = (OnlineUserDto) onlineUserMap.get(key);
if(dto==null) {
//已过期抛异常
throw new ExpiredJwtException(null, null, "token 已过期, 未找到用户信息");
}
Date currTime = new Date(); Date currTime = new Date();
int result = dto.getExpiresTime().compareTo(new Date()); int result = dto.getExpiresTime().compareTo(new Date());
if (result > 0) { if (result > 0) {
...@@ -144,7 +147,7 @@ public class OnlineUserService { ...@@ -144,7 +147,7 @@ public class OnlineUserService {
} else if (result < 0) { } else if (result < 0) {
this.kickOut(key); this.kickOut(key);
//已过期抛异常 //已过期抛异常
throw new ExpiredJwtException(null, null, "token 已过期"); throw new ExpiredJwtException(null, null, "token 已过期,过期时间:"+dto.getExpiresTime());
} }
return dto; return dto;
} }
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!