Commit d89f1ab3 sunke

哈曼料架功能

1 个父辈 17974676
正在显示 21 个修改的文件 包含 699 行增加114 行删除
...@@ -3,8 +3,6 @@ package com.neotel.smfcore.common.base; ...@@ -3,8 +3,6 @@ package com.neotel.smfcore.common.base;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.FindAndModifyOptions; import org.springframework.data.mongodb.core.FindAndModifyOptions;
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.MongoTemplate;
...@@ -169,11 +167,10 @@ public abstract class AbstractBaseDao implements IBaseDao { ...@@ -169,11 +167,10 @@ public abstract class AbstractBaseDao implements IBaseDao {
} }
// @Override @Override
// public List<String> distinct(String key, DBObject query){ public List<String> distinct(String field, Query query){
// String collectionName = getMongoTemplate().getCollectionName(getEntityClass()); return getMongoTemplate().findDistinct(query,field,getEntityClass(),String.class);
// return getMongoTemplate().getCollection(collectionName).distinct(key, query); }
// }
public<T extends BasePo> void removeByQuery(Query query) { public<T extends BasePo> void removeByQuery(Query query) {
List<T> list = getMongoTemplate().find(query, getEntityClass()); List<T> list = getMongoTemplate().find(query, getEntityClass());
......
...@@ -47,6 +47,8 @@ public interface IBaseDao { ...@@ -47,6 +47,8 @@ public interface IBaseDao {
// List<String> distinct(String key, DBObject query); // List<String> distinct(String key, DBObject query);
List<String> distinct(String field, Query query);
public<T extends BasePo> void removeByQuery(Query query); public<T extends BasePo> void removeByQuery(Query query);
public long count(); public long count();
......
...@@ -45,6 +45,7 @@ public class CsvReader { ...@@ -45,6 +45,7 @@ public class CsvReader {
//未找到列,重新读取 //未找到列,重新读取
if (index == -1) { if (index == -1) {
log.info("文件未包含列[" + titleName + "][" + titleNameEn + "],改为" + reloadEncodeing + "重新读取"); log.info("文件未包含列[" + titleName + "][" + titleNameEn + "],改为" + reloadEncodeing + "重新读取");
csvRead.close();
csvRead = new CsvReader(fileURL, CsvReader.Letters.COMMA, Charset.forName(reloadEncodeing)); csvRead = new CsvReader(fileURL, CsvReader.Letters.COMMA, Charset.forName(reloadEncodeing));
csvRead.setSkipEmptyRecords(true); csvRead.setSkipEmptyRecords(true);
csvRead.setTrimWhitespace(true); csvRead.setTrimWhitespace(true);
......
package com.neotel.smfcore.core.haman.enums;
public class BIN_STATUS {
/**
* 0无操作
*/
public final static int NEW = 0;
/**
* 1正在执行
*/
public final static int EXCUTING = 1;
/**
* 2 已完成
*/
public final static int FINISHED = 2;
}
package com.neotel.smfcore.core.haman.listener;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Lists;
import com.neotel.smfcore.common.csv.CsvReader;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.haman.services.dao.IHamanBinPosDao;
import com.neotel.smfcore.core.haman.services.po.HamanBinPos;
import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.listener.DefaultOrderFileListener;
import com.neotel.smfcore.core.order.listener.IOrderFileListener;
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.system.bean.OrderSetting;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* Created by sunke on 2021/7/12.
*/
@Service
@Slf4j
public class HamanOrderFileListener extends DefaultOrderFileListener {
@Autowired
protected IHamanBinPosDao hamanBinPosDao;
@Override
public boolean handleOrderFile(File orderFile) {
String fileName = orderFile.getName();
if(isFileType(fileName,"csv")){
return processHamanCsvFile(orderFile);
}
return false;
}
public boolean processHamanCsvFile(File file) {
CsvReader csvRead = null;
try {
csvRead = new CsvReader(file.getAbsolutePath());
csvRead.setSkipEmptyRecords(true);//忽略空行
csvRead.setTrimWhitespace(true);//去除空格
csvRead.readHeaders();
int toNumberIndex = csvRead.getIndex("Transfer Order Number");
if(toNumberIndex != -1){
int row = 1;
List<HamanBinPos> hamanBinPosList = Lists.newArrayList();
while (csvRead.readRecord()) {
row++;
HamanBinPos hamanBinPos = new HamanBinPos();
String toNumber = csvRead.get(toNumberIndex);
hamanBinPos.setToNumber(toNumber);
String material = csvRead.get("Material");
hamanBinPos.setMaterial(material);
String batch = csvRead.get("Batch");
hamanBinPos.setBatch(batch);
//Source storage type = S02,则表示下架,对应的BIN位信息读取Source storage BIN
String sourceType = csvRead.get("Source Storage Type");
String destType = csvRead.get("Dest. Storage Type");
if(sourceType.toUpperCase().equals("S02")){
hamanBinPos.setType(OP.CHECKOUT);
String sourceBin = csvRead.get("Source Storage Bin");
hamanBinPos.setBinPos(sourceBin);
}else if(destType.toUpperCase().equals("S02")){
//Dest. Storage Type = S02,则表示上架,对应的BIN位信息读取Dest.Storage BIN
hamanBinPos.setType(OP.PUT_IN);
String destBin = csvRead.get("Dest.Storage Bin");
hamanBinPos.setBinPos(destBin);
}else{
log.info("第 "+row+" 行destType="+sourceType+"destType=" +destType+ ",都不是S02忽略");
continue;
}
hamanBinPosList.add(hamanBinPos);
}
if(hamanBinPosList.size() > 0){
log.info("共解析到"+hamanBinPosList.size()+"条有效数据");
hamanBinPosDao.insertAll(hamanBinPosList);
return true;
}
}
} catch (Exception ex) {
log.error("解析出错:" + ex.toString());
}finally {
if(csvRead != null){
csvRead.close();
}
}
return false;
}
}
...@@ -54,70 +54,70 @@ public class PosOutputController { ...@@ -54,70 +54,70 @@ public class PosOutputController {
private List<BINPosInfo> posInfoList = new ArrayList<>(); private List<BINPosInfo> posInfoList = new ArrayList<>();
@ApiOperation("上传库位") // @ApiOperation("上传库位")
@PostMapping(value = "/upload") // @PostMapping(value = "/upload")
@AnonymousAccess // @AnonymousAccess
public List<BINPosDto> upload(@RequestParam MultipartFile orderFile, HttpServletRequest request) { // public List<BINPosDto> upload(@RequestParam MultipartFile orderFile, HttpServletRequest request) {
//
String image = "csv"; // String image = "csv";
String fileType = FileUtil.getExtensionName(orderFile.getOriginalFilename()); // String fileType = FileUtil.getExtensionName(orderFile.getOriginalFilename());
String fileName = FileUtil.getFileNameNoEx(orderFile.getOriginalFilename()); // String fileName = FileUtil.getFileNameNoEx(orderFile.getOriginalFilename());
if (fileType != null && !image.contains(fileType)) { // if (fileType != null && !image.contains(fileType)) {
throw new ValidateException("smfcore.feleFormatError", "文件格式错误!, 仅支持{0}格式", new String[]{image}); // throw new ValidateException("smfcore.feleFormatError", "文件格式错误!, 仅支持{0}格式", new String[]{image});
} // }
File folder = new File(properties.getPath(), "pos"); // File folder = new File(properties.getPath(), "pos");
File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath()); // File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath());
List<String> itemList = readFile(fileName, localFile.getAbsolutePath()); // List<String> itemList = readFile(fileName, localFile.getAbsolutePath());
//
String posStr=""; // String posStr="";
if (itemList == null || itemList.size() <= 0) { // if (itemList == null || itemList.size() <= 0) {
throw new ValidateException("smfcore.fileError", "文件解析失败"); // throw new ValidateException("smfcore.fileError", "文件解析失败");
} else { // } else {
//先把之前的灯关闭 // //先把之前的灯关闭
for (BINPosInfo pos : // for (BINPosInfo pos :
posInfoList) { // posInfoList) {
Storage storage = dataCache.getStorageById(pos.getStorageId()); // Storage storage = dataCache.getStorageById(pos.getStorageId());
DevicesStatusUtil.appendOp(storage.getCid(), "close", pos.getPosName() + "="); // DevicesStatusUtil.appendOp(storage.getCid(), "close", pos.getPosName() + "=");
posStr+="["+pos.getPosName()+"]"; // posStr+="["+pos.getPosName()+"]";
} // }
posInfoList = new ArrayList<>(); // posInfoList = new ArrayList<>();
} // }
if(ObjectUtil.isNotEmpty(posStr)){ // if(ObjectUtil.isNotEmpty(posStr)){
log.info("上传文件时关闭上次的灯,关灯:" + posStr); // log.info("上传文件时关闭上次的灯,关灯:" + posStr);
} // }
String token = tokenProvider.getToken(request); // String token = tokenProvider.getToken(request);
String ptoken = token.substring(token.length() - 10); // String ptoken = token.substring(token.length() - 10);
//
String lightOnString=""; // String lightOnString="";
String color = "green"; // String color = "green";
for (String bin : itemList // for (String bin : itemList
) { // ) {
String posName = bin; // String posName = bin;
StoragePos pos = storagePosManager.getByPosName(posName); // StoragePos pos = storagePosManager.getByPosName(posName);
if (pos == null) { // if (pos == null) {
//转换为Pos // //转换为Pos
posName = convertToPos(bin); // posName = convertToPos(bin);
pos = storagePosManager.getByPosName(posName); // pos = storagePosManager.getByPosName(posName);
if (pos == null) { // if (pos == null) {
continue; // continue;
} // }
} // }
Storage storage = dataCache.getStorageById(pos.getStorageId()); // Storage storage = dataCache.getStorageById(pos.getStorageId());
if (storage == null) { // if (storage == null) {
log.info("上传库位出库文件时,库位[" + pos.getId() + "][" + pos.getPosName() + "],storageId=[" + pos.getStorageId() + "]未找到料仓"); // log.info("上传库位出库文件时,库位[" + pos.getId() + "][" + pos.getPosName() + "],storageId=[" + pos.getStorageId() + "]未找到料仓");
continue; // continue;
} // }
BINPosInfo posInfo = new BINPosInfo(bin, pos.getId(), pos.getPosName(), pos.getStorageId(), storage.getName()); // BINPosInfo posInfo = new BINPosInfo(bin, pos.getId(), pos.getPosName(), pos.getStorageId(), storage.getName());
posInfoList.add(posInfo); // posInfoList.add(posInfo);
//
String lightOnStr = pos.getPosName() + "=" + color; // String lightOnStr = pos.getPosName() + "=" + color;
DevicesStatusUtil.appendOp(storage.getCid(), "open", lightOnStr); // DevicesStatusUtil.appendOp(storage.getCid(), "open", lightOnStr);
lightOnString+="["+lightOnStr+"]"; // lightOnString+="["+lightOnStr+"]";
} // }
log.info("[" + ptoken + "]上传[" + posInfoList.size() + "]条出库库位信息,点亮库位:" + lightOnString); // log.info("[" + ptoken + "]上传[" + posInfoList.size() + "]条出库库位信息,点亮库位:" + lightOnString);
List<BINPosDto> results = binPosMapper.toDto(posInfoList); // List<BINPosDto> results = binPosMapper.toDto(posInfoList);
return results; // return results;
} // }
@ApiOperation("全部灭灯") @ApiOperation("全部灭灯")
@PostMapping(value = "/closeAllLed") @PostMapping(value = "/closeAllLed")
......
package com.neotel.smfcore.core.haman.rest.dto; package com.neotel.smfcore.core.haman.rest.dto;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.haman.enums.BIN_STATUS;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
...@@ -7,12 +9,52 @@ import java.io.Serializable; ...@@ -7,12 +9,52 @@ import java.io.Serializable;
@Data @Data
public class BINPosDto implements Serializable { public class BINPosDto implements Serializable {
@ApiModelProperty(value = "BIN名称") @ApiModelProperty(value = "TO号")
private String bIN; /**
* Transfer Order Number
*/
private String toNumber;
@ApiModelProperty(value = "料架名称") /**
private String storageName; * Materia
*/
@ApiModelProperty(value = "物料号")
private String material;
@ApiModelProperty(value = "库位号") //Batch
private String posName; @ApiModelProperty(value = "批次")
private String batch;
/**
* 类型: 上架或下架
*/
@ApiModelProperty(value = "类型:1=上架,2=下架")
private int type = OP.PUT_IN;
//库位信息
@ApiModelProperty(value = "BIN")
private String binPos;
/**
* 料架架位信息
*/
@ApiModelProperty(value = "架位")
private String shelfPos;
/**
* 料架编号信息
*/
@ApiModelProperty(value = "料架编号")
private String shelfCid;
/**
* 状态:0=未完成, 1=正在执行, 2=已完成
*/
@ApiModelProperty(value = "状态:0=未完成, 1=正在执行, 2=已完成")
private int status = BIN_STATUS.NEW;
/**
* 亮灯料架颜色
*/
@ApiModelProperty(value = "灯颜色")
private String lightColor = "";
} }
...@@ -3,9 +3,10 @@ package com.neotel.smfcore.core.haman.rest.mapstruct; ...@@ -3,9 +3,10 @@ package com.neotel.smfcore.core.haman.rest.mapstruct;
import com.neotel.smfcore.common.base.BaseMapper; import com.neotel.smfcore.common.base.BaseMapper;
import com.neotel.smfcore.core.haman.bean.BINPosInfo; import com.neotel.smfcore.core.haman.bean.BINPosInfo;
import com.neotel.smfcore.core.haman.rest.dto.BINPosDto; import com.neotel.smfcore.core.haman.rest.dto.BINPosDto;
import com.neotel.smfcore.core.haman.services.po.HamanBinPos;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy; import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring" ,unmappedTargetPolicy = ReportingPolicy.IGNORE) @Mapper(componentModel = "spring" ,unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface BINPosMapper extends BaseMapper<BINPosDto, BINPosInfo> { public interface BINPosMapper extends BaseMapper<BINPosDto, HamanBinPos> {
} }
package com.neotel.smfcore.core.haman.rest.query;
import com.neotel.smfcore.common.annotation.QueryCondition;
import com.neotel.smfcore.common.bean.BetweenData;
import com.neotel.smfcore.core.device.enums.OP;
import lombok.Data;
import java.util.Date;
@Data
public class HamanBinQueryCondition {
@QueryCondition
private String toNumber;
@QueryCondition
private String material;
@QueryCondition
private String batch;
@QueryCondition
private String binPos;
//类型:1=上架,2=下架
@QueryCondition
private Integer type;
//状态:0=未完成, 1=正在执行, 2=已完成
@QueryCondition
private Integer status;
}
package com.neotel.smfcore.core.haman.services.dao;
import com.neotel.smfcore.common.base.IBaseDao;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.core.haman.services.po.HamanBinPos;
import com.neotel.smfcore.core.inList.service.po.InList;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query;
import java.util.List;
public interface IHamanBinPosDao extends IBaseDao {
HamanBinPos getPutInBin(String material, String batch);
HamanBinPos getExecutingBin(String shelfPos);
List<HamanBinPos> listUnLoadExecutingTasks();
List<HamanBinPos> listByToNumber(String toNumber);
List<String> distinctColor();
PageData<HamanBinPos> findByPage(Query query, Pageable pageable);
}
package com.neotel.smfcore.core.haman.services.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.haman.enums.BIN_STATUS;
import com.neotel.smfcore.core.haman.services.dao.IHamanBinPosDao;
import com.neotel.smfcore.core.haman.services.po.HamanBinPos;
import com.neotel.smfcore.core.inList.service.po.InList;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
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.stereotype.Service;
import java.util.List;
@Service
public class HamanBinPosDaoImpl extends AbstractBaseDao implements IHamanBinPosDao {
@Override
public Class getEntityClass() {
return HamanBinPos.class;
}
@Override
public HamanBinPos getPutInBin(String material, String batch) {
Criteria c = Criteria.where("material").is(material)
.and("batch").is(batch)
.and("type").is(OP.PUT_IN)
.and("status").is(BIN_STATUS.NEW);
return findOne(new Query(c));
}
@Override
public HamanBinPos getExecutingBin(String shelfPos) {
Criteria c = Criteria.where("shelfPos").is(shelfPos)
.and("status").is(BIN_STATUS.EXCUTING);
HamanBinPos binPos = findOne(new Query(c));
if(binPos == null){
//库位的条码有可能是前面带了SOxxx-,所以这里去除SO-再查一遍库位,保持与之前的兼容
int index=shelfPos.indexOf("-");
if(index>=0){
String posNameStr=shelfPos.substring(index+1);
c = Criteria.where("shelfPos").is(posNameStr)
.and("status").is(BIN_STATUS.EXCUTING);
binPos = findOne(new Query(c));
}
}
return binPos;
}
@Override
public List<HamanBinPos> listUnLoadExecutingTasks(){
Criteria c = Criteria.where("status").is(BIN_STATUS.EXCUTING)
.and("type").is(OP.CHECKOUT);;
List<HamanBinPos> list = findByQuery(new Query(c));
return list;
}
@Override
public List<HamanBinPos> listByToNumber(String toNumber){
Criteria c = Criteria.where("toNumber").is(toNumber);
List<HamanBinPos> list = findByQuery(new Query(c));
return list;
}
@Override
public PageData<HamanBinPos> findByPage(Query query, Pageable pageable){
int totalCount = countByQuery(query);
List<HamanBinPos> list = findByQuery(query, pageable);
return new PageData<HamanBinPos>(list,totalCount);
}
@Override
public List<String> distinctColor(){
Criteria c = Criteria.where("status").is(BIN_STATUS.EXCUTING)
.and("type").is(OP.CHECKOUT);
return distinct("lightColor",new Query(c));
}
}
package com.neotel.smfcore.core.haman.services.po;
import com.google.common.collect.Lists;
import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.core.barcode.enums.BARCODE_STATUS;
import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE;
import com.neotel.smfcore.core.barcode.enums.SOLDER_STATUS;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.haman.enums.BIN_STATUS;
import lombok.Data;
import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@Data
@Document
public class HamanBinPos extends BasePo implements Serializable {
/**
* Transfer Order Number
*/
private String toNumber;
/**
* Materia
*/
private String material;
//Batch
private String batch;
/**
* 类型: 上架或下架
*/
private int type = OP.PUT_IN;
//库位信息
private String binPos;
/**
* 料架架位信息
*/
private String shelfPos;
/**
* 料架编号信息
*/
private String shelfCid;
/**
* 状态:0=未完成, 1=正在执行, 2=已完成
*/
private int status = BIN_STATUS.NEW;
/**
* 亮灯料架颜色
*/
private String lightColor = "";
}
...@@ -78,7 +78,7 @@ public enum ORDER_COLOR { ...@@ -78,7 +78,7 @@ public enum ORDER_COLOR {
int nextColorIndex = (currentColorIndex + 1) % allColors.length; int nextColorIndex = (currentColorIndex + 1) % allColors.length;
for (ORDER_COLOR color : allColors) { for (ORDER_COLOR color : allColors) {
if(!excludeColors.contains(color.getRgb()) && color.ordinal() >= nextColorIndex){ if(!excludeColors.contains(color.getRgb()) && !excludeColors.contains(color.name()) && color.ordinal() >= nextColorIndex){
currentColorIndex = color.ordinal(); currentColorIndex = color.ordinal();
return color; return color;
} }
......
package com.neotel.smfcore.core.order.listener;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Lists;
import com.neotel.smfcore.common.csv.CsvReader;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache;
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.system.bean.OrderSetting;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* Created by sunke on 2021/7/12.
*/
@Service
@Slf4j
public class DefaultOrderFileListener implements IOrderFileListener {
@Autowired
protected DataCache dataCache;
@Autowired
protected ILiteOrderManager liteOrderManager;
@Autowired
protected LiteOrderCache liteOrderCache;
@Override
public boolean handleOrderFile(File orderFile) {
String fileName = orderFile.getName();
//String backupFileName = fileName +"_" + System.currentTimeMillis();
//看数据库是否已有此工单
// if(!fileName.endsWith(".process") && fileName.endsWith("_result.txt")){
//
// }
if(isFileType(fileName,"csv")){
LiteOrder fileNameOrder = liteOrderManager.findBySource(fileName);
if(fileNameOrder == null){
try{
Map<String, List<LiteOrderItem>> itemMap = readCsvFile(fileName,orderFile.getAbsolutePath());
if (itemMap != null && itemMap.size() > 0) {
for (String so:itemMap.keySet()) {
List<LiteOrderItem> liteOrderItems = itemMap.get(so);
if (liteOrderItems.size() <= 0) {
continue;
}
LiteOrder liteOrder = new LiteOrder(so, liteOrderItems);
liteOrder.setSource(fileName);
LiteOrder dbOrder = liteOrderManager.findByOrderNo(liteOrder.getOrderNo());
if (dbOrder != null) {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
//把名字改为带时间的
String newOrderNo = liteOrder.getOrderNo() + "-" + format.format(new Date());
dbOrder = liteOrderManager.findByOrderNo(newOrderNo);
if (dbOrder == null) {
liteOrder.setOrderNo(newOrderNo);
} else {
log.info("watchOrderDir:数据库中已存在工单号为[" + liteOrder.getOrderNo() + "],忽略文件:" + orderFile.getAbsolutePath());
//resultFile = new File(localDir+File.separator + "error",backupFileName);
return false;
}
}
log.info("watchOrderDir:新增加订单:" + liteOrder.getOrderNo() + ",共" + liteOrderItems.size() + "条工单详情");
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
//resultFile = new File(localDir+File.separator + "sucess",backupFileName);
return true;
}
}
}catch (Exception e){
log.error("read order from file ["+orderFile.getAbsolutePath()+"] :",e);
//resultFile = new File(localDir+File.separator + "error",backupFileName);
}
}
//resultFile = new File(localDir+File.separator + "sucess",backupFileName);
}
return false;
}
public Map<String , List<LiteOrderItem>> readCsvFile(String fileName, String fileURL) {
CsvReader csvRead = null;
try {
fileName=fileName.replace(".csv","");
Map<String ,List<LiteOrderItem>> itemMap=new HashMap<>();
List<LiteOrderItem> items = Lists.newArrayList();
OrderSetting orderSetting = dataCache.getOrderSetting();
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());
}finally {
if(csvRead != null){
csvRead.close();
}
}
return null;
}
protected boolean isFileType(String smbFile, String type){
//判断是否是有效的工单文件
if(smbFile.toLowerCase().endsWith(type)){
return true;
}
return false;
}
}
package com.neotel.smfcore.core.order.listener;
import java.io.File;
/**
* Created by sunke on 2021/7/12.
*/
public interface IOrderFileListener {
boolean handleOrderFile(File orderFile);
}
...@@ -121,39 +121,40 @@ public class OrderController { ...@@ -121,39 +121,40 @@ public class OrderController {
} }
File folder = new File(properties.getPath(), "pos"); File folder = new File(properties.getPath(), "pos");
File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath()); File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath());
Map<String, List<LiteOrderItem>> itemMap = orderFileWatch.readCsvFile(fileName, localFile.getAbsolutePath()); orderFileWatch.handleOrderFile(localFile);
// Map<String, List<LiteOrderItem>> itemMap = orderFileWatch.readCsvFile(fileName, localFile.getAbsolutePath());
if (itemMap == null || itemMap.size() <= 0) { //
throw new ValidateException("smfcore.fileError", "文件解析失败"); // 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) { // List<LiteOrderItem> liteOrderItems = itemMap.get(so);
continue; // if (liteOrderItems.size() <= 0) {
} // continue;
LiteOrder liteOrder = new LiteOrder(so, liteOrderItems); // }
liteOrder.setSource(localFile.getName()); // LiteOrder liteOrder = new LiteOrder(so, liteOrderItems);
LiteOrder dbOrder = liteOrderManager.findByOrderNo(liteOrder.getOrderNo()); // liteOrder.setSource(localFile.getName());
if (dbOrder != null) { // LiteOrder dbOrder = liteOrderManager.findByOrderNo(liteOrder.getOrderNo());
// if (dbOrder != null) {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); //
//把名字改为带时间的 // SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
String newOrderNo = liteOrder.getOrderNo() + "-" + format.format(new Date()); // //把名字改为带时间的
dbOrder = liteOrderManager.findByOrderNo(newOrderNo); // String newOrderNo = liteOrder.getOrderNo() + "-" + format.format(new Date());
if (dbOrder == null) { // dbOrder = liteOrderManager.findByOrderNo(newOrderNo);
liteOrder.setOrderNo(newOrderNo); // if (dbOrder == null) {
} else { // liteOrder.setOrderNo(newOrderNo);
log.info("数据库中已存在工单号为[" + liteOrder.getOrderNo() + "],忽略文件:" + localFile.getAbsolutePath()); // } else {
return ResultBean.newErrorResult(-1, "smfcore.order.ameExists", "工单名称[{0}]已存在", new String[]{liteOrder.getOrderNo()}); // log.info("数据库中已存在工单号为[" + liteOrder.getOrderNo() + "],忽略文件:" + localFile.getAbsolutePath());
} // return ResultBean.newErrorResult(-1, "smfcore.order.ameExists", "工单名称[{0}]已存在", new String[]{liteOrder.getOrderNo()});
} // }
log.info("新增加订单:" + liteOrder.getOrderNo() + ",共" + liteOrderItems.size() + "条工单详情"); // }
liteOrder = liteOrderManager.createWithItems(liteOrder); // log.info("新增加订单:" + liteOrder.getOrderNo() + ",共" + liteOrderItems.size() + "条工单详情");
liteOrderCache.addOrderToMap(liteOrder); // liteOrder = liteOrderManager.createWithItems(liteOrder);
} // liteOrderCache.addOrderToMap(liteOrder);
// }
return ResultBean.newOkResult("smfcore.order.uploadOK", "工单上传成功", ""); return ResultBean.newOkResult("smfcore.order.uploadOK", "工单上传成功", "");
} }
......
...@@ -172,7 +172,16 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -172,7 +172,16 @@ public class StoragePosManagerImpl implements IStoragePosManager {
@Override @Override
public StoragePos getByPosName(String posName) { public StoragePos getByPosName(String posName) {
return storagePosDao.findOneByCondition(new String[]{"posName"}, new String[]{posName}); StoragePos pos = storagePosDao.findOneByCondition(new String[]{"posName"}, new String[]{posName});
if(pos==null){
//库位的条码有可能是前面带了SOxxx-,所以这里去除SO-再查一遍库位,保持与之前的兼容
int index=posName.indexOf("-");
if(index>=0){
String posNameStr=posName.substring(index+1);
pos = storagePosDao.findOneByCondition(new String[]{"posName"}, new String[]{posNameStr});
}
}
return pos;
} }
@Override @Override
......
...@@ -119,6 +119,7 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { ...@@ -119,6 +119,7 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
.antMatchers("/file/**").permitAll() .antMatchers("/file/**").permitAll()
// 阿里巴巴 druid // 阿里巴巴 druid
.antMatchers("/druid/**").permitAll() .antMatchers("/druid/**").permitAll()
.antMatchers("/api/**").permitAll()
// 放行OPTIONS请求 // 放行OPTIONS请求
.antMatchers(HttpMethod.OPTIONS, "/**").permitAll() .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
// .antMatchers("api/menus/build").permitAll() // .antMatchers("api/menus/build").permitAll()
......
...@@ -70,7 +70,8 @@ public class SwaggerConfig { ...@@ -70,7 +70,8 @@ public class SwaggerConfig {
.build() .build()
//添加登陆认证 //添加登陆认证
.securitySchemes(securitySchemes()) .securitySchemes(securitySchemes())
.securityContexts(securityContexts()); .securityContexts(securityContexts())
;
} }
private ApiInfo apiInfo() { private ApiInfo apiInfo() {
...@@ -92,6 +93,17 @@ public class SwaggerConfig { ...@@ -92,6 +93,17 @@ public class SwaggerConfig {
.groupName("设备通信") .groupName("设备通信")
.pathMapping("/"); .pathMapping("/");
} }
@Bean
public Docket haman() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.ant("/api/haman/**"))
.build()
.groupName("哈曼接口")
.pathMapping("/");
}
private List<SecurityScheme> securitySchemes() { private List<SecurityScheme> securitySchemes() {
//设置请求头信息 //设置请求头信息
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!