public bool RemoveIncome(UploadInfo info)
        {
            var tobj = repoTargetIncome.Query(o => o.TargetStateId == info.TargetStateId && o.IncomeId == info.UploadId).FirstOrDefault();
            if (tobj == null)
                throw new ArgumentNullException(string.Format("Target income {0} not found!", info.UploadId));

            bool result = repoTargetIncome.Delete(tobj);

            TargetIncomeChangedMessage msg = new TargetIncomeChangedMessage()
            {
                TargetIncome = tobj,
                DataOperation = DataOperation.Delete,
                OperateTime = info.OperationTime,
                OperatorId = info.UserId,
                OperatorName = info.UserName
            };
            try
            {
                MessageManager.Publish<TargetIncomeChangedMessage>(msg);
            }
            catch (Exception ex)
            {
                //throw ex;
            }
            return result;
        }
        public bool UploadIncome(UploadInfo info)
        {
            if (string.IsNullOrEmpty(info.FileUrl))
                throw new Exception("no file provided!");
            var targetState = repoTargetState.Query(o => o.TargetStateId == info.TargetStateId).FirstOrDefault();
            if (targetState == null)
                throw new ArgumentNullException(string.Format("Target with state {0} not found!", info.TargetStateId));
            var tobj = repoTargetIncome.Query(o => o.TargetStateId == info.TargetStateId && o.IncomeId == info.UploadId).FirstOrDefault();
            if (tobj == null)
            {
                var obj = repoFlowIncome.Query(o => o.IncomeId == info.UploadId).FirstOrDefault();
                if (obj == null)
                    throw new ArgumentNullException(string.Format("Income width {0} in state {1} not defined!", info.UploadId, targetState.StateId));

                tobj = new TargetIncome()
                {
                    TargetIncomeId = idGenerator.NewId(),
                    TargetStateId = info.TargetStateId,
                    IncomeId = info.UploadId,
                    Name = obj.Name,
                    Remark = info.Remark,
                    UploadTime = info.OperationTime,
                    FileType = obj.FileType,
                    FileUrl = info.FileUrl,
                    FileStatus = FileStatus.Draft,
                    UploaderId = info.UserId,
                    UploaderName = info.UserName
                };

                bool result = repoTargetIncome.Insert(tobj);

                TargetIncomeChangedMessage msg = new TargetIncomeChangedMessage()
                {
                    TargetIncome = tobj,
                    DataOperation = DataOperation.Insert,
                    OperateTime = info.OperationTime,
                    OperatorId = info.UserId,
                    OperatorName = info.UserName
                };
                try
                {
                    MessageManager.Publish<TargetIncomeChangedMessage>(msg);
                }
                catch (Exception ex)
                {
                    //throw ex;
                }
                return result;
            }
            else
            {
                if (!tobj.Verified.HasValue || !tobj.Verified.Value)
                {
                    tobj.Remark = info.Remark;
                    tobj.FileUrl = info.FileUrl;
                    tobj.UploadTime = info.OperationTime;
                    tobj.Remark = tobj.Remark + Environment.NewLine + info.Remark;

                    tobj.UploaderId = info.UserId;
                    tobj.UploaderName = info.UserName;
                    bool result = repoTargetIncome.Update(tobj);

                    TargetIncomeChangedMessage msg = new TargetIncomeChangedMessage()
                    {
                        TargetIncome = tobj,
                        DataOperation = DataOperation.Insert,
                        OperateTime = info.OperationTime,
                        OperatorId = info.UserId,
                        OperatorName = info.UserName
                    };
                    try
                    {
                        MessageManager.Publish<TargetIncomeChangedMessage>(msg);
                    }
                    catch (Exception ex)
                    {
                        //throw ex;
                    }
                    return result;
                }
                else
                {
                    throw new ApplicationException(string.Format("Income {0} has been verified!", tobj.TargetIncomeId));
                }
            }
        }
        public bool VerifyIncome(UploadInfo info)
        {
            if (string.IsNullOrEmpty(info.FileUrl))
                throw new Exception("no file provided!");
            var targetState = repoTargetState.Query(o => o.TargetStateId == info.TargetStateId).FirstOrDefault();
            if (targetState == null)
                throw new ArgumentNullException(string.Format("Target with state {0} not found!", info.TargetStateId));
            var tobj = repoTargetIncome.Query(o => o.TargetStateId == info.TargetStateId && o.IncomeId == info.UploadId).FirstOrDefault();
            if (tobj == null)
                throw new ArgumentNullException(string.Format("Income {0} in state {1} not found!", info.UploadId, info.TargetStateId));

            tobj.Verified = info.Verified;
            tobj.Remark = tobj.Remark + Environment.NewLine + info.Remark;
            tobj.VerifierId = info.UserId;
            tobj.VerifierName = info.UserName;
            tobj.VerifierTime = info.OperationTime;
            tobj.FileStatus = info.Verified.Value ? FileStatus.Verified : FileStatus.InValid;

            bool result = repoTargetIncome.Update(tobj);

            TargetIncomeChangedMessage msg = new TargetIncomeChangedMessage()
            {
                TargetIncome = tobj,
                DataOperation = DataOperation.Update,
                OperateTime = info.OperationTime,
                OperatorId = info.UserId,
                OperatorName = info.UserName
            };
            try
            {
                MessageManager.Publish<TargetIncomeChangedMessage>(msg);
            }
            catch (Exception ex)
            {
                //throw ex;
            }
            return result;
        }