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 }
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); }
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); }
/// <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")); } }