if(StringUtils.isNotEmpty(MaterialName) && oldMaterialWeight > 0)
{
double PRvalue = 0 ;
boolean CONT = true ;
for ( Iterator itemIterator = itemListElement.getChildren().iterator(); itemIterator.hasNext(); )
{
//If CONT equals true , break out of the loop.
if(CONT != true)
{
break;
}
Element itemElement = (Element)itemIterator.next();
itemName = itemElement.getChild("ITEMNAME").getText();
siteListElement = itemElement.getChild("SITELIST");
if(StringUtils.equals(itemName,"4CTDispenseQuantity"))
{
for ( Iterator siteIterator = siteListElement.getChildren().iterator(); siteIterator.hasNext(); )
{
Element siteElement = (Element)siteIterator.next();
siteName = siteElement.getChild("SITENAME").getText();
siteValue = siteElement.getChild("SITEVALUE").getText().toString();
PRvalue = Double.parseDouble(siteValue);
double newMaterialWeight = oldMaterialWeight - (PRvalue/1000);
if(newMaterialWeight < 0)
{
newMaterialWeight = 0 ;
}
//Change the weight of PR barrel
String updsql = "UPDATE BSMATERIAL SET MATERIALWEIGHT = :MATERIALWEIGHT WHERE MATERIALNAME = :MATERIALNAME";
Map<String, Object> bindMapUPD = new HashMap<String, Object>();
bindMapUPD.put("MATERIALWEIGHT", newMaterialWeight);
bindMapUPD.put("MATERIALNAME", MaterialName);
IDMFrameServiceProxy.getSqlTemplate().update(updsql, bindMapUPD);
CONT = false;
break;
}
}
}
}
if(!StringUtils.equals(machineGroupName, "MASK CLEANER"))
{
if(StringUtils.isNotEmpty(unitName)&&StringUtils.isNotEmpty(machineName))
{
if((StringUtils.equals(machineName,"6LPTK06")&&StringUtils.equals(unitName,"6LPTK06-COAT"))
||(StringUtils.equals(machineName,"6LPTK07")&&StringUtils.equals(unitName,"6LPTK07-COAT"))
||(StringUtils.equals(machineName,"6LPTK26")&&StringUtils.equals(unitName,"6LPTK26-COAT")))
{
// I don't know which MATERIALPORT does the machine use, so I set the value of the MATERIALPORT variable to "M01".
String sqlPRInuse = "SELECT * FROM BSMATERIAL AA " +
"WHERE AA.MACHINENAME= :MACHINENAME " +
"AND AA.MATERIALSTATE='InUse' " +
"AND AA.UNITNAME= :UNITNAME " +
"AND AA.MATERIALPORT= :MATERIALPORT";
Map<String, Object> bindMapMATL = new HashMap<String, Object>();
String ProcessPreationName = body.getChild("PROCESSOPERATIONNAME").getText();
String materialPort = "";
if(StringUtils.equals(ProcessPreationName.substring(0,1),"L") )
{
materialPort = "M01";
}
if(StringUtils.equals(ProcessPreationName.substring(0,2),"AB") && (StringUtils.equals(machineName,"6LPTK07")))
{
materialPort = "M02";
}
bindMapMATL.put("MACHINENAME" ,machineName );
bindMapMATL.put("UNITNAME" , unitName );
bindMapMATL.put("MATERIALPORT" , materialPort );
List<Map<String, Object>> MATLValue = IDMFrameServiceProxy.getSqlTemplate().queryForList(sqlPRInuse, bindMapMATL);
String MaterialName = "";
double oldMaterialWeight = 0;
if(MATLValue.size() != 0)
{
MaterialName = MATLValue.get(0).get("MATERIALNAME").toString();
oldMaterialWeight = Double.parseDouble( MATLValue.get(0).get("MATERIALWEIGHT").toString());
}
// String MaterialName = MATLValue.get(0).get("MATERIALNAME").toString();
// double oldMaterialWeight = Double.parseDouble( MATLValue.get(0).get("MATERIALWEIGHT").toString());
//
if(StringUtils.isNotEmpty(MaterialName) && oldMaterialWeight > 0)
{
double PRvalue = 0 ;
boolean CONT = true ;
for ( Iterator itemIterator = itemListElement.getChildren().iterator(); itemIterator.hasNext(); )
{
//If CONT equals true , break out of the loop.
if(CONT != true)
{
break;
}
Element itemElement = (Element)itemIterator.next();
itemName = itemElement.getChild("ITEMNAME").getText();
siteListElement = itemElement.getChild("SITELIST");
if(StringUtils.equals(itemName,"4CTDispenseQuantity"))
{
for ( Iterator siteIterator = siteListElement.getChildren().iterator(); siteIterator.hasNext(); )
{
Element siteElement = (Element)siteIterator.next();
siteName = siteElement.getChild("SITENAME").getText();
siteValue = siteElement.getChild("SITEVALUE").getText().toString();
PRvalue = Double.parseDouble(siteValue);
double newMaterialWeight = oldMaterialWeight - (PRvalue/1000);
if(newMaterialWeight < 0)
{
newMaterialWeight = 0 ;
}
//Change the weight of PR barrel
String updsql = "UPDATE BSMATERIAL SET MATERIALWEIGHT = :MATERIALWEIGHT WHERE MATERIALNAME = :MATERIALNAME";
Map<String, Object> bindMapUPD = new HashMap<String, Object>();
bindMapUPD.put("MATERIALWEIGHT", newMaterialWeight);
bindMapUPD.put("MATERIALNAME", MaterialName);
IDMFrameServiceProxy.getSqlTemplate().update(updsql, bindMapUPD);
CONT = false;
break;
}
}
}
}
}
}
}
import org.apache.commons.lang.StringUtils;
import org.jdom.Element;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class MaterialUpdater {
// 更新材料重量的方法
public void updateMaterialWeight(Element body, List<Element> itemListElement) {
try {
// 从XML元素中获取机器名称和单元名称
String machineName = body.getChild("MACHINENAME").getText();
String unitName = body.getChild("UNITNAME").getText();
// 检查条件,如果满足条件才执行更新操作
if (StringUtils.isNotEmpty(machineName) && StringUtils.isNotEmpty(unitName) && !StringUtils.equals(machineName, "MASK CLEANER")) {
if ((StringUtils.equals(machineName, "6LPTK06") && StringUtils.equals(unitName, "6LPTK06-COAT"))
|| (StringUtils.equals(machineName, "6LPTK07") && StringUtils.equals(unitName, "6LPTK07-COAT"))
|| (StringUtils.equals(machineName, "6LPTK26") && StringUtils.equals(unitName, "6LPTK26-COAT"))) {
// 获取工序名称
String processOperationName = body.getChild("PROCESSOPERATIONNAME").getText();
// 根据工序和机器名称获取材料端口
String materialPort = getMaterialPort(processOperationName, machineName);
// 根据条件查询正在使用的材料
List<Map<String, Object>> materialValue = getInUseMaterial(machineName, unitName, materialPort);
// 如果找到正在使用的材料
if (!materialValue.isEmpty()) {
String materialName = materialValue.get(0).get("MATERIALNAME").toString();
double oldMaterialWeight = Double.parseDouble(materialValue.get(0).get("MATERIALWEIGHT").toString());
// 检查材料名称和旧的材料重量是否有效
if (StringUtils.isNotEmpty(materialName) && oldMaterialWeight > 0) {
double PRvalue = 0;
boolean CONT = true;
// 遍历XML元素的子元素
for (Iterator<Element> itemIterator = itemListElement.iterator(); itemIterator.hasNext();) {
if (!CONT) {
break;
}
Element itemElement = itemIterator.next();
String itemName = itemElement.getChild("ITEMNAME").getText();
// 如果元素的名称是"4CTDispenseQuantity"
if (StringUtils.equals(itemName, "4CTDispenseQuantity")) {
// 遍历SITELIST子元素
for (Iterator<Element> siteIterator = itemElement.getChild("SITELIST").getChildren().iterator(); siteIterator.hasNext();) {
Element siteElement = siteIterator.next();
String siteValue = siteElement.getChild("SITEVALUE").getText();
PRvalue = Double.parseDouble(siteValue);
double newMaterialWeight = oldMaterialWeight - (PRvalue / 1000);
if (newMaterialWeight < 0) {
newMaterialWeight = 0;
}
// 更新材料重量
String updsql = "UPDATE BSMATERIAL SET MATERIALWEIGHT = :MATERIALWEIGHT WHERE MATERIALNAME = :MATERIALNAME";
Map<String, Object> bindMapUPD = new HashMap<>();
bindMapUPD.put("MATERIALWEIGHT", newMaterialWeight);
bindMapUPD.put("MATERIALNAME", materialName);
IDMFrameServiceProxy.getSqlTemplate().update(updsql, bindMapUPD);
CONT = false;
break;
}
}
}
}
}
}
}
} catch (Exception e) {
// 处理异常,例如记录日志或采取其他适当的措施
e.printStackTrace();
}
}
// 根据工序和机器名称获取材料端口
private String getMaterialPort(String processOperationName, String machineName) {
if (StringUtils.equals(processOperationName.substring(0, 1), "L")) {
return "M01";
}
if (StringUtils.equals(processOperationName.substring(0, 2), "AB") && (StringUtils.equals(machineName, "6LPTK07"))) {
return "M02";
}
return "M01"; // 如果没有匹配的条件,默认为"M01"
}
// 查询正在使用的材料
private List<Map<String, Object>> getInUseMaterial(String machineName, String unitName, String materialPort) {
String sqlPRInuse = "SELECT * FROM BSMATERIAL AA " +
"WHERE AA.MACHINENAME = :MACHINENAME " +
"AND AA.MATERIALSTATE = 'InUse' " +
"AND AA.UNITNAME = :UNITNAME " +
"AND AA.MATERIALPORT = :MATERIALPORT";
Map<String, Object> bindMapMATL = new HashMap<>();
bindMapMATL.put("MACHINENAME", machineName);
bindMapMATL.put("UNITNAME", unitName);
bindMapMATL.put("MATERIALPORT", materialPort);
return IDMFrameServiceProxy.getSqlTemplate().queryForList(sqlPRInuse, bindMapMATL);
}
}
下面是对上面的代码的一种优化,主要包括以下改进:
最终,代码的质量和安全性取决于上下文和应用程序的要求。确保适应最佳实践并考虑错误处理和安全性是至关重要的。
-
引入函数:将代码中的一些重要操作提取为函数,以提高代码的可读性和模块化。
-
引入常量:将硬编码的字符串值提取为常量,以提高代码的可维护性。
-
引入异常处理:添加适当的异常处理来处理数据库操作可能出现的异常。
-
引入日志记录:在发生错误时记录错误信息。
-
简化条件逻辑:简化条件逻辑,以减少嵌
-
上面的代码看起来在逻辑上没有明显的问题,但可能存在一些需要注意的方面:
-
代码的可读性:代码嵌套了多层条件和循环,这可能会使代码难以理解和维护。建议添加注释来解释代码的目的和步骤,以提高可读性。
-
异常处理:代码没有包含异常处理逻辑,如果数据库查询或更新出现问题,可能会导致程序崩溃。建议添加适当的异常处理代码,例如捕获并处理可能出现的异常。
-
SQL 注入风险:虽然代码中使用了参数化的 SQL 查询和更新,但仍然需要确保输入参数不受恶意用户的操控,以防止 SQL 注入攻击。请确保维护良好的安全性实践,例如数据验证和输入验证。
-
数据库事务:如果这些操作需要作为一个事务进行,以确保数据库的一致性,那么需要考虑使用数据库事务来包装这些操作。
-
错误处理和日志记录:代码中使用了
CONT
变量来控制循环的终止,但没有明确处理可能发生的错误情况或记录错误信息。在发生错误时,建议记录适当的日志信息,以便进行故障排除。 -
可维护性:考虑将代码中的硬编码值(如 "MASK CLEANER"、"4CTDispenseQuantity" 等)提取为常量或配置参数,以提高代码的可维护性。
-
单一职责原则:这段代码包含了多个不同的操作,如数据库查询、循环迭代、条件检查和更新操作。根据单一职责原则,考虑将不同的操作封装成独立的函数或方法,以提高代码的模块化和可测试性。
import org.apache.commons.lang.StringUtils;
import org.jdom.Element;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class MaterialUpdater {
// Method to update material weight
public void updateMaterialWeight(Element body, List<Element> itemListElement) {
try {
// Get machine name and unit name from XML elements
String machineName = body.getChild("MACHINENAME").getText();
String unitName = body.getChild("UNITNAME").getText();
// Check conditions for executing the update
if (StringUtils.isNotEmpty(machineName) && StringUtils.isNotEmpty(unitName) && !StringUtils.equals(machineName, "MASK CLEANER")) {
if ((StringUtils.equals(machineName, "6LPTK06") && StringUtils.equals(unitName, "6LPTK06-COAT"))
|| (StringUtils.equals(machineName, "6LPTK07") && StringUtils.equals(unitName, "6LPTK07-COAT"))
|| (StringUtils.equals(machineName, "6LPTK26") && StringUtils.equals(unitName, "6LPTK26-COAT"))) {
// Get the process operation name
String processOperationName = body.getChild("PROCESSOPERATIONNAME").getText();
// Determine the material port based on process operation and machine name
String materialPort = getMaterialPort(processOperationName, machineName);
// Query for materials in use based on conditions
List<Map<String, Object>> materialValue = getInUseMaterial(machineName, unitName, materialPort);
// If in-use materials are found
if (!materialValue.isEmpty()) {
String materialName = materialValue.get(0).get("MATERIALNAME").toString();
double oldMaterialWeight = Double.parseDouble(materialValue.get(0).get("MATERIALWEIGHT").toString());
// Check if material name and old material weight are valid
if (StringUtils.isNotEmpty(materialName) && oldMaterialWeight > 0) {
double PRvalue = 0;
boolean CONT = true;
// Iterate through the XML element's children
for (Iterator<Element> itemIterator = itemListElement.iterator(); itemIterator.hasNext();) {
if (!CONT) {
break;
}
Element itemElement = itemIterator.next();
String itemName = itemElement.getChild("ITEMNAME").getText();
// If the element's name is "4CTDispenseQuantity"
if (StringUtils.equals(itemName, "4CTDispenseQuantity")) {
// Iterate through SITELIST child elements
for (Iterator<Element> siteIterator = itemElement.getChild("SITELIST").getChildren().iterator(); siteIterator.hasNext();) {
Element siteElement = siteIterator.next();
String siteValue = siteElement.getChild("SITEVALUE").getText();
PRvalue = Double.parseDouble(siteValue);
double newMaterialWeight = oldMaterialWeight - (PRvalue / 1000);
if (newMaterialWeight < 0) {
newMaterialWeight = 0;
}
// Update material weight
String updsql = "UPDATE BSMATERIAL SET MATERIALWEIGHT = :MATERIALWEIGHT WHERE MATERIALNAME = :MATERIALNAME";
Map<String, Object> bindMapUPD = new HashMap<>();
bindMapUPD.put("MATERIALWEIGHT", newMaterialWeight);
bindMapUPD.put("MATERIALNAME", materialName);
IDMFrameServiceProxy.getSqlTemplate().update(updsql, bindMapUPD);
CONT = false;
break;
}
}
}
}
}
}
}
} catch (Exception e) {
// Handle exceptions, e.g., log or take appropriate action
e.printStackTrace();
}
}
// Determine material port based on process operation and machine name
private String getMaterialPort(String processOperationName, String machineName) {
if (StringUtils.equals(processOperationName.substring(0, 1), "L")) {
return "M01";
}
if (StringUtils.equals(processOperationName.substring(0, 2), "AB") && (StringUtils.equals(machineName, "6LPTK07"))) {
return "M02";
}
return "M01"; // Default to "M01" if no matching conditions
}
// Query for materials in use
private List<Map<String, Object>> getInUseMaterial(String machineName, String unitName, String materialPort) {
String sqlPRInuse = "SELECT * FROM BSMATERIAL AA " +
"WHERE AA.MACHINENAME = :MACHINENAME " +
"AND AA.MATERIALSTATE = 'InUse' " +
"AND AA.UNITNAME = :UNITNAME " +
"AND AA.MATERIALPORT = :MATERIALPORT";
Map<String, Object> bindMapMATL = new HashMap<>();
bindMapMATL.put("MACHINENAME", machineName);
bindMapMATL.put("UNITNAME", unitName);
bindMapMATL.put("MATERIALPORT", materialPort);
return IDMFrameServiceProxy.getSqlTemplate().queryForList(sqlPRInuse, bindMapMATL);
}
}