using Newtonsoft.Json.Linq;
using PTMedicalInsurance.Entity.Base.Clearing;
using PTMedicalInsurance.Helper;
using PTMedicalInsurance.Variables;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace PTMedicalInsurance.Business.Clearing
{
//异地清分
class OutOfAreaPatientClearing
{
private InvokeHelper invoker = new InvokeHelper();
private MIIrisServices mIS = new MIIrisServices();
//private string year;
//private string month;
private DataTable datatable;
private string transid;
public int totalrow;
#region 查询相关
///
/// 查询医院医保库里的异地数据
///
///
///
///
public int QueryHospitalData(JObject input, out string outMsg)
{
string hospitalDr = JsonHelper.getDestValue(input, "hospitalDr");
DateTime dt = DateTime.Parse(JsonHelper.getDestValue(input, "month"));
Global.curEvt.year = dt.ToString("yyyy");
Global.curEvt.month = dt.ToString("MM");
string begin = JsonHelper.getDestValue(input, "beginDate") + "0:00:00";
string end = JsonHelper.getDestValue(input, "endDate") + "23:59:59"; ;
string sqlStr = "Select CertificateNO,MdtrtID,SettlementDateTime,SettlementID,Sumamt,FundPaySumamt,'' mdtrt_setl_time ";
sqlStr = sqlStr + ",'' as mdtrt_id,'' as setl_sn,'' as fulamt_advpay_flag,'' mdtrtarea,'' medins_no,'' certno,'' medfee_sumamt,'' optins_pay_sumamt,'1' cnfm_flag ";
sqlStr = sqlStr + $" FROM BS_MedInsuSettlement WHERE ValidFlag = 1 and Hospital_Dr=" + hospitalDr;
sqlStr = sqlStr + $" and OccurTime>='{begin}'";
sqlStr = sqlStr + $" and OccurTime<='{end}'";
sqlStr = sqlStr + " and (left(InsuranceAreaCode,2)<>'44')";
sqlStr = sqlStr + " order by SettlementDateTime ";
JObject joRtn = mIS.DynamicQuery(sqlStr, "查询HIS异地结算数据");
return JsonHelper.parseIrisRtnResult(joRtn, out outMsg);
}
///
/// 查询中心的异地数据
///
///
///
///
public int QueryCenterData(JObject input, out string outMsg)
{
JObject joRtn = invoker.invokeCenterService(TradeEnum.QueryOutOfAreaClearingDetail, new JObject(new JProperty("data", input)));
if (JsonHelper.parseCenterReturnJson(joRtn, out outMsg) != 0)
{
return -1;
}
else
{
outMsg = joRtn.ToString();
return 0;
}
}
///
/// 循环查询中心数据,最后拼接成JARRY
///
///
///
///
///
public int Combin3260Data(JObject input, out JArray ja, out string outMsg)
{
QueryOutOfAreaClearingDetailsInput queryInput = new QueryOutOfAreaClearingDetailsInput();
DateTime dt = DateTime.Parse(input["month"].ToString());
queryInput.trt_year = dt.ToString("yyyy");
queryInput.trt_month = dt.ToString("MM");
int startrow = 1;
ja = null;
//var combinedList = new List();
while (true)
{
queryInput.startrow = startrow;
if (QueryCenterData(queryInput.ToJson(), out outMsg) != 0)
{
return -1;
}
else
{
JObject joRtn = JObject.Parse(outMsg);
JArray jaData = JArray.FromObject(joRtn["output"]["data"]);
totalrow = int.Parse(joRtn["output"]["totalrow"].ToString());
if (ja == null)
{
ja = jaData;
}
else
{
foreach (var jo in jaData)
{
ja.Add(jo);
}
}
startrow = startrow + jaData.Count;
if (jaData.Count < 100)
{
outMsg = "遍历完成,已查询到返回条数小于100!";
return 0;
}
}
}
}
///
/// 跟已查询出的医院数据进行匹配,未匹配成功的标记红色,多匹配的标记黄色,并新增行数显示
///
///
///
///
///
public int MatchCenterData(DataGridView dgv, JArray ja, out string outMsg)
{
outMsg = "";
//JArray jaDgv = (JArray)dgv.DataSource;
DataTable dt = (DataTable)dgv.DataSource;
DataColumn seqnoColumn = new DataColumn("seqno", typeof(int));
seqnoColumn.DefaultValue = 0;
dt.Columns.Add(seqnoColumn);
//先遍历中心数据后遍历医院数据
foreach (var item in ja)
{
bool isExist = false;
JObject joCenter = (JObject)item;
foreach (DataRow dr in dt.Rows)
{
if (dr["SettlementID"].ToString() == joCenter["setl_sn"].ToString())
{
dr["setl_sn"] = joCenter["setl_sn"].ToString();
dr["seqno"] = int.Parse(joCenter["seqno"].ToString());
dr["medfee_sumamt"] = joCenter["medfee_sumamt"].ToString();
dr["fulamt_advpay_flag"] = joCenter["fulamt_advpay_flag"].ToString();
dr["optins_pay_sumamt"] = joCenter["optins_pay_sumamt"].ToString();
dr["mdtrt_setl_time"] = joCenter["mdtrt_setl_time"].ToString();
dr["certno"] = joCenter["certno"].ToString();
dr["mdtrt_id"] = joCenter["mdtrt_id"].ToString();
dr["medins_no"] = joCenter["medins_no"].ToString();
dr["mdtrtarea"] = joCenter["mdtrtarea"].ToString();
isExist = true;
}
}
if (!isExist)
{
// 创建一个新的行
DataRow newRow = dt.NewRow();
// 设置新行的值
newRow["CertificateNO"] = "HIS未查询到,可扩大月份查询";
newRow["MdtrtID"] = "";
newRow["SettlementDateTime"] = "";
newRow["SettlementID"] = joCenter["setl_sn"].ToString();
newRow["Sumamt"] = "";
newRow["FundPaySumamt"] = "";
newRow["setl_sn"] = joCenter["setl_sn"].ToString();
newRow["seqno"] = int.Parse(joCenter["seqno"].ToString());
newRow["medfee_sumamt"] = joCenter["medfee_sumamt"].ToString();
newRow["fulamt_advpay_flag"] = joCenter["fulamt_advpay_flag"].ToString();
newRow["optins_pay_sumamt"] = joCenter["optins_pay_sumamt"].ToString();
newRow["mdtrt_setl_time"] = joCenter["mdtrt_setl_time"].ToString();
newRow["certno"] = joCenter["certno"].ToString();
newRow["mdtrt_id"] = joCenter["mdtrt_id"].ToString();
newRow["medins_no"] = joCenter["medins_no"].ToString();
newRow["mdtrtarea"] = joCenter["mdtrtarea"].ToString();
dt.Rows.Add(newRow);
}
}
//dt.Columns.Add("rowid",typeof(int));
//for (int i = 0;i ("seqno")
select row;
// 将排序后的行加载到新的 DataTable 中
DataTable sortedTable = sortedRows.CopyToDataTable();
datatable = sortedTable;
dgv.DataSource = sortedTable;
////先遍历医院数据,如果未匹配到中心数据则标红
//foreach (DataRow dr in dt.Rows)
//{
//}
return 0;
}
///
/// 匹配医保库的上传记录表
///
///
///
///
public int MatchMIUploadRecord(JObject input, out string outMsg)
{
outMsg = "";
return 0;
}
#endregion
#region 上传确认
///
/// 组织3261的入参
///
///
///
public OutOfAreaClearingConfirmDetail OrgnizeSingle3261Detail(DataRow dr)
{
OutOfAreaClearingConfirmDetail detail = new OutOfAreaClearingConfirmDetail();
detail.certno = dr["CertificateNO"].ToString();
detail.mdtrt_id = dr["MdtrtID"].ToString();
detail.mdtrt_setl_time = dr["SettlementDateTime"].ToString();
detail.setl_sn = dr["SettlementID"].ToString();
detail.medfee_sumamt = decimal.Parse(dr["Sumamt"].ToString());
detail.cnfm_flag = dr["cnfm_flag"].ToString();
detail.optins_pay_sumamt =decimal.Parse(dr["FundPaySumamt"].ToString());
return detail;
}
///
/// 将确认结果上传给中心
///
///
///
///
public int UploadToCenter(JObject input, out string outMsg)
{
JObject joRtn = invoker.invokeCenterService(TradeEnum.ConfirmOutOfAreaClearing, input);
if (JsonHelper.parseCenterReturnJson(joRtn, out outMsg) != 0)
{
return -1;
}
else
{
outMsg = joRtn.ToString();
return 0;
}
}
///
/// 上传异地清分
///
///
///
///
///
//public int BatchUpload(DataGridView dgv, int rows, out string outMsg)
//{
// outMsg = "";
// List details = new List();
// int rowTotalCount = datatable.Rows.Count;
// for (int i = 0; i < rowTotalCount; i++)
// {
// DataRow dr = datatable.Rows[i];
// JObject joTmp = new JObject();
// if (((i + 1) / rows == 0) || ((i + 1) == rowTotalCount))
// {
// details = new List();
// //int totalrow = 0;
// //if ((i + 1) / rows == 0)
// //{
// // totalrow = rows;
// //}
// //else
// //{
// // totalrow = rowTotalCount / rows;
// //}
// OutOfAreaClearingConfirmInput input = new OutOfAreaClearingConfirmInput();
// OutOfAreaClearingConfirmData data = new OutOfAreaClearingConfirmData();
// data.trt_year = year;
// data.trt_month = month;
// data.totalrow = totalrow;
// input.detail = details;
// input.data = data;
// JObject joIn = input.ToJson();
// if (UploadToCenter(joIn, out outMsg) != 0)
// {
// }
// else
// {
// UpdateUploadRecord(JArray.Parse(JsonHelper.getDestValue(joIn, "detail")), out outMsg);
// }
// }
// else
// {
// details.Add(OrgnizeSingle3261Detail(dr));
// }
// }
// return 0;
//}
public int BatchUpload(DataGridView dgv, int rows, out string outMsg)
{
int iFalse = 0;outMsg = "";
foreach (DataRow dr in datatable.Rows)
{
string err;
if (dr["MdtrtID"].ToString() == "")
{
continue;
}
if (SingleUpload(dr, out err) != 0)
{
iFalse++;
outMsg = outMsg + "\n" + err;
}
}
return -iFalse;
}
#endregion
#region 更新后台
public int UpdateUploadRecord(JArray ja, out string outMsg)
{
outMsg = "";
int iFalse = 0;
foreach (JObject jo in ja)
{
string err = "";
if (UpdateSingleUploadRecord(jo, out err) != 0)
{
iFalse++;
outMsg = outMsg + "\n;" + err;
}
}
return iFalse;
}
public int UpdateSingleUploadRecord(JObject jo, out string outMsg)
{
JObject joUpdateIn = new JObject();
joUpdateIn.Add("businessCode", "OutOfAreaClearing");
joUpdateIn.Add("businessID", jo["setl_sn"].ToString());//单条传,如果批量传,这么处理就有问题
//joUpdateIn.Add("memo", jo["cnfm_flag"].ToString());//单条传,如果批量传,这么处理就有问题
joUpdateIn.Add("memo", transid);//单条传,如果批量传,这么处理就有问题
joUpdateIn.Add("input", jo);
dynamic joOut = new
{
errorCode = "0",
cnfm_flag = jo["cnfm_flag"].ToString()
};
joUpdateIn.Add("output", JObject.FromObject(joOut));
//JoIn包含 起止时间,医院ID,接口ID,患者姓名,患者数电号
JObject joInTmp = JsonHelper.setIrisInpar("02020007", joUpdateIn);
//SELECT *FROM SQLUser.HB_User WHERE Hospital_Dr = 39
joInTmp["session"][0]["userID"] = "278";
joInTmp["session"][0]["hospID"] = Global.inf.hospitalDr;
JObject joRtn = invoker.invokeInsuService(joInTmp.ToString(), "更新通用记录表");
return JsonHelper.parseIrisRtnValue(joRtn, out outMsg);
}
///
/// 查询通用记录表-查询异地清分确认记录
///
///
///
///
public int QuerySingleUploadRecord(string businessID,out JObject joRtn, out string outMsg)
{
JObject joQueryIn = new JObject();
joQueryIn.Add("businessCode", "ShenZhenOutOfAreaClearing");
joQueryIn.Add("businessID", businessID); //结算ID
joQueryIn.Add("HospitalDr", Global.inf.hospitalDr);
//JoIn包含 起止时间,医院ID,接口ID,患者姓名,患者数电号
JObject joInTmp = JsonHelper.setIrisInpar("02020186", joQueryIn);
//SELECT *FROM SQLUser.HB_User WHERE Hospital_Dr = 39
joInTmp["session"][0]["userID"] = "278";
joInTmp["session"][0]["hospID"] = Global.inf.hospitalDr;
joRtn = invoker.invokeInsuService(joInTmp.ToString(), "查询通用记录表异地清分记录");
return JsonHelper.parseIrisRtnValue(joRtn, out outMsg);
}
#endregion
#region 取消确认
public int RollBack(JObject input, out string outMsg)
{
JObject joRtn = invoker.invokeCenterService(TradeEnum.RollBackOutOfAreaClearing, new JObject(new JProperty("data",input)));
if (JsonHelper.parseCenterReturnJson(joRtn, out outMsg) != 0)
{
return -1;
}
else
{
outMsg = joRtn.ToString();
return 0;
}
}
#endregion
#region 业务封装
public int Query(JObject input, DataGridView dgv, out string outMsg)
{
//查询HIS医保结异地结算记录
if (QueryHospitalData(input, out outMsg) != 0)
{
return -1;
}
else
{
JArray jaData = JArray.Parse(JsonHelper.getDestValue(JObject.Parse(outMsg),"data"));
JObject joRtn = invoker.invokeInsuService(JsonHelper.setIrisInpar("09010129", jaData).ToString(), "根据传入的东莞异地清分记录匹配上传记录表");
JArray jaMatchedData = JArray.FromObject(joRtn["data"]);
dgv.DataSource = (DataTable)jaMatchedData.ToObject(typeof(DataTable));
}
//JArray jaCenter = new JArray();
if (Combin3260Data(input, out JArray jaCenter, out outMsg) != 0)
return -1;
//匹配数据
return MatchCenterData(dgv, jaCenter, out outMsg);
}
public int SingleUpload(DataRow dr, out string outMsg)
{
List details = new List();
OutOfAreaClearingConfirmInput input = new OutOfAreaClearingConfirmInput();
OutOfAreaClearingConfirmData data = new OutOfAreaClearingConfirmData();
data.trt_year = Global.curEvt.year;
data.trt_month = Global.curEvt.month;
data.totalrow = Global.curEvt.totalrow;
details.Add(OrgnizeSingle3261Detail(dr));
input.detail = details;
input.data = data;
if (UploadToCenter(input.ToJson(), out outMsg )!= 0)
{
return -1;
}
else
{
transid = Global.curEvt.msgid;
return UpdateSingleUploadRecord(JObject.Parse(JsonHelper.getDestValue(input.ToJson(),"detail[0]")),out outMsg);
}
}
public int SingleUploadNew(DataRow dr, string totalrow, out string outMsg)
{
List details = new List();
OutOfAreaClearingConfirmInput input = new OutOfAreaClearingConfirmInput();
OutOfAreaClearingConfirmData data = new OutOfAreaClearingConfirmData();
data.trt_year = Global.curEvt.year;
data.trt_month = Global.curEvt.month;
data.totalrow = Global.curEvt.totalrow; //int.Parse(totalrow)
details.Add(OrgnizeSingle3261Detail(dr));
input.detail = details;
input.data = data;
if (UploadToCenter(input.ToJson(), out outMsg) != 0)
{
return -1;
}
else
{
transid = Global.curEvt.msgid;
return UpdateSingleUploadRecord(JObject.Parse(JsonHelper.getDestValue(input.ToJson(), "detail[0]")), out outMsg);
}
}
public int Upload(DataGridView dgv, out string outMsg)
{
return BatchUpload(dgv, 100, out outMsg);
}
public int GetParamsALL(DataGridView dgv,out JArray jaRtn, out string outMsg)
{
jaRtn = null;
outMsg = "";
if ((DataTable)dgv.DataSource == null)
{
outMsg="请先查询HIS和医保结算信息!";
return -1;
}
JArray ja = new JArray();
DataTable dt = (DataTable)dgv.DataSource;
for (int i = 0; i < dt.Rows.Count; i++)
{
if (string.IsNullOrEmpty(dt.Rows[i]["certno"].ToString()) == false)
{
JObject joDetail = new JObject
{
{"certno", dt.Rows[i]["certno"].ToString()},
{"mdtrt_id", dt.Rows[i]["mdtrt_id"].ToString()},
{"mdtrt_setl_time", dt.Rows[i]["mdtrt_setl_time"].ToString()},
{"setl_sn", dt.Rows[i]["setl_sn"].ToString()},
{"medfee_sumamt", dt.Rows[i]["medfee_sumamt"].ToString()},
{"cnfm_flag", "1"}, //dt.Rows[i]["cnfm_flag"].ToString()
{"optins_pay_sumamt", dt.Rows[i]["optins_pay_sumamt"].ToString()}
};
ja.Add(joDetail);
}
}
if (ja.Count == 0)
{
outMsg = "无待确认上传的异地清分结算记录!";
return -1;
}
jaRtn = ja;
return 0;
}
public int uploadDetailToCenter(int singleCount, JArray jaDetail, out string outParam)
{
outParam = "";
string errMsg;
try
{
JArray jaTmp = new JArray();
for (int i = 0; i < jaDetail.Count; i++)
{
//if (jaDetail[i]["validFlag"].ToString() == "N") continue;
jaTmp.Add(jaDetail[i]);
if (((i + 1) % singleCount == 0) || ((i + 1) == jaDetail.Count))
{
JObject jo = new JObject();
jo.Add("trt_year", Global.curEvt.year);
jo.Add("trt_month", Global.curEvt.month);
jo.Add("totalrow", Global.curEvt.totalrow);
JObject joInput = new JObject();
joInput.Add("data", jo);
joInput.Add("detail", jaTmp);
JObject joRtn = invoker.invokeCenterService(TradeEnum.ConfirmOutOfAreaClearing, joInput);
if (JsonHelper.parseCenterReturnJson(joRtn, out errMsg) != 0)
{
outParam = errMsg;
return -1;
}
else
{
//返回成功更新通用记录表
transid = Global.curEvt.msgid;
for (int j = 0; j < jaTmp.Count; j++)
{
JObject joHis = new JObject();
joHis = JObject.Parse(jaTmp[j].ToString());
if (UpdateSingleUploadRecord(joHis, out errMsg) != 0)
{
outParam = outParam + errMsg;
}
}
//errMsg = joRtn.ToString();
//return 0;
}
jaTmp = new JArray();
}
}
return 0;
}
catch (Exception ex)
{
outParam = "uploadDetail 异常:" + ex.Message;
return -1;
}
}
public int RollBackSingle(DataGridView dgv, out string outMsg)
{
OutOfAreaClearingRollBackInput input = new OutOfAreaClearingRollBackInput();
input.trt_year = Global.curEvt.year;
input.trt_month = Global.curEvt.month;
input.otransid = "";
RollBack(input.ToJson(), out outMsg);
return UpdateSingleUploadRecord(input.ToJson(), out outMsg);
}
public int RollBackSingle(DataRow dr, out string outMsg)
{
if (QuerySingleUploadRecord(dr["SettlementID"].ToString(), out JObject joRtn, out outMsg) != 0)
{
outMsg = "查询通用记录表异地清分确认记录失败" + outMsg;
return -1;
}
OutOfAreaClearingRollBackInput input = new OutOfAreaClearingRollBackInput();
input.trt_year = Global.curEvt.year;
input.trt_month = Global.curEvt.month;
input.otransid = JsonHelper.getDestValue(joRtn, "result.data[0].Memo");
if (RollBack(input.ToJson(), out outMsg) != 0)
{
return -1;
}
return UpdateSingleUploadRecord(input.ToJson(), out outMsg);
}
public int RollBackSingleNew(DataRow dr, out string outMsg)
{
if (QuerySingleUploadRecord(dr["SettlementID"].ToString(), out JObject joRtn, out outMsg) != 0)
{
outMsg = "查询通用记录表异地清分确认记录失败" + outMsg;
return -1;
}
//OutOfAreaClearingRollBackInput input = new OutOfAreaClearingRollBackInput();
JObject joInput = new JObject();
joInput.Add("trt_year", Global.curEvt.year);
joInput.Add("trt_month", Global.curEvt.month);
joInput.Add("otransid", JsonHelper.getDestValue(joRtn, "result.data[0].Memo"));
joInput.Add("setl_sn", dr["setl_sn"].ToString());
joInput.Add("revokeFlag", "Y");
joInput.Add("uploadFlag", "N");
if (RollBack(joInput, out outMsg) != 0)
{
return -1;
}
return UpdateSingleUploadRecord(joInput, out outMsg);
}
public int RollBackAll(out string outMsg)
{
OutOfAreaClearingRollBackInput input = new OutOfAreaClearingRollBackInput();
input.trt_month = Global.curEvt.month;
input.trt_year = Global.curEvt.year;
input.otransid = "0";
if (RollBack(input.ToJson(), out outMsg) != 0)
{
return -1;
}
else
{
//更新通用上传记录表
//return UpdateSingleUploadRecord(input.ToJson(), out outMsg);
return 0;
}
}
public int RollBackAll(DataGridView dgv, out string outparam)
{
string outMsg = ""; outparam = "";
JObject joInput = new JObject();
joInput.Add("trt_month", Global.curEvt.month);
joInput.Add("trt_year", Global.curEvt.year);
joInput.Add("otransid", "0");
if (RollBack(joInput, out outMsg) != 0)
{
outparam = outMsg;
return -1;
}
else
{
DataTable dt = (DataTable)dgv.DataSource;
//更新通用上传记录表
for (int i = 0; i < dt.Rows.Count; i++)
{
DataRow dr = dt.Rows[i];
dynamic detail = new JObject();
detail.certno = dr["CertificateNO"].ToString();
detail.mdtrt_id = dr["MdtrtID"].ToString();
detail.mdtrt_setl_time = dr["SettlementDateTime"].ToString();
detail.setl_sn = dr["SettlementID"].ToString();
detail.medfee_sumamt = decimal.Parse(dr["Sumamt"].ToString());
detail.cnfm_flag = dr["cnfm_flag"].ToString();
detail.optins_pay_sumamt = decimal.Parse(dr["FundPaySumamt"].ToString());
detail.revokeFlag = "Y"; //撤销
detail.uploadFlag = "N"; //撤销
transid = "";
if (string.IsNullOrEmpty(dr["msgid"].ToString()) == false)
{
UpdateSingleUploadRecord(detail, out outparam);
}
}
return 0;
}
}
#endregion
}
}