瀏覽代碼

feat:律师函催款

zhangwei 2 年之前
父節點
當前提交
059a54945c

+ 30 - 0
src/main/java/com/winhc/repal/cloud/WinCoinService.java

@@ -0,0 +1,30 @@
+package com.winhc.repal.cloud;
+
+import com.winhc.common.base.BeanResponse;
+import com.winhc.repal.cloud.dto.WinCoinOrderFormDTO;
+import com.winhc.repal.cloud.vo.WinCoinOrderFormVO;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+
+/**
+ * @author Aaron
+ * @date 2022/5/10 14:16
+ * @description
+ */
+//@FeignClient("win-coin")
+@FeignClient(value = "win-coin",url = "106.14.81.247:5907")
+public interface WinCoinService {
+
+    /**
+     * 创建订单
+     * @param dto
+     * @return
+     */
+    @PostMapping("/winCoins/order")
+    BeanResponse<WinCoinOrderFormVO> createOrder(@RequestHeader("userInfo")String userInfo,
+                                                 @RequestHeader("appVersion")String appVersion,
+                                                 @RequestHeader("appPackage")String appPackage,
+                                                 @RequestBody WinCoinOrderFormDTO dto);
+}

+ 102 - 0
src/main/java/com/winhc/repal/cloud/dto/WinCoinOrderFormDTO.java

@@ -0,0 +1,102 @@
+package com.winhc.repal.cloud.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @description WinCoinOrderForm DTO对象
+ * @author Generator
+ * @date 2020-09-09
+ */
+@Data
+@Accessors(chain = true)
+@ApiModel(value="WinCoinOrderForm DTO对象", description="订单表")
+public class WinCoinOrderFormDTO {
+
+    private String productId;
+
+    @ApiModelProperty(value = "订单号")
+    private String orderId;
+
+    @ApiModelProperty(value = "用户ID")
+    private Long userId;
+
+    @ApiModelProperty(value = "活动代码")
+    private String productCode;
+
+    @ApiModelProperty(value = "商品数量")
+    private Integer productCount;
+
+    @ApiModelProperty(value = "手机号")
+    private String mobileNo;
+
+    @ApiModelProperty(value = "交易金额,BigDecimal")
+    private BigDecimal transAmt;
+
+    @ApiModelProperty(value = "订单内容")
+    private String orderContent;
+
+    @ApiModelProperty(value = "支付方式0赢币1支付宝2微信3兑换券4现金账户")
+    private String payMode;
+
+    @ApiModelProperty(value = "下单时间")
+    private LocalDateTime orderTime;
+
+    @ApiModelProperty(value = "付款时间")
+    private LocalDateTime payTime;
+
+    @ApiModelProperty(value = "订单完成(0), 待支付(1), 支付成功(2),   需退款(R), 已删除(D).已退款(G),已关闭(C)")
+    private String status;
+
+    @ApiModelProperty(value = "外部ID")
+    private String foreignId;
+
+    @ApiModelProperty(value = "")
+    private BigDecimal payAmt;
+
+    @ApiModelProperty(value = "0:未开票 1:已开票 2:无需开票")
+    private String invoiceStatus;
+
+    @ApiModelProperty(value = "")
+    private Long invoiceId;
+
+    @ApiModelProperty(value = "0VIP订单1提现订单2报告订单")
+    private String orderType;
+
+    @ApiModelProperty(value = "订单发货JSON")
+    private String goodsJson;
+
+    @ApiModelProperty(value = "提现订单账户类型 '0' 支付宝 ,'1' 微信")
+    private String accountType;
+
+    @ApiModelProperty(value = "促销代码")
+    private String promotionCode;
+
+    @ApiModelProperty(value = "主图")
+    private String mainPicUrl;
+
+    @ApiModelProperty(value = "商品快照JSON")
+    private String productSnapshot;
+
+    @ApiModelProperty(value = "兑换券码/优惠券码")
+    private String voucherCode;
+
+    @ApiModelProperty(value = "地址详情")
+    private String address;
+
+    @ApiModelProperty(value = "邮件地址")
+    private String email;
+
+    @ApiModelProperty(hidden = true)
+    private Boolean newVersion;
+
+    @ApiModelProperty(value = "规格")
+    private String specification;
+
+
+}

+ 132 - 0
src/main/java/com/winhc/repal/cloud/vo/WinCoinOrderFormVO.java

@@ -0,0 +1,132 @@
+package com.winhc.repal.cloud.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @description WinCoinOrderForm VO对象
+ * @author Generator
+ * @date 2020-09-09
+ */
+@Data
+@Accessors(chain = true)
+@ApiModel(value="WinCoinOrderForm VO对象", description="订单表")
+public class WinCoinOrderFormVO {
+
+    @ApiModelProperty(value = "订单号")
+    private String orderId;
+
+    @ApiModelProperty(value = "用户ID")
+    private Long userId;
+
+    @ApiModelProperty(value = "商品代码")
+    private String productCode;
+
+    @ApiModelProperty(value = "商品数量")
+    private Integer productCount;
+
+    @ApiModelProperty(value = "手机号")
+    private String mobileNo;
+
+    @ApiModelProperty(value = "交易金额,BigDecimal")
+    private BigDecimal transAmt;
+
+    @ApiModelProperty(value = "订单内容")
+    private String orderContent;
+
+    @ApiModelProperty(value = "支付方式0赢币1支付宝2微信3兑换券4余额")
+    private String payMode;
+
+    @ApiModelProperty(value = "下单时间")
+    private Date orderTime;
+
+    @ApiModelProperty(value = "当前距离下单的服务器时间,秒")
+    private Long intervalTime;
+
+    @ApiModelProperty(value = "付款时间")
+    private Date payTime;
+
+    @ApiModelProperty(value = "订单完成(0), 待支付(1), 支付成功(2),   需退款(R), 已删除(D).已退款(G),已关闭(C)")
+    private String status;
+
+    @ApiModelProperty(value = "外部ID")
+    private String foreignId;
+
+    @ApiModelProperty(value = "")
+    private BigDecimal payAmt;
+
+    @ApiModelProperty(value = "0:未开票 1:已开票 2:无需开票")
+    private String invoiceStatus;
+
+    @ApiModelProperty(value = "")
+    private Long invoiceId;
+
+    @ApiModelProperty(value = "订单类型 0VIP支付订单(购买VIP) 1提现订单 2报告订单 3企业套餐订单 4异地尽调 5商城-实物 6商城-电子商品 7 商城-vip 8商城-兑换券")
+    private String orderType;
+
+    @ApiModelProperty(value = "订单发货JSON")
+    private String goodsJson;
+
+    @ApiModelProperty(value = "提现订单账户类型 '0' 支付宝 ,'1' 微信")
+    private String accountType;
+
+    @ApiModelProperty(value = "促销代码")
+    private String promotionCode;
+
+    @ApiModelProperty(value = "主图")
+    private String mainPicUrl;
+
+    @ApiModelProperty(value = "商品快照JSON")
+    private String productSnapshot;
+
+    @ApiModelProperty(value = "兑换券码")
+    private String voucherCode;
+
+    @ApiModelProperty(value = "地址详情")
+    private String address;
+
+    @ApiModelProperty(value = "邮件地址")
+    private String email;
+
+    @ApiModelProperty(value = "虚拟商品下单描述")
+    private String orderDesc;
+
+    @ApiModelProperty(value = "商城商品分类name")
+    private String categoryName;
+
+    @ApiModelProperty(value = "备注")
+    private String memo;
+
+    @ApiModelProperty(value = "订单原始金额,BigDecimal")
+    private BigDecimal oriAmt;
+
+    @ApiModelProperty(value = "优惠金额,BigDecimal")
+    private BigDecimal discountAmt;
+
+    @ApiModelProperty(value = "优惠类型:0兑换券;1VIP")
+    private String discountKind;
+
+    @ApiModelProperty(value = "优惠券类型:0报告兑换券;1满减券;2通用券;3打折券")
+    private String voucherKind;
+
+    @ApiModelProperty(value = "抵扣金")
+    private BigDecimal deductionAmt;
+
+    @ApiModelProperty(value = "内部业务id")
+    private String internalBusinessId;
+
+    @ApiModelProperty(value = "规格")
+    private String specification;
+
+    @ApiModelProperty(value = "业务员用户id")
+    private Long businessUserId;
+
+
+
+
+}

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

@@ -4,6 +4,7 @@ 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.RepalLetterDTO;
 import com.winhc.repal.model.dto.RepalSmsDTO;
 import com.winhc.repal.model.vo.RepalManageBillDetailVO;
 import com.winhc.repal.model.vo.RepalManageBillInfoVO;
@@ -70,4 +71,10 @@ public class RepalManageController {
     public BeanResponse<Boolean> urgeBySms(@RequestBody RepalSmsDTO dto){
         return BeanResponse.success(CodeMsg.SUCCESS,repalDynamicService.urgeBySms(dto));
     }
+
+    @ApiOperation("律师函催款")
+    @PostMapping("/letter/urge")
+    public BeanResponse<Boolean> urgeByLawyerLetter(@RequestBody RepalLetterDTO dto){
+        return BeanResponse.success(CodeMsg.SUCCESS,repalDynamicService.urgeByLawyerLetter(dto));
+    }
 }

+ 3 - 3
src/main/java/com/winhc/repal/entity/RepalDynamic.java

@@ -54,9 +54,9 @@ public class RepalDynamic implements Serializable {
     @TableField("LINK_MAN")
     private String linkMan;
 
-    @ApiModelProperty(value = "律师服务id")
-    @TableField("LAWYER_SERVICE_ID")
-    private Long lawyerServiceId;
+    @ApiModelProperty(value = "订单id")
+    @TableField("ORDER_ID")
+    private Long orderId;
 
 
 }

+ 22 - 0
src/main/java/com/winhc/repal/model/dto/RepalLetterDTO.java

@@ -0,0 +1,22 @@
+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/10 15:40
+ * @description
+ */
+@Data
+@ApiModel("律师函催款")
+public class RepalLetterDTO {
+    @ApiModelProperty(value = "账款编号",required = true)
+    private Long repalBillId;
+    @ApiModelProperty(value = "发送联系人列表",required = true)
+    private List<RepalLinkVO> links;
+}

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

@@ -3,6 +3,7 @@ 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.RepalLetterDTO;
 import com.winhc.repal.model.dto.RepalSmsDTO;
 import com.winhc.repal.model.vo.RepalSmsTemplateVO;
 
@@ -34,4 +35,11 @@ public interface RepalDynamicService extends IService<RepalDynamic> {
      * @return
      */
     Boolean urgeBySms(RepalSmsDTO dto);
+
+    /**
+     * 发送律师函
+     * @param dto
+     * @return
+     */
+    Boolean urgeByLawyerLetter(RepalLetterDTO dto);
 }

+ 64 - 4
src/main/java/com/winhc/repal/service/impl/RepalDynamicServiceImpl.java

@@ -4,14 +4,19 @@ 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.base.BeanResponse;
 import com.winhc.common.enums.CodeMsg;
 import com.winhc.common.exception.CommonException;
+import com.winhc.repal.cloud.WinCoinService;
+import com.winhc.repal.cloud.dto.WinCoinOrderFormDTO;
+import com.winhc.repal.cloud.vo.WinCoinOrderFormVO;
 import com.winhc.repal.entity.RepalBill;
 import com.winhc.repal.entity.RepalDynamic;
 import com.winhc.repal.entity.RepalGroup;
 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.RepalLetterDTO;
 import com.winhc.repal.model.dto.RepalSmsDTO;
 import com.winhc.repal.model.vo.RepalLinkVO;
 import com.winhc.repal.model.vo.RepalSmsTemplateVO;
@@ -22,6 +27,7 @@ import com.winhc.repal.util.UserContextUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.text.DecimalFormat;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
@@ -46,6 +52,9 @@ public class RepalDynamicServiceImpl extends ServiceImpl<RepalDynamicMapper, Rep
     @Autowired
     private RepalGroupService repalGroupService;
 
+    @Autowired
+    private WinCoinService winCoinService;
+
     @Override
     public Boolean addDynamic(DynamicContentDTO dto) {
         UserContextBO userContextBO = UserContextUtil.getUser();
@@ -74,7 +83,7 @@ public class RepalDynamicServiceImpl extends ServiceImpl<RepalDynamicMapper, Rep
         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(),
+                "XXX",
                 repalGroup.getGroupName(),
                 df.format(repalBill.getTotalMoney()),
                 df.format(repalBill.getReceivable()),
@@ -93,28 +102,42 @@ public class RepalDynamicServiceImpl extends ServiceImpl<RepalDynamicMapper, Rep
         if(!allFlag){
             throw new CommonException(CodeMsg.FORBIDDEN,"暂无此权限,可联系超级管理员在我的-成员管理页面开通");
         }
+        //todo 扣减vip次数
         if(CollUtil.isEmpty(dto.getLinks())){
             throw new CommonException(CodeMsg.FAILED,"请至少选择一个联系人");
         }
         if(ObjectUtil.isNull(dto.getSmsCode())){
             throw new CommonException(CodeMsg.FAILED,"请选择发送模板");
         }
+        RepalBill repalBill = repalBillService.getById(dto.getRepalBillId());
         List<RepalSmsTemplateVO> templates = getSmsTemplate(dto.getRepalBillId());
-        if(CollUtil.isEmpty(templates)){
+        if(ObjectUtil.isNull(repalBill) || CollUtil.isEmpty(templates)){
             throw new CommonException(CodeMsg.FAILED,"发送失败");
         }
 
         for(RepalSmsTemplateVO template:templates){
             if(template.getSmsCode().equals(dto.getSmsCode())){
-                Map<String,String> paraMap = new HashMap<>();
+                Map<String,Object> paraMap = new HashMap<>();
                 paraMap.put("content",template.getContent());
+                paraMap.put("company",repalBill.getCustomerName());
+                paraMap.put("links",dto.getLinks());
+                paraMap.put("source","REPAL");
                 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());
                     }
                 }
+                WinCoinOrderFormDTO winCoinOrderFormDTO = new WinCoinOrderFormDTO();
+                winCoinOrderFormDTO.setUserId(userContextBO.getUserId());
+                winCoinOrderFormDTO.setProductCode("sms_repal");
+                winCoinOrderFormDTO.setPayMode("1");
+                winCoinOrderFormDTO.setTransAmt(BigDecimal.ZERO);
+                winCoinOrderFormDTO.setGoodsJson(JSON.toJSONString(paraMap));
+                BeanResponse<WinCoinOrderFormVO> rsp = winCoinService.createOrder(JSON.toJSONString(userContextBO),userContextBO.getAppVersion(),userContextBO.getAppPackageName(),winCoinOrderFormDTO);
+                if(!rsp.getIsSuccess().equals("T")){
+                    throw new CommonException(CodeMsg.FAILED,rsp.getErrorMsg());
+                }
                 //记录催款动态
                 String dynamicDesc = "接收人:"+String.join("、",names)+"\n\r";
                 dynamicDesc+="信息内容:"+template.getContent();
@@ -129,4 +152,41 @@ public class RepalDynamicServiceImpl extends ServiceImpl<RepalDynamicMapper, Rep
         }
         return Boolean.TRUE;
     }
+
+    @Override
+    public Boolean urgeByLawyerLetter(RepalLetterDTO dto) {
+        //校验权限
+        UserContextBO userContextBO = UserContextUtil.getUser();
+        boolean allFlag = repalRolePermissionService.checkUserPermission(userContextBO.getUserId(),PermissionEnum.URGE_BILL.getCode());
+        if(!allFlag){
+            throw new CommonException(CodeMsg.FORBIDDEN,"暂无此权限,可联系超级管理员在我的-成员管理页面开通");
+        }
+        RepalBill repalBill = repalBillService.getById(dto.getRepalBillId());
+        if(ObjectUtil.isNull(repalBill)){
+            throw new CommonException(CodeMsg.FAILED,"发送失败,账款不存在");
+        }
+        Map<String,Object> paraMap = new HashMap<>();
+        paraMap.put("company",repalBill.getCustomerName());
+        paraMap.put("links",dto.getLinks());
+        paraMap.put("source","REPAL");
+        paraMap.put("productCode","303_1");
+        WinCoinOrderFormDTO winCoinOrderFormDTO = new WinCoinOrderFormDTO();
+        winCoinOrderFormDTO.setUserId(userContextBO.getUserId());
+        winCoinOrderFormDTO.setProductCode("303");
+        winCoinOrderFormDTO.setPayMode("1");
+        winCoinOrderFormDTO.setTransAmt(BigDecimal.ZERO);
+        winCoinOrderFormDTO.setGoodsJson(JSON.toJSONString(paraMap));
+        BeanResponse<WinCoinOrderFormVO> rsp = winCoinService.createOrder(JSON.toJSONString(userContextBO),userContextBO.getAppVersion(),userContextBO.getAppPackageName(),winCoinOrderFormDTO);
+        if(!rsp.getIsSuccess().equals("T")){
+            throw new CommonException(CodeMsg.FAILED,rsp.getErrorMsg());
+        }
+
+        RepalDynamic dynamic = new RepalDynamic();
+        dynamic.setRepalBillId(dto.getRepalBillId());
+        dynamic.setDynamicType(RepalDynamicTypeEnum.律师函.getCode());
+        dynamic.setMemberId(userContextBO.getUserId());
+        dynamic.setLinkMan(JSON.toJSONString(dto.getLinks()));
+        save(dynamic);
+        return Boolean.TRUE;
+    }
 }