工艺日志推送

bom日志推送1
This commit is contained in:
tzy 2025-11-23 21:33:21 +08:00
parent 1a3717d305
commit 6519c24135
9 changed files with 207 additions and 85 deletions

View File

@ -27,7 +27,7 @@
<satoken.version>1.39.0</satoken.version> <satoken.version>1.39.0</satoken.version>
<mybatis-plus.version>3.5.3.1</mybatis-plus.version> <mybatis-plus.version>3.5.3.1</mybatis-plus.version>
<p6spy.version>3.9.1</p6spy.version> <p6spy.version>3.9.1</p6spy.version>
<hutool.version>5.8.18</hutool.version> <hutool.version>5.8.30</hutool.version>
<okhttp.version>4.10.0</okhttp.version> <okhttp.version>4.10.0</okhttp.version>
<spring-boot-admin.version>2.7.10</spring-boot-admin.version> <spring-boot-admin.version>2.7.10</spring-boot-admin.version>
<redisson.version>3.20.1</redisson.version> <redisson.version>3.20.1</redisson.version>

View File

@ -293,9 +293,10 @@ public class ExcelTemplateProc {
String value = cell.getStringCellValue(); String value = cell.getStringCellValue();
if (value != null) { if (value != null) {
String trimmed = value.trim();
for (DynamicDataMapping dynamicData : dynamicDataMappingList) { for (DynamicDataMapping dynamicData : dynamicDataMappingList) {
if (value.startsWith("{{" + dynamicData.getDataId() + ".")) { String prefix = "{{" + dynamicData.getDataId() + ".";
if (trimmed.startsWith(prefix) || trimmed.contains(prefix)) {
return dynamicData; return dynamicData;
} }
} }

View File

@ -3,6 +3,7 @@ package com.ruoyi.system.controller;
import java.util.List; import java.util.List;
import java.util.Arrays; import java.util.Arrays;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*; import javax.validation.constraints.*;
@ -113,6 +114,7 @@ public class PartCostController extends BaseController {
@Log(title = "在金蝶获取成本价", businessType = BusinessType.INSERT) @Log(title = "在金蝶获取成本价", businessType = BusinessType.INSERT)
@RepeatSubmit() @RepeatSubmit()
@PostMapping("/getObtainPartData") @PostMapping("/getObtainPartData")
@XxlJob("getObtainPartData")
public R<Void> getObtainPartData() { public R<Void> getObtainPartData() {
return toAjax(iPartCostService.getObtainPartData()); return toAjax(iPartCostService.getObtainPartData());
} }

View File

@ -6,6 +6,7 @@ import java.net.URLEncoder;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import cn.hutool.json.JSONUtil;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.ruoyi.common.excel.DefaultExcelListener; import com.ruoyi.common.excel.DefaultExcelListener;
@ -17,6 +18,8 @@ import com.ruoyi.common.poi.ExcelTemplateProc;
import com.ruoyi.common.poi.DynamicDataMapping; import com.ruoyi.common.poi.DynamicDataMapping;
import com.ruoyi.system.domain.*; import com.ruoyi.system.domain.*;
import com.ruoyi.system.domain.bo.FigureSaveBo; import com.ruoyi.system.domain.bo.FigureSaveBo;
import com.ruoyi.system.domain.dto.MaterialUseDTO;
import com.ruoyi.system.domain.dto.ProcessRouteDTO;
import com.ruoyi.system.domain.dto.ProcessRouteExcelDTO; import com.ruoyi.system.domain.dto.ProcessRouteExcelDTO;
import com.ruoyi.system.domain.dto.ProcessRoutePushResultDTO; import com.ruoyi.system.domain.dto.ProcessRoutePushResultDTO;
import com.ruoyi.system.domain.vo.*; import com.ruoyi.system.domain.vo.*;
@ -542,7 +545,7 @@ public class ProcessOrderProController extends BaseController {
// 使用Excel模板文件 // 使用Excel模板文件
String templatePath = "D:/java/excel-template/生产及工艺计划模版.xlsx"; String templatePath = "jpg/生产及工艺计划模版.xlsx";
String outputPath = "D:/file/" + orderPro.getProductionOrderNo() + "生产及工艺计划表.xlsx"; String outputPath = "D:/file/" + orderPro.getProductionOrderNo() + "生产及工艺计划表.xlsx";
// 准备模板数据 // 准备模板数据
@ -613,11 +616,11 @@ public class ProcessOrderProController extends BaseController {
List<Map<String, Object>> evoDataList = convertEVOProductsDataToMapList(evoProductsList); List<Map<String, Object>> evoDataList = convertEVOProductsDataToMapList(evoProductsList);
dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("EVOProductsDataVO", evoDataList)); dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("EVOProductsDataVO", evoDataList));
} }
// 添加伊特产品数据 /* // 添加伊特产品数据
if (!excelDTOList.isEmpty()) { if (!excelDTOList.isEmpty()) {
List<Map<String, Object>> evoRouteDataList = convertRouteDataToMapList(excelDTOList); List<Map<String, Object>> evoRouteDataList = convertRouteDataToMapList(excelDTOList);
dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("ProcessRouteExcelDTO", evoRouteDataList)); dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("ProcessRouteExcelDTO", evoRouteDataList));
} }*/
// 使用模板导出Excel // 使用模板导出Excel
ExcelTemplateProc.doExportExcelByTemplateProc(templatePath, outputPath, staticDataMap, dynamicDataMappingList); ExcelTemplateProc.doExportExcelByTemplateProc(templatePath, outputPath, staticDataMap, dynamicDataMappingList);
@ -625,8 +628,7 @@ public class ProcessOrderProController extends BaseController {
// 设置响应头 // 设置响应头
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode(orderPro.getProductionOrderNo() + "_分类BOM表", "UTF-8") String fileName = URLEncoder.encode(orderPro.getProductionOrderNo() + "_分类BOM表", "UTF-8").replaceAll("\\+", "%20");
.replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
// 将生成的文件写入响应 // 将生成的文件写入响应
@ -671,7 +673,15 @@ public class ProcessOrderProController extends BaseController {
vo.setMaterialCode(getCellValueAsString(row.getCell(0))); // 图号 vo.setMaterialCode(getCellValueAsString(row.getCell(0))); // 图号
vo.setMaterialName(getCellValueAsString(row.getCell(1))); // 名称 vo.setMaterialName(getCellValueAsString(row.getCell(1))); // 名称
vo.setMaterial(getCellValueAsString(row.getCell(2))); // 数量 vo.setMaterial(getCellValueAsString(row.getCell(2))); // 数量
vo.setDiscWeight(getCellValueAsDouble(row.getCell(3))); // 单重 vo.setDiscWeight(getCellValueAsDouble(row.getCell(3)));
vo.setRawMaterialCode(getCellValueAsString(row.getCell(4)));
vo.setRawMaterialName(getCellValueAsString(row.getCell(5)));
vo.setBomMaterial(getCellValueAsString(row.getCell(6)));
vo.setBomUnit(getCellValueAsString(row.getCell(9)));
vo.setBomDanZhong(getCellValueAsDouble(row.getCell(7)));
vo.setDiscUsage(getCellValueAsString(row.getCell(8)));
// 单重
vo.setBatchQuantity(getCellValueAsLong(row.getCell(18))); // 批次数量 vo.setBatchQuantity(getCellValueAsLong(row.getCell(18))); // 批次数量
vo.setUnitQuantity(getCellValueAsDouble(row.getCell(17))); // 批次数量 vo.setUnitQuantity(getCellValueAsDouble(row.getCell(17))); // 批次数量
@ -1092,10 +1102,10 @@ public class ProcessOrderProController extends BaseController {
/** /**
* 转换工艺VO为Map列表用于模板 * 转换工艺VO为Map列表用于模板
*/ */
private List<Map<String, Object>> convertRouteDataToMapList(List<ProcessRouteExcelDTO> routeDataList) { private List<Map<String, Object>> convertRouteDataToMapList(List<ProcessRoute> routeDataList) {
List<Map<String, Object>> mapList = new ArrayList<>(); List<Map<String, Object>> mapList = new ArrayList<>();
int index = 1; int index = 1;
for (ProcessRouteExcelDTO item : routeDataList) { for (ProcessRoute item : routeDataList) {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("index", index); map.put("index", index);
map.put("routeDescription", item.getRouteDescription()); // 生产令号 map.put("routeDescription", item.getRouteDescription()); // 生产令号
@ -1103,12 +1113,6 @@ public class ProcessOrderProController extends BaseController {
map.put("materialName", item.getMaterialName()); // 物料名称 map.put("materialName", item.getMaterialName()); // 物料名称
map.put("material", item.getMaterial()); // 材质 map.put("material", item.getMaterial()); // 材质
map.put("discWeight", item.getDiscWeight()); // 单重KG map.put("discWeight", item.getDiscWeight()); // 单重KG
map.put("rawMaterialCode", item.getRawMaterialCode()); // 材料BOM物料编码
map.put("rawMaterialName", item.getRawMaterialName()); // 材料BOM物料名称
map.put("bomMaterial", item.getBomMaterial()); // BOM材质
map.put("bomDanZhong", item.getBomDanZhong()); // 材料单重KG
map.put("discUsage", item.getDiscUsage()); // 用量
map.put("bomUnit", item.getBomUnit()); // 单位
map.put("processNo", item.getProcessNo()); // 工序号 map.put("processNo", item.getProcessNo()); // 工序号
map.put("workCenter", item.getWorkCenter()); // 工作中心 map.put("workCenter", item.getWorkCenter()); // 工作中心
map.put("processName", item.getProcessName()); // 工序名称 map.put("processName", item.getProcessName()); // 工序名称
@ -1153,14 +1157,78 @@ public class ProcessOrderProController extends BaseController {
// 1. 读取第一个sheet的数据list - 使用POI直接读取以保留空格 // 1. 读取第一个sheet的数据list - 使用POI直接读取以保留空格
List<ProductionOrderVo> allDataList = readExcelWithPOI(excelName); List<ProductionOrderVo> allDataList = readExcelWithPOI(excelName);
List<ProcessRoute> routeList = readExcelPOIRoute(excelName); List<ProcessRoute> routeList = readExcelPOIRoute(excelName);
//获取此项目的物料最新BOM 并且 将工艺路线拉取出来 List<ProcessRoute> routes = new ArrayList<>();
ArrayList<ProcessRoute> routes = new ArrayList<>(); List<Map<String, Object>> kingdeeBomRows = new ArrayList<>();
for (ProcessRoute processRoute : routeList) { for (ProcessRoute base : routeList) {
//TODO 获取最新的BOM版本的型号 String materialCode = base.getMaterialCode();
String bomVersion = JdUtil.readGetTheLatestVersion(processRoute.getMaterialCode()); if (StringUtils.isBlank(materialCode)) {
//TODO 获取此物料的所有工艺路线 ProcessRoute item = new ProcessRoute();
item.setRouteDescription(base.getRouteDescription());
item.setMaterialCode(base.getMaterialCode());
item.setMaterialName(base.getMaterialName());
item.setMaterial(base.getMaterial());
item.setDiscWeight(base.getDiscWeight());
item.setUnitQuantity(base.getUnitQuantity());
item.setBatchQuantity(base.getBatchQuantity());
routes.add(item);
continue;
}
String bomversion = JdUtil.readGetTheLatestVersion(materialCode);
List<MaterialUseDTO> bomItems = StringUtils.isNotBlank(bomversion) ? JdUtil.getMaterialUseXByVer(bomversion) : Collections.emptyList();
List<ProcessRouteDTO> routeGuDing = JdUtil.getRouteGuDing(materialCode);
if (bomItems != null && !bomItems.isEmpty()) {
for (MaterialUseDTO b : bomItems) {
Map<String, Object> bomMap = new HashMap<>();
bomMap.put("routeDescription", base.getRouteDescription());
bomMap.put("materialCode", base.getMaterialCode());
bomMap.put("materialName", base.getMaterialName());
bomMap.put("material", base.getMaterial());
bomMap.put("discWeight", base.getDiscWeight());
bomMap.put("rawMaterialCode", b.getMaterialCode());
bomMap.put("rawMaterialName", b.getMaterialName());
bomMap.put("bomMaterial", b.getCaizhi());
bomMap.put("bomDanZhong", b.getDanzhong());
bomMap.put("discUsage", (b.getFenzi() != null && b.getFenmu() != null) ? (b.getFenzi() + "/" + b.getFenmu()) : null);
bomMap.put("bomUnit", b.getChildUnit());
kingdeeBomRows.add(bomMap);
}
}
if (routeGuDing != null && !routeGuDing.isEmpty()) {
routeGuDing.stream()
.forEach(r -> {
ProcessRoute item = new ProcessRoute();
item.setRouteDescription(base.getRouteDescription());
item.setMaterialCode(base.getMaterialCode());
item.setMaterialName(base.getMaterialName());
item.setMaterial(base.getMaterial());
item.setDiscWeight(base.getDiscWeight());
item.setUnitQuantity(base.getUnitQuantity());
item.setBatchQuantity(base.getBatchQuantity());
// 不写入BOM字段保持纯工艺数据行
item.setProcessNo(r.getProcessNo());
item.setWorkCenter(r.getWorkCenter());
item.setProcessName(r.getProcessName());
item.setProcessDescription(r.getProcessDescription());
item.setProcessControl(r.getProcessControl());
item.setActivityDuration(r.getActivityDuration());
item.setActivityUnit(r.getActivityUnit());
routes.add(item);
});
} else {
ProcessRoute item = new ProcessRoute();
item.setRouteDescription(base.getRouteDescription());
item.setMaterialCode(base.getMaterialCode());
item.setMaterialName(base.getMaterialName());
item.setMaterial(base.getMaterial());
item.setDiscWeight(base.getDiscWeight());
item.setUnitQuantity(base.getUnitQuantity());
item.setBatchQuantity(base.getBatchQuantity());
// 不写入BOM字段保持纯工艺数据行
routes.add(item);
}
} }
// 用生成的 routes 替换原始 routeList保持原序展开后的结构用于后续导出
routeList = routes;
// 2. 读取原始表数据 // 2. 读取原始表数据
List<BomDataVO> rawDataList = readRawDataTable(rawDataFile); List<BomDataVO> rawDataList = readRawDataTable(rawDataFile);
@ -1311,7 +1379,7 @@ public class ProcessOrderProController extends BaseController {
} }
// 使用Excel模板文件 // 使用Excel模板文件
String templatePath = "D:/java/excel-template/生产及工艺计划模版.xlsx"; String templatePath = "jpg/生产及工艺计划模版.xlsx";
String outputPath = "D:/file/" + orderPro.getProductionOrderNo() + "生产及工艺计划表.xlsx"; String outputPath = "D:/file/" + orderPro.getProductionOrderNo() + "生产及工艺计划表.xlsx";
// 准备模板数据 // 准备模板数据
@ -1383,11 +1451,15 @@ public class ProcessOrderProController extends BaseController {
List<Map<String, Object>> evoDataList = convertEVOProductsDataToMapList(evoProductsList); List<Map<String, Object>> evoDataList = convertEVOProductsDataToMapList(evoProductsList);
dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("EVOProductsDataVO", evoDataList)); dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("EVOProductsDataVO", evoDataList));
} }
if (!kingdeeBomRows.isEmpty()) {
List<Map<String, Object>> bomDataList2 = convertKingdeeBomToMapList(kingdeeBomRows);
dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("KingdeeBomData", bomDataList2));
}
// 添加伊特产品数据 // 添加伊特产品数据
/*if (!excelDTOList.isEmpty()) { if (!routeList.isEmpty()) {
List<Map<String, Object>> evoRouteDataList = convertRouteDataToMapList(excelDTOList); List<Map<String, Object>> evoRouteDataList = convertRouteDataToMapList(routeList);
dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("ProcessRouteExcelDTO", evoRouteDataList)); dynamicDataMappingList.addAll(DynamicDataMapping.createOneDataList("ProcessRouteExcelDTO", evoRouteDataList));
}*/ }
// 使用模板导出Excel // 使用模板导出Excel
ExcelTemplateProc.doExportExcelByTemplateProc(templatePath, outputPath, staticDataMap, dynamicDataMappingList); ExcelTemplateProc.doExportExcelByTemplateProc(templatePath, outputPath, staticDataMap, dynamicDataMappingList);
@ -1421,16 +1493,28 @@ public class ProcessOrderProController extends BaseController {
} }
} }
private List<Map<String, Object>> convertKingdeeBomToMapList(List<Map<String, Object>> kingdeeBomRows) {
List<Map<String, Object>> mapList = new ArrayList<>();
int index = 1;
for (Map<String, Object> row : kingdeeBomRows) {
Map<String, Object> map = new HashMap<>();
map.put("index", index);
map.put("routeDescription", row.get("routeDescription"));
map.put("materialCode", row.get("materialCode"));
map.put("materialName", row.get("materialName"));
map.put("material", row.get("material"));
map.put("discWeight", row.get("discWeight"));
map.put("rawMaterialCode", row.get("rawMaterialCode"));
map.put("rawMaterialName", row.get("rawMaterialName"));
map.put("bomMaterial", row.get("bomMaterial"));
map.put("bomDanZhong", row.get("bomDanZhong"));
map.put("discUsage", row.get("discUsage"));
map.put("bomUnit", row.get("bomUnit"));
mapList.add(map);
index++;
}
return mapList;
}
} }

View File

@ -1,5 +1,10 @@
package com.ruoyi.system.domain.dto; package com.ruoyi.system.domain.dto;
public class JdVersionDTO { import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class JdVersionDTO {
@JsonProperty("FNumber")
private String version;
} }

View File

@ -12,6 +12,7 @@ import com.kingdee.bos.webapi.entity.RepoRet;
import com.kingdee.bos.webapi.sdk.K3CloudApi; import com.kingdee.bos.webapi.sdk.K3CloudApi;
import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.utils.JdUtils; import com.ruoyi.common.utils.JdUtils;
import com.ruoyi.common.utils.VersionComparator;
import com.ruoyi.system.domain.BomDetails; import com.ruoyi.system.domain.BomDetails;
import com.ruoyi.system.domain.PartCost; import com.ruoyi.system.domain.PartCost;
import com.ruoyi.system.domain.dto.*; import com.ruoyi.system.domain.dto.*;
@ -2488,7 +2489,6 @@ public class JdUtil {
/** /**
* 获取物料清单 * 获取物料清单
*
* @param FMaterialCode * @param FMaterialCode
* @return * @return
*/ */
@ -3232,68 +3232,104 @@ public class JdUtil {
*/ */
public static String readGetTheLatestVersion(String materialCode) { public static String readGetTheLatestVersion(String materialCode) {
K3CloudApi client = new K3CloudApi(); K3CloudApi client = new K3CloudApi();
// 请求参数要求为json字符串
JsonObject json = new JsonObject(); JsonObject json = new JsonObject();
json.addProperty("FormId", "SFC_OperationReport"); json.addProperty("FormId", "ENG_BOM");
json.addProperty("FieldKeys", "F_HBYT_SCLH,FBillNo,FMoNumber,FWorkShopID.FName,FOperNumber,FOperDescription,FQuaQty,FFinishQty,FStockInQuaAuxQty,FStockInFailAuxQty,F_HBYT_RKD,FDate"); json.addProperty("FieldKeys", "FNumber");
// 是否为入库点
JsonObject filterObject = new JsonObject();
JsonArray filterString = new JsonArray(); JsonArray filterString = new JsonArray();
filterObject.addProperty("FieldName", "F_HBYT_RKD"); JsonObject filterObject = new JsonObject();
filterObject.addProperty("Compare", "74"); filterObject.addProperty("FieldName", "FMATERIALID.FNumber");
filterObject.addProperty("Value", true); filterObject.addProperty("Compare", "67");
filterObject.addProperty("Value", materialCode);
filterObject.addProperty("Left", ""); filterObject.addProperty("Left", "");
filterObject.addProperty("Right", ""); filterObject.addProperty("Right", "");
filterObject.addProperty("Logic", 0); filterObject.addProperty("Logic", 0);
filterString.add(filterObject); filterString.add(filterObject);
JsonObject filterObject1 = new JsonObject(); JsonObject filterObject1 = new JsonObject();
filterObject1.addProperty("FieldName", "FDocumentStatus"); filterObject1.addProperty("FieldName", "FForbidStatus");
filterObject1.addProperty("Compare", "105"); filterObject1.addProperty("Compare", "105");
filterObject1.addProperty("Value", "A"); filterObject1.addProperty("Value", "A");
filterObject1.addProperty("Left", ""); filterObject1.addProperty("Left", "");
filterObject1.addProperty("Right", ""); filterObject1.addProperty("Right", "");
filterObject1.addProperty("Logic", 1); filterObject1.addProperty("Logic", 0);
filterString.add(filterObject1); filterString.add(filterObject1);
JsonObject filterObject2 = new JsonObject();
filterObject2.addProperty("FieldName", "FDocumentStatus");
filterObject2.addProperty("Compare", "105");
filterObject2.addProperty("Value", "B");
filterObject2.addProperty("Left", "");
filterObject2.addProperty("Right", "");
filterObject2.addProperty("Logic", 1);
filterString.add(filterObject2);
json.add("FilterString", filterString); json.add("FilterString", filterString);
json.addProperty("OrderString", ""); json.addProperty("OrderString", "");
json.addProperty("TopRowCount", 0); json.addProperty("TopRowCount", 0);
json.addProperty("StartRow", 0); json.addProperty("StartRow", 0);
json.addProperty("Limit", 10000); json.addProperty("Limit", 2000);
json.addProperty("SubSystemId", ""); json.addProperty("SubSystemId", "");
List<ProcessReportDTO> processReportDTOList = new ArrayList<>(); List<JdVersionDTO> processReportDTOList = new ArrayList<>();
int pageSize = 10000;
int startRow = 0;
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
try { try {
while (true) { String resultJson = String.valueOf(client.billQuery(json.toString()));
JsonObject pageJson = new Gson().fromJson(json.toString(), JsonObject.class); JsonArray jsonArray = new Gson().fromJson(resultJson, JsonArray.class);
pageJson.addProperty("StartRow", startRow); if (jsonArray != null && jsonArray.size() > 0) {
pageJson.addProperty("Limit", pageSize); List<JdVersionDTO> pageList = objectMapper.readValue(jsonArray.toString(), new TypeReference<List<JdVersionDTO>>() {
String resultJson = String.valueOf(client.billQuery(pageJson.toString()));
JsonArray jsonArray = new Gson().fromJson(resultJson, JsonArray.class);
if (jsonArray == null || jsonArray.size() == 0) {
break;
}
List<ProcessReportDTO> pageList = objectMapper.readValue(jsonArray.toString(), new TypeReference<List<ProcessReportDTO>>() {
}); });
processReportDTOList.addAll(pageList); processReportDTOList.addAll(pageList);
if (jsonArray.size() < pageSize) {
break;
}
startRow += pageSize;
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); // 输出异常日志 e.printStackTrace();
} }
if (processReportDTOList.isEmpty()) {
return null;
}
String latest = processReportDTOList.stream()
.map(JdVersionDTO::getVersion)
.filter(Objects::nonNull)
.max(new VersionComparator())
.orElse(null);
return latest;
}
/**
* 根据bom版本获取物料清单
* @param version
* @return
*/
public static List<MaterialUseDTO> getMaterialUseXByVer(String version) {
K3CloudApi client = new K3CloudApi();
// 请求参数要求为json字符串
JsonObject json = new JsonObject();
json.addProperty("FormId", "ENG_BOM");
json.addProperty("FieldKeys", "FNumber,FMATERIALIDCHILD.FNumber,FCHILDITEMNAME,FCHILDUNITID.FName,FNUMERATOR,FDENOMINATOR,F_HBYT_DZ,F_HBYT_CZ");
JsonArray filterString = new JsonArray();
JsonObject filterObject = new JsonObject();
filterObject.addProperty("FieldName", "FNumber");
filterObject.addProperty("Compare", "67");
filterObject.addProperty("Value", version);
filterObject.addProperty("Left", "");
filterObject.addProperty("Right", "");
filterObject.addProperty("Logic", 0);
filterString.add(filterObject);
JsonObject filterObject1 = new JsonObject();
filterObject1.addProperty("FieldName", "FForbidStatus");
filterObject1.addProperty("Compare", "105");
filterObject1.addProperty("Value", "A");
filterObject1.addProperty("Left", "");
filterObject1.addProperty("Right", "");
filterObject1.addProperty("Logic", 0);
filterString.add(filterObject1);
json.add("FilterString", filterString);
json.addProperty("OrderString", "");
json.addProperty("TopRowCount", 0);
json.addProperty("StartRow", 0);
json.addProperty("Limit", 2000);
json.addProperty("SubSystemId", "");
return " "; String jsonData = json.toString();
try {
String resultJson = String.valueOf(client.billQuery(jsonData));
JsonArray jsonArray = new Gson().fromJson(resultJson, JsonArray.class);
if (jsonArray != null && jsonArray.size() > 0) {
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.readValue(jsonArray.toString(), new TypeReference<List<MaterialUseDTO>>() {
});
} else {
return Collections.emptyList();
}
} catch (Exception e) {
log.error("调用接口时发生异常: " + e.getMessage(), e);
}
return Collections.emptyList();
} }
} }

View File

@ -124,24 +124,18 @@ public class PartCostServiceImpl implements IPartCostService {
Map<String, PartCost> uniq = new LinkedHashMap<>(); Map<String, PartCost> uniq = new LinkedHashMap<>();
for (PartCost pc : list) { for (PartCost pc : list) {
if (pc == null) continue; if (pc == null) continue;
String code = pc.getMaterialCode(); String code = pc.getMaterialCode();
String name = pc.getMaterialName(); String name = pc.getMaterialName();
BigDecimal cost = pc.getCostPrice(); BigDecimal cost = pc.getCostPrice();
// 过滤无效数据 // 过滤无效数据
if (StringUtils.isBlank(code) || StringUtils.isBlank(name) || cost == null || cost.compareTo(BigDecimal.ZERO) == 0) { if (StringUtils.isBlank(code) || StringUtils.isBlank(name) || cost == null || cost.compareTo(BigDecimal.ZERO) == 0) {
continue; continue;
} }
// 物料编码 + 名称 为唯一键 // 物料编码 + 名称 为唯一键
String key = code + "|" + name; String key = code + "|" + name;
PartCost existing = uniq.get(key); PartCost existing = uniq.get(key);
// 保留 createDate 最新的 // 保留 createDate 最新的
if (existing == null || if (existing == null || (pc.getCreateDate() != null && (existing.getCreateDate() == null || pc.getCreateDate().after(existing.getCreateDate())))) {
(pc.getCreateDate() != null &&
(existing.getCreateDate() == null || pc.getCreateDate().after(existing.getCreateDate())))) {
uniq.put(key, pc); uniq.put(key, pc);
} }
} }