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) { } } }