Commit 5b26cb19 LN

元器件增加导入功能

1 个父辈 2d9fbf4b
package com.neotel.smfcore.core.barcode.rest;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
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.utils.FileUtil;
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.ComponentMatchingDto;
......@@ -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.utils.QrcodeUtils;
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.ApiOperation;
import lombok.RequiredArgsConstructor;
......@@ -26,14 +31,12 @@ import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
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 java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.io.File;
import java.io.IOException;
import java.util.*;
@Slf4j
@RestController
......@@ -51,6 +54,8 @@ public class ComponentController {
private final QrcodeUtils qrcodeUtils;
@Autowired
private final FileProperties properties;
@Autowired
private final IStoragePosManager storagePosManager;
@ApiOperation("导出元器件信息")
......@@ -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> {
void download(List<Component> queryAll, HttpServletResponse response) throws IOException;
void deleteComponents(Set<String> ids);
int saveComponentList(List<Component> componentList);
}
......@@ -68,17 +68,19 @@ public class ComponentManagerImpl implements IComponentManager {
if (StringUtils.isEmpty(partNumber))
return null;
else {
Component component = componentDao.findOneByCondition(new String[]{"partNumber", "provider"}, new String[]{partNumber, provider});
if (component == null) {
component = componentDao.findOneByCondition(new String[]{"partNumber", "provider"}, new String[]{partNumber, null});
if(component==null){
component = componentDao.findOneByCondition(new String[]{"partNumber", "provider"}, new String[]{partNumber, ""});
}
if (component != null) {
component.setProvider(provider);
component = componentDao.save(component);
}
}
Component component = componentDao.findOneByCondition(new String[]{"partNumber"}, new String[]{partNumber});
// Component component = componentDao.findOneByCondition(new String[]{"partNumber", "provider"}, new String[]{partNumber, provider});
// if (component == null) {
// component = componentDao.findOneByCondition(new String[]{"partNumber", "provider"}, new String[]{partNumber, null});
// if (component == null) {
// component = componentDao.findOneByCondition(new String[]{"partNumber", "provider"}, new String[]{partNumber, ""});
// }
// if (component != null) {
// component.setProvider(provider);
// component = componentDao.save(component);
// }
// }
return component;
}
}
......@@ -123,6 +125,44 @@ public class ComponentManagerImpl implements IComponentManager {
}
@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) {
if(resources.getPartNumber()==null){
......
......@@ -82,6 +82,9 @@ public class Barcode extends BasePo implements Serializable {
* 盘高
*/
private int height = 0;
/**
* 供应商
*/
private String provider;
/**
* 批次
......
......@@ -77,11 +77,9 @@ public class Component extends BasePo implements Serializable {
*/
//名称
private String name;
//料号
//@NotEmpty(message = "{component.partNumber.empty}")
// @NotEmpty(message = "{component.partNumber.empty}")
// @NotNull
/**
* 物料编号
*/
private String partNumber;
/**
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!