Browse Source

fix(mdm): 把员工状态 AC/DC 映射成在职和离职

原生投影和入站归一都按同一规则处理。空状态仍是 UNKNOWN。server 1.0.594。

Co-authored-by: Cursor <cursoragent@cursor.com>
YY968XX 12 giờ trước cách đây
mục cha
commit
ca622566b9

+ 3 - 3
server/Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj

@@ -11,9 +11,9 @@
     <GenerateSatelliteAssembliesForCore>true</GenerateSatelliteAssembliesForCore>
     <Copyright>Admin.NET</Copyright>
     <Description>Admin.NET ͨÓÃȨÏÞ¿ª·¢Æ½Ì¨</Description>
-    <AssemblyVersion>1.0.593</AssemblyVersion>
-    <FileVersion>1.0.593</FileVersion>
-    <Version>1.0.593</Version>
+    <AssemblyVersion>1.0.594</AssemblyVersion>
+    <FileVersion>1.0.594</FileVersion>
+    <Version>1.0.594</Version>
   </PropertyGroup>
 
   <ItemGroup>

+ 39 - 0
server/Plugins/Admin.NET.Plugin.AiDOP.Tests/DataPlatform/EmployeeEmploymentStatusMappingTests.cs

@@ -0,0 +1,39 @@
+using Xunit;
+
+namespace Admin.NET.Plugin.AiDOP.Tests.DataPlatform;
+
+public class EmployeeEmploymentStatusMappingTests
+{
+    [Fact]
+    public void NativeAndInbound_MapAcToActive_AndDcToLeft()
+    {
+        var native = File.ReadAllText(Path.Combine(RepoRoot(),
+            "server", "Plugins", "Admin.NET.Plugin.AiDOP", "DataPlatform", "NativeNeutralProjectionService.cs"));
+        var inbound = File.ReadAllText(Path.Combine(RepoRoot(),
+            "server", "Plugins", "Admin.NET.Plugin.AiDOP", "DataPlatform", "Inbound", "MdmMirrorUpsertService.cs"));
+        Assert.Contains("'ACTIVE','ONJOB','ON_JOB','AC'", native);
+        Assert.Contains("'LEFT','LEAVE','RESIGNED','TERMINATED','QUIT','DC'", native);
+        Assert.Contains("ELSE 'UNKNOWN'", native);
+        Assert.Contains("\"AC\"", inbound);
+        Assert.Contains("\"DC\"", inbound);
+        Assert.Contains("return \"UNKNOWN\"", inbound);
+    }
+
+    [Fact]
+    public void T8Projection_AlreadyMapsChineseStatus_AndIsNotEditedForAc()
+    {
+        var t8 = File.ReadAllText(Path.Combine(RepoRoot(),
+            "server", "Plugins", "Admin.NET.Plugin.AiDOP", "DataPlatform", "T8BaseInboundMdpSyncService.NeutralProjection.cs"));
+        Assert.Contains("zzzt='在职'", t8);
+        Assert.Contains("zzzt LIKE '%离职%'", t8);
+        Assert.DoesNotContain("'AC'", t8);
+    }
+
+    private static string RepoRoot()
+    {
+        var dir = new DirectoryInfo(AppContext.BaseDirectory);
+        while (dir != null && !File.Exists(Path.Combine(dir.FullName, "AGENTS.md")))
+            dir = dir.Parent;
+        return dir?.FullName ?? throw new InvalidOperationException("repo root not found");
+    }
+}

+ 2 - 2
server/Plugins/Admin.NET.Plugin.AiDOP/DataPlatform/Inbound/MdmMirrorUpsertService.cs

@@ -522,8 +522,8 @@ public sealed class MdmMirrorUpsertService : ITransient
     {
         var v = (raw ?? string.Empty).Trim();
         var u = v.ToUpperInvariant();
-        if (v is "在职" || u is "ACTIVE" or "ONJOB" or "ON_JOB") return "ACTIVE";
-        if (v is "离职" or "辞退" || u is "LEFT" or "LEAVE" or "RESIGNED" or "TERMINATED" or "QUIT") return "LEFT";
+        if (v is "在职" || u is "ACTIVE" or "ONJOB" or "ON_JOB" or "AC") return "ACTIVE";
+        if (v is "离职" or "辞退" || u is "LEFT" or "LEAVE" or "RESIGNED" or "TERMINATED" or "QUIT" or "DC") return "LEFT";
         if (v is "停用" || u is "INACTIVE" or "DISABLED" or "SUSPENDED") return "INACTIVE";
         return "UNKNOWN";
     }

+ 2 - 2
server/Plugins/Admin.NET.Plugin.AiDOP/DataPlatform/NativeNeutralProjectionService.cs

@@ -202,8 +202,8 @@ public sealed class NativeNeutralProjectionService : ITransient
               COALESCE(NULLIF(e.JobTitle,''), NULLIF(e.WorkCtr,'')),
               CASE
                 WHEN e.DateTerminated IS NOT NULL AND e.DateTerminated <= CURDATE() THEN 'LEFT'
-                WHEN e.EmploymentStatus IN ('在职') OR UPPER(IFNULL(e.EmploymentStatus,'')) IN ('ACTIVE','ONJOB','ON_JOB') THEN 'ACTIVE'
-                WHEN e.EmploymentStatus IN ('离职','辞退') OR UPPER(IFNULL(e.EmploymentStatus,'')) IN ('LEFT','LEAVE','RESIGNED','TERMINATED','QUIT') THEN 'LEFT'
+                WHEN e.EmploymentStatus IN ('在职') OR UPPER(IFNULL(e.EmploymentStatus,'')) IN ('ACTIVE','ONJOB','ON_JOB','AC') THEN 'ACTIVE'
+                WHEN e.EmploymentStatus IN ('离职','辞退') OR UPPER(IFNULL(e.EmploymentStatus,'')) IN ('LEFT','LEAVE','RESIGNED','TERMINATED','QUIT','DC') THEN 'LEFT'
                 WHEN e.EmploymentStatus IN ('停用') OR UPPER(IFNULL(e.EmploymentStatus,'')) IN ('INACTIVE','DISABLED','SUSPENDED') THEN 'INACTIVE'
                 ELSE 'UNKNOWN' END,
               e.EmploymentStatus,