using Model; using NPOI.POIFS.Properties; using NPOI.SS.Formula.Functions; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace BLL.APIService { public class SyncSESService { private const string GETAPIUrl = "https://reportserver.basf-ypc.net.cn:3033/api/query"; public static void GetSyncContractor() { //string file = System.Web.HttpContext.Current.Server.MapPath("~/ContractorData.txt"); //string result = System.IO.File.ReadAllText(file); string username = "EpermitContractor_EFC"; string password = "nM3#yU5$pO8%aZ6"; //string postData = $"Username={username}&Password={password}"; string result = BLL.Common.HttpHelper.HttpGetRequest(GETAPIUrl, username, password); //BLL.ErrLogInfo.WriteLog($"请求API Result={result}"); var data = JsonHelper.DeserializeJsonToObject>(result); ConcurrentBag fcSesList = new ConcurrentBag(); string errorInfos = string.Empty; string message=string.Empty; string fo=string.Empty; foreach (var item in data) { string errorInfo = string.Empty; string sesNo = string.Empty; FC_SESReport fcSesModel = new FC_SESReport(); if (!string.IsNullOrEmpty(item.sesNo)) { fcSesModel.SES_No = item.sesNo; sesNo = item.sesNo; } else { errorInfo += " [SES No.] cannot be empty!"; } fcSesModel.Short_Descrption = item.shortDescrption; if (item.startDate != null) { try { message = TimeValidation(item.startDate); if (string.IsNullOrEmpty(message)) { fcSesModel.Start_Date = TimeValue(item.startDate); } else { errorInfo += "[Start Date]" + message; } } catch (Exception) { errorInfo += " [Start Date]" + message; } } if (item.endDate != null) { try { message = TimeValidation(item.endDate); if (string.IsNullOrEmpty(message)) { fcSesModel.End_Date = TimeValue(item.endDate); } else { errorInfo += "[End Date]" + message; } } catch (Exception) { errorInfo += " [End Date]" + message; } } fcSesModel.Created_by = item.createdBy; if (item.createdOn != null) { try { message = TimeValidation(item.createdOn); if (string.IsNullOrEmpty(message)) { fcSesModel.Created_on = TimeValue(item.createdOn); } else { errorInfo += "[Created on]" + message; } } catch (Exception) { errorInfo += " [Created on]" + message; } } if (item.tecoDate != null) { try { message = TimeValidation(item.tecoDate); if (string.IsNullOrEmpty(message)) { fcSesModel.TECO_Date = TimeValue(item.tecoDate); fcSesModel.TECO_Format = TimeValue(item.tecoDate); } else { errorInfo += "[TECO Date]" + message; } } catch (Exception) { errorInfo += " [TECO Date]" + message; } } if (!string.IsNullOrEmpty(item.requisitioner)) { string requisitioner = item.requisitioner; string[] reman = requisitioner.Split('/'); if (reman.Count() == 2) { fcSesModel.Requisitioner = reman[0]; } else { fcSesModel.Requisitioner = requisitioner; } } else { fcSesModel.Requisitioner = ""; } if (!string.IsNullOrEmpty(item.fo)) { fcSesModel.FO = item.fo; fo = fcSesModel.FO; } else { errorInfo += "[FO] cannot be empty!"; } if (!string.IsNullOrEmpty(item.item)) { try { if (IsWholeNumber(item.item)) { fcSesModel.Item = int.Parse(item.item); } else { errorInfo += " [Item]Must be in numeric format!"; } } catch (Exception) { errorInfo += "[Item]Must be in numeric format!"; } } fcSesModel.Vendor_Name = item.vendorName; if (item.ssrBudget!=null) { try { if (IsNumber(item.ssrBudget)) { fcSesModel.SSR_budget = DecibelConversion(item.ssrBudget.Value.ToString().Trim()); } else { errorInfo += "[SSR budget]Must be in numeric format!"; } } catch (Exception) { errorInfo += "[SSR budget]Must be in numeric format!"; } } else { fcSesModel.SSR_budget = 0; } fcSesModel.Currency = item.currency; if (item.contractorQuotation!=null) { try { if (IsNumber(item.contractorQuotation)) { fcSesModel.Contractor_quotation = DecibelConversion(item.contractorQuotation.Value.ToString().Trim()); } else { errorInfo += " [Contractor quotation]Must be in numeric format!"; } } catch (Exception) { errorInfo += " [Contractor quotation]Must be in numeric format!"; } } else { fcSesModel.Contractor_quotation = 0; } if (item.ssrActualCost!=null) { try { if (IsNumber(item.ssrActualCost)) { fcSesModel.SSR_Actual_cost = DecibelConversion(item.ssrActualCost.Value.ToString().Trim()); } else { errorInfo += "[SSR Actual cost]Must be in numeric format!"; } } catch (Exception) { errorInfo += "[SSR Actual cost]Must be in numeric format!"; } } else { fcSesModel.SSR_Actual_cost = 0; } if (!string.IsNullOrEmpty(item.taxRate)) { try { if (IsNumber(item.taxRate.Replace("%", ""))) { fcSesModel.Tax_rate = DecibelConversion(item.taxRate.Replace("%", "").Trim()); } else { errorInfo += "[Tax rate]Must be in numeric format!"; } } catch (Exception) { errorInfo += "[Tax rate]Must be in numeric format!"; } } if (item.deduction!=null) { try { if (IsNumber(item.deduction)) { fcSesModel.Deviation = DecibelConversion(item.deduction.Value.ToString().Trim()); } else { errorInfos += "[Deviation]Must be in numeric format!"; } } catch (Exception) { errorInfos += "[Deviation]Must be in numeric format!"; } } //if (item.deductionPercentage!=null) //{ // try // { // if (IsNumber(item.deductionPercentage)) // { // fcSesModel.Deviation_Percentage = DecibelConversion(item.deductionPercentage.ToString().Trim()); // } // else // { // errorInfos += (i + 2) + "line[Deviation Percentage]Must be in numeric format
"; // } // } // catch (Exception) // { // errorInfos += (i + 2) + "line[Deviation Percentage]Must be in numeric format
"; // } //} fcSesModel.Long_text = item.longText; if (!string.IsNullOrEmpty(item.workOrder)) { try { if (IsWholeNumber(item.workOrder)) { fcSesModel.Work_Order = int.Parse(item.workOrder.Trim()); } else { errorInfos += "[Work Order]Must be in pure number format!"; } } catch (Exception) { errorInfos += "[Work Order]Must be in pure number format!"; } } fcSesModel.Function_location = item.functionLocation; fcSesModel.Main_work_center = item.mainWorkCenter; if (!string.IsNullOrEmpty(item.workCenter)) { fcSesModel.Work_Center = item.workCenter.ToString(); if (fcSesModel.Work_Center.Contains("CTM/L")) { fcSesModel.Dep = "CTM"; fcSesModel.Section = "CTM/P"; } else if (fcSesModel.Work_Center.Length > 5 && (fcSesModel.Work_Center.ToString() == "CTA/LV" || fcSesModel.Work_Center.ToString() == "CTA/LW")) { fcSesModel.Dep = "CTA"; fcSesModel.Section = "CTA/L"; } else if (fcSesModel.Work_Center.Length > 5 && fcSesModel.Work_Center.Substring(0, 5) == "CTA/L" && (fcSesModel.Work_Center.ToString() != "CTA/LV" || fcSesModel.Work_Center.ToString() != "CTA/LW")) { fcSesModel.Section = "CTA/P"; } else if (fcSesModel.Work_Center.Length >= 5) { fcSesModel.Dep = fcSesModel.Work_Center.Substring(0, 3); fcSesModel.Section = fcSesModel.Work_Center.Substring(0, 5); } } else { if (!string.IsNullOrEmpty(item.wbs)) { fcSesModel.Section = "PS"; } } fcSesModel.Cost_center = item.costCenter; fcSesModel.WBS = item.wbs; fcSesModel.Network = item.network; if (item.claimSheetsReceive!=null) { try { message = TimeValidation(item.claimSheetsReceive); if (string.IsNullOrEmpty(message)) { fcSesModel.Claim_sheets_receive = TimeValue(item.claimSheetsReceive); fcSesModel.CS_REC_Format = TimeValue(item.claimSheetsReceive); } else { errorInfos += "[Claim sheets receive]" + message + "!"; } } catch (Exception) { errorInfos += "[Claim sheets receive]" + message + "!"; } } if (item.engineerConfirmedO!=null) { try { message = TimeValidation(item.engineerConfirmedO); if (string.IsNullOrEmpty(message)) { fcSesModel.Engineer_confirmed_o = TimeValue(item.engineerConfirmedO); fcSesModel.ENG_CONF_Format = TimeValue(item.engineerConfirmedO); } else { errorInfos += "[Engineer confirmed o]" + message + "!"; } } catch (Exception) { errorInfos += "[Engineer confirmed o]" + message + "!"; } } if (item.sesConfirmedOn!=null) { try { message = TimeValidation(item.sesConfirmedOn); if (string.IsNullOrEmpty(message)) { fcSesModel.SES_Confirmed_on = TimeValue(item.sesConfirmedOn); fcSesModel.SES_CONF_Format = TimeValue(item.sesConfirmedOn); } else { errorInfos += "[SES Confirmed on]" + message + "!"; } } catch (Exception) { errorInfos += "[SES Confirmed on]" + message + "!"; } } // 以下没有 // Contractor_duration // BoQ_confirmation_dur // Settlement duration // Invoiced on //Invoice duration // Payment made on //Payment duration fcSesModel.Accepted = item.Accepted; fcSesModel.Deleted = item.deleted; fcSesModel.Blocked = item.blocked; fcSesModel.Changed_by = item.changedDy; fcSesModel.DateIn= DateTime.Now; // 以下和诚实度和及时性有关 fcSesModel.CPT_No = item.cptNo; if (!string.IsNullOrEmpty(item.con)) { try { if (IsNumber(item.con)) { fcSesModel.Con_Days = DecibelConversion(item.con.Trim()); } else { errorInfo += " [con]Must be in numeric format!"; } } catch (Exception) { errorInfo += " [con]Must be in numeric format!"; } } if (item.submiteDate != null) { try { message = TimeValidation(item.submiteDate); if (string.IsNullOrEmpty(message)) { fcSesModel.Submit_Date = TimeValue(item.submiteDate); } else { errorInfos += "[submiteDate]" + message + "!"; } } catch (Exception) { errorInfos += "[submiteDate]" + message + "!"; } } if (item.contractorQuotation!=null) { try { if (IsNumber(item.contractorQuotation)) { fcSesModel.Quotation = DecibelConversion(item.contractorQuotation.Value.ToString()); } else { errorInfo += " [contractorQuotation]Must be in numeric format!"; } } catch (Exception) { errorInfo += " [contractorQuotation]Must be in numeric format!"; } } if (item.ssrActualCost != null && item.contractorQuotation != null) { decimal punishment = 0; var pun = from x in Funs.DB.EMC_Punishment where x.SES_No == item.sesNo select x; if (pun.Count() > 0) { punishment = pun.Sum(x => x.Company != null ? x.Company.Value : 0) + pun.Sum(x => x.Individual != null ? x.Individual.Value : 0); } decimal tax_Value = decimal.Parse((item.ssrActualCost.Value * (1 + fcSesModel.Tax_rate)).Value.ToString("0.00")); fcSesModel.Deduction = decimal.Parse((item.contractorQuotation.Value - tax_Value - punishment).ToString("0.00")); } if (errorInfo != string.Empty) { errorInfos += errorInfo; } else { fcSesList.Add(fcSesModel); } } AddSyncSES(fcSesList); } private static void AddSyncSES(ConcurrentBag sesList) { SQLHelper.ExecutSql("truncate table FC_SESReport"); var result = SqlBulkHelper.BulkInsert(SqlBulkHelper.GetCon(), "FC_SESReport", sesList.ToList()); } #region 格式验证 /// /// 时间格式验证 /// /// /// private static string TimeValidation(object time) { string message = string.Empty; try { if (time.ToString().Contains(".")) { DateTime.ParseExact(time.ToString(), "dd.MM.yyyy", CultureInfo.InvariantCulture); } else { Convert.ToDateTime(time); } } catch (Exception ex) { message = "Please enter a valid time format!"; } return message; } /// /// 带小数的数字验证 /// /// /// public static bool IsNumber(object input) { string pattern = "^-?\\d+$|^(-?\\d+)(\\.\\d+)?$"; Regex regex = new Regex(pattern); string value = input != null ? DecibelConversion(input.ToString()).ToString() : ""; return regex.IsMatch(value.Trim()); } /// /// 整数 /// /// /// public static bool IsWholeNumber(object input) { Regex g = new Regex(@"^[-]?[0-9]\d*$"); string value = input != null ? input.ToString() : ""; return g.IsMatch(value); } /// /// 千分位转换 /// /// /// public static decimal DecibelConversion(string input) { var inputValue = string.Empty; if (input.Contains(',') && input.Contains('.')) { var inputstr = input.Replace(".", "").Split(','); if (inputstr.Length > 0) { for (int i = 0; i < inputstr.Length; i++) { inputValue += i < (inputstr.Length - 1) ? inputstr[i] : "." + inputstr[i]; } } } else if (input.Contains(',')) { inputValue = input.Replace(",", "."); } else { inputValue = input; } inputValue = inputValue.Length > 18 ? inputValue.Substring(0, 17) : inputValue; return decimal.Parse(inputValue); } /// /// 时间格式转换 /// /// /// public static DateTime TimeValue(object value) { string dateValue = string.Empty; if (value != null) { if (value.ToString().Contains(".")) { dateValue = DateTime.ParseExact(value.ToString(), "dd.MM.yyyy", CultureInfo.InvariantCulture).ToString("yyyy-MM-dd"); } else { dateValue = DateTime.Parse(value.ToString()).ToString("yyyy-MM-dd"); } } return DateTime.Parse(dateValue); } #endregion } #region 内部类 [Serializable] internal class SES { public string Accepted { get; set; } public string blocked { get; set; } public DateTime? startDate { get; set; } public DateTime? endDate { get; set; } public string createdBy { get; set; } public DateTime? tecoDate { get; set; } public string sesNo { get; set; } public string deleted { get; set; } public string workOrder { get; set; } public string OpSopNo { get; set; } public string prItem { get; set; } public string prNumber { get; set; } public string shortDescrption { get; set; } public string fo { get; set; } public string item { get; set; } public string vendorName { get; set; } public decimal? ssrBudget { get; set; } public decimal? contractorQuotation { get; set; } public decimal? ssrActualCost { get; set; } public decimal? ssrActualCostNetAmount { get; set; } public string wbs { get; set; } public DateTime? createdOn { get; set; } public DateTime? claimSheetsReceive { get; set; } public decimal? sesConfirmedOn { get; set; } public string requisitioner { get; set; } public string currency { get; set; } public string reducedByQuantity { get; set; } public string userField { get; set; } public string taxRate { get; set; } public string changedDy { get; set; } public string longText { get; set; } public string functionLocation { get; set; } public string mainWorkCenter { get; set; } public string workCenter { get; set; } public string costCenter { get; set; } public string network { get; set; } public decimal? deduction { get; set; } public string deductionPercentage { get; set; } public string con { get; set; } public DateTime? submiteDate { get; set; } public DateTime? updateTime { get; set; } public string cptNo { get; set; } public string revision { get; set; } public string tarItem { get; set; } public string budgetBy { get; set; } public string sesStatus { get; set; } public string sesConfirm { get; set; } public string visaResetCount { get; set; } public string visaExceptionCount { get; set; } public string settleExceptionCount { get; set; } public string settleResetCount { get; set; } public string finishDate { get; set; } public string finishDateConfirm { get; set; } public string finishDateVerify { get; set; } public string isPack { get; set; } public string checkMoney { get; set; } public decimal? amountDeclared { get; set; } public decimal? priceFirstValue { get; set; } public decimal? approvedValue { get; set; } public decimal? entrustValue { get; set; } public decimal? overdueDeductions { get; set; } public decimal? safetyAssDeduc { get; set; } public string settleApprovedType { get; set; } public string externalNo { get; set; } public decimal? cptEndTime { get; set; } public string engineerConfirmedO { get; set; } public string settleClaimSheetsReceive { get; set; } public string section { get; set; } public string deviation { get; set; } public string deviationPercentage { get; set; } public string LastPayment { get; set; } } #endregion }