using System; using System.Collections.Generic; using System.Linq; using BWP.B3ButcherManage.BO; using BWP.B3ExportBase; using BWP.B3ExportBase.BL; using BWP.B3ExportBase.BO; using BWP.B3Frameworks; using Forks.EnterpriseServices; using Forks.EnterpriseServices.BusinessInterfaces; using Forks.EnterpriseServices.DomainObjects2; using Forks.EnterpriseServices.DomainObjects2.DQuery; using TSingSoft.WebPluginFramework; using TSingSoft.WebPluginFramework.BIPlugins.BLEvents; namespace BWP.B3ButcherManageExport.BL { [BusinessInterface(typeof(PayToNcBL))] public interface IPayToNcBL : INcBL { void Export(List idList, long p, DateTime? nullable); } [LogicName("付款单导NC凭证")] [BindToFeature("B3ButcherManageExport.0004")] [ExportID(B3FrameworksConsts.DmoTypeIDBases.B3ButcherManageExport, B3ButcherManageExportConsts.ExportIDOffsets.PayToNc)] public class PayToNcBL : NcBL, IPayToNcBL { public readonly List MinPreDetailProperties = new List(); protected override NcUfinterface CreateUfinterface(IList dmos) { var scriptHelper = new PythonScriptHelper(string.Empty, Config.Script, this); scriptHelper.AddLocalVar("dmos", dmos); if (Version == "6.3") { { var bills = BO.NcVouchers.New(); scriptHelper.AddLocalVar("vouchers", bills); scriptHelper.Execute(); var i = 0; foreach (var bill in bills.Bills) { BillIDs.Add(i, bill.B2BillIDs); i++; } return bills; } } throw new Exception("未实现导出方法"); } public override short GetMethodID() { return B3FrameworksConsts.DmoTypeIDBases.B3ButcherManageExport + B3ButcherManageExportConsts.ExportIDOffsets.PayToNc; } public DateTime Date { get; set; } public void Export(List dmoIDs, long extSystemID, DateTime? date) { Date = date ?? BLContext.Today; Export(dmoIDs, extSystemID); } public void CheckAccountingUnit(IEnumerable dmos) { var groups = dmos.GroupBy(x => x.AccountingUnit_Name); var count = groups.Count(); if (count > 1) { throw new ApplicationException("一次导出只能选择同一个会计单位下的单据"); } } public string GetSumNumber(IEnumerable details) { return details.Sum(x => (x.WeighBill_BuyNum ?? 0)).ToString(); } public string GetSumWeight(IEnumerable details) { return details.Sum(x => (x.WeighBill_BuyWeigh1 ?? 0).Value).ToString("0.00"); } public string GetStatPayDate(Pay dmo, string format) { if (dmo.Details.Count == 0) return string.Empty; return GetDateTime(dmo.Details[0].StatPay_Date, format); } public string GetSumMoney(IEnumerable details) { return details.Sum(x => (x.Money ?? 0).Value).ToString(); } public string GetSumPreMoney(IEnumerable details) { return details.Sum(x => (x.AdvancePay_Money ?? 0).Value).ToString(); } public string GetSumStatPay_Money1(IEnumerable details) { return details.Sum(x => (x.StatPay_Money ?? 0).Value).ToString(); } protected override void BeforeExport(List dmoIDs) { base.BeforeExport(dmoIDs); var dmoType = typeof(Pay_AdvanceDetail); var dom = new DQueryDom(new JoinAlias(dmoType)); dom.Columns.Add(DQSelectColumn.Field("ID")); foreach (string property in MinPreDetailProperties) { dom.Columns.Add(DQSelectColumn.Field(property)); } var expressionList = new List(); foreach (var dmo in Dmos) expressionList.Add(DQExpression.Value(dmo.ID)); dom.Where.Conditions.Add(DQCondition.InList(DQExpression.Field("Pay_ID"), expressionList.ToArray())); var details = new List(); using (IDQDataReader reader = Session.ExecuteReader(dom)) { while (reader.Read()) { var detail = new Pay_AdvanceDetail { ID = (long)reader[0] }; int i = 1; foreach (var property in MinPreDetailProperties) { var propertyInfo = dmoType.GetProperty(property); if (propertyInfo != null) propertyInfo.SetValue(detail, reader[i++], null); } details.Add(detail); } } var groups = details.GroupBy(x => x.Pay_ID); foreach (var gDetail in groups) { var firstDmo = Dmos.FirstOrDefault(x => x.ID == gDetail.Key); if (firstDmo == null) continue; foreach (var billDetail in gDetail) { firstDmo.AdvanceDetails.Add(billDetail); } } } protected override Action> FillDetail { get { return dmos => { var dmoType = typeof(Pay_Detail); var dom = new DQueryDom(new JoinAlias(dmoType)); dom.Columns.Add(DQSelectColumn.Field("ID")); foreach (string property in MinDetailProperties) { dom.Columns.Add(DQSelectColumn.Field(property)); } var expressionList = new List(); foreach (var dmo in dmos) expressionList.Add(DQExpression.Value(dmo.ID)); dom.Where.Conditions.Add(DQCondition.InList(DQExpression.Field("Pay_ID"), expressionList.ToArray())); var details = new List(); using (IDQDataReader reader = Session.ExecuteReader(dom)) { while (reader.Read()) { var detail = new Pay_Detail { ID = (long)reader[0] }; int i = 1; foreach (var property in MinDetailProperties) { dmoType.GetProperty(property).SetValue(detail, reader[i++], null); } details.Add(detail); } } var groups = details.GroupBy(x => x.Pay_ID); foreach (var gDetail in groups) { var firstDmo = dmos.FirstOrDefault(x => x.ID == gDetail.Key); if (firstDmo == null) continue; foreach (var billDetail in gDetail) { firstDmo.Details.Add(billDetail); } } }; } } } }