using Kingdee.CDP.WebApi.SDK; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using RB_MES_API.Context; using RB_MES_API.Models; using RB_MES_API.Models.Cloud; using System.Data; using System.Text; namespace RB_MES_API.Controllers.Cloud { /// /// 实现金蝶云星空的子查询 /// public class ChiledSelect : IChiledSelect { private readonly IShareController _shareController; private readonly IKDCloudHttpClient _KdhttpClient; private readonly IKDSqlHelper _kdsqlhelper; public ChiledSelect(IShareController shareController, IKDCloudHttpClient kdhttpClient, IKDSqlHelper kdsqlhelper) { _shareController = shareController; _KdhttpClient = kdhttpClient; //_config = config; _kdsqlhelper = kdsqlhelper; } public class ChildQuery { public string FieldKeys { get; set; } public string FormId { get; set; } public string FiledString { get; set; } public string FOptcode { get; set; } public int TopRowCount { get; set; } public int StartRow { get; set; } public int Limit { get; set; } public string SubSystemID { get; set; } public string OrderString { get; set; } public string Url { get; set; } public int FFunctionID { get; set; } } public async Task> suppliersAsync(int fid) { List bD_Suppliers = new List(); List queryJsons = await _shareController.GetAPIList(); var billquery = queryJsons.Where(s => s.FKDBillName.Equals("TB_BS_SUP")); if (billquery.Any()) { BillQuery queryJson = (BillQuery)(from a in billquery select new BillQuery { FieldKeys = a.FFieldKeys.Replace("@defaultorgid", LocalStaticRequest.DefaultOrgID.ToString()).Replace("@defaultorgno", LocalStaticRequest.DefaultOrg), FormId = a.GetFormID.FDBName, FilterString = a.FFiledString.Replace("@defaultorgid", LocalStaticRequest.DefaultOrgID.ToString()).Replace("@defaultorgno", LocalStaticRequest.DefaultOrg),//子查询中这个是固定的 Limit = a.FLimit, OrderString = a.FOrderString, StartRow = a.FStartRow, SubSystemId = a.FSubSystemID, TopRowCount = a.FTopRowCount }); //从云星空查询 string result = _KdhttpClient.SDKBillQuery(queryJson); if (_KdhttpClient.SDKBillQueryStatus(result)) { try { JArray jArray = (JArray)JsonConvert.DeserializeObject(result.ToString()!)!; if (jArray.Count > 0) { bD_Suppliers = (List)JsonConvert.DeserializeObject(result)!; } } catch (Exception) { _shareController._SqlloggerInvoke(fid, "子查询获得供应商", result, JsonConvert.SerializeObject(queryJson)); } } } return bD_Suppliers; } /// public List? GetSourceBillEntry(DataTable datatable, int fromtypeid, ref string reason) where T : class, new() { reason = ""; List purchases = new List(); if (datatable == null || datatable.Rows.Count == 0) { return purchases; } List queryjsons = _shareController.GetAPIList().Result; List selectJoins = _shareController.GetAPIList().Result; var cbq = from a in queryjsons.Where(s => s.FFormIDTypeID == fromtypeid) join b in selectJoins on new { A = a.GetFormID.functions.FID, B = a.GetFormID.FDocType } equals new { A = b.FFunctionID, B = b.FDocType } select new ChildQuery { FieldKeys = a.FFieldKeys.Replace("@defaultorgid", LocalStaticRequest.DefaultOrgID.ToString()).Replace("@defaultorgno", LocalStaticRequest.DefaultOrg), FormId = a.GetFormID.FDBName, FiledString = a.FFiledString.Replace("@defaultorgid", LocalStaticRequest.DefaultOrgID.ToString()).Replace("@defaultorgno", LocalStaticRequest.DefaultOrg), FOptcode = b.FOptcode, TopRowCount = a.FTopRowCount, StartRow = a.FStartRow, Limit = a.FLimit, SubSystemID = a.FSubSystemID, OrderString = a.FOrderString, Url = a.GetFormID.functions.FUrl, FFunctionID = a.GetFormID.FFunctionID }; if (!cbq.Any()) { reason = "子查询配置不正确,检查r_CloudBillQuery和r_SelectJoinID"; return purchases; } string optcode = cbq.FirstOrDefault()!.FOptcode; if (optcode == null) { reason = "没有为子查询配置正确的FOptcode"; return purchases; } string filedstr = cbq.FirstOrDefault()!.FiledString; if (filedstr == null) { reason = "没有为子查询配置正确的FiledString"; return purchases; } if (!LocalStaticRequest.Islogin) { var kd = _KdhttpClient.LoginErp().Result; } if (!LocalStaticRequest.Islogin) { reason = "KdhttpClient登录失败"; return purchases; } int fid = cbq.FirstOrDefault()!.FFunctionID; string fieldkeys = cbq.FirstOrDefault()!.FieldKeys; string cloudfiledstr = GetChildFiledstr(datatable, optcode, filedstr); //从云星空查询 BillQuery queryJson = new BillQuery() { FieldKeys = cbq.FirstOrDefault()!.FieldKeys, FilterString = cloudfiledstr, FormId = cbq.FirstOrDefault()!.FormId, OrderString = cbq.FirstOrDefault()!.OrderString, TopRowCount = cbq.FirstOrDefault()!.TopRowCount, StartRow = cbq.FirstOrDefault()!.StartRow, Limit = cbq.FirstOrDefault()!.Limit, SubSystemId = cbq.FirstOrDefault()!.SubSystemID }; string result = _KdhttpClient.SDKBillQuery(queryJson); if (!_KdhttpClient.SDKBillQueryStatus(result)) { reason = "子查询为空..."; } else { purchases = _shareController.GetNewObjForChild(fieldkeys, result, ref reason); } return purchases; } /// /// /// /// /// /// /// public string GetChildFiledstr(DataTable datatable, string optcode, string filedstr) { List list = new List(); string[] strings = optcode.Split('|'); foreach (DataRow row in datatable.Rows) { string f = filedstr; foreach (string s in strings) { string[] strings1 = s.Split('='); string k = strings1[0]; if (datatable.Columns.Contains(k)) { string? val = row[k].ToString(); f = f.Replace(k, val); } } list.Add(f); } string cloudfiledstr = string.Format("(({0}))", string.Join(") or (", list.ToArray())); return cloudfiledstr; } /// public async Task GetCustomRequestTBAsync(int formtypeid) { string tbjson = string.Empty; List queryJsons = await _shareController.GetAPIList(); var query = queryJsons.Where(s => s.FFormIDTypeID == formtypeid).FirstOrDefault(); string sql = query.FFieldKeys.Replace("@defaultorgid", LocalStaticRequest.DefaultOrgID.ToString()); if (string.IsNullOrEmpty(sql)) { return tbjson; } string param = query.FFiledString.Replace("@defaultorgid", LocalStaticRequest.DefaultOrgID.ToString()).Replace("@defaultorgno", LocalStaticRequest.DefaultOrg); if (!string.IsNullOrEmpty(param)) { string[] strings = param.Split(','); foreach (string s in strings) { string[] cs = s.Split('='); string key = cs[0]; string value = cs[1].Replace("GETDATE", DateTime.Now.ToShortDateString()).Replace("@defaultorgid", LocalStaticRequest.DefaultOrgID.ToString()); sql = sql.Replace(key, value); } } string doctype = query.GetFormID.FDocType; string costomsql = ApiSettingsHelper.GetConfig("CustomRequestRemoteSql"); if (costomsql.ToUpper() == "Y") { string result = await GetCustomReaderAsync(sql, "ExecuteDataSet"); try { if (string.IsNullOrWhiteSpace(result)) { return tbjson; } //先将返回数据格式化 JObject jobj = (JObject)JsonConvert.DeserializeObject(result); tbjson = JsonConvert.SerializeObject(jobj["Table"]); } catch (Exception ex) { LogHelper.WriteLog(string.Format(doctype + "在自定义SQL查询结果集过程中GetCustomRequestTBAsync发生错误:\r\n{0}", ex.Message)); } } else { string mess = string.Empty; DataSet dataSet = _kdsqlhelper.GetDataSet(CommandType.Text, sql, null, ref mess, true); if (mess != null || dataSet == null) { LogHelper.WriteLog(string.Format(doctype + "在自定义SQL查询结果集过程中GetCustomRequestTBAsync发生错误:\r\n{0}", mess)); } else if (dataSet.Tables.Count != 0) { DataTable dataTable = dataSet.Tables[0]; tbjson = JsonConvert.SerializeObject(dataTable); } } return tbjson; } /// public async Task GetCustomRequestBillAsync(string sql, string filestr, string ordstr, Dictionary? inputdic) { string tbjson = string.Empty; filestr = filestr.Replace("GETDATE", DateTime.Now.ToShortDateString()); if (!string.IsNullOrWhiteSpace(filestr) && filestr != "") { sql += string.Format(" AND {0}", filestr); } //前面一定要有WHERE if (!string.IsNullOrWhiteSpace(ordstr) && ordstr != "") { sql += string.Format("\r\n ORDER BY {0}", ordstr); } if (inputdic != null) { foreach (KeyValuePair keyValue in inputdic) { string key = string.Format("@{0}", keyValue.Key.Replace("@", "")); string value = keyValue.Value.ToString(); sql = sql.Replace(key, value); } } string costomsql = ApiSettingsHelper.GetConfig("CustomRequestRemoteSql"); if (costomsql.ToUpper() == "Y") { string result = await GetCustomReaderAsync(sql, "ExecuteDataSet"); try { if (!string.IsNullOrWhiteSpace(result) && result != "[]") { //先将返回数据格式化 JObject jobj = (JObject)JsonConvert.DeserializeObject(result); if (jobj.Count > 0) { tbjson = JsonConvert.SerializeObject(jobj["Table"]); } } } catch (Exception ex) { LogHelper.WriteLog(string.Format("GetCustomRequestBillAsync发生错误:\r\n{0}\r\n{1}", ex.Message, result)); } } else { string mess = string.Empty; //实施本地化查询 DataSet dataSet = _kdsqlhelper.GetDataSet(CommandType.Text, sql, null, ref mess, true); if (mess != null || dataSet == null) { LogHelper.WriteLog(string.Format("GetCustomRequestBillAsync实施本地化查询发生错误:\r\n{0}", mess)); } else if (dataSet.Tables.Count != 0) { DataTable dataTable = dataSet.Tables[0]; tbjson = JsonConvert.SerializeObject(dataTable); } } return tbjson; } public async Task> materialsAsync(List numbers) { List? tbjson = new List(); StringBuilder sql = new StringBuilder(); sql.AppendLine("/*dialect*/SELECT M1.FMaterialID,M1.FNumber,M2.FName,M3.FStoreUnitID,M4.FBaseUnitId,CASE M1.FForbidStatus WHEN 'A' THEN 'N' ELSE 'Y' END FForbidStatus"); sql.AppendLine(" ,U1.FNUMBER FUnitNumber,U2.FNUMBER FBaseUnitNumber,F_PKGR_ITEMVERSION"); sql.AppendLine("FROM T_BD_MATERIAL M1 INNER JOIN T_BD_MATERIAL_L M2 ON M2.FMATERIALID=M1.FMATERIALID"); sql.AppendLine(" INNER JOIN T_BD_MATERIALSTOCK M3 ON M3.FMATERIALID=M1.FMATERIALID"); sql.AppendLine(" INNER JOIN T_BD_MATERIALBASE M4 ON M4.FMATERIALID=M1.FMATERIALID"); sql.AppendLine(" INNER JOIN T_BD_UNIT U1 ON U1.FUNITID=M3.FSTOREUNITID"); sql.AppendLine(" INNER JOIN T_BD_UNIT U2 ON U2.FUNITID=M4.FBASEUNITID"); sql.AppendLine("WHERE M1.FDOCUMENTSTATUS='C' AND M1.FUSEORGID=1"); if (numbers != null) { string wherestr = string.Format("M1.FNumber in ('{0}')", string.Join("','", numbers.ToArray())); sql.AppendLine(" AND " + wherestr); } string reason = string.Empty; string costomsql = ApiSettingsHelper.GetConfig("CustomRequestRemoteSql"); if (costomsql.ToUpper() == "Y") { string result = await GetCustomReaderAsync(sql.ToString(), "ExecuteDataSet"); try { if (result == null) { return tbjson; } //先将返回数据格式化 JObject jobj = (JObject)JsonConvert.DeserializeObject(result); string tbstr = JsonConvert.SerializeObject(jobj["Table"]); tbjson = _shareController.DataConvertClass(tbstr, ref reason); } catch { LogHelper.WriteLog(string.Format("Cloud自定义SQL查询结果集过程中GetCustomRequestTableAsync发生错误:\r\n{0}", result)); } } else { string mess = string.Empty; string s = sql.ToString(); //实施本地化查询 DataSet dataSet = _kdsqlhelper.GetDataSet(CommandType.Text, sql.ToString(), null, ref mess, true); if (mess != null || dataSet == null) { LogHelper.WriteLog(string.Format("GetCustomRequestBillAsync实施本地化查询发生错误:\r\n{0}", mess)); } else if (dataSet.Tables.Count != 0) { DataTable dataTable = dataSet.Tables[0]; tbjson = _shareController.GetClassList(dataTable); } } return tbjson; } public async Task GetCustomRequestTableAsync(string sql, string filestr, string ordstr, List> inputdic) { string tbjson = string.Empty; List wheres = new List(); filestr = filestr.Replace("GETDATE", DateTime.Now.ToShortDateString()); if (inputdic != null) { foreach (Dictionary dic in inputdic) { string wherestr = filestr; foreach (KeyValuePair keyValue in dic) { string key = keyValue.Key; string value = keyValue.Value.ToString(); wherestr = wherestr.Replace(key, value); } wheres.Add(wherestr); } } if (wheres.Count != 0) { sql += string.Format(" AND (({0}))", string.Join(") or (", wheres.ToArray())); } //前面一定要有WHERE if (!string.IsNullOrWhiteSpace(ordstr) && ordstr != "") { sql += string.Format("\r\n ORDER BY {0}", ordstr); } string costomsql = ApiSettingsHelper.GetConfig("CustomRequestRemoteSql"); if (costomsql.ToUpper() == "Y") { string result = await GetCustomReaderAsync(sql, "ExecuteDataSet"); try { if (result == null) { return tbjson; } //先将返回数据格式化 JObject jobj = (JObject)JsonConvert.DeserializeObject(result); tbjson = JsonConvert.SerializeObject(jobj["Table"]); } catch { LogHelper.WriteLog(string.Format("Cloud自定义SQL查询结果集过程中GetCustomRequestTableAsync发生错误:\r\n{0}", result)); } } else { string mess = string.Empty; //实施本地化查询 DataSet dataSet = _kdsqlhelper.GetDataSet(CommandType.Text, sql, null, ref mess, true); if (mess != null || dataSet == null) { LogHelper.WriteLog(string.Format("GetCustomRequestBillAsync实施本地化查询发生错误:\r\n{0}", mess)); } else if (dataSet.Tables.Count != 0) { DataTable dataTable = dataSet.Tables[0]; tbjson = JsonConvert.SerializeObject(dataTable); } } return tbjson; } /// public async Task GetCustomReaderAsync(string sql, string servicesstubname) { string tbjson = string.Empty; string apiid = LocalStaticRequest.GetSystemProfile(1, "APIGrouID"); var csv = await _shareController.GetAPIList(); var sv = csv.Where(s => s.FApiGroupID == int.Parse(apiid) && s.FActionName == servicesstubname); if (!sv.Any()) { return tbjson; } CustomService customservice = sv.FirstOrDefault(); if (customservice == null) { return tbjson; } await _KdhttpClient.LoginErp(); if (!LocalStaticRequest.Islogin) { return tbjson; } string apiurl = ApiSettingsHelper.GetConfig("X-KDApi-ServerUrl"); apiurl += apiurl.Substring(apiurl.Length - 1, 1) == "/" ? "" : "/"; //如果最后一个字符不是"/"就添加上去 apiurl += customservice.FNamespace + "." + customservice.FClassName + "." + customservice.FActionName + "," + customservice.FAppComponents; List Parameters = new List { sql }; string content = JsonConvert.SerializeObject(Parameters); tbjson = _KdhttpClient.AsyncClientRequest(apiurl, content).Result; return tbjson; } } }