/// <summary> /// PMCC审核通过 /// </summary> /// <param name="refundInfo"></param> /// <returns></returns> public virtual VendorRefundInfo PMCCApproveVendorRefund(VendorRefundInfo refundInfo) { //编号不能为空 if (!refundInfo.SysNo.HasValue || refundInfo.SysNo.Value <= 0) { //供应商退款编号无效 throw new BizException(GetMessageString("VendorRefund_SysNoEmpty")); } VendorRefundInfo localEntity = VendorRefundDA.LoadVendorRefundInfo(refundInfo.SysNo.Value); if (localEntity == null) { //供应商退款单在数据中不存在 throw new BizException(GetMessageString("VendorRefund_RefundNotExist")); } if (localEntity.Status.Value == VendorRefundStatus.Abandon) { //该供应商退款单为作废状态,不允许进行当前操作! throw new BizException(GetMessageString("VendorRefund_Abandon_Invalid")); } if (localEntity.Status.Value == VendorRefundStatus.Origin) { //该供应商退款单为初始状态,不允许进行当前操作! throw new BizException(GetMessageString("VendorRefund_Origin_Invalid")); } if (localEntity.Status.Value == VendorRefundStatus.PMDVerify) { //该供应商退款单为PMD审核状态,不允许进行当前操作! throw new BizException(GetMessageString("VendorRefund_PMDVerify_Invalid")); } if (localEntity.Status.Value == VendorRefundStatus.PMCCVerify) { throw new BizException("该供应商退款单为PMCC审核状态,不允许进行当前操作!"); } //if (localEntity.CreateUserSysNo == ServiceContext.Current.UserSysNo) //{ // //供应商退款单中,创建人,PM审核人,PMD审核人,PMCC审核人,不能相同 // throw new BizException(GetMessageString("VendorRefund_OperatorCannotSame_Invalid")); //} localEntity.PMCCUserSysNo = ServiceContext.Current.UserSysNo; localEntity.PMCCAuditTime = System.DateTime.Now; localEntity.PMCCMemo = refundInfo.PMCCMemo; localEntity.Status = VendorRefundStatus.PMCCVerify; //加载当前商家退款单Items: List <VendorRefundItemInfo> localItem = VendorRefundDA.LoadVendorRefundItems(localEntity.SysNo.Value); #region 调用RMA接口:判断单件是否可以关闭 List <int> RegisterSysNo = new List <int>(); localItem.ForEach(a => RegisterSysNo.Add(a.RegisterSysNo.Value)); //调用RMA接口,判断单件是否可以关闭 List <RMARegisterInfo> getList = ExternalDomainBroker.GetRMARegisterList(RegisterSysNo); foreach (var item in getList) { if (item.BasicInfo.Status != RMARequestStatus.Handling) //RMARequestStatus.Handling 1 表示 处理中 { throw new BizException(string.Format(GetMessageString("VendorRefund_CloseInvalid"), item.SysNo.Value)); } } #endregion TransactionOptions options = new TransactionOptions(); options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; options.Timeout = TransactionManager.DefaultTimeout; List <VendorRefundItemInfo> list = new List <VendorRefundItemInfo>(); List <KeyValuePair <int, int> > registerList = new List <KeyValuePair <int, int> >(); List <VendorRefundInfo> deductOnVendor = new List <VendorRefundInfo>(); using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options)) { //更新状态 : localEntity = VendorRefundDA.UpdateVendorRefundInfo(localEntity); //关闭单件并扣减RMA库存中OnVendorQty数量: list = VendorRefundDA.LoadVendorRefundItems(localEntity.SysNo.Value); foreach (var item in list) { int registerNo = item.RegisterSysNo.Value; registerList.Add(new KeyValuePair <int, int>(registerNo, localEntity.PMDUserSysNo.Value)); ////调用RMA接口,根据单件号获取接收仓库: string[] str = ExternalDomainBroker.GetReceiveWarehouseByRegisterSysNo(registerNo); if (!string.IsNullOrEmpty(str[0]) && !string.IsNullOrEmpty(str[1])) { deductOnVendor.Add(new VendorRefundInfo { WarehouseSysNo = Convert.ToInt32(str[0]), ProductSysNo = Convert.ToInt32(str[1]), RegisterSysNo = registerNo }); } } ////调用RMA接口,关闭送修单: List <int> OutBound = ExternalDomainBroker.GetOutBoundSysNoListByRegisterSysNo(registerList.ToListString("Key")); ExternalDomainBroker.UpdateOutBound(OutBound.ToListString()); //发送ESB消息 EventPublisher.Publish <VendorRefundInfoAuditMessage>(new VendorRefundInfoAuditMessage() { AuditUserSysNo = ServiceContext.Current.UserSysNo, SysNo = refundInfo.SysNo.Value }); scope.Complete(); } ////调用RMA接口:关闭单件 List <int> registerSysNos = new List <int>(); registerList.ForEach(x => { registerSysNos.Add(x.Key); }); ExternalDomainBroker.BatchCloseRegisterForVendorRefund(registerSysNos); //扣减RMA库存中OnVendorQty数量 ExternalDomainBroker.BatchDeductOnVendorQty(deductOnVendor); ////调用Invoice接口,生成财务POR记录 PayableInfo payableInfo = new PayableInfo() { OrderSysNo = localEntity.SysNo.Value, CurrencySysNo = 1, OrderAmt = -1 * localEntity.RefundCashAmt.Value, PayStatus = 0, InvoiceStatus = 0, OrderType = PayableOrderType.RMAPOR, //9 InvoiceUpdateTime = DateTime.Parse("1900-1-1"), InvoiceFactStatus = PayableInvoiceFactStatus.Others // 3 }; PayableInfo createdPayableInfo = ExternalDomainBroker.CreatePayable(payableInfo); if (null != createdPayableInfo && 0 < createdPayableInfo.SysNo) { int financePaySysNo = createdPayableInfo.SysNo.Value; List <PayItemInfo> payItemList = new List <PayItemInfo>(); list.ForEach(x => { PayItemInfo item = new PayItemInfo() { PaySysNo = financePaySysNo, PayStyle = PayItemStyle.Normal, Status = PayItemStatus.Origin, PayAmt = x.RefundCash.HasValue ? (-1 * x.RefundCash.Value) : -999999, OrderType = PayableOrderType.RMAPOR, OrderSysNo = x.RefundSysNo.Value }; payItemList.Add(item); }); ExternalDomainBroker.BatchCreatePayItem(payItemList); } return(localEntity); }