Преглед изворни кода

feat:“添加退款短信提醒发送记录功能"

soobin пре 10 месеци
родитељ
комит
9ad6aa6716

+ 2 - 1
src/main/java/com/szwl/aspect/MyWebMvcConfigurer.java

@@ -25,7 +25,8 @@ public class MyWebMvcConfigurer extends WebMvcConfigurationSupport {
                 "/tOrder/**",
                 "/tCoinOrder/**",
                 "/tNameDictionary/**",
-                "/orderApi/**"
+                "/orderApi/**",
+                "/refundSendRecord/**"
         };
         registry.addInterceptor(headTokenInterceptor)
                 .addPathPatterns("/**")

+ 100 - 0
src/main/java/com/szwl/controller/RefundSendRecordController.java

@@ -0,0 +1,100 @@
+package com.szwl.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.szwl.feign.SzwlFeign;
+import com.szwl.model.bo.R;
+import com.szwl.model.bo.ResponseModel;
+import com.szwl.model.entity.RefundSendRecord;
+import com.szwl.model.entity.TAdmin;
+import com.szwl.model.query.SendRecordParam;
+import com.szwl.service.RefundSendRecordService;
+import org.apache.commons.lang.StringUtils;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author wuhs
+ * @since 2024-10-16
+ */
+@RestController
+@RequestMapping("/refundSendRecord")
+public class RefundSendRecordController {
+
+    private static final Logger log = LoggerFactory.getLogger(RefundSendRecordController.class);
+    @Autowired
+    private SzwlFeign szwlFeign;
+
+    @Autowired
+    private RefundSendRecordService refundSendRecordService;
+
+    @PostMapping("/list")
+    public ResponseModel<IPage<?>> list(@RequestBody SendRecordParam param){
+        TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(param.getSendAdminId())));
+        LambdaQueryWrapper<RefundSendRecord> query = Wrappers.lambdaQuery();
+        if (admin != null && admin.getType() != 0) {
+            query.eq(RefundSendRecord::getSendAdminId, param.getSendAdminId());
+        }
+        if (StringUtils.isNotEmpty(param.getSn())) {
+            query.eq(RefundSendRecord::getSn, param.getSn());
+        }
+        if (StringUtils.isNotEmpty(param.getClientId())) {
+            query.eq(RefundSendRecord::getClientId, param.getClientId());
+        }
+        if (StringUtils.isNotEmpty(param.getStartTime()) && StringUtils.isNotEmpty(param.getEndTime())) {
+            query.between(RefundSendRecord::getCreateDate, param.getStartTime(), param.getEndTime());
+        }
+        query.orderByDesc(RefundSendRecord::getCreateDate);
+        Page<RefundSendRecord> page = new Page<>(param.getCurrent(), param.getSize(), true);
+        Page<RefundSendRecord> recordPage = refundSendRecordService.page(page, query);
+        return R.ok(recordPage);
+    }
+
+    @PostMapping("/callBack")
+    public String callBack(String sms_status){
+        try {
+            String decode = URLDecoder.decode(sms_status, "UTF-8");
+            log.info("decode:{}", decode);
+            JSONArray jsonArray = new JSONArray(decode);
+            for (int i = 0; i < jsonArray.length(); i++) {
+                JSONObject jsonObject = jsonArray.getJSONObject(i);
+                String uid = jsonObject.getString("uid");
+                RefundSendRecord refundSendRecord = refundSendRecordService.getById(uid);
+                if (refundSendRecord == null) {
+                    continue;
+                }
+                String reportStatus = jsonObject.getString("report_status");
+                if (reportStatus.equals("SUCCESS")) {
+                    refundSendRecord.setStatus(1);
+                } else {
+                    refundSendRecord.setStatus(2);
+                    String errorDetail = jsonObject.getString("error_detail");
+                    refundSendRecord.setRemark(errorDetail);
+                }
+                refundSendRecordService.updateById(refundSendRecord);
+            }
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException(e);
+        }
+        return "SUCCESS";
+    }
+
+}
+

+ 2 - 2
src/main/java/com/szwl/controller/TOrderController.java

@@ -1840,11 +1840,11 @@ public class TOrderController {
 
     @ApiOperation("发送退款短信提醒")
     @GetMapping("/sentMessage")
-    public ResponseModel<?> sentMessage(Long id, String customerPhone) {
+    public ResponseModel<?> sentMessage(Long id, String customerPhone, Long adminId) {
         if (id == null) {
             return R.fail(ResponseCodesEnum.A0001);
         }
-        String result = orderService.setMessage(id, customerPhone);
+        String result = orderService.setMessage(id, customerPhone, adminId);
         if ("发送成功".equals(result)) {
             return R.ok(result);
         } else {

+ 16 - 0
src/main/java/com/szwl/mapper/RefundSendRecordMapper.java

@@ -0,0 +1,16 @@
+package com.szwl.mapper;
+
+import com.szwl.model.entity.RefundSendRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author wuhs
+ * @since 2024-10-16
+ */
+public interface RefundSendRecordMapper extends BaseMapper<RefundSendRecord> {
+
+}

+ 22 - 0
src/main/java/com/szwl/mapper/xml/RefundSendRecordMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.szwl.mapper.RefundSendRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.szwl.model.entity.RefundSendRecord">
+        <id column="id" property="id" />
+        <result column="create_date" property="createDate" />
+        <result column="client_id" property="clientId" />
+        <result column="sn" property="sn" />
+        <result column="phone" property="phone" />
+        <result column="send_admin_id" property="sendAdminId" />
+        <result column="status" property="status" />
+        <result column="remark" property="remark" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, create_date, client_id, sn, phone, send_admin_id, status, remark
+    </sql>
+
+</mapper>

+ 52 - 0
src/main/java/com/szwl/model/entity/RefundSendRecord.java

@@ -0,0 +1,52 @@
+package com.szwl.model.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 lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author wuhs
+ * @since 2024-10-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="RefundSendRecord对象", description="")
+public class RefundSendRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    private Date createDate;
+
+    @ApiModelProperty(value = "设备编号")
+    private String clientId;
+
+    @ApiModelProperty(value = "订单编号")
+    private String sn;
+
+    @ApiModelProperty(value = "接收手机号码")
+    private String phone;
+
+    @ApiModelProperty(value = "操作员ID")
+    private Long sendAdminId;
+
+    @ApiModelProperty(value = "发送状态,1:成功,0:失败")
+    private Integer status;
+
+    @ApiModelProperty(value = "失败原因")
+    private String remark;
+
+
+}

+ 16 - 0
src/main/java/com/szwl/model/query/SendRecordParam.java

@@ -0,0 +1,16 @@
+package com.szwl.model.query;
+
+import com.szwl.model.entity.RefundSendRecord;
+import lombok.Data;
+
+@Data
+public class SendRecordParam extends RefundSendRecord {
+
+    private long current;
+
+    private long size;
+
+    private String startTime;
+
+    private String endTime;
+}

+ 16 - 0
src/main/java/com/szwl/service/RefundSendRecordService.java

@@ -0,0 +1,16 @@
+package com.szwl.service;
+
+import com.szwl.model.entity.RefundSendRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2024-10-16
+ */
+public interface RefundSendRecordService extends IService<RefundSendRecord> {
+
+}

+ 1 - 1
src/main/java/com/szwl/service/TOrderService.java

@@ -37,7 +37,7 @@ public interface TOrderService extends IService<TOrder> {
 
     List<OrderStatisticsDTO> findByTime(String clientId, Date startTime, Date endTime, Integer unit);
 
-    String setMessage(Long id, String customerPhone);
+    String setMessage(Long id, String customerPhone, Long adminId);
 
     List<NewOrderTarget> exportOrderData(TAdmin admin, List<TOrder> list);
 

+ 20 - 0
src/main/java/com/szwl/service/impl/RefundSendRecordServiceImpl.java

@@ -0,0 +1,20 @@
+package com.szwl.service.impl;
+
+import com.szwl.model.entity.RefundSendRecord;
+import com.szwl.mapper.RefundSendRecordMapper;
+import com.szwl.service.RefundSendRecordService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2024-10-16
+ */
+@Service
+public class RefundSendRecordServiceImpl extends ServiceImpl<RefundSendRecordMapper, RefundSendRecord> implements RefundSendRecordService {
+
+}

+ 30 - 11
src/main/java/com/szwl/service/impl/TOrderServiceImpl.java

@@ -1,5 +1,6 @@
 package com.szwl.service.impl;
 
+import cn.hutool.core.util.RandomUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.ExcelWriter;
 import com.alibaba.excel.write.metadata.WriteSheet;
@@ -18,16 +19,14 @@ import com.szwl.model.bean.OrderDaoChuDTO;
 import com.szwl.model.bo.ChartType;
 import com.szwl.model.bo.R;
 import com.szwl.model.dto.OrderDto;
-import com.szwl.model.entity.TAdmin;
-import com.szwl.model.entity.TAdminEquipment;
-import com.szwl.model.entity.TEquipment;
-import com.szwl.model.entity.TOrder;
+import com.szwl.model.entity.*;
 import com.szwl.model.excel.NewOrderTarget;
 import com.szwl.model.excel.OrderTarget;
 import com.szwl.model.query.OrderDaoChuParam;
 import com.szwl.model.query.OrderStatisticsDTO;
 import com.szwl.model.query.StatisticsParam;
 import com.szwl.model.utils.DateUtils;
+import com.szwl.service.RefundSendRecordService;
 import com.szwl.service.TOrderService;
 import com.szwl.util.YunPianSms;
 import org.apache.commons.collections4.CollectionUtils;
@@ -58,13 +57,20 @@ import java.util.concurrent.Executors;
  */
 @Service
 public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> implements TOrderService {
+
     @Resource
     TOrderMapper tOrderMapper;
+
     @Autowired
     SzwlFeign szwlFeign;
 
+    @Autowired
+    private RefundSendRecordService refundSendRecordService;
+
     private static final String appid = "07784f5fedb508046c841b391005b7de";
 
+    private static final String CALLBACK_URL = "https://sz.sunzee.com.cn/ORDER-SERVER/refundSendRecord/callBack";
+
     //首页统计
     @Override
     public ChartColumn getStatistics(StatisticsParam param) {
@@ -235,16 +241,25 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
     }
 
     @Override
-    public String setMessage(Long id, String customerPhone) {
+    public String setMessage(Long id, String customerPhone, Long adminId) {
         TOrder order = tOrderMapper.selectById(id);
         String result = "";
+        RefundSendRecord refundSendRecord = new RefundSendRecord();
+        String uid = RandomUtil.randomNumbers(18);
+        refundSendRecord.setId(Long.valueOf(uid));
+        refundSendRecord.setCreateDate(new Date());
+        refundSendRecord.setSendAdminId(adminId);
         if (order != null) {
             String companyType = order.getCompanyType();
             String clientId = order.getClientId();
             String sn = order.getSn();
+            // 添加发送记录
+            refundSendRecord.setSn(sn);
+            refundSendRecord.setClientId(clientId);
             TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(order.getClientId()));
             if (equipment == null) {
-                return "设备不存在";
+                result = "设备不存在";
+                return result;
             }
             String operationalPhone = equipment.getOperationalPhone();
             String phone = null;
@@ -260,7 +275,8 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
                         phone = admin.getPhone();
                     }
                 } else {
-                    return "账户不存在";
+                    result = "账户不存在";
+                    return result;
                 }
             }
             if (!StringUtils.isEmpty(phone)) {
@@ -275,19 +291,22 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
                     if (StringUtils.isNotEmpty(companyType) && companyType.equals("1")) {
                         // 如果是七云科技的用户
                         result = YunPianSms.sendSms(appid, getScMessage(sn, price, payTime,
-                                equipment.getName(), clientId6, customerPhone), phone);
+                                equipment.getName(), clientId6, customerPhone), phone, uid, CALLBACK_URL);
                     } else {
                         // 如果是申泽智能的用户
                         result = YunPianSms.sendSms(appid, getSzMessage(sn, price, payTime,
-                                equipment.getName(), clientId6, customerPhone), phone);
+                                equipment.getName(), clientId6, customerPhone), phone, uid, CALLBACK_URL);
                     }
+                    refundSendRecord.setPhone(phone);
                 } catch (Exception e) {
                     e.printStackTrace();
-                    return "发送短信失败";
                 }
             } else {
-                return "设备运营者手机号为空";
+                result = "设备运营者手机号为空";
+                return result;
             }
+            refundSendRecord.setStatus(0);
+            refundSendRecordService.save(refundSendRecord);
         }
         return result;
     }

+ 24 - 0
src/main/java/com/szwl/util/YunPianSms.java

@@ -113,6 +113,30 @@ public final class YunPianSms {
     }
 
     /**
+     * 智能匹配模版接口发短信,发送退款短信
+     *
+     * @param apikey apikey
+     * @param text    短信内容
+     * @param mobile  接受的手机号
+     * @return json格式字符串
+     * @throws IOException
+     */
+    public static String sendSms(String apikey, String text, String mobile, String uid, String url) throws IOException {
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("apikey", apikey);
+        params.put("text", text);
+        params.put("mobile", mobile);
+        params.put("uid", uid);
+        params.put("callback_url", url);
+        String response = post(URI_SEND_SMS, params);
+        if (response != null) {
+            JSONObject json = new JSONObject(response);
+            return json.getString("msg");
+        }
+        return null;
+    }
+
+    /**
      * 通过模板发送短信(不推荐)
      *
      * @param apikey    apikey