Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
J
jiedao-api-boot-master
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lanbaoming
jiedao-api-boot-master
Commits
fb550f73
Commit
fb550f73
authored
Aug 02, 2024
by
zhaobiyan
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/feature_member_score' into feature_member_score
parents
9fd2a13e
bc04f90c
Changes
16
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
470 additions
and
24 deletions
+470
-24
ScoreProducerApi.java
.../cn/iocoder/yudao/module/member/api/ScoreProducerApi.java
+11
-0
pom.xml
yudao-module-member/yudao-module-member-impl/pom.xml
+5
-0
ScoreRuleController.java
...ember/controller/admin/scoreRule/ScoreRuleController.java
+10
-4
OrderInShippingListener.java
...yudao/module/member/listener/OrderInShippingListener.java
+29
-7
ScoreConsumer.java
.../yudao/module/member/mq/consumer/score/ScoreConsumer.java
+26
-0
OderVStrategy.java
...o/module/member/mq/consumer/score/core/OderVStrategy.java
+222
-0
RecommendStrategy.java
...dule/member/mq/consumer/score/core/RecommendStrategy.java
+22
-0
RegisterStrategy.java
...odule/member/mq/consumer/score/core/RegisterStrategy.java
+23
-0
ScoreRuleStrategy.java
...dule/member/mq/consumer/score/core/ScoreRuleStrategy.java
+11
-0
ScoreRuleStrategyFactory.java
...mber/mq/consumer/score/core/ScoreRuleStrategyFactory.java
+27
-0
ScoreMessage.java
.../iocoder/yudao/module/member/mq/message/ScoreMessage.java
+21
-0
ScoreProducer.java
.../yudao/module/member/mq/producer/score/ScoreProducer.java
+37
-0
ScoreRuleServiceImpl.java
...module/member/service/scoreRule/ScoreRuleServiceImpl.java
+2
-2
ScoreRuleBaseVO.java
...der/yudao/module/member/vo/scoreRule/ScoreRuleBaseVO.java
+4
-5
pom.xml
yudao-module-shipment/yudao-module-shipment-core/pom.xml
+5
-1
BoxServiceImpl.java
...der/yudao/module/shipment/service/box/BoxServiceImpl.java
+15
-5
No files found.
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/ScoreProducerApi.java
0 → 100644
View file @
fb550f73
package
cn
.
iocoder
.
yudao
.
module
.
member
.
api
;
import
cn.iocoder.yudao.module.member.enums.ScoreRuleTypeEnum
;
/**
* @author zhangfeng
*/
public
interface
ScoreProducerApi
{
void
sendOderMessage
(
ScoreRuleTypeEnum
scoreRuleType
,
Long
orderId
);
void
sendRecommendMessage
(
ScoreRuleTypeEnum
scoreRuleType
,
Long
userId
);
void
sendRegisterMessage
(
ScoreRuleTypeEnum
scoreRuleType
,
Long
userId
);
}
yudao-module-member/yudao-module-member-impl/pom.xml
View file @
fb550f73
...
...
@@ -54,5 +54,10 @@
<artifactId>
yudao-module-order-api
</artifactId>
<version>
${revision}
</version>
</dependency>
<dependency>
<groupId>
cn.iocoder.boot
</groupId>
<artifactId>
yudao-module-customer-core
</artifactId>
<version>
${revision}
</version>
</dependency>
</dependencies>
</project>
yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/controller/admin/scoreRule/ScoreRuleController.java
View file @
fb550f73
package
cn
.
iocoder
.
yudao
.
module
.
member
.
controller
.
admin
.
scoreRule
;
import
cn.iocoder.yudao.framework.apollo.core.event.OrderInShippingEvent
;
import
cn.iocoder.yudao.framework.common.pojo.CommonResult
;
import
cn.iocoder.yudao.framework.common.pojo.PageResult
;
import
cn.iocoder.yudao.framework.excel.util.ExcelUtils
;
...
...
@@ -8,8 +7,10 @@ import cn.iocoder.yudao.framework.mybatis.core.vo.PageVO;
import
cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog
;
import
cn.iocoder.yudao.module.depository.service.warehouse.WarehouseService
;
import
cn.iocoder.yudao.module.depository.vo.warehouse.WarehouseTreeRegionVO
;
import
cn.iocoder.yudao.module.member.api.ScoreProducerApi
;
import
cn.iocoder.yudao.module.member.convert.scoreRule.ScoreRuleConvert
;
import
cn.iocoder.yudao.module.member.dal.dataobject.scoreRule.ScoreRuleDO
;
import
cn.iocoder.yudao.module.member.enums.ScoreRuleTypeEnum
;
import
cn.iocoder.yudao.module.member.service.scoreRule.ScoreRuleService
;
import
cn.iocoder.yudao.module.member.vo.scoreRule.*
;
import
io.swagger.annotations.Api
;
...
...
@@ -45,6 +46,8 @@ public class ScoreRuleController {
private
WarehouseService
warehouseService
;
@Resource
private
ApplicationContext
applicationContext
;
@Resource
private
ScoreProducerApi
scoreProducerApi
;
@PostMapping
(
"/create"
)
@ApiOperation
(
"创建积分规则"
)
...
...
@@ -93,6 +96,7 @@ public class ScoreRuleController {
PageResult
<
ScoreRuleBackVO
>
pageResult
=
scoreRuleService
.
getScoreRulePage
(
query
,
page
);
return
success
(
pageResult
);
}
@PostMapping
(
"/status"
)
@ApiOperation
(
"启用关闭"
)
@PreAuthorize
(
"@ss.hasPermission('member:score-rule:update')"
)
...
...
@@ -100,12 +104,14 @@ public class ScoreRuleController {
scoreRuleService
.
updateStatus
(
scoreRuleStatusReqVO
);
return
success
(
true
);
}
@PostMapping
(
"/copy"
)
@ApiOperation
(
"复制规则"
)
@PreAuthorize
(
"@ss.hasPermission('member:score-rule:create')"
)
public
CommonResult
<
Long
>
copyScoreRule
(
@Valid
@RequestBody
IdReqVo
idReqVo
)
{
return
success
(
scoreRuleService
.
copyScoreRule
(
idReqVo
.
getId
()));
}
@PostMapping
(
"/delay"
)
@ApiOperation
(
"延期规则"
)
@PreAuthorize
(
"@ss.hasPermission('member:score-rule:update')"
)
...
...
@@ -126,18 +132,18 @@ public class ScoreRuleController {
@GetMapping
(
"/test-score-rule"
)
@ApiOperation
(
"测试订单V值触发"
)
public
CommonResult
<
Void
>
testScoreRule
(
@RequestParam
Long
orderId
,
@RequestParam
String
orderNo
)
{
applicationContext
.
publishEvent
(
new
OrderInShippingEvent
(
orderId
,
orderNo
));
//applicationContext.publishEvent(new OrderInShippingEvent(orderId, orderNo));
scoreProducerApi
.
sendOderMessage
(
ScoreRuleTypeEnum
.
ORDER_V
,
orderId
);
return
success
(
null
);
}
@GetMapping
(
"/export-excel"
)
@ApiOperation
(
"导出积分规则Excel"
)
@PreAuthorize
(
"@ss.hasPermission('member:score-rule:export')"
)
@OperateLog
(
type
=
EXPORT
)
public
void
exportScoreRuleExcel
(
@Valid
ScoreRuleQueryVO
query
,
HttpServletResponse
response
)
throws
IOException
{
HttpServletResponse
response
)
throws
IOException
{
List
<
ScoreRuleDO
>
list
=
scoreRuleService
.
getScoreRuleList
(
query
);
// 导出 Excel
List
<
ScoreRuleBackVO
>
datas
=
ScoreRuleConvert
.
INSTANCE
.
convertList
(
list
);
...
...
yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/listener/OrderInShippingListener.java
View file @
fb550f73
package
cn
.
iocoder
.
yudao
.
module
.
member
.
listener
;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.collection.CollectionUtil
;
import
cn.hutool.core.util.ArrayUtil
;
import
cn.hutool.json.JSONUtil
;
import
cn.iocoder.boot.module.order.api.OrderApi
;
...
...
@@ -8,6 +9,8 @@ import cn.iocoder.boot.module.order.api.dto.OrderObjectiveApiDO;
import
cn.iocoder.boot.module.order.api.dto.OrderRespDTO
;
import
cn.iocoder.boot.module.order.enums.OrderStatusApiEnum
;
import
cn.iocoder.yudao.framework.apollo.core.event.OrderInShippingEvent
;
import
cn.iocoder.yudao.module.customer.dal.dataobject.customerContacts.CustomerContactsDO
;
import
cn.iocoder.yudao.module.customer.service.customerContacts.CustomerContactsService
;
import
cn.iocoder.yudao.module.member.api.score.MemberUserScoreApi
;
import
cn.iocoder.yudao.module.member.api.score.dto.MemberUserScoreOperateReqDTO
;
import
cn.iocoder.yudao.module.member.dal.dataobject.scoreLog.MemberUserScoreLogDO
;
...
...
@@ -23,6 +26,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import
lombok.AllArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.context.annotation.Lazy
;
import
org.springframework.context.event.EventListener
;
import
org.springframework.stereotype.Component
;
...
...
@@ -46,6 +50,8 @@ public class OrderInShippingListener {
private
MemberUserScoreApi
memberUserScoreApi
;
@Resource
private
MemberUserScoreLogService
memberUserScoreLogService
;
@Resource
private
CustomerContactsService
customerContactsService
;
@EventListener
(
OrderInShippingEvent
.
class
)
public
void
listen
(
OrderInShippingEvent
event
)
{
...
...
@@ -107,6 +113,9 @@ public class OrderInShippingListener {
}
if
(
scoreCount
>
scoreRuleDO
.
getGetScoreOnce
())
{
scoreCount
=
scoreRuleDO
.
getGetScoreOnce
();
}
else
if
(
scoreCount
<=
0
)
{
log
.
info
(
"Order in shipping listener: The score count is less than or equal to 0,orderId:{}"
,
orderId
);
return
;
}
// 会员id
...
...
@@ -118,14 +127,27 @@ public class OrderInShippingListener {
return
;
}
String
[]
orderEntry
=
orderEntryString
.
split
(
","
);
// TODO:后台下单会员获取待确认
if
(
userId
<=
0
)
{
// 后台下单
if
(!
ArrayUtil
.
contains
(
orderEntry
,
String
.
valueOf
(
PlatformTypeEnum
.
BACKEND
.
getValue
())))
{
log
.
info
(
"Order in shipping listener: The order is placed by the background, userId:{}"
,
userId
);
return
;
}
//userId = order.getCustomerId();
// 查询客户绑定会员
List
<
CustomerContactsDO
>
customerContacts
=
customerContactsService
.
getCustomerContactsListByCustomerId
(
order
.
getCustomerId
());
if
(
CollectionUtil
.
isEmpty
(
customerContacts
))
{
log
.
info
(
"Order in shipping listener: The customer is not bound to the member, customerId:{}"
,
order
.
getCustomerId
());
return
;
}
for
(
CustomerContactsDO
customerContact
:
customerContacts
)
{
if
(
customerContact
.
getIsDefault
()
==
1
&&
customerContact
.
getUserid
()
!=
null
)
{
userId
=
customerContact
.
getUserid
();
}
}
if
(
userId
<=
0
)
{
log
.
info
(
"Order in shipping listener: The customer is not have default userId, customerId:{}"
,
order
.
getCustomerId
());
return
;
}
}
else
if
(!
ArrayUtil
.
contains
(
orderEntry
,
String
.
valueOf
(
PlatformTypeEnum
.
APP
.
getValue
()))
&&
!
ArrayUtil
.
contains
(
orderEntry
,
String
.
valueOf
(
PlatformTypeEnum
.
WEB
.
getValue
())))
{
log
.
info
(
"Order in shipping listener: The order is placed by the app or web, userId:{}"
,
userId
);
return
;
...
...
@@ -183,13 +205,13 @@ public class OrderInShippingListener {
private
Integer
computeScoreCount
(
BigDecimal
weightOrVolume
,
List
<
ScoreRuleOrderVExtraVO
.
OrderVRule
>
orderVRules
)
{
Integer
scoreCount
=
0
;
int
w
=
weightOrVolume
.
setScale
(
0
,
RoundingMode
.
HALF_UP
).
intValue
();
ScoreRuleOrderVExtraVO
.
OrderVRule
lastRule
=
orderVRules
.
get
(
orderVRules
.
size
()
-
1
);
if
(
w
>=
lastRule
.
getHigh
())
{
scoreCount
=
lastRule
.
getScore
();
}
for
(
int
i
=
orderVRules
.
size
()
-
1
;
i
>=
0
;
i
--)
{
ScoreRuleOrderVExtraVO
.
OrderVRule
orderVRule
=
orderVRules
.
get
(
i
);
if
(
w
>
orderVRule
.
getHigh
())
{
scoreCount
=
orderVRule
.
getScore
();
break
;
}
if
(
orderVRule
.
getLow
()
<=
w
&&
orderVRule
.
getHigh
()
>
w
)
{
if
(
orderVRule
.
getLow
()
<=
w
&&
orderVRule
.
getHigh
()
>=
w
)
{
scoreCount
=
orderVRule
.
getScore
();
break
;
}
...
...
yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/mq/consumer/score/ScoreConsumer.java
0 → 100644
View file @
fb550f73
package
cn
.
iocoder
.
yudao
.
module
.
member
.
mq
.
consumer
.
score
;
import
cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessageListener
;
import
cn.iocoder.yudao.module.member.mq.consumer.score.core.ScoreRuleStrategy
;
import
cn.iocoder.yudao.module.member.mq.consumer.score.core.ScoreRuleStrategyFactory
;
import
cn.iocoder.yudao.module.member.mq.message.ScoreMessage
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
/**
* @author zhangfeng
*/
@Component
@Slf4j
public
class
ScoreConsumer
extends
AbstractStreamMessageListener
<
ScoreMessage
>
{
@Resource
private
ScoreRuleStrategyFactory
strategyFactory
;
@Override
public
void
onMessage
(
ScoreMessage
message
)
{
ScoreRuleStrategy
strategy
=
strategyFactory
.
getStrategy
(
message
.
getScoreRuleType
());
if
(
strategy
!=
null
)
{
strategy
.
addScore
(
message
);
}
}
}
yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/mq/consumer/score/core/OderVStrategy.java
0 → 100644
View file @
fb550f73
package
cn
.
iocoder
.
yudao
.
module
.
member
.
mq
.
consumer
.
score
.
core
;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.collection.CollectionUtil
;
import
cn.hutool.core.util.ArrayUtil
;
import
cn.hutool.json.JSONUtil
;
import
cn.iocoder.boot.module.order.api.OrderApi
;
import
cn.iocoder.boot.module.order.api.dto.OrderObjectiveApiDO
;
import
cn.iocoder.boot.module.order.api.dto.OrderRespDTO
;
import
cn.iocoder.boot.module.order.enums.OrderStatusApiEnum
;
import
cn.iocoder.yudao.module.customer.dal.dataobject.customerContacts.CustomerContactsDO
;
import
cn.iocoder.yudao.module.customer.service.customerContacts.CustomerContactsService
;
import
cn.iocoder.yudao.module.member.api.score.MemberUserScoreApi
;
import
cn.iocoder.yudao.module.member.api.score.dto.MemberUserScoreOperateReqDTO
;
import
cn.iocoder.yudao.module.member.dal.dataobject.scoreLog.MemberUserScoreLogDO
;
import
cn.iocoder.yudao.module.member.dal.dataobject.scoreRule.ScoreRuleDO
;
import
cn.iocoder.yudao.module.member.enums.*
;
import
cn.iocoder.yudao.module.member.mq.message.ScoreMessage
;
import
cn.iocoder.yudao.module.member.service.scoreLog.MemberUserScoreLogService
;
import
cn.iocoder.yudao.module.member.service.scoreRule.ScoreRuleService
;
import
cn.iocoder.yudao.module.member.vo.scoreRule.extra.ScoreRuleOrderVExtraVO
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.stereotype.Service
;
import
javax.annotation.Resource
;
import
java.math.BigDecimal
;
import
java.math.RoundingMode
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Objects
;
/**
* @author zhangfeng
*/
@Service
@Slf4j
public
class
OderVStrategy
implements
ScoreRuleStrategy
{
@Resource
private
OrderApi
orderApi
;
@Resource
private
ScoreRuleService
scoreRuleService
;
@Resource
private
MemberUserScoreApi
memberUserScoreApi
;
@Resource
private
MemberUserScoreLogService
memberUserScoreLogService
;
@Resource
private
CustomerContactsService
customerContactsService
;
@Override
public
void
addScore
(
ScoreMessage
message
)
{
log
.
info
(
"订单V值增加积分"
);
Long
orderId
=
message
.
getOrderId
();
OrderRespDTO
order
;
try
{
order
=
orderApi
.
getOrder
(
orderId
,
""
);
}
catch
(
Exception
e
)
{
log
.
error
(
"Order in shipping listener: Get order error,orderId:{},orderNo:{}"
,
orderId
,
""
);
return
;
}
if
(
Objects
.
isNull
(
order
))
{
log
.
error
(
"Order in shipping listener: The order does not exist,orderId:{}"
,
orderId
);
return
;
}
// 订单状态应为起运
if
(!
Objects
.
equals
(
order
.
getStatus
(),
OrderStatusApiEnum
.
IN_SHIPPING
.
getValue
()))
{
return
;
}
// 判断海运空运
Integer
transportId
=
order
.
getTransportId
();
ScoreRuleDO
scoreRuleDO
=
scoreRuleService
.
getEnabledOrderVScoreRuleByTransportType
(
transportId
);
if
(
Objects
.
isNull
(
scoreRuleDO
))
{
log
.
info
(
"Order in shipping listener: No score rule match"
);
return
;
}
// 是否过期,或者活动还没开始
if
(!
scoreRuleDO
.
getEndTime
().
after
(
new
Date
())
||
!
scoreRuleDO
.
getStartTime
().
before
(
new
Date
()))
{
log
.
info
(
"Order in shipping listener: The score rule has expired"
);
return
;
}
// 目的地信息
OrderObjectiveApiDO
orderObjectiveDO
=
order
.
getOrderObjectiveDO
();
ScoreRuleOrderVExtraVO
extraInfo
=
JSONUtil
.
toBean
(
scoreRuleDO
.
getExtra
(),
ScoreRuleOrderVExtraVO
.
class
);
// 提货点是否包含
String
[]
warehouseIds
=
extraInfo
.
getReceiveAddr
().
split
(
","
);
if
(!
ArrayUtil
.
contains
(
warehouseIds
,
orderObjectiveDO
.
getObjectiveWarehouseId
().
toString
()))
{
return
;
}
// 计算积分
List
<
ScoreRuleOrderVExtraVO
.
OrderVRule
>
orderVRules
=
extraInfo
.
getOrderVRule
();
Integer
scoreCount
=
0
;
if
(
transportId
==
TransportTypeEnum
.
OCEAN_LCL
.
getValue
())
{
// 海运算重量
BigDecimal
orgVWeight
=
order
.
getOrgVWeight
();
scoreCount
=
computeScoreCount
(
orgVWeight
,
orderVRules
);
}
else
if
(
transportId
==
TransportTypeEnum
.
SPECIAL_LINE_AIR_FREIGHT
.
getValue
())
{
// 空运校验渠道
// 渠道id
Long
channelId
=
order
.
getChannelId
();
String
[]
channels
=
extraInfo
.
getChannel
().
split
(
","
);
if
(!
ArrayUtil
.
contains
(
channels
,
channelId
.
toString
()))
{
return
;
}
// 空运算体积
BigDecimal
orgWVolume
=
order
.
getOrgWVolume
();
scoreCount
=
computeScoreCount
(
orgWVolume
,
orderVRules
);
}
if
(
scoreCount
<=
0
)
{
log
.
info
(
"Order in shipping listener: The score count is less than or equal to 0,orderId:{}"
,
orderId
);
return
;
}
// 会员id
Long
userId
=
order
.
getUserId
();
// 订单入口
String
orderEntryString
=
extraInfo
.
getOrderEntry
();
if
(
StringUtils
.
isBlank
(
orderEntryString
))
{
log
.
info
(
"Order in shipping listener: orderEntry is null"
);
return
;
}
String
[]
orderEntry
=
orderEntryString
.
split
(
","
);
if
(
userId
<=
0
)
{
// 后台下单
if
(!
ArrayUtil
.
contains
(
orderEntry
,
String
.
valueOf
(
PlatformTypeEnum
.
BACKEND
.
getValue
())))
{
log
.
info
(
"Order in shipping listener: The order is placed by the background, userId:{}"
,
userId
);
return
;
}
// 查询客户绑定会员
List
<
CustomerContactsDO
>
customerContacts
=
customerContactsService
.
getCustomerContactsListByCustomerId
(
order
.
getCustomerId
());
if
(
CollectionUtil
.
isEmpty
(
customerContacts
))
{
log
.
info
(
"Order in shipping listener: The customer is not bound to the member, customerId:{}"
,
order
.
getCustomerId
());
return
;
}
for
(
CustomerContactsDO
customerContact
:
customerContacts
)
{
if
(
customerContact
.
getIsDefault
()
==
1
&&
customerContact
.
getUserid
()
!=
null
)
{
userId
=
customerContact
.
getUserid
();
}
}
if
(
userId
<=
0
)
{
log
.
info
(
"Order in shipping listener: The customer is not have default userId, customerId:{}"
,
order
.
getCustomerId
());
return
;
}
}
else
if
(!
ArrayUtil
.
contains
(
orderEntry
,
String
.
valueOf
(
PlatformTypeEnum
.
APP
.
getValue
()))
&&
!
ArrayUtil
.
contains
(
orderEntry
,
String
.
valueOf
(
PlatformTypeEnum
.
WEB
.
getValue
())))
{
log
.
info
(
"Order in shipping listener: The order is placed by the app or web, userId:{}"
,
userId
);
return
;
}
// 是否首单,首单只加一次
if
(
extraInfo
.
getFirstOrder
()
==
YesOrNoTypeEnum
.
YES
.
ordinal
())
{
if
(!
orderApi
.
isFirstOrder
(
userId
))
{
log
.
info
(
"Order in shipping listener: Not first order"
);
return
;
}
}
// 校验累计最高分
Integer
userScoreTotalCount
=
0
;
LambdaQueryWrapper
<
MemberUserScoreLogDO
>
scoreLogQueryWrapper
=
new
LambdaQueryWrapper
<>();
scoreLogQueryWrapper
.
eq
(
MemberUserScoreLogDO:
:
getMemberId
,
userId
)
.
eq
(
MemberUserScoreLogDO:
:
getRuleId
,
scoreRuleDO
.
getId
());
List
<
MemberUserScoreLogDO
>
memberUserScoreLogs
=
memberUserScoreLogService
.
selectList
(
scoreLogQueryWrapper
);
if
(
CollUtil
.
isNotEmpty
(
memberUserScoreLogs
))
{
for
(
MemberUserScoreLogDO
memberUserScoreLog
:
memberUserScoreLogs
)
{
userScoreTotalCount
+=
memberUserScoreLog
.
getScoreCount
();
}
}
if
(
userScoreTotalCount
>=
scoreRuleDO
.
getMaxScoreTotal
())
{
log
.
info
(
"Order in shipping listener: The user has reached the maximum score,userId:{},scoreRuleId:{}"
,
userId
,
scoreRuleDO
.
getId
());
return
;
}
//if (userScoreTotalCount + scoreCount > scoreRuleDO.getMaxScoreTotal()) {
// scoreCount = scoreRuleDO.getMaxScoreTotal() - userScoreTotalCount;
//}
// 增加积分
try
{
HashMap
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"orderId"
,
orderId
);
// TODO:增加订单号和唯一键
memberUserScoreApi
.
operateScore
(
MemberUserScoreOperateReqDTO
.
builder
()
.
memberId
(
userId
)
.
scoreCount
(
scoreCount
)
.
sourceType
(
ScoreSourceTypeEnum
.
ORDER_V
)
.
ruleId
(
scoreRuleDO
.
getId
())
.
expireDays
(
scoreRuleDO
.
getScorePeriod
())
.
extParam
(
map
)
.
build
()
);
}
catch
(
Exception
e
)
{
log
.
error
(
"Order in shipping listener: operateScore error"
,
e
);
}
}
@Override
public
ScoreRuleTypeEnum
getScoreRuleType
()
{
return
ScoreRuleTypeEnum
.
ORDER_V
;
}
/**
* 根据规则计算获取积分
*
* @param weightOrVolume 重量或体积
* @param orderVRules 规则
* @return
*/
private
Integer
computeScoreCount
(
BigDecimal
weightOrVolume
,
List
<
ScoreRuleOrderVExtraVO
.
OrderVRule
>
orderVRules
)
{
Integer
scoreCount
=
0
;
int
w
=
weightOrVolume
.
setScale
(
0
,
RoundingMode
.
HALF_UP
).
intValue
();
ScoreRuleOrderVExtraVO
.
OrderVRule
lastRule
=
orderVRules
.
get
(
orderVRules
.
size
()
-
1
);
if
(
w
>=
lastRule
.
getHigh
())
{
scoreCount
=
lastRule
.
getScore
();
}
for
(
int
i
=
orderVRules
.
size
()
-
1
;
i
>=
0
;
i
--)
{
ScoreRuleOrderVExtraVO
.
OrderVRule
orderVRule
=
orderVRules
.
get
(
i
);
if
(
orderVRule
.
getLow
()
<=
w
&&
orderVRule
.
getHigh
()
>=
w
)
{
scoreCount
=
orderVRule
.
getScore
();
break
;
}
}
return
scoreCount
;
}
}
yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/mq/consumer/score/core/RecommendStrategy.java
0 → 100644
View file @
fb550f73
package
cn
.
iocoder
.
yudao
.
module
.
member
.
mq
.
consumer
.
score
.
core
;
import
cn.iocoder.yudao.module.member.enums.ScoreRuleTypeEnum
;
import
cn.iocoder.yudao.module.member.mq.message.ScoreMessage
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Service
;
/**
* @author zhangfeng
*/
@Service
@Slf4j
public
class
RecommendStrategy
implements
ScoreRuleStrategy
{
@Override
public
void
addScore
(
ScoreMessage
message
)
{
log
.
info
(
"推荐增加积分"
);
}
@Override
public
ScoreRuleTypeEnum
getScoreRuleType
()
{
return
ScoreRuleTypeEnum
.
RECOMMEND
;
}
}
yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/mq/consumer/score/core/RegisterStrategy.java
0 → 100644
View file @
fb550f73
package
cn
.
iocoder
.
yudao
.
module
.
member
.
mq
.
consumer
.
score
.
core
;
import
cn.iocoder.yudao.module.member.enums.ScoreRuleTypeEnum
;
import
cn.iocoder.yudao.module.member.mq.message.ScoreMessage
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Service
;
/**
* @author zhangfeng
*/
@Service
@Slf4j
public
class
RegisterStrategy
implements
ScoreRuleStrategy
{
@Override
public
void
addScore
(
ScoreMessage
message
)
{
log
.
info
(
"注册增加积分"
);
}
@Override
public
ScoreRuleTypeEnum
getScoreRuleType
()
{
return
ScoreRuleTypeEnum
.
REGISTER
;
}
}
yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/mq/consumer/score/core/ScoreRuleStrategy.java
0 → 100644
View file @
fb550f73
package
cn
.
iocoder
.
yudao
.
module
.
member
.
mq
.
consumer
.
score
.
core
;
import
cn.iocoder.yudao.module.member.enums.ScoreRuleTypeEnum
;
import
cn.iocoder.yudao.module.member.mq.message.ScoreMessage
;
/**
* @author zhangfeng
*/
public
interface
ScoreRuleStrategy
{
void
addScore
(
ScoreMessage
message
);
ScoreRuleTypeEnum
getScoreRuleType
();
}
yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/mq/consumer/score/core/ScoreRuleStrategyFactory.java
0 → 100644
View file @
fb550f73
package
cn
.
iocoder
.
yudao
.
module
.
member
.
mq
.
consumer
.
score
.
core
;
import
cn.iocoder.yudao.module.member.enums.ScoreRuleTypeEnum
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* @author zhangfeng
*/
@Component
public
class
ScoreRuleStrategyFactory
{
private
final
Map
<
ScoreRuleTypeEnum
,
ScoreRuleStrategy
>
strategies
=
new
HashMap
<>();
@Autowired
public
void
setStrategyFactory
(
List
<
ScoreRuleStrategy
>
strategyList
)
{
for
(
ScoreRuleStrategy
strategy
:
strategyList
)
{
strategies
.
put
(
strategy
.
getScoreRuleType
(),
strategy
);
}
}
public
ScoreRuleStrategy
getStrategy
(
ScoreRuleTypeEnum
scoreRuleType
)
{
return
strategies
.
get
(
scoreRuleType
);
}
}
yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/mq/message/ScoreMessage.java
0 → 100644
View file @
fb550f73
package
cn
.
iocoder
.
yudao
.
module
.
member
.
mq
.
message
;
import
cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessage
;
import
cn.iocoder.yudao.module.member.enums.ScoreRuleTypeEnum
;
import
lombok.*
;
/**
* @author zhangfeng
*/
@Data
@EqualsAndHashCode
(
callSuper
=
true
)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public
class
ScoreMessage
extends
AbstractStreamMessage
{
private
ScoreRuleTypeEnum
scoreRuleType
;
private
Long
orderId
;
@Override
public
String
getStreamKey
()
{
return
"member.score.add"
;
}
}
yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/mq/producer/score/ScoreProducer.java
0 → 100644
View file @
fb550f73
package
cn
.
iocoder
.
yudao
.
module
.
member
.
mq
.
producer
.
score
;
import
cn.iocoder.yudao.framework.mq.core.RedisMQTemplate
;
import
cn.iocoder.yudao.module.member.api.ScoreProducerApi
;
import
cn.iocoder.yudao.module.member.enums.ScoreRuleTypeEnum
;
import
cn.iocoder.yudao.module.member.mq.message.ScoreMessage
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
/**
* @author zhangfeng
*/
@Slf4j
@Component
public
class
ScoreProducer
implements
ScoreProducerApi
{
@Resource
private
RedisMQTemplate
redisMQTemplate
;
@Override
public
void
sendOderMessage
(
ScoreRuleTypeEnum
scoreRuleType
,
Long
orderId
)
{
ScoreMessage
message
=
ScoreMessage
.
builder
()
.
scoreRuleType
(
scoreRuleType
)
.
orderId
(
orderId
)
.
build
();
redisMQTemplate
.
send
(
message
);
}
@Override
public
void
sendRecommendMessage
(
ScoreRuleTypeEnum
scoreRuleType
,
Long
userId
)
{
}
@Override
public
void
sendRegisterMessage
(
ScoreRuleTypeEnum
scoreRuleType
,
Long
userId
)
{
}
}
yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/scoreRule/ScoreRuleServiceImpl.java
View file @
fb550f73
...
...
@@ -58,10 +58,10 @@ public class ScoreRuleServiceImpl extends AbstractService<ScoreRuleMapper, Score
private
void
verifyCommon
(
ScoreRuleBaseVO
scoreRuleIn
)
{
//校验公共入参
if
(
scoreRuleIn
.
getGetScoreOnce
()
<=
0
)
{
if
(
scoreRuleIn
.
get
Type
()
!=
ScoreRuleTypeEnum
.
ORDER_V
.
getValue
()
&&
scoreRuleIn
.
get
GetScoreOnce
()
<=
0
)
{
throw
exception
(
SCORE_RULE_FIELD_ERROR
);
}
if
(
scoreRuleIn
.
getMaxScoreTotal
()
<=
0
)
{
if
(
scoreRuleIn
.
get
Type
()
!=
ScoreRuleTypeEnum
.
RECOMMEND
.
getValue
()
&&
scoreRuleIn
.
get
MaxScoreTotal
()
<=
0
)
{
throw
exception
(
SCORE_RULE_FIELD_ERROR
);
}
if
(
scoreRuleIn
.
getStartTime
().
after
((
scoreRuleIn
.
getEndTime
()))
||
scoreRuleIn
.
getEndTime
().
before
(
Date
.
from
(
Instant
.
now
())))
{
...
...
yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/vo/scoreRule/ScoreRuleBaseVO.java
View file @
fb550f73
...
...
@@ -45,12 +45,11 @@ public class ScoreRuleBaseVO {
@ApiModelProperty
(
value
=
"封面图英文"
)
private
String
coverImageEn
;
@ApiModelProperty
(
value
=
"单次获取积分数,订单V值中代表单次最高获取积分数"
,
required
=
true
)
@NotNull
(
message
=
"单次获取积分数不能为空"
)
private
Integer
getScoreOnce
;
@ApiModelProperty
(
value
=
"单次获取积分数(订单V值不传)"
,
required
=
true
)
private
Integer
getScoreOnce
=
0
;
@ApiModelProperty
(
value
=
"累积最高积分(注册
直接传null
)"
,
required
=
true
)
private
Integer
maxScoreTotal
;
@ApiModelProperty
(
value
=
"累积最高积分(注册
不传
)"
,
required
=
true
)
private
Integer
maxScoreTotal
=
0
;
@ApiModelProperty
(
value
=
"活动开始时间"
,
required
=
true
)
@NotNull
(
message
=
"活动开始时间不能为空"
)
...
...
yudao-module-shipment/yudao-module-shipment-core/pom.xml
View file @
fb550f73
...
...
@@ -65,6 +65,10 @@
<artifactId>
yudao-module-sale-core
</artifactId>
<version>
${revision}
</version>
</dependency>
<dependency>
<groupId>
cn.iocoder.boot
</groupId>
<artifactId>
yudao-module-member-api
</artifactId>
<version>
${revision}
</version>
</dependency>
</dependencies>
</project>
yudao-module-shipment/yudao-module-shipment-core/src/main/java/cn/iocoder/yudao/module/shipment/service/box/BoxServiceImpl.java
View file @
fb550f73
...
...
@@ -4,11 +4,11 @@ import cn.hutool.core.collection.CollectionUtil;
import
cn.hutool.core.date.DateTime
;
import
cn.hutool.core.date.DateUtil
;
import
cn.hutool.core.util.StrUtil
;
import
cn.iocoder.yudao.framework.common.util.spring.enums.CommonStatusEnum
;
import
cn.iocoder.yudao.framework.common.exception.ServiceException
;
import
cn.iocoder.yudao.framework.common.pojo.PageResult
;
import
cn.iocoder.yudao.framework.common.util.code.CodeUtils
;
import
cn.iocoder.yudao.framework.common.util.date.DateUtils
;
import
cn.iocoder.yudao.framework.common.util.spring.enums.CommonStatusEnum
;
import
cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO
;
import
cn.iocoder.yudao.framework.dict.core.util.DictFrameworkUtils
;
import
cn.iocoder.yudao.framework.i18n.core.I18nMessage
;
...
...
@@ -44,8 +44,10 @@ import cn.iocoder.yudao.module.ecw.dal.mysql.ladingTemplate.LadingTemplateMapper
import
cn.iocoder.yudao.module.ecw.service.busiPwd.BusiPwdService
;
import
cn.iocoder.yudao.module.ecw.service.cabinet.CabinetService
;
import
cn.iocoder.yudao.module.ecw.service.region.RegionService
;
import
cn.iocoder.yudao.module.member.api.ScoreProducerApi
;
import
cn.iocoder.yudao.module.member.api.user.MemberUserApi
;
import
cn.iocoder.yudao.module.member.api.user.dto.UserRespDTO
;
import
cn.iocoder.yudao.module.member.enums.ScoreRuleTypeEnum
;
import
cn.iocoder.yudao.module.order.convert.orderLocation.OrderLocationConvert
;
import
cn.iocoder.yudao.module.order.dal.dataobject.approval.OrderApprovalDO
;
import
cn.iocoder.yudao.module.order.dal.dataobject.order.OrderDO
;
...
...
@@ -420,6 +422,9 @@ public class BoxServiceImpl extends AbstractService<BoxMapper, BoxDO> implements
@Lazy
private
BoxPkgOrderService
boxPkgOrderService
;
@Resource
private
ScoreProducerApi
scoreProducerApi
;
static
{
String
key
=
"130-4174-1"
;
minNumMap
.
put
(
key
,
3633
);
...
...
@@ -1868,6 +1873,11 @@ public class BoxServiceImpl extends AbstractService<BoxMapper, BoxDO> implements
//订单不存在
if
(
CollectionUtil
.
isEmpty
(
orderIdList
))
return
;
updateOrderStatusByOrderIdAndTransportType
(
orderIdList
,
orderStatus
,
inWarehouseState
,
shipmentState
,
auditType
,
auditResult
,
businessTime
,
estTime
,
transportType
);
if
(
Objects
.
equals
(
orderStatus
,
OrderStatusEnum
.
IN_SHIPPING
.
getValue
()))
{
for
(
Long
orderId
:
orderIdList
)
{
scoreProducerApi
.
sendOderMessage
(
ScoreRuleTypeEnum
.
ORDER_V
,
orderId
);
}
}
}
@Override
...
...
@@ -4959,7 +4969,7 @@ public class BoxServiceImpl extends AbstractService<BoxMapper, BoxDO> implements
BoxOrderMarkUpVO
boxOrderMarkUpVO
=
JSON
.
parseObject
(
details
,
BoxOrderMarkUpVO
.
class
);
zTest
z
=
new
zTest
();
zTest
z
=
new
zTest
();
z
.
setTestname
(
"开始调用 handleAirOrderBatchMarkup"
);
z
.
setCreatedate
(
new
Date
());
zTestMapper2
.
insert
(
z
);
...
...
@@ -4991,9 +5001,9 @@ public class BoxServiceImpl extends AbstractService<BoxMapper, BoxDO> implements
public
void
checkIsInClearance
(
Long
shipmentId
,
Long
orderId
)
{
BoxClearanceOrderDO
clearanceOrderDO
=
boxClearanceOrderService
.
getOne
(
new
LambdaQueryWrapper
<
BoxClearanceOrderDO
>()
.
eq
(
BoxClearanceOrderDO:
:
getShipmentId
,
shipmentId
)
.
eq
(
BoxClearanceOrderDO:
:
getOrderId
,
orderId
)
);
.
eq
(
BoxClearanceOrderDO:
:
getShipmentId
,
shipmentId
)
.
eq
(
BoxClearanceOrderDO:
:
getOrderId
,
orderId
)
);
if
(
clearanceOrderDO
==
null
)
{
throw
new
ServiceException
(
500
,
"订单不是已清关状态"
);
}
...
...
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