Beispiel #1
0
        /// <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);
        }