Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
J
jiedao-api-boot-master
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
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
lanbaoming
jiedao-api-boot-master
Commits
3d68dd86
Commit
3d68dd86
authored
Aug 24, 2024
by
chenjiuping
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
自动核销功能
parent
b94caa15
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
213 additions
and
116 deletions
+213
-116
ReceiptService.java
...r/yudao/module/wealth/service/receipt/ReceiptService.java
+16
-0
ReceiptServiceImpl.java
...dao/module/wealth/service/receipt/ReceiptServiceImpl.java
+132
-116
ReceiptAutoWriteOff.java
...dule/wealth/controller/admin/job/ReceiptAutoWriteOff.java
+65
-0
No files found.
yudao-module-wealth/yudao-module-wealth-core/src/main/java/cn/iocoder/yudao/module/wealth/service/receipt/ReceiptService.java
View file @
3d68dd86
...
...
@@ -139,5 +139,21 @@ public interface ReceiptService extends IService<ReceiptDO> {
ReceiptExportDto
getReceiptExportByOrderId
(
Long
orderId
);
/**
* 判断当前收款单有没有达到比例
*
* @param receiptDO
* @param proportion
* @return
*/
Boolean
judgingProportion
(
ReceiptDO
receiptDO
,
String
proportion
);
/**
* 自动更新收款单的核销状态
*
* @param receiptDO
*/
void
autoWriteOffReceipt
(
ReceiptDO
receiptDO
,
String
userId
,
String
userName
);
}
yudao-module-wealth/yudao-module-wealth-core/src/main/java/cn/iocoder/yudao/module/wealth/service/receipt/ReceiptServiceImpl.java
View file @
3d68dd86
package
cn
.
iocoder
.
yudao
.
module
.
wealth
.
service
.
receipt
;
import
cn.hutool.core.collection.CollectionUtil
;
import
cn.hutool.core.util.NumberUtil
;
import
cn.hutool.core.util.StrUtil
;
import
cn.iocoder.yudao.framework.apollo.core.event.OrderNumberLogEvent
;
import
cn.iocoder.yudao.framework.common.pojo.PageResult
;
...
...
@@ -101,8 +102,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
Long
createReceipt
(
ReceiptCreateReqVO
createReqVO
)
{
List
<
ReceivableUpdateReqVO
>
receivableUpdateReqVOList
=
createReqVO
.
getReceivableVOList
();
List
<
ReceivableUpdateReqVO
>
receivableUpdateReqVOList
=
createReqVO
.
getReceivableVOList
();
if
(
CollectionUtil
.
isEmpty
(
receivableUpdateReqVOList
))
{
throw
exception
(
RECEIVABLE_NOT_NULL
);
...
...
@@ -118,8 +118,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
//当自编号为空(某些预付款未装柜的订单),则校验为同一客户同意目的国,忽略自编号规则,视为同一自编号
validateSameCustomerReceivable
(
createReqVO
.
getReceivableVOList
());
List
<
ReceiptAccountCreateReqVO
>
receiptAccountCreateReqVOList
=
createReqVO
.
getReceiptAccountList
();
List
<
ReceiptAccountCreateReqVO
>
receiptAccountCreateReqVOList
=
createReqVO
.
getReceiptAccountList
();
if
(
CollectionUtil
.
isEmpty
(
receiptAccountCreateReqVOList
))
{
throw
exception
(
RECEIPT_ACCOUNT_NOT_EXISTS
);
...
...
@@ -178,29 +177,25 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
receiptMapper
.
updateById
(
update
);
}
List
<
ReceivableDO
>
receivableDOList
=
receivableUpdateReqVOList
.
stream
().
filter
(
re
->
null
!=
re
.
getId
()).
map
(
re
->
{
ReceivableDO
receivableDO
=
ReceivableConvert
.
INSTANCE
.
convert
(
re
);
receivableDO
.
setReceiptNo
(
receipt
.
getReceiptNo
());
receivableDO
.
setReceiptId
(
receipt
.
getId
());
receivableDO
.
setState
(
1
);
receivableDO
.
setUpdater
(
creator
);
receivableDO
.
setUpdateTime
(
new
Date
());
return
receivableDO
;
}).
collect
(
Collectors
.
toList
());
List
<
ReceivableDO
>
receivableDOList
=
receivableUpdateReqVOList
.
stream
().
filter
(
re
->
null
!=
re
.
getId
()).
map
(
re
->
{
ReceivableDO
receivableDO
=
ReceivableConvert
.
INSTANCE
.
convert
(
re
);
receivableDO
.
setReceiptNo
(
receipt
.
getReceiptNo
());
receivableDO
.
setReceiptId
(
receipt
.
getId
());
receivableDO
.
setState
(
1
);
receivableDO
.
setUpdater
(
creator
);
receivableDO
.
setUpdateTime
(
new
Date
());
return
receivableDO
;
}).
collect
(
Collectors
.
toList
());
receivableService
.
updateBatchById
(
receivableDOList
);
List
<
ReceiptAccountDO
>
receiptAccountDOList
=
receiptAccountCreateReqVOList
.
stream
().
map
(
re
->
{
ReceiptAccountDO
receivableDO
=
ReceiptAccountConvert
.
INSTANCE
.
convert
(
re
);
receivableDO
.
setReceiptId
(
receipt
.
getId
());
receivableDO
.
setUpdater
(
creator
);
receivableDO
.
setUpdateTime
(
new
Date
());
return
receivableDO
;
}).
collect
(
Collectors
.
toList
());
List
<
ReceiptAccountDO
>
receiptAccountDOList
=
receiptAccountCreateReqVOList
.
stream
().
map
(
re
->
{
ReceiptAccountDO
receivableDO
=
ReceiptAccountConvert
.
INSTANCE
.
convert
(
re
);
receivableDO
.
setReceiptId
(
receipt
.
getId
());
receivableDO
.
setUpdater
(
creator
);
receivableDO
.
setUpdateTime
(
new
Date
());
return
receivableDO
;
}).
collect
(
Collectors
.
toList
());
receiptAccountService
.
saveBatch
(
receiptAccountDOList
);
// 返回
...
...
@@ -438,37 +433,29 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
}
@Override
public
PageResult
<
ReceiptBackVO
>
getReceiptPage
(
ReceiptQueryVO
query
,
PageVO
page
)
{
public
PageResult
<
ReceiptBackVO
>
getReceiptPage
(
ReceiptQueryVO
query
,
PageVO
page
)
{
page
.
setField
(
"er.id"
);
IPage
<
ReceiptBackVO
>
mpPage
=
MyBatisUtils
.
buildPage
(
page
);
receiptMapper
.
getReceiptBackPage
(
mpPage
,
query
);
//添加明细状态计算列表
//MxStatus
//获取List指定字段的List
List
<
Long
>
idList
=
mpPage
.
getRecords
().
stream
()
.
map
(
ReceiptBackVO:
:
getId
)
.
collect
(
Collectors
.
toList
());
List
<
Long
>
idList
=
mpPage
.
getRecords
().
stream
().
map
(
ReceiptBackVO:
:
getId
).
collect
(
Collectors
.
toList
());
//一定要判空,不然会报错
if
(
CollectionUtil
.
isNotEmpty
(
idList
))
{
if
(
CollectionUtil
.
isNotEmpty
(
idList
))
{
//根据List获取本页中所有的明细信息
LambdaQueryWrapper
<
ReceiptItemDO
>
lambdaQueryWrapper
=
new
LambdaQueryWrapper
<>();
LambdaQueryWrapper
<
ReceiptItemDO
>
lambdaQueryWrapper
=
new
LambdaQueryWrapper
<>();
lambdaQueryWrapper
.
in
(
ReceiptItemDO:
:
getReceiptId
,
idList
);
//所有收款单的明细
List
<
ReceiptItemDO
>
listItem
=
receiptItemMapper
.
selectList
(
lambdaQueryWrapper
);
List
<
ReceiptItemDO
>
listItem
=
receiptItemMapper
.
selectList
(
lambdaQueryWrapper
);
LambdaQueryWrapper
<
ReceiptAccountDO
>
lambdaQueryWrapper2
=
new
LambdaQueryWrapper
<>();
LambdaQueryWrapper
<
ReceiptAccountDO
>
lambdaQueryWrapper2
=
new
LambdaQueryWrapper
<>();
lambdaQueryWrapper2
.
in
(
ReceiptAccountDO:
:
getReceiptId
,
idList
);
List
<
ReceiptAccountDO
>
ReceiptAccountList
=
receiptAccountMapper
.
selectList
(
lambdaQueryWrapper2
);
List
<
ReceiptAccountDO
>
ReceiptAccountList
=
receiptAccountMapper
.
selectList
(
lambdaQueryWrapper2
);
Map
<
Integer
,
CurrencyRespDTO
>
currencyMap
=
currencyApi
.
getAllCurrency
();
for
(
ReceiptBackVO
r
:
mpPage
.
getRecords
()
)
{
for
(
ReceiptBackVO
r
:
mpPage
.
getRecords
())
{
String
sR
=
getReceiptMxStatus
(
listItem
,
r
.
getId
());
r
.
setMxStatus
(
sR
);
...
...
@@ -480,16 +467,14 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
r
.
setSsShow
(
s2
);
//核销比例
r
.
setHxBiLi
(
getHxBili
(
ReceiptAccountList
,
listItem
,
r
.
getId
()));
r
.
setHxBiLi
(
getHxBili
(
ReceiptAccountList
,
listItem
,
r
.
getId
()));
}
}
return
PageResult
.
of
(
mpPage
);
}
private
String
getPercentage
(
BigDecimal
part
,
BigDecimal
total
)
{
BigDecimal
percentage
=
part
.
divide
(
total
,
5
,
BigDecimal
.
ROUND_HALF_UP
).
multiply
(
new
BigDecimal
(
"100"
));
BigDecimal
percentage
=
part
.
divide
(
total
,
5
,
BigDecimal
.
ROUND_HALF_UP
).
multiply
(
new
BigDecimal
(
"100"
));
// 输出百分比
String
sR
=
format
(
percentage
)
+
"%"
;
return
sR
;
...
...
@@ -505,24 +490,18 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
/*
获取核销比例
*/
private
String
getHxBili
(
List
<
ReceiptAccountDO
>
ReceiptAccountList
,
List
<
ReceiptItemDO
>
listItemList
,
long
ReceiptId
)
{
private
String
getHxBili
(
List
<
ReceiptAccountDO
>
ReceiptAccountList
,
List
<
ReceiptItemDO
>
listItemList
,
long
ReceiptId
)
{
String
sR
=
"0"
;
if
(
CollectionUtil
.
isEmpty
(
ReceiptAccountList
))
return
sR
;
if
(
CollectionUtil
.
isEmpty
(
ReceiptAccountList
))
return
sR
;
if
(
CollectionUtil
.
isEmpty
(
listItemList
))
{
return
sR
;
}
List
<
ReceiptAccountDO
>
ReceiptAccountList1
=
ReceiptAccountList
.
stream
().
filter
(
i
->
i
.
getReceiptId
()
==
ReceiptId
).
collect
(
Collectors
.
toList
());
List
<
ReceiptAccountDO
>
ReceiptAccountList1
=
ReceiptAccountList
.
stream
().
filter
(
i
->
i
.
getReceiptId
()
==
ReceiptId
).
collect
(
Collectors
.
toList
());
if
(
CollectionUtil
.
isEmpty
(
ReceiptAccountList1
))
return
sR
;
BigDecimal
bTotal
=
new
BigDecimal
(
0
);
BigDecimal
bPart
=
new
BigDecimal
(
0
);
for
(
ReceiptAccountDO
do1
:
ReceiptAccountList1
)
{
for
(
ReceiptAccountDO
do1
:
ReceiptAccountList1
)
{
bTotal
=
bTotal
.
add
(
do1
.
getWriteOffAmount
());
}
...
...
@@ -532,16 +511,13 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
}
//已核销状态记录
List
<
ReceiptItemDO
>
list
=
listItemList
.
stream
().
filter
(
i
->
i
.
getReceiptId
()
==
ReceiptId
&&
i
.
getStatus
()
!=
0
).
collect
(
Collectors
.
toList
());
List
<
ReceiptItemDO
>
list
=
listItemList
.
stream
().
filter
(
i
->
i
.
getReceiptId
()
==
ReceiptId
&&
i
.
getStatus
()
!=
0
).
collect
(
Collectors
.
toList
());
if
(
CollectionUtil
.
isEmpty
(
list
))
{
//核销金额为0 核销比例为空
return
sR
;
}
for
(
ReceiptItemDO
do2
:
list
)
{
for
(
ReceiptItemDO
do2
:
list
)
{
bPart
=
bPart
.
add
(
do2
.
getWriteOffAmount
());
}
//计算百分比
...
...
@@ -552,22 +528,16 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
/*
应收款
*/
private
String
getYSShow
(
List
<
ReceiptAccountDO
>
ReceiptAccountList
,
long
ReceiptId
,
Map
<
Integer
,
CurrencyRespDTO
>
currencyMap
)
{
private
String
getYSShow
(
List
<
ReceiptAccountDO
>
ReceiptAccountList
,
long
ReceiptId
,
Map
<
Integer
,
CurrencyRespDTO
>
currencyMap
)
{
String
sR
=
""
;
if
(
CollectionUtil
.
isEmpty
(
ReceiptAccountList
))
{
return
sR
;
}
List
<
ReceiptAccountDO
>
ReceiptAccountList1
=
ReceiptAccountList
.
stream
().
filter
(
i
->
i
.
getReceiptId
()
==
ReceiptId
).
collect
(
Collectors
.
toList
());
if
(
CollectionUtil
.
isEmpty
(
ReceiptAccountList1
))
return
sR
;
List
<
ReceiptAccountDO
>
ReceiptAccountList1
=
ReceiptAccountList
.
stream
().
filter
(
i
->
i
.
getReceiptId
()
==
ReceiptId
).
collect
(
Collectors
.
toList
());
if
(
CollectionUtil
.
isEmpty
(
ReceiptAccountList1
))
return
sR
;
for
(
ReceiptAccountDO
do1
:
ReceiptAccountList1
)
{
for
(
ReceiptAccountDO
do1
:
ReceiptAccountList1
)
{
BigDecimal
b1
=
do1
.
getReceivableAmount
();
String
s1
=
b1
.
toString
();
String
s2
=
""
;
...
...
@@ -585,24 +555,17 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
实收金额
*/
private
String
getSSShow
(
List
<
ReceiptItemDO
>
listItemList
,
long
ReceiptId
,
Map
<
Integer
,
CurrencyRespDTO
>
currencyMap
)
{
private
String
getSSShow
(
List
<
ReceiptItemDO
>
listItemList
,
long
ReceiptId
,
Map
<
Integer
,
CurrencyRespDTO
>
currencyMap
)
{
String
sR
=
""
;
if
(
CollectionUtil
.
isEmpty
(
listItemList
))
{
return
sR
;
}
List
<
ReceiptItemDO
>
list
=
listItemList
.
stream
().
filter
(
i
->
i
.
getReceiptId
()
==
ReceiptId
).
collect
(
Collectors
.
toList
());
List
<
ReceiptItemDO
>
list
=
listItemList
.
stream
().
filter
(
i
->
i
.
getReceiptId
()
==
ReceiptId
).
collect
(
Collectors
.
toList
());
if
(
CollectionUtil
.
isEmpty
(
list
))
return
sR
;
//根据币种分组求和
Map
<
Long
,
BigDecimal
>
dataMap
=
list
.
stream
().
filter
(
t
->
t
.
getCurrencyId
()
!=
null
)
.
collect
(
Collectors
.
groupingBy
(
ReceiptItemDO:
:
getCurrencyId
,
CollectorsUtil
.
summingBigDecimal
(
ReceiptItemDO:
:
getAmount
)));
Map
<
Long
,
BigDecimal
>
dataMap
=
list
.
stream
().
filter
(
t
->
t
.
getCurrencyId
()
!=
null
).
collect
(
Collectors
.
groupingBy
(
ReceiptItemDO:
:
getCurrencyId
,
CollectorsUtil
.
summingBigDecimal
(
ReceiptItemDO:
:
getAmount
)));
//遍历币种信息
for
(
Map
.
Entry
<
Long
,
BigDecimal
>
entry
:
dataMap
.
entrySet
())
{
String
key
=
entry
.
getKey
().
toString
();
...
...
@@ -633,8 +596,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
//全部审核 收款明细全部已审批 OK
String
sMxStatus
=
""
;
//计算明细总数
Long
iCount
=
listItem
.
stream
().
filter
(
i
->
i
.
getReceiptId
()
==
ReceiptId
).
collect
(
Collectors
.
counting
());
Long
iCount
=
listItem
.
stream
().
filter
(
i
->
i
.
getReceiptId
()
==
ReceiptId
).
collect
(
Collectors
.
counting
());
if
(
iCount
==
0
)
{
sMxStatus
=
"未录入"
;
return
sMxStatus
;
...
...
@@ -645,18 +607,10 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
//bmpStatus
//PROCESS(1, "处理中"),APPROVE(2, "通过"),
//REJECT(3, "不通过"),CANCEL(4, "已取消");
long
Item0
=
listItem
.
stream
().
filter
(
i
->
i
.
getStatus
()
==
0
).
filter
(
i
->
i
.
getReceiptId
()
==
ReceiptId
).
collect
(
Collectors
.
counting
());
long
Item1
=
listItem
.
stream
().
filter
(
i
->
i
.
getStatus
()
==
1
).
filter
(
i
->
i
.
getReceiptId
()
==
ReceiptId
).
collect
(
Collectors
.
counting
());
long
Item2
=
listItem
.
stream
().
filter
(
i
->
i
.
getStatus
()
==
2
).
filter
(
i
->
i
.
getReceiptId
()
==
ReceiptId
).
collect
(
Collectors
.
counting
());
long
Item3
=
listItem
.
stream
().
filter
(
i
->
i
.
getStatus
()
==
3
).
filter
(
i
->
i
.
getReceiptId
()
==
ReceiptId
).
collect
(
Collectors
.
counting
());
long
Item0
=
listItem
.
stream
().
filter
(
i
->
i
.
getStatus
()
==
0
).
filter
(
i
->
i
.
getReceiptId
()
==
ReceiptId
).
collect
(
Collectors
.
counting
());
long
Item1
=
listItem
.
stream
().
filter
(
i
->
i
.
getStatus
()
==
1
).
filter
(
i
->
i
.
getReceiptId
()
==
ReceiptId
).
collect
(
Collectors
.
counting
());
long
Item2
=
listItem
.
stream
().
filter
(
i
->
i
.
getStatus
()
==
2
).
filter
(
i
->
i
.
getReceiptId
()
==
ReceiptId
).
collect
(
Collectors
.
counting
());
long
Item3
=
listItem
.
stream
().
filter
(
i
->
i
.
getStatus
()
==
3
).
filter
(
i
->
i
.
getReceiptId
()
==
ReceiptId
).
collect
(
Collectors
.
counting
());
if
(
Item0
==
iCount
)
{
//0待核销
...
...
@@ -684,9 +638,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
return
sMxStatus
;
}
if
((
Item2
+
Item3
)
==
iCount
||
(
Item1
+
Item3
)
==
iCount
||
(
Item2
+
Item1
)
==
iCount
)
{
if
((
Item2
+
Item3
)
==
iCount
||
(
Item1
+
Item3
)
==
iCount
||
(
Item2
+
Item1
)
==
iCount
)
{
sMxStatus
=
"部分审核"
;
return
sMxStatus
;
}
...
...
@@ -764,8 +716,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
@Override
public
void
createFinanceReceiptWriteOff
(
FinanceReceiptVo
financeReceiptVo
)
{
ReceiptDO
receiptDO
=
validateReceiptBmpStatus
(
financeReceiptVo
.
getReceiptId
());
ReceiptDO
receiptDO
=
validateReceiptBmpStatus
(
financeReceiptVo
.
getReceiptId
());
//判断收款单下的收款明细是不是全部核销完成
LambdaQueryWrapper
<
ReceiptItemDO
>
lambdaQueryWrapper
=
new
LambdaQueryWrapper
<>();
lambdaQueryWrapper
.
eq
(
ReceiptItemDO:
:
getReceiptId
,
financeReceiptVo
.
getReceiptId
());
...
...
@@ -775,19 +726,15 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
throw
exception
(
RECEIPT_ITEM_WRITE_OFF_ING
);
}
LambdaQueryWrapper
<
ReceiptItemDO
>
lambdaQueryWrapper1
=
new
LambdaQueryWrapper
<>();
lambdaQueryWrapper1
.
eq
(
ReceiptItemDO:
:
getReceiptId
,
financeReceiptVo
.
getReceiptId
());
LambdaQueryWrapper
<
ReceiptItemDO
>
lambdaQueryWrapper1
=
new
LambdaQueryWrapper
<>();
lambdaQueryWrapper1
.
eq
(
ReceiptItemDO:
:
getReceiptId
,
financeReceiptVo
.
getReceiptId
());
lambdaQueryWrapper1
.
eq
(
ReceiptItemDO:
:
getStatus
,
1
);
List
<
ReceiptItemDO
>
receiptItemDOList
=
receiptItemMapper
.
selectList
(
lambdaQueryWrapper1
);
List
<
ReceiptItemDO
>
receiptItemDOList
=
receiptItemMapper
.
selectList
(
lambdaQueryWrapper1
);
if
(
null
==
receiptItemDOList
||
receiptItemDOList
.
size
()
==
0
)
{
throw
exception
(
RECEIPT_NOT_WRITE_OFF_ITEM_NOT_EXISTS
);
}
BigDecimal
totalAmount
=
receiptItemDOList
.
stream
().
map
(
ReceiptItemDO:
:
getWriteOffAmount
).
reduce
(
BigDecimal
.
ZERO
,
BigDecimal:
:
add
);
BigDecimal
totalAmount
=
receiptItemDOList
.
stream
().
map
(
ReceiptItemDO:
:
getWriteOffAmount
).
reduce
(
BigDecimal
.
ZERO
,
BigDecimal:
:
add
);
/* if (receiptDO.getState() != 2 && receiptDO.getState() != 3) {
...
...
@@ -826,11 +773,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
approvalDO
.
setReason
(
financeReceiptVo
.
getRemark
());
receiptApprovalService
.
save
(
approvalDO
);
Long
userId
=
SecurityFrameworkUtils
.
getLoginUserId
();
String
bpmId
=
bpmCreateServiceFactory
.
createBmp
(
userId
,
approvalDO
.
getId
(),
WorkFlowEmus
.
FINANCE_RECEIPT_WRITE_OFF
.
getKey
(),
financeReceiptVo
.
getReceiptNo
(),
financeReceiptVo
.
getCopyUserList
());
String
bpmId
=
bpmCreateServiceFactory
.
createBmp
(
userId
,
approvalDO
.
getId
(),
WorkFlowEmus
.
FINANCE_RECEIPT_WRITE_OFF
.
getKey
(),
financeReceiptVo
.
getReceiptNo
(),
financeReceiptVo
.
getCopyUserList
());
approvalDO
.
setBmpId
(
bpmId
);
receiptApprovalService
.
updateById
(
approvalDO
);
...
...
@@ -839,9 +782,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
update
.
setId
(
financeReceiptVo
.
getReceiptId
());
update
.
setBmpStatus
(
BpmProcessInstanceResultEnum
.
PROCESS
.
getResult
());
//计算出核销比例
BigDecimal
proportion
=
totalAmount
.
divide
(
receiptDO
.
getReceivableTotalAmount
(),
8
,
RoundingMode
.
HALF_UP
).
multiply
(
new
BigDecimal
(
"100"
)).
setScale
(
6
,
BigDecimal
.
ROUND_HALF_UP
);
BigDecimal
proportion
=
totalAmount
.
divide
(
receiptDO
.
getReceivableTotalAmount
(),
8
,
RoundingMode
.
HALF_UP
).
multiply
(
new
BigDecimal
(
"100"
)).
setScale
(
6
,
BigDecimal
.
ROUND_HALF_UP
);
update
.
setWriteOffProportion
(
proportion
);
update
.
setState
(
ReceiptStatusEnum
.
WRITE_OFF_ALL_ING
.
getValue
());
update
.
setBmpId
(
bpmId
);
...
...
@@ -926,8 +867,7 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
throw
exception
(
BMP_NOT
);
}
if
(
receiptDO
.
getBmpStatus
()
!=
BpmProcessInstanceResultEnum
.
PROCESS
.
getResult
())
{
if
(
receiptDO
.
getBmpStatus
()
!=
BpmProcessInstanceResultEnum
.
PROCESS
.
getResult
())
{
throw
exception
(
BMP_CANCEL
);
}
...
...
@@ -938,4 +878,80 @@ public class ReceiptServiceImpl extends AbstractService<ReceiptMapper, ReceiptDO
public
ReceiptExportDto
getReceiptExportByOrderId
(
Long
orderId
)
{
return
receiptMapper
.
getReceiptExportByOrderId
(
orderId
);
}
@Override
public
Boolean
judgingProportion
(
ReceiptDO
receiptDO
,
String
proportion
)
{
//判断收款单下的收款明细是不是全部核销
LambdaQueryWrapper
<
ReceiptItemDO
>
lambdaQueryWrapper
=
new
LambdaQueryWrapper
<>();
lambdaQueryWrapper
.
eq
(
ReceiptItemDO:
:
getReceiptId
,
receiptDO
.
getId
());
lambdaQueryWrapper
.
in
(
ReceiptItemDO:
:
getStatus
,
0
,
2
,
3
);
Long
count
=
receiptItemMapper
.
selectCount
(
lambdaQueryWrapper
);
if
(
count
!=
0
)
{
return
Boolean
.
FALSE
;
}
LambdaQueryWrapper
<
ReceiptItemDO
>
lambdaQueryWrapper1
=
new
LambdaQueryWrapper
<>();
lambdaQueryWrapper1
.
eq
(
ReceiptItemDO:
:
getReceiptId
,
receiptDO
.
getId
());
lambdaQueryWrapper1
.
eq
(
ReceiptItemDO:
:
getStatus
,
1
);
List
<
ReceiptItemDO
>
receiptItemDOList
=
receiptItemMapper
.
selectList
(
lambdaQueryWrapper1
);
if
(
null
==
receiptItemDOList
||
receiptItemDOList
.
size
()
==
0
)
{
return
Boolean
.
FALSE
;
}
BigDecimal
totalAmount
=
receiptItemDOList
.
stream
().
map
(
ReceiptItemDO:
:
getWriteOffAmount
).
reduce
(
BigDecimal
.
ZERO
,
BigDecimal:
:
add
);
Long
currencyId
=
receiptDO
.
getCurrencyId
();
if
(
null
==
currencyId
)
{
log
.
error
(
"自动核销判断核销币种为空"
);
return
Boolean
.
FALSE
;
}
//计算出实际收款比例
BigDecimal
sjbl
=
NumberUtil
.
div
(
totalAmount
,
receiptDO
.
getReceivableTotalAmount
()).
multiply
(
new
BigDecimal
(
"100"
));
//实际收款比例大于规定阀值时,反回可以自己动核销
if
(
sjbl
.
compareTo
(
new
BigDecimal
(
proportion
))
>=
0
)
{
return
Boolean
.
TRUE
;
}
return
Boolean
.
FALSE
;
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
autoWriteOffReceipt
(
ReceiptDO
receiptDO
,
String
userId
,
String
userName
)
{
ReceiptDO
updateReceipt
=
new
ReceiptDO
();
// 添加订单ID的修改,不然订单ID就丢失了
updateReceipt
.
setOrderId
(
receiptDO
.
getOrderId
());
updateReceipt
.
setId
(
receiptDO
.
getId
());
//需要根据是否要开票变成已核销,还是已核销待开票
if
(
receiptDO
.
getOpenInvoice
()
==
0
)
{
updateReceipt
.
setState
(
ReceiptStatusEnum
.
WRITE_OFF_ALL_SUCCESS
.
getValue
());
}
if
(
receiptDO
.
getOpenInvoice
()
==
1
)
{
updateReceipt
.
setState
(
ReceiptStatusEnum
.
WRITE_OFF_ALL_OPENING
.
getValue
());
}
updateReceipt
.
setWriteOffAt
(
new
Date
());
updateReceipt
.
setWriteOffProportion
(
new
BigDecimal
(
"100"
));
//设置核销比例
updateReceipt
.
setRemark
(
"自动核销,核销比例>=100%"
);
updateReceipt
.
setWriteOffId
(
Long
.
parseLong
(
userId
));
updateReceipt
.
setWriteOffName
(
userName
);
receiptMapper
.
updateById
(
updateReceipt
);
//更新收该收款单下的应收为收款完成状态
LambdaUpdateWrapper
<
ReceivableDO
>
lambdaUpdateWrapper
=
new
LambdaUpdateWrapper
();
lambdaUpdateWrapper
.
eq
(
ReceivableDO:
:
getReceiptId
,
receiptDO
.
getId
());
lambdaUpdateWrapper
.
set
(
ReceivableDO:
:
getState
,
2
);
receivableService
.
update
(
lambdaUpdateWrapper
);
//添加订单核销日志
LambdaQueryWrapper
<
ReceivableDO
>
lambdaQueryWrapper
=
new
LambdaQueryWrapper
<>();
lambdaQueryWrapper
.
eq
(
ReceivableDO:
:
getReceiptId
,
receiptDO
.
getId
());
List
<
ReceivableDO
>
orderList
=
receivableService
.
list
(
lambdaQueryWrapper
);
List
orderIds
=
orderList
.
stream
().
map
(
ReceivableDO:
:
getOrderId
).
distinct
().
collect
(
Collectors
.
toList
());
receivableService
.
orderReceivableWriteOffLogAdd
(
orderIds
,
receiptDO
.
getReceiptNo
());
}
}
yudao-module-wealth/yudao-module-wealth-rest/src/main/java/cn/iocoder/yudao/module/wealth/controller/admin/job/ReceiptAutoWriteOff.java
0 → 100644
View file @
3d68dd86
package
cn
.
iocoder
.
yudao
.
module
.
wealth
.
controller
.
admin
.
job
;
import
cn.hutool.core.util.StrUtil
;
import
cn.iocoder.yudao.framework.quartz.core.handler.JobHandler
;
import
cn.iocoder.yudao.framework.tenant.core.job.TenantJob
;
import
cn.iocoder.yudao.module.system.api.user.AdminUserApi
;
import
cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO
;
import
cn.iocoder.yudao.module.wealth.dal.dataobject.receipt.ReceiptDO
;
import
cn.iocoder.yudao.module.wealth.enums.ReceiptStatusEnum
;
import
cn.iocoder.yudao.module.wealth.service.receipt.ReceiptService
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
import
java.util.List
;
/**
* 收款单自动核销任务
*/
@Component
@TenantJob
@Slf4j
public
class
ReceiptAutoWriteOff
implements
JobHandler
{
@Resource
ReceiptService
receiptService
;
@Resource
AdminUserApi
adminUserApi
;
@Override
public
String
execute
(
String
param
)
throws
Exception
{
if
(
StrUtil
.
isBlank
(
param
))
{
log
.
error
(
"自动核销比例未配置,自动退出"
);
return
""
;
}
String
[]
paramArray
=
param
.
split
(
","
);
if
(
paramArray
.
length
!=
2
||
StrUtil
.
isBlank
(
paramArray
[
0
])
||
StrUtil
.
isBlank
(
paramArray
[
1
]))
{
log
.
error
(
"自动核销比例JOB参数错误,自动退出"
);
return
""
;
}
AdminUserRespDTO
adminUserRespDTO
=
adminUserApi
.
getUser
(
Long
.
parseLong
(
paramArray
[
1
]));
if
(
null
==
adminUserRespDTO
)
{
log
.
error
(
"自动核销比例JOB参数错误,核销人配置错误,自动退出"
);
return
""
;
}
//查询所有收款单状态为待核销的
LambdaQueryWrapper
<
ReceiptDO
>
lambdaQueryWrapper
=
new
LambdaQueryWrapper
<>();
lambdaQueryWrapper
.
and
(
i
->
i
.
eq
(
ReceiptDO:
:
getState
,
ReceiptStatusEnum
.
WRITE_OFF_WAITING
.
getValue
()).
or
().
eq
(
ReceiptDO:
:
getState
,
ReceiptStatusEnum
.
WRITE_OFF_PART_ING
.
getValue
()));
List
<
ReceiptDO
>
receiptDOList
=
receiptService
.
selectList
(
lambdaQueryWrapper
);
for
(
ReceiptDO
receiptDO
:
receiptDOList
)
{
try
{
//判断当前收款单下的收款明细是不是全部是已核销并且核销比例要大于配置(params)
Boolean
result
=
receiptService
.
judgingProportion
(
receiptDO
,
paramArray
[
0
]);
if
(
result
)
{
receiptService
.
autoWriteOffReceipt
(
receiptDO
,
paramArray
[
1
],
adminUserRespDTO
.
getNickname
());
}
}
catch
(
Exception
e
)
{
log
.
error
(
"收款单{}自动核销出错原因:{}"
,
receiptDO
.
getReceiptNo
(),
e
.
getMessage
());
}
}
return
""
;
}
}
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