UserZYTravel/guns-admin/pom.xml
@@ -9,7 +9,7 @@ <relativePath>../pom.xml</relativePath> </parent> <artifactId>guns-admin</artifactId> <artifactId>user</artifactId> <name>guns-admin</name> <description>guns 的spring boot版本</description> UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -16,6 +16,7 @@ import com.stylefeng.guns.modular.system.dao.*; import com.stylefeng.guns.modular.system.model.*; import com.stylefeng.guns.modular.system.service.*; import com.stylefeng.guns.modular.system.service.impl.OrderPositionServiceImpl; import com.stylefeng.guns.modular.system.util.*; import com.stylefeng.guns.modular.system.warpper.BaseWarpper; import com.stylefeng.guns.modular.system.warpper.EndPushWarpper; @@ -47,6 +48,7 @@ import java.math.MathContext; import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -360,6 +362,20 @@ } AssignOrder assignOrder = assignOrderService.selectOne(new EntityWrapper<AssignOrder>().eq("companyId", query.getId()).eq("type", 1)); if(null != assignOrder){//配置了指派规则才处理 boolean lock = redisUtil.lock("order_lock", 10); if(!lock){ int num1 = 1; while (num1 <= 10){ Thread.sleep(3000);//等待3秒 lock = redisUtil.lock("order_lock", 10); if(lock){ break; }else{ num1++; } } } try { //获取空闲司机 List<Driver> drivers = driverService.queryIdleDriver(1, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), assignOrder.getDistance(), null);//获取范围内空闲司机 List<Integer> driverIds = drivers.stream().map(Driver::getId).collect(Collectors.toList()); @@ -376,13 +392,12 @@ List<Integer> orderPrivateCarDriverIds = orderPrivateCars.stream().map(OrderPrivateCar::getDriverId).collect(Collectors.toList()); for(int j = 0; j < drivers.size(); j++){ Driver driver1 = drivers.get(j); // 判断该司机是否有30分钟内预约单 long count = orderPrivateCarss.stream().filter(orderPrivateCar1 -> driver1.getId().equals(orderPrivateCar1.getDriverId()) && DateUtil.dateToLocalDateTime(orderPrivateCar1.getTravelTime()).minusMinutes(30).isBefore(LocalDateTime.now()) && DateUtil.dateToLocalDateTime(orderPrivateCar1.getTravelTime()).isAfter(LocalDateTime.now())).count(); if(orderPrivateCar.getOrderType() == 2 && orderPrivateCarDriverIds.contains(driver.getId())){ continue; } // 判断该司机是否有30分钟内预约单 long count = orderPrivateCarss.stream().filter(s -> s.getDriverId().equals(driver1.getId()) && DateUtil.dateToLocalDateTime(s.getTravelTime()).minusMinutes(30).isBefore(LocalDateTime.now())).count(); if(count > 0){ continue; } @@ -466,6 +481,11 @@ //发送短信给司机 // aLiSendSms.sendSms(dr.getPhone(), "SMS_216832951", "{\"" + orderPrivateCar.getStartAddress() + "\"}"); } }catch (Exception e){ e.printStackTrace(); }finally { redisUtil.unlock("order_lock"); } } } @@ -957,10 +977,20 @@ @Override public ResultUtil payPrivateCarOrder(Integer payType, Integer orderId, Integer couponId, Integer type) throws Exception { String value = redisUtil.getValue(orderId + "_status_1"); if(ToolUtil.isNotEmpty(value) && "8".equals(value)){ return ResultUtil.error("订单已完成支付,不允许重复支付", ""); boolean lock = redisUtil.lock(orderId + "_payment", 10); if(!lock){ int num1 = 1; while (num1 <= 10){ Thread.sleep(3000);//等待3秒 lock = redisUtil.lock(orderId + "_payment", 10); if(lock){ break; }else{ num1++; } } } try { OrderPrivateCar orderPrivateCar = this.selectById(orderId); if(orderPrivateCar.getState() == 8 || orderPrivateCar.getState() == 9){ return ResultUtil.error("订单已完成支付,不允许重复支付", ""); @@ -1075,11 +1105,11 @@ } //订单创建后15分钟 while ((System.currentTimeMillis() - time) <= 900000) { try { String value1 = redisUtil.getValue(orderId + "_status_1"); if(ToolUtil.isNotEmpty(value1) && "8".equals(value1)){ OrderPrivateCar orderPrivateCar1 = OrderPrivateCarServiceImpl.this.selectById(orderId); if(orderPrivateCar1.getState() != 7){ break; } try { ResultUtil<Map<String, Object>> resultUtil2 = payMoneyUtil.queryWXOrder("", code, "JSAPI"); if (resultUtil2.getCode() == 200) { /** @@ -1109,8 +1139,9 @@ e.printStackTrace(); } } String value1 = redisUtil.getValue(orderId + "_status_1"); if(ToolUtil.isNotEmpty(value1) && "7".equals(value1)){ OrderPrivateCar orderPrivateCar1 = OrderPrivateCarServiceImpl.this.selectById(orderId); if(7 == orderPrivateCar1.getState()){ //关闭订单,不允许支付 payMoneyUtil.closeWXOrder(code); PaymentRecord paymentRecord = paymentRecordService.selectOne(new EntityWrapper<PaymentRecord>().eq("serialNumber", code)); @@ -1210,6 +1241,12 @@ } }).start(); return resultUtil; }catch (Exception e){ e.printStackTrace(); }finally { redisUtil.unlock(orderId + "_payment"); } return ResultUtil.error("支付异常"); } @Override @@ -1359,14 +1396,29 @@ @Override @Transactional(rollbackFor = Exception.class) public synchronized void payOrderPrivateCarCallback(Integer id, String order_id, Integer type) throws Exception { boolean lock = redisUtil.lock(order_id + "_paymentCallback", 10); if(!lock){ int num1 = 1; while (num1 <= 10){ Thread.sleep(3000);//等待3秒 lock = redisUtil.lock(order_id + "_paymentCallback", 10); if(lock){ break; }else{ num1++; } } } try { PaymentRecord query = paymentRecordService.query(1, null, null, Integer.valueOf(id), 1, type, null); if(null != query){ String value = redisUtil.getValue(order_id + "_status_1"); if(ToolUtil.isNotEmpty(value) && "8".equals(value)){ return; } //添加交易明细 OrderPrivateCar orderPrivateCar = this.selectById(id); if(7 != orderPrivateCar.getState()){ return; } transactionDetailsService.saveData(orderPrivateCar.getUserId(), "完成订单", query.getAmount(), 2, 1, 1, 1, query.getOrderId()); orderPrivateCar.setState(8); orderPrivateCar.setPayType(type); @@ -1396,7 +1448,6 @@ query.setState(2); query.setCode(order_id); paymentRecordService.updateById(query); redisUtil.setStrValue(order_id + "_status_1", "8"); if(orderPrivateCar.getIsplatPay()==1){ //添加已收入明细 @@ -1435,6 +1486,11 @@ }else{ System.err.println("预支付数据异常(orderId = " + id + ")"); } }catch (Exception e){ e.printStackTrace(); }finally { redisUtil.unlock(order_id + "_paymentCallback"); } } @Override UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java
@@ -87,7 +87,7 @@ params.add("id", String.valueOf(uid)); params.add("type", String.valueOf(type)); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers); String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class); String s = internalRestTemplate.postForObject("http://message-push/netty/sendMsgToClient",requestEntity , String.class); JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); if(jsonObject1.getIntValue("code") != 200){ log.error(jsonObject1.getString("msg")); @@ -122,7 +122,7 @@ params.add("id", String.valueOf(uid)); params.add("type", String.valueOf(type)); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers); String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class); String s = internalRestTemplate.postForObject("http://message-push/netty/sendMsgToClient",requestEntity , String.class); JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); if(jsonObject1.getIntValue("code") != 200){ log.error(jsonObject1.getString("msg")); @@ -291,7 +291,7 @@ params.add("id", jsonObject.getString("id")); params.add("type", jsonObject.getString("type")); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers); String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class); String s = internalRestTemplate.postForObject("http://message-push/netty/sendMsgToClient",requestEntity , String.class); JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); if(jsonObject1.getIntValue("code") != 200){ log.error(jsonObject1.getString("msg")); @@ -321,7 +321,7 @@ params.add("id", id.toString()); params.add("type", type.toString()); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers); String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class); String s = internalRestTemplate.postForObject("http://message-push/netty/sendMsgToClient",requestEntity , String.class); JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); if(jsonObject1.getIntValue("code") != 200){ log.error(jsonObject1.getString("msg")); @@ -358,7 +358,7 @@ params.add("id", String.valueOf(uid)); params.add("type", String.valueOf(type)); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers); String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class); String s = internalRestTemplate.postForObject("http://message-push/netty/sendMsgToClient",requestEntity , String.class); JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class); if(jsonObject1.getIntValue("code") != 200){ log.error(jsonObject1.getString("msg")); UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java
@@ -10,9 +10,14 @@ import org.springframework.stereotype.Component; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; import org.springframework.web.client.RestTemplate; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.Pipeline; import java.io.IOException; import java.util.*; /** @@ -22,7 +27,9 @@ public class RedisUtil { @Autowired private RestTemplate internalRestTemplate; private JedisPool jedisPool; private Timer timer; /** @@ -31,23 +38,11 @@ * @param value */ public void setStrValue(String key, String value){ if(ToolUtil.isNotEmpty(key)){ //发送验证码短信 HttpHeaders headers = new HttpHeaders(); // 以表单的方式提交 headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); //将请求头部和参数合成一个请求 MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); params.add("key", key); params.add("value", value); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers); String s = internalRestTemplate.postForObject("http://zuul-gateway/redis/setValue_", requestEntity, String.class); JSONObject jsonObject = JSON.parseObject(s, JSONObject.class); if(jsonObject.getIntValue("code") != 200){ System.err.println("调用redis出错了"); if(ToolUtil.isNotEmpty(key) && ToolUtil.isNotEmpty(value)){ Jedis resource = jedisPool.getResource(); String set = resource.set(key, value); closeJedis(resource); } } } @@ -58,22 +53,10 @@ * @param time 秒 */ public void setStrValue(String key, String value, int time){ if(ToolUtil.isNotEmpty(key)){ //发送验证码短信 HttpHeaders headers = new HttpHeaders(); // 以表单的方式提交 headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); //将请求头部和参数合成一个请求 MultiValueMap<String, String> params = new LinkedMultiValueMap<>(); params.add("key", key); params.add("value", value); params.add("time", String.valueOf(time)); HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers); String s = internalRestTemplate.postForObject("http://zuul-gateway/redis/setValue", requestEntity, String.class); JSONObject jsonObject = JSON.parseObject(s, JSONObject.class); if(jsonObject.getIntValue("code") != 200){ System.err.println("调用redis出错了"); } if(ToolUtil.isNotEmpty(key) && ToolUtil.isNotEmpty(value)){ Jedis resource = jedisPool.getResource(); String setex = resource.setex(key, time, value); closeJedis(resource); } } @@ -85,19 +68,43 @@ */ public String getValue(String key){ if(ToolUtil.isNotEmpty(key)){ HttpHeaders headers = new HttpHeaders(); // 以表单的方式提交 headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); //将请求头部和参数合成一个请求 MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); params.add("key", key); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers); String s = internalRestTemplate.postForObject("http://zuul-gateway/redis/getValue",requestEntity , String.class); JSONObject jsonObject = JSON.parseObject(s, JSONObject.class); if(jsonObject.getIntValue("code") != 200){ System.err.println("调用redis出错了"); Jedis resource = jedisPool.getResource(); String data = resource.get(key); closeJedis(resource); return data; } return jsonObject.getString("data"); return null; } /** * 批量获取 * @param kes * @return */ public List<Object> getValues(List<String> kes){ if(null != kes){ Jedis resource = jedisPool.getResource(); Pipeline pipelined = resource.pipelined(); for(String key : kes){ pipelined.get(key); } List<Object> list = pipelined.syncAndReturnAll(); closeJedis(resource); pipelined.clear(); try { pipelined.close(); } catch (IOException e) { e.printStackTrace(); } List<Object> data = new ArrayList<>(); for(Object o : list){ if(null != o){ data.add(o); } } return data; } return null; } @@ -107,22 +114,140 @@ * 删除key * @param key */ public String remove(String key){ public void remove(String key){ if(ToolUtil.isNotEmpty(key)){ HttpHeaders headers = new HttpHeaders(); // 以表单的方式提交 headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); //将请求头部和参数合成一个请求 MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); params.add("key", key); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers); String s = internalRestTemplate.postForObject("http://zuul-gateway/redis/remove",requestEntity , String.class); JSONObject jsonObject = JSON.parseObject(s, JSONObject.class); if(jsonObject.getIntValue("code") != 200){ System.err.println("调用redis出错了"); Jedis resource = jedisPool.getResource(); Long del = resource.del(key); closeJedis(resource); } return jsonObject.getString("data"); } return null; /** * 向集合key添加数据 * @param key * @param members */ public void addSetValue(String key, String...members){ if(ToolUtil.isNotEmpty(key) && ToolUtil.isNotEmpty(members)){ Jedis resource = jedisPool.getResource(); Long sadd = resource.sadd(key, members); resource.close(); } } /** * 返回Set集合数据 * @param key * @return */ public Set<String> getSetAllValue(String key){ Set<String> smembers = new HashSet<>(); if(ToolUtil.isNotEmpty(key)){ Jedis resource = jedisPool.getResource(); smembers = resource.smembers(key); resource.close(); } return smembers; } /** * 删除Set集合中的值 * @param key * @param members */ public void delSetValue(String key, String...members){ if(ToolUtil.isNotEmpty(key) && ToolUtil.isNotEmpty(members)){ Jedis resource = jedisPool.getResource(); Long sadd = resource.srem(key, members); resource.close(); } } /** * 删除资源 * @param jedis */ public void closeJedis(Jedis jedis){ if(null != jedis){ jedis.close(); } } /** * redis加锁 * @param key * @param value * @param time * @return */ public boolean lock(String key, String value, int time){ if(!StringUtils.isEmpty(key)){ key += "_lock"; Jedis resource = jedisPool.getResource(); String set = resource.set(key, value, "nx", "ex", time); if("OK".equals(set)){ String finalKey = key; timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { System.err.println("定时任务启动"); Jedis resource = jedisPool.getResource(); resource.setex(finalKey, time, value); resource.close(); } }, 1000, 500); } resource.close(); return "OK".equals(set) ? true : false; } return false; } /** * 获取redis锁 * @param time * @return */ public boolean lock(int time){ String uuid = UUID.randomUUID().toString(); return lock("redis", uuid, time); } public boolean lock(String key, int time){ String uuid = UUID.randomUUID().toString(); return lock(key, uuid, time); } /** * redis释放锁 * @param key * @return */ public boolean unlock(String key){ if(!StringUtils.isEmpty(key)){ key += "_lock"; Jedis resource = jedisPool.getResource(); timer.cancel();//取消定时任务 Long del = resource.del(key); resource.close(); return del != 0 ? true : false; } return false; } /** * 删除锁 * @return */ public boolean unlock(){ return unlock("redis"); } } UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/PaymentRecordServiceImpl.java
@@ -48,9 +48,6 @@ paymentRecord.setInsertTime(new Date()); paymentRecord.setSerialNumber(serialNumber); this.insert(paymentRecord); if(state == 1){ redisUtil.setStrValue(orderId + "_status_" + orderType, "7", 3600); } return paymentRecord.getId(); } UserZYTravel/guns-admin/src/main/resources/redis.properties
@@ -4,10 +4,11 @@ # Redis·þÎñÆ÷µØÖ· spring.redis.host=127.0.0.1 # Redis·þÎñÆ÷Á¬½Ó¶Ë¿Ú spring.redis.port=6379 spring.redis.port=16379 #spring.redis.port=6379 # Redis·þÎñÆ÷Á¬½ÓÃÜÂ루ĬÈÏΪ¿Õ£© spring.redis.password=123456 #spring.redis.password= spring.redis.password=mPMHThYzlT8DWgl8HLqwPEyPOiHDPPB5 #spring.redis.password=123456 # Á¬½Ó³Ø×î´óÁ¬½ÓÊý£¨Ê¹ÓøºÖµ±íʾûÓÐÏÞÖÆ£© spring.redis.jedis.pool.max-active=1024 # Á¬½Ó³Ø×î´ó×èÈûµÈ´ýʱ¼ä£¨Ê¹ÓøºÖµ±íʾûÓÐÏÞÖÆ£©