diff --git a/doc/若依环境使用手册.docx b/doc/若依环境使用手册.docx deleted file mode 100644 index 9e4daef..0000000 Binary files a/doc/若依环境使用手册.docx and /dev/null differ diff --git a/pom.xml b/pom.xml index 9ac3c83..112d5a3 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,7 @@ 1.2.13 5.7.12 5.3.39 + 4.5.14 @@ -225,6 +226,13 @@ ${tagApi.version} + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + + diff --git a/tagApi-admin/pom.xml b/tagApi-admin/pom.xml index 3e2158c..a2f2501 100644 --- a/tagApi-admin/pom.xml +++ b/tagApi-admin/pom.xml @@ -61,6 +61,11 @@ tagApi-generator + + hw.tagApi + tagApi-service + + diff --git a/tagApi-admin/src/main/resources/application.yml b/tagApi-admin/src/main/resources/application.yml index 4c19720..fc31a9c 100644 --- a/tagApi-admin/src/main/resources/application.yml +++ b/tagApi-admin/src/main/resources/application.yml @@ -43,7 +43,7 @@ user: # 密码最大错误次数 maxRetryCount: 5 # 密码锁定时间(默认10分钟) - lockTime: 10 + lockTime: 720 # Spring配置 spring: diff --git a/tagApi-common/pom.xml b/tagApi-common/pom.xml index 15ce405..c9bb8d4 100644 --- a/tagApi-common/pom.xml +++ b/tagApi-common/pom.xml @@ -119,6 +119,12 @@ javax.servlet-api + + + org.apache.httpcomponents + httpclient + + \ No newline at end of file diff --git a/tagApi-common/src/main/java/hw/tagApi/common/utils/poi/TagExcelUtil.java b/tagApi-common/src/main/java/hw/tagApi/common/utils/poi/TagExcelUtil.java new file mode 100644 index 0000000..afbf8d0 --- /dev/null +++ b/tagApi-common/src/main/java/hw/tagApi/common/utils/poi/TagExcelUtil.java @@ -0,0 +1,178 @@ +package hw.tagApi.common.utils.poi; + +import org.apache.poi.ss.usermodel.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; + +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 标签数据Excel解析工具类 + * + * @author Yinq + */ +public class TagExcelUtil { + private static final Logger log = LoggerFactory.getLogger(TagExcelUtil.class); + + /** + * 解析标签数据Excel + * + * @param is Excel文件输入流 + * @return 解析结果,包含订单信息和标签数据列表 + */ + public static Map parseTagExcel(InputStream is) { + Map result = new HashMap<>(); + try (Workbook workbook = WorkbookFactory.create(is)) { + Sheet sheet = workbook.getSheetAt(0); + + // 解析订单信息 + Map orderInfo = parseOrderInfo(sheet); + result.put("orderInfo", orderInfo); + + // 解析标签数据 + List> tagList = parseTagList(sheet); + result.put("tagList", tagList); + + return result; + } catch (Exception e) { + log.error("解析Excel文件失败", e); + throw new RuntimeException("解析Excel文件失败: " + e.getMessage()); + } + } + + /** + * 解析订单信息(前5行) + */ + private static Map parseOrderInfo(Sheet sheet) { + Map orderInfo = new HashMap<>(); + try { + // 订单号 - 格式: 订单号:Lot20250109 + Row orderRow = sheet.getRow(0); + String orderNoCell = getCellStringValue(orderRow.getCell(0)); + orderInfo.put("orderNo", orderNoCell.substring(orderNoCell.indexOf(":") + 1).trim()); + + // 批次号 - 格式: 批次号:002 + Row batchRow = sheet.getRow(1); + String batchNoCell = getCellStringValue(batchRow.getCell(0)); + orderInfo.put("batchNo", batchNoCell.substring(batchNoCell.indexOf(":") + 1).trim()); + + // 操作人员号 - 格式: 操作人员号:WJL + Row operatorRow = sheet.getRow(2); + String operatorIdCell = getCellStringValue(operatorRow.getCell(0)); + orderInfo.put("operatorId", operatorIdCell.substring(operatorIdCell.indexOf(":") + 1).trim()); + + // 加工时间 - 格式: 加工时间:2025/1/9 14:00:19 + Row timeRow = sheet.getRow(3); + String processTimeCell = getCellStringValue(timeRow.getCell(0)); + String processTime = processTimeCell.substring(processTimeCell.indexOf(":") + 1).trim(); + if (processTime.contains("/")) { + // 转换日期格式为标准格式 + String[] parts = processTime.split(" "); + if (parts.length == 2) { + String datePart = parts[0].replace("/", "-"); + processTime = datePart + " " + parts[1]; + } + } + orderInfo.put("processTime", processTime); + + // 数量信息 - 格式: 合格数量:2500,不合格数量:0,总数量:2500 + Row quantityRow = sheet.getRow(4); + String quantityCell = getCellStringValue(quantityRow.getCell(0)); + String[] quantities = quantityCell.split(","); + for (String quantity : quantities) { + String[] parts = quantity.split(":"); + if (parts.length == 2) { + String value = parts[1].trim(); + if (quantity.contains("合格数量") && !quantity.contains("不合格数量")) { + orderInfo.put("qualifiedCount", value); + } else if (quantity.contains("不合格数量")) { + orderInfo.put("unqualifiedCount", value); + } else if (quantity.contains("总数量")) { + orderInfo.put("totalCount", value); + } + } + } + + log.info("解析到的订单信息: {}", orderInfo); + } catch (Exception e) { + log.error("解析订单信息失败", e); + throw new RuntimeException("解析订单信息失败: " + e.getMessage()); + } + return orderInfo; + } + + /** + * 解析标签数据列表(从第8行开始) + */ + private static List> parseTagList(Sheet sheet) { + List> tagList = new ArrayList<>(); + try { + // 获取表头 + Row headerRow = sheet.getRow(6); + List headers = new ArrayList<>(); + for (Cell cell : headerRow) { + headers.add(getCellStringValue(cell)); + } + + // 解析数据行 + int startRow = 7; + Row row; + while ((row = sheet.getRow(startRow)) != null) { + Map tagData = new HashMap<>(); + boolean hasData = false; + + for (int i = 0; i < headers.size(); i++) { + String value = getCellStringValue(row.getCell(i)); + if (StringUtils.hasText(value)) { + hasData = true; + tagData.put(headers.get(i), value); + } + } + + if (hasData) { + tagList.add(tagData); + } else { + break; + } + startRow++; + } + } catch (Exception e) { + log.error("解析标签数据失败", e); + throw new RuntimeException("解析标签数据失败: " + e.getMessage()); + } + return tagList; + } + + /** + * 获取单元格的字符串值 + */ + private static String getCellStringValue(Cell cell) { + if (cell == null) { + return ""; + } + + String value = ""; + switch (cell.getCellType()) { + case STRING: + value = cell.getStringCellValue(); + break; + case NUMERIC: + if (DateUtil.isCellDateFormatted(cell)) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + value = sdf.format(cell.getDateCellValue()); + } else { + value = String.valueOf((long) cell.getNumericCellValue()); + } + break; + case BOOLEAN: + value = String.valueOf(cell.getBooleanCellValue()); + break; + default: + break; + } + return value.trim(); + } +} \ No newline at end of file diff --git a/tagApi-service/src/main/java/hw/tagApi/service/service/impl/KDocsServiceImpl.java b/tagApi-service/src/main/java/hw/tagApi/service/service/impl/KDocsServiceImpl.java index 594165a..7e4e740 100644 --- a/tagApi-service/src/main/java/hw/tagApi/service/service/impl/KDocsServiceImpl.java +++ b/tagApi-service/src/main/java/hw/tagApi/service/service/impl/KDocsServiceImpl.java @@ -2,7 +2,15 @@ package hw.tagApi.service.service.impl; import hw.tagApi.service.service.IKDocsService; import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.*; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -10,8 +18,15 @@ import java.util.Map; import hw.tagApi.service.constant.ApiConstants; import hw.tagApi.service.mapper.HwTagRecordMapper; +import hw.tagApi.service.domain.HwTagRecord; +import hw.tagApi.common.utils.poi.TagExcelUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.util.EntityUtils; /** * 云文档服务实现类 @@ -24,7 +39,108 @@ public class KDocsServiceImpl implements IKDocsService { private static final Logger log = LoggerFactory.getLogger(KDocsServiceImpl.class); - private HwTagRecordMapper hwTagRecordMapper; + @Autowired + private HwTagRecordMapper hwTagRecordMapper; + + @Autowired + private CloseableHttpClient httpClient; + + private static final int BATCH_SIZE = 10; + private List batchList = new ArrayList<>(); + + @Override + public String importData(String url) { + try { + log.info("开始从金山文档下载Excel文件: {}", url); + + // 创建HttpGet请求 + HttpGet httpGet = new HttpGet(url); + httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"); + httpGet.setHeader("Accept", "*/*"); + httpGet.setHeader("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8"); + httpGet.setHeader("Connection", "keep-alive"); + + // 执行请求 + try (CloseableHttpResponse response = httpClient.execute(httpGet)) { + // 获取响应状态码 + int statusCode = response.getStatusLine().getStatusCode(); + if (statusCode != 200) { + log.error("从金山文档获取文件失败,响应码: {}", statusCode); + return ApiConstants.SYSTEM_ERROR; + } + + // 获取响应实体 + HttpEntity entity = response.getEntity(); + if (entity == null) { + log.error("无法从金山文档获取文件或文件为空"); + return ApiConstants.SYSTEM_ERROR; + } + + // 将响应实体转换为字节数组 + byte[] fileData = EntityUtils.toByteArray(entity); + + if (fileData.length == 0) { + log.error("无法从金山文档获取文件或文件为空"); + return ApiConstants.SYSTEM_ERROR; + } + + // 直接使用字节流处理Excel数据 + Map excelResult; + try (ByteArrayInputStream bis = new ByteArrayInputStream(fileData)) { + excelResult = TagExcelUtil.parseTagExcel(bis); + } + + // 获取订单信息 + Map orderInfo = (Map) excelResult.get("orderInfo"); + String orderNo = orderInfo.get("orderNo"); + String batchNo = orderInfo.get("batchNo"); + String operatorId = orderInfo.get("operatorId"); + String processTime = orderInfo.get("processTime"); + + log.info("解析订单信息 - 订单号: {}, 批次号: {}, 操作员: {}", orderNo, batchNo, operatorId); + + // 获取标签数据列表 + List> tagList = (List>) excelResult.get("tagList"); + + // 批量处理标签数据 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + for (Map tagData : tagList) { + HwTagRecord record = new HwTagRecord(); + record.setOrderCode(orderNo); + record.setBatchNumber(batchNo); + record.setOperatorId(operatorId); + record.setProcessingTime(sdf.parse(processTime)); + + // 设置标签数据 + record.setEpc(tagData.get("EPC")); + record.settId(tagData.get("TID")); + record.setTagSequence(tagData.get("序号")); + + // 添加到批处理列表 + batchList.add(record); + + // 达到批量大小时执行插入 + if (batchList.size() >= BATCH_SIZE) { + hwTagRecordMapper.batchInsertHwTagRecord(batchList); + log.info("批量插入{}条数据成功", batchList.size()); + batchList.clear(); + } + } + + // 处理剩余的数据 + if (!batchList.isEmpty()) { + hwTagRecordMapper.batchInsertHwTagRecord(batchList); + log.info("批量插入剩余{}条数据成功", batchList.size()); + batchList.clear(); + } + + return getSystemStatus(); + } + } catch (Exception e) { + log.error("导入数据失败: {}", e.getMessage(), e); + return ApiConstants.SYSTEM_ERROR; + } + } @Override public String getSystemStatus() { @@ -52,12 +168,6 @@ public class KDocsServiceImpl implements IKDocsService return null; } - @Override - public String importData(String data) { - // TODO: 实现数据导入逻辑 - return getSystemStatus(); - } - @Override public String deleteData(String id) { // TODO: 实现数据删除逻辑 @@ -75,7 +185,4 @@ public class KDocsServiceImpl implements IKDocsService // TODO: 实现数据导出逻辑 return getSystemStatus(); } - - - }