You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

299 lines
13 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import com.matrixone.apps.domain.util.FrameworkException;
import com.matrixone.apps.domain.util.MqlUtil;
import matrix.db.Context;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.*;
import java.util.logging.Logger;
public class TMLMaintainMaterialPeptideAttr_mxJPO {
private static final Logger LOGGER = Logger.getLogger(TMLMaintainMaterialPeptideAttr_mxJPO.class.getName());
public String updatePartAttr(Context context, String[] args) throws FrameworkException {
String updateInfo = args[0];
LOGGER.info("updatePeptideAttr: " + updateInfo);
MqlUtil.mqlCommand(context, updateInfo);
return "success";
}
public String updatePeptideAttr(Context context, String[] args) throws FrameworkException {
String updateInfo = args[0];
LOGGER.info("updatePeptideAttr: " + updateInfo);
MqlUtil.mqlCommand(context, updateInfo);
return "success";
}
public String getPeptideAttrMap(Context context, String[] args) throws FrameworkException {
JSONArray peptideAttrArray = new JSONArray();
if(args != null && args.length > 0) {
for (String itemValue : args) {
if (itemValue == null || itemValue.trim().isEmpty()) {
continue;
}
JSONObject peptideAttrObj = new JSONObject();
try {
// 1. 获取item ID
String getItemInfo = "temp query bus VPMReference * * where \"attribute[PLMEntity.V_description].value == '" +
escapeMqlString(itemValue.trim()) + "'\" select id dump |";
String itemInfo = MqlUtil.mqlCommand(context, getItemInfo);
if (itemInfo == null || itemInfo.trim().isEmpty()) {
LOGGER.warning("未找到项目: " + itemValue);
peptideAttrObj.put("itemValue", itemValue);
peptideAttrObj.put("error", "未找到项目");
peptideAttrArray.put(peptideAttrObj);
continue;
}
String[] itemInfoParts = itemInfo.split("\\|");
if (itemInfoParts.length <= 3) {
LOGGER.warning("项目信息格式不正确: " + itemInfo);
peptideAttrObj.put("itemValue", itemValue);
peptideAttrObj.put("error", "项目信息格式不正确");
peptideAttrArray.put(peptideAttrObj);
continue;
}
String itemId = itemInfoParts[3].trim();
// 2. 获取肽属性信息
String getMaterialPeptideAttrInfo = "print bus " + itemId +
" select attribute[PLMEntity.V_Name].value " +
"attribute[TMLVPMReference.TMLSpecification].value attribute[TMLVPMReference.TMLBrand].value " +
"to[Classified Item].attribute to[Classified Item].attribute.value dump |";
String materialPeptideAttrInfo = MqlUtil.mqlCommand(context, getMaterialPeptideAttrInfo);
// 添加基本信息
peptideAttrObj.put("itemValue", itemValue);
peptideAttrObj.put("itemId", itemId);
// 安全检查:确保返回结果不为空
if (materialPeptideAttrInfo != null && !materialPeptideAttrInfo.trim().isEmpty()) {
try {
// 使用 -1 保留所有空字符串元素
String[] materialPeptideAttrSplit = materialPeptideAttrInfo.split("\\|", -1);
// 1. 先提取基本信息(前3个元素)
if (materialPeptideAttrSplit.length >= 1) {
peptideAttrObj.put("materialName", materialPeptideAttrSplit[0].trim());
}
if (materialPeptideAttrSplit.length >= 2) {
peptideAttrObj.put("brand", materialPeptideAttrSplit[1].trim());
}
if (materialPeptideAttrSplit.length >= 3) {
peptideAttrObj.put("specification", materialPeptideAttrSplit[2].trim());
}
List<Map<String, String>> peptideProperties = new ArrayList<>();
// 2. 处理剩余的属性键值对(从第4个元素开始)
// 确保有足够的元素形成键值对
int startIndex = 3; // 从第4个元素开始(索引3)
if (materialPeptideAttrSplit.length > startIndex) {
// 计算可用于形成键值对的元素数量
int availableElements = materialPeptideAttrSplit.length - startIndex;
// 如果剩余元素是奇数,添加一个空字符串使其成为偶数
if (availableElements % 2 != 0) {
materialPeptideAttrSplit = Arrays.copyOf(
materialPeptideAttrSplit,
materialPeptideAttrSplit.length + 1
);
materialPeptideAttrSplit[materialPeptideAttrSplit.length - 1] = "";
availableElements += 1;
}
// 处理键值对
int totalPairs = availableElements / 2;
for (int j = 0; j < totalPairs; j++) {
int keyIndex = startIndex + j;
int valueIndex = startIndex + totalPairs + j;
String key = materialPeptideAttrSplit[keyIndex].trim();
String value = materialPeptideAttrSplit[valueIndex].trim();
// 只有当键不为空时才添加到对象
if (!key.isEmpty()) {
Map<String, String> property = new HashMap<>();
property.put("name", key);
property.put("value", value);
peptideProperties.add(property);
}
}
}
// 3. 将多肽属性列表添加到结果对象
peptideAttrObj.put("peptideProperties", peptideProperties);
} catch (Exception e) {
// 异常处理
System.err.println("Error processing material peptide attributes for itemId: " + itemId);
e.printStackTrace();
// 返回默认结构
peptideAttrObj.put("PLMEntity.V_Name", "");
peptideAttrObj.put("PLMEntity.V_Description", "");
peptideAttrObj.put("PLMEntity.V_Classification", "");
peptideAttrObj.put("TMLVPMReference.TMLBrand", "");
peptideAttrObj.put("peptideProperties", new ArrayList<>());
}
} else {
// MQL命令返回为空的情况
peptideAttrObj.put("PLMEntity.V_Name", "");
peptideAttrObj.put("PLMEntity.V_Description", "");
peptideAttrObj.put("PLMEntity.V_Classification", "");
peptideAttrObj.put("TMLVPMReference.TMLBrand", "");
peptideAttrObj.put("peptideProperties", new ArrayList<>());
}
} catch (Exception e) {
LOGGER.warning("处理项目 " + itemValue + " 时出错: " + e.getMessage());
try {
peptideAttrObj.put("itemValue", itemValue);
peptideAttrObj.put("error", e.getMessage());
} catch (Exception ex) {
// 忽略 JSON 异常
}
}
peptideAttrArray.put(peptideAttrObj);
}
}
// 直接返回 JSONArray 的字符串表示
System.out.println(peptideAttrArray);
return peptideAttrArray.toString();
}
public String getPeptideAttrMapWithWrapper(Context context, String[] args) throws FrameworkException {
JSONObject result = new JSONObject();
try {
JSONArray data = new JSONArray(getPeptideAttrMap(context, args));
result.put("success", true);
result.put("code", 200);
result.put("message", "查询成功");
result.put("data", data);
result.put("total", data.length());
result.put("timestamp", System.currentTimeMillis());
} catch (Exception e) {
result.put("success", false);
result.put("code", 500);
result.put("message", "查询失败: " + e.getMessage());
result.put("data", new JSONArray());
result.put("timestamp", System.currentTimeMillis());
}
return result.toString();
}
/**
* 另一种实现:直接返回标准JSON格式
*/
public String getPeptideAttrMapStandard(Context context, String[] args) throws FrameworkException {
JSONObject response = new JSONObject();
JSONArray dataArray = new JSONArray();
try {
if(args != null && args.length > 0) {
for (String itemValue : args) {
JSONObject itemData = processSingleItem(context, itemValue);
dataArray.put(itemData);
}
}
response.put("success", true);
response.put("code", 200);
response.put("message", "success");
response.put("data", dataArray);
response.put("total", dataArray.length());
response.put("timestamp", System.currentTimeMillis());
} catch (Exception e) {
response.put("success", false);
response.put("code", 500);
response.put("message", "Error: " + e.getMessage());
response.put("data", new JSONArray());
response.put("timestamp", System.currentTimeMillis());
}
return response.toString();
}
/**
* 处理单个项目
*/
private JSONObject processSingleItem(Context context, String itemValue) throws Exception {
JSONObject itemObj = new JSONObject();
// 获取item ID
String getItemInfo = "temp query bus VPMReference * * where \"attribute[PLMEntity.V_description].value == '" +
escapeMqlString(itemValue.trim()) + "'\" select id dump |";
String itemInfo = MqlUtil.mqlCommand(context, getItemInfo);
if (itemInfo == null || itemInfo.trim().isEmpty()) {
itemObj.put("error", "Item not found");
return itemObj;
}
String[] itemInfoParts = itemInfo.split("\\|");
if (itemInfoParts.length <= 3) {
itemObj.put("error", "Invalid item info format");
return itemObj;
}
String itemId = itemInfoParts[3].trim();
itemObj.put("itemId", itemId);
itemObj.put("itemValue", itemValue);
// 获取肽属性信息
String getMaterialPeptideAttrInfo = "print bus " + itemId +
" select to[Classified Item].attribute to[Classified Item].attribute.value dump |";
String materialPeptideAttrInfo = MqlUtil.mqlCommand(context, getMaterialPeptideAttrInfo);
if (materialPeptideAttrInfo != null && !materialPeptideAttrInfo.trim().isEmpty()) {
JSONObject attributes = parseAttributes(materialPeptideAttrInfo);
itemObj.put("attributes", attributes);
} else {
itemObj.put("attributes", new JSONObject());
}
return itemObj;
}
/**
* 解析属性字符串为 JSONObject
*/
private JSONObject parseAttributes(String attrInfo) throws Exception {
JSONObject attributes = new JSONObject();
String[] parts = attrInfo.split("\\|", -1);
if (parts.length % 2 != 0) {
parts = Arrays.copyOf(parts, parts.length + 1);
parts[parts.length - 1] = "";
}
int totalPairs = parts.length / 2;
for (int i = 0; i < totalPairs; i++) {
String key = parts[i].trim();
String value = parts[totalPairs + i].trim();
if (!key.isEmpty()) {
attributes.put(key, value);
}
}
return attributes;
}
private String escapeMqlString(String input) {
if (input == null) return "";
return input.replace("'", "''");
}
}