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

Merge branch 'dev-feat' of https://e.coding.net/chuanghaikeji/moxuanyunshangwaimai/backend into dev-wxl

wanxl пре 1 година
родитељ
комит
95ae796444
93 измењених фајлова са 2689 додато и 1062 уклоњено
  1. 8 0
      pom.xml
  2. 0 2
      src/main/java/com/sqx/SecureApiTest.java
  3. 26 11
      src/main/java/com/sqx/SqxApplication.java
  4. 1 1
      src/main/java/com/sqx/common/aspect/RedisAspect.java
  5. 86 0
      src/main/java/com/sqx/common/constant/RedisKey.java
  6. 95 0
      src/main/java/com/sqx/common/utils/MyGlobalThreadPool.java
  7. 118 50
      src/main/java/com/sqx/common/utils/RedisUtils.java
  8. 10 7
      src/main/java/com/sqx/common/xss/XssFilter.java
  9. 24 32
      src/main/java/com/sqx/config/RedisConfig.java
  10. 26 0
      src/main/java/com/sqx/config/RedissonConfig.java
  11. 1 1
      src/main/java/com/sqx/modules/activity/controller/ActivityPartRecordController.java
  12. 7 0
      src/main/java/com/sqx/modules/activity/service/ActivityPartRecordService.java
  13. 1 0
      src/main/java/com/sqx/modules/activity/service/ActivityService.java
  14. 1 0
      src/main/java/com/sqx/modules/activity/service/ActivityShopService.java
  15. 7 0
      src/main/java/com/sqx/modules/activity/service/impl/ActivityPartRecordServiceImpl.java
  16. 1 0
      src/main/java/com/sqx/modules/activity/service/impl/ActivityServiceImpl.java
  17. 1 1
      src/main/java/com/sqx/modules/activity/service/impl/ActivityShopServiceImpl.java
  18. 2 2
      src/main/java/com/sqx/modules/app/service/UserService.java
  19. 8 4
      src/main/java/com/sqx/modules/app/service/impl/UserMoneyServiceImpl.java
  20. 1 4
      src/main/java/com/sqx/modules/app/service/impl/UserServiceImpl.java
  21. 1 0
      src/main/java/com/sqx/modules/banner/service/BannerService.java
  22. 3 2
      src/main/java/com/sqx/modules/chat/service/ChatContentService.java
  23. 2 2
      src/main/java/com/sqx/modules/chat/service/ChatConversationService.java
  24. 2 2
      src/main/java/com/sqx/modules/chat/service/impl/ChatContentServiceImpl.java
  25. 13 18
      src/main/java/com/sqx/modules/chat/service/impl/ChatConversationServiceImpl.java
  26. 14 7
      src/main/java/com/sqx/modules/common/service/impl/CommonInfoServiceImpl.java
  27. 6 6
      src/main/java/com/sqx/modules/coupon/controller/app/AppTbCouponUserController.java
  28. 0 4
      src/main/java/com/sqx/modules/coupon/service/impl/TbCouponServiceImpl.java
  29. 0 1
      src/main/java/com/sqx/modules/coupon/service/impl/TbTbCouponUserServiceImpl.java
  30. 0 1
      src/main/java/com/sqx/modules/datacentre/service/impl/DataCentreServiceImpl.java
  31. 103 42
      src/main/java/com/sqx/modules/errand/controller/app/AppTbIndentController.java
  32. 6 0
      src/main/java/com/sqx/modules/errand/dao/TbIndentDao.java
  33. 25 0
      src/main/java/com/sqx/modules/errand/dto/OrderRiderDeliveryDTO.java
  34. 23 0
      src/main/java/com/sqx/modules/errand/dto/RiderTransferByOrderIdDTO.java
  35. 3 0
      src/main/java/com/sqx/modules/errand/entity/TbIndent.java
  36. 21 3
      src/main/java/com/sqx/modules/errand/service/TbIndentService.java
  37. 0 1
      src/main/java/com/sqx/modules/errand/service/impl/AdminTrainingCenterServiceImpl.java
  38. 0 2
      src/main/java/com/sqx/modules/errand/service/impl/ErrandComplaintServiceImpl.java
  39. 565 267
      src/main/java/com/sqx/modules/errand/service/impl/TbIndentServiceImpl.java
  40. 0 1
      src/main/java/com/sqx/modules/errand/service/impl/UserInfoServiceImpl.java
  41. 1 2
      src/main/java/com/sqx/modules/gameChat/service/ChatContentTcwmService.java
  42. 1 5
      src/main/java/com/sqx/modules/gameChat/service/impl/ChatContentTcwmServiceImpl.java
  43. 0 1
      src/main/java/com/sqx/modules/goods/service/impl/GoodsShopServiceImpl.java
  44. 1 1
      src/main/java/com/sqx/modules/invite/controller/app/AppInviteController.java
  45. 1 0
      src/main/java/com/sqx/modules/invite/service/impl/InviteServiceImpl.java
  46. 1 1
      src/main/java/com/sqx/modules/message/controller/app/AppMessageController.java
  47. 1 0
      src/main/java/com/sqx/modules/message/service/impl/MessageServiceImpl.java
  48. 4 3
      src/main/java/com/sqx/modules/order/controller/OrderController.java
  49. 2 2
      src/main/java/com/sqx/modules/order/controller/app/AppOrderController.java
  50. 4 2
      src/main/java/com/sqx/modules/order/dao/AppOrderDao.java
  51. 12 0
      src/main/java/com/sqx/modules/order/entity/TbOrder.java
  52. 10 2
      src/main/java/com/sqx/modules/order/service/AppOrderService.java
  53. 298 287
      src/main/java/com/sqx/modules/order/service/impl/AppAppOrderServiceImpl.java
  54. 61 61
      src/main/java/com/sqx/modules/order/task/OrderTask.java
  55. 2 2
      src/main/java/com/sqx/modules/oss/controller/SysOssController.java
  56. 1 0
      src/main/java/com/sqx/modules/oss/service/SysOssService.java
  57. 1 1
      src/main/java/com/sqx/modules/oss/service/impl/SysOssServiceImpl.java
  58. 13 13
      src/main/java/com/sqx/modules/pay/controller/CashController.java
  59. 1 1
      src/main/java/com/sqx/modules/pay/controller/app/AppCashController.java
  60. 1 0
      src/main/java/com/sqx/modules/pay/service/PayDetailsService.java
  61. 10 14
      src/main/java/com/sqx/modules/pay/service/impl/CashOutServiceImpl.java
  62. 0 1
      src/main/java/com/sqx/modules/pay/service/impl/PayDetailsServiceImpl.java
  63. 46 37
      src/main/java/com/sqx/modules/pay/service/impl/WxServiceImpl.java
  64. 23 0
      src/main/java/com/sqx/modules/printInfo/controller/PrintInfoController.java
  65. 4 4
      src/main/java/com/sqx/modules/printInfo/entity/eOrderTypeExtra.java
  66. 0 1
      src/main/java/com/sqx/modules/printInfo/service/impl/PrintInfoServiceImpl.java
  67. 2 0
      src/main/java/com/sqx/modules/shop/service/ShopMessageService.java
  68. 39 17
      src/main/java/com/sqx/modules/shop/service/impl/ShopMessageServiceImpl.java
  69. 2 1
      src/main/java/com/sqx/modules/sys/redis/SysConfigRedis.java
  70. 9 8
      src/main/java/com/sqx/modules/sys/service/SysConfigService.java
  71. 1 0
      src/main/java/com/sqx/modules/sys/service/SysLogService.java
  72. 1 1
      src/main/java/com/sqx/modules/sys/service/SysRoleService.java
  73. 3 3
      src/main/java/com/sqx/modules/sys/service/SysUserService.java
  74. 1 1
      src/main/java/com/sqx/modules/sys/service/impl/SysConfigServiceImpl.java
  75. 1 0
      src/main/java/com/sqx/modules/sys/service/impl/SysDictServiceImpl.java
  76. 1 0
      src/main/java/com/sqx/modules/sys/service/impl/SysLogServiceImpl.java
  77. 2 2
      src/main/java/com/sqx/modules/sys/service/impl/SysRoleServiceImpl.java
  78. 4 4
      src/main/java/com/sqx/modules/sys/service/impl/SysUserServiceImpl.java
  79. 65 65
      src/main/java/com/sqx/modules/timedtask/controller/AutoSendOrder.java
  80. 28 12
      src/main/java/com/sqx/modules/utils/SenInfoCheckUtil.java
  81. 292 10
      src/main/java/com/sqx/modules/utils/fieYun/FeiYunUtils.java
  82. 18 0
      src/main/java/com/sqx/scheduler/config/ScheduledConfig.java
  83. 35 0
      src/main/java/com/sqx/scheduler/config/SchedulerLock.java
  84. 48 0
      src/main/java/com/sqx/scheduler/coupon/CouponScheduler.java
  85. 135 0
      src/main/java/com/sqx/scheduler/indent/IndentScheduler.java
  86. 164 0
      src/main/java/com/sqx/scheduler/order/OrderScheduler.java
  87. 13 0
      src/main/resources/application-dev.yml
  88. 14 1
      src/main/resources/application-prod.yml
  89. 4 16
      src/main/resources/application.yml
  90. 1 1
      src/main/resources/mapper/coupon/TbCouponUserMapper.xml
  91. 26 3
      src/main/resources/mapper/errand/TbIndentMapper.xml
  92. 31 2
      src/main/resources/mapper/order/OrderMapper.xml
  93. 39 0
      src/test/java/OrderTest.java

+ 8 - 0
pom.xml

@@ -99,10 +99,18 @@
             <groupId>org.springframework</groupId>
             <artifactId>spring-context-support</artifactId>
         </dependency>
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson</artifactId>
+            <version>3.21.1</version>
+        </dependency>
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-configuration-processor</artifactId>

+ 0 - 2
src/main/java/com/sqx/SecureApiTest.java

@@ -4,8 +4,6 @@ import icu.xuyijie.secureapi.cipher.CipherAlgorithmEnum;
 import icu.xuyijie.secureapi.cipher.CipherUtils;
 
 /**
- * TODO
- *
  * @author : codingliang
  * @date : 2024-08-07 11:01
  */

+ 26 - 11
src/main/java/com/sqx/SqxApplication.java

@@ -1,24 +1,39 @@
 package com.sqx;
 
+import com.sqx.common.utils.MyGlobalThreadPool;
+import org.springframework.boot.CommandLineRunner;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.context.ApplicationEvent;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextClosedEvent;
 
-
-@EnableScheduling
 @SpringBootApplication
-public class SqxApplication {
+public class SqxApplication implements CommandLineRunner, ApplicationListener<ApplicationEvent> {
 
 	public static void main(String[] args) {
 		SpringApplication.run(SqxApplication.class, args);
-		System.out.println("(♥◠‿◠)ノ゙  同城外卖项目启动成功   ლ(´ڡ`ლ)゙  \n"+
-							"       _    \n" +
-							"      | |   \n" +
-							"  ___ | | __\n" +
-							" / _ \\| |/ /\n" +
-							"| (_) |   < \n" +
-							" \\___/|_|\\_\\");
+	}
 
+	@Override
+	public void run(String... args) throws Exception {
+		// 初始化公共线程池
+		MyGlobalThreadPool.init();
+
+		System.out.println("(♥◠‿◠)ノ゙  同城外卖项目启动成功   ლ(´ڡ`ლ)゙  \n"+
+				"       _    \n" +
+				"      | |   \n" +
+				"  ___ | | __\n" +
+				" / _ \\| |/ /\n" +
+				"| (_) |   < \n" +
+				" \\___/|_|\\_\\");
 	}
 
+	@Override
+	public void onApplicationEvent(ApplicationEvent event) {
+		if (event instanceof ContextClosedEvent) {
+			// 应用停止时的操作
+			MyGlobalThreadPool.shutdown(false);
+		}
+	}
 }

+ 1 - 1
src/main/java/com/sqx/common/aspect/RedisAspect.java

@@ -18,7 +18,7 @@ import org.springframework.context.annotation.Configuration;
 public class RedisAspect {
     private Logger logger = LoggerFactory.getLogger(getClass());
     //是否开启redis缓存  true开启   false关闭
-    @Value("${spring.redis.open: false}")
+    @Value("${sqx.redis.open:false}")
     private boolean open;
 
     @Around("execution(* com.sqx.common.utils.RedisUtils.*(..))")

+ 86 - 0
src/main/java/com/sqx/common/constant/RedisKey.java

@@ -0,0 +1,86 @@
+package com.sqx.common.constant;
+
+/**
+ * redis key 管理
+ *
+ * @author : codingliang
+ * @date : 2024-09-09 11:50
+ */
+public interface RedisKey {
+
+    /**
+     * 插入订单锁
+     */
+    String INSERT_ORDER_LOCK = "wm:lock:order:insert:%s-%s";
+
+    /**
+     * 修改订单锁
+     */
+    String UPDATE_ORDER_LOCK = "wm:lock:order:update:%s";
+
+    /**
+     * 完成订单锁
+     */
+    String FINISH_ORDER_LOCK = "wm:lock:order:finish:%s";
+
+    /**
+     * 取消订单锁
+     */
+    String CANCEL_ORDER_LOCK = "wm:lock:order:cancel:%s";
+
+    /**
+     * 订单支付锁
+     */
+    String PAY_ORDER_LOCK = "wm:lock:order:pay:%s";
+
+    /**
+     * 提现锁
+     */
+    String CASH_OUT_LOCK = "wm:lock:cash:out:%s";
+
+    /**
+     * 跑腿订单更新锁
+     */
+    String UPDATE_INDENT_LOCK = "wm:lock:indent:%s";
+
+    /**
+     * 聊天发起锁
+     */
+    String CHAT_CONVERSATIONS_INSERT_LOCK = "wm:lock:chat:add:%s-%s";
+
+    /**
+     * 店铺审核锁
+     */
+    String SHOP_AUTHENTICATION_LOCK = "wm:lock:shop:auth:%s";
+
+    /**
+     * 用户购买vip锁
+     */
+    String USER_BUY_VIP_LOCK = "wm:lock:vip:buy:%s";
+
+    /**
+     * 公共配置缓存key
+     */
+    String COMMON_INFO_CACHE_KEY = "wm:data:common:%s";
+
+    /**
+     * 店铺缓存信息
+     */
+    String SHOP_INFO_CACHE_KEY = "wm:data:shop:%s";
+
+    /**
+     * 用户端小程序token
+     */
+    String MP_TOKEN_CACHE_KEY = "wm:data:wx:user-mp:token";
+
+    /**
+     * 骑手端端小程序token
+     */
+    String MP_OF_RIDER_TOKEN_CACHE_KEY = "wm:data:wx:rider-mp:token";
+
+    /**
+     * 商家端小程序token
+     */
+    String MP_OF_SHOP_TOKEN_CACHE_KEY = "wm:data:wx:shop-mp:token";
+
+}

+ 95 - 0
src/main/java/com/sqx/common/utils/MyGlobalThreadPool.java

@@ -0,0 +1,95 @@
+package com.sqx.common.utils;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import cn.hutool.core.exceptions.UtilException;
+
+/**
+ * 全局公共线程池
+ */
+public class MyGlobalThreadPool {
+	private static ExecutorService executor;
+
+	private MyGlobalThreadPool() {
+	}
+
+	static {
+		init();
+	}
+
+	/**
+	 * 初始化全局线程池
+	 */
+	synchronized public static void init() {
+		if (null != executor) {
+			executor.shutdownNow();
+		}
+		executor = new ThreadPoolExecutor(2, 10, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
+	}
+
+	/**
+	 * 关闭公共线程池
+	 * 
+	 * @param isNow 是否立即关闭而不等待正在执行的线程
+	 */
+	synchronized public static void shutdown(boolean isNow) {
+		if (null != executor) {
+			if (isNow) {
+				executor.shutdownNow();
+			} else {
+				executor.shutdown();
+			}
+		}
+	}
+
+	/**
+	 * 获得 {@link ExecutorService}
+	 * 
+	 * @return {@link ExecutorService}
+	 */
+	public static ExecutorService getExecutor() {
+		return executor;
+	}
+
+	/**
+	 * 直接在公共线程池中执行线程
+	 * 
+	 * @param runnable 可运行对象
+	 */
+	public static void execute(Runnable runnable) {
+		try {
+			executor.execute(runnable);
+		} catch (Exception e) {
+			throw new UtilException(e, "Exception when running task!");
+		}
+	}
+
+	/**
+	 * 执行有返回值的异步方法<br>
+	 * Future代表一个异步执行的操作,通过get()方法可以获得操作的结果,如果异步操作还没有完成,则,get()会使当前线程阻塞
+	 * 
+	 * @param <T> 执行的Task
+	 * @param task {@link Callable}
+	 * @return Future
+	 */
+	public static <T> Future<T> submit(Callable<T> task) {
+		return executor.submit(task);
+	}
+
+	/**
+	 * 执行有返回值的异步方法<br>
+	 * Future代表一个异步执行的操作,通过get()方法可以获得操作的结果,如果异步操作还没有完成,则,get()会使当前线程阻塞
+	 * 
+	 * @param runnable 可运行对象
+	 * @return {@link Future}
+	 * @since 3.0.5
+	 */
+	public static Future<?> submit(Runnable runnable) {
+		return executor.submit(runnable);
+	}
+}

+ 118 - 50
src/main/java/com/sqx/common/utils/RedisUtils.java

@@ -1,10 +1,14 @@
 package com.sqx.common.utils;
 
-import com.google.gson.Gson;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.*;
+import org.springframework.data.redis.core.HashOperations;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.Resource;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -13,78 +17,142 @@ import java.util.concurrent.TimeUnit;
  */
 @Component
 public class RedisUtils {
-    @Autowired
+    @Resource
     private RedisTemplate<String, Object> redisTemplate;
-    @Autowired
-    private ValueOperations<String, String> valueOperations;
-    @Autowired
-    private HashOperations<String, String, Object> hashOperations;
-    @Autowired
-    private ListOperations<String, Object> listOperations;
-    @Autowired
-    private SetOperations<String, Object> setOperations;
-    @Autowired
-    private ZSetOperations<String, Object> zSetOperations;
-    /**  默认过期时长,单位:秒 */
+
+    /**
+     * 默认过期时长为24小时,单位:秒
+     */
     public final static long DEFAULT_EXPIRE = 60 * 60 * 24;
+
+    /**
+     * 过期时长为6小时,单位:秒
+     */
+    public final static long HOUR_SIX_EXPIRE = 60 * 60 * 6L;
+
+    /**
+     * 过期时长为1小时,单位:秒
+     */
+    public final static long HOUR_ONE_EXPIRE = 60 * 60 * 1L;
+
+    /**
+     * 过期时长为半小时,单位:秒
+     */
+    public final static long HALF_HOUR_ONE_EXPIRE = 30 * 60 * 1L;
+
+    /**
+     * 过期时长为10分钟时,单位:秒
+     */
+    public final static long TEN_MINUTE_ONE_EXPIRE = 10 * 60 * 1L;
+
     /**  不设置过期时长 */
     public final static long NOT_EXPIRE = -1;
-    private final static Gson Gson = new Gson();
 
-    public void set(String key, Object value, long expire){
-        valueOperations.set(key, toJson(value));
-        if(expire != NOT_EXPIRE){
-            redisTemplate.expire(key, expire, TimeUnit.SECONDS);
+    public void set(String key, Object value, long expire) {
+        redisTemplate.opsForValue().set(key, value);
+        if (expire != NOT_EXPIRE) {
+            expire(key, expire);
         }
     }
 
-    public void set(String key, Object value){
-        set(key, value, DEFAULT_EXPIRE);
+    public void set(String key, Object value) {
+        redisTemplate.opsForValue().set(key, value);
     }
 
-    public <T> T get(String key, Class<T> clazz, long expire) {
-        String value = valueOperations.get(key);
-        if(expire != NOT_EXPIRE){
-            redisTemplate.expire(key, expire, TimeUnit.SECONDS);
+    public Object get(String key, long expire) {
+        Object value = redisTemplate.opsForValue().get(key);
+        if (expire != NOT_EXPIRE) {
+            expire(key, expire);
         }
-        return value == null ? null : fromJson(value, clazz);
+        return value;
     }
 
-    public <T> T get(String key, Class<T> clazz) {
-        return get(key, clazz, NOT_EXPIRE);
+    public Object get(String key) {
+        return get(key, NOT_EXPIRE);
     }
 
-    public String get(String key, long expire) {
-        String value = valueOperations.get(key);
-        if(expire != NOT_EXPIRE){
-            redisTemplate.expire(key, expire, TimeUnit.SECONDS);
-        }
-        return value;
+    public Long increment(String key) {
+        return redisTemplate.opsForValue().increment(key);
     }
 
-    public String get(String key) {
-        return get(key, NOT_EXPIRE);
+    public Boolean hasKey(String key) {
+        return redisTemplate.hasKey(key);
+    }
+
+    public Set<String> keys(String pattern) {
+        return redisTemplate.keys(pattern);
     }
 
     public void delete(String key) {
         redisTemplate.delete(key);
     }
 
-    /**
-     * Object转成JSON数据
-     */
-    private String toJson(Object object){
-        if(object instanceof Integer || object instanceof Long || object instanceof Float ||
-                object instanceof Double || object instanceof Boolean || object instanceof String){
-            return String.valueOf(object);
+    public void delete(Collection<String> keys) {
+        redisTemplate.delete(keys);
+    }
+
+    public Object hGet(String key, String field) {
+        return redisTemplate.opsForHash().get(key, field);
+    }
+
+    public Map<String, Object> hGetAll(String key) {
+        HashOperations<String, String, Object> hashOperations = redisTemplate.opsForHash();
+        return hashOperations.entries(key);
+    }
+
+    public void hMSet(String key, Map<String, Object> map) {
+        hMSet(key, map, DEFAULT_EXPIRE);
+    }
+
+    public void hMSet(String key, Map<String, Object> map, long expire) {
+        redisTemplate.opsForHash().putAll(key, map);
+
+        if (expire != NOT_EXPIRE) {
+            expire(key, expire);
         }
-        return Gson.toJson(object);
     }
 
-    /**
-     * JSON数据,转成Object
-     */
-    private <T> T fromJson(String json, Class<T> clazz){
-        return Gson.fromJson(json, clazz);
+    public void hSet(String key, String field, Object value) {
+        hSet(key, field, value, DEFAULT_EXPIRE);
+    }
+
+    public void hSet(String key, String field, Object value, long expire) {
+        redisTemplate.opsForHash().put(key, field, value);
+
+        if (expire != NOT_EXPIRE) {
+            expire(key, expire);
+        }
+    }
+
+    public void expire(String key, long expire) {
+        redisTemplate.expire(key, expire, TimeUnit.SECONDS);
+    }
+
+    public void expireAt(String key, Date expire) {
+        redisTemplate.expireAt(key, expire);
+    }
+
+    public Long getExpire(String key) {
+        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
+    }
+
+    public void hDel(String key, Object... fields) {
+        redisTemplate.opsForHash().delete(key, fields);
+    }
+
+    public void leftPush(String key, Object value) {
+        leftPush(key, value, DEFAULT_EXPIRE);
+    }
+
+    public void leftPush(String key, Object value, long expire) {
+        redisTemplate.opsForList().leftPush(key, value);
+
+        if (expire != NOT_EXPIRE) {
+            expire(key, expire);
+        }
+    }
+
+    public Object rightPop(String key) {
+        return redisTemplate.opsForList().rightPop(key);
     }
 }

+ 10 - 7
src/main/java/com/sqx/common/xss/XssFilter.java

@@ -1,8 +1,11 @@
 package com.sqx.common.xss;
 
-import org.apache.http.HttpStatus;
-
-import javax.servlet.*;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
@@ -20,10 +23,10 @@ public class XssFilter implements Filter {
 	@Override
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
             throws IOException, ServletException {
-		HttpServletRequest hreq = (HttpServletRequest) request;
-		String requestURI = hreq.getRequestURI();
-		String method = hreq.getMethod();
-		System.err.println("当前请求的方法是:"+method+",请求地址是:"+requestURI);
+		// HttpServletRequest hreq = (HttpServletRequest) request;
+		// String requestURI = hreq.getRequestURI();
+		// String method = hreq.getMethod();
+		// System.err.println("当前请求的方法是:"+method+",请求地址是:"+requestURI);
 
 		HttpServletResponse hresp = (HttpServletResponse) response;
 

+ 24 - 32
src/main/java/com/sqx/config/RedisConfig.java

@@ -1,11 +1,15 @@
 package com.sqx.config;
 
-import org.springframework.beans.factory.annotation.Autowired;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.data.redis.connection.RedisConnectionFactory;
-import org.springframework.data.redis.core.*;
-import org.springframework.data.redis.serializer.StringRedisSerializer;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializer;
 
 /**
  * Redis配置
@@ -13,42 +17,30 @@ import org.springframework.data.redis.serializer.StringRedisSerializer;
  */
 @Configuration
 public class RedisConfig {
-    @Autowired
-    private RedisConnectionFactory factory;
 
-    @Bean
-    public RedisTemplate<String, Object> redisTemplate() {
-        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
-        redisTemplate.setKeySerializer(new StringRedisSerializer());
-        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
-        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
-        redisTemplate.setValueSerializer(new StringRedisSerializer());
-        redisTemplate.setConnectionFactory(factory);
-        return redisTemplate;
-    }
+    public GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer() {
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+        objectMapper.registerModule(new JavaTimeModule());
+        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
 
-    @Bean
-    public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
-        return redisTemplate.opsForHash();
+        return new GenericJackson2JsonRedisSerializer(objectMapper);
     }
 
     @Bean
-    public ValueOperations<String, String> valueOperations(RedisTemplate<String, String> redisTemplate) {
-        return redisTemplate.opsForValue();
-    }
+    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
+        RedisTemplate<String, Object> template = new RedisTemplate<>();
+        // Key HashKey使用String序列化
+        template.setKeySerializer(RedisSerializer.string());
+        template.setHashKeySerializer(RedisSerializer.string());
 
-    @Bean
-    public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
-        return redisTemplate.opsForList();
-    }
+        // Value HashValue使用Json序列化
+        template.setValueSerializer(genericJackson2JsonRedisSerializer());
+        template.setHashValueSerializer(genericJackson2JsonRedisSerializer());
 
-    @Bean
-    public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
-        return redisTemplate.opsForSet();
-    }
+        template.setConnectionFactory(factory);
 
-    @Bean
-    public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
-        return redisTemplate.opsForZSet();
+        template.afterPropertiesSet();
+        return template;
     }
 }

+ 26 - 0
src/main/java/com/sqx/config/RedissonConfig.java

@@ -0,0 +1,26 @@
+package com.sqx.config;
+
+import org.redisson.Redisson;
+import org.redisson.api.RedissonClient;
+import org.redisson.config.Config;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * redisson配置
+ *
+ * @auther: codingliang
+ * @date: 2023-10-19 13:20
+ * @description: redisson配置
+ */
+@Configuration
+public class RedissonConfig {
+
+    @Bean
+    public RedissonClient redissonClient(@Value("${spring.redis.host}") String url, @Value("${spring.redis.password}") String password, @Value("${spring.redis.port}") String port) {
+        Config config = new Config();
+        config.useSingleServer().setUsername("default").setPassword(password).setAddress("redis://" + url + ":" + port);
+        return Redisson.create(config);
+    }
+}

+ 1 - 1
src/main/java/com/sqx/modules/activity/controller/ActivityPartRecordController.java

@@ -24,7 +24,7 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping("admin/activity-part-record")
 @RequiredArgsConstructor
 public class ActivityPartRecordController{
-    
+
     private final ActivityPartRecordService activityPartRecordService;
 
     @GetMapping("page")

+ 7 - 0
src/main/java/com/sqx/modules/activity/service/ActivityPartRecordService.java

@@ -25,4 +25,11 @@ public interface ActivityPartRecordService extends IService<ActivityPartRecord>
     void saveByOrderAndSuitActivityVO(TbOrder order, OrderSuitActivityVO orderBestActivity);
 
     ActivityPartRecordVO getVoById(Long recordId);
+
+    /**
+     * 根据订单id查询
+     * @param orderId 订单id
+     * @return 活动参与信息
+     */
+    ActivityPartRecord getByOrderId(Long orderId);
 }

+ 1 - 0
src/main/java/com/sqx/modules/activity/service/ActivityService.java

@@ -9,6 +9,7 @@ import com.sqx.modules.activity.entity.Activity;
 import com.sqx.modules.activity.vo.ActivityOrderVO;
 import com.sqx.modules.activity.vo.ActivityVO;
 import com.sqx.modules.activity.vo.OrderSuitActivityVO;
+import org.apache.poi.ss.formula.functions.T;
 
 import java.util.List;
 

+ 1 - 0
src/main/java/com/sqx/modules/activity/service/ActivityShopService.java

@@ -9,6 +9,7 @@ import com.sqx.modules.activity.dto.QuitActivityDTO;
 import com.sqx.modules.activity.entity.ActivityShop;
 import com.sqx.modules.activity.vo.ShopActivityGroupVO;
 import com.sqx.modules.activity.vo.ShopActivityVO;
+import org.apache.poi.ss.formula.functions.T;
 
 import java.util.List;
 

+ 7 - 0
src/main/java/com/sqx/modules/activity/service/impl/ActivityPartRecordServiceImpl.java

@@ -60,4 +60,11 @@ public class ActivityPartRecordServiceImpl extends ServiceImpl<ActivityPartRecor
     public ActivityPartRecordVO getVoById(Long recordId) {
         return baseMapper.getVoById(recordId);
     }
+
+    @Override
+    public ActivityPartRecord getByOrderId(Long orderId) {
+        LambdaQueryWrapper<ActivityPartRecord> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(ActivityPartRecord::getOrderId, orderId);
+        return this.getOne(queryWrapper);
+    }
 }

+ 1 - 0
src/main/java/com/sqx/modules/activity/service/impl/ActivityServiceImpl.java

@@ -36,6 +36,7 @@ import com.sqx.modules.order.entity.OrderGoods;
 import com.sqx.modules.order.entity.TbOrder;
 import com.sqx.modules.order.service.AppOrderService;
 import lombok.RequiredArgsConstructor;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;

+ 1 - 1
src/main/java/com/sqx/modules/activity/service/impl/ActivityShopServiceImpl.java

@@ -146,7 +146,7 @@ public class ActivityShopServiceImpl extends ServiceImpl<ActivityShopDao, Activi
             List<ActivityShop> waitDelList = oldActivityShops.stream().filter(e -> !existActivityIds.contains(e.getActivityId())).collect(Collectors.toList());
 
             if (waitDelList.size() > 0) {
-                this.removeByIds(waitDelList);
+                this.removeByIds(waitDelList.stream().map(ActivityShop::getId).collect(Collectors.toList()));
             }
         }
 

+ 2 - 2
src/main/java/com/sqx/modules/app/service/UserService.java

@@ -8,7 +8,7 @@ import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
 import com.sqx.modules.app.entity.UserEntity;
 import com.sqx.modules.errand.entity.Feedback;
-import org.springframework.web.bind.annotation.RequestParam;
+import org.apache.poi.ss.formula.functions.T;
 
 import java.util.List;
 import java.util.Map;
@@ -202,7 +202,7 @@ public interface UserService extends IService<UserEntity> {
     void pushToSingleShop(String title, String content, String clientId);
 
     PageUtils selectUserPage(Integer page, Integer limit, String search, Integer sex, String platform, String sysPhone,
-                             Integer status, Integer type, String userName, Integer isVip, Integer shopAdminFlag,String nickName);
+                                Integer status, Integer type, String userName, Integer isVip, Integer shopAdminFlag, String nickName);
 
     int queryInviterCount(String inviterCode);
 

+ 8 - 4
src/main/java/com/sqx/modules/app/service/impl/UserMoneyServiceImpl.java

@@ -6,11 +6,16 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
-import com.sqx.modules.app.dao.*;
-import com.sqx.modules.app.entity.*;
+import com.sqx.modules.app.dao.UserDao;
+import com.sqx.modules.app.dao.UserMoneyDao;
+import com.sqx.modules.app.dao.UserMoneyDetailsDao;
+import com.sqx.modules.app.dao.UserVipDao;
+import com.sqx.modules.app.dao.VipDetailsDao;
+import com.sqx.modules.app.entity.UserEntity;
+import com.sqx.modules.app.entity.UserMoney;
+import com.sqx.modules.app.entity.UserMoneyDetails;
 import com.sqx.modules.app.service.UserMoneyDetailsService;
 import com.sqx.modules.app.service.UserMoneyService;
-
 import com.sqx.modules.common.entity.CommonInfo;
 import com.sqx.modules.common.service.CommonInfoService;
 import com.sqx.modules.order.entity.TbOrder;
@@ -22,7 +27,6 @@ import org.springframework.stereotype.Service;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
-import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 

+ 1 - 4
src/main/java/com/sqx/modules/app/service/impl/UserServiceImpl.java

@@ -1,6 +1,5 @@
 package com.sqx.modules.app.service.impl;
 
-import cn.hutool.system.UserInfo;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONException;
 import com.alibaba.fastjson.JSONObject;
@@ -44,7 +43,6 @@ import com.sqx.modules.app.entity.UserMoney;
 import com.sqx.modules.app.service.UserService;
 import com.sqx.modules.app.utils.JwtUtils;
 import com.sqx.modules.app.utils.UserConstantInterface;
-import com.sqx.modules.chats.utils.ResultUtil;
 import com.sqx.modules.common.entity.CommonInfo;
 import com.sqx.modules.common.service.CommonInfoService;
 import com.sqx.modules.errand.entity.Feedback;
@@ -56,7 +54,6 @@ import com.sqx.modules.message.entity.MessageInfo;
 import com.sqx.modules.message.service.MessageService;
 import com.sqx.modules.utils.HttpClientUtil;
 import com.sqx.modules.utils.InvitationCodeUtil;
-import com.sqx.modules.utils.MD5Util;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.lang.StringUtils;
@@ -1035,7 +1032,7 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements
 
     @Override
     public PageUtils selectUserPage(Integer page, Integer limit, String search, Integer sex, String platform, String sysPhone, Integer status,
-                                    Integer type, String userName, Integer isVip, Integer shopAdminFlag, String nickName) {
+                                       Integer type, String userName, Integer isVip, Integer shopAdminFlag, String nickName) {
         Page<UserEntity> pages = new Page<>(page, limit);
         return new PageUtils(baseMapper.selectUserPage(pages, search, sex, platform, sysPhone, status, type, userName, isVip, shopAdminFlag, nickName));
     }

+ 1 - 0
src/main/java/com/sqx/modules/banner/service/BannerService.java

@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
 import com.sqx.modules.banner.entity.Banner;
+import org.apache.poi.ss.formula.functions.T;
 
 import java.util.List;
 

+ 3 - 2
src/main/java/com/sqx/modules/chat/service/ChatContentService.java

@@ -4,13 +4,14 @@ package com.sqx.modules.chat.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.modules.chat.entity.ChatContent;
+import org.apache.poi.ss.formula.functions.T;
 
 public interface ChatContentService  extends IService<ChatContent> {
 
-    PageUtils selectChatContentPage(Integer page, Integer limit, Long chatConversationId, String content,String userName,String phone);
+    PageUtils selectChatContentPage(Integer page, Integer limit, Long chatConversationId, String content, String userName, String phone);
 
     int updateChatContentStatusByUserIdAndChatId(Long userId,Long chatConversationId);
 
     int selectChatCount(Long userId);
 
-}
+}

+ 2 - 2
src/main/java/com/sqx/modules/chat/service/ChatConversationService.java

@@ -8,7 +8,7 @@ import com.sqx.modules.chat.entity.ChatConversation;
 
 public interface ChatConversationService extends IService<ChatConversation> {
 
-    PageUtils selectChatConversationPage(Integer page, Integer limit, Long userId, String nickName,String content);
+    PageUtils selectChatConversationPage(Integer page, Integer limit, Long userId, String nickName, String content);
 
     int insertChatConversation(ChatConversation chatConversation);
 
@@ -16,4 +16,4 @@ public interface ChatConversationService extends IService<ChatConversation> {
 
     Result insertChatConversations(ChatConversation chatConversation);
 
-}
+}

+ 2 - 2
src/main/java/com/sqx/modules/chat/service/impl/ChatContentServiceImpl.java

@@ -14,7 +14,7 @@ public class ChatContentServiceImpl extends ServiceImpl<ChatContentDao, ChatCont
 
 
     @Override
-    public PageUtils selectChatContentPage(Integer page, Integer limit, Long chatConversationId, String content,String userName,String phone) {
+    public PageUtils selectChatContentPage(Integer page, Integer limit, Long chatConversationId, String content, String userName, String phone) {
         return new PageUtils(baseMapper.selectChatContentPage(new Page<>(page,limit),chatConversationId,content,userName,phone));
     }
 
@@ -28,4 +28,4 @@ public class ChatContentServiceImpl extends ServiceImpl<ChatContentDao, ChatCont
         return baseMapper.selectChatCount(userId);
     }
 
-}
+}

+ 13 - 18
src/main/java/com/sqx/modules/chat/service/impl/ChatConversationServiceImpl.java

@@ -3,6 +3,7 @@ package com.sqx.modules.chat.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sqx.common.constant.RedisKey;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
 import com.sqx.modules.app.entity.UserEntity;
@@ -13,29 +14,30 @@ import com.sqx.modules.chat.entity.ChatConversation;
 import com.sqx.modules.chat.service.ChatContentService;
 import com.sqx.modules.chat.service.ChatConversationService;
 import org.apache.commons.lang.StringUtils;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.text.SimpleDateFormat;
 import java.util.Date;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
 
 @Service
 public class ChatConversationServiceImpl extends ServiceImpl<ChatConversationDao, ChatConversation> implements ChatConversationService {
 
-    private ReentrantReadWriteLock reentrantReadWriteLock=new ReentrantReadWriteLock();
     @Autowired
     private UserService userService;
     @Autowired
     private ChatContentService chatContentService;
+    @Resource
+    private RedissonClient redissonClient;
 
     @Override
-    public PageUtils selectChatConversationPage(Integer page, Integer limit, Long userId, String nickName,String content){
+    public PageUtils selectChatConversationPage(Integer page, Integer limit, Long userId, String nickName, String content){
         return new PageUtils(baseMapper.selectChatConversationPage(new Page<>(page,limit),userId,nickName,content));
     }
 
-
     @Override
     public int insertChatConversation(ChatConversation chatConversation) {
         return baseMapper.insertChatConversation(chatConversation);
@@ -50,11 +52,11 @@ public class ChatConversationServiceImpl extends ServiceImpl<ChatConversationDao
         return baseMapper.selectOne(new QueryWrapper<ChatConversation>().eq("focused_user_id", userId).eq("user_id", focusedUserId));
     }
 
-
     @Override
     public Result insertChatConversations(ChatConversation chatConversation){
-        reentrantReadWriteLock.writeLock().lock();
-        try{
+        RLock lock = redissonClient.getLock(String.format(RedisKey.CHAT_CONVERSATIONS_INSERT_LOCK, chatConversation.getUserId(), chatConversation.getFocusedUserId()));
+        lock.lock();
+        try {
             ChatConversation chatConversation1 = selectChatConversation(chatConversation.getUserId(), chatConversation.getFocusedUserId());
             if(chatConversation1==null){
                 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@@ -76,15 +78,8 @@ public class ChatConversationServiceImpl extends ServiceImpl<ChatConversationDao
                 return Result.success().put("data",chatConversation);
             }
             return Result.success().put("data",chatConversation1);
-        }catch (Exception e){
-            e.printStackTrace();
-            log.error("发起聊天出错"+e.getMessage(),e);
-        }finally {
-            reentrantReadWriteLock.writeLock().unlock();
+        } finally {
+            lock.unlock();
         }
-        return Result.error("系统繁忙,请稍后再试");
     }
-
-
-
-}
+}

+ 14 - 7
src/main/java/com/sqx/modules/common/service/impl/CommonInfoServiceImpl.java

@@ -1,11 +1,14 @@
 package com.sqx.modules.common.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sqx.common.constant.RedisKey;
+import com.sqx.common.utils.RedisUtils;
 import com.sqx.common.utils.Result;
 import com.sqx.modules.common.dao.CommonInfoDao;
 import com.sqx.modules.common.entity.CommonInfo;
 import com.sqx.modules.common.service.CommonInfoService;
-import org.springframework.beans.factory.annotation.Autowired;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
 import java.text.SimpleDateFormat;
@@ -16,15 +19,12 @@ import java.util.Date;
  * @date 2020/7/8
  */
 @Service
+@RequiredArgsConstructor
 public class CommonInfoServiceImpl extends ServiceImpl<CommonInfoDao, CommonInfo> implements CommonInfoService {
 
-
     private final CommonInfoDao commonInfoDao;
 
-    @Autowired
-    public CommonInfoServiceImpl(CommonInfoDao commonInfoDao) {
-        this.commonInfoDao = commonInfoDao;
-    }
+    private final RedisUtils redisUtils;
 
     @Override
     public Result update(CommonInfo commonInfo) {
@@ -38,7 +38,14 @@ public class CommonInfoServiceImpl extends ServiceImpl<CommonInfoDao, CommonInfo
 
     @Override
     public CommonInfo findOne(int id) {
-        return commonInfoDao.findOne(id);
+        String key = String.format(RedisKey.COMMON_INFO_CACHE_KEY, id);
+        CommonInfo commonInfo = (CommonInfo) redisUtils.get(key);
+        if (ObjectUtil.isNull(commonInfo)) {
+            commonInfo = commonInfoDao.findOne(id);
+
+            redisUtils.set(key, commonInfo);
+        }
+        return commonInfo;
     }
 
     @Override

+ 6 - 6
src/main/java/com/sqx/modules/coupon/controller/app/AppTbCouponUserController.java

@@ -65,12 +65,12 @@ public class AppTbCouponUserController extends AbstractController {
     }
 
 
-    //将所有超过失效时间的优惠券改为失效状态
-    @Scheduled(cron = "0 */1 * * * ?", zone = "Asia/Shanghai")
-    public void couponEnd(){
-
-        tbCouponUserService.updateExpiration();
-    }
+    // //将所有超过失效时间的优惠券改为失效状态
+    // @Scheduled(cron = "0 */1 * * * ?", zone = "Asia/Shanghai")
+    // public void couponEnd(){
+    //
+    //     tbCouponUserService.updateExpiration();
+    // }
 
 
 }

+ 0 - 4
src/main/java/com/sqx/modules/coupon/service/impl/TbCouponServiceImpl.java

@@ -5,20 +5,16 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
-import com.sqx.modules.app.entity.UserMoneyDetails;
 import com.sqx.modules.coupon.dao.TbCouponDao;
 import com.sqx.modules.coupon.dao.TbCouponUserDao;
 import com.sqx.modules.coupon.entity.TbCoupon;
-import com.sqx.modules.coupon.entity.TbCouponUser;
 import com.sqx.modules.coupon.service.TbCouponService;
 import com.sqx.modules.datacentre.entity.SysUserShop;
-import com.sqx.modules.goods.entity.GoodsShop;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.List;

+ 0 - 1
src/main/java/com/sqx/modules/coupon/service/impl/TbTbCouponUserServiceImpl.java

@@ -15,7 +15,6 @@ import com.sqx.modules.integral.dao.UserIntegralDao;
 import com.sqx.modules.integral.dao.UserIntegralDetailsDao;
 import com.sqx.modules.integral.entity.UserIntegral;
 import com.sqx.modules.integral.entity.UserIntegralDetails;
-import com.sqx.modules.integral.service.UserIntegralService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;

+ 0 - 1
src/main/java/com/sqx/modules/datacentre/service/impl/DataCentreServiceImpl.java

@@ -33,7 +33,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;

+ 103 - 42
src/main/java/com/sqx/modules/errand/controller/app/AppTbIndentController.java

@@ -7,9 +7,7 @@ import com.sqx.modules.app.annotation.Login;
 import com.sqx.modules.app.entity.UserEntity;
 import com.sqx.modules.app.service.UserService;
 import com.sqx.modules.common.service.CommonInfoService;
-import com.sqx.modules.errand.dto.RiderDeliveryDTO;
-import com.sqx.modules.errand.dto.RiderTransferOrderDTO;
-import com.sqx.modules.errand.dto.WaitForAcceptOrderQueryDTO;
+import com.sqx.modules.errand.dto.*;
 import com.sqx.modules.errand.entity.ErrandAddress;
 import com.sqx.modules.errand.entity.ErrandComplaint;
 import com.sqx.modules.errand.entity.ErrandEvaluate;
@@ -22,6 +20,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.apache.commons.lang.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -52,7 +51,7 @@ public class AppTbIndentController {
     @Login
     @PostMapping(value = "distance")
     @ApiOperation("根据经纬度计算两点之间距离")
-    public Result distance(double ol, double od, double dl, double dd){
+    public Result distance(double ol, double od, double dl, double dd) {
 
         return tbIndentService.distance(ol, od, dl, dd);
     }
@@ -60,7 +59,7 @@ public class AppTbIndentController {
     @Login
     @ApiOperation("保存用户输入地址")
     @PostMapping(value = "addUserAddress")
-    public Result addUserAddress(@RequestAttribute Long userId, @RequestBody ErrandAddress errandAddress){
+    public Result addUserAddress(@RequestAttribute Long userId, @RequestBody ErrandAddress errandAddress) {
 
         return tbIndentService.addUserAddress(userId, errandAddress);
     }
@@ -68,7 +67,7 @@ public class AppTbIndentController {
     @Login
     @ApiOperation("编辑地址")
     @PostMapping(value = "updateAddress")
-    public Result updateAddress(@RequestAttribute Long userId, @RequestBody ErrandAddress errandAddress){
+    public Result updateAddress(@RequestAttribute Long userId, @RequestBody ErrandAddress errandAddress) {
 
         return tbIndentService.updateAddress(userId, errandAddress);
     }
@@ -76,7 +75,7 @@ public class AppTbIndentController {
     @Login
     @ApiOperation("获取用户历史地址")
     @GetMapping(value = "findUserAddress")
-    public Result findUserAddress(@RequestAttribute Long userId){
+    public Result findUserAddress(@RequestAttribute Long userId) {
 
         return tbIndentService.findUserAddress(userId);
     }
@@ -84,7 +83,7 @@ public class AppTbIndentController {
     @Login
     @ApiOperation("根据地址id获取地址信息")
     @GetMapping(value = "findAddressById")
-    public Result findAddressById(@RequestAttribute Long userId, Integer addressId){
+    public Result findAddressById(@RequestAttribute Long userId, Integer addressId) {
 
         return tbIndentService.findAddressById(userId, addressId);
     }
@@ -92,7 +91,7 @@ public class AppTbIndentController {
     @Login
     @ApiOperation("设置默认地址")
     @GetMapping(value = "addDefaultAddress")
-    private Result addDefaultAddress(@RequestAttribute Long userId, Integer addressId){
+    private Result addDefaultAddress(@RequestAttribute Long userId, Integer addressId) {
 
         return tbIndentService.addDefaultAddress(userId, addressId);
     }
@@ -100,7 +99,7 @@ public class AppTbIndentController {
     @Login
     @ApiOperation("删除历史地址")
     @GetMapping(value = "delUserAddress")
-    public Result delUserAddress(@RequestAttribute Long userId, Integer addressId){
+    public Result delUserAddress(@RequestAttribute Long userId, Integer addressId) {
 
         return tbIndentService.delUserAddress(userId, addressId);
     }
@@ -108,7 +107,7 @@ public class AppTbIndentController {
     @Login
     @ApiOperation("获取订单起点附近5公里内所有骑手")
     @GetMapping(value = "find5KmRider")
-    public Result find5KmRider(double lng, double lat){
+    public Result find5KmRider(double lng, double lat) {
 
         return tbIndentService.find5KmRider(lng, lat);
     }
@@ -116,17 +115,16 @@ public class AppTbIndentController {
     @Login
     @ApiOperation("骑手上线时更新骑手坐标")
     @PostMapping(value = "updateCoordinate")
-    public Result updateCoordinate(@RequestAttribute Long userId, double lng, double lat){
+    public Result updateCoordinate(@RequestAttribute Long userId, double lng, double lat) {
 
         return tbIndentService.updateCoordinate(userId, lng, lat);
     }
 
 
-
     @Login
     @GetMapping(value = "/findUserInfoById")
     @ApiOperation("获取登陆用户信息")
-    public Result findUserInfoById(@RequestAttribute("userId") Long userId){
+    public Result findUserInfoById(@RequestAttribute("userId") Long userId) {
         UserEntity userEntity = tbIndentService.findUserInfoById(userId);
 
         return Result.success().put("data", userEntity);
@@ -135,7 +133,7 @@ public class AppTbIndentController {
     @Login
     @ApiOperation("新用户领取新人红包")
     @GetMapping(value = "getNewUserRedPacket")
-    public Result getNewUserRedPacket(@RequestAttribute Long userId){
+    public Result getNewUserRedPacket(@RequestAttribute Long userId) {
 
         return tbIndentService.getNewUserRedPacket(userId);
     }
@@ -143,7 +141,7 @@ public class AppTbIndentController {
     @Login
     @GetMapping(value = "findAllRedPacket")
     @ApiOperation("获取该用户的所有红包")
-    public Result findAllRedPacket(@RequestAttribute Long userId){
+    public Result findAllRedPacket(@RequestAttribute Long userId) {
         List<ErrandRedPacket> allRedPacket = tbIndentService.findAllRedPacket(userId);
         return Result.success().put("data", allRedPacket);
     }
@@ -151,7 +149,7 @@ public class AppTbIndentController {
     @Login
     @PostMapping(value = "findRedPacket")
     @ApiOperation("获取用户可用红包")
-    public Result findRedPacket(@RequestAttribute Long userId, @RequestBody TbIndent indent){
+    public Result findRedPacket(@RequestAttribute Long userId, @RequestBody TbIndent indent) {
         List<ErrandRedPacket> redPackets = tbIndentService.findRedPacket(userId, indent);
         return Result.success().put("data", redPackets);
     }
@@ -159,15 +157,15 @@ public class AppTbIndentController {
     @Login
     @PostMapping(value = "basicsMoney")
     @ApiOperation("计算订单基础价格")
-    public Result basicsMoney(@RequestBody TbIndent tbIndent){
+    public Result basicsMoney(@RequestBody TbIndent tbIndent) {
 
-        return Result.success().put("data",tbIndentService.basicsMoney(tbIndent));
+        return Result.success().put("data", tbIndentService.basicsMoney(tbIndent));
     }
 
     @Login
     @PostMapping(value = "addIndent")
     @ApiOperation("用户下单")
-    public Result addIndentBuy(@RequestAttribute Long userId, @RequestBody TbIndent tbIndent){
+    public Result addIndentBuy(@RequestAttribute Long userId, @RequestBody TbIndent tbIndent) {
         tbIndent.setUserId(userId);
         return tbIndentService.addIndentBuy(tbIndent);
     }
@@ -175,7 +173,7 @@ public class AppTbIndentController {
     @Login
     @PostMapping(value = "findNewIndent")
     @ApiOperation("骑手查看可接订单")
-    public Result findNewIndent(@RequestAttribute Long userId, @RequestBody TbIndent tbIndent){
+    public Result findNewIndent(@RequestAttribute Long userId, @RequestBody TbIndent tbIndent) {
         String receivingPettern = tbIndent.getReceivingPettern();
         double riderlat = tbIndent.getRiderlat();
         double riderlng = tbIndent.getRiderlng();
@@ -189,7 +187,7 @@ public class AppTbIndentController {
     @Login
     @PostMapping(value = "find-new-indent")
     @ApiOperation("骑手查看可接订单(新)")
-    public Result findNewIndent(@Valid @RequestBody WaitForAcceptOrderQueryDTO queryDTO){
+    public Result findNewIndent(@Valid @RequestBody WaitForAcceptOrderQueryDTO queryDTO) {
         PageUtils newIndent = tbIndentService.findNewIndent(queryDTO);
         return Result.success().put("data", newIndent);
     }
@@ -197,7 +195,7 @@ public class AppTbIndentController {
     @Login
     @PostMapping(value = "find-new-indent-group-by-shop")
     @ApiOperation("骑手查看可接订单(按商家分组)")
-    public Result findNewIndentGroupByShop(@Valid @RequestBody WaitForAcceptOrderQueryDTO queryDTO){
+    public Result findNewIndentGroupByShop(@Valid @RequestBody WaitForAcceptOrderQueryDTO queryDTO) {
         PageUtils newIndent = tbIndentService.findNewIndentGroupByShop(queryDTO);
         return Result.success().put("data", newIndent);
     }
@@ -205,7 +203,7 @@ public class AppTbIndentController {
     @Login
     @PostMapping(value = "indentReceiving")
     @ApiOperation("骑手接单")
-    public Result indentReceiving(@RequestAttribute Long userId, String indentNumber){
+    public Result indentReceiving(@RequestAttribute Long userId, String indentNumber) {
 
         return tbIndentService.indentReceiving(userId, indentNumber);
     }
@@ -213,7 +211,7 @@ public class AppTbIndentController {
     @Login
     @PostMapping(value = "riderBuyGoods")
     @ApiOperation("骑手修改订单状态")
-    public Result riderBuyGoods(@RequestBody TbIndent tbIndent){
+    public Result riderBuyGoods(@RequestBody TbIndent tbIndent) {
 
         return tbIndentService.riderBuyGoods(tbIndent);
     }
@@ -221,9 +219,9 @@ public class AppTbIndentController {
     @Login
     @GetMapping(value = "findUserIndent")
     @ApiOperation("用户查看自己所有订单(全部、待付款、待接单、派送中(已接单未完成)、已完成)")
-    public Result findUserIndent(@RequestAttribute Long userId, Integer page, Integer limit,String indentState){
+    public Result findUserIndent(@RequestAttribute Long userId, Integer page, Integer limit, String indentState) {
 
-        return tbIndentService.findUserIndent(userId, page, limit,indentState);
+        return tbIndentService.findUserIndent(userId, page, limit, indentState);
     }
 
 
@@ -237,7 +235,7 @@ public class AppTbIndentController {
     @Login
     @PostMapping(value = "userCancleIndent")
     @ApiOperation("用户取消订单")
-    public Result userCancleIndent(@RequestAttribute Long userId, String indentNumber){
+    public Result userCancleIndent(@RequestAttribute Long userId, String indentNumber) {
 
         return tbIndentService.userCancleIndent(userId, indentNumber);
     }
@@ -245,7 +243,7 @@ public class AppTbIndentController {
     @Login
     @GetMapping(value = "findRiderIndent")
     @ApiOperation("骑手查看自己所有订单")
-    public Result findRiderIndent(@RequestAttribute Long userId, Integer page, Integer limit, String indentState){
+    public Result findRiderIndent(@RequestAttribute Long userId, Integer page, Integer limit, String indentState) {
 
         return tbIndentService.findRiderIndent(userId, page, limit, indentState);
     }
@@ -268,15 +266,15 @@ public class AppTbIndentController {
     @Login
     @PostMapping(value = "riderCancleIndent")
     @ApiOperation("骑手取消订单")
-    public Result riderCancleIndent( String indentNumber){
-        return tbIndentService.riderCancleIndent(indentNumber,1);
+    public Result riderCancleIndent(String indentNumber) {
+        return tbIndentService.riderCancleIndent(indentNumber, 1);
     }
 
     //骑手已送达
     @Login
     @PostMapping(value = "riderDelivery")
     @ApiOperation("骑手已送达")
-    public Result riderDelivery(@RequestAttribute Long userId, @Valid @RequestBody RiderDeliveryDTO riderDeliveryDTO){
+    public Result riderDelivery(@RequestAttribute Long userId, @Valid @RequestBody RiderDeliveryDTO riderDeliveryDTO) {
 
         return tbIndentService.riderDelivery(userId, riderDeliveryDTO);
     }
@@ -293,7 +291,7 @@ public class AppTbIndentController {
     @Login
     @PostMapping(value = "userDelivery")
     @ApiOperation("用户确认已送达")
-    public Result userDelivery(@RequestAttribute Long userId, String indentNumber){
+    public Result userDelivery(@RequestAttribute Long userId, String indentNumber) {
 
         return tbIndentService.userDelivery(userId, indentNumber);
     }
@@ -301,14 +299,14 @@ public class AppTbIndentController {
     @Login
     @PostMapping(value = "userEvaluate")
     @ApiOperation("用户评价(评价等级和内容)")
-    public Result userEvaluate(@RequestAttribute Long userId, @RequestBody ErrandEvaluate errandEvaluate){
+    public Result userEvaluate(@RequestAttribute Long userId, @RequestBody ErrandEvaluate errandEvaluate) {
         errandEvaluate.setUserId(userId);
         return tbIndentService.userEvaluate(errandEvaluate);
     }
 
     @ApiOperation("用户投诉订单")
     @PostMapping(value = "insertComplaint")
-    public Result insertComplaint(@RequestBody ErrandComplaint errandComplaint){
+    public Result insertComplaint(@RequestBody ErrandComplaint errandComplaint) {
 
         return errandComplaintService.insertComplaint(errandComplaint);
     }
@@ -316,7 +314,7 @@ public class AppTbIndentController {
     @Login
     @ApiOperation("用户查看所有投诉")
     @GetMapping(value = "selectComplaint")
-    public Result selectComplaint(@RequestAttribute Long userId, Integer page, Integer limit){
+    public Result selectComplaint(@RequestAttribute Long userId, Integer page, Integer limit) {
 
         return errandComplaintService.selectComplaint(userId, page, limit);
     }
@@ -324,23 +322,23 @@ public class AppTbIndentController {
     @Login
     @GetMapping(value = "findAllComplaint")
     @ApiOperation("骑手查看自己的所有被投诉")
-    public Result findAllComplaint(@RequestAttribute Long userId, Integer illegalId, Integer complaintState, Integer page, Integer limit){
+    public Result findAllComplaint(@RequestAttribute Long userId, Integer illegalId, Integer complaintState, Integer page, Integer limit) {
 
-        return errandComplaintService.findAllComplaint(userId,illegalId, complaintState, page, limit);
+        return errandComplaintService.findAllComplaint(userId, illegalId, complaintState, page, limit);
     }
 
     @Login
     @GetMapping(value = "findComplaint")
     @ApiOperation("骑手查看被投诉内容")
-    public Result findComplaint(@RequestAttribute Long userId, Long complaintId){
+    public Result findComplaint(@RequestAttribute Long userId, Long complaintId) {
 
-        return errandComplaintService.findComplaint(userId,complaintId);
+        return errandComplaintService.findComplaint(userId, complaintId);
     }
 
     @Login
     @PostMapping(value = "appealIndent")
     @ApiOperation("骑手提交申诉")
-    public Result appealIndent(@RequestAttribute Long userId, @RequestBody ErrandComplaint errandComplaint){
+    public Result appealIndent(@RequestAttribute Long userId, @RequestBody ErrandComplaint errandComplaint) {
 
         return errandComplaintService.appealIndent(userId, errandComplaint);
     }
@@ -352,7 +350,7 @@ public class AppTbIndentController {
     @Login
     @ApiOperation("转单")
     @PostMapping("/transferOfOrder")
-    public Result transferOfOrder(@RequestAttribute Long userId, @Valid RiderTransferOrderDTO transferOrderDTO){
+    public Result transferOfOrder(@RequestAttribute Long userId, @Valid RiderTransferOrderDTO transferOrderDTO) {
         // 检查入参
         checkTransferOrderParam(transferOrderDTO);
 
@@ -379,4 +377,67 @@ public class AppTbIndentController {
             throw new SqxException("待分配骑手手机号和待分配骑手真实姓名不能同时为空");
         }
     }
+
+
+    //region 2024-09-12 A-jax 添加接口
+    //region 1、根据订单id查询跑腿订单的信息;
+    @Login
+    @GetMapping("selectTbIndentPage")
+    @ApiOperation("扫码或收单码查询跑腿订单列表(带分页")
+    public Result selectMemberPage(@RequestAttribute Long userId, Integer page, Integer limit, String acquireCode) {
+        //如果只有一条数据就看看数据是否能被当前骑手接
+        PageUtils datas = tbIndentService.selectIndentPage(page, limit, acquireCode, userId);
+        if (datas.getTotalCount() == 1) {
+            //校验当前骑手是否能接单
+            Result checkData = tbIndentService.checkIndent(userId, acquireCode);
+            if((int)checkData.get("code") != 0){
+                return Result.error("当前订单无法接单");
+            }
+        }
+
+        return Result.success().put("data",datas);
+    }
+    //endregion
+
+    //region 2、根据订单id抢单(跑腿订单) 以及取货按钮功能;
+    @Login
+    @PostMapping(value = "orderIndentReceiving")
+    @ApiOperation("骑手根据扫码或收单码接单")
+    public Result orderIndentReceiving(@RequestAttribute Long userId, String acquireCode) {
+
+        return tbIndentService.orderIndentReceiving(userId, acquireCode);
+    }
+    //endregion
+
+    //region 3、根据订单id完成跑腿订单。
+    @Login
+    @PostMapping(value = "orderRiderDelivery")
+    @ApiOperation("骑手根据扫码或收单码完成订单")
+    public Result orderRiderDelivery(@RequestAttribute Long userId, @Valid @RequestBody OrderRiderDeliveryDTO orderRiderDeliveryDTO) {
+
+        return tbIndentService.orderRiderDelivery(userId, orderRiderDeliveryDTO);
+    }
+    //endregion
+
+    //region 转单
+    @Login
+    @ApiOperation("根据订单ID进行转单操作")
+    @PostMapping("transferByOrderId")
+    public Result transferByOrderId(@RequestAttribute Long userId, @Valid RiderTransferByOrderIdDTO transferByOrderIdDTO) {
+        // 检查入参
+        checkTransferByOrderIdParam(transferByOrderIdDTO);
+
+        tbIndentService.transferByOrderId(userId, transferByOrderIdDTO);
+
+        return Result.success();
+    }
+
+    private void checkTransferByOrderIdParam(RiderTransferByOrderIdDTO transferOrderDTO) {
+        if (StringUtils.isBlank(transferOrderDTO.getPhone()) && StringUtils.isBlank(transferOrderDTO.getRealName())) {
+            throw new SqxException("待分配骑手手机号和待分配骑手真实姓名不能同时为空");
+        }
+    }
+    //endregion
+    //endregion
+
 }

+ 6 - 0
src/main/java/com/sqx/modules/errand/dao/TbIndentDao.java

@@ -31,12 +31,18 @@ public interface TbIndentDao extends BaseMapper<TbIndent> {
 
     TbIndent findIndentByNumber(String indentNumber);
 
+    TbIndent findIndentByOrderId(String orderId);
+
     int selectIndentByRiderUserCount(Long riderUserId);
 
     void indentReceiving(Long userId, String indentNumber, String format);
 
     void indentReceiv(Long userId, String indentNumber, String format,String state);
 
+    void orderIndentReceiving(Long userId, String orderId, String format);
+
+    void orderIndentReceiv(Long userId, String orderId, String format,String state);
+
     IPage<TbIndent> findRiderIndent(Page<TbIndent> pages, Long userId, String indentState);
 
     TbIndent indentRiderMessage(String indentNumber, double riderLng, double riderLat);

+ 25 - 0
src/main/java/com/sqx/modules/errand/dto/OrderRiderDeliveryDTO.java

@@ -0,0 +1,25 @@
+package com.sqx.modules.errand.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 骑手送达dto
+ */
+@Data
+@ApiModel("OrderRiderDeliveryDTO")
+public class OrderRiderDeliveryDTO {
+
+    @ApiModelProperty(value = "扫码或收单码", required = true)
+    @NotBlank(message = "扫码或收单码不能为空")
+    private String acquireCode;
+
+    @ApiModelProperty(value = "短信模板id,外卖订单该值不能为空")
+    private Long smsTemplateId;
+
+    @ApiModelProperty(value = "图片地址,多个图片使用,分割,外卖订单该值不能为空")
+    private String imgs;
+}

+ 23 - 0
src/main/java/com/sqx/modules/errand/dto/RiderTransferByOrderIdDTO.java

@@ -0,0 +1,23 @@
+package com.sqx.modules.errand.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel("骑手转单dto")
+public class RiderTransferByOrderIdDTO {
+
+    @ApiModelProperty(value = "取单码", required = true)
+    @NotBlank(message = "取单码不能为空")
+    private String acquireCode;
+
+    @ApiModelProperty("待分配骑手手机号,待分配骑手手机号和待分配骑手真实姓名不能同时为空")
+    private String phone;
+
+    @ApiModelProperty("待分配骑手真实姓名,待分配骑手手机号和待分配骑手真实姓名不能同时为空")
+    private String realName;
+}

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

@@ -138,6 +138,9 @@ public class TbIndent implements Serializable {
     @ApiModelProperty("收货码")
     private String orderCode;
 
+    @ApiModelProperty("订单支付顺序号")
+    private String orderPaySequence;
+
     @ApiModelProperty("备注")
     private String remarks;
 

+ 21 - 3
src/main/java/com/sqx/modules/errand/service/TbIndentService.java

@@ -4,9 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
 import com.sqx.modules.app.entity.UserEntity;
-import com.sqx.modules.errand.dto.RiderDeliveryDTO;
-import com.sqx.modules.errand.dto.RiderTransferOrderDTO;
-import com.sqx.modules.errand.dto.WaitForAcceptOrderQueryDTO;
+import com.sqx.modules.errand.dto.*;
 import com.sqx.modules.errand.entity.ErrandAddress;
 import com.sqx.modules.errand.entity.ErrandEvaluate;
 import com.sqx.modules.errand.entity.ErrandRedPacket;
@@ -31,6 +29,8 @@ public interface TbIndentService extends IService<TbIndent> {
 
     Result indentReceiving(Long userId, String indentNumber);
 
+    Result orderIndentReceiving(Long userId, String acquireCode);
+
     Result riderBuyGoods(TbIndent tbIndent);
 
     Result findRiderIndent(Long userId, Integer page, Integer limit, String indentState);
@@ -41,6 +41,8 @@ public interface TbIndentService extends IService<TbIndent> {
 
     Result riderDelivery(Long userId, RiderDeliveryDTO deliveryDTO);
 
+    Result orderRiderDelivery(Long userId, OrderRiderDeliveryDTO orderDeliveryDTO);
+
     Result userDelivery(Long userId, String indentNumber);
 
     Result userEvaluate(ErrandEvaluate errandEvaluate);
@@ -115,6 +117,22 @@ public interface TbIndentService extends IService<TbIndent> {
     void transferOfOrder(Long userId, RiderTransferOrderDTO transferOrderDTO);
 
     /**
+     * 骑手转单
+     * @param userId 当前用户id
+     * @param transferOrderDTO dto
+     */
+    void transferByOrderId(Long userId, RiderTransferByOrderIdDTO transferOrderDTO);
+
+    //region 2024-09-12 A-jax 添加方法
+    //获取跑腿订单分页数据
+    PageUtils selectIndentPage(Integer page, Integer limit, String acquireCode, Long userId);
+
+    //校验订单是否能接
+    Result checkIndent(Long userId, String orderId);
+
+    //endregion
+
+    /**
      * 骑手上次签收照片
      * @param userId 用户id
      * @param indentNumber 跑腿订单号

+ 0 - 1
src/main/java/com/sqx/modules/errand/service/impl/AdminTrainingCenterServiceImpl.java

@@ -6,7 +6,6 @@ import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
 import com.sqx.modules.errand.dao.AdminTrainingCenterDao;
 import com.sqx.modules.errand.dao.UserInfoDao;
-import com.sqx.modules.errand.entity.TbIndent;
 import com.sqx.modules.errand.entity.TrainingCenter;
 import com.sqx.modules.errand.service.AdminTrainingCenterService;
 import org.springframework.beans.factory.annotation.Autowired;

+ 0 - 2
src/main/java/com/sqx/modules/errand/service/impl/ErrandComplaintServiceImpl.java

@@ -16,7 +16,6 @@ import com.sqx.modules.errand.dao.ShopIllegalTypeDao;
 import com.sqx.modules.errand.dao.TbIndentDao;
 import com.sqx.modules.errand.entity.ErrandComplaint;
 import com.sqx.modules.errand.entity.ErrandIllegalType;
-import com.sqx.modules.errand.entity.ShopIllegalType;
 import com.sqx.modules.errand.entity.TbIndent;
 import com.sqx.modules.errand.service.ErrandComplaintService;
 import com.sqx.modules.order.entity.TbOrder;
@@ -26,7 +25,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.sql.Timestamp;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 

Разлика између датотеке није приказан због своје велике величине
+ 565 - 267
src/main/java/com/sqx/modules/errand/service/impl/TbIndentServiceImpl.java


+ 0 - 1
src/main/java/com/sqx/modules/errand/service/impl/UserInfoServiceImpl.java

@@ -21,7 +21,6 @@ import com.sqx.modules.errand.entity.ErrandRedPacket;
 import com.sqx.modules.errand.entity.Feedback;
 import com.sqx.modules.errand.entity.TbIndent;
 import com.sqx.modules.errand.service.UserInfoService;
-import com.sqx.modules.order.entity.Evaluate;
 import com.sqx.modules.pay.dao.PayDetailsDao;
 import com.sqx.modules.pay.service.CashOutService;
 import com.sqx.modules.utils.VerifyIdCardUtils;

+ 1 - 2
src/main/java/com/sqx/modules/gameChat/service/ChatContentTcwmService.java

@@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
 import com.sqx.modules.gameChat.entity.ChatContentTcwm;
-import org.springframework.stereotype.Service;
 
 
 public interface ChatContentTcwmService extends IService<ChatContentTcwm> {
@@ -29,4 +28,4 @@ public interface ChatContentTcwmService extends IService<ChatContentTcwm> {
     Result selectAllUnreadCount(Long userId, Long riderUserId, Long shopId);
 
     Result updateShopAllUnreadCount(Long userId, Long riderUserId, Long shopId);
-}
+}

+ 1 - 5
src/main/java/com/sqx/modules/gameChat/service/impl/ChatContentTcwmServiceImpl.java

@@ -9,12 +9,8 @@ import com.sqx.modules.gameChat.dao.ChatContentTcwmDao;
 import com.sqx.modules.gameChat.entity.ChatContentTcwm;
 import com.sqx.modules.gameChat.service.ChatContentTcwmService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 
-import java.util.Map;
-
 
 @Service
 public class ChatContentTcwmServiceImpl extends ServiceImpl<ChatContentTcwmDao, ChatContentTcwm> implements ChatContentTcwmService {
@@ -102,4 +98,4 @@ public class ChatContentTcwmServiceImpl extends ServiceImpl<ChatContentTcwmDao,
         return Result.success();
     }
 
-}
+}

+ 0 - 1
src/main/java/com/sqx/modules/goods/service/impl/GoodsShopServiceImpl.java

@@ -36,7 +36,6 @@ import com.sqx.modules.order.dao.AppOrderDao;
 import com.sqx.modules.order.dao.OrderGoodsDao;
 import com.sqx.modules.order.entity.OrderGoods;
 import com.sqx.modules.order.entity.TbOrder;
-import com.sqx.modules.shop.entity.ShopType;
 import com.sqx.modules.shop.service.ShopMessageService;
 import com.sqx.modules.shop.service.ShopTypeService;
 import com.sqx.modules.sys.dao.SysUserDao;

+ 1 - 1
src/main/java/com/sqx/modules/invite/controller/app/AppInviteController.java

@@ -95,4 +95,4 @@ public class AppInviteController {
         return Result.success().put("data",pageUtils);
     }
 
-}
+}

+ 1 - 0
src/main/java/com/sqx/modules/invite/service/impl/InviteServiceImpl.java

@@ -17,6 +17,7 @@ import com.sqx.modules.invite.service.InviteService;
 import com.sqx.modules.message.entity.MessageInfo;
 import com.sqx.modules.message.service.MessageService;
 import org.apache.commons.lang.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;

+ 1 - 1
src/main/java/com/sqx/modules/message/controller/app/AppMessageController.java

@@ -66,4 +66,4 @@ public class AppMessageController {
 
 
 
-}
+}

+ 1 - 0
src/main/java/com/sqx/modules/message/service/impl/MessageServiceImpl.java

@@ -10,6 +10,7 @@ import com.sqx.common.utils.Result;
 import com.sqx.modules.message.dao.MessageInfoDao;
 import com.sqx.modules.message.entity.MessageInfo;
 import com.sqx.modules.message.service.MessageService;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 

+ 4 - 3
src/main/java/com/sqx/modules/order/controller/OrderController.java

@@ -45,9 +45,10 @@ public class OrderController extends AbstractController {
     @ApiOperation("条件查询所有订单(管理端)")
     @GetMapping(value = "selectAllOrderAdmin")
     public Result selectAllOrderAdmin(Integer page, Integer limit, Integer status, String phone, Long shopId, String userName,
-                                      String orderNumber,
-                                      @ApiParam("1上门 2骑手配送 3商家配送 不传查所有") Integer orderType, String shopName, String riderPhone, String startTime, String endTime){
-        return appOrderService.selectAllOrderAdmin(page, limit, status, phone, shopId, userName, orderNumber, orderType,shopName,riderPhone,startTime,endTime);
+                                      String orderNumber, String indentStatus, String reservationFlag,
+                                      @ApiParam("1上门 2骑手配送 3商家配送 不传查所有") Integer orderType,
+                                      String shopName, String riderPhone, String startTime, String endTime, String payStartTime, String payEndTime){
+        return appOrderService.selectAllOrderAdmin(page, limit, status, phone, shopId, userName, orderNumber, orderType, shopName, riderPhone, indentStatus, reservationFlag, startTime, endTime, payStartTime, payEndTime);
     }
 
     @GetMapping("excelOrder")

+ 2 - 2
src/main/java/com/sqx/modules/order/controller/app/AppOrderController.java

@@ -29,8 +29,8 @@ public class AppOrderController {
     @ApiOperation("生成订单(未结算状态)")
     @PostMapping(value = "/insertOrder")
     public Result insertOrder(@RequestAttribute Long userId, Long shopId, Long goodsId, Integer num, Long skuId, String skuMessage, Integer orderType){
-
-        return appOrderService.insertOrder(userId, shopId, goodsId, num, skuId, skuMessage, orderType);
+        appOrderService.insertOrder(userId, shopId, goodsId, num, skuId, skuMessage, orderType);
+        return Result.success();
     }
 
     @Login

+ 4 - 2
src/main/java/com/sqx/modules/order/dao/AppOrderDao.java

@@ -26,8 +26,8 @@ public interface AppOrderDao extends BaseMapper<TbOrder> {
 
     IPage<TbOrder> selectAllOrderAdmin(Page<TbOrder> pages,@Param("status") Integer status,@Param("phone") String phone, @Param("shopId") Long shopId,
                                @Param("userName") String userName, @Param("orderNumber") String orderNumber,@Param("orderType") Integer orderType,
-                                       @Param("shopName")String shopName,@Param("riderPhone") String riderPhone,
-                                       @Param("startTime") String startTime,@Param("endTime") String endTime);
+                                       @Param("shopName")String shopName,@Param("riderPhone") String riderPhone, @Param("indentStatus") String indentStatus, @Param("reservationFlag") String reservationFlag,
+                                       @Param("startTime") String startTime,@Param("endTime") String endTime, @Param("payStartTime") String payStartTime, @Param("payEndTime") String payEndTime);
 
     List<TbOrder> excelAllOrderAdmin(@Param("status") Integer status,@Param("phone") String phone, @Param("shopId") Long shopId,
                                        @Param("userName") String userName, @Param("orderNumber") String orderNumber,
@@ -96,4 +96,6 @@ public interface AppOrderDao extends BaseMapper<TbOrder> {
      * @return 未完成订单数
      */
     int countUnFinishByShopId(@Param("shopId") Long shopId);
+
+    int countCurDayPayByShopId(@Param("shopId") Long shopId, @Param("payTime") String payTime);
 }

+ 12 - 0
src/main/java/com/sqx/modules/order/entity/TbOrder.java

@@ -144,6 +144,9 @@ public class TbOrder implements Serializable {
     @ApiModelProperty("期待送达时间")
     private Date expectDeliveryTime;
 
+    @ApiModelProperty("订单顺序号(当天)")
+    private String orderSequence;
+
     @ApiModelProperty("商铺名")
     @TableField(exist = false)
     private String shopName;
@@ -203,6 +206,15 @@ public class TbOrder implements Serializable {
     private String indentNumber;
 
     @TableField(exist = false)
+    private String indentState;
+
+    @TableField(exist = false)
+    private BigDecimal activityDiscountAmount;
+
+    @TableField(exist = false)
+    private String activityTitle;
+
+    @TableField(exist = false)
     private Long riderUserId;
 
     @TableField(exist = false)

+ 10 - 2
src/main/java/com/sqx/modules/order/service/AppOrderService.java

@@ -10,11 +10,12 @@ import com.sqx.modules.order.entity.TbOrder;
 import com.sqx.modules.pay.dto.PayOrderDTO;
 import com.sqx.modules.utils.excel.ExcelData;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 public interface AppOrderService extends IService<TbOrder> {
 
-    Result insertOrder(Long userId, Long shopId, Long goodsId, Integer num, Long skuId, String skuMessage, Integer orderType);
+    void insertOrder(Long userId, Long shopId, Long goodsId, Integer num, Long skuId, String skuMessage, Integer orderType);
 
     Result print(Long orderId);
 
@@ -29,7 +30,7 @@ public interface AppOrderService extends IService<TbOrder> {
     Result selectAllOrder(Integer page, Integer limit, Integer status, String phone, Long shopId, String userName, String orderNumber, Integer orderType,String shopName);
 
     Result selectAllOrderAdmin(Integer page, Integer limit, Integer status, String phone, Long shopId, String userName,
-                               String orderNumber, Integer orderType,String shopName,String riderPhone, String startTime, String endTime);
+                               String orderNumber, Integer orderType,String shopName,String riderPhone, String indentStatus, String reservationFlag, String startTime, String endTime, String payStartTime, String payEndTime);
 
     ExcelData excelAllOrderAdmin(Integer status, String phone, Long shopId,
                                  String userName, String orderNumber, Integer orderType, String shopName,
@@ -160,4 +161,11 @@ public interface AppOrderService extends IService<TbOrder> {
      * @return 订单id集合
      */
     List<Long> getCurWaitReceivingOrderIds();
+
+    /**
+     * 获取 datetime 前正在制作中的订单
+     * @param datetime 时间
+     * @return 订单列表
+     */
+    List<TbOrder> getProdIngOrders(LocalDateTime datetime);
 }

+ 298 - 287
src/main/java/com/sqx/modules/order/service/impl/AppAppOrderServiceImpl.java

@@ -11,13 +11,16 @@ 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.constant.RedisKey;
 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.MyGlobalThreadPool;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
+import com.sqx.modules.activity.entity.ActivityPartRecord;
 import com.sqx.modules.activity.service.ActivityPartRecordService;
 import com.sqx.modules.activity.service.ActivityService;
 import com.sqx.modules.activity.vo.OrderSuitActivityVO;
@@ -77,13 +80,18 @@ 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.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.TransactionStatus;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.DefaultTransactionDefinition;
 
+import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -96,7 +104,6 @@ import java.util.Calendar;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 @Service
 @Slf4j
@@ -160,21 +167,106 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
     private TbIndentSmsSendLogService smsSendLogService;
     @Autowired
     private TbIndentSmsTemplateService smsTemplateService;
+    @Autowired
+    private PlatformTransactionManager transactionManager;
+
+    @Resource
+    private RedissonClient redissonClient;
 
-    private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true);
+    private static final DateTimeFormatter DTF = DateTimeFormatter.ofPattern(DateUtils.TIME_PATTERN1);
 
     @Override
-    public Result insertOrder(Long userId, Long shopId, Long goodsId, Integer num, Long skuId, String skuMessage, Integer orderType) {
-        reentrantReadWriteLock.writeLock().lock();
+    public void insertOrder(Long userId, Long shopId, Long goodsId, Integer num, Long skuId, String skuMessage, Integer orderType) {
+        // 判断当前时间是否在店铺营业范围内
+        if (!isShopBusinessTime(shopId)) {
+            throw new SqxException("店铺已打烊!");
+        }
+
+        //先判断该商品的库存是否足够
+        GoodsShopRelevancy goodsShopRelevancy = goodsShopRelevancyDao.selectOne(new QueryWrapper<GoodsShopRelevancy>().eq("shop_id", shopId).eq("goods_id", goodsId));
+        if (goodsShopRelevancy.getInventory() < num) {
+            throw new SqxException("该商品库存不足!");
+        }
+
+        RLock lock = redissonClient.getLock(String.format(RedisKey.INSERT_ORDER_LOCK, userId, shopId));
+        lock.lock();
         try {
-            return addOrder(userId, shopId, goodsId, num, skuId, skuMessage, orderType);
-        } catch (Exception e) {
-            e.printStackTrace();
-            log.error("下单异常:" + e.getMessage(), e);
+            TbOrder order = appOrderDao.selectOne(new QueryWrapper<TbOrder>().eq("user_id", userId).eq("shop_id", shopId).eq("status", 1));
+            Goods goods = goodsDao.selectById(goodsId);
+            String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+
+            // 开启编程式事务
+            TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
+            if (order == null) {
+                UserEntity userEntity = userDao.selectById(userId);
+                TbOrder tbOrder = new TbOrder();
+                tbOrder.setUserId(userId);
+                tbOrder.setUserName(userEntity.getUserName());
+                tbOrder.setPhone(userEntity.getPhone());
+                tbOrder.setOrderNumber(getGeneralOrder());
+                tbOrder.setIsPay(0);
+                tbOrder.setDeleteFlag(0);
+                tbOrder.setStatus(1);
+                tbOrder.setShopId(shopId);
+                //创建订单,订单发起人就是该登录用户
+                tbOrder.setParentUserId(userId);
+                tbOrder.setCreateTime(format);
+                tbOrder.setAddGoodsTime(format);
+                appOrderDao.insertOrder(tbOrder);
+
+                TbOrder tbOrder1 = new TbOrder();
+                tbOrder1.setOrderId(tbOrder.getOrderId());
+                tbOrder1.setParentId(tbOrder.getOrderId());
+                appOrderDao.updateById(tbOrder1);
+                //添加订单-商品表
+                Long orderId = tbOrder.getOrderId();
+                OrderGoods orderGoods = new OrderGoods();
+                orderGoods.setOrderId(orderId);
+                orderGoods.setGoodsName(goods.getGoodsName());
+                orderGoods.setSkuId(skuId);
+                GoodsSku goodsSku = goodsSkuDao.selectById(skuId);
+                orderGoods.setGoodsPrice(goodsSku.getSkuPrice());
+                orderGoods.setSkuMessage(skuMessage);
+                orderGoods.setGoodsNum(num);
+                orderGoods.setGoodsPack(goods.getPackMoney());
+                orderGoods.setGoodsPicture(goods.getGoodsCover());
+                orderGoods.setGoodsId(goods.getGoodsId());
+                orderGoods.setUserId(userId);
+                orderGoodsDao.insert(orderGoods);
+            } else {
+                //添加订单-商品表
+                Long orderId = order.getOrderId();
+                OrderGoods orderGoods = orderGoodsDao.selectOne(new QueryWrapper<OrderGoods>().eq("order_id", orderId).eq("goods_id", goods.getGoodsId()).eq("sku_id", skuId).eq("user_id", userId));
+                if (orderGoods != null) {
+                    orderGoods.setGoodsNum(orderGoods.getGoodsNum() + 1);
+                    orderGoodsDao.updateById(orderGoods);
+                } else {
+                    orderGoods = new OrderGoods();
+                    orderGoods.setOrderId(orderId);
+                    orderGoods.setGoodsName(goods.getGoodsName());
+                    orderGoods.setSkuId(skuId);
+                    GoodsSku goodsSku = goodsSkuDao.selectById(skuId);
+                    orderGoods.setGoodsPrice(goodsSku.getSkuPrice());
+                    orderGoods.setSkuMessage(skuMessage);
+                    orderGoods.setGoodsNum(num);
+                    orderGoods.setGoodsPack(goods.getPackMoney());
+                    orderGoods.setGoodsPicture(goods.getGoodsCover());
+                    orderGoods.setGoodsId(goods.getGoodsId());
+                    orderGoods.setUserId(userId);
+                    orderGoodsDao.insert(orderGoods);
+                }
+                //修改订单表最后一次添加商品的时间
+                TbOrder tbOrder1 = new TbOrder();
+                tbOrder1.setOrderId(orderId);
+                tbOrder1.setAddGoodsTime(format);
+                appOrderDao.updateById(tbOrder1);
+            }
+
+            // 在锁中提交事务
+            transactionManager.commit(status);
         } finally {
-            reentrantReadWriteLock.writeLock().unlock();
+            lock.unlock();
         }
-        return Result.error("系统繁忙,请稍后再试!");
     }
 
     /**
@@ -200,91 +292,6 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         return now.isAfter(LocalTime.parse(businessHours)) && now.isBefore(LocalTime.parse(lockHours));
     }
 
-    @Transactional
-    public Result addOrder(Long userId, Long shopId, Long goodsId, Integer num, Long skuId, String skuMessage, Integer orderType) {
-        // 判断当前时间是否在店铺营业范围内
-        if (!isShopBusinessTime(shopId)) {
-            return Result.error("店铺已打烊!");
-        }
-
-        //先判断该商品的库存是否足够
-        GoodsShopRelevancy goodsShopRelevancy = goodsShopRelevancyDao.selectOne(new QueryWrapper<GoodsShopRelevancy>().eq("shop_id", shopId).eq("goods_id", goodsId));
-        if (goodsShopRelevancy.getInventory() < num) {
-            return Result.error("该商品库存不足!");
-        }
-        TbOrder order = new TbOrder();
-        order = appOrderDao.selectOne(new QueryWrapper<TbOrder>()
-                .eq("user_id", userId).eq("shop_id", shopId).eq("status", 1));
-        Goods goods = goodsDao.selectById(goodsId);
-        UserEntity userEntity = userDao.selectById(userId);
-        TbOrder tbOrder = new TbOrder();
-        String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
-        if (order == null) {
-            tbOrder.setUserId(userId);
-            tbOrder.setUserName(userEntity.getUserName());
-            tbOrder.setPhone(userEntity.getPhone());
-            tbOrder.setOrderNumber(getGeneralOrder());
-            tbOrder.setIsPay(0);
-            tbOrder.setDeleteFlag(0);
-            tbOrder.setStatus(1);
-            tbOrder.setShopId(shopId);
-            //创建订单,订单发起人就是该登录用户
-            tbOrder.setParentUserId(userId);
-            tbOrder.setCreateTime(format);
-            tbOrder.setAddGoodsTime(format);
-            appOrderDao.insertOrder(tbOrder);
-
-            TbOrder tbOrder1 = new TbOrder();
-            tbOrder1.setOrderId(tbOrder.getOrderId());
-            tbOrder1.setParentId(tbOrder.getOrderId());
-            appOrderDao.updateById(tbOrder1);
-            //添加订单-商品表
-            Long orderId = tbOrder.getOrderId();
-            OrderGoods orderGoods = new OrderGoods();
-            orderGoods.setOrderId(orderId);
-            orderGoods.setGoodsName(goods.getGoodsName());
-            orderGoods.setSkuId(skuId);
-            GoodsSku goodsSku = goodsSkuDao.selectById(skuId);
-            orderGoods.setGoodsPrice(goodsSku.getSkuPrice());
-            orderGoods.setSkuMessage(skuMessage);
-            orderGoods.setGoodsNum(num);
-            orderGoods.setGoodsPack(goods.getPackMoney());
-            orderGoods.setGoodsPicture(goods.getGoodsCover());
-            orderGoods.setGoodsId(goods.getGoodsId());
-            orderGoods.setUserId(userId);
-            orderGoodsDao.insert(orderGoods);
-        } else {
-            //添加订单-商品表
-            Long orderId = order.getOrderId();
-            OrderGoods orderGoods = orderGoodsDao.selectOne(new QueryWrapper<OrderGoods>().eq("order_id", orderId).eq("goods_id", goods.getGoodsId()).eq("sku_id", skuId).eq("user_id", userId));
-            if (orderGoods != null) {
-                orderGoods.setGoodsNum(orderGoods.getGoodsNum() + 1);
-                orderGoodsDao.updateById(orderGoods);
-            } else {
-                orderGoods = new OrderGoods();
-                orderGoods.setOrderId(orderId);
-                orderGoods.setGoodsName(goods.getGoodsName());
-                orderGoods.setSkuId(skuId);
-                GoodsSku goodsSku = goodsSkuDao.selectById(skuId);
-                orderGoods.setGoodsPrice(goodsSku.getSkuPrice());
-                orderGoods.setSkuMessage(skuMessage);
-                orderGoods.setGoodsNum(num);
-                orderGoods.setGoodsPack(goods.getPackMoney());
-                orderGoods.setGoodsPicture(goods.getGoodsCover());
-                orderGoods.setGoodsId(goods.getGoodsId());
-                orderGoods.setUserId(userId);
-                orderGoodsDao.insert(orderGoods);
-            }
-            //修改订单表最后一次添加商品的时间
-            TbOrder tbOrder1 = new TbOrder();
-            tbOrder1.setOrderId(orderId);
-            tbOrder1.setAddGoodsTime(format);
-            appOrderDao.updateById(tbOrder1);
-        }
-        return Result.success();
-    }
-
-
     @Override
     public Result shareTheBill(Long userId, Long shopId) {
         // 判断当前时间是否在店铺营业范围内
@@ -368,8 +375,6 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
             pages = new Page<>();
         }
         return evaluateDao.getEvaluateList(pages, evaluate);
-
-
     }
 
     @Override
@@ -392,6 +397,10 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
             throw new SqxException("无效的订单id");
         }
 
+        if (parentOrder.getIsPay() == 1) {
+            throw new SqxException("当前订单已支付,请勿重复支付!");
+        }
+
         // 获取店铺信息
         // 注意:调用shopMessageService获取店铺信息,这个service对店铺的抽成比例有特殊处理(历史代码就是如此/(ㄒoㄒ)/~~)
         GoodsShop goodsShop = shopMessageService.selectShopId(parentOrder.getShopId());
@@ -423,8 +432,6 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         return parentOrder;
     }
 
-    private static final DateTimeFormatter DTF = DateTimeFormatter.ofPattern(DateUtils.TIME_PATTERN1);
-
     /**
      * 校验订单类型
      */
@@ -550,14 +557,22 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         order.setPayTime(currentTimeStr);
 
         // 店铺信息
-        GoodsShop goodsShop = goodsShopDao.selectById(order.getShopId());
+        GoodsShop goodsShop = shopMessageService.getShopInfoById(order.getShopId());
+
         // 小程序推送设置
         CommonInfo mpPushConfig = commonInfoService.findOne(269);
+
         // 用户信息
         UserEntity userEntity = userDao.selectById(order.getUserId());
 
         // 添加消息记录并且进行推送
-        addOrderMessageAndPush(order, goodsShop, mpPushConfig, userEntity);
+        MyGlobalThreadPool.execute(() -> {
+            try {
+                addOrderMessageAndPush(order, goodsShop, mpPushConfig, userEntity);
+            } catch (Exception e) {
+                log.error("订单:{},订单支付成功通知发送失败,失败原因:{}", e);
+            }
+        });
 
         // 是否自动接单
         boolean autoAccept = goodsShop.getAutoAcceptOrder() != null && goodsShop.getAutoAcceptOrder() == 0;
@@ -574,6 +589,9 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
             order.setStatus(7);
         }
 
+        // 计算订单顺序号
+        order.setOrderSequence(String.format("%04d", selectCurrentOrderSequenceByShopId(order, order.getShopId())));
+
         // 更新订单状态
         updateById(order);
 
@@ -592,25 +610,34 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
             tbIndentService.insertIndent(order);
 
             // 发送商家接单通知
-            sendOrderAcceptMessage(order, goodsShop, mpPushConfig, userEntity);
+            MyGlobalThreadPool.execute(() -> {
+                try {
+                    sendOrderAcceptMessage(order, goodsShop, mpPushConfig, userEntity);
+                } catch (Exception e) {
+                    log.error("订单:{},商家接单通知发送失败,失败原因:{}", e);
+                }
+            });
+
         }
 
         // 订单已接单或者当前订单为预约订单时打印小票
         if (order.getStatus() == 6 || reservationFlag) {
             // 打印小票
             if (StringUtils.isNotEmpty(goodsShop.getSnCode())) {
-                // 查询当天店铺所有已支付的订单号,按支付时间排序
-                int sequence = selectCurrentOrderSequenceByShopId(order, goodsShop.getShopId());
-                order.setCountOrder(sequence);
-
-                // 设置订单商品
-                List<OrderGoods> orderGoodsList = orderGoodsDao.selectList(new QueryWrapper<OrderGoods>().eq("order_id", order.getOrderId()));
-                order.setOrderGoodsList(orderGoodsList);
-
-                // 设置店铺名称
-                order.setShopName(goodsShop.getShopName());
-
-                FeiYunUtils.print(goodsShop.getSnCode(), null, order);
+                MyGlobalThreadPool.execute(() -> {
+                    try {
+                        // 设置订单商品
+                        List<OrderGoods> orderGoodsList = orderGoodsDao.selectList(new QueryWrapper<OrderGoods>().eq("order_id", order.getOrderId()));
+                        order.setOrderGoodsList(orderGoodsList);
+
+                        // 设置店铺名称
+                        order.setShopName(goodsShop.getShopName());
+
+                        FeiYunUtils.print(goodsShop.getSnCode(), null, order);
+                    } catch (Exception e) {
+                        log.error("订单:{},小票打印失败,失败原因:{}", e);
+                    }
+                });
             }
         }
     }
@@ -800,7 +827,9 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         userMsgList.add(goodsShop.getShopName());
         userMsgList.add(currentDateStr);
         SenInfoCheckUtil.sendMsg(userEntity.getOpenId(), mpPushConfig.getValue(), userMsgList,1);
-        userService.pushToSingle("下单成功", "亲爱的用户您好,您已下单成功,请等待商家接单!", userEntity.getClientid());
+
+        // 无个推
+        // userService.pushToSingle("下单成功", "亲爱的用户您好,您已下单成功,请等待商家接单!", userEntity.getClientid());
 
         // 商户端消息推送
         List<String> shopMsgShopList=new ArrayList<>();
@@ -1234,10 +1263,11 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
 
     @Override
     public Result selectAllOrderAdmin(Integer page, Integer limit, Integer status, String phone, Long shopId, String userName,
-                                      String orderNumber, Integer orderType, String shopName, String riderPhone,String startTime,String endTime) {
+                                      String orderNumber, Integer orderType, String shopName, String riderPhone, String indentStatus,
+                                      String reservationFlag, String startTime, String endTime, String payStartTime, String payEndTime) {
         Page<TbOrder> pages = new Page<>(page, limit);
         IPage<TbOrder> tbOrderIPage = appOrderDao.selectAllOrderAdmin(pages, status, phone, shopId, userName, orderNumber,
-                orderType, shopName, riderPhone,startTime,endTime);
+                orderType, shopName, riderPhone, indentStatus, reservationFlag, startTime,endTime, payStartTime, payEndTime);
         for (int i = 0; i < tbOrderIPage.getRecords().size(); i++) {
             List<OrderGoods> orderGoodsList = orderGoodsDao.selectList(new QueryWrapper<OrderGoods>()
                     .eq("order_id", tbOrderIPage.getRecords().get(i).getOrderId()));
@@ -1264,7 +1294,10 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         titles.add("编号");titles.add("下单用户");titles.add("用户头像");titles.add("手机号");
         titles.add("商铺信息"); titles.add("订单类型");titles.add("配送信息");titles.add("骑手昵称");
         titles.add("骑手电话"); titles.add("订单号");titles.add("内容");titles.add("商品总价(元)");
-        titles.add("优惠金额(元)"); titles.add("打包费(元/个 具体按照数量计算)");titles.add("跑腿费(元)");titles.add("支付金额(元)");
+        titles.add("优惠金额(元)");
+        titles.add("参与活动名称");
+        titles.add("活动优惠金额(元)");
+        titles.add("打包费(元/个 具体按照数量计算)");titles.add("跑腿费(元)");titles.add("支付金额(元)");
         titles.add("跑腿费说明"); titles.add("订单备注");titles.add("支付时间");titles.add("支付方式");
         titles.add("取餐号"); titles.add("状态");titles.add("是否转单");
 
@@ -1314,6 +1347,8 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
             row.add(stringBuffer.toString());
             row.add(sumGoodsPrice);
             row.add(order.getCouponMoney());
+            row.add(order.getActivityTitle());
+            row.add(order.getActivityDiscountAmount());
             row.add(order.getPackMoney());
             row.add(order.getErrandMoney());
             row.add(order.getPayMoney());
@@ -1448,10 +1483,7 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
     @Transactional
     @Override
     public Result updateGoodsNum(Long orderGoodsId, Integer type, Integer num, Long shopId) {
-        /*reentrantReadWriteLock.writeLock().lock();
-        try{*/
-        //type = 1增加商品数  = 2 减少商品数
-
+        // type = 1增加商品数  = 2 减少商品数
         OrderGoods orderGoods = orderGoodsDao.selectById(orderGoodsId);
         if(orderGoods==null){
             return Result.error("系统繁忙,请稍后再试!");
@@ -1478,12 +1510,6 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
                 orderGoodsDao.updateById(orderGoods2);
             }
         }
-        /*}catch (Exception e){
-            e.printStackTrace();
-            log.error("减少购物车商品出错:"+e.getMessage(),e);
-        }finally {
-            reentrantReadWriteLock.writeLock().unlock();
-        }*/
         return Result.success();
     }
 
@@ -1520,10 +1546,6 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         // 查询店铺信息
         GoodsShop goodsShop = goodsShopDao.selectById(shopId);
 
-        // 查询当天店铺所有已支付的订单号,按支付时间排序
-        int sequence = selectCurrentOrderSequenceByShopId(tbOrder, shopId);
-        tbOrder.setCountOrder(sequence);
-
         if (StringUtils.isNotEmpty(goodsShop.getSnCode())) {
             FeiYunUtils.print(goodsShop.getSnCode(), null, tbOrder);
         } else {
@@ -1532,26 +1554,6 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         return Result.success();
     }
 
-    /**
-     * 获取当前店铺当前订单在已支付订单中的序号
-     * @param order 订单信息
-     * @param shopId 店铺id
-     * @return
-     */
-    private int selectCurrentOrderSequenceByShopId(TbOrder order, Long shopId) {
-        if (Integer.valueOf(Constant.YES).equals(order.getIsPay())) {
-            List<Long> orderIds = appOrderDao.selectCurrentOrderSequenceByShopId(shopId, order.getPayTime());
-
-            int index = orderIds.indexOf(order.getOrderId());
-
-            if (index != -1) {
-                return index + 1;
-            }
-        }
-
-        return -1;
-    }
-
     @Transactional
     public Result updateOrders(TbOrder order) {
         String format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
@@ -1561,6 +1563,10 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
                 return Result.success();
             }
 
+            if (tbOrder.getStatus() != 7) {
+                throw new SqxException("订单状态异常,请刷新页面后重试!");
+            }
+
             String reservationFlag = tbOrder.getReservationFlag();
             if (StrUtil.equals(reservationFlag, Constant.YES)) {
                 Date now = new Date();
@@ -1613,8 +1619,6 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
             // 如果是预约订单,则不再打印小票(订单支付的时候已经打印过了)
             if (!StrUtil.equals(tbOrder.getReservationFlag(), Constant.YES)) {
                 if (StringUtils.isNotEmpty(goodsShop.getSnCode())) {
-                    int sequence = selectCurrentOrderSequenceByShopId(tbOrder, shopId);
-                    tbOrder.setCountOrder(sequence);
                     FeiYunUtils.print(goodsShop.getSnCode(), null, tbOrder);
                 }
             }
@@ -1785,28 +1789,24 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
 
     @Override
     public Result updateOrder(TbOrder order) {
-        reentrantReadWriteLock.writeLock().lock();
+        RLock lock = redissonClient.getLock(String.format(RedisKey.UPDATE_ORDER_LOCK, order.getOrderId()));
+        lock.lock();
         try {
             return updateOrders(order);
-        } catch (Exception e) {
-            throw e;
         } finally {
-            reentrantReadWriteLock.writeLock().unlock();
+            lock.unlock();
         }
     }
 
     @Override
     public Result accomplishOrder(Long orderId) {
-        reentrantReadWriteLock.writeLock().lock();
+        RLock lock = redissonClient.getLock(String.format(RedisKey.FINISH_ORDER_LOCK, orderId));
+        lock.lock();
         try {
             return accomplishOrders(orderId,1);
-        } catch (Exception e) {
-            e.printStackTrace();
-            log.error("完成订单异常:" + e.getMessage(), e);
         } finally {
-            reentrantReadWriteLock.writeLock().unlock();
+            lock.unlock();
         }
-        return Result.error("系统繁忙,请稍后再试!");
     }
 
     /**
@@ -1908,6 +1908,14 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         if (shopIds != -1 && shopIds != 0) {
             shopMoney = shopMoney.subtract(couponMoney);
         }
+
+        // 判断订单是否参与活动,如果参与活动,则优惠金额由商家承担
+        ActivityPartRecord activityPartRecord = activityPartRecordService.getByOrderId(tbOrder.getOrderId());
+        BigDecimal activityDiscountAmount = BigDecimal.ZERO;
+        if (ObjectUtil.isNotNull(activityPartRecord)) {
+            activityDiscountAmount = activityPartRecord.getDiscountAmount();
+        }
+
         if(tbOrder.getAutoSendOrder()!=null && tbOrder.getAutoSendOrder()==1){
             //如果达到商家满减 则商家不加上配送费
             if(!"本单已达到商家满减金额,跑腿费由商家承担".equals(tbOrder.getErrandMoneyIsShop())){
@@ -1928,36 +1936,37 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         userMoneyDetails1.setShopId(goodsShop.getShopId());
         userMoneyDetails1.setTitle("商户订单收入,订单号:" + tbOrder.getOrderNumber());
 //        userMoneyDetails1.setContent("商户本单收入金额:" + shopMoney + "元");
+
+        StringBuffer contentBuffer = new StringBuffer();
+        // 订单金额
+        BigDecimal orderAmount = tbOrder.getPayMoney().add(couponMoney).add(activityDiscountAmount);
+
+        contentBuffer.append("订单金额:").append(orderAmount.setScale(2, BigDecimal.ROUND_DOWN));
+        if (!couponMoney.equals(BigDecimal.ZERO)) {
+            contentBuffer.append(",优惠券金额:").append(couponMoney.setScale(2, BigDecimal.ROUND_DOWN));
+        }
+        if (!activityDiscountAmount.equals(BigDecimal.ZERO)) {
+            contentBuffer.append(",活动优惠金额:").append(activityDiscountAmount.setScale(2, BigDecimal.ROUND_DOWN));
+        }
+
+        contentBuffer.append(",用户实付金额:").append(tbOrder.getPayMoney()).append(",其中");
+
         if (tbOrder.getOrderType() != 1) {
-            //订单金额: 优惠券金额:  用户实付金额:   跑腿费:   平台服务费:  到账金额:(本单为平台优惠券,平台补贴)
-            //订单金额: 商家优惠券:  用户实付金额:   跑腿费:   平台服务费:  到账金额:(本单为商家优惠券,商家补贴)
-            if (shopIds == -1) {
-                //未使用优惠券
-                userMoneyDetails1.setContent("订单金额:" + tbOrder.getPayMoney() + ",用户实付金额:" + tbOrder.getPayMoney() + ",其中跑腿费:" + errandMoney + "(" + tbOrder.getErrandMoneyIsShop() + "),平台服务费:" + pingRate + ",短信服务费:" + smsSendMoney + ",到账金额:" + shopMoney);
-            } else if (shopIds == 0) {
-                //使用平台优惠券
-                sumMoney = tbOrder.getPayMoney().add(couponMoney);
-                userMoneyDetails1.setContent("订单金额:" + sumMoney + ",优惠券金额:" + couponMoney + ",用户实付金额:" + tbOrder.getPayMoney() + ",其中跑腿费:" + errandMoney + "(" + tbOrder.getErrandMoneyIsShop() + "),平台服务费:" + pingRate + ",短信服务费:" + smsSendMoney + ",到账金额:" + shopMoney + "(本单为平台优惠券,平台补贴)");
-            } else {
-                //使用商家优惠券
-                sumMoney = tbOrder.getPayMoney().add(couponMoney);
-                userMoneyDetails1.setContent("订单金额:" + sumMoney + ",优惠券金额:" + couponMoney + ",用户实付金额:" + tbOrder.getPayMoney() + ",其中跑腿费:" + errandMoney + "(" + tbOrder.getErrandMoneyIsShop() + "),平台服务费:" + pingRate + ",短信服务费:" + smsSendMoney + ",到账金额:" + shopMoney + "(本单为商家优惠券,商家补贴)");
-            }
-        } else {
-            if (shopIds == -1) {
-                //未使用优惠券
-                userMoneyDetails1.setContent("订单金额:" + tbOrder.getPayMoney() + ",用户实付金额:" + tbOrder.getPayMoney() + ",其中跑腿费:" + errandMoney + "(" + tbOrder.getErrandMoneyIsShop() + "),平台服务费:" + pingRate + ",短信服务费:" + smsSendMoney + ",到账金额:" + shopMoney);
-            } else if (shopIds == 0) {
-                //使用平台优惠券
-                sumMoney = tbOrder.getPayMoney().add(couponMoney);
-                userMoneyDetails1.setContent("订单金额:" + sumMoney + ",优惠券金额:" + couponMoney + ",用户实付金额:" + tbOrder.getPayMoney() + ",平台服务费:" + pingRate + ",短信服务费:" + smsSendMoney + ",到账金额:" + shopMoney + "(本单为平台优惠券,平台补贴)");
-            } else {
-                //使用商家优惠券
-                sumMoney = tbOrder.getPayMoney().add(couponMoney);
-                userMoneyDetails1.setContent("订单金额:" + sumMoney + ",优惠券金额:" + couponMoney + ",用户实付金额:" + tbOrder.getPayMoney() + ",平台服务费:" + pingRate + ",短信服务费:" + smsSendMoney + ",到账金额:" + shopMoney + "(本单为商家优惠券,商家补贴)");
-            }
+            contentBuffer.append("跑腿费:").append(errandMoney.setScale(2, BigDecimal.ROUND_DOWN)).append("(").append(tbOrder.getErrandMoneyIsShop()).append(")").append(",");
+        }
+
+        contentBuffer.append("平台服务费:").append(pingRate.setScale(2, BigDecimal.ROUND_DOWN)).append(",");
+        contentBuffer.append("短信服务费:").append(smsSendMoney.setScale(2, BigDecimal.ROUND_DOWN)).append(",");
+        contentBuffer.append("到账金额:").append(shopMoney.setScale(2, BigDecimal.ROUND_DOWN));
+
+        if (shopIds == 0) {
+            contentBuffer.append("(本单为平台优惠券,平台补贴)");
+        } else if (shopIds != -1) {
+            contentBuffer.append("(本单为商家优惠券,商家补贴)");
         }
 
+        userMoneyDetails1.setContent(contentBuffer.toString());
+
         userMoneyDetails1.setType(1);
         userMoneyDetails1.setClassify(3);
         userMoneyDetails1.setMoney(shopMoney);
@@ -2003,52 +2012,52 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         return Result.success();
     }
 
-    @Scheduled(cron = "0 */10 * * * ?")
-    public void orderEnd() {
-        CommonInfo one = commonInfoService.findOne(268);
-        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-        List<TbOrder> orderList = appOrderDao.selectList(new QueryWrapper<TbOrder>().eq("status", 3));
-        for (TbOrder tbOrder : orderList) {
-            LocalDateTime updateTime = LocalDateTime.parse(tbOrder.getUpdateTime(), df);
-            //计算当前订单什么时候超时完成
-            LocalDateTime overDateTime = updateTime.plusHours(Integer.parseInt(one.getValue()));
-            if (LocalDateTime.now().isAfter(overDateTime)) {
-                log.info("操作完成订单6:"+tbOrder.getOrderId());
-                accomplishOrders(tbOrder.getOrderId(),2);
-                //管理端完成订单,则消息通知用户
-                //添加消息记录
-                MessageInfo messageInfo = new MessageInfo();
-                messageInfo.setState(String.valueOf(5));
-                messageInfo.setTitle("订单完成");
-                messageInfo.setContent("您的订单已完成,欢迎下次光临");
-                messageInfo.setCreateAt(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
-                messageInfo.setUserId(tbOrder.getUserId().toString());
-                messageInfoDao.insert(messageInfo);
-                //设置小程序消息推送
-                CommonInfo one1 = commonInfoService.findOne(269);
-                List<String> msgList = new ArrayList<>();
-                Long shopId = tbOrder.getShopId();
-                GoodsShop goodsShop = goodsShopDao.selectById(shopId);
-                String orderNum1 = tbOrder.getOrderNumber();
-                msgList.add("订单完成");
-                msgList.add(orderNum1);
-                if (goodsShop != null && goodsShop.getShopName() != null) {
-                    String shopName = goodsShop.getShopName();
-                    msgList.add(shopName);
-                } else {
-                    msgList.add("");
-                }
-                msgList.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
-                UserEntity userEntity = userDao.selectById(tbOrder.getUserId());
-                if (userEntity != null && userEntity.getOpenId() != null) {
-                    SenInfoCheckUtil.sendMsg(userEntity.getOpenId(), one1.getValue(), msgList, 1);
-                    userService.pushToSingle("订单完成", "亲爱的用户您好,您的订单已完成,欢迎下次光临!", userEntity.getClientid());
-                }
-
-            }
-
-        }
-    }
+    // @Scheduled(cron = "0 */10 * * * ?")
+    // public void orderEnd() {
+    //     CommonInfo one = commonInfoService.findOne(268);
+    //     DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+    //     List<TbOrder> orderList = appOrderDao.selectList(new QueryWrapper<TbOrder>().eq("status", 3));
+    //     for (TbOrder tbOrder : orderList) {
+    //         LocalDateTime updateTime = LocalDateTime.parse(tbOrder.getUpdateTime(), df);
+    //         //计算当前订单什么时候超时完成
+    //         LocalDateTime overDateTime = updateTime.plusHours(Integer.parseInt(one.getValue()));
+    //         if (LocalDateTime.now().isAfter(overDateTime)) {
+    //             log.info("操作完成订单6:"+tbOrder.getOrderId());
+    //             accomplishOrders(tbOrder.getOrderId(),2);
+    //             //管理端完成订单,则消息通知用户
+    //             //添加消息记录
+    //             MessageInfo messageInfo = new MessageInfo();
+    //             messageInfo.setState(String.valueOf(5));
+    //             messageInfo.setTitle("订单完成");
+    //             messageInfo.setContent("您的订单已完成,欢迎下次光临");
+    //             messageInfo.setCreateAt(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+    //             messageInfo.setUserId(tbOrder.getUserId().toString());
+    //             messageInfoDao.insert(messageInfo);
+    //             //设置小程序消息推送
+    //             CommonInfo one1 = commonInfoService.findOne(269);
+    //             List<String> msgList = new ArrayList<>();
+    //             Long shopId = tbOrder.getShopId();
+    //             GoodsShop goodsShop = goodsShopDao.selectById(shopId);
+    //             String orderNum1 = tbOrder.getOrderNumber();
+    //             msgList.add("订单完成");
+    //             msgList.add(orderNum1);
+    //             if (goodsShop != null && goodsShop.getShopName() != null) {
+    //                 String shopName = goodsShop.getShopName();
+    //                 msgList.add(shopName);
+    //             } else {
+    //                 msgList.add("");
+    //             }
+    //             msgList.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+    //             UserEntity userEntity = userDao.selectById(tbOrder.getUserId());
+    //             if (userEntity != null && userEntity.getOpenId() != null) {
+    //                 SenInfoCheckUtil.sendMsg(userEntity.getOpenId(), one1.getValue(), msgList, 1);
+    //                 userService.pushToSingle("订单完成", "亲爱的用户您好,您的订单已完成,欢迎下次光临!", userEntity.getClientid());
+    //             }
+    //
+    //         }
+    //
+    //     }
+    // }
 
     @Transactional
     @Override
@@ -2090,15 +2099,13 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
 
     @Override
     public Result userCancelOrder(Long orderId){
-        reentrantReadWriteLock.writeLock().lock();
+        RLock lock = redissonClient.getLock(String.format(RedisKey.CANCEL_ORDER_LOCK, orderId));
+        lock.lock();
         try {
             return userCancelOrders(orderId);
-        }catch (Exception e){
-            e.printStackTrace();
-        }finally {
-            reentrantReadWriteLock.writeLock().unlock();
+        } finally {
+            lock.unlock();
         }
-        return Result.error("系统繁忙,请稍后再试!");
     }
 
 
@@ -2252,18 +2259,15 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
 
     @Override
     public Result adminCancelOrder(Long orderId){
-        reentrantReadWriteLock.writeLock().lock();
+        RLock lock = redissonClient.getLock(String.format(RedisKey.CANCEL_ORDER_LOCK, orderId));
+        lock.lock();
         try {
             return adminCancelOrders(orderId);
-        }catch (Exception e){
-            e.printStackTrace();
-        }finally {
-            reentrantReadWriteLock.writeLock().unlock();
+        } finally {
+            lock.unlock();
         }
-        return Result.error("系统繁忙,请稍后再试!");
     }
 
-
     @Transactional
     public Result adminCancelOrders(Long orderId) {
         String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
@@ -2395,23 +2399,16 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
             tbOrderList.getRecords().get(i).setOrderGoodsList(list);
         }
         if (shopId != null && userId != null) {
-            reentrantReadWriteLock.writeLock().lock();
-            try {
-                UserBrowse userBrowse = userBrowseDao.selectOne(new QueryWrapper<UserBrowse>().eq("user_id", userId).eq("by_browse_id", shopId));
-                String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
-                if (userBrowse != null) {
-                    userBrowse.setUpdateTime(format);
-                } else {
-                    userBrowse = new UserBrowse();
-                    userBrowse.setUserId(userId);
-                    userBrowse.setByBrowseId(shopId);
-                    userBrowse.setUpdateTime(format);
-                    userBrowseDao.insert(userBrowse);
-                }
-            } catch (Exception e) {
-                e.printStackTrace();
-            } finally {
-                reentrantReadWriteLock.writeLock().unlock();
+            UserBrowse userBrowse = userBrowseDao.selectOne(new QueryWrapper<UserBrowse>().eq("user_id", userId).eq("by_browse_id", shopId));
+            String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+            if (userBrowse != null) {
+                userBrowse.setUpdateTime(format);
+            } else {
+                userBrowse = new UserBrowse();
+                userBrowse.setUserId(userId);
+                userBrowse.setByBrowseId(shopId);
+                userBrowse.setUpdateTime(format);
+                userBrowseDao.insert(userBrowse);
             }
         }
         PageUtils pageUtils = new PageUtils(tbOrderList);
@@ -2429,26 +2426,40 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
     }
 
 
-    @Scheduled(cron = "0 */1 * * * ?")
-    public void makeOrders(){
-        //自动制作完成订单
-        String value = commonInfoService.findOne(418).getValue();
-        if("是".equals(value)){
-            String minute = commonInfoService.findOne(419).getValue();
-            LocalDateTime minusMinutes = LocalDateTime.now().minusMinutes(Long.valueOf(minute));
-            List<TbOrder> tbOrders = baseMapper.selectMakeOrdersList(minusMinutes);
-            for (TbOrder order:tbOrders){
-                try{
-                    order.setStatus(3);
-                    updateOrder(order);
-                }catch (Exception e){
-                    e.printStackTrace();
-                    log.error("自动完成异常:"+e.getMessage(),e);
-                }
-            }
-        }
-    }
+    // @Scheduled(cron = "0 */1 * * * ?")
+    // public void makeOrders(){
+    //     //自动制作完成订单
+    //     String value = commonInfoService.findOne(418).getValue();
+    //     if("是".equals(value)){
+    //         String minute = commonInfoService.findOne(419).getValue();
+    //         LocalDateTime minusMinutes = LocalDateTime.now().minusMinutes(Long.valueOf(minute));
+    //         List<TbOrder> tbOrders = baseMapper.selectMakeOrdersList(minusMinutes);
+    //         for (TbOrder order:tbOrders){
+    //             try{
+    //                 order.setStatus(3);
+    //                 updateOrder(order);
+    //             }catch (Exception e){
+    //                 e.printStackTrace();
+    //                 log.error("自动完成异常:"+e.getMessage(),e);
+    //             }
+    //         }
+    //     }
+    // }
 
+    @Override
+    public List<TbOrder> getProdIngOrders(LocalDateTime minusMinutes) {
+        return baseMapper.selectMakeOrdersList(minusMinutes);
+    }
 
+    /**
+     * 获取当前店铺当前订单在已支付订单中的序号
+     * @param order 订单信息
+     * @param shopId 店铺id
+     * @return 支付顺序
+     */
+    private int selectCurrentOrderSequenceByShopId(TbOrder order, Long shopId) {
+        int count = appOrderDao.countCurDayPayByShopId(shopId, order.getPayTime());
 
+        return count + 1;
+    }
 }

+ 61 - 61
src/main/java/com/sqx/modules/order/task/OrderTask.java

@@ -1,61 +1,61 @@
-package com.sqx.modules.order.task;
-
-import cn.hutool.core.collection.CollUtil;
-import com.sqx.modules.order.entity.TbOrder;
-import com.sqx.modules.order.service.AppOrderService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * 订单定时任务
- *
- * @author : codingliang
- * @date : 2024-08-19 20:42
- */
-@Slf4j
-@Async
-@Component
-@RequiredArgsConstructor
-public class OrderTask {
-
-    private final AppOrderService orderService;
-
-    /**
-     * 预约订单自动接单
-     * 5分钟运行一次
-     */
-    @Scheduled(cron = "0 */5 * * * ?")
-    public void reservationAutoReceivingOrder() {
-        log.info("预约订单自动接单任务运行....");
-        List<Long> orderIds = orderService.getCurWaitReceivingOrderIds();
-        if (CollUtil.isEmpty(orderIds)) {
-            log.info("没有符合条件的预约订单,预约订单自动接单任务运行....");
-            return;
-        }
-
-        List<TbOrder> waitOrders = orderIds.stream().map(orderId -> {
-            TbOrder waitOrder = new TbOrder();
-            waitOrder.setOrderId(orderId);
-            waitOrder.setStatus(6);
-
-            return waitOrder;
-        }).collect(Collectors.toList());
-
-
-        for (TbOrder waitOrder : waitOrders) {
-            log.info("预约订单id:{},正在自动接单", waitOrder.getOrderId());
-            try {
-                orderService.updateOrder(waitOrder);
-            } catch (Exception e) {
-                e.printStackTrace();
-                log.error("预约单id:{},自动接单失败,失败原因:{}", waitOrder.getOrderId(), e.getMessage());
-            }
-        }
-    }
-}
+// package com.sqx.modules.order.task;
+//
+// import cn.hutool.core.collection.CollUtil;
+// import com.sqx.modules.order.entity.TbOrder;
+// import com.sqx.modules.order.service.AppOrderService;
+// import lombok.RequiredArgsConstructor;
+// import lombok.extern.slf4j.Slf4j;
+// import org.springframework.scheduling.annotation.Async;
+// import org.springframework.scheduling.annotation.Scheduled;
+// import org.springframework.stereotype.Component;
+//
+// import java.util.List;
+// import java.util.stream.Collectors;
+//
+// /**
+//  * 订单定时任务
+//  *
+//  * @author : codingliang
+//  * @date : 2024-08-19 20:42
+//  */
+// @Slf4j
+// @Async
+// @Component
+// @RequiredArgsConstructor
+// public class OrderTask {
+//
+//     private final AppOrderService orderService;
+//
+//     /**
+//      * 预约订单自动接单
+//      * 5分钟运行一次
+//      */
+//     @Scheduled(cron = "0 */5 * * * ?")
+//     public void reservationAutoReceivingOrder() {
+//         log.info("预约订单自动接单任务运行....");
+//         List<Long> orderIds = orderService.getCurWaitReceivingOrderIds();
+//         if (CollUtil.isEmpty(orderIds)) {
+//             log.info("没有符合条件的预约订单,预约订单自动接单任务运行....");
+//             return;
+//         }
+//
+//         List<TbOrder> waitOrders = orderIds.stream().map(orderId -> {
+//             TbOrder waitOrder = new TbOrder();
+//             waitOrder.setOrderId(orderId);
+//             waitOrder.setStatus(6);
+//
+//             return waitOrder;
+//         }).collect(Collectors.toList());
+//
+//
+//         for (TbOrder waitOrder : waitOrders) {
+//             log.info("预约订单id:{},正在自动接单", waitOrder.getOrderId());
+//             try {
+//                 orderService.updateOrder(waitOrder);
+//             } catch (Exception e) {
+//                 e.printStackTrace();
+//                 log.error("预约单id:{},自动接单失败,失败原因:{}", waitOrder.getOrderId(), e.getMessage());
+//             }
+//         }
+//     }
+// }

+ 2 - 2
src/main/java/com/sqx/modules/oss/controller/SysOssController.java

@@ -44,7 +44,7 @@ public class SysOssController {
     private SysConfigService sysConfigService;
 
     private final static String KEY = ConfigConstant.CLOUD_STORAGE_CONFIG_KEY;
-	
+
 	/**
 	 * 列表
 	 */
@@ -102,7 +102,7 @@ public class SysOssController {
 
 		return Result.success();
 	}
-	
+
 
 	/**
 	 * 上传文件

+ 1 - 0
src/main/java/com/sqx/modules/oss/service/SysOssService.java

@@ -3,6 +3,7 @@ package com.sqx.modules.oss.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.modules.oss.entity.SysOssEntity;
+import org.apache.poi.ss.formula.functions.T;
 
 import java.util.Map;
 

+ 1 - 1
src/main/java/com/sqx/modules/oss/service/impl/SysOssServiceImpl.java

@@ -23,5 +23,5 @@ public class SysOssServiceImpl extends ServiceImpl<SysOssDao, SysOssEntity> impl
 
 		return new PageUtils(page);
 	}
-	
+
 }

+ 13 - 13
src/main/java/com/sqx/modules/pay/controller/CashController.java

@@ -11,13 +11,13 @@ import com.alipay.api.request.AlipayFundTransToaccountTransferRequest;
 import com.alipay.api.request.AlipayFundTransUniTransferRequest;
 import com.alipay.api.response.AlipayFundTransToaccountTransferResponse;
 import com.alipay.api.response.AlipayFundTransUniTransferResponse;
+import com.sqx.common.constant.RedisKey;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
 import com.sqx.modules.app.dao.UserCashOutDao;
 import com.sqx.modules.app.entity.UserEntity;
 import com.sqx.modules.app.entity.UserMoneyDetails;
 import com.sqx.modules.app.service.UserMoneyDetailsService;
-import com.sqx.modules.app.service.UserMoneyService;
 import com.sqx.modules.app.service.UserService;
 import com.sqx.modules.common.entity.CommonInfo;
 import com.sqx.modules.common.service.CommonInfoService;
@@ -25,7 +25,6 @@ import com.sqx.modules.message.entity.MessageInfo;
 import com.sqx.modules.message.service.MessageService;
 import com.sqx.modules.pay.config.AliPayConstants;
 import com.sqx.modules.pay.controller.query.CashOutQueryDTO;
-import com.sqx.modules.pay.dao.CashOutDao;
 import com.sqx.modules.pay.entity.AliPayWithdrawModel;
 import com.sqx.modules.pay.entity.CashOut;
 import com.sqx.modules.pay.service.CashOutService;
@@ -44,6 +43,8 @@ import lombok.extern.slf4j.Slf4j;
 import lombok.val;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.exception.ExceptionUtils;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -52,6 +53,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
@@ -59,7 +61,6 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 /**
  * @author fang
@@ -89,11 +90,9 @@ public class CashController {
     private MessageService messageService;
     @Autowired
     private UserCashOutDao userCashOutDao;
-    @Autowired
-    private CashOutDao cashOutDao;
-    @Autowired
-    private UserMoneyService userMoneyService;
-    private ReentrantReadWriteLock reentrantReadWriteLock=new ReentrantReadWriteLock(true);
+
+    @Resource
+    private RedissonClient redissonClient;
 
     @RequestMapping(value = "/sendMsgByUserId", method = RequestMethod.GET)
     @ApiOperation("管理平台主动推送消息(指定用户)")
@@ -307,7 +306,8 @@ public class CashController {
     }
 
     private Result wxPay(CashOut one){
-        reentrantReadWriteLock.writeLock().lock();
+        RLock lock = redissonClient.getLock(String.format(RedisKey.CASH_OUT_LOCK, one.getUserId()));
+        lock.lock();
         try{
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
             UserEntity userEntity = userService.getById(one.getUserId());
@@ -397,7 +397,7 @@ public class CashController {
             e.printStackTrace();
             log.error("转账出错了!!!"+e.getMessage(),e);
         }finally {
-            reentrantReadWriteLock.writeLock().unlock();
+            lock.unlock();
         }
         return Result.error("转账失败!");
     }
@@ -405,7 +405,7 @@ public class CashController {
 
 
     private Result aliPay(CashOut one) {
-        reentrantReadWriteLock.writeLock().lock();
+        RLock lock = redissonClient.getLock(String.format(RedisKey.CASH_OUT_LOCK, one.getUserId()));
         try {
             log.error("进来了!!!");
             if (one == null) {
@@ -545,7 +545,7 @@ public class CashController {
             e.printStackTrace();
             log.error("转账异常"+e.getMessage());
         }finally {
-            reentrantReadWriteLock.writeLock().unlock();
+            lock.unlock();
         }
         return Result.error("系统繁忙,请稍后再试!");
     }
@@ -740,4 +740,4 @@ public class CashController {
 
 
 
-}
+}

+ 1 - 1
src/main/java/com/sqx/modules/pay/controller/app/AppCashController.java

@@ -104,4 +104,4 @@ public class AppCashController extends AbstractController {
     }
 
 
-}
+}

+ 1 - 0
src/main/java/com/sqx/modules/pay/service/PayDetailsService.java

@@ -2,6 +2,7 @@ package com.sqx.modules.pay.service;
 
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
+import org.apache.poi.ss.formula.functions.T;
 
 public interface PayDetailsService {
 

+ 10 - 14
src/main/java/com/sqx/modules/pay/service/impl/CashOutServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sqx.common.constant.RedisKey;
 import com.sqx.common.exception.SqxException;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
@@ -15,7 +16,6 @@ import com.sqx.modules.app.entity.UserEntity;
 import com.sqx.modules.app.entity.UserMoney;
 import com.sqx.modules.app.entity.UserMoneyDetails;
 import com.sqx.modules.app.service.UserMoneyDetailsService;
-import com.sqx.modules.app.service.UserMoneyService;
 import com.sqx.modules.app.service.UserService;
 import com.sqx.modules.common.entity.CommonInfo;
 import com.sqx.modules.common.service.CommonInfoService;
@@ -32,10 +32,11 @@ import com.sqx.modules.pay.service.CashOutService;
 import com.sqx.modules.pay.vo.CashOutVO;
 import com.sqx.modules.shop.entity.ShopBankCardInfo;
 import com.sqx.modules.shop.service.ShopBankCardInfoService;
-import com.sqx.modules.sys.dao.SysUserDao;
 import com.sqx.modules.utils.AmountCalUtils;
 import com.sqx.modules.utils.excel.ExcelData;
 import org.apache.commons.lang.StringUtils;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -54,7 +55,6 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
 import java.util.stream.Collectors;
 
 /**
@@ -95,14 +95,13 @@ public class CashOutServiceImpl extends ServiceImpl<CashOutDao, CashOut> impleme
     @Autowired
     private ErrandComplaintDao complaintDao;
     @Autowired
-    private SysUserDao sysUserDao;
-    @Autowired
     private UserMoneyDetailsService userMoneyDetailsService;
     @Autowired
-    private UserMoneyService userMoneyService;
-    @Autowired
     private ShopBankCardInfoService shopBankCardInfoService;
-    private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true);
+    @Autowired
+    private RedissonClient redissonClient;
+
+
 
     @Override
     public PageUtils selectCashOutList(CashOutQueryDTO queryDTO) {
@@ -275,15 +274,12 @@ public class CashOutServiceImpl extends ServiceImpl<CashOutDao, CashOut> impleme
 
     @Override
     public Result cashMoney(Long userId, Long shopId, Double money, Integer classify, Integer type) {
-        reentrantReadWriteLock.writeLock().lock();
+        RLock lock = redissonClient.getLock(String.format(RedisKey.CASH_OUT_LOCK, userId));
+        lock.lock();
         try {
             return cashMoneys(userId, shopId, money, classify, type);
-        } catch (Exception e) {
-            e.printStackTrace();
-            log.error("发起提现出错!" + e.getMessage(), e);
-            throw new SqxException(e.getMessage());
         } finally {
-            reentrantReadWriteLock.writeLock().unlock();
+            lock.unlock();
         }
     }
 

+ 0 - 1
src/main/java/com/sqx/modules/pay/service/impl/PayDetailsServiceImpl.java

@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
-import com.sqx.modules.app.entity.UserMoneyDetails;
 import com.sqx.modules.pay.dao.PayDetailsDao;
 import com.sqx.modules.pay.entity.PayDetails;
 import com.sqx.modules.pay.service.PayDetailsService;

+ 46 - 37
src/main/java/com/sqx/modules/pay/service/impl/WxServiceImpl.java

@@ -5,7 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.github.wxpay.sdk.WXPay;
 import com.github.wxpay.sdk.WXPayConstants;
 import com.github.wxpay.sdk.WXPayUtil;
-import com.sqx.common.exception.SqxException;
+import com.sqx.common.constant.RedisKey;
 import com.sqx.common.utils.Result;
 import com.sqx.modules.app.dao.UserDao;
 import com.sqx.modules.app.dao.UserMoneyDetailsDao;
@@ -35,17 +35,19 @@ import com.sqx.modules.utils.AmountCalUtils;
 import com.sqx.modules.utils.MD5Util;
 import com.sqx.modules.utils.WXConfigUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 /**
  * @author fang
@@ -89,19 +91,21 @@ public class WxServiceImpl implements WxService {
     @Autowired
     private UserMoneyDetailsService userMoneyDetailsService;
 
-    private ReentrantReadWriteLock reentrantReadWriteLock=new ReentrantReadWriteLock(true);
-
     private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
+    @Resource
+    private RedissonClient redissonClient;
+
     @Override
     public Result balanceOrder(Long userId, PayOrderDTO payOrderDTO) {
-        reentrantReadWriteLock.writeLock().lock();
+        TbOrder tbOrder = appOrderService.prepareOrder(userId, payOrderDTO);
+
+        RLock lock = redissonClient.getLock(String.format(RedisKey.INSERT_ORDER_LOCK, tbOrder.getOrderId(), tbOrder.getShopId()));
+        lock.lock();
         try{
-            return balanceOrders(userId, payOrderDTO);
-        } catch (Exception e){
-            throw new SqxException(e.getMessage());
+            return balanceOrders(userId, tbOrder);
         } finally {
-            reentrantReadWriteLock.writeLock().unlock();
+            lock.unlock();
         }
     }
 
@@ -109,10 +113,7 @@ public class WxServiceImpl implements WxService {
      * 钱包支付订单
      */
     @Transactional
-    public Result balanceOrders(Long userId, PayOrderDTO payOrderDTO){
-        // 获取订单信息
-        TbOrder tbOrder = appOrderService.prepareOrder(userId, payOrderDTO);
-
+    public Result balanceOrders(Long userId, TbOrder tbOrder){
         // 扣除用户余额
         BigDecimal payMoney = tbOrder.getPayMoney();
         UserMoney userMoney = userMoneyService.selectUserMoneyByUserId(userId);
@@ -144,16 +145,13 @@ public class WxServiceImpl implements WxService {
 
     @Override
     public Result balanceBuyVip(Long userId) {
-        reentrantReadWriteLock.writeLock().lock();
-        try{
+        RLock lock = redissonClient.getLock(String.format(RedisKey.USER_BUY_VIP_LOCK, userId));
+        lock.lock();
+        try {
             return balanceBuyVips(userId);
-        }catch (Exception e){
-            e.printStackTrace();
-            log.error("下单异常:"+e.getMessage(),e);
-        }finally {
-            reentrantReadWriteLock.writeLock().unlock();
+        } finally {
+            lock.unlock();
         }
-        return Result.error("系统繁忙,请稍后再试!");
     }
 
     @Override
@@ -218,25 +216,36 @@ public class WxServiceImpl implements WxService {
 
         // 设置支付方式 1表示微信支付、4或5表示支付宝支付
         Integer type = payOrderDTO.getType();
-        tbOrder.setPayType(1);
-        if(type== 4 || type== 5){
-            tbOrder.setPayType(3);
-        }
 
-        // 设置订单号
-        if (StrUtil.isBlank(tbOrder.getOrderNumber())) {
-            tbOrder.setOrderNumber(getGeneralOrder());
-        }
+        RLock lock = redissonClient.getLock(String.format(RedisKey.INSERT_ORDER_LOCK, tbOrder.getUserId(), tbOrder.getShopId()));
+        lock.lock();
+        try {
+
+            tbOrder.setPayType(1);
+            if(type == 4 || type == 5){
+                tbOrder.setPayType(3);
+            }
 
-        // 保存订单信息
-        appOrderDao.updateById(tbOrder);
+            // 设置订单号
+            if (StrUtil.isBlank(tbOrder.getOrderNumber())) {
+                tbOrder.setOrderNumber(getGeneralOrder());
+            }
 
-        if (tbOrder.getPayType() == 1) {
-            // 微信支付
-            return pay(tbOrder.getPayMoney().doubleValue(), type, tbOrder.getUserId(), tbOrder.getOrderNumber(), 1);
-        } else {
-            // 支付宝支付
-            return aliPayController.payAppOrders(tbOrder.getPayMoney().doubleValue(), type, tbOrder.getUserId(), tbOrder.getOrderNumber(), 1);
+            // 支付时,订单状态改为 0
+            tbOrder.setStatus(0);
+
+            // 保存订单信息
+            appOrderDao.updateById(tbOrder);
+
+            if (tbOrder.getPayType() == 1) {
+                // 微信支付
+                return pay(tbOrder.getPayMoney().doubleValue(), type, tbOrder.getUserId(), tbOrder.getOrderNumber(), 1);
+            } else {
+                // 支付宝支付
+                return aliPayController.payAppOrders(tbOrder.getPayMoney().doubleValue(), type, tbOrder.getUserId(), tbOrder.getOrderNumber(), 1);
+            }
+        } finally {
+            lock.unlock();
         }
     }
 

+ 23 - 0
src/main/java/com/sqx/modules/printInfo/controller/PrintInfoController.java

@@ -73,6 +73,29 @@ public class PrintInfoController {
         return Result.success();
     }
 
+    @GetMapping("testReturnPrintModel")
+    @ApiOperation("测试退单打印")
+    public Result testReturnPrintModel(Long orderId) {
+        // 查询订单信息
+        TbOrder tbOrder = appAppOrderService.selectOrderByIds(orderId);
+        Long shopId = tbOrder.getShopId();
+
+        // 查询店铺信息
+        GoodsShop goodsShop = goodsShopService.selectGoodDatas(shopId);
+
+        // 查询当天店铺所有已支付的订单号,按支付时间排序
+        tbOrder.setCountOrder(3);
+
+        if (StringUtils.isNotEmpty(goodsShop.getSnCode())) {
+            FeiYunUtils.returnPrint(goodsShop.getSnCode(), null, tbOrder);
+        } else {
+            return Result.error("当前商家未绑定打印机!");
+        }
+        return Result.success();
+    }
+
+
+
 
     @GetMapping("getPrintInfoList")
     @ApiOperation("获取打印信息列表")

+ 4 - 4
src/main/java/com/sqx/modules/printInfo/entity/eOrderTypeExtra.java

@@ -10,11 +10,11 @@ import java.util.List;
  * @Version: 1.0
  * 订单类型
  */
-//上门:1
+//到店取餐:1
 //骑手配送:2
 //商家配送:3
 public enum eOrderTypeExtra {
-    Door(1),//上门
+    Door(1),//到店取餐
     Rider(2),//骑手配送
     Store(3);//商家配送
 
@@ -42,7 +42,7 @@ public enum eOrderTypeExtra {
 
     public static Integer integerOf(String value) {
         switch (value) {
-            case "上门":
+            case "到店取餐":
                 return 1;
             case "骑手配送":
                 return 2;
@@ -56,7 +56,7 @@ public enum eOrderTypeExtra {
     public static String stringOf(Integer value) {
         switch (value) {
             case 1:
-                return "上门";
+                return "到店取餐";
             case 2:
                 return "骑手配送";
             case 3:

+ 0 - 1
src/main/java/com/sqx/modules/printInfo/service/impl/PrintInfoServiceImpl.java

@@ -8,7 +8,6 @@ import com.sqx.common.utils.Result;
 import com.sqx.modules.printInfo.dao.PrintInfoDao;
 import com.sqx.modules.printInfo.entity.PrintInfo;
 import com.sqx.modules.printInfo.service.PrintInfoService;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 

+ 2 - 0
src/main/java/com/sqx/modules/shop/service/ShopMessageService.java

@@ -51,4 +51,6 @@ public interface ShopMessageService extends IService<GoodsShop> {
      * @param dto 修改信息
      */
     void updateShopAuthentication(Long shopId, ShopAuditUpdateDTO dto);
+
+    GoodsShop getShopInfoById(Long shopId);
 }

+ 39 - 17
src/main/java/com/sqx/modules/shop/service/impl/ShopMessageServiceImpl.java

@@ -2,6 +2,7 @@ package com.sqx.modules.shop.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -9,9 +10,11 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sqx.common.constant.RedisKey;
 import com.sqx.common.exception.SqxException;
 import com.sqx.common.utils.Constant;
 import com.sqx.common.utils.PageUtils;
+import com.sqx.common.utils.RedisUtils;
 import com.sqx.common.utils.Result;
 import com.sqx.modules.app.dao.MsgDao;
 import com.sqx.modules.app.dao.UserBrowseDao;
@@ -49,17 +52,19 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.RandomStringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.crypto.hash.Sha256Hash;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 @Slf4j
 @Service
@@ -99,7 +104,12 @@ public class ShopMessageServiceImpl extends ServiceImpl<ShopMessageDao, GoodsSho
     private UserService userService;
     @Autowired
     private AppOrderDao appOrderDao;
-    private ReentrantReadWriteLock reentrantReadWriteLock=new ReentrantReadWriteLock(true);
+
+    @Resource
+    private RedissonClient redissonClient;
+
+    @Autowired
+    private RedisUtils redisUtils;
 
     @Transactional
     @Override
@@ -128,16 +138,13 @@ public class ShopMessageServiceImpl extends ServiceImpl<ShopMessageDao, GoodsSho
 
     @Override
     public Result auditShopAuthentication(Long shopId, ShopAuditDTO dto) {
-        reentrantReadWriteLock.writeLock().lock();
-        try{
+        RLock lock = redissonClient.getLock(String.format(RedisKey.SHOP_AUTHENTICATION_LOCK, shopId));
+        lock.lock();
+        try {
             return auditAuthentication(shopId, dto);
-        }catch (Exception e){
-            e.printStackTrace();
-            log.error("操作异常:"+e.getMessage(),e);
-        }finally {
-            reentrantReadWriteLock.writeLock().unlock();
+        } finally {
+            lock.unlock();
         }
-        return Result.error("系统繁忙,请稍后再试!");
     }
 
     @Transactional
@@ -299,13 +306,13 @@ public class ShopMessageServiceImpl extends ServiceImpl<ShopMessageDao, GoodsSho
             }
         }
 
-        // 如果修改店铺下线,需要判断当前订单有无未完成订单,如有则不允许下线
-        if (Integer.valueOf(Constant.YES).equals(goodsShop.getPutawayFlag())) {
-            int num = appOrderDao.countUnFinishByShopId(goodsShop.getShopId());
-            if (num > 0) {
-                return Result.error("当前店铺存在未完成订单,请完成所有订单后再修改店铺状态");
-            }
-        }
+        // 如果修改为店铺下线状态,需要判断当前店铺有无未完成订单,如有则不允许下线
+        // if (Integer.valueOf(Constant.YES).equals(goodsShop.getPutawayFlag())) {
+        //     int num = appOrderDao.countUnFinishByShopId(goodsShop.getShopId());
+        //     if (num > 0) {
+        //         return Result.error("当前店铺存在未完成订单,请完成所有订单后再修改店铺状态");
+        //     }
+        // }
 
         baseMapper.updateById(goodsShop);
         return Result.success();
@@ -552,6 +559,21 @@ public class ShopMessageServiceImpl extends ServiceImpl<ShopMessageDao, GoodsSho
     }
 
     @Override
+    public GoodsShop getShopInfoById(Long shopId) {
+        String key = String.format(RedisKey.SHOP_INFO_CACHE_KEY, shopId);
+        String data = (String) redisUtils.get(key);
+        if (StrUtil.isNotBlank(data)) {
+            return JSONUtil.toBean(data, GoodsShop.class);
+        } else {
+            GoodsShop goodsShop = getById(shopId);
+
+            redisUtils.set(key, JSONUtil.toJsonStr(goodsShop), RedisUtils.TEN_MINUTE_ONE_EXPIRE);
+
+            return goodsShop;
+        }
+    }
+
+    @Override
     public Result sendMsgs(String phone, String state) {
         return userService.sendMsg(phone,"ruzhu");
     }

+ 2 - 1
src/main/java/com/sqx/modules/sys/redis/SysConfigRedis.java

@@ -31,6 +31,7 @@ public class SysConfigRedis {
 
     public SysConfigEntity get(String configKey){
         String key = RedisKeys.getSysConfigKey(configKey);
-        return redisUtils.get(key, SysConfigEntity.class);
+        Object o = redisUtils.get(key);
+        return (SysConfigEntity) o;
     }
 }

+ 9 - 8
src/main/java/com/sqx/modules/sys/service/SysConfigService.java

@@ -3,6 +3,7 @@ package com.sqx.modules.sys.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.modules.sys.entity.SysConfigEntity;
+import org.apache.poi.ss.formula.functions.T;
 
 import java.util.Map;
 
@@ -13,39 +14,39 @@ import java.util.Map;
 public interface SysConfigService extends IService<SysConfigEntity> {
 
 	PageUtils queryPage(Map<String, Object> params);
-	
+
 	/**
 	 * 保存配置信息
 	 */
 	public void saveConfig(SysConfigEntity config);
-	
+
 	/**
 	 * 更新配置信息
 	 */
 	public void update(SysConfigEntity config);
-	
+
 	/**
 	 * 根据key,更新value
 	 */
 	public void updateValueByKey(String key, String value);
-	
+
 	/**
 	 * 删除配置信息
 	 */
 	public void deleteBatch(Long[] ids);
-	
+
 	/**
 	 * 根据key,获取配置的value值
-	 * 
+	 *
 	 * @param key           key
 	 */
 	public String getValue(String key);
-	
+
 	/**
 	 * 根据key,获取value的Object对象
 	 * @param key    key
 	 * @param clazz  Object对象
 	 */
 	public <T> T getConfigObject(String key, Class<T> clazz);
-	
+
 }

+ 1 - 0
src/main/java/com/sqx/modules/sys/service/SysLogService.java

@@ -4,6 +4,7 @@ package com.sqx.modules.sys.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.modules.sys.entity.SysLogEntity;
+import org.apache.poi.ss.formula.functions.T;
 
 import java.util.Map;
 

+ 1 - 1
src/main/java/com/sqx/modules/sys/service/SysRoleService.java

@@ -22,7 +22,7 @@ public interface SysRoleService extends IService<SysRoleEntity> {
 
 	void deleteBatch(Long[] roleIds);
 
-	
+
 	/**
 	 * 查询用户创建的角色ID列表
 	 */

+ 3 - 3
src/main/java/com/sqx/modules/sys/service/SysUserService.java

@@ -22,7 +22,7 @@ public interface SysUserService extends IService<SysUserEntity> {
 	 * @param userId  用户ID
 	 */
 	List<String> queryAllPerms(Long userId);
-	
+
 	/**
 	 * 查询用户的所有菜单ID
 	 */
@@ -37,12 +37,12 @@ public interface SysUserService extends IService<SysUserEntity> {
 	 * 保存用户
 	 */
 	void saveUser(SysUserEntity user);
-	
+
 	/**
 	 * 修改用户
 	 */
 	void update(SysUserEntity user);
-	
+
 	/**
 	 * 删除用户
 	 */

+ 1 - 1
src/main/java/com/sqx/modules/sys/service/impl/SysConfigServiceImpl.java

@@ -79,7 +79,7 @@ public class SysConfigServiceImpl extends ServiceImpl<SysConfigDao, SysConfigEnt
 
 		return config == null ? null : config.getParamValue();
 	}
-	
+
 	@Override
 	public <T> T getConfigObject(String key, Class<T> clazz) {
 		String value = getValue(key);

+ 1 - 0
src/main/java/com/sqx/modules/sys/service/impl/SysDictServiceImpl.java

@@ -9,6 +9,7 @@ import com.sqx.modules.sys.dao.SysDictDao;
 import com.sqx.modules.sys.entity.SysDictEntity;
 import com.sqx.modules.sys.service.SysDictService;
 import org.apache.commons.lang.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.stereotype.Service;
 
 import java.util.Map;

+ 1 - 0
src/main/java/com/sqx/modules/sys/service/impl/SysLogServiceImpl.java

@@ -9,6 +9,7 @@ import com.sqx.modules.sys.dao.SysLogDao;
 import com.sqx.modules.sys.entity.SysLogEntity;
 import com.sqx.modules.sys.service.SysLogService;
 import org.apache.commons.lang.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.stereotype.Service;
 
 import java.util.Map;

+ 2 - 2
src/main/java/com/sqx/modules/sys/service/impl/SysRoleServiceImpl.java

@@ -101,10 +101,10 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleDao, SysRoleEntity> i
 		if(role.getCreateUserId() == Constant.SUPER_ADMIN){
 			return ;
 		}
-		
+
 		//查询用户所拥有的菜单列表
 		List<Long> menuIdList = sysUserService.queryAllMenuId(role.getCreateUserId());
-		
+
 		//判断是否越权
 		if(!menuIdList.containsAll(role.getMenuIdList())){
 			throw new SqxException("新增角色的权限,已超出你的权限范围");

+ 4 - 4
src/main/java/com/sqx/modules/sys/service/impl/SysUserServiceImpl.java

@@ -112,7 +112,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserDao, SysUserEntity> i
 
 		//检查角色是否越权
 		checkRole(user);
-		
+
 		//保存用户与角色关系
 		sysUserRoleService.saveOrUpdate(user.getUserId(), user.getRoleIdList());
 	}
@@ -142,7 +142,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserDao, SysUserEntity> i
 
 		//检查角色是否越权
 		checkRole(user);
-		
+
 		//保存用户与角色关系
 		sysUserRoleService.saveOrUpdate(user.getUserId(), user.getRoleIdList());
 	}
@@ -199,7 +199,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserDao, SysUserEntity> i
 		if(user.getCreateUserId() == Constant.SUPER_ADMIN){
 			return ;
 		}
-		
+
 		//查询用户创建的角色列表
 		List<Long> roleIdList = sysRoleService.queryRoleIdList(user.getCreateUserId());
 
@@ -208,4 +208,4 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserDao, SysUserEntity> i
 			throw new SqxException("新增用户所选角色,不是本人创建");
 		}*/
 	}
-}
+}

+ 65 - 65
src/main/java/com/sqx/modules/timedtask/controller/AutoSendOrder.java

@@ -62,71 +62,71 @@ public class AutoSendOrder {
     @Autowired
     private PayDetailsDao payDetailsDao;
 
-    //定时自动给骑手推单
-    @Scheduled(cron = "0 * * * * ?", zone = "Asia/Shanghai")
-    public void autoSendOrder(){
-        CommonInfo three = commonInfoService.findOne(304);
-        if("是".equals(three.getValue())){
-            //查看所有支付以后两分钟后的订单(排除同城服务订单)
-            CommonInfo two = commonInfoService.findOne(302);
-            CommonInfo one = commonInfoService.findOne(303);
-            CommonInfo four = commonInfoService.findOne(273);
-            CommonInfo five = commonInfoService.findOne(310);
-            Integer maxNum = Integer.parseInt(commonInfoService.findOne(342).getValue());
-            Double cashDeposit = Double.valueOf(four.getValue());
-            Double distance = Double.valueOf(one.getValue());
-            String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
-            String date = getCurrentTime(Integer.valueOf(two.getValue()));
-            List<TbIndent> tbIndents = tbIndentDao.selectSendOrder(date);
-            //遍历这些订单,查出距离这些订单最近的骑手(骑手需要没有接单,且在订单位置xx米内)
-            for(int i = 0;i<tbIndents.size();i++){
-                GoodsShop goodsShop = goodsShopDao.selectById(tbIndents.get(i).getShopId());
-                    try{
-                        if("3".equals(tbIndents.get(i).getIndentType())&&"0".equals(tbIndents.get(i).getBuyType())){
-                            //没有起点位置,只有终点位置。通过终点位置查距离内最近的骑手
-                            Long userId = tbIndentDao.selectRiderByDictance(tbIndents.get(i).getUserLng(), tbIndents.get(i).getUserLat(),
-                                    distance,cashDeposit,maxNum);
-                            if(userId!=null){
-                                tbIndentDao.indentReceiv(userId, tbIndents.get(i).getIndentNumber(), format,"4");
-                                //自动推单以后,消息通知骑手
-                                UserEntity userEntity = userDao.selectById(userId);
-                                List<String> msgList=new ArrayList<>();
-                                msgList.add("接单项目");
-                                msgList.add(userEntity.getNickName());
-                                msgList.add(format);
-                                msgList.add("系统自动推单");
-                                SenInfoCheckUtil.sendRiderMsg(userEntity.getRiderOpenId(),five.getValue(),msgList,4);
-                                userService.pushToSingleRider("系统自动推单", "系统已为您自动派单,请及时前往派送!", userEntity.getRiderClientid());
-                                userService.sendMsgDXB(userEntity.getPhone(), "autosend", 0);
-                            }
-                        }else {
-                            if(goodsShop!=null&&goodsShop.getAutoSendOrder()!=null&&goodsShop.getAutoSendOrder()==0){
-                                //有起点位置,通过起点位置查距离内最近的骑手
-                                Long userId = tbIndentDao.selectRiderByDictance(tbIndents.get(i).getShopLng(), tbIndents.get(i).getShopLat(),
-                                        distance, cashDeposit,maxNum);
-                                if(userId!=null){
-                                    tbIndentDao.indentReceiv(userId, tbIndents.get(i).getIndentNumber(), format,"3");
-                         //           tbIndentDao.indentReceiving(userId, tbIndents.get(i).getIndentNumber(), format);
-                                    //自动推单以后,消息通知骑手
-                                    UserEntity userEntity = userDao.selectById(userId);
-                                    List<String> msgList=new ArrayList<>();
-                                    msgList.add("接单项目");
-                                    msgList.add(userEntity.getNickName());
-                                    msgList.add(format);
-                                    msgList.add("系统自动推单");
-                                    SenInfoCheckUtil.sendRiderMsg(userEntity.getRiderOpenId(),five.getValue(),msgList,4);
-                                    userService.pushToSingleRider("系统自动推单", "系统已为您自动派单,请及时前往派送!", userEntity.getRiderClientid());
-                                    userService.sendMsgDXB(userEntity.getPhone(), "autosend", 0);
-                                }
-                            }
-                        }
-                    }catch (Exception e){
-                        e.printStackTrace();
-                        log.error("定时任务自动退单异常,异常订单id:"+tbIndents.get(i).getIndentId()+",异常:"+e.getMessage(),e);
-                    }
-                }
-            }
-    }
+    // //定时自动给骑手推单
+    // @Scheduled(cron = "0 * * * * ?", zone = "Asia/Shanghai")
+    // public void autoSendOrder(){
+    //     CommonInfo three = commonInfoService.findOne(304);
+    //     if("是".equals(three.getValue())){
+    //         //查看所有支付以后两分钟后的订单(排除同城服务订单)
+    //         CommonInfo two = commonInfoService.findOne(302);
+    //         CommonInfo one = commonInfoService.findOne(303);
+    //         CommonInfo four = commonInfoService.findOne(273);
+    //         CommonInfo five = commonInfoService.findOne(310);
+    //         Integer maxNum = Integer.parseInt(commonInfoService.findOne(342).getValue());
+    //         Double cashDeposit = Double.valueOf(four.getValue());
+    //         Double distance = Double.valueOf(one.getValue());
+    //         String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+    //         String date = getCurrentTime(Integer.valueOf(two.getValue()));
+    //         List<TbIndent> tbIndents = tbIndentDao.selectSendOrder(date);
+    //         //遍历这些订单,查出距离这些订单最近的骑手(骑手需要没有接单,且在订单位置xx米内)
+    //         for(int i = 0;i<tbIndents.size();i++){
+    //             GoodsShop goodsShop = goodsShopDao.selectById(tbIndents.get(i).getShopId());
+    //                 try{
+    //                     if("3".equals(tbIndents.get(i).getIndentType())&&"0".equals(tbIndents.get(i).getBuyType())){
+    //                         //没有起点位置,只有终点位置。通过终点位置查距离内最近的骑手
+    //                         Long userId = tbIndentDao.selectRiderByDictance(tbIndents.get(i).getUserLng(), tbIndents.get(i).getUserLat(),
+    //                                 distance,cashDeposit,maxNum);
+    //                         if(userId!=null){
+    //                             tbIndentDao.indentReceiv(userId, tbIndents.get(i).getIndentNumber(), format,"4");
+    //                             //自动推单以后,消息通知骑手
+    //                             UserEntity userEntity = userDao.selectById(userId);
+    //                             List<String> msgList=new ArrayList<>();
+    //                             msgList.add("接单项目");
+    //                             msgList.add(userEntity.getNickName());
+    //                             msgList.add(format);
+    //                             msgList.add("系统自动推单");
+    //                             SenInfoCheckUtil.sendRiderMsg(userEntity.getRiderOpenId(),five.getValue(),msgList,4);
+    //                             userService.pushToSingleRider("系统自动推单", "系统已为您自动派单,请及时前往派送!", userEntity.getRiderClientid());
+    //                             userService.sendMsgDXB(userEntity.getPhone(), "autosend", 0);
+    //                         }
+    //                     }else {
+    //                         if(goodsShop!=null&&goodsShop.getAutoSendOrder()!=null&&goodsShop.getAutoSendOrder()==0){
+    //                             //有起点位置,通过起点位置查距离内最近的骑手
+    //                             Long userId = tbIndentDao.selectRiderByDictance(tbIndents.get(i).getShopLng(), tbIndents.get(i).getShopLat(),
+    //                                     distance, cashDeposit,maxNum);
+    //                             if(userId!=null){
+    //                                 tbIndentDao.indentReceiv(userId, tbIndents.get(i).getIndentNumber(), format,"3");
+    //                      //           tbIndentDao.indentReceiving(userId, tbIndents.get(i).getIndentNumber(), format);
+    //                                 //自动推单以后,消息通知骑手
+    //                                 UserEntity userEntity = userDao.selectById(userId);
+    //                                 List<String> msgList=new ArrayList<>();
+    //                                 msgList.add("接单项目");
+    //                                 msgList.add(userEntity.getNickName());
+    //                                 msgList.add(format);
+    //                                 msgList.add("系统自动推单");
+    //                                 SenInfoCheckUtil.sendRiderMsg(userEntity.getRiderOpenId(),five.getValue(),msgList,4);
+    //                                 userService.pushToSingleRider("系统自动推单", "系统已为您自动派单,请及时前往派送!", userEntity.getRiderClientid());
+    //                                 userService.sendMsgDXB(userEntity.getPhone(), "autosend", 0);
+    //                             }
+    //                         }
+    //                     }
+    //                 }catch (Exception e){
+    //                     e.printStackTrace();
+    //                     log.error("定时任务自动退单异常,异常订单id:"+tbIndents.get(i).getIndentId()+",异常:"+e.getMessage(),e);
+    //                 }
+    //             }
+    //         }
+    // }
 
     //定时取消商家长时间未接单的订单
  //   @Scheduled(cron = "0 * * * * ?", zone = "Asia/Shanghai")

+ 28 - 12
src/main/java/com/sqx/modules/utils/SenInfoCheckUtil.java

@@ -1,8 +1,11 @@
 package com.sqx.modules.utils;
 
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Maps;
+import com.sqx.common.constant.RedisKey;
+import com.sqx.common.utils.RedisUtils;
 import com.sqx.modules.common.entity.CommonInfo;
 import com.sqx.modules.common.service.CommonInfoService;
 import lombok.extern.slf4j.Slf4j;
@@ -34,15 +37,16 @@ public class SenInfoCheckUtil {
 
     private static Logger logger = LoggerFactory.getLogger(SenInfoCheckUtil.class);
 
-    private static String MpAccessToken;
-
     // 这里使用静态,让 service 属于类
     private static CommonInfoService commonInfoService;
 
+    private static RedisUtils redisUtils;
+
     // 注入的时候,给类的 service 注入
     @Autowired
-    public void setWxChatContentService(CommonInfoService commonInfoService) {
+    public void setWxChatContentService(CommonInfoService commonInfoService, RedisUtils redisUtils) {
         SenInfoCheckUtil.commonInfoService = commonInfoService;
+        SenInfoCheckUtil.redisUtils = redisUtils;
     }
 
 
@@ -53,10 +57,13 @@ public class SenInfoCheckUtil {
      * @return AccessToken
      */
     public static String getMpToken(){
-        /*if(StringUtils.isEmpty(MpAccessToken)){
-            getMpAccessToken();
-        }*/
-        return getMpAccessToken();
+        String token = (String) redisUtils.get(RedisKey.MP_TOKEN_CACHE_KEY);
+        if (StrUtil.isBlank(token)) {
+            token = getMpAccessToken();
+
+            redisUtils.set(RedisKey.MP_TOKEN_CACHE_KEY, token, RedisUtils.HOUR_ONE_EXPIRE);
+        }
+        return token;
     }
 
     /**
@@ -66,14 +73,23 @@ public class SenInfoCheckUtil {
      * @return AccessToken
      */
     public static String getRiderMpToken(){
-        /*if(StringUtils.isEmpty(MpAccessToken)){
-            getMpAccessToken();
-        }*/
-        return getRiderMpAccessToken();
+        String token = (String) redisUtils.get(RedisKey.MP_OF_RIDER_TOKEN_CACHE_KEY);
+        if (StrUtil.isBlank(token)) {
+            token = getRiderMpAccessToken();
+
+            redisUtils.set(RedisKey.MP_OF_RIDER_TOKEN_CACHE_KEY, token, RedisUtils.HOUR_ONE_EXPIRE);
+        }
+        return token;
     }
 
     public static String getShopMpToken(){
-        return getShopMpAccessToken();
+        String token = (String) redisUtils.get(RedisKey.MP_OF_SHOP_TOKEN_CACHE_KEY);
+        if (StrUtil.isBlank(token)) {
+            token = getShopMpAccessToken();
+
+            redisUtils.set(RedisKey.MP_OF_SHOP_TOKEN_CACHE_KEY, token, RedisUtils.HOUR_ONE_EXPIRE);
+        }
+        return token;
     }
 
 

+ 292 - 10
src/main/java/com/sqx/modules/utils/fieYun/FeiYunUtils.java

@@ -719,7 +719,7 @@ public class FeiYunUtils {
                 }
 
                 if (bplatformNameType_start != null) {
-                    stringBuilder.append(bplatformNameType_start).append("#").append(tbOrder.getCountOrder()).append("-").append("墨轩云商").append(bplatformNameType_end);
+                    stringBuilder.append(bplatformNameType_start).append("#").append(tbOrder.getOrderSequence()).append("-").append("墨轩云商").append(bplatformNameType_end);
                 }
                 if (bshopName_start != null) {
                     stringBuilder.append(bshopName_start).append(tbOrder.getShopName()).append(bshopName_end);
@@ -806,7 +806,7 @@ public class FeiYunUtils {
 
                         case "platform_name":
                             if (isCheck == 1) {
-                                goodStringBuilder.append(start.toString()).append("#").append(tbOrder.getCountOrder()).append("-").append("墨轩云商").append(end.toString());
+                                goodStringBuilder.append(start.toString()).append("#").append(tbOrder.getOrderSequence()).append("-").append("墨轩云商").append(end.toString());
                             }
                             break;
                         case "shop_name":
@@ -955,15 +955,15 @@ public class FeiYunUtils {
                     }
                 }
                 //endregion
-                if(goods_name_start != null){
+                if (goods_name_start != null) {
                     stringBuilder.append(goods_name_start).append("名称").append(goods_name_end).append("     ");
                 }
 
-                if(goods_price_start != null){
+                if (goods_price_start != null) {
                     stringBuilder.append(goods_price_start).append("单价").append(goods_price_end).append("  ");
                 }
 
-                if(goods_num_start != null){
+                if (goods_num_start != null) {
                     stringBuilder.append(goods_num_start).append("数量").append(goods_num_end).append("  ");
                 }
 
@@ -997,7 +997,7 @@ public class FeiYunUtils {
                     } else {
                         stringBuilder.append("  ");
                     }
-                    stringBuilder.append(goods_num_start).append("x"+orderGoods.getGoodsNum()).append(goods_num_end);
+                    stringBuilder.append(goods_num_start).append("x" + orderGoods.getGoodsNum()).append(goods_num_end);
                     stringBuilder.append("   ");
                     if (sum_money_start != null) {
                         stringBuilder.append(sum_money_start).append(sumMoney).append(sum_money_end);
@@ -1092,7 +1092,7 @@ public class FeiYunUtils {
                             break;
                         case "platform_name":
                             if (isCheck == 1) {
-                                payStringBuilder.append(start.toString()).append("#").append(tbOrder.getCountOrder()).append("-").append("墨轩云商").append(end.toString());
+                                payStringBuilder.append(start.toString()).append("#").append(tbOrder.getOrderSequence()).append("-").append("墨轩云商").append(end.toString());
                             }
                             break;
                         case "shop_name":
@@ -1316,7 +1316,7 @@ public class FeiYunUtils {
                         case "platform_name":
 
                             if (isCheck == 1) {
-                                userStringBuilder.append(start.toString()).append("#").append(tbOrder.getCountOrder()).append("-").append("墨轩云商").append(end.toString());
+                                userStringBuilder.append(start.toString()).append("#").append(tbOrder.getOrderSequence()).append("-").append("墨轩云商").append(end.toString());
                             }
                             break;
                         case "shop_name":
@@ -1489,7 +1489,11 @@ public class FeiYunUtils {
                 stringBuilder.append(pay_time_start).append("订餐时间:").append(tbOrder.getPayTime()).append(pay_time_end).append("<BR>");
 
                 stringBuilder.append(userStringBuilder);
-
+                stringBuilder.append("<BR>");
+                //String returnNo = getDigitBarCode();
+                //sb.append("<BC128_C>"+returnNo+"</BC128_C>");
+                stringBuilder.append("<CB><QR>").append(tbOrder.getOrderId()).append("</QR></CB>");
+                stringBuilder.append("<CB>收单码:").append(tbOrder.getOrderId()).append("</CB>");
                 stringBuilder.append("<BR>").append("<BR>").append("<BR>");
                 stringBuilder.append("<CUT>");
                 //endregion
@@ -1567,6 +1571,130 @@ public class FeiYunUtils {
     /**
      * 小票机打印订单接口
      *
+     * @param sn       打印机编号
+     * @param classify 分类 1加油成功出票模版  2提货券推送模版  3加油订单结算模版  4商品消费结算
+     * @return 成功:{"msg":"ok","ret":0,"data":"xxxxxxx_xxxxxxxx_xxxxxxxx","serverExecutedTime":5}
+     * 失败:{"msg":"错误描述","ret":非0,"data":"null","serverExecutedTime":5}
+     */
+    public static String returnPrint(String sn, Integer classify, TbOrder tbOrder) {
+        try {
+            //标签说明:
+            //单标签:
+            //"<BR>"为换行,"<CUT>"为切刀指令(主动切纸,仅限切刀打印机使用才有效果)
+            //"<LOGO>"为打印LOGO指令(前提是预先在机器内置LOGO图片),"<PLUGIN>"为钱箱或者外置音响指令
+            //成对标签:
+            //"<CB></CB>"为居中放大一倍,"<B></B>"为放大一倍,"<C></C>"为居中,<L></L>字体变高一倍
+            //<W></W>字体变宽一倍,"<QR></QR>"为二维码,"<BOLD></BOLD>"为字体加粗,""为右对齐
+            //拼凑订单内容时可参考如下格式
+            //根据打印纸张的宽度,自行调整内容的格式,可参考下面的样例格式
+
+            //region 以前的代码
+            /*content = "<CB>测试打印</CB><BR>";
+            content += "名称      单价  数量 金额<BR>";
+            content += "--------------------------------<BR>";
+            content += "饭       1.0    1   1.0<BR>";
+            content += "炒饭      10.0   10  10.0<BR>";
+            content += "蛋炒饭     10.0   10  100.0<BR>";
+            content += "鸡蛋炒饭    100.0  1   100.0<BR>";
+            content += "番茄蛋炒饭   1000.0 1   100.0<BR>";
+            content += "西红柿蛋炒饭  1000.0 1   100.0<BR>";
+            content += "西红柿鸡蛋炒饭 100.0  10  100.0<BR>";
+            content += "备注:加辣<BR>";
+            content += "--------------------------------<BR>";
+            content += "合计:xx.0元<BR>";
+            content += "送货地点:广州市南沙区xx路xx号<BR>";
+            content += "联系电话:13888888888888<BR>";
+            content += "订餐时间:2016-08-08 08:08:08<BR>";
+            content += "<QR>http://www.dzist.com</QR>";*/
+            //endregion
+            StringBuilder sb = new StringBuilder();
+
+            log.info("utils方法打印开始");
+
+            //region 以前的代码
+            sb.append("<AUDIO-REFUND>");
+            sb.append("#").append(tbOrder.getCountOrder()).append("-").append("墨轩云商<BR>");
+            sb.append("<CB>用户已取消,请勿继续配送</CB><BR>");
+            sb.append(tbOrder.getShopName()+"<BR>");
+            sb.append("订单号:").append(tbOrder.getOrderNumber()).append("<BR>");
+            sb.append("类型:").append(eOrderTypeExtra.stringOf(tbOrder.getOrderTypeExtra())).append("<BR>");
+            sb.append("<BR>");
+            sb.append("<CUT>");
+
+//            String returnNo = getDigitBarCode(tbOrder.getOrderNumber());
+//            //sb.append("<BC128_C>"+returnNo+"</BC128_C>");
+//            sb.append("<CB>").append(returnNo).append("</CB>");
+            String content = sb.toString();
+            log.info("打印内容:" + content);
+            //通过POST请求,发送打印信息到服务器
+            RequestConfig requestConfig = RequestConfig.custom()
+                    .setSocketTimeout(30000)//读取超时
+                    .setConnectTimeout(30000)//连接超时
+                    .build();
+
+            CloseableHttpClient httpClient = HttpClients.custom()
+                    .setDefaultRequestConfig(requestConfig)
+                    .build();
+            String URL = commonInfoService.findOne(325).getValue();
+            String USER = commonInfoService.findOne(326).getValue();
+            String UKEY = commonInfoService.findOne(327).getValue();
+            HttpPost post = new HttpPost(URL);
+            List<NameValuePair> nvps = new ArrayList<NameValuePair>();
+            nvps.add(new BasicNameValuePair("user", USER));
+            String STIME = String.valueOf(System.currentTimeMillis() / 1000);
+            nvps.add(new BasicNameValuePair("stime", STIME));
+            nvps.add(new BasicNameValuePair("sig", signature(USER, UKEY, STIME)));
+            nvps.add(new BasicNameValuePair("apiname", "Open_printMsg"));//固定值,不需要修改
+            nvps.add(new BasicNameValuePair("sn", sn));
+            nvps.add(new BasicNameValuePair("content", content));
+            nvps.add(new BasicNameValuePair("times", "1"));//打印联数
+
+            CloseableHttpResponse response = null;
+            String result = null;
+            try {
+                post.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));
+                response = httpClient.execute(post);
+                int statecode = response.getStatusLine().getStatusCode();
+                if (statecode == 200) {
+                    HttpEntity httpentity = response.getEntity();
+                    if (httpentity != null) {
+                        //服务器返回的JSON字符串,建议要当做日志记录起来
+                        result = EntityUtils.toString(httpentity);
+                    }
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            } finally {
+                try {
+                    if (response != null) {
+                        response.close();
+                    }
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+                try {
+                    post.abort();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+                try {
+                    httpClient.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            log.error("打印返回值:" + result);
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("打印异常:" + e.getMessage(), e);
+        }
+        return null;
+    }
+
+    /**
+     * 小票机打印订单接口
+     *
      * @param sn 打印机编号
      * @return 成功:{"msg":"ok","ret":0,"data":"xxxxxxx_xxxxxxxx_xxxxxxxx","serverExecutedTime":5}
      * 失败:{"msg":"错误描述","ret":非0,"data":"null","serverExecutedTime":5}
@@ -1586,7 +1714,8 @@ public class FeiYunUtils {
             log.info("utils方法打印开始");
 
             //region 以前的代码
-            String content = "<CB>测试打印</CB><BR>";
+            String content = "<AUDIO-REFUND>";
+            content += "<CB>测试打印</CB><BR>";
             content += "名称      单价  数量 金额<BR>";
             content += "--------------------------------<BR>";
             content += "<B>饭       1.0    1   1.0</B><BR>";
@@ -2055,4 +2184,157 @@ public class FeiYunUtils {
     }
 
 
+    /**
+     *    飞鹅技术支持-2020-03-25
+     *    #########################################################################################################
+     *    一,纯数字条件下:
+     *        58mm打印机最大支持28位纯数字,80mm打印机最大支持46位纯数字,超出无效
+     *
+     *        26-28位数字条形码,在数字中不可以出现2个及以上连续的0存在
+     *        23-25位数字条形码,在数字中不可以出现3个及以上连续的0存在
+     *        21-22位数字条形码,在数字中不可以出现4个及以上连续的0存在
+     *        19-20位数字条形码,在数字中不可以出现6个及以上连续的0存在
+     *        17-18位数字条形码,在数字中不可以出现8个及以上连续的0存在
+     *        15-16位数字条形码,在数字中不可以出现10个及以上连续的0存在
+     *        少于或等于14位数字的条形码,0的数量没有影响
+     *    #########################################################################################################
+     *    二,非纯数字混合条件下:
+     *        58mm打印机最大支持14位字符,80mm打印机最大支持23位字符,超出无效
+     *
+     *        支持数字,大小写字母,特殊字符例如:  !@#$%^&*()-=+_
+     *    #########################################################################################################
+     *    把条形码函数返回值,调用飞鹅云打印接口发给打印机打印
+     */
+    private static String getDigitBarCode(String input) {
+        String chr = "";
+        String laststr = "";
+        byte[] codeB = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39 }; // 匹配字符集B
+        byte[] codeC = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+                0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20,
+                0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31,
+                0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42,
+                0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53,
+                0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63 }; // 匹配字符集C
+        int length = input.length();
+        byte[] b = new byte[100];
+        b[0] = 0x1b;
+        b[1] = 0x64;
+        b[2] = 0x02;
+        b[3] = 0x1d;
+        b[4] = 0x48;
+        b[5] = 0x32; // 0x32打印条形码下的数字, 0x30不打印条形码下的数字
+        b[6] = 0x1d;
+        b[7] = 0x68;
+        b[8] = 0x50; // 7F是最大的高度
+        b[9] = 0x1d;
+        b[10] = 0x77;
+        b[11] = 0x02; // 2-6  条码宽度
+        b[12] = 0x1d;
+        b[13] = 0x6b;
+        b[14] = 0x49; // code128
+        b[15] = (byte) (length + 2); // 得出条形码长度
+        b[16] = 0x7b;
+        b[17] = 0x42;
+        boolean result=input.matches("[0-9]+");//判断是否为纯数字
+        if (length > 14 && result == true) {
+            b[17] = 0x43;
+            int j = 0;
+            int key = 18;
+            int ss = length / 2;// 初始化数组长度
+            String temp = "";
+            int iindex = 0;
+            for (int i = 0; i < ss; i++) {
+                temp = input.substring(j, j + 2);
+                iindex = Integer.valueOf(temp);
+                j = j + 2;
+                if (iindex == 0) {
+                    chr = "";
+                    if(b[key + i - 1] == '0' && b[key + i - 2] == '0') {
+                        b[key + i] = codeB[0];
+                        b[key + i+1] = codeB[0];
+                        key+=1;
+                    }else {
+                        if(b[key + i-1] == 'C' && b[key + i-2] == '{' ){//判断前面的为字符集C时转换字符集B
+                            b[key + i - 2] = 0x7b;
+                            b[key + i - 1] = 0x42;
+                            b[key + i] = codeB[0];
+                            b[key + i + 1] = codeB[0];
+                            key += 1;
+                        }else{
+                            b[key + i] = 0x7b;
+                            b[key + i + 1] = 0x42;
+                            b[key + i + 2] = codeB[0];
+                            b[key + i + 3] = codeB[0];
+                            key += 3;
+                        }
+                    }
+                } else {
+                    // 判断前面的为字符集B,此时要转换字符集C
+                    if (b[key + i - 1] == '0' && b[key + i - 2] == '0' && chr != "chr") {
+                        b[key + i] = 0x7b;
+                        b[key + i + 1] = 0x43;
+                        b[key + i + 2] = codeC[iindex];
+                        key += 2;
+                    }else {
+                        chr = "";
+                        b[key + i] = codeC[iindex];
+                        if(iindex == 48) chr = "chr";//判断chr(48)等于0的情况
+                    }
+                }
+            }
+            int lastKey = getLastIndex(b);
+            if (length % 2 > 0) {
+                int lastnum = Integer.valueOf(input.substring(input.length() - 1)); // 取得字符串的最后一个数字
+                if(b[lastKey] == '0' && b[lastKey-1] == '0'){//判断前面的为字符集B,此时不需要转换字符集
+                    b[lastKey + 1] = codeB[lastnum];
+                }else{
+                    b[lastKey + 1] = 0x7b;
+                    b[lastKey + 2] = 0x42;
+                    b[lastKey + 3] = codeB[lastnum];
+                }
+            }
+            // 得出条形码长度
+            int blength = getLastIndex(b);
+            int len = (blength - 15);
+            b[15] = (byte) (len);
+            String str = "";
+            str = new String(b);
+            laststr = str;
+
+            String Last_two = input.substring(input.length()-2,input.length());
+            int Last_two_int = 0;
+            Last_two_int = Integer.valueOf(Last_two);
+            if(Last_two_int > 32) {
+                laststr = laststr.trim().substring(1);
+            }
+        } else { // 1-14位数字的条形码进来这个区间
+            b[15] = (byte) (length+2);
+            laststr = new String(b);
+            laststr = laststr.substring(0, 18);
+            laststr += input;
+        }
+        return laststr;
+    }
+
+
+    // 获取数组中最后一个不是0x0的元素的下标
+    private static int getLastIndex(byte[] b) {
+        if (b == null || b.length == 0) {
+            return 0;
+        }
+        int blength = 0;
+        for (int i = b.length - 1; i >= 0; i--) {
+            if (b[i] != 0x0) {
+                blength = i;
+                break;
+            }
+        }
+        return blength;
+    }
+
+
+    public static void main(String[] args) {
+        String result = getDigitBarCode("!@#$%^&*()-=+_");
+
+    }
 }

+ 18 - 0
src/main/java/com/sqx/scheduler/config/ScheduledConfig.java

@@ -0,0 +1,18 @@
+package com.sqx.scheduler.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+/**
+ * 调度配置
+ *
+ * @auther: codingliang
+ * @date: 2023/5/19 23:15
+ * @description: 调度配置
+ */
+@EnableAsync
+@EnableScheduling
+@Configuration
+public class ScheduledConfig {
+}

+ 35 - 0
src/main/java/com/sqx/scheduler/config/SchedulerLock.java

@@ -0,0 +1,35 @@
+package com.sqx.scheduler.config;
+
+/**
+ * 锁
+ *
+ * @author : codingliang
+ * @date : 2024-09-09 10:08
+ */
+public interface SchedulerLock {
+
+    /**
+     * 预约订单自动接单锁
+     */
+    String ORDER_OF_RESERVATION_AUTO_RECEIVING_LOCK = "wm:lock:order:reservation:auto-receiving";
+
+    /**
+     * 制作中订单自动完成锁
+     */
+    String ORDER_OF_PROD_AUTO_COMPLETED_LOCK = "wm:lock:order:make:auto-prod-completed";
+
+    /**
+     * 待收货订单自动完成锁
+     */
+    String ORDER_OF_WAIT_DELIVERY_AUTO_FINISH_LOCK = "wm:lock:order:wait-delivery:auto-finish";
+
+    /**
+     * 用户优惠券自动过期锁
+     */
+    String COUPON_OF_USER_EXPIRATION_LOCK = "wm:lock:coupon:exp";
+
+    /**
+     * 跑腿订单自动推送锁
+     */
+    String INDENT_AUTO_PUSH_LOCK = "wm:lock:indent:push";
+}

+ 48 - 0
src/main/java/com/sqx/scheduler/coupon/CouponScheduler.java

@@ -0,0 +1,48 @@
+package com.sqx.scheduler.coupon;
+
+import com.sqx.modules.coupon.service.TbCouponService;
+import com.sqx.modules.coupon.service.TbCouponUserService;
+import com.sqx.scheduler.config.SchedulerLock;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+/**
+ * 优惠券定时任务
+ *
+ * @author : codingliang
+ * @date : 2024-09-09 12:22
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class CouponScheduler {
+
+    private final TbCouponUserService tbCouponUserService;
+    private final RedissonClient redissonClient;
+
+    /**
+     * 将所有超过失效时间的优惠券改为失效状态
+     * 每分钟运行一次
+     */
+    @Async
+    @Scheduled(cron = "0 */1 * * * ?", zone = "Asia/Shanghai")
+    public void couponEnd(){
+        RLock lock = redissonClient.getLock(SchedulerLock.COUPON_OF_USER_EXPIRATION_LOCK);
+        lock.lock();
+        try {
+            log.info("用户优惠券自动过期任务运行");
+            tbCouponUserService.updateExpiration();
+            log.info("用户优惠券自动过期任务运行成功");
+        } catch (Exception e) {
+            log.error("用户优惠券自动过期任务运行失败,【{}】", e);
+        } finally {
+            lock.unlock();
+        }
+
+    }
+}

+ 135 - 0
src/main/java/com/sqx/scheduler/indent/IndentScheduler.java

@@ -0,0 +1,135 @@
+package com.sqx.scheduler.indent;
+
+import com.sqx.modules.app.dao.UserDao;
+import com.sqx.modules.app.entity.UserEntity;
+import com.sqx.modules.app.service.UserService;
+import com.sqx.modules.common.entity.CommonInfo;
+import com.sqx.modules.common.service.CommonInfoService;
+import com.sqx.modules.errand.dao.TbIndentDao;
+import com.sqx.modules.errand.entity.TbIndent;
+import com.sqx.modules.goods.dao.GoodsShopDao;
+import com.sqx.modules.goods.entity.GoodsShop;
+import com.sqx.modules.utils.SenInfoCheckUtil;
+import com.sqx.scheduler.config.SchedulerLock;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 跑腿订单定时任务
+ *
+ * @author : codingliang
+ * @date : 2024-09-09 12:28
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class IndentScheduler {
+
+    private final CommonInfoService commonInfoService;
+    private final TbIndentDao tbIndentDao;
+    private final GoodsShopDao goodsShopDao;
+    private final UserService userService;
+    private final UserDao userDao;
+
+    private final RedissonClient redissonClient;
+
+    /**
+     * 定时自动给骑手推单
+     * 每分钟运行一次
+     */
+    @Async
+    @Scheduled(cron = "0 * * * * ?", zone = "Asia/Shanghai")
+    public void autoSendOrder(){
+        RLock lock = redissonClient.getLock(SchedulerLock.INDENT_AUTO_PUSH_LOCK);
+        lock.lock();
+        try {
+            log.info("自动给骑手推单任务开始运行");
+            CommonInfo three = commonInfoService.findOne(304);
+            if("是".equals(three.getValue())){
+                //查看所有支付以后两分钟后的订单(排除同城服务订单)
+                CommonInfo two = commonInfoService.findOne(302);
+                CommonInfo one = commonInfoService.findOne(303);
+                CommonInfo four = commonInfoService.findOne(273);
+                CommonInfo five = commonInfoService.findOne(310);
+                Integer maxNum = Integer.parseInt(commonInfoService.findOne(342).getValue());
+                Double cashDeposit = Double.valueOf(four.getValue());
+                Double distance = Double.valueOf(one.getValue());
+                String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+                String date = getCurrentTime(Integer.valueOf(two.getValue()));
+                List<TbIndent> tbIndents = tbIndentDao.selectSendOrder(date);
+                //遍历这些订单,查出距离这些订单最近的骑手(骑手需要没有接单,且在订单位置xx米内)
+                for(int i = 0;i<tbIndents.size();i++){
+                    GoodsShop goodsShop = goodsShopDao.selectById(tbIndents.get(i).getShopId());
+                    try{
+                        if("3".equals(tbIndents.get(i).getIndentType())&&"0".equals(tbIndents.get(i).getBuyType())){
+                            //没有起点位置,只有终点位置。通过终点位置查距离内最近的骑手
+                            Long userId = tbIndentDao.selectRiderByDictance(tbIndents.get(i).getUserLng(), tbIndents.get(i).getUserLat(),
+                                    distance,cashDeposit,maxNum);
+                            if(userId!=null){
+                                tbIndentDao.indentReceiv(userId, tbIndents.get(i).getIndentNumber(), format,"4");
+                                //自动推单以后,消息通知骑手
+                                UserEntity userEntity = userDao.selectById(userId);
+                                List<String> msgList=new ArrayList<>();
+                                msgList.add("接单项目");
+                                msgList.add(userEntity.getNickName());
+                                msgList.add(format);
+                                msgList.add("系统自动推单");
+                                SenInfoCheckUtil.sendRiderMsg(userEntity.getRiderOpenId(),five.getValue(),msgList,4);
+                                userService.pushToSingleRider("系统自动推单", "系统已为您自动派单,请及时前往派送!", userEntity.getRiderClientid());
+                                userService.sendMsgDXB(userEntity.getPhone(), "autosend", 0);
+                            }
+                        }else {
+                            if(goodsShop!=null&&goodsShop.getAutoSendOrder()!=null&&goodsShop.getAutoSendOrder()==0){
+                                //有起点位置,通过起点位置查距离内最近的骑手
+                                Long userId = tbIndentDao.selectRiderByDictance(tbIndents.get(i).getShopLng(), tbIndents.get(i).getShopLat(),
+                                        distance, cashDeposit,maxNum);
+                                if(userId!=null){
+                                    tbIndentDao.indentReceiv(userId, tbIndents.get(i).getIndentNumber(), format,"3");
+                                    //           tbIndentDao.indentReceiving(userId, tbIndents.get(i).getIndentNumber(), format);
+                                    //自动推单以后,消息通知骑手
+                                    UserEntity userEntity = userDao.selectById(userId);
+                                    List<String> msgList=new ArrayList<>();
+                                    msgList.add("接单项目");
+                                    msgList.add(userEntity.getNickName());
+                                    msgList.add(format);
+                                    msgList.add("系统自动推单");
+                                    SenInfoCheckUtil.sendRiderMsg(userEntity.getRiderOpenId(),five.getValue(),msgList,4);
+                                    userService.pushToSingleRider("系统自动推单", "系统已为您自动派单,请及时前往派送!", userEntity.getRiderClientid());
+                                    userService.sendMsgDXB(userEntity.getPhone(), "autosend", 0);
+                                }
+                            }
+                        }
+                    } catch (Exception e){
+                        e.printStackTrace();
+                        log.error("定时任务自动退单异常,异常订单id:"+tbIndents.get(i).getIndentId()+",异常:"+e.getMessage(),e);
+                    }
+                }
+            }
+            log.info("自动给骑手推单任务运行成功");
+        } catch (Exception e) {
+            log.error("自动给骑手推单任务开始运行失败,【{}】", e);
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    private String getCurrentTime(int i){
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Calendar beforeTime = Calendar.getInstance();
+        beforeTime.add(Calendar.MINUTE, -i);
+        Date beforeD = beforeTime.getTime();
+        String time = sdf.format(beforeD);
+        return time;
+    }
+}

+ 164 - 0
src/main/java/com/sqx/scheduler/order/OrderScheduler.java

@@ -0,0 +1,164 @@
+package com.sqx.scheduler.order;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.sqx.modules.common.entity.CommonInfo;
+import com.sqx.modules.common.service.CommonInfoService;
+import com.sqx.modules.order.entity.TbOrder;
+import com.sqx.modules.order.service.AppOrderService;
+import com.sqx.scheduler.config.SchedulerLock;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 订单定时任务
+ *
+ * @author : codingliang
+ * @date : 2024-08-19 20:42
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class OrderScheduler {
+
+    private final RedissonClient redissonClient;
+    private final AppOrderService orderService;
+    private final CommonInfoService commonInfoService;
+
+    /**
+     * 预约订单自动接单
+     * 5分钟运行一次
+     */
+    @Async
+    @Scheduled(cron = "0 */5 * * * ?")
+    public void reservationAutoReceivingOrder() {
+        RLock lock = redissonClient.getLock(SchedulerLock.ORDER_OF_RESERVATION_AUTO_RECEIVING_LOCK);
+        lock.lock();
+        try {
+            log.info("预约订单自动接单任务开始运行");
+            List<Long> orderIds = orderService.getCurWaitReceivingOrderIds();
+            if (CollUtil.isEmpty(orderIds)) {
+                log.info("没有符合条件的预约订单,预约订单自动接单任务运行....");
+                return;
+            }
+
+            List<TbOrder> waitOrders = orderIds.stream().map(orderId -> {
+                TbOrder waitOrder = new TbOrder();
+                waitOrder.setOrderId(orderId);
+                waitOrder.setStatus(6);
+
+                return waitOrder;
+            }).collect(Collectors.toList());
+
+            for (TbOrder waitOrder : waitOrders) {
+                log.info("预约订单id:{},正在自动接单", waitOrder.getOrderId());
+                try {
+                    orderService.updateOrder(waitOrder);
+                    log.info("预约订单id:{},自动接单成功", waitOrder.getOrderId());
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    log.error("预约单id:{},自动接单失败,失败原因:{}", waitOrder.getOrderId(), e.getMessage());
+                }
+            }
+
+            log.info("预约订单自动接单任务运行成功");
+        } catch (Exception e) {
+            log.error("预约订单自动接单任务运行失败失败原因:{}", e.getMessage());
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * 制作中订单自动制作完成
+     * 每分钟30秒时运行一次
+     */
+    @Async
+    @Scheduled(cron = "30 */1 * * * ?")
+    public void prodIngOrderAutoCompleted(){
+        RLock lock = redissonClient.getLock(SchedulerLock.ORDER_OF_PROD_AUTO_COMPLETED_LOCK);
+        lock.lock();
+        try {
+            log.info("自动制作完成制作中订单任务开始运行");
+            // 获取配置:是否开启制作中订单自动完成
+            String value = commonInfoService.findOne(418).getValue();
+            if("是".equals(value)){
+                String minute = commonInfoService.findOne(419).getValue();
+                LocalDateTime minusMinutes = LocalDateTime.now().minusMinutes(Long.valueOf(minute));
+
+                // 获取制作中状态的订单列表
+                List<TbOrder> orders = orderService.getProdIngOrders(minusMinutes);
+                if (CollUtil.isEmpty(orders)) {
+                    log.info("当前时间段没有需要自动制作完成的订单");
+                } else {
+                    for (TbOrder order: orders){
+                        try {
+                            log.info("订单:{},开始自动制作完成", order.getOrderId());
+                            order.setStatus(3);
+                            orderService.updateOrder(order);
+                            log.info("订单:{},自动制作完成", order.getOrderId());
+                        } catch (Exception e){
+                            e.printStackTrace();
+                            log.error("订单:{},自动完成异常,异常原因:【{}】", order.getOrderId(), e);
+                        }
+                    }
+                }
+            }
+            log.info("自动制作完成制作中订单任务运行成功");
+        } catch (Exception e) {
+            log.error("制作中订单自动制作完成任务运行失败失败原因:【{}】", e);
+        } finally {
+            lock.unlock();
+        }
+    }
+
+    /**
+     * 自动完成订单
+     * 每30s运行一次
+     */
+    @Async
+    @Scheduled(cron = "45 */1 * * * ?")
+    public void autoFinishOrder() {
+        RLock lock = redissonClient.getLock(SchedulerLock.ORDER_OF_WAIT_DELIVERY_AUTO_FINISH_LOCK);
+        lock.lock();
+        try {
+            log.info("自动完成订单任务开始运行");
+            CommonInfo one = commonInfoService.findOne(268);
+            DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+            // 查询所有 待取餐/派送中 状态的订单
+            QueryWrapper<TbOrder> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("status", 3);
+            List<TbOrder> orders = orderService.list(queryWrapper);
+
+            for (TbOrder order: orders) {
+                LocalDateTime updateTime = LocalDateTime.parse(order.getUpdateTime(), df);
+                // 计算当前订单什么时候超时完成
+                LocalDateTime overDateTime = updateTime.plusHours(Integer.parseInt(one.getValue()));
+                if (LocalDateTime.now().isAfter(overDateTime)) {
+                    log.info("订单id:{},开始自动完成", order.getOrderId());
+                    try {
+                        orderService.accomplishOrders(order.getOrderId(),2);
+                    } catch (Exception e) {
+                        log.error("订单id:{},开始自动完成失败,失败原因【{}】", order.getOrderId(), e);
+                    }
+                    log.info("订单id:{},完成自动完成", order.getOrderId());
+                }
+            }
+            log.info("自动完成订单任务运行成功");
+        } catch (Exception e) {
+            log.info("自动完成订单任务运行异常,异常", e);
+        } finally {
+            lock.unlock();
+        }
+    }
+}

+ 13 - 0
src/main/resources/application-dev.yml

@@ -32,6 +32,19 @@ spring:
                 wall:
                     config:
                         multi-statement-allow: true
+    redis:
+        host: 103.131.169.54
+        port: 6379
+        password: dev@redis@1234
+        database: 3
+        timeout: 5000
+        lettuce:
+            shutdown-timeout: 100
+            pool:
+                max-active: 3
+                min-idle: 2
+                max-idle: 3
+                max-wait: -1
 secure-api:
     # 开启SecureApi功能,如果为false则其余配置项均不生效
     enabled: true

+ 14 - 1
src/main/resources/application-prod.yml

@@ -32,12 +32,25 @@ spring:
                 wall:
                     config:
                         multi-statement-allow: true
+    redis:
+        host: 172.16.20.103
+        port: 6379
+        password: ch_wm_redis_2025@.
+        database: 3
+        timeout: 5000
+        lettuce:
+            shutdown-timeout: 100
+            pool:
+                max-active: 3
+                min-idle: 2
+                max-idle: 3
+                max-wait: -1
 # 接口数据加密
 secure-api:
     # 开启SecureApi功能,如果为false则其余配置项均不生效
     enabled: true
     # 开启加解密日志打印,会打印出接口名、加密模式、算法、明文和密文等信息
-    show-log: true
+    show-log: false
     url-safe: true
     # 加密模式,common和session_key可选,session_key是会话密钥模式,用于每次请求都使用不同的密钥,需要前端配合
     mode: common

+ 4 - 16
src/main/resources/application.yml

@@ -19,7 +19,7 @@ spring:
     allow-circular-references: true
   # 环境 dev|test|prod
   profiles:
-    active: prod
+    active: dev
   # jackson时间格式化
   jackson:
     time-zone: GMT+8
@@ -29,19 +29,7 @@ spring:
       max-file-size: 1024MB
       max-request-size: 1024MB
       enabled: true
-  redis:
-    open: false  # 是否开启redis缓存  true开启   false关闭
-    database: 0
-    host: 103.131.169.54
-    port: 6379
-    password: dev@redis@1234    # 密码(默认为空)
-    timeout: 6000ms  # 连接超时时长(毫秒)
-    jedis:
-      pool:
-        max-active: 1000  # 连接池最大连接数(使用负值表示没有限制)
-        max-wait: -1ms      # 连接池最大阻塞等待时间(使用负值表示没有限制)
-        max-idle: 10      # 连接池中的最大空闲连接
-        min-idle: 5       # 连接池中的最小空闲连接
+
   mvc:
     throw-exception-if-no-handler-found: true
     pathmatch:
@@ -72,11 +60,11 @@ mybatis-plus:
     cache-enabled: false
     call-setters-on-nulls: true
     jdbc-type-for-null: 'null'
-    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 
 sqx:
   redis:
-    open: false
+    open: true
   shiro:
     redis: false
   # APP模块,是通过jwt认证的,如果要使用APP模块,则需要修改【加密秘钥】

+ 1 - 1
src/main/resources/mapper/coupon/TbCouponUserMapper.xml

@@ -22,7 +22,7 @@
     </select>
 
     <update id="updateExpiration">
-        update tb_coupon_user set status = 2 where date_format(expiration_time,'%Y-%m-%d %H:%i:%S') &lt; date_format(now(),'%Y-%m-%d %H:%i:%S')
+        update tb_coupon_user set status = 2 where status = 0 and date_format(expiration_time,'%Y-%m-%d %H:%i:%S') &lt; date_format(now(),'%Y-%m-%d %H:%i:%S')
     </update>
 
     <select id="selectCouponByUserId" resultType="com.sqx.modules.coupon.entity.TbCouponUser">

+ 26 - 3
src/main/resources/mapper/errand/TbIndentMapper.xml

@@ -71,7 +71,7 @@
             </if>
         </where>
         group by
-            shop_id
+            shop_id, shop_name
         order by
             distancess asc
     </select>
@@ -133,7 +133,7 @@
             and shop_id = #{queryDTO.shopId}
         </if>
         group by
-            shop_id
+            shop_id, shop_name, shop_lng, shop_lat
         order by
             distancess asc
     </select>
@@ -144,6 +144,12 @@
         where indent_number = #{indentNumber}
     </select>
 
+    <select id="findIndentByOrderId" resultType="com.sqx.modules.errand.entity.TbIndent">
+        select *
+        from tb_indent
+        where order_id = #{orderId}
+    </select>
+
     <select id="selectIndentByRiderUserCount" resultType="Integer">
         select count(*)
         from tb_indent
@@ -166,6 +172,22 @@
         where indent_number = #{indentNumber}
     </update>
 
+    <update id="orderIndentReceiv">
+        update tb_indent
+        set indent_state   = #{state},
+            rider_user_id  = #{userId},
+            receiving_time = #{format}
+        where order_id = #{orderId}
+    </update>
+
+    <update id="orderIndentReceiving">
+        update tb_indent
+        set indent_state   = 4,
+            rider_user_id  = #{userId},
+            receiving_time = #{format}
+        where order_id = #{orderId}
+    </update>
+
     <select id="findRiderIndent" resultType="com.sqx.modules.errand.entity.TbIndent">
         select * from tb_indent where rider_user_id = #{userId}
         <if test="indentState!=''">
@@ -247,6 +269,7 @@
         where indent_number = #{indentNumber}
     </select>
 
+
     <update id="updateRiderBalance">
         update tb_user
         set balance = #{balance}
@@ -837,4 +860,4 @@ select tu.user_id, (st_distance (point (station_lat, station_lng), point(#{userL
         order by distance asc limit 1
     -->
 
-</mapper>
+</mapper>

+ 31 - 2
src/main/resources/mapper/order/OrderMapper.xml

@@ -85,13 +85,16 @@
         select tor.*, tu.avatar as avatar, gs.shop_name as shopName, gs.detailed_address as detailedAddress, gs.phone as
         shopPhone,
         tiu.user_name as riderNickName,tiu.phone as riderPhone,ti.indent_id as indentId,ti.is_rider as isRider,
-        ti.rider_user_id as riderUserId, tcu.money as couponMoney
+        ti.rider_user_id as riderUserId, tcu.money as couponMoney,
+        apr.discount_amount as activityDiscountAmount, ai.title activityTitle
         from tb_order tor
         left join tb_user tu on tor.user_id = tu.user_id
         left join goods_shop gs on tor.shop_id = gs.shop_id
         left join tb_indent ti on tor.order_id = ti.order_id
         left join tb_user tiu on tiu.user_id = ti.rider_user_id
         left join tb_coupon_user tcu on tor.coupon_id = tcu.id
+        left join activity_part_record apr on apr.order_id = tor.order_id
+        left join activity ai on ai.id = apr.activity_id
         where 1 = 1
         <if test="riderPhone!=null and riderPhone!=''">
             and tiu.phone =#{riderPhone}
@@ -120,12 +123,24 @@
         <if test="orderType!=null">
             and tor.order_type_extra = #{orderType}
         </if>
+        <if test="indentStatus != null and indentStatus != ''">
+            and ti.indent_state = #{indentStatus}
+        </if>
+        <if test="reservationFlag != null and reservationFlag !=''">
+            and tor.reservation_flag = #{reservationFlag}
+        </if>
         <if test="startTime!=null and startTime!=''">
             and date_format(tor.create_time,'%Y-%m-%d') >= date_format(#{startTime},'%Y-%m-%d')
         </if>
         <if test="endTime!=null and endTime!='' ">
             and date_format(tor.create_time,'%Y-%m-%d') &lt;= date_format(#{endTime},'%Y-%m-%d')
         </if>
+        <if test="payStartTime != null and payStartTime != ''">
+            and date_format(tor.pay_time,'%Y-%m-%d') >= date_format(#{payStartTime},'%Y-%m-%d')
+        </if>
+        <if test="payEndTime != null and payEndTime != '' ">
+            and date_format(tor.pay_time,'%Y-%m-%d') &lt;= date_format(#{payEndTime},'%Y-%m-%d')
+        </if>
         order by tor.pay_time desc, tor.create_time desc
     </select>
 
@@ -133,13 +148,16 @@
         select tor.*, tu.avatar as avatar, gs.shop_name as shopName, gs.detailed_address as detailedAddress, gs.phone as
         shopPhone,
         tiu.nick_name as riderNickName,tiu.phone as riderPhone,ti.indent_id as indentId,ti.is_rider as isRider,
-        ti.rider_user_id as riderUserId, tcu.money as couponMoney
+        ti.rider_user_id as riderUserId, tcu.money as couponMoney,
+        apr.discount_amount as activityDiscountAmount, ai.title activityTitle
         from tb_order tor
         left join tb_user tu on tor.user_id = tu.user_id
         left join goods_shop gs on tor.shop_id = gs.shop_id
         left join tb_indent ti on tor.order_id = ti.order_id
         left join tb_user tiu on tiu.user_id = ti.rider_user_id
         left join tb_coupon_user tcu on tor.coupon_id = tcu.id
+        left join activity_part_record apr on apr.order_id = tor.order_id
+        left join activity ai on ai.id = apr.activity_id
         where 1 = 1
         <if test="riderPhone!=null and riderPhone!=''">
             and tiu.phone =#{riderPhone}
@@ -446,4 +464,15 @@
         where shop_id = #{shopId} and status in (6, 3)
     </select>
 
+    <select id="countCurDayPayByShopId" resultType="java.lang.Integer">
+        select
+            count(order_id)
+        from
+            tb_order
+        where
+            is_pay = 1
+          and shop_id = #{shopId}
+          and date(pay_time) = date(#{payTime})
+    </select>
+
 </mapper>

+ 39 - 0
src/test/java/OrderTest.java

@@ -0,0 +1,39 @@
+import com.sqx.SqxApplication;
+import com.sqx.common.utils.RedisUtils;
+import com.sqx.modules.order.service.AppOrderService;
+import com.sqx.modules.pay.service.WxService;
+import com.sqx.scheduler.order.OrderScheduler;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import javax.annotation.Resource;
+
+/**
+ * @author : codingliang
+ * @date : 2024-09-10 16:24
+ */
+@Slf4j
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = SqxApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class OrderTest {
+
+    @Resource
+    private AppOrderService appOrderService;
+
+    @Resource
+    private OrderScheduler orderScheduler;
+
+    @Resource
+    private WxService wxService;
+
+    @Resource
+    private RedisUtils redisUtils;
+
+    @Test
+    public void test() {
+
+    }
+}