Commit dbbd5422 by wangchunyang

办公用品导入

parent 76ffaf9f
package com.scpyun.platform.jilinsscgsdp.bean.entity;
public class MaterialImp {
private String category_Code;
private String category_Name;
private String material_code;
private String material_name;
private String material_spec;
private String unit;
private Double unit_price;
private String storage_location;
private Double min_stock;
private Double max_stock;
private Integer can_borrow;
private String material_desc;
public String getCategory_Code() { return category_Code; }
public void setCategory_Code(String category_Code) { this.category_Code = category_Code; }
public String getCategory_Name() { return category_Name; }
public void setCategory_Name(String category_Name) { this.category_Name = category_Name; }
public String getMaterial_code() { return material_code; }
public void setMaterial_code(String material_code) { this.material_code = material_code; }
public String getMaterial_name() { return material_name; }
public void setMaterial_name(String material_name) { this.material_name = material_name; }
public String getMaterial_spec() { return material_spec; }
public void setMaterial_spec(String material_spec) { this.material_spec = material_spec; }
public String getUnit() { return unit; }
public void setUnit(String unit) { this.unit = unit; }
public Double getUnit_price() { return unit_price; }
public void setUnit_price(Double unit_price) { this.unit_price = unit_price; }
public String getStorage_location() { return storage_location; }
public void setStorage_location(String storage_location) { this.storage_location = storage_location; }
public Double getMin_stock() { return min_stock; }
public void setMin_stock(Double min_stock) { this.min_stock = min_stock; }
public Double getMax_stock() { return max_stock; }
public void setMax_stock(Double max_stock) { this.max_stock = max_stock; }
public Integer getCan_borrow() { return can_borrow; }
public void setCan_borrow(Integer can_borrow) { this.can_borrow = can_borrow; }
public String getMaterial_desc() { return material_desc; }
public void setMaterial_desc(String material_desc) { this.material_desc = material_desc; }
}
...@@ -11,6 +11,18 @@ import org.springframework.stereotype.Service; ...@@ -11,6 +11,18 @@ import org.springframework.stereotype.Service;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.scpyun.platform.jilinsscgsdp.utils.MaterialFileListener;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;
import java.io.IOException;
@Api("办公用品管理") @Api("办公用品管理")
@Service("keyDmMaterial") @Service("keyDmMaterial")
...@@ -62,5 +74,38 @@ public class KeyDmMaterialServiceImpl { ...@@ -62,5 +74,38 @@ public class KeyDmMaterialServiceImpl {
} }
return SUCCESS; return SUCCESS;
} }
@ApiOperation(value = "导入物料", desc = "解析 Excel 导入物料信息")
public Map<String, Object> importExcel(Map<String, Object> map, MultipartFile file) {
Map<String, Object> result = new HashMap<>();
try {
MaterialFileListener listener = new MaterialFileListener(commonService, namespace, map);
EasyExcel.read(file.getInputStream(), com.scpyun.platform.jilinsscgsdp.bean.entity.MaterialImp.class, listener).sheet().headRowNumber(1).doRead();
result = listener.getResult();
} catch (IOException e) {
throw new CustomException("导入失败");
}
return result;
}
@ApiOperation(value = "导入模板下载", desc = "下载物料导入模板")
public void templateDownload(Map<String, Object> map, HttpServletResponse response) {
response.setContentType("application/application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
try {
String fileName = URLEncoder.encode("物料导入模板", "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
response.setHeader("filename", fileName + ".xlsx");
response.setHeader("Access-Control-Expose-Headers", "filename,Content-Disposition");
String tpl = "keyMaterialImp.xlsx";
Resource resource = new ClassPathResource(tpl);
InputStream is = resource.getInputStream();
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(is).excelType(ExcelTypeEnum.XLSX).build();
excelWriter.finish();
} catch (Exception e) {
throw new CustomException("模板下载失败");
}
}
} }
package com.scpyun.platform.jilinsscgsdp.utils;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.scpyun.base.core.utils.UUIDUtil;
import com.scpyun.base.db.service.CommonService;
import com.scpyun.platform.jilinsscgsdp.bean.entity.MaterialImp;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
public class MaterialFileListener extends AnalysisEventListener<MaterialImp> {
private static final Logger log = LoggerFactory.getLogger(MaterialFileListener.class);
private static final int BATCH_COUNT = 200;
private List<MaterialImp> cached = new ArrayList<>(BATCH_COUNT);
private AtomicInteger insertCount = new AtomicInteger(0);
private AtomicInteger updateCount = new AtomicInteger(0);
private AtomicInteger errorCount = new AtomicInteger(0);
private CommonService commonService;
private String namespace;
private Map<String,Object> param;
private List<String> errInfo = new ArrayList<>();
public MaterialFileListener(CommonService commonService, String namespace, Map<String,Object> param) {
this.commonService = commonService;
this.namespace = namespace;
this.param = param;
}
@Override
public void invoke(MaterialImp data, AnalysisContext context) {
try {
cached.add(data);
if (cached.size() >= BATCH_COUNT) {
saveBatch();
cached.clear();
}
} catch (Exception e) {
errorCount.incrementAndGet();
log.error("解析物料导入行异常", e);
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
if (!cached.isEmpty()) {
saveBatch();
cached.clear();
}
}
private void saveBatch() {
for (MaterialImp m : cached) {
try {
Map<String,Object> q = new HashMap<>();
q.put("material_code", m.getMaterial_code());
Map<String,Object> exists = commonService.getObject(namespace + "getByCode", q);
Map<String,Object> row = new HashMap<>();
row.put("category_Code", m.getCategory_Code());
row.put("category_Name", m.getCategory_Name());
row.put("material_code", m.getMaterial_code());
row.put("material_name", m.getMaterial_name());
row.put("material_spec", m.getMaterial_spec());
row.put("unit", m.getUnit());
row.put("unit_price", m.getUnit_price());
row.put("storage_location", m.getStorage_location());
row.put("min_stock", m.getMin_stock());
row.put("max_stock", m.getMax_stock());
row.put("can_borrow", m.getCan_borrow());
row.put("material_desc", m.getMaterial_desc());
row.put("order_no", 0);
if (exists == null) {
row.put("id", UUIDUtil.getUUID());
commonService.insert(namespace + "insert", row);
insertCount.incrementAndGet();
} else {
row.put("id", exists.get("id"));
commonService.update(namespace + "update", row);
updateCount.incrementAndGet();
}
} catch (Exception ex) {
errorCount.incrementAndGet();
errInfo.add(m.getMaterial_code() + ":" + ex.getMessage());
}
}
}
public Map<String,Object> getResult() {
Map<String,Object> r = new HashMap<>();
r.put("insert", insertCount.get());
r.put("update", updateCount.get());
r.put("error", errorCount.get());
r.put("errInfo", String.join(",", errInfo));
return r;
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论