Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
clx-performance
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
姜武杰
clx-performance
Commits
3f4b05f1
提交
3f4b05f1
authored
10月 12, 2023
作者:
aiqingguo
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
司机积分定时任务
上级
871f57f9
显示空白字符变更
内嵌
并排
正在显示
28 个修改的文件
包含
1196 行增加
和
48 行删除
+1196
-48
RabbitOrderIntegralConfig.java
...com/clx/performance/config/RabbitOrderIntegralConfig.java
+129
-0
RabbitKeyIntegralConstants.java
.../clx/performance/constant/RabbitKeyIntegralConstants.java
+81
-0
IntegralTruckFeignController.java
...rmance/controller/feign/IntegralTruckFeignController.java
+3
-3
IntegralRecordDao.java
.../main/java/com/clx/performance/dao/IntegralRecordDao.java
+2
-0
IntegralStatisticsDao.java
...n/java/com/clx/performance/dao/IntegralStatisticsDao.java
+1
-0
IntegralTruckDao.java
...c/main/java/com/clx/performance/dao/IntegralTruckDao.java
+2
-0
IntegralRecordDaoImpl.java
...a/com/clx/performance/dao/impl/IntegralRecordDaoImpl.java
+7
-0
IntegralStatisticsDaoImpl.java
...m/clx/performance/dao/impl/IntegralStatisticsDaoImpl.java
+7
-0
IntegralTruckDaoImpl.java
...va/com/clx/performance/dao/impl/IntegralTruckDaoImpl.java
+7
-0
IntegralJob.java
...eb/src/main/java/com/clx/performance/job/IntegralJob.java
+34
-27
IntegralDelayListener.java
...a/com/clx/performance/listener/IntegralDelayListener.java
+43
-0
IntegralNextWeekTruckInitListener.java
...rformance/listener/IntegralNextWeekTruckInitListener.java
+43
-0
IntegralOrderChildFinishListener.java
...erformance/listener/IntegralOrderChildFinishListener.java
+43
-0
IntegralRecordAddListener.java
...m/clx/performance/listener/IntegralRecordAddListener.java
+44
-0
IntegralTruckAddListener.java
...om/clx/performance/listener/IntegralTruckAddListener.java
+43
-0
IntegralTruckProtectionCancelListener.java
...mance/listener/IntegralTruckProtectionCancelListener.java
+43
-0
IntegralWeekTruckStatisticsListener.java
...ormance/listener/IntegralWeekTruckStatisticsListener.java
+44
-0
IntegralJobHandlerService.java
...om/clx/performance/service/IntegralJobHandlerService.java
+51
-0
IntegralMqHandlerService.java
...com/clx/performance/service/IntegralMqHandlerService.java
+24
-0
IntegralMqService.java
...n/java/com/clx/performance/service/IntegralMqService.java
+11
-0
IntegralMqHandlerServiceImpl.java
...erformance/service/impl/IntegralMqHandlerServiceImpl.java
+268
-0
IntegralMqServiceImpl.java
...m/clx/performance/service/impl/IntegralMqServiceImpl.java
+103
-4
IntegralRecordServiceImpl.java
...x/performance/service/impl/IntegralRecordServiceImpl.java
+11
-6
IntegralTruckServiceImpl.java
...lx/performance/service/impl/IntegralTruckServiceImpl.java
+14
-8
JobHandlerService.java
...ain/java/com/clx/performance/utils/JobHandlerService.java
+69
-0
LocalDateTimeUtils.java
...in/java/com/clx/performance/utils/LocalDateTimeUtils.java
+3
-0
MqDelay.java
...-web/src/main/java/com/clx/performance/utils/MqDelay.java
+27
-0
MqWrapper.java
...eb/src/main/java/com/clx/performance/utils/MqWrapper.java
+39
-0
没有找到文件。
performance-web/src/main/java/com/clx/performance/config/RabbitOrderIntegralConfig.java
0 → 100644
浏览文件 @
3f4b05f1
package
com
.
clx
.
performance
.
config
;
import
com.clx.performance.constant.RabbitKeyIntegralConstants
;
import
org.springframework.amqp.core.Binding
;
import
org.springframework.amqp.core.BindingBuilder
;
import
org.springframework.amqp.core.DirectExchange
;
import
org.springframework.amqp.core.Queue
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
java.util.HashMap
;
import
java.util.Map
;
/**
* @Author: aiqingguo
* @Description: 司机积分 MQ
* @Date: 2023-10-12 16:27:30
* @Version: 1.0
*/
@Configuration
public
class
RabbitOrderIntegralConfig
{
@Bean
public
DirectExchange
integralDefaultExchange
()
{
return
new
DirectExchange
(
RabbitKeyIntegralConstants
.
DEFAULT_EXCHANGE
);
}
@Bean
public
Queue
integralDefaultDelayQueue
()
{
Map
<
String
,
Object
>
params
=
new
HashMap
<>(
8
);
params
.
put
(
"x-message-ttl"
,
15
*
60
*
1000
);
params
.
put
(
"x-max-length"
,
5000000
);
params
.
put
(
"x-dead-letter-exchange"
,
RabbitKeyIntegralConstants
.
DEFAULT_EXCHANGE
);
params
.
put
(
"x-dead-letter-routing-key"
,
RabbitKeyIntegralConstants
.
DEFAULT_DEAD_ROUTING_KEY
);
return
new
Queue
(
RabbitKeyIntegralConstants
.
DEFAULT_DELAY_QUEUE
,
true
,
false
,
false
,
params
);
}
@Bean
public
Binding
integralDefaultDelayQueueBinding
()
{
return
BindingBuilder
.
bind
(
integralDefaultDelayQueue
()).
to
(
integralDefaultExchange
()).
with
(
RabbitKeyIntegralConstants
.
DEFAULT_DELAY_ROUTING_KEY
);
}
@Bean
public
Queue
integralDefaultDeadQueue
()
{
return
new
Queue
(
RabbitKeyIntegralConstants
.
DEFAULT_DEAD_QUEUE
);
}
@Bean
public
Binding
integralDefaultDeadQueueBinding
()
{
return
BindingBuilder
.
bind
(
integralDefaultDeadQueue
()).
to
(
integralDefaultExchange
()).
with
(
RabbitKeyIntegralConstants
.
DEFAULT_DEAD_ROUTING_KEY
);
}
/**
* 积分车辆新增
*/
@Bean
public
Queue
integralTruckAddQueue
()
{
return
new
Queue
(
RabbitKeyIntegralConstants
.
INTEGRAL_TRUCK_ADD_QUEUE
);
}
@Bean
public
Binding
integralTruckAddQueueBinding
()
{
return
BindingBuilder
.
bind
(
integralTruckAddQueue
()).
to
(
integralDefaultExchange
()).
with
(
RabbitKeyIntegralConstants
.
INTEGRAL_TRUCK_ADD_ROUTING_KEY
);
}
/**
* 积分记录新增
*/
@Bean
public
Queue
integralRecordAddQueue
()
{
return
new
Queue
(
RabbitKeyIntegralConstants
.
INTEGRAL_RECORD_ADD_QUEUE
);
}
@Bean
public
Binding
integralRecordAddQueueBinding
()
{
return
BindingBuilder
.
bind
(
integralRecordAddQueue
()).
to
(
integralDefaultExchange
()).
with
(
RabbitKeyIntegralConstants
.
INTEGRAL_RECORD_ADD_ROUTING_KEY
);
}
/**
* 下周车辆初始化
*/
@Bean
public
Queue
integralNextWeekTruckInitQueue
()
{
return
new
Queue
(
RabbitKeyIntegralConstants
.
INTEGRAL_NEXT_WEEK_TRUCK_INIT_QUEUE
);
}
@Bean
public
Binding
integralNextWeekTruckInitQueueBinding
()
{
return
BindingBuilder
.
bind
(
integralNextWeekTruckInitQueue
()).
to
(
integralDefaultExchange
()).
with
(
RabbitKeyIntegralConstants
.
INTEGRAL_NEXT_WEEK_TRUCK_INIT_ROUTING_KEY
);
}
/**
* 车辆周统计
*/
@Bean
public
Queue
integralWeekTruckStatisticsQueue
()
{
Map
<
String
,
Object
>
params
=
new
HashMap
<>(
8
);
params
.
put
(
"x-single-active-consumer"
,
true
);
return
new
Queue
(
RabbitKeyIntegralConstants
.
INTEGRAL_WEEK_TRUCK_STATISTICS_QUEUE
,
true
,
false
,
false
,
params
);
}
@Bean
public
Binding
integralWeekTruckStatisticsQueueBinding
()
{
return
BindingBuilder
.
bind
(
integralWeekTruckStatisticsQueue
()).
to
(
integralDefaultExchange
()).
with
(
RabbitKeyIntegralConstants
.
INTEGRAL_WEEK_TRUCK_STATISTICS_ROUTING_KEY
);
}
/**
* 新手保护取消
*/
@Bean
public
Queue
integralNewTruckProtectionCancelQueue
()
{
return
new
Queue
(
RabbitKeyIntegralConstants
.
INTEGRAL_TRUCK_PROTECTION_CANCEL_QUEUE
);
}
@Bean
public
Binding
integralNewTruckProtectionCancelQueueBinding
()
{
return
BindingBuilder
.
bind
(
integralNewTruckProtectionCancelQueue
()).
to
(
integralDefaultExchange
()).
with
(
RabbitKeyIntegralConstants
.
INTEGRAL_TRUCK_PROTECTION_CANCEL_ROUTING_KEY
);
}
/**
* 运单结束
*/
@Bean
public
Queue
integralOrderChildFinishQueue
()
{
Map
<
String
,
Object
>
params
=
new
HashMap
<>(
8
);
params
.
put
(
"x-single-active-consumer"
,
true
);
return
new
Queue
(
RabbitKeyIntegralConstants
.
INTEGRAL_ORDER_CHILD_FINISH_QUEUE
,
true
,
false
,
false
,
params
);
}
@Bean
public
Binding
integralOrderChildFinishQueueBinding
()
{
return
BindingBuilder
.
bind
(
integralOrderChildFinishQueue
()).
to
(
integralDefaultExchange
()).
with
(
RabbitKeyIntegralConstants
.
INTEGRAL_ORDER_CHILD_FINISH_ROUTING_KEY
);
}
}
performance-web/src/main/java/com/clx/performance/constant/RabbitKeyIntegralConstants.java
0 → 100644
浏览文件 @
3f4b05f1
package
com
.
clx
.
performance
.
constant
;
/**
* @Author: aiqingguo
* @Description: 司机积分-mq
* @Date: 2023-10-12 15:27:23
* @Version: 1.0
*/
public
class
RabbitKeyIntegralConstants
{
private
static
final
String
PREFIX
=
"clx-performance.integral."
;
private
static
final
String
EXCHANGE
=
".exchange"
;
private
static
final
String
QUEUE
=
".queue"
;
private
static
final
String
QUEUE_ROUTING_KEY
=
".routing.key"
;
private
static
final
String
DELAY_QUEUE
=
".delay.queue"
;
private
static
final
String
DELAY_ROUTING_KEY
=
".delay.routing.key"
;
private
static
final
String
DEAD_QUEUE
=
".dead.queue"
;
private
static
final
String
DEAD_ROUTING_KEY
=
".dead.routing.key"
;
private
RabbitKeyIntegralConstants
()
{
}
/**
* 缺省交换机
*/
public
static
final
String
DEFAULT_EXCHANGE
=
PREFIX
+
"default"
+
EXCHANGE
;
/**
* 缺省延迟队列
*/
public
static
final
String
DEFAULT_DELAY_QUEUE
=
PREFIX
+
"default"
+
DELAY_QUEUE
;
public
static
final
String
DEFAULT_DELAY_ROUTING_KEY
=
PREFIX
+
"default"
+
DELAY_ROUTING_KEY
;
public
static
final
String
DEFAULT_DEAD_QUEUE
=
PREFIX
+
"default"
+
DEAD_QUEUE
;
public
static
final
String
DEFAULT_DEAD_ROUTING_KEY
=
PREFIX
+
"default"
+
DEAD_ROUTING_KEY
;
/**
* 新增积分车辆
*/
public
static
final
String
INTEGRAL_TRUCK_ADD_QUEUE
=
PREFIX
+
"truck.add"
+
QUEUE
;
public
static
final
String
INTEGRAL_TRUCK_ADD_ROUTING_KEY
=
PREFIX
+
"truck.add"
+
QUEUE_ROUTING_KEY
;
/**
* 新增积分记录
*/
public
static
final
String
INTEGRAL_RECORD_ADD_QUEUE
=
PREFIX
+
"record.add"
+
QUEUE
;
public
static
final
String
INTEGRAL_RECORD_ADD_ROUTING_KEY
=
PREFIX
+
"record.add"
+
QUEUE_ROUTING_KEY
;
/**
* 下周车辆初始化
*/
public
static
final
String
INTEGRAL_NEXT_WEEK_TRUCK_INIT_QUEUE
=
PREFIX
+
"nextWeekTruck.init"
+
QUEUE
;
public
static
final
String
INTEGRAL_NEXT_WEEK_TRUCK_INIT_ROUTING_KEY
=
PREFIX
+
"nextWeekTruck.init"
+
QUEUE_ROUTING_KEY
;
/**
* 积分周统计
*/
public
static
final
String
INTEGRAL_WEEK_TRUCK_STATISTICS_QUEUE
=
PREFIX
+
"weekTruck.statistics"
+
QUEUE
;
public
static
final
String
INTEGRAL_WEEK_TRUCK_STATISTICS_ROUTING_KEY
=
PREFIX
+
"weekTruck.statistics"
+
QUEUE_ROUTING_KEY
;
/**
* 新车保护取消
*/
public
static
final
String
INTEGRAL_TRUCK_PROTECTION_CANCEL_QUEUE
=
PREFIX
+
"truckProtection.cancel"
+
QUEUE
;
public
static
final
String
INTEGRAL_TRUCK_PROTECTION_CANCEL_ROUTING_KEY
=
PREFIX
+
"truckProtection.cancel"
+
QUEUE_ROUTING_KEY
;
/**
* 运单结束
*/
public
static
final
String
INTEGRAL_ORDER_CHILD_FINISH_QUEUE
=
PREFIX
+
"orderChild.finish"
+
QUEUE
;
public
static
final
String
INTEGRAL_ORDER_CHILD_FINISH_ROUTING_KEY
=
PREFIX
+
"orderChild.finish"
+
QUEUE_ROUTING_KEY
;
/**
* 实时积分统计
*/
public
static
final
String
INTEGRAL_REAL_TIME_STATISTICS_QUEUE
=
PREFIX
+
"integralRealTime.statistics"
+
QUEUE
;
public
static
final
String
INTEGRAL_REAL_TIME_STATISTICS_ROUTING_KEY
=
PREFIX
+
"integralRealTime.statistics"
+
QUEUE_ROUTING_KEY
;
}
performance-web/src/main/java/com/clx/performance/controller/feign/IntegralTruckFeignController.java
浏览文件 @
3f4b05f1
...
@@ -5,7 +5,7 @@ import com.clx.performance.service.IntegralTruckService;
...
@@ -5,7 +5,7 @@ import com.clx.performance.service.IntegralTruckService;
import
com.msl.common.result.Result
;
import
com.msl.common.result.Result
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.AllArgsConstructor
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestBody
;
...
@@ -16,10 +16,10 @@ import org.springframework.web.bind.annotation.RestController;
...
@@ -16,10 +16,10 @@ import org.springframework.web.bind.annotation.RestController;
@RequestMapping
(
"/feign/integral"
)
@RequestMapping
(
"/feign/integral"
)
@Validated
@Validated
@Api
(
tags
=
"积分车辆"
)
@Api
(
tags
=
"积分车辆"
)
@AllArgsConstructor
public
class
IntegralTruckFeignController
{
public
class
IntegralTruckFeignController
{
private
final
IntegralTruckService
integralTruckService
;
@Autowired
private
IntegralTruckService
integralTruckService
;
@ApiOperation
(
value
=
"新增车辆"
)
@ApiOperation
(
value
=
"新增车辆"
)
@PostMapping
(
"/saveTruck"
)
@PostMapping
(
"/saveTruck"
)
...
...
performance-web/src/main/java/com/clx/performance/dao/IntegralRecordDao.java
浏览文件 @
3f4b05f1
...
@@ -20,4 +20,6 @@ public interface IntegralRecordDao extends BaseDao<IntegraRecordMapper, Integral
...
@@ -20,4 +20,6 @@ public interface IntegralRecordDao extends BaseDao<IntegraRecordMapper, Integral
Integer
sumIntegral
(
@Param
(
"statisticsId"
)
Integer
statisticsId
);
Integer
sumIntegral
(
@Param
(
"statisticsId"
)
Integer
statisticsId
);
IntegralRecord
selectByStatisticsIdAndType
(
@Param
(
"statisticsId"
)
Integer
statisticsId
,
@Param
(
"type"
)
Integer
type
);
}
}
performance-web/src/main/java/com/clx/performance/dao/IntegralStatisticsDao.java
浏览文件 @
3f4b05f1
...
@@ -33,5 +33,6 @@ public interface IntegralStatisticsDao extends BaseDao<IntegralStatisticsMapper,
...
@@ -33,5 +33,6 @@ public interface IntegralStatisticsDao extends BaseDao<IntegralStatisticsMapper,
List
<
IntegralStatistics
>
selectListByStatisticsDateAndTruckNoList
(
@Param
(
"statisticsDate"
)
String
statisticsDate
,
@Param
(
"list"
)
List
<
String
>
truckNoList
);
List
<
IntegralStatistics
>
selectListByStatisticsDateAndTruckNoList
(
@Param
(
"statisticsDate"
)
String
statisticsDate
,
@Param
(
"list"
)
List
<
String
>
truckNoList
);
int
countByStatisticsDate
(
@Param
(
"statisticsDate"
)
String
statisticsDate
);
}
}
performance-web/src/main/java/com/clx/performance/dao/IntegralTruckDao.java
浏览文件 @
3f4b05f1
...
@@ -35,4 +35,6 @@ public interface IntegralTruckDao extends BaseDao<IntegralTruckMapper, IntegralT
...
@@ -35,4 +35,6 @@ public interface IntegralTruckDao extends BaseDao<IntegralTruckMapper, IntegralT
IPage
<
IntegralTruckVO
>
pageTruckRank
(
PageIntegralTruckRankParam
param
);
IPage
<
IntegralTruckVO
>
pageTruckRank
(
PageIntegralTruckRankParam
param
);
List
<
IntegralTruck
>
selectListByTime
(
@Param
(
"beginTime"
)
String
beginTime
,
@Param
(
"endTime"
)
String
endTime
);
}
}
performance-web/src/main/java/com/clx/performance/dao/impl/IntegralRecordDaoImpl.java
浏览文件 @
3f4b05f1
...
@@ -33,4 +33,11 @@ public class IntegralRecordDaoImpl extends BaseDaoImpl<IntegraRecordMapper, Inte
...
@@ -33,4 +33,11 @@ public class IntegralRecordDaoImpl extends BaseDaoImpl<IntegraRecordMapper, Inte
.
eq
(
"statistics_id"
,
statisticsId
))).
map
(
item
->
item
.
getIntegral
()).
orNull
();
.
eq
(
"statistics_id"
,
statisticsId
))).
map
(
item
->
item
.
getIntegral
()).
orNull
();
}
}
@Override
public
IntegralRecord
selectByStatisticsIdAndType
(
Integer
statisticsId
,
Integer
type
)
{
return
getOne
(
lQrWrapper
()
.
eq
(
IntegralRecord:
:
getStatisticsId
,
statisticsId
)
.
eq
(
IntegralRecord:
:
getType
,
type
));
}
}
}
performance-web/src/main/java/com/clx/performance/dao/impl/IntegralStatisticsDaoImpl.java
浏览文件 @
3f4b05f1
...
@@ -75,4 +75,11 @@ public class IntegralStatisticsDaoImpl extends BaseDaoImpl<IntegralStatisticsMap
...
@@ -75,4 +75,11 @@ public class IntegralStatisticsDaoImpl extends BaseDaoImpl<IntegralStatisticsMap
.
in
(
IntegralStatistics:
:
getTruckNo
,
truckNoList
));
.
in
(
IntegralStatistics:
:
getTruckNo
,
truckNoList
));
}
}
@Override
public
int
countByStatisticsDate
(
String
statisticsDate
)
{
return
(
int
)
count
(
lQrWrapper
()
.
eq
(
IntegralStatistics:
:
getStatisticsDate
,
statisticsDate
)
);
}
}
}
performance-web/src/main/java/com/clx/performance/dao/impl/IntegralTruckDaoImpl.java
浏览文件 @
3f4b05f1
...
@@ -77,4 +77,11 @@ public class IntegralTruckDaoImpl extends BaseDaoImpl<IntegralTruckMapper, Integ
...
@@ -77,4 +77,11 @@ public class IntegralTruckDaoImpl extends BaseDaoImpl<IntegralTruckMapper, Integ
return
null
;
return
null
;
}
}
@Override
public
List
<
IntegralTruck
>
selectListByTime
(
String
beginTime
,
String
endTime
)
{
return
list
(
lQrWrapper
()
.
ge
(
IntegralTruck:
:
getCreateTime
,
beginTime
)
.
le
(
IntegralTruck:
:
getCreateTime
,
endTime
));
}
}
}
performance-web/src/main/java/com/clx/performance/job/IntegralJob.java
浏览文件 @
3f4b05f1
package
com
.
clx
.
performance
.
job
;
package
com
.
clx
.
performance
.
job
;
import
com.msl.common.job.JobLog
;
import
com.clx.performance.dao.IntegralTruckDao
;
import
com.clx.performance.model.IntegralTruck
;
import
com.clx.performance.service.IntegralJobHandlerService
;
import
com.clx.performance.utils.JobHandlerService
;
import
com.clx.performance.utils.LocalDateTimeUtils
;
import
com.xxl.job.core.handler.annotation.XxlJob
;
import
com.xxl.job.core.handler.annotation.XxlJob
;
import
lombok.AllArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Component
;
import
org.springframework.stereotype.Component
;
import
java.time.LocalDateTime
;
import
java.util.List
;
@Slf4j
@Slf4j
@Component
@Component
@AllArgsConstructor
public
class
IntegralJob
{
public
class
IntegralJob
{
private
final
IntegralTruckDao
integralTruckDao
;
private
final
JobHandlerService
jobHandlerService
;
private
final
IntegralJobHandlerService
integralJobHandlerService
;
/**
/**
* 下周车辆初始化 (周三)
* 下周车辆初始化 (周三)
* @Scheduled(cron = "0 0 6 ? * 3")
* @Scheduled(cron = "0 0 6 ? * 3")
* 下周车辆初始化 (周日)
* @Scheduled(cron = "0 0 22 ? * 7")
*/
*/
@XxlJob
(
"favoriteStatusSyncTask"
)
@XxlJob
(
"favoriteStatusSyncTask"
)
public
void
favoriteStatusSyncTask
()
{
public
void
favoriteStatusSyncTask
()
{
try
{
jobHandlerService
.
handler
(
"司机积分-下周车辆初始化"
,
integralJobHandlerService:
:
nextWeekTruckInit
);
}
catch
(
Exception
e
)
{
JobLog
.
error
(
"下周车辆初始化定时任务处理失败"
,
e
);
}
}
}
/**
* 下周车辆初始化 (周日)
* @Scheduled(cron = "0 0 22 ? * 7")
*/
@XxlJob
(
"favoriteStatusSyncTask1"
)
public
void
favoriteStatusSyncTask1
()
{
try
{
}
catch
(
Exception
e
)
{
JobLog
.
error
(
"下周车辆初始化定时任务处理失败"
,
e
);
}
}
/**
/**
* 车辆周统计(结算上周积分) (周1)
* 车辆周统计(结算上周积分) (周1)
...
@@ -43,12 +42,16 @@ public class IntegralJob {
...
@@ -43,12 +42,16 @@ public class IntegralJob {
*/
*/
@XxlJob
(
"weekTruckStatistics"
)
@XxlJob
(
"weekTruckStatistics"
)
public
void
weekTruckStatistics
()
{
public
void
weekTruckStatistics
()
{
try
{
jobHandlerService
.
handler
(
"司机积分-车辆周统计"
,
()->{
List
<
IntegralTruck
>
list
=
integralTruckDao
.
listAll
();
log
.
info
(
"司机积分,车辆数量:{}"
,
list
.
size
());
list
.
forEach
(
integralJobHandlerService:
:
weekTruckStatistics
);
});
jobHandlerService
.
handler
(
"司机积分-车辆周统计"
,
integralJobHandlerService:
:
weekTruckStatistics
);
}
catch
(
Exception
e
)
{
JobLog
.
error
(
"车辆周统计(结算上周积分)定时任务处理失败"
,
e
);
}
}
}
/**
/**
...
@@ -57,12 +60,16 @@ public class IntegralJob {
...
@@ -57,12 +60,16 @@ public class IntegralJob {
*/
*/
@XxlJob
(
"truckProtectionCancel"
)
@XxlJob
(
"truckProtectionCancel"
)
public
void
truckProtectionCancel
()
{
public
void
truckProtectionCancel
()
{
try
{
LocalDateTime
time
=
LocalDateTimeUtils
.
getDayStart
().
minusDays
(
7
);
jobHandlerService
.
handler
(
"司机积分-车辆保护取消"
,
()->{
// 查找刚好7天的车辆
List
<
IntegralTruck
>
list
=
integralTruckDao
.
selectListByTime
(
LocalDateTimeUtils
.
formatTime
(
time
),
LocalDateTimeUtils
.
formatTime
(
time
.
plusDays
(
1
)));
log
.
info
(
"查找待同步车辆, size:{}"
,
list
.
size
());
}
catch
(
Exception
e
)
{
list
.
forEach
(
integralJobHandlerService:
:
truckProtectionCancel
);
JobLog
.
error
(
"车辆保护期取消定时任务处理失败"
,
e
);
}
}
);
}
}
}
}
performance-web/src/main/java/com/clx/performance/listener/IntegralDelayListener.java
0 → 100644
浏览文件 @
3f4b05f1
package
com
.
clx
.
performance
.
listener
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.TypeReference
;
import
com.clx.performance.constant.RabbitKeyIntegralConstants
;
import
com.clx.performance.utils.MqDelay
;
import
com.clx.performance.utils.MqWrapper
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.amqp.core.Message
;
import
org.springframework.amqp.core.MessageBuilder
;
import
org.springframework.amqp.rabbit.annotation.RabbitListener
;
import
org.springframework.amqp.rabbit.core.RabbitTemplate
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
/**
* @Author: 艾庆国
* @Description: 司机积分 mq
* @Date: 2023-10-12 11:44:13
* @Version: 1.0
*/
@Slf4j
@Component
public
class
IntegralDelayListener
{
@Autowired
private
RabbitTemplate
rabbitTemplate
;
@RabbitListener
(
queues
=
RabbitKeyIntegralConstants
.
DEFAULT_DEAD_QUEUE
)
public
void
process
(
Message
message
)
{
try
{
log
.
info
(
"司机积分-延迟, message:{}"
,
message
);
process
(
JSON
.
parseObject
(
new
String
(
message
.
getBody
()),
new
TypeReference
<
MqWrapper
<
MqDelay
>>(){}).
getData
());
}
catch
(
Exception
e
){
log
.
info
(
"司机积分-延迟 失败"
,
e
);
}
}
void
process
(
MqDelay
mq
){
Message
message
=
MessageBuilder
.
withBody
(
JSON
.
toJSONString
(
mq
).
getBytes
()).
build
();
rabbitTemplate
.
send
(
mq
.
getExchange
(),
mq
.
getRouterKey
(),
message
);
}
}
performance-web/src/main/java/com/clx/performance/listener/IntegralNextWeekTruckInitListener.java
0 → 100644
浏览文件 @
3f4b05f1
package
com
.
clx
.
performance
.
listener
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.TypeReference
;
import
com.clx.performance.constant.RabbitKeyIntegralConstants
;
import
com.clx.performance.param.mq.IntegralNextWeekTruckInitMqParam
;
import
com.clx.performance.service.IntegralMqHandlerService
;
import
com.clx.performance.utils.MqWrapper
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.amqp.core.Message
;
import
org.springframework.amqp.rabbit.annotation.RabbitListener
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
/**
* @Author: 艾庆国
* @Description: 积分车辆新增 mq
* @Date: 2023-10-12 11:44:13
* @Version: 1.0
*/
@Slf4j
@Component
public
class
IntegralNextWeekTruckInitListener
{
@Autowired
private
IntegralMqHandlerService
integralMqHandlerService
;
@RabbitListener
(
queues
=
RabbitKeyIntegralConstants
.
INTEGRAL_NEXT_WEEK_TRUCK_INIT_QUEUE
)
public
void
process
(
Message
message
)
{
try
{
log
.
info
(
"司机积分-下周车辆初始化, message:{}"
,
new
String
(
message
.
getBody
()));
process
(
JSON
.
parseObject
(
new
String
(
message
.
getBody
()),
new
TypeReference
<
MqWrapper
<
IntegralNextWeekTruckInitMqParam
>>(){}).
getData
());
}
catch
(
Exception
e
){
log
.
info
(
"司机积分-下周车辆初始化 失败"
,
e
);
}
}
private
void
process
(
IntegralNextWeekTruckInitMqParam
mq
){
integralMqHandlerService
.
nextWeekTruckInit
(
mq
);
}
}
performance-web/src/main/java/com/clx/performance/listener/IntegralOrderChildFinishListener.java
0 → 100644
浏览文件 @
3f4b05f1
package
com
.
clx
.
performance
.
listener
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.TypeReference
;
import
com.clx.performance.constant.RabbitKeyIntegralConstants
;
import
com.clx.performance.param.mq.IntegralOrderChildFinishMqParam
;
import
com.clx.performance.service.IntegralMqHandlerService
;
import
com.clx.performance.utils.MqWrapper
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.amqp.core.Message
;
import
org.springframework.amqp.rabbit.annotation.RabbitListener
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
/**
* @Author: 艾庆国
* @Description: 运单结束 mq
* @Date: 2023-10-12 11:44:13
* @Version: 1.0
*/
@Slf4j
@Component
public
class
IntegralOrderChildFinishListener
{
@Autowired
private
IntegralMqHandlerService
integralMqHandlerService
;
@RabbitListener
(
queues
=
RabbitKeyIntegralConstants
.
INTEGRAL_ORDER_CHILD_FINISH_QUEUE
)
public
void
process
(
Message
message
)
{
try
{
log
.
info
(
"司机积分-运单结束, message:{}"
,
new
String
(
message
.
getBody
()));
process
(
JSON
.
parseObject
(
new
String
(
message
.
getBody
()),
new
TypeReference
<
MqWrapper
<
IntegralOrderChildFinishMqParam
>>(){}).
getData
());
}
catch
(
Exception
e
){
log
.
info
(
"司机积分-运单结束 失败"
,
e
);
}
}
private
void
process
(
IntegralOrderChildFinishMqParam
mq
){
integralMqHandlerService
.
orderChildFinish
(
mq
);
}
}
performance-web/src/main/java/com/clx/performance/listener/IntegralRecordAddListener.java
0 → 100644
浏览文件 @
3f4b05f1
package
com
.
clx
.
performance
.
listener
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.TypeReference
;
import
com.clx.performance.constant.RabbitKeyIntegralConstants
;
import
com.clx.performance.param.mq.IntegralRecordAddMqParam
;
import
com.clx.performance.service.IntegralMqHandlerService
;
import
com.clx.performance.utils.MqWrapper
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.amqp.core.Message
;
import
org.springframework.amqp.rabbit.annotation.RabbitListener
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
/**
* @Author: 艾庆国
* @Description: 积分记录新增 mq
* @Date: 2023-10-12 11:44:13
* @Version: 1.0
*/
@Slf4j
@Component
public
class
IntegralRecordAddListener
{
@Autowired
private
IntegralMqHandlerService
integralMqHandlerService
;
@RabbitListener
(
queues
=
RabbitKeyIntegralConstants
.
INTEGRAL_RECORD_ADD_QUEUE
)
public
void
process
(
Message
message
)
{
try
{
log
.
info
(
"司机积分-新增积分记录, message:{}"
,
new
String
(
message
.
getBody
()));
process
(
JSON
.
parseObject
(
new
String
(
message
.
getBody
()),
new
TypeReference
<
MqWrapper
<
IntegralRecordAddMqParam
>>(){}).
getData
());
}
catch
(
Exception
e
){
log
.
info
(
"司机积分-新增积分记录 失败"
,
e
);
}
}
private
void
process
(
IntegralRecordAddMqParam
mq
){
integralMqHandlerService
.
recordAdd
(
mq
);
}
}
performance-web/src/main/java/com/clx/performance/listener/IntegralTruckAddListener.java
0 → 100644
浏览文件 @
3f4b05f1
package
com
.
clx
.
performance
.
listener
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.TypeReference
;
import
com.clx.performance.constant.RabbitKeyIntegralConstants
;
import
com.clx.performance.param.mq.IntegralTuckAddMqParam
;
import
com.clx.performance.service.IntegralMqHandlerService
;
import
com.clx.performance.utils.MqWrapper
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.amqp.core.Message
;
import
org.springframework.amqp.rabbit.annotation.RabbitListener
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
/**
* @Author: 艾庆国
* @Description: 积分车辆新增 mq
* @Date: 2023-10-12 19:27:49
* @Version: 1.0
*/
@Slf4j
@Component
public
class
IntegralTruckAddListener
{
@Autowired
private
IntegralMqHandlerService
integralMqHandlerService
;
@RabbitListener
(
queues
=
RabbitKeyIntegralConstants
.
INTEGRAL_TRUCK_ADD_QUEUE
)
public
void
process
(
Message
message
)
{
try
{
log
.
info
(
"司机积分-新增车辆, message:{}"
,
new
String
(
message
.
getBody
()));
process
(
JSON
.
parseObject
(
new
String
(
message
.
getBody
()),
new
TypeReference
<
MqWrapper
<
IntegralTuckAddMqParam
>>(){}).
getData
());
}
catch
(
Exception
e
){
log
.
info
(
"司机积分-新增车辆 失败"
,
e
);
}
}
private
void
process
(
IntegralTuckAddMqParam
mq
){
integralMqHandlerService
.
truckAdd
(
mq
);
}
}
performance-web/src/main/java/com/clx/performance/listener/IntegralTruckProtectionCancelListener.java
0 → 100644
浏览文件 @
3f4b05f1
package
com
.
clx
.
performance
.
listener
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.TypeReference
;
import
com.clx.performance.constant.RabbitKeyIntegralConstants
;
import
com.clx.performance.param.mq.IntegralTruckProtectionCancelMqParam
;
import
com.clx.performance.service.IntegralMqHandlerService
;
import
com.clx.performance.utils.MqWrapper
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.amqp.core.Message
;
import
org.springframework.amqp.rabbit.annotation.RabbitListener
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
/**
* @Author: 艾庆国
* @Description: 新车保护取消 mq
* @Date: 2023-10-12 19:27:58
* @Version: 1.0
*/
@Slf4j
@Component
public
class
IntegralTruckProtectionCancelListener
{
@Autowired
private
IntegralMqHandlerService
integralMqHandlerService
;
@RabbitListener
(
queues
=
RabbitKeyIntegralConstants
.
INTEGRAL_TRUCK_PROTECTION_CANCEL_QUEUE
)
public
void
process
(
Message
message
)
{
try
{
log
.
info
(
"司机积分-新车保护取消, message:{}"
,
new
String
(
message
.
getBody
()));
process
(
JSON
.
parseObject
(
new
String
(
message
.
getBody
()),
new
TypeReference
<
MqWrapper
<
IntegralTruckProtectionCancelMqParam
>>(){}).
getData
());
}
catch
(
Exception
e
){
log
.
info
(
"司机积分-新车保护取消 失败"
,
e
);
}
}
private
void
process
(
IntegralTruckProtectionCancelMqParam
mq
){
integralMqHandlerService
.
truckProtectionCancel
(
mq
);
}
}
performance-web/src/main/java/com/clx/performance/listener/IntegralWeekTruckStatisticsListener.java
0 → 100644
浏览文件 @
3f4b05f1
package
com
.
clx
.
performance
.
listener
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.TypeReference
;
import
com.clx.performance.constant.RabbitKeyIntegralConstants
;
import
com.clx.performance.param.mq.IntegralWeekTruckStatisticsMqParam
;
import
com.clx.performance.service.IntegralMqHandlerService
;
import
com.clx.performance.utils.MqWrapper
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.amqp.core.Message
;
import
org.springframework.amqp.rabbit.annotation.RabbitListener
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
/**
* @Author: 艾庆国
* @Description: 积分车辆新增 mq
* @Date: 2023-10-12 11:44:13
* @Version: 1.0
*/
@Slf4j
@Component
public
class
IntegralWeekTruckStatisticsListener
{
@Autowired
private
IntegralMqHandlerService
integralMqHandlerService
;
@RabbitListener
(
queues
=
RabbitKeyIntegralConstants
.
INTEGRAL_WEEK_TRUCK_STATISTICS_QUEUE
)
public
void
process
(
Message
message
)
{
try
{
log
.
info
(
"司机积分-车辆周统计, message:{}"
,
new
String
(
message
.
getBody
()));
process
(
JSON
.
parseObject
(
new
String
(
message
.
getBody
()),
new
TypeReference
<
MqWrapper
<
IntegralWeekTruckStatisticsMqParam
>>(){}).
getData
());
}
catch
(
Exception
e
){
log
.
info
(
"司机积分-车辆周统计 失败"
,
e
);
}
}
private
void
process
(
IntegralWeekTruckStatisticsMqParam
mq
){
integralMqHandlerService
.
weekTruckStatistics
(
mq
);
}
}
performance-web/src/main/java/com/clx/performance/service/IntegralJobHandlerService.java
0 → 100644
浏览文件 @
3f4b05f1
package
com
.
clx
.
performance
.
service
;
import
com.clx.performance.model.IntegralTruck
;
import
com.clx.performance.utils.LocalDateTimeUtils
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
@Slf4j
@Service
public
class
IntegralJobHandlerService
{
@Autowired
private
IntegralMqService
integralMqService
;
/**
* 下周车辆初始化
*/
public
void
nextWeekTruckInit
(){
// 发送mq (下周车辆初始化)
integralMqService
.
nextWeekTruckInit
(
LocalDateTimeUtils
.
getWeekStart
());
}
/**
* 车辆周统计 (结算上周积分)
*/
public
void
weekTruckStatistics
(){
// 发送mq (下周车辆初始化)
integralMqService
.
weekTruckStatistics
(
LocalDateTimeUtils
.
getWeekStart
());
}
public
void
weekTruckStatistics
(
IntegralTruck
truck
){
// 发送mq (下周车辆初始化)
integralMqService
.
weekTruckStatistics
(
LocalDateTimeUtils
.
getWeekStart
(),
truck
.
getTruckNo
());
}
/**
* 车辆保护取消
*/
public
void
truckProtectionCancel
(
IntegralTruck
truck
){
// 发送mq (车辆保护取消)
integralMqService
.
truckProtectionCancel
(
LocalDateTimeUtils
.
getWeekStart
(),
truck
.
getTruckNo
());
}
}
performance-web/src/main/java/com/clx/performance/service/IntegralMqHandlerService.java
0 → 100644
浏览文件 @
3f4b05f1
package
com
.
clx
.
performance
.
service
;
import
com.clx.performance.param.mq.*
;
public
interface
IntegralMqHandlerService
{
void
truckAdd
(
IntegralTuckAddMqParam
mq
);
void
recordAdd
(
IntegralRecordAddMqParam
mq
);
void
nextWeekTruckInit
(
IntegralNextWeekTruckInitMqParam
mq
);
void
weekTruckStatistics
(
IntegralWeekTruckStatisticsMqParam
mq
);
void
truckProtectionCancel
(
IntegralTruckProtectionCancelMqParam
mq
);
void
orderChildFinish
(
IntegralOrderChildFinishMqParam
mq
);
void
integralRealTimeStatistics
(
Integer
statisticsId
);
void
integralRealTimeRankStatistics
(
String
statisticsDate
);
}
performance-web/src/main/java/com/clx/performance/service/IntegralMqService.java
浏览文件 @
3f4b05f1
package
com
.
clx
.
performance
.
service
;
package
com
.
clx
.
performance
.
service
;
public
interface
IntegralMqService
{
public
interface
IntegralMqService
{
void
truckAdd
(
Integer
statisticsId
,
String
truckNo
);
void
truckAdd
(
Integer
statisticsId
,
String
truckNo
);
void
integralRecordAdd
(
Integer
statisticsId
,
String
truckNo
,
Integer
type
,
Integer
integral
,
String
remark
);
void
integralRecordAdd
(
Integer
statisticsId
,
String
truckNo
,
Integer
type
,
Integer
integral
,
String
remark
);
void
nextWeekTruckInit
(
String
statisticsDate
);
void
weekTruckStatistics
(
String
statisticsDate
);
void
weekTruckStatistics
(
String
statisticsDate
,
String
truckNo
);
void
truckProtectionCancel
(
String
statisticsDate
,
String
truckNo
);
void
orderChildFinish
(
String
childNo
);
}
}
performance-web/src/main/java/com/clx/performance/service/impl/IntegralMqHandlerServiceImpl.java
0 → 100644
浏览文件 @
3f4b05f1
package
com
.
clx
.
performance
.
service
.
impl
;
import
com.clx.performance.dao.*
;
import
com.clx.performance.model.IntegralRecord
;
import
com.clx.performance.model.IntegralStatistics
;
import
com.clx.performance.model.IntegralTruck
;
import
com.clx.performance.param.mq.*
;
import
com.clx.performance.service.IntegralMqHandlerService
;
import
com.clx.performance.service.IntegralMqService
;
import
com.clx.performance.service.IntegralRecordService
;
import
com.clx.performance.service.IntegralStatisticsService
;
import
com.clx.performance.utils.LocalDateTimeUtils
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.stream.Collectors
;
@Slf4j
@Service
public
class
IntegralMqHandlerServiceImpl
implements
IntegralMqHandlerService
{
@Autowired
private
IntegralMqService
integralMqService
;
@Autowired
private
IntegralStatisticsDao
integralStatisticsDao
;
@Autowired
private
IntegralRecordDao
integralRecordDao
;
@Autowired
private
IntegralTruckDao
integralTruckDao
;
@Autowired
private
IntegralOrderDao
integralOrderDao
;
@Autowired
private
OrderChildDao
orderChildDao
;
@Autowired
private
OrderGoodsDao
orderGoodsDao
;
@Autowired
private
IntegralStatisticsService
integralStatisticsService
;
@Autowired
private
IntegralRecordService
integralRecordService
;
/**
* 车辆新增
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
truckAdd
(
IntegralTuckAddMqParam
mq
){
}
/**
* 积分记录新增
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
recordAdd
(
IntegralRecordAddMqParam
mq
){
}
/**
* 下周车辆初始化(新增统计车辆) (周3、周7 晚上)
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
nextWeekTruckInit
(
IntegralNextWeekTruckInitMqParam
mq
){
String
statisticsDateCurrent
=
mq
.
getStatisticsDate
();
String
statisticsDateNext
=
LocalDateTimeUtils
.
formatTime
(
LocalDateTimeUtils
.
parseTime
(
statisticsDateCurrent
).
plusDays
(
7
));
// 查找本周车辆
List
<
IntegralStatistics
>
list
=
integralStatisticsDao
.
selectByStatisticsDate
(
statisticsDateCurrent
);
// 查找下周车辆
List
<
IntegralStatistics
>
nextList
=
integralStatisticsDao
.
selectByStatisticsDate
(
statisticsDateNext
);
List
<
String
>
truckNoNextList
=
nextList
.
stream
().
map
(
item
->
item
.
getTruckNo
()).
collect
(
Collectors
.
toList
());
List
<
IntegralStatistics
>
newList
=
new
ArrayList
<>();
for
(
IntegralStatistics
item
:
list
)
{
if
(
truckNoNextList
.
contains
(
item
.
getTruckNo
()))
{
continue
;}
IntegralStatistics
statistics
=
new
IntegralStatistics
();
statistics
.
setTruckNo
(
item
.
getTruckNo
());
statistics
.
setStatisticsDate
(
statisticsDateNext
);
statistics
.
setIntegralBase
(
0
);
statistics
.
setIntegral
(
0
);
statistics
.
setRank
(
1
);
newList
.
add
(
statistics
);
}
if
(
newList
.
isEmpty
())
{
return
;}
// 新增下周车辆
integralStatisticsDao
.
batchSaveEntity
(
newList
);
}
/**
* 车辆周统计 (统计周初始积分)
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
weekTruckStatistics
(
IntegralWeekTruckStatisticsMqParam
mq
){
if
(
StringUtils
.
isNotBlank
(
mq
.
getTruckNo
())){
// 基础分初始化
truckBaseIntegralInit
(
mq
.
getTruckNo
(),
mq
.
getStatisticsDate
());
return
;
}
// 更新本周实时排名
integralRealTimeRankStatistics
(
mq
.
getStatisticsDate
());
}
/**
* 新一周基础积分初始化
*/
private
void
truckBaseIntegralInit
(
String
truckNo
,
String
statisticsDate
){
IntegralTruck
truck
=
integralTruckDao
.
getByTruckNo
(
truckNo
).
orNull
();
if
(
null
==
truck
)
{
return
;}
IntegralStatistics
statistics
=
integralStatisticsDao
.
selectByTruckNoAndStatisticsDate
(
truck
.
getTruckNo
(),
statisticsDate
).
orNull
();
if
(
null
==
statistics
)
{
return
;}
// 新车保护分
newTruckProtection
(
truck
,
statistics
);
// 周结算分
truckWeekSettlement
(
truck
,
statistics
);
integralStatisticsDao
.
updateIntegral
(
statistics
);
truck
.
setIntegral
(
statistics
.
getIntegral
());
integralTruckDao
.
updateIntegral
(
truck
);
}
/**
* 新车保护分
*/
private
void
newTruckProtection
(
IntegralTruck
truck
,
IntegralStatistics
statistics
){
String
statisticsDate
=
statistics
.
getStatisticsDate
();
// 超过保护期
if
(
LocalDateTimeUtils
.
parseTime
(
truck
.
getCreateTime
()).
isBefore
(
LocalDateTimeUtils
.
parseTime
(
statisticsDate
).
minusDays
(
7
)))
{
return
;}
// 已保护不处理
IntegralRecord
record
=
integralRecordDao
.
selectByStatisticsIdAndType
(
statistics
.
getId
(),
IntegralRecord
.
type
.
PROTECTION
.
getValue
());
if
(
null
!=
record
)
{
return
;}
// 计算新车积分
int
integral
=
integralStatisticsService
.
protectionIntegralCalc
(
truck
.
getCreateTime
(),
statisticsDate
);
if
(
integral
==
0
)
{
return
;}
statistics
.
setIntegral
(
statistics
.
getIntegral
()+
integral
);
integralStatisticsDao
.
updateIntegral
(
statistics
);
integralRecordService
.
save
(
statistics
.
getId
(),
statistics
.
getStatisticsDate
(),
statistics
.
getTruckNo
(),
IntegralRecord
.
type
.
PROTECTION
.
getValue
(),
integral
,
"新用户"
);
}
/**
* 上周结算分
*/
private
void
truckWeekSettlement
(
IntegralTruck
truck
,
IntegralStatistics
statistics
){
int
integral
;
// 已结算不处理
IntegralRecord
record
=
integralRecordDao
.
selectByStatisticsIdAndType
(
statistics
.
getId
(),
IntegralRecord
.
type
.
SETTLEMENT
.
getValue
());
if
(
null
!=
record
)
{
return
;}
String
statisticsDatePre
=
LocalDateTimeUtils
.
formatTime
(
LocalDateTimeUtils
.
parseTime
(
statistics
.
getStatisticsDate
()).
minusDays
(
7
));
// 查找上周统计数据
IntegralStatistics
statisticsPre
=
integralStatisticsDao
.
selectByTruckNoAndStatisticsDate
(
truck
.
getTruckNo
(),
statisticsDatePre
).
orNull
();
if
(
null
==
statisticsPre
)
{
return
;}
// 查找总车数
int
truckSum
=
integralStatisticsDao
.
countByStatisticsDate
(
statisticsDatePre
);
if
(
statisticsPre
.
getRank
()
<=
truckSum
*
0.1
){
integral
=
300
;
}
else
if
(
(
statisticsPre
.
getRank
()
>
truckSum
*
0.1
)
&&
(
statisticsPre
.
getRank
()
<=
truckSum
*
0.3
)){
integral
=
200
;
}
else
if
(
(
statisticsPre
.
getRank
()
>
truckSum
*
0.3
)
&&
(
statisticsPre
.
getRank
()
<=
truckSum
*
0.6
)){
integral
=
100
;
}
else
if
(
(
statisticsPre
.
getRank
()
>
truckSum
*
0.6
)
&&
(
statisticsPre
.
getRank
()
<=
truckSum
*
0.9
)){
integral
=
60
;
}
else
{
integral
=
0
;
}
if
(
integral
==
0
)
{
return
;}
statistics
.
setIntegral
(
statistics
.
getIntegral
()+
integral
);
integralRecordService
.
save
(
statistics
.
getId
(),
statistics
.
getStatisticsDate
(),
statistics
.
getTruckNo
(),
IntegralRecord
.
type
.
SETTLEMENT
.
getValue
(),
integral
,
"上周结算"
);
}
/**
* 新手保护取消
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
truckProtectionCancel
(
IntegralTruckProtectionCancelMqParam
mq
){
IntegralTruck
truck
=
integralTruckDao
.
getByTruckNo
(
mq
.
getTruckNo
()).
orNull
();
if
(
null
==
truck
)
{
return
;}
IntegralStatistics
statistics
=
integralStatisticsDao
.
selectByTruckNoAndStatisticsDate
(
truck
.
getTruckNo
(),
mq
.
getStatisticsDate
()).
orNull
();
if
(
null
==
statistics
)
{
return
;}
IntegralRecord
record
=
integralRecordDao
.
selectByStatisticsIdAndType
(
statistics
.
getId
(),
IntegralRecord
.
type
.
PROTECTION
.
getValue
());
IntegralRecord
recordCancel
=
integralRecordDao
.
selectByStatisticsIdAndType
(
statistics
.
getId
(),
IntegralRecord
.
type
.
PROTECTION_CANCEL
.
getValue
());
if
(
null
!=
recordCancel
)
{
return
;}
int
integral
=
-
record
.
getIntegral
();
integralRecordService
.
save
(
statistics
.
getId
(),
statistics
.
getStatisticsDate
(),
statistics
.
getTruckNo
(),
IntegralRecord
.
type
.
PROTECTION_CANCEL
.
getValue
(),
integral
,
"新用户过保护期"
);
statistics
.
setIntegral
(
statistics
.
getIntegral
()+
integral
);
integralStatisticsDao
.
updateIntegral
(
statistics
);
truck
.
setIntegral
(
statistics
.
getIntegral
());
integralTruckDao
.
updateIntegral
(
truck
);
// 更新本周实时排名
integralRealTimeRankStatistics
(
mq
.
getStatisticsDate
());
}
/**
* 运单结束
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
orderChildFinish
(
IntegralOrderChildFinishMqParam
mq
)
{
}
/**
* 更新实时积分
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
integralRealTimeStatistics
(
Integer
statisticsId
){
}
/**
* 更新实时排名
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
integralRealTimeRankStatistics
(
String
statisticsDate
){
}
}
performance-web/src/main/java/com/clx/performance/service/impl/IntegralMqServiceImpl.java
浏览文件 @
3f4b05f1
package
com
.
clx
.
performance
.
service
.
impl
;
package
com
.
clx
.
performance
.
service
.
impl
;
import
com.alibaba.fastjson.JSON
;
import
com.clx.performance.constant.RabbitKeyIntegralConstants
;
import
com.clx.performance.param.mq.IntegralNextWeekTruckInitMqParam
;
import
com.clx.performance.param.mq.IntegralOrderChildFinishMqParam
;
import
com.clx.performance.param.mq.IntegralTruckProtectionCancelMqParam
;
import
com.clx.performance.param.mq.IntegralWeekTruckStatisticsMqParam
;
import
com.clx.performance.service.IntegralMqService
;
import
com.clx.performance.service.IntegralMqService
;
import
lombok.AllArgsConstructo
r
;
import
com.clx.performance.utils.MqWrappe
r
;
import
lombok.extern.slf4j.Slf4j
;
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.stereotype.Service
;
/**
/**
...
@@ -14,26 +24,115 @@ import org.springframework.stereotype.Service;
...
@@ -14,26 +24,115 @@ import org.springframework.stereotype.Service;
@Slf4j
@Slf4j
@Service
@Service
@AllArgsConstructor
public
class
IntegralMqServiceImpl
implements
IntegralMqService
{
public
class
IntegralMqServiceImpl
implements
IntegralMqService
{
@Autowired
private
RabbitTemplate
rabbitTemplate
;
@Autowired
private
IntegralMqHandlerServiceImpl
integralMqHandlerService
;
/**
/**
* 新增车辆 (
manag
e)
* 新增车辆 (
performanc
e)
*/
*/
@Override
@Override
public
void
truckAdd
(
Integer
statisticsId
,
String
truckNo
){
public
void
truckAdd
(
Integer
statisticsId
,
String
truckNo
){
// IntegralTuckAddMQ mq = new IntegralTuckAddMQ();
// mq.setStatisticsId(statisticsId);
// mq.setTruckNo(truckNo);
// Message message = MessageBuilder.withBody(JSON.toJSONString(new MqWrapper<>(mq)).getBytes()).build();
// rabbitTemplate.send(RabbitKeyIntegralConstants.DEFAULT_EXCHANGE, RabbitKeyIntegralConstants.INTEGRAL_TRUCK_ADD_ROUTING_KEY, message);
// 实时积分统计
integralMqHandlerService
.
integralRealTimeStatistics
(
statisticsId
);
}
}
/**
/**
* 新增积分记录 (
manag
e)
* 新增积分记录 (
performanc
e)
*/
*/
@Override
@Override
public
void
integralRecordAdd
(
Integer
statisticsId
,
String
truckNo
,
Integer
type
,
Integer
integral
,
String
remark
){
public
void
integralRecordAdd
(
Integer
statisticsId
,
String
truckNo
,
Integer
type
,
Integer
integral
,
String
remark
){
// IntegralRecordAddMQ mq = new IntegralRecordAddMQ();
// mq.setStatisticsId(statisticsId);
// mq.setTruckNo(truckNo);
// mq.setType(type);
// mq.setIntegral(integral);
// mq.setRemark(remark);
// Message message = MessageBuilder.withBody(JSON.toJSONString(new MqWrapper<>(mq)).getBytes()).build();
// rabbitTemplate.send(RabbitKeyIntegralConstants.DEFAULT_EXCHANGE, RabbitKeyIntegralConstants.INTEGRAL_RECORD_ADD_ROUTING_KEY, message);
// 实时积分统计
integralMqHandlerService
.
integralRealTimeStatistics
(
statisticsId
);
}
/**
* 下周车辆初始化 (job)
*/
@Override
public
void
nextWeekTruckInit
(
String
statisticsDate
){
IntegralNextWeekTruckInitMqParam
mq
=
new
IntegralNextWeekTruckInitMqParam
();
mq
.
setStatisticsDate
(
statisticsDate
);
Message
message
=
MessageBuilder
.
withBody
(
JSON
.
toJSONString
(
new
MqWrapper
<>(
mq
)).
getBytes
()).
build
();
rabbitTemplate
.
send
(
RabbitKeyIntegralConstants
.
DEFAULT_EXCHANGE
,
RabbitKeyIntegralConstants
.
INTEGRAL_NEXT_WEEK_TRUCK_INIT_ROUTING_KEY
,
message
);
}
}
/**
* 车辆周统计 (结算上周积分) (job)
*/
@Override
public
void
weekTruckStatistics
(
String
statisticsDate
){
IntegralWeekTruckStatisticsMqParam
mq
=
new
IntegralWeekTruckStatisticsMqParam
();
mq
.
setStatisticsDate
(
statisticsDate
);
Message
message
=
MessageBuilder
.
withBody
(
JSON
.
toJSONString
(
new
MqWrapper
<>(
mq
)).
getBytes
()).
build
();
rabbitTemplate
.
send
(
RabbitKeyIntegralConstants
.
DEFAULT_EXCHANGE
,
RabbitKeyIntegralConstants
.
INTEGRAL_WEEK_TRUCK_STATISTICS_ROUTING_KEY
,
message
);
}
/**
* 车辆周统计 (结算上周积分) (job)
*/
@Override
public
void
weekTruckStatistics
(
String
statisticsDate
,
String
truckNo
){
IntegralWeekTruckStatisticsMqParam
mq
=
new
IntegralWeekTruckStatisticsMqParam
();
mq
.
setStatisticsDate
(
statisticsDate
);
mq
.
setTruckNo
(
truckNo
);
Message
message
=
MessageBuilder
.
withBody
(
JSON
.
toJSONString
(
new
MqWrapper
<>(
mq
)).
getBytes
()).
build
();
rabbitTemplate
.
send
(
RabbitKeyIntegralConstants
.
DEFAULT_EXCHANGE
,
RabbitKeyIntegralConstants
.
INTEGRAL_WEEK_TRUCK_STATISTICS_ROUTING_KEY
,
message
);
}
/**
* 新车保护取消 (job)
*/
@Override
public
void
truckProtectionCancel
(
String
statisticsDate
,
String
truckNo
){
IntegralTruckProtectionCancelMqParam
mq
=
new
IntegralTruckProtectionCancelMqParam
();
mq
.
setStatisticsDate
(
statisticsDate
);
mq
.
setTruckNo
(
truckNo
);
Message
message
=
MessageBuilder
.
withBody
(
JSON
.
toJSONString
(
new
MqWrapper
<>(
mq
)).
getBytes
()).
build
();
rabbitTemplate
.
send
(
RabbitKeyIntegralConstants
.
DEFAULT_EXCHANGE
,
RabbitKeyIntegralConstants
.
INTEGRAL_TRUCK_PROTECTION_CANCEL_ROUTING_KEY
,
message
);
}
/**
* 运单结束 (performance)
*/
@Override
public
void
orderChildFinish
(
String
childNo
){
IntegralOrderChildFinishMqParam
mq
=
new
IntegralOrderChildFinishMqParam
();
mq
.
setChildNo
(
childNo
);
Message
message
=
MessageBuilder
.
withBody
(
JSON
.
toJSONString
(
new
MqWrapper
<>(
mq
)).
getBytes
()).
build
();
rabbitTemplate
.
send
(
RabbitKeyIntegralConstants
.
DEFAULT_EXCHANGE
,
RabbitKeyIntegralConstants
.
INTEGRAL_ORDER_CHILD_FINISH_ROUTING_KEY
,
message
);
}
}
}
performance-web/src/main/java/com/clx/performance/service/impl/IntegralRecordServiceImpl.java
浏览文件 @
3f4b05f1
...
@@ -11,20 +11,25 @@ import com.clx.performance.param.pc.IntegralRecordAddParam;
...
@@ -11,20 +11,25 @@ import com.clx.performance.param.pc.IntegralRecordAddParam;
import
com.clx.performance.service.IntegralMqService
;
import
com.clx.performance.service.IntegralMqService
;
import
com.clx.performance.service.IntegralRecordService
;
import
com.clx.performance.service.IntegralRecordService
;
import
com.clx.performance.utils.LocalDateTimeUtils
;
import
com.clx.performance.utils.LocalDateTimeUtils
;
import
lombok.AllArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
@Slf4j
@Slf4j
@Service
@Service
@AllArgsConstructor
public
class
IntegralRecordServiceImpl
implements
IntegralRecordService
{
public
class
IntegralRecordServiceImpl
implements
IntegralRecordService
{
private
final
IntegralRecordDao
integralRecordDao
;
@Autowired
private
final
IntegralTruckDao
integralTruckDao
;
private
IntegralRecordDao
integralRecordDao
;
private
final
IntegralStatisticsDao
integralStatisticsDao
;
private
final
IntegralMqService
integralMqService
;
@Autowired
private
IntegralTruckDao
integralTruckDao
;
@Autowired
private
IntegralStatisticsDao
integralStatisticsDao
;
@Autowired
private
IntegralMqService
integralMqService
;
@Override
@Override
public
void
addRecord
(
IntegralRecordAddParam
param
)
{
public
void
addRecord
(
IntegralRecordAddParam
param
)
{
...
...
performance-web/src/main/java/com/clx/performance/service/impl/IntegralTruckServiceImpl.java
浏览文件 @
3f4b05f1
...
@@ -19,8 +19,8 @@ import com.clx.performance.utils.LocalDateTimeUtils;
...
@@ -19,8 +19,8 @@ import com.clx.performance.utils.LocalDateTimeUtils;
import
com.clx.performance.vo.pc.IntegralTruckVO
;
import
com.clx.performance.vo.pc.IntegralTruckVO
;
import
com.clx.user.vo.feign.DriverInfoFeignVo
;
import
com.clx.user.vo.feign.DriverInfoFeignVo
;
import
com.msl.common.exception.ServiceSystemException
;
import
com.msl.common.exception.ServiceSystemException
;
import
lombok.AllArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.transaction.annotation.Transactional
;
...
@@ -30,17 +30,23 @@ import java.util.stream.Collectors;
...
@@ -30,17 +30,23 @@ import java.util.stream.Collectors;
@Slf4j
@Slf4j
@Service
@Service
@AllArgsConstructor
public
class
IntegralTruckServiceImpl
implements
IntegralTruckService
{
public
class
IntegralTruckServiceImpl
implements
IntegralTruckService
{
private
final
IntegralTruckDao
integralTruckDao
;
@Autowired
private
final
IntegralStatisticsDao
integralStatisticsDao
;
private
IntegralTruckDao
integralTruckDao
;
@Autowired
private
IntegralStatisticsDao
integralStatisticsDao
;
private
final
IntegralRecordService
integralRecordService
;
@Autowired
private
final
IntegralStatisticsService
integralStatisticsService
;
private
IntegralRecordService
integralRecordService
;
@Autowired
private
IntegralStatisticsService
integralStatisticsService
;
private
final
DriverService
driverService
;
@Autowired
private
final
IntegralMqService
integralMqService
;
private
DriverService
driverService
;
@Autowired
private
IntegralMqService
integralMqService
;
@Transactional
(
rollbackFor
=
Exception
.
class
)
@Transactional
(
rollbackFor
=
Exception
.
class
)
@Override
@Override
...
...
performance-web/src/main/java/com/clx/performance/utils/JobHandlerService.java
0 → 100644
浏览文件 @
3f4b05f1
package
com
.
clx
.
performance
.
utils
;
import
com.msl.common.exception.ServiceSystemException
;
import
com.msl.common.job.JobLog
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.StopWatch
;
import
java.util.function.Consumer
;
/**
* @Author: aiqingguo
* @Description:
* @Date: 2023-10-12 19:38:41
* @Version: 1.0
*/
@Component
public
class
JobHandlerService
{
protected
Logger
logger
=
LoggerFactory
.
getLogger
(
this
.
getClass
());
public
<
T
>
void
handler
(
String
title
,
Runnable
target
)
{
handler
(
title
,
null
,
target
);
}
public
<
T
>
void
handler
(
String
title
,
T
data
,
Runnable
target
)
{
StopWatch
stopWatch
=
new
StopWatch
();
stopWatch
.
start
();
logger
.
info
(
"{}, 主任务开始, data:{}"
,
title
,
data
);
try
{
target
.
run
();
}
catch
(
ServiceSystemException
e
){
logger
.
info
(
"{}, 主任务执行失败, data:{}, error:{}, detail:{}"
,
title
,
data
,
e
.
getResultEnum
().
getMsg
(),
e
.
getDetail
());
JobLog
.
error
(
title
+
"定时任务处理失败"
,
e
);
}
catch
(
Exception
e
){
logger
.
error
(
"{}, 主任务执行异常, data:{}, error:{}"
,
title
,
data
,
e
.
getMessage
());
JobLog
.
error
(
title
+
"定时任务处理失败"
,
e
);
}
stopWatch
.
stop
();
logger
.
info
(
"{}, 主任务结束, data:{}, duration:{}"
,
title
,
data
,
stopWatch
.
getTotalTimeMillis
());
}
public
<
T
>
void
subHandler
(
String
title
,
T
data
,
Consumer
<
T
>
target
)
{
StopWatch
stopWatch
=
new
StopWatch
();
stopWatch
.
start
();
logger
.
info
(
"{}, 子任务开始, data:{}"
,
title
,
data
);
try
{
target
.
accept
(
data
);
}
catch
(
ServiceSystemException
e
){
logger
.
info
(
"{}, 子任务执行失败, data:{}, error:{}, detail:{}"
,
title
,
data
,
e
.
getResultEnum
().
getMsg
(),
e
.
getDetail
());
JobLog
.
error
(
title
+
"定时任务处理失败"
,
e
);
}
catch
(
Exception
e
){
logger
.
error
(
"{}, 子任务执行异常, data:{}, error:{}"
,
title
,
data
,
e
.
getMessage
());
JobLog
.
error
(
title
+
"定时任务处理失败"
,
e
);
}
stopWatch
.
stop
();
logger
.
info
(
"{}, 子任务结束, data:{}, duration:{}"
,
title
,
data
,
stopWatch
.
getTotalTimeMillis
());
}
}
performance-web/src/main/java/com/clx/performance/utils/LocalDateTimeUtils.java
浏览文件 @
3f4b05f1
...
@@ -163,6 +163,9 @@ public class LocalDateTimeUtils {
...
@@ -163,6 +163,9 @@ public class LocalDateTimeUtils {
return
time
.
withHour
(
0
).
withMinute
(
0
).
withSecond
(
0
).
withNano
(
0
);
return
time
.
withHour
(
0
).
withMinute
(
0
).
withSecond
(
0
).
withNano
(
0
);
}
}
public
static
LocalDateTime
getDayStart
()
{
return
LocalDateTime
.
now
().
withHour
(
0
).
withMinute
(
0
).
withSecond
(
0
).
withNano
(
0
);
}
public
static
String
getStringDayEnd
(
String
time
)
{
public
static
String
getStringDayEnd
(
String
time
)
{
return
formatTime
(
parseTime
(
time
).
withHour
(
23
).
withMinute
(
59
).
withSecond
(
59
).
withNano
(
999999999
));
return
formatTime
(
parseTime
(
time
).
withHour
(
23
).
withMinute
(
59
).
withSecond
(
59
).
withNano
(
999999999
));
}
}
...
...
performance-web/src/main/java/com/clx/performance/utils/MqDelay.java
0 → 100644
浏览文件 @
3f4b05f1
package
com
.
clx
.
performance
.
utils
;
import
lombok.Getter
;
import
lombok.NoArgsConstructor
;
import
lombok.Setter
;
/**
* @Author: aiqingguo
* @Description:
* @Date: 2023-10-12 14:00:14
* @Version: 1.0
*/
@Setter
@Getter
@NoArgsConstructor
public
class
MqDelay
<
T
>
{
private
String
exchange
;
private
String
routerKey
;
private
T
data
;
public
MqDelay
(
String
exchange
,
String
routerKey
,
T
data
)
{
this
.
exchange
=
exchange
;
this
.
routerKey
=
routerKey
;
this
.
data
=
data
;
}
}
performance-web/src/main/java/com/clx/performance/utils/MqWrapper.java
0 → 100644
浏览文件 @
3f4b05f1
package
com
.
clx
.
performance
.
utils
;
import
lombok.Getter
;
import
lombok.NoArgsConstructor
;
import
lombok.Setter
;
import
java.time.LocalDateTime
;
import
java.time.format.DateTimeFormatter
;
/**
* @Author: aiqingguo
* @Description:
* @Date: 2023-10-12 11:59:33
* @Version: 1.0
*/
@Getter
@Setter
@NoArgsConstructor
public
class
MqWrapper
<
T
>
{
private
T
data
;
private
String
exchange
;
//交换机
private
String
routeKey
;
//路由键
private
String
createTime
;
//创建时间
public
MqWrapper
(
T
data
)
{
this
.
data
=
data
;
this
.
createTime
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd HH:mm:ss"
).
format
(
LocalDateTime
.
now
());
}
public
MqWrapper
(
T
data
,
String
exchange
,
String
routeKey
)
{
this
.
data
=
data
;
this
.
exchange
=
exchange
;
this
.
routeKey
=
routeKey
;
this
.
createTime
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd HH:mm:ss"
).
format
(
LocalDateTime
.
now
());
}
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论