Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
Kivii.Biz.Finances.V2.0
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
陶然
Kivii.Biz.Finances.V2.0
Commits
fed5068e
Commit
fed5068e
authored
Feb 18, 2023
by
陶然
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Payment新增Assign类型
parent
f19140a5
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
578 additions
and
31 deletions
+578
-31
Payment.cs
Src/Entities/Payment.cs
+5
-0
InvoiceApplyExtension.cs
Src/Extensions/InvoiceApplyExtension.cs
+1
-1
PayExtension.cs
Src/Extensions/PayExtension.cs
+1
-1
PaymentExtension.cs
Src/Extensions/PaymentExtension.cs
+216
-7
RestfulInvoice.cs
Src/Transforms/RestfulInvoice.cs
+3
-3
RestfulInvoiceApply.Apply.cs
Src/Transforms/RestfulInvoiceApply.Apply.cs
+26
-3
RestfulPay.cs
Src/Transforms/RestfulPay.cs
+15
-3
RestfulPayment.Account.cs
Src/Transforms/RestfulPayment.Account.cs
+2
-1
RestfulPayment.Split.cs
Src/Transforms/RestfulPayment.Split.cs
+276
-4
RestfulPayment.cs
Src/Transforms/RestfulPayment.cs
+29
-6
RestfulSettlement.Offset.cs
Src/Transforms/RestfulSettlement.Offset.cs
+1
-1
RestfulPayment.Statistic.cs
Src/Transforms/Statistics/RestfulPayment.Statistic.cs
+3
-1
No files found.
Src/Entities/Payment.cs
View file @
fed5068e
...
@@ -236,6 +236,11 @@ namespace Kivii.Finances.Entities
...
@@ -236,6 +236,11 @@ namespace Kivii.Finances.Entities
Split
,
Split
,
/// <summary>
/// <summary>
/// 拆分后分配,用于内部拆分后指派分配到其他部门,此类型的父级是Split,同时此类型职能与Split相同,可用于收款登记和转账
/// </summary>
Assign
,
/// <summary>
/// 非业务使用
/// 非业务使用
/// </summary>
/// </summary>
UnBiz
,
UnBiz
,
...
...
Src/Extensions/InvoiceApplyExtension.cs
View file @
fed5068e
...
@@ -38,7 +38,7 @@ namespace Kivii.Finances
...
@@ -38,7 +38,7 @@ namespace Kivii.Finances
{
{
payments
.
ThrowIfNullOrEmpty
(
"要关联的Payments不能为空!"
);
payments
.
ThrowIfNullOrEmpty
(
"要关联的Payments不能为空!"
);
invoices
.
ThrowIfNullOrEmpty
(
"要关联的Invoices不能为空!"
);
invoices
.
ThrowIfNullOrEmpty
(
"要关联的Invoices不能为空!"
);
(
payments
.
Exists
(
o
=>
o
.
Type
!=
PaymentType
.
Bank
&&
o
.
Type
!=
PaymentType
.
AliPay
&&
o
.
Type
!=
PaymentType
.
Cash
&&
o
.
Type
!=
PaymentType
.
Pos
&&
o
.
Type
!=
PaymentType
.
Split
&&
o
.
Type
!=
PaymentType
.
WeChat
)).
ThrowIfTrue
(
"请选择正确收款进行关联"
);
(
payments
.
Exists
(
o
=>
o
.
Type
!=
PaymentType
.
Bank
&&
o
.
Type
!=
PaymentType
.
AliPay
&&
o
.
Type
!=
PaymentType
.
Cash
&&
o
.
Type
!=
PaymentType
.
Pos
&&
o
.
Type
!=
PaymentType
.
Split
&&
o
.
Type
!=
PaymentType
.
Assign
&&
o
.
Type
!=
PaymentType
.
WeChat
)).
ThrowIfTrue
(
"请选择正确收款进行关联"
);
var
payedTime
=
payments
.
Max
(
o
=>
o
.
OperateTime
);
var
payedTime
=
payments
.
Max
(
o
=>
o
.
OperateTime
);
var
rtns
=
new
List
<
Invoice
>();
var
rtns
=
new
List
<
Invoice
>();
...
...
Src/Extensions/PayExtension.cs
View file @
fed5068e
...
@@ -24,7 +24,7 @@ namespace Kivii.Finances
...
@@ -24,7 +24,7 @@ namespace Kivii.Finances
payment
.
ThrowIfNull
(
"未传入到账信息!"
);
payment
.
ThrowIfNull
(
"未传入到账信息!"
);
accountPayee
.
ThrowIfNull
(
"未传入指定收款账户!"
);
accountPayee
.
ThrowIfNull
(
"未传入指定收款账户!"
);
(
settlements
.
Exists
(
o
=>
o
.
Currency
!=
payment
.
Currency
||
o
.
Currency
!=
accountPayee
.
Currency
)).
ThrowIfTrue
(
"存在不相符的货币单位!"
);
(
settlements
.
Exists
(
o
=>
o
.
Currency
!=
payment
.
Currency
||
o
.
Currency
!=
accountPayee
.
Currency
)).
ThrowIfTrue
(
"存在不相符的货币单位!"
);
if
(
payment
.
Type
!=
PaymentType
.
Split
&&
payment
.
Type
!=
PaymentType
.
Pos
&&
payment
.
Type
!=
PaymentType
.
Cash
&&
payment
.
Type
!=
PaymentType
.
AliPay
&&
payment
.
Type
!=
PaymentType
.
WeChat
)
throw
new
Exception
(
"请选择正确的付款方式!"
);
if
(
payment
.
Type
!=
PaymentType
.
Split
&&
payment
.
Type
!=
PaymentType
.
Assign
&&
payment
.
Type
!=
PaymentType
.
Pos
&&
payment
.
Type
!=
PaymentType
.
Cash
&&
payment
.
Type
!=
PaymentType
.
AliPay
&&
payment
.
Type
!=
PaymentType
.
WeChat
)
throw
new
Exception
(
"请选择正确的付款方式!"
);
var
amountSettlement
=
settlements
.
Sum
(
o
=>
o
.
Amount
-
o
.
AmountPayment
);
var
amountSettlement
=
settlements
.
Sum
(
o
=>
o
.
Amount
-
o
.
AmountPayment
);
if
(
amountSettlement
<=
0
)
throw
new
Exception
(
"当前结算已无需付款登记!"
);
if
(
amountSettlement
<=
0
)
throw
new
Exception
(
"当前结算已无需付款登记!"
);
if
(
amount
<=
0
||
amount
>
amountSettlement
)
amount
=
amountSettlement
;
if
(
amount
<=
0
||
amount
>
amountSettlement
)
amount
=
amountSettlement
;
...
...
Src/Extensions/PaymentExtension.cs
View file @
fed5068e
...
@@ -227,9 +227,18 @@ namespace Kivii.Finances
...
@@ -227,9 +227,18 @@ namespace Kivii.Finances
{
{
conn
=
KiviiContext
.
GetOpenedDbConnection
<
Payment
>();
conn
=
KiviiContext
.
GetOpenedDbConnection
<
Payment
>();
}
}
decimal
amountUsed
=
0
;
//var amountInvoiced = conn.Scalar<Payment, decimal>(o => Sql.Sum(o.AmountInvoice), p => p.ParentKvid == payment.Kvid && p.OffsetKvid == Guid.Empty);
if
(
payment
.
Type
==
PaymentType
.
Split
)
//拆分类型 要统计使用金额就跳过子集assgin,因为此类型也可能存在子集 所以把他们合并起来一起查
var
amountUsed
=
conn
.
Scalar
<
Payment
,
decimal
>(
o
=>
Sql
.
Sum
(
o
.
AmountUsed
),
p
=>
p
.
ParentKvid
==
payment
.
Kvid
&&
p
.
OffsetKvid
==
Guid
.
Empty
);
{
var
queryAssign
=
conn
.
From
<
Payment
>();
queryAssign
.
Where
(
o
=>
o
.
ParentKvid
==
payment
.
Kvid
&&
o
.
OffsetKvid
==
Guid
.
Empty
&&
o
.
Type
==
PaymentType
.
Assign
);
queryAssign
.
Select
(
o
=>
o
.
Kvid
);
var
assignKvids
=
conn
.
Select
<
Guid
>(
queryAssign
);
if
(
assignKvids
.
IsNullOrEmpty
())
assignKvids
=
new
List
<
Guid
>();
assignKvids
.
Add
(
payment
.
Kvid
);
amountUsed
=
conn
.
Scalar
<
Payment
,
decimal
>(
o
=>
Sql
.
Sum
(
o
.
AmountUsed
),
p
=>
p
.
Type
!=
PaymentType
.
Assign
&&
Sql
.
In
(
p
.
ParentKvid
,
assignKvids
)
&&
p
.
OffsetKvid
==
Guid
.
Empty
);
}
else
amountUsed
=
conn
.
Scalar
<
Payment
,
decimal
>(
o
=>
Sql
.
Sum
(
o
.
AmountUsed
),
p
=>
p
.
ParentKvid
==
payment
.
Kvid
&&
p
.
OffsetKvid
==
Guid
.
Empty
);
Payment
parentPayment
=
null
;
Payment
parentPayment
=
null
;
if
(
payment
.
ParentKvid
!=
Guid
.
Empty
)
parentPayment
=
conn
.
SingleById
<
Payment
>(
payment
.
ParentKvid
);
if
(
payment
.
ParentKvid
!=
Guid
.
Empty
)
parentPayment
=
conn
.
SingleById
<
Payment
>(
payment
.
ParentKvid
);
IDbTransaction
trans
=
null
;
//事务,如果外部来了Connection,不生成事务
IDbTransaction
trans
=
null
;
//事务,如果外部来了Connection,不生成事务
...
@@ -265,7 +274,7 @@ namespace Kivii.Finances
...
@@ -265,7 +274,7 @@ namespace Kivii.Finances
public
static
Payment
RecalculateAmountSplit
(
this
Payment
payment
,
IDbConnection
conn
=
null
)
public
static
Payment
RecalculateAmountSplit
(
this
Payment
payment
,
IDbConnection
conn
=
null
)
{
{
payment
.
ThrowIfNull
(
"要更新的付款记录不能为空!"
);
payment
.
ThrowIfNull
(
"要更新的付款记录不能为空!"
);
(
payment
.
Type
!=
PaymentType
.
Bank
).
ThrowIfTrue
(
"不支持的类型"
);
(
payment
.
Type
!=
PaymentType
.
Bank
&&
payment
.
Type
!=
PaymentType
.
Split
).
ThrowIfTrue
(
"不支持的类型"
);
bool
useTransaction
=
conn
==
null
;
//是否启用事务,如果外部未传入conn,启用内部事务
bool
useTransaction
=
conn
==
null
;
//是否启用事务,如果外部未传入conn,启用内部事务
if
(
conn
==
null
)
if
(
conn
==
null
)
{
{
...
@@ -273,7 +282,7 @@ namespace Kivii.Finances
...
@@ -273,7 +282,7 @@ namespace Kivii.Finances
}
}
//var amountInvoiced = conn.Scalar<Payment, decimal>(o => Sql.Sum(o.AmountInvoice), p => p.ParentKvid == payment.Kvid && p.OffsetKvid == Guid.Empty);
//var amountInvoiced = conn.Scalar<Payment, decimal>(o => Sql.Sum(o.AmountInvoice), p => p.ParentKvid == payment.Kvid && p.OffsetKvid == Guid.Empty);
var
amountSplit
=
conn
.
Scalar
<
Payment
,
decimal
>(
o
=>
Sql
.
Sum
(
o
.
Amount
),
p
=>
p
.
ParentKvid
==
payment
.
Kvid
&&
p
.
OffsetKvid
==
Guid
.
Empty
);
var
amountSplit
=
conn
.
Scalar
<
Payment
,
decimal
>(
o
=>
Sql
.
Sum
(
o
.
Amount
),
p
=>
p
.
ParentKvid
==
payment
.
Kvid
&&
Sql
.
In
(
p
.
Type
,
PaymentType
.
Assign
,
PaymentType
.
Split
)
&&
p
.
OffsetKvid
==
Guid
.
Empty
);
Payment
parentPayment
=
null
;
Payment
parentPayment
=
null
;
if
(
payment
.
ParentKvid
!=
Guid
.
Empty
)
parentPayment
=
conn
.
SingleById
<
Payment
>(
payment
.
ParentKvid
);
if
(
payment
.
ParentKvid
!=
Guid
.
Empty
)
parentPayment
=
conn
.
SingleById
<
Payment
>(
payment
.
ParentKvid
);
IDbTransaction
trans
=
null
;
//事务,如果外部来了Connection,不生成事务
IDbTransaction
trans
=
null
;
//事务,如果外部来了Connection,不生成事务
...
@@ -337,6 +346,92 @@ namespace Kivii.Finances
...
@@ -337,6 +346,92 @@ namespace Kivii.Finances
/// <summary>
/// <summary>
/// complate!
/// complate!
/// 到账划转,并且更新原payment.AmountSplit字段
/// </summary>
/// <param name="payment"></param>
/// <param name="amountAssign"></param>
/// <param name="ownerKvid"></param>
/// <param name="ownerName"></param>
/// <returns></returns>
public
static
Payment
BizAssign
(
this
Payment
payment
,
decimal
amountAssign
,
string
remark
=
null
,
Guid
?
ownerKvid
=
null
,
string
ownerName
=
null
,
IDbConnection
conn
=
null
)
{
payment
.
ThrowIfNull
(
$"传入payment参数为空"
);
if
(
payment
.
Type
!=
PaymentType
.
Split
)
throw
new
Exception
(
"请选择正确类型!"
);
if
(
payment
.
OffsetKvid
!=
Guid
.
Empty
)
throw
new
Exception
(
"已冲销收款不可划转!"
);
(
amountAssign
<=
0
).
ThrowIfTrue
(
"金额不能为小于0。"
);
if
(
payment
.
AmountSplited
==
payment
.
Amount
)
throw
new
Exception
(
"无剩余收款可划转!"
);
if
(
payment
.
AmountSplited
+
amountAssign
>
payment
.
Amount
)
throw
new
Exception
(
"划转金额超出范围!"
);
if
(
payment
.
OwnerKvid
==
ownerKvid
)
throw
new
Exception
(
"不可划转至同部门!"
);
decimal
amountInvoice
=
0
;
decimal
amountUsed
=
0
;
if
(
payment
.
AmountInvoice
>
0
||
payment
.
AmountUsed
>
0
)
//如果要拆分的到账已经开过票 就要计算拆分项的开票金额
{
if
(
conn
==
null
)
conn
=
KiviiContext
.
GetOpenedDbConnection
<
Payment
>();
//查看已经拆分的项目分得的已经开票金额
var
existSplits
=
conn
.
Select
<
Payment
>(
o
=>
o
.
RootKvid
==
payment
.
RootKvid
&&
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
Type
,
PaymentType
.
Assign
));
if
(
payment
.
AmountInvoice
<
payment
.
Amount
)
//到账的部分进行了开票 就需要计算拆分项的开票金额
{
if
(!
existSplits
.
IsNullOrEmpty
())
{
//剩余的开票金额
var
remainAmountInvoice
=
payment
.
AmountInvoice
-
existSplits
.
Sum
(
o
=>
o
.
AmountInvoice
);
if
(
remainAmountInvoice
>
0
)
amountInvoice
=
remainAmountInvoice
>
amountAssign
?
amountAssign
:
remainAmountInvoice
;
}
else
{
amountInvoice
=
payment
.
AmountInvoice
>
amountAssign
?
amountAssign
:
payment
.
AmountInvoice
;
}
}
else
amountInvoice
=
amountAssign
;
//否则直接记录拆分项完全开票
if
(
payment
.
AmountUsed
<
payment
.
Amount
)
{
if
(!
existSplits
.
IsNullOrEmpty
())
{
//剩余的开票金额
var
remainAmountUsed
=
payment
.
AmountUsed
-
existSplits
.
Sum
(
o
=>
o
.
AmountUsed
);
if
(
remainAmountUsed
>
0
)
amountUsed
=
remainAmountUsed
>
amountAssign
?
amountAssign
:
remainAmountUsed
;
}
else
{
amountUsed
=
payment
.
AmountUsed
>
amountAssign
?
amountAssign
:
payment
.
AmountUsed
;
}
}
else
amountUsed
=
amountAssign
;
}
#
region
新增拆分项目
var
splitPayment
=
new
Payment
();
splitPayment
.
PopulateWith
(
payment
);
//先从父级中拷贝所有参数
//赋值
splitPayment
.
Kvid
=
Guid
.
NewGuid
();
splitPayment
.
ParentKvid
=
payment
.
Kvid
;
splitPayment
.
RootKvid
=
payment
.
RootKvid
;
splitPayment
.
OffsetKvid
=
Guid
.
Empty
;
splitPayment
.
OwnerKvid
=
ownerKvid
==
null
?
Guid
.
Empty
:
ownerKvid
.
Value
;
splitPayment
.
OwnerName
=
ownerName
;
//业务设置
splitPayment
.
BizId
=
string
.
Empty
;
splitPayment
.
BizKvid
=
Guid
.
Empty
;
splitPayment
.
BizType
=
string
.
Empty
;
splitPayment
.
SerialNumber
=
payment
.
GetSubSerialNumber
();
splitPayment
.
Type
=
PaymentType
.
Assign
;
//金额设置
splitPayment
.
Amount
=
amountAssign
;
splitPayment
.
AmountSplited
=
0
;
splitPayment
.
AmountUsed
=
amountUsed
;
splitPayment
.
AmountInvoice
=
amountInvoice
;
// payment.AmountInvoice > amountSplit ? amountSplit : payment.AmountInvoice;
//splitPayment.Summary = string.Empty;
if
(!
remark
.
IsNullOrEmpty
())
splitPayment
.
Remark
+=
$"[划转备注:
{
remark
}
]"
;
splitPayment
.
OperateTime
=
payment
.
OperateTime
;
splitPayment
.
OperatorName
=
KiviiContext
.
CurrentMember
.
FullName
;
splitPayment
.
OperatorKvid
=
KiviiContext
.
CurrentMember
.
Kvid
;
//splitPayment.Status = 1;
#
endregion
return
splitPayment
;
}
/// <summary>
/// complate!
/// 到账拆分,并且更新原payment.AmountSplit字段
/// 到账拆分,并且更新原payment.AmountSplit字段
/// </summary>
/// </summary>
/// <param name="payment"></param>
/// <param name="payment"></param>
...
@@ -488,11 +583,14 @@ namespace Kivii.Finances
...
@@ -488,11 +583,14 @@ namespace Kivii.Finances
{
{
payment
.
ThrowIfNull
(
"要更新的付款记录不能为空!"
);
payment
.
ThrowIfNull
(
"要更新的付款记录不能为空!"
);
(
payment
.
OffsetKvid
!=
Guid
.
Empty
).
ThrowIfTrue
(
"此到账已作废 无法重新计算开票金额"
);
(
payment
.
OffsetKvid
!=
Guid
.
Empty
).
ThrowIfTrue
(
"此到账已作废 无法重新计算开票金额"
);
(
payment
.
Type
!=
PaymentType
.
Bank
).
ThrowIfTrue
(
"不支持的类型"
);
(
payment
.
Type
!=
PaymentType
.
Bank
&&
payment
.
Type
!=
PaymentType
.
Split
).
ThrowIfTrue
(
"不支持的类型"
);
bool
useTransaction
=
conn
==
null
;
//是否启用事务,如果外部未传入conn,启用内部事务
bool
useTransaction
=
conn
==
null
;
//是否启用事务,如果外部未传入conn,启用内部事务
if
(
conn
==
null
)
conn
=
KiviiContext
.
GetOpenedDbConnection
<
Payment
>();
if
(
conn
==
null
)
conn
=
KiviiContext
.
GetOpenedDbConnection
<
Payment
>();
var
amountInvoiced
=
conn
.
Scalar
<
Payment
,
decimal
>(
o
=>
Sql
.
Sum
(
o
.
AmountInvoice
),
p
=>
p
.
Type
==
PaymentType
.
Split
&&
p
.
ParentKvid
==
payment
.
Kvid
&&
p
.
OffsetKvid
==
Guid
.
Empty
);
var
amountInvoiced
=
conn
.
Scalar
<
Payment
,
decimal
>(
o
=>
Sql
.
Sum
(
o
.
AmountInvoice
),
p
=>
Sql
.
In
(
p
.
Type
,
PaymentType
.
Assign
,
PaymentType
.
Split
)
&&
p
.
ParentKvid
==
payment
.
Kvid
&&
p
.
OffsetKvid
==
Guid
.
Empty
);
Payment
parentPayment
=
null
;
if
(
payment
.
ParentKvid
!=
Guid
.
Empty
)
parentPayment
=
conn
.
SingleById
<
Payment
>(
payment
.
ParentKvid
);
IDbTransaction
trans
=
null
;
//事务,如果外部来了Connection,不生成事务
IDbTransaction
trans
=
null
;
//事务,如果外部来了Connection,不生成事务
if
(
useTransaction
)
trans
=
conn
.
OpenTransaction
();
if
(
useTransaction
)
trans
=
conn
.
OpenTransaction
();
try
try
...
@@ -500,6 +598,7 @@ namespace Kivii.Finances
...
@@ -500,6 +598,7 @@ namespace Kivii.Finances
payment
.
AmountInvoice
=
amountInvoiced
;
payment
.
AmountInvoice
=
amountInvoiced
;
payment
.
AddOnlyProperties
(
o
=>
o
.
AmountInvoice
);
payment
.
AddOnlyProperties
(
o
=>
o
.
AmountInvoice
);
conn
.
UpdateOnly
(
payment
);
conn
.
UpdateOnly
(
payment
);
if
(
parentPayment
!=
null
)
parentPayment
.
RecalculateAmountSplit
(
conn
);
trans
?.
Commit
();
trans
?.
Commit
();
return
payment
;
return
payment
;
}
}
...
@@ -509,5 +608,115 @@ namespace Kivii.Finances
...
@@ -509,5 +608,115 @@ namespace Kivii.Finances
throw
ex
;
throw
ex
;
}
}
}
}
/// <summary>
/// 重新计算Assign类型的AmountInvoice或AmountUsed
/// 如果是上级到账进行开票,收款登记或充值的话,存在子集Assign则需要向下更新对应的AmountInvoice和AmountUsed
/// </summary>
/// <param name="payment"></param>
/// <param name="conn"></param>
/// <returns></returns>
public
static
List
<
Payment
>
RecalculateAssignAmount
(
this
Payment
payment
,
IDbConnection
conn
=
null
)
{
payment
.
ThrowIfNull
(
"要更新的付款记录不能为空!"
);
(
payment
.
OffsetKvid
!=
Guid
.
Empty
).
ThrowIfTrue
(
"此到账已作废 无法重新计算开票金额"
);
(
payment
.
Type
!=
PaymentType
.
Split
).
ThrowIfTrue
(
"不支持的类型"
);
bool
useTransaction
=
conn
==
null
;
//是否启用事务,如果外部未传入conn,启用内部事务
if
(
conn
==
null
)
conn
=
KiviiContext
.
GetOpenedDbConnection
<
Payment
>();
//查看已经拆分的项目分得的已经开票金额
var
existSplits
=
conn
.
Select
<
Payment
>(
o
=>
o
.
RootKvid
==
payment
.
RootKvid
&&
o
.
OffsetKvid
==
Guid
.
Empty
&&
o
.
Type
==
PaymentType
.
Assign
);
if
(
existSplits
.
IsNullOrEmpty
())
return
null
;
if
(
payment
.
AmountInvoice
<=
0
)
{
foreach
(
var
item
in
existSplits
)
{
if
(
item
.
AmountInvoice
==
0
)
continue
;
item
.
AmountInvoice
=
0
;
item
.
AddOnlyProperties
(
o
=>
o
.
AmountInvoice
);
}
}
else
//如果要拆分的到账已经开过票 就要计算拆分项的开票金额
{
if
(
payment
.
AmountInvoice
<
payment
.
Amount
)
//到账的部分进行了开票 就需要计算拆分项的开票金额
{
var
amountInvoice
=
payment
.
AmountInvoice
;
foreach
(
var
item
in
existSplits
)
{
var
currentAmount
=
amountInvoice
>
item
.
Amount
?
item
.
Amount
:
amountInvoice
;
item
.
AmountInvoice
=
currentAmount
;
item
.
AddOnlyProperties
(
o
=>
o
.
AmountInvoice
);
amountInvoice
-=
currentAmount
;
}
}
else
{
foreach
(
var
item
in
existSplits
)
{
if
(
item
.
AmountInvoice
==
item
.
Amount
)
continue
;
item
.
AmountInvoice
=
item
.
Amount
;
item
.
AddOnlyProperties
(
o
=>
o
.
AmountInvoice
);
}
}
}
if
(
payment
.
AmountUsed
<=
0
)
{
foreach
(
var
item
in
existSplits
)
{
if
(
item
.
AmountUsed
==
0
)
continue
;
item
.
AmountUsed
=
0
;
item
.
AddOnlyProperties
(
o
=>
o
.
AmountUsed
);
}
}
else
//如果要拆分的到账已经开过票 就要计算拆分项的开票金额
{
if
(
payment
.
AmountUsed
<
payment
.
Amount
)
//到账的部分进行了开票 就需要计算拆分项的开票金额
{
var
amountUsed
=
payment
.
AmountUsed
;
foreach
(
var
item
in
existSplits
)
{
var
currentAmount
=
amountUsed
>
item
.
Amount
?
item
.
Amount
:
amountUsed
;
item
.
AmountUsed
=
currentAmount
;
item
.
AddOnlyProperties
(
o
=>
o
.
AmountUsed
);
amountUsed
-=
currentAmount
;
}
}
else
{
foreach
(
var
item
in
existSplits
)
{
if
(
item
.
AmountUsed
==
item
.
Amount
)
continue
;
item
.
AmountUsed
=
item
.
Amount
;
item
.
AddOnlyProperties
(
o
=>
o
.
AmountUsed
);
}
}
}
var
rtns
=
new
List
<
Payment
>();
IDbTransaction
trans
=
null
;
//事务,如果外部来了Connection,不生成事务
if
(
useTransaction
)
trans
=
conn
.
OpenTransaction
();
try
{
foreach
(
var
item
in
existSplits
)
{
if
(
item
.
OnlyProperties
.
IsNullOrEmpty
())
continue
;
conn
.
UpdateOnly
(
item
);
rtns
.
Add
(
item
);
}
trans
?.
Commit
();
return
rtns
;
}
catch
(
Exception
ex
)
{
trans
?.
Rollback
();
throw
ex
;
}
}
}
}
}
}
Src/Transforms/RestfulInvoice.cs
View file @
fed5068e
...
@@ -278,7 +278,7 @@ namespace Kivii.Finances.Transforms
...
@@ -278,7 +278,7 @@ namespace Kivii.Finances.Transforms
var
existPayments
=
conn
.
SelectByIds
<
Payment
>(
Payments
.
ConvertAll
(
o
=>
o
.
Kvid
));
var
existPayments
=
conn
.
SelectByIds
<
Payment
>(
Payments
.
ConvertAll
(
o
=>
o
.
Kvid
));
existPayments
.
ThrowIfNullOrEmpty
(
"未找到指定的到账信息!"
);
existPayments
.
ThrowIfNullOrEmpty
(
"未找到指定的到账信息!"
);
(
existPayments
.
Count
!=
Payments
.
Count
).
ThrowIfTrue
(
"指定的到账信息与查询到的到账信息不匹配!"
);
(
existPayments
.
Count
!=
Payments
.
Count
).
ThrowIfTrue
(
"指定的到账信息与查询到的到账信息不匹配!"
);
existPayments
.
Exists
(
o
=>
o
.
Type
!=
PaymentType
.
Bank
&&
o
.
Type
!=
PaymentType
.
AliPay
&&
o
.
Type
!=
PaymentType
.
Cash
&&
o
.
Type
!=
PaymentType
.
Pos
&&
o
.
Type
!=
PaymentType
.
Split
&&
o
.
Type
!=
PaymentType
.
WeChat
).
ThrowIfTrue
(
"存在不正确的到账类型"
);
existPayments
.
Exists
(
o
=>
o
.
Type
!=
PaymentType
.
Bank
&&
o
.
Type
!=
PaymentType
.
AliPay
&&
o
.
Type
!=
PaymentType
.
Cash
&&
o
.
Type
!=
PaymentType
.
Pos
&&
o
.
Type
!=
PaymentType
.
Split
&&
o
.
Type
!=
PaymentType
.
Assign
&&
o
.
Type
!=
PaymentType
.
WeChat
).
ThrowIfTrue
(
"存在不正确的到账类型"
);
foreach
(
var
item
in
existPayments
)
foreach
(
var
item
in
existPayments
)
{
{
var
payment
=
Payments
.
FirstOrDefault
(
o
=>
o
.
Kvid
==
item
.
Kvid
);
var
payment
=
Payments
.
FirstOrDefault
(
o
=>
o
.
Kvid
==
item
.
Kvid
);
...
@@ -376,8 +376,8 @@ namespace Kivii.Finances.Transforms
...
@@ -376,8 +376,8 @@ namespace Kivii.Finances.Transforms
{
{
var
correlatedInvoices
=
insertInvoices
.
Correlating
(
preCorrelatingPayments
);
var
correlatedInvoices
=
insertInvoices
.
Correlating
(
preCorrelatingPayments
);
insertInvoices
.
AddRange
(
correlatedInvoices
);
insertInvoices
.
AddRange
(
correlatedInvoices
);
var
current
RootKvids
=
preCorrelatingPayments
.
Where
(
o
=>
o
.
Type
==
PaymentType
.
Split
).
ToList
().
ConvertAll
(
p
=>
p
.
Roo
tKvid
);
var
current
ParentKvids
=
preCorrelatingPayments
.
Where
(
o
=>
o
.
Type
==
PaymentType
.
Split
||
o
.
Type
==
PaymentType
.
Assign
).
ToList
().
ConvertAll
(
p
=>
p
.
Paren
tKvid
);
if
(!
current
RootKvids
.
IsNullOrEmpty
())
parentPayments
=
conn
.
Select
<
Payment
>(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
Kvid
,
currentRoo
tKvids
));
if
(!
current
ParentKvids
.
IsNullOrEmpty
())
parentPayments
=
conn
.
Select
<
Payment
>(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
Kvid
,
currentParen
tKvids
));
}
}
var
rtns
=
new
RestfulUpdateResponse
<
Invoice
>();
var
rtns
=
new
RestfulUpdateResponse
<
Invoice
>();
rtns
.
Results
=
new
List
<
Invoice
>();
rtns
.
Results
=
new
List
<
Invoice
>();
...
...
Src/Transforms/RestfulInvoiceApply.Apply.cs
View file @
fed5068e
...
@@ -97,11 +97,34 @@ namespace Kivii.Finances.Transforms
...
@@ -97,11 +97,34 @@ namespace Kivii.Finances.Transforms
var
paymentKvidsDistinct
=
PaymentKvids
.
Distinct
().
ToList
();
var
paymentKvidsDistinct
=
PaymentKvids
.
Distinct
().
ToList
();
var
payments
=
conn
.
Select
<
Payment
>(
o
=>
Sql
.
In
(
o
.
Kvid
,
paymentKvidsDistinct
));
var
payments
=
conn
.
Select
<
Payment
>(
o
=>
Sql
.
In
(
o
.
Kvid
,
paymentKvidsDistinct
));
(
payments
.
Count
<=
0
||
payments
.
Count
!=
paymentKvidsDistinct
.
Count
).
ThrowIfTrue
(
"收款信息与所选项目不一致!"
);
(
payments
.
Count
<=
0
||
payments
.
Count
!=
paymentKvidsDistinct
.
Count
).
ThrowIfTrue
(
"收款信息与所选项目不一致!"
);
(
payments
.
Exists
(
o
=>
o
.
Type
!=
PaymentType
.
Bank
&&
o
.
Type
!=
PaymentType
.
Split
&&
o
.
Type
!=
PaymentType
.
AliPay
&&
o
.
Type
!=
PaymentType
.
Pos
&&
o
.
Type
!=
PaymentType
.
WeChat
&&
o
.
Type
!=
PaymentType
.
Cash
)).
ThrowIfTrue
(
"请选择正确的收款信息进行申请!"
);
(
payments
.
Exists
(
o
=>
o
.
Type
!=
PaymentType
.
Bank
&&
o
.
Type
!=
PaymentType
.
Assign
&&
o
.
Type
!=
PaymentType
.
Split
&&
o
.
Type
!=
PaymentType
.
AliPay
&&
o
.
Type
!=
PaymentType
.
Pos
&&
o
.
Type
!=
PaymentType
.
WeChat
&&
o
.
Type
!=
PaymentType
.
Cash
)).
ThrowIfTrue
(
"请选择正确的收款信息进行申请!"
);
(
payments
.
Exists
(
o
=>
o
.
Amount
<=
o
.
AmountInvoice
)).
ThrowIfTrue
(
"存在已开票的到账!无法重复申请!"
);
(
payments
.
Exists
(
o
=>
o
.
Amount
<=
o
.
AmountInvoice
)).
ThrowIfTrue
(
"存在已开票的到账!无法重复申请!"
);
if
(
Item
.
Amount
!=
payments
.
Sum
(
o
=>
o
.
Amount
-
o
.
AmountInvoice
))
throw
new
Exception
(
"申请金额与所选到账金额不一致!"
);
if
(
Item
.
Amount
!=
payments
.
Sum
(
o
=>
o
.
Amount
-
o
.
AmountInvoice
))
throw
new
Exception
(
"申请金额与所选到账金额不一致!"
);
foreach
(
var
item
in
payments
)
(
conn
.
Exists
<
InvoiceApply
>(
o
=>
o
.
OperateType
==
InvoiceApplyType
.
Related
&&
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
BizKvid
,
payments
.
ConvertAll
(
p
=>
p
.
Kvid
)))).
ThrowIfTrue
(
"已有申请开票中的到账!"
);
{
if
(
item
.
Type
==
PaymentType
.
Split
)
{
if
(
payments
.
Exists
(
o
=>
o
.
ParentKvid
==
item
.
Kvid
&&
o
.
Type
==
PaymentType
.
Assign
))
throw
new
Exception
(
"存在同一笔流水重复选择!"
);
}
if
(
item
.
Type
==
PaymentType
.
Assign
)
{
if
(
payments
.
Exists
(
o
=>
o
.
Kvid
==
item
.
ParentKvid
&&
o
.
Type
==
PaymentType
.
Split
))
throw
new
Exception
(
"存在同一笔流水重复选择!"
);
}
}
var
paymentKvids
=
payments
.
ConvertAll
(
o
=>
o
.
Kvid
);
var
splitPayments
=
payments
.
Where
(
o
=>
o
.
Type
==
PaymentType
.
Split
).
ToList
();
if
(!
splitPayments
.
IsNullOrEmpty
())
//如果是Split申请开票则要查查看子集Assgin是否也有正在申请中的,不然申请时可能重复申请开票
{
var
existAssignPayments
=
conn
.
Select
<
Payment
>(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
o
.
Type
==
PaymentType
.
Assign
&&
Sql
.
In
(
o
.
ParentKvid
,
splitPayments
.
ConvertAll
(
p
=>
p
.
Kvid
)));
if
(!
existAssignPayments
.
IsNullOrEmpty
())
paymentKvids
.
AddRange
(
existAssignPayments
.
ConvertAll
(
p
=>
p
.
Kvid
));
}
var
assginPayments
=
payments
.
Where
(
o
=>
o
.
Type
==
PaymentType
.
Assign
).
ToList
();
if
(!
assginPayments
.
IsNullOrEmpty
())
//如果是Split申请开票则要查查看子集Assgin是否也有正在申请中的,不然申请时可能重复申请开票
{
var
existSplitPayments
=
conn
.
Select
<
Payment
>(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
o
.
Type
==
PaymentType
.
Split
&&
Sql
.
In
(
o
.
Kvid
,
assginPayments
.
ConvertAll
(
p
=>
p
.
ParentKvid
)));
if
(!
existSplitPayments
.
IsNullOrEmpty
())
paymentKvids
.
AddRange
(
existSplitPayments
.
ConvertAll
(
p
=>
p
.
Kvid
));
}
(
conn
.
Exists
<
InvoiceApply
>(
o
=>
o
.
OperateType
==
InvoiceApplyType
.
Related
&&
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
BizKvid
,
paymentKvids
))).
ThrowIfTrue
(
"已有申请开票中的到账!"
);
//(conn.Exists<Invoice>(o => o.OffsetKvid == Guid.Empty && Sql.In(o.BizKvid, payments.ConvertAll(p => p.RootKvid)))).ThrowIfTrue("已有开票的到账!");
//(conn.Exists<Invoice>(o => o.OffsetKvid == Guid.Empty && Sql.In(o.BizKvid, payments.ConvertAll(p => p.RootKvid)))).ThrowIfTrue("已有开票的到账!");
var
trans
=
conn
.
OpenTransaction
();
var
trans
=
conn
.
OpenTransaction
();
...
...
Src/Transforms/RestfulPay.cs
View file @
fed5068e
...
@@ -72,7 +72,7 @@ namespace Kivii.Finances.Transforms
...
@@ -72,7 +72,7 @@ namespace Kivii.Finances.Transforms
var
payment
=
conn
.
SingleById
<
Payment
>(
payingMethod
.
Kvid
);
var
payment
=
conn
.
SingleById
<
Payment
>(
payingMethod
.
Kvid
);
payment
.
ThrowIfNull
(
"所选付款数据不存在!"
);
payment
.
ThrowIfNull
(
"所选付款数据不存在!"
);
(
payment
.
Currency
!=
currency
).
ThrowIfTrue
(
"存在不相符的货币单位!"
);
(
payment
.
Currency
!=
currency
).
ThrowIfTrue
(
"存在不相符的货币单位!"
);
if
(
payment
.
Type
!=
PaymentType
.
Split
&&
payment
.
Type
!=
PaymentType
.
Pos
&&
payment
.
Type
!=
PaymentType
.
Cash
&&
payment
.
Type
!=
PaymentType
.
AliPay
&&
payment
.
Type
!=
PaymentType
.
WeChat
)
throw
new
Exception
(
"请选择正确的付款方式!"
);
if
(
payment
.
Type
!=
PaymentType
.
Split
&&
payment
.
Type
!=
PaymentType
.
Assign
&&
payment
.
Type
!=
PaymentType
.
Pos
&&
payment
.
Type
!=
PaymentType
.
Cash
&&
payment
.
Type
!=
PaymentType
.
AliPay
&&
payment
.
Type
!=
PaymentType
.
WeChat
)
throw
new
Exception
(
"请选择正确的付款方式!"
);
var
amount
=
amountSettlement
-
amountPayed
;
var
amount
=
amountSettlement
-
amountPayed
;
if
(
payment
.
Amount
-
payment
.
AmountUsed
<
amount
)
amount
=
payment
.
Amount
-
payment
.
AmountUsed
;
if
(
payment
.
Amount
-
payment
.
AmountUsed
<
amount
)
amount
=
payment
.
Amount
-
payment
.
AmountUsed
;
(
payingMethod
.
Amount
>
0
&&
payingMethod
.
Amount
>
payment
.
Amount
-
payment
.
AmountUsed
).
ThrowIfTrue
(
$"所选付款方式余额不足,可用余额:
{
payment
.
Amount
-
payment
.
AmountUsed
}
"
);
(
payingMethod
.
Amount
>
0
&&
payingMethod
.
Amount
>
payment
.
Amount
-
payment
.
AmountUsed
).
ThrowIfTrue
(
$"所选付款方式余额不足,可用余额:
{
payment
.
Amount
-
payment
.
AmountUsed
}
"
);
...
@@ -95,6 +95,7 @@ namespace Kivii.Finances.Transforms
...
@@ -95,6 +95,7 @@ namespace Kivii.Finances.Transforms
accountDetail
.
Insert
(
conn
);
accountDetail
.
Insert
(
conn
);
payment
.
RecalculateAmountUsed
(
conn
);
//重新统计到账的使用情况
payment
.
RecalculateAmountUsed
(
conn
);
//重新统计到账的使用情况
if
(
payment
.
Type
==
PaymentType
.
Split
)
payment
.
RecalculateAssignAmount
(
conn
);
#
region
同步更新泛型
Settlement
表中数据
#
region
同步更新泛型
Settlement
表中数据
foreach
(
var
item
in
settlements
)
foreach
(
var
item
in
settlements
)
{
{
...
@@ -262,10 +263,20 @@ namespace Kivii.Finances.Transforms
...
@@ -262,10 +263,20 @@ namespace Kivii.Finances.Transforms
payments
=
conn
.
SelectByIds
<
Payment
>(
paymentKvids
);
payments
=
conn
.
SelectByIds
<
Payment
>(
paymentKvids
);
payments
.
ThrowIfNullOrEmpty
(
"未找到所选付款数据!"
);
payments
.
ThrowIfNullOrEmpty
(
"未找到所选付款数据!"
);
payments
.
Exists
(
o
=>
o
.
Currency
!=
currency
).
ThrowIfTrue
(
"存在不相符的货币单位!"
);
payments
.
Exists
(
o
=>
o
.
Currency
!=
currency
).
ThrowIfTrue
(
"存在不相符的货币单位!"
);
if
(
payments
.
Exists
(
o
=>
o
.
Type
!=
PaymentType
.
Split
&&
o
.
Type
!=
PaymentType
.
Pos
&&
o
.
Type
!=
PaymentType
.
Cash
&&
o
.
Type
!=
PaymentType
.
AliPay
&&
o
.
Type
!=
PaymentType
.
WeChat
))
throw
new
Exception
(
"请选择正确的付款方式!"
);
if
(
payments
.
Exists
(
o
=>
o
.
Type
!=
PaymentType
.
Split
&&
o
.
Type
!=
PaymentType
.
Assign
&&
o
.
Type
!=
PaymentType
.
Pos
&&
o
.
Type
!=
PaymentType
.
Cash
&&
o
.
Type
!=
PaymentType
.
AliPay
&&
o
.
Type
!=
PaymentType
.
WeChat
))
throw
new
Exception
(
"请选择正确的付款方式!"
);
if
(
payments
.
Exists
(
o
=>
(
o
.
Amount
-
o
.
AmountUsed
)
<=
0
))
throw
new
Exception
(
$"所选付款方式余额不足!"
);
if
(
payments
.
Exists
(
o
=>
(
o
.
Amount
-
o
.
AmountUsed
)
<=
0
))
throw
new
Exception
(
$"所选付款方式余额不足!"
);
//if (payments.Exists(o => (o.AmountInvoice != o.Amount))) throw new Exception($"所选付款尚未开票!");
//if (payments.Exists(o => (o.AmountInvoice != o.Amount))) throw new Exception($"所选付款尚未开票!");
foreach
(
var
item
in
payments
)
{
if
(
item
.
Type
==
PaymentType
.
Split
)
{
if
(
payments
.
Exists
(
o
=>
o
.
ParentKvid
==
item
.
Kvid
&&
o
.
Type
==
PaymentType
.
Assign
))
throw
new
Exception
(
"存在同一笔流水重复选择!"
);
}
if
(
item
.
Type
==
PaymentType
.
Assign
)
{
if
(
payments
.
Exists
(
o
=>
o
.
Kvid
==
item
.
ParentKvid
&&
o
.
Type
==
PaymentType
.
Split
))
throw
new
Exception
(
"存在同一笔流水重复选择!"
);
}
}
}
}
List
<
Account
>
accounts
=
null
;
List
<
Account
>
accounts
=
null
;
if
(!
accountKvids
.
IsNullOrEmpty
())
if
(!
accountKvids
.
IsNullOrEmpty
())
...
@@ -351,6 +362,7 @@ namespace Kivii.Finances.Transforms
...
@@ -351,6 +362,7 @@ namespace Kivii.Finances.Transforms
foreach
(
var
item
in
payments
)
foreach
(
var
item
in
payments
)
{
{
item
.
RecalculateAmountUsed
(
conn
);
item
.
RecalculateAmountUsed
(
conn
);
if
(
item
.
Type
==
PaymentType
.
Split
)
item
.
RecalculateAssignAmount
(
conn
);
}
}
#
region
同步更新泛型
Settlement
表中数据
#
region
同步更新泛型
Settlement
表中数据
foreach
(
var
item
in
settlements
)
foreach
(
var
item
in
settlements
)
...
...
Src/Transforms/RestfulPayment.Account.cs
View file @
fed5068e
...
@@ -39,7 +39,7 @@ namespace Kivii.Finances.Transforms
...
@@ -39,7 +39,7 @@ namespace Kivii.Finances.Transforms
var
payment
=
conn
.
SingleById
<
Payment
>(
PaymentKvid
);
var
payment
=
conn
.
SingleById
<
Payment
>(
PaymentKvid
);
if
(
payment
==
null
)
throw
new
Exception
(
"不存在的收款信息!"
);
if
(
payment
==
null
)
throw
new
Exception
(
"不存在的收款信息!"
);
if
(
payment
.
OffsetKvid
!=
Guid
.
Empty
)
throw
new
Exception
(
"此收款已冲账!"
);
if
(
payment
.
OffsetKvid
!=
Guid
.
Empty
)
throw
new
Exception
(
"此收款已冲账!"
);
if
(
payment
.
Type
!=
PaymentType
.
UnBiz
&&
payment
.
Type
!=
PaymentType
.
Refund
&&
payment
.
Type
!=
PaymentType
.
Split
&&
payment
.
Type
!=
PaymentType
.
Cash
&&
payment
.
Type
!=
PaymentType
.
AliPay
&&
payment
.
Type
!=
PaymentType
.
WeChat
&&
payment
.
Type
!=
PaymentType
.
Pos
)
throw
new
Exception
(
"不支持收款充值操作类型!"
);
if
(
payment
.
Type
!=
PaymentType
.
UnBiz
&&
payment
.
Type
!=
PaymentType
.
Refund
&&
payment
.
Type
!=
PaymentType
.
Split
&&
payment
.
Type
!=
PaymentType
.
Assign
&&
payment
.
Type
!=
PaymentType
.
Cash
&&
payment
.
Type
!=
PaymentType
.
AliPay
&&
payment
.
Type
!=
PaymentType
.
WeChat
&&
payment
.
Type
!=
PaymentType
.
Pos
)
throw
new
Exception
(
"不支持收款充值操作类型!"
);
if
(
payment
.
Amount
-
payment
.
AmountUsed
<
Amount
)
throw
new
Exception
(
$"此到账可使用金额不足,仅剩:
{
payment
.
Amount
-
payment
.
AmountUsed
}
元"
);
if
(
payment
.
Amount
-
payment
.
AmountUsed
<
Amount
)
throw
new
Exception
(
$"此到账可使用金额不足,仅剩:
{
payment
.
Amount
-
payment
.
AmountUsed
}
元"
);
var
accountPayee
=
conn
.
SingleById
<
Account
>(
AccountKvid
);
var
accountPayee
=
conn
.
SingleById
<
Account
>(
AccountKvid
);
...
@@ -90,6 +90,7 @@ namespace Kivii.Finances.Transforms
...
@@ -90,6 +90,7 @@ namespace Kivii.Finances.Transforms
rtns
.
Results
.
Add
(
transfer
);
rtns
.
Results
.
Add
(
transfer
);
accountDetails
.
ForEach
(
o
=>
o
.
Insert
(
conn
));
accountDetails
.
ForEach
(
o
=>
o
.
Insert
(
conn
));
payment
.
RecalculateAmountUsed
(
conn
);
//重新计算AmountUsed!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
payment
.
RecalculateAmountUsed
(
conn
);
//重新计算AmountUsed!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if
(
payment
.
Type
==
PaymentType
.
Split
)
payment
.
RecalculateAssignAmount
(
conn
);
//if (parentPayment != null) conn.UpdateOnly(parentPayment);
//if (parentPayment != null) conn.UpdateOnly(parentPayment);
foreach
(
var
item
in
pays
)
foreach
(
var
item
in
pays
)
{
{
...
...
Src/Transforms/RestfulPayment.Split.cs
View file @
fed5068e
...
@@ -11,7 +11,7 @@ namespace Kivii.Finances.Transforms
...
@@ -11,7 +11,7 @@ namespace Kivii.Finances.Transforms
{
{
public
enum
OwnerType
public
enum
OwnerType
{
{
Unsupport
=
0
,
Unsupport
=
0
,
Department
=
1
,
Department
=
1
,
Organization
=
2
,
Organization
=
2
,
Member
=
3
Member
=
3
...
@@ -27,7 +27,7 @@ namespace Kivii.Finances.Transforms
...
@@ -27,7 +27,7 @@ namespace Kivii.Finances.Transforms
[
ApiMember
(
Description
=
"认领类型,默认为Department,Organization,Member"
)]
[
ApiMember
(
Description
=
"认领类型,默认为Department,Organization,Member"
)]
public
OwnerType
OwnerType
{
get
;
set
;
}
=
OwnerType
.
Department
;
public
OwnerType
OwnerType
{
get
;
set
;
}
=
OwnerType
.
Department
;
public
Guid
OwnerKvid
{
get
;
set
;
}
public
Guid
OwnerKvid
{
get
;
set
;
}
public
string
OwnerName
{
get
;
set
;
}
public
string
OwnerName
{
get
;
set
;
}
...
@@ -336,6 +336,7 @@ namespace Kivii.Finances.Transforms
...
@@ -336,6 +336,7 @@ namespace Kivii.Finances.Transforms
if
(
payments
.
Exists
(
o
=>
o
.
Type
!=
PaymentType
.
Split
))
throw
new
Exception
(
"非银行到账不可以认领!"
);
if
(
payments
.
Exists
(
o
=>
o
.
Type
!=
PaymentType
.
Split
))
throw
new
Exception
(
"非银行到账不可以认领!"
);
if
(
payments
.
Exists
(
o
=>
o
.
OffsetKvid
!=
Guid
.
Empty
))
throw
new
Exception
(
"已冲销收款不可撤销认领!"
);
if
(
payments
.
Exists
(
o
=>
o
.
OffsetKvid
!=
Guid
.
Empty
))
throw
new
Exception
(
"已冲销收款不可撤销认领!"
);
(
conn
.
Exists
<
InvoiceApply
>(
o
=>
o
.
OperateType
==
InvoiceApplyType
.
Related
&&
o
.
OffsetKvid
==
Guid
.
Empty
&&
o
.
AmountInvoice
!=
o
.
Amount
&&
Sql
.
In
(
o
.
BizKvid
,
payments
.
ConvertAll
(
p
=>
p
.
Kvid
)))).
ThrowIfTrue
(
"存在申请开票中的到账,暂无法撤销认领!"
);
(
conn
.
Exists
<
InvoiceApply
>(
o
=>
o
.
OperateType
==
InvoiceApplyType
.
Related
&&
o
.
OffsetKvid
==
Guid
.
Empty
&&
o
.
AmountInvoice
!=
o
.
Amount
&&
Sql
.
In
(
o
.
BizKvid
,
payments
.
ConvertAll
(
p
=>
p
.
Kvid
)))).
ThrowIfTrue
(
"存在申请开票中的到账,暂无法撤销认领!"
);
(
conn
.
Exists
<
Payment
>(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
o
.
Type
==
PaymentType
.
Assign
&&
Sql
.
In
(
o
.
ParentKvid
,
payments
.
ConvertAll
(
p
=>
p
.
Kvid
)))).
ThrowIfTrue
(
"认领金额存在已经划转,请先撤销划转以继续!"
);
var
rtns
=
new
RestfulExecutionResponse
<
Payment
>();
var
rtns
=
new
RestfulExecutionResponse
<
Payment
>();
rtns
.
Results
=
new
List
<
Payment
>();
rtns
.
Results
=
new
List
<
Payment
>();
//if (payments.Exists(o => o.AmountUsed > 0)) throw new Exception("存在到账已使用,不可撤销认领!");
//if (payments.Exists(o => o.AmountUsed > 0)) throw new Exception("存在到账已使用,不可撤销认领!");
...
@@ -373,7 +374,7 @@ namespace Kivii.Finances.Transforms
...
@@ -373,7 +374,7 @@ namespace Kivii.Finances.Transforms
{
{
var
parent
=
parents
.
FirstOrDefault
(
o
=>
o
.
Kvid
==
split
.
ParentKvid
);
var
parent
=
parents
.
FirstOrDefault
(
o
=>
o
.
Kvid
==
split
.
ParentKvid
);
if
(
parent
==
null
)
continue
;
if
(
parent
==
null
)
continue
;
var
offset
=
split
.
Offset
(
$"认领撤销:
{
Remark
}
"
);
var
offset
=
split
.
Offset
(
$"认领撤销:
{
Remark
}
"
);
offsets
.
Add
(
offset
);
offsets
.
Add
(
offset
);
splitOffsets
.
Add
(
split
);
splitOffsets
.
Add
(
split
);
...
@@ -495,7 +496,7 @@ namespace Kivii.Finances.Transforms
...
@@ -495,7 +496,7 @@ namespace Kivii.Finances.Transforms
rtns
.
Results
=
new
List
<
Payment
>();
rtns
.
Results
=
new
List
<
Payment
>();
var
updateLamda
=
conn
.
From
<
Payment
>();
var
updateLamda
=
conn
.
From
<
Payment
>();
updateLamda
=
updateLamda
.
Update
(
o
=>
new
{
o
.
OwnerKvid
,
o
.
OwnerName
});
updateLamda
=
updateLamda
.
Update
(
o
=>
new
{
o
.
OwnerKvid
,
o
.
OwnerName
});
updateLamda
=
updateLamda
.
Where
(
o
=>
Sql
.
In
(
o
.
Kvid
,
paymentKvids
));
updateLamda
=
updateLamda
.
Where
(
o
=>
Sql
.
In
(
o
.
Kvid
,
paymentKvids
));
conn
.
UpdateOnly
(
new
Payment
{
OwnerKvid
=
Guid
.
Empty
,
OwnerName
=
string
.
Empty
},
updateLamda
);
conn
.
UpdateOnly
(
new
Payment
{
OwnerKvid
=
Guid
.
Empty
,
OwnerName
=
string
.
Empty
},
updateLamda
);
foreach
(
var
item
in
payments
)
foreach
(
var
item
in
payments
)
...
@@ -507,4 +508,275 @@ namespace Kivii.Finances.Transforms
...
@@ -507,4 +508,275 @@ namespace Kivii.Finances.Transforms
return
rtns
;
return
rtns
;
}
}
}
}
[
Api
(
Description
=
"认领划转"
)]
[
RequiresAnyRole
(
SystemRoles
.
Everyone
)]
public
class
PaymentAssign
:
RestfulExecution
<
Payment
>
{
[
ApiMember
(
Description
=
"划转金额"
)]
public
decimal
Amount
{
get
;
set
;
}
[
ApiMember
(
Description
=
"所属类型,默认为Department,Organization,Member"
)]
public
OwnerType
OwnerType
{
get
;
set
;
}
=
OwnerType
.
Department
;
public
Guid
OwnerKvid
{
get
;
set
;
}
public
string
OwnerName
{
get
;
set
;
}
public
Guid
Kvid
{
get
;
set
;
}
public
string
Remark
{
get
;
set
;
}
public
override
object
OnExecution
(
IRequest
req
,
IResponse
res
)
{
if
(
Kvid
==
Guid
.
Empty
)
throw
new
Exception
(
"请选择要划转的收款!"
);
var
conn
=
KiviiContext
.
GetOpenedDbConnection
<
Payment
>();
var
payment
=
conn
.
SingleById
<
Payment
>(
Kvid
);
if
(
payment
==
null
)
throw
new
Exception
(
"收款不存在!"
);
if
(
payment
.
Type
!=
PaymentType
.
Split
)
throw
new
Exception
(
"请选择正确类型!"
);
if
(
payment
.
OffsetKvid
!=
Guid
.
Empty
)
throw
new
Exception
(
"已冲销收款不可划转!"
);
if
(
Amount
<=
0
)
throw
new
Exception
(
"金额不能为小于0!"
);
if
(
payment
.
AmountSplited
==
payment
.
Amount
)
throw
new
Exception
(
"无剩余收款可划转!"
);
if
(
payment
.
AmountSplited
+
Amount
>
payment
.
Amount
)
throw
new
Exception
(
"划转金额超出范围!"
);
var
amountAssign
=
conn
.
Scalar
<
Payment
,
decimal
>(
o
=>
Sql
.
Sum
(
o
.
Amount
),
p
=>
p
.
ParentKvid
==
payment
.
Kvid
&&
p
.
Type
==
PaymentType
.
Assign
&&
p
.
OffsetKvid
==
Guid
.
Empty
);
if
(
amountAssign
+
Amount
>
payment
.
Amount
)
throw
new
Exception
(
"划转金额超出范围!"
);
var
ownerKvid
=
Guid
.
Empty
;
var
ownerName
=
string
.
Empty
;
switch
(
OwnerType
)
{
case
OwnerType
.
Organization
:
{
ownerKvid
=
KiviiContext
.
CurrentMember
.
OrganizationKvid
;
ownerName
=
KiviiContext
.
CurrentMember
.
OrganizationName
;
break
;
}
case
OwnerType
.
Member
:
{
ownerKvid
=
KiviiContext
.
CurrentMember
.
Kvid
;
ownerName
=
KiviiContext
.
CurrentMember
.
FullName
;
break
;
}
default
:
{
ownerKvid
=
KiviiContext
.
CurrentMember
.
DepartmentKvid
;
ownerName
=
KiviiContext
.
CurrentMember
.
DepartmentName
;
break
;
}
}
if
(
OwnerKvid
!=
Guid
.
Empty
)
{
ownerKvid
=
OwnerKvid
;
ownerName
=
OwnerName
;
}
if
(
payment
.
OwnerKvid
==
ownerKvid
)
throw
new
Exception
(
"不可划转至同部门!"
);
var
assign
=
payment
.
BizAssign
(
Amount
,
Remark
,
ownerKvid
,
ownerName
,
conn
);
var
rtns
=
new
RestfulExecutionResponse
<
Payment
>();
rtns
.
Results
=
new
List
<
Payment
>();
//开启事务进行数据库操作
var
trans
=
conn
.
OpenTransaction
();
try
{
if
(
assign
!=
null
)
{
conn
.
Insert
(
assign
);
rtns
.
Results
.
Add
(
assign
);
}
payment
.
RecalculateAmountSplit
(
conn
);
trans
.
Commit
();
}
catch
(
Exception
ex
)
{
trans
.
Rollback
();
throw
ex
;
}
return
rtns
;
}
}
[
Api
(
Description
=
"认领批量划转"
)]
[
RequiresAnyRole
(
SystemRoles
.
Everyone
)]
public
class
PaymentMultiAssign
:
RestfulExecution
<
Payment
>
{
[
ApiMember
(
Description
=
"所属类型,默认为Department,Organization,Member"
)]
public
OwnerType
OwnerType
{
get
;
set
;
}
=
OwnerType
.
Department
;
public
Guid
OwnerKvid
{
get
;
set
;
}
public
string
OwnerName
{
get
;
set
;
}
public
List
<
Guid
>
Kvids
{
get
;
set
;
}
public
string
Remark
{
get
;
set
;
}
public
override
object
OnExecution
(
IRequest
req
,
IResponse
res
)
{
if
(
Kvids
.
IsNullOrEmpty
())
throw
new
Exception
(
"请选择要划转的收款!"
);
var
conn
=
KiviiContext
.
GetOpenedDbConnection
<
Payment
>();
var
payments
=
conn
.
SelectByIds
<
Payment
>(
Kvids
);
if
(
payments
==
null
)
throw
new
Exception
(
"收款不存在!"
);
if
(
payments
.
Exists
(
o
=>
o
.
Type
!=
PaymentType
.
Split
))
throw
new
Exception
(
"请选择正确类型!"
);
if
(
payments
.
Exists
(
o
=>
o
.
OffsetKvid
!=
Guid
.
Empty
))
throw
new
Exception
(
"已冲销收款不可划转!"
);
if
(
payments
.
Exists
(
o
=>
o
.
AmountSplited
>=
o
.
Amount
))
throw
new
Exception
(
"无剩余收款可划转!"
);
var
ownerKvid
=
Guid
.
Empty
;
var
ownerName
=
string
.
Empty
;
switch
(
OwnerType
)
{
case
OwnerType
.
Department
:
{
ownerKvid
=
KiviiContext
.
CurrentMember
.
DepartmentKvid
;
ownerName
=
KiviiContext
.
CurrentMember
.
DepartmentName
;
break
;
}
case
OwnerType
.
Organization
:
{
ownerKvid
=
KiviiContext
.
CurrentMember
.
OrganizationKvid
;
ownerName
=
KiviiContext
.
CurrentMember
.
OrganizationName
;
break
;
}
case
OwnerType
.
Member
:
{
ownerKvid
=
KiviiContext
.
CurrentMember
.
Kvid
;
ownerName
=
KiviiContext
.
CurrentMember
.
FullName
;
break
;
}
}
if
(
OwnerKvid
!=
Guid
.
Empty
)
{
ownerKvid
=
OwnerKvid
;
ownerName
=
OwnerName
;
}
if
(
payments
.
Exists
(
o
=>
o
.
OwnerKvid
==
ownerKvid
))
throw
new
Exception
(
"不可划转至同部门!"
);
var
spliteds
=
new
List
<
Payment
>();
var
assigns
=
new
List
<
Payment
>();
foreach
(
var
payment
in
payments
)
{
var
amount
=
payment
.
Amount
-
payment
.
AmountSplited
;
if
(
amount
<=
0
)
continue
;
var
assignPayment
=
payment
.
BizAssign
(
amount
,
Remark
,
ownerKvid
,
ownerName
,
conn
);
assigns
.
Add
(
assignPayment
);
spliteds
.
Add
(
payment
);
}
var
rtns
=
new
RestfulExecutionResponse
<
Payment
>();
rtns
.
Results
=
new
List
<
Payment
>();
#
region
启用缓存
,
将当前人创建批次数据存入
,
处理完毕或者接口报错后清除
,
确保不会重复创建
var
cache
=
KiviiContext
.
GetCacheClient
();
var
cacheKey
=
KiviiContext
.
GetUrnKey
(
$"
{
this
.
GetType
().
FullName
}
_Request_
{
KiviiContext
.
CurrentMember
.
FullName
}
_
{
KiviiContext
.
CurrentMember
.
Kvid
}
"
);
var
cacheValue
=
cache
.
Get
<
List
<
string
>>(
cacheKey
);
if
(!
cacheValue
.
IsNullOrEmpty
())
{
throw
new
Exception
(
$"当前正在处理中,剩余
{
cacheValue
.
Count
}
条,请稍后再试!"
);
}
var
caches
=
new
List
<
string
>();
caches
.
AddRange
(
assigns
.
ConvertAll
(
o
=>
o
.
SerialNumber
));
cache
.
Set
(
cacheKey
,
caches
,
TimeSpan
.
FromMinutes
(
5
));
#
endregion
//开启事务进行数据库操作
var
trans
=
conn
.
OpenTransaction
();
try
{
foreach
(
var
assign
in
assigns
)
{
conn
.
Insert
(
assign
);
rtns
.
Results
.
Add
(
assign
);
caches
.
Remove
(
assign
.
SerialNumber
);
cache
.
Replace
(
cacheKey
,
caches
);
}
foreach
(
var
item
in
spliteds
)
{
item
.
RecalculateAmountSplit
(
conn
);
}
trans
.
Commit
();
cache
.
Remove
(
cacheKey
);
}
catch
(
Exception
ex
)
{
trans
.
Rollback
();
cache
.
Remove
(
cacheKey
);
throw
ex
;
}
return
rtns
;
}
}
[
Api
(
Description
=
"划转撤销"
)]
[
RequiresAnyRole
(
SystemRoles
.
Everyone
)]
public
class
PaymentAssignCancel
:
RestfulExecution
<
Payment
>
{
public
List
<
Guid
>
Kvids
{
get
;
set
;
}
public
string
Remark
{
get
;
set
;
}
public
override
object
OnExecution
(
IRequest
req
,
IResponse
res
)
{
if
(
Kvids
.
IsNullOrEmpty
())
throw
new
Exception
(
"请选择要撤销划转的收款!"
);
var
conn
=
KiviiContext
.
GetOpenedDbConnection
<
Payment
>();
var
payments
=
conn
.
SelectByIds
<
Payment
>(
Kvids
);
if
(
payments
==
null
)
throw
new
Exception
(
"收款不存在!"
);
if
(
payments
.
Exists
(
o
=>
o
.
Type
!=
PaymentType
.
Assign
))
throw
new
Exception
(
"请选择正确类型!"
);
if
(
payments
.
Exists
(
o
=>
o
.
OffsetKvid
!=
Guid
.
Empty
))
throw
new
Exception
(
"已冲销收款不可撤销划转!"
);
(
conn
.
Exists
<
InvoiceApply
>(
o
=>
o
.
OperateType
==
InvoiceApplyType
.
Related
&&
o
.
OffsetKvid
==
Guid
.
Empty
&&
o
.
AmountInvoice
!=
o
.
Amount
&&
Sql
.
In
(
o
.
BizKvid
,
payments
.
ConvertAll
(
p
=>
p
.
Kvid
)))).
ThrowIfTrue
(
"存在申请开票中的到账,暂无法撤销认领!"
);
conn
.
Exists
<
Payment
>(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
o
.
Amount
>
0
&&
Sql
.
In
(
o
.
Type
,
PaymentType
.
Transfer
,
PaymentType
.
DynamicPay
)
&&
Sql
.
In
(
o
.
ParentKvid
,
payments
.
ConvertAll
(
p
=>
p
.
Kvid
))).
ThrowIfTrue
(
"存在已收款登记或账户充值的划转!"
);
var
rtns
=
new
RestfulExecutionResponse
<
Payment
>();
rtns
.
Results
=
new
List
<
Payment
>();
var
parentKvids
=
payments
.
ConvertAll
(
o
=>
o
.
ParentKvid
).
Distinct
().
ToList
();
var
parentSplits
=
conn
.
SelectByIds
<
Payment
>(
parentKvids
);
var
parentUpdates
=
new
List
<
Payment
>();
var
assignOffsets
=
new
List
<
Payment
>();
var
offsets
=
new
List
<
Payment
>();
foreach
(
var
assignPayment
in
payments
)
{
var
parentSplit
=
parentSplits
.
FirstOrDefault
(
o
=>
o
.
Kvid
==
assignPayment
.
ParentKvid
);
if
(
parentSplit
==
null
)
continue
;
var
offset
=
assignPayment
.
Offset
(
$"划转撤销:
{
Remark
}
"
);
offsets
.
Add
(
offset
);
assignOffsets
.
Add
(
assignPayment
);
parentUpdates
.
Add
(
parentSplit
);
}
var
trans
=
conn
.
OpenTransaction
();
try
{
foreach
(
var
item
in
assignOffsets
)
{
conn
.
UpdateOnly
(
item
);
rtns
.
Results
.
Add
(
item
);
}
foreach
(
var
item
in
offsets
)
{
conn
.
Insert
(
item
);
}
foreach
(
var
item
in
parentUpdates
)
{
item
.
RecalculateAmountSplit
(
conn
);
}
trans
.
Commit
();
}
catch
(
Exception
ex
)
{
trans
.
Rollback
();
throw
ex
;
}
return
rtns
;
}
}
}
}
Src/Transforms/RestfulPayment.cs
View file @
fed5068e
...
@@ -3,6 +3,7 @@ using Kivii.Linq;
...
@@ -3,6 +3,7 @@ using Kivii.Linq;
using
Kivii.Web
;
using
Kivii.Web
;
using
System
;
using
System
;
using
System.Collections.Generic
;
using
System.Collections.Generic
;
using
System.Globalization
;
using
System.Linq
;
using
System.Linq
;
using
System.Text
;
using
System.Text
;
using
System.Threading.Tasks
;
using
System.Threading.Tasks
;
...
@@ -55,7 +56,7 @@ namespace Kivii.Finances.Transforms
...
@@ -55,7 +56,7 @@ namespace Kivii.Finances.Transforms
var
sqlExpress
=
autoQuery
.
CreateQuery
(
Request
,
conn
,
request
,
dynamicParams
);
var
sqlExpress
=
autoQuery
.
CreateQuery
(
Request
,
conn
,
request
,
dynamicParams
);
sqlExpress
.
Where
(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
Type
,
PaymentType
.
AliPay
,
PaymentType
.
WeChat
,
PaymentType
.
Bank
,
PaymentType
.
Cash
,
PaymentType
.
Pos
));
sqlExpress
.
Where
(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
Type
,
PaymentType
.
AliPay
,
PaymentType
.
WeChat
,
PaymentType
.
Bank
,
PaymentType
.
Cash
,
PaymentType
.
Pos
));
if
(
OwnerType
==
OwnerType
.
Organization
)
sqlExpress
.
And
(
o
=>
o
.
OwnerKvid
==
KiviiContext
.
CurrentMember
.
OrganizationKvid
||
o
.
OwnerKvid
==
Guid
.
Empty
);
if
(
OwnerType
==
OwnerType
.
Organization
)
sqlExpress
.
And
(
o
=>
o
.
OwnerKvid
==
KiviiContext
.
CurrentMember
.
OrganizationKvid
||
o
.
OwnerKvid
==
Guid
.
Empty
);
if
(
OwnerType
==
OwnerType
.
Department
)
sqlExpress
.
And
(
o
=>
Sql
.
In
(
o
.
OwnerKvid
,
KiviiContext
.
CurrentMember
.
DepartmentKvids
)
||
o
.
OwnerKvid
==
Guid
.
Empty
);
if
(
OwnerType
==
OwnerType
.
Department
)
sqlExpress
.
And
(
o
=>
Sql
.
In
(
o
.
OwnerKvid
,
KiviiContext
.
CurrentMember
.
DepartmentKvids
)
||
o
.
OwnerKvid
==
Guid
.
Empty
);
if
(
OwnerType
==
OwnerType
.
Member
)
sqlExpress
.
And
(
o
=>
o
.
OwnerKvid
==
KiviiContext
.
CurrentMember
.
Kvid
||
o
.
OwnerKvid
==
Guid
.
Empty
);
if
(
OwnerType
==
OwnerType
.
Member
)
sqlExpress
.
And
(
o
=>
o
.
OwnerKvid
==
KiviiContext
.
CurrentMember
.
Kvid
||
o
.
OwnerKvid
==
Guid
.
Empty
);
if
(
IsSplit
!=
null
)
if
(
IsSplit
!=
null
)
{
{
...
@@ -112,7 +113,7 @@ namespace Kivii.Finances.Transforms
...
@@ -112,7 +113,7 @@ namespace Kivii.Finances.Transforms
var
request
=
new
RestfulQuery
<
Payment
>();
var
request
=
new
RestfulQuery
<
Payment
>();
request
=
request
.
PopulateWith
(
this
);
request
=
request
.
PopulateWith
(
this
);
var
sqlExpress
=
autoQuery
.
CreateQuery
(
Request
,
conn
,
request
,
dynamicParams
);
var
sqlExpress
=
autoQuery
.
CreateQuery
(
Request
,
conn
,
request
,
dynamicParams
);
sqlExpress
.
Where
(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
Type
,
PaymentType
.
AliPay
,
PaymentType
.
WeChat
,
PaymentType
.
Split
,
PaymentType
.
Cash
,
PaymentType
.
Pos
));
sqlExpress
.
Where
(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
Type
,
PaymentType
.
AliPay
,
PaymentType
.
WeChat
,
PaymentType
.
Split
,
PaymentType
.
Assign
,
PaymentType
.
Cash
,
PaymentType
.
Pos
));
sqlExpress
.
And
(
o
=>
o
.
AmountUsed
==
0
||
o
.
AmountUsed
<
o
.
Amount
);
sqlExpress
.
And
(
o
=>
o
.
AmountUsed
==
0
||
o
.
AmountUsed
<
o
.
Amount
);
var
queryAccount
=
conn
.
From
<
Account
>();
var
queryAccount
=
conn
.
From
<
Account
>();
queryAccount
.
Where
(
o
=>
o
.
OrganizationKvid
==
KiviiContext
.
CurrentMember
.
OrganizationKvid
&&
Sql
.
In
(
o
.
Type
,
AccountType
.
Balance
,
AccountType
.
Cash
,
AccountType
.
Pos
));
queryAccount
.
Where
(
o
=>
o
.
OrganizationKvid
==
KiviiContext
.
CurrentMember
.
OrganizationKvid
&&
Sql
.
In
(
o
.
Type
,
AccountType
.
Balance
,
AccountType
.
Cash
,
AccountType
.
Pos
));
...
@@ -158,7 +159,7 @@ namespace Kivii.Finances.Transforms
...
@@ -158,7 +159,7 @@ namespace Kivii.Finances.Transforms
var
request
=
new
RestfulQuery
<
Payment
>();
var
request
=
new
RestfulQuery
<
Payment
>();
request
=
request
.
PopulateWith
(
this
);
request
=
request
.
PopulateWith
(
this
);
var
sqlExpress
=
autoQuery
.
CreateQuery
(
Request
,
conn
,
request
,
dynamicParams
);
var
sqlExpress
=
autoQuery
.
CreateQuery
(
Request
,
conn
,
request
,
dynamicParams
);
sqlExpress
.
Where
(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
Type
,
PaymentType
.
AliPay
,
PaymentType
.
WeChat
,
PaymentType
.
Cash
,
PaymentType
.
Pos
,
PaymentType
.
Split
));
sqlExpress
.
Where
(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
Type
,
PaymentType
.
AliPay
,
PaymentType
.
WeChat
,
PaymentType
.
Cash
,
PaymentType
.
Pos
,
PaymentType
.
Assign
,
PaymentType
.
Split
));
sqlExpress
.
And
(
o
=>
o
.
AmountInvoice
<=
0
||
o
.
AmountInvoice
<
o
.
Amount
);
sqlExpress
.
And
(
o
=>
o
.
AmountInvoice
<=
0
||
o
.
AmountInvoice
<
o
.
Amount
);
var
queryInvoiceApplyRelations
=
conn
.
From
<
InvoiceApply
>();
var
queryInvoiceApplyRelations
=
conn
.
From
<
InvoiceApply
>();
...
@@ -203,7 +204,7 @@ namespace Kivii.Finances.Transforms
...
@@ -203,7 +204,7 @@ namespace Kivii.Finances.Transforms
var
request
=
new
RestfulQuery
<
Payment
>();
var
request
=
new
RestfulQuery
<
Payment
>();
request
=
request
.
PopulateWith
(
this
);
request
=
request
.
PopulateWith
(
this
);
var
sqlExpress
=
autoQuery
.
CreateQuery
(
Request
,
conn
,
request
,
dynamicParams
);
var
sqlExpress
=
autoQuery
.
CreateQuery
(
Request
,
conn
,
request
,
dynamicParams
);
sqlExpress
.
Where
(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
Type
,
PaymentType
.
AliPay
,
PaymentType
.
WeChat
,
PaymentType
.
Split
,
PaymentType
.
Cash
,
PaymentType
.
Pos
)
&&
o
.
AmountInvoice
<
o
.
Amount
);
sqlExpress
.
Where
(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
Type
,
PaymentType
.
AliPay
,
PaymentType
.
WeChat
,
PaymentType
.
Split
,
PaymentType
.
Assign
,
PaymentType
.
Cash
,
PaymentType
.
Pos
)
&&
o
.
AmountInvoice
<
o
.
Amount
);
var
queryAccount
=
conn
.
From
<
Account
>();
var
queryAccount
=
conn
.
From
<
Account
>();
queryAccount
.
Where
(
o
=>
o
.
OrganizationKvid
==
KiviiContext
.
CurrentMember
.
OrganizationKvid
&&
Sql
.
In
(
o
.
Type
,
AccountType
.
Balance
,
AccountType
.
Cash
,
AccountType
.
Pos
));
queryAccount
.
Where
(
o
=>
o
.
OrganizationKvid
==
KiviiContext
.
CurrentMember
.
OrganizationKvid
&&
Sql
.
In
(
o
.
Type
,
AccountType
.
Balance
,
AccountType
.
Cash
,
AccountType
.
Pos
));
...
@@ -279,6 +280,8 @@ namespace Kivii.Finances.Transforms
...
@@ -279,6 +280,8 @@ namespace Kivii.Finances.Transforms
public
OwnerType
OwnerType
{
get
;
set
;
}
=
OwnerType
.
Unsupport
;
public
OwnerType
OwnerType
{
get
;
set
;
}
=
OwnerType
.
Unsupport
;
public
bool
?
IsBiz
{
get
;
set
;
}
//Split,Pos,Cash,WeChat..
public
bool
?
IsBiz
{
get
;
set
;
}
//Split,Pos,Cash,WeChat..
public
bool
?
IsAssign
{
get
;
set
;
}
//是否被划转
public
override
object
OnExecution
(
IRequest
req
,
IResponse
res
)
public
override
object
OnExecution
(
IRequest
req
,
IResponse
res
)
{
{
var
conn
=
KiviiContext
.
GetOpenedDbConnection
<
Payment
>();
var
conn
=
KiviiContext
.
GetOpenedDbConnection
<
Payment
>();
...
@@ -291,9 +294,14 @@ namespace Kivii.Finances.Transforms
...
@@ -291,9 +294,14 @@ namespace Kivii.Finances.Transforms
if
(
OwnerType
==
OwnerType
.
Organization
)
sqlExpress
.
And
(
o
=>
o
.
OwnerKvid
==
KiviiContext
.
CurrentMember
.
OrganizationKvid
||
o
.
OwnerKvid
==
Guid
.
Empty
);
if
(
OwnerType
==
OwnerType
.
Organization
)
sqlExpress
.
And
(
o
=>
o
.
OwnerKvid
==
KiviiContext
.
CurrentMember
.
OrganizationKvid
||
o
.
OwnerKvid
==
Guid
.
Empty
);
if
(
OwnerType
==
OwnerType
.
Department
)
sqlExpress
.
And
(
o
=>
Sql
.
In
(
o
.
OwnerKvid
,
KiviiContext
.
CurrentMember
.
DepartmentKvids
)
||
o
.
OwnerKvid
==
Guid
.
Empty
);
if
(
OwnerType
==
OwnerType
.
Department
)
sqlExpress
.
And
(
o
=>
Sql
.
In
(
o
.
OwnerKvid
,
KiviiContext
.
CurrentMember
.
DepartmentKvids
)
||
o
.
OwnerKvid
==
Guid
.
Empty
);
if
(
OwnerType
==
OwnerType
.
Member
)
sqlExpress
.
And
(
o
=>
o
.
OwnerKvid
==
KiviiContext
.
CurrentMember
.
Kvid
||
o
.
OwnerKvid
==
Guid
.
Empty
);
if
(
OwnerType
==
OwnerType
.
Member
)
sqlExpress
.
And
(
o
=>
o
.
OwnerKvid
==
KiviiContext
.
CurrentMember
.
Kvid
||
o
.
OwnerKvid
==
Guid
.
Empty
);
if
(
IsBiz
==
null
)
sqlExpress
.
Where
(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
Type
,
PaymentType
.
WeChat
,
PaymentType
.
Cash
,
PaymentType
.
AliPay
,
PaymentType
.
Pos
,
PaymentType
.
Split
,
PaymentType
.
Refund
,
PaymentType
.
UnBiz
));
if
(
IsBiz
==
null
)
sqlExpress
.
Where
(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
Type
,
PaymentType
.
WeChat
,
PaymentType
.
Cash
,
PaymentType
.
AliPay
,
PaymentType
.
Pos
,
PaymentType
.
Split
,
PaymentType
.
Assign
,
PaymentType
.
Refund
,
PaymentType
.
UnBiz
));
else
if
(
IsBiz
.
Value
)
sqlExpress
.
Where
(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
Type
,
PaymentType
.
WeChat
,
PaymentType
.
Cash
,
PaymentType
.
AliPay
,
PaymentType
.
Pos
,
PaymentType
.
Split
));
else
if
(
IsBiz
.
Value
)
sqlExpress
.
Where
(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
Type
,
PaymentType
.
WeChat
,
PaymentType
.
Cash
,
PaymentType
.
AliPay
,
PaymentType
.
Pos
,
PaymentType
.
Split
,
PaymentType
.
Assign
));
else
sqlExpress
.
Where
(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
Type
,
PaymentType
.
Refund
,
PaymentType
.
UnBiz
));
else
sqlExpress
.
Where
(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
Type
,
PaymentType
.
Refund
,
PaymentType
.
UnBiz
));
if
(
IsAssign
!=
null
)
{
if
(
IsAssign
.
Value
)
sqlExpress
.
And
(
o
=>
o
.
AmountSplited
>
0
&&
o
.
Type
!=
PaymentType
.
Assign
);
else
sqlExpress
.
And
(
o
=>
o
.
AmountSplited
==
0
&&
o
.
Type
!=
PaymentType
.
Assign
);
}
var
rtns
=
autoQuery
.
Execute
(
Request
,
conn
,
request
,
sqlExpress
);
var
rtns
=
autoQuery
.
Execute
(
Request
,
conn
,
request
,
sqlExpress
);
return
rtns
;
return
rtns
;
}
}
...
@@ -322,6 +330,9 @@ namespace Kivii.Finances.Transforms
...
@@ -322,6 +330,9 @@ namespace Kivii.Finances.Transforms
#
endregion
#
endregion
public
Guid
CurrentKvid
{
get
;
set
;
}
public
bool
IncludeAssign
{
get
;
set
;
}
//查看当前使用情况时是否要包含当前项目子项的使用情况(如果存在的话)
public
override
object
OnExecution
(
IRequest
req
,
IResponse
res
)
public
override
object
OnExecution
(
IRequest
req
,
IResponse
res
)
{
{
var
conn
=
KiviiContext
.
GetOpenedDbConnection
<
Payment
>();
var
conn
=
KiviiContext
.
GetOpenedDbConnection
<
Payment
>();
...
@@ -332,8 +343,20 @@ namespace Kivii.Finances.Transforms
...
@@ -332,8 +343,20 @@ namespace Kivii.Finances.Transforms
request
=
request
.
PopulateWith
(
this
);
request
=
request
.
PopulateWith
(
this
);
var
sqlExpress
=
autoQuery
.
CreateQuery
(
Request
,
conn
,
request
,
dynamicParams
);
var
sqlExpress
=
autoQuery
.
CreateQuery
(
Request
,
conn
,
request
,
dynamicParams
);
sqlExpress
.
Where
(
o
=>
Sql
.
In
(
o
.
Type
,
PaymentType
.
Transfer
,
PaymentType
.
DynamicPay
));
sqlExpress
.
Where
(
o
=>
Sql
.
In
(
o
.
Type
,
PaymentType
.
Transfer
,
PaymentType
.
DynamicPay
));
if
(
IncludeAssign
&&
CurrentKvid
!=
Guid
.
Empty
)
{
var
queryAssign
=
conn
.
From
<
Payment
>();
queryAssign
.
Where
(
o
=>
o
.
ParentKvid
==
CurrentKvid
&&
o
.
OffsetKvid
==
Guid
.
Empty
&&
o
.
Type
==
PaymentType
.
Assign
);
queryAssign
.
Select
(
o
=>
o
.
Kvid
);
var
kvids
=
conn
.
Select
<
Guid
>(
queryAssign
);
if
(
kvids
.
IsNullOrEmpty
())
kvids
=
new
List
<
Guid
>();
kvids
.
Add
(
CurrentKvid
);
sqlExpress
.
And
(
o
=>
Sql
.
In
(
o
.
ParentKvid
,
kvids
));
}
var
rtns
=
autoQuery
.
Execute
(
Request
,
conn
,
request
,
sqlExpress
);
var
rtns
=
autoQuery
.
Execute
(
Request
,
conn
,
request
,
sqlExpress
);
return
rtns
;
return
rtns
;
}
}
}
}
}
}
Src/Transforms/RestfulSettlement.Offset.cs
View file @
fed5068e
...
@@ -26,7 +26,7 @@ namespace Kivii.Finances.Transforms
...
@@ -26,7 +26,7 @@ namespace Kivii.Finances.Transforms
var
settlements
=
connF
.
Select
<
Settlement
>(
o
=>
Sql
.
In
(
o
.
Kvid
,
Kvids
));
var
settlements
=
connF
.
Select
<
Settlement
>(
o
=>
Sql
.
In
(
o
.
Kvid
,
Kvids
));
(
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
));
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本身就需要判断
...
...
Src/Transforms/Statistics/RestfulPayment.Statistic.cs
View file @
fed5068e
...
@@ -97,6 +97,7 @@ namespace Kivii.Finances.Transforms
...
@@ -97,6 +97,7 @@ namespace Kivii.Finances.Transforms
public
DateTime
EndTime
{
get
;
set
;
}
public
DateTime
EndTime
{
get
;
set
;
}
public
bool
IsOperated
{
get
;
set
;
}
//如果True则查询OperateTime否则默认CreateTime
//public bool IsTest { get; set; }
//public bool IsTest { get; set; }
public
override
object
OnExecution
(
IRequest
req
,
IResponse
res
)
public
override
object
OnExecution
(
IRequest
req
,
IResponse
res
)
...
@@ -119,7 +120,8 @@ namespace Kivii.Finances.Transforms
...
@@ -119,7 +120,8 @@ namespace Kivii.Finances.Transforms
var
sqlExpress
=
conn
.
From
<
Payment
>();
var
sqlExpress
=
conn
.
From
<
Payment
>();
sqlExpress
.
Where
(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
Type
,
PaymentType
.
WeChat
,
PaymentType
.
Cash
,
PaymentType
.
AliPay
,
PaymentType
.
Pos
,
PaymentType
.
Split
));
sqlExpress
.
Where
(
o
=>
o
.
OffsetKvid
==
Guid
.
Empty
&&
Sql
.
In
(
o
.
Type
,
PaymentType
.
WeChat
,
PaymentType
.
Cash
,
PaymentType
.
AliPay
,
PaymentType
.
Pos
,
PaymentType
.
Split
));
sqlExpress
.
And
(
o
=>
o
.
CreateTime
>=
beginTime
&&
o
.
CreateTime
<
endTime
);
if
(
IsOperated
)
sqlExpress
.
And
(
o
=>
o
.
OperateTime
>=
beginTime
&&
o
.
OperateTime
<
endTime
);
else
sqlExpress
.
And
(
o
=>
o
.
CreateTime
>=
beginTime
&&
o
.
CreateTime
<
endTime
);
if
(!
OwnerKvids
.
IsNullOrEmpty
())
sqlExpress
.
And
(
o
=>
Sql
.
In
(
o
.
OwnerKvid
,
OwnerKvids
));
if
(!
OwnerKvids
.
IsNullOrEmpty
())
sqlExpress
.
And
(
o
=>
Sql
.
In
(
o
.
OwnerKvid
,
OwnerKvids
));
sqlExpress
.
And
(
o
=>
(
Sql
.
In
(
o
.
PayerAccountKvid
,
queryAccount
)));
sqlExpress
.
And
(
o
=>
(
Sql
.
In
(
o
.
PayerAccountKvid
,
queryAccount
)));
sqlExpress
.
OrderBy
(
o
=>
o
.
OwnerName
);
sqlExpress
.
OrderBy
(
o
=>
o
.
OwnerName
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment