Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
F
fit-finance
Overview
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
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
fitness-server
fit-finance
Commits
a7604f96
Commit
a7604f96
authored
Apr 07, 2024
by
程裕兵
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat:settle
parent
0bcc5c10
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
247 additions
and
61 deletions
+247
-61
app/pom.xml
+0
-4
app/src/main/java/com/jiejing/fitness/finance/app/controller/task/FitFinanceTaskController.java
+0
-2
repository/src/main/java/com/jiejing/fitness/finance/repository/entity/StudioCheckSettleRecord.java
+8
-16
repository/src/main/java/com/jiejing/fitness/finance/repository/entity/StudioSettleRecord.java
+27
-21
repository/src/main/java/com/jiejing/fitness/finance/repository/mapper/StudioCashierRecordMapper.java
+5
-0
repository/src/main/java/com/jiejing/fitness/finance/repository/mapper/StudioCashierRecordMapper.xml
+12
-1
repository/src/main/java/com/jiejing/fitness/finance/repository/mapper/StudioSettleRecordMapper.xml
+1
-1
repository/src/main/java/com/jiejing/fitness/finance/repository/service/PartyToMerchantRpService.java
+7
-0
repository/src/main/java/com/jiejing/fitness/finance/repository/service/StudioCashierRecordRpService.java
+26
-1
repository/src/main/java/com/jiejing/fitness/finance/repository/service/StudioSettleRecordRpService.java
+1
-0
repository/src/test/java/com/jiejing/fitness/finance/repository/GeneratorServiceEntity.java
+2
-2
service/pom.xml
+4
-0
service/src/main/java/com/jiejing/fitness/finance/service/pay/convert/PayConvert.java
+41
-0
service/src/main/java/com/jiejing/fitness/finance/service/pay/impl/PayServiceImpl.java
+69
-12
service/src/main/java/com/jiejing/fitness/finance/service/rpc/PayRpcService.java
+4
-1
service/src/main/java/com/jiejing/fitness/finance/service/utils/DingUtil.java
+40
-0
No files found.
app/pom.xml
View file @
a7604f96
...
@@ -27,10 +27,6 @@
...
@@ -27,10 +27,6 @@
<groupId>
com.alibaba
</groupId>
<groupId>
com.alibaba
</groupId>
<artifactId>
fastjson
</artifactId>
<artifactId>
fastjson
</artifactId>
</dependency>
</dependency>
<dependency>
<groupId>
com.jiejing.common
</groupId>
<artifactId>
ding-client
</artifactId>
</dependency>
<dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<groupId>
org.springframework.boot
</groupId>
...
...
app/src/main/java/com/jiejing/fitness/finance/app/controller/task/FitFinanceTaskController.java
View file @
a7604f96
...
@@ -4,7 +4,6 @@ import com.jiejing.common.model.JsonResult;
...
@@ -4,7 +4,6 @@ import com.jiejing.common.model.JsonResult;
import
com.jiejing.fitness.finance.api.task.FitFinanceTaskApi
;
import
com.jiejing.fitness.finance.api.task.FitFinanceTaskApi
;
import
com.jiejing.fitness.finance.api.task.request.CheckSettleRequest
;
import
com.jiejing.fitness.finance.api.task.request.CheckSettleRequest
;
import
com.jiejing.fitness.finance.service.pay.PayService
;
import
com.jiejing.fitness.finance.service.pay.PayService
;
import
feign.hystrix.FallbackFactory
;
import
io.swagger.annotations.ApiOperation
;
import
io.swagger.annotations.ApiOperation
;
import
javax.annotation.Resource
;
import
javax.annotation.Resource
;
import
javax.validation.Valid
;
import
javax.validation.Valid
;
...
@@ -22,7 +21,6 @@ public class FitFinanceTaskController implements FitFinanceTaskApi {
...
@@ -22,7 +21,6 @@ public class FitFinanceTaskController implements FitFinanceTaskApi {
@Resource
@Resource
private
PayService
payService
;
private
PayService
payService
;
@ApiOperation
(
value
=
"对账"
,
tags
=
{
TAG
})
@ApiOperation
(
value
=
"对账"
,
tags
=
{
TAG
})
@PostMapping
(
value
=
"/private/task/checkSettle"
)
@PostMapping
(
value
=
"/private/task/checkSettle"
)
@Override
@Override
...
...
repository/src/main/java/com/jiejing/fitness/finance/repository/entity/StudioCheckSettleRecord.java
View file @
a7604f96
...
@@ -41,50 +41,42 @@ public class StudioCheckSettleRecord implements Serializable {
...
@@ -41,50 +41,42 @@ public class StudioCheckSettleRecord implements Serializable {
private
static
final
long
serialVersionUID
=
-
3981429835869732959L
;
private
static
final
long
serialVersionUID
=
-
3981429835869732959L
;
/**
/**
* 备注: 主键
* 备注: 主键 是否允许为null: YES
* 是否允许为null: YES
*/
*/
private
Long
id
;
private
Long
id
;
/**
/**
* 备注: 商户ID
* 备注: 商户ID 是否允许为null: YES
* 是否允许为null: YES
*/
*/
private
Long
merchantId
;
private
Long
merchantId
;
/**
/**
* 备注: 商户号
* 备注: 商户号 是否允许为null: YES
* 是否允许为null: YES
*/
*/
private
String
merchantNo
;
private
String
merchantNo
;
/**
/**
* 备注: 对账状态
* 备注: 对账状态 是否允许为null: YES
* 是否允许为null: YES
*/
*/
private
String
checkState
;
private
String
checkState
;
/**
/**
* 备注: 对账失败原因
* 备注: 对账失败原因 是否允许为null: YES
* 是否允许为null: YES
*/
*/
private
String
failMsg
;
private
String
failMsg
;
/**
/**
* 备注: 对账日期
* 备注: 对账日期 是否允许为null: YES
* 是否允许为null: YES
*/
*/
private
Date
settleDate
;
private
Date
settleDate
;
/**
/**
* 备注: 创建时间
* 备注: 创建时间 是否允许为null: YES
* 是否允许为null: YES
*/
*/
private
Date
createTime
;
private
Date
createTime
;
/**
/**
* 备注: 更新时间
* 备注: 更新时间 是否允许为null: YES
* 是否允许为null: YES
*/
*/
private
Date
updateTime
;
private
Date
updateTime
;
...
...
repository/src/main/java/com/jiejing/fitness/finance/repository/entity/StudioSettleRecord.java
View file @
a7604f96
...
@@ -39,66 +39,68 @@ import lombok.NoArgsConstructor;
...
@@ -39,66 +39,68 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor
@AllArgsConstructor
public
class
StudioSettleRecord
implements
Serializable
{
public
class
StudioSettleRecord
implements
Serializable
{
private
static
final
long
serialVersionUID
=
-
1566792034500029034
L
;
private
static
final
long
serialVersionUID
=
-
6892499742826838298
L
;
/**
/**
* 备注: 主键
* 备注: 主键 是否允许为null: NO
* 是否允许为null: NO
*/
*/
@TableId
(
value
=
"id"
,
type
=
IdType
.
ID_WORKER
)
@TableId
(
value
=
"id"
,
type
=
IdType
.
ID_WORKER
)
private
Long
id
;
private
Long
id
;
/**
/**
* 备注: 场馆ID
* 备注: 场馆ID 是否允许为null: YES
* 是否允许为null: YES
*/
*/
private
Long
studioId
;
private
Long
studioId
;
/**
/**
* 备注: 商户ID
* 备注: 商户ID 是否允许为null: YES
* 是否允许为null: YES
*/
*/
private
Long
merchantId
;
private
Long
merchantId
;
/**
/**
* 备注: 商户号
* 备注: 商户号 是否允许为null: YES
* 是否允许为null: YES
*/
*/
private
String
merchantNo
;
private
String
merchantNo
;
/**
/**
* 备注: 状态
* 备注: 状态 是否允许为null: YES
* 是否允许为null: YES
*
* @see com.jiejing.paycenter.common.enums.common.TransStateEnums
*/
*/
private
String
transState
;
private
String
transState
;
/**
/**
* 备注: 结算金额(元)
* 备注: 结算金额(元) 是否允许为null: YES
* 是否允许为null: YES
*/
*/
private
BigDecimal
transAmount
;
private
BigDecimal
transAmount
;
/**
/**
* 备注: 结算银行卡号
* 备注: 结算银行卡号 是否允许为null: YES
* 是否允许为null: YES
*/
*/
private
String
cardNo
;
private
String
cardNo
;
/**
/**
* 备注: 结算日期
* 备注: 结算银行 是否允许为null: YES
* 是否允许为null: YES
*/
private
String
bankName
;
/**
* 备注: 盐 是否允许为null: YES
*/
private
String
salt
;
/**
* 备注: 结算日期 是否允许为null: YES
*/
*/
private
Date
settleDate
;
private
Date
settleDate
;
/**
/**
* 备注: 创建时间
* 备注: 创建时间 是否允许为null: YES
* 是否允许为null: YES
*/
*/
private
Date
createTime
;
private
Date
createTime
;
/**
/**
* 备注: 更新时间
* 备注: 更新时间 是否允许为null: YES
* 是否允许为null: YES
*/
*/
private
Date
updateTime
;
private
Date
updateTime
;
...
@@ -117,6 +119,10 @@ public class StudioSettleRecord implements Serializable {
...
@@ -117,6 +119,10 @@ public class StudioSettleRecord implements Serializable {
public
static
final
String
CARD_NO
=
"card_no"
;
public
static
final
String
CARD_NO
=
"card_no"
;
public
static
final
String
BANK_NAME
=
"bank_name"
;
public
static
final
String
SALT
=
"salt"
;
public
static
final
String
SETTLE_DATE
=
"settle_date"
;
public
static
final
String
SETTLE_DATE
=
"settle_date"
;
public
static
final
String
CREATE_TIME
=
"create_time"
;
public
static
final
String
CREATE_TIME
=
"create_time"
;
...
...
repository/src/main/java/com/jiejing/fitness/finance/repository/mapper/StudioCashierRecordMapper.java
View file @
a7604f96
...
@@ -18,6 +18,7 @@ import com.jiejing.fitness.finance.repository.entity.StudioCashierRecord;
...
@@ -18,6 +18,7 @@ import com.jiejing.fitness.finance.repository.entity.StudioCashierRecord;
import
com.jiejing.mbp.inject.XBaseMapper
;
import
com.jiejing.mbp.inject.XBaseMapper
;
import
java.math.BigDecimal
;
import
java.math.BigDecimal
;
import
java.util.Date
;
import
java.util.Date
;
import
java.util.List
;
import
org.apache.ibatis.annotations.Param
;
import
org.apache.ibatis.annotations.Param
;
/**
/**
...
@@ -34,4 +35,8 @@ public interface StudioCashierRecordMapper extends XBaseMapper<StudioCashierReco
...
@@ -34,4 +35,8 @@ public interface StudioCashierRecordMapper extends XBaseMapper<StudioCashierReco
BigDecimal
sumMerchantPaySuccess
(
@Param
(
"merchantId"
)
Long
merchantId
,
BigDecimal
sumMerchantPaySuccess
(
@Param
(
"merchantId"
)
Long
merchantId
,
@Param
(
"startTime"
)
Date
startTime
,
@Param
(
"endTime"
)
Date
endTime
);
@Param
(
"startTime"
)
Date
startTime
,
@Param
(
"endTime"
)
Date
endTime
);
List
<
StudioCashierRecord
>
sumMerchantPaySuccessGroupByStudioId
(
@Param
(
"merchantId"
)
Long
merchantId
,
@Param
(
"startTime"
)
Date
startTime
,
@Param
(
"endTime"
)
Date
endTime
);
}
}
repository/src/main/java/com/jiejing/fitness/finance/repository/mapper/StudioCashierRecordMapper.xml
View file @
a7604f96
...
@@ -31,9 +31,20 @@
...
@@ -31,9 +31,20 @@
select sum(trans_amount)
select sum(trans_amount)
from studio_cashier_record
from studio_cashier_record
where merchant_id = #{merchantId}
where merchant_id = #{merchantId}
and trans_state
in ('PAY_SUCCESS', 'PAY_IN')
and trans_state
= 'PAY_SUCCESS'
and success_time >= #{startTime}
and success_time >= #{startTime}
and success_time
<
#{endTime}
and success_time
<
#{endTime}
</select>
</select>
<select
id=
"sumMerchantPaySuccessGroupByStudioId"
resultType=
"com.jiejing.fitness.finance.repository.entity.StudioCashierRecord"
>
select studio_id, sum(trans_amount) as trans_amount
from studio_cashier_record
where merchant_id = #{merchantId}
and trans_state = 'PAY_SUCCESS'
and success_time >= #{startTime}
and success_time
<
#{endTime}
group by studio_id
</select>
</mapper>
</mapper>
repository/src/main/java/com/jiejing/fitness/finance/repository/mapper/StudioSettleRecordMapper.xml
View file @
a7604f96
...
@@ -17,7 +17,7 @@
...
@@ -17,7 +17,7 @@
<!-- 通用查询结果列 -->
<!-- 通用查询结果列 -->
<sql
id=
"Base_Column_List"
>
<sql
id=
"Base_Column_List"
>
id, studio_id, merchant_id, merchant_no, trans_state, trans_amount, card_no, settle_date, create_time, update_time
id, studio_id, merchant_id, merchant_no, trans_state, trans_amount, card_no,
bank_name, salt,
settle_date, create_time, update_time
</sql>
</sql>
</mapper>
</mapper>
repository/src/main/java/com/jiejing/fitness/finance/repository/service/PartyToMerchantRpService.java
View file @
a7604f96
...
@@ -83,4 +83,11 @@ public class PartyToMerchantRpService extends
...
@@ -83,4 +83,11 @@ public class PartyToMerchantRpService extends
wrapper
.
eq
(
PartyToMerchant
.
PARTY_TYPE
,
partyType
);
wrapper
.
eq
(
PartyToMerchant
.
PARTY_TYPE
,
partyType
);
return
this
.
baseMapper
.
selectList
(
wrapper
);
return
this
.
baseMapper
.
selectList
(
wrapper
);
}
}
public
List
<
PartyToMerchant
>
listByMerchantIdAndPartyType
(
Long
merchantId
,
PartyTypeEnum
partyType
)
{
QueryWrapper
<
PartyToMerchant
>
wrapper
=
new
QueryWrapper
<>();
wrapper
.
eq
(
PartyToMerchant
.
MERCHANT_ID
,
merchantId
);
wrapper
.
eq
(
PartyToMerchant
.
PARTY_TYPE
,
partyType
);
return
this
.
baseMapper
.
selectList
(
wrapper
);
}
}
}
repository/src/main/java/com/jiejing/fitness/finance/repository/service/StudioCashierRecordRpService.java
View file @
a7604f96
...
@@ -15,14 +15,20 @@
...
@@ -15,14 +15,20 @@
package
com
.
jiejing
.
fitness
.
finance
.
repository
.
service
;
package
com
.
jiejing
.
fitness
.
finance
.
repository
.
service
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.jiejing.common.utils.collection.CollectionUtil
;
import
com.jiejing.common.utils.text.StringUtil
;
import
com.jiejing.common.utils.text.StringUtil
;
import
com.jiejing.fitness.finance.repository.entity.StudioCashierRecord
;
import
com.jiejing.fitness.finance.repository.entity.StudioCashierRecord
;
import
com.jiejing.fitness.finance.repository.mapper.StudioCashierRecordMapper
;
import
com.jiejing.fitness.finance.repository.mapper.StudioCashierRecordMapper
;
import
com.jiejing.fitness.finance.repository.query.PageBrandCashierRecordQuery
;
import
com.jiejing.fitness.finance.repository.query.PageBrandCashierRecordQuery
;
import
com.jiejing.mbp.MapperRepoService
;
import
com.jiejing.mbp.MapperRepoService
;
import
java.math.BigDecimal
;
import
java.math.BigDecimal
;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Optional
;
import
java.util.stream.Collectors
;
import
org.springframework.data.domain.Page
;
import
org.springframework.data.domain.Page
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
...
@@ -101,6 +107,25 @@ public class StudioCashierRecordRpService extends
...
@@ -101,6 +107,25 @@ public class StudioCashierRecordRpService extends
}
}
public
BigDecimal
sumMerchantPaySuccess
(
Long
merchantId
,
Date
startTime
,
Date
endTime
)
{
public
BigDecimal
sumMerchantPaySuccess
(
Long
merchantId
,
Date
startTime
,
Date
endTime
)
{
return
this
.
baseMapper
.
sumMerchantPaySuccess
(
merchantId
,
startTime
,
endTime
);
return
Optional
.
ofNullable
(
this
.
baseMapper
.
sumMerchantPaySuccess
(
merchantId
,
startTime
,
endTime
))
.
orElse
(
BigDecimal
.
ZERO
);
}
public
Map
<
Long
,
BigDecimal
>
sumMerchantPaySuccessGroupByStudioId
(
Long
merchantId
,
Date
startTime
,
Date
endTime
)
{
return
Optional
.
ofNullable
(
this
.
baseMapper
.
sumMerchantPaySuccessGroupByStudioId
(
merchantId
,
startTime
,
endTime
))
.
orElse
(
new
ArrayList
<>(
1
))
.
stream
()
.
collect
(
Collectors
.
toMap
(
StudioCashierRecord:
:
getStudioId
,
StudioCashierRecord:
:
getActualAmount
));
}
public
Page
<
StudioCashierRecord
>
pageMerchantPaySuccess
(
Long
merchantId
,
Date
startTime
,
Date
endTime
,
Integer
current
,
Integer
size
)
{
QueryWrapper
<
StudioCashierRecord
>
wrapper
=
new
QueryWrapper
<>();
wrapper
.
eq
(
StudioCashierRecord
.
MERCHANT_ID
,
merchantId
);
wrapper
.
ge
(
StudioCashierRecord
.
SUCCESS_TIME
,
startTime
);
wrapper
.
lt
(
StudioCashierRecord
.
SUCCESS_TIME
,
endTime
);
return
this
.
findByWrapperPage
(
wrapper
,
current
,
size
);
}
}
}
}
repository/src/main/java/com/jiejing/fitness/finance/repository/service/StudioSettleRecordRpService.java
View file @
a7604f96
...
@@ -41,6 +41,7 @@ public class StudioSettleRecordRpService extends
...
@@ -41,6 +41,7 @@ public class StudioSettleRecordRpService extends
wrapper
.
eq
(
StudioSettleRecord
.
MERCHANT_ID
,
merchantId
);
wrapper
.
eq
(
StudioSettleRecord
.
MERCHANT_ID
,
merchantId
);
wrapper
.
eq
(
StudioSettleRecord
.
SETTLE_DATE
,
settleDate
);
wrapper
.
eq
(
StudioSettleRecord
.
SETTLE_DATE
,
settleDate
);
wrapper
.
eq
(
StudioSettleRecord
.
TRANS_STATE
,
TransStateEnums
.
SUCCESS
.
getCode
());
wrapper
.
eq
(
StudioSettleRecord
.
TRANS_STATE
,
TransStateEnums
.
SUCCESS
.
getCode
());
wrapper
.
orderByDesc
(
StudioSettleRecord
.
ID
);
List
<
StudioSettleRecord
>
list
=
this
.
baseMapper
.
selectList
(
wrapper
);
List
<
StudioSettleRecord
>
list
=
this
.
baseMapper
.
selectList
(
wrapper
);
return
Optional
.
ofNullable
(
list
).
orElse
(
new
ArrayList
<>()).
stream
().
findFirst
().
orElse
(
null
);
return
Optional
.
ofNullable
(
list
).
orElse
(
new
ArrayList
<>()).
stream
().
findFirst
().
orElse
(
null
);
}
}
...
...
repository/src/test/java/com/jiejing/fitness/finance/repository/GeneratorServiceEntity.java
View file @
a7604f96
...
@@ -57,8 +57,8 @@ public class GeneratorServiceEntity {
...
@@ -57,8 +57,8 @@ public class GeneratorServiceEntity {
// "brand_cashier_record"
// "brand_cashier_record"
// "bank",
// "bank",
// "branch_bank",
// "branch_bank",
//
"studio_settle_record",
"studio_settle_record"
,
"studio_check_settle_record"
//
"studio_check_settle_record"
};
};
/**
/**
...
...
service/pom.xml
View file @
a7604f96
...
@@ -65,6 +65,10 @@
...
@@ -65,6 +65,10 @@
<artifactId>
spring-cloud-starter-openfeign
</artifactId>
<artifactId>
spring-cloud-starter-openfeign
</artifactId>
</dependency>
</dependency>
<dependency>
<groupId>
com.jiejing.common
</groupId>
<artifactId>
ding-client
</artifactId>
</dependency>
</dependencies>
</dependencies>
</project>
</project>
service/src/main/java/com/jiejing/fitness/finance/service/pay/convert/PayConvert.java
View file @
a7604f96
...
@@ -5,16 +5,22 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker;
...
@@ -5,16 +5,22 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Lists
;
import
com.jiejing.common.exception.BizException
;
import
com.jiejing.common.exception.BizException
;
import
com.jiejing.common.utils.convert.BeanUtil
;
import
com.jiejing.common.utils.convert.BeanUtil
;
import
com.jiejing.common.utils.crypt.AesUtil
;
import
com.jiejing.common.utils.text.StringUtil
;
import
com.jiejing.common.utils.text.StringUtil
;
import
com.jiejing.fitness.enums.finance.BrandCashierTransStateEnum
;
import
com.jiejing.fitness.enums.finance.BrandCashierTransStateEnum
;
import
com.jiejing.fitness.enums.finance.BrandCashierTransTypeEnum
;
import
com.jiejing.fitness.enums.finance.BrandCashierTransTypeEnum
;
import
com.jiejing.fitness.finance.repository.entity.PartyToMerchant
;
import
com.jiejing.fitness.finance.repository.entity.StudioCashierRecord
;
import
com.jiejing.fitness.finance.repository.entity.StudioCashierRecord
;
import
com.jiejing.fitness.finance.repository.entity.StudioCheckSettleRecord
;
import
com.jiejing.fitness.finance.repository.entity.StudioMerchantApply
;
import
com.jiejing.fitness.finance.repository.entity.StudioSettleRecord
;
import
com.jiejing.fitness.finance.service.enums.FinanceErrorEnums
;
import
com.jiejing.fitness.finance.service.enums.FinanceErrorEnums
;
import
com.jiejing.fitness.finance.service.pay.params.BrandMerchantRefundParams
;
import
com.jiejing.fitness.finance.service.pay.params.BrandMerchantRefundParams
;
import
com.jiejing.fitness.finance.service.pay.params.StudioMerchantPayParams
;
import
com.jiejing.fitness.finance.service.pay.params.StudioMerchantPayParams
;
import
com.jiejing.fitness.finance.service.utils.FeeUtil
;
import
com.jiejing.fitness.finance.service.utils.FeeUtil
;
import
com.jiejing.fitness.finance.service.utils.MoneyUtil
;
import
com.jiejing.fitness.finance.service.utils.MoneyUtil
;
import
com.jiejing.paycenter.common.model.vo.MerchantVO
;
import
com.jiejing.paycenter.common.model.vo.MerchantVO
;
import
com.jiejing.paycenter.common.model.vo.SettleVO
;
import
com.jiejing.paycenter.common.model.vo.SubChannelVO
;
import
com.jiejing.paycenter.common.model.vo.SubChannelVO
;
import
com.jiejing.paycenter.api.pay.request.PayRequest
;
import
com.jiejing.paycenter.api.pay.request.PayRequest
;
import
com.jiejing.paycenter.api.pay.request.RefundPayRequest
;
import
com.jiejing.paycenter.api.pay.request.RefundPayRequest
;
...
@@ -31,7 +37,9 @@ import java.math.BigDecimal;
...
@@ -31,7 +37,9 @@ import java.math.BigDecimal;
import
java.math.RoundingMode
;
import
java.math.RoundingMode
;
import
java.util.Date
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Optional
;
import
java.util.Optional
;
import
java.util.stream.Collectors
;
/**
/**
* @author chengyubing
* @author chengyubing
...
@@ -227,4 +235,37 @@ public class PayConvert {
...
@@ -227,4 +235,37 @@ public class PayConvert {
.
build
();
.
build
();
}
}
public
static
List
<
StudioSettleRecord
>
convertSettle
(
StudioMerchantApply
apply
,
Map
<
Long
,
BigDecimal
>
studioTransAmountMap
,
SettleVO
vo
)
{
String
salt
=
AesUtil
.
getSalt
(
8
);
Date
now
=
new
Date
();
return
studioTransAmountMap
.
keySet
().
stream
().
map
(
studioId
->
StudioSettleRecord
.
builder
()
.
id
(
IdWorker
.
getId
())
.
studioId
(
studioId
)
.
merchantId
(
apply
.
getMerchantId
())
.
merchantNo
(
apply
.
getMerchantNo
())
.
transState
(
vo
.
getTransState
())
.
transAmount
(
studioTransAmountMap
.
getOrDefault
(
studioId
,
BigDecimal
.
ZERO
))
.
settleDate
(
vo
.
getTransDate
())
.
cardNo
(
AesUtil
.
encrypt
(
vo
.
getCardNo
(),
salt
))
.
bankName
(
vo
.
getBankName
())
.
salt
(
salt
)
.
createTime
(
now
)
.
updateTime
(
now
)
.
build
()).
collect
(
Collectors
.
toList
());
}
public
static
StudioCheckSettleRecord
convertCheckSettle
(
StudioMerchantApply
apply
,
SettleVO
vo
,
BigDecimal
totalAmount
)
{
return
StudioCheckSettleRecord
.
builder
()
.
id
(
IdWorker
.
getId
())
.
merchantId
(
apply
.
getMerchantId
())
.
merchantNo
(
apply
.
getMerchantNo
())
.
checkState
(
TransStateEnums
.
FAIL
.
getCode
())
.
failMsg
(
"对账失败,乐动收银入账中金额【"
+
totalAmount
+
"】,汇付结算金额【"
+
vo
.
getTransAmount
()
+
"】"
)
.
settleDate
(
vo
.
getTransDate
())
.
createTime
(
new
Date
())
.
updateTime
(
new
Date
())
.
build
();
}
}
}
service/src/main/java/com/jiejing/fitness/finance/service/pay/impl/PayServiceImpl.java
View file @
a7604f96
package
com
.
jiejing
.
fitness
.
finance
.
service
.
pay
.
impl
;
package
com
.
jiejing
.
fitness
.
finance
.
service
.
pay
.
impl
;
import
static
java
.
util
.
stream
.
Collectors
.
toList
;
import
com.jiejing.common.exception.BizException
;
import
com.jiejing.common.exception.BizException
;
import
com.jiejing.common.utils.collection.CollectionUtil
;
import
com.jiejing.common.utils.collection.CollectionUtil
;
import
com.jiejing.common.utils.time.TimeUtil
;
import
com.jiejing.common.utils.time.TimeUtil
;
import
com.jiejing.fitness.enums.finance.BrandCashierTransStateEnum
;
import
com.jiejing.fitness.enums.finance.BrandCashierTransStateEnum
;
import
com.jiejing.fitness.enums.finance.PartyTypeEnum
;
import
com.jiejing.fitness.finance.repository.entity.StudioCashierRecord
;
import
com.jiejing.fitness.finance.repository.entity.StudioCashierRecord
;
import
com.jiejing.fitness.finance.repository.entity.PartyToMerchant
;
import
com.jiejing.fitness.finance.repository.entity.PartyToMerchant
;
import
com.jiejing.fitness.finance.repository.entity.StudioCheckSettleRecord
;
import
com.jiejing.fitness.finance.repository.entity.StudioMerchantApply
;
import
com.jiejing.fitness.finance.repository.entity.StudioMerchantApply
;
import
com.jiejing.fitness.finance.repository.entity.StudioSettleRecord
;
import
com.jiejing.fitness.finance.repository.entity.StudioSettleRecord
;
import
com.jiejing.fitness.finance.repository.service.StudioCashierRecordRpService
;
import
com.jiejing.fitness.finance.repository.service.StudioCashierRecordRpService
;
import
com.jiejing.fitness.finance.repository.service.PartyToMerchantRpService
;
import
com.jiejing.fitness.finance.repository.service.PartyToMerchantRpService
;
import
com.jiejing.fitness.finance.repository.service.StudioCheckSettleRecordRpService
;
import
com.jiejing.fitness.finance.repository.service.StudioMerchantApplyRpService
;
import
com.jiejing.fitness.finance.repository.service.StudioMerchantApplyRpService
;
import
com.jiejing.fitness.finance.repository.service.StudioSettleRecordRpService
;
import
com.jiejing.fitness.finance.repository.service.StudioSettleRecordRpService
;
import
com.jiejing.fitness.finance.service.enums.FinanceErrorEnums
;
import
com.jiejing.fitness.finance.service.enums.FinanceErrorEnums
;
...
@@ -20,6 +25,7 @@ import com.jiejing.fitness.finance.service.pay.params.StudioMerchantPayParams;
...
@@ -20,6 +25,7 @@ import com.jiejing.fitness.finance.service.pay.params.StudioMerchantPayParams;
import
com.jiejing.fitness.finance.service.rpc.MerchantRpcService
;
import
com.jiejing.fitness.finance.service.rpc.MerchantRpcService
;
import
com.jiejing.fitness.finance.service.rpc.PayRpcService
;
import
com.jiejing.fitness.finance.service.rpc.PayRpcService
;
import
com.jiejing.fitness.finance.service.rpc.StudioRpcService
;
import
com.jiejing.fitness.finance.service.rpc.StudioRpcService
;
import
com.jiejing.fitness.finance.service.utils.DingUtil
;
import
com.jiejing.paycenter.common.enums.common.TransStateEnums
;
import
com.jiejing.paycenter.common.enums.common.TransStateEnums
;
import
com.jiejing.paycenter.common.model.vo.MerchantVO
;
import
com.jiejing.paycenter.common.model.vo.MerchantVO
;
import
com.jiejing.paycenter.api.pay.request.PayRequest
;
import
com.jiejing.paycenter.api.pay.request.PayRequest
;
...
@@ -34,6 +40,8 @@ import java.math.BigDecimal;
...
@@ -34,6 +40,8 @@ import java.math.BigDecimal;
import
java.time.temporal.ChronoUnit
;
import
java.time.temporal.ChronoUnit
;
import
java.util.Date
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.concurrent.atomic.AtomicInteger
;
import
java.util.function.Consumer
;
import
java.util.function.Consumer
;
import
javax.annotation.Resource
;
import
javax.annotation.Resource
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
...
@@ -73,6 +81,9 @@ public class PayServiceImpl implements PayService {
...
@@ -73,6 +81,9 @@ public class PayServiceImpl implements PayService {
@Resource
@Resource
private
StudioMerchantApplyRpService
studioMerchantApplyRpService
;
private
StudioMerchantApplyRpService
studioMerchantApplyRpService
;
@Resource
private
StudioCheckSettleRecordRpService
studioCheckSettleRecordRpService
;
@Override
@Override
public
PayVO
merchantPay
(
StudioMerchantPayParams
params
)
{
public
PayVO
merchantPay
(
StudioMerchantPayParams
params
)
{
StudioVO
studio
=
studioRpcService
.
getStudio
(
params
.
getStudioId
());
StudioVO
studio
=
studioRpcService
.
getStudio
(
params
.
getStudioId
());
...
@@ -137,6 +148,7 @@ public class PayServiceImpl implements PayService {
...
@@ -137,6 +148,7 @@ public class PayServiceImpl implements PayService {
public
void
checkSettle
(
Long
merchantId
,
Date
settleDate
)
{
public
void
checkSettle
(
Long
merchantId
,
Date
settleDate
)
{
Date
endDate
=
null
==
settleDate
?
TimeUtil
.
local
().
startOfDay
(
new
Date
())
:
settleDate
;
Date
endDate
=
null
==
settleDate
?
TimeUtil
.
local
().
startOfDay
(
new
Date
())
:
settleDate
;
Date
startDate
=
TimeUtil
.
local
().
plus
(
endDate
,
-
15
,
ChronoUnit
.
DAYS
);
Date
startDate
=
TimeUtil
.
local
().
plus
(
endDate
,
-
15
,
ChronoUnit
.
DAYS
);
AtomicInteger
failCount
=
new
AtomicInteger
(
0
);
this
.
pageAndConsumer
(
merchantId
,
200
,
apply
->
{
this
.
pageAndConsumer
(
merchantId
,
200
,
apply
->
{
StudioSettleRecord
exist
=
studioSettleRecordRpService
.
getByMerchantIdAndSettleDate
(
StudioSettleRecord
exist
=
studioSettleRecordRpService
.
getByMerchantIdAndSettleDate
(
apply
.
getMerchantId
(),
endDate
);
apply
.
getMerchantId
(),
endDate
);
...
@@ -144,21 +156,66 @@ public class PayServiceImpl implements PayService {
...
@@ -144,21 +156,66 @@ public class PayServiceImpl implements PayService {
return
;
return
;
}
}
SettleVO
vo
=
payRpcService
.
syncSettle
(
apply
.
getMerchantId
(),
endDate
);
SettleVO
vo
=
payRpcService
.
syncSettle
(
apply
.
getMerchantId
(),
endDate
);
// TODO 对账
// 对账
switch
(
TransStateEnums
.
getByCode
(
vo
.
getTransState
()))
{
BigDecimal
totalAmount
=
studioCashierRecordRpService
.
sumMerchantPaySuccess
(
apply
.
getMerchantId
(),
case
SUCCESS:
startDate
,
endDate
);
BigDecimal
totalAmount
=
studioCashierRecordRpService
.
sumMerchantPaySuccess
(
apply
.
getMerchantId
(),
if
(
BigDecimal
.
ZERO
.
compareTo
(
vo
.
getTransAmount
())
==
0
startDate
,
endDate
);
&&
BigDecimal
.
ZERO
.
compareTo
(
totalAmount
)
==
0
)
{
if
(
vo
.
getTransAmount
().
compareTo
(
totalAmount
)
!=
0
)
{
// 没有交易
return
;
}
}
if
(
vo
.
getTransAmount
().
compareTo
(
totalAmount
)
==
0
)
{
break
;
// 对账成功
case
FAIL:
Map
<
Long
,
BigDecimal
>
studioTransAmountMap
=
studioCashierRecordRpService
.
sumMerchantPaySuccessGroupByStudioId
(
break
;
apply
.
getMerchantId
(),
startDate
,
endDate
);
default
:
studioSettleRecordRpService
.
insertAll
(
PayConvert
.
convertSettle
(
apply
,
studioTransAmountMap
,
vo
));
break
;
if
(
TransStateEnums
.
SUCCESS
==
TransStateEnums
.
getByCode
(
vo
.
getTransState
()))
{
// 结算成功,则更新收银流水状态为记录为入账成功
this
.
updatePayIn
(
apply
.
getMerchantId
(),
startDate
,
endDate
);
}
}
else
{
// 对账失败
failCount
.
incrementAndGet
();
studioCheckSettleRecordRpService
.
insert
(
PayConvert
.
convertCheckSettle
(
apply
,
vo
,
totalAmount
));
}
}
});
});
// 钉钉消息
if
(
failCount
.
get
()
>
0
)
{
DingUtil
.
sendCheckSettleFail
(
failCount
.
get
());
}
else
{
DingUtil
.
sendCheckSettleSuccess
();
}
}
private
void
updatePayIn
(
Long
merchantId
,
Date
startTime
,
Date
endTime
)
{
Integer
current
=
0
;
Integer
size
=
500
;
do
{
Page
<
StudioCashierRecord
>
page
=
studioCashierRecordRpService
.
pageMerchantPaySuccess
(
merchantId
,
startTime
,
endTime
,
current
,
size
);
if
(
CollectionUtil
.
isEmpty
(
page
.
getContent
()))
{
break
;
}
try
{
List
<
Long
>
ids
=
page
.
getContent
().
stream
().
map
(
StudioCashierRecord:
:
getId
).
collect
(
toList
());
studioCashierRecordRpService
.
updateByIds
(
StudioCashierRecord
.
builder
().
transState
(
BrandCashierTransStateEnum
.
PAY_IN
.
getCode
())
.
inTime
(
endTime
)
.
updateTime
(
new
Date
()).
build
(),
ids
);
}
finally
{
current
++;
}
if
(!
page
.
hasNext
())
{
break
;
}
}
while
(
true
);
}
}
...
...
service/src/main/java/com/jiejing/fitness/finance/service/rpc/PayRpcService.java
View file @
a7604f96
...
@@ -10,7 +10,9 @@ import com.jiejing.paycenter.api.pay.vo.RefundVO;
...
@@ -10,7 +10,9 @@ import com.jiejing.paycenter.api.pay.vo.RefundVO;
import
com.jiejing.paycenter.common.enums.common.TransStateEnums
;
import
com.jiejing.paycenter.common.enums.common.TransStateEnums
;
import
com.jiejing.paycenter.common.enums.pay.PayStateEnums
;
import
com.jiejing.paycenter.common.enums.pay.PayStateEnums
;
import
com.jiejing.paycenter.common.model.vo.SettleVO
;
import
com.jiejing.paycenter.common.model.vo.SettleVO
;
import
java.math.BigDecimal
;
import
java.util.Date
;
import
java.util.Date
;
import
java.util.Optional
;
import
javax.annotation.Resource
;
import
javax.annotation.Resource
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
...
@@ -50,6 +52,7 @@ public class PayRpcService {
...
@@ -50,6 +52,7 @@ public class PayRpcService {
.
settleDate
(
settleDate
)
.
settleDate
(
settleDate
)
.
build
());
.
build
());
result
.
assertSuccess
();
result
.
assertSuccess
();
return
result
.
getResult
();
return
Optional
.
ofNullable
(
result
.
getResult
())
.
orElse
(
SettleVO
.
builder
().
transAmount
(
BigDecimal
.
ZERO
).
build
());
}
}
}
}
service/src/main/java/com/jiejing/fitness/finance/service/utils/DingUtil.java
0 → 100644
View file @
a7604f96
package
com
.
jiejing
.
fitness
.
finance
.
service
.
utils
;
import
com.jiejing.common.dingtalk.chatbot.DingtalkChatbotClient
;
import
com.jiejing.common.dingtalk.chatbot.message.MarkdownMessage
;
import
com.jiejing.common.dingtalk.chatbot.message.Message
;
import
com.jiejing.common.dingtalk.chatbot.message.TextMessage
;
import
java.io.IOException
;
import
lombok.extern.slf4j.Slf4j
;
/**
* @author chengyubing
* @since 2024/4/7 17:13
*/
@Slf4j
public
class
DingUtil
{
public
static
final
String
URL
=
"https://oapi.dingtalk.com/robot/send?access_token=1d52fb498b3d23687dec5aebf5907fb73acde3f29709fc672386d67451c9dfb7"
;
private
static
final
String
CHECK_SETTLE_SUCCESS
=
"【告警】【乐动收银自动结算记录对账】全部对账成功"
;
private
static
final
String
CHECK_SETTLE_FAIL
=
"【告警】【乐动收银自动结算记录对账】有%s家对账失败,请人工跟进"
;
public
static
void
sendCheckSettleFail
(
Integer
total
)
{
Message
message
=
new
TextMessage
(
String
.
format
(
CHECK_SETTLE_FAIL
,
total
));
try
{
DingtalkChatbotClient
.
send
(
URL
,
message
);
}
catch
(
IOException
e
)
{
log
.
error
(
"发送对账失败告警失败"
,
e
);
}
}
public
static
void
sendCheckSettleSuccess
()
{
Message
message
=
new
TextMessage
(
CHECK_SETTLE_SUCCESS
);
try
{
DingtalkChatbotClient
.
send
(
URL
,
message
);
}
catch
(
IOException
e
)
{
log
.
error
(
"发送对账成功告警失败"
,
e
);
}
}
}
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