Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
clx-performance
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
姜武杰
clx-performance
Commits
04ee3a32
提交
04ee3a32
authored
1月 03, 2024
作者:
huyufan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
承运同步网络货运异步
上级
cf638cf8
隐藏空白字符变更
内嵌
并排
正在显示
14 个修改的文件
包含
533 行增加
和
99 行删除
+533
-99
TransportSyncTypeEnum.java
...java/com/clx/performance/enums/TransportSyncTypeEnum.java
+39
-0
RabbitBeanConfig.java
...ain/java/com/clx/performance/config/RabbitBeanConfig.java
+25
-0
RabbitKeyConstants.java
...java/com/clx/performance/constant/RabbitKeyConstants.java
+6
-0
OwnerAccountController.java
...rformance/controller/pc/owner/OwnerAccountController.java
+1
-1
OrderChildSyncTransportInvoiceRecordDao.java
...formance/dao/OrderChildSyncTransportInvoiceRecordDao.java
+13
-0
OrderChildSyncTransportInvoiceRecordDaoImpl.java
...dao/impl/OrderChildSyncTransportInvoiceRecordDaoImpl.java
+16
-0
NetworkDriverRunningWaterRecordDaoImpl.java
...o/impl/settle/NetworkDriverRunningWaterRecordDaoImpl.java
+3
-0
OrderChildSyncTransportListener.java
...performance/listener/OrderChildSyncTransportListener.java
+258
-0
OrderChildSyncTransportInvoiceRecordMapper.java
...ce/mapper/OrderChildSyncTransportInvoiceRecordMapper.java
+12
-0
OrderChildSyncTransportInvoiceRecord.java
...rformance/model/OrderChildSyncTransportInvoiceRecord.java
+55
-0
OrderChildSyncTransportInvoiceRecordService.java
.../service/OrderChildSyncTransportInvoiceRecordService.java
+12
-0
OrderChildSyncTransportInvoiceRecordServiceImpl.java
...impl/OrderChildSyncTransportInvoiceRecordServiceImpl.java
+13
-0
SettlementMqHandlerServiceImpl.java
...e/service/impl/settle/SettlementMqHandlerServiceImpl.java
+4
-4
SettlementServiceImpl.java
...erformance/service/impl/settle/SettlementServiceImpl.java
+76
-94
没有找到文件。
performance-api/src/main/java/com/clx/performance/enums/TransportSyncTypeEnum.java
0 → 100644
浏览文件 @
04ee3a32
package
com
.
clx
.
performance
.
enums
;
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
import
java.util.Arrays
;
import
java.util.Objects
;
import
java.util.Optional
;
public
enum
TransportSyncTypeEnum
{
;
@Getter
@AllArgsConstructor
public
enum
Type
{
NO_PASS
(
1
,
"未通过风控异常"
),
EXCEPTION
(
2
,
"同步异常"
),
;
private
final
Integer
code
;
private
final
String
msg
;
public
static
Optional
<
Type
>
getByCode
(
Integer
code
)
{
return
Arrays
.
stream
(
values
()).
filter
(
e
->
Objects
.
equals
(
e
.
getCode
(),
code
)).
findFirst
();
}
public
static
Optional
<
Type
>
getByName
(
String
name
)
{
return
Arrays
.
stream
(
values
()).
filter
(
e
->
Objects
.
equals
(
e
.
getMsg
(),
name
)).
findFirst
();
}
public
static
Integer
getCodeByName
(
String
name
)
{
return
getByName
(
name
).
map
(
TransportSyncTypeEnum
.
Type
::
getCode
).
orElse
(
3
);
}
}
}
performance-web/src/main/java/com/clx/performance/config/RabbitBeanConfig.java
浏览文件 @
04ee3a32
...
...
@@ -115,4 +115,29 @@ public class RabbitBeanConfig {
public
Binding
orderCancelExchangeBind
()
{
return
BindingBuilder
.
bind
(
orderCancelQueue
()).
to
(
orderCancelExchange
()).
with
(
RabbitKeyConstants
.
ORDER_CANCEL_ROUTE_KEY
);
}
/**
* 运单同步网络货运队列
* @return
*/
@Bean
public
Queue
orderChildSyncTransportQueue
()
{
return
new
Queue
(
RabbitKeyConstants
.
ORDER_CHILD_SYNC_TRANSPORT_QUEUE
,
true
,
false
,
false
);
}
/**
* 运单同步网络货运交换机
**/
@Bean
public
DirectExchange
orderChildSyncTransportExchange
()
{
return
new
DirectExchange
(
RabbitKeyConstants
.
ORDER_CHILD_SYNC_TRANSPORT_EXCHANGE
);
}
/**
* 运单同步网络货运绑定
*/
@Bean
public
Binding
orderChildSyncTransportExchangeBind
()
{
return
BindingBuilder
.
bind
(
orderChildSyncTransportQueue
()).
to
(
orderChildSyncTransportExchange
()).
with
(
RabbitKeyConstants
.
ORDER_CHILD_SYNC_TRANSPORT_ROUTE_KEY
);
}
}
performance-web/src/main/java/com/clx/performance/constant/RabbitKeyConstants.java
浏览文件 @
04ee3a32
...
...
@@ -63,6 +63,12 @@ public class RabbitKeyConstants {
public
static
final
String
ORDER_LARGE_SCREEN_QUEUE
=
"clx-order.order.large.screen.queue"
;
public
static
final
String
ORDER_CHILD_SYNC_TRANSPORT_QUEUE
=
"clx-order.order.child.sync.transport.queue"
;
public
static
final
String
ORDER_CHILD_SYNC_TRANSPORT_EXCHANGE
=
"clx-order.order.child.sync.transport.exchange"
;
public
static
final
String
ORDER_CHILD_SYNC_TRANSPORT_ROUTE_KEY
=
"clx-order.order.child.sync.transport.route.key"
;
// 预付运费和保证金 自动冻结 触发消息队列
public
static
final
String
FREEZE_TRIGGER_EXCHANGE
=
"clx-order.freeze.trigger.exchange"
;
...
...
performance-web/src/main/java/com/clx/performance/controller/pc/owner/OwnerAccountController.java
浏览文件 @
04ee3a32
...
...
@@ -162,7 +162,7 @@ public class OwnerAccountController {
@ApiOperation
(
value
=
"创建账户"
,
notes
=
"<br>By:胡宇帆"
)
@PostMapping
(
"/createAccount"
)
public
Result
<
Object
>
createAccount
(
CreteAccountParam
param
)
{
public
Result
<
Object
>
createAccount
(
@RequestBody
CreteAccountParam
param
)
{
ownerAccountService
.
createAccount
(
param
);
return
Result
.
ok
();
}
...
...
performance-web/src/main/java/com/clx/performance/dao/OrderChildSyncTransportInvoiceRecordDao.java
0 → 100644
浏览文件 @
04ee3a32
package
com
.
clx
.
performance
.
dao
;
import
com.msl.common.dao.BaseDao
;
import
com.clx.performance.mapper.OrderChildSyncTransportInvoiceRecordMapper
;
import
com.clx.performance.model.OrderChildSyncTransportInvoiceRecord
;
/**
* @author kavin
* Date 2024-01-03
* Time 10:17
*/
public
interface
OrderChildSyncTransportInvoiceRecordDao
extends
BaseDao
<
OrderChildSyncTransportInvoiceRecordMapper
,
OrderChildSyncTransportInvoiceRecord
,
Integer
>
{
}
performance-web/src/main/java/com/clx/performance/dao/impl/OrderChildSyncTransportInvoiceRecordDaoImpl.java
0 → 100644
浏览文件 @
04ee3a32
package
com
.
clx
.
performance
.
dao
.
impl
;
import
com.msl.common.dao.impl.BaseDaoImpl
;
import
com.clx.performance.dao.OrderChildSyncTransportInvoiceRecordDao
;
import
com.clx.performance.mapper.OrderChildSyncTransportInvoiceRecordMapper
;
import
com.clx.performance.model.OrderChildSyncTransportInvoiceRecord
;
import
org.springframework.stereotype.Repository
;
/**
* @author kavin
* Date 2024-01-03
* Time 10:17
*/
@Repository
public
class
OrderChildSyncTransportInvoiceRecordDaoImpl
extends
BaseDaoImpl
<
OrderChildSyncTransportInvoiceRecordMapper
,
OrderChildSyncTransportInvoiceRecord
,
Integer
>
implements
OrderChildSyncTransportInvoiceRecordDao
{
}
performance-web/src/main/java/com/clx/performance/dao/impl/settle/NetworkDriverRunningWaterRecordDaoImpl.java
浏览文件 @
04ee3a32
...
...
@@ -32,6 +32,9 @@ public class NetworkDriverRunningWaterRecordDaoImpl extends BaseDaoImpl<NetworkD
@Override
public
IPage
<
APPNetworkDriverRunningWaterRecordVO
>
pageFrozenList
(
NetworkDriverPageParam
param
)
{
Page
<
APPNetworkDriverRunningWaterRecordVO
>
page
=
Page
.
of
(
param
.
getPage
(),
param
.
getPageSize
());
for
(
APPNetworkDriverRunningWaterRecordVO
record
:
page
.
getRecords
())
{
record
.
setAlterationBalance
(
record
.
getAlterationBalance
().
negate
());
}
return
baseMapper
.
pageFrozenList
(
page
,
param
);
}
...
...
performance-web/src/main/java/com/clx/performance/listener/OrderChildSyncTransportListener.java
0 → 100644
浏览文件 @
04ee3a32
package
com
.
clx
.
performance
.
listener
;
import
cn.hutool.json.JSONUtil
;
import
com.clx.performance.component.IdGenerateSnowFlake
;
import
com.clx.performance.component.ThirdComponent
;
import
com.clx.performance.constant.RabbitKeyConstants
;
import
com.clx.performance.dao.OrderChildSyncTransportInvoiceRecordDao
;
import
com.clx.performance.dao.OrderGoodsDao
;
import
com.clx.performance.dao.OwnerAccountDao
;
import
com.clx.performance.dao.OwnerRunningWaterRecordDao
;
import
com.clx.performance.dao.settle.SettlementDriverDetailDao
;
import
com.clx.performance.dao.settle.SettlementOwnerDetailDao
;
import
com.clx.performance.dto.OrderChildSyncDTO
;
import
com.clx.performance.enums.*
;
import
com.clx.performance.enums.settle.SettlementDriverEnum
;
import
com.clx.performance.enums.settle.SettlementOwnerDetailEnum
;
import
com.clx.performance.enums.settle.SettlementOwnerEnum
;
import
com.clx.performance.enums.settle.SettlementWayEnum
;
import
com.clx.performance.feign.TransportFeignService
;
import
com.clx.performance.model.*
;
import
com.clx.performance.model.settle.SettlementDriverDetail
;
import
com.clx.performance.model.settle.SettlementOwnerDetail
;
import
com.clx.performance.param.feign.transport.ThirdOrderChildBrokerParam
;
import
com.clx.performance.service.TransportSyncService
;
import
com.clx.performance.service.settle.NetworkDriverRunningWaterRecordService
;
import
com.clx.performance.service.settle.SettlementMqService
;
import
com.msl.common.dto.HttpDTO
;
import
lombok.AllArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.amqp.rabbit.annotation.RabbitListener
;
import
org.springframework.stereotype.Component
;
import
java.math.BigDecimal
;
import
java.util.List
;
import
java.util.Objects
;
/**
* 承运同步网络货运运单
*/
@Slf4j
@Component
@AllArgsConstructor
public
class
OrderChildSyncTransportListener
{
private
final
OrderGoodsDao
orderGoodsDao
;
private
final
TransportSyncService
transportSyncService
;
private
final
TransportFeignService
transportFeignService
;
private
final
OwnerRunningWaterRecordDao
ownerRunningWaterRecordDao
;
private
final
NetworkDriverRunningWaterRecordService
networkDriverRunningWaterRecordService
;
private
final
OwnerAccountDao
ownerAccountDao
;
private
final
IdGenerateSnowFlake
idGenerateSnowFlake
;
private
final
SettlementOwnerDetailDao
settlementOwnerDetailDao
;
private
final
SettlementDriverDetailDao
settlementDriverDetailDao
;
private
final
OrderChildSyncTransportInvoiceRecordDao
orderChildSyncTransportInvoiceRecordDao
;
private
final
SettlementMqService
settlementMqService
;
@RabbitListener
(
queues
=
RabbitKeyConstants
.
ORDER_CHILD_SYNC_TRANSPORT_QUEUE
)
public
void
onMessage
(
String
message
)
{
OrderChild
orderChild
=
JSONUtil
.
toBean
(
message
,
OrderChild
.
class
);
//是否通过风控,调用网络货运
try
{
transportOrderChildProcess
(
orderChild
);
}
catch
(
Exception
e
)
{
log
.
info
(
"当前OrderChildSyncTransportListener监听同步网络货运失败,运单号{}, 错误信息{}"
,
orderChild
.
getChildNo
(),
e
.
getMessage
());
OrderChildSyncTransportInvoiceRecord
entity
=
new
OrderChildSyncTransportInvoiceRecord
();
entity
.
setChildNo
(
orderChild
.
getChildNo
());
entity
.
setType
(
TransportSyncTypeEnum
.
Type
.
EXCEPTION
.
getCode
());
entity
.
setRemark
(
e
.
getMessage
());
orderChildSyncTransportInvoiceRecordDao
.
saveEntity
(
entity
);
}
}
public
void
transportOrderChildProcess
(
OrderChild
orderChild
)
{
Integer
invoiceType
=
SettlementOwnerEnum
.
InvoiceType
.
ORDINARY
.
getCode
();
SettlementOwnerDetail
settlementOwnerDetail
=
settlementOwnerDetailDao
.
getByChildNo
(
orderChild
.
getChildNo
()).
orElseThrow
(
PerformanceResultEnum
.
DATA_NOT_FIND
);
SettlementDriverDetail
settlementDriverDetail
=
settlementDriverDetailDao
.
getByChildNo
(
orderChild
.
getChildNo
()).
orElseThrow
(
PerformanceResultEnum
.
DATA_NOT_FIND
);
OrderGoods
orderGoods
=
orderGoodsDao
.
getByOrderGoodsNo
(
orderChild
.
getOrderGoodsNo
()).
get
();
ThirdOrderChildBrokerParam
param
=
transportSyncService
.
generateOrderChildSync
(
orderChild
,
orderGoods
,
settlementOwnerDetail
,
settlementDriverDetail
);
HttpDTO
httpDTOResult
=
transportFeignService
.
orderChildSync
(
param
);
String
decrypt
=
ThirdComponent
.
decrypt
(
httpDTOResult
.
getData
());
OrderChildSyncDTO
bean
=
JSONUtil
.
toBean
(
decrypt
,
OrderChildSyncDTO
.
class
);
if
(
bean
.
getCode
()
==
0
)
{
log
.
info
(
"当前OrderChildSyncTransportListener监听同步网络货运成功,运单号为{}"
,
orderChild
.
getChildNo
());
Integer
status
=
bean
.
getData
().
getStatus
();
if
(
status
==
1
)
{
//通过风控
List
<
OwnerRunningWaterRecord
>
runningWaterRecordList
=
ownerRunningWaterRecordDao
.
getOwnerRunningWaterRecord
(
orderChild
.
getOrderNo
());
BigDecimal
frozen
=
runningWaterRecordList
.
stream
().
filter
(
item
->
{
return
item
.
getRunningWaterType
().
equals
(
OwnerAccountEnum
.
RunningWaterStatus
.
FROZEN
.
getCode
())
&&
item
.
getAccountType
().
equals
(
OwnerAccountEnum
.
AccountTypeStatus
.
PREPAID_FREIGHT_ACCOUNT
.
getCode
())
;
}).
map
(
OwnerRunningWaterRecord:
:
getAlterationBalance
).
reduce
(
BigDecimal
.
ZERO
,
BigDecimal:
:
add
);
BigDecimal
takeOut
=
runningWaterRecordList
.
stream
().
filter
(
item
->
{
return
item
.
getRunningWaterType
().
equals
(
OwnerAccountEnum
.
RunningWaterStatus
.
TAKE_OUT
.
getCode
())
&&
item
.
getAccountType
().
equals
(
OwnerAccountEnum
.
AccountTypeStatus
.
PREPAID_FREIGHT_ACCOUNT
.
getCode
())
;
}).
map
(
OwnerRunningWaterRecord:
:
getAlterationBalance
).
reduce
(
BigDecimal
.
ZERO
,
BigDecimal:
:
add
);
//设置预付运费金额
BigDecimal
ans
=
getPrepayFreightPay
(
orderChild
.
getSettlementWay
(),
settlementOwnerDetail
,
frozen
);
BigDecimal
subtract
=
frozen
.
subtract
(
takeOut
);
log
.
info
(
"冻结预付运费:{}, 扣除的流水总和:{}"
,
frozen
,
takeOut
);
invoiceType
=
SettlementOwnerEnum
.
InvoiceType
.
ONLINE
.
getCode
();
settlementDriverDetail
.
setPrepayFreight
(
ans
);
//冻结的预付运费为0 或者 此刻预付运费也可能为0,那么就不用生成扣除相关流水逻辑
if
(
subtract
.
compareTo
(
BigDecimal
.
ZERO
)
<=
0
||
ans
.
compareTo
(
BigDecimal
.
ZERO
)
==
0
)
{
settlementOwnerDetail
.
setPrepayFreight
(
BigDecimal
.
ZERO
);
settlementDriverDetail
.
setPrepayFreightFlag
(
SettlementDriverEnum
.
PrepayFreightFlag
.
NO_PAY
.
getCode
());
}
else
{
if
(
subtract
.
subtract
(
ans
).
compareTo
(
BigDecimal
.
ZERO
)
>=
0
)
{
//账户扣钱并生成扣除流水
generateTakeOutRunningWatter
(
orderChild
,
ans
,
settlementOwnerDetail
,
settlementDriverDetail
);
try
{
//网络货运钱包账户
networkDriverRunningWaterRecordService
.
generateNetworkDriverRunningWaterRecord
(
settlementDriverDetail
,
NetworkDriverAccountEnum
.
RunningWaterStatus
.
SETTLEMENT
.
getCode
()
);
//生成提现记录
networkDriverRunningWaterRecordService
.
generateNetworkCaseOutRecord
(
settlementDriverDetail
);
}
catch
(
Exception
e
)
{
log
.
info
(
"运单同步网络货运生成司机运单结算流水失败:{}"
,
e
.
getMessage
());
}
}
else
{
settlementOwnerDetail
.
setPrepayFreight
(
BigDecimal
.
ZERO
);
settlementDriverDetail
.
setPrepayFreightFlag
(
SettlementDriverEnum
.
PrepayFreightFlag
.
NO_PAY
.
getCode
());
}
}
}
else
{
settlementDriverDetail
.
setPrepayFreightFlag
(
SettlementDriverEnum
.
PrepayFreightFlag
.
NO_PAY
.
getCode
());
settlementOwnerDetail
.
setPrepayFreight
(
BigDecimal
.
ZERO
);
settlementOwnerDetail
.
setFinalPaymentStatus
(
SettlementOwnerDetailEnum
.
FinalPaymentStatus
.
NO
.
getCode
());
}
}
else
{
String
remark
=
JSONUtil
.
parse
(
bean
).
toString
();
log
.
info
(
"当前OrderChildSyncTransportListener监听同步网络货运失败,运单号{}, 错误信息{}"
,
orderChild
.
getChildNo
(),
remark
);
OrderChildSyncTransportInvoiceRecord
entity
=
new
OrderChildSyncTransportInvoiceRecord
();
entity
.
setChildNo
(
orderChild
.
getChildNo
());
entity
.
setType
(
TransportSyncTypeEnum
.
Type
.
NO_PASS
.
getCode
());
entity
.
setRemark
(
remark
);
orderChildSyncTransportInvoiceRecordDao
.
saveEntity
(
entity
);
settlementDriverDetail
.
setPrepayFreightFlag
(
SettlementDriverEnum
.
PrepayFreightFlag
.
NO_PAY
.
getCode
());
settlementOwnerDetail
.
setPrepayFreight
(
BigDecimal
.
ZERO
);
settlementOwnerDetail
.
setFinalPaymentStatus
(
SettlementOwnerDetailEnum
.
FinalPaymentStatus
.
NO
.
getCode
());
}
// 结算金额
settlementOwnerDetail
.
setSettlementFreight
(
settlementFreightCalc
(
orderChild
.
getSettlementWay
(),
settlementOwnerDetail
));
if
(
SettlementOwnerEnum
.
InvoiceType
.
ORDINARY
.
getCode
().
equals
(
invoiceType
))
{
if
(
settlementOwnerDetail
.
getSettlementFreight
().
compareTo
(
BigDecimal
.
ZERO
)
==
0
)
{
settlementOwnerDetail
.
setFinalPaymentStatus
(
SettlementOwnerDetailEnum
.
FinalPaymentStatus
.
NO_REQUIRE
.
getCode
());
}
}
else
{
if
(
settlementDriverDetail
.
getSettlementFreight
().
compareTo
(
BigDecimal
.
ZERO
)
==
0
)
{
settlementOwnerDetail
.
setFinalPaymentStatus
(
SettlementOwnerDetailEnum
.
FinalPaymentStatus
.
NO_REQUIRE
.
getCode
());
}
}
settlementOwnerDetail
.
setInvoiceType
(
invoiceType
);
settlementDriverDetail
.
setInvoiceType
(
invoiceType
);
log
.
info
(
"当前货主结算信息{},车主结算信息:{}"
,
JSONUtil
.
parse
(
settlementOwnerDetail
),
JSONUtil
.
parse
(
settlementDriverDetail
));
settlementOwnerDetailDao
.
updateInvoiceType
(
settlementOwnerDetail
);
settlementDriverDetailDao
.
updateInvoiceTypeAndPrepayFreightFlag
(
settlementDriverDetail
);
// 发送mq 通过开票标识
settlementMqService
.
invoiceTypeSync
(
orderChild
.
getChildNo
(),
invoiceType
);
}
private
void
generateTakeOutRunningWatter
(
OrderChild
orderChild
,
BigDecimal
ans
,
SettlementOwnerDetail
settlementOwnerDetail
,
SettlementDriverDetail
settlementDriverDetail
)
{
OwnerAccount
account
=
null
;
while
(
true
)
{
account
=
ownerAccountDao
.
getAccountByOwnerUserNoAndAccountType
(
orderChild
.
getOwnerUserNo
(),
OwnerAccountEnum
.
AccountTypeStatus
.
PREPAID_FREIGHT_ACCOUNT
.
getCode
());
OwnerAccount
update
=
new
OwnerAccount
();
update
.
setId
(
account
.
getId
());
update
.
setAccountBalance
(
ans
);
update
.
setModifiedTime
(
account
.
getModifiedTime
());
update
.
setFrozenBalance
(
ans
);
Integer
i
=
ownerAccountDao
.
updateOwnerAccountForConfirm
(
update
);
if
(
null
!=
i
&&
i
>
0
)
{
break
;
}
}
account
=
ownerAccountDao
.
getAccountByOwnerUserNoAndAccountType
(
orderChild
.
getOwnerUserNo
(),
OwnerAccountEnum
.
AccountTypeStatus
.
PREPAID_FREIGHT_ACCOUNT
.
getCode
());
settlementOwnerDetail
.
setPrepayFreight
(
ans
);
settlementDriverDetail
.
setPrepayFreightFlag
(
SettlementDriverEnum
.
PrepayFreightFlag
.
PAYED
.
getCode
());
settlementOwnerDetail
.
setFinalPaymentStatus
(
SettlementOwnerDetailEnum
.
FinalPaymentStatus
.
NO_REQUIRE
.
getCode
());
OwnerRunningWaterRecord
runningWaterRecord
=
new
OwnerRunningWaterRecord
();
runningWaterRecord
.
setOwnerUserName
(
orderChild
.
getOwnerName
());
runningWaterRecord
.
setMobile
(
orderChild
.
getDriverMobile
());
runningWaterRecord
.
setCreateBy
(
"系统"
);
runningWaterRecord
.
setOrderNo
(
orderChild
.
getOrderNo
());
runningWaterRecord
.
setOrderChildId
(
orderChild
.
getId
());
runningWaterRecord
.
setOrderChildNo
(
orderChild
.
getChildNo
());
runningWaterRecord
.
setRelationId
(
null
);
runningWaterRecord
.
setAlterationBalance
(
ans
);
runningWaterRecord
.
setFrozenBalance
(
account
.
getFrozenBalance
());
runningWaterRecord
.
setUsableBalance
(
account
.
getUsableBalance
());
runningWaterRecord
.
setTakeOutBalance
(
ans
);
runningWaterRecord
.
setAccountBalance
(
account
.
getAccountBalance
());
runningWaterRecord
.
setOwnerUserNo
(
account
.
getOwnerUserNo
());
runningWaterRecord
.
setAccountType
(
OwnerAccountEnum
.
AccountTypeStatus
.
PREPAID_FREIGHT_ACCOUNT
.
getCode
());
runningWaterRecord
.
setRunningWaterType
(
OwnerAccountEnum
.
RunningWaterStatus
.
TAKE_OUT
.
getCode
());
runningWaterRecord
.
setRunningWaterNo
(
idGenerateSnowFlake
.
nextId
(
IdTypeEnum
.
Type
.
TAKE_OUT
.
getCode
()));
ownerRunningWaterRecordDao
.
saveEntity
(
runningWaterRecord
);
}
private
BigDecimal
getPrepayFreightPay
(
Integer
settlementWay
,
SettlementOwnerDetail
settlementOwnerDetail
,
BigDecimal
accountFrozenPrefreght
)
{
//订单结算方式为“装车净重”时
if
(
Objects
.
equals
(
settlementWay
,
SettlementWayEnum
.
WayType
.
LOAD
.
getCode
()))
{
BigDecimal
subtract
=
settlementOwnerDetail
.
getFreight
().
subtract
(
settlementOwnerDetail
.
getLossFreight
());
if
(
accountFrozenPrefreght
.
compareTo
(
subtract
)
>=
0
)
{
return
subtract
;
}
else
{
return
BigDecimal
.
ZERO
;
}
}
else
{
if
(
accountFrozenPrefreght
.
compareTo
(
settlementOwnerDetail
.
getFreight
())
>=
0
)
{
return
settlementOwnerDetail
.
getFreight
();
}
else
{
return
BigDecimal
.
ZERO
;
}
}
}
/**
* 结算金额
*/
private
BigDecimal
settlementFreightCalc
(
Integer
settlementWay
,
SettlementOwnerDetail
settlementOwnerDetail
)
{
if
(
Objects
.
equals
(
settlementWay
,
SettlementWayEnum
.
WayType
.
LOAD
.
getCode
()))
{
//订单结算方式为“装车净重”时,结算金额=实际净重*平台运费报价-预付运费-货损金额。
return
settlementOwnerDetail
.
getWeight
().
multiply
(
settlementOwnerDetail
.
getFreightPrice
())
.
subtract
(
settlementOwnerDetail
.
getPrepayFreight
()).
subtract
(
settlementOwnerDetail
.
getLossFreight
());
}
else
{
//订单结算方式为“卸车净重”时,结算金额=实际净重*平台运费报价-预付运费
return
settlementOwnerDetail
.
getWeight
().
multiply
(
settlementOwnerDetail
.
getFreightPrice
()).
subtract
(
settlementOwnerDetail
.
getPrepayFreight
());
}
}
}
performance-web/src/main/java/com/clx/performance/mapper/OrderChildSyncTransportInvoiceRecordMapper.java
0 → 100644
浏览文件 @
04ee3a32
package
com
.
clx
.
performance
.
mapper
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.clx.performance.model.OrderChildSyncTransportInvoiceRecord
;
/**
* @author kavin
* Date 2024-01-03
* Time 10:17
*/
public
interface
OrderChildSyncTransportInvoiceRecordMapper
extends
BaseMapper
<
OrderChildSyncTransportInvoiceRecord
>
{
}
performance-web/src/main/java/com/clx/performance/model/OrderChildSyncTransportInvoiceRecord.java
0 → 100644
浏览文件 @
04ee3a32
package
com
.
clx
.
performance
.
model
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.msl.common.config.KeyColumn
;
import
com.msl.common.model.HasKey
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Getter
;
import
lombok.Setter
;
import
lombok.experimental.Accessors
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
java.time.LocalDateTime
;
import
java.io.Serializable
;
/**
* @author kavin
* Date 2024-01-03
* Time 10:17
*/
@Getter
@Setter
@Accessors
(
chain
=
true
)
@TableName
(
"order_child_sync_transport_invoice_record"
)
public
class
OrderChildSyncTransportInvoiceRecord
implements
HasKey
<
Integer
>
{
@TableId
(
value
=
"id"
,
type
=
IdType
.
AUTO
)
private
Integer
id
;
@TableField
(
"child_no"
)
@ApiModelProperty
(
"运单编号"
)
private
String
childNo
;
@TableField
(
"remark"
)
@ApiModelProperty
(
"备注"
)
private
String
remark
;
@TableField
(
"type 1: 未风控 2: 同步异常"
)
@ApiModelProperty
(
"备注"
)
private
Integer
type
;
@TableField
(
"create_time"
)
@ApiModelProperty
(
"创建时间"
)
private
LocalDateTime
createTime
;
@TableField
(
"modified_time"
)
@ApiModelProperty
(
"修改时间"
)
private
LocalDateTime
modifiedTime
;
@Override
@KeyColumn
(
"id"
)
public
Integer
gainKey
()
{
return
this
.
id
;
}
}
performance-web/src/main/java/com/clx/performance/service/OrderChildSyncTransportInvoiceRecordService.java
0 → 100644
浏览文件 @
04ee3a32
package
com
.
clx
.
performance
.
service
;
import
com.msl.common.service.BaseService
;
import
com.clx.performance.model.OrderChildSyncTransportInvoiceRecord
;
/**
* @author kavin
* Date 2024-01-03
* Time 10:17
*/
public
interface
OrderChildSyncTransportInvoiceRecordService
{
}
performance-web/src/main/java/com/clx/performance/service/impl/OrderChildSyncTransportInvoiceRecordServiceImpl.java
0 → 100644
浏览文件 @
04ee3a32
package
com
.
clx
.
performance
.
service
.
impl
;
import
com.clx.performance.service.OrderChildSyncTransportInvoiceRecordService
;
import
org.springframework.stereotype.Service
;
/**
* @author kavin
* Date 2024-01-03
* Time 10:17
*/
@Service
public
class
OrderChildSyncTransportInvoiceRecordServiceImpl
implements
OrderChildSyncTransportInvoiceRecordService
{
}
performance-web/src/main/java/com/clx/performance/service/impl/settle/SettlementMqHandlerServiceImpl.java
浏览文件 @
04ee3a32
...
...
@@ -131,7 +131,7 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
}
}
else
{
log
.
info
(
"
月
结初始化货主结算单"
);
log
.
info
(
"
拉运完成
结初始化货主结算单"
);
settlementOwner
=
settlementOwnerDao
.
selectUnlockOfSettlementPeriodImmediate
(
settlementOwnerDetail
.
getOrderNo
(),
settlementOwnerDetail
.
getInvoiceType
()).
orNull
();
if
(
settlementOwner
==
null
){
// 拉运完成初始化
...
...
@@ -149,12 +149,12 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
if
(!
settlementDriverDetail
.
getInvoiceType
().
equals
(
SettlementOwnerEnum
.
InvoiceType
.
ONLINE
.
getCode
()))
{
paySettlementDriver
(
settlementDriverDetail
);
}
else
{
if
(
settlementDriverDetail
.
getPrepayFreightFlag
().
equals
(
SettlementDriverEnum
.
PrepayFreightFlag
.
PAYED
.
getCode
())
&&
settlementDriverDetail
.
getPrepayFreight
().
compareTo
(
BigDecimal
.
ZERO
)
>
0
)
{
//
if (settlementDriverDetail.getPrepayFreightFlag().equals(SettlementDriverEnum.PrepayFreightFlag.PAYED.getCode())
//
&& settlementDriverDetail.getPrepayFreight().compareTo(BigDecimal.ZERO) > 0) {
settlementDriverDetail
.
setSettlementNo
(
settlementNo
);
//插入同步网络货运待支付记录
childSyncTransportRecordService
.
addOrderChildSyncTransportRecord
(
settlementDriverDetail
);
}
//
}
}
// 更新结算单
...
...
performance-web/src/main/java/com/clx/performance/service/impl/settle/SettlementServiceImpl.java
浏览文件 @
04ee3a32
...
...
@@ -2,56 +2,41 @@ package com.clx.performance.service.impl.settle;
import
cn.hutool.json.JSONUtil
;
import
com.clx.performance.component.IdGenerateSnowFlake
;
import
com.clx.performance.co
mponent.ThirdComponent
;
import
com.clx.performance.co
nstant.RabbitKeyConstants
;
import
com.clx.performance.dao.OrderChildDao
;
import
com.clx.performance.dao.OrderGoodsDao
;
import
com.clx.performance.dao.OwnerAccountDao
;
import
com.clx.performance.dao.OwnerRunningWaterRecordDao
;
import
com.clx.performance.dao.settle.NetworkDriverAccountDao
;
import
com.clx.performance.dao.settle.SettlementDriverDetailDao
;
import
com.clx.performance.dao.settle.SettlementOwnerDetailDao
;
import
com.clx.performance.dto.OrderChildSyncDTO
;
import
com.clx.performance.enums.IdTypeEnum
;
import
com.clx.performance.enums.NetworkDriverAccountEnum
;
import
com.clx.performance.enums.OwnerAccountEnum
;
import
com.clx.performance.enums.PerformanceResultEnum
;
import
com.clx.performance.enums.settle.SettlementDriverEnum
;
import
com.clx.performance.enums.settle.SettlementOwnerDetailEnum
;
import
com.clx.performance.enums.settle.SettlementOwnerEnum
;
import
com.clx.performance.enums.settle.SettlementWayEnum
;
import
com.clx.performance.feign.TransportFeignService
;
import
com.clx.performance.model.OrderChild
;
import
com.clx.performance.model.OrderGoods
;
import
com.clx.performance.model.OwnerAccount
;
import
com.clx.performance.model.OwnerRunningWaterRecord
;
import
com.clx.performance.model.settle.NetworkCaseOutRecord
;
import
com.clx.performance.model.settle.NetworkDriverAccount
;
import
com.clx.performance.model.settle.SettlementDriverDetail
;
import
com.clx.performance.model.settle.SettlementOwnerDetail
;
import
com.clx.performance.param.feign.transport.ThirdOrderChildBrokerParam
;
import
com.clx.performance.service.TransportSyncService
;
import
com.clx.performance.service.settle.NetworkDriverRunningWaterRecordService
;
import
com.clx.performance.service.settle.SettlementMqService
;
import
com.clx.performance.service.settle.SettlementService
;
import
com.clx.performance.vo.feign.transport.ThirdOrderChildBrokerResultVO
;
import
com.msl.common.dto.HttpDTO
;
import
com.msl.common.exception.ServiceSystemException
;
import
com.msl.common.result.Result
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.amqp.core.Message
;
import
org.springframework.amqp.core.MessageBuilder
;
import
org.springframework.amqp.rabbit.core.RabbitTemplate
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.math.BigDecimal
;
import
java.time.LocalDateTime
;
import
java.util.List
;
import
java.util.Objects
;
@Slf4j
@Service
public
class
SettlementServiceImpl
implements
SettlementService
{
@Autowired
private
OrderChildDao
orderChildDao
;
@Autowired
...
...
@@ -61,22 +46,13 @@ public class SettlementServiceImpl implements SettlementService {
@Autowired
private
SettlementMqService
settlementMqService
;
@Autowired
private
TransportSyncService
transportSyncService
;
@Autowired
private
OrderGoodsDao
orderGoodsDao
;
@Autowired
private
OwnerRunningWaterRecordDao
ownerRunningWaterRecordDao
;
@Autowired
private
IdGenerateSnowFlake
idGenerateSnowFlake
;
@Autowired
private
TransportFeignService
transportFeignService
;
@Autowired
private
OwnerAccountDao
ownerAccountDao
;
@Autowired
private
NetworkDriverRunningWaterRecordService
networkDriverRunningWaterRecordServic
e
;
private
RabbitTemplate
rabbitTemplat
e
;
@Override
...
...
@@ -96,71 +72,77 @@ public class SettlementServiceImpl implements SettlementService {
settlementDriverDetail
.
setPrepayFreightFlag
(
SettlementDriverEnum
.
PrepayFreightFlag
.
NO_PAY
.
getCode
());
settlementOwnerDetail
.
setPrepayFreight
(
BigDecimal
.
ZERO
);
}
else
{
OrderGoods
orderGoods
=
orderGoodsDao
.
getByOrderGoodsNo
(
orderChild
.
getOrderGoodsNo
()).
get
();
//是否通过风控,调用网络货运
ThirdOrderChildBrokerParam
param
=
transportSyncService
.
generateOrderChildSync
(
orderChild
,
orderGoods
,
settlementOwnerDetail
,
settlementDriverDetail
);
HttpDTO
httpDTOResult
=
transportFeignService
.
orderChildSync
(
param
);
String
decrypt
=
ThirdComponent
.
decrypt
(
httpDTOResult
.
getData
());
OrderChildSyncDTO
bean
=
JSONUtil
.
toBean
(
decrypt
,
OrderChildSyncDTO
.
class
);
log
.
info
(
"OrderChildSyncDTO信息为:{}"
,
JSONUtil
.
parse
(
bean
));
if
(
bean
.
getCode
()
==
0
)
{
Integer
status
=
bean
.
getData
().
getStatus
();
if
(
status
==
1
)
{
//通过风控
List
<
OwnerRunningWaterRecord
>
runningWaterRecordList
=
ownerRunningWaterRecordDao
.
getOwnerRunningWaterRecord
(
orderChild
.
getOrderNo
());
BigDecimal
frozen
=
runningWaterRecordList
.
stream
().
filter
(
item
->
{
return
item
.
getRunningWaterType
().
equals
(
OwnerAccountEnum
.
RunningWaterStatus
.
FROZEN
.
getCode
())
&&
item
.
getAccountType
().
equals
(
OwnerAccountEnum
.
AccountTypeStatus
.
PREPAID_FREIGHT_ACCOUNT
.
getCode
())
;
}).
map
(
OwnerRunningWaterRecord:
:
getAlterationBalance
).
reduce
(
BigDecimal
.
ZERO
,
BigDecimal:
:
add
);
BigDecimal
takeOut
=
runningWaterRecordList
.
stream
().
filter
(
item
->
{
return
item
.
getRunningWaterType
().
equals
(
OwnerAccountEnum
.
RunningWaterStatus
.
TAKE_OUT
.
getCode
())
&&
item
.
getAccountType
().
equals
(
OwnerAccountEnum
.
AccountTypeStatus
.
PREPAID_FREIGHT_ACCOUNT
.
getCode
())
;
}).
map
(
OwnerRunningWaterRecord:
:
getAlterationBalance
).
reduce
(
BigDecimal
.
ZERO
,
BigDecimal:
:
add
);
//设置预付运费金额
BigDecimal
ans
=
getPrepayFreightPay
(
orderChild
.
getSettlementWay
(),
settlementOwnerDetail
,
frozen
);
BigDecimal
subtract
=
frozen
.
subtract
(
takeOut
);
log
.
info
(
"冻结预付运费:{}, 扣除的流水总和:{}"
,
frozen
,
takeOut
);
invoiceType
=
SettlementOwnerEnum
.
InvoiceType
.
ONLINE
.
getCode
();
settlementDriverDetail
.
setPrepayFreight
(
ans
);
//冻结的预付运费为0 或者 此刻预付运费也可能为0,那么就不用生成扣除相关流水逻辑
if
(
subtract
.
compareTo
(
BigDecimal
.
ZERO
)
<=
0
||
ans
.
compareTo
(
BigDecimal
.
ZERO
)
==
0
)
{
settlementOwnerDetail
.
setPrepayFreight
(
BigDecimal
.
ZERO
);
settlementDriverDetail
.
setPrepayFreightFlag
(
SettlementDriverEnum
.
PrepayFreightFlag
.
NO_PAY
.
getCode
());
}
else
{
if
(
subtract
.
subtract
(
ans
).
compareTo
(
BigDecimal
.
ZERO
)
>=
0
)
{
//账户扣钱并生成扣除流水
generateTakeOutRunningWatter
(
orderChild
,
ans
,
settlementOwnerDetail
,
settlementDriverDetail
);
try
{
//网络货运钱包账户
networkDriverRunningWaterRecordService
.
generateNetworkDriverRunningWaterRecord
(
settlementDriverDetail
,
NetworkDriverAccountEnum
.
RunningWaterStatus
.
SETTLEMENT
.
getCode
()
);
//生成提现记录
networkDriverRunningWaterRecordService
.
generateNetworkCaseOutRecord
(
settlementDriverDetail
);
}
catch
(
Exception
e
)
{
log
.
info
(
"运单同步网络货运生成司机运单结算流水失败:{}"
,
e
.
getMessage
());
}
}
else
{
settlementOwnerDetail
.
setPrepayFreight
(
BigDecimal
.
ZERO
);
settlementDriverDetail
.
setPrepayFreightFlag
(
SettlementDriverEnum
.
PrepayFreightFlag
.
NO_PAY
.
getCode
());
}
}
}
else
{
settlementDriverDetail
.
setPrepayFreightFlag
(
SettlementDriverEnum
.
PrepayFreightFlag
.
NO_PAY
.
getCode
());
settlementOwnerDetail
.
setPrepayFreight
(
BigDecimal
.
ZERO
);
settlementOwnerDetail
.
setFinalPaymentStatus
(
SettlementOwnerDetailEnum
.
FinalPaymentStatus
.
NO
.
getCode
());
}
}
else
{
throw
new
ServiceSystemException
(
PerformanceResultEnum
.
ORDER_CHILD_SYNC_ERROR
);
}
//TODO 发送MQ异步
Message
message
=
MessageBuilder
.
withBody
(
JSONUtil
.
parse
(
orderChild
).
toString
().
getBytes
()).
build
();
rabbitTemplate
.
send
(
RabbitKeyConstants
.
ORDER_CANCEL_EXCHANGE
,
RabbitKeyConstants
.
ORDER_CANCEL_ROUTE_KEY
,
message
);
return
;
// OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(orderChild.getOrderGoodsNo()).get();
// //是否通过风控,调用网络货运
// ThirdOrderChildBrokerParam param = transportSyncService.generateOrderChildSync(orderChild, orderGoods, settlementOwnerDetail, settlementDriverDetail);
// HttpDTO httpDTOResult = transportFeignService.orderChildSync(param);
// String decrypt = ThirdComponent.decrypt(httpDTOResult.getData());
// OrderChildSyncDTO bean = JSONUtil.toBean(decrypt, OrderChildSyncDTO.class);
// log.info("OrderChildSyncDTO信息为:{}", JSONUtil.parse(bean));
// if (bean.getCode() == 0) {
// Integer status = bean.getData().getStatus();
// if (status == 1) {
// //通过风控
// List<OwnerRunningWaterRecord> runningWaterRecordList = ownerRunningWaterRecordDao.getOwnerRunningWaterRecord(orderChild.getOrderNo());
// BigDecimal frozen = runningWaterRecordList.stream().filter(item -> {
// return item.getRunningWaterType().equals(OwnerAccountEnum.RunningWaterStatus.FROZEN.getCode())
// && item.getAccountType().equals(OwnerAccountEnum.AccountTypeStatus.PREPAID_FREIGHT_ACCOUNT.getCode())
// ;
// }).map(OwnerRunningWaterRecord::getAlterationBalance).reduce(BigDecimal.ZERO, BigDecimal::add);
//
// BigDecimal takeOut = runningWaterRecordList.stream().filter(item -> {
// return item.getRunningWaterType().equals(OwnerAccountEnum.RunningWaterStatus.TAKE_OUT.getCode())
// && item.getAccountType().equals(OwnerAccountEnum.AccountTypeStatus.PREPAID_FREIGHT_ACCOUNT.getCode())
// ;
// }).map(OwnerRunningWaterRecord::getAlterationBalance).reduce(BigDecimal.ZERO, BigDecimal::add);
// //设置预付运费金额
// BigDecimal ans = getPrepayFreightPay(orderChild.getSettlementWay(), settlementOwnerDetail, frozen);
// BigDecimal subtract = frozen.subtract(takeOut);
// log.info("冻结预付运费:{}, 扣除的流水总和:{}", frozen, takeOut);
// invoiceType = SettlementOwnerEnum.InvoiceType.ONLINE.getCode();
// settlementDriverDetail.setPrepayFreight(ans);
// //冻结的预付运费为0 或者 此刻预付运费也可能为0,那么就不用生成扣除相关流水逻辑
// if (subtract.compareTo(BigDecimal.ZERO) <= 0 || ans.compareTo(BigDecimal.ZERO) == 0) {
// settlementOwnerDetail.setPrepayFreight(BigDecimal.ZERO);
// settlementDriverDetail.setPrepayFreightFlag(SettlementDriverEnum.PrepayFreightFlag.NO_PAY.getCode());
// } else {
// if (subtract.subtract(ans).compareTo(BigDecimal.ZERO) >= 0) {
// //账户扣钱并生成扣除流水
// generateTakeOutRunningWatter(orderChild, ans, settlementOwnerDetail, settlementDriverDetail);
// try {
// //网络货运钱包账户
// networkDriverRunningWaterRecordService.generateNetworkDriverRunningWaterRecord(
// settlementDriverDetail,
// NetworkDriverAccountEnum.RunningWaterStatus.SETTLEMENT.getCode()
// );
// //生成提现记录
// networkDriverRunningWaterRecordService.generateNetworkCaseOutRecord(settlementDriverDetail);
// }catch (Exception e) {
// log.info("运单同步网络货运生成司机运单结算流水失败:{}", e.getMessage());
// }
//
// } else {
// settlementOwnerDetail.setPrepayFreight(BigDecimal.ZERO);
// settlementDriverDetail.setPrepayFreightFlag(SettlementDriverEnum.PrepayFreightFlag.NO_PAY.getCode());
//
// }
// }
//
// } else {
// settlementDriverDetail.setPrepayFreightFlag(SettlementDriverEnum.PrepayFreightFlag.NO_PAY.getCode());
// settlementOwnerDetail.setPrepayFreight(BigDecimal.ZERO);
// settlementOwnerDetail.setFinalPaymentStatus(SettlementOwnerDetailEnum.FinalPaymentStatus.NO.getCode());
// }
// } else {
// throw new ServiceSystemException(PerformanceResultEnum.ORDER_CHILD_SYNC_ERROR);
//
// }
}
// 结算金额
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论