Commit d99c1f01 LN

增加库位出库功能

1 个父辈 64849811
...@@ -226,6 +226,7 @@ public class DataInitManager { ...@@ -226,6 +226,7 @@ public class DataInitManager {
Menu celueOut = new Menu(new ArrayList<Menu>(), 1, "tacticsOuput", "PN出库", 1, "tacticsOuput", "neolight/tacticsOuput/index", "", 0, "tacticsOuput"); Menu celueOut = new Menu(new ArrayList<Menu>(), 1, "tacticsOuput", "PN出库", 1, "tacticsOuput", "neolight/tacticsOuput/index", "", 0, "tacticsOuput");
out.setChildren(Arrays.asList((new Menu[]{menuOut,celueOut}))); out.setChildren(Arrays.asList((new Menu[]{menuOut,celueOut})));
Menu posOut = new Menu(new ArrayList<Menu>(), 1, "posOutput", "库位出库", 1, "posOutput", "system/posOutput/index", "", 0, "swagger");
Menu groupOut = new Menu(new ArrayList<Menu>(), 1, "labelOuput", "物料标签", 1, "labelOuput", "neolight/labelOuput/index", "", 0, "mgroup"); Menu groupOut = new Menu(new ArrayList<Menu>(), 1, "labelOuput", "物料标签", 1, "labelOuput", "neolight/labelOuput/index", "", 0, "mgroup");
// Menu manualOut = new Menu(new ArrayList<Menu>(), 1, "manualOut", "手动出库", 1, "manualOut", "neolight/manualOut/index", "", 0, "export1"); // Menu manualOut = new Menu(new ArrayList<Menu>(), 1, "manualOut", "手动出库", 1, "manualOut", "neolight/manualOut/index", "", 0, "export1");
...@@ -237,8 +238,9 @@ public class DataInitManager { ...@@ -237,8 +238,9 @@ public class DataInitManager {
groupOut.setHidden(true); groupOut.setHidden(true);
materialBox.setHidden(true); materialBox.setHidden(true);
outSet.setHidden(true); outSet.setHidden(true);
posOut.setHidden(true);
// orderSet.setHidden(true); // orderSet.setHidden(true);
menus.addAll(createMenus(poutOut, menuOrder, out,groupOut,materialBox,outSet)); menus.addAll(createMenus(poutOut, menuOrder, out,posOut,groupOut,materialBox,outSet));
//MSD管理:MSD库存.MSD追溯性.MSD设置 //MSD管理:MSD库存.MSD追溯性.MSD设置
Menu msd = Menu.CreatePMenu("MSD管理", 20, "msd", 2, "MSD"); Menu msd = Menu.CreatePMenu("MSD管理", 20, "msd", 2, "MSD");
......
package com.neotel.smfcore.core.haman.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BINPosInfo implements Serializable {
private String bIN;
private String posId;
private String posName;
private String storageId;
private String storageName;
}
package com.neotel.smfcore.core.haman.rest;
import com.google.common.collect.Lists;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.csv.CsvReader;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.haman.bean.BINPosInfo;
import com.neotel.smfcore.core.haman.rest.dto.BINPosDto;
import com.neotel.smfcore.core.haman.rest.mapstruct.BINPosMapper;
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.util.DevicesStatusUtil;
import com.neotel.smfcore.security.TokenProvider;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.security.bean.FileProperties;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.bytebuddy.asm.Advice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.*;
@Slf4j
@RestController
@RequiredArgsConstructor
@Api(tags = "库位出库")
@RequestMapping("api/posOutput")
public class PosOutputController {
@Autowired
private final FileProperties properties;
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private DataCache dataCache;
@Autowired
private BINPosMapper binPosMapper;
@Autowired
private TokenProvider tokenProvider;
// Map<String,List<BINPosInfo>> operageMap=new HashMap<>();
private List<BINPosInfo> posInfoList = new ArrayList<>();
@ApiOperation("上传库位")
@PostMapping(value = "/upload")
@AnonymousAccess
public List<BINPosDto> upload(@RequestParam MultipartFile orderFile, HttpServletRequest request) {
String image = "csv";
String fileType = FileUtil.getExtensionName(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());
List<String> itemList = readFile(fileName, localFile.getAbsolutePath());
if (itemList == null || itemList.size() <= 0) {
throw new ValidateException("smfcore.fileError", "文件解析失败");
} else {
//先把之前的灯关闭
for (BINPosInfo pos :
posInfoList) {
Storage storage = dataCache.getStorageById(pos.getStorageId());
DevicesStatusUtil.appendOp(storage.getCid(), "close", pos.getPosName() + "=");
log.info("上传文件时关闭上次的灯,关灯:" + pos.getPosName());
}
posInfoList = new ArrayList<>();
}
String token = tokenProvider.getToken(request);
String ptoken = token.substring(token.length() - 10);
String color = "green";
for (String bin : itemList
) {
String posName = bin;
StoragePos pos = storagePosManager.getByPosName(posName);
if (pos == null) {
continue;
}
Storage storage = dataCache.getStorageById(pos.getStorageId());
if (storage == null) {
log.info("上传库位出库文件时,库位[" + pos.getId() + "][" + pos.getPosName() + "],storageId=[" + pos.getStorageId() + "]未找到料仓");
continue;
}
BINPosInfo posInfo = new BINPosInfo(bin, pos.getId(), pos.getPosName(), pos.getStorageId(), storage.getName());
posInfoList.add(posInfo);
String lightOnStr = pos.getPosName() + "=" + color;
DevicesStatusUtil.appendOp(storage.getCid(), "open", lightOnStr);
log.info("[" + ptoken + "]上传出库库位,点亮库位:" + lightOnStr);
}
// operageMap.put(token,posInfos);
log.info("[" + ptoken + "]上传[" + posInfoList.size() + "]条库位信息");
List<BINPosDto> results = binPosMapper.toDto(posInfoList);
return results;
}
@ApiOperation("全部灭灯")
@PostMapping(value = "/closeAllLed")
@AnonymousAccess
public ResultBean closeAllLed(HttpServletRequest request) {
String token = tokenProvider.getToken(request);
String ptoken = token.substring(token.length() - 10);
// List<BINPosInfo> posInfos=operageMap.get(token);
if (posInfoList == null || posInfoList.size() <= 0) {
throw new ValidateException("smfcore.posOutput.noFile", "请先上传出库文件");
}
for (BINPosInfo pos :
posInfoList) {
Storage storage = dataCache.getStorageById(pos.getStorageId());
DevicesStatusUtil.appendOp(storage.getCid(), "close", pos.getPosName() + "=");
log.info("[" + ptoken + "]点击全部灭灯,关灯:" + pos.getPosName());
}
posInfoList = new ArrayList<>();
return ResultBean.newOkResult("操作成功");
}
public List<String> readFile(String fileName, String fileURL) {
List<String> items = Lists.newArrayList();
try {
fileName = fileName.replace(".csv", "");
log.info("开始解析新上传的库位文件");
CsvReader csvRead = CsvReader.newReader(fileURL, "BIN", "库位");
int binIndex = csvRead.getIndex("BIN", "库位");
int row = 1;
while (csvRead.readRecord()) {
row++;
String[] lineValues = csvRead.getValues();
String partNumber = lineValues[binIndex].trim();
if (partNumber.isEmpty()) {
continue;
}
items.add(partNumber);
}
return items;
} catch (Exception ex) {
log.error("解析新上传的库位文件出错:" + ex.toString());
}
return items;
}
}
package com.neotel.smfcore.core.haman.rest.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
public class BINPosDto implements Serializable {
@ApiModelProperty(value = "BIN名称")
private String bIN;
@ApiModelProperty(value = "料架名称")
private String storageName;
@ApiModelProperty(value = "库位号")
private String posName;
}
package com.neotel.smfcore.core.haman.rest.mapstruct;
import com.neotel.smfcore.common.base.BaseMapper;
import com.neotel.smfcore.core.haman.bean.BINPosInfo;
import com.neotel.smfcore.core.haman.rest.dto.BINPosDto;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring" ,unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface BINPosMapper extends BaseMapper<BINPosDto, BINPosInfo> {
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!