Commit 620b3210 by 陶然

新增优惠政策模块

parent 44603696
...@@ -36,5 +36,9 @@ namespace Kivii.Finances ...@@ -36,5 +36,9 @@ namespace Kivii.Finances
public const string TableNamePay = "FINA_Pays"; public const string TableNamePay = "FINA_Pays";
public const string TableNameDiscount = "FINA_Discounts"; public const string TableNameDiscount = "FINA_Discounts";
public const string TableNamePolicy = "FINA_Policies";
public const string TableNamePolicyDetail = "FINA_PolicyDetails";
public const string TableNamePolicyRecord = "FINA_PolicyRecords";
} }
} }
using Kivii.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Entities
{
[Api(Description = "优惠政策")]
[Alias(Configs.TableNamePolicy)]
public class Policy : EntityWithMetadata, IEntityInAssemblyDb,
IEntityHasSummary,
IEntityHasRemark, IEntityHasCreator, IEntityHasUpdater
{
[ApiMember(Description = "所属Kvid")]
[DefaultEmptyGuid]
public Guid OwnerKvid { get; set; }
[ApiMember(Description = "所属名称")]
[StringLength(200), Default("")]
public string OwnerName { get; set; }
/// <summary>
/// 用于描述政策的名称
/// </summary>
[ApiMember(Description = "名称")]
[StringLength(200), Default("")]
public string Name { get; set; }
/// <summary>
/// 用于区别当前是原金额基础之上的政策或是折上折政策或其他情况
/// </summary>
[ApiMember(Description = "类型")]
[StringLength(50), Required]
public PolicyType Type { get; set; }
/// <summary>
/// 政策减免金额,如果设置了金额就不取折扣
/// </summary>
[DecimalLength(10, 2), Default(0)]
public decimal Amount { get; set; }
[ApiMember(Description = "货币单位")]
[StringLength(50), Required]
public CurrencyUnit Currency { get; set; }
/// <summary>
/// 折扣。折扣不能大于1能等于0
/// </summary>
[ApiMember(Description = "折扣率")]
[DecimalLength(4, 2), Default(1)]
public decimal? DiscountRate { get; set; }
[ApiMember(Description = "生效日期")]
[Required]
public DateTime EffectiveTime { get; set; }
[ApiMember(Description = "失效日期")]
public DateTime? ExpiredTime { get; set; }
#region 文本 摘要 备注
[ApiMember(Description = "摘要,最大500字")]
//[IgnoreUpdate]
[StringLength(500), Default("")]
public string Summary { get; set; }
[ApiMember(Description = "备注,最大2000字")]
[StringLength(2000), Default("")]
public string Remark { get; set; }
#endregion
#region 操作相关 Organization Creator Updater Operator OperateTime
[ApiMember(Description = "操作日期")]
[IgnoreUpdate]
[Required]
public DateTime OperateTime { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid OperatorKvid { get; set; }
[ApiMember(Description = "经办人")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string OperatorName { get; set; }
[ApiMember(Description = "组织机构Id,当组织有子组织时区分所属组织")]
[IgnoreUpdate]
[CurrentOrganizationKvid]
public Guid OrganizationKvid { get; set; }
[ApiMember(Description = "创建人Kvid")]
[IgnoreUpdate]
[CurrentMemberKvid]
public Guid CreatorKvid { get; set; }
[ApiMember(Description = "创建人")]
[IgnoreUpdate]
[StringLength(50), CurrentMemberName]
public string CreatorName { get; set; }
[ApiMember(Description = "更新人Kvid")]
[CurrentMemberKvid]
public Guid UpdaterKvid { get; set; }
[ApiMember(Description = "更新人")]
[StringLength(50), CurrentMemberName]
public string UpdaterName { get; set; }
#endregion
}
[Api(Description = "优惠政策明细")]
[Alias(Configs.TableNamePolicyDetail)]
public class PolicyDetail : EntityWithMetadata, IEntityInAssemblyDb,
IEntityHasCreator, IEntityHasUpdater
{
[IgnoreUpdate]
[Required]
public Guid PolicyKvid { get; set; }
[StringLength(200), Default("")]
public string BizId { get; set; }
[DefaultEmptyGuid]
public Guid BizKvid { get; set; }
[StringLength(200), Default("")]
public string BizType { get; set; }
[ApiMember(Description = "目标单位")]
[StringLength(200), Default("")]
public string TargetName { get; set; }
[DefaultEmptyGuid]
public Guid TargetKvid { get; set; }
[ApiMember(Description = "组织机构Id,当组织有子组织时区分所属组织")]
[IgnoreUpdate]
[CurrentOrganizationKvid]
public Guid OrganizationKvid { get; set; }
[ApiMember(Description = "创建人Kvid ")]
[IgnoreUpdate]
[CurrentMemberKvid]
public Guid CreatorKvid { get; set; }
[ApiMember(Description = "创建人")]
[IgnoreUpdate]
[StringLength(50), CurrentMemberName]
public string CreatorName { get; set; }
[ApiMember(Description = "更新人Kvid ")]
[CurrentMemberKvid]
public Guid UpdaterKvid { get; set; }
[ApiMember(Description = "更新人")]
[StringLength(50), CurrentMemberName]
public string UpdaterName { get; set; }
}
[Api(Description = "政策执行记录")]
[Alias(Configs.TableNamePolicyRecord)]
public class PolicyRecord : EntityWithMetadata, IEntityInAssemblyDb,
IEntityHasSummary, IEntityHasRemark,
IEntityHasOffset,
IEntityHasCreator, IEntityHasUpdater, IEntityHasOrganization
{
[IgnoreUpdate]
[Required]
public Guid PolicyKvid { get; set; }
[IgnoreUpdate]
[Required]
public Guid SettlementKvid { get; set; }
[DefaultEmptyGuid]
public Guid OffsetKvid { get; set; }
[StringLength(200), Default("")]
public string BizId { get; set; }
[DefaultEmptyGuid]
public Guid BizKvid { get; set; }
[StringLength(200), Default("")]
public string BizType { get; set; }
[ApiMember(Description = "目标单位")]
[StringLength(200), Default("")]
public string TargetName { get; set; }
[DefaultEmptyGuid]
public Guid TargetKvid { get; set; }
[ApiMember(Description = "原金额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal AmountPlan { get; set; }
[ApiMember(Description = "原折后金额")]//AmountOrigin=AmountPolicy+Amount
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal AmountOrigin { get; set; }
[ApiMember(Description = "减免金额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal AmountPolicy { get; set; }
[ApiMember(Description = "合计金额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal Amount { get; set; }
#region 操作相关 Organization Creator Updater Operator OperateTime
[ApiMember(Description = "操作日期")]
[IgnoreUpdate]
[Required]
public DateTime OperateTime { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid OperatorKvid { get; set; }
[ApiMember(Description = "经 办 人")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string OperatorName { get; set; }
[ApiMember(Description = "组织机构Id,当组织有子组织时区分所属组织")]
[IgnoreUpdate]
[CurrentOrganizationKvid]
public Guid OrganizationKvid { get; set; }
[ApiMember(Description = "创建人Kvid ")]
[IgnoreUpdate]
[CurrentMemberKvid]
public Guid CreatorKvid { get; set; }
[ApiMember(Description = "创建人")]
[IgnoreUpdate]
[StringLength(50), CurrentMemberName]
public string CreatorName { get; set; }
[ApiMember(Description = "更新人Kvid ")]
[CurrentMemberKvid]
public Guid UpdaterKvid { get; set; }
[ApiMember(Description = "更新人")]
[StringLength(50), CurrentMemberName]
public string UpdaterName { get; set; }
#endregion
#region 文本 摘要 备注
[ApiMember(Description = "摘要,最大500字")]
[IgnoreUpdate]
[StringLength(500), Default("")]
public string Summary { get; set; }
[ApiMember(Description = "备注,最大3000字")]
[StringLength(3000), Default("")]
public string Remark { get; set; }
#endregion
}
public enum PolicyType
{
/// <summary>
/// 普通折扣
/// </summary>
Original,
/// <summary>
/// 附加折扣,折上折
/// </summary>
Additional
}
}
using Kivii.Finances.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Extensions
{
public static class PolicyExtension
{
public static PolicyRecord Offset(this PolicyRecord policyRecord, string remark)
{
policyRecord.ThrowIfNull("政策执行记录不能为空!");
(policyRecord.OffsetKvid != Guid.Empty).ThrowIfTrue("已冲账,无需重复操作");
#region policyRecord冲账
var newPolicyRecordKvid = Guid.NewGuid();
policyRecord.OffsetKvid = newPolicyRecordKvid;
policyRecord.AddOnlyProperties(o => o.OffsetKvid);
policyRecord.Remark = $"{remark}";
policyRecord.AddOnlyProperties(o => o.Remark);
//新建一个和原来一样的
var offsetPolicyRecord = new PolicyRecord();
offsetPolicyRecord.PopulateWith(policyRecord);
offsetPolicyRecord.OffsetKvid = policyRecord.Kvid;//新的冲帐关联用原来的Kvid
offsetPolicyRecord.Kvid = newPolicyRecordKvid;
offsetPolicyRecord.Remark = $"{remark}";
offsetPolicyRecord.AmountPlan = 0 - offsetPolicyRecord.AmountPlan;
offsetPolicyRecord.AmountOrigin = 0 - offsetPolicyRecord.AmountOrigin;
offsetPolicyRecord.AmountPolicy = 0 - offsetPolicyRecord.AmountPolicy;
offsetPolicyRecord.Amount = 0 - offsetPolicyRecord.Amount;//反向值
offsetPolicyRecord.OperatorName = KiviiContext.CurrentMember.FullName;
offsetPolicyRecord.OperatorKvid = KiviiContext.CurrentMember.Kvid;
offsetPolicyRecord.OperateTime = DateTime.Now;
#endregion
return offsetPolicyRecord;
}
}
}
...@@ -64,6 +64,7 @@ ...@@ -64,6 +64,7 @@
<Compile Include="Entities\InvoiceTitle.cs" /> <Compile Include="Entities\InvoiceTitle.cs" />
<Compile Include="Entities\Pay.cs" /> <Compile Include="Entities\Pay.cs" />
<Compile Include="Entities\Payment.cs" /> <Compile Include="Entities\Payment.cs" />
<Compile Include="Entities\Policy.cs" />
<Compile Include="Entities\Settlement.cs" /> <Compile Include="Entities\Settlement.cs" />
<Compile Include="Entities\SettlementAnalysis.cs" /> <Compile Include="Entities\SettlementAnalysis.cs" />
<Compile Include="Entities\SettlementDetail.cs" /> <Compile Include="Entities\SettlementDetail.cs" />
...@@ -75,7 +76,8 @@ ...@@ -75,7 +76,8 @@
<Compile Include="Extensions\InvoiceExtension.cs" /> <Compile Include="Extensions\InvoiceExtension.cs" />
<Compile Include="Extensions\PayExtension.cs" /> <Compile Include="Extensions\PayExtension.cs" />
<Compile Include="Extensions\PaymentExtension.cs" /> <Compile Include="Extensions\PaymentExtension.cs" />
<Compile Include="Extensions\RoleProvider.cs" /> <Compile Include="Extensions\PolicyExtension.cs" />
<Compile Include="RoleProvider.cs" />
<Compile Include="Extensions\SettlementExtension.cs" /> <Compile Include="Extensions\SettlementExtension.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Transforms\RestfulAccount.cs" /> <Compile Include="Transforms\RestfulAccount.cs" />
...@@ -94,6 +96,7 @@ ...@@ -94,6 +96,7 @@
<Compile Include="Transforms\RestfulPayment.Offset.cs" /> <Compile Include="Transforms\RestfulPayment.Offset.cs" />
<Compile Include="Transforms\RestfulPayment.Split.cs" /> <Compile Include="Transforms\RestfulPayment.Split.cs" />
<Compile Include="Transforms\RestfulPayment.UnBiz.Refund.cs" /> <Compile Include="Transforms\RestfulPayment.UnBiz.Refund.cs" />
<Compile Include="Transforms\RestfulPolicy.cs" />
<Compile Include="Transforms\RestfulSettlement.cs" /> <Compile Include="Transforms\RestfulSettlement.cs" />
<Compile Include="Transforms\RestfulSettlement.Offset.cs" /> <Compile Include="Transforms\RestfulSettlement.Offset.cs" />
<Compile Include="Transforms\RestfulStatistic.cs" /> <Compile Include="Transforms\RestfulStatistic.cs" />
......
...@@ -5,7 +5,7 @@ using System.Linq; ...@@ -5,7 +5,7 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Kivii.Finances.Extensions namespace Kivii.Finances
{ {
public class PaymentRoles public class PaymentRoles
{ {
......
using Kivii.Finances.Entities;
using Kivii.Linq;
using Kivii.Web;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Transforms
{
#region CRUDQ
[RequiresAnyRole(MemberRoles.Everyone)]
public class PolicyCreate : RestfulCreate<Policy>
{
}
[RequiresAnyRole(MemberRoles.Everyone)]
public class PolicyUpdate : RestfulUpdate<Policy>
{
}
[RequiresAnyRole(MemberRoles.Everyone)]
public class PolicyDelete : RestfulDelete<Policy>
{
}
[RequiresAnyRole(MemberRoles.Everyone)]
public class PolicyRead : RestfulRead<Policy>
{
}
[RequiresAnyRole(MemberRoles.Everyone)]
public class PolicyQuery : RestfulQuery<Policy>
{
}
[RequiresAnyRole(MemberRoles.Everyone)]
public class PolicyDetailCreate : RestfulExecution<PolicyDetail>
{
public PolicyDetail Item { get; set; }
public List<PolicyDetail> Items { get; set; }
public override object OnExecution(IRequest req, IResponse res)
{
(Item == null && Items.IsNullOrEmpty()).ThrowIfTrue("请传入要创建的内容!");
if (Items.IsNullOrEmpty()) Items = new List<PolicyDetail>();
if (Item != null) Items.Add(Item);
var rtns = new RestfulCreateResponse<PolicyDetail>();
rtns.Results = new List<PolicyDetail>();
var conn = KiviiContext.GetOpenedDbConnection<PolicyDetail>();
foreach (var item in Items)
{
if (conn.Exists<PolicyDetail>(o => o.TargetKvid == item.TargetKvid || o.TargetName == item.TargetName)) continue;
conn.Insert(item);
rtns.Results.Add(item);
var log = new EntityLog<Policy>();
log.OwnerKvid = item.PolicyKvid;
log.BizId = item.TargetName;
log.BizKvid = item.Kvid;
log.BizType = typeof(PolicyDetail).FullName;
log.Type = "新增";
log.Title = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
log.Remark = $"新增客户[{item.TargetName}],操作人:{KiviiContext.CurrentMember.FullName}";
conn.Insert(log);
}
return rtns;
}
}
[RequiresAnyRole(MemberRoles.Everyone)]
public class PolicyDetailDelete : RestfulDelete<PolicyDetail>
{
private List<PolicyDetail> _policyDetails = null;
private IDbTransaction _trans = null;
public override bool OnPreRestfulDelete(IRequest req, IResponse res, IDbConnection dbConnection, IRestfulDeleteResponse<PolicyDetail> rtns)
{
_policyDetails = dbConnection.SelectByIds<PolicyDetail>(Kvids);
if (!_policyDetails.IsNullOrEmpty()) _trans = dbConnection.OpenTransaction();
return base.OnPreRestfulDelete(req, res, dbConnection, rtns);
}
public override bool OnPostRestfulDelete(IRequest req, IResponse res, IDbConnection dbConnection, IRestfulDeleteResponse<PolicyDetail> rtns)
{
if (_policyDetails.IsNullOrEmpty()) return base.OnPostRestfulDelete(req, res, dbConnection, rtns);
try
{
foreach (var kvid in Kvids)
{
var policyDetail = _policyDetails.FirstOrDefault(p => p.Kvid == kvid);
if (policyDetail == null) continue;
var log = new EntityLog<Policy>();
log.OwnerKvid = policyDetail.PolicyKvid;
log.BizId = policyDetail.TargetName;
log.BizKvid = policyDetail.Kvid;
log.BizType = typeof(PolicyDetail).FullName;
log.Type = "删除";
log.Title = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
log.Remark = $"删除客户[{policyDetail.TargetName}],操作人:{KiviiContext.CurrentMember.FullName}";
dbConnection.Insert(log);
}
_trans?.Commit();
}
catch (Exception ex)
{
_trans?.Rollback();
throw ex;
}
return base.OnPostRestfulDelete(req, res, dbConnection, rtns);
}
}
[RequiresAnyRole(MemberRoles.Everyone)]
public class PolicyDetailRead : RestfulRead<PolicyDetail>
{
}
[RequiresAnyRole(MemberRoles.Everyone)]
public class PolicyDetailQuery : RestfulQuery<PolicyDetail>
{
}
[RequiresAnyRole(MemberRoles.Everyone)]
public class PolicyRecordQuery : RestfulQuery<PolicyRecord>
{
}
#endregion
[Api(Description = "政策匹配")]
[RequiresAnyRole(MemberRoles.Everyone)]
public class PolicyMatching : RestfulExecution<Policy>
{
public string TargetName { get; set; }
public Guid TargetKvid { get; set; }
public DateTime? BizTime { get; set; }
public override object OnExecution(IRequest req, IResponse res)
{
if (TargetName.IsNullOrEmpty() && TargetKvid == Guid.Empty) throw new Exception("请传入付款单位信息!");
if (BizTime == null) BizTime = new DateTime();
var conn = KiviiContext.GetOpenedDbConnection<PolicyDetail>();
var query = conn.From<PolicyDetail>();
if (TargetKvid != Guid.Empty) query.Where(o => o.TargetKvid == TargetKvid);
else query.Where(o => o.TargetName == TargetName);
query.Select(o => o.PolicyKvid);
var policys = conn.Select<Policy>(o => Sql.In(o.Kvid, query) && o.EffectiveTime <= BizTime && o.ExpiredTime >= BizTime);
var rtns = new RestfulQueryResponse<Policy>();
rtns.Results = new List<Policy>();
if (!policys.IsNullOrEmpty()) rtns.Results.AddRange(policys);
rtns.Total = rtns.Results.Count;
return rtns;
}
}
[Api(Description = "政策应用")]
[RequiresAnyRole(MemberRoles.Everyone)]
public class PolicyUsing : RestfulExecution<Policy>
{
public Guid PolicyKvid { get; set; }
public Settlement Item { get; set; }
public List<Settlement> Items { get; set; }
public override object OnExecution(IRequest req, IResponse res)
{
(Item == null && Items.IsNullOrEmpty()).ThrowIfTrue("请传入要创建的内容!");
if (Items.IsNullOrEmpty()) Items = new List<Settlement>();
if (Item != null) Items.Add(Item);
var conn = KiviiContext.GetOpenedDbConnection<Policy>();
var policy = conn.SingleById<Policy>(PolicyKvid);
var rtns = new RestfulQueryResponse<Settlement>();
rtns.Results = new List<Settlement>();
foreach (var item in Items)//先清除所有已存在的优惠政策
{
item.Category = string.Empty;
if (item.Details.IsNullOrEmpty()) continue;
item.Details.RemoveAll(o => o.BizType == typeof(Policy).FullName);
item.Amount = item.Details.Sum(o => o.Amount);
item.AmountPlan = item.Details.Sum(o => o.AmountPlan);
item.RemoveAllOnlyProperties();
}
if (policy == null)
{
rtns.Results.AddRange(Items);
rtns.Total = rtns.Results.Count;
return rtns;
}
if (policy.Type == PolicyType.Original)
{
foreach (var item in Items)
{
if (item.Details.IsNullOrEmpty()) item.Details = new List<SettlementDetail>();
decimal amount = 0;
decimal amountPlan = 0;
if (policy.Amount > 0)
{
if (item.AmountPlan - policy.Amount >= item.Amount)
{
item.RemoveAllOnlyProperties();
rtns.Results.Add(item);
continue;//由此可证明此优惠政策后不如原优惠力度所以跳过
}
var amountPolicy = item.AmountPlan - policy.Amount;
if (amountPolicy < 0) amountPolicy = 0;
amount = amountPolicy - item.Amount;
amountPlan = 0;
}
else
{
if (item.AmountPlan - item.AmountPlan * (1 - (policy.DiscountRate == null ? 1 : policy.DiscountRate.Value)) >= item.Amount)
{
item.RemoveAllOnlyProperties();
rtns.Results.Add(item);
continue;//由此可证明此优惠政策后不如原优惠力度所以跳过
}
amount = item.AmountPlan - item.AmountPlan * (1 - (policy.DiscountRate == null ? 1 : policy.DiscountRate.Value)) - item.Amount;
amountPlan = 0;
}
item.Category = policy.Type.ToString();
var detail = new SettlementDetail();
detail.OperateTime = DateTime.Now;
detail.OperatorName = KiviiContext.CurrentMember.FullName;
detail.OperatorKvid = KiviiContext.CurrentMember.Kvid;
detail.BizId = policy.Name;
detail.BizKvid = policy.Kvid;
detail.BizType = typeof(Policy).FullName;
detail.Amount = amount;
detail.AmountPlan = amountPlan;
detail.GoodsFullName = policy.Name;
detail.GoodsUnit = "次";
detail.Quantity = 1;
detail.QuantityUnitPrice = detail.Amount / detail.Quantity;
detail.QuantityPlan = detail.Quantity;
detail.QuantityUnitPricePlan = detail.AmountPlan / detail.QuantityPlan;
detail.QuantityUnit = "次";
detail.Type = "Policy";
detail.Currency = CurrencyUnit.CNY;
detail.Remark = $"执行优惠政策[{policy.Name}],减免{Math.Abs(detail.Amount)}元";
item.Details.Add(detail);
item.Amount = item.Details.Sum(o => o.Amount);
item.AmountPlan = item.Details.Sum(o => o.AmountPlan);
item.RemoveAllOnlyProperties();
rtns.Results.Add(item);
}
}
if (policy.Type == PolicyType.Additional)
{
foreach (var item in Items)
{
item.Category = policy.Type.ToString();
if (item.Details.IsNullOrEmpty()) item.Details = new List<SettlementDetail>();
decimal amount = 0;
decimal amountPlan = 0;
if (policy.Amount > 0)
{
amount = 0 - policy.Amount;
if (item.Amount - policy.Amount < 0) amount = 0 - item.Amount;
amountPlan = 0;
}
else
{
amount = 0 - item.Amount * (1 - (policy.DiscountRate == null ? 1 : policy.DiscountRate.Value));
amountPlan = 0;
}
var detail = new SettlementDetail();
detail.OperateTime = DateTime.Now;
detail.OperatorName = KiviiContext.CurrentMember.FullName;
detail.OperatorKvid = KiviiContext.CurrentMember.Kvid;
detail.BizId = policy.Name;
detail.BizKvid = policy.Kvid;
detail.BizType = typeof(Policy).FullName;
detail.Amount = amount;
detail.AmountPlan = amountPlan;
detail.GoodsFullName = policy.Name;
detail.GoodsUnit = "次";
detail.Quantity = 1;
detail.QuantityUnitPrice = detail.Amount / detail.Quantity;
detail.QuantityPlan = detail.Quantity;
detail.QuantityUnitPricePlan = detail.AmountPlan / detail.QuantityPlan;
detail.QuantityUnit = "次";
detail.Type = "Policy";
detail.Currency = CurrencyUnit.CNY;
item.Details.Add(detail);
item.Amount = item.Details.Sum(o => o.Amount);
item.AmountPlan = item.Details.Sum(o => o.AmountPlan);
item.RemoveAllOnlyProperties();
rtns.Results.Add(item);
}
}
rtns.Total = rtns.Results.Count;
return rtns;
}
}
}
using Kivii.Finances.Entities; using Kivii.Finances.Entities;
using Kivii.Finances.Extensions;
using Kivii.Linq; using Kivii.Linq;
using Kivii.Web; using Kivii.Web;
using System; using System;
...@@ -26,6 +27,7 @@ namespace Kivii.Finances.Transforms ...@@ -26,6 +27,7 @@ namespace Kivii.Finances.Transforms
(settlements.Count != Kvids.Count).ThrowIfTrue("所选结算和查询结果不一致!"); (settlements.Count != Kvids.Count).ThrowIfTrue("所选结算和查询结果不一致!");
settlements.Exists(o => o.OffsetKvid != Guid.Empty).ThrowIfTrue("存在已作废结算,无法重复作废"); settlements.Exists(o => o.OffsetKvid != Guid.Empty).ThrowIfTrue("存在已作废结算,无法重复作废");
settlements.Exists(o => o.AmountPayment <= 0).ThrowIfTrue("作废错误:作废的结算中包含未收款的结算!"); settlements.Exists(o => o.AmountPayment <= 0).ThrowIfTrue("作废错误:作废的结算中包含未收款的结算!");
var policyRecords = connF.Select<PolicyRecord>(o => Sql.In(o.SettlementKvid, Kvids));
//connF.Exists<Settlement>(o => o.AmountPayment != o.Amount && Sql.In(o.Kvid, Kvids)).ThrowIfTrue("作废错误:作废的结算中包含未收款的结算!"); //connF.Exists<Settlement>(o => o.AmountPayment != o.Amount && Sql.In(o.Kvid, Kvids)).ThrowIfTrue("作废错误:作废的结算中包含未收款的结算!");
////如果泛型类型不是Settlement本身就需要判断 ////如果泛型类型不是Settlement本身就需要判断
//if (typeof(G) != typeof(Settlement)) connE.Exists<EntitySettlement<G>>(o => o.AmountPayment != o.Amount && Sql.In(o.Kvid, Kvids)).ThrowIfTrue("作废错误:作废的结算中包含未收款的结算!"); //if (typeof(G) != typeof(Settlement)) connE.Exists<EntitySettlement<G>>(o => o.AmountPayment != o.Amount && Sql.In(o.Kvid, Kvids)).ThrowIfTrue("作废错误:作废的结算中包含未收款的结算!");
...@@ -40,7 +42,8 @@ namespace Kivii.Finances.Transforms ...@@ -40,7 +42,8 @@ namespace Kivii.Finances.Transforms
List<Pay> paysOffsetPreInsert = new List<Pay>(); List<Pay> paysOffsetPreInsert = new List<Pay>();
List<Settlement> settlementsOffsetPreUpdate = new List<Settlement>(); List<Settlement> settlementsOffsetPreUpdate = new List<Settlement>();
List<Settlement> settlementsOffsetPreInsert = new List<Settlement>(); List<Settlement> settlementsOffsetPreInsert = new List<Settlement>();
List<PolicyRecord> policyRecordOffsetPreUpdate = new List<PolicyRecord>();
List<PolicyRecord> policyRecordOffsetPreInsert = new List<PolicyRecord>();
var queryBillKvids = connF.From<BillDetail>(); var queryBillKvids = connF.From<BillDetail>();
queryBillKvids.SelectDistinct(o => o.BillKvid); queryBillKvids.SelectDistinct(o => o.BillKvid);
queryBillKvids.Where(o => Sql.In(o.BizKvid, settlements.ConvertAll(p => p.Kvid))); queryBillKvids.Where(o => Sql.In(o.BizKvid, settlements.ConvertAll(p => p.Kvid)));
...@@ -150,6 +153,19 @@ namespace Kivii.Finances.Transforms ...@@ -150,6 +153,19 @@ namespace Kivii.Finances.Transforms
} }
} }
} }
if (!policyRecords.IsNullOrEmpty())
{
var records = policyRecords.Where(o => o.SettlementKvid == settlement.Kvid).ToList();
if (!records.IsNullOrEmpty())
{
foreach (var record in records)
{
var offset = record.Offset("结算作废");
policyRecordOffsetPreInsert.Add(offset);
policyRecordOffsetPreUpdate.Add(record);
}
}
}
var settlementOffset = settlement.Offset("结算项作废"); var settlementOffset = settlement.Offset("结算项作废");
settlementsOffsetPreUpdate.Add(settlement); settlementsOffsetPreUpdate.Add(settlement);
settlementsOffsetPreInsert.Add(settlementOffset); settlementsOffsetPreInsert.Add(settlementOffset);
...@@ -251,6 +267,14 @@ namespace Kivii.Finances.Transforms ...@@ -251,6 +267,14 @@ namespace Kivii.Finances.Transforms
connE.Insert(entitySettlement); connE.Insert(entitySettlement);
} }
} }
foreach (var item in policyRecordOffsetPreInsert)
{
connF.Insert(item);
}
foreach (var item in policyRecordOffsetPreUpdate)
{
connF.UpdateOnly(item);
}
if (!billKvids.IsNullOrEmpty()) if (!billKvids.IsNullOrEmpty())
{ {
var updateBills = connE.From<Bill>(); var updateBills = connE.From<Bill>();
......
using Kivii.Finances.Entities; using Kivii.Finances.Entities;
using Kivii.Finances.Extensions;
using Kivii.Linq; using Kivii.Linq;
using Kivii.Web; using Kivii.Web;
using System; using System;
...@@ -143,6 +144,38 @@ namespace Kivii.Finances.Transforms ...@@ -143,6 +144,38 @@ namespace Kivii.Finances.Transforms
connE.Insert(entityDetail); connE.Insert(entityDetail);
} }
#endregion #endregion
var existPolicy = item.Details.FirstOrDefault(o => o.BizType == typeof(Policy).FullName);
if (existPolicy != null)
{
var policyRecord = new PolicyRecord();
policyRecord.PolicyKvid = existPolicy.BizKvid;
policyRecord.SettlementKvid = settlementKvid;
policyRecord.BizId = settlement.BizId;
policyRecord.BizKvid = settlement.BizKvid;
policyRecord.BizType = settlement.BizType;
policyRecord.TargetKvid = settlement.PayerKvid;
policyRecord.TargetName = settlement.PayerName;
policyRecord.AmountPlan = item.Details.Sum(o => o.AmountPlan);
policyRecord.AmountOrigin = item.Details.Where(o => o.BizType != typeof(Policy).FullName).Sum(o => o.Amount);
policyRecord.AmountPolicy = Math.Abs(item.Details.Where(o => o.BizType == typeof(Policy).FullName).Sum(o => o.Amount));
policyRecord.Amount = item.Details.Sum(o => o.Amount);
policyRecord.OperateTime = settlement.OperateTime;
policyRecord.OperatorKvid = KiviiContext.CurrentMember.Kvid;
policyRecord.OperatorName = KiviiContext.CurrentMember.FullName;
policyRecord.Metadata = new Dictionary<string, string>();
foreach (var propertyInfo in settlement.GetType().GetProperties())
{
if (propertyInfo.Name == "Metadata") continue;
try
{
var value = propertyInfo.GetValue(item);
policyRecord.Metadata[propertyInfo.Name] = value == null ? string.Empty : value.ToString();
}
catch { continue; }
}
connF.Insert(policyRecord);
}
} }
} }
tranE?.Commit(); tranE?.Commit();
...@@ -374,12 +407,14 @@ namespace Kivii.Finances.Transforms ...@@ -374,12 +407,14 @@ namespace Kivii.Finances.Transforms
//var entitySettlementDetails = connE.Select<EntitySettlementDetail<G>>(o => Sql.In(o.SettlementKvid, Kvids)); //var entitySettlementDetails = connE.Select<EntitySettlementDetail<G>>(o => Sql.In(o.SettlementKvid, Kvids));
connF.InitEntityType<BillDetail>(); connF.InitEntityType<BillDetail>();
connF.InitEntityType<Bill>(); connF.InitEntityType<Bill>();
connF.InitEntityType<PolicyRecord>();
var billDetails = connF.Select<BillDetail>(o => Sql.In(o.BizKvid, Kvids)); var billDetails = connF.Select<BillDetail>(o => Sql.In(o.BizKvid, Kvids));
var offsetBillDetails = new List<BillDetail>(); var offsetBillDetails = new List<BillDetail>();
foreach (var item in billDetails) foreach (var item in billDetails)
{ {
offsetBillDetails.Add(item.Offset("结算项已删除")); offsetBillDetails.Add(item.Offset("结算项已删除"));
} }
var policyRecords = connF.Select<PolicyRecord>(o => Sql.In(o.SettlementKvid, Kvids));
var queryBillKvids = connF.From<BillDetail>(); var queryBillKvids = connF.From<BillDetail>();
queryBillKvids.SelectDistinct(o => o.BillKvid); queryBillKvids.SelectDistinct(o => o.BillKvid);
...@@ -462,6 +497,15 @@ namespace Kivii.Finances.Transforms ...@@ -462,6 +497,15 @@ namespace Kivii.Finances.Transforms
updateEntitySettlementDetails = updateEntitySettlementDetails.Where(o => Sql.In(o.SettlementKvid, Kvids)); updateEntitySettlementDetails = updateEntitySettlementDetails.Where(o => Sql.In(o.SettlementKvid, Kvids));
connE.UpdateOnly<EntitySettlementDetail<G>>(new EntitySettlementDetail<G> { Status = -1 }, updateEntitySettlementDetails); connE.UpdateOnly<EntitySettlementDetail<G>>(new EntitySettlementDetail<G> { Status = -1 }, updateEntitySettlementDetails);
if (!policyRecords.IsNullOrEmpty())
{
foreach (var record in policyRecords)
{
var offset = record.Offset("结算删除");
connF.UpdateOnly(record);
connF.Insert(offset);
}
}
//作废账单中包含当前结算项的明细 //作废账单中包含当前结算项的明细
#region 作废账单中包含当前结算项的明细 #region 作废账单中包含当前结算项的明细
foreach (var item in billDetails) foreach (var item in billDetails)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment