/// <summary>
        /// 获取一般续打展现数据
        /// </summary>
        /// <param name="idEn">就诊id </param>
        /// <param name="fgLong">长临标识</param>
        /// <param name="pageNum">已打印最后一页的页码,第一页为0</param>
        /// <param name="rowAssist">返回一般打印数据集合标记参数</param>
        /// <returns>返回一般打印数据集合</returns>
        public OrdPrintDO[] GetPreviewContinueOrds(string idEn, FBoolean fgLong, int pageNum, out PrtDORowsAssist rowAssist)
        {
            // 构造请求参数
            OrdPrintParamDTO paramDTO = this.getOrdPrintParamDTO(idEn, fgLong, pageNum, OrdPrintConst.PRINT_MODE_CONTINUE);

            return(getPreviewConAndResOrds(paramDTO, out rowAssist));
        }
 /// <summary>
 /// 获取医嘱打印对象
 /// </summary>
 /// <returns></returns>
 public OrdPrintDataDTO[] GetOrdPrintDataDTOs(OrdPrintParamDTO paramDTO)
 {
     object[] param = new object[] { paramDTO };
     si.url = url;
     OrdPrintDataDTO[] rtn = si.invokeList <OrdPrintDataDTO>("getOrdPrintDataDTOs", param.ToArray());
     return(rtn);
 }
        /// <summary>
        /// 获取指定页码需要补打作废线或停止时间的数据
        /// </summary>
        /// <param name="idEn"></param>
        /// <param name="fgLong"></param>
        /// <param name="pageNum"></param>
        /// <returns></returns>
        private OrdPrintDataDTO[] getCancAndStopSingleOrds(string idEn, FBoolean fgLong, int pageNum)
        {
            //生成新的参数,场景为单页打印
            OrdPrintParamDTO paramDTOCancAndStop = this.getOrdPrintParamDTO(idEn, fgLong, pageNum, OrdPrintConst.PRINT_MODE_SINGLE);

            return(getCancAndStopSingleOrds(paramDTOCancAndStop));
        }
        /// <summary>
        /// 获取一般续打/重整打印展现数据
        /// </summary>
        /// <param name="paramDTO">打印参数</param>
        /// <param name="rowAssist">返回一般打印数据集合标记参数</param>
        /// <returns></returns>
        private OrdPrintDO[] getPreviewConAndResOrds(OrdPrintParamDTO paramDTO, out PrtDORowsAssist rowAssist)
        {
            // 获取待打印数据
            OrdPrintDataDTO[] ordPrintDataDTOsToPrt = ordPrintExtService.GetOrdPrintDataDTOs(paramDTO);

            //待打印数据为空,直接返回
            if (ordPrintDataDTOsToPrt.Length == 0)
            {
                rowAssist = new PrtDORowsAssist(0);
                return(ordPrintDataDTOsToPrt);
            }

            // 获取已打印的最后一页数据
            OrdPrintDO[] ordPrintDOsPrted = this.getPrtedOrdsByPage(paramDTO.Id_en, paramDTO.Fg_long, new List <int>()
            {
                (int)paramDTO.Page_num
            });

            // 获取已打印的最后一页需要补打作废线或停止时间的数据
            OrdPrintDataDTO[] ordPrintDataDTOsPrted = this.getCancAndStopSingleOrds(paramDTO.Id_en, paramDTO.Fg_long, (int)paramDTO.Page_num);

            List <DORowPrtFlags> rowFlagList = new List <DORowPrtFlags>();

            //整合已打印数据、未打印数据,设置标记参数,返回展示数据
            OrdPrintDO[] ordPrintDOsConAndRes = this.mergeOrdPrintDOsConAndRes(ordPrintDOsPrted, ordPrintDataDTOsPrted, ordPrintDataDTOsToPrt, ref rowFlagList, paramDTO.Print_mode == OrdPrintConst.PRINT_MODE_RESET);

            rowAssist = new PrtDORowsAssist(rowFlagList);

            return(ordPrintDOsConAndRes);
        }
        /// <summary>
        /// 单页补打
        /// </summary>
        /// <param name="idEn">就诊id</param>
        /// <param name="fgLong">长临标识</param>
        /// <param name="pageNum">页码</param>
        /// <param name="detailDOAssist">预览辅助参数</param>
        /// <returns></returns>
        public OrdPrintDO[] GetPreviewSignleOrds(string idEn, FBoolean fgLong, int pageNum, out List <OrdPrintDO> ordPrintList, out List <DORowPrtFlags> rowFlagsList, out PrtDORowsAssist detailDOAssist)
        {
            // 构造请求参数
            OrdPrintParamDTO paramDTO = this.getOrdPrintParamDTO(idEn, fgLong, pageNum, OrdPrintConst.PRINT_MODE_SINGLE);

            return(this.getPreviewSingleOrds(paramDTO, out ordPrintList, out rowFlagsList, out detailDOAssist));
        }
        /// <summary>
        /// 获取停止打印展现数据
        /// </summary>
        /// <param name="idEn">就诊id</param>
        /// <param name="fgLong">长临标识</param>
        /// <param name="ordPrintDos">返回停止打印数据</param>
        /// <param name="rowAssist">停止打印预览的辅助参数</param>
        /// <returns>返回停止打印预览数据</returns>
        public OrdPrintDO[] GetPreviewStopOrds(string idEn, FBoolean fgLong, out List <List <OrdPrintDO> > ordPrintList, out List <List <DORowPrtFlags> > dORowPrtFlagsPrintList, out PrtDORowsAssist rowAssist)
        {
            // 构造请求参数
            OrdPrintParamDTO paramDTO = this.getOrdPrintParamDTO(idEn, fgLong, -1, OrdPrintConst.PRINT_MODE_STOP);

            return(this.getPreviewCalAndStpOrds(paramDTO, out ordPrintList, out dORowPrtFlagsPrintList, out rowAssist));
        }
        /// <summary>
        /// 获取已经打印的医嘱页码
        /// </summary>
        /// <param name="aggdos"></param>
        /// <returns></returns>
        public int[] GetPageNums(OrdPrintParamDTO paramDTO)
        {
            List <object> param = new List <object>();

            param.Add(paramDTO);
            si.url = url;
            int[] rtn = si.invokeList <int>("getPageNums", param.ToArray());
            return(rtn);
        }
        /// <summary>
        /// 根据待打印作废医嘱,获取在已打印医嘱中所在页的数据
        /// </summary>
        /// <param name="paramDTO"></param>
        /// <param name="pageNums"></param>
        /// <returns></returns>
        public OrdPrintDO[] GetOrdPrintDOs(OrdPrintParamDTO paramDTO, OrdPrintDataDTO[] printDataDTOs)
        {
            List <object> param = new List <object>();

            param.Add(paramDTO);
            param.Add(printDataDTOs);
            si.url = url;
            OrdPrintDO[] rtn = si.invokeList <OrdPrintDO>("GetOrdPrintDOs", param.ToArray());
            return(rtn);
        }
        /// <summary>
        /// 获取传递到服务端的参数
        /// </summary>
        /// <param name="idEn">就诊Id</param>
        /// <param name="fgLong">长临标识</param>
        /// <param name="pageNum">页码</param>
        /// <param name="printMode">打印模式</param>
        /// <returns></returns>
        private OrdPrintParamDTO getOrdPrintParamDTO(string idEn, FBoolean fgLong, int pageNum, string printMode)
        {
            OrdPrintParamDTO paramDTO = new OrdPrintParamDTO();

            paramDTO.Id_en      = idEn;
            paramDTO.Fg_long    = fgLong;
            paramDTO.Page_num   = pageNum;;
            paramDTO.Print_mode = printMode;

            return(paramDTO);
        }
 /// <summary>
 /// 获取指定页码需要补打作废线或停止时间的数据
 /// </summary>
 /// <param name="paramDTO"></param>
 /// <returns></returns>
 private OrdPrintDataDTO[] getCancAndStopSingleOrds(OrdPrintParamDTO paramDTO)
 {
     return(ordPrintExtService.GetOrdPrintDataDTOs(paramDTO));
 }
        /// <summary>
        /// 获取单页补打展现数据以及打印数据
        /// </summary>
        /// <param name="paramDTO"></param>
        /// <param name="detailDOAssist"></param>
        /// <returns></returns>
        private OrdPrintDO[] getPreviewSingleOrds(OrdPrintParamDTO paramDTO, out List <OrdPrintDO> ordPrintList, out List <DORowPrtFlags> rowFlagsList, out PrtDORowsAssist detailDOAssist)
        {
            //获取指定页码所有已打印的数据
            OrdPrintDO[] ordPrintDOsPrted = this.getPrtedOrdsByPage(paramDTO.Id_en, paramDTO.Fg_long, new List <int> {
                (int)paramDTO.Page_num
            });

            //获取指定页码需要补打作废线or停止时间的数据
            OrdPrintDataDTO[] ordPrintDataDTOsToPrt = getCancAndStopSingleOrds(paramDTO);

            // 需要打印作废标记or停止时间的医嘱集合
            Dictionary <string, OrdPrintDataDTO> ordPrintDataDTOsPrtedDic = new Dictionary <string, OrdPrintDataDTO>();

            foreach (OrdPrintDataDTO dataDTO in ordPrintDataDTOsToPrt)
            {
                if (!ordPrintDataDTOsPrtedDic.ContainsKey(dataDTO.Id_or))
                {
                    ordPrintDataDTOsPrtedDic.Add(dataDTO.Id_or, dataDTO);
                }
            }

            ordPrintList = new List <OrdPrintDO>();
            rowFlagsList = new List <DORowPrtFlags>();
            //设置标记参数
            List <DORowPrtFlags> rowFlagList = new List <DORowPrtFlags>();

            foreach (OrdPrintDO ordPrintDO in ordPrintDOsPrted)
            {
                DORowPrtFlags rowFlag = new DORowPrtFlags();
                rowFlag.AtPageIx       = (int)ordPrintDO.Page_num;
                rowFlag.AtGridRowIx    = (int)ordPrintDO.Row_num;
                rowFlag.TakeGridRowCnt = 0;//单页补打,所有数据都需要打印,行数设为0
                //rowFlag.TakeGridRowCnt = (int)ordPrintDO.Row_cnt;
                //rowFlag.ForceInOneGridRow = ordPrintDO.Fg_reformrow == FBoolean.True;// 重整标识行不换行
                if (ordPrintDO.Fg_reformrow == FBoolean.True)
                {
                    rowFlag.ForceInOneGridRow = true;                            // 重整标识行不换行
                    rowFlag.MarkType          = DORowPrtFlags.ENumMarkType.Text; //重整标记行内容标红
                }
                //根据作废打印标识Fg_canc_prn,判断是否打印过作废线,
                //打印过作废线的同时显示内容和作废线(黑)
                rowFlag.InvalidPrtType = ordPrintDO.Fg_canc_prn == true ? DORowPrtFlags.ENumInvalidPrtType.TextWithDelLine : DORowPrtFlags.ENumInvalidPrtType.NotInvalid;

                rowFlag.IsDataRemedy = (bool)ordPrintDO.Fg_stop_prn;
                //判断在已打印数据中,是否有需要补打作废线or停止时间
                if (ordPrintDO.Id_or != null && ordPrintDataDTOsPrtedDic.ContainsKey(ordPrintDO.Id_or))
                {
                    //需要补打停止时间的:停止时间、医生、护士
                    if (ordPrintDataDTOsPrtedDic[ordPrintDO.Id_or].Fg_chk_stop == true)
                    {
                        rowFlag.IsDataRemedy   = true;
                        ordPrintDO.Fg_chk_stop = FBoolean.True;                                           //停止标识
                        ordPrintDO.Fg_stop_prn = FBoolean.True;                                           //停止打印标识
                        this.setOrdPrintDatetime(ordPrintDataDTOsPrtedDic[ordPrintDO.Id_or], ordPrintDO); //设置停止时间
                    }
                    //需要补打作废线的:作废线(黑)、内容(黑)
                    if (ordPrintDataDTOsPrtedDic[ordPrintDO.Id_or].Fg_chk_canc == true)
                    {
                        ordPrintDO.Fg_chk_canc = FBoolean.True; //作废标识
                        ordPrintDO.Fg_canc_prn = FBoolean.True; //作废打印标识
                        rowFlag.InvalidPrtType = DORowPrtFlags.ENumInvalidPrtType.TextWithDelLine;
                    }

                    ordPrintList.Add(ordPrintDO);
                    rowFlagsList.Add(rowFlag);
                }

                rowFlagList.Add(rowFlag);
            }

            detailDOAssist = new PrtDORowsAssist(rowFlagList);

            return(ordPrintDOsPrted);
        }
        /// <summary>
        /// 获取作废/停止打印展现数据以及打印数据
        /// </summary>
        /// <param name="paramDTO">参数对象,idEn:就诊id,fgLong:长临标识,Print_mode:打印模式</param>
        /// <param name="ordPrintDOList"></param>
        /// <param name="dORowPrtFlagsPrtList"></param>
        /// <param name="rowAssist"></param>
        /// <returns>作废、停止打印预览数据</returns>
        private OrdPrintDO[] getPreviewCalAndStpOrds(OrdPrintParamDTO paramDTO, out List <List <OrdPrintDO> > ordPrintDOList, out List <List <DORowPrtFlags> > dORowPrtFlagsPrtList, out PrtDORowsAssist rowAssist)
        {
            // 获取待打印的作废、停止医嘱数据
            OrdPrintDataDTO[] ordPrintDataDTOsToPrt = ordPrintExtService.GetOrdPrintDataDTOs(paramDTO);

            // 获取需要作废、停止医嘱所在页的已打印全部医嘱数据
            OrdPrintDO[] ordPrintDOsPrted = ordPrintExtService.GetOrdPrintDOs(paramDTO, ordPrintDataDTOsToPrt);

            // 需要打印作废标记or停止时间的医嘱集合
            Dictionary <string, OrdPrintDataDTO> ordPrintDataDTOsPrtedDic = new Dictionary <string, OrdPrintDataDTO>();

            foreach (OrdPrintDataDTO dataDTO in ordPrintDataDTOsToPrt)
            {
                if (!ordPrintDataDTOsPrtedDic.ContainsKey(dataDTO.Id_or))
                {
                    ordPrintDataDTOsPrtedDic.Add(dataDTO.Id_or, dataDTO);
                }
            }

            // 所有展现数据的标记参数
            rowAssist = new PrtDORowsAssist(ordPrintDOsPrted.Length);
            DORowPrtFlags[] doprtflags = rowAssist.GetDoFlagsArr();

            // 用于判断待打印数据是否在一页
            int?pageNum = -1;

            ordPrintDOList       = new List <List <OrdPrintDO> >();
            dORowPrtFlagsPrtList = new List <List <DORowPrtFlags> >();
            List <OrdPrintDO>    prtDataList  = new List <OrdPrintDO>();
            List <DORowPrtFlags> prtFlagsList = new List <DORowPrtFlags>();

            // 对已打印数据设置页码、行号、所在行数、是否已打印作废标记
            for (int i = 0; i < ordPrintDOsPrted.Length; i++)
            {
                doprtflags[i].AtPageIx       = (int)ordPrintDOsPrted[i].Page_num; // 所在页码
                doprtflags[i].AtGridRowIx    = (int)ordPrintDOsPrted[i].Row_num;  // 所在行号
                doprtflags[i].TakeGridRowCnt = (int)ordPrintDOsPrted[i].Row_cnt;  // 所占行数
                //根据作废打印标识Fg_canc_prn,判断是否打印过作废线,
                //打印过作废线的同时显示内容和作废线(置灰),否则只显示内容(置灰)
                doprtflags[i].InvalidPrtType = ordPrintDOsPrted[i].Fg_canc_prn == true ? DORowPrtFlags.ENumInvalidPrtType.HasPrted : DORowPrtFlags.ENumInvalidPrtType.NotInvalid;

                if (ordPrintDOsPrted[i].Id_or != null && ordPrintDataDTOsPrtedDic.ContainsKey(ordPrintDOsPrted[i].Id_or))
                {
                    switch (paramDTO.Print_mode)
                    {
                    case OrdPrintConst.PRINT_MODE_CANCEL:
                        //需要补打作废线的,作废线(黑),内容(置灰)
                        if (ordPrintDataDTOsPrtedDic[ordPrintDOsPrted[i].Id_or].Fg_chk_canc == true)
                        {
                            doprtflags[i].InvalidPrtType = DORowPrtFlags.ENumInvalidPrtType.DelLine;
                            //doprtflags[i].IsDataRemedy = true;
                            ordPrintDOsPrted[i].Fg_chk_canc = FBoolean.True;    //作废核对标识
                            ordPrintDOsPrted[i].Fg_canc_prn = FBoolean.True;    //作废打印标识
                        }
                        break;

                    case OrdPrintConst.PRINT_MODE_STOP:
                        //需要打印停止时间的数据,将补打标识设置true
                        doprtflags[i].IsDataRemedy      = FBoolean.True;
                        ordPrintDOsPrted[i].Fg_chk_stop = FBoolean.True;                                                    //停止核对标识
                        ordPrintDOsPrted[i].Fg_stop_prn = FBoolean.True;                                                    //停止打印标识
                        this.setOrdPrintDatetime(ordPrintDataDTOsPrtedDic[ordPrintDOsPrted[i].Id_or], ordPrintDOsPrted[i]); //设置停止时间
                        break;
                    }

                    if (pageNum != ordPrintDOsPrted[i].Page_num)
                    {
                        pageNum      = ordPrintDOsPrted[i].Page_num;
                        prtDataList  = new List <OrdPrintDO>();
                        prtFlagsList = new List <DORowPrtFlags>();
                        ordPrintDOList.Add(prtDataList);
                        dORowPrtFlagsPrtList.Add(prtFlagsList);
                    }

                    prtDataList.Add(ordPrintDOsPrted[i]);
                    prtFlagsList.Add(doprtflags[i]);
                }
            }

            return(ordPrintDOsPrted);
        }
        /// <summary>
        /// 获取已打印的医嘱页码
        /// </summary>
        /// <param name="idEn">就诊id</param>
        /// <param name="fgLong">长临标识</param>
        /// <returns></returns>
        public int[] GetPageNums(string idEn, FBoolean fgLong)
        {
            OrdPrintParamDTO paramDTO = this.getOrdPrintParamDTO(idEn, fgLong, -1, null);

            return(ordPrintExtService.GetPageNums(paramDTO));
        }