Sfoglia il codice sorgente

feat:催款相关接口

zhangwei 3 anni fa
parent
commit
5c235b1600

+ 0 - 35
src/main/java/com/winhc/repal/controller/RepalBillController.java

@@ -70,39 +70,4 @@ public class RepalBillController {
     public BeanResponse<Boolean> updateRepalBill(@RequestBody UpdateRepalBillDTO dto) {
         return BeanResponse.success(CodeMsg.SUCCESS, repalBillService.updateRepalBill(dto));
     }
-
-    @ApiOperation("获取客户下的账款列表(应收or应付)")
-    @RequestMapping(value = "/page/cust", method = RequestMethod.GET)
-    public BeanResponse<VOPage<RepalBillPageVO>> getCustRepalBillPage(@RequestParam(value = "pageNum",defaultValue = "1")Integer pageNum,
-                                                                      @RequestParam(value = "pageSize",defaultValue = "10")Integer pageSize,
-                                                                      @RequestParam("custId")Long custId) {
-        return BeanResponse.success(CodeMsg.SUCCESS, repalBillService.getCustRepalBillPage(pageNum,pageSize,custId));
-    }
-
-
-
-
-
-
-
-//
-//    @ApiOperation("简易轮询账款")
-//    @RequestMapping(value = "/poll/{id}", method = RequestMethod.GET)
-//    public BeanResponse<AccountBillVO> pollAccountBillById(@PathVariable("id")Long id) {
-//        return BeanResponse.success(CodeMsg.SUCCESS, accountBillService.pollAccountBillById(new AccountBill().setId(id).setUserId(RequesterUtil.getCurrentUserId())));
-//    }
-//
-//    @ApiOperation("批量轮询")
-//    @RequestMapping(value = "/poll/batch", method = RequestMethod.POST)
-//    public BeanResponse<List<AccountBillVO>> pollBatchAccountBillByIds(@RequestBody BatchPollAccountBillDTO dto) {
-//        return BeanResponse.success(CodeMsg.SUCCESS, accountBillService.pollBatchAccountBillByIds(dto.setUserId(RequesterUtil.getCurrentUserId())));
-//    }
-//
-
-
-
-
-
-
-
 }

+ 26 - 6
src/main/java/com/winhc/repal/controller/RepalCustomerController.java

@@ -5,12 +5,9 @@ import com.winhc.common.enums.CodeMsg;
 import com.winhc.common.model.base.VOPage;
 import com.winhc.repal.common.BaseController;
 import com.winhc.repal.enums.Dict;
-import com.winhc.repal.model.dto.RepalCustomerDTO;
-import com.winhc.repal.model.dto.RepalCustomerQueryDTO;
-import com.winhc.repal.model.dto.RepalCustomerUpdateDTO;
-import com.winhc.repal.model.vo.RepalCustomerDetailVO;
-import com.winhc.repal.model.vo.RepalCustomerInfoVO;
-import com.winhc.repal.model.vo.RepalCustomerSimpleVO;
+import com.winhc.repal.model.dto.*;
+import com.winhc.repal.model.vo.*;
+import com.winhc.repal.service.RepalBillService;
 import com.winhc.repal.service.RepalCustomerService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -32,6 +29,9 @@ public class RepalCustomerController extends BaseController {
     @Autowired
     private RepalCustomerService repalCustomerService;
 
+    @Autowired
+    private RepalBillService repalBillService;
+
     @ApiOperation("客户/供应商下拉框")
     @GetMapping(value = "/list")
     public BeanResponse<List<RepalCustomerSimpleVO>> getCustList(@ApiParam("1客户 2供应商") @RequestParam("custType")Integer custType){
@@ -91,4 +91,24 @@ public class RepalCustomerController extends BaseController {
     public BeanResponse<Boolean> deleteCustomer(@PathVariable("custId")Long custId){
         return BeanResponse.success(CodeMsg.SUCCESS,repalCustomerService.deleteCustomer(custId,getUser()));
     }
+
+    @ApiOperation("获取客户下的账款列表(应收or应付)")
+    @RequestMapping(value = "/page/cust", method = RequestMethod.GET)
+    public BeanResponse<VOPage<RepalBillPageVO>> getCustRepalBillPage(@RequestParam(value = "pageNum",defaultValue = "1")Integer pageNum,
+                                                                      @RequestParam(value = "pageSize",defaultValue = "10")Integer pageSize,
+                                                                      @RequestParam("custId")Long custId) {
+        return BeanResponse.success(CodeMsg.SUCCESS, repalBillService.getCustRepalBillPage(pageNum,pageSize,custId));
+    }
+
+    @ApiOperation("查询客户联系人列表")
+    @GetMapping("/link")
+    public BeanResponse<List<RepalLinkVO>> queryLink(@RequestParam("custId")Long custId){
+        return BeanResponse.success(CodeMsg.SUCCESS,repalCustomerService.queryLink(custId));
+    }
+
+    @ApiOperation("添加(修改)联系人")
+    @PostMapping("/link")
+    public BeanResponse<RepalLinkVO> updateLink(@RequestBody RepalLinkUpdateDTO dto){
+        return BeanResponse.success(CodeMsg.SUCCESS,repalCustomerService.updateLink(dto));
+    }
 }

+ 26 - 0
src/main/java/com/winhc/repal/controller/RepalManageController.java

@@ -3,16 +3,22 @@ package com.winhc.repal.controller;
 import com.winhc.common.base.BeanResponse;
 import com.winhc.common.enums.CodeMsg;
 import com.winhc.common.model.base.VOPage;
+import com.winhc.repal.model.dto.DynamicContentDTO;
+import com.winhc.repal.model.dto.RepalSmsDTO;
 import com.winhc.repal.model.vo.RepalManageBillDetailVO;
 import com.winhc.repal.model.vo.RepalManageBillInfoVO;
 import com.winhc.repal.model.vo.RepalManageBillPageVO;
+import com.winhc.repal.model.vo.RepalSmsTemplateVO;
 import com.winhc.repal.service.RepalBillService;
+import com.winhc.repal.service.RepalDynamicService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * @author Aaron
  * @date 2022/5/6 11:16
@@ -25,6 +31,8 @@ import org.springframework.web.bind.annotation.*;
 public class RepalManageController {
     @Autowired
     private RepalBillService repalBillService;
+    @Autowired
+    private RepalDynamicService repalDynamicService;
 
     @ApiOperation("汇总")
     @GetMapping("/summary")
@@ -44,4 +52,22 @@ public class RepalManageController {
     public BeanResponse<RepalManageBillDetailVO> querManageBillDetail(@PathVariable("repalBillId")Long repalBillId){
         return BeanResponse.success(CodeMsg.SUCCESS,repalBillService.querManageBillDetail(repalBillId));
     }
+
+    @ApiOperation("添加催款动态")
+    @PostMapping
+    public BeanResponse<Boolean> addDynamic(@RequestBody DynamicContentDTO dto){
+        return BeanResponse.success(CodeMsg.SUCCESS,repalDynamicService.addDynamic(dto));
+    }
+
+    @ApiOperation("获取催款短信模板")
+    @GetMapping("/sms/template")
+    public BeanResponse<List<RepalSmsTemplateVO>> getSmsTemplate(@RequestParam("repalBillId")Long repalBillId){
+        return BeanResponse.success(CodeMsg.SUCCESS,repalDynamicService.getSmsTemplate(repalBillId));
+    }
+
+    @ApiOperation("短信催款")
+    @PostMapping("/urge/sms")
+    public BeanResponse<Boolean> urgeBySms(@RequestBody RepalSmsDTO dto){
+        return BeanResponse.success(CodeMsg.SUCCESS,repalDynamicService.urgeBySms(dto));
+    }
 }

+ 1 - 5
src/main/java/com/winhc/repal/enums/MsgNameEnum.java

@@ -10,15 +10,11 @@ public enum MsgNameEnum {
     /**
      * 模板名称
      */
-    逾期APP提醒(""),
     逾期短信提醒(""),
-    评级变动APP提醒(""),
     评级变动短信提醒(""),
-    财产线索APP提醒(""),
     财产线索短信提醒(""),
-    风险提醒APP提醒(""),
     风险提醒短信提醒(""),
-    评级无变动APP提醒("");
+    回款宝短信催款("");
     public String code;
 
     MsgNameEnum(String code) {

+ 23 - 0
src/main/java/com/winhc/repal/enums/RepalDynamicTypeEnum.java

@@ -0,0 +1,23 @@
+package com.winhc.repal.enums;
+
+/**
+ * @author Aaron
+ * @date 2022/5/7 16:45
+ * @description
+ */
+public enum RepalDynamicTypeEnum {
+    /**
+     * 存款动态类型枚举
+     */
+    短信(1),律师函(2),咨询(3),诉讼(4),其他(5);
+
+    private Integer code;
+
+    RepalDynamicTypeEnum(Integer code) {
+        this.code = code;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+}

+ 30 - 0
src/main/java/com/winhc/repal/enums/RepalMsgTemplateEnum.java

@@ -0,0 +1,30 @@
+package com.winhc.repal.enums;
+
+/**
+ * @author Aaron
+ * @date 2022/5/9 12:55
+ * @description
+ */
+public enum RepalMsgTemplateEnum {
+    /**
+     * 催款短信
+     */
+    短信模板一("尊敬的{},您好!您(贵司)与我司上海某某科技有限公司有一笔账款未处理 账款总金额:¥{};逾期金额:¥{};到期时间:{},{}。为避免产生不良影响,请您尽快结清款项,若逾期时间过长,我司将采取法律手段!",1);
+
+    private String content;
+
+    private Integer code;
+
+    RepalMsgTemplateEnum(String content, Integer code) {
+        this.content = content;
+        this.code = code;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+}

+ 19 - 0
src/main/java/com/winhc/repal/model/dto/DynamicContentDTO.java

@@ -0,0 +1,19 @@
+package com.winhc.repal.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Aaron
+ * @date 2022/5/7 16:32
+ * @description
+ */
+@Data
+@ApiModel("催款动态内容")
+public class DynamicContentDTO {
+    @ApiModelProperty(value = "账款id",required = true)
+    private Long repalBillId;
+    @ApiModelProperty(value = "动态内容",required = true)
+    private String dynamicDesc;
+}

+ 37 - 0
src/main/java/com/winhc/repal/model/dto/RepalLinkUpdateDTO.java

@@ -0,0 +1,37 @@
+package com.winhc.repal.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * @description RepalLink DTO对象
+ * @author Generator
+ * @date 2022-04-08
+ */
+@Data
+@Accessors(chain = true)
+@ApiModel("回款宝客户联系人")
+public class RepalLinkUpdateDTO {
+    @ApiModelProperty(value = "修改的时候传")
+    private Long id;
+
+    @ApiModelProperty(value = "客户id",required = true)
+    private Long custId;
+
+    @ApiModelProperty(value = "联系人姓名")
+    private String name;
+
+    @ApiModelProperty(value = "联系人电话")
+    private String mobileNo;
+
+    @ApiModelProperty(value = "联系人邮箱")
+    private String email;
+
+    @ApiModelProperty(value = "联系人微信")
+    private String wechat;
+
+
+
+}

+ 24 - 0
src/main/java/com/winhc/repal/model/dto/RepalSmsDTO.java

@@ -0,0 +1,24 @@
+package com.winhc.repal.model.dto;
+
+import com.winhc.repal.model.vo.RepalLinkVO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author Aaron
+ * @date 2022/5/9 13:24
+ * @description
+ */
+@Data
+@ApiModel("短信催款")
+public class RepalSmsDTO {
+    @ApiModelProperty(value = "账款编号",required = true)
+    private Long repalBillId;
+    @ApiModelProperty(value = "发送联系人列表",required = true)
+    private List<RepalLinkVO> links;
+    @ApiModelProperty(value = "发送短信编号",required = true)
+    private Integer smsCode;
+}

+ 3 - 0
src/main/java/com/winhc/repal/model/vo/RepalManageBillDetailVO.java

@@ -30,6 +30,9 @@ public class RepalManageBillDetailVO {
     @ApiModelProperty(value = "账本id")
     private Long repalBookId;
 
+    @ApiModelProperty(value = "客户id")
+    private Long custId;
+
     @ApiModelProperty(value = "客户name")
     private String customerName;
 

+ 20 - 0
src/main/java/com/winhc/repal/model/vo/RepalSmsTemplateVO.java

@@ -0,0 +1,20 @@
+package com.winhc.repal.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Aaron
+ * @date 2022/5/9 13:26
+ * @description
+ */
+@Data
+@ApiModel("短信催款模板")
+public class RepalSmsTemplateVO {
+    @ApiModelProperty("短信编号")
+    private Integer smsCode;
+
+    @ApiModelProperty("短信内容")
+    private String content;
+}

+ 16 - 3
src/main/java/com/winhc/repal/service/RepalCustomerService.java

@@ -4,12 +4,11 @@ import com.module.login.usersession.UserBean;
 import com.winhc.repal.entity.RepalCustomer;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.winhc.common.model.base.VOPage;
-import com.winhc.repal.model.dto.RepalCustomerDTO;
-import com.winhc.repal.model.dto.RepalCustomerQueryDTO;
-import com.winhc.repal.model.dto.RepalCustomerUpdateDTO;
+import com.winhc.repal.model.dto.*;
 import com.winhc.repal.model.vo.RepalCustomerDetailVO;
 import com.winhc.repal.model.vo.RepalCustomerInfoVO;
 import com.winhc.repal.model.vo.RepalCustomerSimpleVO;
+import com.winhc.repal.model.vo.RepalLinkVO;
 
 import java.util.List;
 
@@ -61,4 +60,18 @@ public interface RepalCustomerService extends IService<RepalCustomer> {
       * @return
       */
      Boolean deleteCustomer(Long custId, UserBean userBean);
+
+     /**
+      * 查询账款的
+      * @param custId
+      * @return
+      */
+     List<RepalLinkVO> queryLink(Long custId);
+
+     /**
+      * 添加或者修改联系人
+      * @param dto
+      * @return
+      */
+     RepalLinkVO updateLink(RepalLinkUpdateDTO dto);
 }

+ 23 - 0
src/main/java/com/winhc/repal/service/RepalDynamicService.java

@@ -2,6 +2,11 @@ package com.winhc.repal.service;
 
 import com.winhc.repal.entity.RepalDynamic;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.winhc.repal.model.dto.DynamicContentDTO;
+import com.winhc.repal.model.dto.RepalSmsDTO;
+import com.winhc.repal.model.vo.RepalSmsTemplateVO;
+
+import java.util.List;
 
 
 /**
@@ -10,5 +15,23 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * @date 2022-05-06
  */
 public interface RepalDynamicService extends IService<RepalDynamic> {
+    /**
+     * 添加催款动态
+     * @param dto
+     * @return
+     */
+    Boolean addDynamic(DynamicContentDTO dto);
+
+    /**
+     * 获取催款短信模板
+     * @return
+     */
+    List<RepalSmsTemplateVO> getSmsTemplate(Long repalBillId);
 
+    /**
+     * 发送催款短信
+     * @param dto
+     * @return
+     */
+    Boolean urgeBySms(RepalSmsDTO dto);
 }

+ 1 - 1
src/main/java/com/winhc/repal/service/impl/RepalBillServiceImpl.java

@@ -627,7 +627,7 @@ public class RepalBillServiceImpl extends ServiceImpl<RepalBillMapper, RepalBill
         RepalBill repalBill = this.getById(repalBillId);
         RepalManageBillDetailVO vo = new RepalManageBillDetailVO();
         BeanUtils.copyProperties(repalBill, vo);
-
+        vo.setCustId(Long.parseLong(repalBill.getCustomerId()));
         vo.setRepalBillId(repalBill.getId());
         RepalCustomer repalCustomer = repalCustomerService.getById(repalBill.getCustomerId());
         vo.setCompanyId(repalCustomer.getCompanyId());

+ 40 - 0
src/main/java/com/winhc/repal/service/impl/RepalCustomerServiceImpl.java

@@ -533,4 +533,44 @@ public class RepalCustomerServiceImpl extends ServiceImpl<RepalCustomerMapper, R
         repalBillOperLogService.save(repalBillOperLog);
         return Boolean.TRUE;
     }
+
+    @Override
+    public List<RepalLinkVO> queryLink(Long custId) {
+        List<RepalLink> repalLinks =  repalLinkService.list(Wrappers.lambdaQuery(RepalLink.class).eq(RepalLink::getCustId,custId).eq(RepalLink::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
+        List<RepalLinkVO> repalLinkVOs = new ArrayList<>();
+        if(CollUtil.isNotEmpty(repalLinks)){
+            for(RepalLink repalLink:repalLinks){
+                RepalLinkVO repalLinkVO = new RepalLinkVO();
+                repalLinkVOs.add(repalLinkVO);
+                BeanUtils.copyProperties(repalLink,repalLinkVO);
+            }
+        }
+        return repalLinkVOs;
+    }
+
+    @Override
+    public RepalLinkVO updateLink(RepalLinkUpdateDTO dto) {
+        RepalLinkVO result = new RepalLinkVO();
+        //如果是添加,检查是否满额
+        if(ObjectUtil.isNull(dto.getId())){
+            int count = repalLinkService.count(Wrappers.lambdaQuery(RepalLink.class).eq(RepalLink::getCustId,dto.getCustId()).eq(RepalLink::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
+            if(count > 4){
+                throw new CommonException(CodeMsg.FAILED,"负责人已满5人");
+            }
+            RepalLink repalLink = new RepalLink();
+            BeanUtils.copyProperties(dto,repalLink);
+            repalLinkService.save(repalLink);
+            BeanUtils.copyProperties(repalLink,result);
+        }else {
+            RepalLink repalLink = repalLinkService.getById(dto.getId());
+            if(ObjectUtil.isNull(repalLink)){
+                throw new CommonException(CodeMsg.FAILED,"负责人不存在");
+            }
+            repalLink.setName(dto.getName());
+            repalLink.setMobileNo(dto.getMobileNo());
+            repalLinkService.updateById(repalLink);
+            BeanUtils.copyProperties(repalLink,result);
+        }
+        return result;
+    }
 }

+ 109 - 0
src/main/java/com/winhc/repal/service/impl/RepalDynamicServiceImpl.java

@@ -1,11 +1,34 @@
 package com.winhc.repal.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.winhc.common.enums.CodeMsg;
+import com.winhc.common.exception.CommonException;
+import com.winhc.repal.entity.RepalBill;
 import com.winhc.repal.entity.RepalDynamic;
+import com.winhc.repal.enums.*;
+import com.winhc.repal.model.bo.UserContextBO;
+import com.winhc.repal.model.dto.DynamicContentDTO;
+import com.winhc.repal.model.dto.RepalSmsDTO;
+import com.winhc.repal.model.vo.RepalLinkVO;
+import com.winhc.repal.model.vo.RepalSmsTemplateVO;
 import com.winhc.repal.repository.RepalDynamicMapper;
+import com.winhc.repal.service.MessageNoticeService;
+import com.winhc.repal.service.RepalBillService;
 import com.winhc.repal.service.RepalDynamicService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.winhc.repal.service.RepalRolePermissionService;
+import com.winhc.repal.util.UserContextUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.text.DecimalFormat;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
 /**
  * @description RepalDynamic 接口实现类
  * @author Generator
@@ -13,5 +36,91 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class RepalDynamicServiceImpl extends ServiceImpl<RepalDynamicMapper, RepalDynamic> implements RepalDynamicService {
+    @Autowired
+    private RepalBillService repalBillService;
+
+    @Autowired
+    private RepalRolePermissionService repalRolePermissionService;
+
+    @Autowired
+    private MessageNoticeService messageNoticeService;
+
+    @Override
+    public Boolean addDynamic(DynamicContentDTO dto) {
+        UserContextBO userContextBO = UserContextUtil.getUser();
+        RepalDynamic dynamic = new RepalDynamic();
+        dynamic.setRepalBillId(dto.getRepalBillId());
+        dynamic.setDynamicDesc(dto.getDynamicDesc());
+        dynamic.setDynamicType(RepalDynamicTypeEnum.其他.getCode());
+        dynamic.setMemberId(userContextBO.getUserId());
+        save(dynamic);
+        return Boolean.TRUE;
+    }
+
+    @Override
+    public List<RepalSmsTemplateVO> getSmsTemplate(Long repalBillId) {
+        RepalBill repalBill = repalBillService.getById(repalBillId);
+        if(ObjectUtil.isNull(repalBill)){
+            throw new CommonException(CodeMsg.VALIDATE_PARAMETER,"账款不存在");
+        }
+        //目前只有一个,估计也只有一个
+        RepalSmsTemplateVO result = new RepalSmsTemplateVO();
+        DecimalFormat df = new DecimalFormat("#,###.00");
+        long dayBetween = Math.abs(LocalDate.now().toEpochDay() - repalBill.getEndDate().toEpochDay());
+        String overdueStr = RepalBillStatusEnum.PROGRESSING.getCode().equals(repalBill.getRepalBillStatus()) ? "还有"+dayBetween+"天即将逾期":"已逾期"+dayBetween+"天";
+        String content = StrUtil.format(RepalMsgTemplateEnum.短信模板一.getContent(),
+                repalBill.getCustomerName(),
+                df.format(repalBill.getTotalMoney()),
+                df.format(repalBill.getReceivable()),
+                repalBill.getEndDate().format(DateTimeFormatter.ISO_LOCAL_DATE),
+                overdueStr);
+        result.setSmsCode(RepalMsgTemplateEnum.短信模板一.getCode());
+        result.setContent(content);
+        return Collections.singletonList(result);
+    }
+
+    @Override
+    public Boolean urgeBySms(RepalSmsDTO dto) {
+        //校验权限
+        UserContextBO userContextBO = UserContextUtil.getUser();
+        boolean allFlag = repalRolePermissionService.checkUserPermission(userContextBO.getUserId(),PermissionEnum.URGE_BILL.getCode());
+        if(!allFlag){
+            throw new CommonException(CodeMsg.FORBIDDEN,"暂无此权限,可联系超级管理员在我的-成员管理页面开通");
+        }
+        if(CollUtil.isEmpty(dto.getLinks())){
+            throw new CommonException(CodeMsg.FAILED,"请至少选择一个联系人");
+        }
+        if(ObjectUtil.isNull(dto.getSmsCode())){
+            throw new CommonException(CodeMsg.FAILED,"请选择发送模板");
+        }
+        List<RepalSmsTemplateVO> templates = getSmsTemplate(dto.getRepalBillId());
+        if(CollUtil.isEmpty(templates)){
+            throw new CommonException(CodeMsg.FAILED,"发送失败");
+        }
 
+        for(RepalSmsTemplateVO template:templates){
+            if(template.getSmsCode().equals(dto.getSmsCode())){
+                Map<String,String> paraMap = new HashMap<>();
+                paraMap.put("content",template.getContent());
+                List<String> names = new ArrayList<>();
+                for(RepalLinkVO link: dto.getLinks()){
+                    if(StrUtil.isNotBlank(link.getMobileNo())) {
+                        messageNoticeService.sendSms(link.getMobileNo(), MsgNameEnum.回款宝短信催款, paraMap);
+                        names.add(link.getName());
+                    }
+                }
+                //记录催款动态
+                String dynamicDesc = "接收人:"+String.join("、",names)+"\n\r";
+                dynamicDesc+="信息内容:"+template.getContent();
+                RepalDynamic dynamic = new RepalDynamic();
+                dynamic.setRepalBillId(dto.getRepalBillId());
+                dynamic.setDynamicDesc(dynamicDesc);
+                dynamic.setDynamicType(RepalDynamicTypeEnum.短信.getCode());
+                dynamic.setMemberId(userContextBO.getUserId());
+                dynamic.setLinkMan(JSON.toJSONString(dto.getLinks()));
+                save(dynamic);
+            }
+        }
+        return Boolean.TRUE;
+    }
 }