diff --git a/kernel/av/av.go b/kernel/av/av.go index 8b8998a5e..c2333f9e7 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -554,7 +554,7 @@ func ParseAttributeView(avID string) (ret *AttributeView, err error) { } func SaveAttributeView(av *AttributeView) (err error) { - // 做一些数据兼容处理 + // 做一些数据兼容和订正处理 now := util.CurrentTimeMillis() for _, kv := range av.KeyValues { if KeyTypeBlock == kv.Key.Type { @@ -584,6 +584,13 @@ func SaveAttributeView(av *AttributeView) (err error) { } } + // 数据订正 - 行去重 + for _, view := range av.Views { + if nil != view.Table { + view.Table.RowIDs = gulu.Str.RemoveDuplicatedElem(view.Table.RowIDs) + } + } + data, err := gulu.JSON.MarshalIndentJSON(av, "", "\t") // TODO: single-line for production if nil != err { logging.LogErrorf("marshal attribute view [%s] failed: %s", av.ID, err) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 038f081ef..5d31981dc 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -183,7 +183,7 @@ func RenderAttributeView(avID string) (viewable av.Viewable, attrView *av.Attrib view = attrView.Views[0] } - // 做一些数据兼容处理,保存的时候也会做 av.SaveAttributeView() + // 做一些数据兼容和订正处理,保存的时候也会做 av.SaveAttributeView() currentTimeMillis := util.CurrentTimeMillis() for _, kv := range attrView.KeyValues { switch kv.Key.Type { @@ -1234,6 +1234,12 @@ func replaceAttributeViewBlock(operation *Operation, tx *Transaction) (err error for _, v := range attrView.Views { switch v.LayoutType { case av.LayoutTypeTable: + for _, rowID := range v.Table.RowIDs { + if rowID == operation.NextID { + return + } + } + for i, rowID := range v.Table.RowIDs { if rowID == operation.PreviousID { v.Table.RowIDs[i] = operation.NextID