Ver código fonte

Merge branch 'dev-sms' into dev-activity

# Conflicts:
#	src/main/java/com/sqx/modules/order/service/AppOrderService.java
#	src/main/java/com/sqx/modules/order/service/impl/AppAppOrderServiceImpl.java
codingliang 1 ano atrás
pai
commit
ff33c241fe

+ 3 - 1
src/main/java/com/sqx/modules/errand/dao/TbIndentSmsSendLogDao.java

@@ -13,7 +13,9 @@ import org.apache.ibatis.annotations.Param;
 @Mapper
 public interface TbIndentSmsSendLogDao extends BaseMapper<TbIndentSmsSendLog>  {
 
-    IPage<IndentSmsSendLogVO> logPage(@Param("pages") Page<TbIndentSmsSendLog> pages, @Param("query") SmsLogQueryDTO query);
+    IPage<IndentSmsSendLogVO> logPageByRider(@Param("pages") Page<TbIndentSmsSendLog> pages, @Param("query") SmsLogQueryDTO query);
+
+    IPage<IndentSmsSendLogVO> logPageByShop(@Param("pages") Page<TbIndentSmsSendLog> pages, @Param("query") SmsLogQueryDTO query);
 
     int countOfSendSuccess(@Param("query") SmsCountQueryDTO queryDTO);
 }

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

@@ -24,6 +24,9 @@ public class SmsLogQueryDTO extends PageQuery {
     @ApiModelProperty("发送人电话")
     private String fromTo;
 
+    @ApiModelProperty("发送店铺id")
+    private Long shopId;
+
     @ApiModelProperty("接受人电话")
     private String sendTo;
 
@@ -34,4 +37,7 @@ public class SmsLogQueryDTO extends PageQuery {
     @ApiModelProperty("查询结束时间")
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private Date endTime;
+
+    @ApiModelProperty("发送来源:1骑手、2商家,默认为1")
+    private String sourceType = "1";
 }

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

@@ -45,4 +45,7 @@ public class TbIndentSmsSendLog {
 
     @ApiModelProperty("发送时间")
     private Date sendTime;
+
+    @ApiModelProperty("发送来源 1骑手、2商家")
+    private String sourceType;
 }

+ 9 - 1
src/main/java/com/sqx/modules/errand/service/TbIndentSmsSendLogService.java

@@ -14,9 +14,10 @@ public interface TbIndentSmsSendLogService extends IService<TbIndentSmsSendLog>
     /**
      * 保存短信发送日志
      * @param indentId 跑腿订单id
+     * @param sourceType 发送来源 1骑手、2商家
      * @param smsSendResult 短信发送结果
      */
-    void saveLog(Long indentId, SmsSendResult smsSendResult);
+    void saveLog(Long indentId, String sourceType, SmsSendResult smsSendResult);
 
     /**
      * 统计发送成功的短信条数
@@ -24,4 +25,11 @@ public interface TbIndentSmsSendLogService extends IService<TbIndentSmsSendLog>
      * @return count
      */
     int countOfSendSuccess(SmsCountQueryDTO queryDTO);
+
+    /**
+     * 根据订单id获取发送成功的短信
+     * @param indentId 跑腿订单id
+     * @return 信息
+     */
+    TbIndentSmsSendLog getSendSuccessByOrderId(Long indentId);
 }

+ 12 - 1
src/main/java/com/sqx/modules/errand/service/TbIndentSmsTemplateService.java

@@ -20,8 +20,19 @@ public interface TbIndentSmsTemplateService extends IService<TbIndentSmsTemplate
      * 短信发送
      * @param smsTemplateId 模板id
      * @param fromUser 发送人信息
-     * @param toPhone 手机人手机号
+     * @param toPhone 收件人手机号
      * @return 短信发送结果
      */
     SmsSendResult sendSms(Long smsTemplateId, UserEntity fromUser, String toPhone);
+
+    /**
+     * 短信发送
+     * @param smsTemplateId 模板id
+     * @param fromPhone 发送人手机号码
+     * @param fromUserName 发送人名称
+     * @param fromUserId 发送人id
+     * @param toPhone 收件人手机号
+     * @return 短信发送结果
+     */
+    SmsSendResult sendSms(Long smsTemplateId, String fromPhone, String fromUserName, Long fromUserId, String toPhone);
 }

+ 2 - 1
src/main/java/com/sqx/modules/errand/service/impl/TbIndentServiceImpl.java

@@ -965,7 +965,8 @@ public class TbIndentServiceImpl extends ServiceImpl<TbIndentDao, TbIndent> impl
 
         // 发送短信并记录短信发送记录
         SmsSendResult smsSendResult = smsTemplateService.sendSms(smsTemplateId, riderUser, userPhone);
-        smsSendLogService.saveLog(indentOrder.getIndentId(), smsSendResult);
+        // sourceType 1骑手、2商家
+        smsSendLogService.saveLog(indentOrder.getIndentId(), "1", smsSendResult);
     }
 
     @Transactional

+ 24 - 2
src/main/java/com/sqx/modules/errand/service/impl/TbIndentSmsSendLogServiceImpl.java

@@ -1,9 +1,12 @@
 package com.sqx.modules.errand.service.impl;
 
+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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sqx.common.sms.SmsSendResult;
+import com.sqx.common.utils.Constant;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.modules.errand.IndentSmsSendLogVO;
 import com.sqx.modules.errand.dao.TbIndentSmsSendLogDao;
@@ -21,12 +24,21 @@ public class TbIndentSmsSendLogServiceImpl extends ServiceImpl<TbIndentSmsSendLo
     @Override
     public PageUtils logPage(SmsLogQueryDTO queryDTO) {
         Page<TbIndentSmsSendLog> pages = new Page<>(queryDTO.getPage(), queryDTO.getLimit());
-        IPage<IndentSmsSendLogVO> pageRecord = baseMapper.logPage(pages, queryDTO);
+
+        IPage<IndentSmsSendLogVO> pageRecord;
+        // 发送来源:1骑手、2商家
+        if ("1".equals(queryDTO.getSourceType())) {
+            pageRecord = baseMapper.logPageByRider(pages, queryDTO);
+        } else {
+            pageRecord = baseMapper.logPageByShop(pages, queryDTO);
+
+        }
+
         return new PageUtils(pageRecord);
     }
 
     @Override
-    public void saveLog(Long indentId, SmsSendResult smsSendResult) {
+    public void saveLog(Long indentId, String sourceType, SmsSendResult smsSendResult) {
         TbIndentSmsSendLog log = new TbIndentSmsSendLog();
 
         log.setSendTime(new Date());
@@ -37,6 +49,7 @@ public class TbIndentSmsSendLogServiceImpl extends ServiceImpl<TbIndentSmsSendLo
         log.setSendResult(smsSendResult.getMsg());
         log.setSendFromId(smsSendResult.getSendFromId());
         log.setSendTo(smsSendResult.getSendTo());
+        log.setSourceType(sourceType);
 
         save(log);
     }
@@ -45,4 +58,13 @@ public class TbIndentSmsSendLogServiceImpl extends ServiceImpl<TbIndentSmsSendLo
     public int countOfSendSuccess(SmsCountQueryDTO queryDTO) {
         return baseMapper.countOfSendSuccess(queryDTO);
     }
+
+    @Override
+    public TbIndentSmsSendLog getSendSuccessByOrderId(Long indentId) {
+        LambdaQueryWrapper<TbIndentSmsSendLog> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(TbIndentSmsSendLog::getOrderId, indentId);
+        queryWrapper.eq(TbIndentSmsSendLog::getSuccessFlag, Constant.YES);
+        queryWrapper.last("limit 1");
+        return this.getOne(queryWrapper);
+    }
 }

+ 12 - 6
src/main/java/com/sqx/modules/errand/service/impl/TbIndentSmsTemplateServiceImpl.java

@@ -83,13 +83,18 @@ public class TbIndentSmsTemplateServiceImpl extends ServiceImpl<TbIndentSmsTempl
 
     @Override
     public SmsSendResult sendSms(Long smsTemplateId, UserEntity fromUser, String toPhone) {
+        return sendSms(smsTemplateId, fromUser.getPhone(), fromUser.getUserName(), fromUser.getUserId(), toPhone);
+    }
+
+    @Override
+    public SmsSendResult sendSms(Long smsTemplateId, String fromPhone, String fromUserName, Long fromUserId, String toPhone) {
         TbIndentSmsTemplate smsTemplate = getById(smsTemplateId);
         if (ObjectUtil.isNull(smsTemplate)) {
             throw new SqxException("无效的短信模板id");
         }
 
         String templateContent = smsTemplate.getTemplateContent();
-        Map<String, String> templateVal = getTemplateVal(templateContent, fromUser);
+        Map<String, String> templateVal = getTemplateVal(templateContent, fromPhone, fromUserName);
         String finalContent = SmsTemplateValUtil.replaceTemplateVal(templateContent, templateVal);
 
         SmsSendResult smsSendResult;
@@ -105,7 +110,7 @@ public class TbIndentSmsTemplateServiceImpl extends ServiceImpl<TbIndentSmsTempl
 
         // 填充smsSendResult其他属性
         smsSendResult.setTemplateId(smsTemplateId);
-        smsSendResult.setSendFromId(fromUser.getUserId());
+        smsSendResult.setSendFromId(fromUserId);
 
         return smsSendResult;
     }
@@ -113,19 +118,20 @@ public class TbIndentSmsTemplateServiceImpl extends ServiceImpl<TbIndentSmsTempl
     /**
      * 获取模板动态参数
      * @param templateContent 模板
-     * @param fromUser 发送人信息
+     * @param fromPhone 发送人手机号码
+     * @param fromUsername 发送人名称
      * @return
      */
-    private Map<String, String> getTemplateVal(String templateContent, UserEntity fromUser) {
+    private Map<String, String> getTemplateVal(String templateContent, String fromPhone, String fromUsername) {
         // 获取当前模板有哪些自定义参数
         List<String> templateValName = SmsTemplateValUtil.getTemplateValName(templateContent);
         Map<String, String> templateVal = new HashMap<>();
         templateValName.forEach(valName -> {
             String value;
             if (ObjectUtil.equal(valName, SmsTemplateValUtil.SUPPORT_VAL_NAME_LIST.get(0))) {
-                value = fromUser.getPhone();
+                value = fromPhone;
             } else {
-                value = fromUser.getUserName();
+                value = fromUsername;
             }
 
             templateVal.put(valName, value);

+ 6 - 8
src/main/java/com/sqx/modules/order/controller/OrderController.java

@@ -1,6 +1,7 @@
 package com.sqx.modules.order.controller;
 
 import com.sqx.common.utils.Result;
+import com.sqx.modules.order.dto.OrderFinishByShopDTO;
 import com.sqx.modules.order.entity.Evaluate;
 import com.sqx.modules.order.entity.TbOrder;
 import com.sqx.modules.order.service.AppOrderService;
@@ -20,6 +21,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
 
 @Slf4j
 @Api(tags={"管理端-订单"})
@@ -55,16 +57,12 @@ public class OrderController extends AbstractController {
         ExportExcelUtils.exportExcel(response,"订单列表.xlsx",excelData);
     }
 
-
     @ApiOperation("完成订单")
     @PostMapping(value = "accomplishOrder")
-    public Result accomplishOrder(Long orderId){
-        TbOrder tbOrder2 = appOrderService.getById(orderId);
-        if(tbOrder2.getAutoSendOrder()!=null && tbOrder2.getAutoSendOrder()==1){
-            log.info("操作完成订单2:"+orderId);
-            return appOrderService.accomplishOrder( orderId);
-        }
-        return Result.error("当前订单为自动派单,不能手动完成!");
+    public Result accomplishOrder(@Valid OrderFinishByShopDTO orderFinishByShopDTO){
+        appOrderService.finishOrderByShop(orderFinishByShopDTO);
+
+        return Result.success();
     }
 
     @ApiOperation("管理订单")

+ 35 - 0
src/main/java/com/sqx/modules/order/dto/OrderFinishByShopDTO.java

@@ -0,0 +1,35 @@
+package com.sqx.modules.order.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+
+/**
+ * 订单通过商家完成dto
+ *
+ * @author : codingliang
+ * @date : 2024-07-09 10:07
+ */
+@Data
+@ApiModel("订单通过商家完成dto")
+public class OrderFinishByShopDTO {
+
+    @ApiModelProperty("订单id")
+    @NotNull(message = "订单id不能为null")
+    private Long orderId;
+
+    @ApiModelProperty("图片")
+    private String imgs;
+
+    @ApiModelProperty("是否发送短信 0否、1是")
+    @NotBlank(message = "是否发送短信不能为空")
+    @Pattern(regexp = "(0|1)", message = "是否发送短信只能为0或1")
+    private String sendSmsFlag;
+
+    @ApiModelProperty("短信模板id")
+    private Long smsTemplateId;
+}

+ 7 - 0
src/main/java/com/sqx/modules/order/service/AppOrderService.java

@@ -3,6 +3,7 @@ package com.sqx.modules.order.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.sqx.common.utils.Result;
+import com.sqx.modules.order.dto.OrderFinishByShopDTO;
 import com.sqx.modules.order.entity.Evaluate;
 import com.sqx.modules.order.entity.OrderGoods;
 import com.sqx.modules.order.entity.TbOrder;
@@ -136,4 +137,10 @@ public interface AppOrderService extends IService<TbOrder> {
      * @return 订单数量
      */
     int countByShopIdAndUserIdAndCurDate(Long shopId, Long userId);
+
+    /**
+     * 店铺完成订单
+     * @param orderFinishByShopDTO 完成订单参数
+     */
+    void finishOrderByShop(OrderFinishByShopDTO orderFinishByShopDTO);
 }

+ 79 - 0
src/main/java/com/sqx/modules/order/service/impl/AppAppOrderServiceImpl.java

@@ -1,6 +1,9 @@
 package com.sqx.modules.order.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
+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.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -10,6 +13,8 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sqx.common.exception.SqxException;
+import com.sqx.common.sms.SmsSendResult;
+import com.sqx.common.utils.Constant;
 import com.sqx.common.utils.DateUtils;
 import com.sqx.common.utils.DistanceUtil;
 import com.sqx.common.utils.PageUtils;
@@ -48,6 +53,7 @@ import com.sqx.modules.message.entity.MessageInfo;
 import com.sqx.modules.order.dao.AppOrderDao;
 import com.sqx.modules.order.dao.EvaluateDao;
 import com.sqx.modules.order.dao.OrderGoodsDao;
+import com.sqx.modules.order.dto.OrderFinishByShopDTO;
 import com.sqx.modules.order.entity.Evaluate;
 import com.sqx.modules.order.entity.OrderGoods;
 import com.sqx.modules.order.entity.TbOrder;
@@ -58,11 +64,14 @@ import com.sqx.modules.pay.entity.PayDetails;
 import com.sqx.modules.pay.service.WxErrService;
 import com.sqx.modules.shop.service.ShopMessageService;
 import com.sqx.modules.sys.dao.SysUserRoleDao;
+import com.sqx.modules.sys.entity.SysUserEntity;
+import com.sqx.modules.sys.service.SysUserService;
 import com.sqx.modules.utils.SenInfoCheckUtil;
 import com.sqx.modules.utils.excel.ExcelData;
 import com.sqx.modules.utils.fieYun.FeiYunUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
+import org.apache.shiro.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -140,6 +149,13 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
     @Autowired
     private ActivityPartRecordService activityPartRecordService;
 
+    @Autowired
+    private SysUserService sysUserService;
+    @Autowired
+    private TbIndentSmsSendLogService smsSendLogService;
+    @Autowired
+    private TbIndentSmsTemplateService smsTemplateService;
+
     private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true);
 
     @Override
@@ -504,6 +520,69 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
     }
 
     @Override
+    public void finishOrderByShop(OrderFinishByShopDTO orderFinishByShopDTO) {
+        Long orderId = orderFinishByShopDTO.getOrderId();
+        TbOrder order = getById(orderId);
+
+        if (ObjectUtil.isNull(order)) {
+            throw new SqxException("无效的订单id");
+        }
+
+        if(order.getAutoSendOrder()!=null && order.getAutoSendOrder()==1){
+            throw new SqxException("当前订单为自动派单,不能手动完成!");
+        }
+
+        if (order.getStatus().equals(4)) {
+            return;
+        }
+
+        Long shopId = order.getShopId();
+        SysUserEntity currentUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
+        List<SysUserShop> sysUserShops = sysUserService.selectShopId(currentUser.getUserId());
+        if (CollUtil.isEmpty(sysUserShops) || !sysUserShops.stream().filter(e -> e.getShopId().longValue() == shopId.longValue()).findFirst().isPresent()) {
+            throw new SqxException("没有操作权限,只能操作完成自己店铺订单!");
+        }
+
+        if (Constant.YES.equals(orderFinishByShopDTO.getSendSmsFlag())) {
+            TbIndent indent = tbIndentService.getOne(new QueryWrapper<TbIndent>().eq("order_id", orderId));
+            if (ObjectUtil.isNull(indent)) {
+                return;
+            }
+
+            // 如果是外卖订单
+            if (ObjectUtil.equal(indent.getIndentType(), "5")) {
+                Long smsTemplateId = orderFinishByShopDTO.getSmsTemplateId();
+                if (ObjectUtil.isNull(smsTemplateId)) {
+                    throw new SqxException("短信模板id不能为空");
+                }
+
+                // 收货人手机
+                String userPhone = indent.getUserPhone();
+
+                if (StrUtil.isBlank(userPhone)) {
+                    return;
+                }
+
+                // 店铺信息
+                GoodsShop goodsShop = goodsShopDao.selectById(shopId);
+
+                // 发送短信并记录短信发送记录
+                SmsSendResult smsSendResult = smsTemplateService.sendSms(smsTemplateId, goodsShop.getPhone(), goodsShop.getShopName(), goodsShop.getShopId(), userPhone);
+
+                // sourceType 1骑手、2商家
+                smsSendLogService.saveLog(indent.getIndentId(), "2", smsSendResult);
+            }
+        }
+
+        if (StrUtil.isNotBlank(orderFinishByShopDTO.getImgs())) {
+            order.setDeliveryImgs(orderFinishByShopDTO.getImgs());
+            updateById(order);
+        }
+
+        accomplishOrder(orderId);
+    }
+
+    @Override
     public List<OrderGoods> getOrderGoods(Long orderId) {
         return orderGoodsDao.selectList(new QueryWrapper<OrderGoods>().eq("order_id", orderId));
     }

+ 33 - 1
src/main/resources/mapper/errand/TbIndentSmsSendLogMapper.xml

@@ -2,7 +2,7 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
 <mapper namespace="com.sqx.modules.errand.dao.TbIndentSmsSendLogDao">
-    <select id="logPage" resultType="com.sqx.modules.errand.IndentSmsSendLogVO">
+    <select id="logPageByRider" resultType="com.sqx.modules.errand.IndentSmsSendLogVO">
         select
                issl.*, o.delivery_imgs as imgs, u.phone as sendFromPhone
         from
@@ -11,6 +11,7 @@
         left join tb_order o on o.order_id = i.order_id
         left join tb_user u on u.user_id = issl.send_from_id
         <where>
+                and issl.source_type = '1'
             <if test="query.orderId != null">
                 and issl.order_id = #{query.orderId}
             </if>
@@ -33,6 +34,37 @@
         order by issl.send_time desc
     </select>
 
+    <select id="logPageByShop" resultType="com.sqx.modules.errand.IndentSmsSendLogVO">
+        select
+        issl.*, o.delivery_imgs as imgs
+        from
+        tb_indent_sms_send_log issl
+        left join tb_indent i on i.indent_id = issl.order_id
+        left join tb_order o on o.order_id = i.order_id
+        <where>
+            and issl.source_type = '2'
+            <if test="query.orderId != null">
+                and issl.order_id = #{query.orderId}
+            </if>
+            <if test="query.successFlag != null and query.successFlag != ''">
+                and issl.success_flag = #{query.successFlag}
+            </if>
+            <if test="query.shopId != null">
+                and o.shop_id = #{query.shopId}
+            </if>
+            <if test="query.sendTo != null and query.sendTo != ''">
+                and issl.send_to = #{query.sendTo}
+            </if>
+            <if test="query.startTime != null">
+                and issl.send_time >= #{query.startTime}
+            </if>
+            <if test="query.endTime != null">
+                and issl.send_time <![CDATA[<=]]> #{query.endTime}
+            </if>
+        </where>
+        order by issl.send_time desc
+    </select>
+
     <select id="countOfSendSuccess" resultType="java.lang.Integer">
         select
                count(1)

+ 1 - 1
src/main/resources/mapper/pay/CashDao.xml

@@ -237,7 +237,7 @@
             <if test="params.zhifubao != null and params.zhifubao != '' and params.zhifubao != 'null'">
                 and co.zhifubao = #{params.zhifubao}
             </if>
-            <if test="params.userId != null and params.userId != '' and params.userId != 'null'">
+            <if test="params.userId != null">
                 and co.user_id = #{params.userId}
             </if>
             <if test="params.type != null and params.type != '' and params.type != 'null'">