Commit 46b5db7a LN

料仓管理和库位管理修改

1 个父辈 19bbb964
...@@ -172,7 +172,7 @@ public class DataInitManager { ...@@ -172,7 +172,7 @@ public class DataInitManager {
List<Menu> menus = new ArrayList<Menu>(); List<Menu> menus = new ArrayList<Menu>();
//料架分组 //料架分组
Menu menukanban = new Menu(new ArrayList<Menu>(), 1, "boxkanban", "锁定物料", 1, "lockMaterial", "lockMaterial/material/index", "", 0, "app"); Menu menukanban = new Menu(new ArrayList<Menu>(), 1, "boxkanban", "设备看板", 1, "lockMaterial", "lockMaterial/material/index", "", 0, "app");
// menukanban.setHidden(true); // menukanban.setHidden(true);
menus.addAll(createMenus(menukanban)); menus.addAll(createMenus(menukanban));
//料架分组 //料架分组
......
...@@ -201,4 +201,9 @@ public class BarcodeDto implements Serializable { ...@@ -201,4 +201,9 @@ public class BarcodeDto implements Serializable {
private String fullCode; private String fullCode;
public String getSize(){
return (""+plateSize+"X"+height);
}
} }
...@@ -277,7 +277,12 @@ public class DataCache { ...@@ -277,7 +277,12 @@ public class DataCache {
return null; return null;
} }
public Storage reloadStorage(Storage storage) throws ValidateException { public Storage reloadStorage(Storage storage,String oldCid) throws ValidateException {
if (!oldCid.equals("") && allStorage.containsKey(oldCid)) {
allStorage.remove(oldCid);
}
List<PlateSizeBean> plateSizeBeanList = storagePosManager.getStoragePosUsage(storage.getId()); List<PlateSizeBean> plateSizeBeanList = storagePosManager.getStoragePosUsage(storage.getId());
storage.initUsage(plateSizeBeanList); storage.initUsage(plateSizeBeanList);
storage = storageManager.save(storage); storage = storageManager.save(storage);
......
...@@ -10,7 +10,9 @@ import com.neotel.smfcore.common.utils.PointUtil; ...@@ -10,7 +10,9 @@ import com.neotel.smfcore.common.utils.PointUtil;
import com.neotel.smfcore.common.utils.QueryHelp; import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.storage.rest.dto.StorageDto; import com.neotel.smfcore.core.storage.rest.dto.StorageDto;
import com.neotel.smfcore.core.storage.rest.dto.StorageSearchDto;
import com.neotel.smfcore.core.storage.rest.mapstruct.StorageMapper; import com.neotel.smfcore.core.storage.rest.mapstruct.StorageMapper;
import com.neotel.smfcore.core.storage.rest.mapstruct.StorageSearchMapper;
import com.neotel.smfcore.core.storage.rest.query.StorageQueryCriteria; import com.neotel.smfcore.core.storage.rest.query.StorageQueryCriteria;
import com.neotel.smfcore.core.storage.service.dao.IStorageDao; import com.neotel.smfcore.core.storage.service.dao.IStorageDao;
import com.neotel.smfcore.core.storage.service.manager.IStorageManager; import com.neotel.smfcore.core.storage.service.manager.IStorageManager;
...@@ -19,6 +21,7 @@ import com.neotel.smfcore.core.storage.service.po.Storage; ...@@ -19,6 +21,7 @@ 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.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.security.bean.FileProperties; import com.neotel.smfcore.security.bean.FileProperties;
import com.neotel.smfcore.security.rest.bean.dto.RoleDto;
import com.neotel.smfcore.security.service.manager.IGroupManager; import com.neotel.smfcore.security.service.manager.IGroupManager;
import com.neotel.smfcore.security.service.po.Group; import com.neotel.smfcore.security.service.po.Group;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
...@@ -68,6 +71,9 @@ public class StorageController { ...@@ -68,6 +71,9 @@ public class StorageController {
@Autowired @Autowired
private final DataCache dataCache; private final DataCache dataCache;
@Autowired
private final StorageSearchMapper storageSearchMapper;
@ApiOperation("查询料仓") @ApiOperation("查询料仓")
@GetMapping @GetMapping
...@@ -88,6 +94,15 @@ public class StorageController { ...@@ -88,6 +94,15 @@ public class StorageController {
} }
return new PageData(StorageDtos,pages.getTotalElements()); return new PageData(StorageDtos,pages.getTotalElements());
} }
@ApiOperation("返回所有料仓")
@GetMapping(value = "/all")
@PreAuthorize("@el.check('storage:list')")
public List<StorageSearchDto> query() {
List<Storage> allStorages = storageManager.findAll();
List<StorageSearchDto> storageSearchDtos = storageSearchMapper.toDto(allStorages);
return storageSearchDtos;
}
@ApiOperation("新增料仓") @ApiOperation("新增料仓")
@PostMapping @PostMapping
@PreAuthorize("@el.check('storage:add')") @PreAuthorize("@el.check('storage:add')")
...@@ -167,7 +182,7 @@ public class StorageController { ...@@ -167,7 +182,7 @@ public class StorageController {
throw new ValidateException("smfcode.valueCanotNull","{0}不能为空",new String[]{"compatibleType"} ); throw new ValidateException("smfcode.valueCanotNull","{0}不能为空",new String[]{"compatibleType"} );
// throw new BadRequestException("料仓兼容性不能为空"); // throw new BadRequestException("料仓兼容性不能为空");
} }
String oldCid="";
boolean isNew=(storage.getId()==null); boolean isNew=(storage.getId()==null);
//判断名称是否重复,cid是否重复 //判断名称是否重复,cid是否重复
Map<String, Storage> storageMap=dataCache.getAllStorage(); Map<String, Storage> storageMap=dataCache.getAllStorage();
...@@ -183,6 +198,9 @@ public class StorageController { ...@@ -183,6 +198,9 @@ public class StorageController {
// throw new BadRequestException("料仓cid["+storage.getCid()+"]已存在"); // throw new BadRequestException("料仓cid["+storage.getCid()+"]已存在");
} }
} }
else if((!isNew)&&storage.getId().equals(s.getId())){
oldCid=s.getCid();
}
} }
if(storage.getSourcePath()==null){ if(storage.getSourcePath()==null){
...@@ -194,7 +212,7 @@ public class StorageController { ...@@ -194,7 +212,7 @@ public class StorageController {
storage= storageDao.save(storage); storage= storageDao.save(storage);
dataCache.reloadStorage(storage); dataCache.reloadStorage(storage,oldCid);
return storage; return storage;
} }
...@@ -313,7 +331,7 @@ public class StorageController { ...@@ -313,7 +331,7 @@ public class StorageController {
if(newList.size()>0){ if(newList.size()>0){
storagePosManager.insertAll(newList); storagePosManager.insertAll(newList);
} }
dataCache.reloadStorage(storage); dataCache.reloadStorage(storage,"");
String msg = "读取到["+row+"]行数据:新增【"+newRowCount+"】,已存在【"+existRowCount+"】,更新【" +updateRowCount +"】"; String msg = "读取到["+row+"]行数据:新增【"+newRowCount+"】,已存在【"+existRowCount+"】,更新【" +updateRowCount +"】";
log.info(msg); log.info(msg);
return msg; return msg;
......
...@@ -6,6 +6,7 @@ import com.neotel.smfcore.common.bean.ResultBean; ...@@ -6,6 +6,7 @@ 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.common.utils.Constants;
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.StorageConstants; import com.neotel.smfcore.common.utils.StorageConstants;
import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE; import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE;
import com.neotel.smfcore.core.barcode.rest.bean.dto.CodeDto; import com.neotel.smfcore.core.barcode.rest.bean.dto.CodeDto;
...@@ -101,15 +102,37 @@ public class StoragePosController { ...@@ -101,15 +102,37 @@ public class StoragePosController {
@ApiOperation("清空指定库位") @ApiOperation("清空指定库位")
@PutMapping("/clearPos") @PutMapping("/clearPos")
@PreAuthorize("@el.check('storage:edit')") @PreAuthorize("@el.check('storage:edit')")
public ResponseEntity<Object> clearPos(@RequestBody String posName) { public ResultBean clearPos(@RequestBody HashMap<String,String> map) {
log.info("开始手动清空库位:["+posName+"] "); if (map.containsKey("posName")) {
return new ResponseEntity<>(HttpStatus.OK); String posName = map.get("posName");
StoragePos storagePos = storagePosManager.getByPosName(posName);
if (storagePos != null) {
try {
log.info("开始手动清空库位[" + storagePos.getPosName() + "]");
// QisdaApi.ClearStockBy(storagePos.getPosName());
Barcode barcode = storagePos.getBarcode();
if (barcode != null) {
log.info("清理库位[" + storagePos.getPosName() + "]中的库存" + barcode.getBarcode());
String opUser = SecurityUtils.getCurrentUsername();
log.info(opUser + "清理库位[" + storagePos.getPosName() + "]中的库存" + barcode.getBarcode());
taskService.addTaskToFinished(storagePos, null, opUser + "-clear");
}
return ResultBean.newOkResult("");
} catch (Exception e) {
// return e.getMessage();
throw new ValidateException("smfcore.error","出错{0}",new String[]{ e.toString()});
}
}
}
throw new ValidateException("smfcore.posNotExist", "仓位不存在");
} }
@ApiOperation("启用禁用库位") @ApiOperation("启用禁用库位")
@PutMapping("/enabledPos") @PutMapping("/enabledPos")
@PreAuthorize("@el.check('storage:edit')") @PreAuthorize("@el.check('storage:edit')")
public ResponseEntity<Object> enabledPos(@RequestBody StoragePosEnabledDto enabledDto) { public ResultBean enabledPos(@RequestBody StoragePosEnabledDto enabledDto) {
if(enabledDto.getId()==null){ if(enabledDto.getId()==null){
throw new ValidateException("smfcode.valueCanotNull","{0}不能为空",new String[]{"ID"} ); throw new ValidateException("smfcode.valueCanotNull","{0}不能为空",new String[]{"ID"} );
} }
...@@ -121,7 +144,8 @@ public class StoragePosController { ...@@ -121,7 +144,8 @@ public class StoragePosController {
pos.setEnabled(enabledDto.isEnabled()); pos.setEnabled(enabledDto.isEnabled());
storagePosDao.save(pos); storagePosDao.save(pos);
log.info("启用禁用库位:库位号["+pos.getId()+"]["+pos.getPosName()+"]="+enabledDto.isEnabled()); log.info("启用禁用库位:库位号["+pos.getId()+"]["+pos.getPosName()+"]="+enabledDto.isEnabled());
return new ResponseEntity<>(HttpStatus.OK);
return ResultBean.newOkResult("");
} }
......
package com.neotel.smfcore.core.storage.rest.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@Getter
@Setter
public class StorageSearchDto implements Serializable {
@ApiModelProperty("料仓ID")
private String id;
@ApiModelProperty("料仓名称")
private String name;
@ApiModelProperty("料仓CID")
private String cid;
}
package com.neotel.smfcore.core.storage.rest.mapstruct;
import com.neotel.smfcore.common.base.BaseMapper;
import com.neotel.smfcore.core.storage.rest.dto.StorageSearchDto;
import com.neotel.smfcore.core.storage.service.po.Storage;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface StorageSearchMapper extends BaseMapper<StorageSearchDto, Storage> {
}
...@@ -692,4 +692,169 @@ public class TaskService { ...@@ -692,4 +692,169 @@ public class TaskService {
barcodeSave = barcodeManager.save(barcodeSave); barcodeSave = barcodeManager.save(barcodeSave);
return barcodeSave; return barcodeSave;
} }
public void addTaskToFinished(StoragePos pos, Barcode barcode, String opUser){
try{
Collection<DataLog> allTasks = taskMap.values();
if(pos.getBarcode() != null){
barcode = pos.getBarcode();
for(DataLog task : allTasks){
if(task.isCheckOutTask()){
String executeBarcode = task.getBarcode();
String executePosId = task.getPosId();
boolean isSameTask = false;
if(executeBarcode != null && barcode.getBarcode().equals(executeBarcode)){
isSameTask = true;
}
if(executePosId != null && pos.getId().equals(executePosId)){
isSameTask = true;
}
if(isSameTask){
log.info(executeBarcode + "找到正在执行的出库任务["+pos.getPosName()+"],直接完成");
if(task.isWait()){
taskMap.put(task.getId(),task);
}
task.setOperator(opUser);
checkoutFinished(task);
return;
}
}
}
}
//没有正在执行的任务,直接添加一条已完成的任务
DataLog task = newTask(pos);
if(pos.getBarcode() == null){
log.info(opUser + "入库【"+barcode.getBarcode()+"】到【"+pos.getPosName()+"】");
task.setType(OP.PUT_IN);
barcode.setUsedCount(barcode.getUsedCount() + 1);
barcode.setUsedDate(new Date());
barcode.setPutInTime(System.currentTimeMillis());
barcode.setInOpor(opUser);
barcode.setCheckOutDate(null,"");
barcode.setPosName(task.getPosName());
barcodeManager.save(barcode);
pos.setBarcode(barcode);
pos.setUsed(true);
pos.setCanCheckOutTime(System.currentTimeMillis());
storagePosManager.save(pos);
task.setPartNumber(barcode.getPartNumber());
task.setBarcode(barcode.getBarcode());
task.setNum(barcode.getInitialAmount());
dataCache.updateInventory(pos,barcode);
//dataCache.updateStorage(task.getCid());
}else{
barcode = pos.getBarcode();
log.info(opUser + "将【"+barcode.getBarcode()+"】从【"+pos.getPosName()+"】出库");
task.setType(OP.CHECKOUT);
barcode.setUsed(true);
barcode.setUsedDate(new Date());
//仓位状态
barcode.setCheckOutDate(new Date(),task.getOperator());
barcode.setPosName("");
barcodeManager.save(barcode);
pos.setBarcode(null);
pos.setUsed(false);
storagePosManager.save(pos);
dataCache.updateInventory(pos, barcode);
//dataCache.updateStorage(task.getCid());
}
task.setOperator(opUser);
task.setStatus(OP_STATUS.FINISHED.name());
task = dataLogDao.save(task);
theFinishedTaskMap.put(task.getBarcode(),task);
}catch (Exception e){
log.error("addTaskToFinished Error:",e);
}
}
/**
* 出库完成
*/
public void checkoutFinished(DataLog task) throws ValidateException {
boolean isCancelTask = task.isCancel();
StoragePos storagePos = storagePosManager.get(task.getPosId());
Barcode barcode = storagePos.getBarcode();
if(barcode == null){
//记录日志
task.setStatus(OP_STATUS.CANCEL.name());
taskMap.remove(task.getId());
theFinishedTaskMap.put(task.getBarcode(),task);
log.warn("任务:"+task.getBarcode() +" 仓位:"+task.getPosName()+" 的 Barcode 为null, 之前可能处理过直接返回");
return;
}
//记录在库时长
task.setInStoreTime(barcode.getInStoreMiniute());
barcode = barcodeManager.get(barcode.getId());
if(barcode != null){
//二维码状态
barcode.setUsed(true);
barcode.setUsedDate(new Date());
//仓位状态
barcode.setCheckOutDate(new Date(),task.getOperator());
barcode.setPosName("");
barcodeManager.save(barcode);
String specifiedBatchId = barcode.getLockId();
if(!Strings.isNullOrEmpty(specifiedBatchId)){
task.setBatchId(specifiedBatchId);
task.setBatchInfo(barcode.getLockName());
}
}
storagePos.setBarcode(null);
storagePos.setUsed(false);
storagePosManager.save(storagePos);
log.info(task.getBarcode() + "出库完成,清空仓位: " + storagePos.getId() + "[" + storagePos.getPosName() + "]");
//更新缓存中的库存信息
dataCache.updateInventory(storagePos,barcode);
//记录日志
task.setStatus(OP_STATUS.FINISHED.name());
if(isCancelTask){
task.setStatus(OP_STATUS.CANCEL.name());
}
dataLogDao.save(task);
//从队列里面移除操作
DataLog removeTask = taskMap.remove(task.getId());
try{
if(removeTask == null){
log.error(task.getBarcode()+"的出库任务["+task.getId()+"]清除失败");
}
}catch (Exception e){
log.error(e.getMessage());
}
theFinishedTaskMap.put(task.getBarcode(),task);
// //任务已经被取消就不再更新需求单信息
// if(!isCancelTask){
// updateOutInfo(outItemId, task, barcode);
// }else{
// log.info(task.getBarcode()+"的出库任务["+task.getId()+"]已被取消,仅清除Qisda库存["+task.getPosName()+"],不再更新需求单信息");
// QisdaApi.ClearStockBy(task.getPosName());
// }
}
} }
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!