using Newtonsoft.Json.Linq;
using PTMedicalInsurance.Business;
using PTMedicalInsurance.Common;
using PTMedicalInsurance.Forms.BasicDatas.services;
using PTMedicalInsurance.Helper;
using PTMedicalInsurance.Variables;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace PTMedicalInsurance.Forms.BasicDatas
{
public partial class DataDownload : Form
{
private Form mainForm;
private DirectroyQueryService queryService = new DirectroyQueryService();
private DirectoryDownloadService downloadService = new DirectoryDownloadService();
private DirectoryManualMaintainService maintainService = new DirectoryManualMaintainService();
private MIIrisServices mIS = new MIIrisServices();
private GridViewSetter gvdSetter = new GridViewSetter();
private DataTable dtDir = new DataTable();
private string errMsg = "";
private int pageSize = 50;
private DirectoryTypeEnum directoryType = DirectoryTypeEnum.None;
private ProgressWrapper _dataLoader;
ToolTip toolTip = new ToolTip();
CenterBusiness cBus = new CenterBusiness();
public DataDownload()
{
InitializeComponent();
}
public DataDownload(Form frm)
{
InitializeComponent();
InitForm(frm);
}
#region
///
/// 初始化界面
///
///
private void InitForm(Form frm)
{
mainForm = frm;
CheckForIllegalCrossThreadCalls = false;
// 禁用关闭按钮
this.FormBorderStyle = FormBorderStyle.None;
// 隐藏标题栏
this.ControlBox = false;
// 其他可能需要的配置
this.TopLevel = false;
this.Dock = DockStyle.Fill; // 根据需要设置 Dock 属性
//默认药品,手工输入
rbSingleDownload.Checked = rbDrug.Checked = true;
}
#region 控件设置
private void ShowControl()
{
switch ((int)directoryType)
{
case 1://药品
case 2://诊疗
case 3://材料
case 4://疾病诊断
case 5://手术
case 6://慢性病
case 7://DRGs
case 8://日间手术
case 10://中药饮片下载
case 11://医药机构制剂目录下载
case 12://肿瘤形态学下载
case 13://中医疾病下载
case 14://中医证候下载
{
toolTip.SetToolTip(tbCode, "请在此输入医保编码");
toolTip.SetToolTip(tbName, "请在此输入医保名称");
tbUpdateTime.Enabled = tbCurPage.Enabled = tbPageCount.Enabled = tbCbd.Enabled = false;
break;
}
case 9://字典表
{
toolTip.SetToolTip(tbCode, "请在此输入字典编码");
toolTip.SetToolTip(tbName, "请在此输入字典名称");
tbUpdateTime.Enabled = true;
break;
}
case 15://民族药品
case 16://目录信息查询
case 17://医疗与医保目录匹配关系查询
case 18://医药机构目录匹配查询
case 19://医保目录限价查询
case 20://医保目录先自付比例下载
{
tbUpdateTime.Enabled = tbCurPage.Enabled = tbPageCount.Enabled = tbCbd.Enabled = true;
break;
}
case 21://医药机构信息
{
toolTip.SetToolTip(tbCode, "请在此输入医院编码");
toolTip.SetToolTip(tbName, "请在此输入医院名称,支持模糊查找!");
break;
}
}
}
///
/// 控件帮助
///
private void SetHelp()
{
// 设置帮助提供程序
helpProvider1.SetShowHelp(tbCode, true);
helpProvider1.SetHelpString(tbCode, "请在此输入医保编码");
helpProvider1.SetShowHelp(tbUpdateTime, true);
helpProvider1.SetHelpString(tbUpdateTime, "请在此输入更新时间,格式:yyyy-MM-dd");
helpProvider1.HelpNamespace = $@"{Global.curEvt.path}\test.chm";
}
///
/// 控件检测
///
///
///
///
private bool CheckNotEmpty(Control control, string err)
{
if (string.IsNullOrEmpty(control.Text))
{
errorProvider1.SetError(control, err);
return false;
}
return true;
}
#endregion
#region 查询
///
/// 获取查询服务接口编码
///
///
private string GetPaginationServiceCode()
{
if (rbInstitutionInformation.Checked)
{
return "090100XX";
}
else if (rbDictionary.Checked)
{
return "09010043";
}
else
{
return "09010042";
}
}
///
/// 获取分页的输入参数
///
///
private JObject GetPaginationInfoInput(int pageSize, int currentPage)
{
JObject joInput = new JObject {
{ "currentPage" , currentPage },
{ "pageSize" , pageSize },
{ "serviceCode" ,GetPaginationServiceCode() },
{ "directoryType" , (int)directoryType },
{ "directoryCode" , tbCode.Text },
{ "directoryName" , tbName.Text },
{ "approvalNO" , "" },
{ "dosageForm" , "" },
{ "specifications" , "" },
{ "manufacturers" , "" },
{ "directoryDr" , Global.inf.interfaceDr }
};
return joInput;
}
///
/// 几个中心查询的交易组织入参
///
///
///
///
private JObject GetCenterQueryInput(out TradeEnum trade)
{
trade = TradeEnum.MedicalServiceDirectory;
dynamic joData = new JObject();
switch ((int)directoryType)
{
case 15://民族药品目
{
trade = TradeEnum.NationalityDrug;
joData.med_list_codg = tbCode.Text; //医疗目录编码
joData.genname_codg = ""; //通用名编号
joData.drug_genname = ""; //药品通用名
joData.drug_prodname = tbName.Text; //药品商品名
joData.reg_name = ""; //注册名称
joData.tcmherb_name = ""; //中草药名称
joData.mlms_name = ""; //药材名称
joData.vali_flag = ""; //有效标志
joData.rid = ""; //唯一记录号
joData.ver = ""; //版本号
joData.ver_name = ""; //版本名称
joData.opt_begn_time = ""; //经办开始时间
joData.opt_end_time = ""; //经办结束时间
joData.updt_time = tbUpdateTime.Text; //更新时间
joData.page_num = tbCurPage.Text; //当前页数
joData.page_size = tbPageCount.Text; //本页数据量
break;
}
case 16://目录信息查询
{
trade = TradeEnum.InsuDirectory;
joData.query_date = ""; //查询时间点
joData.hilist_code = tbCode.Text; //医保目录编码
joData.insu_admdvs = tbCbd.Text; //参保机构医保区划
joData.begndate = ""; //开始日期
joData.hilist_name = tbName.Text; //医保目录名称
joData.wubi = ""; //五笔助记码
joData.pinyin = ""; //拼音助记码
joData.med_chrgitm_type = ""; //医疗收费项目类别
joData.chrgitm_lv = ""; //收费项目等级
joData.lmt_used_flag = ""; //限制使用标志
joData.list_type = ""; //目录类别
joData.med_use_flag = ""; //医疗使用标志
joData.matn_used_flag = ""; //生育使用标志
joData.hilist_use_type = ""; //医保目录使用类别
joData.lmt_cpnd_type = ""; //限复方使用类型
joData.vali_flag = ""; //有效标志
joData.updt_time = tbUpdateTime.Text; //更新时间
joData.page_num = tbCurPage.Text; //当前页数
joData.page_size = tbPageCount.Text; //本页数据量
break;
}
case 17://医疗与医保目录匹配
{
trade = TradeEnum.MedicalAndInsuDirectory;
joData.query_date = ""; //查询时间点
joData.medins_list_codg = ""; //定点医药机构目录编号
joData.hilist_code = tbCode.Text; //医保目录编码
joData.list_type = ""; //目录类别
joData.insu_admdvs = tbCbd.Text; //参保机构医保区划
joData.begndate = ""; //开始日期
joData.vali_flag = ""; //有效标志
joData.updt_time = tbUpdateTime.Text; //更新时间
joData.page_num = tbCurPage.Text; //当前页数
joData.page_size = tbPageCount.Text; //本页数据量
break;
}
case 18://医药机构目录匹配
{
trade = TradeEnum.MedcineOrgDirectory;
joData.query_date = ""; //查询时间点
joData.fixmedins_code = ""; //定点医药机构编号
joData.medins_list_codg = ""; //定点医药机构目录编号
joData.medins_list_name = ""; //定点医药机构目录名称
joData.insu_admdvs = tbCbd.Text; //参保机构医保区划
joData.list_type = ""; //目录类别
joData.med_list_codg = tbCode.Text; //医疗目录编码
joData.begndate = ""; //开始日期
joData.vali_flag = ""; //有效标志
joData.updt_time = tbUpdateTime.Text; //更新时间
joData.page_num = tbCurPage.Text; //当前页数
joData.page_size = tbPageCount.Text; //本页数据量
break;
}
case 19://医保目录限价
{
trade = TradeEnum.InsuPriceLimitDirectory;
joData.query_date = ""; //查询时间点
joData.hilist_code = tbCode.Text; //医保目录编码
joData.hilist_lmtpric_type = ""; //医保目录限价类型
joData.overlmt_dspo_way = ""; //医保目录超限处理方式
joData.insu_admdvs = tbCbd.Text; //参保机构医保区划
joData.begndate = ""; //开始日期
joData.enddate = ""; //结束日期
joData.vali_flag = ""; //有效标志
joData.rid = ""; //唯一记录号
joData.tabname = ""; //表名
joData.poolarea_no = ""; //统筹区
joData.updt_time = tbUpdateTime.Text; //更新时间
joData.page_num = tbCurPage.Text; //当前页数
joData.page_size = tbPageCount.Text; //本页数据量
break;
}
case 20://医保目录先自付比例
{
trade = TradeEnum.PrepayPercentDirectory;
joData.query_date = ""; //查询时间点
joData.hilist_code = tbCode.Text; //医保目录编码
joData.selfpay_prop_psn_type = "";//医保目录自付比例人员类别
joData.selfpay_prop_type = ""; //目录自付比例类别
joData.insu_admdvs = tbCbd.Text; //参保机构医保区划
joData.begndate = ""; //开始日期
joData.enddate = ""; //结束日期
joData.vali_flag = ""; //有效标志
joData.rid = ""; //唯一记录号
joData.tabname = ""; //表名
joData.poolarea_no = ""; //统筹区
joData.updt_time = tbUpdateTime.Text; //更新时间
joData.page_num = tbCurPage.Text; //当前页数
joData.page_size = tbPageCount.Text; //本页数据量
break;
}
case 21://医药机构信息
{
trade = TradeEnum.MedicalOrgination;
joData.fixmedins_type = "1"; //定点医疗服务机构类型 1定点医疗机构,2定点零售药店,3工伤定点康复机构,4辅助器具配置机构,5计划生育服务机构
joData.fixmedins_name = tbName.Text; //定点医药机构名称
joData.fixmedins_code = ""; //定点医药机构编号
break;
}
}
return joData;
}
///
/// 获取目录类型,跟表结构设定尽量一致
///
///
private DirectoryTypeEnum GetDirecotryType()
{
if (rbDrug.Checked) return DirectoryTypeEnum.Drug;
if (rbMedicalServices.Checked) return DirectoryTypeEnum.MedicalService;
if (rbConsumables.Checked) return DirectoryTypeEnum.Consumables;
if (rbDiagnosis.Checked) return DirectoryTypeEnum.DiseaseDiagnosis;
if (rbSurgery.Checked) return DirectoryTypeEnum.Surgery;
if (rbChronicSpecialDiseases.Checked) return DirectoryTypeEnum.OutpatientChronicDiseases;
if (rbDrgs.Checked) return DirectoryTypeEnum.Drgs;
if (rbDaySurgery.Checked) return DirectoryTypeEnum.DaySurgery;
if (rbDictionary.Checked) return DirectoryTypeEnum.Dictionary;
if (rbChineseHerbalPieces.Checked) return DirectoryTypeEnum.ChineseHerbalPieces;
if (rbHospMadeMedicines.Checked) return DirectoryTypeEnum.HospMadeMedicines;
if (rbEthnicMedicines.Checked) return DirectoryTypeEnum.EthnicMedicine;
if (rbTumorMorphology.Checked) return DirectoryTypeEnum.TumorMorphology;
if (rbTCMDiseaseCatalog.Checked) return DirectoryTypeEnum.TcmDisease;
if (rbTCMSyndromeCatalog.Checked) return DirectoryTypeEnum.TcmSyndrome;
if (rbInstitutionInformation.Checked) return DirectoryTypeEnum.InstitutionInformation;
if (rbDirectoryInformationInquiry.Checked) return DirectoryTypeEnum.DirectoryInformationQuery;
if (rbMedicalAndHealthInsuranceDirectoryMatching.Checked) return DirectoryTypeEnum.MedicalAndHealthInsuranceDirectoryMatching;
if (rbHealthcareInstitutionDirectoryMatching.Checked) return DirectoryTypeEnum.MedicalInsuranceDirectoryMatch;
if (rbPriceLimits.Checked) return DirectoryTypeEnum.PriceLimit;
if (rbSelfPaymentRatio.Checked) return DirectoryTypeEnum.SelfPayRate;
return DirectoryTypeEnum.None;
}
///
/// 校验查询条件
///
/// 是否通过验证
private bool ValidateQueryConditions(out string error)
{
error = "";
if ((int)directoryType > 14)
{
if ((int)directoryType != 21)
{
//if (!CheckNotEmpty(tbUpdateTime, "请输入日期,更新日期不能为空")) result = false;
//if (!CheckNotEmpty(tbCurPage, "请输入当前页数!")) result = false;
//if (!CheckNotEmpty(tbPageCount, "请输入本页数据量,每页条数必须大于0!")) result = false;
if (tbUpdateTime.Text == "")
{
error = "请输入日期,更新日期不能为空";
tbUpdateTime.Focus();
return false;
}
if (tbCurPage.Text == "")
{
error = "请输入当前页数!";
tbCurPage.Focus();
return false;
}
if (tbPageCount.Text == "")
{
error = "请输入本页数据量,每页条数必须大于0!";
tbPageCount.Focus();
return false;
}
}
else
{
if (string.IsNullOrEmpty(tbCode.Text) && tbName.Text == "")
{
tbCode.Focus();
error = "医院编码或医院名称不可同时为空!";
return false;
}
}
}
return true;
}
///
/// 查询分页信息封装
///
/// 当前页
///
///
private int QueryPaginationInfo(int currentPage, out string error)
{
dgvDirectory.DataSource = null;
//获取入参
JObject input = GetPaginationInfoInput(pageSize, currentPage);
////校验入参
//if (!ValidateQueryConditions(out error))
//{
// return -1;
//}
////设置表格标题行
//queryService.SetDgvDirectoryHeader((int)directoryType, dgvDirectory);
//查询分页
if (queryService.QueryMIDirectoryPaginationInfo(input, out error) != 0)
{
MessageBox.Show(error);
return -1;
}
JObject joRtn = JObject.Parse(error);
JArray ja = JArray.FromObject(joRtn["result"]["rows"]);
//处理数据
queryService.HandleDatatable((int)directoryType, ja);
dtDir = (DataTable)ja.ToObject(typeof(DataTable));
int totalCount = int.Parse(joRtn["result"]["total"].ToString());
pgDownload.TotalCount = totalCount;
pgDownload.PageSize = pageSize;
dgvDirectory.DataSource = dtDir;
return 0;
}
private int QueryCenterInfo(out string error)
{
string pages, recordCounts;
error = "";
dynamic joData = GetCenterQueryInput( out TradeEnum trade);
JObject joRtn = cBus.InvokeMedicalInsuranceInquiry(trade, joData);
if (joRtn["infcode"].ToString() == "0")
{
DataTable dt;
if ((int)directoryType == 21)
{
dt = (DataTable)joRtn["output"]["medinsinfo"].ToObject(typeof(DataTable));
if (joRtn["output"]["medinsinfo"].ToString() == "")
{
error = "查询成功,但返回结果集为空!";
return -1;
}
pgDownload.TotalCount = 50;
pgDownload.PageSize = pageSize;
}
else
{
pages = joRtn["output"]["pages"].ToString(); //页数
recordCounts = joRtn["output"]["recordCounts"].ToString(); //总记录条数
dt = (DataTable)joRtn["output"]["data"].ToObject(typeof(DataTable));
if (recordCounts == "0")
{
error = "查询成功,但返回结果集为空!";
return -1;
}
pgDownload.TotalCount = int.Parse(recordCounts);
pgDownload.PageSize = int.Parse(tbPageCount.Text);
}
dgvDirectory.DataSource = dt;
dgvDirectory.Columns[0].ReadOnly = true;
return 0;
}
else
{
error = "调用交易" + trade.GetCode() + "出现错误,请查看日志!"; //joImportRtn["errorMessage"].ToString();
return -1;
}
}
private int Query(int currentPage, out string error)
{
//校验入参
if (!ValidateQueryConditions(out error))
{
return -1;
}
//设置表格标题行
queryService.SetDgvDirectoryHeader((int)directoryType, dgvDirectory);
if ((int)directoryType <= 14)
{
//查询医院本地医保平台数据库分页信息
return QueryPaginationInfo(currentPage, out error);
}
else
{
//查询中心目录信息
return QueryCenterInfo( out error);
}
}
private void rbDirecotryType_CheckChanged(object sender, EventArgs e)
{
directoryType = GetDirecotryType();
ShowControl();
}
#endregion
#region 下载
///
/// 校验下载条件
///
/// 是否通过验证
private bool ValidateDownloadConditions(out string error)
{
error = "";
if ((int)directoryType == 9)
{
if (tbUpdateTime.Text == "")
{
error = "请输入日期,更新日期不能为空";
tbUpdateTime.Focus();
return false;
}
}
else if ((int)directoryType > 14)
{
if ((int)directoryType != 21)
{
if (tbUpdateTime.Text == "")
{
error = "请输入日期,更新日期不能为空";
tbUpdateTime.Focus();
return false;
}
if (tbCurPage.Text == "")
{
error = "请输入当前页数!";
tbCurPage.Focus();
return false;
}
if (tbPageCount.Text == "")
{
error = "请输入本页数据量,每页条数必须大于0!";
tbPageCount.Focus();
return false;
}
}
else
{
if (string.IsNullOrEmpty(tbCode.Text) || tbName.Text == "")
{
tbCode.Focus();
error = "医院编码或医院名称不可同时为空!";
return false;
}
}
}
return true;
}
private JObject GetDiconaryDownloadInput()
{
dynamic joData = new JObject();
joData.type = tbCode.Text; //字典类型
joData.parentValue = ""; //父字典键值
joData.admdvs = Global.inf.areaCode; //行政区划 就医地
joData.date = tbUpdateTime.Text; //查询日期
joData.vali_flag = "1"; //有效标志
return JObject.FromObject(joData);
}
private int Download(out string error)
{
if (!ValidateDownloadConditions(out error))
{
return -1;
}
JObject input = new JObject();
if (rbDictionary.Checked)
{
//// 支持批量
//string[] dictText = tbCode.Text.Trim().Split(",".ToCharArray());
//dictText.ToList().ForEach((dict) =>
//{
// downloadService.DownloadDictionary(input, dict, out errMsg);
//});
return downloadService.DownloadDictionary(input, "", out errMsg);
}
else
{
if (rbSingleDownload.Checked)
{
return downloadService.SingleDownload(tbVersionNO.Text,directoryType,this,out errMsg);
}
else
{
return downloadService.LoopDownload(tbVersionNO.Text, directoryType, this, out errMsg);
}
}
}
#endregion
#region 手动维护目录
#endregion
#endregion
private void btnExit_Click(object sender, EventArgs e)
{
mainForm.Close();
}
private void btQuery_Click(object sender, EventArgs e)
{
if (Query(1,out errMsg) != 0)
{
MessageBox.Show(errMsg);
}
}
private void pgDownload_PageChanged(object sender, object pagingSource, int pageIndex, int count)
{
if (Query(pageIndex, out errMsg) != 0)
{
MessageBox.Show(errMsg);
}
}
private void btExit_Click(object sender, EventArgs e)
{
mainForm.Close();
}
private void btDownload_Click(object sender, EventArgs e)
{
if (Download(out errMsg) != 0)
{
MessageBox.Show(errMsg);
}
}
private void btBatchUpdateAuxInfo_Click(object sender, EventArgs e)
{
}
private void btnGetMaxVersion_Click(object sender, EventArgs e)
{
JObject joMaxVerNO = mIS.getDirectoryMaxVersionNO((int)directoryType - 1);
string ver = joMaxVerNO["result"]["MaxVersionNO"].ToString();
tbVersionNO.Text = ver;
}
private void btSignIn_Click(object sender, EventArgs e)
{
}
}
}