Browse Source

detector array support

peterguo 1 month ago
parent
commit
2947787668

+ 5 - 3
app/Services/History/Detector/FileDetector.php

@@ -14,7 +14,8 @@ class FileDetector extends DetectorAbstract
             'is_hide',
             'version',
             'doc_stage',
-            'doc_type'
+            'doc_type',
+            'naming_rules'
         ];
     }
 
@@ -26,7 +27,8 @@ class FileDetector extends DetectorAbstract
             'is_hide',
             'version',
             'doc_stage',
-            'doc_type'
+            'doc_type',
+            'naming_rules'
         ];
     }
 
@@ -40,7 +42,7 @@ class FileDetector extends DetectorAbstract
     public static function arrayFields(): array
     {
         return [
-
+            'naming_rules'
         ];
     }
 }

+ 38 - 5
app/Services/History/ModelChangeDetector.php

@@ -17,6 +17,7 @@ class ModelChangeDetector
 
         $fields = call_user_func([$detector, "fields"]);
         $diffFields = call_user_func([$detector, "diffFields"]);
+        $arrayFields = call_user_func([$detector, "arrayFields"]);
 
         if (!$fields) {
             return [];
@@ -24,18 +25,50 @@ class ModelChangeDetector
 
         $items = [];
         foreach ($fields as $field) {
-            if (! $model->isDirty($field)) {
+            if (! $model->isDirty($field) && ! in_array($field, $diffFields)) {
                 continue;
             }
+            if (in_array($field, $arrayFields)) {
+                $items = array_merge($items, self::getArrayChange($model, $field));
+            } else {
+                $change = self::getChange($model, $field);
+                if ($change['diff']) {
+                    $items[] = $change;
+                }
+            }
+        }
 
+        return $items;
+    }
+
+    public static function getChange(Model $model, $field): array
+    {
+        return [
+            'old' => is_array($model->getOriginal($field)) ? json_encode($model->getOriginal($field)) : $model->getOriginal($field),
+            'field' => $field,
+            'new' => is_array($model->$field) ? json_encode($model->$field) : $model->$field,
+            'diff' => text_diff($model->getOriginal($field) ?? '', $model->$field ?? '')
+        ];
+    }
+
+    public static function getArrayChange(Model $model, $field): array
+    {
+        $items = [];
+        $oldArr = $model->getOriginal($field);
+        $newArr = $model->$field;
+        foreach ($newArr as $field => $newValue) {
+            $oldValue = $oldArr[$field] ?? null;
+            $diff = text_diff($oldValue ?? '', $newValue ?? '');
+            if (!$diff) {
+                continue;
+            }
             $items[] = [
-                'old' => is_array($model->getOriginal($field)) ? json_encode($model->getOriginal($field)) : $model->getOriginal($field),
+                'old' => is_array($oldValue) ? json_encode($oldValue, JSON_UNESCAPED_UNICODE) : $oldValue,
                 'field' => $field,
-                'new' => is_array($model->$field) ? json_encode($model->$field) : $model->$field,
-                'diff' => in_array($field, $diffFields) ? text_diff($model->getOriginal($field) ?? '', $model->$field ?? '') : null,
+                'new' => is_array($newValue) ? json_encode($newValue, JSON_UNESCAPED_UNICODE) : $newValue,
+                'diff' => $diff
             ];
         }
-
         return $items;
     }
 }