/// <summary> /// 获取发票实体列表 /// </summary> /// <returns></returns> private List <InvoiceInfoReport> GetListInvoiceInfo() { List <InvoiceInfoReport> results = new List <InvoiceInfoReport>(); //分页大小 int nSplitPageSize = this.GetInvoiceInfoPageSizeByStockNo(soMaster.StockSysNo); //先构造未执行任何拆分的源发票实体 InvoiceInfoReport sourceInvoiceEntity = this.CreateSourceInvoiceInfoEntity(); //如果有发票拆分,执行发票拆分 if (soMaster.IsMultiInvoice) { //第一次拆分:按照发票拆分规则 List <InvoiceInfoReport> lstNewSub = this.SplitByInvoiceSub(sourceInvoiceEntity); //第二次拆分:按照分页大小 lstNewSub.ForEach(x => { List <InvoiceInfoReport> lstNewPager = this.SplitByPageSize(x, nSplitPageSize); results.AddRange(lstNewPager); }); } else { //没有发票拆分,将延保产品的ItemNumber恢复为空值 this.InvoiceItems_YBEmptyItemNumber(); //执行分页拆分 List <InvoiceInfoReport> lstNewPager = this.SplitByPageSize(sourceInvoiceEntity, nSplitPageSize); results.AddRange(lstNewPager); } return(results); }
/// <summary> /// 计算发票明细的总金额 /// </summary> /// <param name="invoiceInfo">发票</param> /// <returns></returns> private Decimal CalculateInvoiceItemSumAmt(InvoiceInfoReport invoiceInfo) { decimal resultSumAmt = 0; invoiceInfo.Items.ForEach(x => { //判断不累加的Item(可得积分不累加) if (x.ProductType != 4) { resultSumAmt += x.SumExtendPrice; } }); //累加小于0,则等于0 if (resultSumAmt < 0) { resultSumAmt = 0m; } return(resultSumAmt); }
/// <summary> /// 按分页大小拆分发票实体 /// </summary> /// <param name="unSplitInvoiceEntity">未拆分的发票实体</param> /// <param name="pageSize">分页大小</param> /// <returns>已拆分的发票实体List</returns> private List <InvoiceInfoReport> SplitByPageSize(InvoiceInfoReport unSplitInvoiceEntity, int pageSize) { int sumSourceItemsNum = unSplitInvoiceEntity.Items.Count; //原始未拆分的Item总数 int sumSplitPagerNum = 1; //拆分的页总数 decimal sumInvoiceSum = unSplitInvoiceEntity.InvoiceAmt; // 源发票的总金额 decimal subInvoiceSum = 0; // 累计已拆分的单张发票的总金额 List <InvoiceInfoReport> results = new List <InvoiceInfoReport>(); if (sumSourceItemsNum > pageSize) { //计算要拆分的总页数 sumSplitPagerNum = (sumSourceItemsNum % pageSize == 0 ? sumSourceItemsNum / pageSize : sumSourceItemsNum / pageSize + 1); for (int i = 1; i <= sumSplitPagerNum; i++) { //当前页码 int curPagerNum = i; #region Head处理 //生成一个新的发票实体(只取Head部分); InvoiceInfoReport newPageInvoiceInfo = new InvoiceInfoReport(); newPageInvoiceInfo.InvoiceCurPageNum = curPagerNum; //修改当前页码 newPageInvoiceInfo.InvoiceSumPageNum = sumSplitPagerNum; //修改分页总数 newPageInvoiceInfo.InvoiceDate = unSplitInvoiceEntity.InvoiceDate; newPageInvoiceInfo.ServicePhone = unSplitInvoiceEntity.ServicePhone; newPageInvoiceInfo.ReceiveName = unSplitInvoiceEntity.ReceiveName; newPageInvoiceInfo.ReceivePhone = unSplitInvoiceEntity.ReceivePhone; newPageInvoiceInfo.ReceiveContact = unSplitInvoiceEntity.ReceiveContact; newPageInvoiceInfo.ReceiveAddress1 = unSplitInvoiceEntity.ReceiveAddress1; newPageInvoiceInfo.ReceiveAddress2 = unSplitInvoiceEntity.ReceiveAddress2; newPageInvoiceInfo.SOSysNo = unSplitInvoiceEntity.SOSysNo; newPageInvoiceInfo.CustomerSysNo = unSplitInvoiceEntity.CustomerSysNo; newPageInvoiceInfo.InvoiceNote = unSplitInvoiceEntity.InvoiceNote; newPageInvoiceInfo.PayTypeName = unSplitInvoiceEntity.PayTypeName; newPageInvoiceInfo.PayTypeSysNo = unSplitInvoiceEntity.PayTypeSysNo; newPageInvoiceInfo.InvoiceSeq = unSplitInvoiceEntity.InvoiceSeq; newPageInvoiceInfo.InvoiceSeqEx = unSplitInvoiceEntity.InvoiceSeqEx; newPageInvoiceInfo.ShipTypeName = unSplitInvoiceEntity.ShipTypeName; newPageInvoiceInfo.TotalWeight = unSplitInvoiceEntity.TotalWeight; newPageInvoiceInfo.Importance = unSplitInvoiceEntity.Importance; newPageInvoiceInfo.Items = new List <InvoiceItem>(); #endregion #region Item处理 //获取当前页面的Items List <InvoiceItem> curPageItems = unSplitInvoiceEntity.Items.Skip((curPagerNum - 1) * pageSize).Take(pageSize).ToList(); //追加到Items newPageInvoiceInfo.Items.AddRange(curPageItems); #endregion #region 金额处理 //当前拆分发票的总金额 decimal curInvoiceSumAmt = 0; //如果是最后一张拆分票 if (curPagerNum == sumSplitPagerNum) { //当前票的金额 = 总发票金额 - 前面已经拆分的发票累计金额 curInvoiceSumAmt = sumInvoiceSum - subInvoiceSum; } else { //按照当前发票实体明细的计算总金额 curInvoiceSumAmt = this.CalculateInvoiceItemSumAmt(newPageInvoiceInfo); //累计已拆分的总金额 subInvoiceSum += curInvoiceSumAmt; } //更新Head中金额相关字段 newPageInvoiceInfo.InvoiceAmt = curInvoiceSumAmt; newPageInvoiceInfo.RMBConvert = this.GetRMBConvert(curInvoiceSumAmt); #endregion //ADD InvoiceInfo results.Add(newPageInvoiceInfo); } } else { results.Add(unSplitInvoiceEntity); } return(results); }
/// <summary> /// 按照发票拆分规则拆分发票实体 /// 注意:拆分序号为1的拆分票需要增加其他费用Items,但最后输出 /// </summary> /// <param name="unSplitInvoiceEntity">未拆分的发票实体</param> /// <returns>已拆分的发票实体List</returns> private List <InvoiceInfoReport> SplitByInvoiceSub(InvoiceInfoReport unSplitInvoiceEntity) { int maxInvoiceSeq = 1; //最大的拆分序号,默认为1 decimal sumInvoiceSum = unSplitInvoiceEntity.InvoiceAmt; // 源发票的总金额 decimal subInvoiceSum = 0; // 累计已拆分的单张发票的总金额 List <InvoiceInfoReport> results = new List <InvoiceInfoReport>(); #region 获取发票拆分规则 //获取发票拆分规则 List <InvoiceSub> invoiceSubs = DA.GetInvoiceSub(soMaster.SOSysNo, soMaster.StockSysNo); //按照InvoiceSeq字段Group集合 var groups = from u in invoiceSubs group u by new { u.InvoiceSeq } into g select g; //计算最大的拆分序号 Dictionary <int, List <InvoiceSub> > dicSeqSubs = new Dictionary <int, List <InvoiceSub> >(); foreach (var data in groups) { dicSeqSubs.Add(data.Key.InvoiceSeq, data.ToList()); } //最大拆分号 就是 dicSeqSubs.Count值 maxInvoiceSeq = dicSeqSubs.Count; #endregion #region InvoiceSeq分组生成拆分发票 //拆分后新的序号,默认从1开始 int curNewSeqNo = 1; //按InvoiceSeq分组生成拆分发票,为保证InvoiceSub表中序号为1的追加费用明细,倒序拆分 for (int xhkey = dicSeqSubs.Count; xhkey > 0; xhkey--) { //当前拆分实体 List <InvoiceSub> curSeqs = dicSeqSubs[xhkey]; //当前拆分序号 int curInvoiceSeq = xhkey; #region Head处理 //生成一个新的发票实体(只取Head部分); InvoiceInfoReport newInvoiceInfo = new InvoiceInfoReport(); newInvoiceInfo.InvoiceSeq = curNewSeqNo; //修改:InvoiceSeq newInvoiceInfo.InvoiceSeqEx = curNewSeqNo.ToString() + "-" + maxInvoiceSeq.ToString(); //修改:拆分序号-总拆分张数 newInvoiceInfo.InvoiceDate = unSplitInvoiceEntity.InvoiceDate; newInvoiceInfo.InvoiceSumPageNum = unSplitInvoiceEntity.InvoiceSumPageNum; newInvoiceInfo.InvoiceCurPageNum = unSplitInvoiceEntity.InvoiceCurPageNum; newInvoiceInfo.ServicePhone = unSplitInvoiceEntity.ServicePhone; newInvoiceInfo.SOSysNo = unSplitInvoiceEntity.SOSysNo; newInvoiceInfo.CustomerSysNo = unSplitInvoiceEntity.CustomerSysNo; newInvoiceInfo.InvoiceNote = unSplitInvoiceEntity.InvoiceNote; newInvoiceInfo.PayTypeName = unSplitInvoiceEntity.PayTypeName; newInvoiceInfo.PayTypeSysNo = unSplitInvoiceEntity.PayTypeSysNo; newInvoiceInfo.ReceiveAddress1 = unSplitInvoiceEntity.ReceiveAddress1; newInvoiceInfo.ReceiveAddress2 = unSplitInvoiceEntity.ReceiveAddress2; newInvoiceInfo.ReceiveContact = unSplitInvoiceEntity.ReceiveContact; newInvoiceInfo.ReceiveName = unSplitInvoiceEntity.ReceiveName; newInvoiceInfo.ReceivePhone = unSplitInvoiceEntity.ReceivePhone; newInvoiceInfo.ShipTypeName = unSplitInvoiceEntity.ShipTypeName; newInvoiceInfo.TotalWeight = unSplitInvoiceEntity.TotalWeight; newInvoiceInfo.Importance = unSplitInvoiceEntity.Importance; newInvoiceInfo.Items = new List <InvoiceItem>(); #endregion #region Items处理 //Items处理 //对当前Seq的拆分规则排序,以保证正常商品Item在前面,延保商品Item在后面 var orderQuery = from o in curSeqs orderby o.IsExtendWarrantyItem select o; List <InvoiceItem> splitNewItems = newInvoiceInfo.Items; foreach (InvoiceSub splits in orderQuery.ToList <InvoiceSub>()) { //查找源明细中对应拆分项的Item InvoiceItem sourceItem = null; var itemQuery = from invoicetems in unSplitInvoiceEntity.Items where invoicetems.ItemNumberEx == splits.ProductID select invoicetems; List <InvoiceItem> sourceItems = itemQuery.ToList(); if (sourceItems.Count > 0) { sourceItem = sourceItems[0]; //将拆分Item添加到List InvoiceItem splitItem = new InvoiceItem(); splitItem.ItemNumber = sourceItem.ItemNumber; splitItem.Description = sourceItem.Description; splitItem.UnitPrice = sourceItem.UnitPrice; splitItem.Quantity = splits.SplitQty; //取拆分数量 splitItem.SumExtendPrice = sourceItem.UnitPrice * splits.SplitQty; //金额按拆分数量重新计算 splitItem.RepairWarrantyDays = sourceItem.RepairWarrantyDays; splitItem.ProductType = sourceItem.ProductType; splitItem.IsExtendWarrantyItem = splits.IsExtendWarrantyItem; splitItem.ProductSysNo = splits.ProductSysNo; splitItem.MasterProductSysNo = splits.MasterProductSysNo; splitNewItems.Add(splitItem); } } //拆分完毕后,将延保产品的ItemNumber恢复为空值 this.InvoiceItems_YBEmptyItemNumber(); #endregion #region 金额处理 //当前拆分发票的总金额 decimal curInvoiceSumAmt = 0; //如果是序号为1的拆分票,则增加运费等杂项 if (curInvoiceSeq == 1) { //增加费用明细项,MKT Place II需求要判断是否可添加其他费用明细项 if (this.IsAllowAddOtherFeesItems()) { this.AddOtherFreesItems(ref newInvoiceInfo); } //当前票的金额 = 总发票金额 - 前面已经拆分的发票累计金额 curInvoiceSumAmt = sumInvoiceSum - subInvoiceSum; } else { //按照当前发票实体明细计算总金额 curInvoiceSumAmt = this.CalculateInvoiceItemSumAmt(newInvoiceInfo); //累计已拆分的总金额 subInvoiceSum += curInvoiceSumAmt; } //更新Head中金额相关字段 newInvoiceInfo.InvoiceAmt = curInvoiceSumAmt; newInvoiceInfo.RMBConvert = this.GetRMBConvert(curInvoiceSumAmt); #endregion //ADD InvoiceInfo results.Add(newInvoiceInfo); curNewSeqNo++; } #endregion return(results); }
/// <summary> /// 增加发票非商品款项的明细 /// </summary> /// <param name="curInvoiceInfo">需要增加其他费用明细的拆分发票实体</param> /// <returns></returns> private void AddOtherFreesItems(ref InvoiceInfoReport curInvoiceInfo) { curInvoiceInfo.Items.AddRange(this.GetOtherFreesItems()); }
/// <summary> /// 构造未拆分的源发票实体 /// </summary> private InvoiceInfoReport CreateSourceInvoiceInfoEntity() { ECCentral.BizEntity.Invoice.InvoiceReport.InvoiceInfo invoiceInfo = DA.GetInvoicePrintHead(soMaster.SOSysNo, soMaster.StockSysNo); //发票总额处理(万里通/中智积分支付的特殊处理) if (this.soMaster.PayTypeSysNo == 47 || this.soMaster.PayTypeSysNo == 48) { //修改总发票金额为1分钱 invoiceInfo.InvoiceAmt = 0.01m; } invoiceInfo.RMBConvert = this.GetRMBConvert(invoiceInfo.InvoiceAmt); //人民币大写金额 //Head默认值处理 invoiceInfo.InvoiceDate = DateTime.Now.ToString("yyyy-MM-dd"); invoiceInfo.InvoiceSeq = 1; //拆分序号,先默认为1 invoiceInfo.InvoiceSeqEx = ""; invoiceInfo.InvoiceSumPageNum = 1; //总页码,先默认为1 invoiceInfo.InvoiceCurPageNum = 1; //当前页码,先默认为1 //Head特殊处理 //是否阿斯利康客户 if (this.soMaster.SpecialSOType == 2) { invoiceInfo.ServicePhone = "阿斯利康客服热线:400-600-5566"; invoiceInfo.ReceiveContact = "阿斯利康(无锡)贸易有限公司"; } //支付方式特殊处理 if (this.soMaster.IsUseChequesPay) { invoiceInfo.PayTypeName += "(支票支付)"; } if (this.soMaster.IsRequireShipInvoice) { invoiceInfo.PayTypeName += "(客户需要圆通发票)"; } //收货地址分解 if (invoiceInfo.ReceiveAddress.Length > 35) { invoiceInfo.ReceiveAddress1 = invoiceInfo.ReceiveAddress.Substring(0, 35); invoiceInfo.ReceiveAddress2 = invoiceInfo.ReceiveAddress.Substring(35); } else { invoiceInfo.ReceiveAddress1 = invoiceInfo.ReceiveAddress; } //特别说明 if (this.soMaster.IsPayWhenRecv && this.soMaster.PrepayAmt > 0m) { if (this.soMaster.IsCombine) { invoiceInfo.Importance = "本订单已收到余额支付" + this.soMaster.PrepayAmt.ToString("#########0.00") + "元"; } else { decimal cashPay = this.GetFinallReceivableAmt(invoiceInfo.InvoiceAmt, this.soMaster.PrepayAmt, this.soMaster.IsPayWhenRecv); invoiceInfo.Importance = "预支付" + this.soMaster.PrepayAmt.ToString("#########0.00") + "元,现支付" + cashPay.ToString("#########0.00") + "元"; } } //获取发票明细 invoiceInfo.Items = GetInvoiceItems(); return(invoiceInfo); }