Commit eafaf694 LN

1.库位增加坐标。2.库位上传修改。3.csv读取修改。

1 个父辈 258d0897
...@@ -34,6 +34,25 @@ import java.util.HashMap; ...@@ -34,6 +34,25 @@ import java.util.HashMap;
*/ */
@Slf4j @Slf4j
public class CsvReader { public class CsvReader {
public static CsvReader newReader(String fileURL, String titleName,String titleNameEn) throws IOException {
String reloadEncodeing="GBK";
CsvReader csvRead = new CsvReader(fileURL);
csvRead.setSkipEmptyRecords(true);
csvRead.setTrimWhitespace(true);
csvRead.readHeaders();
int index = csvRead.getIndex(titleName, titleNameEn);
//未找到列,重新读取
if (index == -1) {
log.info("文件未包含列[" + titleName + "][" + titleNameEn + "],改为" + reloadEncodeing + "重新读取");
csvRead = new CsvReader(fileURL, CsvReader.Letters.COMMA, Charset.forName(reloadEncodeing));
csvRead.setSkipEmptyRecords(true);
csvRead.setTrimWhitespace(true);
csvRead.readHeaders();
}
return csvRead;
}
private Reader inputStream = null; private Reader inputStream = null;
private String fileName = null; private String fileName = null;
...@@ -1226,6 +1245,7 @@ public class CsvReader { ...@@ -1226,6 +1245,7 @@ public class CsvReader {
dataBuffer.ColumnStart = 0; dataBuffer.ColumnStart = 0;
} }
/** /**
* Read the first record of data as column headers. * Read the first record of data as column headers.
* *
...@@ -1699,7 +1719,7 @@ public class CsvReader { ...@@ -1699,7 +1719,7 @@ public class CsvReader {
} }
} }
private class Letters { public class Letters {
public static final char LF = '\n'; public static final char LF = '\n';
public static final char CR = '\r'; public static final char CR = '\r';
......
...@@ -19,6 +19,8 @@ import com.neotel.smfcore.security.service.po.Role; ...@@ -19,6 +19,8 @@ import com.neotel.smfcore.security.service.po.Role;
import com.neotel.smfcore.security.service.po.User; import com.neotel.smfcore.security.service.po.User;
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.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
...@@ -76,6 +78,15 @@ public class DataInitManager { ...@@ -76,6 +78,15 @@ public class DataInitManager {
log.info("初始化环境完成..."); log.info("初始化环境完成...");
} }
List<Menu> menus=menuManager.findByQuery(new Query(Criteria.where("path").ne("")));
for (Menu me:menus
) {
if(me.getTitleKey()==null|| me.getTitleKey()==""){
me.setTitleKey(me.getPath());
menuManager.saveMenu(me);
}
}
initTask(); initTask();
} catch (Exception exception) { } catch (Exception exception) {
...@@ -133,26 +144,26 @@ public class DataInitManager { ...@@ -133,26 +144,26 @@ public class DataInitManager {
private List<Menu> createSubPerMenus(Menu menu) { private List<Menu> createSubPerMenus(Menu menu) {
List<Menu> list = new ArrayList<>(); List<Menu> list = new ArrayList<>();
//如果是list结尾的,默认增加其他的权限菜单 // //如果是list结尾的,默认增加其他的权限菜单
Map<String, String[]> defaultMenus = new HashMap<>(); // Map<String, String[]> defaultMenus = new HashMap<>();
defaultMenus.put("menu", new String[]{"menu:edit", "menu:del", "menu:add"}); // defaultMenus.put("menu", new String[]{"menu:edit", "menu:del", "menu:add"});
defaultMenus.put("user",new String[]{}); // defaultMenus.put("user",new String[]{});
defaultMenus.put("role",new String[]{}); // defaultMenus.put("role",new String[]{});
//
String per = menu.getPermission().replace(":list", ""); // String per = menu.getPermission().replace(":list", "");
String menuName = menu.getTitle().replace("管理", ""); // String menuName = menu.getTitle().replace("管理", "");
if (!defaultMenus.containsKey(per)) { // if (!defaultMenus.containsKey(per)) {
return list; // return list;
} // }
String[] subPers = defaultMenus.get(per); // String[] subPers = defaultMenus.get(per);
if (subPers.length <= 0) { // if (subPers.length <= 0) {
subPers = new String[]{per + ":edit", per + ":del", per + ":add"}; // subPers = new String[]{per + ":edit", per + ":del", per + ":add"};
} // }
for (String subPer : // for (String subPer :
subPers) { // subPers) {
Menu subperMenu = menuManager.save(Menu.CreatePerMenu(subPer, menuName + "_" + subPer, menu.getId())); // Menu subperMenu = menuManager.save(Menu.CreatePerMenu(subPer, menuName + "_" + subPer, menu.getId()));
list.add(subperMenu); // list.add(subperMenu);
} // }
return list; return list;
} }
......
package com.neotel.smfcore.common.utils;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.data.geo.Point;
@Slf4j
public class PointUtil {
public static Point getPosPoint(String posId ) {
return getPosPoint(posId,true );
}
/**
* 获取坐标
* @param posId 库位号
* @param isUpdatePos true=更新库位坐标。false=查询使用
* @return
*/
public static Point getPosPoint(String posId, boolean isUpdatePos) {
// 库位号格式:
// 例:05AA03040102
// 05:表示料仓编号,01-08
// AA:存储机构A面或B面,AA或者BB
// 03:表示抽屉在第几行
// 04:表示抽屉在第几列
// 01:表示在抽屉中的第几行
// 02:表示在抽屉中的第几列
Point p = new Point(0, 0);
try {
if (posId.length() == 12 &&((posId.contains("AA")||posId.contains("BB")))) {
double storageNum = 0;
int storage = Integer.parseInt(posId.substring(0, 2));
String typeStr = posId.substring(2, 4);
if (typeStr.equals("AA")) {
if(isUpdatePos){
storageNum = storage * 10 + 1;
}else{
storageNum = storage * 10 + 2;
}
} else {
if(isUpdatePos){
storageNum = storage * 10 + 2;
}else{
storageNum = storage * 10 + 1;
}
}
double row = Integer.parseInt(posId.substring(4, 6));
double column = Integer.parseInt(posId.substring(6, 8));
double x = storageNum + column / 100;
double y = storageNum + row / 1000;
double drawerRow=1;
double drawerColumn=1;
if (isUpdatePos) {
drawerRow = Integer.parseInt(posId.substring(8, 10));
drawerColumn = Integer.parseInt(posId.substring(10, 12));
}
x += drawerColumn / 100 / 1000;
y += +drawerRow / 1000 / 100;
p = new Point(x, y);
}
} catch (Exception ex) {
log.error("解析库位[" + posId + "]的坐标出错:" + ex);
}
// log.info("解析库位[" + posId + "]的坐标结果:" + p.toString());
return p;
}
}
...@@ -61,10 +61,8 @@ public class UserCodeUtil { ...@@ -61,10 +61,8 @@ public class UserCodeUtil {
protected static List<User> ReadFile(String fileURL ) throws Exception protected static List<User> ReadFile(String fileURL ) throws Exception
{ {
List<User> list=new ArrayList<User>(); List<User> list=new ArrayList<User>();
CsvReader csvRead = new CsvReader(fileURL);
csvRead.setSkipEmptyRecords(true);//忽略空行 CsvReader csvRead = CsvReader.newReader(fileURL,"用户ID","ID");
csvRead.setTrimWhitespace(true);//去除空格
csvRead.readHeaders();
int idIndex = getCsvIndex(csvRead,"用户ID","ID"); int idIndex = getCsvIndex(csvRead,"用户ID","ID");
int usernameIndex = getCsvIndex(csvRead,"用户名","UserName"); int usernameIndex = getCsvIndex(csvRead,"用户名","UserName");
......
...@@ -156,10 +156,7 @@ public class BarcodeController { ...@@ -156,10 +156,7 @@ public class BarcodeController {
protected String handleBarcode(String fileURL) throws Exception { protected String handleBarcode(String fileURL) throws Exception {
log.info("开始读取文件:" + fileURL); log.info("开始读取文件:" + fileURL);
CsvReader csvRead = new CsvReader(fileURL); CsvReader csvRead =CsvReader.newReader(fileURL,"条码","RI");
csvRead.setSkipEmptyRecords(true);//忽略空行
csvRead.setTrimWhitespace(true);//去除空格
csvRead.readHeaders();
int riIndex = csvRead.getIndex("条码","RI"); int riIndex = csvRead.getIndex("条码","RI");
int pnIndex = csvRead.getIndex("物编","PN"); int pnIndex = csvRead.getIndex("物编","PN");
......
...@@ -184,10 +184,8 @@ public class OrderController { ...@@ -184,10 +184,8 @@ public class OrderController {
log.info("开始更解析上传的工单"); log.info("开始更解析上传的工单");
List<LiteOrderItem> items = Lists.newArrayList(); List<LiteOrderItem> items = Lists.newArrayList();
CsvReader csvRead = new CsvReader(fileURL);
csvRead.setSkipEmptyRecords(true);//忽略空行 CsvReader csvRead = CsvReader.newReader(fileURL,"PN", "PN");
csvRead.setTrimWhitespace(true);//去除空格
csvRead.readHeaders();
int partNumberIndex = csvRead.getIndex("PN", "PN"); int partNumberIndex = csvRead.getIndex("PN", "PN");
int qtyIndex = csvRead.getIndex("NUM", "QTY"); int qtyIndex = csvRead.getIndex("NUM", "QTY");
int feederIndex = csvRead.getIndex("FEEDER", "FEEDER"); int feederIndex = csvRead.getIndex("FEEDER", "FEEDER");
......
...@@ -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.csv.CsvReader; import com.neotel.smfcore.common.csv.CsvReader;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.FileUtil; import com.neotel.smfcore.common.utils.FileUtil;
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;
...@@ -26,6 +27,7 @@ import lombok.RequiredArgsConstructor; ...@@ -26,6 +27,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.geo.Point;
import org.springframework.data.mongodb.core.query.Criteria; 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;
...@@ -37,6 +39,7 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -37,6 +39,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.File; import java.io.File;
import java.nio.charset.Charset;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -225,10 +228,8 @@ public class StorageController { ...@@ -225,10 +228,8 @@ public class StorageController {
} }
CsvReader csvRead = new CsvReader(fileURL); CsvReader csvRead =CsvReader.newReader(fileURL,"位置","pos") ;
csvRead.setSkipEmptyRecords(true);//忽略空行
csvRead.setTrimWhitespace(true);//去除空格
csvRead.readHeaders();
int posIndex =csvRead.getCsvIndex( "位置","pos"); int posIndex =csvRead.getCsvIndex( "位置","pos");
int priIndex = csvRead.getCsvIndex("优先级","pri"); int priIndex = csvRead.getCsvIndex("优先级","pri");
int hIndex = csvRead.getCsvIndex("高度","h"); int hIndex = csvRead.getCsvIndex("高度","h");
...@@ -236,38 +237,96 @@ public class StorageController { ...@@ -236,38 +237,96 @@ public class StorageController {
int row = 1; int row = 1;
int newRowCount = 0; int newRowCount = 0;
int existRowCount=0;
int updateRowCount = 0; int updateRowCount = 0;
List<StoragePos> storagePosList=storagePosManager.findByStorage(storage.getId());
List<StoragePos> newList=new ArrayList<>();
while(csvRead.readRecord()){ while(csvRead.readRecord()){
row++; row++;
String[] lineValues = csvRead.getValues(); String[] lineValues = csvRead.getValues();
String posName = lineValues[posIndex]; String posName = lineValues[posIndex];
String priorityStr = lineValues[priIndex]; Integer priority =0;
String hStr = lineValues[hIndex]; Integer height =0;
String wStr = lineValues[wIndex]; Integer width =0;
if(posName.isEmpty() || hStr.isEmpty() || wStr.isEmpty()){ try {
priority =Integer.parseInt(lineValues[priIndex]) ;
height = Integer.parseInt(lineValues[hIndex]);
width = Integer.parseInt(lineValues[wIndex]);
}catch (Exception ex){
log.warn("第"+row+"行中有空白内容,此行忽略");
continue;
}
if(posName.isEmpty() ){
log.warn("第"+row+"行中有空白内容,此行忽略"); log.warn("第"+row+"行中有空白内容,此行忽略");
continue; continue;
} }
StoragePos posInfo = storagePosManager.getByPosName(posName); // StoragePos posInfo = storagePosManager.getByPosName(posName);
StoragePos posInfo =findFormList(storagePosList,posName);
if(posInfo == null){ if(posInfo == null){
posInfo = new StoragePos(); posInfo = new StoragePos();
posInfo.setPosName(posName); posInfo.setPosName(posName);
posInfo.setStorageId(storageId); posInfo.setStorageId(storageId);
posInfo.setH(height);
posInfo.setW(width);
posInfo.setPriority(priority);
Point point= PointUtil.getPosPoint(posName);
posInfo.setCoordinate(new double[]{point.getX(),point.getY()});
newRowCount++; newRowCount++;
newList.add(posInfo);
}else{ }else{
updateRowCount++; boolean needUpdate=false;
} if(!posInfo.getPosName().equals(posName)){
posInfo.setH(Integer.valueOf(hStr)); needUpdate=true;
posInfo.setW(Integer.valueOf(wStr)); posInfo.setPosName(posName);
}
if(!Strings.isNullOrEmpty(priorityStr)){ if(!posInfo.getStorageId().equals(storageId)){
posInfo.setPriority(Double.valueOf(priorityStr)); needUpdate=true;
posInfo.setStorageId(storageId);
}
if(posInfo.getH()!=height){
needUpdate=true;
posInfo.setH(height);
}
if(posInfo.getW()!=width){
needUpdate=true;
posInfo.setW(width);
}
if(posInfo.getPriority()!=priority){
needUpdate=true;
posInfo.setPriority(priority);
}
Point point= PointUtil.getPosPoint(posInfo.getPosName());
if(posInfo.getCoordinate()==null||posInfo.getCoordinate().length!=2||
(posInfo.getCoordinate()[0]!=point.getX()) ||(posInfo.getCoordinate()[1]!=point.getY())){
needUpdate=true;
posInfo.setCoordinate(new double[]{point.getX(),point.getY()});
}
if(needUpdate){
updateRowCount++;
storagePosManager.save(posInfo);
}else{
existRowCount++;
}
} }
storagePosManager.save(posInfo); }
if(newList.size()>0){
storagePosManager.insertAll(newList);
} }
dataCache.reloadStorage(storage); dataCache.reloadStorage(storage);
String msg = "读取到["+row+"]行数据:新增【"+newRowCount+"】更新【" +updateRowCount +"】"; String msg = "读取到["+row+"]行数据:新增【"+newRowCount+"】,已存在【"+existRowCount+"】,更新【" +updateRowCount +"】";
log.info(msg); log.info(msg);
return msg; return msg;
} }
private StoragePos findFormList(List<StoragePos> list ,String posName)
{
for (StoragePos pos :
list) {
if( pos.getPosName().equals(posName)){
return pos;
}
}
return null;
}
} }
...@@ -35,4 +35,8 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> { ...@@ -35,4 +35,8 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
StoragePos getEmptyPosByStorage(Storage storage, Barcode barcode, Collection<String> excludePosIds) throws ValidateException ; StoragePos getEmptyPosByStorage(Storage storage, Barcode barcode, Collection<String> excludePosIds) throws ValidateException ;
List<StoragePos> findNotEmpty(); List<StoragePos> findNotEmpty();
List<StoragePos> findByStorage(String storageId);
void insertAll(List<StoragePos> posList);
} }
...@@ -248,7 +248,7 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -248,7 +248,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
@Override @Override
public List<StoragePos> findByQuery(Query query) { public List<StoragePos> findByQuery(Query query) {
return storagePosDao.findOne(query); return storagePosDao.findByQuery(query);
} }
...@@ -318,4 +318,14 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -318,4 +318,14 @@ public class StoragePosManagerImpl implements IStoragePosManager {
public List<StoragePos> findNotEmpty(){ public List<StoragePos> findNotEmpty(){
return findNotEmptyByStorageId(null); return findNotEmptyByStorageId(null);
} }
@Override
public List<StoragePos> findByStorage(String storageId) {
return storagePosDao.findListByCondition(new String[]{"storageId" }, new String[]{storageId });
}
@Override
public void insertAll(List<StoragePos> posList) {
storagePosDao.insertAll(posList);
}
} }
...@@ -4,16 +4,23 @@ import com.google.common.base.Strings; ...@@ -4,16 +4,23 @@ import com.google.common.base.Strings;
import com.neotel.smfcore.common.base.BasePo; import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
import lombok.Data; import lombok.Data;
import org.springframework.data.mongodb.core.index.GeoSpatialIndexType;
import org.springframework.data.mongodb.core.index.GeoSpatialIndexed;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
@Data @Data
@Document
public class StoragePos extends BasePo implements Serializable { public class StoragePos extends BasePo implements Serializable {
private String storageId; private String storageId;
private Barcode barcode; private Barcode barcode;
private String posName; private String posName;
@GeoSpatialIndexed(type= GeoSpatialIndexType.GEO_2DSPHERE)
private double[] coordinate;
/** /**
* 扩展库位的主库位 * 扩展库位的主库位
*/ */
......
...@@ -151,6 +151,14 @@ public class DataLog extends BasePo implements Serializable { ...@@ -151,6 +151,14 @@ public class DataLog extends BasePo implements Serializable {
* 亮灯料架颜色 * 亮灯料架颜色
*/ */
private String lightColor = "FF0000"; private String lightColor = "FF0000";
/**
* 出入库执行时间,秒
*/
private int executeTime=0;
/**
* 出库时记录此料在库时长 ,分钟
*/
private long inStoreTime=0l;
public String getBarcode() { public String getBarcode() {
if(barcode == null){ if(barcode == null){
......
...@@ -256,11 +256,7 @@ public class UserController { ...@@ -256,11 +256,7 @@ public class UserController {
{ {
log.info("开始更新用户列表"); log.info("开始更新用户列表");
CsvReader csvRead = new CsvReader(fileURL); CsvReader csvRead = CsvReader.newReader(fileURL,"用户ID","ID");
csvRead.setSkipEmptyRecords(true);//忽略空行
csvRead.setTrimWhitespace(true);//去除空格
csvRead.readHeaders();
int idIndex = csvRead.getCsvIndex("用户ID","ID"); int idIndex = csvRead.getCsvIndex("用户ID","ID");
int usernameIndex = csvRead.getCsvIndex("用户名","UserName"); int usernameIndex = csvRead.getCsvIndex("用户名","UserName");
int codeIndex = csvRead.getCsvIndex("启用码","CheckCode"); int codeIndex = csvRead.getCsvIndex("启用码","CheckCode");
......
...@@ -194,7 +194,10 @@ public class MenuManagerImpl implements IMenuManager { ...@@ -194,7 +194,10 @@ public class MenuManagerImpl implements IMenuManager {
@Override @Override
public List<Menu> getSuperior(Menu menu, List<Menu> menus) { public List<Menu> getSuperior(Menu menu, List<Menu> menus) {
if(menu!=null&& menu.getPid().equals("")){ if (menu == null || menu.getPid() == null) {
return menus;
}
if (menu.getPid().equals("")) {
menus.addAll(menuDao.findByPid(menu.getPid())); menus.addAll(menuDao.findByPid(menu.getPid()));
return menus; return menus;
} }
......
...@@ -169,6 +169,11 @@ public class Menu extends BasePo implements Serializable { ...@@ -169,6 +169,11 @@ public class Menu extends BasePo implements Serializable {
Menu menu = new Menu(new ArrayList<Menu>(), 0, "", title, menuSort, path, "", "", subCount, false, false, false, title, icon,titleKey); Menu menu = new Menu(new ArrayList<Menu>(), 0, "", title, menuSort, path, "", "", subCount, false, false, false, title, icon,titleKey);
return menu; return menu;
} }
/**
* 服务器使用的key
* @return
*/
public String GetMsgKey() { public String GetMsgKey() {
String titleKey= (ObjectUtil.isNotEmpty(getTitleKey())? getTitleKey():getPath()); String titleKey= (ObjectUtil.isNotEmpty(getTitleKey())? getTitleKey():getPath());
if(!titleKey.startsWith("smfcore.")){ if(!titleKey.startsWith("smfcore.")){
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!