Пример #1
0
 public Claim Get(int id)
 {
     Claim model;
     try
     {
         model = new Claim(id, GetCurUser(), false);
     }
     catch (AccessDenyException ex)
     {
         var resp = new HttpResponseMessage(HttpStatusCode.Conflict)
         {
             Content = new StringContent(ex.Message),
             ReasonPhrase = ex.Message
         };
         throw new HttpResponseException(resp);
     }
     return model;
 }
Пример #2
0
        public HttpResponseMessage GoBack(Claim model)
        {
            HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.Created);

            try
            {
                model.CurUserAdSid = GetCurUser().Sid;
                //model.Save(SetNextState.Back);
                model.Go(false);
                //model.Go2State(SetNextState.Back);
                response.Content = new StringContent(String.Format("{{\"id\":{0},\"sid\":\"{1}\"}}", model.Id, model.Sid));
            }
            catch (Exception ex)
            {
                response = new HttpResponseMessage(HttpStatusCode.OK);
                response.Content = new StringContent(MessageHelper.ConfigureExceptionMessage(ex));

            }
            return response;
        }
Пример #3
0
 public static void RemoteStateChange(int idClaim, string stateSysName, string creatorSid, string descr = null, int? idZipClaim = null)
 {
     var claim = new Claim(idClaim);
     claim.CurUserAdSid = creatorSid;
     if (claim.Id > 0)
     {
         var state = new ClaimState(stateSysName);
         claim.SaveStateStep(state.Id, descr, idZipClaim: idZipClaim);
         //if (stateSysName.ToUpper().Equals("ZIPCL-FAIL"))
         //{
         //    var nextState = new ClaimState("ZIPBUYCANCEL");
         //    claim.SaveStateStep(nextState.Id);
         //}
     }
 }
Пример #4
0
        /// <summary>
        /// Для удаленного создания заявки на ЗИП из системы планирования (ДСУ)
        /// </summary>
        /// <param name="idServiceCame"></param>
        /// <param name="creatorSid"></param>
        /// <returns></returns>
        public static int SaveFromServicePlan4ZipClaim(int idServiceCame)
        {
            var came = new PlanServiceCame(idServiceCame);
            if (!came.NeedZip.HasValue || !came.NeedZip.Value) return 0;
            var claim = new Claim();
            claim.CurUserAdSid = came.CreatorSid;
            claim.IdDevice = came.IdDevice;
            claim.IdContract = came.IdContract;
            claim.IdContractor = came.IdContractor;
            claim.CurUserAdSid = came.CreatorSid;
            claim.IdServiceCame = idServiceCame;
            claim.IdWorkType = Service.WorkType.GetWorkTypeForZipClaim().Id;
            claim.CurAdminSid = came.CreatorSid;
            claim.CurEngeneerSid = came.ServiceEngeneerSid;
            //claim.Descr = came.ZipDescr;

            var sheet = new ServiceSheet();
            sheet.CounterDescr = came.Descr;
            sheet.Descr = came.ZipDescr;
            sheet.AdminSid = came.CreatorSid;
            sheet.EngeneerSid = came.ServiceEngeneerSid;
            sheet.CounterMono = came.Counter;
            sheet.CounterColor = came.CounterColor;
            sheet.ProcessEnabled = came.ProcessEnabled.HasValue ? came.ProcessEnabled.Value : false;
            sheet.DeviceEnabled = came.DeviceEnabled.HasValue ? came.DeviceEnabled.Value : false;
            sheet.ZipClaim = came.NeedZip;
            sheet.NoCounter = came.NoCounter;
            sheet.CounterUnavailable = came.CounterAvailable;
            sheet.IdServiceIssue = -999;

            claim.ServiceSheet4Save = sheet;

            var firstState = new ClaimState("SRVENGWORK");
            int id = claim.Save(firstState);
            claim.Go();
            return id;
        }
Пример #5
0
        /// <summary>
        /// Список доступных для назначения специалистов для заявки в текущем статусе
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public static IEnumerable<KeyValuePair<string, string>> GetSpecialistList(int idClaim)
        {
            var list = new List<KeyValuePair<string, string>>();

            var state = GetClaimCurrentState(idClaim);
            switch (state.SysName)
            {
                case "NEWADD":
                    var wtId = new Claim(idClaim).IdWorkType;
                    if (!wtId.HasValue) throw new ArgumentException("Невозможно выбрать список специалистов. Тип работ не указан.");
                    var wtSysName = new WorkType(wtId.Value).SysName;

                    switch (wtSysName)
                    {
                        case "ДНО":
                        case "НПР":
                        case "ТЭО":
                        case "УТЗ":
                            list = AdHelper.GetUserListByAdGroup(AdGroup.ServiceTech).ToList();
                            break;
                        case "РТО":
                        case "МТС":
                        case "УРМ":
                        case "ЗРМ":
                        case "МДО":
                        case "ИПТ":
                        case "РЗРД":
                        case "ЗНЗЧ":
                            list = AdHelper.GetUserListByAdGroup(AdGroup.ServiceAdmin).ToList();
                            break;
                    }
                    break;
                case "SERVADMSETWAIT":
                    list = AdHelper.GetUserListByAdGroup(AdGroup.ServiceAdmin).ToList();
                    break;
                case "SERVENGSETWAIT":
                case "SRVADMWORK":
                    list = AdHelper.GetUserListByAdGroup(AdGroup.ServiceEngeneer).ToList();
                    break;
            }


            return list;
        }
Пример #6
0
        public static async Task<ListResult<Claim>> GetListAsync(AdUser user, string adminSid = null, string engeneerSid = null, DateTime? dateStart = null, DateTime? dateEnd = null, int? topRows = null, string managerSid = null, string techSid = null, string serialNum = null, int? idDevice = null, bool? activeClaimsOnly = false, int? idClaimState = null, int? clientId = null, string clientSdNum = null, int? claimId = null, string deviceName = null, int? pageNum = null, string groupStates = null, string address = null)
        {
            if (user.Is(AdGroup.ServiceAdmin)) { adminSid = user.Sid; }
            if (user.Is(AdGroup.ServiceEngeneer)) engeneerSid = user.Sid;
            if (user.Is(AdGroup.ServiceManager)) managerSid = user.Sid;
            if (user.Is(AdGroup.ServiceTech)) techSid = user.Sid;

            //!!!!ЕСЛИ МЕНЯЕШЬ ЭТУ ФУНКЦИЮ ПОМИ ЧТО ЕЩЕ НАДО ПОПРАВИТЬ ФУНКЦИЮ ЧУТЬ НИЖЕ 
            if (!topRows.HasValue) topRows = 30;
            if (!pageNum.HasValue)pageNum = 1;

SqlParameter pServAdminSid = new SqlParameter() { ParameterName = "admin_sid", SqlValue = adminSid, SqlDbType = SqlDbType.VarChar };
            SqlParameter pServEngeneerSid = new SqlParameter() { ParameterName = "engeneer_sid", SqlValue = engeneerSid, SqlDbType = SqlDbType.VarChar };
            SqlParameter pDateStart = new SqlParameter() { ParameterName = "date_start", SqlValue = dateStart, SqlDbType = SqlDbType.Date };
            SqlParameter pDateEnd = new SqlParameter() { ParameterName = "date_end", SqlValue = dateEnd, SqlDbType = SqlDbType.Date };
            SqlParameter pTopRows = new SqlParameter() { ParameterName = "top_rows", SqlValue = topRows, SqlDbType = SqlDbType.Int };
            SqlParameter pManagerSid = new SqlParameter() { ParameterName = "manager_sid", SqlValue = managerSid, SqlDbType = SqlDbType.VarChar };
            SqlParameter pTechSid = new SqlParameter() { ParameterName = "tech_sid", SqlValue = techSid, SqlDbType = SqlDbType.VarChar };
            SqlParameter pSerialNum = new SqlParameter() { ParameterName = "serial_num", SqlValue = serialNum, SqlDbType = SqlDbType.NVarChar };
            SqlParameter pIdDevice = new SqlParameter() { ParameterName = "id_device", SqlValue = idDevice, SqlDbType = SqlDbType.Int };
            SqlParameter pActiveClaimsOnly = new SqlParameter() { ParameterName = "active_claims_only", SqlValue = activeClaimsOnly, SqlDbType = SqlDbType.Bit };
            SqlParameter pIdClaimState = new SqlParameter() { ParameterName = "id_claim_state", SqlValue = idClaimState, SqlDbType = SqlDbType.Int };
            SqlParameter pClientId = new SqlParameter() { ParameterName = "id_client", SqlValue = clientId, SqlDbType = SqlDbType.Int };
            SqlParameter pClientSdNum = new SqlParameter() { ParameterName = "client_sd_num", SqlValue = clientSdNum, SqlDbType = SqlDbType.Int };
            SqlParameter pclaimId = new SqlParameter() { ParameterName = "claim_id", SqlValue = claimId, SqlDbType = SqlDbType.Int };
            SqlParameter pDeviceName = new SqlParameter() { ParameterName = "device_name", SqlValue = deviceName, SqlDbType = SqlDbType.NVarChar };
            SqlParameter pPageNum = new SqlParameter() { ParameterName = "page_num", SqlValue = pageNum, SqlDbType = SqlDbType.Int };
            SqlParameter pGroupStates = new SqlParameter() { ParameterName = "group_state_list", SqlValue = groupStates, SqlDbType = SqlDbType.NVarChar };
            SqlParameter pAddress = new SqlParameter() { ParameterName = "address", SqlValue = address, SqlDbType = SqlDbType.NVarChar };
            var dt = Db.Service.ExecuteQueryStoredProcedure("get_claim_list", pServAdminSid, pServEngeneerSid, pDateStart, pDateEnd, pTopRows, pManagerSid, pTechSid, pSerialNum, pIdDevice, pActiveClaimsOnly, pIdClaimState, pClientId, pClientSdNum, pclaimId, pDeviceName, pPageNum, pGroupStates, pAddress);

            int cnt = 0;
            var lst = new List<Claim>();

            if (dt.Rows.Count > 0)
            {
                foreach (DataRow row in dt.Rows)
                {
                    var model = new Claim(row, false, false);
                    lst.Add(model);
                }
                cnt = Db.DbHelper.GetValueIntOrDefault(dt.Rows[0], "total_count");
            }

            // Общее количество
            // var dtCnt = Db.Service.ExecuteQueryStoredProcedure("get_claim_list_count", pServAdminSid, pServEngeneerSid, pDateStart, pDateEnd, pManagerSid, pTechSid, pSerialNum, pIdDevice, pActiveClaimsOnly, pIdClaimState, pClientId);
            //int cnt = 0;
            // if (dtCnt.Rows.Count > 0)
            // {
            //     cnt = Db.DbHelper.GetValueIntOrDefault(dtCnt.Rows[0], "cnt");
            // }

            var result = new ListResult<Claim>(lst, cnt);
            return result;
        }
Пример #7
0
        public void SendMailTo(string message, string subject, int? serviceSheetId = null, params ServiceRole[] mailTo)
        {
            var cl = new Claim(Id, loadObject: false);

            foreach (ServiceRole mt in mailTo)
            {
                List<MailAddress> recipients = new List<MailAddress>();

                if (mt == ServiceRole.CurAdmin)
                {
                    string sid = cl.CurAdminSid;
                    string email = Employee.GetEmailBySid(sid);
                    if (!String.IsNullOrEmpty(email))
                    {
                        recipients.Add(new MailAddress(email));
                    }
                    else
                    {
                        message =
                            $"<p style='color: red; font-size: 14pt'>Сообщение для Сервисного Администратора не может быть доставлено, поэтому в рассылку включен контролер процесса.</p>{message}";
                        recipients.AddRange(AdHelper.GetRecipientsFromAdGroup(AdGroup.ServiceControler));
                    }
                }
                else if (mt == ServiceRole.CurEngeneer)
                {
                    string sid = cl.CurEngeneerSid;
                    string email = Employee.GetEmailBySid(sid);
                    if (!String.IsNullOrEmpty(email))
                    {
                        recipients.Add(new MailAddress(email));
                    }
                    else
                    {
                        message =
                            $"Сообщение для Сервисного Инженера не может быть доставлено, поэтому в рассылку включен контролер процесса.\r\n{message}";
                        recipients.AddRange(AdHelper.GetRecipientsFromAdGroup(AdGroup.ServiceControler));
                    }
                }
                else if (mt == ServiceRole.CurManager)
                {
                    string sid = cl.CurManagerSid;
                    string email = Employee.GetEmailBySid(sid);
                    if (!String.IsNullOrEmpty(email))
                    {
                        recipients.Add(new MailAddress(email));
                    }
                    else
                    {
                        message =
                               $"Сообщение для Менеджера сервисного центра не может быть доставлено, поэтому в рассылку включен контролер процесса.\r\n{message}";
                        recipients.AddRange(AdHelper.GetRecipientsFromAdGroup(AdGroup.ServiceControler));
                    }

                }
                else if (mt == ServiceRole.CurTech)
                {
                    string sid = cl.CurTechSid;
                    string email = Employee.GetEmailBySid(sid);
                    if (!String.IsNullOrEmpty(email))
                    {
                        recipients.Add(new MailAddress(email));
                    }
                    else
                    {
                        message =
                            $"Сообщение для Специалиста Технической Поддержки не может быть доставлено, поэтому в рассылку включен контролер процесса.\r\n{message}";
                        recipients.AddRange(AdHelper.GetRecipientsFromAdGroup(AdGroup.ServiceControler));
                    }
                }
                //else if (mt == ServiceRole.CurTech)
                //{
                //    string sid = cl.CurTechSid;
                //    email = new[] { Employee.GetEmailBySid(sid)};
                //}
                else if (mt == ServiceRole.CurSpecialist)
                {
                    string sid = cl.SpecialistSid;
                    string email = Employee.GetEmailBySid(sid);
                    if (!String.IsNullOrEmpty(email))
                    {
                        recipients.Add(new MailAddress(email));
                    }
                    else
                    {
                        message =
                            $"Сообщение для текущего Специалиста заявки не может быть доставлено, поэтому в рассылку включен контролер процесса.\r\n{message}";
                        recipients.AddRange(AdHelper.GetRecipientsFromAdGroup(AdGroup.ServiceControler));
                    }
                }
                else if (mt == ServiceRole.AllTech)
                {
                    //var emailList = new List<string>();
                    foreach (var item in AdHelper.GetUserListByAdGroup(AdGroup.ServiceTech))
                    {
                        string email = Employee.GetEmailBySid(item.Key);
                        if (!String.IsNullOrEmpty(email))
                        {
                            recipients.Add(new MailAddress(email));
                        }
                        else
                        {
                            message =
                            $"Сообщение для Специалиста Технической Поддержки не может быть доставлено поэтому в рассылку включен контролер процесса.\r\n{message}";
                            recipients.AddRange(AdHelper.GetRecipientsFromAdGroup(AdGroup.ServiceControler));
                        }
                    }
                    //email = emailList.ToArray();
                }
                else if (mt == ServiceRole.ZipConfirm)
                {
                    foreach (var item in AdHelper.GetUserListByAdGroup(AdGroup.ServiceZipClaimConfirm))
                    {
                        string email = Employee.GetEmailBySid(item.Key);
                        if (!String.IsNullOrEmpty(email))
                        {
                            recipients.Add(new MailAddress(email));
                        }
                        else
                        {
                            message =
                            $"Сообщение для Утврерждающего список ЗИП не может быть доставлено поэтому в рассылку включен контролер процесса.\r\n{message}";
                            recipients.AddRange(AdHelper.GetRecipientsFromAdGroup(AdGroup.ServiceControler));
                        }
                    }
                }
                else if (mt == ServiceRole.ServiceSheetEngeneer)
                {
                    string sid = null;
                    if (serviceSheetId.HasValue)
                    {
                        sid = new ServiceSheet(serviceSheetId.Value).EngeneerSid;
                    }
                    string email = Employee.GetEmailBySid(sid);
                    if (!String.IsNullOrEmpty(email))
                    {
                        recipients.Add(new MailAddress(email));
                    }
                    else
                    {
                        message =
                            $"Сообщение для Инженера сервисного листа №{serviceSheetId} не может быть доставлено, поэтому в рассылку включен контролер процесса.\r\n{message}";
                        recipients.AddRange(AdHelper.GetRecipientsFromAdGroup(AdGroup.ServiceControler));
                    }
                }
                else
                {
                    throw new ArgumentException("Указанный получатель не обрабатывается");
                }


                if (recipients.Any()) MessageHelper.SendMailSmtp(subject, message, true, recipients.ToArray());
            }
        }
Пример #8
0
        public static void ServiceSheetIsPayWraped(int serviceSheetId, string creatorSid)
        {
            var ss = new ServiceSheet(serviceSheetId);
            if (ss.IsPayed.HasValue)
            {
                string text;
                string subject;

                if (ss.IsPayed.Value)
                {
                    text = $"Принят сервисный лист №{serviceSheetId} по заявке №%ID% %LINK%";
                    subject = $"[Заявка №%ID%] Принят сервисный лист №{serviceSheetId}";
                    
                }
                else
                {
                    text = $"Не принят сервисный лист №{serviceSheetId} по заявке №%ID%<br />Причина: {ss.NotPayedComment} %LINK%";
                    subject = $"[Заявка №%ID%] Не принят сервисный лист №{serviceSheetId}";
                }
                var cl = new Claim(ss.IdClaim);
                cl.CurUserAdSid = creatorSid;
                cl.SendNote(subject, text, serviceSheetId, ServiceRole.ServiceSheetEngeneer);
                cl.Go();
            }
        }
Пример #9
0
        public static void CreateClaimUnitWork(int idClaim, string creatorSid)
        {
            var claim = new Claim(idClaim, true, true);
            var device = new Device(claim.IdDevice, claim.IdContract);
            var lastServiceSheet = claim.GetLastServiceSheet();
            var zipItemList = lastServiceSheet.GetOrderedZipItemList(null);

            if (zipItemList.Any())//Если ЗИПа нет то заявка не создается
            {
                var zipClaim = new ZipClaim();
                zipClaim.IdDevice = claim.IdDevice;
                zipClaim.SerialNum = claim.Device.SerialNum;
                zipClaim.DeviceModel = claim.Device.ModelName;
                zipClaim.Contractor = claim.ContractorName;
                zipClaim.IdCity = device.IdCity;
                zipClaim.City = device.CityName;
                zipClaim.Address = device.Address;
                zipClaim.Descr = "Заявка создана автоматически из системы Сервис";
                zipClaim.Counter = lastServiceSheet.CounterMono;
                zipClaim.CounterColour = lastServiceSheet.CounterColor;
                zipClaim.IdContractor = claim.IdContractor;
                zipClaim.IdServiceEngeneer = UserUnitProg.GetUserId(lastServiceSheet.EngeneerSid);
                zipClaim.IdEngeneerConclusion = lastServiceSheet.DeviceEnabled ? 1 : 2;
                zipClaim.IdManager = claim.Contract.ManagerIdUnitProg;
                zipClaim.IdServiceAdmin = UserUnitProg.GetUserId(lastServiceSheet.AdminSid);
                zipClaim.ServiceDeskNum = claim.Id.ToString();
                zipClaim.ObjectName = device.ObjectName;
                zipClaim.ContractNum = claim.Contract.Number;
                zipClaim.ContractType = claim.Contract.TypeName;
                zipClaim.ContractorSdNum = claim.ClientSdNum;
                zipClaim.ServiceIdServSheet = lastServiceSheet.Id.ToString();
                zipClaim.ServiceIdClaim = claim.Id.ToString();

                zipClaim.CurUserAdSid = creatorSid;
                zipClaim.SaveUnitProg();

                if (zipItemList != null && zipItemList.Any())
                {
                    foreach (var item in zipItemList)
                    {
                        item.ClaimId = zipClaim.Id;
                        item.CurUserAdSid = creatorSid;
                        item.SaveUnitProg();
                    }
                }

                zipClaim.SetSendStateUnitProg();

                lastServiceSheet.UnitProgZipClaimId = zipClaim.Id;
                lastServiceSheet.SaveUnitProgZipClaimId();
                lastServiceSheet.CurUserAdSid = creatorSid;
                lastServiceSheet.SetOrderedZipItemListRealyOrdered();
            }
        }
Пример #10
0
        /// <summary>
        /// Перевод заявки на следующую стадию
        /// </summary>
        /// <param name="confirm">Подтвердить или отклонить назначение заявки</param>
        public void Go(bool confirm = true)
        {
            if (Id <= 0) throw new ArgumentException("Невозможно предать заявку. Не указан ID заявки.");

            //Save();
            string descr = Empty;
            var currState = GetClaimCurrentState(Id);
            var nextState = new ClaimState();
            bool saveStateInfo = true;
            bool sendNote = false;
            ServiceRole[] noteTo = { ServiceRole.CurSpecialist };
            string noteText = Empty;
            string noteSubject = Empty;
            bool goNext = false;
            bool saveClaim = false;//Метод вызывается из удаленных программ и поэтому не всегда нухно схранять статус

            switch (currState.SysName.ToUpper())//Текущий статус
            {
                //case "NEW":
                //    nextState = new ClaimState("NEWADD");
                //    break;
                case "NEW":
                    goNext = true;
                    saveClaim = true;
                    int? wtId = null;
                    if (!IdWorkType.HasValue)
                    {
                        wtId = new Claim(Id).IdWorkType;
                        if (!wtId.HasValue) throw new ArgumentException("Невозможно определить следующий статус. Тип работ заявки не указан.");
                    }
                    else
                    {
                        wtId = IdWorkType;
                    }
                    var wtSysName = new WorkType(wtId.Value).SysName;
                    descr = $"{Descr}\r\nУстановлен тип работ {wtSysName}\r\nНазначен специалист {AdHelper.GetUserBySid(SpecialistSid).FullName}";

                    switch (wtSysName)
                    {
                        case "ДНО":
                        case "НПР":
                        case "ТЭО":
                        case "УТЗ":
                            nextState = new ClaimState("TECHSET");
                            CurTechSid = SpecialistSid;
                            break;
                        case "РТО":
                        case "МТС":
                        case "УРМ":
                        case "ЗРМ":
                        case "МДО":
                        case "ИПТ":
                        case "РЗРД":
                        case "ЗНЗЧ":
                            nextState = new ClaimState("SERVADMSET");
                            CurAdminSid = SpecialistSid;
                            break;
                    }
                    sendNote = true;
                    noteTo = new[] { ServiceRole.CurSpecialist };
                    noteText = $@"Вам назначена заявка №%ID% %LINK%";
                    noteSubject = $"Назначена заявка №%ID%";
                    
                    break;
                case "TECHSET":
                    goNext = true;
                    saveClaim = true;
                    if (confirm)
                    {
                        nextState = new ClaimState("TECHWORK");
                    }
                    else
                    {
                        descr = $"Отклонено\r\n{Descr}";
                        nextState = new ClaimState("NEW");
                        //Очищаем выбранного специалиста так как статус заявки поменялся
                        Clear(specialist: true, workType: true, tech: true);
                        sendNote = true;
                        noteTo = new[] { ServiceRole.CurAdmin };
                        noteText = $@"Отклонено назначение заявки №%ID% %LINK%";
                        noteSubject = $"Отклонено назначение заявки №%ID%";
                    }
                    break;
                case "TECHWORK":
                    goNext = true;
                    saveClaim = true;
                    if (confirm)
                    {
                        ServiceSheet4Save.IdClaim = Id;
                        if (ServiceSheet4Save == null || ServiceSheet4Save.IdClaim == 0)
                        {
                            throw new ArgumentException("Сервисный лист отсутствует. Операция не завершена!");
                        }

                        ////if (!ServiceSheet4Save.NoTechWork)
                        ////{
                        ServiceSheet4Save.CurUserAdSid = CurUserAdSid;
                        ServiceSheet4Save.EngeneerSid = CurUserAdSid;
                        ServiceSheet4Save.IdServiceIssue = -999;
                        ServiceSheet4Save.Save("TECHWORK");
                        if (ServiceSheet4Save.ProcessEnabled && ServiceSheet4Save.DeviceEnabled)
                        {
                            nextState = new ClaimState("TECHDONE");
                            //Сначала сохраняем промежуточный статус
                            SaveStateStep(nextState.Id);
                            saveStateInfo = false;
                            nextState = new ClaimState("DONE");
                        }
                        else if ((!ServiceSheet4Save.ProcessEnabled || !ServiceSheet4Save.DeviceEnabled) && ServiceSheet4Save.ZipClaim.HasValue && ServiceSheet4Save.ZipClaim.Value)
                        {
                            nextState = new ClaimState("TECHPROCESSED");
                            //Сначала сохраняем промежуточный статус
                            SaveStateStep(nextState.Id);
                            saveStateInfo = false;
                            nextState = new ClaimState("ZIPORDER");

                        }
                        else if ((!ServiceSheet4Save.ProcessEnabled || !ServiceSheet4Save.DeviceEnabled) && (!ServiceSheet4Save.ZipClaim.HasValue || !ServiceSheet4Save.ZipClaim.Value))
                        {

                            nextState = new ClaimState("TECHNODONE");
                            //Сначала сохраняем промежуточный статус
                            SaveStateStep(nextState.Id);
                            saveStateInfo = false;
                            nextState = new ClaimState("SERVADMSETWAIT");
                        }
                    }
                    else
                    {
                        descr = $"{Descr}";
                        nextState = new ClaimState("TECHNOCONTACT");
                        //Сначала сохраняем промежуточный статус
                        SaveStateStep(nextState.Id, descr);
                        saveStateInfo = false;
                        nextState = new ClaimState("SERVADMSETWAIT");
                        Clear(specialist: true);
                    }
                    ////}
                    ////else if (ServiceSheet4Save.NoTechWork)
                    ////{
                    ////    nextState = new ClaimState("NEW");
                    ////    //Очищаем выбранного специалиста так как статус заявки поменялся
                    ////    Clear(specialist: true);
                    ////}
                    break;
                case "SERVADMSETWAIT":
                    goNext = true;
                    saveClaim = true;
                    nextState = new ClaimState("SERVADMSET");
                    sendNote = true;
                    noteTo = new[] { ServiceRole.CurSpecialist };
                    noteText = $@"Вам назначена заявка №%ID% %LINK%";
                    noteSubject = $"Назначена заявка №%ID%";
                    break;
                case "SERVADMSET":
                    goNext = true;
                    if (confirm)
                    {
                        nextState = new ClaimState("SRVADMWORK");
                        CurAdminSid = SpecialistSid;
                    }
                    else
                    {
                        descr = $"Отклонено\r\n{Descr}";
                        nextState = new ClaimState("NEW");
                        //Очищаем выбранного специалиста так как статус заявки поменялся
                        Clear(specialist: true, admin: true);
                        sendNote = true;
                        noteTo = new[] { ServiceRole.CurManager };
                        noteText = $@"Отклонено назначение заявки №%ID% %LINK%";
                        noteSubject = $"Отклонено назначение заявки №%ID%";
                    }
                    break;
                case "SRVADMWORK":
                    goNext = true;
                    saveClaim = true;
                    ServiceIssue4Save.IdClaim = Id;
                    ServiceIssue4Save.Descr = Descr;
                    ServiceIssue4Save.SpecialistSid = SpecialistSid;
                    ServiceIssue4Save.CurUserAdSid = CurUserAdSid;
                    int serviceIssueId = ServiceIssue4Save.Save();
                    CurServiceIssueId = serviceIssueId;//Устанавливает текущий заявку на выезд
                    descr = $"Назначен специалист {AdHelper.GetUserBySid(SpecialistSid).FullName}\r\nДата выезда {ServiceIssue4Save.DatePlan:dd.MM.yyyy}\r\n{Descr}";
                    nextState = new ClaimState("SRVENGSET");
                    CurEngeneerSid = SpecialistSid;
                    sendNote = true;
                    noteTo = new[] { ServiceRole.CurSpecialist };
                    noteText = $@"Вам назначена заявка №%ID% %LINK%";
                    noteSubject = $"Назначена заявка №%ID%";
                    break;
                case "SERVENGSETWAIT":
                    goNext = true;
                    saveClaim = true;
                    nextState = new ClaimState("SRVENGSET");
                    break;
                case "SRVENGSET":
                    goNext = true;
                    saveClaim = true;
                    if (confirm)
                    {
                        nextState = new ClaimState("SRVENGGET");
                        //Сначала сохраняем промежуточный статус
                        SaveStateStep(nextState.Id);
                        saveStateInfo = false;
                        nextState = new ClaimState("SERVENGOUTWAIT");
                    }
                    else
                    {
                        descr = $"Отклонено\r\n{Descr}";
                        nextState = new ClaimState("SRVENGCANCEL");
                        //Сначала сохраняем промежуточный статус
                        SaveStateStep(nextState.Id, descr);
                        saveStateInfo = false;
                        nextState = new ClaimState("SRVADMWORK");
                        Clear(specialist: true, engeneer: true);
                        sendNote = true;
                        noteTo = new[] { ServiceRole.CurAdmin };
                        noteText = $@"Отклонено назначение заявки №%ID% %LINK%";
                        noteSubject = $"Отклонено назначение заявки №%ID%";
                    }
                    break;
                case "SERVENGOUTWAIT":
                    goNext = true;
                    saveClaim = true;
                    nextState = new ClaimState("SRVENGWENT");
                    break;
                case "SRVENGWENT":
                    goNext = true;
                    saveClaim = true;
                    nextState = new ClaimState("SRVENGWORK");
                    break;
                case "SRVENGWORK":
                    goNext = true;
                    saveClaim = true;
                    ServiceSheet4Save.IdClaim = Id;
                    if (ServiceSheet4Save == null || ServiceSheet4Save.IdClaim == 0)
                    { throw new ArgumentException("Сервисный лист отсутствует. Операция не завершена!"); }

                    var cl = new Claim(Id);

                    if (IsNullOrEmpty(ServiceSheet4Save.CurUserAdSid)) ServiceSheet4Save.CurUserAdSid = CurUserAdSid;
                    if (IsNullOrEmpty(ServiceSheet4Save.EngeneerSid))ServiceSheet4Save.EngeneerSid = CurUserAdSid;
                    ServiceSheet4Save.IdServiceIssue = cl.CurServiceIssueId ?? -1;
                    ServiceSheet4Save.Save("SRVENGWORK");

                    if (ServiceSheet4Save.ProcessEnabled && ServiceSheet4Save.DeviceEnabled)
                    {
                        nextState = new ClaimState("DONE");

                    }
                    else if ((!ServiceSheet4Save.ProcessEnabled || !ServiceSheet4Save.DeviceEnabled) && ServiceSheet4Save.ZipClaim.HasValue &&
                             ServiceSheet4Save.ZipClaim.Value)
                    {
                        nextState = new ClaimState("ZIPISSUE");
                    }
                    else if ((!ServiceSheet4Save.ProcessEnabled || !ServiceSheet4Save.DeviceEnabled) && (!ServiceSheet4Save.ZipClaim.HasValue || !ServiceSheet4Save.ZipClaim.Value))
                    {
                        nextState = new ClaimState("ZIPISSUE");
                    }

                    
                    break;
                case "ZIPISSUE":

                    if (!GetLastServiceSheet().GetZipItemList().Any()) throw new Exception("Необходимо заполнить список ЗИП. Сервисный лист не был передан.");
                    goNext = true;
                    saveClaim = true;
                    
                    SpecialistSid = CurUserAdSid;
                    nextState = new ClaimState("ZIPORDER");

                    if (nextState.SysName.Equals("ZIPORDER"))
                    {
                        sendNote = true;
                        noteTo = new[] { ServiceRole.AllTech };
                        noteText = $@"Необходимо заказать ЗИП по заявке №%ID% %LINK%";
                        noteSubject = $"Необходимо заказать ЗИП по заявке №%ID%";
                    }
                    break;
                case "ZIPORDER"://В настоящий момент по этому статусу происходит заказ ЗИП специалистом Тех поддержки
                    if (!GetClaimCurrentState(Id).SysName.Equals("ZIPCLINWORK"))//На всякий случай проверяем еще раз
                    {
                        goNext = true;
                        saveClaim = true;
                        CurTechSid = CurUserAdSid;
                        SpecialistSid = CurUserAdSid;
                        nextState = new ClaimState("ZIPCLINWORK");
                    }
                    else
                    {
                        throw new ArgumentException("Заказ уже в работе.");
                    }
                    break;
                case "ZIPCLINWORK":
                    var curCl = new Claim(Id);
                    if (curCl.SpecialistSid != CurUserAdSid && curCl.CurTechSid != CurUserAdSid) throw new ArgumentException("Заказ уже в работе.");
                    break;
                case "ZIPCHECK":
                    goNext = true;
                    saveClaim = true;
                    nextState = new ClaimState("ZIPCHECKED");
                    break;
                case "ZIPCHECKED":
                    goNext = true;
                    saveClaim = true;
                    nextState = new ClaimState("ZIPCONFIRMED");
                    break;
                case "ZIPCONFIRMED":
                    goNext = true;
                    saveClaim = true;
                    nextState = new ClaimState("ZIPORDERED");
                    break;
                case "ZIPORDERED":
                    goNext = true;
                    saveClaim = true;
                    if (!confirm)
                    {
                        nextState = new ClaimState("ZIPBUYCANCEL");
                        break;
                    }
                    else
                    {
                        nextState = new ClaimState("ZIPINSTWAIT");
                        //Сначала сохраняем промежуточный статус
                        SaveStateStep(nextState.Id);
                        saveStateInfo = false;
                        nextState = new ClaimState("SERVENGSETWAIT");
                        break;
                    }
                case "DONE":
                    goNext = true;
                    saveClaim = true;
                    nextState = new ClaimState("END");
                    sendNote = true;
                    noteTo = new[] { ServiceRole.CurManager };
                    noteText = $@"Заявка №%ID% закрыта  %LINK%";
                    noteSubject = $"Заявка №%ID% закрыта";
                    break;
                case "ZIPCL-CANCELED":
                    goNext = true;
                    saveClaim = true;
                    descr = Descr;
                    nextState = new ClaimState("ZIPBUYCANCEL");
                    break;
                case "ZIPCL-ETPREP-GET":
                case "ZIPCL-ETSHIP-GET":
                    goNext = true;
                    saveClaim = true;
                    nextState = new ClaimState("SERVADMSET");
                    SpecialistSid = CurAdminSid;
                    sendNote = true;
                    noteTo = new[] { ServiceRole.CurAdmin };
                    noteText = $@"Вам назначена заявка №%ID% %LINK%";
                    noteSubject = $"Назначена заявка №%ID%";
                    break;
                case "ZIPCL-DELIV":
                    goNext = true;
                    saveClaim = true;
                    nextState = new ClaimState("SERVADMSET");
                    SpecialistSid = CurAdminSid;
                    sendNote = true;
                    noteTo = new[] { ServiceRole.CurAdmin };
                    noteText = $@"Вам назначена заявка №%ID% %LINK%";
                    noteSubject = $"Назначена заявка №%ID%";
                    break;
                default:
                    nextState = currState;
                    break;
            }
            if (saveClaim) Save();
            if (goNext)SaveStateStep(nextState.Id, descr, saveStateInfo);
            //SaveStateStep(nextState.Id);
            if (sendNote)
            {
                SendNote(noteSubject, noteText, noteTo);

                ////Замена по маске
                //noteSubject = noteSubject.Replace("%ID%", Id.ToString());

                //noteText = noteText.Replace("%ID%", Id.ToString());
                //string link = $"{ConfigurationManager.AppSettings["ServiceUrl"]}/Claim/Index/{Id}";
                //noteText = noteText.Replace("%LINK%", $@"<p><a href=""{link}"">{link}</a></p>");

                //SendMailTo(noteText, noteSubject, noteTo);
            }
        }
Пример #11
0
        public IHttpActionResult RemoteStateChange(int? idClaim, string stateSysName, string creatorSid, string descr = null, int? idZipClaim = null)
        {
            if (!idClaim.HasValue || String.IsNullOrEmpty(stateSysName)) return NotFound();

            Claim.RemoteStateChange(idClaim.Value, stateSysName, creatorSid, descr, idZipClaim);

            var claim = new Claim(idClaim.Value);
            claim.CurUserAdSid = creatorSid;
            //claim.Descr = descr;
            claim.Go();
            return Ok();
        }
Пример #12
0
        public HttpResponseMessage Go(Claim model)
        {
            HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.Created);

            try
            {
                model.CurUserAdSid = GetCurUser().Sid;
                model.Go();
                response.Content = new StringContent($"{{\"id\":{model.Id},\"sid\":\"{model.Sid}\"}}");
            }
            catch (Exception ex)
            {
                response = new HttpResponseMessage(HttpStatusCode.OK);
                response.Content = new StringContent(MessageHelper.ConfigureExceptionMessage(ex));

            }
            return response;
        }
Пример #13
0
        public void Save(string lastStateSysName)
        {
            //TimeOnWorkMinutes = время от статуса в работу до создания заявки
            if (!TimeOnWorkMinutes.HasValue)
            {
                var stateInWork = Claim.GetLastState(IdClaim, lastStateSysName);
                if (stateInWork != null)
                {
                    TimeOnWorkMinutes = (int) (DateTime.Now - stateInWork.DateCreate).TotalMinutes;
                    if (TimeOnWorkMinutes == 0) TimeOnWorkMinutes = 1;
                }
            }

            //Получаем ткущий тип работ по заявке
            int? wtId = new Claim(IdClaim).IdWorkType;
            if (wtId.HasValue) WorkTypeId = wtId.Value;

            SqlParameter pId = new SqlParameter() { ParameterName = "id", SqlValue = Id, SqlDbType = SqlDbType.Int };
            SqlParameter pIdClaim = new SqlParameter() { ParameterName = "id_claim", SqlValue = IdClaim, SqlDbType = SqlDbType.Int };
            SqlParameter pWorkTypeId = new SqlParameter() { ParameterName = "id_work_type", SqlValue = WorkTypeId, SqlDbType = SqlDbType.Int };
            SqlParameter pIdServiceIssue = new SqlParameter() { ParameterName = "id_service_issue", SqlValue = IdServiceIssue, SqlDbType = SqlDbType.Int };
            SqlParameter pProcessEnabled = new SqlParameter() { ParameterName = "process_enabled", SqlValue = ProcessEnabled, SqlDbType = SqlDbType.Bit };
            SqlParameter pDeviceEnabled = new SqlParameter() { ParameterName = "device_enabled", SqlValue = DeviceEnabled, SqlDbType = SqlDbType.Bit };
            SqlParameter pZipClaim = new SqlParameter() { ParameterName = "zip_claim", SqlValue = ZipClaim, SqlDbType = SqlDbType.Int };
            SqlParameter pZipClaimNumber = new SqlParameter() { ParameterName = "zip_claim_number", SqlValue = ZipClaimNumber, SqlDbType = SqlDbType.NVarChar };
            SqlParameter pCounterMono = new SqlParameter() { ParameterName = "counter_mono", SqlValue = CounterMono, SqlDbType = SqlDbType.BigInt };
            SqlParameter pCounterColor = new SqlParameter() { ParameterName = "counter_color", SqlValue = CounterColor, SqlDbType = SqlDbType.BigInt };
            SqlParameter pCounterTotal = new SqlParameter() { ParameterName = "counter_total", SqlValue = CounterTotal, SqlDbType = SqlDbType.BigInt };
            SqlParameter pNoCounter = new SqlParameter() { ParameterName = "no_counter", SqlValue = NoCounter, SqlDbType = SqlDbType.Bit };
            SqlParameter pCounterUnavailable = new SqlParameter() { ParameterName = "counter_unavailable", SqlValue = CounterUnavailable, SqlDbType = SqlDbType.Bit };
            SqlParameter pDescr = new SqlParameter() { ParameterName = "descr", SqlValue = Descr, SqlDbType = SqlDbType.NVarChar };
            SqlParameter pCreatorAdSid = new SqlParameter() { ParameterName = "creator_sid", SqlValue = CurUserAdSid, SqlDbType = SqlDbType.VarChar };
            SqlParameter pCounterDescr = new SqlParameter() { ParameterName = "counter_descr", SqlValue = CounterDescr, SqlDbType = SqlDbType.NVarChar };
            SqlParameter pEngeneerSid = new SqlParameter() { ParameterName = "engeneer_sid", SqlValue = EngeneerSid, SqlDbType = SqlDbType.VarChar };
            SqlParameter pAdminSid = new SqlParameter() { ParameterName = "admin_sid", SqlValue = AdminSid, SqlDbType = SqlDbType.VarChar };
            SqlParameter pTimeOnWorkMinutes = new SqlParameter() { ParameterName = "time_on_work_minutes", SqlValue = TimeOnWorkMinutes, SqlDbType = SqlDbType.Int };
            SqlParameter pZipClientGivenInstall = new SqlParameter() { ParameterName = "zip_client_given_install", SqlValue = ZipClientGivenInstall, SqlDbType = SqlDbType.Bit };

            var dt = Db.Service.ExecuteQueryStoredProcedure("save_service_sheet", pId, pProcessEnabled, pDeviceEnabled, pZipClaim, pZipClaimNumber, pCounterMono, pCounterColor, pCounterTotal, pNoCounter, pCounterUnavailable, pDescr, pCreatorAdSid, pCounterDescr, pEngeneerSid, pAdminSid, pIdServiceIssue, pIdClaim, pTimeOnWorkMinutes, pWorkTypeId, pZipClientGivenInstall);
            int id = 0;
            if (dt.Rows.Count > 0)
            {
                int.TryParse(dt.Rows[0]["id"].ToString(), out id);
                Id = id;
            }
        }
Пример #14
0
        //public enum ServiceClaimRight
        //{
        //    Save,
        //    Go,
        //    Close
        //}

        //private Claim cliam4check;

        //private void LoadClaim4Check()
        //{
        //    if (cliam4check == null || cliam4check.Id == 0)cliam4check = new Claim(Id, loadObject: false);
        //}

        private bool UserIsCurrentClaimRole(ServiceRole role, bool roleOrSpecialist = false)
        {
            if (IsNullOrEmpty(CurUserAdSid)) return false;
            bool result = false;

            var cl = new Claim(Id, loadObject: false);
            //LoadClaim4Check();

            if (role == ServiceRole.CurTech)
            {
                return (roleOrSpecialist && cl.SpecialistSid == CurUserAdSid) || cl.CurTechSid == CurUserAdSid;
            }
            else if (role == ServiceRole.CurAdmin)
            {
                return (roleOrSpecialist && cl.SpecialistSid == CurUserAdSid) || cl.CurAdminSid == CurUserAdSid;
            }
            else if (role == ServiceRole.CurManager)
            {
                return (roleOrSpecialist && cl.SpecialistSid == CurUserAdSid) || cl.CurManagerSid == CurUserAdSid;
            }
            else if (role == ServiceRole.CurEngeneer)
            {
                return (roleOrSpecialist && cl.SpecialistSid == CurUserAdSid) || cl.CurEngeneerSid == CurUserAdSid;
            }
            else if (role == ServiceRole.CurEngeneer)
            {
                return (roleOrSpecialist && cl.SpecialistSid == CurUserAdSid) || cl.SpecialistSid == CurUserAdSid;
            }
            else if (role == ServiceRole.CurSpecialist)
            {
                return cl.SpecialistSid == CurUserAdSid;
            }

            return result;
        }
Пример #15
0
        public static IEnumerable<Claim> GetList(AdUser user, out int cnt, string adminSid = null, string engeneerSid = null, DateTime? dateStart = null, DateTime? dateEnd = null, int? topRows = null, string managerSid = null, string techSid = null, string serialNum=null, int? idDevice = null, bool? activeClaimsOnly = false, int? idClaimState = null, int? clientId = null, string clientSdNum = null)
        {
            if (user.Is(AdGroup.ServiceAdmin))
            {
                adminSid = user.Sid;
            }
            if (user.Is(AdGroup.ServiceEngeneer)) engeneerSid = user.Sid;
            if (user.Is(AdGroup.ServiceManager)) managerSid = user.Sid;
            if (user.Is(AdGroup.ServiceTech)) techSid = user.Sid;
            
            //!!!!ЕСЛИ МЕНЯЕШЬ ЭТУ ФУНКЦИЮ ПОМИ ЧТО НАДО ПОПРАВИТЬ ФУНКЦИЮ ЧУТЬ НИЖЕ 
            if (!topRows.HasValue) topRows = 30;

            SqlParameter pServAdminSid = new SqlParameter() { ParameterName = "admin_sid", SqlValue = adminSid, SqlDbType = SqlDbType.VarChar };
            SqlParameter pServEngeneerSid = new SqlParameter() { ParameterName = "engeneer_sid", SqlValue = engeneerSid, SqlDbType = SqlDbType.VarChar };
            SqlParameter pDateStart = new SqlParameter() { ParameterName = "date_start", SqlValue = dateStart, SqlDbType = SqlDbType.Date };
            SqlParameter pDateEnd = new SqlParameter() { ParameterName = "date_end", SqlValue = dateEnd, SqlDbType = SqlDbType.Date };
            SqlParameter pTopRows = new SqlParameter() { ParameterName = "top_rows", SqlValue = topRows, SqlDbType = SqlDbType.Int };
            SqlParameter pManagerSid = new SqlParameter() { ParameterName = "manager_sid", SqlValue = managerSid, SqlDbType = SqlDbType.VarChar };
            SqlParameter pTechSid = new SqlParameter() { ParameterName = "tech_sid", SqlValue = techSid, SqlDbType = SqlDbType.VarChar };
            SqlParameter pSerialNum = new SqlParameter() { ParameterName = "serial_num", SqlValue = serialNum, SqlDbType = SqlDbType.NVarChar };
            SqlParameter pIdDevice = new SqlParameter() { ParameterName = "id_device", SqlValue = idDevice, SqlDbType = SqlDbType.Int };
            SqlParameter pActiveClaimsOnly = new SqlParameter() { ParameterName = "active_claims_only", SqlValue = activeClaimsOnly, SqlDbType = SqlDbType.Bit };
            SqlParameter pIdClaimState = new SqlParameter() { ParameterName = "id_claim_state", SqlValue = idClaimState, SqlDbType = SqlDbType.Int };
            SqlParameter pClientId = new SqlParameter() { ParameterName = "id_client", SqlValue = clientId, SqlDbType = SqlDbType.Int };
            SqlParameter pClientSdNum = new SqlParameter() { ParameterName = "client_sd_num", SqlValue = clientSdNum, SqlDbType = SqlDbType.Int };
            var dt = Db.Service.ExecuteQueryStoredProcedure("get_claim_list", pServAdminSid, pServEngeneerSid, pDateStart, pDateEnd, pTopRows, pManagerSid, pTechSid, pSerialNum, pIdDevice, pActiveClaimsOnly, pIdClaimState, pClientId, pClientSdNum);

            var lst = new List<Claim>();

            foreach (DataRow row in dt.Rows)
            {
                var model = new Claim(row, true);
                lst.Add(model);
            }

            //Общее количество
            var dtCnt = Db.Service.ExecuteQueryStoredProcedure("get_claim_list_count", pServAdminSid, pServEngeneerSid, pDateStart, pDateEnd, pManagerSid, pTechSid, pSerialNum, pIdDevice, pActiveClaimsOnly, pIdClaimState, pClientId);
            cnt = 0;
            if (dtCnt.Rows.Count > 0)
            {
                cnt = Db.DbHelper.GetValueIntOrDefault(dtCnt.Rows[0], "cnt");
            }
            return lst;
        }
Пример #16
0
        /// <summary>
        /// Перевод заявки на следующую стадию
        /// </summary>
        /// <param name="confirm">Подтвердить или отклонить назначение заявки</param>
        public void Go(bool confirm = true)
        {
            if (Id <= 0) throw new ArgumentException("Невозможно предать заявку. Не указан ID заявки.");

            //Save();
            string descr = Empty;
            var currState = GetClaimCurrentState(Id);
            var nextState = new ClaimState();
            bool saveStateInfo = true;
            bool sendNote = false;
            ServiceRole[] noteTo = { ServiceRole.CurSpecialist };
            string noteText = Empty;
            string noteSubject = Empty;
            bool goNext = false;
            bool saveClaim = false;//Метод вызывается из удаленных программ и поэтому не всегда нухно схранять статус
            //ReFillSelf(true);

            if (currState.SysName.ToUpper().Equals("NEW"))
            {
                goNext = true;
                saveClaim = true;
                int? wtId = null;
                if (!IdWorkType.HasValue)
                {
                    wtId = new Claim(Id).IdWorkType;
                    if (!wtId.HasValue)
                        throw new ArgumentException(
                            "Невозможно определить следующий статус. Тип работ заявки не указан.");
                }
                else
                {
                    wtId = IdWorkType;
                }
                var wtSysName = new WorkType(wtId.Value).SysName;
                descr =
                    $"{Descr}\r\nУстановлен тип работ {wtSysName}\r\nНазначен специалист {AdHelper.GetUserBySid(SpecialistSid).FullName}";

                switch (wtSysName)
                {
                    case "ДНО":
                    case "НПР":
                    case "ТЭО":
                    case "УТЗ":
                        nextState = new ClaimState("TECHSET");
                        CurTechSid = SpecialistSid;
                        break;
                    case "РТО":
                    case "МТС":
                    case "УРМ":
                    case "ЗРМ":
                    case "МДО":
                    case "ИПТ":
                    case "РЗРД":
                    case "ЗНЗЧ":
                        nextState = new ClaimState("SERVADMSET");
                        CurAdminSid = SpecialistSid;
                        break;
                }
                sendNote = true;
                noteTo = new[] { ServiceRole.CurSpecialist };
                noteText = $@"Вам назначена заявка №%ID% %LINK%";
                noteSubject = $"[Заявка №%ID%] Вам назначена заявка";

            }
            else if (currState.SysName.ToUpper().Equals("TECHSET"))
            {
                goNext = true;
                saveClaim = true;
                if (confirm)
                {
                    nextState = new ClaimState("TECHWORK");
                    CurTechSid = CurUserAdSid;
                    SpecialistSid = CurUserAdSid;
                }
                else
                {
                    descr = $"Отклонено\r\n{Descr}";
                    nextState = new ClaimState("SERVADMSETWAIT");
                    //Очищаем выбранного специалиста так как статус заявки поменялся
                    Clear(specialist: true, tech: true);
                    //sendNote = true;
                    //noteTo = new[] { ServiceRole.CurAdmin };
                    //noteText = $@"Отклонено назначение заявки №%ID% %LINK%";
                    //noteSubject = $"[Заявка №%ID%] Отклонено назначение СТП";
                }
            }
            else if (currState.SysName.ToUpper().Equals("TECHWORK"))
            {
                goNext = true;
                saveClaim = true;
                if (confirm)
                {
                    ServiceSheet4Save.IdClaim = Id;
                    if (ServiceSheet4Save == null || ServiceSheet4Save.IdClaim == 0)
                    {
                        throw new ArgumentException("Сервисный лист отсутствует. Операция не завершена!");
                    }

                    ////if (!ServiceSheet4Save.NoTechWork)
                    ////{
                    ServiceSheet4Save.CurUserAdSid = CurUserAdSid;
                    ServiceSheet4Save.EngeneerSid = CurUserAdSid;
                    ServiceSheet4Save.IdServiceIssue = -999;
                    ServiceSheet4Save.Save("TECHWORK");
                    if (ServiceSheet4Save.ProcessEnabled && ServiceSheet4Save.DeviceEnabled)
                    {
                        nextState = new ClaimState("TECHDONE");
                        //Сначала сохраняем промежуточный статус
                        SaveStateStep(nextState.Id);
                        saveStateInfo = false;
                        nextState = new ClaimState("DONE");

                        //Если есть хоть один не установленный ЗИП 
                        if (GetOrderedZipItemList(Id, ServiceSheet4Save.Id).Any(x => !x.Installed))
                        {
                            nextState = new ClaimState("SERVADMSETWAIT");
                        }
                    }
                    else if ((!ServiceSheet4Save.ProcessEnabled || !ServiceSheet4Save.DeviceEnabled) &&
                             ServiceSheet4Save.ZipClaim.HasValue && ServiceSheet4Save.ZipClaim.Value)
                    {
                        //nextState = new ClaimState("TECHDONE");
                        ////Сначала сохраняем промежуточный статус
                        //SaveStateStep(nextState.Id);
                        saveStateInfo = false;
                        //nextState = new ClaimState("ZIPORDER");
                        nextState = new ClaimState("ZIPISSUE");
                    }
                    else if ((!ServiceSheet4Save.ProcessEnabled || !ServiceSheet4Save.DeviceEnabled) &&
                             (!ServiceSheet4Save.ZipClaim.HasValue || !ServiceSheet4Save.ZipClaim.Value))
                    {

                        nextState = new ClaimState("TECHPROCESSED");
                        //Сначала сохраняем промежуточный статус
                        SaveStateStep(nextState.Id);
                        saveStateInfo = false;
                        nextState = new ClaimState("SERVADMSETWAIT");
                    }
                }
                else
                {
                    descr = $"{Descr}";
                    nextState = new ClaimState("TECHNOCONTACT");
                    //Сначала сохраняем промежуточный статус
                    SaveStateStep(nextState.Id, descr);
                    saveStateInfo = false;
                    nextState = new ClaimState("SERVADMSETWAIT");
                    Clear(specialist: true);
                }
                ////}
                ////else if (ServiceSheet4Save.NoTechWork)
                ////{
                ////    nextState = new ClaimState("NEW");
                ////    //Очищаем выбранного специалиста так как статус заявки поменялся
                ////    Clear(specialist: true);
                ////}
            }
            else if (currState.SysName.ToUpper().Equals("SERVADMSETWAIT"))
            {
                goNext = true;
                saveClaim = true;
                nextState = new ClaimState("SERVADMSET");
                sendNote = true;
                noteTo = new[] { ServiceRole.CurSpecialist };
                noteText = $@"Вам назначена заявка №%ID% %LINK%";
                noteSubject = $"[Заявка №%ID%] Вам назначена заявка";
            }
            else if (currState.SysName.ToUpper().Equals("SERVADMSET"))
            {
                goNext = true;
                if (confirm)
                {
                    nextState = new ClaimState("SRVADMWORK");
                    CurAdminSid = CurUserAdSid;
                    SpecialistSid = CurUserAdSid;
                }
                else
                {
                    descr = $"Отклонено\r\n{Descr}";
                    nextState = new ClaimState("SERVADMSETWAIT");
                    //Очищаем выбранного специалиста так как статус заявки поменялся
                    Clear(specialist: true, admin: true);
                    sendNote = true;
                    noteTo = new[] { ServiceRole.CurManager };
                    noteText = $@"Отклонено назначение заявки №%ID% %LINK%";
                    noteSubject = $"[Заявка №%ID%] Отклонено назначение СА";
                }
            }
            else if (currState.SysName.ToUpper().Equals("SRVADMWORK"))
            {
                goNext = true;
                saveClaim = true;
                ServiceIssue4Save.IdClaim = Id;
                ServiceIssue4Save.Descr = Descr;
                ServiceIssue4Save.SpecialistSid = SpecialistSid;
                ServiceIssue4Save.CurUserAdSid = CurUserAdSid;
                int serviceIssueId = ServiceIssue4Save.Save();
                CurServiceIssueId = serviceIssueId; //Устанавливает текущий заявку на выезд
                WorkType wt = new WorkType();
                if (IdWorkType.HasValue) wt = new WorkType(IdWorkType.Value);
                descr =
                    $"Установлен тип работ {wt.Name}\r\nНазначен специалист {AdHelper.GetUserBySid(SpecialistSid).FullName}\r\nДата выезда {ServiceIssue4Save.DatePlan:dd.MM.yyyy}\r\n{Descr}";
                nextState = new ClaimState("SRVENGSET");
                CurEngeneerSid = SpecialistSid;
                sendNote = true;
                noteTo = new[] { ServiceRole.CurSpecialist };
                noteText = $@"Вам назначена заявка №%ID% %LINK%";
                noteSubject = $"[Заявка №%ID%] Вам назначена заявка";
            }
            else if (currState.SysName.ToUpper().Equals("SERVENGSETWAIT"))
            {
                goNext = true;
                saveClaim = true;
                nextState = new ClaimState("SRVENGSET");
            }
            else if (currState.SysName.ToUpper().Equals("SRVENGSET"))
            {
                goNext = true;
                saveClaim = true;
                if (confirm)
                {
                    nextState = new ClaimState("SRVENGGET");
                    //Сначала сохраняем промежуточный статус
                    //SaveStateStep(nextState.Id);
                    saveStateInfo = false;
                    //nextState = new ClaimState("SERVENGOUTWAIT");
                    CurEngeneerSid = CurUserAdSid;
                    SpecialistSid = CurUserAdSid;
                }
                else
                {
                    descr = $"Отклонено\r\n{Descr}";
                    nextState = new ClaimState("SRVENGCANCEL");
                    //Сначала сохраняем промежуточный статус
                    SaveStateStep(nextState.Id, descr);
                    saveStateInfo = false;
                    nextState = new ClaimState("SRVADMWORK");
                    Clear(specialist: true, engeneer: true);
                    sendNote = true;
                    noteTo = new[] { ServiceRole.CurAdmin };
                    noteText = $@"Отклонено назначение заявки №%ID% %LINK%";
                    noteSubject = $"[Заявка №%ID%] Отклонено назначение СИ";
                }
            }
            else if (currState.SysName.ToUpper().Equals("SRVENGGET"))
            {
                goNext = true;
                saveClaim = true;
                nextState = new ClaimState("SRVENGWENT");
            }
            else if (currState.SysName.ToUpper().Equals("SRVENGWENT"))
            {
                goNext = true;
                saveClaim = true;
                nextState = new ClaimState("SRVENGWORK");
            }
            else if (currState.SysName.ToUpper().Equals("SRVENGWORK"))
            {
                goNext = true;
                saveClaim = true;
                ServiceSheet4Save.IdClaim = Id;
                if (ServiceSheet4Save == null || ServiceSheet4Save.IdClaim == 0)
                {
                    throw new ArgumentException("Сервисный лист отсутствует. Операция не завершена!");
                }

                var cl = new Claim(Id);

                if (IsNullOrEmpty(ServiceSheet4Save.CurUserAdSid)) ServiceSheet4Save.CurUserAdSid = CurUserAdSid;
                if (IsNullOrEmpty(ServiceSheet4Save.EngeneerSid)) ServiceSheet4Save.EngeneerSid = CurUserAdSid;
                ServiceSheet4Save.AdminSid = cl.CurAdminSid;
                ServiceSheet4Save.IdServiceIssue = cl.CurServiceIssueId ?? -1;
                ServiceSheet4Save.Save("SRVENGWORK");

                bool hasNotInstalled = GetOrderedZipItemList(Id, ServiceSheet4Save.Id).Any(x => !x.Installed);

                if (ServiceSheet4Save.ProcessEnabled && ServiceSheet4Save.DeviceEnabled)
                {
                    //Если есть хоть один не установленный ЗИП 
                    if (hasNotInstalled)
                    {
                        nextState = new ClaimState("ZIPISSUE");
                    }
                    else
                    {
                        nextState = new ClaimState("DONE");
                    }
                }
                else if ((!ServiceSheet4Save.ProcessEnabled || !ServiceSheet4Save.DeviceEnabled) &&
                         ServiceSheet4Save.ZipClaim.HasValue &&
                         ServiceSheet4Save.ZipClaim.Value)
                {
                    nextState = new ClaimState("ZIPISSUE");
                }
                else if ((!ServiceSheet4Save.ProcessEnabled || !ServiceSheet4Save.DeviceEnabled) &&
                         (!ServiceSheet4Save.ZipClaim.HasValue || !ServiceSheet4Save.ZipClaim.Value))
                {

                    //Если есть хоть один не установленный ЗИП 
                    if (hasNotInstalled)
                    {
                        nextState = new ClaimState("ZIPISSUE");
                    }
                    else
                    {
                        nextState = new ClaimState("SERVADMSET");
                        SpecialistSid = CurAdminSid;
                        sendNote = true;
                        noteTo = new[] { ServiceRole.CurAdmin };
                        noteText =
                            $@"Инженер не восстановил работу аппарата по заявке №%ID% %LINK%.\r\Комментарий:{
                                ServiceSheet4Save.Descr}";
                        noteSubject = $"[Заявка №%ID%] Работа не восстановлена";
                    }
                }
            }
            else if (currState.SysName.ToUpper().Equals("ZIPISSUE"))
            {
                var lastServiceSheet = GetLastServiceSheet();
                var curCl = new Claim(Id);
                goNext = true;
                saveClaim = true;
                var notInstalledList = GetOrderedZipItemList(Id, lastServiceSheet.Id).Where(x => !x.Installed);

                //Если есть заказаный ЗИП то значит заявку надо продолжить
                if (lastServiceSheet.ZipClaim.HasValue && lastServiceSheet.ZipClaim.Value)
                {
                    if (!lastServiceSheet.GetIssuedZipItemList().Any())
                    {
                        throw new Exception("Необходимо заполнить список ЗИП. Сервисный лист не был передан.");
                    }
                    else
                    {
                        ServiceSheetZipItem.SaveOrderedZipItemsCopyFromIssued(lastServiceSheet.Id, CurUserAdSid);

                        if (notInstalledList.Any())
                            //Если есть не установленный ЗИП то сохраняем его
                        {
                            ServiceSheetZipItem.NotInstalledSaveList(notInstalledList.Select(x => x.Id).ToArray(),
                                lastServiceSheet.Id, CurUserAdSid);
                        }

                        SpecialistSid = CurUserAdSid;
                        nextState = new ClaimState("ZIPCHECK");

                        if (nextState.SysName.Equals("ZIPCHECK"))
                        {
                            sendNote = true;
                            noteTo = new[] {ServiceRole.AllTech};
                            noteText = $@"Необходимо заказать ЗИП по заявке №%ID% %LINK%";
                            noteSubject = $"[Заявка №%ID%] Необходимо заказать ЗИП";
                        }
                    }
                }
                else
                {
                    if (notInstalledList.Any())
                    //Если есть не установленный ЗИП
                    {
                        ServiceSheetZipItem.NotInstalledSaveList(notInstalledList.Select(x=>x.Id).ToArray(), lastServiceSheet.Id, CurUserAdSid);
                        Descr = $"Не весь ЗИП установлен";
                        if (lastServiceSheet.ProcessEnabled && lastServiceSheet.DeviceEnabled)
                        {
                            nextState = new ClaimState("DONE");
                        }
                        else
                        {
                            nextState = new ClaimState("SERVADMSET");
                        }
                        
                        SpecialistSid = curCl.CurAdminSid;
                        sendNote = true;
                        noteTo = new[] { ServiceRole.CurAdmin };
                        noteText = $@"Не весь ЗИП установлен №%ID% %LINK%";
                        noteSubject = $"[Заявка №%ID%] Не весь ЗИП установлен";
                    }
                    else
                    {
                        nextState = new ClaimState("DONE");
                        sendNote = true;
                        noteTo = new[] { ServiceRole.CurAdmin };
                        noteText = $@"ЗИП Установлен по заявке №%ID% %LINK%";
                        noteSubject = $"[Заявка №%ID%] ЗИП установлен";
                    }
                }
            }
            else if (currState.SysName.ToUpper().Equals("ZIPCHECK"))
            {
                //В настоящий момент по этому статусу происходит заказ ЗИП специалистом Тех поддержки
                if (!GetClaimCurrentState(Id).SysName.Equals("ZIPCHECKINWORK")) //На всякий случай проверяем еще раз
                {
                    goNext = true;
                    saveClaim = true;
                    CurTechSid = CurUserAdSid;
                    SpecialistSid = CurUserAdSid;
                    nextState = new ClaimState("ZIPCHECKINWORK");
                }
                else
                {
                    throw new ArgumentException("Проверка ЗИП уже в работе.");
                }
            }

            else if (currState.SysName.ToUpper().Equals("ZIPCHECKINWORK"))
            {
                var curCl = new Claim(Id);
                if (curCl.SpecialistSid != CurUserAdSid && curCl.CurTechSid != CurUserAdSid)
                    throw new ArgumentException("Проверка ЗИП уже в работе.");
                goNext = true;
                saveClaim = true;

                //Если красная линия или Гарантийный аппарат то на утверждение
                if (curCl.Contract.ContractZipTypeSysName == "LESSZIP" ||
                    (curCl.Device.HasGuarantee.HasValue && curCl.Device.HasGuarantee.Value))
                {
                    nextState = new ClaimState("ZIPCONFIRM");

                }
                else
                {
                    ZipClaim.CreateClaimUnitWork(Id, CurUserAdSid);
                    nextState = new ClaimState("ZIPORDERED");

                    sendNote = true;
                    noteTo = new[] { ServiceRole.ZipConfirm };
                    noteText = $@"Необходимо утвердить список ЗИП в заявке №%ID% %LINK%";
                    noteSubject = $"[Заявка №%ID%] Утверждение список ЗИП";
                }
            }
            else if (currState.SysName.ToUpper().Equals("ZIPCONFIRM"))
            {
                goNext = true;
                saveClaim = true;
                if (confirm)
                {
                    ZipClaim.CreateClaimUnitWork(Id, CurUserAdSid);
                    nextState = new ClaimState("ZIPORDERED");
                }
                else
                {
                    descr = $"Отклонено\r\n{Descr}";
                    nextState = new ClaimState("ZIPCONFIRMCANCEL");
                    //Сначала сохраняем промежуточный статус
                    SaveStateStep(nextState.Id, descr);
                    saveStateInfo = false;
                    nextState = new ClaimState("ZIPCHECKINWORK");
                    sendNote = true;
                    noteTo = new[] { ServiceRole.CurTech };
                    noteText = $@"Отклонен список ЗИП в заявке №%ID% %LINK%";
                    noteSubject = $"[Заявка №%ID%] Отклонен список ЗИП";
                }
            }
            else if (currState.SysName.ToUpper().Equals("ZIPORDERED"))
            {
                goNext = true;
                saveClaim = true;
                if (!confirm)
                {
                    descr = $"Отказ в закупке ЗИП\r\n{Descr}";
                    nextState = new ClaimState("ZIPBUYCANCEL");
                    sendNote = true;
                    noteTo = new[] { ServiceRole.CurAdmin };
                    noteText = $@"Отказ в закупке ЗИП №%ID% %LINK%";
                    noteSubject = $"[Заявка №%ID%] Отказ в закупке ЗИП";
                }
                else
                {
                    nextState = new ClaimState("SERVADMSET");
                    var curCl = new Claim(Id, false);
                    SpecialistSid = curCl.CurAdminSid;
                    sendNote = true;
                    noteTo = new[] { ServiceRole.CurAdmin };
                    noteText = $@"Вам назначена заявка №%ID% %LINK%";
                    noteSubject = $"[Заявка №%ID%] Вам назначена заявка";
                }
            }
            else if (currState.SysName.ToUpper().Equals("DONE"))
            {
                //Если есть незакрытые СЛ то заявку не закрываем
                if (!GetClaimServiceSheetList(Id, false).Any())
                {
                    goNext = true;
                    saveClaim = true;
                    nextState = new ClaimState("END");
                    sendNote = true;
                    noteTo = new[] {ServiceRole.CurManager};
                    noteText = $@"Заявка №%ID% закрыта  %LINK%";
                    noteSubject = $"[Заявка №%ID%] Заявка закрыта";
                }
            }
            else if (currState.SysName.ToUpper().Equals("ZIPCL-CANCELED"))
            {
                goNext = true;
                saveClaim = true;
                descr = Descr;
                nextState = new ClaimState("ZIPBUYCANCEL");
            }
            else if (currState.SysName.ToUpper().Equals("ZIPCL-ETPREP-GET") ||
                     currState.SysName.ToUpper().Equals("ZIPCL-ETSHIP-GET"))
            {
                goNext = true;
                saveClaim = true;
                nextState = new ClaimState("SERVADMSET");
                var curCl = new Claim(Id, false);
                SpecialistSid = curCl.CurAdminSid;
                sendNote = true;
                noteTo = new[] { ServiceRole.CurAdmin };
                noteText = $@"Вам назначена заявка №%ID% %LINK%";
                noteSubject = $"[Заявка №%ID%] Вам назначена заявка";
            }
            else if (currState.SysName.ToUpper().Equals("ZIPCL-DELIV"))
            {
                goNext = true;
                saveClaim = true;
                nextState = new ClaimState("SERVADMSET");
                SpecialistSid = CurAdminSid;
                sendNote = true;
                noteTo = new[] { ServiceRole.CurAdmin };
                noteText = $@"Вам назначена заявка №%ID% %LINK%";
                noteSubject = $"[Заявка №%ID%] Вам назначена заявка";
            }
            else
            {
                nextState = currState;
            }

            if (saveClaim) Save();
            if (goNext) SaveStateStep(nextState.Id, descr, saveStateInfo);
            //SaveStateStep(nextState.Id);
            if (sendNote)
            {
                SendNote(noteSubject, noteText, null, noteTo);

                ////Замена по маске
                //noteSubject = noteSubject.Replace("%ID%", Id.ToString());

                //noteText = noteText.Replace("%ID%", Id.ToString());
                //string link = $"{ConfigurationManager.AppSettings["ServiceUrl"]}/Claim/Index/{Id}";
                //noteText = noteText.Replace("%LINK%", $@"<p><a href=""{link}"">{link}</a></p>");

                //SendMailTo(noteText, noteSubject, noteTo);
            }
        }
Пример #17
0
        public static ClaimState GetNext(int idClaimState, int claimId)
        {
            var currState = new ClaimState(idClaimState);

            switch (currState.SysName.ToUpper())
            {
                case "NEW":
                    return new ClaimState("NEWADD");
                case "NEWADD":
                    return new ClaimState("SET");
                case "SET":
                    var wtId = new Claim(claimId).IdWorkType;
                    if (!wtId.HasValue) throw new ArgumentException("Невозможно определить следующий статус. Тип работ не указан.");
                    var wtSysName = new WorkType(wtId.Value).SysName;
                    switch (wtSysName)
                    {
                        case "ДНО": case "НПР": case "ТЭО":case "УТЗ":
                            return new ClaimState("TECHWORK");
                        case "РТО": case "МТС": case "УРМ": case "ЗРМ":
                        case "МДО": case "ИПТ": case "РЗРД": case "ЗНЗЧ":
                            return new ClaimState("SRVADMWORK");
                    }

                    break;
                default:
                    return currState;
            }

            //var st = new ClaimState();
            //SqlParameter pIdClaim = new SqlParameter() { ParameterName = "id_claim_state", SqlValue = idClaimState, SqlDbType = SqlDbType.Int };
            //var dt = Db.Service.ExecuteQueryStoredProcedure("get_next_claim_state", pIdClaim);
            //if (dt.Rows.Count > 0)
            //{
            //    st = new ClaimState(dt.Rows[0]);
            //}

            return currState;
        }