public static void ClearColorMakers(IBackgroundContext context, LpuExecParams executorParams) { context.ProgressSeparator(); context.ReportProgress(@"УДАЛЕНИЕ МАРКЕРОВ НЕДЕЙСТВИТЕЛЬНЫХ ПОЛИСОВ"); context.ProgressSeparator(); using (var dataContext = new VistaMedDataContext(context)) { var invMarkerType = getInvMarkerType(dataContext); if(invMarkerType != null) { context.ReportProgress(@""); try { dataContext.VistaMed.ExecuteCommand(@"DELETE FROM Client_StatusObservation WHERE statusObservationType_id IS NULL"); dataContext.VistaMed.ExecuteCommand(@"DELETE FROM Client_StatusObservation WHERE statusObservationType_id = {0}", invMarkerType.Id); dataContext.VistaMed.SubmitChanges(); context.ReportProgress(@"Удаление маркеров проведено"); } catch (Exception exception) { context.ReportError(@"{0}", exception.Message); } } else { //context.ReportError(@"Тип маркера недействительного полиса не найден в БД ВистаМед"); } } context.ProgressSeparator('-'); }
public static void CheckPersonal(IBackgroundContext context, DateParams checkPersonalParams) { if (context.CancellationPending) return; var onDate = checkPersonalParams.DateEnd.Date; context.ProgressSeparator(); context.ReportProgress(@"ПРОВЕРКА СПРАВОЧНИКА СОТРУДНИКОВ ВистаМед на {0}", onDate.ToShortDateString()); context.ReportProgress(""); using (var dataContext = new PersonalCheckDataContext(context)) { var dir = Properties.Settings.Default.DataDir; dataContext.Load(context, dir); var vistaPersonal = (from p in dataContext.VistaMed.People where p.RetireDate == null && p.RbSpeciality != null && p.FederalCode != "000-000-000" select p).ToList(); var notFoundPers = (from p in vistaPersonal where !dataContext.DoctorList.Any(x => x.SNILS == p.FederalCode) select p); notFoundPers.ToList().ForEach(x => context.ReportError(@"сотрудник {0} не найден в списке ФРМР", x.ToLongString())); var nonCertPers = (from p in vistaPersonal from d in dataContext.DoctorList where d.SNILS == p.FederalCode && !d.SpecCodes.Contains(p.RbSpeciality.FederalCode) select new {p, d}); nonCertPers.ToList().ForEach(x => context.ReportError(@"сотрудник {0} не сертиф.по спец.""{1}"" (но имеет по ФРМР серт. {2})", x.p.ToLongString(), x.p.RbSpeciality.FederalCode + " " + x.p.RbSpeciality.Name, x.d.CertNames)); var expiredCert = (from p in vistaPersonal from d in dataContext.DoctorList from c in d.LastCertificates() where d.SNILS == p.FederalCode && p.RbSpeciality.FederalCode == c.SPEC_CODE && (onDate < c.CERT_DATE || onDate > c.CERT_DATE.AddYears(5)) select new { p, c }); expiredCert.ToList().ForEach(x => context.ReportError(@"сотрудник {0} имеет просроченный сертификат ""{1}""", x.p.ToLongString(), x.c.ToString())); } context.ProgressSeparator('-'); }
public static void ExportLog(IBackgroundContext context, ExportLogParams args) { var logLines = args.LogText; if (logLines.Length == 0) context.ReportError(@"Протокол пуст"); else { var word = new Application(); word.Visible = true; var templateName = Utils.GetReportFileName(@"Log.doc"); if (File.Exists(templateName)) { var newDoc = word.Documents.Add(templateName); var table = newDoc.Tables[1]; foreach (var logLine in logLines.Where(x => !string.IsNullOrEmpty(x) && x.Length > 8)) { var newRow = table.Rows.Add(); var recTime = logLine.Substring(0, 8); var recText = logLine.Substring(9); newRow.Cells[1].Range.Text = recTime; newRow.Cells[2].Range.Text = recText; if (recText.StartsWith("*")) newRow.Cells[2].Range.Font.Color = WdColor.wdColorBlue; else if (recText.StartsWith(">>")) newRow.Cells[2].Range.Font.Color = WdColor.wdColorRed; else if (recText.Trim().StartsWith("->") || recText.Trim().StartsWith("> ")) newRow.Cells[2].Range.Font.Color = WdColor.wdColorDarkRed; else if (recText.StartsWith("-----")) newRow.Cells[2].Range.Font.Color = WdColor.wdColorGreen; else newRow.Cells[2].Range.Font.Color = WdColor.wdColorAutomatic; } } else { context.ReportError(@"Файл шаблона отчета {0} не найден", templateName); } } }
/// <summary> /// Заполнение формы контроля /// </summary> /// <param name="context"></param> /// <param name="args"></param> /// <param name="methodCaption"></param> /// <param name="fillAction"></param> private static void fillAccountCheckPlan(IBackgroundContext context, MonthParams args, string methodCaption, Action<PageType, Worksheet, MonthParams> fillAction) { context.ProgressSeparator(); context.ReportProgress(methodCaption); context.ProgressSeparator(); string templateName = Path.Combine(Path.GetFullPath(@".\"), string.Format(@"AccountCheckPlan{0}.xls", args.DateEnd.Year)); if (File.Exists(templateName)) { var excel = new Application(); excel.Visible = true; Workbook newDoc = excel.Workbooks.Add(templateName); newDoc.Names.Item(@"Период").RefersToRange.Value2 = Utils.GetPeriodName(args.DateBegin, args.DateEnd); newDoc.Names.Item(@"КоличествоМесяцев").RefersToRange.Value2 = args.DateEnd.Month; excel.ScreenUpdating = false; using (var dataContext = new VistaMedDataContext(context)) { dataContext.VistaMed.Connection.Open(); try { List<PageType> pageTypes = (new PageType[] { new Polyclinic(context, dataContext), new Stacionar(context, dataContext), new Ambulance(context, dataContext) }).ToList(); foreach (Worksheet ws in newDoc.Worksheets.Cast<Worksheet>()) { pageTypes.ForEach(x => fillAction(x, ws, args)); } } finally { dataContext.VistaMed.Connection.Close(); } } excel.ScreenUpdating = true; } else context.ReportError(@"Не найден файл {0}", templateName); context.ProgressSeparator('-'); }
private static void checkDateInOut(IBackgroundContext context, BillsValidatorDataContext dataContext, BillData bill) { if (context.CancellationPending) return; var invalidUsl = (from u in bill.Reestr.USL where u.Kol_Usl == 1 && u.Date_In != u.Date_Out && !(u.CODE_USL.StartsWith("0100") || u.CODE_USL.StartsWith("1000")) && !(u.IsFullStationar || u.IsDayStationar) select u).ToList(); if(invalidUsl.Any()) { context.ReportError(@"Даты начала и окончания услуги не равны при количестве = 1"); invalidUsl.ForEach(x => context.ReportProgress(@" -> {0}", x)); } }
private static void checkForCrossPeriods(IBackgroundContext context, BillsValidatorDataContext dataContext, BillData bill) { if (context.CancellationPending) return; var fullStationar = (from u in bill.Reestr.USL where u.IsFullStationar select u).ToList(); foreach (var usl in fullStationar.TakeWhile(x => !context.CancellationPending)) { var stacUsl = usl; var crossUsl = (from c in bill.Reestr.USL where c != stacUsl && c.PacientRow.PersRow == stacUsl.PacientRow.PersRow && (new DateRange(c.Date_In, c.Date_Out)).Intersects(new DateRange(stacUsl.Date_In, stacUsl.Date_Out)) select c).ToList(); crossUsl = crossUsl.Where(x => !x.IsFullStationar).ToList(); if (crossUsl.Count > 0) { context.ReportError(@" Оказание услуг во время нахождения в кругл.стационаре {0}", stacUsl.PacientRow.ToString()); context.ReportProgress(@" Стац. {0}", stacUsl.ToShortString()); crossUsl.ForEach(x => context.ReportProgress(@" -> {0}", x.ToShortString())); } } }
public static void BuildSvedReport(IBackgroundContext context, MonthAccountParams args) { var dateBegin = args.DateBegin; var dateEnd = args.DateEnd; var miacCode = args.LpuCode; using (var dataConext = new VistaMedDataContext(context)) { var smpBills = (from b in dataConext.VistaMed.Accounts where b.Date >= args.DateBegin.AddDays(15) && b.Date < args.NextMonthBegin.AddDays(15) && b.Contract != null && b.Contract.RbFinance != null && b.Contract.RbFinance.Name.ToLower() == "омс" && (from a in b.AccountItems from s in dataConext.VistaMed.RbServices where a.ServiceId == s.Id && s.Code.StartsWith("162") select a).Any() select b).ToList(); smpBills = smpBills.Where(x => x.AccountType == AccountType.Osm18).ToList(); smpBills = smpBills.Where(x => args.IsValidAccountNumber(x.Number)).ToList(); if (smpBills.Count == 0) context.ReportError(@"Счета ДД за период с {0} по {1} не найдены", dateBegin, dateEnd); else { var templateName = Utils.GetReportFileName(@"SvodSpravOsm18.xls"); if (File.Exists(templateName)) { var excel = new Application(); excel.Visible = true; foreach (var smpBill in smpBills) { var newDoc = excel.Workbooks.Add(templateName); excel.ScreenUpdating = false; var ws = ((Worksheet)newDoc.Worksheets[1]); newDoc.Names.Item(@"ОтчетныйПериод").RefersToRange.Value2 = Utils.GetPeriodName(smpBill.SettleDate.BeginOfMonth(), smpBill.SettleDate); var lpu = dataConext.VistaMed.Organisations.FirstOrDefault(x => x.MiacCode == miacCode); if (lpu != null) { newDoc.Names.Item("ЛПУ").RefersToRange.Value2 = lpu.FullName; newDoc.Names.Item("ФИОРуководителя").RefersToRange.Value2 = lpu.Chief; newDoc.Names.Item("ФИОГлавбуха").RefersToRange.Value2 = lpu.Accountant; } var smo = (from payer in dataConext.VistaMed.Organisations where payer.Id == smpBill.PayerId select payer).FirstOrDefault(); if (smo != null) { newDoc.Names.Item("СМО").RefersToRange.Value2 = smo.FullName; } ReportData colData; var eventList = (from a in smpBill.AccountItems where !a.Deleted && a.Event != null && a.Event.RbResult != null && a.Action != null && a.Action.ActionType != null group a by a.Event into e select e).ToList(); var profActionCodes = new[] { "162043", "162044", "162045", "162046", "162002", "162003", "162005", "162006", "162007", "162008", "162009", "162010" }; var predActionCodes = new[] { "162040", "162041", "162042" }; var txtFileName = Utils.GetOptionsFileName(@"SvedOsm18Services.txt"); if (File.Exists(txtFileName)) { var allLines = File.ReadAllLines(txtFileName, Encoding.GetEncoding(1251)); foreach (var currLine in allLines) { if (currLine.StartsWith(@"Профилактика")) { var lines2 = currLine.Split('='); profActionCodes = lines2[1].Split(','); } if (currLine.StartsWith(@"Предварительные")) { var lines2 = currLine.Split('='); predActionCodes = lines2[1].Split(','); } } } var profList = (from e in eventList where e.Any(a => profActionCodes.Any(x => a.Action.ActionType.Code == x)) select e).ToList(); var predList = (from e in eventList where e.Any(a => predActionCodes.Any(x => a.Action.ActionType.Code == x)) select e).ToList(); var periodList = eventList.Except(profList).Except(predList).ToList(); colData = new ReportData(); colData.Prof = profList.Count; colData.Pred = predList.Count; colData.Period = periodList.Count; fillColumn(ws, colData, 2); colData = new ReportData(); colData.Prof = (from e in profList from a in e select a).Sum(x => x.Sum); colData.Pred = (from e in predList from a in e select a).Sum(x => x.Sum); colData.Period = (from e in periodList from a in e select a).Sum(x => x.Sum); fillColumn(ws, colData, 3); excel.ScreenUpdating = true; ws.Activate(); } } } } context.ProgressSeparator('-'); }
public static void Build(IBackgroundContext context, DdActionListParams args) { using (var dataConext = new VistaMedDataContext(context)) { var dateField = args.SelectByEventDate ? "e.execDate" : "a.endDate"; var sqlInAccount = ""; if (args.InAccount ^ args.NotInAccount) { sqlInAccount = @"EXISTS(SELECT ai.id FROM Account_Item ai WHERE ai.deleted = 0 AND ai.action_id = a.id)"; if (args.NotInAccount) sqlInAccount = "NOT " + sqlInAccount; sqlInAccount = "AND " + sqlInAccount; } string gerderFilter = "1=1"; if (args.IsMan ^ args.IsWoman) { if (args.IsMan) gerderFilter = "c.Sex = 1"; if (args.IsWoman) gerderFilter = "c.Sex = 2"; } var sqlText = string.Format(@"SELECT CONCAT(c.lastName, ' ', c.firstName, ' ', c.patrName) AS ClientFio, c.birthDate AS ClientBirthDate, a.MKB AS Mkb, a.endDate AS ActionDate, aty.code AS ActionCode, aty.name AS ActionName, CONCAT(p.lastName, ' ', p.firstName, ' ', p.patrName) AS PersonFio, p.code AS PersonCode, et.code AS EventCode, et.name AS EventName, CONCAT_WS(' ', pc.lastName, pc.firstName, pc.patrName) AS OperFio FROM Event e JOIN Client c ON c.id = e.client_id JOIN EventType et ON et.id = e.eventType_id AND et.deleted = 0 AND e.deleted = 0 JOIN Action a ON a.event_id = e.id AND a.deleted = 0 JOIN ActionType aty ON aty.id = a.actionType_id AND aty.deleted = 0 LEFT OUTER JOIN Person p ON p.id = a.person_id AND p.deleted = 0 LEFT OUTER JOIN rbSpeciality spec ON spec.id = p.speciality_id LEFT OUTER JOIN Person pc ON pc.id = a.createPerson_id AND pc.deleted = 0 WHERE {7} >= '{0}' AND {7} < '{1}' {2} {3} {4} {5} {6} {8} {9} {10} {11} AND {12} {13} ORDER BY 1", args.DateBegin.SqlStr(), args.DateEnd.AddDays(1).SqlStr(), dataConext.VistaMed.GetMaskSql("aty.code", args.ActionCodes), dataConext.VistaMed.GetMaskSql("aty.name", args.ActionNames), dataConext.VistaMed.GetMaskSql("et.code", args.EventCodes), dataConext.VistaMed.GetMaskSql("et.name", args.EventNames), dataConext.VistaMed.GetMaskSql("CONCAT(p.lastName, ' ', p.firstName, ' ', p.patrName)", args.ExecPersonFio), dateField, sqlInAccount, dataConext.VistaMed.GetMaskSql("spec.federalCode", args.SpecCodes), dataConext.VistaMed.GetMaskSql("spec.name", args.SpecNames), dataConext.VistaMed.GetMaskSql("a.MKB", args.MkbCodes), gerderFilter, (string.IsNullOrEmpty(args.CreatorName) ? "" : "AND CONCAT_WS(' ', pc.lastName, pc.firstName, pc.patrName) LIKE '" + args.CreatorName + "%'") ); var sourceData = dataConext.VistaMed.SelectSqlData<SourceData>(sqlText); if (sourceData.Count == 0) context.ReportError(@"Даные за период с {0} по {1} не найдены", args.DateBegin, args.DateEnd); else { var templateName = Utils.GetReportFileName(@"DdActionList.xls"); if (File.Exists(templateName)) { var excel = new Application(); excel.Visible = true; var newDoc = excel.Workbooks.Add(templateName); excel.ScreenUpdating = false; var ws = ((Worksheet)newDoc.Worksheets[1]); newDoc.Names.Item(@"Период").RefersToRange.Value2 = Utils.GetPeriodName(args.DateBegin, args.DateEnd); var lpu = dataConext.VistaMed.Organisations.FirstOrDefault(x => x.MiacCode == Properties.Settings.Default.LpuMiacCode); if (lpu != null) { newDoc.Names.Item("ЛПУ").RefersToRange.Value2 = lpu.FullName; } var rowIndex = 6; var npp = 1; foreach (var data in sourceData) { var row = (Range) ws.Rows[rowIndex]; var colIndex = 1; ((Range)row.Cells[1, colIndex++]).Value2 = npp; ((Range)row.Cells[1, colIndex++]).Value2 = data.ClientFio; ((Range)row.Cells[1, colIndex++]).Value2 = data.ClientBirthDate; ((Range)row.Cells[1, colIndex++]).Value2 = data.Mkb; ((Range)row.Cells[1, colIndex++]).Value2 = data.ActionDate; ((Range)row.Cells[1, colIndex++]).Value2 = string.Concat(data.ActionCode , " " , data.ActionName); ((Range)row.Cells[1, colIndex++]).Value2 = string.Concat(data.PersonFio, " (", data.PersonCode, ")"); ((Range)row.Cells[1, colIndex++]).Value2 = data.EventName; ((Range)row.Cells[1, colIndex++]).Value2 = data.OperFio; rowIndex++; npp++; } excel.ScreenUpdating = true; ws.Activate(); } } } context.ProgressSeparator('-'); }
private static void verifyStationarBedProfile(IBackgroundContext context, List<Event> allEvents, VistaMedDataContext dataContext, ActionType moveActType, ActionPropertyType bedPropType, string eventKindName) { var eventTypes = from c in dataContext.VistaMed.EventTypes where c.RbMedicalAidType != null && c.RbMedicalAidType.Name == eventKindName select c; var stationarEvents = from e in allEvents where eventTypes.Contains(e.EventType) select e; // мероприятия "Движение" var moveActions = from e in stationarEvents from c in e.Actions where !c.Deleted && c.ActionType == moveActType select new {Event = e, Action = c}; // выборка свойств "койка" var actProp = from c in moveActions from p in c.Action.ActionProperties where p.ActionPropertyType == bedPropType && !p.Deleted select new { Event = c.Event, Action = c.Action, BedProp = p }; // выборка значений "койка" var actBed = (from c in actProp join bedTypedProp in dataContext.VistaMed.ActionPropertyHospitalBeds on c.BedProp.Id equals bedTypedProp.Id select new { c.Event, c.Action, Bed = bedTypedProp.OrgStructureHospitalBed }).ToList(); Func<RbHospitalBedProfile, bool> comparator; if(eventKindName.Contains("Дневной")) comparator = x => x.Name.Contains(" ДС"); else comparator = x => !x.Name.Contains(" ДС"); var wrongBeds = from c in actBed where c.Bed.RbHospitalBedProfile != null && !comparator(c.Bed.RbHospitalBedProfile) select c; var errors = new List<string>(); foreach (var wrongBed in wrongBeds) { errors.Add(string.Format(@"{0}. Неверный тип койки {1}", wrongBed.Event, wrongBed.Bed.RbHospitalBedProfile.Name)); } if (errors.Count > 0) { context.ReportError(@"""{0}""", eventKindName); errors.ForEach(x => context.ReportProgress(@" -> {0}", x)); } }
private static void analyzeErrorsDataSet(IBackgroundContext context, ErrorsAnalyzerDataContext dataContext, SmoErrorDataSet errorDataSet) { context.ProgressSeparator(); context.ReportProgress("РЕВЬЮ {0}", errorDataSet.FileName); var bill = dataContext.Bills.FirstOrDefault( x => x.LFileName == errorDataSet.SourceFileName || x.HFileName == errorDataSet.SourceFileName); if (bill == null) { context.ReportProgress(@"Не найден файл счета {0}", errorDataSet.SourceFileName); return; } if (errorDataSet.PR.Rows.Count == 0) { context.ReportProgress(@"Ошибки не обнаружены", errorDataSet.FileName); return; } if (errorDataSet.SourceFileName.StartsWith("L")) { /* ошибки по списку персон */ foreach (var prRow in errorDataSet.PR) { context.ReportError(@"{0}", prRow); if(prRow.N_ZAP != "") { var pers = bill.Persons.PERS.FirstOrDefault(x => x.ID_PAC == prRow.N_ZAP); if(pers != null) context.ReportProgress(@" -> {0}", pers); } } } else { /* ошибки по услугам */ foreach (var prRow in errorDataSet.PR) { context.ReportError(@"{0}", prRow); if(prRow.OSHIB == "904") { var doc = dataContext.DoctorList.FirstOrDefault( x => x.SNILS == prRow.COMMENT.Substring(prRow.COMMENT.Length - 11)); if(doc != null) context.ReportProgress(@" Доктор {0}", doc.ToString()); } if (prRow.N_ZAP != "") { var zap = bill.Reestr.ZAP.FirstOrDefault(x => x.N_ZAP == prRow.N_ZAP); if (zap != null) { foreach (var sluchRow in zap.GetSLUCHRows()) { context.ReportProgress(@" -> {0}", sluchRow.ToString()); } } } } } }
private static void assignBillNumbers(IBackgroundContext context, VistaMedDataContext dataContext, List<AccountData> billData) { if (billData.Any()) { var fileName = Path.GetFullPath(Settings.Default.BillsListFileName); var excel = new Application(); excel.Visible = true; var wb = excel.Workbooks.Open(fileName); try { var groupKey = ""; var billIndexInGroup = 1; foreach (var bill in billData) { if (groupKey != bill.Name) { groupKey = bill.Name; billIndexInGroup = 1; } var billKey = bill.Name + " " + billIndexInGroup; var year = bill.BillDate.ToString("yyyy"); var ws = wb.Worksheets.Cast<Worksheet>().FirstOrDefault(x => x.Name == year); if (ws != null) { Range keyColumnRange = ws.UsedRange.Columns[6]; Range foundCell = keyColumnRange.Find(billKey); if (foundCell == null) { int lastNum = 0; Range numColumn = ws.UsedRange.Columns[1]; for (int i = numColumn.Cells.Count; i >=1 ; i--) { var numCell = numColumn.Cells[i, 1]; var numVal = numCell.Value2; if (numVal != null) if ( int.TryParse(numVal.ToString(), out lastNum)) break; } lastNum++; var newRowIndex = ws.UsedRange.Rows.Count + 1; var colIndex = 1; ws.Cells.SetCellValue(newRowIndex, colIndex++, lastNum); ws.Cells.SetCellValue(newRowIndex, colIndex++, bill.CreateDate); ws.Cells.SetCellValue(newRowIndex, colIndex++, bill.Name + (billIndexInGroup == 1 ? "" : " #" + billIndexInGroup)); ws.Cells.SetCellValue(newRowIndex, colIndex++, bill.Amount); ws.Cells.SetCellValue(newRowIndex, colIndex++, bill.Summa); ws.Cells.SetCellValue(newRowIndex, colIndex++, billKey); dataContext.VistaMed.ExecuteSql( string.Format(@"UPDATE Account SET number = '{0}' WHERE id = {1}", lastNum, bill.Id)); } } else context.ReportError(@"Не найден лист {0}", year); billIndexInGroup++; } wb.Save(); } finally { dataContext.VistaMed.SubmitChanges(); excel.Quit(); } } else { context.ReportError(@"Счета не найдены"); } }
private static void verifyContracts(IBackgroundContext context, PrevalidatorParams prevalidatorParams, VistaMedDataContext dataContext) { if (context.CancellationPending) return; var errors = (from a in dataContext.VistaMed.Actions let e = a.Event where e.ExecDate != null && e.Contract != null && e.ExecDate >= prevalidatorParams.DateBegin && e.ExecDate <= prevalidatorParams.DateEnd && !dataContext.VistaMed.AccountItems.Any(x => x.EventId == e.Id) && a.Contract != null && a.Contract != e.Contract select new {Event = e, Action = a}).ToList(); var invalidGroups = (from s in errors group s by s.Event into g select g).ToList(); if (invalidGroups.Any()) { context.ReportError(@"Несовпадение договора в талоне и услугах"); foreach (var invalidGroup in invalidGroups) { context.ReportProgress(@" > {0}", invalidGroup.Key); context.ReportProgress(@" > договор события {0}", invalidGroup.Key.Contract.GetFullName(dataContext.VistaMed)); foreach (var action in invalidGroup.Select(x => x.Action)) { var actionStr = (action.ActionType == null ? "" : action.ActionType.Code); context.ReportProgress(@" > договор мероприятия {0} {1}", actionStr, action.Contract.GetFullName(dataContext.VistaMed)); } } } }
//private static void verifyNotInBill(IBackgroundContext context, List<Event> allEvents, List<Action> allActions, VistaMedDataContext dataContext) //{ // var omsEvents = allEvents.Where(x => x.EventType.FinanceId == 2); // if(dataContext.VistaMed.Accounts.Any(x => x.SettleDate == context.)) //} private static void verify1013(IBackgroundContext context, List<Event> allEvents) { context.ReportProgress(@"*** ПРОВЕРКА ТАЛОНОВ ф025-12/у (с 01/10/2013) ***"); // лечебно - диагностические ОМС с 01-10-2013 var ldEvents = (from e in allEvents where (e.EventType.Form == "125" || e.EventType.Form == "225") && e.ExecDate >= new DateTime(2013, 10, 1) && e.Contract != null && e.Contract.RbFinance.Name == "ОМС" orderby e.CreatePersonId select e).ToList(); var errors = new List<string>(); foreach (var ldEvent in ldEvents) { errors.Clear(); var visits = (from v in ldEvent.Visits where !v.Deleted select v).ToList(); if(visits.Count == 0) errors.Add(@"Обращение не содержит ни одного посещения"); // проверка посещений var visitEmptyMkb = from v in visits where string.IsNullOrEmpty(v.MKB) select v; errors.AddRange(visitEmptyMkb.Select(x => string.Format(@"посещение {0} не заполнен МКБ", x.Date.ToShortDateString()))); var newServiceRegEx = new Regex(@"(1000\d\d)|(0100\d\d)"); var visitWrongService = from v in visits where v.RbService != null && newServiceRegEx.IsMatch(v.RbService.Code) select v; errors.AddRange(visitWrongService .Select(x => string.Format(@"посещение {0} указана услуга законченного случая (исправьте на старую)", x.Date.ToShortDateString()))); var lastVisit = visits.OrderBy(x => x.Date).LastOrDefault(); if (lastVisit != null) { var lastVisitDate = lastVisit.Date; var lastDoctors = visits.Where(x => x.Date == lastVisitDate).Select(y => y.PersonId).ToList(); if (!lastDoctors.Contains(ldEvent.ExecPersonId.Value)) { errors.Add(string.Format(@"посещение {0} указан неверный врач", lastVisit.Date.ToShortDateString())); } } var visitEmptyFinanceType = from v in visits where v.RbFinance == null select v; errors.AddRange(visitEmptyFinanceType .Select(x => string.Format(@"посещение {0} не указан тип финансирования", x.Date.ToShortDateString()))); var visitWrongFinanceType = from v in visits where v.RbFinance != null && v.RbFinance.Name != "ОМС" select v; errors.AddRange(visitWrongFinanceType .Select(x => string.Format(@"посещение {0} указан неверный тип финансирования {1}", x.Date.ToShortDateString(), x.RbFinance.Name))); if(visits.Count > 0) { var minVisitDate = (from v in visits select v.Date).Min(); var maxVisitDate = (from v in visits select v.Date).Max(); if(minVisitDate.Date != ldEvent.SetDate.Date) errors.Add(string.Format(@"дата первого посещения {0} <> даты начала талона {1}", minVisitDate.ToShortDateString(), ldEvent.SetDate.ToShortDateString())); if (maxVisitDate.Date != ldEvent.ExecDate.Value.Date) errors.Add(string.Format(@"дата последнего посещения {0} <> даты закрытия талона {1}", maxVisitDate.ToShortDateString(), ldEvent.ExecDate.Value.ToShortDateString())); } if (visits.Count > 1) { var visitEmptyServiceN = from v in visits where v.RbService == null select v; errors.AddRange(visitEmptyServiceN .Select(x => string.Format(@"более одной явки {0} и не указана услуга (укажите 0102XX)", x.Date.ToShortDateString()))); var visitErrCode = from v in visits where v.RbService != null && !v.RbService.Code.StartsWith("0102") && !v.RbService.Code.StartsWith("1002") select v; errors.AddRange(visitErrCode .Select(x => string.Format(@"более одной явки {0} и неверная услуга (укажите 0102XX)", x.Date.ToShortDateString()))); } else { var visitEmptyService1 = from v in visits where v.RbService != null select v; errors.AddRange(visitEmptyService1 .Select(x => string.Format(@"одна явка {0} и указана услуга (не должна)", x.Date.ToShortDateString()))); } var visitInvalidDate1 = from v in visits where v.Date.Date < ldEvent.SetDate.Date select v; errors.AddRange(visitInvalidDate1 .Select(x => string.Format(@"посещение {0} имеет неверную дату (меньше даты начала талона {1})", x.Date.ToShortDateString(), ldEvent.SetDate.ToShortDateString()))); var visitInvalidDate2 = from v in visits where v.Date.Date > ldEvent.ExecDate.Value.Date select v; errors.AddRange(visitInvalidDate2 .Select(x => string.Format(@"посещение {0} имеет неверную дату (больше даты закрытия талона {1})", x.Date.ToShortDateString(), ldEvent.ExecDate.Value.ToShortDateString()))); var diagList = (from d in ldEvent.Diagnostics where !d.Deleted select d).ToList(); if(diagList.Count > 0) { var diagOsn = (from d in diagList where d.DiagnosisTypeId == 1 select d).ToList(); if(diagOsn.Count == 0) errors.Add(@"нет строки основного диагноза"); var diagEmptyMkb = (from d in diagList where string.IsNullOrEmpty(d.Diagnosis.MKB) select d).ToList(); if(diagEmptyMkb.Count > 0) errors.Add(string.Format(@"найдено {0} диагноз(ов) с пустым МКБ", diagEmptyMkb.Count())); var diagEmptyResult = from d in diagList where d.RbDiagnosticResult == null select d; errors.AddRange(diagEmptyResult.Select(x => string.Format(@"диагноз {0} - не заполнен итог лечения", x.Diagnosis.MKB))); } else errors.Add(@"не введено ни одной строки диагноза"); var actList = (from a in ldEvent.Actions where !a.Deleted select a).ToList(); if(actList.Count == 0) { errors.Add(string.Format(@"не введено мероприятие (добавьте в талон через F9)")); } else { var theAction = actList[0]; if(theAction.ActionType != null) { if(visits.Count > 1) { if(!theAction.ActionType.Name.Contains("приемами")) errors.Add(string.Format(@"неверный код мероприятия {0} для нескольких посещений", theAction.ActionType.Code)); } else { if (theAction.ActionType.Name.Contains("приемами")) errors.Add(string.Format(@"неверный код мероприятия {0} для одного посещения", theAction.ActionType.Code)); } if (string.IsNullOrEmpty(theAction.MKB)) errors.Add(string.Format(@"в мероприятии {0} не указан МКБ", theAction.ActionType.Code)); if(theAction.Person_PersonId == null) errors.Add(string.Format(@"в мероприятии {0} не указан исполнитель", theAction.ActionType.Code)); else if (theAction.Person_PersonId != ldEvent.Person_ExecPersonId) errors.Add(string.Format(@"в мероприятии {0} указан неверный исполнитель", theAction.ActionType.Code)); if(!newServiceRegEx.IsMatch(theAction.ActionType.Code)) errors.Add(string.Format(@"в мероприятии {0} указана старая услуга (не услуга законченного случая)", theAction.ActionType.Code)); if (!theAction.EndDate.HasValue) errors.Add(string.Format(@"в мероприятии {0} не указана дата исполнения", theAction.ActionType.Code)); var actionInvalidDate1 = from v in actList where v.EndDate.HasValue && v.EndDate.Value.Date < ldEvent.SetDate.Date && v.ActionType != null select v; errors.AddRange(actionInvalidDate1 .Select(x => string.Format(@"мероприятие {0} имеет неверную дату исполнения {1} (меньше даты начала талона {2})", x.ActionType.Code, x.EndDate.Value.ToShortDateString(), ldEvent.SetDate.ToShortDateString()))); var actionInvalidDate2 = from v in actList where v.EndDate.HasValue && ldEvent.ExecDate.HasValue && v.EndDate.Value.Date > ldEvent.ExecDate.Value.Date && v.ActionType != null select v; errors.AddRange(actionInvalidDate2 .Select(x => string.Format(@"мероприятие {0} имеет неверную дату исполнения {1} (больше даты закрытия талона {2})", x.ActionType.Code, x.EndDate.Value.ToShortDateString(), ldEvent.ExecDate.Value.ToShortDateString()))); if(visits.Count > 1) { var noInterval = from a in actList where a.EndDate.HasValue && a.BegDate.HasValue && a.BegDate.Value.Date > a.EndDate.Value.Date select a; errors.AddRange(noInterval .Select(x => string.Format(@"мероприятие {0} имеет дату исполнения {1} < даты начала {2} (визитов {3})", x.ActionType.Code, x.EndDate.Value.ToShortDateString(), x.BegDate.Value.ToShortDateString(), visits.Count))); } if (visits.Count == 1) { var noInterval = from a in actList where a.EndDate.HasValue && a.BegDate.HasValue && a.BegDate.Value.Date != a.EndDate.Value.Date select a; errors.AddRange(noInterval .Select(x => string.Format(@"мероприятие {0} имеет дату исполнения {1} <> даты начала {2} (визитов {3})", x.ActionType.Code, x.EndDate.Value.ToShortDateString(), x.BegDate.Value.ToShortDateString(), visits.Count))); } } } if (errors.Count > 0) { context.ReportError(@" {0} {1}", ldEvent.EventType.Name, ldEvent); context.ReportProgress(@" -> ввел талон: {0}", ldEvent.Person_CreatePersonId); errors.ForEach(x => context.ReportProgress(@" -> {0}", x)); } } }
private static void verifyViolet(IBackgroundContext context, IList<Event> allEvents) { var violetEvents = (from e in allEvents where e.Client.ClientStatusObservations.Any(x => x.RbStatusObservationClientType != null && x.RbStatusObservationClientType.Code == ColorMakerManager.InvalidPolicyMarkerCode) && e.Contract != null && e.Contract.RbFinance != null && e.Contract.RbFinance.Name.ToLower() == @"омс" select e).ToList(); if(violetEvents.Any()) { context.ReportError(@"ТАЛОНЫ РАЗНЕСЕННЫЕ НА НЕДЕЙСТВИТЕЛЬНЫЕ ПОЛИСЫ"); foreach (var violetEvent in violetEvents) { var policy = violetEvent.Client.ClientPolicies.Last(); context.ReportProgress(@" > {0} {1} {2} {3}", violetEvent, policy.BegDate.ToShortDateString(), #if NOPERSONALDATA policy.Serial.OfChar('N') + " " + policy.Number.OfChar('N'), #else policy.Serial + " " + policy.Number, #endif violetEvent.Person_CreatePersonId.ToLongString()); } } }
private static void verifyStationarPeriods(IBackgroundContext context, List<Event> allEvents, VistaMedDataContext dataContext, ActionType moveActType) { var stationarEvents = from e in allEvents where e.EventType.RbMedicalAidType != null && e.EventType.RbMedicalAidType.Name != null && e.EventType.RbMedicalAidType.Name.ToLower().Contains("стационар") && !e.EventType.RbMedicalAidType.Name.ToLower().Contains("дневной") select e; var moveActions = from e in stationarEvents from c in e.Actions where !c.Deleted && c.ActionType == moveActType select c; var errors = new List<string>(); foreach (var moveAction in moveActions.TakeWhile(x => !context.CancellationPending)) { var dateRange = new DateRange(moveAction.BegDate, moveAction.EndDate); var client = moveAction.Event.Client; var clientActions = (from e in allEvents where e.Client == client && e != moveAction.Event select e).ToList(); var theEvents = (from a in clientActions let dr = new DateRange(a.SetDate, a.ExecDate) where dr.Intersects(dateRange) && (dr.EndDate != dateRange.StartDate) && (dr.EndDate != dateRange.EndDate) select a).ToList(); if (theEvents.Any()) { errors.Add(string.Format(@"СТАЦИОНАР.ТАЛОН '{0}'", moveAction.Event)); errors.Add(string.Format(@" ДВИЖЕНИЕ '{0}'", moveAction)); foreach (var theEvent in theEvents) { errors.Add(string.Format(@" Пересечение периодов '{0}'", theEvent)); } } } if (errors.Count > 0 && !context.CancellationPending) { context.ReportError(@"""{0}""", "ПЕРЕСЕЧЕНИЕ ПЕРИОДОВ"); errors.ForEach(x => context.ReportProgress(@" -> {0}", x)); } }
private static void verifyStationarMovePerson(IBackgroundContext context, List<Action> allActions, VistaMedDataContext dataContext, ActionType moveActType) { var badMoveActions = (from c in allActions where c.ActionType == moveActType && c.Person_SetPersonId != c.Event.Person_ExecPersonId select c).ToList(); var errors = new List<string>(); foreach (var badAction in badMoveActions) { errors.Add(string.Format(@"{0}. Исполнитель в мероприятии ""{1}"" а в талоне ""{2}""", badAction.Event, badAction.Person_PersonId == null ? "не задан" : badAction.Person_PersonId.FIO, badAction.Event.Person_ExecPersonId == null ? "не задан" : badAction.Event.Person_ExecPersonId.FIO)); } if (errors.Count > 0) { context.ReportError(@"СТАЦИОНАР: МЕРОПРИЯТИЯ ДВИЖЕНИЯ С НЕВЕРНЫМ ИСПОЛНИТЕЛЕМ"); errors.ForEach(x => context.ReportProgress(@" -> {0}", x)); } }
private static void verifyStationarLittleStrangerFlag(IBackgroundContext context, List<Event> allEvents, VistaMedDataContext dataContext) { var littleStrangerEvents = (from e in allEvents where e.LittleStrangerId != null select e).ToList(); var errorEvents = from e in littleStrangerEvents from d in e.Diagnostics where d.Diagnosis != null && d.Diagnosis.MKB.StartsWith("O") select new { Event = e, Mkb = d.Diagnosis.MKB}; var errors = new List<string>(); foreach (var badItem in errorEvents) { errors.Add(string.Format(@"{0}. Диагноз {1} для новорожденного. Уберите флаг новорожденного в талоне.", badItem.Event, badItem.Mkb)); } if (errors.Count > 0) { context.ReportError(@"СТАЦИОНАР: Недопустимые диагнозы для новорожденных"); errors.ForEach(x => context.ReportProgress(@" -> {0}", x)); } }
public static void BuildSvedReport(IBackgroundContext context, MonthAccountParams args) { var dateBegin = args.DateBegin; var dateEnd = args.DateEnd; var miacCode = args.LpuCode; using (var dataConext = new VistaMedDataContext(context)) { var smpBills = (from b in dataConext.VistaMed.Accounts where b.Date >= args.DateBegin.AddDays(15) && b.Date < args.NextMonthBegin.AddDays(15) && b.Contract != null && b.Contract.RbFinance != null && b.Contract.RbFinance.Name.ToLower() == "омс" && (from a in b.AccountItems from s in dataConext.VistaMed.RbServices where a.ServiceId == s.Id && (s.Code.StartsWith("161") || s.Code.StartsWith("162")) select a).Any() select b).ToList(); smpBills = smpBills.Where(x => x.AccountType == AccountType.Osm18 && args.IsValidAccountNumber(x.Number) && !x.Number.StartsWith(PlanExecution.ReserveAccountName)).ToList(); if (smpBills.Count == 0) context.ReportError(@"Счета ДД за период с {0} по {1} не найдены", dateBegin, dateEnd); else { var templateName = Utils.GetReportFileName(@"SvedOsm18.xls"); if (File.Exists(templateName)) { var excel = new Application(); excel.Visible = true; var planDataList = loadPlan(excel); var newDoc = excel.Workbooks.Add(templateName); excel.ScreenUpdating = false; var ws = ((Worksheet)newDoc.Worksheets[1]); newDoc.Names.Item(@"ДатаНачала").RefersToRange.Value2 = dateBegin; newDoc.Names.Item(@"ДатаКонца").RefersToRange.Value2 = dateEnd; newDoc.Names.Item(@"ДатаОтчета").RefersToRange.Value2 = DateTime.Today; newDoc.Names.Item(@"ОтчетныйПериод").RefersToRange.Value2 = Utils.GetPeriodName(dateBegin, dateEnd); var lpu = dataConext.VistaMed.Organisations.FirstOrDefault(x => x.MiacCode == miacCode); if (lpu != null) { newDoc.Names.Item("ЛПУ").RefersToRange.Value2 = lpu.FullName; newDoc.Names.Item("ФИОРуководителя").RefersToRange.Value2 = lpu.Chief; newDoc.Names.Item("ФИОГлавбуха").RefersToRange.Value2 = lpu.Accountant; } ReportData colData; colData = new ReportData(); colData.Prof = planDataList.Sum(x => x.Prof); colData.Pred = null; colData.Period = planDataList.Sum(x => x.Period); ; fillColumn(ws, colData, 3); colData = new ReportData(); colData.Prof = planDataList.Where(y => y.Month <= dateEnd.Month).Sum(x => x.Prof); colData.Pred = null; colData.Period = planDataList.Where(y => y.Month <= dateEnd.Month).Sum(x => x.Period); ; fillColumn(ws, colData, 4); var eventList = (from b in smpBills from a in b.AccountItems where !a.Deleted && a.Event != null && a.Event.RbResult != null && a.Action != null && a.Action.ActionType != null group a by a.Event into e select e).ToList(); var profActionCodes = new[] { "162043", "162044", "162045", "162046", "162002", "162003", "162005", "162006", "162007", "162008", "162009", "162010" }; var predActionCodes = new[] { "162040", "162041", "162042" }; var perActionsCodes = new[] { "162060", "162061", "162062"}; var txtFileName = Utils.GetOptionsFileName(@"SvedOsm18Services.txt"); if (File.Exists(txtFileName)) { var allLines = File.ReadAllLines(txtFileName, Encoding.GetEncoding(1251)); foreach (var currLine in allLines) { if (currLine.StartsWith(@"Профилактика")) { var lines2 = currLine.Split('='); profActionCodes = lines2[1].Split(','); } if (currLine.StartsWith(@"Предварительные")) { var lines2 = currLine.Split('='); predActionCodes = lines2[1].Split(','); } if (currLine.StartsWith(@"Периодические")) { var lines2 = currLine.Split('='); perActionsCodes = lines2[1].Split(','); } } } var profList = (from e in eventList where e.Any(a => profActionCodes.Any(x => a.Action.ActionType.Code == x)) select e).ToList(); var predList = (from e in eventList where e.Any(a => predActionCodes.Any(x => a.Action.ActionType.Code == x)) select e).ToList(); var periodList = eventList.Except(profList).Except(predList).ToList(); colData = new ReportData(); colData.Prof = (from e in profList from a in e select a).Sum(x => x.Sum) / 1000; colData.Pred = (from e in predList from a in e select a).Sum(x => x.Sum) / 1000; colData.Period = (from e in periodList from a in e select a).Sum(x => x.Sum) / 1000; fillColumn(ws, colData, 5); colData = new ReportData(); colData.Prof = profList.Count; colData.Pred = predList.Count; colData.Period = periodList.Count; fillColumn(ws, colData, 6); string grName = ""; int grColIndex = 0; grColIndex = 15; grName = @" I группа"; grZd(profList, grName, predList, ws, grColIndex++); grName = @" II группа"; grZd(profList, grName, predList, ws, grColIndex++); grName = @" III группа"; grZd(profList, grName, predList, ws, grColIndex++); grName = @" IV группа"; grZd(profList, grName, predList, ws, grColIndex++); grName = @" V группа"; grZd(profList, grName, predList, ws, grColIndex++); excel.ScreenUpdating = true; ws.Activate(); } } } context.ProgressSeparator('-'); }
/// <summary> /// Провести автоматическую коррекцию реестров (устранить пере(недо)выполнение) по результатам проверки /// </summary> /// <param name="context"></param> /// <param name="args"></param> public static void AutoCorrectAccounts(IBackgroundContext context, AccountCorrectParams args) { context.ProgressSeparator(); context.ReportProgress(@"АВТОМАТИЧЕСКАЯ КОРРЕКТИРОВКА РЕЕСТРОВ В СООТВЕТСТВИИ С ПЛАНАМИ"); context.ProgressSeparator(); // книга планов var excelFileName = args.AccountCheckPlanFileName; if (File.Exists(excelFileName)) { var excel = new Application(); excel.Visible = true; Workbook newDoc; try { context.ReportProgress(@"Открываем файл {0} ...", excelFileName); newDoc = excel.Workbooks.Open(excelFileName); } catch (Exception exception) { newDoc = null; context.ReportError(@"Ошибка открытия файла {0} : {1}", excelFileName, exception.Message); } if (newDoc != null) { // ищем имя КоличествоМесяцев var kolMonthExists = false; for (int i = 1; i <= newDoc.Names.Count; i++) { if (newDoc.Names.Item(i).Name == @"КоличествоМесяцев") { kolMonthExists = true; break; } } if (kolMonthExists) { // сравниваем КоличествоМесяцев из книги с отчетным периодом int kolMonth = (int) newDoc.Names.Item(@"КоличествоМесяцев").RefersToRange.Value2; if (args.DateEnd.Month == kolMonth) { excel.ScreenUpdating = false; using (var dataContext = new VistaMedDataContext(context)) { dataContext.VistaMed.Connection.Open(); // новая транзакция для обеспечения атомарности всех изменений БД для текущего метода dataContext.VistaMed.ActiveTransaction = dataContext.VistaMed.Connection .BeginTransaction(IsolationLevel.ReadCommitted); try { // массив с объектами - типами листов книги List<PageType> pageTypes = (new PageType[] { new Polyclinic(context, dataContext), new Stacionar(context, dataContext), new Ambulance(context, dataContext) }).ToList(); // сканируем все листы foreach (Worksheet ws in newDoc.Worksheets.Cast<Worksheet>()) { // попытка обработать текущий лист для всех типов листов // фактическая работа делается в этих объектах pageTypes.ForEach(x => x.AutoCorrectAccounts(ws, args)); } try { dataContext.VistaMed.ActiveTransaction.Commit(); context.ReportProgress(@"Изменения записаны в БД"); } catch (Exception exception) { dataContext.VistaMed.ActiveTransaction.Rollback(); context.ReportProgress(@"Ошибка записи изменений в БД: {0}", exception.Message); } } finally { dataContext.VistaMed.ActiveTransaction.Dispose(); dataContext.VistaMed.ActiveTransaction = null; dataContext.VistaMed.Connection.Close(); } } excel.ScreenUpdating = true; } else context.ReportError(@"КоличествоМесяцев в файле не соответствует выбранному Вами периоду"); } else context.ReportError(@"Имя ячейки ""КоличествоМесяцев"" не найдено в файле {0}", excelFileName); newDoc.Close(false); } } else context.ReportError(@"Файл {0} не найден", excelFileName); context.ProgressSeparator('-'); }
private static void verifyDispanDd14(IBackgroundContext context, PrevalidatorParams args, IEnumerable<Event> allEvents) { if (context.CancellationPending) return; context.ReportProgress(@"Проверка диспансеризации детей 14 летних"); if (dsServices == null) { loadDdServices(); } var eventCodes = new[] { "ДД14лет" }; var actionComplexPrefix = @"Комплексная услуга на"; var regExAgeList = new Regex(@"\(.*\)"); var ddsEvents = from e in allEvents where eventCodes.Contains(e.EventType.Code) select e; var errors = new List<string>(); foreach (var ddsEvent in ddsEvents) { errors.Clear(); var actComplex = (from a in ddsEvent.Actions where a.ActionType != null && a.ActionType.Name.StartsWith(actionComplexPrefix) select a).ToList(); Action complexService = null; if (!actComplex.Any()) { errors.Add(string.Format(@"Не найдена ""{0}""", actionComplexPrefix)); } else { if (actComplex.Count() > 1) errors.Add(@"Определено более одной комплексной услуги"); else { complexService = actComplex.First(); var emptyIspoln = (from a in ddsEvent.Actions where a.ActionType != null && a.Person_PersonId == null select a).ToList(); errors.AddRange(emptyIspoln.Select(action => string.Format(@"Не задан исполнитель услуги {0}", action.ActionType.Code))); var emptySpec = (from a in ddsEvent.Actions where a.ActionType != null && a.Person_PersonId != null && a.Person_PersonId.RbSpeciality == null select a).ToList(); errors.AddRange(emptySpec.Select(action => string.Format(@"Не задана специальность исполнителя услуги {0}", action.ActionType.Code))); if (complexService.Person_PersonId != null && complexService.Person_PersonId.RbSpeciality != null) { var specCode = complexService.Person_PersonId.RbSpeciality.FederalCode; var validSpecCodes = new List<string> { "1134" }; if (!validSpecCodes.Contains(specCode)) errors.Add( string.Format(@"Неверная специальность исполнителя комплексной услуги {0} {1}", specCode, complexService.Person_PersonId.FIO)); } var serviceName = complexService.ActionType.Name; if (ddsEvent.ExecDate.HasValue) { if (regExAgeList.IsMatch(serviceName)) { var ddYear = ddsEvent.ExecDate.Value.Year - 14; if (ddsEvent.Client.BirthDate.Year != ddYear) { errors.Add(string.Format(@"Год рождения пациента {0} не равен {1}", ddsEvent.Client.BirthDate.Year, ddYear)); } } var longServices = from a in ddsEvent.Actions where a.EndDate != a.BegDate select a; errors.AddRange(longServices.Select(longService => string.Format(@"Услуга {0} имеет дату окончания не равную дате начала", longService.ActionType.Code))); var oldServices = (from a in ddsEvent.Actions where a.BegDate < args.DateBegin select a).ToList(); foreach (var oldService in oldServices) { var maxServiceAgeMonth = oldService.ActionType.Code.EndsWith("61021") ? 12 : 1; if (oldService.BegDate != null && oldService.BegDate.Value < ddsEvent.SetDate.AddMonths(-maxServiceAgeMonth)) { errors.Add(string.Format(@"Анализ просрочен {0}", oldService.ActionType.Code)); } } var dupActions = (from a in ddsEvent.Actions group a by a.ActionType into g where g.Count() > 1 select g); foreach (var dupAction in dupActions) { errors.Add(string.Format(@"Найдено более одного ({0}) мероприятия с кодом {1}", dupAction.Count(), dupAction.Key.Code)); } /* объемы */ var ddrServiceIfo = (from d in dsServices where d.EventCode == ddsEvent.EventType.Code && d.Gender == ddsEvent.Client.Sex select d).FirstOrDefault(); if (ddrServiceIfo != null) { var ageServices = (from c in ddrServiceIfo.AgeServicesList from s in c.ServiceCodes where 14 >= c.AgeBegin && 14 <= c.AgeEnd select s).Distinct().ToList(); if (ageServices.Count > 0) { var minCount = ageServices.Count; var effectiveActions = (from a in ddsEvent.Actions where ageServices.Contains(a.ActionType.Code) select a).ToList(); if (effectiveActions.Count < minCount) { var candidates = string.Join(",", ageServices.Except(effectiveActions.Select(x => x.ActionType.Code))); errors.Add(string.Format(@"Недостаточный объем услуг {0} из {1}. Можно добавить {2}", effectiveActions.Count, minCount, candidates)); } var unavailActions = (from a in ddsEvent.Actions where !ageServices.Contains(a.ActionType.Code) && a != complexService select a).ToList(); if (unavailActions.Count > 0) { errors.Add(string.Format(@"Недопустимые(ое) мероприятия(e) {0} нужно удалить", string.Join(",", unavailActions.Select(x => x.ActionType.Code)))); } } } } } } if (errors.Count > 0) { context.ReportError(@" {0} {1}", ddsEvent.EventType.Code, ddsEvent); if (complexService != null) context.ReportProgress(@" > {0}", complexService); errors.ForEach(x => context.ReportProgress(@" -> {0}", x)); } } }
public static void BuildSvedReport(IBackgroundContext context, MonthAccountParams args) { var dateBegin = args.DateBegin; var dateEnd = args.DateEnd; var miacCode = args.LpuCode; using (var dataConext = new VistaMedDataContext(context)) { var smpBills = (from b in dataConext.VistaMed.Accounts where b.Date >= args.DateBegin.AddDays(15) && b.Date < args.NextMonthBegin.AddDays(15) && b.Contract != null && b.Contract.RbFinance != null && b.Contract.RbFinance.Name.ToLower() == "омс" && (from a in b.AccountItems from s in dataConext.VistaMed.RbServices where a.ServiceId == s.Id && s.Code.StartsWith("062") select a).Any() select b).ToList(); smpBills = smpBills.Where(x => x.AccountType == AccountType.ProfOsm).ToList(); smpBills = smpBills.Where(x => args.IsValidAccountNumber(x.Number)).ToList(); if (smpBills.Count == 0) context.ReportError(@"Счета ДД за период с {0} по {1} не найдены", dateBegin, dateEnd); else { var templateName = Utils.GetReportFileName(@"SvodSpravProf.xls"); if (File.Exists(templateName)) { var excel = new Application(); excel.Visible = true; foreach (var smpBill in smpBills) { var newDoc = excel.Workbooks.Add(templateName); excel.ScreenUpdating = false; var ws = ((Worksheet)newDoc.Worksheets[1]); newDoc.Names.Item(@"ОтчетныйПериод").RefersToRange.Value2 = Utils.GetPeriodName(smpBill.SettleDate.BeginOfMonth(), smpBill.SettleDate); var lpu = dataConext.VistaMed.Organisations.FirstOrDefault(x => x.MiacCode == miacCode); if (lpu != null) { newDoc.Names.Item("ЛПУ").RefersToRange.Value2 = lpu.FullName; newDoc.Names.Item("ФИОРуководителя").RefersToRange.Value2 = lpu.Chief; newDoc.Names.Item("ФИОГлавбуха").RefersToRange.Value2 = lpu.Accountant; } var smo = (from payer in dataConext.VistaMed.Organisations where payer.Id == smpBill.PayerId select payer).FirstOrDefault(); if (smo != null) { newDoc.Names.Item("СМО").RefersToRange.Value2 = smo.FullName; } ReportData colData; var eventList = (from a in smpBill.AccountItems where !a.Deleted && a.Event != null && a.Event.RbResult != null && a.Action != null && a.Action.ActionType != null group a by a.Event into e select e).ToList(); colData = new ReportData(); colData.Prof = eventList.Count; fillColumn(ws, colData, 2); colData = new ReportData(); colData.Prof = (from e in eventList from a in e select a).Sum(x => x.Sum); fillColumn(ws, colData, 3); excel.ScreenUpdating = true; ws.Activate(); } } } } context.ProgressSeparator('-'); }
private static void verifyDispanDdr1(IBackgroundContext context, PrevalidatorParams args, IList<Event> allEvents) { if (context.CancellationPending) return; context.ReportProgress(@"Проверка диспансеризации работающих 2013 (1 этап)"); if(ddServices == null) { loadDdServices(); } var eventCodes = new[] {"dd2013_1"}; const string actionComplexPrefix = @"Комплексная услуга на"; var regExGender = new Regex(@"(мужчины|женщины)"); var regExAgeList = new Regex(@"\(.*\)"); var ddrEvents = from e in allEvents where eventCodes.Contains(e.EventType.Code) select e; var errors = new List<string>(); foreach (var ddrEvent in ddrEvents) { errors.Clear(); var actComplex = (from a in ddrEvent.Actions where a.ActionType != null && a.ActionType.Name.StartsWith(actionComplexPrefix) select a).ToList(); var isDdr2014 = ddrEvent.SetDate < new DateTime(2015, 4, 1); Action complexService = null; if (!actComplex.Any()) { errors.Add(string.Format(@"Не найдена ""{0}""", actionComplexPrefix)); } else { if(actComplex.Count() > 1) errors.Add(@"Определено более одной комплексной услуги"); else { complexService = actComplex.FirstOrDefault(); var emptyIspoln = (from a in ddrEvent.Actions where a.ActionType != null && a.Person_PersonId == null select a).ToList(); errors.AddRange(emptyIspoln.Select(action => string.Format(@"Не задан исполнитель услуги {0}", action.ActionType.Code))); var emptySpec = (from a in ddrEvent.Actions where a.ActionType != null && a.Person_PersonId != null && a.Person_PersonId.RbSpeciality == null select a).ToList(); errors.AddRange(emptySpec.Select(action => string.Format(@"Не задана специальность исполнителя услуги {0}", action.ActionType.Code))); var specCode = "???"; if (complexService != null) { if (complexService.Person_PersonId != null) specCode = complexService.Person_PersonId.RbSpeciality.FederalCode; var validSpecCodes = new List<string> {"27", "16"}; if (!validSpecCodes.Contains(specCode)) errors.Add( string.Format(@"Неверная специальность исполнителя комплексной услуги {0} {1}", specCode, (complexService.Person_PersonId == null ? "???" : complexService.Person_PersonId.FIO))); } var serviceName = complexService == null ? "" : complexService.ActionType.Name; var isNewComplex = regExGender.IsMatch(serviceName); if(string.IsNullOrEmpty(serviceName) || isNewComplex || ddrEvent.ExecDate < new DateTime(2013, 5, 1)) { int gender = ddrEvent.Client.Sex; if (!string.IsNullOrEmpty(serviceName)) { if (isNewComplex) { gender = regExGender.Match(serviceName).Value == @"мужчины" ? 1 : 2; } if (gender > 0 && ddrEvent.Client.Sex != gender) errors.Add(@"Неверный пол пациента"); if (regExAgeList.IsMatch(serviceName)) { var strList = regExAgeList.Match(serviceName).Value; strList = strList.Replace("для возрастов - ", ""); strList = strList.Replace("для возрастов ", ""); strList = strList.Replace(" лет", ""); strList = strList.Substring(1, strList.Length - 2); var clientYear = ddrEvent.Client.BirthDate.Year; if (strList.Contains(",")) { var ageList = strList.Split(',').Select(x => int.Parse(x.Trim())).ToList(); var yearList = ageList.Select(x => complexService.EndDate != null ? complexService.EndDate.Value.Year - x : 0).ToList(); if (!yearList.Contains(clientYear)) { errors.Add( string.Format(@"Год рождения пациента {0} не соответствует допустимым" + @" годам для услуги {1} - {2}", clientYear, complexService.ActionType.Code, string.Join(",", yearList.Select(x => x.ToString())) )); } } else if (strList.Contains("-")) { // 061050 - 061051 strList = strList.Replace(" ", ""); var ageBounds = strList.Split('-').Select(x => int.Parse(x.Trim())).ToList(); for (int i = 0; i < ageBounds.Count; i++) { ageBounds[i] = args.DateEnd.Year - ageBounds[i]; } if (clientYear > ageBounds[0] || clientYear < ageBounds[1]) { errors.Add( string.Format(@"Год рождения пациента {0} не соответствует допустимым" + @" возрастам для услуги {1} - {2}", clientYear, complexService.ActionType.Code, "от " + ageBounds[0] + " до " + ageBounds[1])); } } } } var longServices = from a in ddrEvent.Actions where a.EndDate != a.BegDate && a.ActionType.Code.IsInt() select a; foreach (var longService in longServices) { errors.Add(string.Format(@"Услуга {0} имеет дату окончания не равную дате начала", longService.ActionType.Code)); } var oldServices = (from a in ddrEvent.Actions where a.BegDate < args.DateBegin select a).ToList(); var dupActions = (from a in ddrEvent.Actions group a by a.ActionType into g where g.Count() > 1 select g); foreach (var dupAction in dupActions) { errors.Add(string.Format(@"Найдено более одного ({0}) мероприятия с кодом {1}", dupAction.Count(), dupAction.Key.Code)); } /* объемы */ var theEvent = ddrEvent; var ddrServiceIfo = (from d in (isDdr2014 ? ddServices2014 : ddServices) where d.EventCode == theEvent.EventType.Code && d.Gender == gender select d).FirstOrDefault(); if(ddrServiceIfo != null) { if (theEvent.ExecDate != null) { var age = theEvent.ExecDate.Value.Year - ddrEvent.Client.BirthDate.Year; var ageSrv = ddrServiceIfo.AgeServicesList.FirstOrDefault(x => x.Age == age); if(ageSrv != null) { var minCount = ageSrv.ServiceCodes.Count * 0.85; if ((int)minCount < minCount) minCount = ((int)minCount) + 1; if (ageSrv.MinServicesCount > 0) minCount = ageSrv.MinServicesCount; var effectiveActions = (from a in ddrEvent.Actions where ageSrv.ServiceCodes.Contains(a.ActionType.Code) select a).ToList(); if(effectiveActions.Count < minCount) { var candidates = string.Join(",", ageSrv.ServiceCodes.Except( effectiveActions.Select(x => x.ActionType.Code))); errors.Add(string.Format(@"Недостаточный объем услуг {0} из {1}. Можно добавить {2}", effectiveActions.Count, minCount, candidates)); } var unavailActions = (from a in ddrEvent.Actions where !ageSrv.ServiceCodes.Contains(a.ActionType.Code) && !(!a.ActionType.Code.IsInt() || a == complexService) select a).ToList(); if(unavailActions.Count > 0) { errors.Add(string.Format(@"Недопустимые(ое) мероприятия(e) {0} нужно удалить", string.Join(",", unavailActions.Select(x => x.ActionType.Code)))); } } } } } else errors.Add(string.Format(@"Комплексная услуга {0} более не используется", complexService.ActionType.Code)); } } var reexRes = new Regex(@"(рисвоена|пределена) .* гр.*здоровья"); if(ddrEvent.RbResult == null) errors.Add("Не определен результат обращения"); else if(!reexRes.IsMatch(ddrEvent.RbResult.Name)) errors.Add("Недопустимый результат обращения (в результате нет группы здоровья)"); if(errors.Count>0) { context.ReportError(@" dd2013 {0}", ddrEvent); if(complexService != null) context.ReportProgress(@" > {0}", complexService); errors.ForEach(x => context.ReportProgress(@" -> {0}", x)); } } }
public static void BuildSvedProf(IBackgroundContext context, MonthAccountParams args) { var dateBegin = args.DateBegin; var dateEnd = args.DateEnd; var miacCode = args.LpuCode; using (var dataConext = new VistaMedDataContext(context)) { var smpBills = (from b in dataConext.VistaMed.Accounts where b.Date >= args.DateBegin.AddDays(15) && b.Date < args.NextMonthBegin.AddDays(15) && b.Contract != null && b.Contract.RbFinance != null && b.Contract.RbFinance.Name.ToLower() == "омс" && (from a in b.AccountItems from s in dataConext.VistaMed.RbServices where a.ServiceId == s.Id && s.Code.StartsWith("062") select a).Any() select b).ToList(); smpBills = smpBills.Where(x => args.IsValidAccountNumber(x.Number) && !x.Number.StartsWith(PlanExecution.ReserveAccountName)).ToList(); if (smpBills.Count == 0) context.ReportError(@"Счета ДД за период с {0} по {1} не найдены", dateBegin, dateEnd); else { var excel = new Application(); excel.Visible = true; var plans = loadPlans(excel); var templateName = Utils.GetReportFileName(@"SvedProf.xls"); if (File.Exists(templateName)) { var newDoc = excel.Workbooks.Add(templateName); excel.ScreenUpdating = false; var ws = ((Worksheet) newDoc.Worksheets[1]); newDoc.Names.Item(@"ДатаНачала").RefersToRange.Value2 = dateBegin; newDoc.Names.Item(@"ДатаКонца").RefersToRange.Value2 = dateEnd; newDoc.Names.Item(@"ДатаОтчета").RefersToRange.Value2 = DateTime.Today; newDoc.Names.Item(@"ОтчетныйПериод").RefersToRange.Value2 = Utils.GetPeriodName(dateBegin, dateEnd); var lpu = dataConext.VistaMed.Organisations.FirstOrDefault(x => x.MiacCode == miacCode); if (lpu != null) { newDoc.Names.Item("ЛПУ").RefersToRange.Value2 = lpu.FullName; newDoc.Names.Item("ФИОРуководителя").RefersToRange.Value2 = lpu.Chief; newDoc.Names.Item("ФИОГлавбуха").RefersToRange.Value2 = lpu.Accountant; } var reportColumn = new ReportColumn(); reportColumn.Man = plans.Sum(x => x.Man); reportColumn.Woman = plans.Sum(x => x.Woman); fillReportColumn(ws, reportColumn, 3); reportColumn = new ReportColumn(); reportColumn.Man = plans.Where(y => y.Month == dateEnd.Month).Sum(x => x.Man); reportColumn.Woman = plans.Where(y => y.Month == dateEnd.Month).Sum(x => x.Woman); fillReportColumn(ws, reportColumn, 7); var allevents = (from b in smpBills from a in b.AccountItems where !a.Deleted && a.Event != null && a.Event.Client != null group a by a.Event into e select new {Event = e.Key, Client = e.Key.Client, Summa = e.Sum(x => x.Sum)}).ToList(); var man = (from e in allevents where e.Client.Sex == 1 select e).ToList(); var woman = (from e in allevents where e.Client.Sex == 2 select e).ToList(); reportColumn = new ReportColumn(); reportColumn.Man = man.Sum(x => x.Summa); reportColumn.Woman = woman.Sum(x => x.Summa); fillReportColumn(ws, reportColumn, 8); reportColumn = new ReportColumn(); reportColumn.Man = man.Count(); reportColumn.Woman = woman.Count(); fillReportColumn(ws, reportColumn, 9); excel.ScreenUpdating = true; ws.Activate(); } } } }
private static void generateTotals(Application excel, List<ReestrTotals> totals, List<ErrorZeroSum> errors, ReestrDdParams args, IBackgroundContext context) { var templateName = Utils.GetReportFileName(@"ReestrDdTotals.xls"); if (!File.Exists(templateName)) return; var newDoc = excel.Workbooks.Add(templateName); var ws = newDoc.Worksheets[1]; var allInsurers = (from c in totals select c.InsurerName).Distinct().ToList(); var accountTypes = (from c in totals select c.AccountType).Distinct().ToList(); var headerColIndex = 2; var firstRow = (Range)ws.Rows[1]; foreach (var accountType in accountTypes) { ((Range) firstRow.Cells[1, headerColIndex]).Value2 = Enum.GetName(typeof (AccountType), accountType); headerColIndex++; } var rowIndex = 2; foreach (var insurer in allInsurers) { var row = (Range) ws.Rows[rowIndex]; ((Range) row.Cells[1, 1]).Value2 = insurer; var colIndex = 2; foreach (var accountType in accountTypes) { ((Range)row.Cells[1, colIndex]).Value2 = totals .Where(x => x.AccountType == accountType && x.InsurerName == insurer).Sum(y => y.Kol); colIndex++; } rowIndex++; } var rowItog = (Range)ws.Rows[rowIndex]; ((Range)rowItog.Cells[1, 1]).Value2 = "ИТОГО"; var colIndexItog = 2; foreach (var accountType in accountTypes) { ((Range)rowItog.Cells[1, colIndexItog]).Value2 = totals .Where(x => x.AccountType == accountType).Sum(y => y.Kol); colIndexItog++; } rowIndex += 2; foreach (var error in errors) { var row = (Range)ws.Rows[rowIndex]; ((Range)row.Cells[1, 1]).Value2 = error.Insurer + " " + Enum.GetName(typeof(AccountType), error.AccountType) + " " + error.Fio; rowIndex++; } if (!string.IsNullOrEmpty(args.DirName) && Directory.Exists(args.DirName)) { var fileName = Path.Combine(args.DirName, "Итоги диспансеризации"); try { if (File.Exists(fileName)) File.Delete(fileName); newDoc.SaveAs(fileName); } catch (Exception e) { context.ReportError("Ошибка сохранения файла {0}: {1}", fileName, e.Message); } } }
public static void BuildReestrDd(IBackgroundContext context, ReestrDdParams args) { var dateBegin = args.DateBegin; var dateEnd = args.DateEnd; var miacCode = args.LpuCode; var billNum = args.AccountNumbers; using (var dataConext = new VistaMedDataContext(context)) { var smpBills = (from b in dataConext.VistaMed.Accounts where b.SettleDate >= dateBegin && b.SettleDate <= dateEnd && b.Date == args.CreateDate && b.Contract != null && b.Contract.RbFinance != null && b.Contract.RbFinance.Name.ToLower() == "омс" && (from a in b.AccountItems from s in dataConext.VistaMed.RbServices where a.ServiceId == s.Id && (s.Code.StartsWith("061") || s.Code.StartsWith("161") || s.Code.StartsWith("062") || s.Code.StartsWith("162")) select a).Any() select b).ToList(); if (!string.IsNullOrEmpty(billNum)) { var billNumList = billNum.Split(','); smpBills = smpBills.Where(x => billNumList.Contains(x.Number)).ToList(); } if (smpBills.Count == 0) context.ReportError(@"Счета ДД за период с {0} по {1} не найдены", dateBegin, dateEnd); else { var excel = new Application(); excel.Visible = true; var totals = new List<ReestrTotals>(); var errors = new List<ErrorZeroSum>(); foreach (var smpBill in smpBills) { var templateFileName = @"ReestrDd.xls"; if (smpBill.AccountType == AccountType.DDR2) templateFileName = @"ReestrDd2.xls"; var templateName = Utils.GetReportFileName(templateFileName); var zeroFioList = new List<string>(); if (!File.Exists(templateName)) continue; var newDoc = excel.Workbooks.Add(templateName); excel.ScreenUpdating = false; var ws = ((Worksheet)newDoc.Worksheets[1]); newDoc.Names.Item(@"ДатаНачала").RefersToRange.Value2 = dateBegin; newDoc.Names.Item(@"ДатаКонца").RefersToRange.Value2 = dateEnd; newDoc.Names.Item(@"ДатаОтчета").RefersToRange.Value2 = DateTime.Today; var lpu = dataConext.VistaMed.Organisations.FirstOrDefault(x => x.MiacCode == miacCode); if (lpu != null) { newDoc.Names.Item("ЛПУ").RefersToRange.Value2 = lpu.FullName + " ОГРН " + lpu.OGRN ?? ""; newDoc.Names.Item("ФИОРуководителя").RefersToRange.Value2 = lpu.Chief; newDoc.Names.Item("ФИОГлавбуха").RefersToRange.Value2 = lpu.Accountant; } var smo = (from payer in dataConext.VistaMed.Organisations where payer.Id == smpBill.PayerId select payer).FirstOrDefault(); if (smo != null) { newDoc.Names.Item("СМО").RefersToRange.Value2 = smo.FullName; } newDoc.Names.Item("НомерСчета").RefersToRange.Value2 = smpBill.Number; newDoc.Names.Item("ДатаСчета").RefersToRange.Value2 = smpBill.SettleDate; string ddName = null; string tarifHeader = null; string header13 = null; switch (smpBill.AccountType) { case AccountType.DdVet: ddName = "в рамках первого этапа диспансеризации ветеранов ВОВ и инвалидов"; tarifHeader = "Тариф на плату первого этапа диспансеризации, проведенной застрахованному лицу"; header13 = "Первый этап диспансеризации в объеме, утвержденном Минздравом России, " + "специальность медицинского работника, проводящего диспансеризацию (код)"; break; case AccountType.DDR1: ddName = "в рамках первого этапа диспансеризации определенных групп взрослого населения"; tarifHeader = "Тариф на плату первого этапа диспансеризации, проведенной застрахованному лицу"; header13 = "Первый этап диспансеризации в объеме, утвержденном Минздравом России, " + "специальность медицинского работника, проводящего диспансеризацию (код)"; break; case AccountType.DDR2: ddName = "в рамках второго этапа диспансеризации определенных групп взрослого населения"; tarifHeader = "Стоимость второго этапа диспансеризации, проведенной застрахованному лицу"; header13 = "Второй этап диспансеризации в объеме, утвержденном Минздравом России, " + "специальность медицинского работника, проводящего диспансеризацию (код), " + "тариф на оплату второго этапа диспансеризации, проведенной застрахованному лицу"; break; case AccountType.DDOrhan: ddName = "в рамках диспансеризации детей-сирот и детей, оставшихся без попечения родителей, " + "в том числе усыновленных (удочеренных), принятых под опеку (попечительство), " + "в приемную или патронатную семью"; header13 = "Диспансеризация в объеме утвержденном Минздравом России, " + "специальность медицинского работника, проводящего диспансеризацию (код)"; tarifHeader = "Тариф на оплату диспансеризации проведенной застрахованному лицу"; break; case AccountType.DDHardLive: ddName = "в рамках диспансеризации детей сирот, пребывающих в стационарных учреждениях и детей, " + "находящихся в трудной жизненной ситуации"; header13 = "Диспансеризация в объеме утвержденном Минздравом России, " + "специальность медицинского работника, проводящего диспансеризацию (код)"; tarifHeader = "Тариф на оплату диспансеризации проведенной застрахованному лицу"; break; case AccountType.DD14: break; case AccountType.Osm18: ddName = "в рамках медицинских осмотров несовершеннолетних"; header13 = "Медицинские осмотры несовершеннолетних в объеме, утвержденном Минздравом России, " + "специальность медицинского работника, проводящего медицинские осмотры (код)"; tarifHeader = "Тариф на оплату медицинского осмотра проведенного застрахованному лицу"; break; case AccountType.ProfOsm: ddName = "за проведенные профилактические медицинские осмотры взрослого населения"; header13 = "Медицинские осмотры в объеме, утвержденном Минздравом России, " + "специальность медицинского работника, проводящего профилактический " + "медицинский осмотр (код)"; tarifHeader = "Тариф на оплату профилактических медицинских осмотров, " + "проведенных застрахованному лицу"; break; default: break; } if (!string.IsNullOrEmpty(ddName)) newDoc.Names.Item("НазваниеДД").RefersToRange.Value2 = ddName; if (!string.IsNullOrEmpty(tarifHeader)) newDoc.Names.Item("ЗаголовокТарифа").RefersToRange.Value2 = tarifHeader; if (!string.IsNullOrEmpty(header13)) newDoc.Names.Item("Кол13").RefersToRange.Value2 = header13; var eventGroups = (from accItem in smpBill.AccountItems group accItem by accItem.Event into g orderby g.Key.Client.Fio select g).ToList(); foreach (var eventGroup in eventGroups) { ((Range)ws.Rows[14]).Insert(); ((Range)ws.Rows[15]).Copy(Destination: ((Range)ws.Rows[14])); } var rowIndex = 1; foreach (var eventGroup in eventGroups) { var client = eventGroup.Key.Client; if (client != null) { var newRow = ((Range)ws.Rows[rowIndex + 13]); ((Range)newRow.Cells[1, 1]).Value2 = rowIndex; ((Range)newRow.Cells[1, 2]).Value2 = client.Fio; ((Range)newRow.Cells[1, 3]).Value2 = client.Sex == 1 ? "М" : "Ж"; ((Range)newRow.Cells[1, 4]).Value2 = client.BirthDate; var clientDocId = dataConext.VistaMed.GetClientDocumentId(client.Id); var clientDoc = (from c in dataConext.VistaMed.ClientDocuments where c.Id == clientDocId select c).FirstOrDefault(); if (clientDoc != null) ((Range)newRow.Cells[1, 6]).Value2 = clientDoc.Serial + " " + clientDoc.Number; ((Range)newRow.Cells[1, 7]).Value2 = dataConext.VistaMed.GetClientLocAddress(client.Id); var clientPolicyId = dataConext.VistaMed.GetClientPolicyId(client.Id, 1); var clientPolicy = dataConext.VistaMed.ClientPolicies.FirstOrDefault(x => x.Id == clientPolicyId); ((Range)newRow.Cells[1, 9]).Value2 = client.GetSnilsFormatted(); if (clientPolicy != null) ((Range)newRow.Cells[1, 10]).Value2 = (clientPolicy.Serial + " " + clientPolicy.Number).Trim(); ((Range)newRow.Cells[1, 11]).Value2 = "1"; var diagnosisId = dataConext.VistaMed.GetEventDiagnosis(eventGroup.Key.Id); var mkb = (from d in dataConext.VistaMed.Diagnoses where d.Id == diagnosisId select d.MKB) .FirstOrDefault(); ((Range)newRow.Cells[1, 12]).Value2 = mkb ?? ""; var prnActions = (from item in eventGroup where item.Action != null && (item.Action.ActionType.Name.StartsWith(@"Комплексная услуга") || item.Action.ActionType.Name.StartsWith(@"Комп. услуга") || item.Action.ActionType.Name.StartsWith(@"Осмотр врача")) select item).ToList(); ((Range)newRow.Cells[1, 13]).Value2 = string.Join(" ", prnActions.Select(x => x.Action.ActionType.Code)); ((Range)newRow.Cells[1, 14]).Value2 = string.Join(" ", prnActions.Select(x => x.Action.BegDate.Value.ToShortDateString())); ((Range)newRow.Cells[1, 15]).Value2 = string.Join(" ", prnActions.Select(x => x.Action.EndDate.Value.ToShortDateString())); ((Range)newRow.Cells[1, 16]).Value2 = string.Join(" ", prnActions.Select( x => x.Action.Person_PersonId == null ? "" : x.Action.Person_PersonId.RbSpeciality.FederalCode.PadRight(15))); var colIndex = 17; if (smpBill.AccountType == AccountType.DDR2) { ((Range)newRow.Cells[1, colIndex++]).Value2 = string.Join(" ", prnActions.Select(x => x.Sum.ToString(@"F2"))); } var summa = eventGroup.Sum(x => x.Sum); ((Range) newRow.Cells[1, colIndex++]).Value2 = summa; ((Range)newRow.Cells[1, colIndex++]).Value2 = eventGroup.Key.RbResult.FederalCode; if (Math.Abs(summa) < 0.01) { zeroFioList.Add(eventGroup.Key.Client.Fio + " " + eventGroup.Key.Client.BirthDate.ToShortDateString()); } rowIndex++; } } var totalRow = ((Range)ws.Rows[rowIndex + 13]); ((Range)totalRow.Cells[1, 2]).Value2 = @"ИТОГО"; ((Range)totalRow.Cells[1, 17 + (smpBill.AccountType == AccountType.DDR2 ? 1 : 0)]).Value2 = smpBill.Sum; excel.ScreenUpdating = true; ws.Activate(); afterFill(context, args, dataConext, smpBill, newDoc, totals, eventGroups, errors, zeroFioList); } generateTotals(excel, totals, errors, args, context); } } }
private static List<FomsReportRowData> getFomsReportData(IBackgroundContext context, AccountCorrectParams args, string excelFileName, Application excel) { var result = new List<FomsReportRowData>(); Workbook newDoc; try { context.ReportProgress(@"Открываем файл {0} ...", excelFileName); newDoc = excel.Workbooks.Open(excelFileName); } catch (Exception exception) { newDoc = null; context.ReportError(@"Ошибка открытия файла {0} : {1}", excelFileName, exception.Message); } if (newDoc != null) { // ищем имя КоличествоМесяцев var kolMonthExists = false; for (int i = 1; i <= newDoc.Names.Count; i++) { if (newDoc.Names.Item(i).Name == @"КоличествоМесяцев") { kolMonthExists = true; break; } } if (kolMonthExists) { // сравниваем КоличествоМесяцев из книги с отчетным периодом int kolMonth = (int)newDoc.Names.Item(@"КоличествоМесяцев").RefersToRange.Value2; if (args.DateEnd.Month == kolMonth) { excel.ScreenUpdating = false; using (var dataContext = new VistaMedDataContext(context)) { dataContext.VistaMed.Connection.Open(); try { // массив с объектами - типами листов книги List<PageType> pageTypes = (new PageType[] { new Polyclinic(context, dataContext), new Stacionar(context, dataContext), new Ambulance(context, dataContext) }).ToList(); // сканируем все листы foreach (Worksheet ws in newDoc.Worksheets.Cast<Worksheet>()) { // попытка обработать текущий лист для всех типов листов // фактическая работа делается в этих объектах pageTypes.ForEach(x => x.SelectFomsReportData(ws, args, result)); } } finally { dataContext.VistaMed.Connection.Close(); } } excel.ScreenUpdating = true; } else context.ReportError(@"КоличествоМесяцев в файле не соответствует выбранному Вами периоду"); } else context.ReportError(@"Имя ячейки ""КоличествоМесяцев"" не найдено в файле {0}", excelFileName); newDoc.Close(false); } return result; }
private static void saveReport(IBackgroundContext context, ReestrDdParams args, string insurerName, Account smpBill, Workbook newDoc) { if (!string.IsNullOrEmpty(args.DirName) && Directory.Exists(args.DirName)) { if (!string.IsNullOrEmpty(insurerName)) { var dirName = Path.Combine(args.DirName, insurerName); if (!Directory.Exists(dirName)) { Directory.CreateDirectory(dirName); } var fileName = Path.Combine(dirName, "Реестр " + Enum.GetName(typeof (AccountType), smpBill.AccountType) + " к счету №" + smpBill.Number + " от " + smpBill.SettleDate.ToString("ddMMyy") + " " + insurerName); try { if (File.Exists(fileName)) File.Delete(fileName); newDoc.SaveAs(fileName); } catch (Exception e) { context.ReportError("Ошибка сохранения файла {0}: {1}", fileName, e.Message); } } } }
public static void Build(IBackgroundContext context, DdSpecReportParams args) { using (var dataConext = new VistaMedDataContext(context)) { var sqlText = string.Format(@"SELECT et.code AS EventCode, aty.code AS ActionCode, et.name AS EventName, aty.name AS ActionName, COUNT(DISTINCT a.id) AS Kol FROM Event e JOIN Client c ON c.id = e.client_id AND c.deleted = 0 JOIN EventType et ON et.id = e.eventType_id AND et.deleted = 0 AND e.deleted = 0 JOIN Action a ON a.event_id = e.id AND a.deleted = 0 JOIN ActionType aty ON aty.id = a.actionType_id AND aty.deleted = 0 LEFT OUTER JOIN Person p ON p.id = e.execPerson_id AND p.deleted = 0 LEFT OUTER JOIN rbSpeciality s ON s.id = p.speciality_id WHERE e.execDate >= '{0}' AND e.execDate < '{1}' {2} {3} {4} {5} {6} {7} {8} {9} {10} GROUP BY 1,2 ORDER BY 1,2", (args.FromBeginOfYear ? args.DateBegin.BeginOfYear() : args.DateBegin).SqlStr(), args.DateEnd.AddDays(1).SqlStr(), dataConext.VistaMed.GetMaskSql("aty.code", args.ActionCodesSpec), dataConext.VistaMed.GetMaskSql("aty.name", args.ActionNamesSpec), dataConext.VistaMed.GetMaskSql("et.code", args.EventCodesSpec), dataConext.VistaMed.GetMaskSql("et.name", args.EventNamesSpec), dataConext.VistaMed.GetMaskSql("s.name", args.SpecNames), dataConext.VistaMed.GetMaskSql("aty.code", args.ExcludeActionCodes, true), dataConext.VistaMed.GetMaskSql("aty.name", args.ExcludeActionNames, true), (args.ExcludeZeroAmount ? " AND a.amount > 0": ""), (args.UseOnlyInAccount ? " AND EXISTS(SELECT ai.id FROM Account_Item ai WHERE ai.event_id = e.id AND ai.deleted=0)" : "") ); var sourceData = dataConext.VistaMed.SelectSqlData<SourceData>(sqlText); if (sourceData.Count == 0) context.ReportError(@"Даные за период с {0} по {1} не найдены", args.DateBegin, args.DateEnd); else { var templateName = Utils.GetReportFileName(@"DdSpecReport.xls"); if (File.Exists(templateName)) { var excel = new Application(); excel.Visible = true; var groups = from c in sourceData group c by c.EventName into g select g; foreach (var eventGroup in groups) { var newDoc = excel.Workbooks.Add(templateName); excel.ScreenUpdating = false; var ws = ((Worksheet) newDoc.Worksheets[1]); newDoc.Names.Item(@"Период").RefersToRange.Value2 = Utils.GetPeriodName(args.DateBegin, args.DateEnd); newDoc.Names.Item(@"ТипСобытия").RefersToRange.Value2 = eventGroup.Key; var lpu = dataConext.VistaMed.Organisations.FirstOrDefault( x => x.MiacCode == Properties.Settings.Default.LpuMiacCode); if (lpu != null) { newDoc.Names.Item("ЛПУ").RefersToRange.Value2 = lpu.FullName; } var rowIndex = 6; var npp = 1; foreach (var data in eventGroup) //.Where(x => !x.ActionName.Contains(@"врача-терапевт")) { var row = (Range) ws.Rows[rowIndex]; var colIndex = 1; ((Range) row.Cells[1, colIndex++]).Value2 = npp; ((Range) row.Cells[1, colIndex++]).Value2 = string.Concat(data.ActionCode, " ", data.ActionName); ((Range) row.Cells[1, colIndex++]).Value2 = ""; ((Range) row.Cells[1, colIndex++]).Value2 = data.Kol; rowIndex++; npp++; } excel.ScreenUpdating = true; ws.Activate(); } } } } context.ProgressSeparator('-'); }
/// <summary> /// Заполняем сведения о выполнении заказ-задания /// </summary> /// <param name="context"></param> /// <param name="args"></param> public static void FillFomsReport(IBackgroundContext context, AccountCorrectParams args) { context.ProgressSeparator(); context.ReportProgress(@"ФОРМИРОВАНИЕ СВЕДЕНИЙ О ВЫПОЛНЕНИИ ЗАКАЗ-ЗАДАНИЯ"); context.ProgressSeparator(); // книга планов var excelFileName = args.AccountCheckPlanFileName; if (File.Exists(excelFileName)) { var excel = new Application(); excel.Visible = true; var reportData = getFomsReportData(context, args, excelFileName, excel); if (reportData.Count > 0) { excel.ScreenUpdating = false; using (var dataContext = new VistaMedDataContext(context)) { dataContext.VistaMed.Connection.Open(); var templateName = Path.Combine(Path.GetFullPath(@".\"), @"AccountFomsReport.xls"); Workbook newDoc = excel.Workbooks.Add(templateName); newDoc.Names.Item(@"Период").RefersToRange.Value2 = Utils.GetPeriodName(args.DateBegin, args.DateEnd); var lpu = dataContext.VistaMed.Organisations.FirstOrDefault(x => x.MiacCode == args.LpuCode); if (lpu != null) { newDoc.Names.Item("ЛПУ").RefersToRange.Value2 = lpu.FullName; newDoc.Names.Item("ФИОРуководителя").RefersToRange.Value2 = lpu.Chief; //newDoc.Names.Item("ФИОГлавбуха").RefersToRange.Value2 = lpu.Accountant; } try { var ws = (Worksheet)newDoc.Worksheets[1]; for (int rowIndex = 8; rowIndex < 19; rowIndex++) { var row = (Range)ws.Rows[rowIndex]; var rowName = row.GetCellValue<string>(1, 1); var smoCode = row.GetCellValue<string>(1, 8); if (!string.IsNullOrEmpty(smoCode)) { var rowDataType = (rowName.StartsWith("Плановое") ? FomsReportRowType.Plan : FomsReportRowType.Fact); var rowData = reportData.FirstOrDefault(x => x.SmoCode == smoCode && x.RowType == rowDataType); if (rowData != null) { var colIndex = 2; row.SetCellValue(1, colIndex++, rowData.StacFullCount + rowData.StacApuCount); row.SetCellValue(1, colIndex++, rowData.StacDayCount); row.SetCellValue(1, colIndex++, rowData.EmergencyCount); row.SetCellValue(1, colIndex++, rowData.TreatmentCount); row.SetCellValue(1, colIndex++, rowData.VisitCount + rowData.ProfilacticCount); row.SetCellValue(1, colIndex++, rowData.AmbulanceCount); } } } } finally { dataContext.VistaMed.Connection.Close(); } } excel.ScreenUpdating = true; } } else context.ReportError(@"Файл {0} не найден", excelFileName); context.ProgressSeparator('-'); }
public static void UpdateClientAttaches(IBackgroundContext context, LpuExecParams args) { if (context.CancellationPending) return; context.ProgressSeparator(); context.ReportProgress(@"ОБНОВЛЕНИЕ СВЕДЕНИЙ О ПРИКРЕПЛЕНИИ ЗАСТРАХОВАННЫХ ЛИЦ К ЛПУ"); context.ReportProgress(""); using (var dataContext = new AttacherDataContext(context)) { var dupMiac = (from org in dataContext.VistaMed.Organisations where !string.IsNullOrEmpty(org.MiacCode) group org by org.MiacCode into g select g).Where(x => x.Count() > 1); if (dupMiac.Any()) { foreach (var dupGroup in dupMiac) { context.ReportError(@"В справочнике организаций найдено {0} записей с кодом МИАЦ = {1}", dupGroup.Count(), dupGroup.Key); } context.ReportProgress(@"Пожалуйста устраните указанные ошибки"); } else { dataContext.Load(context, Properties.Settings.Default.DataDir); // словарь организаций по коду МИАЦ var lpuDict = (from lpu in dataContext.VistaMed.Organisations where !lpu.Deleted && !string.IsNullOrEmpty(lpu.MiacCode) select lpu).ToDictionary(x => x.MiacCode); var idOrgDict = (from lpu in dataContext.VistaMed.Organisations where !lpu.Deleted select lpu).ToDictionary(x => x.Id); var errorMiacCodes = new HashSet<string>(); var updateStatements = new List<string>(); var insertStatements = new List<string>(); foreach (var smoData in dataContext.SmoPacients) { context.ReportProgress(@"Обрабатываем СМО {0} - {1} застрахованных лиц ...", smoData.Key, smoData.Value.Count); int smoClientIndex = 0; foreach (var smoPacient in smoData.Value.Where(x => !string.IsNullOrEmpty(x.MCOD))) { if (context.CancellationPending) break; if (lpuDict.ContainsKey(smoPacient.MCOD)) { // выбираем ЛПУ по колу МИАЦ var lpu = lpuDict[smoPacient.MCOD]; // по ДР var clients = dataContext.VistaMed.Clients.Where(x => x.BirthDate == smoPacient.DR).ToList(); // клиенты по фио clients = clients.Where( x => x.LastName.ToUpper() == smoPacient.FAM.ToUpper() && x.FirstName.ToUpper() == smoPacient.IM.ToUpper() && x.PatrName.ToUpper() == smoPacient.OT.ToUpper()) .ToList(); // по ключу clients = clients.Where(x => x.GetKey(dataContext.VistaMed) == smoPacient.Key).ToList(); foreach (var client in clients) { var attachInfo = new AttachInfo(smoPacient, dataContext.VistaMed, lpu); // крайняя по дате запись о прикреплении var attachRec = client.ClientAttaches.OrderByDescending(x => x.BegDate).FirstOrDefault(); // создаем новую запись о прикреплении когда var shouldCreateNew = attachRec == null /* битый ID организации ЛПУ */ || !idOrgDict.ContainsKey(attachRec.LPUId) /* не то ЛПУ и код миац не пустой (при пустом коде миац корректируем последнюю запись о привязке) */ || ((attachInfo.Lpu.Id != attachRec.LPUId) && !string.IsNullOrEmpty(idOrgDict[attachRec.LPUId].MiacCode)); if (shouldCreateNew) attachInfo.CreateAttachRecord(client, insertStatements); else attachInfo.UpdateAttachRecord(attachRec, updateStatements); } } else { if (!errorMiacCodes.Contains(smoPacient.MCOD)) { context.ReportError( @"Код МИАЦ {0} для ЛПУ не найден в справочнике организаций Виста-Мед. Привязка к этому ЛПУ не проводится", smoPacient.MCOD); errorMiacCodes.Add(smoPacient.MCOD); } } smoClientIndex++; if(smoClientIndex%50000 == 0) context.ReportProgress(@"Обработано {0} записей", smoClientIndex); } if (context.CancellationPending) break; else { context.ReportProgress("Записываем изменения в БД ..."); execInsertStatements(insertStatements, dataContext, context); execUpdateStatements(updateStatements, dataContext, context); insertStatements.Clear(); updateStatements.Clear(); } context.ProgressSeparator(); } } } context.ProgressSeparator('-'); }