Ejemplo n.º 1
0
        public JsonResultBO AddFlow(long ItemId, string itemType, UserInfoBO userId, int customState = 0)
        {
            var result = new JsonResultBO(true);
            //Lấy thông tin module của loại đối tượng
            var module = this.context.WF_MODULE.Where(x => x.MODULE_CODE.Equals(itemType)).FirstOrDefault();

            if (module == null || module.WF_STREAM_ID == null)
            {
                result.MessageFail("Không tìm thấy luồng xử lý");
                return(result);
            }
            //Lấy thông tin luồng xử lý
            var DeptObj = this.context.CCTC_THANHPHAN.Find(userId.DM_PHONGBAN_ID);

            if (DeptObj == null)
            {
                result.MessageFail("Không tìm thấy luồng xử lý do chưa set đúng phòng ban");
                return(result);
            }

            var LstWFIds = module.WF_STREAM_ID.ToListInt(',');

            var flow = this.context.WF_STREAM.Where(x => x.LEVEL_ID == DeptObj.CATEGORY && LstWFIds.Contains(x.ID)).FirstOrDefault();

            if (flow == null)
            {
                result.MessageFail("Không tìm thấy luồng xử lý");
                return(result);
            }
            //Lấy danh sách bước
            var lstStep = this.context.WF_STATE.Where(x => x.WF_ID == flow.ID).OrderBy(x => x.ID).ToList();

            if (lstStep == null && !lstStep.Any())
            {
                result.MessageFail("Luồng xử lý chưa được cấu hình");
                return(result);
            }
            var stateID = GetState(flow.ID, userId);

            /*
             * @author: duynn
             * @description: "trạng thái" tùy chỉnh cho phép sử dụng trạng thái vượt cấp
             * */
            if (customState > 0)
            {
                stateID = customState;
            }

            var stateCurrent = this.context.WF_STATE.Find(stateID);

            var process = new WF_PROCESS();

            process.ITEM_ID            = ItemId;
            process.ITEM_TYPE          = itemType;
            process.USER_ID            = userId.ID;
            process.WF_ID              = flow.ID;
            process.CURRENT_STATE      = stateCurrent.ID;
            process.CURRENT_STATE_NAME = stateCurrent.STATE_NAME;
            if (customState > 0)
            {
                process.IS_END = stateCurrent.IS_KETTHUC.GetValueOrDefault();
            }
            this.Save(process);

            var userProcess = new WF_ITEM_USER_PROCESS();

            userProcess.ITEM_ID      = ItemId;
            userProcess.ITEM_TYPE    = itemType;
            userProcess.IS_XULYCHINH = true;
            userProcess.USER_ID      = userId.ID;
            userProcess.create_at    = DateTime.Now;
            userProcess.create_by    = userId.ID;
            if (customState > 0)
            {
                userProcess.DAXULY = true;
            }
            this.context.WF_ITEM_USER_PROCESS.Add(userProcess);
            var log = new WF_LOG();

            log.ITEM_ID      = process.ITEM_ID;
            log.ITEM_TYPE    = process.ITEM_TYPE;
            log.NGUOIXULY_ID = userId.ID;
            log.WF_ID        = process.WF_ID;
            if (customState > 0)
            {
                log.MESSAGE = "<div class='label label-info'>" + stateCurrent.STATE_NAME + "</div>";
            }
            else
            {
                log.MESSAGE = "<div class='label label-info'>Khởi tạo</div>";
            }
            log.STEP_ID   = null;
            log.create_at = DateTime.Now;
            log.create_by = userId.ID;
            this.context.WF_LOG.Add(log);

            if (customState > 0)
            {
                var function = this.context.WF_STATE_FUNCTION
                               .Where(x => x.WF_STATE_ID == customState)
                               .FirstOrDefault();
                if (function != null)
                {
                    var functionDone = new WF_FUNCTION_DONE();
                    functionDone.ITEM_TYPE      = itemType;
                    functionDone.ITEM_ID        = ItemId;
                    functionDone.STATE          = customState;
                    functionDone.FUNCTION_STATE = function.ID;
                    functionDone.create_at      = DateTime.Now;
                    functionDone.create_by      = userId.ID;
                    this.context.WF_FUNCTION_DONE.Add(functionDone);
                }
            }

            this.context.SaveChanges();
            return(result);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// @author:duynn
        /// @description: gửi đơn vị nhận bên ngoài
        /// @since: 10/06/2019
        /// </summary>
        /// <param name="entityVanBanDi"></param>
        /// <param name="sms"></param>
        /// <returns></returns>
        public bool SaveVanBanPhatHanhToDonVi(HSCV_VANBANDI entityVanBanDi, SMSDAL.SendSMSDAL sms)
        {
            bool result = true;

            try
            {
                DM_NHOMDANHMUC entityNhomDanhMuc = DM_NHOMDANHMUCBusiness.repository.All()
                                                   .FirstOrDefault(x => x.GROUP_CODE == DMLOAI_CONSTANT.SOVANBANDEN);

                DM_NGUOIDUNG entityNguoiKy = DM_NGUOIDUNGBusiness.Find(entityVanBanDi.NGUOIKY_ID);

                List <TAILIEUDINHKEM> groupFiles = TAILIEUDINHKEMBusiness.GetNewestData(entityVanBanDi.ID, LOAITAILIEU.VANBAN);

                List <int> idsDonViNhan = new List <int>();

                if (!string.IsNullOrEmpty(entityVanBanDi.DONVINHAN_INTERNAL_ID))
                {
                    var idsDonViDaNhan = entityVanBanDi.DONVINHAN_INTERNAL_ID.ToListInt(',');
                    idsDonViNhan.AddRange(idsDonViDaNhan);
                    entityVanBanDi.DONVINHAN_INTERNAL_ID = string.Join(",", idsDonViNhan.ToArray());
                }

                List <CCTC_THANHPHAN> groupDonViNhan = CCTC_THANHPHANBusiness.repository.AllNoTracking
                                                       .Where(x => idsDonViNhan.Contains(x.ID)).ToList();
                List <LOGSMS>               groupLogSMS          = new List <LOGSMS>();
                List <TAILIEUDINHKEM>       groupForwardFiles    = new List <TAILIEUDINHKEM>();
                List <WF_ITEM_USER_PROCESS> groupItemUserProcess = new List <WF_ITEM_USER_PROCESS>();
                foreach (var dept in groupDonViNhan)
                {
                    WF_STATE firstState = null;

                    //kiểm tra có phải là gửi nội bộ hay không?
                    bool isSendInternal = false;
                    //- trường hợp gửi cho các ban ngành cấp tỉnh và các huyện xa -> thành văn bản đến của các đơnvị nhận được
                    if (dept.TYPE == DEPTTYLELABEL.ToIntOrZero())
                    {
                        //- trường hợp này là văn bản đến bình thường
                        var workflowModule = WF_MODULEBusiness.repository
                                             .All().FirstOrDefault(x => x.MODULE_CODE == MODULE_CONSTANT.VANBANDEN);

                        var workflowStreamIds = workflowModule.WF_STREAM_ID.ToListInt(',');

                        //- lấy luồng xử lý của từng đơn vị
                        var workflowStream = WF_STREAMBusiness.repository.All()
                                             .FirstOrDefault(x => x.LEVEL_ID == dept.CATEGORY && workflowStreamIds.Contains(x.ID));

                        //lấy trạng thái xử lý ban đầu cảu đơn vị
                        firstState = WF_STATEBusiness.repository.All()
                                     .FirstOrDefault(x => x.IS_START == true && x.WF_ID == workflowStream.ID);
                    }
                    else if (dept.PARENT_ID == currentUser.DeptParentID)
                    {
                        isSendInternal = true;
                        //- trường hợp gửi các phòng ban thuộc tỉnh ủy => thành văn bản đến nội bộ của tỉnh
                        var workflowModule = WF_MODULEBusiness.repository.All()
                                             .FirstOrDefault(x => x.MODULE_CODE == MODULE_CONSTANT.VANBANDENNOIBO);

                        var workflowStreamIds = workflowModule.WF_STREAM_ID.ToListInt(',');

                        //- lấy luồng xử lý của từng đơn vị
                        var workflowStream = WF_STREAMBusiness.repository.All()
                                             .FirstOrDefault(x => x.LEVEL_ID == dept.CATEGORY && workflowStreamIds.Contains(x.ID));

                        firstState = WF_STATEBusiness.repository.All()
                                     .FirstOrDefault(x => x.IS_START == true && x.WF_ID == workflowStream.ID);
                    }


                    UserInfoBO processor = null;

                    /**
                     * kiểm tra vai trò nhận của trạng thái đầu tiên
                     */
                    if (firstState != null)
                    {
                        /**
                         * lấy người thuộc phòng ban có vai trò xử lý
                         */
                        var receiver = DM_NGUOIDUNGBusiness.GetUserByRoleAndDeptId(firstState.VAITRO_ID.GetValueOrDefault(), dept.ID).FirstOrDefault();
                        if (receiver != null)
                        {
                            processor = DM_NGUOIDUNGBusiness.GetNewUserInfo(receiver.Value.ToLongOrZero());
                        }
                    }


                    var dataSoVanBanDen = DM_DANHMUC_DATABusiness.GetSoVanBan(DMLOAI_CONSTANT.SOVANBANDEN, DateTime.Now.Year, dept.ID);
                    if (dataSoVanBanDen == null)
                    {
                        //tạo sổ văn bản đến
                        dataSoVanBanDen = new DM_DANHMUC_DATA()
                        {
                            DEPTID     = dept.ID,
                            TEXT       = "Sổ văn bản đến " + DateTime.Now.Year,
                            DATA       = DateTime.Now.Year,
                            DM_NHOM_ID = entityNhomDanhMuc.ID
                        };
                        DM_DANHMUC_DATABusiness.Save(dataSoVanBanDen);
                    }

                    HSCV_VANBANDEN entityVanBanDen = this.ConvertToVanBanDen(entityVanBanDi, entityNguoiKy, dataSoVanBanDen);
                    entityVanBanDen.IS_NOIBO = isSendInternal ? true : false;
                    HSCV_VANBANDENBusiness.Save(entityVanBanDen);

                    /**
                     * cập nhật số văn bản đến
                     */
                    dataSoVanBanDen.GHICHU = (dataSoVanBanDen.GHICHU.ToIntOrZero() + 1).ToString();
                    DM_DANHMUC_DATABusiness.Save(dataSoVanBanDen);

                    /**
                     * cập nhật tài liệu đính kèm
                     */
                    var files = this.GenerateFiles(groupFiles, entityVanBanDen);
                    groupForwardFiles.AddRange(files);

                    /**
                     * cập nhật thông tin văn bản đến trong luồng xử lý
                     */
                    if (processor != null)
                    {
                        WF_PROCESSBusiness.AddFlow(entityVanBanDen.ID, isSendInternal ? MODULE_CONSTANT.VANBANDENNOIBO : MODULE_CONSTANT.VANBANDEN, processor);
                    }

                    /**
                     * nếu không có người phù hợp trong luồng xử lý ==> lấy người có vai trò cao nhất tại phòng
                     */
                    if (processor == null)
                    {
                        /**
                         * lấy ra người có vai trò cao nhất tại phòng ban
                         */
                        processor = DM_NGUOIDUNGBusiness.GetUserHighestPriority(dept.ID);

                        /**
                         * lưu thông in người nhận vào bảng  WF_ITEM_USER_PROCESS
                         */
                        var itemUserProcess = new WF_ITEM_USER_PROCESS();
                        itemUserProcess.ITEM_ID      = entityVanBanDen.ID;
                        itemUserProcess.ITEM_TYPE    = isSendInternal ? MODULE_CONSTANT.VANBANDENNOIBO : MODULE_CONSTANT.VANBANDEN;
                        itemUserProcess.IS_XULYCHINH = false;
                        itemUserProcess.USER_ID      = processor.ID;
                        itemUserProcess.create_at    = DateTime.Now;
                        itemUserProcess.create_by    = currentUser.ID;
                        groupItemUserProcess.Add(itemUserProcess);
                    }


                    if (processor != null)
                    {
                        ElasticSearch.updateListUser(entityVanBanDen.ID.ToString(), new List <long> {
                            processor.ID
                        }, ElasticType.VanBanDen);

                        //gửi email
                        if (!string.IsNullOrEmpty(processor.EMAIL))
                        {
                            var ContentEmail = currentUser.TenPhongBan + " đã gửi bạn một văn bản đến <a href='" + SERVERADDRESS + "/HSCV_VANBANDENArea/HSCV_VANBANDEN/DetailVanBanDen?id=" + entityVanBanDen.ID.ToString() + "'>" + entityVanBanDen.SOHIEU + "</a>";
                            EmailProvider.SendMailTemplate(currentUser, ContentEmail, ContentEmail, new List <string> {
                                processor.EMAIL
                            });
                        }
                        //gửi tin nhắn
                        if (currentUser.CanSendSMS && entityVanBanDi.CAN_SEND_SMS == true && processor.DIENTHOAI != null)
                        {
                            var ContentSMS = currentUser.TenPhongBan + " đã gửi bạn một văn bản đến " + entityVanBanDen.SOHIEU;
                            ContentSMS = sms.locDau(ContentSMS);
                            var      DoDaiSMS = ContentSMS.Length;
                            string[] noiDung  = new string[1];
                            noiDung[0] = ContentSMS;
                            string resultsend = sms.guiTinNhan(processor.DIENTHOAI, "177403", noiDung);
                            LOGSMS SmsObject  = new LOGSMS();
                            SmsObject.SODIENTHOAINHAN = processor.DIENTHOAI;
                            SmsObject.NOIDUNG         = ContentSMS;
                            SmsObject.SOKYTU          = DoDaiSMS;
                            SmsObject.KETQUA          = resultsend;
                            SmsObject.CREATED_AT      = DateTime.Now;
                            SmsObject.CREATED_BY      = currentUser.ID;
                            SmsObject.HOTENNGUOIGUI   = currentUser.HOTEN;
                            SmsObject.DONVI_GUI       = currentUser.DM_PHONGBAN_ID.GetValueOrDefault();
                            SmsObject.ITEMTYPE        = "VANBANDEN";
                            SmsObject.ITEMID          = entityVanBanDen.ID;
                            SmsObject.DONVI_NHAN      = processor.DM_PHONGBAN_ID.GetValueOrDefault();
                            SmsObject.HOTENNGUOINHAN  = processor.HOTEN;
                            groupLogSMS.Add(SmsObject);
                        }

                        //lưu thông báo
                        SYS_TINNHAN noti = new SYS_TINNHAN();
                        noti.FROM_USERNAME = currentUser.HOTEN;
                        noti.FROM_USER_ID  = currentUser.ID;
                        noti.NGAYTAO       = DateTime.Now;
                        noti.NOIDUNG       = currentUser.TenPhongBan + " đã gửi đến bạn một văn bản đến";
                        noti.URL           = "/HSCV_VANBANDENArea/HSCV_VANBANDEN/DetailVanBanDen/" + entityVanBanDen.ID.ToString();
                        noti.TIEUDE        = "Xử lý văn bản đến";
                        noti.TO_USER_ID    = processor.ID;
                        SYS_TINNHANBusiness.Save(noti, "", false, entityVanBanDen.ID, TargetDocType.COORDINATED);
                    }
                }

                //lưu thông tin tài liệu, sms, luồng xử lý
                TAILIEUDINHKEMBusiness.repository.InsertRange(groupForwardFiles);
                LogSMSBusiness.repository.InsertRange(groupLogSMS);
                WF_ITEM_USER_PROCESSBusiness.repository.InsertRange(groupItemUserProcess);

                TAILIEUDINHKEMBusiness.repository.Save();
            }
            catch (Exception)
            {
                result = false;
            }
            return(result);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Thực hiện chuyển trạng thái
        /// </summary>
        /// <returns></returns>
        public JsonResultBO SaveStepAction(long processID, int stepID, long mainUser, List <long> joinUser, string message, long currentUser)
        {
            var  result     = new JsonResultBO(true);
            long?ngxuly     = 0;
            int? curentStep = 0;

            using (var transaction = this.context.Database.BeginTransaction())
            {
                try
                {
                    var process = this.context.WF_PROCESS.Find(processID);
                    if (process == null)
                    {
                        result.MessageFail("Đối tượng không trong luồng xử lý");
                        return(result);
                    }

                    var step = this.context.WF_STEP.Find(stepID);
                    if (step == null)
                    {
                        result.MessageFail("Không tìm thấy bước chuyển");
                        return(result);
                    }
                    long idUserBack = 0;
                    var  stepConfig = this.context.WF_STEP_CONFIG.Where(x => x.WF_STEP_ID == step.ID).FirstOrDefault();
                    if (stepConfig != null && stepConfig.IS_BACK_USER == true)
                    {
                        var logLast = this.context.WF_LOG.Where(x => x.ITEM_TYPE == process.ITEM_TYPE && x.ITEM_ID == process.ITEM_ID).OrderByDescending(x => x.ID).FirstOrDefault();
                        if (logLast != null)
                        {
                            idUserBack = logLast.NGUOIXULY_ID.GetValueOrDefault(0);
                        }
                    }
                    ngxuly     = process.USER_ID;
                    curentStep = step.ID;
                    #region Cập nhật trạng thái cho đối tượng
                    process.CURRENT_STATE = step.STATE_END;
                    var stateEnd = this.context.WF_STATE.Find(step.STATE_END);
                    process.CURRENT_STATE_NAME = stateEnd.STATE_NAME;
                    if (stateEnd.IS_KETTHUC == true)
                    {
                        //Kiểm tra xe process đã kết thúc chưa. các hành động đã thực hiện chưa
                        var isNoFunc      = true;
                        var stateFunction = this.context.WF_STATE_FUNCTION.Where(x => x.WF_STATE_ID == stateEnd.ID).FirstOrDefault();
                        if (stateFunction != null)
                        {
                            //kiểm tra xem function đã thực hiện chưa
                            var done = this.context.WF_FUNCTION_DONE.Where(x => x.STATE == stateEnd.ID && x.ITEM_TYPE == process.ITEM_TYPE && x.FUNCTION_STATE == stateFunction.ID && x.ITEM_ID == process.ITEM_ID).Any();
                            if (!done)
                            {
                                //function đã thực hiện
                                isNoFunc = false;
                            }
                        }

                        if (isNoFunc)
                        {
                            process.IS_END = true;
                        }
                    }
                    if (idUserBack > 0)
                    {
                        mainUser = idUserBack;
                    }

                    #region cập nhật lại trạng thái đã xử lý của user cũ
                    var itemuserprocess = this.context.WF_ITEM_USER_PROCESS.Where(x =>
                                                                                  x.ITEM_TYPE == process.ITEM_TYPE && x.ITEM_ID == process.ITEM_ID &&
                                                                                  x.USER_ID == process.USER_ID && x.IS_XULYCHINH.Value == true).FirstOrDefault();
                    if (itemuserprocess != null)
                    {
                        itemuserprocess.DAXULY = true;
                        this.context.SaveChanges();
                    }
                    #endregion

                    if (mainUser > 0)
                    {
                        process.USER_ID = mainUser;
                    }

                    this.context.SaveChanges();
                    #endregion

                    #region Lưu người xử lý

                    if (mainUser > 0)
                    {
                        var wf_main_process = new WF_ITEM_USER_PROCESS();
                        wf_main_process.IS_XULYCHINH = true;
                        wf_main_process.ITEM_ID      = process.ITEM_ID;
                        wf_main_process.ITEM_TYPE    = process.ITEM_TYPE;
                        wf_main_process.STEP_ID      = curentStep;
                        wf_main_process.create_at    = DateTime.Now;
                        wf_main_process.create_by    = currentUser;
                        wf_main_process.USER_ID      = mainUser;
                        this.context.WF_ITEM_USER_PROCESS.Add(wf_main_process);
                        this.context.SaveChanges();
                    }

                    if (joinUser != null && joinUser.Any())
                    {
                        foreach (var item in joinUser)
                        {
                            var wf_join_process = new WF_ITEM_USER_PROCESS();
                            wf_join_process.IS_XULYCHINH = false;
                            wf_join_process.ITEM_ID      = process.ITEM_ID;
                            wf_join_process.ITEM_TYPE    = process.ITEM_TYPE;
                            wf_join_process.STEP_ID      = curentStep;
                            wf_join_process.create_at    = DateTime.Now;
                            wf_join_process.create_by    = currentUser;
                            wf_join_process.USER_ID      = item;
                            this.context.WF_ITEM_USER_PROCESS.Add(wf_join_process);
                            this.context.SaveChanges();
                        }
                    }

                    #endregion

                    #region ghi log xử lý

                    var log = new WF_LOG();
                    log.ITEM_ID      = process.ITEM_ID;
                    log.ITEM_TYPE    = process.ITEM_TYPE;
                    log.MESSAGE      = message;
                    log.create_at    = DateTime.Now;
                    log.NGUOIXULY_ID = ngxuly;
                    log.NGUONHAN_ID  = process.USER_ID;
                    log.WF_ID        = step.WF_ID;
                    log.STEP_ID      = step.ID;

                    this.context.WF_LOG.Add(log);
                    this.context.SaveChanges();

                    #endregion
                    transaction.Commit();
                }
                catch
                {
                    transaction.Rollback();
                    result.MessageFail("Có lỗi xử lý. Không thể chuyển trạng thái");
                }
            }
            return(result);
        }