Commit 00b067af LN

工单虚拟回仓功能

1 个父辈 d09ac086
......@@ -91,6 +91,18 @@ public class LiteOrderCache implements ITaskListener {
liteOrderMap.put(order.getOrderNo(), order);
}
// public LiteOrder getOrder(String orderNo){
// LiteOrder order = liteOrderMap.get(orderNo);
//
// if (order == null) {
// order = liteOrderManager.findByOrderNo(orderNo);
// if(order!=null){
// addOrderToMap(order);
// }
// }
// return order;
// }
private boolean isProcessTimer = false;
public void runTimer(){
......
......@@ -7,6 +7,12 @@ import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.*;
import com.neotel.smfcore.core.barcode.bean.CodeBean;
import com.neotel.smfcore.core.barcode.rest.bean.dto.BarcodeDto;
import com.neotel.smfcore.core.barcode.rest.bean.mapstruct.BarcodeMapper;
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.order.LiteOrderCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.rest.bean.dto.OrderDto;
......@@ -18,26 +24,17 @@ 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.order.util.OrderFileWatch;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.bean.OrderSetting;
import com.neotel.smfcore.core.system.rest.bean.dto.TaskDto;
import com.neotel.smfcore.core.system.rest.bean.mapstruct.TaskMapper;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.security.bean.FileProperties;
import com.neotel.smfcore.security.rest.bean.vo.UserPassVo;
import com.neotel.smfcore.security.service.manager.IGroupManager;
import com.neotel.smfcore.security.service.manager.IRoleManager;
import com.neotel.smfcore.security.service.manager.IUserManager;
import com.neotel.smfcore.security.service.po.Group;
import com.neotel.smfcore.security.service.po.Role;
import com.neotel.smfcore.security.service.po.User;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javafx.concurrent.Task;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Criteria;
......@@ -92,6 +89,18 @@ public class OrderController {
@Autowired
private OrderFileWatch orderFileWatch;
@Autowired
private BarcodeMapper barcodeMapper;
@Autowired
private CodeResolve codeResolve;
@Autowired
IBarcodeManager barcodeManager;
@Autowired
TaskService taskService;
// @ApiOperation("导出用户数据")
// @GetMapping(value = "/download")
// @PreAuthorize("@el.check('user:list')")
......@@ -106,20 +115,20 @@ public class OrderController {
String image = "csv";
String fileType = FileUtil.getExtensionName(orderFile.getOriginalFilename());
String fileName= FileUtil.getFileNameNoEx(orderFile.getOriginalFilename());
String fileName = FileUtil.getFileNameNoEx(orderFile.getOriginalFilename());
if (fileType != null && !image.contains(fileType)) {
throw new ValidateException("smfcore.feleFormatError", "文件格式错误!, 仅支持{0}格式", new String[]{image});
}
File folder = new File(properties.getPath(), "pos");
File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath());
Map<String, List<LiteOrderItem>> itemMap = orderFileWatch.readCsvFile(fileName,localFile.getAbsolutePath());
Map<String, List<LiteOrderItem>> itemMap = orderFileWatch.readCsvFile(fileName, localFile.getAbsolutePath());
if (itemMap == null || itemMap.size() <= 0) {
throw new ValidateException("smfcore.fileError", "文件解析失败");
}
for (String so:itemMap.keySet()
) {
for (String so : itemMap.keySet()
) {
List<LiteOrderItem> liteOrderItems = itemMap.get(so);
if (liteOrderItems.size() <= 0) {
......@@ -146,7 +155,7 @@ public class OrderController {
liteOrderCache.addOrderToMap(liteOrder);
}
return ResultBean.newOkResult("smfcore.order.uploadOK","工单上传成功","");
return ResultBean.newOkResult("smfcore.order.uploadOK", "工单上传成功", "");
}
@ApiOperation("工单出库")
......@@ -161,11 +170,11 @@ public class OrderController {
if (liteOrder == null) {
throw new ValidateException("smfcore.valueNotFind", "未找到{0}[{1}]", new String[]{"orderNo", orderNo});
}
String result= liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(),false);
if(ObjectUtil.isEmpty(result)){
String result = liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(), false);
if (ObjectUtil.isEmpty(result)) {
return ResultBean.newOkResult(result);
}else{
return ResultBean.newErrorResult(-1,result,result);
} else {
return ResultBean.newErrorResult(-1, result, result);
}
}
......@@ -178,11 +187,11 @@ public class OrderController {
if (orderNo == null) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
}
String result= liteOrderCache.checkOutLiteOrder(orderNo,true);
if(ObjectUtil.isEmpty(result)){
String result = liteOrderCache.checkOutLiteOrder(orderNo, true);
if (ObjectUtil.isEmpty(result)) {
return ResultBean.newOkResult(result);
}else{
return ResultBean.newErrorResult(-1,result,result);
} else {
return ResultBean.newErrorResult(-1, result, result);
}
}
......@@ -196,11 +205,11 @@ public class OrderController {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
}
String result= liteOrderCache.checkOutLiteOrder(orderNo,false);
if(ObjectUtil.isEmpty(result)){
String result = liteOrderCache.checkOutLiteOrder(orderNo, false);
if (ObjectUtil.isEmpty(result)) {
return ResultBean.newOkResult(result);
}else{
return ResultBean.newErrorResult(-1,result,result);
} else {
return ResultBean.newErrorResult(-1, result, result);
}
}
......@@ -213,11 +222,11 @@ public class OrderController {
if (orderNo == null) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
}
String result= liteOrderCache.orderItemSupplementOut(orderNo,orderItemId);
if(ObjectUtil.isEmpty(result)){
String result = liteOrderCache.orderItemSupplementOut(orderNo, orderItemId);
if (ObjectUtil.isEmpty(result)) {
return ResultBean.newOkResult(result);
}else{
return ResultBean.newErrorResult(-1,result,result);
} else {
return ResultBean.newErrorResult(-1, result, result);
}
}
......@@ -231,10 +240,10 @@ public class OrderController {
if (!user.getIsAdmin()) {
Set<String> groupIds = user.getGroups();
List<String> excludeSources = Lists.newArrayList();
List<Group> groups=groupManager.findAll();
List<Group> groups = groupManager.findAll();
for (Group group :
groups) {
if(groupIds.contains(group.getId())){
if (groupIds.contains(group.getId())) {
continue;
}
excludeSources.add(group.getGroupName());
......@@ -256,7 +265,7 @@ public class OrderController {
}
}
PageData<LiteOrder> orderList = liteOrderManager.findByPage(query, pageable);
PageData<OrderDto> resultList=orderMapper.toDto(orderList);
PageData<OrderDto> resultList = orderMapper.toDto(orderList);
return resultList;
}
......@@ -272,14 +281,14 @@ public class OrderController {
if (!ObjectUtils.isEmpty(id)) {
LiteOrder liteOrder = liteOrderManager.get(id);
if (liteOrder != null) {
OrderDto dto= orderMapper.toDto(liteOrder);
OrderDto dto = orderMapper.toDto(liteOrder);
dto.setOrderItems(orderItemMapper.toDto(liteOrder.getOrderItems()));
return dto;
}
} else if (!ObjectUtils.isEmpty(orderNo)) {
LiteOrder liteOrder = liteOrderManager.findByOrderNo(orderNo);
if (liteOrder != null) {
OrderDto dto= orderMapper.toDto(liteOrder);
OrderDto dto = orderMapper.toDto(liteOrder);
dto.setOrderItems(orderItemMapper.toDto(liteOrder.getOrderItems()));
return dto;
}
......@@ -294,7 +303,7 @@ public class OrderController {
@PreAuthorize("@el.check('workOrder')")
public ResultBean updateNum(@RequestBody OrderDto param) {
String orderNo = param.getOrderNo();
float orderTimes= param.getOrderTimes();
float orderTimes = param.getOrderTimes();
if (orderNo == null) {
// throw new ValidateException("工单号不能为空");
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
......@@ -303,16 +312,16 @@ public class OrderController {
if (liteOrder == null) {
throw new ValidateException("smfcore.valueNotFind", "未找到{0}[{1}]", new String[]{"orderNo", orderNo});
}
if(!liteOrder.isNew()){
throw new ValidateException("smfcore.cannotUpdateOrderNum", "工单已出库,不能修改数量" );
if (!liteOrder.isNew()) {
throw new ValidateException("smfcore.cannotUpdateOrderNum", "工单已出库,不能修改数量");
}
if(orderTimes<1){
orderTimes=1;
if (orderTimes < 1) {
orderTimes = 1;
}
liteOrder.setOrderTimes(orderTimes);
liteOrderManager.save(liteOrder );
liteOrderManager.save(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
return ResultBean.newOkResult(orderMapper.toDto(liteOrder) );
return ResultBean.newOkResult(orderMapper.toDto(liteOrder));
}
@ApiOperation("关闭工单")
......@@ -324,11 +333,11 @@ public class OrderController {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
}
String result=liteOrderCache.closeOrder(orderNo);
if(ObjectUtil.isEmpty(result)){
return ResultBean.newOkResult(result, result,result);
}else{
return ResultBean.newErrorResult(-1,result,result);
String result = liteOrderCache.closeOrder(orderNo);
if (ObjectUtil.isEmpty(result)) {
return ResultBean.newOkResult(result, result, result);
} else {
return ResultBean.newErrorResult(-1, result, result);
}
}
......@@ -358,83 +367,117 @@ public class OrderController {
return ResultBean.newOkResult(orderMapper.toDto(order));
}
@ApiOperation("虚拟回仓解析条码信息")
@PostMapping(value = "/barcodeInfo")
@PreAuthorize("@el.check('materialBox')")
public BarcodeDto barcodeInfo(@RequestBody String code) {
CodeBean codeBean = new CodeBean();
try {
codeBean = codeResolve.resolveSingleCode(code.trim());
} catch (ValidateException e) {
codeBean.setError(e.getMessage());
}
if (codeBean == null || codeBean.getBarcode() == null) {
throw new ValidateException("smfcore.error.barcode.invalid", "{0}不是有效的条码", new String[]{code});
}
if (codeBean.getErrorCode() != null) {
throw new ValidateException(codeBean.getErrorCode(), codeBean.getError(), codeBean.getParams());
}
Barcode barcode = codeBean.getBarcode();
BarcodeDto barcodeDto = barcodeMapper.toDto(barcode);
if (barcodeDto.getSubCodeList() == null) {
barcodeDto.setSubCodeList(new ArrayList<>());
}
return barcodeDto;
}
@ApiOperation("虚拟回仓发料接口")
@PostMapping(value = "/virtualOut")
@PreAuthorize("@el.check('materialBox')")
public ResultBean virtualOut(@RequestBody Map<String, String> paramsMap) {
String orderNo = paramsMap.get("orderNo");
String reelId = paramsMap.get("barcode");
Integer num = Integer.valueOf(paramsMap.get("num"));
Barcode barcode = barcodeManager.findByBarcode(reelId);
if (barcode == null) {
throw new ValidateException("smfcore.error.barcode.invalid", "{0}不是有效的条码", new String[]{reelId});
}
//判断数量是否大于条码数量
if (num > barcode.getAmount()) {
throw new ValidateException("smfcore.error.virtualOut.num", "数量不能超过{0}", new String[]{barcode.getAmount() + ""});
}
LiteOrder liteOrder = liteOrderManager.findByOrderNo(orderNo);
if (liteOrder == null) {
throw new ValidateException("smfcore.valueNotFind", "未找到{0}[{1}]", new String[]{"orderNo", orderNo});
}
if (liteOrder.isClosed()) {
throw new ValidateException("smfcore.order.hasClose", "工单[" + orderNo + "]已关闭,无法出库", new String[]{"orderNo", orderNo});
}
LiteOrderItem findItem = findVirtualItem(liteOrder,barcode,true);
if (findItem == null) {
findItem=findVirtualItem(liteOrder,barcode,false);
}
if (findItem == null) {
throw new ValidateException("smfcore.error.virtualOut.noItem", "工单{0}中未找到对应的PN或物料编号", new String[]{liteOrder.getOrderNo() + ""});
} else {
//增加一条出库完成记录
taskService.addVirtualOutToFinished(liteOrder, barcode, num, SecurityUtils.getCurrentUsername());
findItem.setOutNum(findItem.getOutNum() + num);
findItem.setTotalOutNum(findItem.getTotalOutNum() + num);
findItem.setOutReelCount(findItem.getOutReelCount() + 1);
findItem.setTotalOutReelCount(findItem.getTotalOutReelCount() + 1);
findItem.setNeedReelCount(findItem.getNeedReelCount() + 1);
liteOrderItemManager.save(findItem);
liteOrder.updateOrderItems(findItem);
//工单未关闭的话,检查状态,全部都出完进行关闭
boolean closed = true;
for (LiteOrderItem liteOrderItem : liteOrder.getOrderItems()) {
if (!liteOrderItem.isOutFinished()) {
closed = false;
break;
}
}
if (closed) {
liteOrder.setClosed(closed);
log.info("工单【" + liteOrder.getOrderNo() + "】虚拟回仓【" + barcode.getPartNumber() + "-" + barcode.getBarcode() + "】数量【" + num + "】后,所有料已出完,关闭工单");
}
liteOrderManager.save(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
}
return ResultBean.newOkResult("");
}
private LiteOrderItem findVirtualItem(LiteOrder liteOrder, Barcode barcode, boolean checkNum) {
LiteOrderItem findItem = null;
for (LiteOrderItem item :
liteOrder.getOrderItems()) {
if (checkNum && item.getTotalOutNum() >= item.getNeedNum()) {
continue;
}
//pn
if (liteOrder.getType() == 1) {
if (item.getPn().equals(barcode.getPartNumber())) {
findItem = item;
break;
}
} else if (item.getRi().equals(barcode.getBarcode())) {
findItem = item;
break;
}
}
return findItem;
}
// protected Map<String ,List<LiteOrderItem>> handleOrderCsv(String fileName,String fileURL) {
// try {
// fileName=fileName.replace(".csv","");
// log.info("开始更解析上传的工单");
// Map<String ,List<LiteOrderItem>> itemMap=new HashMap<>();
// List<LiteOrderItem> items = Lists.newArrayList();
//
// OrderSetting orderSetting = dataCache.getOrderSetting();
//
// CsvReader csvRead = CsvReader.newReader(fileURL,"PN", orderSetting.getPn());
// int partNumberIndex = csvRead.getIndex("PN", orderSetting.getPn());
// int qtyIndex = csvRead.getIndex("QTY", orderSetting.getQty());
// int feederIndex = csvRead.getIndex("FEEDER", orderSetting.getFeeder());
// int riIndex = csvRead.getIndex("RI",orderSetting.getRi());
// int soIndex = csvRead.getIndex("SO", orderSetting.getSo());
//
// int row = 1;
// int newRowCount = 0;
// int updateRowCount = 0;
//
// while (csvRead.readRecord()) {
// row++;
// String[] lineValues = csvRead.getValues();
// String partNumber = lineValues[partNumberIndex];
// String ri="";
// if(riIndex!=-1){
// ri=lineValues[riIndex];
// }
// if (partNumber.isEmpty()&&ri.isEmpty()) {
// log.warn("行[partNumber=" + partNumber + "]中PN和RI都 为空,此行忽略");
// } else {
// int num = 1;
// if (qtyIndex != -1) {
// String numStr = lineValues[qtyIndex];
// if (Strings.isNotBlank(numStr)) {
// try {
// num = Integer.valueOf(numStr);
// } catch (Exception e) {
// log.error(partNumber + "的数量:" + numStr + " 不是数字,使用1");
// }
// }
// }
// String feeder = "";
// if (feederIndex != -1) {
// feeder = lineValues[feederIndex];
// }
// String so=fileName;
//
// if(soIndex!=-1){
// so=lineValues[soIndex];
// }
// if(!ObjectUtil.isNotEmpty(so)){
// so=fileName;
// }
// LiteOrderItem item = new LiteOrderItem();
// item.setPn(partNumber);
// if(partNumber.isEmpty()){
// item.setNeedReelCount(1);
// }
// item.setNeedNum(num);
//
// item.setFeederInfo(feeder);
// item.setRi(ri);
// if(!itemMap.containsKey(so)){
// itemMap.put(so,new ArrayList<LiteOrderItem>());
// }
// itemMap.get(so).add(item);
//
//
// items.add(item);
// }
// }
// return itemMap;
// } catch (Exception ex) {
// log.error("解析上传的工单出错:" + ex.toString());
// }
// return null;
// }
}
......@@ -9,6 +9,7 @@ import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
......@@ -216,5 +217,18 @@ public class LiteOrder extends BasePo implements Serializable {
return sdate;
}
public void updateOrderItems(LiteOrderItem item) {
if (orderItems == null) {
orderItems = new ArrayList<>();
}
int size = orderItems.size();
for (int i = 0; i < size; i++) {
if (orderItems.get(i).getId().equals(item.getId())) {
orderItems.set(i, item);
return;
}
}
orderItems.add(item);
}
}
......@@ -16,19 +16,13 @@ import com.neotel.smfcore.core.device.bean.StatusBean;
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.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.enums.ORDER_COLOR;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE;
import com.neotel.smfcore.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.storage.rest.dto.TacticsOutDto;
import com.neotel.smfcore.core.storage.service.manager.IStorageManager;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.manager.impl.StorageManagerImpl;
import com.neotel.smfcore.core.storage.service.manager.impl.StoragePosManagerImpl;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.bean.MSDAppendInfo;
import com.neotel.smfcore.core.system.listener.ITaskListener;
import com.neotel.smfcore.core.system.service.dao.IDataLogDao;
import com.neotel.smfcore.core.system.service.po.DataLog;
......@@ -827,6 +821,57 @@ public class TaskService {
}
}
public void addVirtualOutToFinished( LiteOrder liteOrder, Barcode barcode,Integer num, String opUser) {
try {
Collection<DataLog> allTasks = taskMap.values();
DataLog dataLog = new DataLog();
dataLog.setPartNumber(barcode.getPartNumber());
dataLog.setBarcode(barcode.getBarcode());
dataLog.setNum(num);
dataLog.setMemo(barcode.getMemo());
dataLog.setPutInDate(barcode.getPutInDate());
MSDAppendInfo msdAppendInfo = new MSDAppendInfo();
msdAppendInfo.setMsl(barcode.getMsl());
msdAppendInfo.setOpenTime(barcode.getOpenTime());
msdAppendInfo.setThickness(barcode.getThickness());
dataLog.setMsdAppendInfo(msdAppendInfo);
dataLog.setCid("");
dataLog.setStorageId("");
dataLog.setStorageName("OutLine");
dataLog.setPosId("");
dataLog.setPosName("OutLine");
dataLog.setStatus(OP_STATUS.WAIT.name());
//操作人,工单信息
dataLog.setOperator(opUser);
dataLog.setSourceName(liteOrder.getOrderNo());
dataLog.setSourceId(liteOrder.getId());
log.info(opUser + "虚拟回仓: PN【"+barcode.getPartNumber()+"】条码【" + barcode.getBarcode() + "】 工单号【" + liteOrder.getOrderNo() + "】数量【" + num + "】");
dataLog.setType(OP.CHECKOUT);
barcode.setUsed(true);
barcode.setUsedDate(new Date());
//仓位状态
barcode.setCheckOutDate(new Date(), dataLog.getOperator());
barcode.setPosName("");
barcodeManager.save(barcode);
dataLog.setStatus(OP_STATUS.FINISHED.name());
dataLog = dataLogDao.save(dataLog);
theFinishedTaskMap.put(dataLog.getBarcode(), dataLog);
} catch (Exception e) {
log.error("addVirtualOutToFinished Error:", e);
}
}
/**
* 出库完成
*/
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!