Pārlūkot izejas kodu

新增跑腿确认送达短信相关接口;

codingliang 2 gadi atpakaļ
vecāks
revīzija
cd95d2663c

+ 11 - 0
src/main/java/com/sqx/common/utils/Constant.java

@@ -27,6 +27,17 @@ public class Constant {
      *  升序
      */
     public static final String ASC = "asc";
+
+    /**
+     * yes
+     */
+    public static final String YES = "1";
+
+    /**
+     * no
+     */
+    public static final String NO = "0";
+
 	/**
 	 * 菜单类型
 	 */

+ 79 - 0
src/main/java/com/sqx/modules/errand/controller/TbIndentSmsController.java

@@ -0,0 +1,79 @@
+package com.sqx.modules.errand.controller;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.sqx.common.exception.SqxException;
+import com.sqx.common.utils.PageUtils;
+import com.sqx.common.utils.Result;
+import com.sqx.modules.errand.dto.SmsLogQueryDTO;
+import com.sqx.modules.errand.dto.SmsTemplateDTO;
+import com.sqx.modules.errand.dto.SmsTemplateQueryDTO;
+import com.sqx.modules.errand.service.TbIndentSmsSendLogService;
+import com.sqx.modules.errand.service.TbIndentSmsTemplateService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.Arrays;
+
+@RestController
+@RequestMapping("admin/tb-indent-sms")
+@Api(value = "管理端-跑腿确认送达短信", tags = {"管理端-跑腿确认送达短信"})
+@RequiredArgsConstructor
+public class TbIndentSmsController {
+
+    private final TbIndentSmsSendLogService smsSendLogService;
+    private final TbIndentSmsTemplateService smsTemplateService;
+
+    @ApiOperation("模板分页")
+    @GetMapping(value = "template")
+    public Result templatePage(SmsTemplateQueryDTO queryDTO) {
+        PageUtils pageUtils = smsTemplateService.templatePage(queryDTO);
+        return Result.success().put("data", pageUtils);
+    }
+
+    @ApiOperation("新增模板")
+    @PostMapping(value = "template")
+    public Result addTemplate(@Valid @RequestBody SmsTemplateDTO template) {
+        smsTemplateService.saveTemplate(template);
+        return Result.success();
+    }
+
+    @ApiOperation("修改模板")
+    @PutMapping(value = "template")
+    public Result updateTemplate(@Valid @RequestBody SmsTemplateDTO template) {
+        if (ObjectUtil.isNull(template.getId())) {
+            throw new SqxException("模板id不能为空");
+        }
+        smsTemplateService.updateTemplate(template);
+        return Result.success();
+    }
+
+    @ApiOperation("删除模板")
+    @DeleteMapping(value = "template")
+    public Result delTemplates(@RequestBody Long[] ids) {
+        smsTemplateService.removeByIds(Arrays.asList(ids));
+        return Result.success();
+    }
+
+    @ApiOperation("短信发送记录分页")
+    @GetMapping(value = "log")
+    public Result logPage(SmsLogQueryDTO queryDTO) {
+        PageUtils pageUtils = smsSendLogService.logPage(queryDTO);
+        return Result.success().put("data", pageUtils);
+    }
+
+    @ApiOperation("删除短信发送记录")
+    @DeleteMapping(value = "log")
+    public Result delLogs(@RequestBody Long[] ids) {
+        smsSendLogService.removeByIds(Arrays.asList(ids));
+        return Result.success();
+    }
+}

+ 34 - 0
src/main/java/com/sqx/modules/errand/controller/app/AppTbIndentSmsController.java

@@ -0,0 +1,34 @@
+package com.sqx.modules.errand.controller.app;
+
+import com.sqx.common.query.PageQuery;
+import com.sqx.common.utils.Constant;
+import com.sqx.common.utils.PageUtils;
+import com.sqx.common.utils.Result;
+import com.sqx.modules.errand.dto.SmsTemplateQueryDTO;
+import com.sqx.modules.errand.service.TbIndentSmsTemplateService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("app/tb-indent-sms")
+@Api(value = "订单-跑腿确认送达短信", tags = {"订单-跑腿确认送达短信"})
+@RequiredArgsConstructor
+public class AppTbIndentSmsController {
+
+    private final TbIndentSmsTemplateService smsTemplateService;
+
+    @ApiOperation("模板分页")
+    @GetMapping(value = "template")
+    public Result templatePage(PageQuery pageQuery) {
+        SmsTemplateQueryDTO queryDTO = new SmsTemplateQueryDTO();
+        BeanUtils.copyProperties(pageQuery, queryDTO);
+        queryDTO.setStatus(Constant.YES);
+        PageUtils pageUtils = smsTemplateService.templatePage(queryDTO);
+        return Result.success().put("data", pageUtils);
+    }
+}

+ 9 - 0
src/main/java/com/sqx/modules/errand/dao/TbIndentSmsSendLogDao.java

@@ -0,0 +1,9 @@
+package com.sqx.modules.errand.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sqx.modules.errand.entity.TbIndentSmsSendLog;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface TbIndentSmsSendLogDao extends BaseMapper<TbIndentSmsSendLog>  {
+}

+ 9 - 0
src/main/java/com/sqx/modules/errand/dao/TbIndentSmsTemplateDao.java

@@ -0,0 +1,9 @@
+package com.sqx.modules.errand.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sqx.modules.errand.entity.TbIndentSmsTemplate;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface TbIndentSmsTemplateDao extends BaseMapper<TbIndentSmsTemplate> {
+}

+ 34 - 0
src/main/java/com/sqx/modules/errand/dto/SmsLogQueryDTO.java

@@ -0,0 +1,34 @@
+package com.sqx.modules.errand.dto;
+
+import com.sqx.common.query.PageQuery;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 短信历史分页查询dto
+ */
+@Data
+@ApiModel("SmsLogQueryDTO")
+public class SmsLogQueryDTO extends PageQuery {
+
+    @ApiModelProperty("订单id")
+    private Long orderId;
+
+    @ApiModelProperty("是否发送成功")
+    private String successFlag;
+
+    @ApiModelProperty("接受人")
+    private String sendTo;
+
+    @ApiModelProperty("查询开始时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date startTime;
+
+    @ApiModelProperty("查询结束时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date endTime;
+}

+ 39 - 0
src/main/java/com/sqx/modules/errand/dto/SmsTemplateDTO.java

@@ -0,0 +1,39 @@
+package com.sqx.modules.errand.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Pattern;
+
+/**
+ * 短信模板
+ */
+@Data
+@ApiModel("SmsTemplateDTO")
+public class SmsTemplateDTO {
+    @ApiModelProperty("id,修改时不能为空")
+    private Long id;
+
+    @ApiModelProperty(value = "模板名称", required = true)
+    @NotBlank(message = "模板名称不能为空")
+    private String templateName;
+
+    @ApiModelProperty(value = "模板内容 支持自定义变量", required = true)
+    @NotBlank(message = "模板名称不能为空")
+    private String templateContent;
+
+    @ApiModelProperty(value = "第三方平台模板code")
+    private String platformCode;
+
+    @ApiModelProperty(value = "第三方平台类型 1腾讯", required = true)
+    @NotBlank(message = "第三方平台类型不能为空")
+    @Pattern(regexp = "(1)", message = "第三方平台类型目前只支持腾讯 1")
+    private String platformType;
+
+    @ApiModelProperty(value = "状态 1启用 0禁用", required = true)
+    @NotBlank(message = "状态不能为空")
+    @Pattern(regexp = "(1|0)", message = "状态只能为1或0")
+    private String status;
+}

+ 23 - 0
src/main/java/com/sqx/modules/errand/dto/SmsTemplateQueryDTO.java

@@ -0,0 +1,23 @@
+package com.sqx.modules.errand.dto;
+
+import com.sqx.common.query.PageQuery;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 短信模板分页查询dto
+ */
+@Data
+@ApiModel("SmsTemplateQueryDTO")
+public class SmsTemplateQueryDTO extends PageQuery {
+
+    @ApiModelProperty("模板名称")
+    private String templateName;
+
+    @ApiModelProperty("平台类型")
+    private String platformType;
+
+    @ApiModelProperty("状态")
+    private String status;
+}

+ 48 - 0
src/main/java/com/sqx/modules/errand/entity/TbIndentSmsSendLog.java

@@ -0,0 +1,48 @@
+package com.sqx.modules.errand.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 跑腿订单确认收货短信发送记录
+ */
+@Data
+@ApiModel("tb_indent_sms_send_log")
+public class TbIndentSmsSendLog {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty("id")
+    private Long id;
+
+    @ApiModelProperty("订单id")
+    private Long orderId;
+
+    @ApiModelProperty("短信模板id")
+    private String templateId;
+
+    @ApiModelProperty("发送内容")
+    private String sendContent;
+
+    @ApiModelProperty("是否发送成功 1发送成功 0发送失败")
+    private String successFlag;
+
+    @ApiModelProperty("短信发送结果")
+    private String sendResult;
+
+    @ApiModelProperty("发送人id")
+    private String sendFromId;
+
+    @ApiModelProperty("接收号码")
+    private String sendTo;
+
+    @ApiModelProperty("发送时间")
+    private Date sendTime;
+}

+ 41 - 0
src/main/java/com/sqx/modules/errand/entity/TbIndentSmsTemplate.java

@@ -0,0 +1,41 @@
+package com.sqx.modules.errand.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 跑腿订单确认收货短信模板
+ */
+@Data
+@ApiModel("tb_indent_sms_template")
+public class TbIndentSmsTemplate implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty("id")
+    private Long id;
+
+    @ApiModelProperty("模板名称")
+    private String templateName;
+
+    @ApiModelProperty("模板内容 支持自定义变量")
+    private String templateContent;
+
+    @ApiModelProperty("第三方平台模板code")
+    private String platformCode;
+
+    @ApiModelProperty("第三方平台类型 1腾讯")
+    private String platformType;
+
+    @ApiModelProperty("状态 1启用 0禁用")
+    private String status;
+
+    @TableLogic(value = "0", delval = "1")
+    @ApiModelProperty("是否删除 1是,0否")
+    private String delFlag;
+}

+ 11 - 0
src/main/java/com/sqx/modules/errand/service/TbIndentSmsSendLogService.java

@@ -0,0 +1,11 @@
+package com.sqx.modules.errand.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.sqx.common.utils.PageUtils;
+import com.sqx.modules.errand.dto.SmsLogQueryDTO;
+import com.sqx.modules.errand.entity.TbIndentSmsSendLog;
+
+public interface TbIndentSmsSendLogService extends IService<TbIndentSmsSendLog> {
+
+    PageUtils logPage(SmsLogQueryDTO queryDTO);
+}

+ 16 - 0
src/main/java/com/sqx/modules/errand/service/TbIndentSmsTemplateService.java

@@ -0,0 +1,16 @@
+package com.sqx.modules.errand.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.sqx.common.utils.PageUtils;
+import com.sqx.modules.errand.dto.SmsTemplateDTO;
+import com.sqx.modules.errand.dto.SmsTemplateQueryDTO;
+import com.sqx.modules.errand.entity.TbIndentSmsTemplate;
+
+public interface TbIndentSmsTemplateService extends IService<TbIndentSmsTemplate> {
+
+    void saveTemplate(SmsTemplateDTO template);
+
+    void updateTemplate(SmsTemplateDTO template);
+
+    PageUtils templatePage(SmsTemplateQueryDTO queryDTO);
+}

+ 30 - 0
src/main/java/com/sqx/modules/errand/service/impl/TbIndentSmsSendLogServiceImpl.java

@@ -0,0 +1,30 @@
+package com.sqx.modules.errand.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sqx.common.utils.PageUtils;
+import com.sqx.modules.errand.dao.TbIndentSmsSendLogDao;
+import com.sqx.modules.errand.dto.SmsLogQueryDTO;
+import com.sqx.modules.errand.entity.TbIndentSmsSendLog;
+import com.sqx.modules.errand.service.TbIndentSmsSendLogService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class TbIndentSmsSendLogServiceImpl extends ServiceImpl<TbIndentSmsSendLogDao, TbIndentSmsSendLog> implements TbIndentSmsSendLogService {
+
+    @Override
+    public PageUtils logPage(SmsLogQueryDTO queryDTO) {
+        Page<TbIndentSmsSendLog> pages = new Page<>(queryDTO.getPage(), queryDTO.getLimit());
+        LambdaQueryWrapper<TbIndentSmsSendLog> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ObjectUtil.isNotNull(queryDTO.getOrderId()), TbIndentSmsSendLog::getOrderId, queryDTO.getOrderId());
+        queryWrapper.eq(StrUtil.isNotBlank(queryDTO.getSuccessFlag()), TbIndentSmsSendLog::getSuccessFlag, queryDTO.getSuccessFlag());
+        queryWrapper.eq(StrUtil.isNotBlank(queryDTO.getSendTo()), TbIndentSmsSendLog::getSendTo, queryDTO.getSendTo());
+        queryWrapper.ge(ObjectUtil.isNotNull(queryDTO.getStartTime()), TbIndentSmsSendLog::getSendTime, queryDTO.getStartTime());
+        queryWrapper.le(ObjectUtil.isNotNull(queryDTO.getEndTime()), TbIndentSmsSendLog::getSendTime, queryDTO.getEndTime());
+
+        return new PageUtils(this.page(pages, queryWrapper));
+    }
+}

+ 86 - 0
src/main/java/com/sqx/modules/errand/service/impl/TbIndentSmsTemplateServiceImpl.java

@@ -0,0 +1,86 @@
+package com.sqx.modules.errand.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sqx.common.exception.SqxException;
+import com.sqx.common.utils.Constant;
+import com.sqx.common.utils.PageUtils;
+import com.sqx.modules.errand.dao.TbIndentSmsTemplateDao;
+import com.sqx.modules.errand.dto.SmsTemplateDTO;
+import com.sqx.modules.errand.dto.SmsTemplateQueryDTO;
+import com.sqx.modules.errand.entity.TbIndentSmsTemplate;
+import com.sqx.modules.errand.service.TbIndentSmsTemplateService;
+import com.sqx.modules.errand.util.SmsTemplateValUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+@Service
+public class TbIndentSmsTemplateServiceImpl extends ServiceImpl<TbIndentSmsTemplateDao, TbIndentSmsTemplate> implements TbIndentSmsTemplateService {
+
+    @Override
+    public void saveTemplate(SmsTemplateDTO template) {
+        // 校验模板名称是否唯一
+        checkTemplateUnique(template);
+
+        // 检验模板是否符合规范
+        checkTemplateContent(template);
+
+        // 转换成po
+        TbIndentSmsTemplate tbIndentSmsTemplate = new TbIndentSmsTemplate();
+        BeanUtils.copyProperties(template, tbIndentSmsTemplate);
+
+        // 填充默认属性
+        tbIndentSmsTemplate.setDelFlag(Constant.NO);
+
+        // 执行保存操作
+        save(tbIndentSmsTemplate);
+    }
+
+    @Override
+    public void updateTemplate(SmsTemplateDTO template) {
+        // 校验模板名称是否唯一
+        checkTemplateUnique(template);
+
+        // 检验模板是否符合规范
+        checkTemplateContent(template);
+
+        // 转换成po
+        TbIndentSmsTemplate tbIndentSmsTemplate = new TbIndentSmsTemplate();
+        BeanUtils.copyProperties(template, tbIndentSmsTemplate);
+
+        // 填充默认属性
+        tbIndentSmsTemplate.setDelFlag(Constant.NO);
+
+        // 执行保存操作
+        updateById(tbIndentSmsTemplate);
+    }
+
+    @Override
+    public PageUtils templatePage(SmsTemplateQueryDTO queryDTO) {
+        Page<TbIndentSmsTemplate> pages = new Page<>(queryDTO.getPage(), queryDTO.getLimit());
+        LambdaQueryWrapper<TbIndentSmsTemplate> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.like(StrUtil.isNotBlank(queryDTO.getTemplateName()), TbIndentSmsTemplate::getTemplateName, queryDTO.getTemplateName());
+        queryWrapper.eq(StrUtil.isNotBlank(queryDTO.getStatus()), TbIndentSmsTemplate::getStatus, queryDTO.getStatus());
+        queryWrapper.eq(StrUtil.isNotBlank(queryDTO.getPlatformType()), TbIndentSmsTemplate::getPlatformType, queryDTO.getPlatformType());
+
+        return new PageUtils(this.page(pages, queryWrapper));
+    }
+
+    private void checkTemplateUnique(SmsTemplateDTO template) {
+        LambdaQueryWrapper<TbIndentSmsTemplate> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(TbIndentSmsTemplate::getTemplateName, template.getTemplateName());
+        queryWrapper.ne(template.getId() != null, TbIndentSmsTemplate::getId, template.getId());
+
+        if (count(queryWrapper) > 0) {
+            throw new SqxException("当前模板名称已经存在");
+        }
+    }
+
+    private void checkTemplateContent(SmsTemplateDTO template) {
+        if (!SmsTemplateValUtil.checkText(template.getTemplateContent())) {
+            throw new SqxException("当前模板内容存在未定义变量");
+        }
+    }
+}

+ 63 - 0
src/main/java/com/sqx/modules/errand/util/SmsTemplateValUtil.java

@@ -0,0 +1,63 @@
+package com.sqx.modules.errand.util;
+
+import lombok.Getter;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 短信模板变量工具类
+ */
+@Getter
+public class SmsTemplateValUtil {
+
+    /**
+     * 模板占位符
+     */
+    private static final String TEMPLATE_HOLD = "${%s}";
+
+    /**
+     * 模板正则表达式
+     */
+    private static Pattern PATTERN = Pattern.compile("\\$\\{(.*?)\\}");
+
+    /**
+     * 当前支持的变量名称列表
+     */
+    private static List<String> SUPPORT_VAL_NAME_LIST = Arrays.asList("currentUserPhone", "currentUserName");
+
+    /**
+     * 获取text中的自定义变量名称
+     * @param text 例如:这是一条测试短信,验证码为 ${code}。 可以把code提取出来
+     * @return
+     */
+    public static List<String> getTemplateValName(String text) {
+        Matcher matcher = PATTERN.matcher(text);
+
+        List<String> valNames = new ArrayList<>();
+        while (matcher.find()) {
+            valNames.add(matcher.group(1));
+        }
+
+        return valNames;
+    }
+
+    /**
+     * 校验text中自定义变量名称
+     * @param text
+     * @return
+     */
+    public static boolean checkText(String text) {
+        List<String> templateValName = getTemplateValName(text);
+        for (String valName : templateValName) {
+            if (!SUPPORT_VAL_NAME_LIST.contains(valName)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+}