Selaa lähdekoodia

!1949 优化代码同步逻辑:支持字段更新时保留历史作用类型
Merge pull request !1949 from 纯粹是糖/N/A

zuohuaijun 3 kuukautta sitten
vanhempi
commit
5f48844a95

+ 94 - 0
Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenConfigService.cs

@@ -147,6 +147,100 @@ public class SysCodeGenConfigService : IDynamicApiController, ITransient
         provider.Insertable(codeGenConfigs).ExecuteCommand();
     }
 
+
+    /// <summary>
+    /// 批量更新代码字段:先删除再新增,会保留历史字段操作类型
+    /// </summary>
+    /// <param name="tableColumnOutputList"></param>
+    /// <param name="codeGenId"></param>
+    [NonAction]
+    public async Task UpdateList(List<ColumnOuput> tableColumnOutputList, long codeGenId)
+    {
+        if (tableColumnOutputList == null) return;
+
+        //获取历史数据
+        var oldList = await GetList(new CodeGenConfig() { CodeGenId = codeGenId, });
+        //删除历史数据
+        await DeleteCodeGenConfig(codeGenId);
+
+        var codeGenConfigs = new List<SysCodeGenConfig>();
+        var orderNo = 100;
+        foreach (var tableColumn in tableColumnOutputList)
+        {
+            var oldItem = oldList.FirstOrDefault(u => u.ColumnName == tableColumn.ColumnName);
+
+            var codeGenConfig = new SysCodeGenConfig();
+
+            var yesOrNo = YesNoEnum.Y.ToString();
+            if (Convert.ToBoolean(tableColumn.ColumnKey)) yesOrNo = YesNoEnum.N.ToString();
+
+            if (CodeGenUtil.IsCommonColumn(tableColumn.PropertyName))
+            {
+                codeGenConfig.WhetherCommon = YesNoEnum.Y.ToString();
+                yesOrNo = YesNoEnum.N.ToString();
+            }
+            else
+            {
+                codeGenConfig.WhetherCommon = YesNoEnum.N.ToString();
+            }
+
+            codeGenConfig.CodeGenId = codeGenId;
+            codeGenConfig.ColumnName = tableColumn.ColumnName; // 字段名
+            codeGenConfig.PropertyName = tableColumn.PropertyName;// 实体属性名
+            codeGenConfig.ColumnLength = tableColumn.ColumnLength;// 长度
+            codeGenConfig.ColumnComment = tableColumn.ColumnComment;
+            codeGenConfig.NetType = tableColumn.NetType;
+            codeGenConfig.DefaultValue = tableColumn.DefaultValue;
+            codeGenConfig.WhetherRetract = YesNoEnum.N.ToString();
+
+            // 生成代码时,主键并不是必要输入项,故一定要排除主键字段
+            codeGenConfig.WhetherRequired = (tableColumn.IsNullable || tableColumn.IsPrimarykey) ? YesNoEnum.N.ToString() : YesNoEnum.Y.ToString();
+            codeGenConfig.WhetherQuery = yesOrNo;
+            codeGenConfig.WhetherImport = yesOrNo;
+            codeGenConfig.WhetherAddUpdate = yesOrNo;
+            codeGenConfig.WhetherTable = yesOrNo;
+
+            codeGenConfig.ColumnKey = tableColumn.ColumnKey;
+
+            codeGenConfig.DataType = tableColumn.DataType;
+            codeGenConfig.EffectType = CodeGenUtil.DataTypeToEff(codeGenConfig.NetType);
+            codeGenConfig.QueryType = GetDefaultQueryType(codeGenConfig); // QueryTypeEnum.eq.ToString();
+            codeGenConfig.OrderNo = orderNo;
+
+            if (oldItem != null)
+            {
+                //如果历史存在,则继承
+                codeGenConfig.WhetherQuery = oldItem.WhetherQuery;
+                codeGenConfig.WhetherImport = oldItem.WhetherImport;
+                codeGenConfig.WhetherAddUpdate = oldItem.WhetherAddUpdate;
+                codeGenConfig.WhetherTable = oldItem.WhetherTable;
+
+                codeGenConfig.EffectType = oldItem.EffectType;
+                codeGenConfig.FkConfigId = oldItem.FkConfigId;
+                codeGenConfig.FkEntityName = oldItem.FkEntityName;
+                codeGenConfig.FkTableName = oldItem.FkTableName;
+                codeGenConfig.FkDisplayColumns = oldItem.FkDisplayColumns;
+                codeGenConfig.FkLinkColumnName = oldItem.FkLinkColumnName;
+                codeGenConfig.FkColumnNetType = oldItem.FkColumnNetType;
+
+            }
+
+            codeGenConfigs.Add(codeGenConfig);
+
+            if (!string.IsNullOrWhiteSpace(tableColumn.DictTypeCode))
+            {
+                codeGenConfig.QueryType = "==";
+                codeGenConfig.DictTypeCode = tableColumn.DictTypeCode;
+                codeGenConfig.EffectType = tableColumn.DictTypeCode.EndsWith("Enum") ? "EnumSelector" : "DictSelector";
+            }
+
+            orderNo += 10; // 每个配置排序间隔10
+        }
+        // 多库代码生成---这里要切回主库
+        var provider = _db.AsTenant().GetConnectionScope(SqlSugarConst.MainConfigId);
+        provider.Insertable(codeGenConfigs).ExecuteCommand();
+    }
+
     /// <summary>
     /// 默认查询类型
     /// </summary>

+ 28 - 0
Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs

@@ -123,6 +123,34 @@ public class SysCodeGenService : IDynamicApiController, ITransient
         }
     }
 
+
+    /// <summary>
+    /// 同步代码字段(保留历史作用类型) 🔖 
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [ApiDescriptionSettings(Name = "SyncField"), HttpPost]
+    [DisplayName("同步代码字段")]
+    public async Task SyncCodeFieldGen(UpdateCodeGenInput input)
+    {
+        var isExist = await _db.Queryable<SysCodeGen>().AnyAsync(u => u.TableName == input.TableName && u.Id != input.Id);
+        if (isExist) throw Oops.Oh(ErrorCodeEnum.D1400);
+        try
+        {
+            // 开启事务
+            _db.AsTenant().BeginTran();
+            await _codeGenConfigService.UpdateList(GetColumnList(input.Adapt<AddCodeGenInput>()), input.Id);
+            _db.AsTenant().CommitTran();
+        }
+        catch (Exception ex)
+        {
+            _db.AsTenant().RollbackTran();
+            throw Oops.Oh(ex);
+        }
+    }
+
+
+
     /// <summary>
     /// 删除代码生成 🔖
     /// </summary>

+ 78 - 0
Web/src/api-services/apis/sys-code-gen-api.ts

@@ -566,6 +566,58 @@ export const SysCodeGenApiAxiosParamCreator = function (configuration?: Configur
                 options: localVarRequestOptions,
             };
         },
+/**
+         * 
+         * @summary 同步代码字段 🔖
+         * @param {UpdateCodeGenInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */ 
+        apiSysCodeFieldGenPost: async (body?: UpdateCodeGenInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysCodeGen/syncField`;
+            // use dummy base URL string because the URL constructor only accepts absolute URLs.
+            const localVarUrlObj = new URL(localVarPath, 'https://example.com');
+            let baseOptions;
+            if (configuration) {
+                baseOptions = configuration.baseOptions;
+            }
+            const localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
+            const localVarHeaderParameter = {} as any;
+            const localVarQueryParameter = {} as any;
+
+            // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
+
+            localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
+
+            const query = new URLSearchParams(localVarUrlObj.search);
+            for (const key in localVarQueryParameter) {
+                query.set(key, localVarQueryParameter[key]);
+            }
+            for (const key in options.params) {
+                query.set(key, options.params[key]);
+            }
+            localVarUrlObj.search = (new URLSearchParams(query)).toString();
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+            const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json';
+            localVarRequestOptions.data =  needsSerialization ? JSON.stringify(body !== undefined ? body : {}) : (body || "");
+
+            return {
+                url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
+                options: localVarRequestOptions,
+            };
+        }
+        
+
+
+
     }
 };
 
@@ -728,6 +780,20 @@ export const SysCodeGenApiFp = function(configuration?: Configuration) {
                 return axios.request(axiosRequestArgs);
             };
         },
+        /**
+         * 
+         * @summary 同步代码字段 🔖
+         * param {UpdateCodeGenInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysCodeFieldGenPost(body?: UpdateCodeGenInput,options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultListTableOutput>>> {
+            const localVarAxiosArgs = await SysCodeGenApiAxiosParamCreator(configuration).apiSysCodeFieldGenPost(body, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
     }
 };
 
@@ -976,4 +1042,16 @@ export class SysCodeGenApi extends BaseAPI {
     public async apiSysCodeGenUpdatePost(body?: UpdateCodeGenInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
         return SysCodeGenApiFp(this.configuration).apiSysCodeGenUpdatePost(body, options).then((request) => request(this.axios, this.basePath));
     }
+
+    /**
+     * 
+     * @summary 同步代码字段 🔖
+     * @param {UpdateCodeGenInput} [body] 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysCodeGenApi
+     */
+    public async  apiSysCodeFieldGenPost(body?: UpdateCodeGenInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListTableOutput>> {
+        return SysCodeGenApiFp(this.configuration).apiSysCodeFieldGenPost(body, options).then((request) => request(this.axios, this.basePath));
+    }
 }

+ 5 - 5
Web/src/views/system/codeGen/index.vue

@@ -37,11 +37,11 @@
 				<el-table-column label="操作" width="280" fixed="right" align="center" show-overflow-tooltip>
 					<template #default="scope">
 						<el-button icon="ele-Delete" size="small" text type="danger" title="删除" @click="deleConfig(scope.row)" />
-						<el-button icon="ele-Edit" size="small" text type="primary" title="编辑" @click="openEditDialog(scope.row)" />
+						<el-button icon="ele-Edit" size="small" text type="primary" title="编辑并完全刷新字段列表" @click="openEditDialog(scope.row)" />
 						<el-button icon="ele-CopyDocument" size="small" text type="primary" title="复制" @click="openCopyDialog(scope.row)" />
 						<el-button icon="ele-View" size="small" text type="primary" title="预览" @click="handlePreview(scope.row)" />
 						<el-button icon="ele-Setting" size="small" text type="primary" title="配置" @click="openConfigDialog(scope.row)" />
-						<el-button icon="ele-Refresh" size="small" text type="primary" title="同步" @click="syncCodeGen(scope.row)" />
+						<el-button icon="ele-Refresh" size="small" text type="primary" title="同步字段并保留历史字段作用类型" @click="syncCodeGen(scope.row)" />
 						<el-button icon="ele-Position" size="small" text type="primary" @click="handleGenerate(scope.row)">生成</el-button>
 					</template>
 				</el-table-column>
@@ -187,14 +187,14 @@ const deleConfig = (row: any) => {
 
 // 同步生成
 const syncCodeGen = async (row: any) => {
-  ElMessageBox.confirm(`确定要同步吗?`, '提示', {
+  ElMessageBox.confirm(`确定要同步吗? (保留历史字段作用类型)`, '提示', {
     confirmButtonText: '确定',
     cancelButtonText: '取消',
     type: 'warning',
   }).then(async () => {
-	await getAPI(SysCodeGenApi).apiSysCodeGenUpdatePost(row);
+	await getAPI(SysCodeGenApi).apiSysCodeFieldGenPost(row);
     handleQuery();
-    ElMessage.success('同步成功');
+    ElMessage.success('同步字段列表成功');
   }).catch(() => {});
 }