Commit 5b26cb19 LN

元器件增加导入功能

1 个父辈 2d9fbf4b
package com.neotel.smfcore.core.barcode.rest; package com.neotel.smfcore.core.barcode.rest;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.PageData; import com.neotel.smfcore.common.bean.PageData;
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.exception.ValidateException;
import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.QueryHelp; import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.core.barcode.rest.bean.dto.ComponentDto; import com.neotel.smfcore.core.barcode.rest.bean.dto.ComponentDto;
import com.neotel.smfcore.core.barcode.rest.bean.dto.ComponentMatchingDto; import com.neotel.smfcore.core.barcode.rest.bean.dto.ComponentMatchingDto;
...@@ -14,6 +18,7 @@ import com.neotel.smfcore.core.barcode.service.po.Barcode; ...@@ -14,6 +18,7 @@ import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.service.po.Component; import com.neotel.smfcore.core.barcode.service.po.Component;
import com.neotel.smfcore.core.barcode.utils.QrcodeUtils; import com.neotel.smfcore.core.barcode.utils.QrcodeUtils;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager; import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.security.bean.FileProperties;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
...@@ -26,14 +31,12 @@ import org.springframework.http.ResponseEntity; ...@@ -26,14 +31,12 @@ import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList; import java.io.File;
import java.util.List; import java.io.IOException;
import java.util.Map; import java.util.*;
import java.util.Set;
@Slf4j @Slf4j
@RestController @RestController
...@@ -51,6 +54,8 @@ public class ComponentController { ...@@ -51,6 +54,8 @@ public class ComponentController {
private final QrcodeUtils qrcodeUtils; private final QrcodeUtils qrcodeUtils;
@Autowired @Autowired
private final FileProperties properties;
@Autowired
private final IStoragePosManager storagePosManager; private final IStoragePosManager storagePosManager;
@ApiOperation("导出元器件信息") @ApiOperation("导出元器件信息")
...@@ -182,4 +187,146 @@ public class ComponentController { ...@@ -182,4 +187,146 @@ public class ComponentController {
} }
@ApiOperation("上传元器件列表")
@PostMapping(value = "/uploadList")
@PreAuthorize("@el.check('component:list')")
public ResultBean uploadList(@RequestParam MultipartFile orderFile) {
String image = "csv";
String fileType = FileUtil.getExtensionName(orderFile.getOriginalFilename());
if (fileType != null && !image.contains(fileType)) {
throw new ValidateException("smfcore.feleFormatError", "文件格式错误!, 仅支持{0}格式", new String[]{image});
}
File folder = new File(properties.getPath(), "component");
File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath());
List<Component> componentList = readComponentCsv(localFile.getAbsolutePath());
int addCount = componentManager.saveComponentList(componentList);
if (addCount > 0) {
return ResultBean.newOkResult("smfcore.component.uploadOK", "上传成功,共新增" + addCount + "元器件", new String[]{addCount + ""}, "");
} else {
return ResultBean.newOkResult("smfcore.component.uploadOK", "上传元器件失败", "");
}
}
@ApiOperation("下载元器件模板")
@GetMapping(value = "/downloadModel")
@PreAuthorize("@el.check('component:list')")
public void downloadModel(HttpServletResponse response) throws IOException {
downloadComponentModel(response);
}
public void downloadComponentModel( HttpServletResponse response) throws IOException {
try {
List<Map<String, Object>> maps = new ArrayList<>();
List<String> titles = new ArrayList<>();
String[] titleArray = new String[]{"料件编号" , "数量", "尺寸", "高度", "最大库存", "最小库存", "安全库存"
, "呆滞天数", "整盘比", "散盘比", "描述"};
for (String title :
titleArray) {
titles.add(title);
}
for (int i = 1; i <= 5; i++) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("料件编号", "MATERIALNO-"+i);
map.put("数量", 1000);
map.put("尺寸", 7);
map.put("高度", 8);
map.put("最大库存", "");
map.put("最小库存", "");
map.put("安全库存", "");
map.put("呆滞天数", "");
map.put("整盘比", "");
map.put("散盘比", "");
map.put("描述", "");
maps.add(map);
}
FileUtil.downloadCSV(maps, titles, response);
} catch (Exception e) {
log.error("导出失败" + e.getMessage(), e);
}
}
private List<Component> readComponentCsv(String fileUrl) {
List<Component> items = new ArrayList<>();
try {
String[] titleArray = new String[]{"料件编号", "数量", "尺寸", "高度", "最大库存", "最小库存", "安全库存"
, "呆滞天数", "整盘", "散盘", "描述"};
CsvReader csvRead = CsvReader.newReader(fileUrl, "料件编号", "materialNo");
int partNumberIndex = csvRead.getIndex("料件编号", "materialNo");
int amountIndex = csvRead.getIndex("数量", "amount");
int plateSizeIndex = csvRead.getIndex("尺寸", "plateSize");
int heightIndex = csvRead.getIndex("高度", "height");
int maxStoreNumIndex = csvRead.getIndex("最大库存", "maxStoreNum");
int minStoreNumIndex = csvRead.getIndex("最小库存", "minStoreNum");
int safetyStoreNumIndex = csvRead.getIndex("安全库存", "safetyStoreNum");
int sluggishDayIndex = csvRead.getIndex("呆滞天数", "sluggishDay");
int wholeReelIndex = csvRead.getIndex("整盘", "wholeReel");
int halfReelIndex = csvRead.getIndex("散盘", "halfReel");
int descriptionIndex = csvRead.getIndex("描述", "description");
if(amountIndex==-1||plateSizeIndex==-1||heightIndex==-1 ){
throw new ValidateException("smfcore.componetn.csverror", "文件格式错误,必须包含列:料件编号,数量,尺寸,高度" );
}
int row = 1;
int newRowCount = 0;
int updateRowCount = 0;
while (csvRead.readRecord()) {
row++;
String[] lineValues = csvRead.getValues();
String PN = lineValues[partNumberIndex];
if (ObjectUtil.isEmpty(PN)) {
continue;
}
try {
Component item = new Component();
item.setPartNumber(lineValues[partNumberIndex]);
item.setAmount(Convert.toInt(lineValues[amountIndex]));
item.setPlateSize(Convert.toInt(lineValues[plateSizeIndex]));
item.setHeight(Convert.toInt(lineValues[heightIndex]));
item.setMaxStorageTime(getIntValue(lineValues, maxStoreNumIndex, item.getMaxStorageTime()));
item.setMinStoreNum(getIntValue(lineValues, minStoreNumIndex, item.getMinStoreNum()));
item.setSafetyStoreNum(getIntValue(lineValues, safetyStoreNumIndex, item.getSafetyStoreNum()));
item.setSluggishDay(getIntValue(lineValues, sluggishDayIndex, item.getSluggishDay()));
item.setWholeReel(getIntValue(lineValues, wholeReelIndex, item.getWholeReel()));
item.setHalfReel(getIntValue(lineValues, halfReelIndex, item.getHalfReel()));
item.setDescription(lineValues[descriptionIndex]);
if(item.getPlateSize()>0&&item.getHeight()>0){
item.setSizeConfirmed(true);
}
items.add(item);
} catch (Exception ex) {
log.error("解析文件" + fileUrl + " 第" + row + "行 出错:" + ex);
continue;
}
}
} catch (Exception ex) {
log.error("读取文件[" + fileUrl + "]出错:" + ex.toString());
}
return items;
}
private int getIntValue( String[] lineValues ,int index,int defaultValue){
if(index>=0&&index<lineValues.length){
String v=lineValues[index];
if(ObjectUtil.isEmpty(v)){
return defaultValue;
}
try {
return Convert.toInt(v);
}catch (Exception ex){
}
}
return defaultValue;
}
} }
...@@ -18,4 +18,6 @@ public interface IComponentManager extends IBaseManager<Component> { ...@@ -18,4 +18,6 @@ public interface IComponentManager extends IBaseManager<Component> {
void download(List<Component> queryAll, HttpServletResponse response) throws IOException; void download(List<Component> queryAll, HttpServletResponse response) throws IOException;
void deleteComponents(Set<String> ids); void deleteComponents(Set<String> ids);
int saveComponentList(List<Component> componentList);
} }
...@@ -68,17 +68,19 @@ public class ComponentManagerImpl implements IComponentManager { ...@@ -68,17 +68,19 @@ public class ComponentManagerImpl implements IComponentManager {
if (StringUtils.isEmpty(partNumber)) if (StringUtils.isEmpty(partNumber))
return null; return null;
else { else {
Component component = componentDao.findOneByCondition(new String[]{"partNumber", "provider"}, new String[]{partNumber, provider}); Component component = componentDao.findOneByCondition(new String[]{"partNumber"}, new String[]{partNumber});
if (component == null) { // Component component = componentDao.findOneByCondition(new String[]{"partNumber", "provider"}, new String[]{partNumber, provider});
component = componentDao.findOneByCondition(new String[]{"partNumber", "provider"}, new String[]{partNumber, null});
if(component==null){ // if (component == null) {
component = componentDao.findOneByCondition(new String[]{"partNumber", "provider"}, new String[]{partNumber, ""}); // component = componentDao.findOneByCondition(new String[]{"partNumber", "provider"}, new String[]{partNumber, null});
} // if (component == null) {
if (component != null) { // component = componentDao.findOneByCondition(new String[]{"partNumber", "provider"}, new String[]{partNumber, ""});
component.setProvider(provider); // }
component = componentDao.save(component); // if (component != null) {
} // component.setProvider(provider);
} // component = componentDao.save(component);
// }
// }
return component; return component;
} }
} }
...@@ -123,6 +125,44 @@ public class ComponentManagerImpl implements IComponentManager { ...@@ -123,6 +125,44 @@ public class ComponentManagerImpl implements IComponentManager {
} }
@Override @Override
public int saveComponentList(List<Component> componentList) {
List<Component> newComList = new ArrayList<>();
String addPnStr = "";
for (Component resources :
componentList) {
if (resources.getPartNumber() == null) {
continue;
}
if (resources.getProvider() == null) {
resources.setProvider("");
}
if (resources.getProviderNumber() == null) {
resources.setProviderNumber("");
}
if (resources.getDescription() == null) {
resources.setDescription("");
}
//判断partNum是否重复
Criteria c = Criteria.where("partNumber").is(resources.getPartNumber());
Component com = componentDao.findOne(new Query(c));
if (com != null) {
log.info("saveComponentList 元器件[" + resources.getPartNumber() + "]已存在,暂不处理");
continue;
}
addPnStr += resources.getPartNumber() + ",";
newComList.add(resources);
}
if (newComList.size() > 0) {
componentDao.insertAll(newComList);
log.info("saveComponentList 共新增[" + newComList.size() + "]条元器件:" + addPnStr);
}
return newComList.size();
}
@Override
public Component saveComponent(Component resources) { public Component saveComponent(Component resources) {
if(resources.getPartNumber()==null){ if(resources.getPartNumber()==null){
......
...@@ -82,6 +82,9 @@ public class Barcode extends BasePo implements Serializable { ...@@ -82,6 +82,9 @@ public class Barcode extends BasePo implements Serializable {
* 盘高 * 盘高
*/ */
private int height = 0; private int height = 0;
/**
* 供应商
*/
private String provider; private String provider;
/** /**
* 批次 * 批次
......
...@@ -77,11 +77,9 @@ public class Component extends BasePo implements Serializable { ...@@ -77,11 +77,9 @@ public class Component extends BasePo implements Serializable {
*/ */
//名称 //名称
private String name; private String name;
//料号 /**
//@NotEmpty(message = "{component.partNumber.empty}") * 物料编号
*/
// @NotEmpty(message = "{component.partNumber.empty}")
// @NotNull
private String partNumber; private String partNumber;
/** /**
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!