2022.11.25 TIL(3)

SaGo_MunGcci·2022년 11월 25일
0

C#

목록 보기
6/27
using AMIS3.UIFramework;
using AMIS3.UIFramework.Communication;
using AMIS3.UIFramework.DataModel;
using AMIS3.UIFramework.FxExtension;
using AMIS3.UIFramework.UI;
using AMIS3.UIFramework.UI.Controls;
using DevExpress.XtraGrid.Columns;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using AMIS3.UIFramework.Security;

using AMIS3.HM.ZZ;
using AMIS3.HM.ZZ.ZZLIB002;

namespace AMIS3.HM.GX.RS204
{
    public partial class VHMGXRS204S : ScreenBase, ISmartToolbar
    {
        public List<ActionButtonItem> ActionButtonItems { get; set; }
        DataTable dtRSLT;

        /// <summary>
        /// 거래처코드 테이블
        /// </summary>
        DataTable _dtActcustCd;

        public VHMGXRS204S()
        {
            InitializeComponent();

            SetControl();

            SetEvent();

            //ActionBtnSetting();
        }

        #region 컨트롤 초기화
        /// <summary>
        /// 컨트롤 초기화
        /// </summary>
        private void SetControl()
        {
            //조회기간
            dtpStartDt.DateTime = DateTime.Now;
            dtpEndDt.DateTime = DateTime.Now;

            var searchParam = new PreData();

            searchParam["synthCd"] = "RsltCunslDr";
            // 의사코드
            SvCallLoadHeSynthDtlCdList(searchParam);

            //searchParam["synthCd"] = "HePkgClsfCd";
            //// 분류코드
            //SvCallLoadHeSynthDtlCdList(searchParam);

            // 거래처코드
            //SvCallLoadActcustCdList();

            //findDoctor.TxtFindCd.EditValueChanged += TxtFindCd_EditValueChanged;
            //ucHeActcustCd.TxtFindCd.EditValueChanged += TxtFindCd_EditValueChanged;

            // 그리드 row순번표시
            grvPbcrCrteRsltBrkdwn.IndicatorWidth = 25;
            grvPbcrCrteRsltBrkdwn.SetCustomDrawRowIndicatorRowNum();

            CommonMethod.GetResourceFile(this, "Report." + "VHMGXRS204R01.reb", "rpt" + "VHMGXRS204R01.reb");

            rptViewer.BindingDataTableList.Clear();
            rptViewer.BindFieldDic.Clear();

            rptViewer.TabHeaderVisible = false; //false
            rptViewer.ToolbarVisible = true;
            rptViewer.StatusbarVisible = false; //false

            rptViewer.OpenReport(@"c:\amis3\temp\" + "rpt" + "VHMGXRS204R01.reb");
        }

        //private void TxtFindCd_EditValueChanged(object sender, EventArgs e)
        //{
        //    AButtonEdit txtFindCd = sender as AButtonEdit;
        //    FindCdControl ucFindCd = txtFindCd.Parent.Parent as FindCdControl;

        //    if (txtFindCd.Text == "")
        //    {
        //        ucFindCd.FindCdNm = "";
        //    }
        //}
        #endregion

        /// <summary>
        /// 이벤트 처리
        /// </summary>
        private void SetEvent()
        {
            // 조회
            btnSearch.Click += async (sender, e) =>
            {
                if (fcActcust.FindCd.IsNotNull() && fcActcust.FindNm.IsNull())
                {
                    AMessageBox.Show("조회오류", "회사코드를 제대로 입력해 주세요.");
                    fcActcust.Focus();
                    return;
                }

                if (dtpStartDt.Text == "")
                {
                    AMessageBox.Show("조회오류!!", "조회시작일자를 선택해 주세요!!", AMessageType.Warning);
                    dtpStartDt.DateTime = DateTime.Now;
                    return;
                }

                if (dtpEndDt.Text == "")
                {
                    AMessageBox.Show("조회오류!!", "조회종료일자를 선택해 주세요!!", AMessageType.Warning);
                    dtpEndDt.DateTime = DateTime.Now;
                    return;
                }

                bool isOverDays = IsOverDays(dtpStartDt.DateTime, dtpEndDt.DateTime, 31);

                if (isOverDays == false)
                {
                    return;
                }

                if (fcDoctor.FindCd == "")
                {
                    AMessageBox.Show("조회오류!!", "검진의사를 선택해 주세요!!", AMessageType.Warning);
                    fcDoctor.Focus();
                    return;
                }

                rptViewer.BindingDataTableList.Clear();
                rptViewer.BindFieldDic.Clear();

                grdPbcrCrteRsltBrkdwn.DataSource = null;

                await SvCallLoadPbcrCrteRsltBrkdwnList();
            };

            //조회시작일 선택시
            dtpStartDt.Closed += (sender, e) =>
            {
                dtpEndDt.DateTime = dtpStartDt.DateTime;
            };

            // 조회종료일 선택시
            dtpEndDt.Closed += (sender, e) =>
            {
                TimeSpan tDiff = dtpEndDt.DateTime.Subtract(dtpStartDt.DateTime);

                if (tDiff.Days < 0)
                {
                    AMessageBox.Show("조회오류!!", "조회시작일보다 이전일을 선택할 수 없습니다!!", AMessageType.Warning);

                    dtpEndDt.DateTime = dtpStartDt.DateTime;
                    return;
                }

                //btnSearch.PerformClick();
            };

            dtpStartDt.KeyDown += (sender, e) =>
            {
                if (e.KeyCode == Keys.Enter)
                    dtpEndDt.DateTime = dtpStartDt.DateTime;
            };

            dtpEndDt.KeyDown += (sender, e) =>
            {
                //if (e.KeyCode == Keys.Enter)
                //    btnSearch.PerformClick();
            };

            btnDel.Click += (sender, e) =>
            {
                OnDeleteAction();
            };

            grvPbcrCrteRsltBrkdwn.RowCellClick += (sender, e) =>
            {
                if (grvPbcrCrteRsltBrkdwn.DataRowCount == 0)
                    return;

                if (e.Button != MouseButtons.Left)
                    return;

                if (e.Clicks != 1)
                    return;

                grvPbcrCrteRsltBrkdwn.SetRowCellValue(e.RowHandle, "chck", grvPbcrCrteRsltBrkdwn.GetRowCellValue(e.RowHandle, "chck").ToStringDefault() == "Y" ? "N" : "Y");
            };

            chkWhol.CheckedChanged += (sender, e) =>
            {
                if (grvPbcrCrteRsltBrkdwn.DataRowCount == 0)
                    return;

                for (int rowIndex = 0; rowIndex < grvPbcrCrteRsltBrkdwn.DataRowCount; rowIndex++)
                {
                    grvPbcrCrteRsltBrkdwn.SetRowCellValue(rowIndex, "chck", chkWhol.Checked ? "Y" : "N");
                }
            };

            lblChoicN.Click += (sender, e) =>
            {
                if (grvPbcrCrteRsltBrkdwn.DataRowCount == 0)
                    return;

                for (int rowIndex = 0; rowIndex < grvPbcrCrteRsltBrkdwn.DataRowCount; rowIndex++)
                {
                    if (grvPbcrCrteRsltBrkdwn.GetRowCellValue(rowIndex, "informCnsnYn").ToStringDefault() == "N")
                        grvPbcrCrteRsltBrkdwn.SetRowCellValue(rowIndex, "chck", "Y");
                    else
                        grvPbcrCrteRsltBrkdwn.SetRowCellValue(rowIndex, "chck", "N");
                }
            };

            btnPrint.Click += (sender, e) =>
            {
                if (rptViewer.BindingDataTableList.Any() == false)
                {
                    AMessageBox.Show("확인", "조회 후 출력 가능합니다.");
                    return;
                }

                try
                {
                    DrmService.Instance.WaterMarkDisable(); //워터마크 해제
                    rptViewer.PrintReport(0, null, 1, -1, 1);
                }
                finally
                {
                    DrmService.Instance.WaterMarkEnable();  //워터마크 적용
                }
            };
        }

        private bool IsOverDays(DateTime stDt, DateTime endDt, int days)
        {
            TimeSpan tDiff = endDt.Subtract(stDt);

            if (tDiff.Days > days)
            {
                //한달이상의 특정시간인 경우
                if (DateTime.Now.TimeOfDay >= TimeSpan.Parse("05:00:00") &&
                    DateTime.Now.TimeOfDay <= TimeSpan.Parse("16:30:00"))
                {
                    // 실패시 메세지 출력
                    AMessageBox.Show("조회오류!!", "[" + DateTime.Now.Hour.ToString() + "시" + DateTime.Now.Minute + "분] "
                                                     + "한달 이상일 경우 오후 4시반 이후에 작업바랍니다 !!", AMessageType.Error);
                    return false;
                }
            }

            // 회사코드 입력안한 경우, 7일 이내로
            if (tDiff.Days > 7 && fcActcust.FindCd.IsNull())
            {
                AMessageBox.Show("조회오류!!", "[" + tDiff.Days.ToString() + " " + stDt.ToString("yyyyMMdd") + " " + endDt.ToString("yyyyMMdd") + "] "
                                                 + " 7일이상 조회 혹은 출력 불가입니다. 의료정보개발팀에 문의하십시오 !!", AMessageType.Error);
                return false;
            }
            // 회사코드 입력한 경우, 365 일 이내로
            else if (tDiff.Days > 366 && fcActcust.FindCd.IsNotNull())
            {
                AMessageBox.Show("조회오류!!", "[" + tDiff.Days.ToString() + " " + stDt.ToString("yyyyMMdd") + " " + endDt.ToString("yyyyMMdd") + "] "
                                                 + "회사코드 입력시 1년 까지만 조회 가능합니다. 의료정보개발팀에 문의하십시오 !!", AMessageType.Error);
                return false;
            }

            return true;
        }

        #region ====== ActionEVENTS ======
        /// <summary>
        /// Action버튼 초기셋팅
        /// </summary>
        //private void ActionBtnSetting()
        //{
        //    ActionButtonItems = new List<ActionButtonItem>();

        //    ActionButtonItems.Add(new ActionButtonItem
        //    {
        //        Text = "선택삭제",
        //        Idx = 0,
        //        IsImportant = false,
        //        Permissions = "RW",
        //        ClickAction = OnDeleteAction,
        //        Name = "actDelete"
        //    });

        //    btnAction.Items = ActionButtonItems;
        //}

        /// <summary>
        /// 엑셀저장Action 이벤트
        /// </summary>
        private void OnDeleteAction()
        {
            string patno = "";
            for (int i = grvPbcrCrteRsltBrkdwn.RowCount - 1; i >= 0; i--)
            {
                if (grvPbcrCrteRsltBrkdwn.GetRowCellValue(i, "chck").ToString() != "Y") continue;

                patno = grvPbcrCrteRsltBrkdwn.GetRowCellValue(i, "patno").ToString();

                // 선택행 삭제
                grvPbcrCrteRsltBrkdwn.DeleteRow(i);

                StringBuilder sb = new StringBuilder();

                sb.Append("patno");
                sb.Append(" = ");
                sb.Append(patno);

                DataRow[] foundRows = dtRSLT.Select(sb.ToString());

                for (int j = foundRows.Length - 1; j >= 0; j--)
                {
                    dtRSLT.Rows.Remove(foundRows[j]);
                }

                dtRSLT.AcceptChanges();

            }

            // 순번 재설정
            int num = 0;
            patno = "";
            foreach (DataRow item in dtRSLT.Rows)
            {
                if (patno != item["patno"].ToString())
                {
                    num++;
                    patno = item["patno"].ToString();
                }

                item["rcnt"] = num.ToString();
            }

            dtRSLT.AcceptChanges();

            //리포트 바인딩
            List<DataTable> dtList = new List<DataTable>();
            dtList.Add(dtRSLT);

            rptViewer.BindingDataTableList = dtList;
            rptViewer.OpenReport(@"c:\amis3\temp\" + "rpt" + "VHMGXRS204R01.reb");
        }
        #endregion

        /// <summary>
        /// 공단기준결과내역조회
        /// </summary>
        /// <returns></returns>
        private async Task SvCallLoadPbcrCrteRsltBrkdwnList()
        {
            var searchParam = new PreData();

            searchParam["stdt"] = dtpStartDt.DateTime.ToString("yyyyMMdd");
            searchParam["enddt"] = dtpEndDt.DateTime.ToString("yyyyMMdd");
            searchParam["mddpCd"] = "GHE";

            string heActcustCd = fcActcust.FindCd;

            searchParam["heActcustCd"] = heActcustCd.IsNull() ? "000000000000" : heActcustCd;
            searchParam["heActcustCd2"] = heActcustCd.IsNull() ? "999999999999" : heActcustCd;

            searchParam["doctorCd"] = fcDoctor.FindCd;
            searchParam["wgif"] = chkWGIF.Checked == true ? "Y" : "N";

            var amcDataParam = new AmcData
            {
                preDatas = new PreDatas { { "IPD", searchParam } }
            };

            var responseData = await CommService.CallServiceAsync("SHMGX2010R", amcDataParam, this, LoadingType.BlockSearch);

            if (responseData.IsFail)
            {
                AMessageBox.Show("조회오류!!", responseData.header.message, AMessageType.Error);
                return;
            }

            ShowPbcrCrteRsltBrkdwnList(responseData);
        }

        private void ShowPbcrCrteRsltBrkdwnList(AmcData responseData)
        {
            DataTable dtTtark = responseData.recordSets["ORS_TTAKR"].ToDataTable(false);

            if (dtTtark == null || dtTtark.Rows.Count == 0)
            {
                AMessageBox.Show("확인", responseData.header.message);
                return;
            }

            grdPbcrCrteRsltBrkdwn.DataSource = dtTtark;


            PreDatas pd = responseData.preDatas;

            Dictionary<string, string> parmDic = new Dictionary<string, string>();

            string fromDt = dtpStartDt.DateTime.ToString("yyyy-MM-dd");
            string toDt = dtpEndDt.DateTime.ToString("yyyy-MM-dd");

            string fromToDt = fromDt + " 부터 ~ " + toDt + " 까지";

            parmDic.Add("fromToDt", fromToDt);
-------------------------------------------------------------------------------
            // null referrence exception error 처리
            if (pd["OPD"] != null)
            {
                parmDic.Add("licnsNo", pd["OPD"]["licnsNo"].ToStringDefault());
                parmDic.Add("korNm", pd["OPD"]["korNm"].ToStringDefault());
            }
-------------------------------------------------------------------------------
            dtRSLT = responseData.recordSets["ORS_RSLTLIST"].ToDataTable(false);

            List<DataTable> dtList = new List<DataTable>();
            dtList.Add(dtRSLT);

            rptViewer.BindingDataTableList = dtList;
            rptViewer.BindFieldDic = parmDic;

            rptViewer.OpenReport(@"c:\amis3\temp\" + "rpt" + "VHMGXRS204R01.reb");
        }

        #region 통합코드조회 데이타 취득
        /// <summary>
        /// 통합코드조회 데이타 취득
        /// </summary>
        private void SvCallLoadHeSynthDtlCdList(PreData searchParam)
        {
            var amcDataParam = new AmcData
            {
                preDatas = new PreDatas { { "IPD", searchParam } }
            };

            //판정의사조회 ITEM SearchLookup
            if (searchParam["synthCd"] == "RsltCunslDr")
            {
                var responseData = CommService.CallService("SHMGM2232R", amcDataParam);
                DataTable dtResult = responseData.recordSets["ORS"].ToDataTable(false);

                fcDoctor.GridColumnInfo = new List<FindCdColumnVO> {
                                                new FindCdColumnVO("dtlCd", "의사코드", 100),
                                                new FindCdColumnVO("korNm","의사명",200)};
                fcDoctor.DisplayField = "korNm";
                fcDoctor.ValueField = "dtlCd";
                fcDoctor.DataSource = dtResult;

                // 이승희 의사선생님으로 Default
                const string dcEmpno = "D070637";

                string dcName = dtResult.AsEnumerable()
                                        .Where(r => r.Field<string>("dtlCd") == dcEmpno)
                                        .Select(r => r.Field<string>("korNm"))
                                        .FirstOrDefault() ?? string.Empty;

                if (dcName.IsNotNull())
                {
                    fcDoctor.FindCd = dcEmpno;
                    fcDoctor.FindNm = dcName;
                }
                else
                {
                    fcDoctor.FindCd = "";
                    fcDoctor.FindNm = "";
                }
            }
        }

        /// <summary>
        /// 거래처코드 조회 SearchLookup 초기설정
        /// </summary>
        //private void SvCallLoadActcustCdList()
        //{
        //    var amcDataParam = new AmcData
        //    {
        //        preDatas = new PreDatas { }
        //    };

        //    var responseData = CommService.CallService("SHMGM2041R", amcDataParam); ;
        //    DataTable dtResult = responseData.recordSets["ORS"].ToDataTable(false);

        //    ucHeActcustCd.MGridFileInfo = "heActcustCd,거래처,100,1|actcustNm,거래처명,200,1";
        //    ucHeActcustCd.ValueField = "heActcustCd";
        //    ucHeActcustCd.DisplayField = "actcustNm";
        //    ucHeActcustCd.FindDt = dtResult;
        //}

        /// <summary>
        /// 거래처 목록 조회
        /// </summary>
        private async void SvCallLoadActcustBasicInfo()
        {
            var amcDataParam = new AmcData
            {
                preDatas = new PreDatas { { "IPD", new PreData() } }
            };

            var responseData = await CommService.CallServiceAsync("SHMGZ2013R", amcDataParam, this, LoadingType.BlockLoad);
            if (responseData.IsFail)
            {
                AMessageBox.ShowInstant("초기 코드값 조회 오류");
                return;
            }

            _dtActcustCd = responseData.recordSets["ORS"].ToDataTable(false);

            fcActcust.GridColumnInfo = new List<FindCdColumnVO> {
                                         new FindCdColumnVO("heActcustCd", "거래처", 70),
                                         new FindCdColumnVO("actcustNm","거래처명", 230)};
            fcActcust.DisplayField = "actcustNm";
            fcActcust.ValueField = "heActcustCd";
            fcActcust.DataSource = _dtActcustCd;
        }
        #endregion

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            SvCallLoadActcustBasicInfo();
        }

      
    }
}

위에 표시 해놓은 부분

 // null referrence exception error 처리
            if (pd["OPD"] != null)
            {
                parmDic.Add("licnsNo", pd["OPD"]["licnsNo"].ToStringDefault());
                parmDic.Add("korNm", pd["OPD"]["korNm"].ToStringDefault());
            }

이부분이 문제의 핵심 코드인데 null예외처리를 못해서 애먹었다. 아니 머리가 안돌아가나? 아니면 바본가 진짜
여튼 서버단(elcipse)에서 디버그를 못찍은 내잘못과 정확이 어떤부분이 null이 뜨는지 몰랐고 그다음 어떻게 처리를 해줘야 되는지 몰랐다(심지어 테이블을 분석했으니..)
여튼 에러가 뜨면 에러만 제거하면 된다
하.. try catch문이라니..... 대리님께 너무 부끄럽다.

이클립스 디버그 찍는 방법 참고 : https://crazykim2.tistory.com/465

profile
이리저리 생각만 많은 사고뭉치입니다.

0개의 댓글