diff --git a/bonus-common-biz/src/main/java/com/bonus/utils/SpringContextHolder.java b/bonus-common-biz/src/main/java/com/bonus/utils/SpringContextHolder.java deleted file mode 100644 index b82db3fc..00000000 --- a/bonus-common-biz/src/main/java/com/bonus/utils/SpringContextHolder.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.bonus.utils; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.context.ApplicationEvent; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; - -@Service -@Lazy(false) -public class SpringContextHolder implements ApplicationContextAware, DisposableBean { - private static final Logger log = LoggerFactory.getLogger(SpringContextHolder.class); - private static ApplicationContext applicationContext = null; - - public static ApplicationContext getApplicationContext() { - return applicationContext; - } - - public void setApplicationContext(ApplicationContext applicationContext) { - SpringContextHolder.applicationContext = applicationContext; - } - - public static T getBean(String name) { - return (T) applicationContext.getBean(name); - } - - public static T getBean(Class requiredType) { - return applicationContext.getBean(requiredType); - } - - public static void clearHolder() { - if (log.isDebugEnabled()) { - log.debug("清除SpringContextHolder中的ApplicationContext:" + String.valueOf(applicationContext)); - } - - applicationContext = null; - } - - public static void publishEvent(ApplicationEvent event) { - if (applicationContext != null) { - applicationContext.publishEvent(event); - } - } - - public void destroy() { - clearHolder(); - } -} diff --git a/bonus-common-biz/src/main/java/com/bonus/utils/Id.java b/bonus-common-biz/src/main/java/com/bonus/utils/id/Id.java similarity index 95% rename from bonus-common-biz/src/main/java/com/bonus/utils/Id.java rename to bonus-common-biz/src/main/java/com/bonus/utils/id/Id.java index aa3fb604..39bda7b9 100644 --- a/bonus-common-biz/src/main/java/com/bonus/utils/Id.java +++ b/bonus-common-biz/src/main/java/com/bonus/utils/id/Id.java @@ -1,4 +1,4 @@ -package com.bonus.utils; +package com.bonus.utils.id; import com.google.common.base.Preconditions; @@ -13,11 +13,11 @@ public class Id { private static final long SEQUENCE_MASK = 4095L; private static final long WORKER_ID_LEFT_SHIFT_BITS = 12L; private static final long TIMESTAMP_LEFT_SHIFT_BITS = 22L; - static long WORKER_ID; + static Long WORKER_ID; private static long SEQUENCE; private static long LAST_TIME; - public Id(long workerId) { + public Id(Long workerId) { WORKER_ID = workerId; } diff --git a/bonus-common-biz/src/main/java/com/bonus/utils/id/IdProperties.java b/bonus-common-biz/src/main/java/com/bonus/utils/id/IdProperties.java new file mode 100644 index 00000000..caee9b2a --- /dev/null +++ b/bonus-common-biz/src/main/java/com/bonus/utils/id/IdProperties.java @@ -0,0 +1,37 @@ +package com.bonus.utils.id; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties( + prefix = "id" +) +public class IdProperties { + public static final String PREFIX = "id"; + private Boolean enabled = true; + private String key = "worker_id_sequence"; + private String workspace; + + public Boolean getEnabled() { + return this.enabled; + } + + public String getKey() { + return this.key; + } + + public String getWorkspace() { + return this.workspace; + } + + public void setEnabled(final Boolean enabled) { + this.enabled = enabled; + } + + public void setKey(final String key) { + this.key = key; + } + + public void setWorkspace(final String workspace) { + this.workspace = workspace; + } +} diff --git a/bonus-common-biz/src/main/java/com/bonus/utils/id/IdWorkConfiguration.java b/bonus-common-biz/src/main/java/com/bonus/utils/id/IdWorkConfiguration.java new file mode 100644 index 00000000..577dbae5 --- /dev/null +++ b/bonus-common-biz/src/main/java/com/bonus/utils/id/IdWorkConfiguration.java @@ -0,0 +1,123 @@ +package com.bonus.utils.id; + +import cn.hutool.core.text.CharSequenceUtil; +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.channels.FileChannel; +import java.nio.channels.FileLock; +import java.nio.charset.StandardCharsets; +import java.util.Collection; +import java.util.UUID; + +@Component +@ConditionalOnClass({StringRedisTemplate.class}) +@EnableConfigurationProperties({IdProperties.class}) +@ConditionalOnProperty( + prefix = "id", + name = {"enabled"}, + havingValue = "true", + matchIfMissing = true +) +public class IdWorkConfiguration { + private static final Logger log = LoggerFactory.getLogger(IdWorkConfiguration.class); + private final IdProperties idProperties; + + public IdWorkConfiguration(StringRedisTemplate redisTemplate, IdProperties idProperties) throws IOException { + this.idProperties = idProperties; + Long workerId = this.getLocalWorkId(); + + try { + while(workerId == null) { + Long newWorkId = redisTemplate.opsForValue().increment(idProperties.getKey(), 1L); + this.saveLocalWorkId(String.valueOf(newWorkId)); + workerId = this.getLocalWorkId(); + } + } catch (Throwable var5) { + log.error("获取workID失败", var5); + throw var5; + } + + if (workerId > 1024L) { + throw new RuntimeException("超过最大启动实例"); + } else { + Id.WORKER_ID = workerId; + } + } + + private void saveLocalWorkId(String workId) throws IOException { + File workIdHome = this.getWorkIdHome(); + String var10002 = String.valueOf(workIdHome.getAbsoluteFile()); + FileUtils.writeStringToFile(new File(var10002 + "/" + String.valueOf(UUID.randomUUID()) + ".lock"), workId, StandardCharsets.UTF_8); + } + + private File getWorkIdHome() { + String workHome = this.idProperties.getWorkspace(); + if (CharSequenceUtil.isBlank(workHome)) { + workHome = FileUtils.getUserDirectoryPath() + "/.workId/"; + } + + String var10002 = CharSequenceUtil.removeSuffix(workHome, "/"); + return new File(var10002 + "/" + this.idProperties.getKey()); + } + + private Long getLocalWorkId() throws IOException { + File workIdHome = this.getWorkIdHome(); + if (!workIdHome.exists()) { + return null; + } + + Collection files = FileUtils.listFiles(workIdHome, new String[]{"lock"}, false); + if (CollectionUtils.isEmpty(files)) { + return null; + } + + for (File file : files) { + FileChannel channel = null; + FileLock fileLock = null; + + try { + RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw"); + channel = randomAccessFile.getChannel(); + fileLock = channel.tryLock(); + + if (fileLock != null) { // 成功获取文件锁 + Long workId = Long.valueOf(randomAccessFile.readLine()); + releaseResourcesOnShutdown(channel); + return workId; + } + } catch (IOException e) { + log.error("Error accessing workId file", e); + } finally { + if (fileLock == null && channel != null) { + try { + channel.close(); + } catch (IOException e) { + log.error("Failed to close file channel", e); + } + } + } + } + return null; + } + + private void releaseResourcesOnShutdown(FileChannel channel) { + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + try { + channel.close(); + } catch (IOException e) { + log.error("Release WorkId file lock error", e); + } + })); + } +} diff --git a/bonus-cust-auth/src/main/java/com/bonus/auth/controller/TokenController.java b/bonus-cust-auth/src/main/java/com/bonus/auth/controller/TokenController.java index bc2aeb88..bb6d567a 100644 --- a/bonus-cust-auth/src/main/java/com/bonus/auth/controller/TokenController.java +++ b/bonus-cust-auth/src/main/java/com/bonus/auth/controller/TokenController.java @@ -1,6 +1,5 @@ package com.bonus.auth.controller; -import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.IdUtil; import com.bonus.auth.mapper.AuthCustInfoMapper; import com.bonus.common.core.constant.CacheConstants; @@ -16,7 +15,7 @@ import com.bonus.auth.mapper.AuthCustCasualMapper; import com.bonus.auth.service.*; import com.bonus.domain.SmsCodeVerifyDTO; import com.bonus.utils.AesEncryptUtil; -import com.bonus.utils.Id; +import com.bonus.utils.id.Id; import com.bonus.utils.SM4EncryptUtils; import com.bonus.common.core.domain.R; import com.bonus.common.core.exception.ServiceException; diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccInfoServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccInfoServiceImpl.java index 8880d8a1..705dcf66 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccInfoServiceImpl.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/account/v3/service/impl/AccInfoServiceImpl.java @@ -1,25 +1,12 @@ package com.bonus.core.account.v3.service.impl; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.ListUtil; -import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bonus.common.core.exception.ServiceException; -import com.bonus.constant.LeConstants; import com.bonus.core.account.v3.api.vo.AccInfoDetailVO; -import com.bonus.core.account.v3.constants.AccStatusEnum; import com.bonus.core.account.v3.mapper.AccInfoMapper; import com.bonus.core.account.v3.metadata.enums.AccWalletIdEnum; import com.bonus.core.account.v3.model.AccInfo; @@ -31,17 +18,9 @@ import com.bonus.core.account.v3.web.vo.AccInfoVO; import com.bonus.core.account.v3.web.vo.AccWalletInfoVO; import com.bonus.core.account.v4.api.CardInfoServiceV4Api; import com.bonus.core.account.v4.web.model.AccCard; -import com.bonus.core.common.redis.RedisUtil; -import com.bonus.core.common.utils.TenantContextHolder; -import com.bonus.utils.Id; -import com.github.pagehelper.PageHelper; -import com.github.pagehelper.page.PageMethod; -import com.google.common.collect.Lists; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; -import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.stereotype.Service; import javax.annotation.Resource; diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/utils/CommonConfiguration.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/utils/CommonConfiguration.java new file mode 100644 index 00000000..2bc75aa0 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/common/utils/CommonConfiguration.java @@ -0,0 +1,10 @@ +package com.bonus.core.common.utils; + +import com.bonus.utils.id.IdWorkConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Configuration +@Import({IdWorkConfiguration.class}) +public class CommonConfiguration { +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/menu/service/impl/MenuRecipeServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/menu/service/impl/MenuRecipeServiceImpl.java index ac1a1e31..bd6894d8 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/menu/service/impl/MenuRecipeServiceImpl.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/menu/service/impl/MenuRecipeServiceImpl.java @@ -3,7 +3,6 @@ package com.bonus.core.menu.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bonus.common.core.exception.ServiceException; @@ -24,9 +23,8 @@ import com.bonus.core.menu.mapper.MenuAppRecipeMapper; import com.bonus.core.menu.vo.AppletWeekCanteenVO; import com.bonus.core.menu.vo.AppletWeekRecipeVO; import com.bonus.domain.CustInfo; -import com.bonus.utils.Id; +import com.bonus.utils.id.Id; import com.google.common.collect.Lists; -import com.google.common.collect.Maps; import com.google.common.collect.Sets; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/query/OrderIndexType.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/query/OrderIndexType.java index a1c70f0e..e7d3d696 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/query/OrderIndexType.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/query/OrderIndexType.java @@ -10,9 +10,4 @@ public enum OrderIndexType { ROOM_ID_ORDER_DATE, ORDER_TYPE_ORDER_DATE, CANTEEN_ID_STALL_ID_MEALTIME_ORDER_TYPE_ORDER_DATE; - - // $FF: synthetic method - private static OrderIndexType[] $values() { - return new OrderIndexType[]{MAC_ORDER_ID, ORDER_DATE, ORDER_TIME, PAY_TIME, CUST_ID_ORDER_DATE, MACHINE_SN_ORDER_DATE, ROOM_ID_ORDER_DATE, ORDER_TYPE_ORDER_DATE, CANTEEN_ID_STALL_ID_MEALTIME_ORDER_TYPE_ORDER_DATE}; - } } diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/query/OrderQueryHelper.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/query/OrderQueryHelper.java index 810c05c0..4a4073a8 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/query/OrderQueryHelper.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/core/order/common/query/OrderQueryHelper.java @@ -10,8 +10,8 @@ import com.bonus.core.allocation.canteen.service.AllocCanteenService; import com.bonus.core.allocation.canteen.service.AllocStallService; import com.bonus.core.common.enums.AllocCanteenTypeEnum; import com.bonus.core.common.enums.AllocMealtimeTypeEnum; +import com.bonus.core.common.utils.SpringContextHolder; import com.bonus.core.order.common.constants.OrderTypeEnum; -import com.bonus.utils.SpringContextHolder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service;