Commit f572abb0 by Neo Turing

init

parents
################################################################################
# 此 .gitignore 文件已由 Microsoft(R) Visual Studio 自动创建。
################################################################################
/.vs
/Src/obj
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances
{
internal class Configs
{
public const string TableNameAccount = "FINA_Accounts";
public const string TableNameAccountDetail = "FINA_AccountDetails";
public const string TableNameInvoice = "FINA_Invoices";
public const string TableNameInvoiceDetail = "FINA_InvoiceDetails";
public const string TableNameInvoiceTitle = "FINA_InvoicesTitles";
public const string TableNameApply = "FINA_Applies";
public const string TableNameApplyDetail = "FINA_ApplyDetails";
public const string TableNameIncome = "FINA_Incomes";
public const string TableNamePayment = "FINA_Payments";
public const string TableNameTransfer = "FINA_Transfers";
public const string TableNameSettlement = "FINA_Settlements";
public const string TableNameSettlementGroup = "FINA_SettlementGroups";
public const string TableNamePrefixSettlement = "Stms";
public const string TableNamePrefixSettlementDetail = "Stmd";
public const string TableNameBill = "FINA_Bills";
public const string TableNameBillDetail = "FINA_BillDetails";
public const string TableNameLoan = "FINA_Loans";
public const string TableNameLoanDetail = "FINA_LoanDetails";
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
{
/// <summary>
/// 账户类型
/// </summary>
public enum AccountType
{
/// <summary>
/// 不支持的账户类型
/// </summary>
[Description("不支持的账户类型")]
Unsupported = 0,
/// <summary>
///现金账户,用于收到的现金,只用于组织内,不用于客户,如业务员收取现金,可转存至银行帐户,备用金
/// </summary>
[Description("现金账户")]
Cash,
/// <summary>
///刷卡账户,用于收到的刷卡,只用于组织内,个人业务员使用
/// </summary>
[Description("刷卡账户")]
Pos,
/// <summary>
///银行账户,可清零或调帐,不用于客户,只用于组织内
/// </summary>
[Description("银行账户")]
Bank,
/// <summary>
/// 支付宝账户
/// </summary>
[Description("支付宝账户")]
AliPay,
/// <summary>
/// 微信账户
/// </summary>
[Description("微信账户")]
WeChat,
/// <summary>
///存款账户,专指内部转帐的账户,也可转至Bank,唯一性,资金,关联各种业务的账户,如贷款
/// </summary>
[Description("存款账户")]
Deposit,
/// <summary>
///优惠券,一次性使用,多不退少补
/// </summary>
[Description("优惠券")]
Coupon,
/// <summary>
///储值卡,只能充值和消费,不能转出
/// </summary>
[Description("储值卡")]
StoredCard,
/// <summary>
///业务专用账户,可设多个业务账户,用于记录不同业务的收入
/// </summary>
[Description("业务专用账户")]
Biz,
/// <summary>
/// 平衡系统所有账户金额为0,一个系统仅有一个,即系统与系统外部有金额往来就新增账户明细
/// </summary>
[Description("平衡账户")]
Balance,
/// <summary>
/// 折扣账户,各部门仅有一个
/// </summary>
[Description("折扣账户")]
Discount
}
[Api(Description = "账户")]
[Alias(Configs.TableNameAccount)]
public class Account : EntityWithMetadata, IEntityInAssemblyDb,
IEntityHasCreator, IEntityHasOrganization
{
#region 账户所有人,禁止更新
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid OwnerKvid { get; set; }
[ApiMember(Description = "所有者名称")]
[IgnoreUpdate]
[StringLength(500), Required]
public string OwnerName { get; set; }
#endregion
#region 帐户相关 账户类型禁止更新
[ApiMember(Description = "账户名称,如果是Bank类型,可以写银行名称,如果是其它类型,这个应该是账户的友好名称,不应该和OwnerName重复")]
[StringLength(200)]
[Required]
public string Name { get; set; }
[ApiMember(Description = "账户编号")]
[StringLength(200), Default("")]
public string SerialNumber { get; set; }
[ApiMember(Description = "类型,账户类型")]
[StringLength(50), Required]
public AccountType Type { get; set; }
[ApiMember(Description = "失效日期,仅针对StoredCard储值卡 和 Coupon 优惠券")]
public DateTime? ExpiredDate { get; set; }
#endregion
#region 金额相关,账户单位禁止更新,额度和金额都是内部更新
[ApiMember(Description = "授信额度,仅针对存款账户")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal CreditLine { get; set; }
[ApiMember(Description = "当前金额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal Amount { get; set; }
[ApiMember(Description = "单位")]
[IgnoreUpdate]
[StringLength(50), Required]
public CurrencyUnit Currency { get; set; }
#endregion
#region 文本 摘要 备注
[ApiMember(Description = "摘要,最大500字")]
[StringLength(500), Default("")]
public string Summary { get; set; }
[ApiMember(Description = "备注,最大2000字")]
[StringLength(2000), Default("")]
public string Remark { get; set; }
#endregion
#region 操作相关 Creator
[ApiMember(Description = "创建人Kvid ")]
[IgnoreUpdate]
[CurrentMemberKvid]
public Guid CreatorKvid { get; set; }
[ApiMember(Description = "创建人")]
[IgnoreUpdate]
[StringLength(50), CurrentMemberName]
public string CreatorName { get; set; }
[ApiMember(Description = "组织机构Id,当组织有子组织时区分所属组织")]
[IgnoreUpdate]
[CurrentOrganizationKvid]
public Guid OrganizationKvid { get; set; }
#endregion
}
}
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.TableNameAccountDetail)]
public class AccountDetail:EntityWithMetadata, IEntityInAssemblyDb,
IEntityHasSummary, IEntityHasRemark,
IEntityHasBiz,
IEntityHasCreator, IEntityHasUpdater, IEntityHasOrganization
{
#region 关联信息 Account,Offset Biz
[InternalSetter]
[DefaultEmptyGuid, Required]
public Guid AccountKvid { get; set; }
[ApiMember(Description = "业务Kvid")]
[InternalSetter]
[DefaultEmptyGuid]
public Guid BizKvid { get; set; }
[ApiMember(Description = "业务流水号")]
[InternalSetter]
[StringLength(200), Default("")]
public string BizId { get; set; }
[ApiMember(Description = "业务类型,指实体类型全名称")]
[InternalSetter]
[StringLength(200), Default("")]
public string BizType { get; set; }
#endregion
#region 收付双方 Payer付款单位,贷方 Payee收款单位,借方 禁止更新
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid PayerKvid { get; set; }
[ApiMember(Description = "付款单位,贷方")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string PayerName { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid PayerAccountKvid { get; set; }
[ApiMember(Description = "付款账户名称,如果是Bank类的,指银行")]
[IgnoreUpdate]
[StringLength(200), Default("")]
public string PayerAccountName { get; set; }
[IgnoreUpdate]
[StringLength(100), Default("")]
public string PayerAccountSerialNumber { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid PayeeKvid { get; set; }
[ApiMember(Description = "收款单位,借方")]
[IgnoreUpdate]
[StringLength(100), Default("")]
public string PayeeName { get; set; }
[IgnoreUpdate]
[DefaultEmptyGuid]
public Guid PayeeAccountKvid { get; set; }
[ApiMember(Description = "收款账户名称")]
[IgnoreUpdate]
[StringLength(200), Default("")]
public string PayeeAccountName { get; set; }
[IgnoreUpdate]
[StringLength(100), Default("")]
public string PayeeAccountSerialNumber { get; set; }
#endregion
#region 金额相关
/// <summary>
/// 发生金额
/// </summary>
[ApiMember(Description = "发生金额,正数为入(借),负数为出(贷)正常全为正数,如果为负值,应该对调借贷双方")]
[IgnoreUpdate]
[DecimalLength(15, 2), Required]
public decimal AmountPayment { get; set; }
/// <summary>
/// 帐户余额
/// </summary>
[ApiMember(Description = "帐户余额")]
[InternalSetter]
[DecimalLength(15, 2), Default(0)]
public decimal Amount { get; set; }
#endregion
#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
[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
}
}
using Kivii.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances
{
/// <summary>
/// 通用的扩展方法集合
/// </summary>
internal static class Extension
{
/// <summary>
/// 获取枚举值的描述特性
/// </summary>
/// <param name="value">要获取描述的枚举值</param>
/// <returns>返回枚举值的描述;如果没有描述特性,则返回枚举值的名称</returns>
/// <example>
/// <code>
/// Status status = Status.Pending;
/// string description = status.GetDescription(); // 返回 "待处理"
/// </code>
/// </example>
public static string GetDescription(this Enum value)
{
// 通过反射获取枚举值对应的字段信息
FieldInfo field = value.GetType().GetField(value.ToString());
if (field != null)
{
// 从字段中获取DescriptionAttribute特性
DescriptionAttribute attribute = Attribute.GetCustomAttribute(field,
typeof(DescriptionAttribute)) as DescriptionAttribute;
if (attribute != null && !string.IsNullOrEmpty(attribute.Description))
{
// 如果找到了描述特性,则返回其Description属性值
return attribute.Description;
}
}
// 如果没有找到描述特性或字段信息为空,则返回枚举值的字符串表示
return value.ToString();
}
/// <summary>
/// 获取指定枚举类型的所有值和描述,并返回为键值对列表
/// </summary>
/// <typeparam name="T">枚举类型</typeparam>
/// <returns>包含枚举值和描述的键值对列表</returns>
public static List<KeyValuePair<string, T>> GetAllValuesAndDescriptions<T>() where T : Enum
{
// 创建结果列表
List<KeyValuePair<string, T>> result = new List<KeyValuePair<string, T>>();
// 获取枚举类型的所有值
Array enumValues = Enum.GetValues(typeof(T));
// 遍历所有枚举值
foreach (T value in enumValues)
{
// 获取当前枚举值的描述
string description = GetDescription((Enum)(object)value);
// 添加到结果列表
result.Add(new KeyValuePair<string, T>(description, value));
}
return result;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{CA3A0331-F7F8-4093-A2B3-B0F52CA0773F}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Kivii.Finances</RootNamespace>
<AssemblyName>Kivii.Biz.Finances.V2.5</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\..\Kivii%27s Releases\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Kivii.Common.V4.5, Version=5.6.2024.11000, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\Kivii.Common.5.6.2024.11000\lib\net45\Kivii.Common.V4.5.dll</HintPath>
</Reference>
<Reference Include="Kivii.Core.V4.5, Version=5.6.2024.11000, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\Kivii.Core.5.6.2024.11000\lib\net45\Kivii.Core.V4.5.dll</HintPath>
</Reference>
<Reference Include="Kivii.Linq.V4.5, Version=5.6.2024.11000, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\Kivii.Linq.5.6.2024.11000\lib\net45\Kivii.Linq.V4.5.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Configs.cs" />
<Compile Include="Entities\Account.cs" />
<Compile Include="Entities\AccountDetail.cs" />
<Compile Include="Extensions\Extension.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Transforms\RestfulAccount.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>if "$(ConfigurationName)"=="Release" if exist "$(TargetDir)Reactor\dotNET_Reactor.exe" (call "$(TargetDir)Reactor\dotNET_Reactor.exe" -file "$(TargetPath)" -targetfile "$(TargetDir)Release\$(TargetFileName)" -stringencryption 0 -antitamp 1 -suppressildasm 1)</PostBuildEvent>
</PropertyGroup>
</Project>
\ No newline at end of file
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("Kivii.Biz.Finances")]
[assembly: AssemblyDescription("业财一体化系统,标准版")]
[assembly: AssemblyDefaultAlias("Kivii.Finances")]
[assembly: AssemblyConfiguration("")]
#if DEBUG
[assembly: AssemblyCompany("Kivii.Org")]
#else
[assembly: AssemblyCompany("Kivii.Com")]
#endif
[assembly: AssemblyProduct("Kivii.Biz.Finances.V2.5")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("Kivii,K5")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("ca3a0331-f7f8-4093-a2b3-b0f52ca0773f")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("5.4.2025.3270")]
[assembly: AssemblyFileVersion("5.4.2025.3270")]
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 CRQ
/// <summary>
/// 开户功能
/// </summary>
[RequiresAnyRole(SystemRoles.Everyone)]
public class AccountCreate : RestfulCreate<Account>
{
private IDbTransaction _trans;
public override bool OnPreRestfulCreate(IRequest req, IResponse res, IDbConnection dbConnection, IRestfulCreateResponse<Account> rtns)
{
#region 数据有效性验证
//if (Item.OwnerKvid == Guid.Empty) throw new Exception("未指定账户所有人");
if (Item.OwnerName.IsNullOrEmpty()) throw new Exception("未指定账户所有人名称");
if (Item.Currency == CurrencyUnit.Unsupported) throw new Exception("不支持的货币类型!");
if (Item.Type == AccountType.Unsupported) throw new Exception("不支持的账户类型!");
//一个客户或用户只能拥有一个存款账户
var exist = dbConnection.Exists<Account>(o => o.OwnerName == Item.OwnerName && o.Type == Item.Type);
exist.ThrowIfTrue($"客户{Item.OwnerName}已经存在当前账户类型:{Item.Type.GetDescription()}");
#endregion
_trans = dbConnection.OpenTransaction();
return base.OnPreRestfulCreate(req, res, dbConnection, rtns);
}
public override bool OnPostRestfulCreate(IRequest req, IResponse res, IDbConnection dbConnection, IRestfulCreateResponse<Account> rtns)
{
try
{
//新建开户记录
var accountDetail = new AccountDetail();
accountDetail.AccountKvid = Item.Kvid;
accountDetail.BizKvid = Item.Kvid;
accountDetail.BizType = typeof(Account).FullName;
accountDetail.BizId = Item.SerialNumber;
accountDetail.PayerKvid = Item.Kvid;
accountDetail.PayerName = Item.Name;
accountDetail.PayerAccountKvid = Item.Kvid;
accountDetail.PayerAccountName = Item.Name;
accountDetail.PayerAccountSerialNumber = Item.SerialNumber;
accountDetail.PayeeKvid = Item.Kvid;
accountDetail.PayeeName = Item.Name;
accountDetail.PayeeAccountKvid = Item.Kvid;
accountDetail.PayeeAccountName = Item.Name;
accountDetail.PayeeAccountSerialNumber = Item.SerialNumber;
accountDetail.AmountPayment = 0;
accountDetail.Amount = 0;
accountDetail.Summary = "开户";
accountDetail.Remark = "开户";
dbConnection.Insert(accountDetail);
_trans?.Commit();
return base.OnPostRestfulCreate(req, res, dbConnection, rtns);
}
catch (Exception ex)
{
_trans?.Rollback();
throw ex;
}
finally { _trans?.Dispose(); }
}
}
[RequiresAnyRole(SystemRoles.Everyone)]
public class AccountQuery : RestfulQuery<Account>
{
}
[RequiresAnyRole(SystemRoles.Everyone)]
public class AccountRead : RestfulRead<Account>
{
}
[Api(Description = "账户查询")]
[RequiresAnyRole(SystemRoles.Everyone)]
public class AccountQueryEx : RestfulExecution<Account>
{
#region QueryArgs
public virtual int? Skip { get; set; }
public virtual int? Take { get; set; }
public virtual string OrderBy { get; set; }
public string OrderByDesc { get; set; }
public virtual string Include { get; set; }
public virtual string Fields { get; set; }
public string QueryKeys { get; set; }
public string QueryValues { get; set; }
#endregion
public override object OnExecution(IRequest req, IResponse res)
{
var conn = KiviiContext.GetOpenedDbConnection<Account>();
var dynamicParams = Request.GetRequestParams();
var autoQuery = Request.TryResolve<IAutoQueryDb>();
autoQuery.IncludeTotal = true;
var request = new RestfulQuery<Account>();
request = request.PopulateWith(this);
var sqlExpress = autoQuery.CreateQuery(Request, conn, request, dynamicParams);
var ownerKvids = KiviiContext.CurrentMember.DepartmentKvids.ToList();
ownerKvids.Add(KiviiContext.CurrentMember.OrganizationKvid);
ownerKvids.Add(KiviiContext.CurrentMember.Kvid);
sqlExpress.Where(o => o.Type != AccountType.Balance && Sql.In(o.OwnerKvid, ownerKvids));
var rtns = autoQuery.Execute(Request, conn, request, sqlExpress);
return rtns;
}
}
#endregion
/// <summary>
/// 获取账户类型
/// </summary>
public class AccountTypeGet : RestfulExecution<AccountType>
{
public override object OnExecution(IRequest req, IResponse res)
{
List<KeyValuePair<string, AccountType>> results = Extension.GetAllValuesAndDescriptions<AccountType>();
var rtns = new RestfulQueryResponse<KeyValuePair<string, AccountType>>();
rtns.Results = results;
rtns.Total = results.Count();
return rtns;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Kivii.Common" version="5.6.2024.11000" targetFramework="net45" />
<package id="Kivii.Core" version="5.6.2024.11000" targetFramework="net45" />
<package id="Kivii.Linq" version="5.6.2024.11000" targetFramework="net45" />
</packages>
\ No newline at end of file
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