using Microsoft.Data.SqlClient; using System.Collections; using System.Data; using System.Reflection; using RB_MES_API.Context; using RB_MES_API.Models; using Nancy.Json; using RB_MES_API.Models.Cloud; using Microsoft.EntityFrameworkCore; using Newtonsoft.Json.Linq; using Newtonsoft.Json; using RB_MES_APICore.Models.Cloud; using System.Text; using Microsoft.VisualBasic; using RB_MES_APICore.Models; using Kingdee.CDP.WebApi.SDK; //using Nancy.Extensions; namespace RB_MES_API.Controllers { /// /// 公共方法 /// public class ShareController : IShareController { private readonly RBContext _context; private readonly IKDSqlHelper _kDSqlHelper; /// /// 构造 /// /// /// public ShareController(RBContext context, IKDSqlHelper kDSqlHelper) { _context = context; _kDSqlHelper = kDSqlHelper; } public async void PostRequestBack(string intface, string doctype, string data) { string iby = LocalStaticRequest.GetSystemProfile(2, "InterfaceBakType"); if (iby == "1") { try { MesRequestStatu mes = new MesRequestStatu() { FInterface = intface, FDocType = doctype, FRequestJson = data.ToString(), }; var optionsBuilder = new DbContextOptionsBuilder(); optionsBuilder.UseSqlServer(_context.Database.GetConnectionString()!); optionsBuilder.UseModel(_context.Model); using (var context = new DbContext(optionsBuilder.Options)) { context.Database.EnsureCreated(); context.Database.Migrate(); context.Set().AddRange(mes); context.SaveChanges(true); context.Dispose(); } } catch (Exception ex) { LogHelper.WriteLog(string.Format("备份ReciveDataBack时发生错误:{0}\n" + "保存的数据为\n{1}" + ex.Message, data.ToString())); } } } /// public string? GetDropDownText(int saveval) { Type type = typeof(T); string myenum = Enum.GetName(type, saveval); return myenum; } /// /// 字符串转decimal,错误时返回0 /// /// 待转换的代表数量 /// public decimal DecimalPar(string sqty) { decimal result = 0; decimal.TryParse(sqty, out result); return result; } /// /// 将JSON转为实体类 /// /// 泛型 /// Json数据包 /// 错误消息 /// public List? DataConvertClass(string data, ref string reason) where T : class { reason = ""; List list = new List(); if (string.IsNullOrEmpty(data)) { return list; } try { list = JsonConvert.DeserializeObject>(data)!; } catch (Exception ex) { reason = string.Format("错误在DataConvertClass中发生:{0}", ex.Message); LogHelper.WriteLog(reason); } return list; } public T DataToClass(string data, ref string reason) where T : class, new() { reason = ""; T newrow = new T(); if (string.IsNullOrEmpty(data)) { return newrow; } JObject keyValuePairs = Newtonsoft.Json.Linq.JObject.Parse(data); Type type = typeof(T); PropertyInfo[] properties = type.GetProperties(); foreach (PropertyInfo property in properties) { string key = property.Name; if (keyValuePairs.ContainsKey(key)) { Type itemtype = property.PropertyType; string val = keyValuePairs.GetValue(key).ToString(); property.SetValue(newrow, Convert.ChangeType(val, itemtype)); } } return newrow; } /// /// 取查询接口名称 /// /// 接口ID /// public string? InterfaceName(int id) { string? intname = null; try { var sjid = GetAPIList().Result; SelectJoinID? sobj = sjid.Any() ? sjid.Find(s => s.FID == id) : null; intname = sobj == null ? null : sobj.FDocType; } catch (Exception) { throw; } return intname; } /// /// 取推送接口的K3单据名称 /// /// /// public string? K3BillName(int id) { string? billname = string.Empty; try { List receives = GetAPIList().Result; ReceiveStockBillType? stockBillType = receives.Where(s => s.ErpBillTypeID == id.ToString()).FirstOrDefault(); billname = stockBillType == null ? null : stockBillType.ErpBillName; } catch (Exception) { throw; } return billname; } /// /// 转XML /// /// /// /// public string? DatatableToXml(DataTable tb, string? tbName = null) { tb.TableName = tbName == null ? tb.TableName : tbName; //可以二次命名 StringWriter XmlWrit = new StringWriter(); tb.WriteXml(XmlWrit); string StrXml = XmlWrit.ToString(); XmlWrit.Close(); return StrXml; } /// /// RB数据库日志 /// public void _SqlloggerInvoke(int intfc, string doctypd, string mess, string sour, bool staus = false, string guid = "") { string mestxt = string.Empty; try { RBLog log = new RBLog() { FFunctionID = intfc, FDocType = string.IsNullOrEmpty(doctypd) ? "" : doctypd, FDateTime = DateTime.Now, FStatus = staus, FMess = string.IsNullOrEmpty(mess) ? "" : mess, FSource = string.IsNullOrEmpty(sour) ? "" : sour, FGUID = string.IsNullOrWhiteSpace(guid) ? Guid.NewGuid().ToString("B") : guid }; mestxt = JsonConvert.SerializeObject(log); List data = new List() { log }; string erstr = string.Empty; RBSql(data, ref erstr); if (!string.IsNullOrEmpty(erstr)) { LogHelper.WriteLog(string.Format("下列错误未保存到数据库:{0},\n原因是:{1}", mestxt, erstr)); } } catch (Exception ex) { LogHelper.WriteLog(string.Format("下列错误未保存到数据库:{0},\n原因是:{1}", mestxt, ex.Message)); } } /// /// 查询接口使用的SQL脚本 /// /// /// public string GetSelectSql(int id) { string? errstr = null; List stringBuilder = new List(); SqlParameter[] sp = new SqlParameter[] { new SqlParameter("ifcid",id) }; string sql = "select * from r_JoinTb where FSID=@ifcid order by FSID,FCtlID \n"; sql += "select * from r_SCol where FSID=@ifcid order by FSID,FCtlID"; DataSet? ds = _kDSqlHelper.GetDataSet(CommandType.Text, sql, sp, ref errstr, false); if (errstr != null) { _SqlloggerInvoke(1, "GetSelectSql", errstr, ""); return stringBuilder.ToString(); } if (ds != null) { if (ds.Tables.Count > 0) { DataTable table1 = ds.Tables[0]; if (table1.Rows.Count > 0) { string BuilderRow = string.Empty; var tbids = (from a in table1.AsEnumerable() select new { TableID = a.Field("FTableID") }).Distinct().ToList().OrderBy(s => s.TableID); foreach (var tbid in tbids) { string joinstr = "\n"; DataRow[] dataRows1 = table1.Select(string.Format("FTableID={0}", tbid.TableID)); foreach (DataRow dr in dataRows1) { string? tbname = dr["FTbName"] == DBNull.Value ? "" : dr["FTbName"].ToString(); string? asname = dr["FAsName"] == DBNull.Value ? "" : dr["FAsName"].ToString(); string? jtype = dr["FJoinType"] == DBNull.Value ? "" : dr["FJoinType"].ToString(); string? jmodel = dr["FJoinSymbol"] == DBNull.Value ? "" : dr["FJoinSymbol"].ToString(); string? wstr = dr["FCondition"] == DBNull.Value ? "" : dr["FCondition"].ToString(); if (jtype != "") joinstr += jtype + " "; if (tbname != "") joinstr += tbname + " "; if (asname != "") joinstr += asname + " "; if (jmodel != "") joinstr += jmodel + " "; if (wstr != "") joinstr += wstr + "\n"; } ArrayList sellist = new ArrayList(); DataTable table2 = ds.Tables[1]; if (table2.Rows.Count > 0) { DataRow[] dataRows2 = table2.Select(string.Format("FTableID={0}", tbid.TableID)); foreach (DataRow dr in dataRows2) { string selstr = string.Empty; string? asname = dr["FAsTable"] == DBNull.Value ? "" : dr["FAsTable"].ToString(); //与表1中FAsName相同 string? colname = dr["FColName"] == DBNull.Value ? "" : dr["FColName"].ToString(); string? defaultval = dr["FDeaful"] == DBNull.Value ? "" : dr["FDeaful"].ToString(); string? captionname = dr["FAsName"] == DBNull.Value ? "" : dr["FAsName"].ToString(); if (asname != "" && colname != "" && defaultval != "") { selstr += string.Format("isnull({0},{1})", asname + "." + colname, defaultval); } else { if (asname != "") selstr += asname + "."; if (colname != "") selstr += colname + " "; } if (asname == "" && colname == "" && defaultval != "") { selstr += defaultval + " "; } if (captionname != "") { selstr += captionname; } if (selstr.Length > 0) sellist.Add(selstr); } } if (sellist.Count > 0) BuilderRow = "select " + string.Join(",", sellist.ToArray()); if (joinstr.Trim().Length > 0) BuilderRow += joinstr; stringBuilder.Add(BuilderRow); } } } } return string.Join("\n", stringBuilder.ToArray()); } /// /// 通过输入表单返回实体类 /// /// /// /// public List GetClassList(DataTable dataTable) where T : class, new() { List ts = new List(); Type type = typeof(T); PropertyInfo[] propertyInfos = type.GetProperties(); foreach (DataRow row in dataTable.Rows) { T obj = new T(); foreach (PropertyInfo property in propertyInfos) { string name = property.Name; if (dataTable.Columns.Contains(name)) { object value = row[name]; Type protype = property.PropertyType; property.SetValue(obj, Convert.ChangeType(value, protype)); } } ts.Add(obj); } return ts; } private ArrayList GetTypeFiledNames(Type type) { ArrayList filedNames = new ArrayList() { "FID" }; PropertyInfo[] properties = type.GetProperties(); foreach (PropertyInfo property in properties) { filedNames.Add(property.Name); } return filedNames; } /// /// 64位解密 /// /// /// public string UnBase64Decode(string B64) { string NewStr = Encoding.GetEncoding("utf-8").GetString(Convert.FromBase64String(B64)); return NewStr; } /// /// 64位加密 /// /// /// public string Base64Decode(string B64) { byte[] NewStr = Encoding.Default.GetBytes(B64); return Convert.ToBase64String(NewStr); } /// /// 在目标ints中,通过组合,检验是否包含参数v /// /// 要校验的参数值范围 /// 要判断的枚举值 /// 当前设置的值 /// public bool SCombination(List ints, int v, int setv) { if (setv < v) { return false; } if (setv == v) { return true; } bool isok = false; for (int i = 1; i <= ints.Count; i++) { string result = string.Empty; List stringBuilder = new List(); GetSetGroup(ints, result, 0, i, ref stringBuilder); if (stringBuilder.Count > 0) { foreach (string str in stringBuilder) { int zhval = 0; string[] zh = str.Split(','); for (int j = 0; j < zh.Length; j++) { if (zh[j].ToString() != "") { int setval = int.Parse(zh[j].ToString()); zhval += setval; } } if (v + zhval == setv) { isok = true; break; } } } if (isok) { break; } } return isok; } public List GetSetInts(int exceptobj) where T : struct, Enum { var fileds = typeof(T).GetFields(BindingFlags.Public | BindingFlags.Static); List ints = new List(); foreach (FieldInfo field in fileds) { string enumname = field.Name; int val = (int)Enum.Parse(typeof(T), enumname); if (val != 0) { int newv = int.Parse(val.ToString()); if (newv > 0 && newv != exceptobj) { ints.Add(newv); } } } return ints; } private void GetSetGroup(List ints, string result, int start, int length, ref List sb) { if (length == 0) { sb.Add(result); } else if (length <= (ints.Count - start)) { GetSetGroup(ints, result, start + 1, length, ref sb); result += result == "" ? ints[start].ToString() : "," + ints[start].ToString(); GetSetGroup(ints, result, start + 1, length - 1, ref sb); } } /// /// 将DataTable对象转为JSON,带字段名 /// /// /// /// public string ObjectToJSON(DataTable table) { JavaScriptSerializer jsSerializer = new JavaScriptSerializer(); List> parentRow = new List>(); foreach (DataRow row in table.Rows) { Dictionary childRow = new Dictionary(); foreach (DataColumn col in table.Columns) { childRow.Add(col.ColumnName, row[col]); } parentRow.Add(childRow); } return jsSerializer.Serialize(parentRow); } /// /// 判断是否批量保存成功 /// /// 需要分析的json /// 必须返回的字段 /// 如果不成功,代表错误消息;否则代表返回的单据编号 /// public bool CloudExecuteBatchSaveStatus(string result, string needfileds, ref List> message) { message = new List>(); if (result != "") { try { JObject iResultStr = (JObject)JsonConvert.DeserializeObject(result)!; string E2 = (string)iResultStr["Result"]!["ResponseStatus"]!["IsSuccess"]!; if (E2.ToLower() == "false") { JArray E3 = (JArray)iResultStr["Result"]!["ResponseStatus"]!["Errors"]!; JObject E4 = JObject.Parse(JsonConvert.SerializeObject(E3[0])); message.Add(new Dictionary { { "Message", (string)E4["Message"]! } }); return false; } else { string[] strings = needfileds.Split(','); JArray E5 = (JArray)iResultStr["Result"]!["NeedReturnData"]!; if (needfileds.Contains('.')) { string entryname = string.Empty; foreach (string s in strings) { string[] Hstr = s.Split('.'); if (Hstr.Length == 2) { entryname = Hstr[0]; break; } } foreach (var HE in E5) { JArray HE1 = (JArray)HE[entryname]!; foreach (JToken HE_N in HE1) { Dictionary HkeyValues = new Dictionary(); foreach (string s in strings) { string[] chstr = s.Split('.'); if (chstr.Length == 2) { string Hkey = chstr[1]; JToken keyValues = HE_N.SelectToken(string.Format("$..{0}", Hkey)); if (keyValues != null) { string Hkey2 = JsonConvert.SerializeObject(HE_N[Hkey]); Type type = HE_N[Hkey].GetType(); if (type.Name.ToLower() == "jobject") { JObject keyValuePairs = (JObject)JsonConvert.DeserializeObject(Hkey2)!; foreach (var kv in keyValuePairs) { string newkv = (string)kv.Value!; HkeyValues.Add(Hkey, newkv); } } else { HkeyValues.Add(Hkey, Hkey2); } } else { HkeyValues.Add(Hkey, HE_N[Hkey]!.ToString()); } } else { HkeyValues.Add(s, HE[s].ToString()); } } message.Add(HkeyValues); } } } else { foreach (var HE in E5) { Dictionary HkeyValues = new Dictionary(); Type type = HE.GetType(); if (type.IsArray) { foreach (var obj in HE) { foreach (string s in strings) { HkeyValues.Add(s, obj[s]!.ToString()); } } } else { foreach (string s in strings) { HkeyValues.Add(s, HE[s]!.ToString()); } } if (HkeyValues.Count > 0) { message.Add(HkeyValues); } } } } } catch (Exception ex) { message.Add(new Dictionary { { "Message", ex.Message } }); LogHelper.WriteLog(string.Format("Cloud判断是否批量保存成功的CloudExecuteBatchSaveStatus方法发生错误:{0}", ex.Message)); return false; } } return true; } /// /// 判断是否保存成功 /// /// 需要分析的json /// 如果不成功,代表错误消息;否则代表返回的单据编号 /// public bool CloudExecuteSaveStatus(string result, ref string message) { if (result == null) { return false; } try { JObject iResultStr = (JObject)JsonConvert.DeserializeObject(result)!; var resultJObject = JObject.Parse(result); var queryNode = resultJObject.SelectToken("$..IsSuccess"); if (queryNode == null) { message = "返回异常"; } var isSuccess = queryNode.Value(); if (!isSuccess) { JArray E3 = JArray.Parse(JsonConvert.SerializeObject(resultJObject.SelectToken("$..Errors"))); JObject E4 = (JObject)E3[0]; message = (string)E4["Message"]!; return false; } else { JArray E5 = (JArray)iResultStr["Result"]!["ResponseStatus"]!["SuccessEntitys"]!; JObject E6 = JObject.Parse(JsonConvert.SerializeObject(E5[0])); message = (string)E6["Number"]!; } } catch (Exception e) { message = e.Message; LogHelper.WriteLog(string.Format("Cloud判断是否保存成功的CloudExecuteSaveStatus方法发生错误:{0}", e.Message)); return false; } return true; } /// public List GetNewObj(int fid, string dectablename, string inputjson, ref string reason) where T : class, new() { reason = string.Empty; List list = new List(); List selectClumnConvert = GetAPIList().Result; var selectconvert = selectClumnConvert.Where(s => s.FFunctionID == fid && s.FDesTableName.Equals(dectablename)) .Select(s => new { s.FIndexID, s.FSourceName }) .DistinctBy(s => new { s.FIndexID, s.FSourceName }) .OrderBy(s => s.FIndexID) .ToList(); if (selectconvert.Count == 0) { reason = "r_ClumnConvert中不存在" + dectablename; return list; } //准备序列化数据集 JArray jArray = (JArray)JsonConvert.DeserializeObject(inputjson); //特别注意!!! if (jArray == null || jArray.Count == 0) { reason = "没有可用数据"; return list; } Type type = typeof(T); PropertyInfo[] propertyInfos = type.GetProperties(); ArrayList arrayList = new ArrayList(); foreach (JProperty jProperty in jArray.FirstOrDefault()) { arrayList.Add(jProperty.Name); } foreach (var item in jArray) { if (item.Count() != selectconvert.Count()) { reason = "r_ClumnConvert配置的FSourceName数目与数据集字段不符"; break; //直接退出循环 } T newobj = new T(); for (int i = 0; i < item.Count(); i++) { string sname = selectconvert[i].FSourceName; var dlist = from a in selectClumnConvert.Where(s => s.FSourceName == sname) join b in propertyInfos on a.FDesName equals b.Name select new { a.FDesName }; if (dlist.Any()) { string dname = arrayList[i].ToString(); foreach (var s in dlist) { var property = propertyInfos.Where(v => v.Name == s.FDesName).FirstOrDefault(); if (property != null) { object v = item[dname] == null ? "" : item[dname]; Type itemtype = property.PropertyType; property.SetValue(newobj, Convert.ChangeType(v, itemtype)); } } } } list.Add(newobj); } return list; } public List GetNewObjForChild(string fieldkeys, string inputjson, ref string reason) where T : class, new() { reason = ""; List list = new List(); Type type = typeof(T); try { string[] strings = fieldkeys.Split(','); PropertyInfo[] propertyInfos = type.GetProperties(); JArray jArray = (JArray)JsonConvert.DeserializeObject(inputjson); //特别注意!!! if (jArray == null) { reason = "没有可用数据"; return list; } foreach (var item in jArray) { JObject keyValuePairs = item as JObject; int itemtotal = keyValuePairs.Count; if (strings.Count() != itemtotal || propertyInfos.Count() != itemtotal) { reason = string.Format("r_ClumnConvert配置的fieldkeys数目与数据集{0}字段不符"); break; //直接退出循环 } T newobj = new T(); int i = 0; foreach (var item1 in keyValuePairs) { PropertyInfo property = propertyInfos[i]; //不仅数量要吻合,字段也要吻合!!! if (property != null) { object v = item1.Value; Type itemtype = property.PropertyType; if (v != null) { property.SetValue(newobj, Convert.ChangeType(v, itemtype)); } } i++; } list.Add(newobj); } } catch (Exception ex) { reason = string.Format("通过云星空表单查询接口返回的数据解析出错,请检查配置是否与子查询对象【{0}】是否匹配。错误报文如下:\r\n{1}", type.Name, ex.Message); } return list; } /// public DataTable GetInputDataTable(int fid, string DocType, string data, ref string messtr) { DataTable dt = new DataTable(); if (data == null) { return dt; } List selectClumns = GetAPIList().Result; var clumnConverts = (from a in selectClumns.Where(s => s.FFunctionID == fid && s.FDesTableName == DocType) select new { a.FSourceName, a.FIndexID }) .Distinct() .OrderBy(s => s.FIndexID) .ToList(); if (clumnConverts.Count > 0) { dt.Columns.Clear(); foreach (var selectClumnConvert in clumnConverts) { dt.Columns.Add(selectClumnConvert.FSourceName, typeof(string)); } } else { return dt; } JArray jArray = (JArray)JsonConvert.DeserializeObject(data)!; //特别注意!!! try { foreach (var item in jArray) { Type type = item.GetType(); DataRow row = dt.NewRow(); for (int i = 0; i < dt.Columns.Count; i++) { string pstch = dt.Columns[i].ColumnName; row[i] = item[pstch].ToString(); } dt.Rows.Add(row); dt.AcceptChanges(); } } catch (Exception ex) { messtr = ex.Message; } return dt; } /// public DataTable JsonConvertDatatable(string fieldkeys, string data, ref string messtr) { messtr = string.Empty; DataTable table = new DataTable(); if (string.IsNullOrEmpty(fieldkeys)) { messtr = "参数fieldkeys不能为空"; return table; } if (string.IsNullOrEmpty(data)) { messtr = "参数data不能为空"; return table; } string[] fields = fieldkeys.Split(','); try { foreach (string s in fields) { if (s == "" || string.IsNullOrEmpty(s)) { continue; } table.Columns.Add(s, typeof(string)); } table.AcceptChanges(); JArray jArray = (JArray)JsonConvert.DeserializeObject(data)!; //特别注意!!! Type type = jArray.GetType(); foreach (var item in jArray) { if (item.Count() != table.Columns.Count) { continue; } DataRow row = table.NewRow(); for (int i = 0; i < table.Columns.Count; i++) { if (!type.Equals(item.GetType())) { row[i] = item[table.Columns[i].ColumnName]; } else { row[i] = item[i]; } } table.Rows.Add(row); } table.AcceptChanges(); } catch (Exception ex) { messtr = ex.Message; LogHelper.WriteLog(string.Format("根据字段顺序,将JSON数据集转为DataTable的JsonConvertDatatable方法发生错误:{0}", ex.Message)); } return table; } /// public List> GetClassList(DataTable table) { List> list = new List>(); if (table != null && table.Rows.Count > 0) { foreach (DataRow row in table.Rows) { Dictionary keyValuePairs = new Dictionary(); foreach (DataColumn clumn in table.Columns) { string colname = clumn.ColumnName.ToUpper(); keyValuePairs.Add(colname, row[colname].ToString()); } list.Add(keyValuePairs); } } return list; } /// public List> GetClassList(JArray arrjson) { List> list = new List>(); foreach (JObject item in arrjson) { Dictionary keyValuePairs = new Dictionary(); foreach (var obj in item) { keyValuePairs.Add(obj.Key, obj.Value.ToString()); } list.Add((keyValuePairs)); } return list; } /// /// 为确保计量单位不会丢失,如果定时任务更新不成功,导致无缓存,则直接从本地查询缓存起来 /// /// /// private async Task> GetunitLists(string name) { List unitList = new List(); try { string messstr = string.Empty; string costomsql = ApiSettingsHelper.GetConfig("CustomRequestRemoteSql"); if (costomsql.ToUpper() == "Y") { BillQuery query = new BillQuery() { FieldKeys = "FUNITID,FNumber,FName,FIsBaseUnit,FPrecision,FDocumentStatus,FForbidStatus,FConvertDenominator,FConvertNumerator,FRoundType", FormId = "BD_UNIT", FilterString = "FDOCUMENTSTATUS='C' AND FFORBIDSTATUS='A'" }; string queryJson = JsonConvert.SerializeObject(query); //从云星空查询 string result = LocalStaticRequest.cloudApi.BillQuery(queryJson); if (!string.IsNullOrEmpty(result)) { unitList = GetNewObjForChild(query.FieldKeys, result, ref messstr); if (unitList.Count > 0) { CacheHelper.Set_AbsluteExpire("BD_UNIT", unitList); } } } else { SqlParameter[] sqls = new SqlParameter[] { new SqlParameter("@a","A"), new SqlParameter("@c","C") }; string fileds = "SELECT DISTINCT u1.FUNITID,FNumber,FName,FIsBaseUnit,FPrecision,u1.FDocumentStatus,u1.FForbidStatus,FConvertDenominator,FConvertNumerator,FRoundType\r\n"; fileds += "FROM T_BD_UNIT u1 INNER JOIN T_BD_UNIT_L u2 on u2.FUNITID=u1.FUNITID\r\n"; fileds += "\tinner join T_BD_UNITCONVERTRATE u3 on u3.FUNITID=U1.FUNITID\r\n"; fileds += "WHERE u1.FDOCUMENTSTATUS=@c AND u1.FFORBIDSTATUS=@a"; DataSet set = _kDSqlHelper.GetDataSet(CommandType.Text, fileds, sqls, ref messstr, true); if (string.IsNullOrEmpty(messstr)) { if (set != null) { if (set.Tables.Count != 0) { DataTable dataTable = set.Tables[0]; unitList = GetClassList(dataTable); if (unitList.Count > 0) { CacheHelper.Set_AbsluteExpire(name, unitList); } } } } } } catch (Exception e) { LogHelper.WriteLog(string.Format("ShareController的GetunitLists发生错误:{0}", e.Message)); } return unitList; } public async Task> GetAPIList() where T : class, new() { Type type = typeof(T); string name = type.Name; List? list = CacheHelper.GetCache>(name); if (list == null || list.Count == 0) { switch (name.ToLower()) { case "bd_unit": list = await GetunitLists(name) as List; //list = LocalStaticRequest.unites as List; break; case "functionlist": list = await GetfunctionLists(name) as List; break; case "cloudbillquery": list = await Getcloudbillquery(name) as List; break; case "selectjoinid": list = await Getselectjoinid(name) as List; break; case "datasavebatch": list = await Getdatasvaebatch(name) as List; break; case "formidtype": list = await Getformidtype(name) as List; break; case "selectclumnconvert": list = await Getselectclumnconvert(name) as List; break; case "receivestockbilltype": list = await Getreceivestockbilltypet(name) as List; break; case "billtyperules": list = await Getbilltypesource(name) as List; break; case "apihostservice": list = await GetTimedHostedService(name) as List; break; case "customservice": list = await GetCustomService(name) as List; break; default: break; } } list = list ?? new List(); return list; } private async Task> GetCustomService(string name) { var list = await _context.r_CustomServices!.AsNoTracking().ToListAsync(); CacheHelper.Set_AbsluteExpire(name, list); return list; } private async Task> GetTimedHostedService(string name) { var list = await (from a in _context.r_ApiHostServices!.Where(s => s.FTimer > 0) join b in _context.r_FormIDType!.Include(s => s.functions).Where(s => s.FUsing && s.FIsHostService) on a.FDocType equals b.FDocType select a).AsNoTracking().ToListAsync(); CacheHelper.Set_AbsluteExpire(name, list); return list; } private async Task> GetfunctionLists(string name) { string apiid = LocalStaticRequest.GetSystemProfile(1, "APIGrouID"); var list = await _context.r_FunctionList! .Where(s => s.FUsing && s.FGoupID == int.Parse(apiid)) .AsNoTracking().OrderBy(s => s.FID).ToListAsync(); CacheHelper.Set_AbsluteExpire(name, list); return list; } private async Task> Getcloudbillquery(string name) { string apiid = LocalStaticRequest.GetSystemProfile(1, "APIGrouID"); var list = await _context.r_CloudBillQuery! .Include(s => s.GetFormID).ThenInclude(s => s.functions).ThenInclude(s => s.apigroup) .Where(s => s.GetFormID.FUsing && s.GetFormID.functions.FUsing) .Where(s => s.GetFormID.functions.apigroup.FID == int.Parse(apiid)) .AsNoTracking().ToListAsync(); CacheHelper.Set_AbsluteExpire(name, list); return list; } private async Task> Getselectjoinid(string name) { string apiid = LocalStaticRequest.GetSystemProfile(1, "APIGrouID"); var list = await _context.r_SelectJoinID! .Include(s => s.functions).ThenInclude(s => s.apigroup) .Where(s => s.functions.FUsing && s.functions.apigroup.FID == int.Parse(apiid)) .AsNoTracking().ToListAsync(); CacheHelper.Set_AbsluteExpire(name, list); return list; } private async Task> Getdatasvaebatch(string name) { string apiid = LocalStaticRequest.GetSystemProfile(1, "APIGrouID"); var list = await _context.r_DataSaveBatch! .Include(s => s.GetForm).ThenInclude(s => s.functions).ThenInclude(s => s.apigroup) .Where(s => s.GetForm.FUsing) .Where(s => s.GetForm.functions.FUsing && s.GetForm.functions.apigroup.FID == int.Parse(apiid)) .AsNoTracking().ToListAsync(); CacheHelper.Set_AbsluteExpire(name, list); return list; } private async Task> Getformidtype(string name) { string apiid = LocalStaticRequest.GetSystemProfile(1, "APIGrouID"); var list = await _context.r_FormIDType! .Include(s => s.functions).ThenInclude(s => s.apigroup) .Where(s => s.FUsing) .Where(s => s.functions.apigroup.FID == int.Parse(apiid)) .AsNoTracking().ToListAsync(); CacheHelper.Set_AbsluteExpire(name, list); return list; } private async Task> Getselectclumnconvert(string name) { var list = await _context.r_ClumnConvert!.AsNoTracking().ToListAsync(); CacheHelper.Set_AbsluteExpire(name, list); return list; } private async Task> Getreceivestockbilltypet(string name) { string apiid = LocalStaticRequest.GetSystemProfile(1, "APIGrouID"); var list = await _context.r_ReceiveStockBillTypes! .Include(s => s.functions).ThenInclude(s => s.apigroup) .Where(s => s.functions.FUsing && s.functions.apigroup.FID == int.Parse(apiid)) .AsNoTracking().ToListAsync(); CacheHelper.Set_AbsluteExpire(name, list); return list; } private async Task> Getbilltypesource(string name) { var list = await _context.r_BillTypeRules!.AsNoTracking().ToListAsync(); CacheHelper.Set_AbsluteExpire(name, list); return list; } /// /// 将计量单位添加到缓存 /// public void AddUnitCache() { //清除缓存 CacheHelper.Remove("BD_UNIT"); List units = CacheHelper.GetCache>("BD_UNIT"); if (units == null) { string sql = "SELECT * FROM kdCloud_BD_UNIT WHERE FDocumentStatus=@C AND FForbidStatus=@A"; SqlParameter[] sqlParameters = new SqlParameter[] { new SqlParameter("@C","C"), new SqlParameter("@A","A") }; string reason = string.Empty; DataSet dataSet = _kDSqlHelper.GetDataSet(CommandType.Text, sql, sqlParameters, ref reason); if (dataSet != null) { if (dataSet.Tables.Count > 0) { DataTable table = dataSet.Tables[0]; units = GetClassList(table); CacheHelper.Set_AbsluteExpire("BD_UNIT", units); } } } } public string GetDesFormID(string postdoctype, string sourtype) { string formid = string.Empty; List list = GetAPIList().Result; var item = list.Where(s => s.FPostTypeID == postdoctype && s.FSBillTypeNumber == sourtype); if (item.Count() > 0) { formid = item.FirstOrDefault().FDBillTypeNumber; } return formid; } /// public DataTable JsonToDatatable(string data, ref string messtr) { DataTable dt = new DataTable(); try { JArray jArray = new JArray(); object OBJ = JsonConvert.DeserializeObject(data)!; if (OBJ.GetType().Name.ToLower() == "jobject") { JObject jObject = (JObject)JsonConvert.DeserializeObject(data)!; foreach (var obj in jObject) { jArray.Add(obj.Value); } } else { jArray = (JArray)JsonConvert.DeserializeObject(data)!; } List> Dics = GetClassList(jArray); foreach (Dictionary keyValues in Dics) { foreach (var x in keyValues) { if (!string.IsNullOrEmpty(x.Key)) { if (!dt.Columns.Contains(x.Key)) { dt.Columns.Add(new DataColumn(x.Key, x.Value.GetType())); } } } } foreach (Dictionary keyValues in Dics) { DataRow row = dt.NewRow(); foreach (var item in keyValues) { string colname = item.Key; object val = item.Value; row[colname] = val; } dt.Rows.Add(row); dt.AcceptChanges(); } } catch (Exception ex) { messtr = ex.Message; //throw; } return dt; } /// /// JSON转动态对象列表 /// /// 命名空间名称 /// 模型名称 /// 能转为JArray的JSON /// 错误说明 /// public List? DataConvertClass(string spacename, string clssname, string data, ref string reason) where T : class, new() { reason = ""; List list = new List(); var typelist = Assembly.GetExecutingAssembly().GetTypes() .Where(s => s.Namespace == spacename) .Where(p => p.Name == clssname); if (typelist.Any()) { Type? type = typelist.FirstOrDefault(); try { PropertyInfo[] propertyInfos = type.GetProperties(); JArray jArray = (JArray)JsonConvert.DeserializeObject(data)!; foreach (var item in jArray) { T obj = (T)Activator.CreateInstance(type); string chileval = JsonConvert.SerializeObject(item); JObject keyValues = JObject.Parse(chileval); foreach (var key in keyValues) { string name = key.Key; var colobj = propertyInfos.Where(s => s.Name == name); if (colobj.Any()) { PropertyInfo propertyInfo = colobj.FirstOrDefault(); Type itemtype = propertyInfo.PropertyType; JValue jValue = (JValue)key.Value; propertyInfo.SetValue(obj, Convert.ChangeType(jValue.Value, itemtype)); } } list.Add(obj); } } catch (Exception ex) { string typename = spacename + "." + clssname; reason = string.Format("DataConvertClass在{0}中发生错误:{1}\n传入的数据:{2}", typename, ex.Message, data); //throw; LogHelper.WriteLog(reason); } } return list; } /// public bool KDCloudExecuteBatchSaveStatus(string result, string needfileds, ref int errcord, ref List> message) { bool isok = false; try { CloudResult kdresult = JsonConvert.DeserializeObject(result); if (kdresult == null) { LogHelper.WriteLog("返回格式无法解析,可能导致重复推送:\n" + result); return true; } isok = kdresult.Result.ResponseStatus.IsSuccess; errcord = kdresult.Result.ResponseStatus.MsgCode; if (!isok) { if (errcord == 1) { isok = true; } string errstr = JsonConvert.SerializeObject(kdresult.Result.ResponseStatus.Errors); message.Add(new Dictionary { { "Message", errstr } }); } else if (!string.IsNullOrEmpty(needfileds)) { string[] fileds = needfileds.Split(","); if (fileds.Length > 0) { message = new List>(); string data = JsonConvert.SerializeObject(kdresult.Result.NeedReturnData); try { JArray darray = JArray.Parse(data); foreach (var dr in darray) { JObject jobject = JObject.Parse(dr.ToString()); List filedname = new List(); foreach (string r1_fileds in fileds) { if (r1_fileds.Contains(".")) { string[] r2_fileds = r1_fileds.Split("."); if (r2_fileds.Length == 2) { if (!filedname.Contains(r2_fileds[0])) { JArray jArray = (JArray)jobject.GetValue(r2_fileds[0]); foreach (var item in jArray) { JObject jitem = (JObject)item; message.Add(new Dictionary() { { r2_fileds[1], jitem.GetValue(r2_fileds[1]).ToString() } }); } } } } else { message.Add(new Dictionary() { { r1_fileds, jobject.GetValue(r1_fileds).ToString() } }); } } } } catch (Exception ex) { isok = true; LogHelper.WriteLog(string.Format("解析返回字段时格式不正确({0}),导致发生错误:{1}", data, ex.Message)); } } } } catch (Exception ex) { isok = false; message.Add(new Dictionary { { "Message", ex.Message } }); LogHelper.WriteLog(ex.Message); } return isok; } /// public bool CheckRequired(List ts, ref string reason) { bool isok = true; StringBuilder stringBuilder = new StringBuilder(); Type type = typeof(T); PropertyInfo[] properties = type.GetProperties(); foreach (T item in ts) { foreach (PropertyInfo property in properties) { string name = property.Name; } } return isok; } public int GetSalePriceID(string reason) { int id = 0; string number = LocalStaticRequest.GetSystemProfile(5, "SalesPricePlanNumber"); if (string.IsNullOrEmpty(number)) { return id; } SqlParameter[] parameters = new SqlParameter[] { new SqlParameter("no",number) }; string sql = "SELECT FInterID FROM ICPrcPly WHERE FNumber=@no"; object plyid = _kDSqlHelper.ExecuteScalar(CommandType.Text, sql, parameters, ref reason, true); if (plyid != null) { int.TryParse(plyid.ToString(), out id); } return id; } /// public void ASCCarry(ref string s, int len, string coverstr) { if (string.IsNullOrEmpty(s)) { s = "1".PadLeft(len, char.Parse(coverstr)); } string laststr = s.Substring(s.Length - 1); int asc = Strings.Asc(laststr); NewASC(ref s, len, 1, asc); } private void NewASC(ref string s, int len, int r_star, int asc, int step = 1) { try { if (asc > 47 && asc < 58) { if (asc == 57) { s = GetReplaceStr(s, r_star, Strings.Chr(48).ToString()); r_star += 1; RecursionNewASC(ref s, len, r_star, asc, step); if (string.IsNullOrEmpty(s)) { return; } } else { asc += step; s = GetReplaceStr(s, r_star, Strings.Chr(asc).ToString()); } } else if (asc > 64 && asc < 91) { if (asc == 90) { s = GetReplaceStr(s, r_star, Strings.Chr(65).ToString()); r_star += 1; RecursionNewASC(ref s, len, r_star, asc, step); if (string.IsNullOrEmpty(s)) { return; } } else { asc += step; s = GetReplaceStr(s, r_star, Strings.Chr(asc).ToString()); } } else if (asc > 96 && asc < 123) { if (asc == 122) { s = GetReplaceStr(s, r_star, Strings.Chr(97).ToString()); r_star += 1; RecursionNewASC(ref s, len, r_star, asc, step); if (!string.IsNullOrEmpty(s)) { return; } } else { asc += step; s = GetReplaceStr(s, r_star, Strings.Chr(asc).ToString()); } } } catch (Exception) { s = ""; throw; } } private void RecursionNewASC(ref string s, int len, int r_star, int asc, int step = 1) { if (r_star > len) { s = ""; return; } else { string nextstr = s.Substring(len - r_star, 1); asc = Strings.Asc(nextstr); NewASC(ref s, len, r_star, asc, step); } } /// /// 替换指定位置的字符串 /// /// 地替换的字符串 /// 从右开始的位置 /// 新的字符串 /// private string GetReplaceStr(string str, int position, string pstr) { int len = str.Length; int leftlen = len - position; string leftstr = str.Substring(0, leftlen); string rightstr = str.Substring(leftlen + 1, position - 1); string newstr = leftstr + pstr + rightstr; return newstr; } /// [Obsolete] public void SaveReciveData(object dataBacks) { try { List data = (List)dataBacks; if (data.Count > 0) { string erstr = string.Empty; RBSql(data, ref erstr); } } catch (Exception ex) { string bak = JsonConvert.SerializeObject(dataBacks); LogHelper.WriteLog(string.Format("备份ReciveDataBack时发生错误:{0}\n" + ex.Message, bak)); } } [Obsolete] public void _SqllogInvoke(RBLog log) { try { if (log != null) { string erstr = string.Empty; List data = new List() { log }; RBSql(data, ref erstr); } } catch (Exception ex) { string bak = JsonConvert.SerializeObject(log); LogHelper.WriteLog(string.Format("备份ReciveDataBack时发生错误:{0}\n" + ex.Message, bak)); } } private void RBSql(List obj, ref string errstr) where T : class, new() { Type type = typeof(T); string tbname = _context.Model.FindEntityType(type).GetTableName(); if (obj == null || obj.Count == 0) { errstr = "无法分析空的对象"; return; } PropertyInfo[] fileInfo = type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); try { for (int i = 0; i < obj.Count; i++) { T item = obj[i]; List colnames = new List(); List values = new List(); List param = new List(); foreach (PropertyInfo property in fileInfo) { if (property.CustomAttributes.Any()) { bool iskey = false; bool isneed = false; string displayname = string.Empty; foreach (var info in property.CustomAttributes) { if (info.AttributeType.Name == "KeyAttribute") { iskey = true; break; } if (info.AttributeType.Name == "DisplayNameAttribute") displayname = info.ConstructorArguments.FirstOrDefault().Value.ToString(); if (info.AttributeType.Name == "RequiredAttribute") isneed = true; } if (!iskey) { string colname = property.Name; object value = property.GetValue(item); if (isneed && string.IsNullOrWhiteSpace(value.ToString())) { errstr += string.Format("字段【{0}】为必填!", string.IsNullOrEmpty(displayname) ? colname : displayname); } else if (!string.IsNullOrWhiteSpace(value.ToString())) { colnames.Add(colname); string parname = "@" + colname + string.Format("_{0}", i); param.Add(new SqlParameter(parname, value)); values.Add(parname); } } } } string _sql = string.Format("insert into {0}({1}) values({2})", tbname, string.Join(",", colnames.ToArray()), string.Join(",", values.ToArray())); _kDSqlHelper.ExecuteNonQueryAsync(_sql, CommandType.Text, param.ToArray(), false); } } catch (Exception ex) { errstr = ex.Message; throw new Exception(errstr); } } } }