using Newtonsoft.Json; using Newtonsoft.Json.Linq; using PTMedicalInsurance.Business; using PTMedicalInsurance.Common; using PTMedicalInsurance.Helper; using PTMedicalInsurance.Variables; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace PTMedicalInsurance.Forms.BasicDatas.services { class DirectoryMapService { private string errMsg; CenterBusiness cBus = new CenterBusiness(); HisMainBusiness hBus = new HisMainBusiness(); HisIrisServices hIS = new HisIrisServices(); MIIrisServices mIS = new MIIrisServices(); InvokeHelper invoker = new InvokeHelper(); private GridViewSetter gvdSetter = new GridViewSetter(); private DataGridViewHeaderSetService dataGridViewHeaderSetService = new DataGridViewHeaderSetService(); private Func action; //private DataLoader.MyFunc updateDelegate; private DataTable dtAllMapped; TradeEnum trade; int iTotalCount = 0; int currentPageIndex = 0; #region 界面标题设置 /// /// 设置DataGridView标题 /// public void SetDgvDirectoryHeader(int directoryType, DataGridView dgv) { switch (directoryType) { case 1://药品 { gvdSetter.SetHeaderTextOfDrug(dgv); break; } case 2://诊疗 { gvdSetter.SetHeaderTextOfMedicalService(dgv); break; } case 3://材料 { gvdSetter.SetHeaderTextOfMaterials(dgv); break; } } } public int SetDgvDirectoryHeader( string fileName, DataGridView dgv,out string err) { return dataGridViewHeaderSetService.SetHeaderText(fileName, dgv, out err); } #endregion #region 获取入参 /// /// 几个医保查询的交易组织入参 /// /// /// /// #endregion #region 查询目录以及导出数据 /// /// 查询His和平台的对照目录,分全部,已对照,未对照三种情况 /// /// /// /// public JObject QueryDirectory(JObject input,MapFlagEnum mapFlag) { JArray jaPagination = JArray.FromObject(input["pagination"]); JArray jaParams = JArray.FromObject(input["params"]); JObject joRtn = new JObject(); JObject joHisRtn; joRtn.Add("errorCode",-1); joRtn.Add("errorMessage", ""); switch (mapFlag) { case MapFlagEnum.None: return null; case MapFlagEnum.All: //全部是先调HIS,然后再匹配医保平台的对照关系 if (hIS.getHISDir(jaPagination, jaParams, out joHisRtn, out errMsg) != 0) { joRtn["errorCode"] = -1; joRtn["errorMessage"] = errMsg; return joRtn; } joRtn = mIS.ConvertHISDir(joHisRtn); break; case MapFlagEnum.Mapped: JArray jaTmp = (JArray)jaParams.DeepClone(); ((JObject)jaTmp[0]).Remove("code"); ((JObject)jaTmp[0]).Remove("descripts"); ((JObject)jaTmp[0]).Remove("FindType"); ((JObject)jaTmp[0]).Remove("TypeID"); ((JObject)jaTmp[0]).Remove("include"); ((JObject)jaTmp[0]).Remove("groupID"); ((JObject)jaTmp[0]).Remove("hospID"); ((JObject)jaTmp[0]).Add("hisType", ((JObject)jaTmp[0])["type"]); ((JObject)jaTmp[0]).Add("HospitalDr", Global.inf.hospitalDr); ((JObject)jaTmp[0]).Add("InterfaceDr", ((JObject)jaTmp[0])["interfaceDr"]); ((JObject)jaTmp[0]).Remove("type"); ((JObject)jaTmp[0]).Remove("flag"); ((JObject)jaTmp[0]).Remove("specInput"); ((JObject)jaTmp[0]).Remove("interfaceDr"); JObject joMiRtn = mIS.GetMappedHISDir(jaPagination, jaTmp); if (JsonHelper.parseIrisRtnValue(joMiRtn, out errMsg) != 0) { joRtn["errorCode"] = -1; joRtn["errorMessage"] = errMsg; return joRtn; } ((JObject)jaParams[0]).Add("TotalCount", joMiRtn["result"]["TotalCount"]); jaParams[0]["compareArr"] = joMiRtn["result"]["Data"]; if (hIS.getHISDir(jaPagination, jaParams, out joRtn, out errMsg) != 0) { joRtn["errorCode"] = -1; joRtn["errorMessage"] = errMsg; return joRtn; } break; case MapFlagEnum.NoMapped: //1.获取全部HIS目录 if (hIS.getHISDir(jaPagination, jaParams, out joHisRtn, out errMsg) != 0) { joRtn["errorCode"] = -1; joRtn["errorMessage"] = errMsg; return joRtn; } //2.获取当前目录的最大值后再次获取目录 int totalCount = int.Parse(joHisRtn["result"]["TotalCount"].ToString()); jaPagination[0]["pageSize"] = totalCount; if (hIS.getHISDir(jaPagination, jaParams, out joHisRtn, out errMsg) != 0) { joRtn["errorCode"] = -1; joRtn["errorMessage"] = errMsg; return joRtn; } //3.获取医保平台数据并匹配未对照数据 joRtn = mIS.GetNoMappHISDir(joHisRtn); if (JsonHelper.parseIrisRtnValue(joRtn, out errMsg) != 0) { joRtn["errorCode"] = -1; joRtn["errorMessage"] = errMsg; } break; default: return null; } return joRtn; } /// /// 查询医保平台存储的中心目录 /// /// /// public JObject QueryMiDirectory(JObject input) { return mIS.getMIDirectoryByPagination(input); } public JObject QueryExportData(JObject input, MapFlagEnum mapFlag) { Global.writeLog($"QueryExportData_INPUT:{input}"); JArray jaPagination = JArray.FromObject(input["pagination"]); JArray jaParams = JArray.FromObject(input["params"]); JObject joRtn = new JObject(); //假设默认每次取得条数为1000,主要是IRIS服务如果没有走流模式,会有一个字符串最大限制,导致服务无法正常返回 int defaultPageSize = 1000; int currentPage = 1; jaPagination[0]["pageSize"] = defaultPageSize; jaPagination[0]["currentPage"] = currentPage; JObject joHisRtn; joRtn.Add("errorCode", -1); joRtn.Add("errorMessage", ""); switch (mapFlag) { case MapFlagEnum.None: return null; case MapFlagEnum.All: //全部是先调HIS,然后再匹配医保平台的对照关系 if (hIS.getHISDir(jaPagination, jaParams, out joHisRtn, out errMsg) != 0) { joRtn["errorCode"] = -1; joRtn["errorMessage"] = errMsg; return joRtn; } JArray jaData = null; //获取HIS返回的总行数。这里其实应该根据默认行数跟总行数进行匹配 int totalCount = int.Parse(JsonHelper.getDestValue(joHisRtn, "result.TotalCount")); if (totalCount > defaultPageSize) { while (currentPage <= (int)(totalCount / defaultPageSize)) { currentPage++; jaPagination[0]["currentPage"] = currentPage; if (hIS.getHISDir(jaPagination, jaParams, out joHisRtn, out errMsg) != 0) { joRtn["errorCode"] = -1; joRtn["errorMessage"] = errMsg; return joRtn; } else { JObject joConvertDirRtn = mIS.ConvertHISDir(joHisRtn); joRtn = (JObject)joConvertDirRtn.DeepClone(); JArray jaTmp = JArray.FromObject(joConvertDirRtn["result"]["Data"]); if (jaData == null) { jaData = jaTmp; } else { jaData.Merge(jaTmp); } } } joRtn["result"]["Data"] = jaData; } else { joRtn = mIS.ConvertHISDir(joHisRtn); } break; case MapFlagEnum.Mapped: JObject joMiRtn = mIS.GetMappedHISDir(jaPagination, jaParams); if (JsonHelper.parseIrisRtnValue(joMiRtn, out errMsg) != 0) { joRtn["errorCode"] = -1; joRtn["errorMessage"] = errMsg; } jaData = null; //获取HIS返回的总行数。这里其实应该根据默认行数跟总行数进行匹配 totalCount = int.Parse(JsonHelper.getDestValue(joMiRtn, "result.TotalCount")); if (totalCount > defaultPageSize) { while (currentPage <= (int)(totalCount / defaultPageSize)) { currentPage++; jaPagination[0]["currentPage"] = currentPage; joMiRtn = mIS.GetMappedHISDir(jaPagination, jaParams); if (JsonHelper.parseIrisRtnValue(joMiRtn, out errMsg) != 0) { joRtn["errorCode"] = -1; joRtn["errorMessage"] = errMsg; return joRtn; } jaParams[0]["compareArr"] = joMiRtn["result"]["Data"]; if (hIS.getHISDir(jaPagination, jaParams, out joRtn, out errMsg) != 0) { joRtn["errorCode"] = -1; joRtn["errorMessage"] = errMsg; return joRtn; } JArray jaTmp = JArray.FromObject(joRtn["result"]["Data"]); if (jaData == null) { jaData = jaTmp; } else { jaData.Merge(jaTmp); } } joRtn["result"]["Data"] = jaData; } else { jaParams[0]["compareArr"] = joMiRtn["result"]["Data"]; if (hIS.getHISDir(jaPagination, jaParams, out joRtn, out errMsg) != 0) { joRtn["errorCode"] = -1; joRtn["errorMessage"] = errMsg; } } break; case MapFlagEnum.NoMapped: //1.获取全部HIS目录 if (hIS.getHISDir(jaPagination, jaParams, out joHisRtn, out errMsg) != 0) { joRtn["errorCode"] = -1; joRtn["errorMessage"] = errMsg; return joRtn; } jaData = null; //获取HIS返回的总行数。这里其实应该根据默认行数跟总行数进行匹配 totalCount = int.Parse(JsonHelper.getDestValue(joHisRtn, "result.TotalCount")); if (totalCount > defaultPageSize) { while (currentPage <= (int)(totalCount / defaultPageSize)) { currentPage++; jaPagination[0]["currentPage"] = currentPage; if (hIS.getHISDir(jaPagination, jaParams, out joHisRtn, out errMsg) != 0) { joRtn["errorCode"] = -1; joRtn["errorMessage"] = errMsg; return joRtn; } joRtn = mIS.GetNoMappHISDir(joHisRtn); if (JsonHelper.parseIrisRtnValue(joRtn, out errMsg) != 0) { joRtn["errorCode"] = -1; joRtn["errorMessage"] = errMsg; return joRtn; } JArray jaTmp = JArray.FromObject(joRtn["result"]["Data"]); if (jaData == null) { jaData = jaTmp; } else { jaData.Merge(jaTmp); } } joRtn["result"]["Data"] = jaData; } else { joRtn = mIS.GetNoMappHISDir(joHisRtn); if (JsonHelper.parseIrisRtnValue(joRtn, out errMsg) != 0) { joRtn["errorCode"] = -1; joRtn["errorMessage"] = errMsg; } } break; default: return null; } return joRtn; } #endregion #region 新版导出匹配 private JArray FetchAllPages( JArray pagination, JArray @params, Func fetchData) { var allData = new JArray(); int pageSize = 1000; int currentPage = 1; int totalCount = 0; do { pagination[0]["pageSize"] = pageSize; pagination[0]["currentPage"] = currentPage; var (code, result, errMsg) = fetchData(pagination, @params); if (code != 0) { throw new Exception($"分页请求失败: {errMsg}"); } if (currentPage == 1) { totalCount = int.TryParse(JsonHelper.getDestValue(result, "result.TotalCount"), out var cnt) ? cnt : 0; } var data = result["result"]?["Data"] as JArray; if (data != null) { allData.Add(data); } currentPage++; } while (currentPage * pageSize <= totalCount); // 或 currentPage <= (totalCount + pageSize - 1) / pageSize return allData; } public JObject QueryExportDataNew(JObject input, MapFlagEnum mapFlag) { var pagination = JArray.FromObject(input["pagination"]); var @params = JArray.FromObject(input["params"]); var result = new JObject(); try { switch (mapFlag) { case MapFlagEnum.All: var hisDataAll = FetchAllPages(pagination, @params, (p, pr) => hIS.getHISDir(p, pr, out var r, out var m) == 0 ? (0, r, m) : (-1, null, m)); var converted = mIS.ConvertHISDir(new JObject { ["result"] = new JObject { ["Data"] = hisDataAll } }); return converted; case MapFlagEnum.Mapped: var mappedDir = mIS.GetMappedHISDir(pagination, @params); if (JsonHelper.parseIrisRtnValue(mappedDir, out var errMsg) != 0) return CreateError(-1, errMsg); var compareArr = mappedDir["result"]?["Data"] as JArray ?? new JArray(); var clonedParams = (JArray)@params.DeepClone(); clonedParams[0]["compareArr"] = compareArr; var hisMappedData = FetchAllPages(pagination, clonedParams, (p, pr) => hIS.getHISDir(p, pr, out var r, out var m) == 0 ? (0, r, m) : (-1, r, m)); result["result"] = new JObject { ["Data"] = hisMappedData }; result["errorCode"] = 0; result["errorMessage"] = ""; return result; case MapFlagEnum.NoMapped: var hisRawData = FetchAllPages(pagination, @params, (p, pr) => hIS.getHISDir(p, pr, out var r, out var m) == 0 ? (0, r, m) : (-1, r, m)); var noMapped = mIS.GetNoMappHISDir(new JObject { ["result"] = new JObject { ["Data"] = hisRawData } }); if (JsonHelper.parseIrisRtnValue(noMapped, out errMsg) != 0) return CreateError(-1, errMsg); return noMapped; default: return null; } } catch (Exception ex) { return CreateError(-1, "系统异常: " + ex.Message); } } private JObject CreateError(int code, string msg) { return new JObject { ["errorCode"] = code, ["errorMessage"] = msg }; } #endregion #region 更新目录附属信息 public string getDataRowValue(DataRow dr, string columnName) { if (!dr.Table.Columns.Contains(columnName)) { return ""; } else { return dr[columnName].ToString(); } } private int updateMappedInsuInfo(DataLoaderContext context, out string errMsg) { int iFalse = 0; int iCount = 0; List errList = new List(); //入参强制转换未JObject JObject joIn = (JObject)context.args[0]; //获取iTotalCount int total = int.Parse(JsonHelper.getDestValue(joIn,"total")); //获取表数据 DataTable dt = (DataTable)joIn["data"].ToObject(typeof(DataTable)); //设置总进度数 if (context.setProgressMaximum != null) { context.setProgressMaximum(total); } JObject joCondition = JObject.FromObject(joIn["condition"]); //遍历 foreach (DataRow dr in dt.Rows) { if (joCondition.ContainsKey("hilist_code")) { joCondition["hilist_code"] = dr["InsuCode"].ToString(); } else { errMsg = "未检测到相应字段"; return -1; // 或者其他表示取消的返回值 } OutParamWrapper outParWarp = new OutParamWrapper(); if (action(joCondition, outParWarp) != 0) { iFalse++; errList.Add(outParWarp.Value); } iCount++; // 检查是否应取消操作 if (context.Worker.CancellationPending) { errMsg = "操作取消!"; return -1; // 或者其他表示取消的返回值 } if (context.reportProgress != null) { context.reportProgress(iCount); } } if (iFalse != 0) { errMsg = ($"总共{iCount}条数据更新完成,但有{iFalse}条更新发生错误!"); Global.writeLog($"{errMsg}\r\n{errList}"); } else { errMsg = ($"全部数据({iCount}条)更新完成"); } return iFalse; } public void batchUpdateMappedInsuInfo(JObject joIn, Form frm) { //条件 JObject joCondition = (JObject)joIn["condition"].DeepClone(); switch (joCondition["funno"].ToString()) { case "1318": action = updateCellPriceWrapper; trade = trade.GetByCode("1318"); Global.writeLog("updateCellPriceWrapper"); break; default: break; } ProgressWrapper _dataLoader; _dataLoader = new ProgressWrapper(updateMappedInsuInfo, frm); _dataLoader.SetProgressBar(ProgressBarStyle.Continuous, "正在更新...", 50); _dataLoader.Start(new object[] {joIn }, (result, errMsg) => { // 在这里处理结果和错误信息 if (result == 0) { MessageBox.Show(errMsg); } else { MessageBox.Show(errMsg); } }); } public void batchUpdateMappedInsuInfo(Func _action,Form frm) { action = _action; string sqlStr = $"select * from HB_MedInsuMapRelation where Interface_Dr='{Global.inf.interfaceDr}' and Hospital_Dr ='{Global.inf.hospitalDr}'"; JObject joSqlstr = new JObject(); joSqlstr.Add("sqlStr", sqlStr); JObject joRtn = mIS.QueryMappedData(joSqlstr, "查询所有已对照数据"); iTotalCount = int.Parse(joRtn["result"]["total"].ToString()); dtAllMapped = (DataTable)joRtn["result"]["data"].ToObject(typeof(DataTable)); ProgressWrapper _dataLoader; _dataLoader = new ProgressWrapper(updateMappedInsuInfo, frm); _dataLoader.SetProgressBar(ProgressBarStyle.Continuous, "正在更新...", 50); _dataLoader.Start(new object[] { iTotalCount }, (result, errMsg) => { // 在这里处理结果和错误信息 if (result == 0) { MessageBox.Show(errMsg); } else { MessageBox.Show(errMsg); } }); } public int updateCellPriceWrapper(JObject jo, OutParamWrapper outParamWrapper) { string err; int iresult = updateCellingPrice(jo, out err); outParamWrapper.Value = err; return iresult; } private int updateCellingPrice(DataLoaderContext context, out string err) { if (context.setProgressMaximum != null) { context.setProgressMaximum(iTotalCount); } JObject jo = new JObject(); dynamic joData = null; JObject joRtn = cBus.InvokeMedicalInsuranceInquiry(trade.GetCode(), joData); if (joRtn["infcode"].ToString() == "0") { DataTable dtAuxInfo = (DataTable)joRtn["output"]["data"].ToObject(typeof(DataTable)); DateTime dtToday = DateTime.Today; string cellingPrice = ""; string begndate = ""; string enddate = ""; int iAdpater = 0; foreach (DataRow dr in dtAuxInfo.Rows) { DateTime dtBegin = getDataRowValue(dr, "begndate") == "" ? Convert.ToDateTime("2000-01-01 00:00:00") : Convert.ToDateTime(getDataRowValue(dr, "begndate")); DateTime dtEnd = getDataRowValue(dr, "enddate") == "" ? Convert.ToDateTime("2099-01-01 00:00:00") : Convert.ToDateTime(getDataRowValue(dr, "enddate")); if ((dtBegin < dtToday) && (dtToday < dtEnd)) { iAdpater++; cellingPrice = dr["hilist_pric_uplmt_amt"].ToString(); begndate = dr["begndate"].ToString(); enddate = dr["enddate"].ToString(); } } //有且只能有一条数据符合 if (iAdpater == 1) { JObject joPamam = new JObject(); joPamam.Add("Code", JsonHelper.getDestValue(jo, "code")); joPamam.Add("HisType", JsonHelper.getDestValue(jo, "HisType")); joPamam.Add("StartDate", begndate); joPamam.Add("EndDate", enddate); joPamam.Add("CeilingPrice", cellingPrice); JObject joUpdateRtn = mIS.UpdateDirectoryBySelf(joPamam); string error = ""; if (JsonHelper.parseIrisRtnValue(joUpdateRtn, out error) != 0) { err = "修改失败:" + error; return -1; } else { err = "修改成功"; return 0; } } else { err = "中心返回符合条数的记录不唯一或者为空,请检查!"; return -1; } } else { err = "查询中心数据出错,请检查!"; return -1; } } public int updateCellingPrice(JObject joData, out string err) { err = ""; //dynamic joData = (JObject)jo.DeepClone(); JObject joRtn = cBus.InvokeMedicalInsuranceInquiry(TradeEnum.InsuPriceLimitDirectory.GetCode(), joData); if (joRtn["infcode"].ToString() == "0") { DataTable dtAuxInfo = (DataTable)joRtn["output"]["data"].ToObject(typeof(DataTable)); DateTime dtToday = DateTime.Today; string cellingPrice = ""; string begndate = ""; string enddate = ""; int iAdpater = 0; foreach (DataRow dr in dtAuxInfo.Rows) { DateTime dtBegin = getDataRowValue(dr, "begndate") == "" ? Convert.ToDateTime("2000-01-01 00:00:00") : Convert.ToDateTime(getDataRowValue(dr, "begndate")); DateTime dtEnd = getDataRowValue(dr, "enddate") == "" ? Convert.ToDateTime("2099-01-01 00:00:00") : Convert.ToDateTime(getDataRowValue(dr, "enddate")); if ((dtBegin < dtToday) && (dtToday < dtEnd)) { iAdpater++; cellingPrice = dr["hilist_pric_uplmt_amt"].ToString(); begndate = dr["begndate"].ToString(); enddate = dr["enddate"].ToString(); } } //有且只能有一条数据符合 if (iAdpater == 1) { JObject joPamam = new JObject(); joPamam.Add("Code", JsonHelper.getDestValue(joData, "code")); joPamam.Add("HisType", JsonHelper.getDestValue(joData, "HisType")); joPamam.Add("StartDate", begndate); joPamam.Add("EndDate", enddate); joPamam.Add("CeilingPrice", cellingPrice); JObject joUpdateRtn = mIS.UpdateDirectoryBySelf(joPamam); string error = ""; if (JsonHelper.parseIrisRtnValue(joUpdateRtn, out error) != 0) { err = "修改失败:" + error; return -1; } else { err = "修改成功"; return 0; } } else { err = "中心返回符合条数的记录不唯一或者为空,请检查!"; return -1; } } else { err = "查询中心数据出错,请检查!"; return -1; } } private int updateSelfRatioWrapper(JObject jo, OutParamWrapper outParamWrapper) { string err; int iresult = updateSelfRatioInfo(jo, out err); outParamWrapper.Value = err; return iresult; } public int updateSelfRatioInfo(JObject jo, out string err) { err = ""; dynamic joData = (JObject)jo.DeepClone(); JObject joRtn = cBus.InvokeMedicalInsuranceInquiry(TradeEnum.PrepayPercentDirectory.GetCode(), joData); if (joRtn["infcode"].ToString() == "0") { DataTable dtRatioInfo = (DataTable)joRtn["output"]["data"].ToObject(typeof(DataTable)); DateTime dtToday = DateTime.Today; string cellingPrice = ""; string begndate = ""; string enddate = ""; int iAdpater = 0; var dataArray = JArray.FromObject(joRtn["output"]["data"]); DateTime today = DateTime.Today; var groupedResult = dataArray .Where(item => { if (DateTime.TryParse(item["enddate"]?.ToString(), out var endDate)) { return endDate.Date >= today.Date; } return false; }) .GroupBy(item => item["selfpay_prop_psn_type"]?.ToString()); JArray joArray = new JArray(); foreach (var group in groupedResult) { foreach (var item in group) { // 将 JsonNode 转换为 JObject JObject jObj = JObject.Parse(item.ToString()); dynamic joTmp = new JObject(); joTmp.HospitalDr = Global.inf.hospitalDr; joTmp.InterfaceDr = Global.inf.interfaceDr; joTmp.updateUserID = Global.user.ID; joTmp.Code = jObj["hilist_code"]; joTmp.PersonnelType = jObj["selfpay_prop_psn_type"]; joTmp.ProportionType = jObj["selfpay_prop_type"]; joTmp.Proportion = jObj["selfpay_prop"]; joTmp.BeginDate = jObj["begndate"]; joTmp.EndDate = jObj["enddate"]; joTmp.InsuranceAreaCode = jObj["insu_admdvs"]; joTmp.PoolAreaNO = jObj["poolarea_no"]; joTmp.ValidFlag = jObj["vali_flag"]; joTmp.RequiredID = jObj["rid"]; joArray.Add(joTmp); } } string errMsg = ""; InvokeHelper invoker = new InvokeHelper(); joRtn = invoker.invokeInsuService(JsonHelper.setIrisInpar("09010085", joArray).ToString(), "设置自费比例"); if (JsonHelper.parseIrisRtnValue(joRtn, out errMsg) != 0) { err = errMsg; return -1; } else { err = ("更新成功!"); return 0; } } else { err = "查询中心数据出错,请检查!"; return -1; } } private int updateAuxInfoWrapper(JObject jo, OutParamWrapper outParamWrapper) { string err; int iresult = updateAuxInfo(jo, out err); outParamWrapper.Value = err; return iresult; } public int updateAuxInfo(JObject jo, out string err) { err = ""; dynamic joData = (JObject)jo.DeepClone(); JObject joRtn = cBus.InvokeMedicalInsuranceInquiry(TradeEnum.InsuDirectory.GetCode(), joData); if (joRtn["infcode"].ToString() == "0") { DataTable dtAuxInfo = (DataTable)joRtn["output"]["data"].ToObject(typeof(DataTable)); DateTime dtToday = DateTime.Today; string chrgitm_lv = ""; string begndate = ""; string enddate = ""; string list_type = ""; string med_chrgitm_type = ""; int iAdpater = 0; foreach (DataRow dr in dtAuxInfo.Rows) { DateTime dtBegin = getDataRowValue(dr, "begndate") == "" ? Convert.ToDateTime("2000-01-01 00:00:00") : Convert.ToDateTime(getDataRowValue(dr, "begndate")); DateTime dtEnd = getDataRowValue(dr, "enddate") == "" ? Convert.ToDateTime("2099-01-01 00:00:00") : Convert.ToDateTime(getDataRowValue(dr, "enddate")); if ((dtBegin < dtToday) && (dtToday < dtEnd)) { iAdpater++; chrgitm_lv = dr["chrgitm_lv"].ToString(); begndate = dtBegin.ToString("yyyy-MM-dd HH:mm:ss"); enddate = dtEnd.ToString("yyyy-MM-dd HH:mm:ss"); list_type = dr["list_type"].ToString(); med_chrgitm_type = dr["med_chrgitm_type"].ToString(); } } //有且只能有一条数据符合 if (iAdpater == 1) { JObject joPamam = new JObject(); joPamam.Add("Code", JsonHelper.getDestValue(jo, "code")); joPamam.Add("HisType", JsonHelper.getDestValue(jo, "HisType")); joPamam.Add("StartDate", begndate); joPamam.Add("EndDate", enddate); joPamam.Add("ChargeItemLevel", chrgitm_lv); joPamam.Add("ListType", list_type); joPamam.Add("ChargeItemType", med_chrgitm_type); JObject joUpdateRtn = mIS.UpdateDirectoryBySelf(joPamam); string error = ""; if (JsonHelper.parseIrisRtnValue(joUpdateRtn, out error) != 0) { err = "修改失败:" + error; return -1; } else { err = "修改成功"; return 0; } } else { err = "中心返回符合条数的记录不唯一或者为空,请检查!"; return -1; } } else { err = "查询中心数据出错,请检查!"; return -1; } } public int updateAuxAndCellPrice(JObject jo, out string error) { string err = ""; int iResult = 0; error = ""; if (updateAuxInfo(jo, out err) != 0) { error = $"更新目录信息失败{err}"; iResult--; } //err = ""; //if (updateCellingPrice(jo, out err) != 0) //{ // error = $"{error};更新限价信息失败{err}"; // iResult--; //} return iResult; } #endregion #region 导入 #endregion #region 处理DataError public void dataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e) { // 🔴 关键:阻止异常继续抛出,程序不会崩溃 e.ThrowException = false; //// 可选:记录日志(用于调试) //System.Diagnostics.Debug.WriteLine($"[DataError] Context: {e.Context}, Error: {e.Exception.Message}"); //// 可选:根据需要清理单元格 //if (e.Context == DataGridViewDataErrorContexts.Parsing) //{ // // 解析失败时,可以清空单元格或设置默认值 // DataGridView dgv = (DataGridView)sender; // dgv[e.ColumnIndex, e.RowIndex].Value = null; // 或其他默认值 //} } #endregion } }