Пример #1
0
        /// <summary>
        /// 加载代销结算单详细
        /// </summary>
        /// <param name="settlementSysNo"></param>
        /// <returns></returns>
        public virtual CollectionPaymentInfo Load(int sysNo)
        {
            //加载代销结算单主信息:
            CollectionPaymentInfo returnEntity = new CollectionPaymentInfo();

            returnEntity = CollectionPaymentDA.Load(sysNo);


            return(returnEntity);
        }
Пример #2
0
        public CollectionPaymentInfo CancelAudited(CollectionPaymentInfo entity)
        {
            VerifyCancelAudited(entity);
            entity.AuditUserSysNo = entity.CurrentUserSysNo;
            //entity.AuditUserSysNo = SystemUserHelper.GetUserSystemNumber(BusinessContext.Current.OperationUserFullName,
            //    BusinessContext.Current.OperationUserSourceDirectoryKey, BusinessContext.Current.OperationUserLoginName,
            //    BusinessContext.Current.CompanyCode);
            entity.CreateTime = DateTime.Now;
            entity.Status     = POCollectionPaymentSettleStatus.Origin;

            entity = CollectionPaymentDA.UpdateVendorSettleStatus(entity);

            //发送ESB消息
            EventPublisher.Publish <CollectionPaymentCancelMessage>(new CollectionPaymentCancelMessage()
            {
                CurrentUserSysNo = ServiceContext.Current.UserSysNo,
                SysNo            = entity.SysNo.Value
            });

            return(entity);
        }
Пример #3
0
        /// <summary>
        /// 审核
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public CollectionPaymentInfo Audit(CollectionPaymentInfo entity)
        {
            string OperationIP             = entity.OperationIP;
            int?   OperationUserSysNumber  = entity.OperationUserSysNumber;
            string OperationUserUniqueName = entity.OperationUserUniqueName;

            entity.AuditUserSysNo = entity.CurrentUserSysNo;
            //entity.AuditUserSysNo = SystemUserHelper.GetUserSystemNumber(BusinessContext.Current.OperationUserFullName,
            //    BusinessContext.Current.OperationUserSourceDirectoryKey, BusinessContext.Current.OperationUserLoginName,
            //    BusinessContext.Current.CompanyCode);
            //entity.AuditUserSysNo = 3256;
            VerifyAudite(entity);
            VerifyProductPMSysNo(entity);


            entity.AuditTime = DateTime.Now;
            entity.Status    = POCollectionPaymentSettleStatus.Audited;

            entity = CollectionPaymentDA.UpdateVendorSettleStatus(entity);

            //发送ESB消息
            EventPublisher.Publish <CollectionPaymentAuditMessage>(new CollectionPaymentAuditMessage()
            {
                CurrentUserSysNo = ServiceContext.Current.UserSysNo,
                SysNo            = entity.SysNo.Value
            });

            entity.OperationIP             = OperationIP;
            entity.OperationUserSysNumber  = OperationUserSysNumber;
            entity.OperationUserUniqueName = OperationUserUniqueName;

            //CommonService.WriteLog<CollectionPaymentEntity>(entity, " Audit CollectionPayment ", entity.SysNo.Value.ToString(), (int)LogType.CollectionPayment_Audit);
            ExternalDomainBroker.CreateLog(" Audit CollectionPayment "
                                           , BizEntity.Common.BizLogType.POC_VendorSettle_Audit
                                           , entity.SysNo.Value
                                           , entity.CompanyCode);
            return(entity);
        }
Пример #4
0
        public CollectionPaymentInfo CancelAbandon(CollectionPaymentInfo entity)
        {
            string OperationIP             = entity.OperationIP;
            int?   OperationUserSysNumber  = entity.OperationUserSysNumber;
            string OperationUserUniqueName = entity.OperationUserUniqueName;

            entity.CreateUserSysNo = entity.CreateUserSysNo;
            VerifyCancelAbandon(entity);

            entity.Status = POCollectionPaymentSettleStatus.Origin;

            //将代收代付转财务记录的状态修改为人工已建
            foreach (var item in entity.SettleItems)
            {
                item.ConsignToAccLogInfo.ConsignToAccStatus = ConsignToAccountLogStatus.ManualCreated;
            }

            using (TransactionScope scope = new TransactionScope())
            {
                entity = CollectionPaymentDA.UpdateVendorSettleStatus(entity);
                //更新代销转财务记录状态
                UpdateConsignToAccLogStatus(entity);

                scope.Complete();
            }

            entity.OperationIP             = OperationIP;
            entity.OperationUserSysNumber  = OperationUserSysNumber;
            entity.OperationUserUniqueName = OperationUserUniqueName;

            ExternalDomainBroker.CreateLog(" Abandon Cancel CollectionPayment "
                                           , BizEntity.Common.BizLogType.POC_VendorSettle_Abandon
                                           , entity.SysNo.Value
                                           , entity.CompanyCode);

            return(entity);
        }
Пример #5
0
        public CollectionPaymentInfo CancelSettled(CollectionPaymentInfo entity)
        {
            string OperationIP             = entity.OperationIP;
            int?   OperationUserSysNumber  = entity.OperationUserSysNumber;
            string OperationUserUniqueName = entity.OperationUserUniqueName;

            entity.SettleUserSysNo = entity.CurrentUserSysNo;
            VerifyCancelSettled(entity);


            //entity.SettleUserSysNo = SystemUserHelper.GetUserSystemNumber(BusinessContext.Current.OperationUserFullName,
            //BusinessContext.Current.OperationUserSourceDirectoryKey, BusinessContext.Current.OperationUserLoginName,
            //BusinessContext.Current.CompanyCode);

            //1 将所有以结算的财务单设置为ManualCreated状态
            //VendorSettleDAL dal = new VendorSettleDAL();

            //统计规则
            List <ConsignSettlementRulesInfo> quantityCountList = CollectionPaymentDA.GetSettleRuleQuantityCount(entity.SysNo.Value);

            foreach (var quantityCount in quantityCountList)
            {
                //规则状态到结算这一步,一定会是已生效或者是已过期,还包括已终止,其他的一律视为异常
                if (quantityCount.Status != ConsignSettleRuleStatus.Disable &&
                    quantityCount.Status != ConsignSettleRuleStatus.Enable &&
                    quantityCount.Status != ConsignSettleRuleStatus.Stop)
                {
                    throw new BizException(string.Format(GetMessageString("Consign_Check_InvalidConsignSettleRule"), quantityCount.SettleRulesName));
                }
            }

            using (TransactionScope scope = new TransactionScope())
            {
                #region 结算规则操作
                foreach (var quantityCount in quantityCountList)
                {
                    //计算结算数量
                    quantityCount.SettledQuantity -= quantityCount.SubmitSettleQuantity;
                    //修改规则状态
                    switch (quantityCount.Status)
                    {
                    case ConsignSettleRuleStatus.Enable:
                        quantityCount.IsNeedUpdateStatus = true;
                        break;

                    case ConsignSettleRuleStatus.Disable:
                        quantityCount.IsNeedUpdateStatus = true;
                        quantityCount.Status             = ConsignSettleRuleStatus.Enable;
                        break;

                    case ConsignSettleRuleStatus.Stop:
                        //已终止状态将不在处理
                        break;

                    default:
                        break;
                    }
                    if (quantityCount.SettledQuantity.Value == 0)
                    {
                        //刚好使用到的规则的商品数量为0,证明只有该数据使用规则,将其变成以未生效状态
                        quantityCount.Status = ConsignSettleRuleStatus.Available;
                    }
                    if (quantityCount.IsNeedUpdateStatus)
                    {
                        //修改结算规则状态为已生效
                        ObjectFactory <IConsignSettlementDA> .Instance.UpdateConsignSettleRuleStatusAndQuantity(quantityCount.RuleSysNo.Value, quantityCount.Status.Value, quantityCount.SettledQuantity.Value);
                    }
                }
                #endregion

                foreach (CollectionPaymentItem item in entity.SettleItems)
                {
                    item.ConsignToAccLogInfo.ConsignToAccStatus = ConsignToAccountLogStatus.ManualCreated;
                    item.ConsignToAccLogInfo.Cost     = 0;
                    item.ConsignToAccLogInfo.FoldCost = null;
                    ConsignSettlementDA.CancelSettleConsignToAccountLog(item.ConsignToAccLogInfo.LogSysNo.Value);
                }

                //2 修改结算单的状态
                entity.SettleTime     = DateTime.Now;
                entity.Status         = POCollectionPaymentSettleStatus.Audited;
                entity.AuditUserSysNo = entity.CurrentUserSysNo;
                entity = this.CollectionPaymentDA.UpdateVendorSettleStatus(entity);

                //发送ESB消息
                EventPublisher.Publish <CollectionPaymentCancelSettlementMessage>(new CollectionPaymentCancelSettlementMessage()
                {
                    CurrentUserSysNo = ServiceContext.Current.UserSysNo,
                    SysNo            = entity.SysNo.Value
                });

                scope.Complete();
            }

            ExternalDomainBroker.CreateLog(" CancelSettled VendorSettle "
                                           , BizEntity.Common.BizLogType.POC_VendorSettle_CancelSettle
                                           , entity.SysNo.Value
                                           , entity.CompanyCode);
            //记录规则更新日志
            foreach (var qLog in quantityCountList.Where(p => p.IsNeedUpdateStatus))
            {
                ExternalDomainBroker.CreateLog("CancelSettled VendorSettle Update SettleRule"
                                               , BizEntity.Common.BizLogType.ConsignSettleRule_Update
                                               , qLog.RuleSysNo.Value
                                               , qLog.CompanyCode);
            }
            return(entity);
        }
Пример #6
0
        public CollectionPaymentInfo Settle(CollectionPaymentInfo entity)
        {
            string OperationIP             = entity.OperationIP;
            int?   OperationUserSysNumber  = entity.OperationUserSysNumber;
            string OperationUserUniqueName = entity.OperationUserUniqueName;

            entity.SettleUserSysNo = entity.CurrentUserSysNo;
            VerifySettle(entity);

            this.VerifySettleItems(entity, SettlementVerifyType.SETTLE);
            //entity.SettleUserSysNo = SystemUserHelper.GetUserSystemNumber(BusinessContext.Current.OperationUserFullName,
            //    BusinessContext.Current.OperationUserSourceDirectoryKey, BusinessContext.Current.OperationUserLoginName,
            //    BusinessContext.Current.CompanyCode);
            //CollVendorSettleDAL dal = collVendorSettleDAL;
            //entity.CreateUserSysNo = 3256;


            //统计规则
            string text = string.Empty;
            List <ConsignSettlementRulesInfo> ruleList = CollectionPaymentDA.GetSettleRuleQuantityCount(entity.SysNo.Value);

            foreach (var currentRule in ruleList)
            {
                //规则状态到结算这一步,一定会是已生效或者是未生效,其他的一律视为异常
                if (currentRule.Status != ConsignSettleRuleStatus.Available && currentRule.Status != ConsignSettleRuleStatus.Enable)
                {
                    //规则已经是无效状态,抛出异常
                    text = string.Format("无效的规则:{0}", currentRule.SettleRulesName);
                    throw new BizException(text);
                }

                //超过结算数量
                bool result = false;
                if (currentRule.SettleRulesQuantity.HasValue)
                {
                    result = currentRule.SettleRulesQuantity.Value - (currentRule.SettledQuantity ?? 0) - (currentRule.SubmitSettleQuantity ?? 0) < 0;
                }
                if (result)
                {
                    //超过结算数量,抛出异常
                    throw new BizException(string.Format(GetMessageString("Consign_Check_MoreThanSettleRuleQuantity"), currentRule.SettleRulesName));
                }
            }

            using (TransactionScope scope = new TransactionScope())
            {
                #region 结算规则操作
                foreach (var quantityCount in ruleList)
                {
                    quantityCount.SettledQuantity = quantityCount.SettledQuantity.Value + quantityCount.SubmitSettleQuantity;
                    //修改规则状态
                    if (quantityCount.Status == ConsignSettleRuleStatus.Available)
                    {
                        quantityCount.Status = ConsignSettleRuleStatus.Enable;
                    }

                    //如果数量为0了,将修改状态为已过期
                    if (quantityCount.SettleRulesQuantity.HasValue && quantityCount.SettleRulesQuantity.Value == (quantityCount.SettledQuantity ?? 0))
                    {
                        quantityCount.Status          = ConsignSettleRuleStatus.Disable;
                        quantityCount.SettledQuantity = quantityCount.SettleRulesQuantity;
                    }
                    //修改结算规则状态为已生效
                    ObjectFactory <IConsignSettlementDA> .Instance.UpdateConsignSettleRuleStatusAndQuantity(quantityCount.RuleSysNo.Value, quantityCount.Status.Value, quantityCount.SettledQuantity.Value);
                }

                #endregion

                //更改每个item的财务记录为最终结算
                foreach (CollectionPaymentItem item in entity.SettleItems)
                {
                    if (ConsignToAccountLogStatus.Settled == item.ConsignToAccLogInfo.ConsignToAccStatus.Value)
                    {
                        //当前商品的代销转财务记录(记录号:{0})的状态已经为“已结算”状态!
                        throw new BizException(string.Format(GetMessageString("Consign_AccStatus_Settled_Check"), item.ConsignToAccLogInfo.ConsignToAccStatus.Value));
                    }

                    if (item.Cost < 0)
                    {
                        //当前商品(商品系统编号:{0})的结算金额小于0!
                        throw new BizException(string.Format(GetMessageString("Consign_Products_SettleAmt_Check"), item.ConsignToAccLogInfo.ProductSysNo.Value));
                    }
                    decimal foldCost = item.ConsignToAccLogInfo.CreateCost.Value - item.Cost;
                    ConsignSettlementDA.SettleConsignToAccountLog(item.ConsignToAccLogInfo.LogSysNo.Value, item.Cost, foldCost);
                }

                //2 修改结算单的状态
                entity.SettleTime = DateTime.Now;
                entity.Status     = POCollectionPaymentSettleStatus.Settled;
                entity            = this.CollectionPaymentDA.UpdateVendorSettleStatus(entity);

                //发送ESB消息
                EventPublisher.Publish <CollectionPaymentSettlementMessage>(new CollectionPaymentSettlementMessage()
                {
                    CurrentUserSysNo = ServiceContext.Current.UserSysNo,
                    SysNo            = entity.SysNo.Value
                });

                scope.Complete();
            }


            //结算商品期间过期状态判断
            foreach (var quantityCount in ruleList)
            {
                if (quantityCount.Status == ConsignSettleRuleStatus.Enable)
                {
                    //如果这期间的结算商品已经全部结算完毕,那么这个结算规则也无效,对于是否还有剩余将无效
                    ObjectFactory <IConsignSettlementDA> .Instance.UpdateExistsConsignSettleRuleItemStatus(quantityCount.RuleSysNo.Value);
                }
            }
            //3 生成结算单的付款单
            //调用Invoice接口:生成结算单的付款单

            ExternalDomainBroker.CreatePayItem(new PayItemInfo()
            {
                OrderSysNo = entity.SysNo.Value,
                PayAmt     = entity.TotalAmt,
                OrderType  = PayableOrderType.CollectionPayment,
                PayStyle   = PayItemStyle.Normal
            });

            ExternalDomainBroker.CreateLog(" Settled VendorSettle "
                                           , BizEntity.Common.BizLogType.POC_VendorSettle_Settle
                                           , entity.SysNo.Value
                                           , entity.CompanyCode);
            //记录规则更新日志
            foreach (var qLog in ruleList)
            {
                ExternalDomainBroker.CreateLog("Settled VendorSettle Update SettleRule"
                                               , BizEntity.Common.BizLogType.ConsignSettleRule_Update
                                               , qLog.RuleSysNo.Value
                                               , qLog.CompanyCode);
            }

            return(entity);
        }
Пример #7
0
        public CollectionPaymentInfo Update(CollectionPaymentInfo entity)
        {
            string OperationIP             = entity.OperationIP;
            int?   OperationUserSysNumber  = entity.OperationUserSysNumber;
            string OperationUserUniqueName = entity.OperationUserUniqueName;

            VerifyUpdate(entity);
            VerifySettleItems(entity, SettlementVerifyType.UPDATE);
            VerifyProductPMSysNo(entity);
            VerityOverConsignRuleQuantity(entity);


            List <CollectionPaymentItem> list = new List <CollectionPaymentItem>();

            using (TransactionScope scope = new TransactionScope())
            {
                //1 删除需要delete的item
                foreach (CollectionPaymentItem item in entity.SettleItems)
                {
                    if (item.SettleSysNo.HasValue && item.SettleSysNo == -1)
                    {
                        list.Add(item);
                    }
                }

                if (list.Count > 0)
                {
                    foreach (CollectionPaymentItem item in list)
                    {
                        //将需要删除的Item对应的Acclog状态改为[初始状态:0]
                        //VendorDA.UpdateConsignToAccountLogStatus(item.ConsignToAccLogInfo.LogSysNo.Value, ConsignToAccountLogStatus.Origin);
                        this.ConsignSettlementDA.UpdateConsignToAccountLogStatus(
                            item.ConsignToAccLogInfo.LogSysNo.Value, ConsignToAccountLogStatus.Origin);
                        CollectionPaymentDA.DeleteSettleItem(item);

                        entity.SettleItems.Remove(item);
                    }
                }

                //将所有选中的SettleItem状态改为[人工已建:4]
                var validItems = entity.SettleItems.Except(list);

                foreach (var item in validItems)
                {
                    //如果item的sysno没有值,则表示是新增加的item,需要更新对应的ConfignToAcclog
                    if (!item.ItemSysNo.HasValue)
                    {
                        item.ConsignToAccLogInfo.ConsignToAccStatus = ConsignToAccountLogStatus.ManualCreated;
                        this.ConsignSettlementDA.UpdateConsignToAccountLogStatus(item.ConsignToAccLogInfo.LogSysNo.Value, ConsignToAccountLogStatus.ManualCreated);
                    }
                }

                //2 更新结算单
                CollectionPaymentDA.Update(entity);

                scope.Complete();
            }

            //3 记录删除的items
            foreach (CollectionPaymentItem item in list)
            {
                if (item.ItemSysNo.HasValue)
                {
                    item.OperationIP             = OperationIP;
                    item.OperationUserSysNumber  = OperationUserSysNumber;
                    item.OperationUserUniqueName = OperationUserUniqueName;
                    //CommonService.WriteLog<CollectionPaymentItem>(item, " Deleted CollectionPaymentItem ", item.SysNo.Value.ToString(), (int)LogType.CollectionPayment_Item_Delete);
                    ExternalDomainBroker.CreateLog(" Deleted CollectionPaymentItem "
                                                   , BizEntity.Common.BizLogType.POC_VendorSettle_Item_Delete
                                                   , item.ItemSysNo.Value
                                                   , entity.CompanyCode);
                }
            }

            //4 记录修改的items
            foreach (CollectionPaymentItem item in entity.SettleItems)
            {
                if (item.ItemSysNo.HasValue)
                {
                    item.OperationIP             = OperationIP;
                    item.OperationUserSysNumber  = OperationUserSysNumber;
                    item.OperationUserUniqueName = OperationUserUniqueName;
                    //CommonService.WriteLog<CollectionPaymentItem>(item, " Updated CollectionPaymentSettleItem ", item.SysNo.Value.ToString(), (int)LogType.CollectionPayment_Item_Update);
                    ExternalDomainBroker.CreateLog(" Updated CollectionPaymentSettleItem "
                                                   , BizEntity.Common.BizLogType.POC_VendorSettle_Item_Update
                                                   , item.ItemSysNo.Value
                                                   , entity.CompanyCode);
                }
            }

            return(entity);
        }
Пример #8
0
        /// <summary>
        /// 加载代销结算单详细
        /// </summary>
        /// <param name="settlementSysNo"></param>
        /// <returns></returns>
        public virtual CollectionPaymentInfo Create(CollectionPaymentInfo entity)
        {
            //去除已经删除的Item(SysNo=-1) 次方法已经在Portal加过了,此处只为以防万一了
            entity.SettleItems = (from tItem in entity.SettleItems
                                  where tItem.SettleSysNo != -1
                                  select tItem).ToList();

            string OperationIP             = string.Empty;
            string OperationUserUniqueName = string.Empty;

            VerifyCreate(entity);
            VerifySettleItems(entity, SettlementVerifyType.CREATE);
            VerifyProductPMSysNo(entity);
            //VerityOverConsignRuleQuantity(entity);

            //entity.CreateUserSysNo = SystemUserHelper.GetUserSystemNumber(BusinessContext.Current.OperationUserFullName,
            //        BusinessContext.Current.OperationUserSourceDirectoryKey, BusinessContext.Current.OperationUserLoginName,
            //        BusinessContext.Current.CompanyCode);
            entity.CreateUserSysNo = entity.CurrentUserSysNo;;
            entity.CreateTime      = DateTime.Now;
            entity.Status          = POCollectionPaymentSettleStatus.Origin;

            //修改代销转财务记录的状态
            foreach (var item in entity.SettleItems)
            {
                item.ConsignToAccLogInfo.ConsignToAccStatus = ConsignToAccountLogStatus.ManualCreated;
                //item.
            }
            //用于收集操作过的结算单
            List <CollectionPaymentInfo> settleEntityList = new List <CollectionPaymentInfo>();

            //计算返点,返点总额将会平均分配到以下结算单,当返点总额大于单个结算单的返点额,那单个结算单返点将和计算单总额相等
            //剩余返点额将在下个结算单中使用
            decimal totalUsingReturnPoint = entity.UsingReturnPoint ?? 0;

            using (TransactionScope scope = new TransactionScope())
            {
                //按照仓库的不同自动分结算单
                var stockSysNoList = entity.SettleItems.Select(p => p.ConsignToAccLogInfo.StockSysNo).Distinct();

                foreach (int?stockSysNo in stockSysNoList)
                {
                    //需要深度赋值新的类
                    var newEntity = SerializationUtility.DeepClone <CollectionPaymentInfo>(entity);

                    newEntity.SourceStockInfo.SysNo = stockSysNo;
                    var tempSettleList = new List <CollectionPaymentItem>();
                    tempSettleList.AddRange(newEntity.SettleItems.Where(p => p.ConsignToAccLogInfo.StockSysNo == stockSysNo));
                    //计算总结算数
                    newEntity.TotalAmt = tempSettleList.Sum(p => p.Cost * p.ConsignToAccLogInfo.ProductQuantity.Value);


                    newEntity.SettleItems = tempSettleList;

                    //判断规则数量是否还有剩余


                    newEntity    = CollectionPaymentDA.Create(newEntity);
                    entity.SysNo = newEntity.SysNo;
                    //将操作完成的收集在临时列表中
                    settleEntityList.Add(newEntity);
                }
                //更新代销转财务记录状态
                settleEntityList.ForEach(x =>
                {
                    UpdateConsignToAccLogStatus(x);
                });

                //发送ESB消息
                EventPublisher.Publish <CollectionPaymentCreateMessage>(new CollectionPaymentCreateMessage()
                {
                    CurrentUserSysNo = ServiceContext.Current.UserSysNo,
                    SysNo            = entity.SysNo.Value
                });

                scope.Complete();
            }

            foreach (var newEntity in settleEntityList)
            {
                //执行其它操作
                newEntity.OperationIP             = OperationIP;
                newEntity.OperationUserSysNumber  = entity.CreateUserSysNo;
                newEntity.OperationUserUniqueName = OperationUserUniqueName;
                //CommonService.WriteLog<CollectionPaymentEntity>(newEntity, " Create VendorSettle ", newEntity.SysNo.Value.ToString(), (int)LogType.CollectionPayment_Create);
                VendorInfo vendor = VendorDA.LoadVendorInfo(newEntity.VendorInfo.SysNo.Value);
                if (vendor.VendorFinanceInfo.IsAutoAudit != null && vendor.VendorFinanceInfo.IsAutoAudit == true)
                {
                    try
                    {
                        Audit(newEntity);
                    }
                    catch (Exception ex)
                    {
                        //MailService.SendMail(ConfigurationManager.AppSettings["VendorSettleFrom"], ConfigurationManager.AppSettings["VendorSettleTo"], "代销结算单自动审核", newEntity.SysNo.ToString() + ":" + ex.ErrorDescription);
                    }

                    //自动结算
                    entity = Settle(newEntity);
                }
            }
            return(entity);
        }