FTPC multi-client operation at the same time through an ATrow object processing, list refresh, timestamp comparison tools

1. Solve the data problem caused by the simultaneous operation of ATRow objects, and avoid problems such as repeated data writing and old data overwriting

/**
 * AT表(对象)工具类
 *
 * @author xuweijun
 * @date 2022/5/23
 */
public class ATUtils extends ATRowUtility{
    
    

    //private constructor
    private ATUtils() {
    
    
    }
 /**
     * ATrow是否被删除
     * @author xuweijun
     * @date 2022/11/22 10:34
     * @param atRow
     * @return boolean
     */
    public static boolean isATRowDeleted(ATRow atRow){
    
    
        if (atRow.isNew() || atRow.isHistorical()) {
    
    
            return true;
        }
        ATDefinition var1 = atRow.getATDefinition();
        ATRowFilter var2 = PCContext.getFunctions().createATRowFilter(var1.getName());
        var2.forATRowKeyEqualTo(atRow.getKey());

        Vector var3;
        try {
    
    
            var3 = var2.exec(false);
        } catch (DatasweepException var6) {
    
    
            throw new MESRuntimeException("Error when refreshing ATRow", var6);
        }

        if (var3.size() != 1) {
    
    
           return true;
        } else {
    
    
            return false;
        }
    }
    /**
     * 对象是否被从数据库删除
     * @author xuweijun
     * @date 2022/11/22 10:29
     * @param mesatObject
     * @return boolean
     */
    public static boolean isATObjetDeleted(MESATObject mesatObject){
    
    
        ATRow atRow = mesatObject.getATRow();
        if (atRow.isNew() || atRow.isHistorical()) {
    
    
            return true;
        }
        return isATRowDeleted(atRow);
    }
    /**
     * atRow是否被数据库更改,只能校验一次,后续缓存被更新
     * @author xuweijun
     * @date 2022/11/22 10:21
     * @param atRow
     * @return boolean
     */
    public static boolean isATRowModified(ATRow atRow) {
    
    
        if (atRow.isNew() || atRow.isHistorical()) {
    
    
            return false;
        }
        Time lastModifiedTime = atRow.getLastModifiedTime();
        ATDefinition var1 = atRow.getATDefinition();
        ATRowFilter var2 = PCContext.getFunctions().createATRowFilter(var1.getName());
        var2.forATRowKeyEqualTo(atRow.getKey());
        Vector var3;
        try {
    
    
            var3 = var2.exec(false);
        } catch (DatasweepException var6) {
    
    
            throw new MESRuntimeException("Error when refreshing ATRow", var6);
        }
        if (var3.size() != 1) {
    
    
            return false;
        } else {
    
    
            ATRow atRowNew = (ATRow) var3.get(0);
            Time lastModifiedTimeNew = atRowNew.getLastModifiedTime();
            if (lastModifiedTimeNew == null && lastModifiedTime == null) {
    
    
                return false;
            }
            if (lastModifiedTimeNew != null && lastModifiedTime != null) {
    
    

                return !lastModifiedTimeNew.equals(lastModifiedTime);
            }
            return true;
        }
    }
    /**
     * 对象是否被数据库更改,该方法只能校验一次,查询后首次缓存被更新了
     * @author xuweijun
     * @date 2022/11/22 10:20
     * @param mesatObject
     * @return boolean
     */
    public static boolean isATObjetModified(MESATObject mesatObject){
    
    
        ATRow atRow = mesatObject.getATRow();
        if (atRow.isNew() || atRow.isHistorical()) {
    
    
            return false;
        }
        return isATRowModified(atRow);
    }

    /**
     * 客户端需要保存当前时间戳
     * @author xuweijun
     * @date 2022/11/22 15:53
     * @param mesatObject
     * @param originalTime
     * @return boolean
     */
    public static boolean isATObjetLastModified(MESATObject mesatObject,Time originalTime)
    {
    
    
        ATRow atRow = mesatObject.getATRow();
        if (atRow.isNew() || atRow.isHistorical()) {
    
    
            return false;
        }
        return isATRowLastModified(atRow,originalTime);
    }
    /**
     * 客户端需要保存当前时间戳
     * @author xuweijun
     * @date 2022/11/22 15:55
     * @param atRow
     * @param originalTime
     * @return boolean
     */
    public static boolean isATRowLastModified(ATRow atRow,Time originalTime)
    {
    
    
        if (atRow.isNew() || atRow.isHistorical()) {
    
    
            return false;
        }
        Time lastModifiedTime = originalTime;
        ATDefinition var1 = atRow.getATDefinition();
        ATRowFilter var2 = PCContext.getFunctions().createATRowFilter(var1.getName());
        var2.forATRowKeyEqualTo(atRow.getKey());
        Vector var3;
        try {
    
    
            var3 = var2.exec(false);
        } catch (DatasweepException var6) {
    
    
            throw new MESRuntimeException("Error when refreshing ATRow", var6);
        }
        if (var3.size() != 1) {
    
    
            return false;
        } else {
    
    
            ATRow atRowNew = (ATRow) var3.get(0);
            Time lastModifiedTimeNew = atRowNew.getLastModifiedTime();
            if (lastModifiedTimeNew == null && lastModifiedTime == null) {
    
    
                return false;
            }
            if (lastModifiedTimeNew != null && lastModifiedTime != null) {
    
    

                return !lastModifiedTimeNew.equals(lastModifiedTime);
            }
            return true;
        }
    }

    /**
     * 过滤掉数据库已经被删除的AT对象
     * @author xuweijun
     * @date 2022/11/22 12:49
     * @param atObjects 对象列表
     * @param isUpdate 是否对当前对象进行更新
     * @return java.util.List<? extends com.rockwell.mes.commons.base.ifc.objects.MESATObject>
     */
    public static List<? extends MESATObject> filterATObjetNotInDb(List<? extends MESATObject> atObjects,boolean isUpdate)
    {
    
    
        if(CollectionUtility.isEmpty(atObjects))
        {
    
    
            return atObjects;
        }
        ATRow atRow = atObjects.get(0).getATRow();
        ATDefinition var1 = atRow.getATDefinition();
        ATRowFilter var2 = PCContext.getFunctions().createATRowFilter(var1.getName());
        for (int i = 0; i < atObjects.size(); i++) {
    
    
            MESATObject mesatObject = atObjects.get(i);
            ATRow atRow1 = mesatObject.getATRow();
            var2.forATRowKeyEqualTo(atRow1.getKey());
        }
        Vector<ATRow> var3;
        try {
    
    
            var3 = var2.exec(false);
        } catch (DatasweepException var6) {
    
    
            throw new MESRuntimeException("Error when refreshing ATRow", var6);
        }
        Iterator<? extends MESATObject> iterator = atObjects.iterator();
        if (CollectionUtility.isEmpty(var3)) {
    
    
            atObjects.clear();
        } else {
    
    
            while (iterator.hasNext()) {
    
    
                MESATObject next = iterator.next();
                ATRow atRow1 = next.getATRow();
                ATRow atRow2 = var3.stream().filter(item -> item.getKey() == atRow1.getKey()).findAny().orElse(null);
                if (atRow2 == null) {
    
    
                    iterator.remove();
                } else {
    
    
                    if (isUpdate) {
    
    
						//这里不用强制更新com.datasweep.compatibility.manager.ATManager#updateObject会更新缓存中的引用
                        ReflectUtilsEx.setObjFieldValue(next,next.getClass(),"dgtATRow",atRow2);
                    }
                }
            }
        }
        return atObjects;
    }
 }

Guess you like

Origin blog.csdn.net/oXiaoWeiWuDi/article/details/127987230