Ver código fonte

feat:“添加发送退款提醒短信功能,优化线下订单接口“

soobin 1 ano atrás
pai
commit
8afbafa158

+ 5 - 0
pom.xml

@@ -87,6 +87,11 @@
 			<artifactId>spring-boot-starter-test</artifactId>
 			<scope>test</scope>
 		</dependency>
+		<dependency>
+			<groupId>com.huifu.bspay.sdk</groupId>
+			<artifactId>dg-java-sdk</artifactId>
+			<version>3.0.8</version>
+		</dependency>
 <!--		<dependency>-->
 <!--			<groupId>org.springframework.boot</groupId>-->
 <!--			<artifactId>spring-boot-starter-jdbc</artifactId>-->

+ 1 - 0
src/main/java/com/szwl/constant/ConfigConsts.java

@@ -11,4 +11,5 @@ public class ConfigConsts {
      */
     public static final String AUTHORIZATION = "Authorization";
     public static final String INNER_FEIGN = "innerFeign";
+    public static final String SUCCESS = "SUCCESS";
 }

+ 92 - 22
src/main/java/com/szwl/controller/TCoinOrderController.java

@@ -7,24 +7,19 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.gexin.fastjson.JSON;
-import com.szwl.constant.ResponseCodesEnum;
-import com.szwl.feign.EsFeign;
 import com.szwl.feign.SzwlFeign;
 import com.szwl.feign.bean.TAdminParam;
 import com.szwl.model.bean.CoinOrderVO;
 import com.szwl.model.bo.JsonMessage;
 import com.szwl.model.bo.R;
 import com.szwl.model.bo.ResponseModel;
-import com.szwl.model.entity.TAdmin;
-import com.szwl.model.entity.TCoinOrder;
-import com.szwl.model.entity.TEquipment;
+import com.szwl.model.entity.*;
 import com.szwl.model.query.OrderStatisticsDTO;
 import com.szwl.model.query.Pageable;
 import com.szwl.model.utils.JsonUtils;
-import com.szwl.service.TAdminService;
-import com.szwl.service.TCoinOrderService;
-import com.szwl.service.TEquipmentService;
+import com.szwl.service.*;
 import com.szwl.service.es.EsTCoinOrderService;
+import com.szwl.util.HuifuUtils;
 import com.szwl.util.IDGenerator;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang.StringUtils;
@@ -36,6 +31,7 @@ import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -55,6 +51,10 @@ public class TCoinOrderController {
     EsTCoinOrderService esTCoinOrderService;
     @Autowired
     TCoinOrderService coinOrderService;
+    @Autowired
+    TOrderDetailsService orderDetailsService;
+    @Autowired
+    TNameDictionaryService nameDictionaryService;
 //    @Resource
 //    EsFeign esFeign;
 
@@ -96,7 +96,6 @@ public class TCoinOrderController {
         BigDecimal price = coinOrderVO.getPrice();
         String sn = coinOrderVO.getSn();
         TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(clientId));
-//        System.out.println("设备信息》》》" + equipment);
         String machineType = equipment.getMachineType(); // 设备类型
 
         Long adminId = equipment.getAdminId();
@@ -117,22 +116,37 @@ public class TCoinOrderController {
         coinOrder.setProductName(name);
         coinOrder.setPayType(payType);
         coinOrder.setPrice(price);
-        coinOrder.setProductNo(coinOrderVO.getNo());
         coinOrder.setSn(sn);
-        coinOrder.setStatus(1); // 线下纸币器订单都是已付款
-        coinOrder.setIsAir("0"); // 0或null 非空中云汇
+        // 线下纸币器订单都是已付款
+        coinOrder.setStatus(1);
+        // 0或null 非空中云汇
+        coinOrder.setIsAir("0");
         coinOrder.setEquipmentId(equipment.getId());
-//        // 设备类型0或null是棉花糖,1是爆米花
-//        if ("1".equals(machineType)) {
-//            coinOrder.setMachineType("1");
-//        }
-//        // 如果是七云
-//        if ("1".equals(companyType)) {
-//            coinOrder.setCompanyType("1");
-//        }
-        coinOrder.setMachineType(machineType);
-        coinOrder.setCompanyType(companyType);
 
+        // 保存订单明细
+        TOrderDetails tOrderDetails = new TOrderDetails();
+        tOrderDetails.setOrderSn(sn);
+        tOrderDetails.setEquipmentId(equipment.getId());
+        tOrderDetails.setRefundStatus("1");
+        tOrderDetails.setAdminId(adminId);
+
+        // 设备类型
+        if (StringUtils.isNotEmpty(machineType) && machineType.equals("1")) {
+            coinOrder.setMachineType(machineType);
+            tOrderDetails.setMachineType(machineType);
+        } else {
+            coinOrder.setMachineType("0");
+            tOrderDetails.setMachineType("0");
+        }
+        // 公司平台
+        if (StringUtils.isNotEmpty(companyType) && companyType.equals("1")) {
+            coinOrder.setCompanyType(companyType);
+            tOrderDetails.setCompanyType(companyType);
+        } else {
+            coinOrder.setCompanyType("0");
+            tOrderDetails.setCompanyType("0");
+        }
+        // 商品数量
         if (coinOrderVO.getProductNumber() == null || coinOrderVO.getProductNumber() == 0) {
             coinOrderVO.setProductNumber(1);
         } else {
@@ -149,12 +163,68 @@ public class TCoinOrderController {
             coinOrder.setCreateDate(date1);
             coinOrder.setModifyDate(date1);
             coinOrder.setPayDate(date1);
+            tOrderDetails.setCreateDate(date1);
         } else {
             coinOrder.setCreateDate(new Date());
             coinOrder.setModifyDate(new Date());
             coinOrder.setPayDate(new Date());
+            tOrderDetails.setCreateDate(new Date());
         }
         coinOrderService.save(coinOrder);
+        if (name.contains("-")) {
+            HashMap<String, Integer> map = new HashMap<>();
+            String[] split = name.split(",");
+            for (String s : split) {
+                String[] strings = s.split("-");
+                map.put(strings[0],Integer.valueOf(strings[1]));
+            }
+            for (String key : map.keySet()) {
+                // key:"A01",value:"1"
+                // 找到商品名称对应设备的商品信息
+                Integer productNumber = map.get(key);
+                tOrderDetails.setId(HuifuUtils.initDetailsId());
+                tOrderDetails.setProductNumber(productNumber);
+                tOrderDetails.setProductName(key);
+                TProduct product = R.getDataIfSuccess(szwlFeign.getProduct(String.valueOf(equipment.getId()), key));
+                if (product == null) {
+                    // 找到对应的商品名称的字典
+                    LambdaQueryWrapper<TNameDictionary> wrapper = Wrappers.lambdaQuery();
+                    wrapper.eq(TNameDictionary::getName, key);
+                    List<TNameDictionary> list = nameDictionaryService.list(wrapper);
+                    if (list.size() > 0) {
+                        tOrderDetails.setProductNo(list.get(0).getNo());
+                    } else {
+                        tOrderDetails.setProductNo("A01");
+                    }
+                } else {
+                    tOrderDetails.setProductNo(product.getNo());
+                }
+                orderDetailsService.save(tOrderDetails);
+            }
+        } else {
+            tOrderDetails.setId(HuifuUtils.initDetailsId());
+            tOrderDetails.setProductName(name);
+            tOrderDetails.setProductNumber(1);
+            if (name.contains("DIY")) {
+                tOrderDetails.setProductNo("A99");
+            } else {
+                TProduct product = R.getDataIfSuccess(szwlFeign.getProduct(String.valueOf(equipment.getId()), name));
+                if (product == null) {
+                    // 找到对应的商品名称的字典
+                    LambdaQueryWrapper<TNameDictionary> wrapper = Wrappers.lambdaQuery();
+                    wrapper.eq(TNameDictionary::getName, name);
+                    List<TNameDictionary> list = nameDictionaryService.list(wrapper);
+                    if (list.size() > 0) {
+                        tOrderDetails.setProductNo(list.get(0).getNo());
+                    } else {
+                        tOrderDetails.setProductNo("A01");
+                    }
+                } else {
+                    tOrderDetails.setProductNo(product.getNo());
+                }
+            }
+            orderDetailsService.save(tOrderDetails);
+        }
         try {
             esTCoinOrderService.insertData(coinOrder);
         } catch (Exception e) {

+ 113 - 0
src/main/java/com/szwl/controller/TNameDictionaryController.java

@@ -0,0 +1,113 @@
+package com.szwl.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.szwl.model.entity.TNameDictionary;
+import com.szwl.service.TNameDictionaryService;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-12-18
+ */
+@RestController
+@RequestMapping("/tNameDictionary")
+public class TNameDictionaryController {
+    @Autowired
+    private TNameDictionaryService nameDictionaryService;
+
+    @GetMapping("/save")
+    public String save(String nameStr, String lan) {
+        String xmlString =
+                "<root>"
+                        + nameStr
+                        + "</root>";
+        String[] noStr = {"A49", "A50", "A51", "A52", "A53", "A54", "A55", "A56", "A57",
+                "A58", "A59", "A60", "A61", "A62", "A63", "A64", "A65", "A66"};
+        List<String> str = new ArrayList<>();
+        try{
+            SAXReader reader = new SAXReader();
+            Document document = reader.read(new ByteArrayInputStream(xmlString.getBytes()));
+            Element root = document.getRootElement();
+            // 获取所有<string>元素
+            List<Element> stringElements = root.elements("string");
+
+            // 遍历<string>元素,输出name属性值和文本内容
+            for (Element stringElement : stringElements) {
+                String name = stringElement.attributeValue("name");
+                String content = stringElement.getText();
+                System.out.println("Name: " + name + ", Content: " + content);
+                str.add(content);
+            }
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+        int i = 0;
+        for (String s : str) {
+            TNameDictionary nameDictionary = new TNameDictionary();
+            nameDictionary.setCreateDate(new Date());
+            nameDictionary.setModifyDate(new Date());
+            nameDictionary.setName(s);
+            nameDictionary.setNo(noStr[i]);
+            nameDictionary.setLanguage(lan);
+            nameDictionaryService.save(nameDictionary);
+            i++;
+        }
+        return "success";
+    }
+
+
+    @GetMapping("/update")
+    public String update(String nameStr, String lan) {
+        String xmlString =
+                "<root>"
+                        + nameStr
+                        + "</root>";
+        List<String> str = new ArrayList<>();
+        try{
+            SAXReader reader = new SAXReader();
+            Document document = reader.read(new ByteArrayInputStream(xmlString.getBytes()));
+            Element root = document.getRootElement();
+            // 获取所有<string>元素
+            List<Element> stringElements = root.elements("string");
+
+            // 遍历<string>元素,输出name属性值和文本内容
+            for (Element stringElement : stringElements) {
+                String name = stringElement.attributeValue("name");
+                String content = stringElement.getText();
+                System.out.println("Name: " + name + ", Content: " + content);
+                str.add(content);
+            }
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+        for (String s : str) {
+            LambdaQueryWrapper<TNameDictionary> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(TNameDictionary::getName, s);
+            TNameDictionary nameDictionary = nameDictionaryService.getOne(wrapper);
+            if (nameDictionary.getLanguage() == null) {
+                nameDictionary.setLanguage(lan);
+            }
+            nameDictionaryService.updateById(nameDictionary);
+        }
+        return "success";
+    }
+}
+

+ 32 - 14
src/main/java/com/szwl/controller/TOrderController.java

@@ -13,6 +13,7 @@ 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.common.aop.LogAnnotation;
+import com.szwl.constant.ConfigConsts;
 import com.szwl.constant.ResponseCodesEnum;
 import com.szwl.feign.SzwlFeign;
 import com.szwl.model.bean.*;
@@ -506,19 +507,9 @@ public class TOrderController {
             query.orderByDesc(TCoinOrder::getCreateDate);
             Page<TCoinOrder> page = new Page<>(current, size, true);
             IPage<TCoinOrder> iPage = coinOrderService.page(page, query);
-            //显示订单所属机器的设备名称
-//            if (admin.getType() != null && admin.getType() < 2) {
-//                //公司人员
-//                List<TCoinOrder> orderList = iPage.getRecords();
-//                if (orderList.size() > 0) {
-//                    for (TCoinOrder order : orderList) {
-//                        TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(order.getClientId()));
-//                        order.setEs(equipment.getName());
-//                    }
-//                    iPage.setRecords(orderList);
-//                }
-//            }
+            IPage<CoinOrderDetailsVo> pageList = new Page<>();
             List<TCoinOrder> coinOrderList = iPage.getRecords();
+            ArrayList<CoinOrderDetailsVo> coinOrderDetailsVos = new ArrayList<>();
             if (coinOrderList.size() > 0) {
                 // 设备编号集合
                 List<String> clientIds = new ArrayList<>();
@@ -540,10 +531,23 @@ public class TOrderController {
                     } else {
                         coinOrder.setEs(coinOrderClientId.substring(coinOrderClientId.length() - 6));
                     }
+                    CoinOrderDetailsVo coinOrderDetailsVo = new CoinOrderDetailsVo();
+                    BeanUtil.copyProperties(coinOrder, coinOrderDetailsVo);
+                    LambdaQueryWrapper<TOrderDetails> queryWrapper = Wrappers.lambdaQuery();
+                    queryWrapper.eq(TOrderDetails::getOrderSn, coinOrder.getSn());
+                    List<TOrderDetails> orderDetailsList = orderDetailsService.list(queryWrapper);
+                    if (orderDetailsList != null) {
+                        coinOrderDetailsVo.setOrderDetails(orderDetailsList);
+                    }
+                    coinOrderDetailsVos.add(coinOrderDetailsVo);
                 }
-                iPage.setRecords(coinOrderList);
             }
-            return R.ok(iPage);
+            pageList.setRecords(coinOrderDetailsVos);
+            pageList.setPages(iPage.getPages());
+            pageList.setCurrent(iPage.getCurrent());
+            pageList.setTotal(iPage.getTotal());
+            pageList.setSize(iPage.getSize());
+            return R.ok(pageList);
         }
         return R.ok();
     }
@@ -1822,5 +1826,19 @@ public class TOrderController {
         dateEnd.set(Calendar.SECOND, 59);
         return dateEnd.getTime();
     }
+
+    @ApiOperation("发送退款短信提醒")
+    @GetMapping("/sentMessage")
+    public ResponseModel<?> sentMessage(Long id, String customerPhone) {
+        if(id == null) {
+            return R.fail(ResponseCodesEnum.A0001);
+        }
+        String result = orderService.setMessage(id, customerPhone);
+        if(result.equals(ConfigConsts.SUCCESS)) {
+            return R.ok("发送成功");
+        } else {
+            return R.fail(ResponseCodesEnum.A0001, result);
+        }
+    }
 }
 

+ 4 - 4
src/main/java/com/szwl/feign/SzwlFeign.java

@@ -3,10 +3,7 @@ package com.szwl.feign;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.szwl.feign.bean.TAdminParam;
 import com.szwl.model.bo.ResponseModel;
-import com.szwl.model.entity.TAdmin;
-import com.szwl.model.entity.TAdminEquipment;
-import com.szwl.model.entity.TEquipment;
-import com.szwl.model.entity.TShandeMch;
+import com.szwl.model.entity.*;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.*;
@@ -69,4 +66,7 @@ public interface SzwlFeign {
 
     @GetMapping("/tEquipment/listEquipment")
     ResponseModel<List<TEquipment>> listEquipment(@RequestParam String adminId);
+
+    @GetMapping("/tProduct/getProduct")
+    ResponseModel<TProduct> getProduct(@RequestParam(value = "equipmentId") String equipmentId, @RequestParam(value = "productName") String productName);
 }

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

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

+ 20 - 0
src/main/java/com/szwl/mapper/xml/TNameDictionaryMapper.xml

@@ -0,0 +1,20 @@
+<?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.TNameDictionaryMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.szwl.model.entity.TNameDictionary">
+        <id column="id" property="id" />
+        <result column="create_date" property="createDate" />
+        <result column="modify_date" property="modifyDate" />
+        <result column="name" property="name" />
+        <result column="no" property="no" />
+        <result column="language" property="language" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, create_date, modify_date, name, no, language
+    </sql>
+
+</mapper>

+ 15 - 0
src/main/java/com/szwl/model/bean/CoinOrderDetailsVo.java

@@ -0,0 +1,15 @@
+package com.szwl.model.bean;
+
+import com.szwl.model.entity.TCoinOrder;
+import com.szwl.model.entity.TOrderDetails;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class CoinOrderDetailsVo extends TCoinOrder {
+
+    @ApiModelProperty(value = "订单明细")
+    private List<TOrderDetails> orderDetails;
+}

+ 46 - 0
src/main/java/com/szwl/model/entity/TNameDictionary.java

@@ -0,0 +1,46 @@
+package com.szwl.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-12-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="TNameDictionary对象", description="")
+public class TNameDictionary implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createDate;
+
+    @ApiModelProperty(value = "修改时间")
+    private Date modifyDate;
+
+    @ApiModelProperty(value = "花型名称")
+    private String name;
+
+    @ApiModelProperty(value = "商品编号")
+    private String no;
+
+    @ApiModelProperty(value = "语种")
+    private String language;
+
+
+}

+ 1 - 1
src/main/java/com/szwl/model/entity/TOrderDetails.java

@@ -62,7 +62,7 @@ public class TOrderDetails implements Serializable {
     @ApiModelProperty(value = "退款金额")
     private BigDecimal refundAmount;
 
-    @ApiModelProperty(value = "退款状态,0:未退款,1:部分退款,2:已退款")
+    @ApiModelProperty(value = "退款状态,0:未支付,1:已支付,2:部分退款,3:全部退款,4:退款中")
     private String refundStatus;
 
     @ApiModelProperty(value = "公司平台,0或空为申泽,1为七云")

+ 58 - 0
src/main/java/com/szwl/model/entity/TProduct.java

@@ -0,0 +1,58 @@
+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.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 商品价格表
+ * </p>
+ *
+ * @author wuhs
+ * @since 2022-04-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="TProduct对象", description="商品价格表")
+public class TProduct implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private Date createDate;
+
+    private Date modifyDate;
+
+    @ApiModelProperty(value = "投币价格;")
+    private BigDecimal codePrice;
+
+    @ApiModelProperty(value = "机器id;")
+    private Long equipmentId;
+
+    @ApiModelProperty(value = "产品名称;")
+    private String productName;
+
+    @ApiModelProperty(value = "人名币价格;")
+    private BigDecimal rmbPrice;
+
+    @ApiModelProperty(value = "销售状态;")
+    private Boolean sellStatus;
+
+    @ApiModelProperty(value = "是否显示")
+    private String showType;
+
+    @ApiModelProperty(value = "编号")
+    private String no;
+
+
+}

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

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

+ 2 - 0
src/main/java/com/szwl/service/TOrderService.java

@@ -32,4 +32,6 @@ public interface TOrderService extends IService<TOrder> {
     List<OrderTarget> findById(TAdmin admin, List<TOrder> list) throws ParseException;
 
     List<OrderStatisticsDTO> findByTime(String clientId, Date startTime, Date endTime, Integer unit);
+
+    String setMessage(Long id, String customerPhone);
 }

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

@@ -0,0 +1,20 @@
+package com.szwl.service.impl;
+
+import com.szwl.model.entity.TNameDictionary;
+import com.szwl.mapper.TNameDictionaryMapper;
+import com.szwl.service.TNameDictionaryService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-12-18
+ */
+@Service
+public class TNameDictionaryServiceImpl extends ServiceImpl<TNameDictionaryMapper, TNameDictionary> implements TNameDictionaryService {
+
+}

+ 92 - 0
src/main/java/com/szwl/service/impl/TOrderServiceImpl.java

@@ -1,5 +1,7 @@
 package com.szwl.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
+import com.szwl.constant.ConfigConsts;
 import com.szwl.exception.MyException;
 import com.szwl.feign.SzwlFeign;
 import com.szwl.model.bean.ChartBean;
@@ -18,6 +20,7 @@ import com.szwl.model.query.StatisticsParam;
 import com.szwl.model.utils.DateUtils;
 import com.szwl.service.TOrderService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.szwl.util.YunPianSms;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -44,6 +47,8 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
     TOrderMapper tOrderMapper;
     @Autowired
     SzwlFeign szwlFeign;
+
+    private static final String appid = "07784f5fedb508046c841b391005b7de";
     //首页统计
     @Override
     public ChartColumn getStatistics(StatisticsParam param) {
@@ -213,4 +218,91 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         return tOrderMapper.findByTime(clientId,startTime,endTime,unit);
     }
 
+    @Override
+    public String setMessage(Long id, String customerPhone) {
+        TOrder order = tOrderMapper.selectById(id);
+        if(order != null) {
+            String companyType = order.getCompanyType();
+            String clientId = order.getClientId();
+            String sn = order.getSn();
+            TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(order.getClientId()));
+            if (equipment == null) {
+                return  "设备不存在";
+            }
+            String operationalPhone = equipment.getOperationalPhone();
+            String phone = null;
+            //判断是否有机器运营者,作为短信接收通知人
+            if(!StringUtils.isEmpty(operationalPhone)){
+                //直接发送到机器运营者
+                phone = operationalPhone;
+            }else{
+                //直接发送到账户拥有者手机
+                TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(equipment.getAdminId())));
+                if(admin != null){
+                    if(!StringUtils.isEmpty(admin.getPhone())){
+                        phone = admin.getPhone();
+                    }
+                } else {
+                    return "账户不存在";
+                }
+            }
+            if(!StringUtils.isEmpty(phone)){
+                //发短信
+                try {
+                    String price = String.valueOf(order.getPrice());
+                    Date payDate = order.getPayDate();
+                    String pattern = "yyyy-MM-dd HH:mm:ss";
+                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
+                    String paytime = simpleDateFormat.format(payDate);
+                    String clientId6 = clientId.substring(clientId.length() - 6);
+                    if (StringUtils.isNotEmpty(companyType) && companyType.equals("1")) {
+                        // 如果是七云科技的用户
+                        YunPianSms.sendSms(appid, getScMessage(sn, price, paytime,
+                                equipment.getName(), clientId6, customerPhone), phone);
+                    } else {
+                        // 如果是申泽智能的用户
+                        YunPianSms.sendSms(appid, getSzMessage(sn, price, paytime,
+                                equipment.getName(), clientId6, customerPhone), phone);
+                    }
+                } catch (Exception e) {
+                }
+            } else {
+                return "设备运营者手机号为空";
+            }
+        }
+        return ConfigConsts.SUCCESS;
+    }
+
+    private String getSzMessage(String sn, String price, String payTime,String equipmentName,String clientId,String customerPhone) {
+        String message = "";
+        if(StringUtils.isNotEmpty(customerPhone)&&customerPhone.length()>3){
+            message = "【申泽智能】您好,接到消费者投诉:机器做糖出现问题,需要您退款。订单号:"
+                    +sn+",机器名称:"+equipmentName+",设备编号:"+clientId+
+                    ",价格:"+price+"元,订单支付时间:"+payTime+",消费者联系方式:"+customerPhone+
+                    "。如果已通过私下退款的方式,麻烦提供一下退款截屏到群里。请于24小时内将此订单进行退款处理,过后我司将自行帮您进行退款处理,若超过5次超时处理,可能会有冻结银行卡的风险,谢谢配合。";
+        }else {
+            message = "【申泽智能】您好,接到消费者投诉:机器做糖出现问题,需要您退款。订单号:"
+                    +sn+",机器名称:"+equipmentName+",设备编号:"+clientId+
+                    ",价格:"+price+"元,订单支付时间:"+payTime+",该投诉消费者没有留联系方式,如需核实,请把你的联系方式反馈给我们,我们会把你的联系方式通知到消费者手上,让消费者联系您。" +
+                    "如果已通过私下退款的方式,麻烦提供一下退款截屏到群里。请于24小时内将此订单进行退款处理,过后我司将自行帮您进行退款处理,若超过5次超时处理,可能会有冻结银行卡的风险,谢谢配合。";
+        }
+        return message;
+    }
+
+    private String getScMessage(String sn, String price, String payTime,String equipmentName,String clientId,String customerPhone) {
+        String message = "";
+        if(StringUtils.isNotEmpty(customerPhone)&&customerPhone.length()>3){
+            message = "【七云科技】您好,接到消费者投诉:机器做糖出现问题,需要您退款。订单号:"
+                    +sn+",机器名称:"+equipmentName+",设备编号:"+clientId+
+                    ",价格:"+price+"元,订单支付时间:"+payTime+",消费者联系方式:"+customerPhone+
+                    "。如果已通过私下退款的方式,麻烦提供一下退款截屏到群里。请于24小时内将此订单进行退款处理,过后我司将自行帮您进行退款处理,若超过5次超时处理,可能会有冻结银行卡的风险,谢谢配合。";
+        }else {
+            message = "【七云科技】您好,接到消费者投诉:机器做糖出现问题,需要您退款。订单号:"
+                    +sn+",机器名称:"+equipmentName+",设备编号:"+clientId+
+                    ",价格:"+price+"元,订单支付时间:"+payTime+",该投诉消费者没有留联系方式,如需核实,请把你的联系方式反馈给我们,我们会把你的联系方式通知到消费者手上,让消费者联系您。" +
+                    "如果已通过私下退款的方式,麻烦提供一下退款截屏到群里。请于24小时内将此订单进行退款处理,过后我司将自行帮您进行退款处理,若超过5次超时处理,可能会有冻结银行卡的风险,谢谢配合。";
+        }
+        return message;
+    }
+
 }

+ 37 - 0
src/main/java/com/szwl/util/HuifuUtils.java

@@ -0,0 +1,37 @@
+package com.szwl.util;
+
+import cn.hutool.core.util.RandomUtil;
+import com.huifu.bspay.sdk.opps.core.utils.DateTools;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class HuifuUtils {
+
+    /**
+     * 生成随机流水号
+     * @return
+     */
+    public static String initReqSeqId() {
+        String numbers = RandomUtil.randomNumbers(10);
+        return new StringBuilder(DateTools.getCurrentDateTimeYYYYMMDDHHMMSSSSS()).append(numbers).toString();
+    }
+
+    /**
+     * 生成随机订单明细号
+     * @return
+     */
+    public static String initDetailsId() {
+        String numbers = RandomUtil.randomNumbers(10);
+        return new StringBuilder(numbers).append(DateTools.getCurrentDateTimeYYYYMMDDHHMMSSSSS()).toString();
+    }
+
+    /**
+     * 生成随机临时订单明细号
+     * @return
+     */
+    public static String inithuifuTempId() {
+        String numbers1 = RandomUtil.randomNumbers(5);
+        String numbers2 = RandomUtil.randomNumbers(5);
+        return new StringBuilder(numbers1).append(DateTools.getCurrentDateTimeYYYYMMDDHHMMSSSSS()).append(numbers2).toString();
+    }
+}

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

@@ -0,0 +1,211 @@
+package com.szwl.util;
+
+
+import org.apache.http.HttpEntity;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONObject;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by x on 2017
+ */
+public final class YunPianSms {
+    //查账户信息的http地址
+    private static String URI_GET_USER_INFO = "https://sms.yunpian.com/v2/user/get.json";
+
+    //智能匹配模版发送接口的http地址
+    private static String URI_SEND_SMS = "https://sms.yunpian.com/v2/sms/single_send.json";
+
+    //模板发送接口的http地址
+    private static String URI_TPL_SEND_SMS = "https://sms.yunpian.com/v2/sms/tpl_single_send.json";
+
+    //发送语音验证码接口的http地址
+    private static String URI_SEND_VOICE = "https://voice.yunpian.com/v2/voice/send.json";
+
+    //编码格式。发送编码格式统一用UTF-8
+    private static String ENCODING = "UTF-8";
+
+    public static JSONObject sendSms(String phone, String content) throws IOException, URISyntaxException {
+
+        //修改为您的apikey.apikey可在官网(http://www.yuanpian.com)登录后获取
+        String apikey = "07784f5fedb508046c841b391005b7de";
+
+        //修改为您要发送的手机号
+        String mobile = URLEncoder.encode(phone, ENCODING);
+
+        /**************** 查账户信息调用示例 *****************/
+//        System.out.println(YunPianSms.getUserInfo(apikey));
+
+        /**************** 使用智能匹配模版接口发短信(推荐) *****************/
+        //设置您要发送的内容(内容必须和某个模板匹配。以下例子匹配的是系统提供的1号模板)
+        String text = content;
+        //发短信调用示例
+        String result = YunPianSms.sendSms(apikey, text, mobile);
+        JSONObject resultJson = new JSONObject(result);
+        System.out.println("短信发送结果:" + resultJson.get("msg"));
+        return resultJson;
+        /**************** 使用指定模板接口发短信(不推荐,建议使用智能匹配模版接口) *****************/
+        //设置模板ID,如使用1号模板:【#company#】您的验证码是#code#
+//        long tpl_id = 1;
+        //设置对应的模板变量值
+
+//        String tpl_value = URLEncoder.encode("#code#",ENCODING) +"="
+//                + URLEncoder.encode("1234", ENCODING) + "&"
+//                + URLEncoder.encode("#company#",ENCODING) + "="
+//                + URLEncoder.encode("云片网",ENCODING);
+        //模板发送的调用示例
+//        System.out.println(tpl_value);
+//        System.out.println(YunPianSms.tplSendSms(apikey, tpl_id, tpl_value, mobile));
+
+        /**************** 使用接口发语音验证码 *****************/
+//        String code = "1234";
+        //System.out.println(YunPianSms.sendVoice(apikey, mobile ,code));
+    }
+
+
+    /**
+     * 取账户信息
+     *
+     * @return json格式字符串
+     * @throws IOException
+     */
+
+    public static String getUserInfo(String apikey) throws IOException, URISyntaxException {
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("apikey", apikey);
+        return post(URI_GET_USER_INFO, params);
+    }
+
+    /**
+     * 智能匹配模版接口发短信
+     *
+     * @param apikey apikey
+     * @param text    短信内容
+     * @param mobile  接受的手机号
+     * @return json格式字符串
+     * @throws IOException
+     */
+    public static String sendSms(String apikey, String text, String mobile) throws IOException {
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("apikey", apikey);
+        params.put("text", text);
+        params.put("mobile", mobile);
+        return post(URI_SEND_SMS, params);
+    }
+
+    /**
+     * 通过模板发送短信(不推荐)
+     *
+     * @param apikey    apikey
+     * @param tpl_id     模板id
+     * @param tpl_value  模板变量值
+     * @param mobile     接受的手机号
+     * @return json格式字符串
+     * @throws IOException
+     */
+
+    public static String tplSendSms(String apikey, long tpl_id, String tpl_value, String mobile) throws IOException {
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("apikey", apikey);
+        params.put("tpl_id", String.valueOf(tpl_id));
+        params.put("tpl_value", tpl_value);
+        params.put("mobile", mobile);
+        return post(URI_TPL_SEND_SMS, params);
+    }
+
+    /**
+     * 通过接口发送语音验证码
+     *
+     * @param apikey apikey
+     * @param mobile 接收的手机号
+     * @param code   验证码
+     * @return
+     */
+
+    public static String sendVoice(String apikey, String mobile, String code) {
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("apikey", apikey);
+        params.put("mobile", mobile);
+        params.put("code", code);
+        return post(URI_SEND_VOICE, params);
+    }
+
+    /**
+     * 基于HttpClient 4.3的通用POST方法
+     *
+     * @param url       提交的URL
+     * @param paramsMap 提交<参数,值>Map
+     * @return 提交响应
+     */
+
+    public static String post(String url, Map<String, String> paramsMap) {
+        CloseableHttpClient client = HttpClients.createDefault();
+        String responseText = "";
+        CloseableHttpResponse response = null;
+        try {
+            HttpPost method = new HttpPost(url);
+            if (paramsMap
+                    != null) {
+                List<NameValuePair> paramList = new ArrayList<NameValuePair>();
+                for (Map.Entry<String, String> param : paramsMap.entrySet()) {
+                    NameValuePair pair = new BasicNameValuePair(param.getKey(), param.getValue());
+                    paramList.add(pair);
+                }
+                method.setEntity(new UrlEncodedFormEntity(paramList, ENCODING));
+            }
+            response = client.execute(method);
+            HttpEntity entity = response.getEntity();
+            if (entity != null) {
+                responseText = EntityUtils.toString(entity);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                response.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return responseText;
+    }
+
+    public static void main(String[] args) {
+
+        try {
+
+            //String content="【申泽智能】您好,机器二次取棍异常报警,机器名:MG301测试机,设备号:aaa863010031925055";
+            String tpl_value = URLEncoder.encode("#content#", ENCODING) + "=" +
+                    URLEncoder.encode("二次", ENCODING) + "&" + URLEncoder.encode(
+                    "#name#", ENCODING) + "=" + URLEncoder.encode("MG机",
+                    ENCODING) + "&" + URLEncoder.encode("#clientId#", ENCODING) + "=" + URLEncoder.encode("aaa8635", ENCODING);
+            //您好,机器#content#,机器名:#name#,设备号:#clientId#
+            System.out.println(tpl_value.length());
+            String content = "您好,机器二次取棍异常警告,机器名:MG301测试机,设备号:aaa863010031925055";
+            System.out.println(content.length());
+            //String result = tplSendSms("07784f5fedb508046c841b391005b7de", 2890698L, tpl_value, "15875317659");
+
+            String result = sendSms("07784f5fedb508046c841b391005b7de", content, "15875317659");
+            JSONObject resultJson = new JSONObject(result);
+            System.out.println("短信发送结果:" + resultJson.get("msg"));
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+
+    }
+}