예제 #1
0
        public virtual void VerifyProductPMSysNo(CollectionPaymentInfo entity)
        {
            if (entity.PMInfo == null || !entity.PMInfo.SysNo.HasValue)
            {
                //代销结算单的归属PM不能为空
                throw new BizException("代销结算单的归属PM不能为空");
            }

            #region Jack.W.Wang 本代码已停用,更换为产品线验证
            //获取PM Backup List:
            List <int> pms = ConsignSettlementDA.GetBackUpPMList(entity.PMInfo.SysNo.Value, entity.CompanyCode);

            pms.Add(entity.PMInfo.SysNo.Value);

            //代销单归属PM(或归属PM的备份PM)与商品PM不一致 :
            bool exists = ConsignSettlementDA.ExistsDifferentPMSysNo(pms, entity.SettleItems.Select(x => x.ProductSysNo.Value).ToList(), entity.CompanyCode);

            if (exists)
            {
                //代销单归属PM(或归属PM的备份PM)与商品PM不一致
                throw new BizException("归属PM(或归属PM的备份PM)与商品PM不一致");
            }
            #endregion
        }
예제 #2
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);
        }
예제 #3
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);
        }
예제 #4
0
        /// <summary>
        /// 新建/更新结算单时对结算商品的Check逻辑
        /// </summary>
        /// <param name="info"></param>
        /// <param name="verifyType"></param>
        public virtual void VerifySettleItems(CollectionPaymentInfo info, SettlementVerifyType verifyType)
        {
            decimal totalCount = 0;

            foreach (CollectionPaymentItem item in info.SettleItems)
            {
                //检查当前item是否是要删除的项目
                if (item.SettleSysNo.HasValue && item.SettleSysNo.Value == -1)
                {
                    continue;
                }
                ConsignToAcctLogInfo getConsignToAccLog = ConsignSettlementDA.LoadConsignToAccountLogInfo(item.ConsignToAccLogInfo.LogSysNo);
                //1 检查当前item是否有对应的account记录
                if (getConsignToAccLog == null)
                {
                    //未找到当前商品(商品系统编号:{0})对应的代销转财务记录!
                    throw new BizException(string.Format(GetMessageString("Consign_ProductsAccLog_NotFound"), item.ConsignToAccLogInfo.ProductSysNo));
                }

                switch (verifyType)
                {
                case SettlementVerifyType.CREATE:
                    //1 检查当前财务记录的状态
                    if (getConsignToAccLog.ConsignToAccStatus != ConsignToAccountLogStatus.Origin)
                    {
                        //当前商品(商品系统编号:{0})对应的到财务记录不为待结算状态!
                        throw new BizException(string.Format(GetMessageString("Consign_ProductsAccLog_WaitingSettle"), item.ConsignToAccLogInfo.ProductSysNo));
                    }
                    break;

                case SettlementVerifyType.SETTLE:
                    //2 检查当前财务记录的状态
                    if (getConsignToAccLog.ConsignToAccStatus != ConsignToAccountLogStatus.SystemCreated && getConsignToAccLog.ConsignToAccStatus != ConsignToAccountLogStatus.ManualCreated)
                    {
                        //当前商品(商品系统编号:{0})对应的到财务记录不为待结算状态!
                        throw new BizException(string.Format(GetMessageString("Consign_ProductsAccLog_WaitingSettle"), item.ConsignToAccLogInfo.ProductSysNo));
                    }
                    break;

                case SettlementVerifyType.UPDATE:
                    //3 检查当前财务记录的状态
                    if (getConsignToAccLog.ConsignToAccStatus == ConsignToAccountLogStatus.Finance || getConsignToAccLog.ConsignToAccStatus == ConsignToAccountLogStatus.Settled)
                    {
                        //当前商品(商品系统编号:{0})对应的到财务记录不为待结算状态!
                        throw new BizException(string.Format(GetMessageString("Consign_ProductsAccLog_WaitingSettle"), item.ConsignToAccLogInfo.ProductSysNo));
                    }
                    break;

                default:
                    //verifyType没有传入有效的值
                    throw new BizException(GetMessageString("Consign_VerifytType_Invalid"));
                }

                //3  检查当前记录的结算价格
                if (item.Cost < 0)
                {
                    //当前商品(商品系统编号:{0})的结算价格不能小于零!
                    throw new BizException(string.Format(GetMessageString("Consign_Products_SettleAmt_Check2"), item.ConsignToAccLogInfo.ProductSysNo));
                }

                //4 检查当前记录是否是同一个vendor
                if (getConsignToAccLog.VendorSysNo.Value != info.VendorInfo.SysNo)
                {
                    //当前商品(商品系统编号:{0})的供应商与结算单的供应商不一致!
                    throw new BizException(string.Format(GetMessageString("Consign_VendorNotTheSame"), item.ConsignToAccLogInfo.ProductSysNo));
                }

                //5 检查当前记录是否是同一个stock
                if (getConsignToAccLog.StockSysNo != info.SourceStockInfo.SysNo)
                {
                    //因为存在按仓库拆分逻辑,创建时不判断仓库
                    if (verifyType != SettlementVerifyType.CREATE)
                    {
                        //当前商品(商品系统编号:{0})的仓库与结算单的仓库不一致!
                        throw new BizException(string.Format(GetMessageString("Consign_StockNotTheSame"), item.ConsignToAccLogInfo.ProductSysNo));
                    }
                }

                //6 计算总价
                totalCount += item.Cost * getConsignToAccLog.ProductQuantity.Value;
            }
            //7 检查计算的总价
            if (info.TotalAmt != totalCount)
            {
                //结算单的总金额与当前实际结算金额不一致
                throw new BizException(GetMessageString("Consign_SettleAmtTheSame"));
            }
        }