Browse Source

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

wanxl 1 year ago
parent
commit
95ae796444
93 changed files with 2689 additions and 1062 deletions
  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>
             <groupId>org.springframework</groupId>
             <artifactId>spring-context-support</artifactId>
             <artifactId>spring-context-support</artifactId>
         </dependency>
         </dependency>
+
         <dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
         </dependency>
+
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson</artifactId>
+            <version>3.21.1</version>
+        </dependency>
+
         <dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-configuration-processor</artifactId>
             <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;
 import icu.xuyijie.secureapi.cipher.CipherUtils;
 
 
 /**
 /**
- * TODO
- *
  * @author : codingliang
  * @author : codingliang
  * @date : 2024-08-07 11:01
  * @date : 2024-08-07 11:01
  */
  */

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

@@ -1,24 +1,39 @@
 package com.sqx;
 package com.sqx;
 
 
+import com.sqx.common.utils.MyGlobalThreadPool;
+import org.springframework.boot.CommandLineRunner;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 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
 @SpringBootApplication
-public class SqxApplication {
+public class SqxApplication implements CommandLineRunner, ApplicationListener<ApplicationEvent> {
 
 
 	public static void main(String[] args) {
 	public static void main(String[] args) {
 		SpringApplication.run(SqxApplication.class, 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 {
 public class RedisAspect {
     private Logger logger = LoggerFactory.getLogger(getClass());
     private Logger logger = LoggerFactory.getLogger(getClass());
     //是否开启redis缓存  true开启   false关闭
     //是否开启redis缓存  true开启   false关闭
-    @Value("${spring.redis.open: false}")
+    @Value("${sqx.redis.open:false}")
     private boolean open;
     private boolean open;
 
 
     @Around("execution(* com.sqx.common.utils.RedisUtils.*(..))")
     @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;
 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 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;
 import java.util.concurrent.TimeUnit;
 
 
 /**
 /**
@@ -13,78 +17,142 @@ import java.util.concurrent.TimeUnit;
  */
  */
 @Component
 @Component
 public class RedisUtils {
 public class RedisUtils {
-    @Autowired
+    @Resource
     private RedisTemplate<String, Object> redisTemplate;
     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;
     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;
     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) {
     public void delete(String key) {
         redisTemplate.delete(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;
 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.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.IOException;
@@ -20,10 +23,10 @@ public class XssFilter implements Filter {
 	@Override
 	@Override
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
             throws IOException, ServletException {
             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;
 		HttpServletResponse hresp = (HttpServletResponse) response;
 
 

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

@@ -1,11 +1,15 @@
 package com.sqx.config;
 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.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.data.redis.connection.RedisConnectionFactory;
 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配置
  * Redis配置
@@ -13,42 +17,30 @@ import org.springframework.data.redis.serializer.StringRedisSerializer;
  */
  */
 @Configuration
 @Configuration
 public class RedisConfig {
 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
     @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")
 @RequestMapping("admin/activity-part-record")
 @RequiredArgsConstructor
 @RequiredArgsConstructor
 public class ActivityPartRecordController{
 public class ActivityPartRecordController{
-    
+
     private final ActivityPartRecordService activityPartRecordService;
     private final ActivityPartRecordService activityPartRecordService;
 
 
     @GetMapping("page")
     @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);
     void saveByOrderAndSuitActivityVO(TbOrder order, OrderSuitActivityVO orderBestActivity);
 
 
     ActivityPartRecordVO getVoById(Long recordId);
     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.ActivityOrderVO;
 import com.sqx.modules.activity.vo.ActivityVO;
 import com.sqx.modules.activity.vo.ActivityVO;
 import com.sqx.modules.activity.vo.OrderSuitActivityVO;
 import com.sqx.modules.activity.vo.OrderSuitActivityVO;
+import org.apache.poi.ss.formula.functions.T;
 
 
 import java.util.List;
 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.entity.ActivityShop;
 import com.sqx.modules.activity.vo.ShopActivityGroupVO;
 import com.sqx.modules.activity.vo.ShopActivityGroupVO;
 import com.sqx.modules.activity.vo.ShopActivityVO;
 import com.sqx.modules.activity.vo.ShopActivityVO;
+import org.apache.poi.ss.formula.functions.T;
 
 
 import java.util.List;
 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) {
     public ActivityPartRecordVO getVoById(Long recordId) {
         return baseMapper.getVoById(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.entity.TbOrder;
 import com.sqx.modules.order.service.AppOrderService;
 import com.sqx.modules.order.service.AppOrderService;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 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());
             List<ActivityShop> waitDelList = oldActivityShops.stream().filter(e -> !existActivityIds.contains(e.getActivityId())).collect(Collectors.toList());
 
 
             if (waitDelList.size() > 0) {
             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.common.utils.Result;
 import com.sqx.modules.app.entity.UserEntity;
 import com.sqx.modules.app.entity.UserEntity;
 import com.sqx.modules.errand.entity.Feedback;
 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.List;
 import java.util.Map;
 import java.util.Map;
@@ -202,7 +202,7 @@ public interface UserService extends IService<UserEntity> {
     void pushToSingleShop(String title, String content, String clientId);
     void pushToSingleShop(String title, String content, String clientId);
 
 
     PageUtils selectUserPage(Integer page, Integer limit, String search, Integer sex, String platform, String sysPhone,
     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);
     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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
 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.UserMoneyDetailsService;
 import com.sqx.modules.app.service.UserMoneyService;
 import com.sqx.modules.app.service.UserMoneyService;
-
 import com.sqx.modules.common.entity.CommonInfo;
 import com.sqx.modules.common.entity.CommonInfo;
 import com.sqx.modules.common.service.CommonInfoService;
 import com.sqx.modules.common.service.CommonInfoService;
 import com.sqx.modules.order.entity.TbOrder;
 import com.sqx.modules.order.entity.TbOrder;
@@ -22,7 +27,6 @@ import org.springframework.stereotype.Service;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.ArrayList;
-import java.util.Calendar;
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 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;
 package com.sqx.modules.app.service.impl;
 
 
-import cn.hutool.system.UserInfo;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONException;
 import com.alibaba.fastjson.JSONException;
 import com.alibaba.fastjson.JSONObject;
 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.service.UserService;
 import com.sqx.modules.app.utils.JwtUtils;
 import com.sqx.modules.app.utils.JwtUtils;
 import com.sqx.modules.app.utils.UserConstantInterface;
 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.entity.CommonInfo;
 import com.sqx.modules.common.service.CommonInfoService;
 import com.sqx.modules.common.service.CommonInfoService;
 import com.sqx.modules.errand.entity.Feedback;
 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.message.service.MessageService;
 import com.sqx.modules.utils.HttpClientUtil;
 import com.sqx.modules.utils.HttpClientUtil;
 import com.sqx.modules.utils.InvitationCodeUtil;
 import com.sqx.modules.utils.InvitationCodeUtil;
-import com.sqx.modules.utils.MD5Util;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
@@ -1035,7 +1032,7 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements
 
 
     @Override
     @Override
     public PageUtils selectUserPage(Integer page, Integer limit, String search, Integer sex, String platform, String sysPhone, Integer status,
     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);
         Page<UserEntity> pages = new Page<>(page, limit);
         return new PageUtils(baseMapper.selectUserPage(pages, search, sex, platform, sysPhone, status, type, userName, isVip, shopAdminFlag, nickName));
         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.PageUtils;
 import com.sqx.common.utils.Result;
 import com.sqx.common.utils.Result;
 import com.sqx.modules.banner.entity.Banner;
 import com.sqx.modules.banner.entity.Banner;
+import org.apache.poi.ss.formula.functions.T;
 
 
 import java.util.List;
 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.baomidou.mybatisplus.extension.service.IService;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.modules.chat.entity.ChatContent;
 import com.sqx.modules.chat.entity.ChatContent;
+import org.apache.poi.ss.formula.functions.T;
 
 
 public interface ChatContentService  extends IService<ChatContent> {
 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 updateChatContentStatusByUserIdAndChatId(Long userId,Long chatConversationId);
 
 
     int selectChatCount(Long userId);
     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> {
 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);
     int insertChatConversation(ChatConversation chatConversation);
 
 
@@ -16,4 +16,4 @@ public interface ChatConversationService extends IService<ChatConversation> {
 
 
     Result insertChatConversations(ChatConversation 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
     @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));
         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);
         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.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 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.PageUtils;
 import com.sqx.common.utils.Result;
 import com.sqx.common.utils.Result;
 import com.sqx.modules.app.entity.UserEntity;
 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.ChatContentService;
 import com.sqx.modules.chat.service.ChatConversationService;
 import com.sqx.modules.chat.service.ChatConversationService;
 import org.apache.commons.lang.StringUtils;
 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.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import javax.annotation.Resource;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.Date;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
 
 
 @Service
 @Service
 public class ChatConversationServiceImpl extends ServiceImpl<ChatConversationDao, ChatConversation> implements ChatConversationService {
 public class ChatConversationServiceImpl extends ServiceImpl<ChatConversationDao, ChatConversation> implements ChatConversationService {
 
 
-    private ReentrantReadWriteLock reentrantReadWriteLock=new ReentrantReadWriteLock();
     @Autowired
     @Autowired
     private UserService userService;
     private UserService userService;
     @Autowired
     @Autowired
     private ChatContentService chatContentService;
     private ChatContentService chatContentService;
+    @Resource
+    private RedissonClient redissonClient;
 
 
     @Override
     @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));
         return new PageUtils(baseMapper.selectChatConversationPage(new Page<>(page,limit),userId,nickName,content));
     }
     }
 
 
-
     @Override
     @Override
     public int insertChatConversation(ChatConversation chatConversation) {
     public int insertChatConversation(ChatConversation chatConversation) {
         return baseMapper.insertChatConversation(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));
         return baseMapper.selectOne(new QueryWrapper<ChatConversation>().eq("focused_user_id", userId).eq("user_id", focusedUserId));
     }
     }
 
 
-
     @Override
     @Override
     public Result insertChatConversations(ChatConversation chatConversation){
     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());
             ChatConversation chatConversation1 = selectChatConversation(chatConversation.getUserId(), chatConversation.getFocusedUserId());
             if(chatConversation1==null){
             if(chatConversation1==null){
                 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                 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",chatConversation);
             }
             }
             return Result.success().put("data",chatConversation1);
             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;
 package com.sqx.modules.common.service.impl;
 
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 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.common.utils.Result;
 import com.sqx.modules.common.dao.CommonInfoDao;
 import com.sqx.modules.common.dao.CommonInfoDao;
 import com.sqx.modules.common.entity.CommonInfo;
 import com.sqx.modules.common.entity.CommonInfo;
 import com.sqx.modules.common.service.CommonInfoService;
 import com.sqx.modules.common.service.CommonInfoService;
-import org.springframework.beans.factory.annotation.Autowired;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
@@ -16,15 +19,12 @@ import java.util.Date;
  * @date 2020/7/8
  * @date 2020/7/8
  */
  */
 @Service
 @Service
+@RequiredArgsConstructor
 public class CommonInfoServiceImpl extends ServiceImpl<CommonInfoDao, CommonInfo> implements CommonInfoService {
 public class CommonInfoServiceImpl extends ServiceImpl<CommonInfoDao, CommonInfo> implements CommonInfoService {
 
 
-
     private final CommonInfoDao commonInfoDao;
     private final CommonInfoDao commonInfoDao;
 
 
-    @Autowired
-    public CommonInfoServiceImpl(CommonInfoDao commonInfoDao) {
-        this.commonInfoDao = commonInfoDao;
-    }
+    private final RedisUtils redisUtils;
 
 
     @Override
     @Override
     public Result update(CommonInfo commonInfo) {
     public Result update(CommonInfo commonInfo) {
@@ -38,7 +38,14 @@ public class CommonInfoServiceImpl extends ServiceImpl<CommonInfoDao, CommonInfo
 
 
     @Override
     @Override
     public CommonInfo findOne(int id) {
     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
     @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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
 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.TbCouponDao;
 import com.sqx.modules.coupon.dao.TbCouponUserDao;
 import com.sqx.modules.coupon.dao.TbCouponUserDao;
 import com.sqx.modules.coupon.entity.TbCoupon;
 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.coupon.service.TbCouponService;
 import com.sqx.modules.datacentre.entity.SysUserShop;
 import com.sqx.modules.datacentre.entity.SysUserShop;
-import com.sqx.modules.goods.entity.GoodsShop;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 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.dao.UserIntegralDetailsDao;
 import com.sqx.modules.integral.entity.UserIntegral;
 import com.sqx.modules.integral.entity.UserIntegral;
 import com.sqx.modules.integral.entity.UserIntegralDetails;
 import com.sqx.modules.integral.entity.UserIntegralDetails;
-import com.sqx.modules.integral.service.UserIntegralService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 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 org.springframework.transaction.annotation.Transactional;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
-import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Calendar;
 import java.util.Date;
 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.entity.UserEntity;
 import com.sqx.modules.app.service.UserService;
 import com.sqx.modules.app.service.UserService;
 import com.sqx.modules.common.service.CommonInfoService;
 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.ErrandAddress;
 import com.sqx.modules.errand.entity.ErrandComplaint;
 import com.sqx.modules.errand.entity.ErrandComplaint;
 import com.sqx.modules.errand.entity.ErrandEvaluate;
 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.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import io.swagger.annotations.ApiParam;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -52,7 +51,7 @@ public class AppTbIndentController {
     @Login
     @Login
     @PostMapping(value = "distance")
     @PostMapping(value = "distance")
     @ApiOperation("根据经纬度计算两点之间距离")
     @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);
         return tbIndentService.distance(ol, od, dl, dd);
     }
     }
@@ -60,7 +59,7 @@ public class AppTbIndentController {
     @Login
     @Login
     @ApiOperation("保存用户输入地址")
     @ApiOperation("保存用户输入地址")
     @PostMapping(value = "addUserAddress")
     @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);
         return tbIndentService.addUserAddress(userId, errandAddress);
     }
     }
@@ -68,7 +67,7 @@ public class AppTbIndentController {
     @Login
     @Login
     @ApiOperation("编辑地址")
     @ApiOperation("编辑地址")
     @PostMapping(value = "updateAddress")
     @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);
         return tbIndentService.updateAddress(userId, errandAddress);
     }
     }
@@ -76,7 +75,7 @@ public class AppTbIndentController {
     @Login
     @Login
     @ApiOperation("获取用户历史地址")
     @ApiOperation("获取用户历史地址")
     @GetMapping(value = "findUserAddress")
     @GetMapping(value = "findUserAddress")
-    public Result findUserAddress(@RequestAttribute Long userId){
+    public Result findUserAddress(@RequestAttribute Long userId) {
 
 
         return tbIndentService.findUserAddress(userId);
         return tbIndentService.findUserAddress(userId);
     }
     }
@@ -84,7 +83,7 @@ public class AppTbIndentController {
     @Login
     @Login
     @ApiOperation("根据地址id获取地址信息")
     @ApiOperation("根据地址id获取地址信息")
     @GetMapping(value = "findAddressById")
     @GetMapping(value = "findAddressById")
-    public Result findAddressById(@RequestAttribute Long userId, Integer addressId){
+    public Result findAddressById(@RequestAttribute Long userId, Integer addressId) {
 
 
         return tbIndentService.findAddressById(userId, addressId);
         return tbIndentService.findAddressById(userId, addressId);
     }
     }
@@ -92,7 +91,7 @@ public class AppTbIndentController {
     @Login
     @Login
     @ApiOperation("设置默认地址")
     @ApiOperation("设置默认地址")
     @GetMapping(value = "addDefaultAddress")
     @GetMapping(value = "addDefaultAddress")
-    private Result addDefaultAddress(@RequestAttribute Long userId, Integer addressId){
+    private Result addDefaultAddress(@RequestAttribute Long userId, Integer addressId) {
 
 
         return tbIndentService.addDefaultAddress(userId, addressId);
         return tbIndentService.addDefaultAddress(userId, addressId);
     }
     }
@@ -100,7 +99,7 @@ public class AppTbIndentController {
     @Login
     @Login
     @ApiOperation("删除历史地址")
     @ApiOperation("删除历史地址")
     @GetMapping(value = "delUserAddress")
     @GetMapping(value = "delUserAddress")
-    public Result delUserAddress(@RequestAttribute Long userId, Integer addressId){
+    public Result delUserAddress(@RequestAttribute Long userId, Integer addressId) {
 
 
         return tbIndentService.delUserAddress(userId, addressId);
         return tbIndentService.delUserAddress(userId, addressId);
     }
     }
@@ -108,7 +107,7 @@ public class AppTbIndentController {
     @Login
     @Login
     @ApiOperation("获取订单起点附近5公里内所有骑手")
     @ApiOperation("获取订单起点附近5公里内所有骑手")
     @GetMapping(value = "find5KmRider")
     @GetMapping(value = "find5KmRider")
-    public Result find5KmRider(double lng, double lat){
+    public Result find5KmRider(double lng, double lat) {
 
 
         return tbIndentService.find5KmRider(lng, lat);
         return tbIndentService.find5KmRider(lng, lat);
     }
     }
@@ -116,17 +115,16 @@ public class AppTbIndentController {
     @Login
     @Login
     @ApiOperation("骑手上线时更新骑手坐标")
     @ApiOperation("骑手上线时更新骑手坐标")
     @PostMapping(value = "updateCoordinate")
     @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);
         return tbIndentService.updateCoordinate(userId, lng, lat);
     }
     }
 
 
 
 
-
     @Login
     @Login
     @GetMapping(value = "/findUserInfoById")
     @GetMapping(value = "/findUserInfoById")
     @ApiOperation("获取登陆用户信息")
     @ApiOperation("获取登陆用户信息")
-    public Result findUserInfoById(@RequestAttribute("userId") Long userId){
+    public Result findUserInfoById(@RequestAttribute("userId") Long userId) {
         UserEntity userEntity = tbIndentService.findUserInfoById(userId);
         UserEntity userEntity = tbIndentService.findUserInfoById(userId);
 
 
         return Result.success().put("data", userEntity);
         return Result.success().put("data", userEntity);
@@ -135,7 +133,7 @@ public class AppTbIndentController {
     @Login
     @Login
     @ApiOperation("新用户领取新人红包")
     @ApiOperation("新用户领取新人红包")
     @GetMapping(value = "getNewUserRedPacket")
     @GetMapping(value = "getNewUserRedPacket")
-    public Result getNewUserRedPacket(@RequestAttribute Long userId){
+    public Result getNewUserRedPacket(@RequestAttribute Long userId) {
 
 
         return tbIndentService.getNewUserRedPacket(userId);
         return tbIndentService.getNewUserRedPacket(userId);
     }
     }
@@ -143,7 +141,7 @@ public class AppTbIndentController {
     @Login
     @Login
     @GetMapping(value = "findAllRedPacket")
     @GetMapping(value = "findAllRedPacket")
     @ApiOperation("获取该用户的所有红包")
     @ApiOperation("获取该用户的所有红包")
-    public Result findAllRedPacket(@RequestAttribute Long userId){
+    public Result findAllRedPacket(@RequestAttribute Long userId) {
         List<ErrandRedPacket> allRedPacket = tbIndentService.findAllRedPacket(userId);
         List<ErrandRedPacket> allRedPacket = tbIndentService.findAllRedPacket(userId);
         return Result.success().put("data", allRedPacket);
         return Result.success().put("data", allRedPacket);
     }
     }
@@ -151,7 +149,7 @@ public class AppTbIndentController {
     @Login
     @Login
     @PostMapping(value = "findRedPacket")
     @PostMapping(value = "findRedPacket")
     @ApiOperation("获取用户可用红包")
     @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);
         List<ErrandRedPacket> redPackets = tbIndentService.findRedPacket(userId, indent);
         return Result.success().put("data", redPackets);
         return Result.success().put("data", redPackets);
     }
     }
@@ -159,15 +157,15 @@ public class AppTbIndentController {
     @Login
     @Login
     @PostMapping(value = "basicsMoney")
     @PostMapping(value = "basicsMoney")
     @ApiOperation("计算订单基础价格")
     @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
     @Login
     @PostMapping(value = "addIndent")
     @PostMapping(value = "addIndent")
     @ApiOperation("用户下单")
     @ApiOperation("用户下单")
-    public Result addIndentBuy(@RequestAttribute Long userId, @RequestBody TbIndent tbIndent){
+    public Result addIndentBuy(@RequestAttribute Long userId, @RequestBody TbIndent tbIndent) {
         tbIndent.setUserId(userId);
         tbIndent.setUserId(userId);
         return tbIndentService.addIndentBuy(tbIndent);
         return tbIndentService.addIndentBuy(tbIndent);
     }
     }
@@ -175,7 +173,7 @@ public class AppTbIndentController {
     @Login
     @Login
     @PostMapping(value = "findNewIndent")
     @PostMapping(value = "findNewIndent")
     @ApiOperation("骑手查看可接订单")
     @ApiOperation("骑手查看可接订单")
-    public Result findNewIndent(@RequestAttribute Long userId, @RequestBody TbIndent tbIndent){
+    public Result findNewIndent(@RequestAttribute Long userId, @RequestBody TbIndent tbIndent) {
         String receivingPettern = tbIndent.getReceivingPettern();
         String receivingPettern = tbIndent.getReceivingPettern();
         double riderlat = tbIndent.getRiderlat();
         double riderlat = tbIndent.getRiderlat();
         double riderlng = tbIndent.getRiderlng();
         double riderlng = tbIndent.getRiderlng();
@@ -189,7 +187,7 @@ public class AppTbIndentController {
     @Login
     @Login
     @PostMapping(value = "find-new-indent")
     @PostMapping(value = "find-new-indent")
     @ApiOperation("骑手查看可接订单(新)")
     @ApiOperation("骑手查看可接订单(新)")
-    public Result findNewIndent(@Valid @RequestBody WaitForAcceptOrderQueryDTO queryDTO){
+    public Result findNewIndent(@Valid @RequestBody WaitForAcceptOrderQueryDTO queryDTO) {
         PageUtils newIndent = tbIndentService.findNewIndent(queryDTO);
         PageUtils newIndent = tbIndentService.findNewIndent(queryDTO);
         return Result.success().put("data", newIndent);
         return Result.success().put("data", newIndent);
     }
     }
@@ -197,7 +195,7 @@ public class AppTbIndentController {
     @Login
     @Login
     @PostMapping(value = "find-new-indent-group-by-shop")
     @PostMapping(value = "find-new-indent-group-by-shop")
     @ApiOperation("骑手查看可接订单(按商家分组)")
     @ApiOperation("骑手查看可接订单(按商家分组)")
-    public Result findNewIndentGroupByShop(@Valid @RequestBody WaitForAcceptOrderQueryDTO queryDTO){
+    public Result findNewIndentGroupByShop(@Valid @RequestBody WaitForAcceptOrderQueryDTO queryDTO) {
         PageUtils newIndent = tbIndentService.findNewIndentGroupByShop(queryDTO);
         PageUtils newIndent = tbIndentService.findNewIndentGroupByShop(queryDTO);
         return Result.success().put("data", newIndent);
         return Result.success().put("data", newIndent);
     }
     }
@@ -205,7 +203,7 @@ public class AppTbIndentController {
     @Login
     @Login
     @PostMapping(value = "indentReceiving")
     @PostMapping(value = "indentReceiving")
     @ApiOperation("骑手接单")
     @ApiOperation("骑手接单")
-    public Result indentReceiving(@RequestAttribute Long userId, String indentNumber){
+    public Result indentReceiving(@RequestAttribute Long userId, String indentNumber) {
 
 
         return tbIndentService.indentReceiving(userId, indentNumber);
         return tbIndentService.indentReceiving(userId, indentNumber);
     }
     }
@@ -213,7 +211,7 @@ public class AppTbIndentController {
     @Login
     @Login
     @PostMapping(value = "riderBuyGoods")
     @PostMapping(value = "riderBuyGoods")
     @ApiOperation("骑手修改订单状态")
     @ApiOperation("骑手修改订单状态")
-    public Result riderBuyGoods(@RequestBody TbIndent tbIndent){
+    public Result riderBuyGoods(@RequestBody TbIndent tbIndent) {
 
 
         return tbIndentService.riderBuyGoods(tbIndent);
         return tbIndentService.riderBuyGoods(tbIndent);
     }
     }
@@ -221,9 +219,9 @@ public class AppTbIndentController {
     @Login
     @Login
     @GetMapping(value = "findUserIndent")
     @GetMapping(value = "findUserIndent")
     @ApiOperation("用户查看自己所有订单(全部、待付款、待接单、派送中(已接单未完成)、已完成)")
     @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
     @Login
     @PostMapping(value = "userCancleIndent")
     @PostMapping(value = "userCancleIndent")
     @ApiOperation("用户取消订单")
     @ApiOperation("用户取消订单")
-    public Result userCancleIndent(@RequestAttribute Long userId, String indentNumber){
+    public Result userCancleIndent(@RequestAttribute Long userId, String indentNumber) {
 
 
         return tbIndentService.userCancleIndent(userId, indentNumber);
         return tbIndentService.userCancleIndent(userId, indentNumber);
     }
     }
@@ -245,7 +243,7 @@ public class AppTbIndentController {
     @Login
     @Login
     @GetMapping(value = "findRiderIndent")
     @GetMapping(value = "findRiderIndent")
     @ApiOperation("骑手查看自己所有订单")
     @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);
         return tbIndentService.findRiderIndent(userId, page, limit, indentState);
     }
     }
@@ -268,15 +266,15 @@ public class AppTbIndentController {
     @Login
     @Login
     @PostMapping(value = "riderCancleIndent")
     @PostMapping(value = "riderCancleIndent")
     @ApiOperation("骑手取消订单")
     @ApiOperation("骑手取消订单")
-    public Result riderCancleIndent( String indentNumber){
-        return tbIndentService.riderCancleIndent(indentNumber,1);
+    public Result riderCancleIndent(String indentNumber) {
+        return tbIndentService.riderCancleIndent(indentNumber, 1);
     }
     }
 
 
     //骑手已送达
     //骑手已送达
     @Login
     @Login
     @PostMapping(value = "riderDelivery")
     @PostMapping(value = "riderDelivery")
     @ApiOperation("骑手已送达")
     @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);
         return tbIndentService.riderDelivery(userId, riderDeliveryDTO);
     }
     }
@@ -293,7 +291,7 @@ public class AppTbIndentController {
     @Login
     @Login
     @PostMapping(value = "userDelivery")
     @PostMapping(value = "userDelivery")
     @ApiOperation("用户确认已送达")
     @ApiOperation("用户确认已送达")
-    public Result userDelivery(@RequestAttribute Long userId, String indentNumber){
+    public Result userDelivery(@RequestAttribute Long userId, String indentNumber) {
 
 
         return tbIndentService.userDelivery(userId, indentNumber);
         return tbIndentService.userDelivery(userId, indentNumber);
     }
     }
@@ -301,14 +299,14 @@ public class AppTbIndentController {
     @Login
     @Login
     @PostMapping(value = "userEvaluate")
     @PostMapping(value = "userEvaluate")
     @ApiOperation("用户评价(评价等级和内容)")
     @ApiOperation("用户评价(评价等级和内容)")
-    public Result userEvaluate(@RequestAttribute Long userId, @RequestBody ErrandEvaluate errandEvaluate){
+    public Result userEvaluate(@RequestAttribute Long userId, @RequestBody ErrandEvaluate errandEvaluate) {
         errandEvaluate.setUserId(userId);
         errandEvaluate.setUserId(userId);
         return tbIndentService.userEvaluate(errandEvaluate);
         return tbIndentService.userEvaluate(errandEvaluate);
     }
     }
 
 
     @ApiOperation("用户投诉订单")
     @ApiOperation("用户投诉订单")
     @PostMapping(value = "insertComplaint")
     @PostMapping(value = "insertComplaint")
-    public Result insertComplaint(@RequestBody ErrandComplaint errandComplaint){
+    public Result insertComplaint(@RequestBody ErrandComplaint errandComplaint) {
 
 
         return errandComplaintService.insertComplaint(errandComplaint);
         return errandComplaintService.insertComplaint(errandComplaint);
     }
     }
@@ -316,7 +314,7 @@ public class AppTbIndentController {
     @Login
     @Login
     @ApiOperation("用户查看所有投诉")
     @ApiOperation("用户查看所有投诉")
     @GetMapping(value = "selectComplaint")
     @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);
         return errandComplaintService.selectComplaint(userId, page, limit);
     }
     }
@@ -324,23 +322,23 @@ public class AppTbIndentController {
     @Login
     @Login
     @GetMapping(value = "findAllComplaint")
     @GetMapping(value = "findAllComplaint")
     @ApiOperation("骑手查看自己的所有被投诉")
     @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
     @Login
     @GetMapping(value = "findComplaint")
     @GetMapping(value = "findComplaint")
     @ApiOperation("骑手查看被投诉内容")
     @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
     @Login
     @PostMapping(value = "appealIndent")
     @PostMapping(value = "appealIndent")
     @ApiOperation("骑手提交申诉")
     @ApiOperation("骑手提交申诉")
-    public Result appealIndent(@RequestAttribute Long userId, @RequestBody ErrandComplaint errandComplaint){
+    public Result appealIndent(@RequestAttribute Long userId, @RequestBody ErrandComplaint errandComplaint) {
 
 
         return errandComplaintService.appealIndent(userId, errandComplaint);
         return errandComplaintService.appealIndent(userId, errandComplaint);
     }
     }
@@ -352,7 +350,7 @@ public class AppTbIndentController {
     @Login
     @Login
     @ApiOperation("转单")
     @ApiOperation("转单")
     @PostMapping("/transferOfOrder")
     @PostMapping("/transferOfOrder")
-    public Result transferOfOrder(@RequestAttribute Long userId, @Valid RiderTransferOrderDTO transferOrderDTO){
+    public Result transferOfOrder(@RequestAttribute Long userId, @Valid RiderTransferOrderDTO transferOrderDTO) {
         // 检查入参
         // 检查入参
         checkTransferOrderParam(transferOrderDTO);
         checkTransferOrderParam(transferOrderDTO);
 
 
@@ -379,4 +377,67 @@ public class AppTbIndentController {
             throw new SqxException("待分配骑手手机号和待分配骑手真实姓名不能同时为空");
             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 findIndentByNumber(String indentNumber);
 
 
+    TbIndent findIndentByOrderId(String orderId);
+
     int selectIndentByRiderUserCount(Long riderUserId);
     int selectIndentByRiderUserCount(Long riderUserId);
 
 
     void indentReceiving(Long userId, String indentNumber, String format);
     void indentReceiving(Long userId, String indentNumber, String format);
 
 
     void indentReceiv(Long userId, String indentNumber, String format,String state);
     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);
     IPage<TbIndent> findRiderIndent(Page<TbIndent> pages, Long userId, String indentState);
 
 
     TbIndent indentRiderMessage(String indentNumber, double riderLng, double riderLat);
     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("收货码")
     @ApiModelProperty("收货码")
     private String orderCode;
     private String orderCode;
 
 
+    @ApiModelProperty("订单支付顺序号")
+    private String orderPaySequence;
+
     @ApiModelProperty("备注")
     @ApiModelProperty("备注")
     private String remarks;
     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.PageUtils;
 import com.sqx.common.utils.Result;
 import com.sqx.common.utils.Result;
 import com.sqx.modules.app.entity.UserEntity;
 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.ErrandAddress;
 import com.sqx.modules.errand.entity.ErrandEvaluate;
 import com.sqx.modules.errand.entity.ErrandEvaluate;
 import com.sqx.modules.errand.entity.ErrandRedPacket;
 import com.sqx.modules.errand.entity.ErrandRedPacket;
@@ -31,6 +29,8 @@ public interface TbIndentService extends IService<TbIndent> {
 
 
     Result indentReceiving(Long userId, String indentNumber);
     Result indentReceiving(Long userId, String indentNumber);
 
 
+    Result orderIndentReceiving(Long userId, String acquireCode);
+
     Result riderBuyGoods(TbIndent tbIndent);
     Result riderBuyGoods(TbIndent tbIndent);
 
 
     Result findRiderIndent(Long userId, Integer page, Integer limit, String indentState);
     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 riderDelivery(Long userId, RiderDeliveryDTO deliveryDTO);
 
 
+    Result orderRiderDelivery(Long userId, OrderRiderDeliveryDTO orderDeliveryDTO);
+
     Result userDelivery(Long userId, String indentNumber);
     Result userDelivery(Long userId, String indentNumber);
 
 
     Result userEvaluate(ErrandEvaluate errandEvaluate);
     Result userEvaluate(ErrandEvaluate errandEvaluate);
@@ -115,6 +117,22 @@ public interface TbIndentService extends IService<TbIndent> {
     void transferOfOrder(Long userId, RiderTransferOrderDTO transferOrderDTO);
     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 userId 用户id
      * @param indentNumber 跑腿订单号
      * @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.common.utils.Result;
 import com.sqx.modules.errand.dao.AdminTrainingCenterDao;
 import com.sqx.modules.errand.dao.AdminTrainingCenterDao;
 import com.sqx.modules.errand.dao.UserInfoDao;
 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.entity.TrainingCenter;
 import com.sqx.modules.errand.service.AdminTrainingCenterService;
 import com.sqx.modules.errand.service.AdminTrainingCenterService;
 import org.springframework.beans.factory.annotation.Autowired;
 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.dao.TbIndentDao;
 import com.sqx.modules.errand.entity.ErrandComplaint;
 import com.sqx.modules.errand.entity.ErrandComplaint;
 import com.sqx.modules.errand.entity.ErrandIllegalType;
 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.entity.TbIndent;
 import com.sqx.modules.errand.service.ErrandComplaintService;
 import com.sqx.modules.errand.service.ErrandComplaintService;
 import com.sqx.modules.order.entity.TbOrder;
 import com.sqx.modules.order.entity.TbOrder;
@@ -26,7 +25,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
-import java.sql.Timestamp;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.Date;
 
 

File diff suppressed because it is too large
+ 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.Feedback;
 import com.sqx.modules.errand.entity.TbIndent;
 import com.sqx.modules.errand.entity.TbIndent;
 import com.sqx.modules.errand.service.UserInfoService;
 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.dao.PayDetailsDao;
 import com.sqx.modules.pay.service.CashOutService;
 import com.sqx.modules.pay.service.CashOutService;
 import com.sqx.modules.utils.VerifyIdCardUtils;
 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.PageUtils;
 import com.sqx.common.utils.Result;
 import com.sqx.common.utils.Result;
 import com.sqx.modules.gameChat.entity.ChatContentTcwm;
 import com.sqx.modules.gameChat.entity.ChatContentTcwm;
-import org.springframework.stereotype.Service;
 
 
 
 
 public interface ChatContentTcwmService extends IService<ChatContentTcwm> {
 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 selectAllUnreadCount(Long userId, Long riderUserId, Long shopId);
 
 
     Result updateShopAllUnreadCount(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.entity.ChatContentTcwm;
 import com.sqx.modules.gameChat.service.ChatContentTcwmService;
 import com.sqx.modules.gameChat.service.ChatContentTcwmService;
 import org.springframework.beans.factory.annotation.Autowired;
 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 org.springframework.stereotype.Service;
 
 
-import java.util.Map;
-
 
 
 @Service
 @Service
 public class ChatContentTcwmServiceImpl extends ServiceImpl<ChatContentTcwmDao, ChatContentTcwm> implements ChatContentTcwmService {
 public class ChatContentTcwmServiceImpl extends ServiceImpl<ChatContentTcwmDao, ChatContentTcwm> implements ChatContentTcwmService {
@@ -102,4 +98,4 @@ public class ChatContentTcwmServiceImpl extends ServiceImpl<ChatContentTcwmDao,
         return Result.success();
         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.dao.OrderGoodsDao;
 import com.sqx.modules.order.entity.OrderGoods;
 import com.sqx.modules.order.entity.OrderGoods;
 import com.sqx.modules.order.entity.TbOrder;
 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.ShopMessageService;
 import com.sqx.modules.shop.service.ShopTypeService;
 import com.sqx.modules.shop.service.ShopTypeService;
 import com.sqx.modules.sys.dao.SysUserDao;
 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);
         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.entity.MessageInfo;
 import com.sqx.modules.message.service.MessageService;
 import com.sqx.modules.message.service.MessageService;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 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.dao.MessageInfoDao;
 import com.sqx.modules.message.entity.MessageInfo;
 import com.sqx.modules.message.entity.MessageInfo;
 import com.sqx.modules.message.service.MessageService;
 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.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 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("条件查询所有订单(管理端)")
     @ApiOperation("条件查询所有订单(管理端)")
     @GetMapping(value = "selectAllOrderAdmin")
     @GetMapping(value = "selectAllOrderAdmin")
     public Result selectAllOrderAdmin(Integer page, Integer limit, Integer status, String phone, Long shopId, String userName,
     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")
     @GetMapping("excelOrder")

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

@@ -29,8 +29,8 @@ public class AppOrderController {
     @ApiOperation("生成订单(未结算状态)")
     @ApiOperation("生成订单(未结算状态)")
     @PostMapping(value = "/insertOrder")
     @PostMapping(value = "/insertOrder")
     public Result insertOrder(@RequestAttribute Long userId, Long shopId, Long goodsId, Integer num, Long skuId, String skuMessage, Integer orderType){
     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
     @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,
     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("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,
     List<TbOrder> excelAllOrderAdmin(@Param("status") Integer status,@Param("phone") String phone, @Param("shopId") Long shopId,
                                        @Param("userName") String userName, @Param("orderNumber") String orderNumber,
                                        @Param("userName") String userName, @Param("orderNumber") String orderNumber,
@@ -96,4 +96,6 @@ public interface AppOrderDao extends BaseMapper<TbOrder> {
      * @return 未完成订单数
      * @return 未完成订单数
      */
      */
     int countUnFinishByShopId(@Param("shopId") Long shopId);
     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("期待送达时间")
     @ApiModelProperty("期待送达时间")
     private Date expectDeliveryTime;
     private Date expectDeliveryTime;
 
 
+    @ApiModelProperty("订单顺序号(当天)")
+    private String orderSequence;
+
     @ApiModelProperty("商铺名")
     @ApiModelProperty("商铺名")
     @TableField(exist = false)
     @TableField(exist = false)
     private String shopName;
     private String shopName;
@@ -203,6 +206,15 @@ public class TbOrder implements Serializable {
     private String indentNumber;
     private String indentNumber;
 
 
     @TableField(exist = false)
     @TableField(exist = false)
+    private String indentState;
+
+    @TableField(exist = false)
+    private BigDecimal activityDiscountAmount;
+
+    @TableField(exist = false)
+    private String activityTitle;
+
+    @TableField(exist = false)
     private Long riderUserId;
     private Long riderUserId;
 
 
     @TableField(exist = false)
     @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.pay.dto.PayOrderDTO;
 import com.sqx.modules.utils.excel.ExcelData;
 import com.sqx.modules.utils.excel.ExcelData;
 
 
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.List;
 
 
 public interface AppOrderService extends IService<TbOrder> {
 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);
     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 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,
     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,
     ExcelData excelAllOrderAdmin(Integer status, String phone, Long shopId,
                                  String userName, String orderNumber, Integer orderType, String shopName,
                                  String userName, String orderNumber, Integer orderType, String shopName,
@@ -160,4 +161,11 @@ public interface AppOrderService extends IService<TbOrder> {
      * @return 订单id集合
      * @return 订单id集合
      */
      */
     List<Long> getCurWaitReceivingOrderIds();
     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.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sqx.common.constant.RedisKey;
 import com.sqx.common.exception.SqxException;
 import com.sqx.common.exception.SqxException;
 import com.sqx.common.sms.SmsSendResult;
 import com.sqx.common.sms.SmsSendResult;
 import com.sqx.common.utils.Constant;
 import com.sqx.common.utils.Constant;
 import com.sqx.common.utils.DateUtils;
 import com.sqx.common.utils.DateUtils;
 import com.sqx.common.utils.DistanceUtil;
 import com.sqx.common.utils.DistanceUtil;
+import com.sqx.common.utils.MyGlobalThreadPool;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
 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.ActivityPartRecordService;
 import com.sqx.modules.activity.service.ActivityService;
 import com.sqx.modules.activity.service.ActivityService;
 import com.sqx.modules.activity.vo.OrderSuitActivityVO;
 import com.sqx.modules.activity.vo.OrderSuitActivityVO;
@@ -77,13 +80,18 @@ import com.sqx.modules.utils.fieYun.FeiYunUtils;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.SecurityUtils;
 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.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.context.annotation.Lazy;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 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.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.DefaultTransactionDefinition;
 
 
+import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
@@ -96,7 +104,6 @@ import java.util.Calendar;
 import java.util.Date;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.List;
 import java.util.List;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 
 @Service
 @Service
 @Slf4j
 @Slf4j
@@ -160,21 +167,106 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
     private TbIndentSmsSendLogService smsSendLogService;
     private TbIndentSmsSendLogService smsSendLogService;
     @Autowired
     @Autowired
     private TbIndentSmsTemplateService smsTemplateService;
     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
     @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 {
         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 {
         } 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));
         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
     @Override
     public Result shareTheBill(Long userId, Long shopId) {
     public Result shareTheBill(Long userId, Long shopId) {
         // 判断当前时间是否在店铺营业范围内
         // 判断当前时间是否在店铺营业范围内
@@ -368,8 +375,6 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
             pages = new Page<>();
             pages = new Page<>();
         }
         }
         return evaluateDao.getEvaluateList(pages, evaluate);
         return evaluateDao.getEvaluateList(pages, evaluate);
-
-
     }
     }
 
 
     @Override
     @Override
@@ -392,6 +397,10 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
             throw new SqxException("无效的订单id");
             throw new SqxException("无效的订单id");
         }
         }
 
 
+        if (parentOrder.getIsPay() == 1) {
+            throw new SqxException("当前订单已支付,请勿重复支付!");
+        }
+
         // 获取店铺信息
         // 获取店铺信息
         // 注意:调用shopMessageService获取店铺信息,这个service对店铺的抽成比例有特殊处理(历史代码就是如此/(ㄒoㄒ)/~~)
         // 注意:调用shopMessageService获取店铺信息,这个service对店铺的抽成比例有特殊处理(历史代码就是如此/(ㄒoㄒ)/~~)
         GoodsShop goodsShop = shopMessageService.selectShopId(parentOrder.getShopId());
         GoodsShop goodsShop = shopMessageService.selectShopId(parentOrder.getShopId());
@@ -423,8 +432,6 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         return parentOrder;
         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);
         order.setPayTime(currentTimeStr);
 
 
         // 店铺信息
         // 店铺信息
-        GoodsShop goodsShop = goodsShopDao.selectById(order.getShopId());
+        GoodsShop goodsShop = shopMessageService.getShopInfoById(order.getShopId());
+
         // 小程序推送设置
         // 小程序推送设置
         CommonInfo mpPushConfig = commonInfoService.findOne(269);
         CommonInfo mpPushConfig = commonInfoService.findOne(269);
+
         // 用户信息
         // 用户信息
         UserEntity userEntity = userDao.selectById(order.getUserId());
         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;
         boolean autoAccept = goodsShop.getAutoAcceptOrder() != null && goodsShop.getAutoAcceptOrder() == 0;
@@ -574,6 +589,9 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
             order.setStatus(7);
             order.setStatus(7);
         }
         }
 
 
+        // 计算订单顺序号
+        order.setOrderSequence(String.format("%04d", selectCurrentOrderSequenceByShopId(order, order.getShopId())));
+
         // 更新订单状态
         // 更新订单状态
         updateById(order);
         updateById(order);
 
 
@@ -592,25 +610,34 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
             tbIndentService.insertIndent(order);
             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 (order.getStatus() == 6 || reservationFlag) {
             // 打印小票
             // 打印小票
             if (StringUtils.isNotEmpty(goodsShop.getSnCode())) {
             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(goodsShop.getShopName());
         userMsgList.add(currentDateStr);
         userMsgList.add(currentDateStr);
         SenInfoCheckUtil.sendMsg(userEntity.getOpenId(), mpPushConfig.getValue(), userMsgList,1);
         SenInfoCheckUtil.sendMsg(userEntity.getOpenId(), mpPushConfig.getValue(), userMsgList,1);
-        userService.pushToSingle("下单成功", "亲爱的用户您好,您已下单成功,请等待商家接单!", userEntity.getClientid());
+
+        // 无个推
+        // userService.pushToSingle("下单成功", "亲爱的用户您好,您已下单成功,请等待商家接单!", userEntity.getClientid());
 
 
         // 商户端消息推送
         // 商户端消息推送
         List<String> shopMsgShopList=new ArrayList<>();
         List<String> shopMsgShopList=new ArrayList<>();
@@ -1234,10 +1263,11 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
 
 
     @Override
     @Override
     public Result selectAllOrderAdmin(Integer page, Integer limit, Integer status, String phone, Long shopId, String userName,
     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);
         Page<TbOrder> pages = new Page<>(page, limit);
         IPage<TbOrder> tbOrderIPage = appOrderDao.selectAllOrderAdmin(pages, status, phone, shopId, userName, orderNumber,
         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++) {
         for (int i = 0; i < tbOrderIPage.getRecords().size(); i++) {
             List<OrderGoods> orderGoodsList = orderGoodsDao.selectList(new QueryWrapper<OrderGoods>()
             List<OrderGoods> orderGoodsList = orderGoodsDao.selectList(new QueryWrapper<OrderGoods>()
                     .eq("order_id", tbOrderIPage.getRecords().get(i).getOrderId()));
                     .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("优惠金额(元)");
+        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(stringBuffer.toString());
             row.add(sumGoodsPrice);
             row.add(sumGoodsPrice);
             row.add(order.getCouponMoney());
             row.add(order.getCouponMoney());
+            row.add(order.getActivityTitle());
+            row.add(order.getActivityDiscountAmount());
             row.add(order.getPackMoney());
             row.add(order.getPackMoney());
             row.add(order.getErrandMoney());
             row.add(order.getErrandMoney());
             row.add(order.getPayMoney());
             row.add(order.getPayMoney());
@@ -1448,10 +1483,7 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
     @Transactional
     @Transactional
     @Override
     @Override
     public Result updateGoodsNum(Long orderGoodsId, Integer type, Integer num, Long shopId) {
     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);
         OrderGoods orderGoods = orderGoodsDao.selectById(orderGoodsId);
         if(orderGoods==null){
         if(orderGoods==null){
             return Result.error("系统繁忙,请稍后再试!");
             return Result.error("系统繁忙,请稍后再试!");
@@ -1478,12 +1510,6 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
                 orderGoodsDao.updateById(orderGoods2);
                 orderGoodsDao.updateById(orderGoods2);
             }
             }
         }
         }
-        /*}catch (Exception e){
-            e.printStackTrace();
-            log.error("减少购物车商品出错:"+e.getMessage(),e);
-        }finally {
-            reentrantReadWriteLock.writeLock().unlock();
-        }*/
         return Result.success();
         return Result.success();
     }
     }
 
 
@@ -1520,10 +1546,6 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         // 查询店铺信息
         // 查询店铺信息
         GoodsShop goodsShop = goodsShopDao.selectById(shopId);
         GoodsShop goodsShop = goodsShopDao.selectById(shopId);
 
 
-        // 查询当天店铺所有已支付的订单号,按支付时间排序
-        int sequence = selectCurrentOrderSequenceByShopId(tbOrder, shopId);
-        tbOrder.setCountOrder(sequence);
-
         if (StringUtils.isNotEmpty(goodsShop.getSnCode())) {
         if (StringUtils.isNotEmpty(goodsShop.getSnCode())) {
             FeiYunUtils.print(goodsShop.getSnCode(), null, tbOrder);
             FeiYunUtils.print(goodsShop.getSnCode(), null, tbOrder);
         } else {
         } else {
@@ -1532,26 +1554,6 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         return Result.success();
         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
     @Transactional
     public Result updateOrders(TbOrder order) {
     public Result updateOrders(TbOrder order) {
         String format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
         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();
                 return Result.success();
             }
             }
 
 
+            if (tbOrder.getStatus() != 7) {
+                throw new SqxException("订单状态异常,请刷新页面后重试!");
+            }
+
             String reservationFlag = tbOrder.getReservationFlag();
             String reservationFlag = tbOrder.getReservationFlag();
             if (StrUtil.equals(reservationFlag, Constant.YES)) {
             if (StrUtil.equals(reservationFlag, Constant.YES)) {
                 Date now = new Date();
                 Date now = new Date();
@@ -1613,8 +1619,6 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
             // 如果是预约订单,则不再打印小票(订单支付的时候已经打印过了)
             // 如果是预约订单,则不再打印小票(订单支付的时候已经打印过了)
             if (!StrUtil.equals(tbOrder.getReservationFlag(), Constant.YES)) {
             if (!StrUtil.equals(tbOrder.getReservationFlag(), Constant.YES)) {
                 if (StringUtils.isNotEmpty(goodsShop.getSnCode())) {
                 if (StringUtils.isNotEmpty(goodsShop.getSnCode())) {
-                    int sequence = selectCurrentOrderSequenceByShopId(tbOrder, shopId);
-                    tbOrder.setCountOrder(sequence);
                     FeiYunUtils.print(goodsShop.getSnCode(), null, tbOrder);
                     FeiYunUtils.print(goodsShop.getSnCode(), null, tbOrder);
                 }
                 }
             }
             }
@@ -1785,28 +1789,24 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
 
 
     @Override
     @Override
     public Result updateOrder(TbOrder order) {
     public Result updateOrder(TbOrder order) {
-        reentrantReadWriteLock.writeLock().lock();
+        RLock lock = redissonClient.getLock(String.format(RedisKey.UPDATE_ORDER_LOCK, order.getOrderId()));
+        lock.lock();
         try {
         try {
             return updateOrders(order);
             return updateOrders(order);
-        } catch (Exception e) {
-            throw e;
         } finally {
         } finally {
-            reentrantReadWriteLock.writeLock().unlock();
+            lock.unlock();
         }
         }
     }
     }
 
 
     @Override
     @Override
     public Result accomplishOrder(Long orderId) {
     public Result accomplishOrder(Long orderId) {
-        reentrantReadWriteLock.writeLock().lock();
+        RLock lock = redissonClient.getLock(String.format(RedisKey.FINISH_ORDER_LOCK, orderId));
+        lock.lock();
         try {
         try {
             return accomplishOrders(orderId,1);
             return accomplishOrders(orderId,1);
-        } catch (Exception e) {
-            e.printStackTrace();
-            log.error("完成订单异常:" + e.getMessage(), e);
         } finally {
         } 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) {
         if (shopIds != -1 && shopIds != 0) {
             shopMoney = shopMoney.subtract(couponMoney);
             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(tbOrder.getAutoSendOrder()!=null && tbOrder.getAutoSendOrder()==1){
             //如果达到商家满减 则商家不加上配送费
             //如果达到商家满减 则商家不加上配送费
             if(!"本单已达到商家满减金额,跑腿费由商家承担".equals(tbOrder.getErrandMoneyIsShop())){
             if(!"本单已达到商家满减金额,跑腿费由商家承担".equals(tbOrder.getErrandMoneyIsShop())){
@@ -1928,36 +1936,37 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         userMoneyDetails1.setShopId(goodsShop.getShopId());
         userMoneyDetails1.setShopId(goodsShop.getShopId());
         userMoneyDetails1.setTitle("商户订单收入,订单号:" + tbOrder.getOrderNumber());
         userMoneyDetails1.setTitle("商户订单收入,订单号:" + tbOrder.getOrderNumber());
 //        userMoneyDetails1.setContent("商户本单收入金额:" + shopMoney + "元");
 //        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 (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.setType(1);
         userMoneyDetails1.setClassify(3);
         userMoneyDetails1.setClassify(3);
         userMoneyDetails1.setMoney(shopMoney);
         userMoneyDetails1.setMoney(shopMoney);
@@ -2003,52 +2012,52 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         return Result.success();
         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
     @Transactional
     @Override
     @Override
@@ -2090,15 +2099,13 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
 
 
     @Override
     @Override
     public Result userCancelOrder(Long orderId){
     public Result userCancelOrder(Long orderId){
-        reentrantReadWriteLock.writeLock().lock();
+        RLock lock = redissonClient.getLock(String.format(RedisKey.CANCEL_ORDER_LOCK, orderId));
+        lock.lock();
         try {
         try {
             return userCancelOrders(orderId);
             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
     @Override
     public Result adminCancelOrder(Long orderId){
     public Result adminCancelOrder(Long orderId){
-        reentrantReadWriteLock.writeLock().lock();
+        RLock lock = redissonClient.getLock(String.format(RedisKey.CANCEL_ORDER_LOCK, orderId));
+        lock.lock();
         try {
         try {
             return adminCancelOrders(orderId);
             return adminCancelOrders(orderId);
-        }catch (Exception e){
-            e.printStackTrace();
-        }finally {
-            reentrantReadWriteLock.writeLock().unlock();
+        } finally {
+            lock.unlock();
         }
         }
-        return Result.error("系统繁忙,请稍后再试!");
     }
     }
 
 
-
     @Transactional
     @Transactional
     public Result adminCancelOrders(Long orderId) {
     public Result adminCancelOrders(Long orderId) {
         String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
         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);
             tbOrderList.getRecords().get(i).setOrderGoodsList(list);
         }
         }
         if (shopId != null && userId != null) {
         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);
         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 SysConfigService sysConfigService;
 
 
     private final static String KEY = ConfigConstant.CLOUD_STORAGE_CONFIG_KEY;
     private final static String KEY = ConfigConstant.CLOUD_STORAGE_CONFIG_KEY;
-	
+
 	/**
 	/**
 	 * 列表
 	 * 列表
 	 */
 	 */
@@ -102,7 +102,7 @@ public class SysOssController {
 
 
 		return Result.success();
 		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.baomidou.mybatisplus.extension.service.IService;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.modules.oss.entity.SysOssEntity;
 import com.sqx.modules.oss.entity.SysOssEntity;
+import org.apache.poi.ss.formula.functions.T;
 
 
 import java.util.Map;
 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);
 		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.request.AlipayFundTransUniTransferRequest;
 import com.alipay.api.response.AlipayFundTransToaccountTransferResponse;
 import com.alipay.api.response.AlipayFundTransToaccountTransferResponse;
 import com.alipay.api.response.AlipayFundTransUniTransferResponse;
 import com.alipay.api.response.AlipayFundTransUniTransferResponse;
+import com.sqx.common.constant.RedisKey;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
 import com.sqx.common.utils.Result;
 import com.sqx.modules.app.dao.UserCashOutDao;
 import com.sqx.modules.app.dao.UserCashOutDao;
 import com.sqx.modules.app.entity.UserEntity;
 import com.sqx.modules.app.entity.UserEntity;
 import com.sqx.modules.app.entity.UserMoneyDetails;
 import com.sqx.modules.app.entity.UserMoneyDetails;
 import com.sqx.modules.app.service.UserMoneyDetailsService;
 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.app.service.UserService;
 import com.sqx.modules.common.entity.CommonInfo;
 import com.sqx.modules.common.entity.CommonInfo;
 import com.sqx.modules.common.service.CommonInfoService;
 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.message.service.MessageService;
 import com.sqx.modules.pay.config.AliPayConstants;
 import com.sqx.modules.pay.config.AliPayConstants;
 import com.sqx.modules.pay.controller.query.CashOutQueryDTO;
 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.AliPayWithdrawModel;
 import com.sqx.modules.pay.entity.CashOut;
 import com.sqx.modules.pay.entity.CashOut;
 import com.sqx.modules.pay.service.CashOutService;
 import com.sqx.modules.pay.service.CashOutService;
@@ -44,6 +43,8 @@ import lombok.extern.slf4j.Slf4j;
 import lombok.val;
 import lombok.val;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.exception.ExceptionUtils;
 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.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 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.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
@@ -59,7 +61,6 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 
 /**
 /**
  * @author fang
  * @author fang
@@ -89,11 +90,9 @@ public class CashController {
     private MessageService messageService;
     private MessageService messageService;
     @Autowired
     @Autowired
     private UserCashOutDao userCashOutDao;
     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)
     @RequestMapping(value = "/sendMsgByUserId", method = RequestMethod.GET)
     @ApiOperation("管理平台主动推送消息(指定用户)")
     @ApiOperation("管理平台主动推送消息(指定用户)")
@@ -307,7 +306,8 @@ public class CashController {
     }
     }
 
 
     private Result wxPay(CashOut one){
     private Result wxPay(CashOut one){
-        reentrantReadWriteLock.writeLock().lock();
+        RLock lock = redissonClient.getLock(String.format(RedisKey.CASH_OUT_LOCK, one.getUserId()));
+        lock.lock();
         try{
         try{
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
             UserEntity userEntity = userService.getById(one.getUserId());
             UserEntity userEntity = userService.getById(one.getUserId());
@@ -397,7 +397,7 @@ public class CashController {
             e.printStackTrace();
             e.printStackTrace();
             log.error("转账出错了!!!"+e.getMessage(),e);
             log.error("转账出错了!!!"+e.getMessage(),e);
         }finally {
         }finally {
-            reentrantReadWriteLock.writeLock().unlock();
+            lock.unlock();
         }
         }
         return Result.error("转账失败!");
         return Result.error("转账失败!");
     }
     }
@@ -405,7 +405,7 @@ public class CashController {
 
 
 
 
     private Result aliPay(CashOut one) {
     private Result aliPay(CashOut one) {
-        reentrantReadWriteLock.writeLock().lock();
+        RLock lock = redissonClient.getLock(String.format(RedisKey.CASH_OUT_LOCK, one.getUserId()));
         try {
         try {
             log.error("进来了!!!");
             log.error("进来了!!!");
             if (one == null) {
             if (one == null) {
@@ -545,7 +545,7 @@ public class CashController {
             e.printStackTrace();
             e.printStackTrace();
             log.error("转账异常"+e.getMessage());
             log.error("转账异常"+e.getMessage());
         }finally {
         }finally {
-            reentrantReadWriteLock.writeLock().unlock();
+            lock.unlock();
         }
         }
         return Result.error("系统繁忙,请稍后再试!");
         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.PageUtils;
 import com.sqx.common.utils.Result;
 import com.sqx.common.utils.Result;
+import org.apache.poi.ss.formula.functions.T;
 
 
 public interface PayDetailsService {
 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.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sqx.common.constant.RedisKey;
 import com.sqx.common.exception.SqxException;
 import com.sqx.common.exception.SqxException;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
 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.UserMoney;
 import com.sqx.modules.app.entity.UserMoneyDetails;
 import com.sqx.modules.app.entity.UserMoneyDetails;
 import com.sqx.modules.app.service.UserMoneyDetailsService;
 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.app.service.UserService;
 import com.sqx.modules.common.entity.CommonInfo;
 import com.sqx.modules.common.entity.CommonInfo;
 import com.sqx.modules.common.service.CommonInfoService;
 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.pay.vo.CashOutVO;
 import com.sqx.modules.shop.entity.ShopBankCardInfo;
 import com.sqx.modules.shop.entity.ShopBankCardInfo;
 import com.sqx.modules.shop.service.ShopBankCardInfoService;
 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.AmountCalUtils;
 import com.sqx.modules.utils.excel.ExcelData;
 import com.sqx.modules.utils.excel.ExcelData;
 import org.apache.commons.lang.StringUtils;
 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.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
@@ -54,7 +55,6 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.List;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 /**
 /**
@@ -95,14 +95,13 @@ public class CashOutServiceImpl extends ServiceImpl<CashOutDao, CashOut> impleme
     @Autowired
     @Autowired
     private ErrandComplaintDao complaintDao;
     private ErrandComplaintDao complaintDao;
     @Autowired
     @Autowired
-    private SysUserDao sysUserDao;
-    @Autowired
     private UserMoneyDetailsService userMoneyDetailsService;
     private UserMoneyDetailsService userMoneyDetailsService;
     @Autowired
     @Autowired
-    private UserMoneyService userMoneyService;
-    @Autowired
     private ShopBankCardInfoService shopBankCardInfoService;
     private ShopBankCardInfoService shopBankCardInfoService;
-    private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true);
+    @Autowired
+    private RedissonClient redissonClient;
+
+
 
 
     @Override
     @Override
     public PageUtils selectCashOutList(CashOutQueryDTO queryDTO) {
     public PageUtils selectCashOutList(CashOutQueryDTO queryDTO) {
@@ -275,15 +274,12 @@ public class CashOutServiceImpl extends ServiceImpl<CashOutDao, CashOut> impleme
 
 
     @Override
     @Override
     public Result cashMoney(Long userId, Long shopId, Double money, Integer classify, Integer type) {
     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 {
         try {
             return cashMoneys(userId, shopId, money, classify, type);
             return cashMoneys(userId, shopId, money, classify, type);
-        } catch (Exception e) {
-            e.printStackTrace();
-            log.error("发起提现出错!" + e.getMessage(), e);
-            throw new SqxException(e.getMessage());
         } finally {
         } 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.Result;
 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.dao.PayDetailsDao;
 import com.sqx.modules.pay.entity.PayDetails;
 import com.sqx.modules.pay.entity.PayDetails;
 import com.sqx.modules.pay.service.PayDetailsService;
 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.WXPay;
 import com.github.wxpay.sdk.WXPayConstants;
 import com.github.wxpay.sdk.WXPayConstants;
 import com.github.wxpay.sdk.WXPayUtil;
 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.common.utils.Result;
 import com.sqx.modules.app.dao.UserDao;
 import com.sqx.modules.app.dao.UserDao;
 import com.sqx.modules.app.dao.UserMoneyDetailsDao;
 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.MD5Util;
 import com.sqx.modules.utils.WXConfigUtil;
 import com.sqx.modules.utils.WXConfigUtil;
 import lombok.extern.slf4j.Slf4j;
 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.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
+import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 
 /**
 /**
  * @author fang
  * @author fang
@@ -89,19 +91,21 @@ public class WxServiceImpl implements WxService {
     @Autowired
     @Autowired
     private UserMoneyDetailsService userMoneyDetailsService;
     private UserMoneyDetailsService userMoneyDetailsService;
 
 
-    private ReentrantReadWriteLock reentrantReadWriteLock=new ReentrantReadWriteLock(true);
-
     private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
 
+    @Resource
+    private RedissonClient redissonClient;
+
     @Override
     @Override
     public Result balanceOrder(Long userId, PayOrderDTO payOrderDTO) {
     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{
         try{
-            return balanceOrders(userId, payOrderDTO);
-        } catch (Exception e){
-            throw new SqxException(e.getMessage());
+            return balanceOrders(userId, tbOrder);
         } finally {
         } finally {
-            reentrantReadWriteLock.writeLock().unlock();
+            lock.unlock();
         }
         }
     }
     }
 
 
@@ -109,10 +113,7 @@ public class WxServiceImpl implements WxService {
      * 钱包支付订单
      * 钱包支付订单
      */
      */
     @Transactional
     @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();
         BigDecimal payMoney = tbOrder.getPayMoney();
         UserMoney userMoney = userMoneyService.selectUserMoneyByUserId(userId);
         UserMoney userMoney = userMoneyService.selectUserMoneyByUserId(userId);
@@ -144,16 +145,13 @@ public class WxServiceImpl implements WxService {
 
 
     @Override
     @Override
     public Result balanceBuyVip(Long userId) {
     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);
             return balanceBuyVips(userId);
-        }catch (Exception e){
-            e.printStackTrace();
-            log.error("下单异常:"+e.getMessage(),e);
-        }finally {
-            reentrantReadWriteLock.writeLock().unlock();
+        } finally {
+            lock.unlock();
         }
         }
-        return Result.error("系统繁忙,请稍后再试!");
     }
     }
 
 
     @Override
     @Override
@@ -218,25 +216,36 @@ public class WxServiceImpl implements WxService {
 
 
         // 设置支付方式 1表示微信支付、4或5表示支付宝支付
         // 设置支付方式 1表示微信支付、4或5表示支付宝支付
         Integer type = payOrderDTO.getType();
         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();
         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")
     @GetMapping("getPrintInfoList")
     @ApiOperation("获取打印信息列表")
     @ApiOperation("获取打印信息列表")

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

@@ -10,11 +10,11 @@ import java.util.List;
  * @Version: 1.0
  * @Version: 1.0
  * 订单类型
  * 订单类型
  */
  */
-//上门:1
+//到店取餐:1
 //骑手配送:2
 //骑手配送:2
 //商家配送:3
 //商家配送:3
 public enum eOrderTypeExtra {
 public enum eOrderTypeExtra {
-    Door(1),//上门
+    Door(1),//到店取餐
     Rider(2),//骑手配送
     Rider(2),//骑手配送
     Store(3);//商家配送
     Store(3);//商家配送
 
 
@@ -42,7 +42,7 @@ public enum eOrderTypeExtra {
 
 
     public static Integer integerOf(String value) {
     public static Integer integerOf(String value) {
         switch (value) {
         switch (value) {
-            case "上门":
+            case "到店取餐":
                 return 1;
                 return 1;
             case "骑手配送":
             case "骑手配送":
                 return 2;
                 return 2;
@@ -56,7 +56,7 @@ public enum eOrderTypeExtra {
     public static String stringOf(Integer value) {
     public static String stringOf(Integer value) {
         switch (value) {
         switch (value) {
             case 1:
             case 1:
-                return "上门";
+                return "到店取餐";
             case 2:
             case 2:
                 return "骑手配送";
                 return "骑手配送";
             case 3:
             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.dao.PrintInfoDao;
 import com.sqx.modules.printInfo.entity.PrintInfo;
 import com.sqx.modules.printInfo.entity.PrintInfo;
 import com.sqx.modules.printInfo.service.PrintInfoService;
 import com.sqx.modules.printInfo.service.PrintInfoService;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 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 修改信息
      * @param dto 修改信息
      */
      */
     void updateShopAuthentication(Long shopId, ShopAuditUpdateDTO 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.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 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.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sqx.common.constant.RedisKey;
 import com.sqx.common.exception.SqxException;
 import com.sqx.common.exception.SqxException;
 import com.sqx.common.utils.Constant;
 import com.sqx.common.utils.Constant;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.PageUtils;
+import com.sqx.common.utils.RedisUtils;
 import com.sqx.common.utils.Result;
 import com.sqx.common.utils.Result;
 import com.sqx.modules.app.dao.MsgDao;
 import com.sqx.modules.app.dao.MsgDao;
 import com.sqx.modules.app.dao.UserBrowseDao;
 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.RandomStringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.crypto.hash.Sha256Hash;
 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.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
+import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.List;
 import java.util.List;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 
 @Slf4j
 @Slf4j
 @Service
 @Service
@@ -99,7 +104,12 @@ public class ShopMessageServiceImpl extends ServiceImpl<ShopMessageDao, GoodsSho
     private UserService userService;
     private UserService userService;
     @Autowired
     @Autowired
     private AppOrderDao appOrderDao;
     private AppOrderDao appOrderDao;
-    private ReentrantReadWriteLock reentrantReadWriteLock=new ReentrantReadWriteLock(true);
+
+    @Resource
+    private RedissonClient redissonClient;
+
+    @Autowired
+    private RedisUtils redisUtils;
 
 
     @Transactional
     @Transactional
     @Override
     @Override
@@ -128,16 +138,13 @@ public class ShopMessageServiceImpl extends ServiceImpl<ShopMessageDao, GoodsSho
 
 
     @Override
     @Override
     public Result auditShopAuthentication(Long shopId, ShopAuditDTO dto) {
     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);
             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
     @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);
         baseMapper.updateById(goodsShop);
         return Result.success();
         return Result.success();
@@ -552,6 +559,21 @@ public class ShopMessageServiceImpl extends ServiceImpl<ShopMessageDao, GoodsSho
     }
     }
 
 
     @Override
     @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) {
     public Result sendMsgs(String phone, String state) {
         return userService.sendMsg(phone,"ruzhu");
         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){
     public SysConfigEntity get(String configKey){
         String key = RedisKeys.getSysConfigKey(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.baomidou.mybatisplus.extension.service.IService;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.modules.sys.entity.SysConfigEntity;
 import com.sqx.modules.sys.entity.SysConfigEntity;
+import org.apache.poi.ss.formula.functions.T;
 
 
 import java.util.Map;
 import java.util.Map;
 
 
@@ -13,39 +14,39 @@ import java.util.Map;
 public interface SysConfigService extends IService<SysConfigEntity> {
 public interface SysConfigService extends IService<SysConfigEntity> {
 
 
 	PageUtils queryPage(Map<String, Object> params);
 	PageUtils queryPage(Map<String, Object> params);
-	
+
 	/**
 	/**
 	 * 保存配置信息
 	 * 保存配置信息
 	 */
 	 */
 	public void saveConfig(SysConfigEntity config);
 	public void saveConfig(SysConfigEntity config);
-	
+
 	/**
 	/**
 	 * 更新配置信息
 	 * 更新配置信息
 	 */
 	 */
 	public void update(SysConfigEntity config);
 	public void update(SysConfigEntity config);
-	
+
 	/**
 	/**
 	 * 根据key,更新value
 	 * 根据key,更新value
 	 */
 	 */
 	public void updateValueByKey(String key, String value);
 	public void updateValueByKey(String key, String value);
-	
+
 	/**
 	/**
 	 * 删除配置信息
 	 * 删除配置信息
 	 */
 	 */
 	public void deleteBatch(Long[] ids);
 	public void deleteBatch(Long[] ids);
-	
+
 	/**
 	/**
 	 * 根据key,获取配置的value值
 	 * 根据key,获取配置的value值
-	 * 
+	 *
 	 * @param key           key
 	 * @param key           key
 	 */
 	 */
 	public String getValue(String key);
 	public String getValue(String key);
-	
+
 	/**
 	/**
 	 * 根据key,获取value的Object对象
 	 * 根据key,获取value的Object对象
 	 * @param key    key
 	 * @param key    key
 	 * @param clazz  Object对象
 	 * @param clazz  Object对象
 	 */
 	 */
 	public <T> T getConfigObject(String key, Class<T> clazz);
 	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.baomidou.mybatisplus.extension.service.IService;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.modules.sys.entity.SysLogEntity;
 import com.sqx.modules.sys.entity.SysLogEntity;
+import org.apache.poi.ss.formula.functions.T;
 
 
 import java.util.Map;
 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);
 	void deleteBatch(Long[] roleIds);
 
 
-	
+
 	/**
 	/**
 	 * 查询用户创建的角色ID列表
 	 * 查询用户创建的角色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
 	 * @param userId  用户ID
 	 */
 	 */
 	List<String> queryAllPerms(Long userId);
 	List<String> queryAllPerms(Long userId);
-	
+
 	/**
 	/**
 	 * 查询用户的所有菜单ID
 	 * 查询用户的所有菜单ID
 	 */
 	 */
@@ -37,12 +37,12 @@ public interface SysUserService extends IService<SysUserEntity> {
 	 * 保存用户
 	 * 保存用户
 	 */
 	 */
 	void saveUser(SysUserEntity user);
 	void saveUser(SysUserEntity user);
-	
+
 	/**
 	/**
 	 * 修改用户
 	 * 修改用户
 	 */
 	 */
 	void update(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();
 		return config == null ? null : config.getParamValue();
 	}
 	}
-	
+
 	@Override
 	@Override
 	public <T> T getConfigObject(String key, Class<T> clazz) {
 	public <T> T getConfigObject(String key, Class<T> clazz) {
 		String value = getValue(key);
 		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.entity.SysDictEntity;
 import com.sqx.modules.sys.service.SysDictService;
 import com.sqx.modules.sys.service.SysDictService;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.util.Map;
 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.entity.SysLogEntity;
 import com.sqx.modules.sys.service.SysLogService;
 import com.sqx.modules.sys.service.SysLogService;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.util.Map;
 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){
 		if(role.getCreateUserId() == Constant.SUPER_ADMIN){
 			return ;
 			return ;
 		}
 		}
-		
+
 		//查询用户所拥有的菜单列表
 		//查询用户所拥有的菜单列表
 		List<Long> menuIdList = sysUserService.queryAllMenuId(role.getCreateUserId());
 		List<Long> menuIdList = sysUserService.queryAllMenuId(role.getCreateUserId());
-		
+
 		//判断是否越权
 		//判断是否越权
 		if(!menuIdList.containsAll(role.getMenuIdList())){
 		if(!menuIdList.containsAll(role.getMenuIdList())){
 			throw new SqxException("新增角色的权限,已超出你的权限范围");
 			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);
 		checkRole(user);
-		
+
 		//保存用户与角色关系
 		//保存用户与角色关系
 		sysUserRoleService.saveOrUpdate(user.getUserId(), user.getRoleIdList());
 		sysUserRoleService.saveOrUpdate(user.getUserId(), user.getRoleIdList());
 	}
 	}
@@ -142,7 +142,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserDao, SysUserEntity> i
 
 
 		//检查角色是否越权
 		//检查角色是否越权
 		checkRole(user);
 		checkRole(user);
-		
+
 		//保存用户与角色关系
 		//保存用户与角色关系
 		sysUserRoleService.saveOrUpdate(user.getUserId(), user.getRoleIdList());
 		sysUserRoleService.saveOrUpdate(user.getUserId(), user.getRoleIdList());
 	}
 	}
@@ -199,7 +199,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserDao, SysUserEntity> i
 		if(user.getCreateUserId() == Constant.SUPER_ADMIN){
 		if(user.getCreateUserId() == Constant.SUPER_ADMIN){
 			return ;
 			return ;
 		}
 		}
-		
+
 		//查询用户创建的角色列表
 		//查询用户创建的角色列表
 		List<Long> roleIdList = sysRoleService.queryRoleIdList(user.getCreateUserId());
 		List<Long> roleIdList = sysRoleService.queryRoleIdList(user.getCreateUserId());
 
 
@@ -208,4 +208,4 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserDao, SysUserEntity> i
 			throw new SqxException("新增用户所选角色,不是本人创建");
 			throw new SqxException("新增用户所选角色,不是本人创建");
 		}*/
 		}*/
 	}
 	}
-}
+}

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

@@ -62,71 +62,71 @@ public class AutoSendOrder {
     @Autowired
     @Autowired
     private PayDetailsDao payDetailsDao;
     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")
  //   @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;
 package com.sqx.modules.utils;
 
 
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Maps;
 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.entity.CommonInfo;
 import com.sqx.modules.common.service.CommonInfoService;
 import com.sqx.modules.common.service.CommonInfoService;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
@@ -34,15 +37,16 @@ public class SenInfoCheckUtil {
 
 
     private static Logger logger = LoggerFactory.getLogger(SenInfoCheckUtil.class);
     private static Logger logger = LoggerFactory.getLogger(SenInfoCheckUtil.class);
 
 
-    private static String MpAccessToken;
-
     // 这里使用静态,让 service 属于类
     // 这里使用静态,让 service 属于类
     private static CommonInfoService commonInfoService;
     private static CommonInfoService commonInfoService;
 
 
+    private static RedisUtils redisUtils;
+
     // 注入的时候,给类的 service 注入
     // 注入的时候,给类的 service 注入
     @Autowired
     @Autowired
-    public void setWxChatContentService(CommonInfoService commonInfoService) {
+    public void setWxChatContentService(CommonInfoService commonInfoService, RedisUtils redisUtils) {
         SenInfoCheckUtil.commonInfoService = commonInfoService;
         SenInfoCheckUtil.commonInfoService = commonInfoService;
+        SenInfoCheckUtil.redisUtils = redisUtils;
     }
     }
 
 
 
 
@@ -53,10 +57,13 @@ public class SenInfoCheckUtil {
      * @return AccessToken
      * @return AccessToken
      */
      */
     public static String getMpToken(){
     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
      * @return AccessToken
      */
      */
     public static String getRiderMpToken(){
     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(){
     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) {
                 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) {
                 if (bshopName_start != null) {
                     stringBuilder.append(bshopName_start).append(tbOrder.getShopName()).append(bshopName_end);
                     stringBuilder.append(bshopName_start).append(tbOrder.getShopName()).append(bshopName_end);
@@ -806,7 +806,7 @@ public class FeiYunUtils {
 
 
                         case "platform_name":
                         case "platform_name":
                             if (isCheck == 1) {
                             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;
                             break;
                         case "shop_name":
                         case "shop_name":
@@ -955,15 +955,15 @@ public class FeiYunUtils {
                     }
                     }
                 }
                 }
                 //endregion
                 //endregion
-                if(goods_name_start != null){
+                if (goods_name_start != null) {
                     stringBuilder.append(goods_name_start).append("名称").append(goods_name_end).append("     ");
                     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("  ");
                     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("  ");
                     stringBuilder.append(goods_num_start).append("数量").append(goods_num_end).append("  ");
                 }
                 }
 
 
@@ -997,7 +997,7 @@ public class FeiYunUtils {
                     } else {
                     } else {
                         stringBuilder.append("  ");
                         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("   ");
                     stringBuilder.append("   ");
                     if (sum_money_start != null) {
                     if (sum_money_start != null) {
                         stringBuilder.append(sum_money_start).append(sumMoney).append(sum_money_end);
                         stringBuilder.append(sum_money_start).append(sumMoney).append(sum_money_end);
@@ -1092,7 +1092,7 @@ public class FeiYunUtils {
                             break;
                             break;
                         case "platform_name":
                         case "platform_name":
                             if (isCheck == 1) {
                             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;
                             break;
                         case "shop_name":
                         case "shop_name":
@@ -1316,7 +1316,7 @@ public class FeiYunUtils {
                         case "platform_name":
                         case "platform_name":
 
 
                             if (isCheck == 1) {
                             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;
                             break;
                         case "shop_name":
                         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(pay_time_start).append("订餐时间:").append(tbOrder.getPayTime()).append(pay_time_end).append("<BR>");
 
 
                 stringBuilder.append(userStringBuilder);
                 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("<BR>").append("<BR>").append("<BR>");
                 stringBuilder.append("<CUT>");
                 stringBuilder.append("<CUT>");
                 //endregion
                 //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 打印机编号
      * @param sn 打印机编号
      * @return 成功:{"msg":"ok","ret":0,"data":"xxxxxxx_xxxxxxxx_xxxxxxxx","serverExecutedTime":5}
      * @return 成功:{"msg":"ok","ret":0,"data":"xxxxxxx_xxxxxxxx_xxxxxxxx","serverExecutedTime":5}
      * 失败:{"msg":"错误描述","ret":非0,"data":"null","serverExecutedTime":5}
      * 失败:{"msg":"错误描述","ret":非0,"data":"null","serverExecutedTime":5}
@@ -1586,7 +1714,8 @@ public class FeiYunUtils {
             log.info("utils方法打印开始");
             log.info("utils方法打印开始");
 
 
             //region 以前的代码
             //region 以前的代码
-            String content = "<CB>测试打印</CB><BR>";
+            String content = "<AUDIO-REFUND>";
+            content += "<CB>测试打印</CB><BR>";
             content += "名称      单价  数量 金额<BR>";
             content += "名称      单价  数量 金额<BR>";
             content += "--------------------------------<BR>";
             content += "--------------------------------<BR>";
             content += "<B>饭       1.0    1   1.0</B><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:
                 wall:
                     config:
                     config:
                         multi-statement-allow: true
                         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:
 secure-api:
     # 开启SecureApi功能,如果为false则其余配置项均不生效
     # 开启SecureApi功能,如果为false则其余配置项均不生效
     enabled: true
     enabled: true

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

@@ -32,12 +32,25 @@ spring:
                 wall:
                 wall:
                     config:
                     config:
                         multi-statement-allow: true
                         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:
 secure-api:
     # 开启SecureApi功能,如果为false则其余配置项均不生效
     # 开启SecureApi功能,如果为false则其余配置项均不生效
     enabled: true
     enabled: true
     # 开启加解密日志打印,会打印出接口名、加密模式、算法、明文和密文等信息
     # 开启加解密日志打印,会打印出接口名、加密模式、算法、明文和密文等信息
-    show-log: true
+    show-log: false
     url-safe: true
     url-safe: true
     # 加密模式,common和session_key可选,session_key是会话密钥模式,用于每次请求都使用不同的密钥,需要前端配合
     # 加密模式,common和session_key可选,session_key是会话密钥模式,用于每次请求都使用不同的密钥,需要前端配合
     mode: common
     mode: common

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

@@ -19,7 +19,7 @@ spring:
     allow-circular-references: true
     allow-circular-references: true
   # 环境 dev|test|prod
   # 环境 dev|test|prod
   profiles:
   profiles:
-    active: prod
+    active: dev
   # jackson时间格式化
   # jackson时间格式化
   jackson:
   jackson:
     time-zone: GMT+8
     time-zone: GMT+8
@@ -29,19 +29,7 @@ spring:
       max-file-size: 1024MB
       max-file-size: 1024MB
       max-request-size: 1024MB
       max-request-size: 1024MB
       enabled: true
       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:
   mvc:
     throw-exception-if-no-handler-found: true
     throw-exception-if-no-handler-found: true
     pathmatch:
     pathmatch:
@@ -72,11 +60,11 @@ mybatis-plus:
     cache-enabled: false
     cache-enabled: false
     call-setters-on-nulls: true
     call-setters-on-nulls: true
     jdbc-type-for-null: 'null'
     jdbc-type-for-null: 'null'
-    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 
 
 sqx:
 sqx:
   redis:
   redis:
-    open: false
+    open: true
   shiro:
   shiro:
     redis: false
     redis: false
   # APP模块,是通过jwt认证的,如果要使用APP模块,则需要修改【加密秘钥】
   # APP模块,是通过jwt认证的,如果要使用APP模块,则需要修改【加密秘钥】

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

@@ -22,7 +22,7 @@
     </select>
     </select>
 
 
     <update id="updateExpiration">
     <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>
     </update>
 
 
     <select id="selectCouponByUserId" resultType="com.sqx.modules.coupon.entity.TbCouponUser">
     <select id="selectCouponByUserId" resultType="com.sqx.modules.coupon.entity.TbCouponUser">

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

@@ -71,7 +71,7 @@
             </if>
             </if>
         </where>
         </where>
         group by
         group by
-            shop_id
+            shop_id, shop_name
         order by
         order by
             distancess asc
             distancess asc
     </select>
     </select>
@@ -133,7 +133,7 @@
             and shop_id = #{queryDTO.shopId}
             and shop_id = #{queryDTO.shopId}
         </if>
         </if>
         group by
         group by
-            shop_id
+            shop_id, shop_name, shop_lng, shop_lat
         order by
         order by
             distancess asc
             distancess asc
     </select>
     </select>
@@ -144,6 +144,12 @@
         where indent_number = #{indentNumber}
         where indent_number = #{indentNumber}
     </select>
     </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 id="selectIndentByRiderUserCount" resultType="Integer">
         select count(*)
         select count(*)
         from tb_indent
         from tb_indent
@@ -166,6 +172,22 @@
         where indent_number = #{indentNumber}
         where indent_number = #{indentNumber}
     </update>
     </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 id="findRiderIndent" resultType="com.sqx.modules.errand.entity.TbIndent">
         select * from tb_indent where rider_user_id = #{userId}
         select * from tb_indent where rider_user_id = #{userId}
         <if test="indentState!=''">
         <if test="indentState!=''">
@@ -247,6 +269,7 @@
         where indent_number = #{indentNumber}
         where indent_number = #{indentNumber}
     </select>
     </select>
 
 
+
     <update id="updateRiderBalance">
     <update id="updateRiderBalance">
         update tb_user
         update tb_user
         set balance = #{balance}
         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
         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
         select tor.*, tu.avatar as avatar, gs.shop_name as shopName, gs.detailed_address as detailedAddress, gs.phone as
         shopPhone,
         shopPhone,
         tiu.user_name as riderNickName,tiu.phone as riderPhone,ti.indent_id as indentId,ti.is_rider as isRider,
         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
         from tb_order tor
         left join tb_user tu on tor.user_id = tu.user_id
         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 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_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_user tiu on tiu.user_id = ti.rider_user_id
         left join tb_coupon_user tcu on tor.coupon_id = tcu.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
         where 1 = 1
         <if test="riderPhone!=null and riderPhone!=''">
         <if test="riderPhone!=null and riderPhone!=''">
             and tiu.phone =#{riderPhone}
             and tiu.phone =#{riderPhone}
@@ -120,12 +123,24 @@
         <if test="orderType!=null">
         <if test="orderType!=null">
             and tor.order_type_extra = #{orderType}
             and tor.order_type_extra = #{orderType}
         </if>
         </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!=''">
         <if test="startTime!=null and startTime!=''">
             and date_format(tor.create_time,'%Y-%m-%d') >= date_format(#{startTime},'%Y-%m-%d')
             and date_format(tor.create_time,'%Y-%m-%d') >= date_format(#{startTime},'%Y-%m-%d')
         </if>
         </if>
         <if test="endTime!=null and endTime!='' ">
         <if test="endTime!=null and endTime!='' ">
             and date_format(tor.create_time,'%Y-%m-%d') &lt;= date_format(#{endTime},'%Y-%m-%d')
             and date_format(tor.create_time,'%Y-%m-%d') &lt;= date_format(#{endTime},'%Y-%m-%d')
         </if>
         </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
         order by tor.pay_time desc, tor.create_time desc
     </select>
     </select>
 
 
@@ -133,13 +148,16 @@
         select tor.*, tu.avatar as avatar, gs.shop_name as shopName, gs.detailed_address as detailedAddress, gs.phone as
         select tor.*, tu.avatar as avatar, gs.shop_name as shopName, gs.detailed_address as detailedAddress, gs.phone as
         shopPhone,
         shopPhone,
         tiu.nick_name as riderNickName,tiu.phone as riderPhone,ti.indent_id as indentId,ti.is_rider as isRider,
         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
         from tb_order tor
         left join tb_user tu on tor.user_id = tu.user_id
         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 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_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_user tiu on tiu.user_id = ti.rider_user_id
         left join tb_coupon_user tcu on tor.coupon_id = tcu.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
         where 1 = 1
         <if test="riderPhone!=null and riderPhone!=''">
         <if test="riderPhone!=null and riderPhone!=''">
             and tiu.phone =#{riderPhone}
             and tiu.phone =#{riderPhone}
@@ -446,4 +464,15 @@
         where shop_id = #{shopId} and status in (6, 3)
         where shop_id = #{shopId} and status in (6, 3)
     </select>
     </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>
 </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() {
+
+    }
+}