internal ResultModel Update(NFMT.Common.UserModel user, NFMT.Contract.Model.ContractSub sub, NFMT.Contract.Model.SubDetail detail, NFMT.Contract.Model.SubPrice price, List<Model.SubCorporationDetail> outCorps, List<Model.SubCorporationDetail> inCorps,List<Model.SubTypeDetail> subTypes = null) { ResultModel result = new ResultModel(); try { DAL.ContractDAL contractDAL = new ContractDAL(); DAL.SubDetailDAL detailDAL = new SubDetailDAL(); DAL.SubPriceDAL priceDAL = new SubPriceDAL(); DAL.ContractCorporationDetailDAL conCropDAL = new ContractCorporationDetailDAL(); DAL.SubCorporationDetailDAL subCorpDAL = new SubCorporationDetailDAL(); //加载子合约 result = contractsubDAL.Get(user, sub.SubId); if (result.ResultStatus != 0) return result; NFMT.Contract.Model.ContractSub resultSub = result.ReturnValue as NFMT.Contract.Model.ContractSub; if (resultSub == null || resultSub.SubId <= 0) { result.ResultStatus = -1; result.Message = "更新子合约失败"; return result; } //验证主合约是否存在 result = contractDAL.Get(user, resultSub.ContractId); if (result.ResultStatus != 0) return result; NFMT.Contract.Model.Contract contract = result.ReturnValue as NFMT.Contract.Model.Contract; if (contract == null || contract.ContractId <= 0) { result.ResultStatus = -1; result.Message = "主合约不存在"; return result; } resultSub.AssetId = sub.AssetId; resultSub.ContractDate = sub.ContractDate; resultSub.ContractLimit = sub.ContractLimit; resultSub.ContractSide = sub.ContractSide; resultSub.DeliveryDate = sub.DeliveryDate; resultSub.DeliveryStyle = sub.DeliveryStyle; resultSub.InitQP = sub.InitQP; resultSub.Memo = sub.Memo; resultSub.OutContractNo = sub.OutContractNo; resultSub.Premium = sub.Premium; resultSub.PriceMode = sub.PriceMode; resultSub.SettleCurrency = sub.SettleCurrency; resultSub.TradeBorder = sub.TradeBorder; resultSub.TradeDirection = sub.TradeDirection; resultSub.UnitId = sub.UnitId; resultSub.ShipTime = sub.ShipTime; resultSub.ArriveTime = sub.ArriveTime; resultSub.ContractPeriodS = sub.ContractPeriodS; resultSub.ContractPeriodE = sub.ContractPeriodE; resultSub.SignAmount = sub.SignAmount; //更新子合约主表 result = contractsubDAL.Update(user, resultSub); if (result.ResultStatus != 0) return result; //加载子合约明细表 result = detailDAL.GetDetailBySubId(user, sub.SubId); if (result.ResultStatus != 0) return result; NFMT.Contract.Model.SubDetail resultDetail = result.ReturnValue as NFMT.Contract.Model.SubDetail; if (resultDetail == null || resultDetail.SubDetailId <= 0) { result.ResultStatus = -1; result.Message = "子合约明细数据不存在"; return result; } resultDetail.DiscountBase = detail.DiscountBase; resultDetail.DiscountType = detail.DiscountType; resultDetail.DiscountRate = detail.DiscountRate; resultDetail.DelayType = detail.DelayType; resultDetail.DelayRate = detail.DelayRate; resultDetail.MoreOrLess = detail.MoreOrLess; resultDetail.Status = resultSub.Status; //更新子合约明细表 result = detailDAL.Update(user, resultDetail); if (result.ResultStatus != 0) { result.ResultStatus = -1; result.Message = "子合约明细更新失败"; return result; } //加载子合约价格表 result = priceDAL.GetPriceBySubId(user, sub.SubId); if (result.ResultStatus != 0) return result; NFMT.Contract.Model.SubPrice resultPrice = result.ReturnValue as NFMT.Contract.Model.SubPrice; if (resultPrice == null || resultPrice.SubPriceId <= 0) { result.ResultStatus = -1; result.Message = "子合约价格数据不存在"; return result; } resultPrice.FixedPrice = price.FixedPrice; resultPrice.FixedPriceMemo = price.FixedPriceMemo; resultPrice.WhoDoPrice = price.WhoDoPrice; resultPrice.DoPriceBeginDate = price.DoPriceBeginDate; resultPrice.DoPriceEndDate = price.DoPriceEndDate; resultPrice.IsQP = price.IsQP; resultPrice.PriceFrom = price.PriceFrom; resultPrice.PriceStyle1 = price.PriceStyle1; resultPrice.PriceStyle2 = price.PriceStyle2; resultPrice.MarginMode = price.MarginMode; resultPrice.MarginAmount = price.MarginAmount; resultPrice.MarginMemo = price.MarginMemo; resultPrice.AlmostPrice = price.AlmostPrice; resultPrice.Status = resultSub.Status; result = priceDAL.Update(user, resultPrice); if (result.ResultStatus != 0) return result; #region 子合约抬头 //校验抬头是否存在主合约中 //新增抬头到子合约抬头明细表 //作废现有子合约抬头 result = subCorpDAL.Load(user, resultSub.SubId, false); if (result.ResultStatus != 0) return result; List<Model.SubCorporationDetail> resultOutCorps = result.ReturnValue as List<Model.SubCorporationDetail>; if (resultOutCorps == null || resultOutCorps.Count == 0) { result.ResultStatus = -1; result.Message = "子合约对方抬头加载失败"; return result; } foreach (Model.SubCorporationDetail corp in resultOutCorps) { result = subCorpDAL.Invalid(user, corp); if (result.ResultStatus != 0) return result; } result = subCorpDAL.Load(user, resultSub.SubId, true); if (result.ResultStatus != 0) return result; List<Model.SubCorporationDetail> resultInCorps = result.ReturnValue as List<Model.SubCorporationDetail>; if (resultInCorps == null || resultInCorps.Count == 0) { result.ResultStatus = -1; result.Message = "子合约我方抬头加载失败"; return result; } foreach (Model.SubCorporationDetail corp in resultInCorps) { result = subCorpDAL.Invalid(user, corp); if (result.ResultStatus != 0) return result; } //获取主合约抬头 result = conCropDAL.LoadCorpListByContractId(user, contract.ContractId, false); if (result.ResultStatus != 0) return result; List<Model.ContractCorporationDetail> conOutCorps = result.ReturnValue as List<Model.ContractCorporationDetail>; if (conOutCorps == null) { result.ResultStatus = -1; result.Message = "主合约对方抬头获取失败"; return result; } result = conCropDAL.LoadCorpListByContractId(user, contract.ContractId, true); if (result.ResultStatus != 0) return result; List<Model.ContractCorporationDetail> conInCorps = result.ReturnValue as List<Model.ContractCorporationDetail>; if (conInCorps == null) { result.ResultStatus = -1; result.Message = "主合约我方抬头获取失败"; return result; } foreach (Model.SubCorporationDetail outCorp in outCorps) { //验证抬头是否在主合约中 if (!conOutCorps.Exists(temp => temp.CorpId == outCorp.CorpId)) { result.ResultStatus = -1; result.Message = "主合约对方抬头不存在选中公司,新增失败"; return result; } NFMT.User.Model.Corporation corp = NFMT.User.UserProvider.Corporations.FirstOrDefault(temp => temp.CorpId == outCorp.CorpId); if (corp == null || corp.CorpId <= 0) { result.ResultStatus = -1; result.Message = "子合约对方抬头不存在"; return result; } outCorp.ContractId = contract.ContractId; outCorp.CorpName = corp.CorpName; outCorp.SubId = resultSub.SubId; outCorp.IsInnerCorp = false; if (outCorps.IndexOf(outCorp) == 0) outCorp.IsDefaultCorp = true; else outCorp.IsDefaultCorp = false; outCorp.DetailStatus = StatusEnum.已生效; result = subCorpDAL.Insert(user, outCorp); if (result.ResultStatus != 0) return result; } foreach (Model.SubCorporationDetail inCorp in inCorps) { //验证抬头是否在主合约中 if (!conInCorps.Exists(temp => temp.CorpId == inCorp.CorpId)) { result.ResultStatus = -1; result.Message = "主合约我方抬头不存在选中公司,新增失败"; return result; } NFMT.User.Model.Corporation corp = NFMT.User.UserProvider.Corporations.FirstOrDefault(temp => temp.CorpId == inCorp.CorpId); if (corp == null || corp.CorpId <= 0) { result.ResultStatus = -1; result.Message = "子合约我方抬头不存在"; return result; } inCorp.ContractId = contract.ContractId; inCorp.SubId = resultSub.SubId; inCorp.CorpName = corp.CorpName; inCorp.IsInnerCorp = true; if (inCorps.IndexOf(inCorp) == 0) inCorp.IsDefaultCorp = true; else inCorp.IsDefaultCorp = false; inCorp.DetailStatus = StatusEnum.已生效; result = subCorpDAL.Insert(user, inCorp); if (result.ResultStatus != 0) return result; } #endregion if (subTypes != null) { DAL.SubTypeDetailDAL subTypeDAL = new SubTypeDetailDAL(); result = subTypeDAL.LoadSubTypesById(user, resultSub.SubId); if (result.ResultStatus != 0) return result; List<Model.SubTypeDetail> resultSubTypes = result.ReturnValue as List<Model.SubTypeDetail>; if (resultSubTypes == null) { result.ResultStatus = -1; result.Message = "获取子合约类型失败"; return result; } //作废原有子合约类型 foreach (Model.SubTypeDetail subType in resultSubTypes) { subType.DetailStatus = StatusEnum.已录入; result = subTypeDAL.Invalid(user, subType); if (result.ResultStatus != 0) return result; } //新增新子合约类型 foreach (Model.SubTypeDetail subType in subTypes) { subType.ContractId = resultSub.ContractId; subType.DetailStatus = StatusEnum.已生效; subType.SubId = resultSub.SubId; result = subTypeDAL.Insert(user, subType); if (result.ResultStatus != 0) return result; } } } catch (Exception ex) { result.ResultStatus = -1; result.Message = ex.Message; } return result; }
public ResultModel CreateBusinessInvoice(UserModel user, Operate.Model.Invoice invoice, BusinessInvoice invoiceBusiness, List<BusinessInvoiceDetail> details, InvoiceTypeEnum invoiceType) { ResultModel result = new ResultModel(); try { BusinessInvoiceDAL businessInvoiceDAL = new BusinessInvoiceDAL(); InvoiceDAL invoiceDAL = new InvoiceDAL(); BusinessInvoiceDetailDAL detailDAL = new BusinessInvoiceDetailDAL(); ContractSubDAL subDAL = new ContractSubDAL(); StockReceiptDetailDAL stockReceiptDetailDAL = new StockReceiptDetailDAL(); SubDetailDAL subDetailDAL = new SubDetailDAL(); using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required)) { //验证子合约 result = subDAL.Get(user, invoiceBusiness.SubContractId); if (result.ResultStatus != 0) return result; ContractSub sub = result.ReturnValue as ContractSub; if (sub == null || sub.SubId <= 0) { result.ResultStatus = -1; result.Message = "子合约不存在"; return result; } if (sub.SubStatus != StatusEnum.已生效) { result.ResultStatus = -1; result.Message = "子合约非已生效状态,不能新增临票"; return result; } //获取子合约明细 result = subDetailDAL.GetDetailBySubId(user, sub.SubId); if (result.ResultStatus != 0) return result; SubDetail subDetail = result.ReturnValue as SubDetail; if (subDetail == null || subDetail.SubDetailId <= 0) { result.ResultStatus = -1; result.Message = "子合约明细获取失败"; return result; } //获取子合约下所有 result = this.businessinvoiceDAL.LoadBySubId(user, invoiceBusiness.SubContractId, invoiceType); if (result.ResultStatus != 0) return result; List<BusinessInvoice> bis = result.ReturnValue as List<BusinessInvoice>; decimal sumNetAmount = bis.Sum(temp => temp.NetAmount); decimal maxNetAmount = sub.SignAmount * (1 + subDetail.MoreOrLess); //if (maxNetAmount < sumNetAmount + invoiceBusiness.NetAmount) //{ // result.ResultStatus = -1; // result.Message = "开票重量超额"; // return result; //} //新增发票主表 int invoiceId = 0; invoice.InvoiceType = (int)invoiceType; invoice.InvoiceStatus = StatusEnum.已录入; Corporation outCorp = UserProvider.Corporations.FirstOrDefault(temp => temp.CorpId == invoice.OutCorpId); if (outCorp == null || outCorp.CorpId <= 0) { result.ResultStatus = -1; result.Message = "开票公司信息错误"; return result; } invoice.OutCorpName = outCorp.CorpName; Corporation inCorp = UserProvider.Corporations.FirstOrDefault(temp => temp.CorpId == invoice.InCorpId); if (inCorp == null || inCorp.CorpId <= 0) { result.ResultStatus = -1; result.Message = "收票公司信息错误"; return result; } invoice.InCorpName = inCorp.CorpName; result = invoiceDAL.Insert(user, invoice); if (result.ResultStatus != 0) return result; if (result.ReturnValue == null || !int.TryParse(result.ReturnValue.ToString(), out invoiceId)) { result.ResultStatus = -1; result.Message = "发票添加失败"; return result; } //新增业务发票表 int businessInvoiceId = 0; invoiceBusiness.InvoiceId = invoiceId; result = businessInvoiceDAL.Insert(user, invoiceBusiness); if (result.ResultStatus != 0) return result; if (result.ReturnValue == null || !int.TryParse(result.ReturnValue.ToString(), out businessInvoiceId)) { result.ResultStatus = -1; result.Message = "新增发票失败"; return result; } //新增业务发票明细 StockLogDAL stockLogDAL = new StockLogDAL(); StockDAL stockDAL = new StockDAL(); foreach (BusinessInvoiceDetail detail in details) { if (detail.NetAmount != 0 && detail.StockId > 0) { //验证库存 result = stockDAL.Get(user, detail.StockId); if (result.ResultStatus != 0) return result; Stock stock = result.ReturnValue as Stock; if (stock == null || stock.StockId <= 0) { result.ResultStatus = -1; result.Message = "发票库存获取失败"; return result; } //验证库存流水 result = stockLogDAL.Get(user, detail.StockLogId); if (result.ResultStatus != 0) return result; StockLog stockLog = result.ReturnValue as StockLog; if (stockLog == null || stockLog.StockLogId <= 0) { result.ResultStatus = -1; result.Message = "新增发票流水获取失败"; return result; } //基本验证 if (stockLog.StockId != stock.StockId) { result.ResultStatus = -1; result.Message = "库存与库存流水不匹配"; return result; } //验证流水合约与发票合约是否相同 if (stockLog.SubContractId != invoiceBusiness.SubContractId) { result.ResultStatus = -1; result.Message = "合约与库存流水不匹配"; return result; } detail.DetailStatus = StatusEnum.已生效; detail.InvoiceId = invoiceId; detail.BusinessInvoiceId = businessInvoiceId; detail.StockId = stockLog.StockId; detail.StockLogId = stockLog.StockLogId; if (invoice.InvoiceType == (int)InvoiceTypeEnum.SuppleFinalInvoice) { //获取当前流水回执信息 result = stockReceiptDetailDAL.LoadByStockLogId(user, stockLog.StockLogId); List<StockReceiptDetail> stockReceiptDetails = result.ReturnValue as List<StockReceiptDetail>; if (stockReceiptDetails == null) { result.ResultStatus = -1; result.Message = "当前流水未回执,不能补零"; return result; } decimal sumQtyMiss = stockReceiptDetails.Sum(temp => temp.QtyMiss); detail.IntegerAmount = sumQtyMiss; detail.NetAmount = sumQtyMiss; } //else //{ // detail.IntegerAmount = stockLog.GrossAmount; // detail.NetAmount = stockLog.NetAmount; //} result = detailDAL.Insert(user, detail); if (result.ResultStatus != 0) return result; } } invoice.InvoiceId = invoiceId; if (result.ResultStatus == 0) result.ReturnValue = invoice; scope.Complete(); } } catch (Exception ex) { result.ResultStatus = -1; result.Message = ex.Message; } return result; }