Переглянути джерело

fix(s0): relax orphan barcode columns

Allow nullable orphan rec_id and domain_code columns on BarCodeNbr.
No entity or controller changes.
YY968XX 1 день тому
батько
коміт
0b02ee74da

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

@@ -11,9 +11,9 @@
     <GenerateSatelliteAssembliesForCore>true</GenerateSatelliteAssembliesForCore>
     <GenerateSatelliteAssembliesForCore>true</GenerateSatelliteAssembliesForCore>
     <Copyright>Admin.NET</Copyright>
     <Copyright>Admin.NET</Copyright>
     <Description>Admin.NET 通用权限开发平台</Description>
     <Description>Admin.NET 通用权限开发平台</Description>
-    <AssemblyVersion>1.0.173</AssemblyVersion>
-    <FileVersion>1.0.173</FileVersion>
-    <Version>1.0.173</Version>
+    <AssemblyVersion>1.0.174</AssemblyVersion>
+    <FileVersion>1.0.174</FileVersion>
+    <Version>1.0.174</Version>
   </PropertyGroup>
   </PropertyGroup>
 
 
   <ItemGroup>
   <ItemGroup>
@@ -121,6 +121,9 @@
     <None Update="UpdateScripts\1.0.159.sql">
     <None Update="UpdateScripts\1.0.159.sql">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
     </None>
+    <None Update="UpdateScripts\1.0.174.sql">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
   </ItemGroup>
   </ItemGroup>
 
 
   <ItemGroup>
   <ItemGroup>

+ 59 - 0
server/Admin.NET.Web.Entry/UpdateScripts/1.0.174.sql

@@ -0,0 +1,59 @@
+-- ============================================================
+-- 1.0.174.sql
+-- S0-BARCODENBR-ORPHAN-NOTNULL-COLUMN-1
+--
+-- 业务目标:修复 BarcodeRule(BarCodeNbr 表)合法新增返回 500/S01999 的根因。
+--   BarCodeNbr 表存在新旧两套列:业务真实数据落在旧 PascalCase 列(Domain / RecID 等);
+--   snake_case 列为历史 CodeFirst 阶段补加、当前唯一 1 行业务列全空的孤立列。
+--   实体 AdoS0BarCodeNbr 仅映射 PascalCase 业务列 + 组织 snake 列(company_ref_id/factory_ref_id),
+--   未映射孤立列 rec_id(bigint) 与 domain_code(varchar(50))。这两列为 NOT NULL 且无默认值,
+--   INSERT 时无值 → 违反 NOT NULL 约束 → 落库失败 → 接口 500/S01999。
+--   本脚本将这两个已确认孤立的 NOT NULL 列改为可空,使新增可正常落库。
+--
+-- 授权范围(用户拍板方案 B):
+--   - 仅将 rec_id、domain_code 改为 NULL。
+--   - 不删除任何列。
+--   - 不修改 PascalCase 真实业务列(RecID / Domain / Customer / FirmString* / CreateUser 等)。
+--   - 不修改 company_ref_id / factory_ref_id。
+--   - 不修改实体映射 / Controller / DTO / 前端。
+--   - 不更新任何业务数据。
+--
+-- 安全保证:
+--   - 幂等:通过 information_schema.COLUMNS 前置判断「列存在且当前为 NOT NULL」才执行 ALTER,
+--     再次执行(列已可空或列不存在)自动降级为 SELECT 1,0 变更。
+--   - 不 INSERT / UPDATE / DELETE / DROP / TRUNCATE 业务数据。
+--   - 不动其他表、其他列、索引、唯一约束。
+--   - 列类型保持原样(rec_id bigint / domain_code varchar(50)),仅放开 NULL 约束。
+--
+-- 回滚 SQL(仅在需要恢复 NOT NULL 时人工执行,不默认运行;
+--   回滚前必须确认列内无 NULL 行,否则 ALTER 会失败):
+--   ALTER TABLE `BarCodeNbr` MODIFY COLUMN `rec_id` bigint NOT NULL;
+--   ALTER TABLE `BarCodeNbr` MODIFY COLUMN `domain_code` varchar(50) NOT NULL;
+-- ============================================================
+
+-- ─── 1) 幂等放开 rec_id NOT NULL(仅当列存在且当前为 NOT NULL 时执行) ───
+SET @need_rec_id := (
+  SELECT COUNT(*) FROM information_schema.COLUMNS
+   WHERE TABLE_SCHEMA = DATABASE()
+     AND TABLE_NAME = 'BarCodeNbr'
+     AND COLUMN_NAME = 'rec_id'
+     AND IS_NULLABLE = 'NO'
+);
+SET @sql := IF(@need_rec_id = 1,
+  'ALTER TABLE `BarCodeNbr` MODIFY COLUMN `rec_id` bigint NULL',
+  'SELECT 1');
+PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
+
+
+-- ─── 2) 幂等放开 domain_code NOT NULL(仅当列存在且当前为 NOT NULL 时执行) ───
+SET @need_domain_code := (
+  SELECT COUNT(*) FROM information_schema.COLUMNS
+   WHERE TABLE_SCHEMA = DATABASE()
+     AND TABLE_NAME = 'BarCodeNbr'
+     AND COLUMN_NAME = 'domain_code'
+     AND IS_NULLABLE = 'NO'
+);
+SET @sql := IF(@need_domain_code = 1,
+  'ALTER TABLE `BarCodeNbr` MODIFY COLUMN `domain_code` varchar(50) NULL',
+  'SELECT 1');
+PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;