Commit 87ef70db LN

工单增加自定义的附加字段。修改:模板上传,工单配置,工单上传,工单下载,工单出库。

1 个父辈 fe4ed138
package com.neotel.smfcore.common.excel;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.EasyExcel;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
public class ExcelReader {
public static List<Map<Integer, String>> noModelRead(String fileName,int headRowNumber) {
public static List<Map<Integer, String>> noModelRead(String fileName, int headRowNumber) {
// 这里 只要,然后读取第一个sheet 同步读取会自动finish
NoModelDataListener listener = new NoModelDataListener();
if(headRowNumber<=1){
if (headRowNumber <= 1) {
EasyExcel.read(fileName, listener).sheet().doRead();
}
else{
} else {
EasyExcel.read(fileName, listener).sheet().headRowNumber(headRowNumber).doRead();
}
List<Map<Integer, String>> data = listener.getData();
......@@ -29,6 +31,37 @@ public class ExcelReader {
return data;
}
public static List<Map<Integer, String>> noModelRead(String fileName) {
return noModelRead(fileName,1);
return noModelRead(fileName, 1);
}
public static Map<String, Integer> readHeaderMap(String fileName, int headRowNumber) {
//读取所有excel表头
List<Map<Integer, String>> data = ExcelReader.noModelRead(fileName, headRowNumber);
Map<String, Integer> headerMap = new HashMap<>();
Map<Integer, String> headerData = data.get(0);
if (data != null && data.size() >= 2) {
for (Integer key :
headerData.keySet()) {
if (ObjectUtil.isEmpty(key)) {
continue;
}
String v = headerData.get(key);
if(ObjectUtil.isEmpty(v)){
continue;
}
headerMap.put(v, key);
}
//表头过少,需要重新读取
if (headerMap.size() <= 2) {
if (headRowNumber <= 1) {
log.error("文件[" + fileName + "],当前读取表头数[" + headerData.size() + "],当前headRowNumber=[" + headRowNumber + "],设置headRowNumber=3重新读取");
return readHeaderMap(fileName, 3);
} else {
return headerMap;
}
}
}
return headerMap;
}
}
......@@ -502,9 +502,9 @@ public class LiteOrderCache {
}
}else if (Strings.isNullOrEmpty(reelId) && !Strings.isNullOrEmpty(partNumber)){
//PN
pos=storagePosManager.findPartNumberInStorages(availableStorageIds, partNumber, excludePosIds, checkoutType);
pos=storagePosManager.findPartNumberInStorages(availableStorageIds,"", partNumber, excludePosIds, checkoutType,orderItem.getAppendData());
} else if (Strings.isNullOrEmpty(reelId) && Strings.isNullOrEmpty(partNumber) && !Strings.isNullOrEmpty(mpn)){
pos=storagePosManager.findMpnInStorages(availableStorageIds, mpn, excludePosIds, checkoutType);
pos=storagePosManager.findMpnInStorages(availableStorageIds, mpn, excludePosIds, checkoutType,orderItem.getAppendData());
}
if (pos == null) {
// log.error("未找到可以出库的物料[" + partNumber + "]");
......
......@@ -118,6 +118,21 @@ public class DefaultOrderFileListener implements IOrderFileListener {
int numIndex = csvRead.getIndex("NUM", orderSetting.getNum());
int mpnIndex = csvRead.getIndex("MPN", orderSetting.getMpn());
//附加字段读取
Map<String,Integer> appendIndexMap=new HashMap<>();
if(orderSetting.getAppendData()!=null&&orderSetting.getAppendData().size()>0){
for (String key :
orderSetting.getAppendData().keySet()) {
String value=orderSetting.getAppendData().get(key);
if(ObjectUtil.isNotEmpty(value)){
int index=csvRead.getIndex(value,key);
if(index>=0){
appendIndexMap.put(key,index);
}
}
}
}
int row = 1;
int newRowCount = 0;
int updateRowCount = 0;
......@@ -183,6 +198,22 @@ public class DefaultOrderFileListener implements IOrderFileListener {
item.setFeederInfo(feeder);
item.setRi(ri);
item.setMpn(mpn);
Map<String,String> appendValue=new HashMap<>();
if(appendIndexMap.size()>0){
for (String key :
appendIndexMap.keySet()) {
Integer index=appendIndexMap.get(key);
String value=lineValues[index];
if(ObjectUtil.isNotEmpty(value)){
appendValue.put(key,value);
}
}
if(appendValue.size()>0){
item.setAppendData(appendValue);
}
}
if(!itemMap.containsKey(so)){
itemMap.put(so,new ArrayList<LiteOrderItem>());
}
......@@ -244,7 +275,20 @@ public class DefaultOrderFileListener implements IOrderFileListener {
int feederIndex = headerMap.getOrDefault(orderSetting.getFeeder(), -1);
int soIndex = headerMap.getOrDefault(orderSetting.getSo(), -1);
int numIndex = headerMap.getOrDefault(orderSetting.getNum(), -1);
//附加字段读取
Map<String,Integer> appendIndexMap=new HashMap<>();
if(orderSetting.getAppendData()!=null&&orderSetting.getAppendData().size()>0){
for (String key :
orderSetting.getAppendData().keySet()) {
String value=orderSetting.getAppendData().get(key);
if(ObjectUtil.isNotEmpty(value)){
int index=headerMap.getOrDefault(value,-1);
if(index>=0){
appendIndexMap.put(key,index);
}
}
}
}
for (int i = 1; i < data.size(); i++) {
Map<Integer, String> lineValues = data.get(i);
String partNumber = lineValues.get(partNumberIndex);
......@@ -317,6 +361,20 @@ public class DefaultOrderFileListener implements IOrderFileListener {
if (!itemMap.containsKey(so)) {
itemMap.put(so, new ArrayList<LiteOrderItem>());
}
Map<String,String> appendValue=new HashMap<>();
if(appendIndexMap.size()>0){
for (String key :
appendIndexMap.keySet()) {
Integer index=appendIndexMap.get(key);
String value=lineValues.get(index);
if(ObjectUtil.isNotEmpty(value)){
appendValue.put(key,value);
}
}
if(appendValue.size()>0){
item.setAppendData(appendValue);
}
}
itemMap.get(so).add(item);
}
}
......
......@@ -17,6 +17,7 @@ import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
......@@ -31,6 +32,7 @@ import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.order.util.OrderFileWatch;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.bean.MSDAppendInfo;
import com.neotel.smfcore.core.system.bean.OrderSetting;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
......@@ -115,6 +117,9 @@ public class OrderController {
TaskService taskService;
@Autowired
private DataCache dataCache;
@Autowired
SmfApi smfApi;
// @ApiOperation("导出用户数据")
......@@ -304,6 +309,7 @@ public class OrderController {
Locale locale = request.getLocale();
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.ri",locale,"RI")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.pn",locale,"PN")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.MPN",locale,"MPN")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.side",locale,"面别")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.tableNo",locale,"台车号")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.feederInfo",locale,"站位信息")));
......@@ -313,6 +319,16 @@ public class OrderController {
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.outNum",locale,"已出数量")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.exception",locale,"异常")));
//附加字段
OrderSetting orderSetting=dataCache.getOrderSetting();
if(orderSetting.getAppendData()!=null&&orderSetting.getAppendData().size()>0){
for (String key :
orderSetting.getAppendData().keySet()) {
String title=orderSetting.getAppendData().get(key);
header.add(Lists.newArrayList(title));
}
}
List<List<Object>> dataList = new ArrayList<>();
for (LiteOrderItem orderItem : liteOrder.getOrderItems()) {
......@@ -320,6 +336,7 @@ public class OrderController {
List<Object> data = new ArrayList<>();
data.add(orderItem.getRi());
data.add(orderItem.getPn());
data.add(orderItem.getMpn());
data.add(orderItem.getSide());
data.add(orderItem.getTableNo());
data.add(orderItem.getFeederInfo());
......@@ -329,6 +346,15 @@ public class OrderController {
data.add(orderItem.getOutNum());
String exception=orderItem.getOutNum()<orderItem.getNeedNum()?MessageUtils.getText("smfcore.order.yes",locale,"是"):"";
data.add(exception);
//附加字段
if(orderSetting.getAppendData()!=null&&orderSetting.getAppendData().size()>0){
for (String key :
orderSetting.getAppendData().keySet()) {
String title=orderSetting.getAppendData().get(key);
String v=orderItem.getAppendData().getOrDefault(key,"");
data.add(v);
}
}
dataList.add(data);
}
FileUtil.downloadExcel(liteOrder.getOrderNo(), header,dataList,response);
......
......@@ -5,6 +5,9 @@ import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.Transient;
import java.util.HashMap;
import java.util.Map;
@Getter
@Setter
public class OrderItemDto {
......@@ -53,4 +56,7 @@ public class OrderItemDto {
@ApiModelProperty("制造商物料编号")
private String mpn = "";
@ApiModelProperty("自定义的附加字段,key=字段名,value=值")
public Map<String,String> appendData = new HashMap<>();
}
......@@ -7,6 +7,9 @@ import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
@Data
@Document
public class LiteOrderItem extends BasePo implements Serializable ,Comparable<LiteOrderItem> {
......@@ -88,6 +91,12 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
*/
private String mpn = "";
/**
* 自定义的附加字段,key=字段名,value=值
*/
public Map<String,String> appendData = new HashMap<>();
/**
* 出库是否满足要求,已出库数量大于需求数量
*/
......
......@@ -34,6 +34,7 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType);
StoragePos findPartNumberInStorages(List<String> storageIdList,String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType);
StoragePos findPartNumberInStorages(List<String> storageIdList,String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType,Map<String,String> appendDate);
List<StoragePos> findByQuery(Query query, Pageable pageable);
......@@ -81,7 +82,7 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
List<StoragePos> findPosByIdList(List<String> idList);
StoragePos findMpnInStorages(List<String> availableStorageIds, String mpn, Collection<String> excludePosIds, CHECKOUT_TYPE checkoutType);
StoragePos findMpnInStorages(List<String> availableStorageIds, String mpn, Collection<String> excludePosIds, CHECKOUT_TYPE checkoutType,Map<String,String> appendData);
List<StoragePos> findExpiredOrSluggishBarcode(Date date,int type);
}
......@@ -6,6 +6,7 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.common.utils.PointUtil;
import com.neotel.smfcore.core.barcode.bean.PlateSizeBean;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
......@@ -28,6 +29,7 @@ import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import java.text.ParseException;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
......@@ -260,7 +262,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
return findPartNumberInStorages(storageIdList,"",pn,excludePosIds,checkOutType);
}
@Override
public StoragePos findPartNumberInStorages(List<String> storageIdList,String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType) {
public StoragePos findPartNumberInStorages(List<String> storageIdList,String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType,Map<String, String> appendDate) {
Criteria c = Criteria.where("barcode.partNumber").is(pn)
.and("id").nin(excludePosIds)
.and("enabled").is(true)//可用
......@@ -271,6 +273,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
if (ObjectUtil.isNotEmpty(labelId)) {
c.and("labelId").is(labelId);
}
c=addAppendData(c,appendDate);
Query q = new Query(c);
Sort sort = getSortByCheckOutType(checkOutType);
q.with(sort);
......@@ -283,6 +286,11 @@ public class StoragePosManagerImpl implements IStoragePosManager {
return pos;
}
@Override
public StoragePos findPartNumberInStorages(List<String> storageIdList, String labelId, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType) {
return findPartNumberInStorages(storageIdList,labelId,pn,excludePosIds,checkOutType,new HashMap<>());
}
/**
* 根据出库方式获取不同的 Sort
*/
......@@ -677,7 +685,7 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}
@Override
public StoragePos findMpnInStorages(List<String> storageIdList, String mpn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType) {
public StoragePos findMpnInStorages(List<String> storageIdList, String mpn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType,Map<String,String> appendData) {
Criteria c = Criteria.where("barcode.mpn").is(mpn)
.and("id").nin(excludePosIds)
.and("enabled").is(true)//可用
......@@ -685,6 +693,8 @@ public class StoragePosManagerImpl implements IStoragePosManager {
if (storageIdList != null) {
c = c.and("storageId").in(storageIdList);
}
c = addAppendData(c, appendData);
Query q = new Query(c);
Sort sort = getSortByCheckOutType(checkOutType);
q.with(sort);
......@@ -697,6 +707,40 @@ public class StoragePosManagerImpl implements IStoragePosManager {
return pos;
}
private Criteria addAppendData(Criteria c, Map<String,String> appendData){
try {
if(appendData!=null&&appendData.size()>0){
for (String key :
appendData.keySet()) {
String value=appendData.get(key);
if(ObjectUtil.isNotEmpty(key)&&ObjectUtil.isNotEmpty(value)) {
key=key.replace("#",".");
//如果是过期日期
if (key.equals("barcode.expireDate") || key.equals("barcode.produceDate")) { //如果是生产日期
//把value转换为时间
// DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date date = DateUtil.toDate(value);
if(date!=null) {
c.and(key).is(date);
}
} catch (ParseException e) {
e.printStackTrace();
continue;//转换出错直接continue;
}
} else {
c.and(key).is(value);
}
}
}
}
}catch (Exception ex){
log.error("addAppendData 处理出错:"+appendData);
}
return c;
}
@Override
public List<StoragePos> findExpiredOrSluggishBarcode(Date date, int type) {
Query q = new Query();
......
......@@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
@Data
public class OrderSetting implements Serializable {
......@@ -28,6 +30,11 @@ public class OrderSetting implements Serializable {
public String mpn="MPN";
/**
* 自定义的附加字段,key=字段名,value=表头名称
*/
public Map<String,String> appendData = new HashMap<>();
/**
* 是否显示料架亮灯方式
*/
@ApiModelProperty("是否显示料架亮灯方式 ture=显示")
......
......@@ -3,6 +3,7 @@ package com.neotel.smfcore.core.system.rest;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.csv.CsvReader;
import com.neotel.smfcore.common.excel.ExcelReader;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.DateUtil;
......@@ -187,6 +188,19 @@ public class SettingsController {
}
}
if(orderSetting.getAppendData()!=null&&orderSetting.getAppendData().size()>0) {
Map<String, String> appendData = new HashMap<>();
for (String key :
orderSetting.getAppendData().keySet()) {
String value = orderSetting.getAppendData().get(key);
if (ObjectUtil.isNotEmpty(key) && ObjectUtil.isNotEmpty(value)) {
String nKey = key.replace(".", "#");
appendData.put(nKey, value);
}
}
orderSetting.setAppendData(appendData);
}
dataCache.updateCache(Constants.CACHE_OrderSetting, orderSetting);
log.info("更改工单设置:"+Constants.CACHE_OrderSetting+"=" + orderSetting.toString());
return ResultBean.newOkResult("保存成功");
......@@ -247,22 +261,32 @@ public class SettingsController {
@AnonymousAccess
public ResultBean uploadOrderModel(@RequestParam MultipartFile orderFile) {
String image = "csv";
String csv = "csv";
String excel = "xlsx";
String fileType = FileUtil.getExtensionName(orderFile.getOriginalFilename());
String fileName = FileUtil.getFileNameNoEx(orderFile.getOriginalFilename());
if (fileType != null && !image.contains(fileType)) {
throw new ValidateException("smfcore.feleFormatError", "文件格式错误!, 仅支持{0}格式", new String[]{image});
if (fileType != null && (!csv.contains(fileType)) && (!excel.contains(fileType))) {
throw new ValidateException("smfcore.feleFormatError", "文件格式错误!, 仅支持{0}格式", new String[]{csv + "," + excel});
}
File folder = new File(properties.getPath(), "pos");
File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath());
try {
CsvReader csvRead = CsvReader.newReader(localFile.getAbsolutePath(),"","" );
String[] headers=csvRead.getHeaders();
if (fileType.equals(csv)) {
CsvReader csvRead = CsvReader.newReader(localFile.getAbsolutePath(), "", "");
String[] headers = csvRead.getHeaders();
return ResultBean.newOkResult(headers);
} else if (fileType.equals(excel)) {
//读取所有excel表头
Map<String, Integer> headerData = ExcelReader.readHeaderMap(localFile.getAbsolutePath(), 1);
String[] headerArray = new String[headerData.size()];
headerData.keySet().toArray(headerArray);
return ResultBean.newOkResult(headerArray);
}
} catch (IOException e) {
e.printStackTrace();
return ResultBean.newOkResult("");
}
return ResultBean.newOkResult("");
}
@ApiOperation("获取版本号")
@GetMapping("/version")
......
......@@ -312,6 +312,7 @@ smfcore.humiture.createDate=\u521B\u5EFA\u65F6\u95F4
smfcore.humiture.updateDate=\u66F4\u65B0\u65F6\u95F4
smfcore.order.ri=RI
smfcore.order.pn=PN
smfcore.order.MPN=MPN
smfcore.order.side=\u9762\u522B
smfcore.order.tableNo=\u53F0\u8F66\u53F7
smfcore.order.feederInfo=\u7AD9\u4F4D\u4FE1\u606F
......
......@@ -311,6 +311,7 @@ smfcore.humiture.createDate=Create Time
smfcore.humiture.updateDate=Update Time
smfcore.order.ri=RI
smfcore.order.pn=PN
smfcore.order.MPN=MPN
smfcore.order.side=Face Type
smfcore.order.tableNo=Trolley Number
smfcore.order.feederInfo=Station Information
......
......@@ -308,6 +308,7 @@ smfcore.humiture.createDate=\u521B\u5EFA\u65F6\u95F4
smfcore.humiture.updateDate=\u66F4\u65B0\u65F6\u95F4
smfcore.order.ri=RI
smfcore.order.pn=PN
smfcore.order.MPN=MPN
smfcore.order.side=\u3068\u5225\u308C\u308B
smfcore.order.tableNo=\u53F0\u8ECA\u756A\u53F7
smfcore.order.feederInfo=\u7AD9\u4F4D\u4FE1\u606F
......
......@@ -308,6 +308,7 @@ smfcore.humiture.createDate=\u521B\u5EFA\u65F6\u95F4
smfcore.humiture.updateDate=\u66F4\u65B0\u65F6\u95F4
smfcore.order.ri=RI
smfcore.order.pn=PN
smfcore.order.MPN=MPN
smfcore.order.side=\u9762\u522B
smfcore.order.tableNo=\u53F0\u8F66\u53F7
smfcore.order.feederInfo=\u7AD9\u4F4D\u4FE1\u606F
......
......@@ -309,6 +309,7 @@ smfcore.humiture.createDate=\u521B\u5EFA\u65F6\u95F4
smfcore.humiture.updateDate=\u66F4\u65B0\u65F6\u95F4
smfcore.order.ri=RI
smfcore.order.pn=PN
smfcore.order.MPN=MPN
smfcore.order.side=\u9762\u5225
smfcore.order.tableNo=\u53F0\u8ECA\u865F
smfcore.order.feederInfo=\u7AD9\u4F4D\u4FE1\u606F
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!