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
41caa58c
Commit
41caa58c
authored
Dec 12, 2024
by
honghy
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
短信节点添加目的仓
parent
de603ae7
Changes
21
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
315 additions
and
104 deletions
+315
-104
20241120hhy.sql
sql/v2.3/20241120hhy.sql
+1
-0
Constants.java
...oder/yudao/framework/apollo/core/constants/Constants.java
+10
-0
OrderCargoControlPickServiceImpl.java
...derCargoControlPick/OrderCargoControlPickServiceImpl.java
+2
-1
OrderWarehouseInServiceImpl.java
...service/orderWarehouseIn/OrderWarehouseInServiceImpl.java
+10
-4
ShipmentAirLoadExcelExportListener.java
...shipment/listener/ShipmentAirLoadExcelExportListener.java
+1
-1
ShipmentLoadExcelExportListener2.java
...e/shipment/listener/ShipmentLoadExcelExportListener2.java
+1
-1
BoxServiceImpl.java
...der/yudao/module/shipment/service/box/BoxServiceImpl.java
+11
-1
SmsSendApi.java
...va/cn/iocoder/yudao/module/system/api/sms/SmsSendApi.java
+1
-1
SmsSendApiImpl.java
...n/iocoder/yudao/module/system/api/sms/SmsSendApiImpl.java
+2
-2
SmsNodeController.java
...module/system/controller/admin/sms/SmsNodeController.java
+9
-1
SmsNodeBackVO.java
...system/controller/admin/sms/vo/smsNode/SmsNodeBackVO.java
+7
-0
SmsNodeBaseVO.java
...system/controller/admin/sms/vo/smsNode/SmsNodeBaseVO.java
+3
-0
SmsNodeCreateReqVO.java
...m/controller/admin/sms/vo/smsNode/SmsNodeCreateReqVO.java
+4
-4
SmsNodeExtraVO.java
...ystem/controller/admin/sms/vo/smsNode/SmsNodeExtraVO.java
+21
-0
SmsNodeTestVO.java
...system/controller/admin/sms/vo/smsNode/SmsNodeTestVO.java
+4
-0
SmsNodeDO.java
...der/yudao/module/system/dal/dataobject/sms/SmsNodeDO.java
+4
-1
SmsCodeServiceImpl.java
...r/yudao/module/system/service/sms/SmsCodeServiceImpl.java
+2
-1
SmsNodeService.java
...coder/yudao/module/system/service/sms/SmsNodeService.java
+2
-1
SmsNodeServiceImpl.java
...r/yudao/module/system/service/sms/SmsNodeServiceImpl.java
+158
-54
SmsSendService.java
...coder/yudao/module/system/service/sms/SmsSendService.java
+5
-3
SmsSendServiceImpl.java
...r/yudao/module/system/service/sms/SmsSendServiceImpl.java
+57
-28
No files found.
sql/v2.3/20241120hhy.sql
View file @
41caa58c
...
...
@@ -36,6 +36,7 @@ create table system_sms_node
template_id_two
bigint
comment
'模板2'
,
template_id_three
bigint
comment
'模板3'
,
template_id_four
bigint
comment
'模板4'
,
`extra`
json
NULL
COMMENT
'扩展字段'
,
`creator`
varchar
(
64
)
CHARACTER
SET
utf8mb4
COLLATE
utf8mb4_unicode_ci
NULL
DEFAULT
''
COMMENT
'创建者'
,
`create_time`
datetime
(
0
)
NOT
NULL
DEFAULT
CURRENT_TIMESTAMP
(
0
)
COMMENT
'创建时间'
,
`updater`
varchar
(
64
)
CHARACTER
SET
utf8mb4
COLLATE
utf8mb4_unicode_ci
NULL
DEFAULT
''
COMMENT
'更新者'
,
...
...
yudao-framework/yudao-spring-boot-starter-config/src/main/java/cn/iocoder/yudao/framework/apollo/core/constants/Constants.java
View file @
41caa58c
...
...
@@ -21,4 +21,14 @@ public class Constants {
* 不接收货物code编码常量配置
*/
public
static
final
String
NOT_ACCEPTED_PROD_CODE
=
"F"
;
/**
* 目的仓不选择key
*/
public
static
final
String
RECEIVE_ADDR_KEY
=
"1:1:1"
;
/**
* 目的仓全选key
*/
public
static
final
String
RECEIVE_ADDR_ALL_KEY
=
"0:0:0"
;
}
yudao-module-order/yudao-module-order-core/src/main/java/cn/iocoder/yudao/module/order/service/orderCargoControlPick/OrderCargoControlPickServiceImpl.java
View file @
41caa58c
...
...
@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.order.service.orderCargoControlPick;
import
cn.hutool.core.collection.CollectionUtil
;
import
cn.hutool.core.date.DateUtil
;
import
cn.hutool.core.util.StrUtil
;
import
cn.iocoder.yudao.framework.apollo.core.constants.Constants
;
import
cn.iocoder.yudao.framework.common.pojo.PageResult
;
import
cn.iocoder.yudao.framework.common.util.date.DateUtils
;
import
cn.iocoder.yudao.framework.common.util.spring.enums.UserTypeEnum
;
...
...
@@ -1297,7 +1298,7 @@ public class OrderCargoControlPickServiceImpl extends AbstractService<OrderCargo
reqDTO
.
setTemplateParams
(
templateParams
);
smsMap
.
put
(
consigneeCountryCode
+
consigneePhone
,
reqDTO
);
for
(
Map
.
Entry
<
String
,
SmsSendSingleToUserReqDTOV2
>
entry
:
smsMap
.
entrySet
())
{
smsSendApi
.
sendSingleSmsToAdminV2
(
entry
.
getValue
());
smsSendApi
.
sendSingleSmsToAdminV2
(
entry
.
getValue
()
,
Constants
.
RECEIVE_ADDR_KEY
);
}
}
...
...
yudao-module-order/yudao-module-order-core/src/main/java/cn/iocoder/yudao/module/order/service/orderWarehouseIn/OrderWarehouseInServiceImpl.java
View file @
41caa58c
...
...
@@ -119,6 +119,7 @@ import com.alibaba.fastjson.JSON;
import
com.alibaba.fastjson.JSONObject
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper
;
import
com.baomidou.mybatisplus.core.toolkit.Constants
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
import
org.jetbrains.annotations.NotNull
;
...
...
@@ -2367,8 +2368,10 @@ public class OrderWarehouseInServiceImpl extends AbstractService<OrderWarehouseI
reqDTO
.
setTransportId
(
orderDO
.
getTransportId
());
reqDTO
.
setIsOrders
(
SmsIsOrdersEnum
.
SMS_ORDERS_0
.
getValue
());
reqDTO
.
setMessageType
(
SmsMessageTypeEnum
.
SMS_MESSAGE_TYPE_1
.
getValue
());
// 发送追加通知短信
smsSendApi
.
sendSingleSmsToAdminV2
(
reqDTO
);
smsSendApi
.
sendSingleSmsToAdminV2
(
reqDTO
,
logisticsInfoDto
.
getDestCountryId
()+
Constants
.
COLON
+
logisticsInfoDto
.
getDestCityId
()+
Constants
.
COLON
+
logisticsInfoDto
.
getChannelId
());
}
else
{
// 入仓短信 发送给发货人与收货人
String
nodeValue
=
SmsNodeEnum
.
WAREHOUSE_IN
.
getNodeValue
();
...
...
@@ -2424,7 +2427,8 @@ public class OrderWarehouseInServiceImpl extends AbstractService<OrderWarehouseI
reqDTO
.
setTransportId
(
orderDO
.
getTransportId
());
reqDTO
.
setIsOrders
(
SmsIsOrdersEnum
.
SMS_ORDERS_0
.
getValue
());
reqDTO
.
setMessageType
(
SmsMessageTypeEnum
.
SMS_MESSAGE_TYPE_1
.
getValue
());
smsSendApi
.
sendSingleSmsToAdminV2
(
reqDTO
);
smsSendApi
.
sendSingleSmsToAdminV2
(
reqDTO
,
logisticsInfoDto
.
getDestCountryId
()+
Constants
.
COLON
+
logisticsInfoDto
.
getDestCityId
()+
Constants
.
COLON
+
logisticsInfoDto
.
getChannelId
());
}
}
else
{
Map
<
String
,
Object
>
consignorParamMap
=
new
HashMap
<>();
...
...
@@ -2471,7 +2475,8 @@ public class OrderWarehouseInServiceImpl extends AbstractService<OrderWarehouseI
reqDTO
.
setTransportId
(
orderDO
.
getTransportId
());
reqDTO
.
setIsOrders
(
SmsIsOrdersEnum
.
SMS_ORDERS_0
.
getValue
());
reqDTO
.
setMessageType
(
SmsMessageTypeEnum
.
SMS_MESSAGE_TYPE_1
.
getValue
());
smsSendApi
.
sendSingleSmsToAdminV2
(
reqDTO
);
smsSendApi
.
sendSingleSmsToAdminV2
(
reqDTO
,
logisticsInfoDto
.
getDestCountryId
()+
Constants
.
COLON
+
logisticsInfoDto
.
getDestCityId
()+
Constants
.
COLON
+
logisticsInfoDto
.
getChannelId
());
// 收货人 短信发送信息
OrderConsigneeDO
orderConsigneeDO
=
orderConsigneeService
.
getOne
(
new
LambdaQueryWrapper
<
OrderConsigneeDO
>().
eq
(
OrderConsigneeDO:
:
getOrderId
,
orderDO
.
getOrderId
())
...
...
@@ -2513,7 +2518,8 @@ public class OrderWarehouseInServiceImpl extends AbstractService<OrderWarehouseI
reqDTO2
.
setTransportId
(
orderDO
.
getTransportId
());
reqDTO2
.
setIsOrders
(
SmsIsOrdersEnum
.
SMS_ORDERS_0
.
getValue
());
reqDTO2
.
setMessageType
(
SmsMessageTypeEnum
.
SMS_MESSAGE_TYPE_1
.
getValue
());
smsSendApi
.
sendSingleSmsToAdminV2
(
reqDTO2
);
smsSendApi
.
sendSingleSmsToAdminV2
(
reqDTO2
,
logisticsInfoDto
.
getDestCountryId
()+
Constants
.
COLON
+
logisticsInfoDto
.
getDestCityId
()+
Constants
.
COLON
+
logisticsInfoDto
.
getChannelId
());
}
}
}
...
...
yudao-module-shipment/yudao-module-shipment-core/src/main/java/cn/iocoder/yudao/module/shipment/listener/ShipmentAirLoadExcelExportListener.java
View file @
41caa58c
...
...
@@ -289,7 +289,7 @@ public class ShipmentAirLoadExcelExportListener {
}
else
if
(
CustomsTypeEnum
.
CUSTOMS_TYPE_2
.
getValue
().
equals
(
orderInfo
.
getCustomsType
())){
Integer
color
=
Integer
.
valueOf
(
IndexedColors
.
ORANGE
.
index
);
if
(
prodAttrTag
){
color
=
Integer
.
valueOf
(
IndexedColors
.
GREEN
.
index
);
color
=
Integer
.
valueOf
(
IndexedColors
.
BRIGHT_
GREEN
.
index
);
}
int
andIncrement2
=
colorRowNum
.
get
();
colorMap2
.
put
(
String
.
valueOf
(
andIncrement2
),
Integer
.
valueOf
(
color
));
...
...
yudao-module-shipment/yudao-module-shipment-core/src/main/java/cn/iocoder/yudao/module/shipment/listener/ShipmentLoadExcelExportListener2.java
View file @
41caa58c
...
...
@@ -262,7 +262,7 @@ public class ShipmentLoadExcelExportListener2 {
}
else
if
(
CustomsTypeEnum
.
CUSTOMS_TYPE_2
.
getValue
().
equals
(
orderInfo
.
getCustomsType
())){
Integer
color
=
Integer
.
valueOf
(
IndexedColors
.
ORANGE
.
index
);
if
(
prodAttrTag
){
color
=
Integer
.
valueOf
(
IndexedColors
.
GREEN
.
index
);
color
=
Integer
.
valueOf
(
IndexedColors
.
BRIGHT_
GREEN
.
index
);
}
int
andIncrement2
=
colorRowNum
.
get
();
colorMap2
.
put
(
String
.
valueOf
(
andIncrement2
),
Integer
.
valueOf
(
color
));
...
...
yudao-module-shipment/yudao-module-shipment-core/src/main/java/cn/iocoder/yudao/module/shipment/service/box/BoxServiceImpl.java
View file @
41caa58c
...
...
@@ -26,6 +26,7 @@ import cn.iocoder.yudao.module.customer.service.customerContacts.CustomerContact
import
cn.iocoder.yudao.module.depository.convert.warehouse.WarehouseConvert
;
import
cn.iocoder.yudao.module.depository.dal.dataobject.warehouse.*
;
import
cn.iocoder.yudao.module.depository.dal.mysql.warehouse.WarehouseLineMapper
;
import
cn.iocoder.yudao.module.depository.dto.LogisticsInfoDto
;
import
cn.iocoder.yudao.module.depository.service.warehouse.WarehouseAreaPositionService
;
import
cn.iocoder.yudao.module.depository.service.warehouse.WarehouseAreaService
;
import
cn.iocoder.yudao.module.depository.service.warehouse.WarehouseService
;
...
...
@@ -206,6 +207,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.core.toolkit.Constants
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.google.common.base.Joiner
;
import
lombok.extern.slf4j.Slf4j
;
...
...
@@ -1622,10 +1624,13 @@ public class BoxServiceImpl extends AbstractService<BoxMapper, BoxDO> implements
@Override
public
void
sendSms
(
Long
shipmentId
,
Collection
<
Long
>
orderIdList
,
SmsNodeEnum
smsNodeEnum
)
{
// 对订单列表进行分组, 统计通知发送人的订单数量,当通知人的订单数量大于1,切换模板,合并订单号逗号连接发送一次
Map
<
String
,
List
<
Map
<
String
,
String
>>>
sendPhoneMap
=
new
HashMap
<>();
Map
<
String
,
Object
>
templateParams
=
new
HashMap
<>();
List
<
BoxOrderSmsLogDO
>
boxOrderSmsLogDOList
=
new
ArrayList
<>();
// 目的仓
LogisticsInfoDto
logisticsInfoDto
=
null
;
// 封装需要发送短信的手机号与订单信息
for
(
Long
orderId
:
orderIdList
)
{
// 判断当前货柜的当前订单是否发送过当前的场景短信
...
...
@@ -1639,6 +1644,9 @@ public class BoxServiceImpl extends AbstractService<BoxMapper, BoxDO> implements
continue
;
}
OrderBackVO
orderBackVO
=
orderQueryService
.
getOrder
(
orderId
);
if
(
logisticsInfoDto
==
null
)
{
logisticsInfoDto
=
warehouseLineMapper
.
getStartInfoAndDestInfoByLineId
(
orderBackVO
.
getLineId
());
}
String
orderNo
=
orderBackVO
.
getOrderNo
();
String
marks
=
orderBackVO
.
getMarks
();
// 封装货柜订单短信发送记录
...
...
@@ -1775,8 +1783,10 @@ public class BoxServiceImpl extends AbstractService<BoxMapper, BoxDO> implements
reqDTO
.
setTransportId
(
Integer
.
valueOf
(
boxDO
.
getTransportType
()));
reqDTO
.
setIsOrders
(
isOrders
);
reqDTO
.
setMessageType
(
SmsMessageTypeEnum
.
SMS_MESSAGE_TYPE_1
.
getValue
());
//给收发货人发送短信
smsSendApi
.
sendSingleSmsToAdminV2
(
reqDTO
);
smsSendApi
.
sendSingleSmsToAdminV2
(
reqDTO
,
logisticsInfoDto
.
getDestCountryId
()+
Constants
.
COLON
+
logisticsInfoDto
.
getDestCityId
()+
Constants
.
COLON
+
logisticsInfoDto
.
getChannelId
());
// 发送短信后初始化参数值
orders
=
null
;
marks
=
null
;
...
...
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsSendApi.java
View file @
41caa58c
...
...
@@ -30,7 +30,7 @@ public interface SmsSendApi {
* @param reqDTO 发送请求
* @return 发送日志编号
*/
Long
sendSingleSmsToAdminV2
(
@Valid
SmsSendSingleToUserReqDTOV2
reqDTO
);
Long
sendSingleSmsToAdminV2
(
@Valid
SmsSendSingleToUserReqDTOV2
reqDTO
,
String
receive
);
/**
* 发送单条短信给 Member 用户
...
...
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsSendApiImpl.java
View file @
41caa58c
...
...
@@ -27,10 +27,10 @@ public class SmsSendApiImpl implements SmsSendApi {
}
@Override
public
Long
sendSingleSmsToAdminV2
(
SmsSendSingleToUserReqDTOV2
reqDTO
)
{
public
Long
sendSingleSmsToAdminV2
(
SmsSendSingleToUserReqDTOV2
reqDTO
,
String
receive
)
{
return
smsSendService
.
sendSingleSmsToAdminV2
(
reqDTO
.
getMobile
(),
reqDTO
.
getUserId
(),
reqDTO
.
getNodeValue
(),
reqDTO
.
getAreaCode
(),
reqDTO
.
getIsOrders
(),
reqDTO
.
getIsTransport
(),
reqDTO
.
getTransportId
(),
reqDTO
.
getMessageType
(),
reqDTO
.
getTemplateParams
());
reqDTO
.
getTransportId
(),
reqDTO
.
getMessageType
(),
reqDTO
.
getTemplateParams
()
,
receive
);
}
@Override
...
...
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsNodeController.java
View file @
41caa58c
...
...
@@ -11,6 +11,8 @@ import cn.iocoder.yudao.module.system.convert.sms.SmsNodeConvert;
import
cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsNodeDO
;
import
cn.iocoder.yudao.module.system.service.sms.SmsNodeService
;
import
cn.iocoder.yudao.module.system.service.sms.SmsSendService
;
import
com.alibaba.fastjson.JSON
;
import
com.baomidou.mybatisplus.core.toolkit.Constants
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiImplicitParam
;
import
io.swagger.annotations.ApiOperation
;
...
...
@@ -86,6 +88,11 @@ public class SmsNodeController {
}
convert
.
setCountryIds
(
countryIdsInt
);
}
String
extra
=
convert
.
getExtra
();
if
(
extra
!=
null
)
{
SmsNodeExtraVO
smsNodeExtraVO
=
JSON
.
parseObject
(
extra
,
SmsNodeExtraVO
.
class
);
convert
.
setReceiveAddrList
(
smsNodeExtraVO
.
getReceiveAddrList
());
}
return
success
(
convert
);
}
...
...
@@ -121,9 +128,10 @@ public class SmsNodeController {
@PostMapping
(
"/test"
)
@ApiOperation
(
"测试短信节点"
)
public
CommonResult
<
Boolean
>
test
(
@Valid
@RequestBody
SmsNodeTestVO
smsNodeTestVO
)
{
List
<
Long
>
longs
=
smsNodeTestVO
.
getReceiveAddrList
().
get
(
0
);
smsSendService
.
sendSingleSmsV2
(
smsNodeTestVO
.
getMobile
(),
SecurityFrameworkUtils
.
getLoginUserId
(),
UserTypeEnum
.
ADMIN
.
getValue
(),
smsNodeTestVO
.
getNodeValue
(),
smsNodeTestVO
.
getCountryCode
(),
smsNodeTestVO
.
getIsOrders
(),
smsNodeTestVO
.
getIsTransport
(),
smsNodeTestVO
.
getTransportId
(),
smsNodeTestVO
.
getMessageType
(),
smsNodeTestVO
.
getTemplateParams
(),
null
,
smsNodeTestVO
.
getNodeTemplateSn
(),
null
);
smsNodeTestVO
.
getMessageType
(),
smsNodeTestVO
.
getTemplateParams
(),
null
,
smsNodeTestVO
.
getNodeTemplateSn
(),
null
,
longs
.
get
(
0
)
+
Constants
.
COLON
+
longs
.
get
(
1
)
+
Constants
.
COLON
+
longs
.
get
(
2
)
);
return
success
(
true
);
}
}
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/smsNode/SmsNodeBackVO.java
View file @
41caa58c
...
...
@@ -9,6 +9,7 @@ import lombok.Data;
import
org.springframework.format.annotation.DateTimeFormat
;
import
java.util.Date
;
import
java.util.List
;
import
static
cn
.
iocoder
.
yudao
.
framework
.
common
.
util
.
date
.
DateUtils
.
FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND
;
...
...
@@ -78,4 +79,10 @@ public class SmsNodeBackVO {
@ExcelProperty
(
"多订单"
)
@ApiModelProperty
(
value
=
"多订单"
,
required
=
true
)
private
Integer
isOrders
;
@ApiModelProperty
(
value
=
"扩展字段"
)
private
String
extra
;
@ApiModelProperty
(
value
=
"目的仓(国家,城市,仓库id)"
)
private
List
<
List
<
Long
>>
receiveAddrList
;
}
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/smsNode/SmsNodeBaseVO.java
View file @
41caa58c
...
...
@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
import
lombok.Data
;
import
javax.validation.constraints.NotNull
;
import
java.util.List
;
/**
* 短信节点 Base VO,提供给添加、修改、详细的子 VO 使用
...
...
@@ -51,4 +52,6 @@ public class SmsNodeBaseVO {
@ApiModelProperty
(
value
=
"多订单"
,
required
=
true
)
private
Integer
isOrders
;
@ApiModelProperty
(
value
=
"目的仓(国家,城市,仓库id)"
)
private
List
<
List
<
Long
>>
receiveAddrList
;
}
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/smsNode/SmsNodeCreateReqVO.java
View file @
41caa58c
package
cn
.
iocoder
.
yudao
.
module
.
system
.
controller
.
admin
.
sms
.
vo
.
smsNode
;
import
lombok.*
;
import
java.util.*
;
import
io.swagger.annotations.*
;
import
javax.validation.constraints.*
;
import
io.swagger.annotations.ApiModel
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
lombok.ToString
;
@Data
@ToString
(
callSuper
=
true
)
...
...
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/smsNode/SmsNodeExtraVO.java
0 → 100644
View file @
41caa58c
package
cn
.
iocoder
.
yudao
.
module
.
system
.
controller
.
admin
.
sms
.
vo
.
smsNode
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.util.List
;
/**
* 管理后台 - 短信节点 VO
*
* @author Jayden
* @date 2024/12/11
*/
@Data
@ApiModel
(
"管理后台 - 短信节点 VO"
)
public
class
SmsNodeExtraVO
{
@ApiModelProperty
(
value
=
"目的仓(国家,城市,仓库id)"
)
private
List
<
List
<
Long
>>
receiveAddrList
;
}
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/smsNode/SmsNodeTestVO.java
View file @
41caa58c
...
...
@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
import
lombok.Data
;
import
javax.validation.constraints.NotNull
;
import
java.util.List
;
import
java.util.Map
;
/**
...
...
@@ -50,6 +51,9 @@ public class SmsNodeTestVO {
@NotNull
(
message
=
"发送类型不能为空"
)
private
Integer
messageType
;
@ApiModelProperty
(
value
=
"目的仓(国家,城市,仓库id)"
)
private
List
<
List
<
Long
>>
receiveAddrList
;
@ApiModelProperty
(
value
=
"参数"
)
private
Map
<
String
,
Object
>
templateParams
;
}
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SmsNodeDO.java
View file @
41caa58c
...
...
@@ -74,5 +74,8 @@ public class SmsNodeDO extends BaseDO {
* 多订单(0:否,1:是)
*/
private
Integer
isOrders
;
/**
* 扩展字段
*/
private
String
extra
;
}
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImpl.java
View file @
41caa58c
package
cn
.
iocoder
.
yudao
.
module
.
system
.
service
.
sms
;
import
cn.hutool.core.map.MapUtil
;
import
cn.iocoder.yudao.framework.apollo.core.constants.Constants
;
import
cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil
;
import
cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeCheckReqDTO
;
import
cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO
;
...
...
@@ -41,7 +42,7 @@ public class SmsCodeServiceImpl implements SmsCodeService {
String
code
=
createSmsCode
(
reqDTO
.
getMobile
(),
reqDTO
.
getNodeValue
(),
reqDTO
.
getCreateIp
());
// 发送验证码
smsSendService
.
sendSingleSmsV2
(
reqDTO
.
getAreaCode
()
+
reqDTO
.
getMobile
(),
null
,
null
,
reqDTO
.
getNodeValue
(),
reqDTO
.
getAreaCode
(),
reqDTO
.
getIsOrders
(),
reqDTO
.
getIsTransport
(),
reqDTO
.
getTransportId
(),
reqDTO
.
getMessageType
(),
MapUtil
.
of
(
"code"
,
code
),
null
,
1
,
null
);
reqDTO
.
getTransportId
(),
reqDTO
.
getMessageType
(),
MapUtil
.
of
(
"code"
,
code
),
null
,
1
,
null
,
Constants
.
RECEIVE_ADDR_KEY
);
}
private
String
createSmsCode
(
String
mobile
,
String
nodeValue
,
String
ip
)
{
...
...
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsNodeService.java
View file @
41caa58c
...
...
@@ -78,9 +78,10 @@ public interface SmsNodeService extends IService<SmsNodeDO> {
* 这是为了确保每个配置项在缓存中都有一个唯一的标识
*
* @param smsNodeDO SmsNodeDO 对象
* @param receive 目的仓
* @return 缓存键
*/
String
buildCacheKey
(
SmsNodeDO
smsNodeDO
);
String
buildCacheKey
(
SmsNodeDO
smsNodeDO
,
String
receive
);
/**
* 短信重发定时任务
...
...
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsNodeServiceImpl.java
View file @
41caa58c
This diff is collapsed.
Click to expand it.
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendService.java
View file @
41caa58c
...
...
@@ -49,7 +49,7 @@ public interface SmsSendService {
Long
sendSingleSmsToAdminV2
(
@Mobile
@NotEmpty
(
message
=
"手机号不能为空"
)
String
mobile
,
Long
userId
,
@NotNull
(
message
=
"业务节点不能为空"
)
String
nodeValue
,
@NotNull
(
message
=
"国家区号不能为空"
)
String
areaCode
,
@NotNull
(
message
=
"是否多订单不能为空"
)
Integer
isOrders
,
@NotNull
(
message
=
"是否匹配运输方式不能为空"
)
Integer
isTransport
,
@NotNull
(
message
=
"运输方式不能空"
)
Integer
transportId
,
@NotNull
(
message
=
"发送类型不能为空"
)
Integer
messageType
,
Map
<
String
,
Object
>
templateParams
);
@NotNull
(
message
=
"运输方式不能空"
)
Integer
transportId
,
@NotNull
(
message
=
"发送类型不能为空"
)
Integer
messageType
,
Map
<
String
,
Object
>
templateParams
,
String
receive
);
/**
* 发送单条短信给用户 APP 的用户
...
...
@@ -82,7 +82,7 @@ public interface SmsSendService {
Long
sendSingleSmsToMemberV2
(
@Mobile
@NotEmpty
(
message
=
"手机号不能为空"
)
String
mobile
,
Long
userId
,
@NotNull
(
message
=
"业务节点不能为空"
)
String
nodeValue
,
@NotNull
(
message
=
"国家区号不能为空"
)
String
areaCode
,
@NotNull
(
message
=
"是否多订单不能为空"
)
Integer
isOrders
,
@NotNull
(
message
=
"是否匹配运输方式不能为空"
)
Integer
isTransport
,
@NotNull
(
message
=
"运输方式不能空"
)
Integer
transportId
,
@NotNull
(
message
=
"发送类型不能为空"
)
Integer
messageType
,
Map
<
String
,
Object
>
templateParams
);
@NotNull
(
message
=
"运输方式不能空"
)
Integer
transportId
,
@NotNull
(
message
=
"发送类型不能为空"
)
Integer
messageType
,
Map
<
String
,
Object
>
templateParams
,
String
receive
);
/**
* 发送单条短信给用户
...
...
@@ -115,10 +115,12 @@ public interface SmsSendService {
* @param smsLogId 重发短信时的原短信日志id
* @param nodeTemplateSn 模板序号
* @param smsNode 节点对象
* @param receive 目的仓
*/
Long
sendSingleSmsV2
(
@Mobile
@NotEmpty
(
message
=
"手机号不能为空"
)
String
mobile
,
Long
userId
,
Integer
userType
,
@NotNull
(
message
=
"业务节点不能为空"
)
String
nodeValue
,
@NotNull
(
message
=
"国家区号不能为空"
)
String
areaCode
,
@NotNull
(
message
=
"是否多订单不能为空"
)
Integer
isOrders
,
@NotNull
(
message
=
"是否匹配运输方式不能为空"
)
Integer
isTransport
,
@NotNull
(
message
=
"运输方式不能空"
)
Integer
transportId
,
@NotNull
(
message
=
"发送类型不能为空"
)
Integer
messageType
,
Map
<
String
,
Object
>
templateParams
,
Long
smsLogId
,
Integer
nodeTemplateSn
,
SmsNodeDO
smsNode
);
@NotNull
(
message
=
"运输方式不能空"
)
Integer
transportId
,
@NotNull
(
message
=
"发送类型不能为空"
)
Integer
messageType
,
Map
<
String
,
Object
>
templateParams
,
Long
smsLogId
,
Integer
nodeTemplateSn
,
SmsNodeDO
smsNode
,
@NotNull
(
message
=
"目的仓不能空"
)
String
receive
);
void
resendSingleSmsBySmsLogIds
(
Collection
<
Long
>
smsLogIds
);
...
...
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java
View file @
41caa58c
...
...
@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.service.sms;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.collection.CollectionUtil
;
import
cn.hutool.core.util.StrUtil
;
import
cn.iocoder.yudao.framework.apollo.core.constants.Constants
;
import
cn.iocoder.yudao.framework.common.util.json.core.KeyValue
;
import
cn.iocoder.yudao.framework.common.util.spring.enums.CommonStatusEnum
;
import
cn.iocoder.yudao.framework.common.util.spring.enums.UserTypeEnum
;
...
...
@@ -30,6 +31,7 @@ import cn.iocoder.yudao.module.system.mq.producer.sms.SmsProducer;
import
cn.iocoder.yudao.module.system.service.user.AdminUserService
;
import
com.alibaba.fastjson.JSON
;
import
com.google.common.annotations.VisibleForTesting
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.Assert
;
...
...
@@ -45,6 +47,7 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
*
* @author 捷道源码
*/
@Slf4j
@Service
public
class
SmsSendServiceImpl
implements
SmsSendService
{
...
...
@@ -92,7 +95,7 @@ public class SmsSendServiceImpl implements SmsSendService {
@Override
public
Long
sendSingleSmsToAdminV2
(
String
mobile
,
Long
userId
,
String
nodeValue
,
String
areaCode
,
Integer
isOrders
,
Integer
isTransport
,
Integer
transportId
,
Integer
messageType
,
Map
<
String
,
Object
>
templateParams
)
{
Integer
isOrders
,
Integer
isTransport
,
Integer
transportId
,
Integer
messageType
,
Map
<
String
,
Object
>
templateParams
,
String
receive
)
{
// 如果 mobile 为空,则加载用户编号对应的手机号
if
(
StrUtil
.
isEmpty
(
mobile
))
{
AdminUserDO
user
=
adminUserService
.
getUser
(
userId
);
...
...
@@ -102,7 +105,7 @@ public class SmsSendServiceImpl implements SmsSendService {
}
}
// 执行发送
return
this
.
sendSingleSmsV2
(
areaCode
+
mobile
,
userId
,
UserTypeEnum
.
ADMIN
.
getValue
(),
nodeValue
,
areaCode
,
isOrders
,
isTransport
,
transportId
,
messageType
,
templateParams
,
null
,
1
,
null
);
return
this
.
sendSingleSmsV2
(
areaCode
+
mobile
,
userId
,
UserTypeEnum
.
ADMIN
.
getValue
(),
nodeValue
,
areaCode
,
isOrders
,
isTransport
,
transportId
,
messageType
,
templateParams
,
null
,
1
,
null
,
receive
);
}
@Override
...
...
@@ -121,7 +124,7 @@ public class SmsSendServiceImpl implements SmsSendService {
@Override
public
Long
sendSingleSmsToMemberV2
(
String
mobile
,
Long
userId
,
String
nodeValue
,
String
areaCode
,
Integer
isOrders
,
Integer
isTransport
,
Integer
transportId
,
Integer
messageType
,
Map
<
String
,
Object
>
templateParams
)
{
Integer
isOrders
,
Integer
isTransport
,
Integer
transportId
,
Integer
messageType
,
Map
<
String
,
Object
>
templateParams
,
String
receive
)
{
// 如果 mobile 为空,则加载用户编号对应的手机号
if
(
StrUtil
.
isEmpty
(
mobile
))
{
UserRespDTO
user
=
memberUserApi
.
getUser
(
userId
);
...
...
@@ -131,7 +134,7 @@ public class SmsSendServiceImpl implements SmsSendService {
}
}
// 执行发送
return
this
.
sendSingleSmsV2
(
areaCode
+
mobile
,
userId
,
UserTypeEnum
.
MEMBER
.
getValue
(),
nodeValue
,
areaCode
,
isOrders
,
isTransport
,
transportId
,
messageType
,
templateParams
,
null
,
1
,
null
);
return
this
.
sendSingleSmsV2
(
areaCode
+
mobile
,
userId
,
UserTypeEnum
.
MEMBER
.
getValue
(),
nodeValue
,
areaCode
,
isOrders
,
isTransport
,
transportId
,
messageType
,
templateParams
,
null
,
1
,
null
,
receive
);
}
@Override
...
...
@@ -315,10 +318,11 @@ public class SmsSendServiceImpl implements SmsSendService {
* @param smsLogId 重发短信时的原短信日志id
* @param nodeTemplateSn 模板序号
* @param smsNode 节点对象
* @param receive 目的仓
*/
@Override
public
Long
sendSingleSmsV2
(
String
mobile
,
Long
userId
,
Integer
userType
,
String
nodeValue
,
String
areaCode
,
Integer
isOrders
,
Integer
isTransport
,
Integer
transportId
,
Integer
messageType
,
Map
<
String
,
Object
>
templateParams
,
Long
smsLogId
,
Integer
nodeTemplateSn
,
SmsNodeDO
smsNode
)
{
Integer
isOrders
,
Integer
isTransport
,
Integer
transportId
,
Integer
messageType
,
Map
<
String
,
Object
>
templateParams
,
Long
smsLogId
,
Integer
nodeTemplateSn
,
SmsNodeDO
smsNode
,
String
receive
)
{
//首次发送
if
(
smsNode
==
null
)
{
// 创建SmsNodeDO对象并设置相关属性
...
...
@@ -329,30 +333,12 @@ public class SmsSendServiceImpl implements SmsSendService {
.
setIsOrders
(
isOrders
)
.
setCountryCode
(
areaCode
)
.
setStatus
(
SystemStatusEnum
.
SYSTEM_STATUS_0
.
getValue
());
// 构建缓存键,用于查询短信节点缓存
String
cacheKey
=
smsNodeService
.
buildCacheKey
(
smsNodeDO
);
String
smsNodeCache
=
redisHelper
.
get
(
cacheKey
);
// 第一次找不到,则在全部国家里面找
if
(
smsNodeCache
==
null
)
{
smsNodeDO
.
setCountryCode
(
SmsCountryCodeEnum
.
SMS_COUNTRY_CODE_0
.
getValue
());
cacheKey
=
smsNodeService
.
buildCacheKey
(
smsNodeDO
);
smsNodeCache
=
redisHelper
.
get
(
cacheKey
);
// 第二次找不到,则在其他国家里面找
if
(
smsNodeCache
==
null
)
{
smsNodeDO
.
setCountryCode
(
SmsCountryCodeEnum
.
SMS_COUNTRY_CODE_1
.
getValue
());
cacheKey
=
smsNodeService
.
buildCacheKey
(
smsNodeDO
);
smsNodeCache
=
redisHelper
.
get
(
cacheKey
);
}
}
// 如果 still null, throw exception
if
(
smsNodeCache
==
null
)
{
throw
exception
(
SMS_SEND_TEMPLATE_NOT_EXISTS
);
// 尝试从缓存中获取短信节点信息
smsNode
=
getSmsNodeFromCache
(
smsNodeDO
,
receive
);
if
(
smsNode
==
null
)
{
throw
exception
(
SMS_NODE_NOT_EXISTS
);
}
// 解析缓存获取短信节点信息
smsNode
=
JSON
.
parseObject
(
smsNodeCache
,
SmsNodeDO
.
class
);
}
String
smsTemplateDO
=
null
;
...
...
@@ -371,7 +357,7 @@ public class SmsSendServiceImpl implements SmsSendService {
}
if
(
smsTemplateDO
==
null
)
{
// throw exception(SMS_SEND_TEMPLATE_NOT_EXISTS
);
log
.
error
(
SMS_SEND_TEMPLATE_NOT_EXISTS
.
getMsg
()
);
return
null
;
}
...
...
@@ -407,6 +393,49 @@ public class SmsSendServiceImpl implements SmsSendService {
return
sendLogId
;
}
/**
* 获取缓存节点
*/
private
SmsNodeDO
getSmsNodeFromCache
(
SmsNodeDO
smsNodeDO
,
String
receive
)
{
// 构建缓存键,用于查询短信节点缓存
String
cacheKey
=
smsNodeService
.
buildCacheKey
(
smsNodeDO
,
receive
);
String
smsNodeCache
=
redisHelper
.
get
(
cacheKey
);
// 第一次找不到,则在全部目的仓里面找
if
(
smsNodeCache
==
null
)
{
cacheKey
=
smsNodeService
.
buildCacheKey
(
smsNodeDO
,
Constants
.
RECEIVE_ADDR_ALL_KEY
);
smsNodeCache
=
redisHelper
.
get
(
cacheKey
);
}
// 第二次找不到,则在全部国家里面找
if
(
smsNodeCache
==
null
)
{
smsNodeDO
.
setCountryCode
(
SmsCountryCodeEnum
.
SMS_COUNTRY_CODE_0
.
getValue
());
cacheKey
=
smsNodeService
.
buildCacheKey
(
smsNodeDO
,
receive
);
smsNodeCache
=
redisHelper
.
get
(
cacheKey
);
}
// 第三次找不到,则在全部国家、全部目的仓里面找
if
(
smsNodeCache
==
null
)
{
cacheKey
=
smsNodeService
.
buildCacheKey
(
smsNodeDO
,
Constants
.
RECEIVE_ADDR_ALL_KEY
);
smsNodeCache
=
redisHelper
.
get
(
cacheKey
);
}
// 第四次找不到,则在其他国家里面找
if
(
smsNodeCache
==
null
)
{
smsNodeDO
.
setCountryCode
(
SmsCountryCodeEnum
.
SMS_COUNTRY_CODE_1
.
getValue
());
cacheKey
=
smsNodeService
.
buildCacheKey
(
smsNodeDO
,
receive
);
smsNodeCache
=
redisHelper
.
get
(
cacheKey
);
}
// 第五次次找不到,则在其他国家、全部目的仓里面找
if
(
smsNodeCache
==
null
)
{
cacheKey
=
smsNodeService
.
buildCacheKey
(
smsNodeDO
,
Constants
.
RECEIVE_ADDR_ALL_KEY
);
smsNodeCache
=
redisHelper
.
get
(
cacheKey
);
}
return
smsNodeCache
!=
null
?
JSON
.
parseObject
(
smsNodeCache
,
SmsNodeDO
.
class
)
:
null
;
}
/**
* 根据节点模板序号获取模板ID
*
...
...
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