Files
RBMESAPICore/Controllers/Interface/ShareController.cs
yuyubohh e8494ba988 qqq
2025-09-09 22:41:29 +08:00

1568 lines
66 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
/// <summary>
/// 公共方法
/// </summary>
public class ShareController : IShareController
{
private readonly RBContext _context;
private readonly IKDSqlHelper _kDSqlHelper;
/// <summary>
/// 构造
/// </summary>
/// <param name="context"></param>
/// <param name="kDSqlHelper"></param>
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<DbContext>();
optionsBuilder.UseSqlServer(_context.Database.GetConnectionString()!);
optionsBuilder.UseModel(_context.Model);
using (var context = new DbContext(optionsBuilder.Options))
{
context.Database.EnsureCreated();
context.Database.Migrate();
context.Set<MesRequestStatu>().AddRange(mes);
context.SaveChanges(true);
context.Dispose();
}
}
catch (Exception ex)
{
LogHelper.WriteLog(string.Format("备份ReciveDataBack时发生错误{0}\n" + "保存的数据为\n{1}" + ex.Message, data.ToString()));
}
}
}
/// <inheritdoc/>
public string? GetDropDownText<T>(int saveval)
{
Type type = typeof(T);
string myenum = Enum.GetName(type, saveval);
return myenum;
}
/// <summary>
/// 字符串转decimal错误时返回0
/// </summary>
/// <param name="sqty">待转换的代表数量</param>
/// <returns></returns>
public decimal DecimalPar(string sqty)
{
decimal result = 0;
decimal.TryParse(sqty, out result);
return result;
}
/// <summary>
/// 将JSON转为实体类
/// </summary>
/// <typeparam name="T">泛型</typeparam>
/// <param name="data">Json数据包</param>
/// <param name="reason">错误消息</param>
/// <returns></returns>
public List<T>? DataConvertClass<T>(string data, ref string reason) where T : class
{
reason = "";
List<T> list = new List<T>();
if (string.IsNullOrEmpty(data)) { return list; }
try
{
list = JsonConvert.DeserializeObject<List<T>>(data)!;
}
catch (Exception ex)
{
reason = string.Format("错误在DataConvertClass中发生{0}", ex.Message);
LogHelper.WriteLog(reason);
}
return list;
}
public T DataToClass<T>(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;
}
/// <summary>
/// 取查询接口名称
/// </summary>
/// <param name="id">接口ID</param>
/// <returns></returns>
public string? InterfaceName(int id)
{
string? intname = null;
try
{
var sjid = GetAPIList<SelectJoinID>().Result;
SelectJoinID? sobj = sjid.Any() ? sjid.Find(s => s.FID == id) : null;
intname = sobj == null ? null : sobj.FDocType;
}
catch (Exception)
{
throw;
}
return intname;
}
/// <summary>
/// 取推送接口的K3单据名称
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public string? K3BillName(int id)
{
string? billname = string.Empty;
try
{
List<ReceiveStockBillType> receives = GetAPIList<ReceiveStockBillType>().Result;
ReceiveStockBillType? stockBillType = receives.Where(s => s.ErpBillTypeID == id.ToString()).FirstOrDefault();
billname = stockBillType == null ? null : stockBillType.ErpBillName;
}
catch (Exception)
{
throw;
}
return billname;
}
/// <summary>
/// 转XML
/// </summary>
/// <param name="tb"></param>
/// <param name="tbName"></param>
/// <returns></returns>
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;
}
/// <summary>
/// RB数据库日志
/// </summary>
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<RBLog> data = new List<RBLog>() { 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));
}
}
/// <summary>
/// 查询接口使用的SQL脚本
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public string GetSelectSql(int id)
{
string? errstr = null;
List<string> stringBuilder = new List<string>();
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<int>("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());
}
/// <summary>
/// 通过输入表单返回实体类
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dataTable"></param>
/// <returns></returns>
public List<T> GetClassList<T>(DataTable dataTable) where T : class, new()
{
List<T> ts = new List<T>();
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;
}
/// <summary>
/// 64位解密
/// </summary>
/// <param name="B64"></param>
/// <returns></returns>
public string UnBase64Decode(string B64)
{
string NewStr = Encoding.GetEncoding("utf-8").GetString(Convert.FromBase64String(B64));
return NewStr;
}
/// <summary>
/// 64位加密
/// </summary>
/// <param name="B64"></param>
/// <returns></returns>
public string Base64Decode(string B64)
{
byte[] NewStr = Encoding.Default.GetBytes(B64);
return Convert.ToBase64String(NewStr);
}
/// <summary>
/// 在目标ints中通过组合检验是否包含参数v
/// </summary>
/// <param name="ints">要校验的参数值范围</param>
/// <param name="v">要判断的枚举值</param>
/// <param name="setv">当前设置的值</param>
/// <returns></returns>
public bool SCombination(List<int> 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<string> stringBuilder = new List<string>();
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<int> GetSetInts<T>(int exceptobj) where T : struct, Enum
{
var fileds = typeof(T).GetFields(BindingFlags.Public | BindingFlags.Static);
List<int> ints = new List<int>();
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<int> ints, string result, int start, int length, ref List<string> 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);
}
}
/// <summary>
/// 将DataTable对象转为JSON带字段名
/// </summary>
/// <param name="table"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public string ObjectToJSON(DataTable table)
{
JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
List<Dictionary<string, object>> parentRow = new List<Dictionary<string, object>>();
foreach (DataRow row in table.Rows)
{
Dictionary<string, object> childRow = new Dictionary<string, object>();
foreach (DataColumn col in table.Columns)
{
childRow.Add(col.ColumnName, row[col]);
}
parentRow.Add(childRow);
}
return jsSerializer.Serialize(parentRow);
}
/// <summary>
/// 判断是否批量保存成功
/// </summary>
/// <param name="result">需要分析的json</param>
/// <param name="needfileds">必须返回的字段</param>
/// <param name="message">如果不成功,代表错误消息;否则代表返回的单据编号</param>
/// <returns></returns>
public bool CloudExecuteBatchSaveStatus(string result, string needfileds, ref List<Dictionary<string, string>> message)
{
message = new List<Dictionary<string, string>>();
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<string, string> { { "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<string, string> HkeyValues = new Dictionary<string, string>();
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<string, string> HkeyValues = new Dictionary<string, string>();
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<string, string> { { "Message", ex.Message } });
LogHelper.WriteLog(string.Format("Cloud判断是否批量保存成功的CloudExecuteBatchSaveStatus方法发生错误{0}", ex.Message));
return false;
}
}
return true;
}
/// <summary>
/// 判断是否保存成功
/// </summary>
/// <param name="result">需要分析的json</param>
/// <param name="message">如果不成功,代表错误消息;否则代表返回的单据编号</param>
/// <returns></returns>
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<Boolean>();
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;
}
/// <inheritdoc/>
public List<T> GetNewObj<T>(int fid, string dectablename, string inputjson, ref string reason) where T : class, new()
{
reason = string.Empty;
List<T> list = new List<T>();
List<SelectClumnConvert> selectClumnConvert = GetAPIList<SelectClumnConvert>().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<T> GetNewObjForChild<T>(string fieldkeys, string inputjson, ref string reason) where T : class, new()
{
reason = "";
List<T> list = new List<T>();
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;
}
/// <inheritdoc/>
public DataTable GetInputDataTable(int fid, string DocType, string data, ref string messtr)
{
DataTable dt = new DataTable();
if (data == null) { return dt; }
List<SelectClumnConvert> selectClumns = GetAPIList<SelectClumnConvert>().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;
}
/// <inheritdoc/>
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;
}
/// <inheritdoc/>
public List<Dictionary<string, string>> GetClassList(DataTable table)
{
List<Dictionary<string, string>> list = new List<Dictionary<string, string>>();
if (table != null && table.Rows.Count > 0)
{
foreach (DataRow row in table.Rows)
{
Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();
foreach (DataColumn clumn in table.Columns)
{
string colname = clumn.ColumnName.ToUpper();
keyValuePairs.Add(colname, row[colname].ToString());
}
list.Add(keyValuePairs);
}
}
return list;
}
/// <inheritdoc/>
public List<Dictionary<string, object>> GetClassList(JArray arrjson)
{
List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
foreach (JObject item in arrjson)
{
Dictionary<string, object> keyValuePairs = new Dictionary<string, object>();
foreach (var obj in item)
{
keyValuePairs.Add(obj.Key, obj.Value.ToString());
}
list.Add((keyValuePairs));
}
return list;
}
/// <summary>
/// 为确保计量单位不会丢失,如果定时任务更新不成功,导致无缓存,则直接从本地查询缓存起来
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
private async Task<List<BD_UNIT>> GetunitLists(string name)
{
List<BD_UNIT> unitList = new List<BD_UNIT>();
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<BD_UNIT>(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<BD_UNIT>(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<List<T>> GetAPIList<T>() where T : class, new()
{
Type type = typeof(T);
string name = type.Name;
List<T>? list = CacheHelper.GetCache<List<T>>(name);
if (list == null || list.Count == 0)
{
switch (name.ToLower())
{
case "bd_unit":
list = await GetunitLists(name) as List<T>;
//list = LocalStaticRequest.unites as List<T>;
break;
case "functionlist":
list = await GetfunctionLists(name) as List<T>;
break;
case "cloudbillquery":
list = await Getcloudbillquery(name) as List<T>;
break;
case "selectjoinid":
list = await Getselectjoinid(name) as List<T>;
break;
case "datasavebatch":
list = await Getdatasvaebatch(name) as List<T>;
break;
case "formidtype":
list = await Getformidtype(name) as List<T>;
break;
case "selectclumnconvert":
list = await Getselectclumnconvert(name) as List<T>;
break;
case "receivestockbilltype":
list = await Getreceivestockbilltypet(name) as List<T>;
break;
case "billtyperules":
list = await Getbilltypesource(name) as List<T>;
break;
case "apihostservice":
list = await GetTimedHostedService(name) as List<T>;
break;
case "customservice":
list = await GetCustomService(name) as List<T>;
break;
default:
break;
}
}
list = list ?? new List<T>();
return list;
}
private async Task<List<CustomService>> GetCustomService(string name)
{
var list = await _context.r_CustomServices!.AsNoTracking().ToListAsync();
CacheHelper.Set_AbsluteExpire(name, list);
return list;
}
private async Task<List<ApiHostService>> 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<List<FunctionList>> 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<List<CloudBillQuery>> 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<List<SelectJoinID>> 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<List<DataSaveBatch>> 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<List<FormIDType>> 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<List<SelectClumnConvert>> Getselectclumnconvert(string name)
{
var list = await _context.r_ClumnConvert!.AsNoTracking().ToListAsync();
CacheHelper.Set_AbsluteExpire(name, list);
return list;
}
private async Task<List<ReceiveStockBillType>> 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<List<BillTypeRules>> Getbilltypesource(string name)
{
var list = await _context.r_BillTypeRules!.AsNoTracking().ToListAsync();
CacheHelper.Set_AbsluteExpire(name, list);
return list;
}
/// <summary>
/// 将计量单位添加到缓存
/// </summary>
public void AddUnitCache()
{
//清除缓存
CacheHelper.Remove("BD_UNIT");
List<BD_UNIT> units = CacheHelper.GetCache<List<BD_UNIT>>("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<BD_UNIT>(table);
CacheHelper.Set_AbsluteExpire("BD_UNIT", units);
}
}
}
}
public string GetDesFormID(string postdoctype, string sourtype)
{
string formid = string.Empty;
List<BillTypeRules> list = GetAPIList<BillTypeRules>().Result;
var item = list.Where(s => s.FPostTypeID == postdoctype && s.FSBillTypeNumber == sourtype);
if (item.Count() > 0)
{
formid = item.FirstOrDefault().FDBillTypeNumber;
}
return formid;
}
/// <inheritdoc/>
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<Dictionary<string, object>> Dics = GetClassList(jArray);
foreach (Dictionary<string, object> 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<string, object> 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;
}
/// <summary>
/// JSON转动态对象列表
/// </summary>
/// <param name="spacename">命名空间名称</param>
/// <param name="clssname">模型名称</param>
/// <param name="data">能转为JArray的JSON</param>
/// <param name="reason">错误说明</param>
/// <returns></returns>
public List<T>? DataConvertClass<T>(string spacename, string clssname, string data, ref string reason) where T : class, new()
{
reason = "";
List<T> list = new List<T>();
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;
}
/// <inheritdoc/>
public bool KDCloudExecuteBatchSaveStatus(string result, string needfileds, ref int errcord, ref List<Dictionary<string, string>> message)
{
bool isok = false;
try
{
CloudResult kdresult = JsonConvert.DeserializeObject<CloudResult>(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<string, string> { { "Message", errstr } });
}
else if (!string.IsNullOrEmpty(needfileds))
{
string[] fileds = needfileds.Split(",");
if (fileds.Length > 0)
{
message = new List<Dictionary<string, string>>();
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<string> filedname = new List<string>();
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<string, string>() { { r2_fileds[1], jitem.GetValue(r2_fileds[1]).ToString() } });
}
}
}
}
else
{
message.Add(new Dictionary<string, string>() { { 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<string, string> { { "Message", ex.Message } });
LogHelper.WriteLog(ex.Message);
}
return isok;
}
/// <inheritdoc/>
public bool CheckRequired<T>(List<T> 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;
}
/// <inheritdoc/>
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);
}
}
/// <summary>
/// 替换指定位置的字符串
/// </summary>
/// <param name="str">地替换的字符串</param>
/// <param name="position">从右开始的位置</param>
/// <param name="pstr">新的字符串</param>
/// <returns></returns>
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;
}
/// <inheritdoc/>
[Obsolete]
public void SaveReciveData(object dataBacks)
{
try
{
List<ReciveDataBack> data = (List<ReciveDataBack>)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<RBLog> data = new List<RBLog>() { 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<T>(List<T> 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<string> colnames = new List<string>();
List<string> values = new List<string>();
List<SqlParameter> param = new List<SqlParameter>();
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);
}
}
}
}