Commit 620b3210 by 陶然

新增优惠政策模块

parent 44603696
......@@ -36,5 +36,9 @@ namespace Kivii.Finances
public const string TableNamePay = "FINA_Pays";
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 @@
<Compile Include="Entities\InvoiceTitle.cs" />
<Compile Include="Entities\Pay.cs" />
<Compile Include="Entities\Payment.cs" />
<Compile Include="Entities\Policy.cs" />
<Compile Include="Entities\Settlement.cs" />
<Compile Include="Entities\SettlementAnalysis.cs" />
<Compile Include="Entities\SettlementDetail.cs" />
......@@ -75,7 +76,8 @@
<Compile Include="Extensions\InvoiceExtension.cs" />
<Compile Include="Extensions\PayExtension.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="Properties\AssemblyInfo.cs" />
<Compile Include="Transforms\RestfulAccount.cs" />
......@@ -94,6 +96,7 @@
<Compile Include="Transforms\RestfulPayment.Offset.cs" />
<Compile Include="Transforms\RestfulPayment.Split.cs" />
<Compile Include="Transforms\RestfulPayment.UnBiz.Refund.cs" />
<Compile Include="Transforms\RestfulPolicy.cs" />
<Compile Include="Transforms\RestfulSettlement.cs" />
<Compile Include="Transforms\RestfulSettlement.Offset.cs" />
<Compile Include="Transforms\RestfulStatistic.cs" />
......
......@@ -5,7 +5,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances.Extensions
namespace Kivii.Finances
{
public class PaymentRoles
{
......
using Kivii.Finances.Entities;
using Kivii.Finances.Extensions;
using Kivii.Linq;
using Kivii.Web;
using System;
......@@ -26,6 +27,7 @@ namespace Kivii.Finances.Transforms
(settlements.Count != Kvids.Count).ThrowIfTrue("所选结算和查询结果不一致!");
settlements.Exists(o => o.OffsetKvid != Guid.Empty).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("作废错误:作废的结算中包含未收款的结算!");
////如果泛型类型不是Settlement本身就需要判断
//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
List<Pay> paysOffsetPreInsert = new List<Pay>();
List<Settlement> settlementsOffsetPreUpdate = 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>();
queryBillKvids.SelectDistinct(o => o.BillKvid);
queryBillKvids.Where(o => Sql.In(o.BizKvid, settlements.ConvertAll(p => p.Kvid)));
......@@ -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("结算项作废");
settlementsOffsetPreUpdate.Add(settlement);
settlementsOffsetPreInsert.Add(settlementOffset);
......@@ -251,6 +267,14 @@ namespace Kivii.Finances.Transforms
connE.Insert(entitySettlement);
}
}
foreach (var item in policyRecordOffsetPreInsert)
{
connF.Insert(item);
}
foreach (var item in policyRecordOffsetPreUpdate)
{
connF.UpdateOnly(item);
}
if (!billKvids.IsNullOrEmpty())
{
var updateBills = connE.From<Bill>();
......
using Kivii.Finances.Entities;
using Kivii.Finances.Extensions;
using Kivii.Linq;
using Kivii.Web;
using System;
......@@ -143,6 +144,38 @@ namespace Kivii.Finances.Transforms
connE.Insert(entityDetail);
}
#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();
......@@ -374,12 +407,14 @@ namespace Kivii.Finances.Transforms
//var entitySettlementDetails = connE.Select<EntitySettlementDetail<G>>(o => Sql.In(o.SettlementKvid, Kvids));
connF.InitEntityType<BillDetail>();
connF.InitEntityType<Bill>();
connF.InitEntityType<PolicyRecord>();
var billDetails = connF.Select<BillDetail>(o => Sql.In(o.BizKvid, Kvids));
var offsetBillDetails = new List<BillDetail>();
foreach (var item in billDetails)
{
offsetBillDetails.Add(item.Offset("结算项已删除"));
}
var policyRecords = connF.Select<PolicyRecord>(o => Sql.In(o.SettlementKvid, Kvids));
var queryBillKvids = connF.From<BillDetail>();
queryBillKvids.SelectDistinct(o => o.BillKvid);
......@@ -462,6 +497,15 @@ namespace Kivii.Finances.Transforms
updateEntitySettlementDetails = updateEntitySettlementDetails.Where(o => Sql.In(o.SettlementKvid, Kvids));
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 作废账单中包含当前结算项的明细
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