Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
cash-loan-flow-boss
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
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
QG
cash-loan-flow-boss
Commits
27827bbd
Commit
27827bbd
authored
Sep 16, 2019
by
suntao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
service 使用接口 和 实现
parent
3c384ae6
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
1079 additions
and
986 deletions
+1079
-986
ChannelConfService.java
...hloanflowboss/api/channel/service/ChannelConfService.java
+5
-112
ChannelConfServiceImpl.java
...nflowboss/api/channel/service/ChannelConfServiceImpl.java
+127
-0
OptHistoryLogService.java
...loanflowboss/api/optlog/service/OptHistoryLogService.java
+5
-100
OptHistoryLogServiceImpl.java
...flowboss/api/optlog/service/OptHistoryLogServiceImpl.java
+116
-0
OrderController.java
...ashloanflowboss/api/order/controller/OrderController.java
+0
-1
OrderService.java
...roup/cashloanflowboss/api/order/service/OrderService.java
+18
-773
OrderServiceImpl.java
.../cashloanflowboss/api/order/service/OrderServiceImpl.java
+808
-0
No files found.
src/main/java/cn/quantgroup/cashloanflowboss/api/channel/service/ChannelConfService.java
View file @
27827bbd
package
cn
.
quantgroup
.
cashloanflowboss
.
api
.
channel
.
service
;
package
cn
.
quantgroup
.
cashloanflowboss
.
api
.
channel
.
service
;
import
java.sql.Timestamp
;
import
java.util.*
;
import
cn.quantgroup.cashloanflowboss.api.channel.entity.ChannelConf
;
import
cn.quantgroup.cashloanflowboss.api.channel.model.ChannelConfAddModel
;
import
cn.quantgroup.cashloanflowboss.api.channel.model.ChannelConfBaseModel
;
import
cn.quantgroup.cashloanflowboss.api.channel.model.ChannelConfVo
;
import
cn.quantgroup.cashloanflowboss.api.channel.model.ChannelConfVo
;
import
cn.quantgroup.cashloanflowboss.api.channel.model.ChannelListModel
;
import
cn.quantgroup.cashloanflowboss.api.channel.model.ChannelListModel
;
import
cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfCallbackConfiguration
;
import
cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfChannelConfiguration
;
import
cn.quantgroup.cashloanflowboss.api.channel.repository.ChannelConfRepository
;
import
cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderCallBack
;
import
cn.quantgroup.cashloanflowboss.spi.clf.model.KANoticeType
;
import
cn.quantgroup.cashloanflowboss.api.channel.util.ChannelConfUtil
;
import
cn.quantgroup.cashloanflowboss.spi.clf.service.CLFCenterService
;
import
cn.quantgroup.cashloanflowboss.utils.IgnorePropertiesUtil
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Page
;
import
org.springframework.data.domain.Page
;
import
org.springframework.stereotype.Service
;
/**
/**
* function:
* function:
* date: 2019/
8/2
* date: 2019/
9/16
*
*
* @author: suntao
* @author: suntao
*/
*/
public
interface
ChannelConfService
{
@Service
Page
<
ChannelListModel
>
getChannelInfo
(
Integer
pageNumber
,
Integer
pageSize
,
Long
channelId
);
public
class
ChannelConfService
{
@Autowired
ChannelConfVo
getChannelConf
(
Long
channelId
);
private
CLFCenterService
clfCenterService
;
@Autowired
Boolean
editChannelConfInfo
(
ChannelConfVo
confVo
);
private
ChannelConfRepository
channelConfRepository
;
public
Page
<
ChannelListModel
>
getChannelInfo
(
Integer
pageNumber
,
Integer
pageSize
,
Long
channelId
)
{
Page
<
ClfChannelConfiguration
>
page
=
clfCenterService
.
findChannelConfigurationByCriteriaQueryPage
(
pageNumber
,
pageSize
,
channelId
);
Page
<
ChannelListModel
>
channelListModelPage
=
page
.
map
(
it
->
{
ChannelListModel
channelListModel
=
new
ChannelListModel
();
channelListModel
.
setChannelId
(
it
.
getRegisteredFrom
());
channelListModel
.
setChannelName
(
it
.
getChannelName
());
channelListModel
.
setChannelCode
(
it
.
getChannelCode
());
channelListModel
.
setBizType
(
null
);
channelListModel
.
setCreatedAt
(
it
.
getCreatedAt
());
return
channelListModel
;
});
return
channelListModelPage
;
}
public
ChannelConfVo
getChannelConf
(
Long
channelId
)
{
ChannelConf
channelConf
=
channelConfRepository
.
getByChannelId
(
channelId
);
if
(
channelConf
!=
null
)
{
return
ChannelConfUtil
.
channelConfConvertVOModel
(
channelConf
);
}
else
{
// boss channel_conf 为空,从clf 查询数据
ClfChannelConfiguration
channelConfiguration
=
clfCenterService
.
findChannelConfigurationByChannelId
(
channelId
);
ClfOrderCallBack
approve
=
clfCenterService
.
findOrderCallBackByByCallbackStatusAndChannelId
(
KANoticeType
.
FUAD_ASSIFN_SUCC
.
name
(),
channelId
);
ClfOrderCallBack
orderStatus
=
clfCenterService
.
findOrderCallBackByByCallbackStatusAndChannelId
(
KANoticeType
.
FUND_SUCC
.
name
(),
channelId
);
ClfOrderCallBack
repaymentPlan
=
clfCenterService
.
findOrderCallBackByByCallbackStatusAndChannelId
(
KANoticeType
.
REPAYMENT
.
name
(),
channelId
);
return
ChannelConfUtil
.
getChannelConfVoByClf
(
channelConfiguration
,
approve
,
orderStatus
,
repaymentPlan
);
}
}
public
Boolean
editChannelConfInfo
(
ChannelConfVo
confVo
)
{
ChannelConfBaseModel
basicInfo
=
confVo
.
getBasicInfo
();
ChannelConfAddModel
addInfo
=
confVo
.
getAddInfo
();
ChannelConf
channelConf
=
ChannelConfUtil
.
voModelConfConvertChannelConf
(
confVo
);
ChannelConf
channelConfExsit
=
channelConfRepository
.
getByChannelId
(
basicInfo
.
getChannelId
());
// cash-loan-flow-boss 库
if
(
channelConfExsit
==
null
)
{
// 新保存
channelConf
.
setCreateTime
(
new
Date
());
channelConfRepository
.
save
(
channelConf
);
}
else
{
// 更新数据库 数据
BeanUtils
.
copyProperties
(
channelConf
,
channelConfExsit
,
IgnorePropertiesUtil
.
getNullPropertyNames
(
channelConf
));
channelConfExsit
.
setUpdateTime
(
new
Date
());
channelConfRepository
.
save
(
channelConfExsit
);
}
// clf 库
ClfChannelConfiguration
channelConfiguration
=
ChannelConfUtil
.
convert2ClfChannelConfiguration
(
basicInfo
);
List
<
ClfOrderCallBack
>
clfOrderCallBackList
=
ChannelConfUtil
.
convert2ClfOrderCallback
(
basicInfo
.
getChannelId
(),
addInfo
);
ClfChannelConfiguration
channelConfigurationExsit
=
clfCenterService
.
findChannelConfigurationByChannelId
(
basicInfo
.
getChannelId
());
if
(
channelConfigurationExsit
==
null
)
{
// 新保存
channelConfiguration
.
setCreatedAt
(
new
Timestamp
(
System
.
currentTimeMillis
()));
clfCenterService
.
saveChannelConfiguration
(
channelConfiguration
);
ClfCallbackConfiguration
clfCallbackConfiguration
=
ChannelConfUtil
.
convert2ClfCallbackConfiguration
(
basicInfo
);
clfCenterService
.
saveCallbackConfiguration
(
clfCallbackConfiguration
);
clfCenterService
.
saveOrderCall
(
clfOrderCallBackList
);
}
else
{
// update
BeanUtils
.
copyProperties
(
channelConfiguration
,
channelConfigurationExsit
,
IgnorePropertiesUtil
.
getNullPropertyNames
(
channelConfiguration
));
clfCenterService
.
saveChannelConfiguration
(
channelConfigurationExsit
);
// 更新OrderCallBack
for
(
ClfOrderCallBack
clfOrderCallBack
:
clfOrderCallBackList
)
{
ClfOrderCallBack
orderCallBackExsit
=
clfCenterService
.
findOrderCallBackByByCallbackStatusAndChannelId
(
clfOrderCallBack
.
getCallbackStatus
().
name
(),
clfOrderCallBack
.
getRegisteredFrom
());
if
(
orderCallBackExsit
!=
null
)
{
clfOrderCallBack
.
setId
(
orderCallBackExsit
.
getId
());
}
}
clfCenterService
.
saveOrderCall
(
clfOrderCallBackList
);
}
return
true
;
}
}
}
src/main/java/cn/quantgroup/cashloanflowboss/api/channel/service/ChannelConfServiceImpl.java
0 → 100644
View file @
27827bbd
package
cn
.
quantgroup
.
cashloanflowboss
.
api
.
channel
.
service
;
import
java.sql.Timestamp
;
import
java.util.*
;
import
cn.quantgroup.cashloanflowboss.api.channel.entity.ChannelConf
;
import
cn.quantgroup.cashloanflowboss.api.channel.model.ChannelConfAddModel
;
import
cn.quantgroup.cashloanflowboss.api.channel.model.ChannelConfBaseModel
;
import
cn.quantgroup.cashloanflowboss.api.channel.model.ChannelConfVo
;
import
cn.quantgroup.cashloanflowboss.api.channel.model.ChannelListModel
;
import
cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfCallbackConfiguration
;
import
cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfChannelConfiguration
;
import
cn.quantgroup.cashloanflowboss.api.channel.repository.ChannelConfRepository
;
import
cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderCallBack
;
import
cn.quantgroup.cashloanflowboss.spi.clf.model.KANoticeType
;
import
cn.quantgroup.cashloanflowboss.api.channel.util.ChannelConfUtil
;
import
cn.quantgroup.cashloanflowboss.spi.clf.service.CLFCenterService
;
import
cn.quantgroup.cashloanflowboss.utils.IgnorePropertiesUtil
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Page
;
import
org.springframework.stereotype.Service
;
/**
* function:
* date: 2019/8/2
*
* @author: suntao
*/
@Service
public
class
ChannelConfServiceImpl
implements
ChannelConfService
{
@Autowired
private
CLFCenterService
clfCenterService
;
@Autowired
private
ChannelConfRepository
channelConfRepository
;
@Override
public
Page
<
ChannelListModel
>
getChannelInfo
(
Integer
pageNumber
,
Integer
pageSize
,
Long
channelId
)
{
Page
<
ClfChannelConfiguration
>
page
=
clfCenterService
.
findChannelConfigurationByCriteriaQueryPage
(
pageNumber
,
pageSize
,
channelId
);
Page
<
ChannelListModel
>
channelListModelPage
=
page
.
map
(
it
->
{
ChannelListModel
channelListModel
=
new
ChannelListModel
();
channelListModel
.
setChannelId
(
it
.
getRegisteredFrom
());
channelListModel
.
setChannelName
(
it
.
getChannelName
());
channelListModel
.
setChannelCode
(
it
.
getChannelCode
());
channelListModel
.
setBizType
(
null
);
channelListModel
.
setCreatedAt
(
it
.
getCreatedAt
());
return
channelListModel
;
});
return
channelListModelPage
;
}
@Override
public
ChannelConfVo
getChannelConf
(
Long
channelId
)
{
ChannelConf
channelConf
=
channelConfRepository
.
getByChannelId
(
channelId
);
if
(
channelConf
!=
null
)
{
return
ChannelConfUtil
.
channelConfConvertVOModel
(
channelConf
);
}
else
{
// boss channel_conf 为空,从clf 查询数据
ClfChannelConfiguration
channelConfiguration
=
clfCenterService
.
findChannelConfigurationByChannelId
(
channelId
);
ClfOrderCallBack
approve
=
clfCenterService
.
findOrderCallBackByByCallbackStatusAndChannelId
(
KANoticeType
.
FUAD_ASSIFN_SUCC
.
name
(),
channelId
);
ClfOrderCallBack
orderStatus
=
clfCenterService
.
findOrderCallBackByByCallbackStatusAndChannelId
(
KANoticeType
.
FUND_SUCC
.
name
(),
channelId
);
ClfOrderCallBack
repaymentPlan
=
clfCenterService
.
findOrderCallBackByByCallbackStatusAndChannelId
(
KANoticeType
.
REPAYMENT
.
name
(),
channelId
);
return
ChannelConfUtil
.
getChannelConfVoByClf
(
channelConfiguration
,
approve
,
orderStatus
,
repaymentPlan
);
}
}
@Override
public
Boolean
editChannelConfInfo
(
ChannelConfVo
confVo
)
{
ChannelConfBaseModel
basicInfo
=
confVo
.
getBasicInfo
();
ChannelConfAddModel
addInfo
=
confVo
.
getAddInfo
();
ChannelConf
channelConf
=
ChannelConfUtil
.
voModelConfConvertChannelConf
(
confVo
);
ChannelConf
channelConfExsit
=
channelConfRepository
.
getByChannelId
(
basicInfo
.
getChannelId
());
// cash-loan-flow-boss 库
if
(
channelConfExsit
==
null
)
{
// 新保存
channelConf
.
setCreateTime
(
new
Date
());
channelConfRepository
.
save
(
channelConf
);
}
else
{
// 更新数据库 数据
BeanUtils
.
copyProperties
(
channelConf
,
channelConfExsit
,
IgnorePropertiesUtil
.
getNullPropertyNames
(
channelConf
));
channelConfExsit
.
setUpdateTime
(
new
Date
());
channelConfRepository
.
save
(
channelConfExsit
);
}
// clf 库
ClfChannelConfiguration
channelConfiguration
=
ChannelConfUtil
.
convert2ClfChannelConfiguration
(
basicInfo
);
List
<
ClfOrderCallBack
>
clfOrderCallBackList
=
ChannelConfUtil
.
convert2ClfOrderCallback
(
basicInfo
.
getChannelId
(),
addInfo
);
ClfChannelConfiguration
channelConfigurationExsit
=
clfCenterService
.
findChannelConfigurationByChannelId
(
basicInfo
.
getChannelId
());
if
(
channelConfigurationExsit
==
null
)
{
// 新保存
channelConfiguration
.
setCreatedAt
(
new
Timestamp
(
System
.
currentTimeMillis
()));
clfCenterService
.
saveChannelConfiguration
(
channelConfiguration
);
ClfCallbackConfiguration
clfCallbackConfiguration
=
ChannelConfUtil
.
convert2ClfCallbackConfiguration
(
basicInfo
);
clfCenterService
.
saveCallbackConfiguration
(
clfCallbackConfiguration
);
clfCenterService
.
saveOrderCall
(
clfOrderCallBackList
);
}
else
{
// update
BeanUtils
.
copyProperties
(
channelConfiguration
,
channelConfigurationExsit
,
IgnorePropertiesUtil
.
getNullPropertyNames
(
channelConfiguration
));
clfCenterService
.
saveChannelConfiguration
(
channelConfigurationExsit
);
// 更新OrderCallBack
for
(
ClfOrderCallBack
clfOrderCallBack
:
clfOrderCallBackList
)
{
ClfOrderCallBack
orderCallBackExsit
=
clfCenterService
.
findOrderCallBackByByCallbackStatusAndChannelId
(
clfOrderCallBack
.
getCallbackStatus
().
name
(),
clfOrderCallBack
.
getRegisteredFrom
());
if
(
orderCallBackExsit
!=
null
)
{
clfOrderCallBack
.
setId
(
orderCallBackExsit
.
getId
());
}
}
clfCenterService
.
saveOrderCall
(
clfOrderCallBackList
);
}
return
true
;
}
}
src/main/java/cn/quantgroup/cashloanflowboss/api/optlog/service/OptHistoryLogService.java
View file @
27827bbd
package
cn
.
quantgroup
.
cashloanflowboss
.
api
.
optlog
.
service
;
package
cn
.
quantgroup
.
cashloanflowboss
.
api
.
optlog
.
service
;
import
cn.quantgroup.cashloanflowboss.api.optlog.entity.OptHistoryLog
;
import
cn.quantgroup.cashloanflowboss.api.optlog.entity.OptHistoryLog
;
import
cn.quantgroup.cashloanflowboss.api.optlog.repository.OptHistoryLogRepository
;
import
cn.quantgroup.cashloanflowboss.api.order.model.OrderBaseModel
;
import
cn.quantgroup.cashloanflowboss.api.order.model.OrderBaseModel
;
import
cn.quantgroup.cashloanflowboss.api.order.util.OrderUtil
;
import
cn.quantgroup.cashloanflowboss.spi.clf.entity.ApplyRequestHistory
;
import
cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping
;
import
cn.quantgroup.cashloanflowboss.spi.clf.entity.WithdrawRecord
;
import
cn.quantgroup.cashloanflowboss.spi.clf.service.CLFCenterService
;
import
org.apache.commons.collections.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
javax.persistence.criteria.Predicate
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Objects
;
/**
/**
* function:
* function:
* date: 2019/9/
4
* date: 2019/9/
16
*
*
* @author: suntao
* @author: suntao
*/
*/
@Service
public
interface
OptHistoryLogService
{
public
class
OptHistoryLogService
{
List
<
OptHistoryLog
>
getAllOptHistoryLog
(
OrderBaseModel
orderBaseModel
);
@Autowired
private
CLFCenterService
clfCenterService
;
@Autowired
private
OptHistoryLogRepository
optHistoryLogRepository
;
public
List
<
OptHistoryLog
>
getAllOptHistoryLog
(
OrderBaseModel
orderBaseModel
)
{
ClfOrderMapping
orderMapping
=
clfCenterService
.
findOrderMappingByChannelOrderNo
(
orderBaseModel
.
getChannelOrderNumber
());
if
(
orderMapping
==
null
)
{
return
null
;
}
// 用户操作日志 进件。。。
List
<
ApplyRequestHistory
>
applyRequestHistoryList
=
clfCenterService
.
findApplyRequestHistoryBySpecification
(
orderBaseModel
);
// 管理员操作日志 审批。。。
List
<
OptHistoryLog
>
optHistoryLogList
=
getLocalOptHisttoryLog
(
orderBaseModel
);
// 提现记录
List
<
WithdrawRecord
>
withdrawRecordList
=
clfCenterService
.
findWithdrawRecordList
(
orderBaseModel
.
getChannelOrderNumber
(),
orderMapping
.
getRegisteredFrom
());
List
<
OptHistoryLog
>
withdrawOptHistoryLogList
=
OrderUtil
.
convertWithdrawRecordList2UserOptHistoryLogList
(
withdrawRecordList
);
// 转换
List
<
OptHistoryLog
>
userOptHistoryLogList
=
OrderUtil
.
convertApplyRequestHistoryList2OptHistoryLogList
(
applyRequestHistoryList
,
orderMapping
);
if
(
CollectionUtils
.
isNotEmpty
(
optHistoryLogList
))
{
userOptHistoryLogList
.
addAll
(
optHistoryLogList
);
}
if
(
CollectionUtils
.
isNotEmpty
(
withdrawOptHistoryLogList
))
{
userOptHistoryLogList
.
addAll
(
withdrawOptHistoryLogList
);
}
userOptHistoryLogList
.
sort
((
o1
,
o2
)->{
if
(
o1
.
getCreateTime
().
getTime
()
<
o2
.
getCreateTime
().
getTime
())
{
return
-
1
;
}
else
{
return
1
;
}
});
return
userOptHistoryLogList
;
}
/**
* 只获取操作日志,boss库数据
* @param orderBaseModel
* @return
*/
List
<
OptHistoryLog
>
getLocalOptHisttoryLog
(
OrderBaseModel
orderBaseModel
)
{
List
<
OptHistoryLog
>
page
=
this
.
optHistoryLogRepository
.
findAll
((
root
,
criteriaQuery
,
criteriaBuilder
)
->
{
List
<
Predicate
>
predicates
=
new
ArrayList
<>();
// 指定渠道号
if
(
Objects
.
nonNull
(
orderBaseModel
.
getChannelId
()))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"channelId"
),
orderBaseModel
.
getChannelId
().
longValue
()));
}
if
(
StringUtils
.
isNotEmpty
(
orderBaseModel
.
getChannelOrderNumber
()))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"channelOrderNumber"
),
orderBaseModel
.
getChannelOrderNumber
()));
}
if
(
StringUtils
.
isNotEmpty
(
orderBaseModel
.
getApplyNo
()))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"applyNo"
),
orderBaseModel
.
getApplyNo
()));
}
if
(
orderBaseModel
.
getLoanId
()
!=
null
&&
orderBaseModel
.
getLoanId
()
>
0
)
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"loanId"
),
orderBaseModel
.
getLoanId
()));
}
// 设置查询条件
criteriaQuery
.
where
(
criteriaBuilder
.
and
(
predicates
.
toArray
(
new
Predicate
[
predicates
.
size
()])));
// 指定排序
criteriaQuery
.
orderBy
(
criteriaBuilder
.
desc
(
root
.
get
(
"id"
)));
return
criteriaQuery
.
getRestriction
();
});
return
page
;
}
public
void
save
(
OptHistoryLog
optHistoryLog
)
{
optHistoryLogRepository
.
save
(
optHistoryLog
);
}
List
<
OptHistoryLog
>
getLocalOptHisttoryLog
(
OrderBaseModel
orderBaseModel
);
void
save
(
OptHistoryLog
optHistoryLog
);
}
}
src/main/java/cn/quantgroup/cashloanflowboss/api/optlog/service/OptHistoryLogServiceImpl.java
0 → 100644
View file @
27827bbd
package
cn
.
quantgroup
.
cashloanflowboss
.
api
.
optlog
.
service
;
import
cn.quantgroup.cashloanflowboss.api.optlog.entity.OptHistoryLog
;
import
cn.quantgroup.cashloanflowboss.api.optlog.repository.OptHistoryLogRepository
;
import
cn.quantgroup.cashloanflowboss.api.order.model.OrderBaseModel
;
import
cn.quantgroup.cashloanflowboss.api.order.util.OrderUtil
;
import
cn.quantgroup.cashloanflowboss.spi.clf.entity.ApplyRequestHistory
;
import
cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping
;
import
cn.quantgroup.cashloanflowboss.spi.clf.entity.WithdrawRecord
;
import
cn.quantgroup.cashloanflowboss.spi.clf.service.CLFCenterService
;
import
org.apache.commons.collections.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
javax.persistence.criteria.Predicate
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Objects
;
/**
* function:
* date: 2019/9/4
*
* @author: suntao
*/
@Service
public
class
OptHistoryLogServiceImpl
implements
OptHistoryLogService
{
@Autowired
private
CLFCenterService
clfCenterService
;
@Autowired
private
OptHistoryLogRepository
optHistoryLogRepository
;
@Override
public
List
<
OptHistoryLog
>
getAllOptHistoryLog
(
OrderBaseModel
orderBaseModel
)
{
ClfOrderMapping
orderMapping
=
clfCenterService
.
findOrderMappingByChannelOrderNo
(
orderBaseModel
.
getChannelOrderNumber
());
if
(
orderMapping
==
null
)
{
return
null
;
}
// 用户操作日志 进件。。。
List
<
ApplyRequestHistory
>
applyRequestHistoryList
=
clfCenterService
.
findApplyRequestHistoryBySpecification
(
orderBaseModel
);
// 管理员操作日志 审批。。。
List
<
OptHistoryLog
>
optHistoryLogList
=
getLocalOptHisttoryLog
(
orderBaseModel
);
// 提现记录
List
<
WithdrawRecord
>
withdrawRecordList
=
clfCenterService
.
findWithdrawRecordList
(
orderBaseModel
.
getChannelOrderNumber
(),
orderMapping
.
getRegisteredFrom
());
List
<
OptHistoryLog
>
withdrawOptHistoryLogList
=
OrderUtil
.
convertWithdrawRecordList2UserOptHistoryLogList
(
withdrawRecordList
);
// 转换
List
<
OptHistoryLog
>
userOptHistoryLogList
=
OrderUtil
.
convertApplyRequestHistoryList2OptHistoryLogList
(
applyRequestHistoryList
,
orderMapping
);
if
(
CollectionUtils
.
isNotEmpty
(
optHistoryLogList
))
{
userOptHistoryLogList
.
addAll
(
optHistoryLogList
);
}
if
(
CollectionUtils
.
isNotEmpty
(
withdrawOptHistoryLogList
))
{
userOptHistoryLogList
.
addAll
(
withdrawOptHistoryLogList
);
}
userOptHistoryLogList
.
sort
((
o1
,
o2
)->{
if
(
o1
.
getCreateTime
().
getTime
()
<
o2
.
getCreateTime
().
getTime
())
{
return
-
1
;
}
else
{
return
1
;
}
});
return
userOptHistoryLogList
;
}
/**
* 只获取操作日志,boss库数据
* @param orderBaseModel
* @return
*/
@Override
public
List
<
OptHistoryLog
>
getLocalOptHisttoryLog
(
OrderBaseModel
orderBaseModel
)
{
List
<
OptHistoryLog
>
page
=
this
.
optHistoryLogRepository
.
findAll
((
root
,
criteriaQuery
,
criteriaBuilder
)
->
{
List
<
Predicate
>
predicates
=
new
ArrayList
<>();
// 指定渠道号
if
(
Objects
.
nonNull
(
orderBaseModel
.
getChannelId
()))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"channelId"
),
orderBaseModel
.
getChannelId
().
longValue
()));
}
if
(
StringUtils
.
isNotEmpty
(
orderBaseModel
.
getChannelOrderNumber
()))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"channelOrderNumber"
),
orderBaseModel
.
getChannelOrderNumber
()));
}
if
(
StringUtils
.
isNotEmpty
(
orderBaseModel
.
getApplyNo
()))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"applyNo"
),
orderBaseModel
.
getApplyNo
()));
}
if
(
orderBaseModel
.
getLoanId
()
!=
null
&&
orderBaseModel
.
getLoanId
()
>
0
)
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"loanId"
),
orderBaseModel
.
getLoanId
()));
}
// 设置查询条件
criteriaQuery
.
where
(
criteriaBuilder
.
and
(
predicates
.
toArray
(
new
Predicate
[
predicates
.
size
()])));
// 指定排序
criteriaQuery
.
orderBy
(
criteriaBuilder
.
desc
(
root
.
get
(
"id"
)));
return
criteriaQuery
.
getRestriction
();
});
return
page
;
}
@Override
public
void
save
(
OptHistoryLog
optHistoryLog
)
{
optHistoryLogRepository
.
save
(
optHistoryLog
);
}
}
src/main/java/cn/quantgroup/cashloanflowboss/api/order/controller/OrderController.java
View file @
27827bbd
...
@@ -10,7 +10,6 @@ import cn.quantgroup.cashloanflowboss.core.annotation.CheckChannelRoleByChannelO
...
@@ -10,7 +10,6 @@ import cn.quantgroup.cashloanflowboss.core.annotation.CheckChannelRoleByChannelO
import
cn.quantgroup.cashloanflowboss.core.base.Result
;
import
cn.quantgroup.cashloanflowboss.core.base.Result
;
import
cn.quantgroup.cashloanflowboss.core.base.Tuple
;
import
cn.quantgroup.cashloanflowboss.core.base.Tuple
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.bind.annotation.*
;
import
javax.validation.Valid
;
import
javax.validation.Valid
;
...
...
src/main/java/cn/quantgroup/cashloanflowboss/api/order/service/OrderService.java
View file @
27827bbd
package
cn
.
quantgroup
.
cashloanflowboss
.
api
.
order
.
service
;
package
cn
.
quantgroup
.
cashloanflowboss
.
api
.
order
.
service
;
import
cn.quantgroup.cashloanflowboss.api.optlog.entity.OptHistoryLog
;
import
cn.quantgroup.cashloanflowboss.api.optlog.service.OptHistoryLogService
;
import
cn.quantgroup.cashloanflowboss.spi.clf.entity.CallbackFailRecord
;
import
cn.quantgroup.cashloanflowboss.spi.clf.model.LoanProgress
;
import
cn.quantgroup.cashloanflowboss.api.channel.entity.ChannelConf
;
import
cn.quantgroup.cashloanflowboss.api.order.model.ApproveVo
;
import
cn.quantgroup.cashloanflowboss.api.channel.repository.ChannelConfRepository
;
import
cn.quantgroup.cashloanflowboss.api.order.model.HistoryOrderStatusVoModel
;
import
cn.quantgroup.cashloanflowboss.api.channel.util.ChannelConfUtil
;
import
cn.quantgroup.cashloanflowboss.api.order.model.LendingFormModel
;
import
cn.quantgroup.cashloanflowboss.api.order.entity.OrderApprove
;
import
cn.quantgroup.cashloanflowboss.api.order.model.OrderVo
;
import
cn.quantgroup.cashloanflowboss.api.order.model.*
;
import
cn.quantgroup.cashloanflowboss.api.order.repository.OrderApproveRepository
;
import
cn.quantgroup.cashloanflowboss.api.order.util.OrderUtil
;
import
cn.quantgroup.cashloanflowboss.core.Application
;
import
cn.quantgroup.cashloanflowboss.core.base.ServiceResult
;
import
cn.quantgroup.cashloanflowboss.core.base.Tuple
;
import
cn.quantgroup.cashloanflowboss.core.base.Tuple
;
import
cn.quantgroup.cashloanflowboss.spi.clf.entity.CallbackRecord
;
import
cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping
;
import
cn.quantgroup.cashloanflowboss.spi.clf.model.CallbackRecordVoModel
;
import
cn.quantgroup.cashloanflowboss.spi.clf.model.CallbackRecordVoModel
;
import
cn.quantgroup.cashloanflowboss.spi.clf.repository.ClfOrderMappingRepository
;
import
cn.quantgroup.cashloanflowboss.spi.clf.service.CLFCenterService
;
import
cn.quantgroup.cashloanflowboss.spi.clotho.service.ClothoCenterService
;
import
cn.quantgroup.cashloanflowboss.spi.jolyne.JolyneCenter
;
import
cn.quantgroup.cashloanflowboss.spi.jolyne.JolyneUtil
;
import
cn.quantgroup.cashloanflowboss.spi.user.service.XyqbUserService
;
import
cn.quantgroup.cashloanflowboss.spi.xyqb.entity.Contract
;
import
cn.quantgroup.cashloanflowboss.spi.xyqb.entity.LoanApplicationHistory
;
import
cn.quantgroup.cashloanflowboss.spi.xyqb.service.XYQBCenterService
;
import
cn.quantgroup.cashloanflowboss.utils.JSONTools
;
import
cn.quantgroup.user.retbean.XUser
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Maps
;
import
java.math.BigDecimal
;
import
java.util.ArrayList
;
import
java.util.Calendar
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Objects
;
import
java.util.UUID
;
import
java.util.concurrent.ConcurrentMap
;
import
javax.persistence.criteria.Predicate
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.commons.lang3.exception.ExceptionUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Page
;
import
org.springframework.data.domain.Page
;
import
org.springframework.data.domain.PageRequest
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.List
;
/**
/**
* function:
* function:
* date: 2019/
8/8
* date: 2019/
9/16
*
*
* @author: suntao
* @author: suntao
*/
*/
public
interface
OrderService
{
Page
<
OrderVo
>
orderList
(
Long
channelId
,
String
channelOrderNo
,
String
applyNo
,
Long
loanId
,
Integer
pageNumber
,
Integer
pageSize
);
@Slf4j
Tuple
<
Boolean
,
Boolean
>
approveOpt
(
ApproveVo
approveVo
);
@Service
public
class
OrderService
{
@Autowired
private
OptHistoryLogService
optHistoryLogService
;
@Autowired
private
ChannelConfRepository
channelConfRepository
;
@Autowired
private
OrderApproveRepository
orderApproveRepository
;
@Autowired
private
XyqbUserService
xyqbUserService
;
@Autowired
private
XYQBCenterService
xyqbCenterService
;
@Autowired
private
ClothoCenterService
clothoCenterService
;
@Autowired
private
CLFCenterService
clfCenterService
;
@Autowired
private
JolyneCenter
jolyneCenter
;
@Autowired
private
ClfOrderMappingRepository
clfOrderMappingRepository
;
public
Page
<
OrderVo
>
orderList
(
Long
channelId
,
String
channelOrderNo
,
String
applyNo
,
Long
loanId
,
Integer
pageNumber
,
Integer
pageSize
)
{
Page
<
ClfOrderMapping
>
page
=
this
.
clfOrderMappingRepository
.
findAll
((
root
,
criteriaQuery
,
criteriaBuilder
)
->
{
List
<
Predicate
>
predicates
=
new
ArrayList
<>();
// 指定渠道号
if
(
Objects
.
nonNull
(
channelId
))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"registeredFrom"
),
channelId
.
longValue
()));
}
if
(
StringUtils
.
isNotEmpty
(
channelOrderNo
))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"channelOrderNo"
),
channelOrderNo
));
}
if
(
StringUtils
.
isNotEmpty
(
applyNo
))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"applyNo"
),
applyNo
));
}
if
(
loanId
!=
null
&&
loanId
>
0
)
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"loanId"
),
loanId
));
}
// 设置查询条件
criteriaQuery
.
where
(
criteriaBuilder
.
and
(
predicates
.
toArray
(
new
Predicate
[
predicates
.
size
()])));
// 指定排序
criteriaQuery
.
orderBy
(
criteriaBuilder
.
desc
(
root
.
get
(
"id"
)));
return
criteriaQuery
.
getRestriction
();
},
new
PageRequest
(
pageNumber
,
pageSize
));
return
page
.
map
(
it
->
{
OrderVo
orderVo
=
new
OrderVo
();
orderVo
.
setId
(
it
.
getId
());
orderVo
.
setChannelId
(
it
.
getRegisteredFrom
());
orderVo
.
setChannelOrderNumber
(
it
.
getChannelOrderNo
());
if
(!
Application
.
getPrincipal
().
isChannel
())
{
orderVo
.
setLoanId
(
it
.
getLoanId
());
// 授信申请号,非渠道权限登陆显示admin及以上权限用户
orderVo
.
setApplyNo
(
it
.
getApplyNo
());
}
orderVo
.
setCreatedAt
(
it
.
getCreatedAt
());
if
(
StringUtils
.
isNotEmpty
(
it
.
getApplyNo
()))
{
ServiceResult
<
XyqbCurrentOrderStatusServiceResultModel
>
xyqbCenterServiceXyqbOrderStatus
=
xyqbCenterService
.
getXyqbOrderStatus
(
it
.
getApplyNo
(),
it
.
getLoanId
());
log
.
info
(
"[xyqbCenterService.getXyqbOrderStatus]xyqbOrderStatus={}"
,
JSONTools
.
serialize
(
xyqbCenterServiceXyqbOrderStatus
));
if
(
xyqbCenterServiceXyqbOrderStatus
.
isSuccess
())
{
QueryXyqbOrderStatus
currentStatus
=
xyqbCenterServiceXyqbOrderStatus
.
getData
().
getCurrentStatus
();
Tuple
<
String
,
List
<
OrderVo
.
OptButton
>>
currentStatusAndButtons
=
this
.
getCurrentStatusAndButtons
(
currentStatus
,
it
);
orderVo
.
setStatus
(
currentStatusAndButtons
.
getKey
());
if
(
Application
.
isDebug
())
{
// 只有测试环境才需要订单操作
orderVo
.
setOpt
(
currentStatusAndButtons
.
getValue
());
}
orderVo
.
setMessage
(
""
);
}
else
{
orderVo
.
setStatus
(
"未知,稍后查询"
);
orderVo
.
setMessage
(
"订单查询错误"
);
}
}
else
{
orderVo
.
setStatus
(
"授信中"
);
orderVo
.
setOpt
(
new
ArrayList
<>());
orderVo
.
setMessage
(
""
);
}
return
orderVo
;
});
}
/**
*
* @param approveVo
* @return Tuple<Boolean 审批结果 true 审批完成 false 审批操作失败, Boolean 资产计划配置 true 配置没问题 false 配置需要检查>
*/
public
Tuple
<
Boolean
,
Boolean
>
approveOpt
(
ApproveVo
approveVo
)
{
log
.
info
(
"approveOpt,审批操作入参,approveVo={}"
,
JSONTools
.
serialize
(
approveVo
));
if
(
StringUtils
.
isEmpty
(
approveVo
.
getAmount
()))
{
// 如果UI 金额为空 默认4000
approveVo
.
setAmount
(
"4000"
);
}
if
(
approveVo
.
getPeriod
()
==
null
)
{
// 如果UI 期数为空 3期
approveVo
.
setPeriod
(
3
);
}
ClfOrderMapping
orderMapping
=
clfOrderMappingRepository
.
findByChannelOrderNoLastOne
(
approveVo
.
getChannelOrderNumber
());
if
(
orderMapping
==
null
)
{
log
.
info
(
"approveOpt,审批失败,无订单 channelOrderNumber={}"
,
approveVo
.
getChannelOrderNumber
());
return
new
Tuple
<>(
false
,
false
);
}
if
(
Application
.
getPrincipal
().
isChannel
()
&&
!
Application
.
getPrincipal
().
isSameChannel
(
orderMapping
.
getRegisteredFrom
()))
{
log
.
info
(
"approveOpt,审批失败,不是该渠道订单无法审批 channelOrderNumber={}"
,
approveVo
.
getChannelOrderNumber
());
return
new
Tuple
<>(
false
,
false
);
}
XUser
xUser
=
xyqbUserService
.
findXUserById
(
orderMapping
.
getQgUserId
());
if
(
xUser
==
null
)
{
log
.
info
(
"approveOpt,审批失败,未找到用户 channelOrderNumber={}"
,
approveVo
.
getChannelOrderNumber
());
return
new
Tuple
<>(
false
,
false
);
}
ChannelConf
channelConf
=
channelConfRepository
.
getByChannelId
(
orderMapping
.
getRegisteredFrom
());
if
(
channelConf
==
null
)
{
log
.
info
(
"approveOpt,审批失败,boss渠道配置为空 channelOrderNumber={}"
,
approveVo
.
getChannelOrderNumber
());
return
new
Tuple
<>(
false
,
false
);
}
// 额度有效期
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
setTime
(
new
Date
());
calendar
.
add
(
Calendar
.
DAY_OF_YEAR
,
7
);
Integer
fundId
=
ChannelConfUtil
.
getFundIdByType
(
approveVo
.
getFundType
(),
channelConf
);
// 资方 及 期数额度规则
String
fundFormat
=
String
.
format
(
OrderUtil
.
financeProductsFormat
,
approveVo
.
getAmount
(),
approveVo
.
getAmount
(),
approveVo
.
getPeriod
(),
fundId
);
OrderApprove
orderApproveExsit
=
orderApproveRepository
.
findByChannelOrderNumber
(
approveVo
.
getChannelOrderNumber
());
if
(
orderApproveExsit
!=
null
)
{
orderApproveExsit
.
setFundId
(
fundId
);
orderApproveExsit
.
setFundType
(
approveVo
.
getFundType
());
orderApproveExsit
.
setUpdateTime
(
new
Date
());
orderApproveRepository
.
save
(
orderApproveExsit
);
}
else
{
OrderApprove
orderApprove
=
new
OrderApprove
();
orderApprove
.
setChannelOrderNumber
(
approveVo
.
getChannelOrderNumber
());
orderApprove
.
setCreditNumber
(
orderMapping
.
getApplyNo
());
orderApprove
.
setChannelId
(
orderMapping
.
getRegisteredFrom
());
orderApprove
.
setFundId
(
fundId
);
orderApprove
.
setFundType
(
approveVo
.
getFundType
());
orderApprove
.
setCreateTime
(
new
Date
());
orderApprove
.
setUpdateTime
(
new
Date
());
orderApproveRepository
.
save
(
orderApprove
);
}
Map
<
String
,
Object
>
data
=
new
HashMap
<>(
16
);
data
.
put
(
"code"
,
0
);
data
.
put
(
"msg"
,
"success"
);
data
.
put
(
"bizChannel"
,
orderMapping
.
getRegisteredFrom
());
data
.
put
(
"uuid"
,
xUser
.
getUuid
());
data
.
put
(
"bizNo"
,
orderMapping
.
getApplyNo
());
data
.
put
(
"bizType"
,
channelConf
.
getBizType
());
data
.
put
(
"auditResult"
,
approveVo
.
getIsPass
());
data
.
put
(
"amount"
,
approveVo
.
getAmount
());
data
.
put
(
"deadLine"
,
calendar
.
getTime
().
getTime
());
data
.
put
(
"financeProducts"
,
fundFormat
);
// 发起审批
log
.
info
(
"[approveOpt] 向clotho发起审批,data={}"
,
JSONTools
.
serialize
(
data
));
String
approveStringResult
=
clothoCenterService
.
approve
(
data
);
Boolean
corpPolicyValidate
=
false
;
try
{
corpPolicyValidate
=
xyqbCenterService
.
validateCorpPolicy
(
Long
.
valueOf
(
fundId
),
new
Date
());
}
catch
(
Exception
e
)
{
log
.
error
(
"审批,资方校验异常,channelOrderNumber={},fundId={}, e={}"
,
orderMapping
.
getChannelOrderNo
(),
fundId
,
ExceptionUtils
.
getStackTrace
(
e
));
}
// 操作记录
OptHistoryLog
optHistoryLog
=
new
OptHistoryLog
();
optHistoryLog
.
setChannelOrderNumber
(
approveVo
.
getChannelOrderNumber
());
optHistoryLog
.
setCreditNumber
(
orderMapping
.
getApplyNo
());
optHistoryLog
.
setLoanId
(
orderMapping
.
getLoanId
());
optHistoryLog
.
setChannelId
(
orderMapping
.
getRegisteredFrom
());
optHistoryLog
.
setOptName
(
"审批操作"
);
optHistoryLog
.
setCreateTime
(
new
Date
());
Boolean
optResult
;
if
(
"success"
.
equals
(
approveStringResult
))
{
optHistoryLog
.
setOptLogDetail
(
corpPolicyValidate
?
""
:
"资产计划未配置,请联系管理员配置"
);
optHistoryLog
.
setOptResult
(
true
);
optResult
=
true
;
log
.
info
(
"审批申请成功,channelOrderNumber={}"
,
orderMapping
.
getChannelOrderNo
());
}
else
{
optHistoryLog
.
setOptResult
(
false
);
optHistoryLog
.
setOptLogDetail
(
"审批失败"
);
log
.
info
(
"审批申请失败,channelOrderNumber={},requestParam={}"
,
orderMapping
.
getChannelOrderNo
(),
JSONTools
.
serialize
(
data
));
optResult
=
false
;
}
optHistoryLogService
.
save
(
optHistoryLog
);
return
new
Tuple
<>(
optResult
,
corpPolicyValidate
);
}
/**
* 已经自动,无须调用
* 二次风控
*
* @param channelOrderNumber
* @return
*/
@Transactional
@Transactional
public
boolean
secondAudit
(
String
channelOrderNumber
)
{
boolean
secondAudit
(
String
channelOrderNumber
);
boolean
result
=
true
;
// 操作记录
OptHistoryLog
optHistoryLog
=
new
OptHistoryLog
();
optHistoryLog
.
setChannelOrderNumber
(
channelOrderNumber
);
ClfOrderMapping
orderMapping
=
this
.
clfOrderMappingRepository
.
findByChannelOrderNoLastOne
(
channelOrderNumber
);
if
(
orderMapping
==
null
||
orderMapping
.
getLoanId
()
==
null
)
{
log
.
info
(
"secondAudit,orderMapping为空或者loanId为空,channelOrderNumber="
.
concat
(
channelOrderNumber
));
optHistoryLog
.
setOptName
(
"二次审批操作"
);
optHistoryLog
.
setOptLogDetail
(
"orderMapping为空或者loanId为空,操作失败"
);
optHistoryLog
.
setOptResult
(
false
);
optHistoryLog
.
setCreateTime
(
new
Date
());
optHistoryLogService
.
save
(
optHistoryLog
);
return
false
;
}
optHistoryLog
.
setCreditNumber
(
orderMapping
.
getApplyNo
());
optHistoryLog
.
setLoanId
(
orderMapping
.
getLoanId
());
optHistoryLog
.
setChannelId
(
orderMapping
.
getRegisteredFrom
());
optHistoryLog
.
setOptName
(
"二次审批操作"
);
optHistoryLog
.
setCreateTime
(
new
Date
());
// 更新合同状态
Contract
conscont
=
xyqbCenterService
.
findContractByUserId
(
orderMapping
.
getQgUserId
());
if
(
conscont
!=
null
)
{
if
(
conscont
.
getGenerateStatus
()
!=
2
)
{
log
.
info
(
"secondAudit,合同为空,channelOrderNumber="
.
concat
(
channelOrderNumber
));
optHistoryLog
.
setOptName
(
"二次审批操作"
);
optHistoryLog
.
setOptLogDetail
(
"合同未生成,请更换新的身份证尝试"
);
optHistoryLog
.
setOptResult
(
false
);
optHistoryLog
.
setCreateTime
(
new
Date
());
optHistoryLogService
.
save
(
optHistoryLog
);
// conscont.setGenerateStatus(2);
// xyqbCenterService.saveContract(conscont);
}
}
else
{
// 合同为空 log表记录问题,UI用户查询
log
.
info
(
"secondAudit,合同为空,channelOrderNumber="
.
concat
(
channelOrderNumber
));
optHistoryLog
.
setOptName
(
"二次审批操作"
);
optHistoryLog
.
setOptLogDetail
(
"合同为空,请更换新的身份证尝试"
);
optHistoryLog
.
setOptResult
(
false
);
optHistoryLog
.
setCreateTime
(
new
Date
());
optHistoryLogService
.
save
(
optHistoryLog
);
// 不需要return
}
// 二次风控回调
XUser
xUser
=
xyqbUserService
.
findXUserById
(
orderMapping
.
getQgUserId
());
if
(
xUser
==
null
)
{
log
.
info
(
"[secendAudit]二次风控失败,未找到user channelOrderNumber={}"
,
channelOrderNumber
);
optHistoryLog
.
setOptLogDetail
(
"二次风控失败,未找到user"
);
optHistoryLog
.
setOptResult
(
false
);
optHistoryLogService
.
save
(
optHistoryLog
);
return
false
;
}
ChannelConf
channelConf
=
channelConfRepository
.
getByChannelId
(
orderMapping
.
getRegisteredFrom
());
if
(
channelConf
==
null
)
{
log
.
info
(
"[secendAudit]二次风控失败,未找到channelConf配置 channelOrderNumber={}"
,
channelOrderNumber
);
optHistoryLog
.
setOptLogDetail
(
"二次风控失败,未找到channelConf配置"
);
optHistoryLog
.
setOptResult
(
false
);
optHistoryLogService
.
save
(
optHistoryLog
);
return
false
;
}
LoanApplicationHistory
loanApplicationHistory
=
xyqbCenterService
.
findLoanApplicationHistoryById
(
orderMapping
.
getLoanId
());
if
(
LoanProgress
.
START_ORDER
.
equals
(
loanApplicationHistory
.
getProgress
()))
{
// 50
log
.
info
(
"[secendAudit]二次风控发起,channelOrderNumber={}, bizType={}"
,
channelOrderNumber
,
channelConf
.
getBizType
());
result
=
clothoCenterService
.
orderAuditNotify
(
xUser
.
getUuid
(),
orderMapping
.
getLoanId
(),
true
,
channelConf
.
getBizType
());
if
(
result
)
{
log
.
info
(
"[secendAudit]二次风控成功,channelOrderNumber={}, result={}"
,
channelOrderNumber
,
result
);
}
else
{
log
.
info
(
"[secendAudit]二次风控失败,clotho返回失败 channelOrderNumber={}"
,
channelOrderNumber
);
optHistoryLog
.
setOptLogDetail
(
"二次风控失败,clotho返回失败"
);
optHistoryLog
.
setOptResult
(
false
);
optHistoryLogService
.
save
(
optHistoryLog
);
return
false
;
}
}
else
if
(
LoanProgress
.
WAITING_FUND
.
equals
(
loanApplicationHistory
.
getProgress
()))
{
// 20 已经回调过
result
=
true
;
}
// 更新待放款时间(5分钟之前)
ArrayList
<
String
>
updateWaitingFundingCorpOperatePeople
=
Lists
.
newArrayList
();
updateWaitingFundingCorpOperatePeople
.
add
(
"update waiting_funding_corp_operate_people set created_at = DATE_SUB(created_at, interval 5 minute) where loan_application_history_id = "
+
orderMapping
.
getLoanId
());
jolyneCenter
.
sqlXyqb
(
JolyneUtil
.
getJolneSql
(
updateWaitingFundingCorpOperatePeople
));
optHistoryLog
.
setOptLogDetail
(
"二次风控操作成功"
);
optHistoryLog
.
setOptResult
(
true
);
optHistoryLogService
.
save
(
optHistoryLog
);
log
.
info
(
"[secendAudit]二次风控操作 最后结果,channelOrderNumber={}, result={}"
,
channelOrderNumber
,
result
);
return
result
;
}
/**
* 放款
*
* @param lendingFormModel
* @return
*/
@Transactional
@Transactional
public
boolean
lending
(
LendingFormModel
lendingFormModel
)
{
boolean
lending
(
LendingFormModel
lendingFormModel
);
boolean
result
=
false
;
OrderApprove
orderApprove
=
this
.
orderApproveRepository
.
findByChannelOrderNumber
(
lendingFormModel
.
getChannelOrderNumber
());
ClfOrderMapping
orderMapping
=
this
.
clfOrderMappingRepository
.
findByChannelOrderNoAndRegisteredFromLastOne
(
lendingFormModel
.
getChannelOrderNumber
(),
lendingFormModel
.
getChannelId
());
String
optDetail
=
""
;
// 操作记录
OptHistoryLog
optHistoryLog
=
new
OptHistoryLog
();
optHistoryLog
.
setChannelOrderNumber
(
lendingFormModel
.
getChannelOrderNumber
());
optHistoryLog
.
setCreditNumber
(
orderMapping
.
getApplyNo
());
optHistoryLog
.
setLoanId
(
orderMapping
.
getLoanId
());
optHistoryLog
.
setChannelId
(
orderMapping
.
getRegisteredFrom
());
optHistoryLog
.
setOptName
(
"放款操作"
);
optHistoryLog
.
setCreateTime
(
new
Date
());
// 更新合同状态
Contract
conscont
=
xyqbCenterService
.
findContractByUserId
(
orderMapping
.
getQgUserId
());
if
(
conscont
==
null
)
{
// 合同为空 log表记录问题,UI用户查询
optDetail
=
optDetail
.
concat
(
"合同未生成,请注意,需要不用身份证才能自动生成合同,"
);
}
if
(
orderApprove
.
getFundType
()
==
0
)
{
// 如果是非存管
result
=
this
.
xyqbCenterService
.
payResultNotify
(
orderMapping
.
getLoanId
(),
lendingFormModel
.
getResult
());
log
.
info
(
"[order_lending]非存管,放款结果通知,channelOrderNumber={}, result={}"
,
lendingFormModel
.
getChannelOrderNumber
(),
result
);
}
else
{
// p2p
Map
data
=
this
.
xyqbCenterService
.
queryLendingRecordCount
(
Long
.
valueOf
(
orderApprove
.
getFundId
()));
log
.
info
(
"[order_lending][queryLendingRecordCount]查询待打款数量,channelOrderNumber={}, data={}"
,
lendingFormModel
.
getChannelOrderNumber
(),
data
);
if
(
data
.
size
()
>
0
)
{
if
(
Objects
.
nonNull
(
data
.
get
(
"totalAmount"
))
&&
Objects
.
nonNull
(
data
.
get
(
"totalCount"
)))
{
result
=
this
.
clothoCenterService
.
lending
(
orderApprove
.
getFundId
(),
new
BigDecimal
(
String
.
valueOf
(
data
.
get
(
"totalAmount"
))),
Integer
.
valueOf
(
String
.
valueOf
(
data
.
get
(
"totalCount"
))));
log
.
info
(
"[order_lending]直投打款,channelOrderNumber={}, result={}"
,
lendingFormModel
.
getChannelOrderNumber
(),
result
);
}
}
}
if
(
result
)
{
optDetail
=
optDetail
.
concat
(
"放款操作成功"
);
optHistoryLog
.
setOptResult
(
true
);
}
else
{
optDetail
=
optDetail
.
concat
(
"放款操作失败"
);
optHistoryLog
.
setOptResult
(
false
);
}
log
.
info
(
"[order_lending]放款操作 最后结果,channelOrderNumber={}, result={}"
,
lendingFormModel
.
getChannelOrderNumber
(),
result
);
optHistoryLog
.
setOptLogDetail
(
optDetail
);
optHistoryLogService
.
save
(
optHistoryLog
);
return
result
;
}
public
boolean
cancel
(
OrderVo
orderVo
)
{
ClfOrderMapping
orderMapping
=
clfOrderMappingRepository
.
findByChannelOrderNoLastOne
(
orderVo
.
getChannelOrderNumber
());
if
(
orderMapping
==
null
)
{
log
.
info
(
"sqlXyqb,关单失败,无订单 channelOrderNumber={}"
,
orderVo
.
getChannelOrderNumber
());
return
false
;
}
XUser
xUser
=
xyqbUserService
.
findXUserById
(
orderMapping
.
getQgUserId
());
if
(
xUser
==
null
)
{
log
.
info
(
"sqlXyqb,关单失败,未找到用户 channelOrderNumber={}"
,
orderVo
.
getChannelOrderNumber
());
return
false
;
}
Long
userId
=
xUser
.
getId
();
ConcurrentMap
<
Object
,
Object
>
data
=
Maps
.
newConcurrentMap
();
ArrayList
<
Object
>
cancel_list
=
Lists
.
newArrayList
();
cancel_list
.
add
(
"update xyqb.quota_credit set is_active=0 where user_id="
+
userId
);
cancel_list
.
add
(
"update xyqb.quota_account set is_active=0 where user_id="
+
userId
);
cancel_list
.
add
(
"update xyqb.loan_application_history set progress=16 where user_id="
+
userId
);
cancel_list
.
add
(
"update xyqb.loan_application_history set is_active=0 where user_id="
+
userId
);
cancel_list
.
add
(
"delete from apply_quota_record where user_id="
+
userId
);
cancel_list
.
add
(
"delete from user_operation_history where user_id="
+
userId
);
data
.
put
(
"sql"
,
cancel_list
);
String
cancel_result
=
jolyneCenter
.
sqlXyqb
(
JSONTools
.
serialize
(
data
));
return
"success"
.
equals
(
cancel_result
);
}
public
HistoryOrderStatusVoModel
getOrderHistoryStatus
(
String
channelOrderNumber
)
{
ClfOrderMapping
orderMapping
=
clfOrderMappingRepository
.
findByChannelOrderNoLastOne
(
channelOrderNumber
);
HistoryOrderStatusVoModel
historyOrderStatusVoModel
=
new
HistoryOrderStatusVoModel
();
if
(
orderMapping
==
null
)
{
return
historyOrderStatusVoModel
;
}
OrderApprove
orderApprove
=
orderApproveRepository
.
findByCreditNumber
(
orderMapping
.
getApplyNo
());
ServiceResult
<
XyqbHistoryOrderStatusServiceResultModel
>
xyqbOrderHistoryStatusResult
=
xyqbCenterService
.
getXyqbOrderHistoryStatus
(
orderMapping
.
getApplyNo
(),
orderMapping
.
getLoanId
());
if
(
xyqbOrderHistoryStatusResult
.
isSuccess
())
{
log
.
info
(
"[getOrderHistoryStatus]查询成功channelOrderNumber={}, xyqbOrderHistoryStatusResult={}"
,
channelOrderNumber
,
JSONTools
.
serialize
(
xyqbOrderHistoryStatusResult
));
XyqbHistoryOrderStatusServiceResultModel
data
=
xyqbOrderHistoryStatusResult
.
getData
();
List
<
VoOrderStatus
>
historyStatusList
=
new
ArrayList
<>();
for
(
QueryXyqbOrderStatus
queryXyqbOrderStatus
:
data
.
getHistoryStatus
())
{
VoOrderStatus
voOrderStatus
=
new
VoOrderStatus
();
Tuple
<
String
,
String
>
stautsName
=
OrderUtil
.
KaNoticeTypeNameConvertChnName
(
queryXyqbOrderStatus
.
getStatus
(),
orderApprove
);
voOrderStatus
.
setStatus
(
stautsName
.
getValue
());
voOrderStatus
.
setUpdateTime
(
new
Date
(
queryXyqbOrderStatus
.
getUpdateTime
()));
historyStatusList
.
add
(
voOrderStatus
);
}
historyOrderStatusVoModel
.
setHistoryStatus
(
historyStatusList
);
return
historyOrderStatusVoModel
;
}
else
{
log
.
info
(
"[getOrderHistoryStatus]查询失败channelOrderNumber={}, xyqbOrderHistoryStatusResult={}"
,
channelOrderNumber
,
JSONTools
.
serialize
(
xyqbOrderHistoryStatusResult
));
return
historyOrderStatusVoModel
;
}
}
/**
* 贷前关单
*
* @param
* @return
*/
public
boolean
cancelPreLoan
(
String
channelOrderNumber
)
{
/*Order order = this.orderRepository.findOrderByChannelOrderNumber(channelOrderNumber);
ClfOrderMapping orderMapping = this.clfOrderMappingRepository.findByChannelOrderNoLastOne(channelOrderNumber);
if (orderMapping == null) {
login.info("cancelPreLoan,贷前关单失败,无订单 channelOrderNumber={}", channelOrderNumber);
return false;
}*/
Long
id
=
xyqbCenterService
.
cancelPreLoan
(
channelOrderNumber
);
ConcurrentMap
<
Object
,
Object
>
data
=
Maps
.
newConcurrentMap
();
data
.
put
(
"data"
,
id
);
data
.
put
(
"remark"
,
"系统关单"
);
String
result
=
clothoCenterService
.
cancelPreLoan
(
data
);
return
true
;
}
/**
* 贷后关单
*
* @param
* @return
*/
public
boolean
cancelAfterLoan
(
String
channelOrderNumber
)
{
ClfOrderMapping
orderMapping
=
this
.
clfOrderMappingRepository
.
findByChannelOrderNoLastOne
(
channelOrderNumber
);
if
(
orderMapping
==
null
)
{
log
.
info
(
"cancelAfterLoan,贷后关单失败,无订单 channelOrderNumber={}"
,
channelOrderNumber
);
return
false
;
}
if
(
orderMapping
.
getLoanId
()
==
null
)
{
log
.
info
(
"cancelAfterLoan,贷后关单失败,loanId为空,channelOrderNumber={}"
,
channelOrderNumber
);
return
false
;
}
ConcurrentMap
<
Object
,
Object
>
data
=
Maps
.
newConcurrentMap
();
data
.
put
(
"loanId"
,
orderMapping
.
getLoanId
());
data
.
put
(
"userId"
,
orderMapping
.
getQgUserId
());
data
.
put
(
"flowNo"
,
UUID
.
randomUUID
());
String
id
=
clothoCenterService
.
cancelAfterLoan
(
data
);
return
true
;
}
/**
* 查询订单历史推送记录
* @param channelOrderNumber
* @return
*/
public
List
<
CallbackRecordVoModel
>
getOrderCallbackRecordList
(
String
channelOrderNumber
)
{
List
<
CallbackRecordVoModel
>
callbackRecordVoModelList
=
new
ArrayList
<>();
ClfOrderMapping
orderMapping
=
clfOrderMappingRepository
.
findByChannelOrderNoLastOne
(
channelOrderNumber
);
if
(
orderMapping
==
null
)
{
return
null
;
}
List
<
CallbackRecord
>
callbackRecordList
=
clfCenterService
.
findCallbackRecordByApplyNo
(
orderMapping
.
getApplyNo
());
if
(
CollectionUtils
.
isNotEmpty
(
callbackRecordList
))
{
for
(
CallbackRecord
callbackRecord
:
callbackRecordList
)
{
CallbackRecordVoModel
callbackRecordVoModel
=
new
CallbackRecordVoModel
();
callbackRecordVoModel
.
setChannelOrderNo
(
orderMapping
.
getChannelOrderNo
());
callbackRecordVoModel
.
setApplyNo
(
orderMapping
.
getApplyNo
());
callbackRecordVoModel
.
setLoanId
(
orderMapping
.
getLoanId
());
callbackRecordVoModel
.
setTermNo
(
callbackRecord
.
getTermNo
());
callbackRecordVoModel
.
setNoticeType
(
callbackRecord
.
getNoticeType
());
callbackRecordVoModel
.
setCallbackStatus
(
callbackRecord
.
getCallbackStatus
());
callbackRecordVoModel
.
setChannelId
(
callbackRecord
.
getChannelId
());
callbackRecordVoModel
.
setCreatedAt
(
callbackRecord
.
getCreatedAt
());
callbackRecordVoModel
.
setUpdatedAt
(
callbackRecord
.
getUpdatedAt
());
callbackRecordVoModel
.
setTableName
(
"Success"
);
callbackRecordVoModelList
.
add
(
callbackRecordVoModel
);
}
}
List
<
CallbackFailRecord
>
callbackFailRecordList
=
clfCenterService
.
findCallbackFailRecordByApplyNo
(
orderMapping
.
getApplyNo
());
if
(
CollectionUtils
.
isNotEmpty
(
callbackFailRecordList
))
{
for
(
CallbackFailRecord
callbackFailRecord
:
callbackFailRecordList
)
{
CallbackRecordVoModel
callbackFailRecordVoModel
=
new
CallbackRecordVoModel
();
callbackFailRecordVoModel
.
setChannelOrderNo
(
orderMapping
.
getChannelOrderNo
());
callbackFailRecordVoModel
.
setApplyNo
(
orderMapping
.
getApplyNo
());
callbackFailRecordVoModel
.
setLoanId
(
orderMapping
.
getLoanId
());
callbackFailRecordVoModel
.
setTermNo
(
callbackFailRecord
.
getTermNo
());
callbackFailRecordVoModel
.
setNoticeType
(
callbackFailRecord
.
getNoticeType
());
callbackFailRecordVoModel
.
setCallbackStatus
(
callbackFailRecord
.
getCallbackStatus
());
callbackFailRecordVoModel
.
setChannelId
(
callbackFailRecord
.
getChannelId
());
callbackFailRecordVoModel
.
setRetryTimes
(
callbackFailRecord
.
getRetryTimes
());
callbackFailRecordVoModel
.
setFailCode
(
callbackFailRecord
.
getFailCode
());
callbackFailRecordVoModel
.
setCallbackRouter
(
callbackFailRecord
.
getCallbackRouter
());
callbackFailRecordVoModel
.
setIsActive
(
callbackFailRecord
.
getIsActive
());
callbackFailRecordVoModel
.
setExdata
(
callbackFailRecord
.
getExdata
());
callbackFailRecordVoModel
.
setCreatedAt
(
callbackFailRecord
.
getCreatedAt
());
callbackFailRecordVoModel
.
setUpdatedAt
(
callbackFailRecord
.
getUpdatedAt
());
callbackFailRecordVoModel
.
setTableName
(
"Fail"
);
callbackRecordVoModelList
.
add
(
callbackFailRecordVoModel
);
}
}
return
callbackRecordVoModelList
;
}
/**
* 查询还款计划
* @param channelOrderNumber
* @param loanId
* @return
*/
public
Object
findRepaymentPlan
(
String
channelOrderNumber
,
Long
loanId
)
{
if
(
loanId
==
null
||
loanId
<
1
)
{
ClfOrderMapping
orderMapping
=
clfCenterService
.
findOrderMappingByChannelOrderNo
(
channelOrderNumber
);
if
(
orderMapping
==
null
||
orderMapping
.
getLoanId
()
==
null
)
{
return
null
;
}
loanId
=
orderMapping
.
getLoanId
();
}
// xyqbCenterService.findRepaymentPlan(loanId);
return
null
;
}
boolean
cancel
(
OrderVo
orderVo
);
/**
HistoryOrderStatusVoModel
getOrderHistoryStatus
(
String
channelOrderNumber
);
* 查询订单状态
* @param currentStatus
* @param orderMapping
* @return
*/
private
Tuple
<
String
,
List
<
OrderVo
.
OptButton
>>
getCurrentStatusAndButtons
(
QueryXyqbOrderStatus
currentStatus
,
ClfOrderMapping
orderMapping
)
{
Tuple
tuple
=
new
Tuple
();
List
<
OrderVo
.
OptButton
>
buttonList
=
new
ArrayList
<>();
if
(
currentStatus
!=
null
)
{
boolean
cancelPreLoan
(
String
channelOrderNumber
);
if
(
StringUtils
.
isNotEmpty
(
currentStatus
.
getStatus
()))
{
OrderVo
.
OptButton
buttonBeforeCancel
=
new
OrderVo
.
OptButton
();
buttonBeforeCancel
.
setAction
(
OrderVo
.
OptButtonAction
.
cancel
.
name
());
buttonBeforeCancel
.
setName
(
OrderVo
.
OptButtonAction
.
cancel
.
getDesc
());
switch
(
currentStatus
.
getStatus
())
{
case
"CREDIT_SUCC"
:
// 授信成功 需要 审批
OrderVo
.
OptButton
buttonApprove
=
new
OrderVo
.
OptButton
();
buttonApprove
.
setAction
(
OrderVo
.
OptButtonAction
.
audit
.
name
());
buttonApprove
.
setName
(
OrderVo
.
OptButtonAction
.
audit
.
getDesc
());
buttonList
.
add
(
buttonApprove
);
buttonList
.
add
(
buttonBeforeCancel
);
tuple
.
setKey
(
"授信成功"
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
case
"APPROVE_ING"
:
OrderApprove
orderApprove
=
orderApproveRepository
.
findByCreditNumber
(
orderMapping
.
getApplyNo
());
if
(
orderApprove
==
null
)
{
OrderVo
.
OptButton
buttonApprove2
=
new
OrderVo
.
OptButton
();
buttonApprove2
.
setAction
(
OrderVo
.
OptButtonAction
.
audit
.
name
());
buttonApprove2
.
setName
(
OrderVo
.
OptButtonAction
.
audit
.
getDesc
());
buttonList
.
add
(
buttonApprove2
);
buttonList
.
add
(
buttonBeforeCancel
);
tuple
.
setKey
(
"授信成功,待审批"
);
tuple
.
setValue
(
buttonList
);
}
else
{
tuple
.
setKey
(
"审批中(等待几分钟)"
);
buttonList
.
add
(
buttonBeforeCancel
);
tuple
.
setValue
(
buttonList
);
}
return
tuple
;
case
"REJECT"
:
tuple
.
setKey
(
"审批拒绝"
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
case
"FUAD_ASSIFN_SUCC"
:
tuple
.
setKey
(
"审批通过,待提现"
);
buttonList
.
add
(
buttonBeforeCancel
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
case
"WITHDRAW"
:
// 提现申请成功 需要放款
tuple
.
setKey
(
"申请提现成功"
);
LoanApplicationHistory
loanApplicationHistory
=
xyqbCenterService
.
findLoanApplicationHistoryById
(
orderMapping
.
getLoanId
());
if
(
loanApplicationHistory
!=
null
)
{
if
(
LoanProgress
.
WAITING_FUND
.
equals
(
loanApplicationHistory
.
getProgress
()))
{
boolean
cancelAfterLoan
(
String
channelOrderNumber
);
// 更改放款时间,二次风控回调
OrderVo
.
OptButton
secondAudit
=
new
OrderVo
.
OptButton
();
secondAudit
.
setAction
(
OrderVo
.
OptButtonAction
.
second_audit
.
name
());
secondAudit
.
setName
(
OrderVo
.
OptButtonAction
.
second_audit
.
getDesc
());
buttonList
.
add
(
secondAudit
);
}
else
if
(
LoanProgress
.
FINAL_SENDED_TO_FUNDING_CORP
.
equals
(
loanApplicationHistory
.
getProgress
()))
{
OrderVo
.
OptButton
buttonPaySucc
=
new
OrderVo
.
OptButton
();
buttonPaySucc
.
setAction
(
OrderVo
.
OptButtonAction
.
pay_succ
.
name
());
buttonPaySucc
.
setName
(
OrderVo
.
OptButtonAction
.
pay_succ
.
getDesc
());
buttonList
.
add
(
buttonPaySucc
);
OrderVo
.
OptButton
buttonPayFail
=
new
OrderVo
.
OptButton
();
buttonPayFail
.
setAction
(
OrderVo
.
OptButtonAction
.
pay_fail
.
name
());
buttonPayFail
.
setName
(
OrderVo
.
OptButtonAction
.
pay_fail
.
getDesc
());
buttonList
.
add
(
buttonPayFail
);
buttonList
.
add
(
buttonBeforeCancel
);
}
tuple
.
setValue
(
buttonList
);
}
return
tuple
;
case
"PAY_ING"
:
tuple
.
setKey
(
"放款中(等待几分钟)"
);
buttonList
.
add
(
buttonBeforeCancel
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
case
"FUND_WAITING_WITHDRAW"
:
tuple
.
setKey
(
"放款到存管账户,待二次提现"
);
OrderVo
.
OptButton
cancelAfterButton0
=
new
OrderVo
.
OptButton
();
cancelAfterButton0
.
setAction
(
OrderVo
.
OptButtonAction
.
cancel_after
.
name
());
cancelAfterButton0
.
setName
(
OrderVo
.
OptButtonAction
.
cancel_after
.
getDesc
());
buttonList
.
add
(
cancelAfterButton0
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
case
"FUND_SUCC"
:
OrderApprove
orderApprove2
=
orderApproveRepository
.
findByCreditNumber
(
orderMapping
.
getApplyNo
());
if
(
orderApprove2
!=
null
&&
orderApprove2
.
getFundType
()
!=
0
)
{
// 是存管
tuple
.
setKey
(
"放款到存管,待二次提现"
);
OrderVo
.
OptButton
cancelAfterButton
=
new
OrderVo
.
OptButton
();
cancelAfterButton
.
setAction
(
OrderVo
.
OptButtonAction
.
cancel_after
.
name
());
cancelAfterButton
.
setName
(
OrderVo
.
OptButtonAction
.
cancel_after
.
getDesc
());
buttonList
.
add
(
cancelAfterButton
);
OrderVo
.
OptButton
withdrawSecondButton
=
new
OrderVo
.
OptButton
();
withdrawSecondButton
.
setAction
(
OrderVo
.
OptButtonAction
.
withdraw_second
.
name
());
withdrawSecondButton
.
setName
(
OrderVo
.
OptButtonAction
.
withdraw_second
.
getDesc
());
buttonList
.
add
(
withdrawSecondButton
);
}
else
{
tuple
.
setKey
(
"放款成功"
);
}
tuple
.
setValue
(
buttonList
);
return
tuple
;
case
"FUND_WITHDRAW_SUCC"
:
tuple
.
setKey
(
"存管提现成功"
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
case
"FUND_FAIL"
:
tuple
.
setKey
(
"放款失败"
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
case
"ALL_REPAID"
:
tuple
.
setKey
(
"已结清"
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
case
"CANCEL_LOAN"
:
tuple
.
setKey
(
"已关单"
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
case
"CANCEL_AFTER_LOAN"
:
tuple
.
setKey
(
"存管提现超时或贷后关单"
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
default
:
tuple
.
setKey
(
"未知状态"
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
}
}
}
else
{
List
<
CallbackRecordVoModel
>
getOrderCallbackRecordList
(
String
channelOrderNumber
);
tuple
.
setKey
(
"未知状态"
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
}
tuple
.
setKey
(
"未知状态"
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
}
Object
findRepaymentPlan
(
String
channelOrderNumber
,
Long
loanId
);
}
}
src/main/java/cn/quantgroup/cashloanflowboss/api/order/service/OrderServiceImpl.java
0 → 100644
View file @
27827bbd
package
cn
.
quantgroup
.
cashloanflowboss
.
api
.
order
.
service
;
import
cn.quantgroup.cashloanflowboss.api.optlog.entity.OptHistoryLog
;
import
cn.quantgroup.cashloanflowboss.api.optlog.service.OptHistoryLogServiceImpl
;
import
cn.quantgroup.cashloanflowboss.spi.clf.entity.CallbackFailRecord
;
import
cn.quantgroup.cashloanflowboss.spi.clf.model.LoanProgress
;
import
cn.quantgroup.cashloanflowboss.api.channel.entity.ChannelConf
;
import
cn.quantgroup.cashloanflowboss.api.channel.repository.ChannelConfRepository
;
import
cn.quantgroup.cashloanflowboss.api.channel.util.ChannelConfUtil
;
import
cn.quantgroup.cashloanflowboss.api.order.entity.OrderApprove
;
import
cn.quantgroup.cashloanflowboss.api.order.model.*
;
import
cn.quantgroup.cashloanflowboss.api.order.repository.OrderApproveRepository
;
import
cn.quantgroup.cashloanflowboss.api.order.util.OrderUtil
;
import
cn.quantgroup.cashloanflowboss.core.Application
;
import
cn.quantgroup.cashloanflowboss.core.base.ServiceResult
;
import
cn.quantgroup.cashloanflowboss.core.base.Tuple
;
import
cn.quantgroup.cashloanflowboss.spi.clf.entity.CallbackRecord
;
import
cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping
;
import
cn.quantgroup.cashloanflowboss.spi.clf.model.CallbackRecordVoModel
;
import
cn.quantgroup.cashloanflowboss.spi.clf.repository.ClfOrderMappingRepository
;
import
cn.quantgroup.cashloanflowboss.spi.clf.service.CLFCenterService
;
import
cn.quantgroup.cashloanflowboss.spi.clotho.service.ClothoCenterService
;
import
cn.quantgroup.cashloanflowboss.spi.jolyne.JolyneCenter
;
import
cn.quantgroup.cashloanflowboss.spi.jolyne.JolyneUtil
;
import
cn.quantgroup.cashloanflowboss.spi.user.service.XyqbUserService
;
import
cn.quantgroup.cashloanflowboss.spi.xyqb.entity.Contract
;
import
cn.quantgroup.cashloanflowboss.spi.xyqb.entity.LoanApplicationHistory
;
import
cn.quantgroup.cashloanflowboss.spi.xyqb.service.XYQBCenterService
;
import
cn.quantgroup.cashloanflowboss.utils.JSONTools
;
import
cn.quantgroup.user.retbean.XUser
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Maps
;
import
java.math.BigDecimal
;
import
java.util.ArrayList
;
import
java.util.Calendar
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Objects
;
import
java.util.UUID
;
import
java.util.concurrent.ConcurrentMap
;
import
javax.persistence.criteria.Predicate
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.commons.lang3.exception.ExceptionUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Page
;
import
org.springframework.data.domain.PageRequest
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
/**
* function:
* date: 2019/8/8
*
* @author: suntao
*/
@Slf4j
@Service
public
class
OrderServiceImpl
implements
OrderService
{
@Autowired
private
OptHistoryLogServiceImpl
optHistoryLogService
;
@Autowired
private
ChannelConfRepository
channelConfRepository
;
@Autowired
private
OrderApproveRepository
orderApproveRepository
;
@Autowired
private
XyqbUserService
xyqbUserService
;
@Autowired
private
XYQBCenterService
xyqbCenterService
;
@Autowired
private
ClothoCenterService
clothoCenterService
;
@Autowired
private
CLFCenterService
clfCenterService
;
@Autowired
private
JolyneCenter
jolyneCenter
;
@Autowired
private
ClfOrderMappingRepository
clfOrderMappingRepository
;
@Override
public
Page
<
OrderVo
>
orderList
(
Long
channelId
,
String
channelOrderNo
,
String
applyNo
,
Long
loanId
,
Integer
pageNumber
,
Integer
pageSize
)
{
Page
<
ClfOrderMapping
>
page
=
this
.
clfOrderMappingRepository
.
findAll
((
root
,
criteriaQuery
,
criteriaBuilder
)
->
{
List
<
Predicate
>
predicates
=
new
ArrayList
<>();
// 指定渠道号
if
(
Objects
.
nonNull
(
channelId
))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"registeredFrom"
),
channelId
.
longValue
()));
}
if
(
StringUtils
.
isNotEmpty
(
channelOrderNo
))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"channelOrderNo"
),
channelOrderNo
));
}
if
(
StringUtils
.
isNotEmpty
(
applyNo
))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"applyNo"
),
applyNo
));
}
if
(
loanId
!=
null
&&
loanId
>
0
)
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"loanId"
),
loanId
));
}
// 设置查询条件
criteriaQuery
.
where
(
criteriaBuilder
.
and
(
predicates
.
toArray
(
new
Predicate
[
predicates
.
size
()])));
// 指定排序
criteriaQuery
.
orderBy
(
criteriaBuilder
.
desc
(
root
.
get
(
"id"
)));
return
criteriaQuery
.
getRestriction
();
},
new
PageRequest
(
pageNumber
,
pageSize
));
return
page
.
map
(
it
->
{
OrderVo
orderVo
=
new
OrderVo
();
orderVo
.
setId
(
it
.
getId
());
orderVo
.
setChannelId
(
it
.
getRegisteredFrom
());
orderVo
.
setChannelOrderNumber
(
it
.
getChannelOrderNo
());
if
(!
Application
.
getPrincipal
().
isChannel
())
{
orderVo
.
setLoanId
(
it
.
getLoanId
());
// 授信申请号,非渠道权限登陆显示admin及以上权限用户
orderVo
.
setApplyNo
(
it
.
getApplyNo
());
}
orderVo
.
setCreatedAt
(
it
.
getCreatedAt
());
if
(
StringUtils
.
isNotEmpty
(
it
.
getApplyNo
()))
{
ServiceResult
<
XyqbCurrentOrderStatusServiceResultModel
>
xyqbCenterServiceXyqbOrderStatus
=
xyqbCenterService
.
getXyqbOrderStatus
(
it
.
getApplyNo
(),
it
.
getLoanId
());
log
.
info
(
"[xyqbCenterService.getXyqbOrderStatus]xyqbOrderStatus={}"
,
JSONTools
.
serialize
(
xyqbCenterServiceXyqbOrderStatus
));
if
(
xyqbCenterServiceXyqbOrderStatus
.
isSuccess
())
{
QueryXyqbOrderStatus
currentStatus
=
xyqbCenterServiceXyqbOrderStatus
.
getData
().
getCurrentStatus
();
Tuple
<
String
,
List
<
OrderVo
.
OptButton
>>
currentStatusAndButtons
=
this
.
getCurrentStatusAndButtons
(
currentStatus
,
it
);
orderVo
.
setStatus
(
currentStatusAndButtons
.
getKey
());
if
(
Application
.
isDebug
())
{
// 只有测试环境才需要订单操作
orderVo
.
setOpt
(
currentStatusAndButtons
.
getValue
());
}
orderVo
.
setMessage
(
""
);
}
else
{
orderVo
.
setStatus
(
"未知,稍后查询"
);
orderVo
.
setMessage
(
"订单查询错误"
);
}
}
else
{
orderVo
.
setStatus
(
"授信中"
);
orderVo
.
setOpt
(
new
ArrayList
<>());
orderVo
.
setMessage
(
""
);
}
return
orderVo
;
});
}
/**
*
* @param approveVo
* @return Tuple<Boolean 审批结果 true 审批完成 false 审批操作失败, Boolean 资产计划配置 true 配置没问题 false 配置需要检查>
*/
@Override
public
Tuple
<
Boolean
,
Boolean
>
approveOpt
(
ApproveVo
approveVo
)
{
log
.
info
(
"approveOpt,审批操作入参,approveVo={}"
,
JSONTools
.
serialize
(
approveVo
));
if
(
StringUtils
.
isEmpty
(
approveVo
.
getAmount
()))
{
// 如果UI 金额为空 默认4000
approveVo
.
setAmount
(
"4000"
);
}
if
(
approveVo
.
getPeriod
()
==
null
)
{
// 如果UI 期数为空 3期
approveVo
.
setPeriod
(
3
);
}
ClfOrderMapping
orderMapping
=
clfOrderMappingRepository
.
findByChannelOrderNoLastOne
(
approveVo
.
getChannelOrderNumber
());
if
(
orderMapping
==
null
)
{
log
.
info
(
"approveOpt,审批失败,无订单 channelOrderNumber={}"
,
approveVo
.
getChannelOrderNumber
());
return
new
Tuple
<>(
false
,
false
);
}
if
(
Application
.
getPrincipal
().
isChannel
()
&&
!
Application
.
getPrincipal
().
isSameChannel
(
orderMapping
.
getRegisteredFrom
()))
{
log
.
info
(
"approveOpt,审批失败,不是该渠道订单无法审批 channelOrderNumber={}"
,
approveVo
.
getChannelOrderNumber
());
return
new
Tuple
<>(
false
,
false
);
}
XUser
xUser
=
xyqbUserService
.
findXUserById
(
orderMapping
.
getQgUserId
());
if
(
xUser
==
null
)
{
log
.
info
(
"approveOpt,审批失败,未找到用户 channelOrderNumber={}"
,
approveVo
.
getChannelOrderNumber
());
return
new
Tuple
<>(
false
,
false
);
}
ChannelConf
channelConf
=
channelConfRepository
.
getByChannelId
(
orderMapping
.
getRegisteredFrom
());
if
(
channelConf
==
null
)
{
log
.
info
(
"approveOpt,审批失败,boss渠道配置为空 channelOrderNumber={}"
,
approveVo
.
getChannelOrderNumber
());
return
new
Tuple
<>(
false
,
false
);
}
// 额度有效期
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
setTime
(
new
Date
());
calendar
.
add
(
Calendar
.
DAY_OF_YEAR
,
7
);
Integer
fundId
=
ChannelConfUtil
.
getFundIdByType
(
approveVo
.
getFundType
(),
channelConf
);
// 资方 及 期数额度规则
String
fundFormat
=
String
.
format
(
OrderUtil
.
financeProductsFormat
,
approveVo
.
getAmount
(),
approveVo
.
getAmount
(),
approveVo
.
getPeriod
(),
fundId
);
OrderApprove
orderApproveExsit
=
orderApproveRepository
.
findByChannelOrderNumber
(
approveVo
.
getChannelOrderNumber
());
if
(
orderApproveExsit
!=
null
)
{
orderApproveExsit
.
setFundId
(
fundId
);
orderApproveExsit
.
setFundType
(
approveVo
.
getFundType
());
orderApproveExsit
.
setUpdateTime
(
new
Date
());
orderApproveRepository
.
save
(
orderApproveExsit
);
}
else
{
OrderApprove
orderApprove
=
new
OrderApprove
();
orderApprove
.
setChannelOrderNumber
(
approveVo
.
getChannelOrderNumber
());
orderApprove
.
setCreditNumber
(
orderMapping
.
getApplyNo
());
orderApprove
.
setChannelId
(
orderMapping
.
getRegisteredFrom
());
orderApprove
.
setFundId
(
fundId
);
orderApprove
.
setFundType
(
approveVo
.
getFundType
());
orderApprove
.
setCreateTime
(
new
Date
());
orderApprove
.
setUpdateTime
(
new
Date
());
orderApproveRepository
.
save
(
orderApprove
);
}
Map
<
String
,
Object
>
data
=
new
HashMap
<>(
16
);
data
.
put
(
"code"
,
0
);
data
.
put
(
"msg"
,
"success"
);
data
.
put
(
"bizChannel"
,
orderMapping
.
getRegisteredFrom
());
data
.
put
(
"uuid"
,
xUser
.
getUuid
());
data
.
put
(
"bizNo"
,
orderMapping
.
getApplyNo
());
data
.
put
(
"bizType"
,
channelConf
.
getBizType
());
data
.
put
(
"auditResult"
,
approveVo
.
getIsPass
());
data
.
put
(
"amount"
,
approveVo
.
getAmount
());
data
.
put
(
"deadLine"
,
calendar
.
getTime
().
getTime
());
data
.
put
(
"financeProducts"
,
fundFormat
);
// 发起审批
log
.
info
(
"[approveOpt] 向clotho发起审批,data={}"
,
JSONTools
.
serialize
(
data
));
String
approveStringResult
=
clothoCenterService
.
approve
(
data
);
Boolean
corpPolicyValidate
=
false
;
try
{
corpPolicyValidate
=
xyqbCenterService
.
validateCorpPolicy
(
Long
.
valueOf
(
fundId
),
new
Date
());
}
catch
(
Exception
e
)
{
log
.
error
(
"审批,资方校验异常,channelOrderNumber={},fundId={}, e={}"
,
orderMapping
.
getChannelOrderNo
(),
fundId
,
ExceptionUtils
.
getStackTrace
(
e
));
}
// 操作记录
OptHistoryLog
optHistoryLog
=
new
OptHistoryLog
();
optHistoryLog
.
setChannelOrderNumber
(
approveVo
.
getChannelOrderNumber
());
optHistoryLog
.
setCreditNumber
(
orderMapping
.
getApplyNo
());
optHistoryLog
.
setLoanId
(
orderMapping
.
getLoanId
());
optHistoryLog
.
setChannelId
(
orderMapping
.
getRegisteredFrom
());
optHistoryLog
.
setOptName
(
"审批操作"
);
optHistoryLog
.
setCreateTime
(
new
Date
());
Boolean
optResult
;
if
(
"success"
.
equals
(
approveStringResult
))
{
optHistoryLog
.
setOptLogDetail
(
corpPolicyValidate
?
""
:
"资产计划未配置,请联系管理员配置"
);
optHistoryLog
.
setOptResult
(
true
);
optResult
=
true
;
log
.
info
(
"审批申请成功,channelOrderNumber={}"
,
orderMapping
.
getChannelOrderNo
());
}
else
{
optHistoryLog
.
setOptResult
(
false
);
optHistoryLog
.
setOptLogDetail
(
"审批失败"
);
log
.
info
(
"审批申请失败,channelOrderNumber={},requestParam={}"
,
orderMapping
.
getChannelOrderNo
(),
JSONTools
.
serialize
(
data
));
optResult
=
false
;
}
optHistoryLogService
.
save
(
optHistoryLog
);
return
new
Tuple
<>(
optResult
,
corpPolicyValidate
);
}
/**
* 已经自动,无须调用
* 二次风控
*
* @param channelOrderNumber
* @return
*/
@Transactional
@Override
public
boolean
secondAudit
(
String
channelOrderNumber
)
{
boolean
result
=
true
;
// 操作记录
OptHistoryLog
optHistoryLog
=
new
OptHistoryLog
();
optHistoryLog
.
setChannelOrderNumber
(
channelOrderNumber
);
ClfOrderMapping
orderMapping
=
this
.
clfOrderMappingRepository
.
findByChannelOrderNoLastOne
(
channelOrderNumber
);
if
(
orderMapping
==
null
||
orderMapping
.
getLoanId
()
==
null
)
{
log
.
info
(
"secondAudit,orderMapping为空或者loanId为空,channelOrderNumber="
.
concat
(
channelOrderNumber
));
optHistoryLog
.
setOptName
(
"二次审批操作"
);
optHistoryLog
.
setOptLogDetail
(
"orderMapping为空或者loanId为空,操作失败"
);
optHistoryLog
.
setOptResult
(
false
);
optHistoryLog
.
setCreateTime
(
new
Date
());
optHistoryLogService
.
save
(
optHistoryLog
);
return
false
;
}
optHistoryLog
.
setCreditNumber
(
orderMapping
.
getApplyNo
());
optHistoryLog
.
setLoanId
(
orderMapping
.
getLoanId
());
optHistoryLog
.
setChannelId
(
orderMapping
.
getRegisteredFrom
());
optHistoryLog
.
setOptName
(
"二次审批操作"
);
optHistoryLog
.
setCreateTime
(
new
Date
());
// 更新合同状态
Contract
conscont
=
xyqbCenterService
.
findContractByUserId
(
orderMapping
.
getQgUserId
());
if
(
conscont
!=
null
)
{
if
(
conscont
.
getGenerateStatus
()
!=
2
)
{
log
.
info
(
"secondAudit,合同为空,channelOrderNumber="
.
concat
(
channelOrderNumber
));
optHistoryLog
.
setOptName
(
"二次审批操作"
);
optHistoryLog
.
setOptLogDetail
(
"合同未生成,请更换新的身份证尝试"
);
optHistoryLog
.
setOptResult
(
false
);
optHistoryLog
.
setCreateTime
(
new
Date
());
optHistoryLogService
.
save
(
optHistoryLog
);
// conscont.setGenerateStatus(2);
// xyqbCenterService.saveContract(conscont);
}
}
else
{
// 合同为空 log表记录问题,UI用户查询
log
.
info
(
"secondAudit,合同为空,channelOrderNumber="
.
concat
(
channelOrderNumber
));
optHistoryLog
.
setOptName
(
"二次审批操作"
);
optHistoryLog
.
setOptLogDetail
(
"合同为空,请更换新的身份证尝试"
);
optHistoryLog
.
setOptResult
(
false
);
optHistoryLog
.
setCreateTime
(
new
Date
());
optHistoryLogService
.
save
(
optHistoryLog
);
// 不需要return
}
// 二次风控回调
XUser
xUser
=
xyqbUserService
.
findXUserById
(
orderMapping
.
getQgUserId
());
if
(
xUser
==
null
)
{
log
.
info
(
"[secendAudit]二次风控失败,未找到user channelOrderNumber={}"
,
channelOrderNumber
);
optHistoryLog
.
setOptLogDetail
(
"二次风控失败,未找到user"
);
optHistoryLog
.
setOptResult
(
false
);
optHistoryLogService
.
save
(
optHistoryLog
);
return
false
;
}
ChannelConf
channelConf
=
channelConfRepository
.
getByChannelId
(
orderMapping
.
getRegisteredFrom
());
if
(
channelConf
==
null
)
{
log
.
info
(
"[secendAudit]二次风控失败,未找到channelConf配置 channelOrderNumber={}"
,
channelOrderNumber
);
optHistoryLog
.
setOptLogDetail
(
"二次风控失败,未找到channelConf配置"
);
optHistoryLog
.
setOptResult
(
false
);
optHistoryLogService
.
save
(
optHistoryLog
);
return
false
;
}
LoanApplicationHistory
loanApplicationHistory
=
xyqbCenterService
.
findLoanApplicationHistoryById
(
orderMapping
.
getLoanId
());
if
(
LoanProgress
.
START_ORDER
.
equals
(
loanApplicationHistory
.
getProgress
()))
{
// 50
log
.
info
(
"[secendAudit]二次风控发起,channelOrderNumber={}, bizType={}"
,
channelOrderNumber
,
channelConf
.
getBizType
());
result
=
clothoCenterService
.
orderAuditNotify
(
xUser
.
getUuid
(),
orderMapping
.
getLoanId
(),
true
,
channelConf
.
getBizType
());
if
(
result
)
{
log
.
info
(
"[secendAudit]二次风控成功,channelOrderNumber={}, result={}"
,
channelOrderNumber
,
result
);
}
else
{
log
.
info
(
"[secendAudit]二次风控失败,clotho返回失败 channelOrderNumber={}"
,
channelOrderNumber
);
optHistoryLog
.
setOptLogDetail
(
"二次风控失败,clotho返回失败"
);
optHistoryLog
.
setOptResult
(
false
);
optHistoryLogService
.
save
(
optHistoryLog
);
return
false
;
}
}
else
if
(
LoanProgress
.
WAITING_FUND
.
equals
(
loanApplicationHistory
.
getProgress
()))
{
// 20 已经回调过
result
=
true
;
}
// 更新待放款时间(5分钟之前)
ArrayList
<
String
>
updateWaitingFundingCorpOperatePeople
=
Lists
.
newArrayList
();
updateWaitingFundingCorpOperatePeople
.
add
(
"update waiting_funding_corp_operate_people set created_at = DATE_SUB(created_at, interval 5 minute) where loan_application_history_id = "
+
orderMapping
.
getLoanId
());
jolyneCenter
.
sqlXyqb
(
JolyneUtil
.
getJolneSql
(
updateWaitingFundingCorpOperatePeople
));
optHistoryLog
.
setOptLogDetail
(
"二次风控操作成功"
);
optHistoryLog
.
setOptResult
(
true
);
optHistoryLogService
.
save
(
optHistoryLog
);
log
.
info
(
"[secendAudit]二次风控操作 最后结果,channelOrderNumber={}, result={}"
,
channelOrderNumber
,
result
);
return
result
;
}
/**
* 放款
*
* @param lendingFormModel
* @return
*/
@Transactional
@Override
public
boolean
lending
(
LendingFormModel
lendingFormModel
)
{
boolean
result
=
false
;
OrderApprove
orderApprove
=
this
.
orderApproveRepository
.
findByChannelOrderNumber
(
lendingFormModel
.
getChannelOrderNumber
());
ClfOrderMapping
orderMapping
=
this
.
clfOrderMappingRepository
.
findByChannelOrderNoAndRegisteredFromLastOne
(
lendingFormModel
.
getChannelOrderNumber
(),
lendingFormModel
.
getChannelId
());
String
optDetail
=
""
;
// 操作记录
OptHistoryLog
optHistoryLog
=
new
OptHistoryLog
();
optHistoryLog
.
setChannelOrderNumber
(
lendingFormModel
.
getChannelOrderNumber
());
optHistoryLog
.
setCreditNumber
(
orderMapping
.
getApplyNo
());
optHistoryLog
.
setLoanId
(
orderMapping
.
getLoanId
());
optHistoryLog
.
setChannelId
(
orderMapping
.
getRegisteredFrom
());
optHistoryLog
.
setOptName
(
"放款操作"
);
optHistoryLog
.
setCreateTime
(
new
Date
());
// 更新合同状态
Contract
conscont
=
xyqbCenterService
.
findContractByUserId
(
orderMapping
.
getQgUserId
());
if
(
conscont
==
null
)
{
// 合同为空 log表记录问题,UI用户查询
optDetail
=
optDetail
.
concat
(
"合同未生成,请注意,需要不用身份证才能自动生成合同,"
);
}
if
(
orderApprove
.
getFundType
()
==
0
)
{
// 如果是非存管
result
=
this
.
xyqbCenterService
.
payResultNotify
(
orderMapping
.
getLoanId
(),
lendingFormModel
.
getResult
());
log
.
info
(
"[order_lending]非存管,放款结果通知,channelOrderNumber={}, result={}"
,
lendingFormModel
.
getChannelOrderNumber
(),
result
);
}
else
{
// p2p
Map
data
=
this
.
xyqbCenterService
.
queryLendingRecordCount
(
Long
.
valueOf
(
orderApprove
.
getFundId
()));
log
.
info
(
"[order_lending][queryLendingRecordCount]查询待打款数量,channelOrderNumber={}, data={}"
,
lendingFormModel
.
getChannelOrderNumber
(),
data
);
if
(
data
.
size
()
>
0
)
{
if
(
Objects
.
nonNull
(
data
.
get
(
"totalAmount"
))
&&
Objects
.
nonNull
(
data
.
get
(
"totalCount"
)))
{
result
=
this
.
clothoCenterService
.
lending
(
orderApprove
.
getFundId
(),
new
BigDecimal
(
String
.
valueOf
(
data
.
get
(
"totalAmount"
))),
Integer
.
valueOf
(
String
.
valueOf
(
data
.
get
(
"totalCount"
))));
log
.
info
(
"[order_lending]直投打款,channelOrderNumber={}, result={}"
,
lendingFormModel
.
getChannelOrderNumber
(),
result
);
}
}
}
if
(
result
)
{
optDetail
=
optDetail
.
concat
(
"放款操作成功"
);
optHistoryLog
.
setOptResult
(
true
);
}
else
{
optDetail
=
optDetail
.
concat
(
"放款操作失败"
);
optHistoryLog
.
setOptResult
(
false
);
}
log
.
info
(
"[order_lending]放款操作 最后结果,channelOrderNumber={}, result={}"
,
lendingFormModel
.
getChannelOrderNumber
(),
result
);
optHistoryLog
.
setOptLogDetail
(
optDetail
);
optHistoryLogService
.
save
(
optHistoryLog
);
return
result
;
}
@Override
public
boolean
cancel
(
OrderVo
orderVo
)
{
ClfOrderMapping
orderMapping
=
clfOrderMappingRepository
.
findByChannelOrderNoLastOne
(
orderVo
.
getChannelOrderNumber
());
if
(
orderMapping
==
null
)
{
log
.
info
(
"sqlXyqb,关单失败,无订单 channelOrderNumber={}"
,
orderVo
.
getChannelOrderNumber
());
return
false
;
}
XUser
xUser
=
xyqbUserService
.
findXUserById
(
orderMapping
.
getQgUserId
());
if
(
xUser
==
null
)
{
log
.
info
(
"sqlXyqb,关单失败,未找到用户 channelOrderNumber={}"
,
orderVo
.
getChannelOrderNumber
());
return
false
;
}
Long
userId
=
xUser
.
getId
();
ConcurrentMap
<
Object
,
Object
>
data
=
Maps
.
newConcurrentMap
();
ArrayList
<
Object
>
cancel_list
=
Lists
.
newArrayList
();
cancel_list
.
add
(
"update xyqb.quota_credit set is_active=0 where user_id="
+
userId
);
cancel_list
.
add
(
"update xyqb.quota_account set is_active=0 where user_id="
+
userId
);
cancel_list
.
add
(
"update xyqb.loan_application_history set progress=16 where user_id="
+
userId
);
cancel_list
.
add
(
"update xyqb.loan_application_history set is_active=0 where user_id="
+
userId
);
cancel_list
.
add
(
"delete from apply_quota_record where user_id="
+
userId
);
cancel_list
.
add
(
"delete from user_operation_history where user_id="
+
userId
);
data
.
put
(
"sql"
,
cancel_list
);
String
cancel_result
=
jolyneCenter
.
sqlXyqb
(
JSONTools
.
serialize
(
data
));
return
"success"
.
equals
(
cancel_result
);
}
@Override
public
HistoryOrderStatusVoModel
getOrderHistoryStatus
(
String
channelOrderNumber
)
{
ClfOrderMapping
orderMapping
=
clfOrderMappingRepository
.
findByChannelOrderNoLastOne
(
channelOrderNumber
);
HistoryOrderStatusVoModel
historyOrderStatusVoModel
=
new
HistoryOrderStatusVoModel
();
if
(
orderMapping
==
null
)
{
return
historyOrderStatusVoModel
;
}
OrderApprove
orderApprove
=
orderApproveRepository
.
findByCreditNumber
(
orderMapping
.
getApplyNo
());
ServiceResult
<
XyqbHistoryOrderStatusServiceResultModel
>
xyqbOrderHistoryStatusResult
=
xyqbCenterService
.
getXyqbOrderHistoryStatus
(
orderMapping
.
getApplyNo
(),
orderMapping
.
getLoanId
());
if
(
xyqbOrderHistoryStatusResult
.
isSuccess
())
{
log
.
info
(
"[getOrderHistoryStatus]查询成功channelOrderNumber={}, xyqbOrderHistoryStatusResult={}"
,
channelOrderNumber
,
JSONTools
.
serialize
(
xyqbOrderHistoryStatusResult
));
XyqbHistoryOrderStatusServiceResultModel
data
=
xyqbOrderHistoryStatusResult
.
getData
();
List
<
VoOrderStatus
>
historyStatusList
=
new
ArrayList
<>();
for
(
QueryXyqbOrderStatus
queryXyqbOrderStatus
:
data
.
getHistoryStatus
())
{
VoOrderStatus
voOrderStatus
=
new
VoOrderStatus
();
Tuple
<
String
,
String
>
stautsName
=
OrderUtil
.
KaNoticeTypeNameConvertChnName
(
queryXyqbOrderStatus
.
getStatus
(),
orderApprove
);
voOrderStatus
.
setStatus
(
stautsName
.
getValue
());
voOrderStatus
.
setUpdateTime
(
new
Date
(
queryXyqbOrderStatus
.
getUpdateTime
()));
historyStatusList
.
add
(
voOrderStatus
);
}
historyOrderStatusVoModel
.
setHistoryStatus
(
historyStatusList
);
return
historyOrderStatusVoModel
;
}
else
{
log
.
info
(
"[getOrderHistoryStatus]查询失败channelOrderNumber={}, xyqbOrderHistoryStatusResult={}"
,
channelOrderNumber
,
JSONTools
.
serialize
(
xyqbOrderHistoryStatusResult
));
return
historyOrderStatusVoModel
;
}
}
/**
* 贷前关单
*
* @param
* @return
*/
@Override
public
boolean
cancelPreLoan
(
String
channelOrderNumber
)
{
/*Order order = this.orderRepository.findOrderByChannelOrderNumber(channelOrderNumber);
ClfOrderMapping orderMapping = this.clfOrderMappingRepository.findByChannelOrderNoLastOne(channelOrderNumber);
if (orderMapping == null) {
login.info("cancelPreLoan,贷前关单失败,无订单 channelOrderNumber={}", channelOrderNumber);
return false;
}*/
Long
id
=
xyqbCenterService
.
cancelPreLoan
(
channelOrderNumber
);
ConcurrentMap
<
Object
,
Object
>
data
=
Maps
.
newConcurrentMap
();
data
.
put
(
"data"
,
id
);
data
.
put
(
"remark"
,
"系统关单"
);
String
result
=
clothoCenterService
.
cancelPreLoan
(
data
);
return
true
;
}
/**
* 贷后关单
*
* @param
* @return
*/
@Override
public
boolean
cancelAfterLoan
(
String
channelOrderNumber
)
{
ClfOrderMapping
orderMapping
=
this
.
clfOrderMappingRepository
.
findByChannelOrderNoLastOne
(
channelOrderNumber
);
if
(
orderMapping
==
null
)
{
log
.
info
(
"cancelAfterLoan,贷后关单失败,无订单 channelOrderNumber={}"
,
channelOrderNumber
);
return
false
;
}
if
(
orderMapping
.
getLoanId
()
==
null
)
{
log
.
info
(
"cancelAfterLoan,贷后关单失败,loanId为空,channelOrderNumber={}"
,
channelOrderNumber
);
return
false
;
}
ConcurrentMap
<
Object
,
Object
>
data
=
Maps
.
newConcurrentMap
();
data
.
put
(
"loanId"
,
orderMapping
.
getLoanId
());
data
.
put
(
"userId"
,
orderMapping
.
getQgUserId
());
data
.
put
(
"flowNo"
,
UUID
.
randomUUID
());
String
id
=
clothoCenterService
.
cancelAfterLoan
(
data
);
return
true
;
}
/**
* 查询订单历史推送记录
* @param channelOrderNumber
* @return
*/
@Override
public
List
<
CallbackRecordVoModel
>
getOrderCallbackRecordList
(
String
channelOrderNumber
)
{
List
<
CallbackRecordVoModel
>
callbackRecordVoModelList
=
new
ArrayList
<>();
ClfOrderMapping
orderMapping
=
clfOrderMappingRepository
.
findByChannelOrderNoLastOne
(
channelOrderNumber
);
if
(
orderMapping
==
null
)
{
return
null
;
}
List
<
CallbackRecord
>
callbackRecordList
=
clfCenterService
.
findCallbackRecordByApplyNo
(
orderMapping
.
getApplyNo
());
if
(
CollectionUtils
.
isNotEmpty
(
callbackRecordList
))
{
for
(
CallbackRecord
callbackRecord
:
callbackRecordList
)
{
CallbackRecordVoModel
callbackRecordVoModel
=
new
CallbackRecordVoModel
();
callbackRecordVoModel
.
setChannelOrderNo
(
orderMapping
.
getChannelOrderNo
());
callbackRecordVoModel
.
setApplyNo
(
orderMapping
.
getApplyNo
());
callbackRecordVoModel
.
setLoanId
(
orderMapping
.
getLoanId
());
callbackRecordVoModel
.
setTermNo
(
callbackRecord
.
getTermNo
());
callbackRecordVoModel
.
setNoticeType
(
callbackRecord
.
getNoticeType
());
callbackRecordVoModel
.
setCallbackStatus
(
callbackRecord
.
getCallbackStatus
());
callbackRecordVoModel
.
setChannelId
(
callbackRecord
.
getChannelId
());
callbackRecordVoModel
.
setCreatedAt
(
callbackRecord
.
getCreatedAt
());
callbackRecordVoModel
.
setUpdatedAt
(
callbackRecord
.
getUpdatedAt
());
callbackRecordVoModel
.
setTableName
(
"Success"
);
callbackRecordVoModelList
.
add
(
callbackRecordVoModel
);
}
}
List
<
CallbackFailRecord
>
callbackFailRecordList
=
clfCenterService
.
findCallbackFailRecordByApplyNo
(
orderMapping
.
getApplyNo
());
if
(
CollectionUtils
.
isNotEmpty
(
callbackFailRecordList
))
{
for
(
CallbackFailRecord
callbackFailRecord
:
callbackFailRecordList
)
{
CallbackRecordVoModel
callbackFailRecordVoModel
=
new
CallbackRecordVoModel
();
callbackFailRecordVoModel
.
setChannelOrderNo
(
orderMapping
.
getChannelOrderNo
());
callbackFailRecordVoModel
.
setApplyNo
(
orderMapping
.
getApplyNo
());
callbackFailRecordVoModel
.
setLoanId
(
orderMapping
.
getLoanId
());
callbackFailRecordVoModel
.
setTermNo
(
callbackFailRecord
.
getTermNo
());
callbackFailRecordVoModel
.
setNoticeType
(
callbackFailRecord
.
getNoticeType
());
callbackFailRecordVoModel
.
setCallbackStatus
(
callbackFailRecord
.
getCallbackStatus
());
callbackFailRecordVoModel
.
setChannelId
(
callbackFailRecord
.
getChannelId
());
callbackFailRecordVoModel
.
setRetryTimes
(
callbackFailRecord
.
getRetryTimes
());
callbackFailRecordVoModel
.
setFailCode
(
callbackFailRecord
.
getFailCode
());
callbackFailRecordVoModel
.
setCallbackRouter
(
callbackFailRecord
.
getCallbackRouter
());
callbackFailRecordVoModel
.
setIsActive
(
callbackFailRecord
.
getIsActive
());
callbackFailRecordVoModel
.
setExdata
(
callbackFailRecord
.
getExdata
());
callbackFailRecordVoModel
.
setCreatedAt
(
callbackFailRecord
.
getCreatedAt
());
callbackFailRecordVoModel
.
setUpdatedAt
(
callbackFailRecord
.
getUpdatedAt
());
callbackFailRecordVoModel
.
setTableName
(
"Fail"
);
callbackRecordVoModelList
.
add
(
callbackFailRecordVoModel
);
}
}
return
callbackRecordVoModelList
;
}
/**
* 查询还款计划
* @param channelOrderNumber
* @param loanId
* @return
*/
@Override
public
Object
findRepaymentPlan
(
String
channelOrderNumber
,
Long
loanId
)
{
if
(
loanId
==
null
||
loanId
<
1
)
{
ClfOrderMapping
orderMapping
=
clfCenterService
.
findOrderMappingByChannelOrderNo
(
channelOrderNumber
);
if
(
orderMapping
==
null
||
orderMapping
.
getLoanId
()
==
null
)
{
return
null
;
}
loanId
=
orderMapping
.
getLoanId
();
}
// xyqbCenterService.findRepaymentPlan(loanId);
return
null
;
}
/**
* 查询订单状态
* @param currentStatus
* @param orderMapping
* @return
*/
private
Tuple
<
String
,
List
<
OrderVo
.
OptButton
>>
getCurrentStatusAndButtons
(
QueryXyqbOrderStatus
currentStatus
,
ClfOrderMapping
orderMapping
)
{
Tuple
tuple
=
new
Tuple
();
List
<
OrderVo
.
OptButton
>
buttonList
=
new
ArrayList
<>();
if
(
currentStatus
!=
null
)
{
if
(
StringUtils
.
isNotEmpty
(
currentStatus
.
getStatus
()))
{
OrderVo
.
OptButton
buttonBeforeCancel
=
new
OrderVo
.
OptButton
();
buttonBeforeCancel
.
setAction
(
OrderVo
.
OptButtonAction
.
cancel
.
name
());
buttonBeforeCancel
.
setName
(
OrderVo
.
OptButtonAction
.
cancel
.
getDesc
());
switch
(
currentStatus
.
getStatus
())
{
case
"CREDIT_SUCC"
:
// 授信成功 需要 审批
OrderVo
.
OptButton
buttonApprove
=
new
OrderVo
.
OptButton
();
buttonApprove
.
setAction
(
OrderVo
.
OptButtonAction
.
audit
.
name
());
buttonApprove
.
setName
(
OrderVo
.
OptButtonAction
.
audit
.
getDesc
());
buttonList
.
add
(
buttonApprove
);
buttonList
.
add
(
buttonBeforeCancel
);
tuple
.
setKey
(
"授信成功"
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
case
"APPROVE_ING"
:
OrderApprove
orderApprove
=
orderApproveRepository
.
findByCreditNumber
(
orderMapping
.
getApplyNo
());
if
(
orderApprove
==
null
)
{
OrderVo
.
OptButton
buttonApprove2
=
new
OrderVo
.
OptButton
();
buttonApprove2
.
setAction
(
OrderVo
.
OptButtonAction
.
audit
.
name
());
buttonApprove2
.
setName
(
OrderVo
.
OptButtonAction
.
audit
.
getDesc
());
buttonList
.
add
(
buttonApprove2
);
buttonList
.
add
(
buttonBeforeCancel
);
tuple
.
setKey
(
"授信成功,待审批"
);
tuple
.
setValue
(
buttonList
);
}
else
{
tuple
.
setKey
(
"审批中(等待几分钟)"
);
buttonList
.
add
(
buttonBeforeCancel
);
tuple
.
setValue
(
buttonList
);
}
return
tuple
;
case
"REJECT"
:
tuple
.
setKey
(
"审批拒绝"
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
case
"FUAD_ASSIFN_SUCC"
:
tuple
.
setKey
(
"审批通过,待提现"
);
buttonList
.
add
(
buttonBeforeCancel
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
case
"WITHDRAW"
:
// 提现申请成功 需要放款
tuple
.
setKey
(
"申请提现成功"
);
LoanApplicationHistory
loanApplicationHistory
=
xyqbCenterService
.
findLoanApplicationHistoryById
(
orderMapping
.
getLoanId
());
if
(
loanApplicationHistory
!=
null
)
{
if
(
LoanProgress
.
WAITING_FUND
.
equals
(
loanApplicationHistory
.
getProgress
()))
{
// 更改放款时间,二次风控回调
OrderVo
.
OptButton
secondAudit
=
new
OrderVo
.
OptButton
();
secondAudit
.
setAction
(
OrderVo
.
OptButtonAction
.
second_audit
.
name
());
secondAudit
.
setName
(
OrderVo
.
OptButtonAction
.
second_audit
.
getDesc
());
buttonList
.
add
(
secondAudit
);
}
else
if
(
LoanProgress
.
FINAL_SENDED_TO_FUNDING_CORP
.
equals
(
loanApplicationHistory
.
getProgress
()))
{
OrderVo
.
OptButton
buttonPaySucc
=
new
OrderVo
.
OptButton
();
buttonPaySucc
.
setAction
(
OrderVo
.
OptButtonAction
.
pay_succ
.
name
());
buttonPaySucc
.
setName
(
OrderVo
.
OptButtonAction
.
pay_succ
.
getDesc
());
buttonList
.
add
(
buttonPaySucc
);
OrderVo
.
OptButton
buttonPayFail
=
new
OrderVo
.
OptButton
();
buttonPayFail
.
setAction
(
OrderVo
.
OptButtonAction
.
pay_fail
.
name
());
buttonPayFail
.
setName
(
OrderVo
.
OptButtonAction
.
pay_fail
.
getDesc
());
buttonList
.
add
(
buttonPayFail
);
buttonList
.
add
(
buttonBeforeCancel
);
}
tuple
.
setValue
(
buttonList
);
}
return
tuple
;
case
"PAY_ING"
:
tuple
.
setKey
(
"放款中(等待几分钟)"
);
buttonList
.
add
(
buttonBeforeCancel
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
case
"FUND_WAITING_WITHDRAW"
:
tuple
.
setKey
(
"放款到存管账户,待二次提现"
);
OrderVo
.
OptButton
cancelAfterButton0
=
new
OrderVo
.
OptButton
();
cancelAfterButton0
.
setAction
(
OrderVo
.
OptButtonAction
.
cancel_after
.
name
());
cancelAfterButton0
.
setName
(
OrderVo
.
OptButtonAction
.
cancel_after
.
getDesc
());
buttonList
.
add
(
cancelAfterButton0
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
case
"FUND_SUCC"
:
OrderApprove
orderApprove2
=
orderApproveRepository
.
findByCreditNumber
(
orderMapping
.
getApplyNo
());
if
(
orderApprove2
!=
null
&&
orderApprove2
.
getFundType
()
!=
0
)
{
// 是存管
tuple
.
setKey
(
"放款到存管,待二次提现"
);
OrderVo
.
OptButton
cancelAfterButton
=
new
OrderVo
.
OptButton
();
cancelAfterButton
.
setAction
(
OrderVo
.
OptButtonAction
.
cancel_after
.
name
());
cancelAfterButton
.
setName
(
OrderVo
.
OptButtonAction
.
cancel_after
.
getDesc
());
buttonList
.
add
(
cancelAfterButton
);
OrderVo
.
OptButton
withdrawSecondButton
=
new
OrderVo
.
OptButton
();
withdrawSecondButton
.
setAction
(
OrderVo
.
OptButtonAction
.
withdraw_second
.
name
());
withdrawSecondButton
.
setName
(
OrderVo
.
OptButtonAction
.
withdraw_second
.
getDesc
());
buttonList
.
add
(
withdrawSecondButton
);
}
else
{
tuple
.
setKey
(
"放款成功"
);
}
tuple
.
setValue
(
buttonList
);
return
tuple
;
case
"FUND_WITHDRAW_SUCC"
:
tuple
.
setKey
(
"存管提现成功"
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
case
"FUND_FAIL"
:
tuple
.
setKey
(
"放款失败"
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
case
"ALL_REPAID"
:
tuple
.
setKey
(
"已结清"
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
case
"CANCEL_LOAN"
:
tuple
.
setKey
(
"已关单"
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
case
"CANCEL_AFTER_LOAN"
:
tuple
.
setKey
(
"存管提现超时或贷后关单"
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
default
:
tuple
.
setKey
(
"未知状态"
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
}
}
}
else
{
tuple
.
setKey
(
"未知状态"
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
}
tuple
.
setKey
(
"未知状态"
);
tuple
.
setValue
(
buttonList
);
return
tuple
;
}
}
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