Commit 7ffd7338 LN

增加工单模板上传

1 个父辈 2790543e
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
*/ */
package com.neotel.smfcore.common.csv; package com.neotel.smfcore.common.csv;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -27,6 +28,8 @@ import java.io.*; ...@@ -27,6 +28,8 @@ import java.io.*;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.util.HashMap; import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** /**
* A stream based parser for parsing delimited text data from a file or a * A stream based parser for parsing delimited text data from a file or a
...@@ -35,16 +38,27 @@ import java.util.HashMap; ...@@ -35,16 +38,27 @@ import java.util.HashMap;
@Slf4j @Slf4j
public class CsvReader { public class CsvReader {
public static CsvReader newReader(String fileURL, String titleName,String titleNameEn) throws IOException { public static CsvReader newReader(String fileURL, String titleName,String titleNameEn) throws IOException {
String reloadEncodeing="GBK"; String reloadEncodeing = "GBK";
CsvReader csvRead = new CsvReader(fileURL); CsvReader csvRead = new CsvReader(fileURL);
csvRead.setSkipEmptyRecords(true); csvRead.setSkipEmptyRecords(true);
csvRead.setTrimWhitespace(true); csvRead.setTrimWhitespace(true);
csvRead.readHeaders(); csvRead.readHeaders();
String[] headers = csvRead.getHeaders();
int index = csvRead.getIndex(titleName, titleNameEn); boolean needReload = false;
if (headers.length > 0 && ObjectUtil.isNotEmpty(headers[0]) && isMessyCode(headers[0])) {
needReload = true;
log.info("文件[" + fileURL + "]有乱码,改为" + reloadEncodeing + "重新读取");
}
else if (ObjectUtil.isNotEmpty(titleName) || ObjectUtil.isNotEmpty(titleNameEn)) {
int index = csvRead.getIndex(titleName, titleNameEn);
if (index == -1) {
needReload = true;
log.info("文件[" + fileURL + "]未包含列[" + titleName + "][" + titleNameEn + "],改为" + reloadEncodeing + "重新读取");
}
}
//未找到列,重新读取 //未找到列,重新读取
if (index == -1) { if (needReload) {
log.info("文件未包含列[" + titleName + "][" + titleNameEn + "],改为" + reloadEncodeing + "重新读取");
csvRead.close(); csvRead.close();
csvRead = new CsvReader(fileURL, CsvReader.Letters.COMMA, Charset.forName(reloadEncodeing)); csvRead = new CsvReader(fileURL, CsvReader.Letters.COMMA, Charset.forName(reloadEncodeing));
csvRead.setSkipEmptyRecords(true); csvRead.setSkipEmptyRecords(true);
...@@ -54,6 +68,43 @@ public class CsvReader { ...@@ -54,6 +68,43 @@ public class CsvReader {
return csvRead; return csvRead;
} }
public static boolean isMessyCode(String strName) {
Pattern p = Pattern.compile("\\s*|t*|r*|n*");
Matcher m = p.matcher(strName);
String after = m.replaceAll("");
String temp = after.replaceAll("\\p{P}", "");
char[] ch = temp.trim().toCharArray();
float chLength = ch.length;
float count = 0;
for (int i = 0; i < ch.length; i++) {
char c = ch[i];
if (!Character.isLetterOrDigit(c)) {
if (!isChinese(c)) {
count = count + 1;
}
}
}
float result = count / chLength;
if (result > 0.4) {
return true;
} else {
return false;
}
}
public static boolean isChinese(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
return true;
}
return false;
}
private Reader inputStream = null; private Reader inputStream = null;
private String fileName = null; private String fileName = null;
......
...@@ -137,9 +137,12 @@ public class OrderController { ...@@ -137,9 +137,12 @@ public class OrderController {
} }
File folder = new File(properties.getPath(), "pos"); File folder = new File(properties.getPath(), "pos");
File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath()); File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath());
orderFileWatch.handleOrderFile(localFile); boolean result = orderFileWatch.handleOrderFile(localFile);
if (result) {
return ResultBean.newOkResult("smfcore.order.uploadOK", "工单上传成功"); return ResultBean.newOkResult("smfcore.order.uploadOK", "工单上传成功");
} else {
return ResultBean.newErrorResult(-1,"smfcore.order.uploadFailure","上传失败");
}
} }
@ApiOperation("工单出库") @ApiOperation("工单出库")
......
...@@ -2,6 +2,7 @@ package com.neotel.smfcore.core.system.rest; ...@@ -2,6 +2,7 @@ package com.neotel.smfcore.core.system.rest;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.ResultBean; 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.Constants; import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.DateUtil; import com.neotel.smfcore.common.utils.DateUtil;
...@@ -17,6 +18,8 @@ import com.neotel.smfcore.core.system.rest.bean.dto.SettingsDto; ...@@ -17,6 +18,8 @@ import com.neotel.smfcore.core.system.rest.bean.dto.SettingsDto;
import com.neotel.smfcore.core.system.rest.bean.dto.SysSettingsDto; import com.neotel.smfcore.core.system.rest.bean.dto.SysSettingsDto;
import com.neotel.smfcore.core.system.rest.bean.mapstruct.SettingsMapper; import com.neotel.smfcore.core.system.rest.bean.mapstruct.SettingsMapper;
import com.neotel.smfcore.core.system.service.po.Settings; import com.neotel.smfcore.core.system.service.po.Settings;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.security.bean.FileProperties;
import com.neotel.smfcore.security.rest.bean.dto.MenuDto; import com.neotel.smfcore.security.rest.bean.dto.MenuDto;
import com.neotel.smfcore.security.rest.bean.query.UserQueryCriteria; import com.neotel.smfcore.security.rest.bean.query.UserQueryCriteria;
import com.neotel.smfcore.security.service.po.Menu; import com.neotel.smfcore.security.service.po.Menu;
...@@ -34,6 +37,7 @@ import org.springframework.http.ResponseEntity; ...@@ -34,6 +37,7 @@ 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.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
...@@ -50,6 +54,9 @@ import java.util.*; ...@@ -50,6 +54,9 @@ import java.util.*;
public class SettingsController { public class SettingsController {
@Autowired @Autowired
private DataCache dataCache; private DataCache dataCache;
@Autowired
private final FileProperties properties;
/** /**
* 当前版本 * 当前版本
*/ */
...@@ -210,7 +217,28 @@ public class SettingsController { ...@@ -210,7 +217,28 @@ public class SettingsController {
log.error("导出失败" + e.getMessage(), e); log.error("导出失败" + e.getMessage(), e);
} }
} }
@ApiOperation("上传工单模板")
@PostMapping(value = "/uploadOrderModel")
@AnonymousAccess
public ResultBean uploadOrderModel(@RequestParam MultipartFile orderFile) {
String image = "csv";
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});
}
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();
return ResultBean.newOkResult(headers);
} catch (IOException e) {
e.printStackTrace();
return ResultBean.newOkResult("");
}
}
@ApiOperation("获取版本号") @ApiOperation("获取版本号")
@GetMapping("/version") @GetMapping("/version")
public String version() { public String version() {
......
...@@ -259,7 +259,9 @@ smfcore.error.getMaterialLot.in=\u6761\u7801[{0}]\u9A8C\u8BC1\u5931\u8D25\uFF0C\ ...@@ -259,7 +259,9 @@ smfcore.error.getMaterialLot.in=\u6761\u7801[{0}]\u9A8C\u8BC1\u5931\u8D25\uFF0C\
smfcore.error.getMaterialLot.out=\u6761\u7801[{0}]\u9A8C\u8BC1\u5931\u8D25\uFF0C\u65E0\u6CD5\u51FA\u5E93 smfcore.error.getMaterialLot.out=\u6761\u7801[{0}]\u9A8C\u8BC1\u5931\u8D25\uFF0C\u65E0\u6CD5\u51FA\u5E93
smfcore.spKanban=\u8BBE\u5907\u6982\u89C8 smfcore.spKanban=\u8BBE\u5907\u6982\u89C8
smfcore.agv=AGV smfcore.agv=AGV
smfcore.micron.operationFailure=\u64CD\u4F5C\u5931\u8D25
smfcore.micron.checkoutByPnFail=\u672A\u627E\u5230\u53EF\u51FA\u5E93\u7269\u6599
smfcore.order.uploadFailure=\u4E0A\u4F20\u5931\u8D25
#smfclient.nlp.onlyOneTray=\u4E0D\u53EF\u540C\u65F6\u653E\u5165\u591A\u76D8\u7269\u6599:{0} #smfclient.nlp.onlyOneTray=\u4E0D\u53EF\u540C\u65F6\u653E\u5165\u591A\u76D8\u7269\u6599:{0}
#smfclient.nlp.cannotFindPos={0}\u672A\u627E\u5230\u5E93\u4F4D:{1} #smfclient.nlp.cannotFindPos={0}\u672A\u627E\u5230\u5E93\u4F4D:{1}
#smfclient.nlp.inputOk={0}\u5165\u5E93\u5230{1}\u6210\u529F #smfclient.nlp.inputOk={0}\u5165\u5E93\u5230{1}\u6210\u529F
......
...@@ -257,3 +257,6 @@ smfcore.error.virtualOut.num=The number cannot exceed {0} ...@@ -257,3 +257,6 @@ smfcore.error.virtualOut.num=The number cannot exceed {0}
smfcore.error.virtualOut.noItem=The corresponding material is not found in work order {0} smfcore.error.virtualOut.noItem=The corresponding material is not found in work order {0}
smfcore.spKanban=Equipment Overview smfcore.spKanban=Equipment Overview
smfcore.agv=AGV smfcore.agv=AGV
smfcore.micron.operationFailure=Operation failed
smfcore.micron.checkoutByPnFail=Material not found for dispatch
smfcore.order.uploadFailure=Upload failed
...@@ -255,3 +255,6 @@ smfcore.error.virtualOut.num=\u6570\u91CF\u4E0D\u80FD\u8D85\u8FC7{0} ...@@ -255,3 +255,6 @@ smfcore.error.virtualOut.num=\u6570\u91CF\u4E0D\u80FD\u8D85\u8FC7{0}
smfcore.error.virtualOut.noItem=\u5DE5\u5355{0}\u4E2D\u672A\u627E\u5230\u5BF9\u5E94\u7684PN\u6216\u7269\u6599\u7F16\u53F7 smfcore.error.virtualOut.noItem=\u5DE5\u5355{0}\u4E2D\u672A\u627E\u5230\u5BF9\u5E94\u7684PN\u6216\u7269\u6599\u7F16\u53F7
smfcore.spKanban=\u6A5F\u5668\u6982\u8981 smfcore.spKanban=\u6A5F\u5668\u6982\u8981
smfcore.agv=AGV smfcore.agv=AGV
smfcore.micron.operationFailure=\u64CD\u4F5C\u306B\u5931\u6557\u3057\u305F
smfcore.micron.checkoutByPnFail=\u672A\u627E\u5230\u53EF\u51FA\u5E93\u7269\u6599
smfcore.order.uploadFailure=\u4E0A\u4F20\u5931\u8D25
...@@ -254,4 +254,7 @@ smfcore.greaterThanZero=\u6570\u91CF\u5FC5\u987B\u5927\u4E8E0 ...@@ -254,4 +254,7 @@ smfcore.greaterThanZero=\u6570\u91CF\u5FC5\u987B\u5927\u4E8E0
smfcore.error.virtualOut.num=\u6570\u91CF\u4E0D\u80FD\u8D85\u8FC7{0} smfcore.error.virtualOut.num=\u6570\u91CF\u4E0D\u80FD\u8D85\u8FC7{0}
smfcore.error.virtualOut.noItem=\u5DE5\u5355{0}\u4E2D\u672A\u627E\u5230\u5BF9\u5E94\u7684PN\u6216\u7269\u6599\u7F16\u53F7 smfcore.error.virtualOut.noItem=\u5DE5\u5355{0}\u4E2D\u672A\u627E\u5230\u5BF9\u5E94\u7684PN\u6216\u7269\u6599\u7F16\u53F7
smfcore.spKanban=\u8BBE\u5907\u6982\u89C8 smfcore.spKanban=\u8BBE\u5907\u6982\u89C8
smfcore.agv=AGV
\ No newline at end of file \ No newline at end of file
smfcore.agv=AGV
smfcore.micron.operationFailure=\u64CD\u4F5C\u5931\u8D25
smfcore.micron.checkoutByPnFail=\u672A\u627E\u5230\u53EF\u51FA\u5E93\u7269\u6599
smfcore.order.uploadFailure=\u4E0A\u4F20\u5931\u8D25
\ No newline at end of file \ No newline at end of file
...@@ -256,3 +256,6 @@ smfcore.error.virtualOut.num=\u6578\u91CF\u4E0D\u80FD\u8D85\u904E{0} ...@@ -256,3 +256,6 @@ smfcore.error.virtualOut.num=\u6578\u91CF\u4E0D\u80FD\u8D85\u904E{0}
smfcore.error.virtualOut.noItem=\u5DE5\u55AE{0}\u4E2D\u672A\u627E\u5230\u5C0D\u61C9\u7684PN\u7269\u6599\u7DE8\u865F smfcore.error.virtualOut.noItem=\u5DE5\u55AE{0}\u4E2D\u672A\u627E\u5230\u5C0D\u61C9\u7684PN\u7269\u6599\u7DE8\u865F
smfcore.spKanban=\u8BBE\u5907\u6982\u89C8 smfcore.spKanban=\u8BBE\u5907\u6982\u89C8
smfcore.agv=AGV smfcore.agv=AGV
smfcore.micron.operationFailure=\u64CD\u4F5C\u5931\u6557
smfcore.micron.checkoutByPnFail=\u672A\u627E\u5230\u53EF\u51FA\u5EAB\u7269\u6599
smfcore.order.uploadFailure=\u4E0A\u4F20\u5931\u8D25
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!