From b5bc0d6eb2d2e55ea830a1b286252b9754cbf8e9 Mon Sep 17 00:00:00 2001
From: hutongqing <hutongqing@hnkhzn.com>
Date: 星期三, 21 八月 2024 11:21:04 +0800
Subject: [PATCH] 更新主从表添加、修改、删除时对从表的对应操作

---
 WIDESEAWCS_Server/WIDESEAWCS_Core/BaseServices/ServiceBase.cs |  240 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 211 insertions(+), 29 deletions(-)

diff --git a/WIDESEAWCS_Server/WIDESEAWCS_Core/BaseServices/ServiceBase.cs b/WIDESEAWCS_Server/WIDESEAWCS_Core/BaseServices/ServiceBase.cs
index 952bb0c..d72dc1e 100644
--- a/WIDESEAWCS_Server/WIDESEAWCS_Core/BaseServices/ServiceBase.cs
+++ b/WIDESEAWCS_Server/WIDESEAWCS_Core/BaseServices/ServiceBase.cs
@@ -2,6 +2,7 @@
 using Magicodes.ExporterAndImporter.Core.Models;
 using Magicodes.ExporterAndImporter.Excel;
 using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc.RazorPages;
 using Microsoft.Extensions.Options;
 using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
 using SqlSugar;
@@ -13,6 +14,7 @@
 using WIDESEAWCS_Core.Enums;
 using WIDESEAWCS_Core.Helper;
 using WIDESEAWCS_Core.Utilities;
+using static OfficeOpenXml.ExcelErrorValue;
 
 namespace WIDESEAWCS_Core.BaseServices
 {
@@ -119,27 +121,38 @@
 
                 if (property == null) continue;
 
-                (bool, string, object) result = property.ValidationVal(searchParametersList[i].Value.Split(','));
-                if (!result.Item1)
+                List<(bool, string, object)> results = property.ValidationValueForDbType(searchParametersList[i].Value.Split(',')).ToList();
+                if (results == null || results.Count() == 0)
                 {
                     continue;
                 }
+                for (int j = 0; j < results.Count(); j++)
+                {
+                    if (j == 0)
+                    {
+                        where += "(";
+                    }
+                    LinqExpressionType expressionType = searchParametersList[i].DisplayType.GetLinqCondition();
+                    if (expressionType == LinqExpressionType.Equal)
+                    {
+                        where += $"{searchParametersList[i].Name} = '{results[j].Item3}'";
+                    }
+                    else
+                    {
+                        where += $"{searchParametersList[i].Name} {searchParametersList[i].DisplayType} '{results[j].Item3}'";
+                    }
 
-                LinqExpressionType expressionType = searchParametersList[i].DisplayType.GetLinqCondition();
-                if (expressionType == LinqExpressionType.Equal)
-                {
-                    if (string.IsNullOrEmpty(where))
-                        where += $"{searchParametersList[i].Name} = '{searchParametersList[i].Value}'";
+                    if (j == results.Count() - 1)
+                    {
+                        where += ")";
+                    }
                     else
-                        where += $" and {searchParametersList[i].Name} = '{searchParametersList[i].Value}'";
+                    {
+                        where += " or ";
+                    }
                 }
-                else
-                {
-                    if (string.IsNullOrEmpty(where))
-                        where += $"{searchParametersList[i].Name} {searchParametersList[i].DisplayType} '{searchParametersList[i].Value}'";
-                    else
-                        where += $" and {searchParametersList[i].Name} {searchParametersList[i].DisplayType} '{searchParametersList[i].Value}'";
-                }
+                if (i < searchParametersList.Count - 1)
+                    where += " and ";
             }
             return where;
         }
@@ -164,7 +177,7 @@
                     }
                     return sortDic;
                 }
-                else if (propertyInfo.Any(x => x.Name == pageData.Sort))
+                else if (propertyInfo.Any(x => x.Name == pageData.Sort.FirstLetterToLower() || x.Name == pageData.Sort.FirstLetterToUpper()))
                 {
                     return new Dictionary<string, OrderByType> {
                         {
@@ -267,17 +280,64 @@
                         saveModel.MainData.Remove(keyPro.Name.FirstLetterToLower());
                     }
                 }
-
                 TEntity entity = saveModel.MainData.DicToModel<TEntity>();
+                if (saveModel.DetailData == null && saveModel.DetailData.Count == 0)
+                {
+                    BaseDal.AddData(entity);
+                    return WebResponseContent.Instance.OK();
+                }
 
-                BaseDal.AddData(entity);
+                if (typeof(TEntity).GetNavigatePro() == null)
+                {
+                    return WebResponseContent.Instance.Error("鏈厤缃鑸睘鎬�");
+                }
 
-                return WebResponseContent.Instance.OK();
+                Type detailType = typeof(TEntity).GetDetailType();
+                MethodInfo? methodInfo = GetType().GetMethod("AddDataIncludesDetail");
+                methodInfo = methodInfo?.MakeGenericMethod(new Type[] { detailType });
+                object? obj = methodInfo?.Invoke(this, new object[] { entity, detailType, saveModel.DetailData });
+                return obj as WebResponseContent;
             }
             catch (Exception ex)
             {
                 return WebResponseContent.Instance.Error(ex.Message);
             }
+        }
+
+        public WebResponseContent AddDataIncludesDetail<TDetail>(TEntity entity, Type detailType, List<Dictionary<string, object>> detailDics) where TDetail : class, new()
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                string name = typeof(TEntity).GetMainIdByDetail();
+                string reslut = detailType.ValidateDicInEntity(detailDics, true, new string[] { name });
+                if (reslut != string.Empty)
+                    return WebResponseContent.Instance.Error(reslut);
+
+                List<TDetail> list = detailDics.DicToIEnumerable<TDetail>();
+
+                ((SqlSugarClient)BaseDal.Db).BeginTran();
+
+                int id = BaseDal.Db.Insertable(entity).ExecuteReturnIdentity();
+
+                for (int i = 0; i < list.Count; i++)
+                {
+                    TDetail detail = list[i];
+                    typeof(TDetail).SetDetailId(detail, id, name);
+                }
+
+                BaseDal.Db.Insertable(list).ExecuteCommand();
+
+                ((SqlSugarClient)BaseDal.Db).CommitTran();
+
+                content = WebResponseContent.Instance.OK();
+            }
+            catch (Exception ex)
+            {
+                ((SqlSugarClient)BaseDal.Db).RollbackTran();
+                content = WebResponseContent.Instance.Error(ex.Message);
+            }
+            return content;
         }
 
         /// <summary>
@@ -335,11 +395,11 @@
                     return WebResponseContent.Instance.Error(validResult);
                 }
 
-                //PropertyInfo keyPro = typeof(TEntity).GetKeyProperty();
-                //if (keyPro == null)
-                //{
-                //    return WebResponseContent.Instance.Error("璇峰厛璁剧疆涓婚敭");
-                //}
+                PropertyInfo keyPro = typeof(TEntity).GetKeyProperty();
+                if (keyPro == null)
+                {
+                    return WebResponseContent.Instance.Error("璇峰厛璁剧疆涓婚敭");
+                }
 
                 TEntity entity = saveModel.MainData.DicToModel<TEntity>();
 
@@ -358,16 +418,108 @@
 
                     listCol.Add(propertyInfo?.Name);
                 }
-                if (list != null)
-                    listCol = listCol.Where(x => !list.Contains(x)).ToList();
-                bool result = BaseDal.UpdateData(entity, listCol, list);
 
-                return WebResponseContent.Instance.OK();
+                if (saveModel.DetailData == null && saveModel.DetailData.Count == 0)
+                {
+                    if (list != null)
+                        listCol = listCol.Where(x => !list.Contains(x)).ToList();
+                    bool result = BaseDal.UpdateData(entity, listCol, list);
+                    return WebResponseContent.Instance.OK();
+                }
+
+                if (typeof(TEntity).GetNavigatePro() == null)
+                {
+                    return WebResponseContent.Instance.Error("鏈厤缃鑸睘鎬�");
+                }
+
+                Type detailType = typeof(TEntity).GetDetailType();
+                MethodInfo? methodInfo = GetType().GetMethod("UpdateDataInculdesDetail");
+                methodInfo = methodInfo?.MakeGenericMethod(new Type[] { detailType });
+                object? obj = methodInfo?.Invoke(this, new object[] { entity, detailType, saveModel.DetailData, saveModel.DelKeys });
+                return obj as WebResponseContent;
             }
             catch (Exception ex)
             {
                 return WebResponseContent.Instance.Error(ex.Message);
             }
+        }
+
+        public WebResponseContent UpdateDataInculdesDetail<TDetail>(TEntity entity, Type detailType, List<Dictionary<string, object>> detailDics, List<object> delKeys) where TDetail : class, new()
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                string name = typeof(TEntity).GetMainIdByDetail();
+                string reslut = detailType.ValidateDicInEntity(detailDics, true, new string[] { name });
+                if (reslut != string.Empty)
+                    return WebResponseContent.Instance.Error(reslut);
+
+                List<TDetail> list = detailDics.DicToIEnumerable<TDetail>();
+
+                List<object> dynamicDelKeys = new List<object>();
+                if (delKeys != null)
+                {
+                    for (int i = 0; i < delKeys.Count; i++)
+                    {
+                        dynamicDelKeys.Add(delKeys[i]);
+                    }
+                }
+
+                List<TDetail> updateRows = new List<TDetail>();
+                List<TDetail> addRows = new List<TDetail>();
+
+                for (int i = 0; i < list.Count; i++)
+                {
+                    object detailId = typeof(TDetail).GetPropertyValue(list[i], typeof(TDetail).GetKeyName());
+                    if (detailId != null)
+                    {
+                        if (detailId.ToString() != "0")
+                        {
+                            updateRows.Add(list[i]);
+                        }
+                        else
+                        {
+                            addRows.Add(list[i]);
+                        }
+                    }
+                }
+
+                object mainId = typeof(TEntity).GetPropertyValue(entity, typeof(TEntity).GetKeyName());
+                if (mainId != null)
+                {
+                    ((SqlSugarClient)BaseDal.Db).BeginTran();
+
+                    if (dynamicDelKeys.Count > 0)
+                        BaseDal.Db.Deleteable<object>().AS(detailType.Name).Where($"{detailType.GetKeyName()} in (@id)", new { id = dynamicDelKeys.ToArray() }).ExecuteCommandHasChange();
+
+                    BaseDal.Db.Updateable(entity).ExecuteCommandHasChange();
+
+                    BaseDal.Db.Updateable(updateRows).ExecuteCommand();
+
+                    for (int i = 0; i < addRows.Count; i++)
+                    {
+                        TDetail detail = addRows[i];
+                        typeof(TDetail).SetDetailId(detail, mainId, name);
+                    }
+
+                    BaseDal.Db.Insertable(addRows).ExecuteCommand();
+
+                    ((SqlSugarClient)BaseDal.Db).CommitTran();
+
+                    content = WebResponseContent.Instance.OK();
+                }
+                else
+                {
+                    content = WebResponseContent.Instance.Error("鏈壘鍒颁富琛ㄤ富閿��");
+                }
+
+            }
+            catch (Exception ex)
+            {
+                ((SqlSugarClient)BaseDal.Db).RollbackTran();
+                content = WebResponseContent.Instance.Error(ex.Message);
+            }
+            return content;
         }
 
         /// <summary>
@@ -396,10 +548,40 @@
         {
             try
             {
-                return BaseDal.DeleteDataByIds(keys) ? WebResponseContent.Instance.OK() : WebResponseContent.Instance.Error();
+                if (typeof(TEntity).GetNavigatePro() == null)
+                    return BaseDal.DeleteDataByIds(keys) ? WebResponseContent.Instance.OK() : WebResponseContent.Instance.Error();
+                else
+                {
+                    if (keys != null)
+                    {
+                        Type detailType = typeof(TEntity).GetDetailType();
+                        string name = typeof(TEntity).GetMainIdByDetail();
+                        List<object> dynamicDelKeys = new List<object>();
+
+                        for (int i = 0; i < keys.Length; i++)
+                        {
+                            dynamicDelKeys.Add(keys[i]);
+                        }
+                        ((SqlSugarClient)BaseDal.Db).BeginTran();
+
+                        if (dynamicDelKeys.Count > 0)
+                            BaseDal.Db.Deleteable<object>().AS(detailType.Name).Where($"{name} in (@id)", new { id = dynamicDelKeys.ToArray() }).ExecuteCommandHasChange();
+
+                        BaseDal.DeleteDataByIds(keys);
+
+                        ((SqlSugarClient)BaseDal.Db).CommitTran();
+
+                        return WebResponseContent.Instance.OK();
+                    }
+                    else
+                    {
+                        return WebResponseContent.Instance.Error("鍙傛暟閿欒");
+                    }
+                }
             }
             catch (Exception ex)
             {
+                ((SqlSugarClient)BaseDal.Db).RollbackTran();
                 return WebResponseContent.Instance.Error(ex.Message);
             }
         }

--
Gitblit v1.9.3