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
620b3210
Commit
620b3210
authored
Jul 15, 2022
by
陶然
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
新增优惠政策模块
parent
44603696
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
705 additions
and
3 deletions
+705
-3
Configs.cs
Src/Configs.cs
+4
-0
Policy.cs
Src/Entities/Policy.cs
+282
-0
PolicyExtension.cs
Src/Extensions/PolicyExtension.cs
+42
-0
Kivii.Biz.Finances.V2.0.csproj
Src/Kivii.Biz.Finances.V2.0.csproj
+4
-1
RoleProvider.cs
Src/RoleProvider.cs
+1
-1
RestfulPolicy.cs
Src/Transforms/RestfulPolicy.cs
+303
-0
RestfulSettlement.Offset.cs
Src/Transforms/RestfulSettlement.Offset.cs
+25
-1
RestfulSettlement.cs
Src/Transforms/RestfulSettlement.cs
+44
-0
No files found.
Src/Configs.cs
View file @
620b3210
...
...
@@ -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"
;
}
}
Src/Entities/Policy.cs
0 → 100644
View file @
620b3210
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
}
}
Src/Extensions/PolicyExtension.cs
0 → 100644
View file @
620b3210
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
;
}
}
}
Src/Kivii.Biz.Finances.V2.0.csproj
View file @
620b3210
...
...
@@ -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"
/>
...
...
Src/
Extensions/
RoleProvider.cs
→
Src/RoleProvider.cs
View file @
620b3210
...
...
@@ -5,7 +5,7 @@ using System.Linq;
using
System.Text
;
using
System.Threading.Tasks
;
namespace
Kivii.Finances
.Extensions
namespace
Kivii.Finances
{
public
class
PaymentRoles
{
...
...
Src/Transforms/RestfulPolicy.cs
0 → 100644
View file @
620b3210
using
Kivii.Finances.Entities
;
using
Kivii.Linq
;
using
Kivii.Web
;
using
System
;
using
System.Collections.Generic
;
using
System.Data
;
using
System.Linq
;
using
System.Text
;
using
System.Threading.Tasks
;
namespace
Kivii.Finances.Transforms
{
#
region
CRUDQ
[
RequiresAnyRole
(
MemberRoles
.
Everyone
)]
public
class
PolicyCreate
:
RestfulCreate
<
Policy
>
{
}
[
RequiresAnyRole
(
MemberRoles
.
Everyone
)]
public
class
PolicyUpdate
:
RestfulUpdate
<
Policy
>
{
}
[
RequiresAnyRole
(
MemberRoles
.
Everyone
)]
public
class
PolicyDelete
:
RestfulDelete
<
Policy
>
{
}
[
RequiresAnyRole
(
MemberRoles
.
Everyone
)]
public
class
PolicyRead
:
RestfulRead
<
Policy
>
{
}
[
RequiresAnyRole
(
MemberRoles
.
Everyone
)]
public
class
PolicyQuery
:
RestfulQuery
<
Policy
>
{
}
[
RequiresAnyRole
(
MemberRoles
.
Everyone
)]
public
class
PolicyDetailCreate
:
RestfulExecution
<
PolicyDetail
>
{
public
PolicyDetail
Item
{
get
;
set
;
}
public
List
<
PolicyDetail
>
Items
{
get
;
set
;
}
public
override
object
OnExecution
(
IRequest
req
,
IResponse
res
)
{
(
Item
==
null
&&
Items
.
IsNullOrEmpty
()).
ThrowIfTrue
(
"请传入要创建的内容!"
);
if
(
Items
.
IsNullOrEmpty
())
Items
=
new
List
<
PolicyDetail
>();
if
(
Item
!=
null
)
Items
.
Add
(
Item
);
var
rtns
=
new
RestfulCreateResponse
<
PolicyDetail
>();
rtns
.
Results
=
new
List
<
PolicyDetail
>();
var
conn
=
KiviiContext
.
GetOpenedDbConnection
<
PolicyDetail
>();
foreach
(
var
item
in
Items
)
{
if
(
conn
.
Exists
<
PolicyDetail
>(
o
=>
o
.
TargetKvid
==
item
.
TargetKvid
||
o
.
TargetName
==
item
.
TargetName
))
continue
;
conn
.
Insert
(
item
);
rtns
.
Results
.
Add
(
item
);
var
log
=
new
EntityLog
<
Policy
>();
log
.
OwnerKvid
=
item
.
PolicyKvid
;
log
.
BizId
=
item
.
TargetName
;
log
.
BizKvid
=
item
.
Kvid
;
log
.
BizType
=
typeof
(
PolicyDetail
).
FullName
;
log
.
Type
=
"新增"
;
log
.
Title
=
DateTime
.
Now
.
ToString
(
"yyyy-MM-dd HH:mm:ss"
);
log
.
Remark
=
$"新增客户[
{
item
.
TargetName
}
],操作人:
{
KiviiContext
.
CurrentMember
.
FullName
}
"
;
conn
.
Insert
(
log
);
}
return
rtns
;
}
}
[
RequiresAnyRole
(
MemberRoles
.
Everyone
)]
public
class
PolicyDetailDelete
:
RestfulDelete
<
PolicyDetail
>
{
private
List
<
PolicyDetail
>
_policyDetails
=
null
;
private
IDbTransaction
_trans
=
null
;
public
override
bool
OnPreRestfulDelete
(
IRequest
req
,
IResponse
res
,
IDbConnection
dbConnection
,
IRestfulDeleteResponse
<
PolicyDetail
>
rtns
)
{
_policyDetails
=
dbConnection
.
SelectByIds
<
PolicyDetail
>(
Kvids
);
if
(!
_policyDetails
.
IsNullOrEmpty
())
_trans
=
dbConnection
.
OpenTransaction
();
return
base
.
OnPreRestfulDelete
(
req
,
res
,
dbConnection
,
rtns
);
}
public
override
bool
OnPostRestfulDelete
(
IRequest
req
,
IResponse
res
,
IDbConnection
dbConnection
,
IRestfulDeleteResponse
<
PolicyDetail
>
rtns
)
{
if
(
_policyDetails
.
IsNullOrEmpty
())
return
base
.
OnPostRestfulDelete
(
req
,
res
,
dbConnection
,
rtns
);
try
{
foreach
(
var
kvid
in
Kvids
)
{
var
policyDetail
=
_policyDetails
.
FirstOrDefault
(
p
=>
p
.
Kvid
==
kvid
);
if
(
policyDetail
==
null
)
continue
;
var
log
=
new
EntityLog
<
Policy
>();
log
.
OwnerKvid
=
policyDetail
.
PolicyKvid
;
log
.
BizId
=
policyDetail
.
TargetName
;
log
.
BizKvid
=
policyDetail
.
Kvid
;
log
.
BizType
=
typeof
(
PolicyDetail
).
FullName
;
log
.
Type
=
"删除"
;
log
.
Title
=
DateTime
.
Now
.
ToString
(
"yyyy-MM-dd HH:mm:ss"
);
log
.
Remark
=
$"删除客户[
{
policyDetail
.
TargetName
}
],操作人:
{
KiviiContext
.
CurrentMember
.
FullName
}
"
;
dbConnection
.
Insert
(
log
);
}
_trans
?.
Commit
();
}
catch
(
Exception
ex
)
{
_trans
?.
Rollback
();
throw
ex
;
}
return
base
.
OnPostRestfulDelete
(
req
,
res
,
dbConnection
,
rtns
);
}
}
[
RequiresAnyRole
(
MemberRoles
.
Everyone
)]
public
class
PolicyDetailRead
:
RestfulRead
<
PolicyDetail
>
{
}
[
RequiresAnyRole
(
MemberRoles
.
Everyone
)]
public
class
PolicyDetailQuery
:
RestfulQuery
<
PolicyDetail
>
{
}
[
RequiresAnyRole
(
MemberRoles
.
Everyone
)]
public
class
PolicyRecordQuery
:
RestfulQuery
<
PolicyRecord
>
{
}
#
endregion
[
Api
(
Description
=
"政策匹配"
)]
[
RequiresAnyRole
(
MemberRoles
.
Everyone
)]
public
class
PolicyMatching
:
RestfulExecution
<
Policy
>
{
public
string
TargetName
{
get
;
set
;
}
public
Guid
TargetKvid
{
get
;
set
;
}
public
DateTime
?
BizTime
{
get
;
set
;
}
public
override
object
OnExecution
(
IRequest
req
,
IResponse
res
)
{
if
(
TargetName
.
IsNullOrEmpty
()
&&
TargetKvid
==
Guid
.
Empty
)
throw
new
Exception
(
"请传入付款单位信息!"
);
if
(
BizTime
==
null
)
BizTime
=
new
DateTime
();
var
conn
=
KiviiContext
.
GetOpenedDbConnection
<
PolicyDetail
>();
var
query
=
conn
.
From
<
PolicyDetail
>();
if
(
TargetKvid
!=
Guid
.
Empty
)
query
.
Where
(
o
=>
o
.
TargetKvid
==
TargetKvid
);
else
query
.
Where
(
o
=>
o
.
TargetName
==
TargetName
);
query
.
Select
(
o
=>
o
.
PolicyKvid
);
var
policys
=
conn
.
Select
<
Policy
>(
o
=>
Sql
.
In
(
o
.
Kvid
,
query
)
&&
o
.
EffectiveTime
<=
BizTime
&&
o
.
ExpiredTime
>=
BizTime
);
var
rtns
=
new
RestfulQueryResponse
<
Policy
>();
rtns
.
Results
=
new
List
<
Policy
>();
if
(!
policys
.
IsNullOrEmpty
())
rtns
.
Results
.
AddRange
(
policys
);
rtns
.
Total
=
rtns
.
Results
.
Count
;
return
rtns
;
}
}
[
Api
(
Description
=
"政策应用"
)]
[
RequiresAnyRole
(
MemberRoles
.
Everyone
)]
public
class
PolicyUsing
:
RestfulExecution
<
Policy
>
{
public
Guid
PolicyKvid
{
get
;
set
;
}
public
Settlement
Item
{
get
;
set
;
}
public
List
<
Settlement
>
Items
{
get
;
set
;
}
public
override
object
OnExecution
(
IRequest
req
,
IResponse
res
)
{
(
Item
==
null
&&
Items
.
IsNullOrEmpty
()).
ThrowIfTrue
(
"请传入要创建的内容!"
);
if
(
Items
.
IsNullOrEmpty
())
Items
=
new
List
<
Settlement
>();
if
(
Item
!=
null
)
Items
.
Add
(
Item
);
var
conn
=
KiviiContext
.
GetOpenedDbConnection
<
Policy
>();
var
policy
=
conn
.
SingleById
<
Policy
>(
PolicyKvid
);
var
rtns
=
new
RestfulQueryResponse
<
Settlement
>();
rtns
.
Results
=
new
List
<
Settlement
>();
foreach
(
var
item
in
Items
)
//先清除所有已存在的优惠政策
{
item
.
Category
=
string
.
Empty
;
if
(
item
.
Details
.
IsNullOrEmpty
())
continue
;
item
.
Details
.
RemoveAll
(
o
=>
o
.
BizType
==
typeof
(
Policy
).
FullName
);
item
.
Amount
=
item
.
Details
.
Sum
(
o
=>
o
.
Amount
);
item
.
AmountPlan
=
item
.
Details
.
Sum
(
o
=>
o
.
AmountPlan
);
item
.
RemoveAllOnlyProperties
();
}
if
(
policy
==
null
)
{
rtns
.
Results
.
AddRange
(
Items
);
rtns
.
Total
=
rtns
.
Results
.
Count
;
return
rtns
;
}
if
(
policy
.
Type
==
PolicyType
.
Original
)
{
foreach
(
var
item
in
Items
)
{
if
(
item
.
Details
.
IsNullOrEmpty
())
item
.
Details
=
new
List
<
SettlementDetail
>();
decimal
amount
=
0
;
decimal
amountPlan
=
0
;
if
(
policy
.
Amount
>
0
)
{
if
(
item
.
AmountPlan
-
policy
.
Amount
>=
item
.
Amount
)
{
item
.
RemoveAllOnlyProperties
();
rtns
.
Results
.
Add
(
item
);
continue
;
//由此可证明此优惠政策后不如原优惠力度所以跳过
}
var
amountPolicy
=
item
.
AmountPlan
-
policy
.
Amount
;
if
(
amountPolicy
<
0
)
amountPolicy
=
0
;
amount
=
amountPolicy
-
item
.
Amount
;
amountPlan
=
0
;
}
else
{
if
(
item
.
AmountPlan
-
item
.
AmountPlan
*
(
1
-
(
policy
.
DiscountRate
==
null
?
1
:
policy
.
DiscountRate
.
Value
))
>=
item
.
Amount
)
{
item
.
RemoveAllOnlyProperties
();
rtns
.
Results
.
Add
(
item
);
continue
;
//由此可证明此优惠政策后不如原优惠力度所以跳过
}
amount
=
item
.
AmountPlan
-
item
.
AmountPlan
*
(
1
-
(
policy
.
DiscountRate
==
null
?
1
:
policy
.
DiscountRate
.
Value
))
-
item
.
Amount
;
amountPlan
=
0
;
}
item
.
Category
=
policy
.
Type
.
ToString
();
var
detail
=
new
SettlementDetail
();
detail
.
OperateTime
=
DateTime
.
Now
;
detail
.
OperatorName
=
KiviiContext
.
CurrentMember
.
FullName
;
detail
.
OperatorKvid
=
KiviiContext
.
CurrentMember
.
Kvid
;
detail
.
BizId
=
policy
.
Name
;
detail
.
BizKvid
=
policy
.
Kvid
;
detail
.
BizType
=
typeof
(
Policy
).
FullName
;
detail
.
Amount
=
amount
;
detail
.
AmountPlan
=
amountPlan
;
detail
.
GoodsFullName
=
policy
.
Name
;
detail
.
GoodsUnit
=
"次"
;
detail
.
Quantity
=
1
;
detail
.
QuantityUnitPrice
=
detail
.
Amount
/
detail
.
Quantity
;
detail
.
QuantityPlan
=
detail
.
Quantity
;
detail
.
QuantityUnitPricePlan
=
detail
.
AmountPlan
/
detail
.
QuantityPlan
;
detail
.
QuantityUnit
=
"次"
;
detail
.
Type
=
"Policy"
;
detail
.
Currency
=
CurrencyUnit
.
CNY
;
detail
.
Remark
=
$"执行优惠政策[
{
policy
.
Name
}
],减免
{
Math
.
Abs
(
detail
.
Amount
)}
元"
;
item
.
Details
.
Add
(
detail
);
item
.
Amount
=
item
.
Details
.
Sum
(
o
=>
o
.
Amount
);
item
.
AmountPlan
=
item
.
Details
.
Sum
(
o
=>
o
.
AmountPlan
);
item
.
RemoveAllOnlyProperties
();
rtns
.
Results
.
Add
(
item
);
}
}
if
(
policy
.
Type
==
PolicyType
.
Additional
)
{
foreach
(
var
item
in
Items
)
{
item
.
Category
=
policy
.
Type
.
ToString
();
if
(
item
.
Details
.
IsNullOrEmpty
())
item
.
Details
=
new
List
<
SettlementDetail
>();
decimal
amount
=
0
;
decimal
amountPlan
=
0
;
if
(
policy
.
Amount
>
0
)
{
amount
=
0
-
policy
.
Amount
;
if
(
item
.
Amount
-
policy
.
Amount
<
0
)
amount
=
0
-
item
.
Amount
;
amountPlan
=
0
;
}
else
{
amount
=
0
-
item
.
Amount
*
(
1
-
(
policy
.
DiscountRate
==
null
?
1
:
policy
.
DiscountRate
.
Value
));
amountPlan
=
0
;
}
var
detail
=
new
SettlementDetail
();
detail
.
OperateTime
=
DateTime
.
Now
;
detail
.
OperatorName
=
KiviiContext
.
CurrentMember
.
FullName
;
detail
.
OperatorKvid
=
KiviiContext
.
CurrentMember
.
Kvid
;
detail
.
BizId
=
policy
.
Name
;
detail
.
BizKvid
=
policy
.
Kvid
;
detail
.
BizType
=
typeof
(
Policy
).
FullName
;
detail
.
Amount
=
amount
;
detail
.
AmountPlan
=
amountPlan
;
detail
.
GoodsFullName
=
policy
.
Name
;
detail
.
GoodsUnit
=
"次"
;
detail
.
Quantity
=
1
;
detail
.
QuantityUnitPrice
=
detail
.
Amount
/
detail
.
Quantity
;
detail
.
QuantityPlan
=
detail
.
Quantity
;
detail
.
QuantityUnitPricePlan
=
detail
.
AmountPlan
/
detail
.
QuantityPlan
;
detail
.
QuantityUnit
=
"次"
;
detail
.
Type
=
"Policy"
;
detail
.
Currency
=
CurrencyUnit
.
CNY
;
item
.
Details
.
Add
(
detail
);
item
.
Amount
=
item
.
Details
.
Sum
(
o
=>
o
.
Amount
);
item
.
AmountPlan
=
item
.
Details
.
Sum
(
o
=>
o
.
AmountPlan
);
item
.
RemoveAllOnlyProperties
();
rtns
.
Results
.
Add
(
item
);
}
}
rtns
.
Total
=
rtns
.
Results
.
Count
;
return
rtns
;
}
}
}
Src/Transforms/RestfulSettlement.Offset.cs
View file @
620b3210
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
>();
...
...
Src/Transforms/RestfulSettlement.cs
View file @
620b3210
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
)
...
...
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