bianzhenhua123 1 mesiac pred
commit
9e9a97bc02
32 zmenil súbory, kde vykonal 4269 pridanie a 0 odobranie
  1. 1 0
      README.md
  2. 30 0
      micro-common/pom.xml
  3. 954 0
      micro-common/src/main/java/com/poyee/common/constant/Constants.java
  4. 175 0
      micro-common/src/main/java/com/poyee/common/domain/BaseEntity.java
  5. 88 0
      micro-common/src/main/java/com/poyee/common/domain/CharsetKit.java
  6. 1001 0
      micro-common/src/main/java/com/poyee/common/domain/Convert.java
  7. 92 0
      micro-common/src/main/java/com/poyee/common/domain/StrFormatter.java
  8. 69 0
      micro-common/src/main/java/com/poyee/common/domain/entity/SysDictData.java
  9. 47 0
      micro-common/src/main/java/com/poyee/common/dto/DictPropDTO.java
  10. 166 0
      micro-common/src/main/java/com/poyee/common/dto/InDto.java
  11. 194 0
      micro-common/src/main/java/com/poyee/common/dto/OutDTO.java
  12. 55 0
      micro-common/src/main/java/com/poyee/common/exception/ServiceException.java
  13. 499 0
      micro-common/src/main/java/com/poyee/common/utils/StringUtils.java
  14. 67 0
      micro-common/src/main/java/com/poyee/common/utils/bean/DozerUtils.java
  15. 31 0
      micro-dao/pom.xml
  16. 21 0
      micro-dao/src/main/java/com/poyee/dao/mapper/SysDictDataMapper.java
  17. 43 0
      micro-dao/src/main/resources/SysDictDataMapper.xml
  18. 27 0
      micro-manager/pom.xml
  19. 14 0
      micro-manager/src/main/java/com/poyee/manager/cache/DictCache.java
  20. 22 0
      micro-manager/src/main/java/com/poyee/manager/impl/DictCacheImpl.java
  21. 30 0
      micro-service/pom.xml
  22. 21 0
      micro-service/src/main/java/com/poyee/service/DictService.java
  23. 45 0
      micro-service/src/main/java/com/poyee/service/impl/DictServiceImpl.java
  24. 121 0
      pom.xml
  25. 21 0
      web-controller/pom.xml
  26. 14 0
      web-controller/src/main/java/com/poyee/SvrApplication.java
  27. 45 0
      web-controller/src/main/java/com/poyee/controller/AppCommonController.java
  28. 54 0
      web-controller/src/main/resources/application-druid.yml
  29. 75 0
      web-controller/src/main/resources/application-prod.yml
  30. 152 0
      web-controller/src/main/resources/application.yml
  31. 80 0
      web-controller/src/main/resources/ehcache/ehcache-shiro.xml
  32. 15 0
      web-controller/src/main/resources/mybatis/mybatis-config.xml

+ 1 - 0
README.md

@@ -0,0 +1 @@
+app部分接口迁移到这个库

+ 30 - 0
micro-common/pom.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.poyee</groupId>
+        <artifactId>poyee-micro</artifactId>
+        <version>1.0.0</version>
+    </parent>
+
+    <artifactId>micro-common</artifactId>
+    <version>1.0.0</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.github.dozermapper</groupId>
+            <artifactId>dozer-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 954 - 0
micro-common/src/main/java/com/poyee/common/constant/Constants.java

@@ -0,0 +1,954 @@
+package com.poyee.common.constant;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 通用常量信息
+ * 
+ * @author zheng
+ */
+public class Constants {
+	/**
+	 * UTF-8 字符集
+	 */
+	public static final String UTF8 = "UTF-8";
+
+	/**
+	 * GBK 字符集
+	 */
+	public static final String GBK = "GBK";
+
+	/**
+	 * 通用成功标识
+	 */
+	public static final String SUCCESS = "0";
+
+	/**
+	 * 通用失败标识
+	 */
+	public static final String FAIL = "1";
+
+	/**
+	 * 登录成功
+	 */
+	public static final String LOGIN_SUCCESS = "Success";
+
+	/**
+	 * 注销
+	 */
+	public static final String LOGOUT = "Logout";
+
+	/**
+	 * 注册
+	 */
+	public static final String REGISTER = "Register";
+
+	/**
+	 * 登录失败
+	 */
+	public static final String LOGIN_FAIL = "Error";
+
+	/**
+	 * 当前记录起始索引
+	 */
+	public static final String PAGE_NUM = "pageNum";
+
+	/**
+	 * 每页显示记录数
+	 */
+	public static final String PAGE_SIZE = "pageSize";
+
+	/**
+	 * 排序列
+	 */
+	public static final String ORDER_BY_COLUMN = "orderByColumn";
+
+	/**
+	 * 排序的方向 "desc" 或者 "asc".
+	 */
+	public static final String IS_ASC = "isAsc";
+
+	/**
+	 * 参数管理 cache name
+	 */
+	public static final String SYS_CONFIG_CACHE = "sys-config";
+
+	/**
+	 * 参数管理 cache key
+	 */
+	public static final String SYS_CONFIG_KEY = "sys_config:";
+
+	/**
+	 * 字典管理 cache name
+	 */
+	public static final String SYS_DICT_CACHE = "sys-dict";
+
+	/**
+	 * 字典管理 cache key
+	 */
+	public static final String SYS_DICT_KEY = "sys_dict:";
+
+	/**
+	 * 资源映射路径 前缀
+	 */
+	public static final String RESOURCE_PREFIX = "/profile";
+	public static final String STOCK_GROUP_INFO = "STOCK_GROUP_INFO_";
+	public static final String AUTHENTICATION_TOKEN = "REDIS_AUTHENTICATION_TOKEN_";
+	public static final String AUTHORIZATION = "token";
+	public static final String ORDER_BY = "order by ";
+	public static final String STATUS_OK = "1";
+	public static final String ONE = "1";
+	public static final String ZERO = "0";
+	public static final String TWO = "2";
+	public static final String FINANCE_TYPE_ADD = "支付";
+	public static final String FINANCE_TYPE_RETURN = "退款";
+	public static final String PAY_CALLBACK_LOCK_KEY = "pay_callback_lock_key";
+	public static final String ORDER_CALLBACK_LOCK_KEY = "order_callback_lock_key";
+	public static final String TRADE_SUCCESS = "支付成功";
+	public static final String TRADE_SUCCESS_EN = "SUCCESS";
+	public static final String ALIPAY_TRADE_SUCCESS = "TRADE_SUCCESS";
+	public static final String ALIPAY_REFUND_SUCCESS = "REFUND_SUCCESS";
+	public static final String REDIRECT_PATH = "/pageB/productDetail/productDetail?id=";
+	public static final String TYPE_BANNER_DETAIL = "banner_detail";
+	public static final String QINIU_HOST = "https://static.public.hobbystock.cn";
+	public static final String MERCHANT_INFO_TYPE_SALE = "sale";
+	public static final String MERCHANT_INFO_TYPE_HISTORY = "history";
+	public static final String KEY_WORD = "keyword";
+	public static final String BANK_STR = " ";
+	public static final String EMPTY_STR = "";
+	public static final String AND_STR = "&";
+	public static final String USER_FACE_VERIFY = "USER_FACE_VERIFY_ID";
+	public static final String RY_TOKEN = "RY_TOKEN";
+	//商家拉黑类型
+	public static final @NotNull String DICT_TYPE_MER_PULL_BACK = "mer_pull_back";
+	public static long timesDay = 60 * 60 * 24 * 7;
+	public static long times = 1000 * timesDay;
+	public static final String OPTIONS = "OPTIONS";
+	public static final String ORDER_BUY_ALL_MARK = "ORDER_BUY_ALL_MARK";
+	public static final String CARD_INFO_MARK = "CARD_INFO_MARK_";
+	public static final String CARD_GOODS_ACT_SIGN = "CARD_GOODS_ACT_SIGN";
+	public static final String CARD_INFO_ACT_SIGN = "CARD_INFO_ACT_SIGN";
+	public static Map<String, Object> JSON_HEADS = new HashMap(1) {{
+		put("Content-Type", "application/json");
+	}};
+	public static final String JPUSH_TYPE_TAG = "tags";
+	public static final String JPUSH_TYPE_ID = "registrationIds";
+	public static final String ORDER_BUY_ALL_RETURN_TITLE = "亲爱的用户您好,感谢您对HOBBY STOCKS的支持,请理性参与购买,祝您玩卡愉快,得到好卡!";
+	public static final String CODE_TYPE_INCR = "CODE_TYPE_INCR_";
+	public static final String USER_CODE_TYPE_INCR = "USER_CODE_TYPE_INCR";
+	public static final String PRICE_FOR_NEW = "price_for_new";
+	public static String PUSH_TYPE_JPUSH = "jpush";
+	public static String PUSH_TYPE_SYSTEM = "system";
+	public static String PUSH_ACCEPT_TYPE_ALL = "all";
+	public static String PUSH_ACCEPT_TYPE_SETS = "sets";
+	public static String PUSH_ACCEPT_TYPE_GROUP = "group";
+	public static String PUSH_ACCEPT_TYPE_USER = "user";
+	public static String APP_VERSION_PROD = "prod";
+	public static String APP_VERSION_DEV = "dev";
+	/**
+	 * 买队玩法
+	 */
+	public static String INFO_TYPE_BUY_TEAM = "买队玩法";
+	/**
+	 * 选队随机
+	 */
+	public static String INFO_TYPE_SELECT_TEAM = "选队随机";
+	/**
+	 * 支持 转 剩余随机的玩法
+	 * ||买队,选队随机
+	 */
+	public static List<String> CAN_CHANGE_RATE = Arrays.asList(INFO_TYPE_BUY_TEAM, INFO_TYPE_SELECT_TEAM);
+	/**
+	 * 自选卡种
+	 */
+	public static String INFO_TYPE_SELECT_SETS = "自选卡种";
+	/**
+	 * 随机球队
+	 */
+	public static String INFO_TYPE_TEAM = "随机球队";
+	/**
+	 * 随机球员
+	 */
+	public static String INFO_TYPE_PLAYER = "随机球员";
+	/**
+	 * 随机卡种(区分编号)
+	 */
+	public static String INFO_TYPE_SETS = "随机卡种(区分编号)";
+	/**
+	 * 随机卡种(不区分编号)
+	 */
+	public static String INFO_TYPE_SETS_NUM = "随机卡种(不区分编号)";
+	/**
+	 * 选队随机 子分类:区域随机
+	 */
+	public static String INFO_SUB_TYPE_AREA_RANDOM = "区域随机";
+	public static String CACHE_GOODS_SETS = "APP_CACHE_GOODS_SETS_";
+	public static String CACHE_GOODS_TEAM = "APP_CACHE_GOODS_TEAM_";
+	public static String GROUP_INFO_MIX_MAX_PRICE = "GROUP_INFO_MIX_MAX_PRICE";
+	public static String GROUP_INFO_CLICK_COUNT = "GROUP_INFO_CLICK_COUNT";
+	public static String MERCHANT_APP_USER_LINK = "MERCHANT_APP_USER_LINK";
+	public static String INFO_SORT_RATE_TYPE = "info_sort_rate_type";
+	public static String SORT_RATE_TYPE_CLICK = "sort_rate_type_click";
+	public static String SORT_RATE_TYPE_SOLD_AMOUNT = "sort_rate_type_sold_amount";
+	public static String SORT_AMOUNT_RATE = "sort_amount_rate";
+	public static String SORT_AMOUNT_RATE_NEW = "sort_amount_rate_new";
+	public static String CARD_INFO_MARK_USER = "CARD_INFO_MARK_USER";
+	public static String CODE_USER_LINK = "CODE_USER_LINK";
+	public static String REFUND_TYPE = "REFUND_TYPE";
+	public static String REFUND_TYPE_CODE = "code";
+	public static String ORDER_MARK_USER_POINT = "ORDER_MARK_USER_POINT";
+	public static final String ORDER_MARK_INFO_MSG = "亲爱的卡迷用户,为了更好的营造平台用户购物体验,您购买的本组订单未支付(含订单支付超时)次数即将达到单日上限,若未及时支付,您将于24小时内无法购买本组商品。感谢您的配合,祝您玩卡愉快,获得心仪卡片!";
+	public static final String ORDER_MARK_INFO_MSG_END = "亲爱的卡迷用户,为了更好的营造平台用户购物体验,您购买的本组订单未支付(含订单支付超时)次数已达到单日上限,您将于24小时内无法购买本组商品。感谢您的配合,祝您玩卡愉快,获得心仪卡片!";
+	public static final String ORDER_MARK_APP_MSG = "亲爱的卡迷用户,为了更好的营造平台用户购物体验,您当日订单未支付(含订单支付超时)次数即将达到单日上限,若未及时支付,您将于24小时内无法购买本平台商品。感谢您的配合,祝您玩卡愉快,获得心仪卡片!";
+	public static final String ORDER_MARK_APP_MSG_END = "亲爱的卡迷用户,为了更好的营造平台用户购物体验,您当日订单未支付(含订单支付超时)次数已达到单日上限,您将于24小时内无法购买本平台商品。感谢您的配合,祝您玩卡愉快,获得心仪卡片!";
+	public static final String PHONE_CHECK = "PHONE_CHECK";
+	public static final String LIMIT_RULE = "LIMIT_RULE";
+	public static final String comma = ",";
+	public static final String dot = ".";
+	public static final String pound_key = "#";
+	public static final String comma2 = ",,";
+	public static final String comma3 = ",,,";
+	public static final String bank = " ";
+	public static final String sub = "-";
+	public static final String seq_ZN = "编";
+	public static final String NO = "No.";
+	public static final String WORK_WX_LIVE_OPEN = "work_wx_live_open";
+	public static final String XML_BACK_SUCCESS = " xmlBack = \"<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>\";";
+	public static String GROUP_PLAYBACKPATH = "GROUP_PLAYBACKPATH_";
+	public static String ORDER_CANCEL_PREFIX = "ORDERCANCELPREFIX_";
+	public static String ORDER_CANCEL_LOCK = "ORDER_CANCEL_LOCK_";
+	public static final String All = "all";
+	public static final String TRUE_STR = "T";
+	public static final String LIVE_TYPE_APPLET = "applet";
+	public static final String LIVE_TYPE_WORK_WX = "work_wx";
+	public static final String LIVE_TYPE_RONG_CLOUD = "rongcloud";
+	//腾讯直播
+	public static final String LIVE_TYPE_TENCENT_CLOUD = "tencent_cloud";
+	//火山直播
+	public static final String LIVE_TYPE_VOLC = "volc";
+	public static String EDIT_TYPE_PAY_PSD = "pay_psd";
+	public static String EDIT_TYPE_LOGIN_PSD = "login_psd";
+	public static String MSG_PAGE = "MSG_PAGE";
+	public static String HOT_TYPE = "HOT_TYPE";
+	public static String USER_PSD_COUNT = "USER_PSD_COUNT";
+	public static String USER_PAY_REMIND = "USER_PAY_REMIND";
+	public static final String UPDATE_GROUP_QUERY = "UPDATE_GROUP_QUERY_";
+	/**
+	 * 优惠劵类型:组团
+	 */
+	public static final String COUPON_TYPE_CARD = "card";
+	/**
+	 * 优惠劵类型:商品
+	 */
+	public static final String COUPON_TYPE_GOODS = "goods";
+	/**
+	 * 活动商品类型:虚拟商品,和sku无关了
+	 */
+	public static final String SKU_TYPE_VIRTUAL_GOODS = "virtual_goods";
+	/**
+	 * 订单类型:组团
+	 */
+	public static final String ORDER_TYPE_GROUP = "group";
+	/**
+	 * 订单类型:商城
+	 */
+	public static final String ORDER_TYPE_SHOP = "shop";
+	/**
+	 * 商品类型:积分
+	 */
+	public static final String SKU_TYPE_POINT = "point";
+	/**
+	 * 商城商品
+	 */
+	public static final String SKU_TYPE_GOODS = COUPON_TYPE_GOODS;
+	/**
+	 * 商品类型:纯金额
+	 */
+	public static final String SKU_TYPE_AMOUNT = "amount";
+	/**
+	 * 商品类型:混合
+	 */
+	public static final String SKU_TYPE_MIX = "mix";
+	/**
+	 * 商品活动类型:优惠劵
+	 */
+	public static final String SKU_ACT_TYPE_COUPON = "coupon";
+	/**
+	 * 人脸识别不提醒白名单
+	 */
+	public static String WHITELIST_FAVE_VERIFY_USER = "WHITELIST_FAVE_VERIFY_USER";
+	/**
+	 * spu库存锁key
+	 */
+	public static String SPU_SOLD_STOCK_LOCK = "SPU_SOLD_STOCK_LOCK";
+	public static String MALL_ORDER_DETAIL_URL = "/pageC/shoppingUser/myOrderDetials?id=";
+
+	public static final List<Integer> refundOrderStatus = Arrays.asList(101, 102, 103, 104, 105, 106, 301, 302);
+	/**
+	 * 商户积分
+	 */
+	public static final String POINT_TYPE_MERCHANT = "merchant";
+	public static final String POINT_NAME_MERCHANT = "商家活动积分";
+	/**
+	 * 商家活动前缀
+	 */
+	public static final String POINT_TYPE_MERCHANT_ACT_PRE = "mer_act";
+	/**
+	 * 平台活动前缀
+	 */
+	public static final String POINT_TYPE_HB_ACT_PRE = "hb_act";
+	public static final String POINT_NAME_HB_ACT = "HS活动积分";
+	/**
+	 * 平台活动前缀,需要订单完结
+	 */
+	public static final String POINT_TYPE_HB_ACT_OVER_PRE = "hb_act_over";
+	/**
+	 * 平台积分
+	 */
+	public static final String POINT_TYPE_COMMON = "common";
+	public static final String POINT_NAME_COMMON = "平台积分";
+	/**
+	 * 商城购物积分
+	 */
+	public static final String POINT_TYPE_GOODS = "goods";
+	public static final String POINT_NAME_GOODS = "商城积分";
+	/**
+	 * 积分消耗
+	 */
+	public static final String POINT_TYPE_COMMON_SUB = "common_sub";
+	/**
+	 * 积分活动
+	 */
+	public static final String POINT_TYPE_COMMON_ACT = "common_act";
+	public static final String POINT_TYPE_COMMON_ACT_SUB = "common_act_sub";
+	/**
+	 * 积分返回
+	 */
+	public static final String POINT_TYPE_COMMON_RETURN = "common_return";
+	/**
+	 * 活动积分-SP
+	 */
+	public static final String POINT_TYPE_ACT_SP = "SP";
+	public static final String POINT_NAME_ACT_SP = "SP积分";
+	/**
+	 * 商城,仅添加记录
+	 */
+	public static final String POINT_TYPE_ADD_RECORD = "record";
+	public static final String POINT_TYPE_ADD_RECORD_NEW = "common_record";
+	/**
+	 * 竞价积分-通用积分
+	 */
+	public static final String AUCTION_ORDER_COMMON_POINT = "auction_common_point";
+	public static final String AUCTION_ORDER_COMMON_AMOUNT = "auction_common_amount";
+	/**
+	 * 鸿运系列积分-lucky_point
+	 */
+	public static final String POINT_TYPE_ACT_LUCKY = "lucky_point";
+	/**
+	 * 用户成长值
+	 */
+	public static final String POINT_TYPE_USER_GROWTH = "user_growth";
+	public static final String POINT_NAME_USER_GROWTH = "会员成长值";
+	/**
+	 * 精美卡片积分类型前缀,后面拼上card_id
+	 */
+	public static final String POINT_TYPE_GIFT_CARD_PRE = "gift_card_";
+	public static final String POINT_NAME_GIFT_CARD = "精美卡片";
+	public static final String INFO_TEAM_PRICE = "info_team_price";
+	public static final String OTHER_STR = "OTHER";
+	public static final String TEAM_SIMPLE_NAME = "team_simple_name";
+	public static final String TEAM_SIMPLE_NAME_NEW = "team_simple_name_new";
+	public static final String INFO_SELECT_TEAM_CACHE = "INFO_SELECT_TEAM_CACHE";
+	public static final String INFO_ONLY_TEAM_CACHE = "INFO_ONLY_TEAM_CACHE_";
+	public static final String POINT_CHANGE_RMB = "point_rmb_rate";
+	//verify_user_act  实名用户活动
+	public static final String POINT_TYPE_VERIFY_USER_ACT = "verify_user_act";
+	//complete_order_act 消费达标活动
+	public static final String POINT_TYPE_COMPLETE_ORDER_ACT = "complete_order_act";
+	//act_task_labubu labubu抽奖活动
+	public static final String POINT_TYPE_ACT_LABUBU = "act_task_";
+
+	/**
+	 * 用户支付类型配置
+	 */
+	public static final String USER_PAY_TYPE_CONFIG = "user_pay_type_config";
+	/**
+	 * 订单随机支付类型配置
+	 */
+	public static final String PAY_TYPE_RANDOM_CONFIG = "pay_type_random_config";
+	/**
+	 * 每日支付金额统计
+	 */
+	public static final String PAY_AMOUNT_DAY_KEY = "pay_amount_day_";
+	/**
+	 * 每日支付次数统计
+	 */
+	public static final String PAY_COUNT_DAY_KEY = "pay_count_day_";
+	public static final String PAY_FAIL_COUNT = "pay_fail_count";
+	public static final String ENFORCE_FAVE_VERIFY_USER = "enforce_fave_verify_user_fail";
+	public static final String ENFORCE_FACE_VERIFY_REMIND = "enforce_face_verify_remind";
+	public static final BigDecimal RMB_ONE_CENT = new BigDecimal("0.01");
+	/**
+	 * 选队转随机
+	 */
+	public static final String INFO_TYPE_TEAM_TO_RANDOM = "team_to_random";
+	public static final String INFO_REAL_SOLD_COUNT = "info_real_sold_count_";
+	public static final String ALIPAY_MAIN_BF = "alipay-main-bf";
+	public static final String WXPAY_MAIN_BF = "wxpay-main-bf";
+
+	public static final String INFO_TEAM_TO_RANDOM_CACHE = "info_team_to_random_cache_";
+	public static final String CHINA = "china";
+	public static final String IP_CACHE = "app_ip_address_cache";
+	public static final String TEAM_CHANGE_RATE = "team_change_rate";
+	public static final String BUY_TEAM_CHANGE_RATE = "buy_team_change_rate";
+	public static final String DEFAULT_PAY_TYPE = "alipay";
+	public static final String ADD = "add";
+	public static final String SUB = "sub";
+	public static final String EVALUATION_LEVEL_MIDDLE = "middle";
+	public static final String EVALUATION_LEVEL_BAD = "bad";
+	public static final String EVALUATION_LEVEL_GOOD = "good";
+	public static final String GUESS_GOODS_CACHE = "guess_goods_cache_";
+	public static final String URL_LIMIT_COUNT = "url_limit_count";
+	//关注
+	public static final String FANS_TYPE_USER_LIKE = "user_like";
+	//用户拉黑
+	public static final String FANS_TYPE_USER_DISLIKE = "user_dislike";
+	//商家拉黑
+	public static final String FANS_TYPE_MERCHANT_DISLIKE = "merchant_dislike";
+	/**
+	 * 拉黑缓存key
+	 */
+	public static final String MERCHANT_DISLIKE_USER = "merchant_dislike_user";
+	public static final String USER_DISLIKE_MERCHANT = "user_dislike_merchant";
+	/**
+	 * 卡种字典表记录id
+	 */
+	public static final String INFO_SETS_RECORD_ID = "info_sets_record_id";
+	/**
+	 * 用户下单分布式key,同一时间仅能提交一种订单
+	 */
+	public static final String GROUP_ORDER_LOCK = "group_order_lock_";
+	/**
+	 * AES秘钥
+	 */
+	public static final String AES_TOKEN_PASSWORD = "C19CF02FC6A2040FC9A16BA5161F2D17";
+	public static final String AES_USER_PASSWORD = "E1C7AE96EFE6CD2CD84861C029C2E80D";
+	/**
+	 * 抢购token
+	 */
+	public static final String AES_TOKEN_CACHE = "AES_TOKEN_CACHE";
+	public static final String ACT_USER_TOKEN_CACHE = "ACT_USER_TOKEN_CACHE";
+	/**
+	 * 卡单用户限制
+	 */
+	public static final String ORDER_LIMIT_USER = "order_limit_user";
+	/**
+	 * 免验证手机号
+	 */
+	public static final List<String> NO_CHECK_PHONE = Arrays.asList("17317287633", "13071005103", "15618709098", "15679535223");
+	/**
+	 * 订单子类型,赠送订单接收
+	 */
+	public static final String ORDER_SUB_TYPE_RECEIVE = "receive";
+	/**
+	 * 订单子类型,奖品订单
+	 */
+	public static final String ORDER_SUB_TYPE_PRIZE = "prize_ship";
+	/**
+	 * 订单子类型,赠送订单:赠送
+	 */
+	public static final String ORDER_SUB_TYPE_GIVE_AWAY = "give_away";
+	public static final String SKU_COUPON_ID_CACHE = "sku_coupon_id_cache";
+	/**
+	 * 秒级别-半小时
+	 */
+	public static final int HALF_AN_HOUR = 1800;
+	/**
+	 * 秒级别-1小时
+	 */
+	public static final int ONE_HOUR = 3600;
+	/**
+	 * 优惠劵使用域
+	 */
+	public static final String COUPON_SCOPE_CONFIG = "coupon_scope_config";
+	public static final String COUPON_SCOPE_CONFIG_CACHE = "coupon_scope_config_cache";
+	/**
+	 * 支付类型
+	 */
+	public static final String PAYMENT_TYPE = "payment_type";
+
+	public static final String DAY = "day";
+	public static final String HOUR = "hour";
+
+	public static final String ACT_PRIZE_CACHE = "act_prize";
+	public static final String ACT_PRIZE_INFO_CACHE = "act_prize_info";
+	public static final String ACT_PRIZE_POOL_CACHE = "act_prize_pool";
+	public static final String ACT_TASK_SHARE_CACHE = "act_task_share_cache:";
+	public static final String DEFAULT_STR = "default";
+	/**
+	 * 发票类型,个人
+	 */
+	public static final String INVOICE_TYPE_PERSON = "person";
+	/**
+	 * 发票类型,企业
+	 */
+	public static final String INVOICE_TYPE_COMPANY = "company";
+	public static final BigDecimal HUNDRED = new BigDecimal("100");
+
+	public static final BigDecimal ONE_THOUSAND = new BigDecimal("1000");
+	/**
+	 * sku库存key
+	 */
+	public static final String SKU_STOCK_PRE = "sku_stock_";
+	public static final String NUM_REG = "^[0-9]+$";
+	/**
+	 * 开屏广告活动key
+	 */
+	public static final String APP_ACT_CACHE = "app_act_cache";
+	/**
+	 * 活动参与类型:积分
+	 */
+	public static final String ACT_SUB_TYPE_POINT = "point";
+	/**
+	 * 活动参与类型:次数
+	 */
+	public static final String ACT_SUB_TYPE_TIMES = "times";
+
+	public static final String COUPON_ACT_MERCHANT = "coupon_act_merchant";
+	/**
+	 * 卡密活动类型:商品
+	 */
+	public static final String GOODS_ACT_TYPE_GOODS = COUPON_TYPE_GOODS;
+	/**
+	 * 卡密活动类型:优惠劵
+	 */
+	public static final String GOODS_ACT_TYPE_COUPON = "coupon";
+	/**卡密活动类型:大转盘*/
+	/**
+	 * 卡密活动类型:大转盘
+	 */
+	public static final String GOODS_ACT_TYPE_TURNTABLE = "turntable";
+
+	public static final String CACHE_CALENDAR_LIST_SEARCH = "cache_calendar_list_search";
+	public static final String EVALUATION_TYPE_LIST_CALENDAR = "checklist_calendar";
+	/**
+	 * 完结组团状态
+	 */
+	public static final List<Integer> GROUP_FULL_STATUS = Arrays.asList(203, 204, 205, 2051, 206, 301);
+
+	/**
+	 * 随买随机分配卡密
+	 */
+	public static final String GROUP_RANDOM_ALL = "random_all";
+	/**
+	 * 选队随机
+	 */
+	public static final String GROUP_RANDOM_SELECT_TEAM = "random_select_team";
+	/**
+	 * 选队,区域随机
+	 */
+	public static final String GROUP_RANDOM_SELECT_CONFERENCE = "random_select_conference";
+	/**
+	 * 选队/区域转随机
+	 */
+	public static final String GROUP_RANDOM_SELECT_TO_RANDOM = "select_to_random";
+	/**
+	 * 买队,无随机
+	 */
+	public static final String GROUP_RANDOM_BUY_TEAM = "random_buy_team";
+	/**
+	 * 组满随机,暂不存在
+	 */
+	public static final String GROUP_RANDOM_FULL_ALL = "random_full_all";
+	/**
+	 * 买队转随机,暂不存在
+	 */
+	public static final String GROUP_RANDOM_BUY_TEAM_ALL = "random_buy_team_all";
+
+	public static final String RESTRICT_USER = "restrict_user"; // 黑名单用户字典type
+	public static final String RESTRICT_USER_CACHE = "restrict_user_cache"; // 黑名单用户信息key
+	public static final String RESTRICT_USER_ADDRESS = "restrict_user_address"; // 黑名单用户地址key
+	/**
+	 * 卡密来源-组队卡密
+	 */
+	public static final String GOODS_REF_TYPE_GROUP = "group";
+	public static final String CODE_TYPE_PRIZE = "prize";
+	/**
+	 * 公布抽奖结果回调url
+	 */
+	public static final String CODE_PUBLIC_CALL_BACK_URL = "http://poyee-app/api/local/public";
+	//不属于金额支付的支付类型
+	public static final List<String> payment_type = Arrays.asList("point", "积分抽奖", "活动赠送");
+
+	public static final String ES_CACHE_CARD_GROUP_INFO = "es_cache_card_group_info";
+
+	public static final String INDEX_NAME = "app_es_group";
+	//顺丰快递
+	public static final String SF_TOKEN = "sf_token";
+	public static final String CONTENT_TYPE_FORM = "application/x-www-form-urlencoded";
+	public static final String CONTENT_TYPE_JSON = "application/json";
+	public static final String express_level_type = "express_level";
+
+	public static final String stop_courier_mer = "stop_courier_mer";
+	/**
+	 * 一天的秒
+	 */
+	public static final Long dayForSecond = 86400L;
+	/**
+	 * 一周的毫秒
+	 */
+	public static final Long WEEK_OF_TIMESTAMP = 86400L * 7000;
+	/**
+	 * 仓管费
+	 */
+	public static final Integer warehouseFee = 0;
+	/**
+	 * 预售开卡订单key
+	 */
+	public static final String ALLOCATE_USER_GOODS_ORDER = "allocate_user_goods_order_";
+	/**
+	 * 会员初始化
+	 */
+	public static final String MEMBER_INIT_KEY = "app_user_member_init";
+
+	public static final String PAY_BOFOO = "bof";
+	public static final String PAY_ADAPAY = "adapay";
+
+	/**
+	 * 组队组齐后发放
+	 */
+	public static final String MERCHANT_ACT_GROUP_FULL = "merchant_act_group_full";
+	/**
+	 * 公示卡密后发放
+	 */
+	public static final String MERCHANT_ACT_PUBLIC_GOODS = "merchant_act_public_goods";
+	/**
+	 * 订单购买后分配
+	 */
+	public static final String MERCHANT_ACT_AFT_ORDER = "merchant_act_aft_order";
+	/**
+	 * 随机:订单购买后分配
+	 */
+	public static final String MERCHANT_ACT_RANDOM_AFT_ORDER = "merchant_act_random_aft_order";
+	/**
+	 * 随机:订单购买后分配
+	 */
+	public static final String MERCHANT_ACT_RANDOM_GROUP_FULL = "merchant_act_random_group_full";
+
+	public static final String payment_type_agreement = "agreement";
+
+	public static final String payment_type_bank = "bank";
+	public static final String payment_type_uac = "uac";
+	public static final String payment_type_alipay = "alipay";
+	/**
+	 * 正常订单
+	 */
+	public static final String order_type_normal = "normal";
+	/**
+	 * 需要退款订单
+	 */
+	public static final String order_type_refund = "refund";
+
+	public static final String lucky_point_2023_618 = "lucky_point_2023_618";
+	/**
+	 * 鸿运系列积分 618 -lucky_point
+	 */
+	public static final String POINT_TYPE_ACT_LUCKY_618 = "lucky_point_2023_618";
+	/**
+	 * hotType时间缓存
+	 */
+	public static final String APP_HOT_TYPE_TIMES_CACHE = "app_hot_type_times_cache";
+	/**
+	 * 昵称黑名单
+	 */
+	public static final String APP_NAME_BACK_LIST_CACHE = "app_name_back_list_cache";
+	/**
+	 * 用户标签:高频
+	 */
+	public static final String APP_USER_CAT_HIGH_FREQUENCY = "high_frequency";
+	public static final String APP_USER_CAT_TYPE_USER_PAY = "user_pay";
+
+	public static final String PHONE_TYPE_IOS = "IOS";
+
+	public static final String LIST_ACT_TYPE_SET = "list_act_all_set";
+	public static final String LIST_ACT_ALL_TEAM = "list_act_all_team";
+	public static final String LIST_ACT_ALL_PLAYER = "list_act_all_player";
+	public static final String LIST_ACT_SELECT_PLAYER = "list_act_select_player";
+	public static final String LIST_ACT_SELECT_TEAM = "list_act_select_team";
+	public static final String LIST_ACT_SELECT_SET = "list_act_select_set";
+	public static final String LIST_ACT_SELECT_NUM = "list_act_select_num";
+	/**
+	 * 球员球队list的key
+	 */
+	public static final String LIST_ACT_OF_PLAYER_TEAM = "list_act_of_set_player_team";
+	/**
+	 * 卡密收集活动类型
+	 */
+	public static final List<String> listActTypes = Arrays.asList("list_act_all_set", "list_act_all_team", "list_act_all_player",
+			"list_act_select_player", "list_act_select_team", "list_act_select_set", "list_act_select_num");
+
+	public static final String MEMBER_BENEFITS = "member_benefits";
+
+	public static final String BRAND_MEMBER_BENEFITS = "brand_member_benefits";
+	/**
+	 * 支付限流
+	 */
+	public static final String PAYMENT_TYPE_LIMIT_KEY = "payment_type_limit_key_";
+
+	public static final String USER_PAY_REMIND_DAY = "app_user_pay_remind_day";
+
+	public static final String USER_PAY_REMIND_MONTH = "app_user_pay_remind_month";
+	/**
+	 * 买退
+	 */
+	public static final String ALLOW_REFUND_SALE = "买退";
+	// 偏远地区
+	public static final String REMOTE_SHIPPING_FEE = "remote_shipping_fee";
+	/**
+	 * 消息类型
+	 */
+	public static final String APP_NOTIFY_TYPE_CONFIG = "app_notify_type_config";
+	/**
+	 * 消息显示大类型
+	 */
+	public static final String APP_NOTIFY_SHOW_CONFIG = "app_notify_show_config";
+	/**
+	 * 消息初始化类型
+	 */
+	public static final String APP_NOTIFY_INIT_CONFIG = "app_notify_init_config";
+
+	public static final String APP_CACHE_USER_NOTIFY_CONFIG = "app_cache_user_notify_config_";
+	/**
+	 * 物流订单号对应支付单号
+	 */
+	public static final String SHIPPING_TRADE_NO_TO_ORDER = "shipping_trade_no_to_order";
+
+	public static final String LIVE_EFFECTS = "live_effects";
+	/**
+	 * 支付编号对应订单
+	 */
+	public static final String PAY_TRADE_NO_TO_ORDER = "pay_trade_no_to_order";
+	/**
+	 * 组队卡密活动:选中卡密
+	 */
+	public static final String GROUP_ACT_TYPE_SELECT = "select";
+	/**
+	 * 组队卡密活动:随机卡密
+	 */
+	public static final String GROUP_ACT_TYPE_RANDOM = "random";
+	/**
+	 * 消费达标活动
+	 */
+	public static final String ACT_TYPE_CONSUME_LEVEL = "consume_level";
+	/**
+	 * 抽卡机活动
+	 */
+	public static final String ACT_TYPE_DRAW_CARD_GAME = "draw_card_game";
+	public static final String ACT_NAME_DRAW_CARD_GAME = "抽卡机活动币";
+	/**
+	 * 抽卡活动类型
+	 */
+	public static final String USER_DRAW_CARD_ACT = "user_draw_card_act";
+
+	public static final String ACT_BASE_SHIPPING_COST_KEY = "act_base_shipping_cost";
+
+	public static final BigDecimal ACT_BASE_SHIPPING_COST = new BigDecimal("9.9");
+
+
+	public static final String ACT_GOODS_TYPE_SET = "set";
+	public static final String ACT_GOODS_TYPE_TEAM = "team";
+	public static final String ACT_GOODS_TYPE_PLAYER = "player";
+	public static final String PART_COUPON = "part_coupon";
+	public static final String COLLECT_PANINI_ACT = "collect_panini_act";
+	//精美卡片key
+	public static final String GROUP_GIFT_CARD = "group_gift_card";
+	//精美卡片订单
+	public static final String ORDER_TYPE_GIFT_CARD = "gift_card";
+
+	public static final String ORDER_TYPE_DRAW = "draw";
+	;
+	//评级保证金
+	public static final String GRADE_EARNEST_AMOUNT = "grade_earnest_amount";
+
+	public static final String GRADE_INSURE_AMOUNT = "grade_insure_amount";
+
+	/**
+	 * 物流订单号对应支付单号
+	 */
+	public static final String GRADE_TRADE_NO_TO_ORDER = "grade_trade_no_to_order";
+	/**
+	 * 支付编号对应支付记录
+	 */
+	public static final String TRADE_NO_TO_PAY_RECORD = "trade_no_to_pay_record";
+	public static final String ANONYMOUS_NAME = "匿名用户";
+	public static final String ANONYMOUS_AVATAR = "https://static.public.hobbystock.cn/MC143302022060920611/avatar/1666182630730.jpg";
+
+	public static final String MERCHANT_POINT_SHOW = "merchant_point_show";
+	public static final String USER_SUB_POINT_LOCK = "user_sub_point_lock";
+	/**
+	 * 拼团赠送红包大转盘key
+	 */
+	public static final String INFO_GIVE_DRAW = "info_give_draw";
+	/**
+	 * 拼团618砍一刀
+	 */
+	public static final String ACT_GROUP_DECR_AMOUNT = "group_decr_amount";
+	public static String GROUP_USER_SHARE_24_618 = "group_user_share_24_618";
+	public static String ACT_CARD_REMOVAL = "act_card_removal";
+	public static String SEND_LIKE_ACT_PRIZE_ORDERS = "send_like_act_prize_orders";
+	public static String ACT_LIMIT_NUM_618 = "act_limit_num_618";
+	public static String email_notice_hzt = "hzt1212520@126.com";
+	/**
+	 * 私域显示
+	 */
+	public static String PRIVATE_SHOW_TYPE = "private_show_type";
+	/**
+	 * 商家赠礼活动
+	 */
+	public static final String MERCHANT_ACT_GIFT = "merchant_act_send_gift";
+
+	public static final String TYPE_SHOP_POINT = "shop_order_point";
+	/**
+	 * 即将售罄查询每个商家个数-key
+	 */
+	public static final String ALMOST_FINISHED_NUM = "almost_finished_num";
+	/**
+	 * 好卡点赞
+	 */
+	public static final String FOLLOW_TOP_CARD_LIKE = "top_card_like";
+	/**
+	 * 首页红包列表
+	 */
+	public static final String FIRST_PAGE_DRAW_ACT = "first_page_draw_act";
+	//用户高频支付限制数量key
+	public static final String USER_PAY_LIMIT = "user_pay_limit";
+	/**
+	 * 用户消费限额提示key
+	 */
+	public static final String USER_LIMIT_PAY_NOTICE_KEY = "user_limit_pay_notice_%s_%s";
+	/**
+	 * 用户消费限额配置
+	 */
+	public static final String USER_LIMIT_PAY_CONFIG = "user_limit_pay_config";
+	/**
+	 * 用户提额问卷
+	 */
+	public static final String TYPE_USER_INCR_AMOUNT = "user_incr_amount";
+	/**
+	 * 用户月度提醒
+	 */
+	public static final String REFUSE_CARD_NOTICE = "refuse_card_notice:";
+	/**
+	 * 商家集团活动积分前缀
+	 */
+	public static final String POINT_TYPE_MERCHANT_GROUP_ACT_PRE = "mer_group_act";
+	/**
+	 * 商品购买资格
+	 */
+	public static final String PRIZE_REDUCTION_BUY_NUM = "reduction_buy_num";
+	public static final String USER_BUY_GROUP_INFO_KEY = "user_buy_group_info_%s_%s";
+	public static final String USER_CONTAINS_CAT_KEY_PRE = "user_cat_key_%s_%s_%s";
+	public static final String APP_CAT_SEARCH_ORDER = "user_search_order";
+	/**
+	 * 拼团活动积分倍率
+	 */
+	public static final String GROUP_ACT_RATE_PRE = "group_act_rate_";
+	/**
+	 * 拼团消费达标积分活动
+	 */
+	public static final String CONSUME_GROUP_ACT_POINT = "consume_group_act_point";
+	/**
+	 * 拼团组齐次数达标
+	 */
+	public static final String CONSUME_GROUP_FULL_COUNT = "consume_group_full_count";
+	/**
+	 * 新版退款模式,异步mq消费
+	 */
+	public static final String ASYNC_REFUND_TYPE = "amount_async";
+	/**
+	 * 退款模式2,仅退款,不更新订单状态
+	 */
+	public static final String REFUND_TYPE_AMOUNT_ONLY = "amount_only";
+	public static final String REFUND_SUB_TYPE_AMOUNT = "amount";
+	public static final String REFUND_SUB_TYPE_POINT = "point";
+	public static final String ACT_GOODS_COMMON_SORT = "act_goods_common_sort";
+
+
+	public static final String LUCK_BAG_ONLINE_REDIS_KEY = "luck_bag_online_redis_key_";
+	public static final String LUCK_BAG_JOIN_REDIS_KEY = "luck_bag_join_redis_key_";
+	public static final String GROUP_FULL_COUNT = "group_full_count";
+	public static final String GROUP_ACT_RATE = "group_act_rate";
+
+	/**
+	 * 生态购商家id
+	 */
+	public static final List<Long> GROUP_SALE_MERCHANT_IDS = Arrays.asList(31L, 1430L);
+	//拼团详情关注类型
+	public static final String GROUP_DETAIL_FOLLOW = "group_detail_follow";
+	//app商家指定权限
+	public static final String APP_MER_PERMISSIONS = "app_mer_permissions";
+	//直播间用户key
+	public static final String LIVING_ROOM_USER_KEY="living_room_user_key:";
+	//商家名下用户订单数量
+	public static final String MERCHANT_USER_ORDER_NUM="merchant_user_order_num:";
+	//用户变动
+	public static final String LIVING_USER_CHANGE_RECORD="living_user_change_record:";
+	/**拼团退款申请*/
+	public static final String REFUND_TYPE_GROUP = "group_refund";
+	/**拼团下架退款申请*/
+	public static final String REFUND_SUB_TYPE_OFF = "refund_off";
+	//订单退款状态
+	public static final List<Integer> REFUND_STATUS_LIST=Arrays.asList(204,205,206);
+	//直播间点赞key
+	public static final String LIVING_ROOM_LIKE_KEY="living_room_like_key:";
+	//直播间点赞人和点赞数key
+	public static final String LIVING_ROOM_LIKE_USER_KEY="living_room_like_user_key:";
+	//直播间点赞通知延时key
+	public static final String LIVING_ROOM_LIKE_DELAY_KEY="living_room_like_delay_key:";
+	//直播间点赞DB延时队列
+	public static final String LIVING_ROOM_LIKE_DB_DELAY_KEY="living_room_like_db_delay_key:";
+	/** 品牌会员积分前缀 **/
+	public static final String BRAND_POINT_TYPE_PRE = "diy_brand_point_";
+	/** 品牌会员成长值前缀 **/
+	public static final String BRAND_GROWTH_TYPE_PRE = "diy_brand_growth_";
+	/** 品牌会员初始化key **/
+	public static final String BRAND_MEMBER_INIT_KEY = "brand_member_init";
+	//精美卡片订单运费记录key
+	public static final String COST_ORDER_RECORD = "cost_order_record";
+	/** 商城首单券 **/
+	public static final String FIRST_ORDER_MERCHANT = "first_order_merchant";
+
+	public static final String APP_SEARCH_CACHE_KEY = "search_api_cache:app_search_cache_key_";
+
+	/** 签到 */
+	public static final String APP_ACT_TASK_TYPE_SIGNIN = "signIn";
+	/** 拼团支付 */
+	public static final String APP_ACT_TASK_TYPE_GROUPPAYMENT = "groupPayment";
+	/** 全平台支付 */
+	public static final String APP_ACT_TASK_TYPE_PAYMENT = "payment";
+	/** 商城商品支付 */
+	public static final String APP_ACT_TASK_TYPE_GOODSPAYMENT = "goodsPayment";
+	/** 拼团完成 */
+	public static final String APP_ACT_TASK_TYPE_GROUPCOMPLETEPAYMENT = "groupCompletePayment";
+	/** 支付完成 */
+	public static final String APP_ACT_TASK_TYPE_PAYCOMPLETEPAYMENT = "payCompletePayment";
+	/** 邀请 */
+	public static final String APP_ACT_TASK_TYPE_INVTATION = "invitation";
+
+
+	//商家邀请码配置的优惠券
+	public static final String DICT_TYPE_INVITE_CODE = "merchant_invite_code";
+
+
+	/**
+	 * 商家发货锁单
+	 */
+	public static final String REDIS_KEY_MERCHANT_DELIVERY_LOCK = "merchant_delivery_lock:";
+
+
+}

+ 175 - 0
micro-common/src/main/java/com/poyee/common/domain/BaseEntity.java

@@ -0,0 +1,175 @@
+package com.poyee.common.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.poyee.common.utils.StringUtils;
+
+import java.io.Serializable;
+import java.util.*;
+
+/**
+ * Entity基类
+ * 
+ * @author zheng
+ */
+public class BaseEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /** 搜索值 */
+    @JsonIgnore
+    private String searchValue;
+    
+    /**
+     * 字段查询
+     */
+    @JsonIgnore
+    private String columnsearch;
+	/** 创建者 */
+    @JsonIgnore
+    private String createBy;
+    /** 创建时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+    /** 更新者 */
+    @JsonIgnore
+    private String updateBy;
+
+    /** 更新时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /** 备注 */
+    private String remark;
+
+    /** 请求参数 */
+    @JsonIgnore
+    private Map<String, Object> params;
+    //分页
+    @JsonIgnore
+    private Integer page;
+    @JsonIgnore
+    private Integer rows;
+    //排序
+    @JsonIgnore
+    private String sidx;
+    @JsonIgnore
+    private String sord;
+    @JsonIgnore
+    public static List<String> types = Arrays.asList(new String[]{ "columnsearch","searchValue","params","page","rows","sidx","sord"});
+
+
+    public Integer getPage() {
+        return page;
+    }
+
+    public void setPage(Integer page) {
+        this.page = page;
+    }
+
+    public Integer getRows() {
+        return rows;
+    }
+
+    public void setRows(Integer rows) {
+        this.rows = rows;
+    }
+
+    public String getSidx() {
+        return sidx;
+    }
+
+    public void setSidx(String sidx) {
+        this.sidx = sidx;
+    }
+
+    public String getSord() {
+        return sord;
+    }
+
+    public void setSord(String sord) {
+        this.sord = sord;
+    }
+
+    public String getSearchValue()
+    {
+        return searchValue;
+    }
+
+    public void setSearchValue(String searchValue)
+    {
+        this.searchValue = searchValue;
+    }
+
+    public String getColumnsearch() {
+        if(StringUtils.isNotEmpty(columnsearch))return this.columnsearch.replaceAll("☻", "%");
+		return columnsearch;
+	}
+
+	public void setColumnsearch(String columnsearch) {
+		this.columnsearch = columnsearch;
+	}
+	
+    public String getCreateBy()
+    {
+        return createBy;
+    }
+
+    public void setCreateBy(String createBy)
+    {
+        this.createBy = createBy;
+    }
+
+    public Date getCreateTime()
+    {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime)
+    {
+        this.createTime = createTime;
+    }
+
+    public String getUpdateBy()
+    {
+        return updateBy;
+    }
+
+    public void setUpdateBy(String updateBy)
+    {
+        this.updateBy = updateBy;
+    }
+
+    public Date getUpdateTime()
+    {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime)
+    {
+        this.updateTime = updateTime;
+    }
+
+    public String getRemark()
+    {
+        return remark;
+    }
+
+    public void setRemark(String remark)
+    {
+        this.remark = remark;
+    }
+
+    public Map<String, Object> getParams()
+    {
+        if (params == null)
+        {
+            params = new HashMap<>();
+        }
+        return params;
+    }
+
+    public void setParams(Map<String, Object> params)
+    {
+        this.params = params;
+    }
+}

+ 88 - 0
micro-common/src/main/java/com/poyee/common/domain/CharsetKit.java

@@ -0,0 +1,88 @@
+package com.poyee.common.domain;
+
+
+import com.poyee.common.utils.StringUtils;
+
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 字符集工具类
+ * 
+ * @author zheng
+ */
+public class CharsetKit
+{
+    /** ISO-8859-1 */
+    public static final String ISO_8859_1 = "ISO-8859-1";
+    /** UTF-8 */
+    public static final String UTF_8 = "UTF-8";
+    /** GBK */
+    public static final String GBK = "GBK";
+
+    /** ISO-8859-1 */
+    public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1);
+    /** UTF-8 */
+    public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8);
+    /** GBK */
+    public static final Charset CHARSET_GBK = Charset.forName(GBK);
+
+    /**
+     * 转换为Charset对象
+     * 
+     * @param charset 字符集,为空则返回默认字符集
+     * @return Charset
+     */
+    public static Charset charset(String charset)
+    {
+        return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset);
+    }
+
+    /**
+     * 转换字符串的字符集编码
+     * 
+     * @param source 字符串
+     * @param srcCharset 源字符集,默认ISO-8859-1
+     * @param destCharset 目标字符集,默认UTF-8
+     * @return 转换后的字符集
+     */
+    public static String convert(String source, String srcCharset, String destCharset)
+    {
+        return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset));
+    }
+
+    /**
+     * 转换字符串的字符集编码
+     * 
+     * @param source 字符串
+     * @param srcCharset 源字符集,默认ISO-8859-1
+     * @param destCharset 目标字符集,默认UTF-8
+     * @return 转换后的字符集
+     */
+    public static String convert(String source, Charset srcCharset, Charset destCharset)
+    {
+        if (null == srcCharset)
+        {
+            srcCharset = StandardCharsets.ISO_8859_1;
+        }
+
+        if (null == destCharset)
+        {
+            srcCharset = StandardCharsets.UTF_8;
+        }
+
+        if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset))
+        {
+            return source;
+        }
+        return new String(source.getBytes(srcCharset), destCharset);
+    }
+
+    /**
+     * @return 系统字符集编码
+     */
+    public static String systemCharset()
+    {
+        return Charset.defaultCharset().name();
+    }
+}

+ 1001 - 0
micro-common/src/main/java/com/poyee/common/domain/Convert.java

@@ -0,0 +1,1001 @@
+package com.poyee.common.domain;
+
+
+import com.poyee.common.utils.StringUtils;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.text.NumberFormat;
+import java.util.Set;
+
+/**
+ * 类型转换器
+ * 
+ * @author zheng
+ */
+public class Convert
+{
+    /**
+     * 转换为字符串<br>
+     * 如果给定的值为null,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static String toStr(Object value, String defaultValue)
+    {
+        if (null == value)
+        {
+            return defaultValue;
+        }
+        if (value instanceof String)
+        {
+            return (String) value;
+        }
+        return value.toString();
+    }
+
+    /**
+     * 转换为字符串<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static String toStr(Object value)
+    {
+        return toStr(value, null);
+    }
+
+    /**
+     * 转换为字符<br>
+     * 如果给定的值为null,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Character toChar(Object value, Character defaultValue)
+    {
+        if (null == value)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Character)
+        {
+            return (Character) value;
+        }
+
+        final String valueStr = toStr(value, null);
+        return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0);
+    }
+
+    /**
+     * 转换为字符<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Character toChar(Object value)
+    {
+        return toChar(value, null);
+    }
+
+    /**
+     * 转换为byte<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Byte toByte(Object value, Byte defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Byte)
+        {
+            return (Byte) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).byteValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Byte.parseByte(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为byte<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Byte toByte(Object value)
+    {
+        return toByte(value, null);
+    }
+
+    /**
+     * 转换为Short<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Short toShort(Object value, Short defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Short)
+        {
+            return (Short) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).shortValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Short.parseShort(valueStr.trim());
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为Short<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Short toShort(Object value)
+    {
+        return toShort(value, null);
+    }
+
+    /**
+     * 转换为Number<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Number toNumber(Object value, Number defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Number)
+        {
+            return (Number) value;
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return NumberFormat.getInstance().parse(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为Number<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Number toNumber(Object value)
+    {
+        return toNumber(value, null);
+    }
+
+    /**
+     * 转换为int<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Integer toInt(Object value, Integer defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Integer)
+        {
+            return (Integer) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).intValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Integer.parseInt(valueStr.trim());
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为int<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Integer toInt(Object value)
+    {
+        return toInt(value, null);
+    }
+
+    /**
+     * 转换为Integer数组<br>
+     * 
+     * @param str 被转换的值
+     * @return 结果
+     */
+    public static Integer[] toIntArray(String str)
+    {
+        return toIntArray(",", str);
+    }
+
+    /**
+     * 转换为Long数组<br>
+     * 
+     * @param str 被转换的值
+     * @return 结果
+     */
+    public static Long[] toLongArray(String str)
+    {
+        return toLongArray(",", str);
+    }
+
+    /**
+     * 转换为Integer数组<br>
+     * 
+     * @param split 分隔符
+     * @param split 被转换的值
+     * @return 结果
+     */
+    public static Integer[] toIntArray(String split, String str)
+    {
+        if (StringUtils.isEmpty(str))
+        {
+            return new Integer[] {};
+        }
+        String[] arr = str.split(split);
+        final Integer[] ints = new Integer[arr.length];
+        for (int i = 0; i < arr.length; i++)
+        {
+            final Integer v = toInt(arr[i], 0);
+            ints[i] = v;
+        }
+        return ints;
+    }
+
+    /**
+     * 转换为Long数组<br>
+     * 
+     * @param split 分隔符
+     * @param str 被转换的值
+     * @return 结果
+     */
+    public static Long[] toLongArray(String split, String str)
+    {
+        if (StringUtils.isEmpty(str))
+        {
+            return new Long[] {};
+        }
+        String[] arr = str.split(split);
+        final Long[] longs = new Long[arr.length];
+        for (int i = 0; i < arr.length; i++)
+        {
+            final Long v = toLong(arr[i], null);
+            longs[i] = v;
+        }
+        return longs;
+    }
+
+    /**
+     * 转换为String数组<br>
+     * 
+     * @param str 被转换的值
+     * @return 结果
+     */
+    public static String[] toStrArray(String str)
+    {
+        return toStrArray(",", str);
+    }
+
+    /**
+     * 转换为String数组<br>
+     * 
+     * @param split 分隔符
+     * @param split 被转换的值
+     * @return 结果
+     */
+    public static String[] toStrArray(String split, String str)
+    {
+        return str.split(split);
+    }
+
+    /**
+     * 转换为long<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Long toLong(Object value, Long defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Long)
+        {
+            return (Long) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).longValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            // 支持科学计数法
+            return new BigDecimal(valueStr.trim()).longValue();
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为long<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Long toLong(Object value)
+    {
+        return toLong(value, null);
+    }
+
+    /**
+     * 转换为double<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Double toDouble(Object value, Double defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Double)
+        {
+            return (Double) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).doubleValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            // 支持科学计数法
+            return new BigDecimal(valueStr.trim()).doubleValue();
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为double<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Double toDouble(Object value)
+    {
+        return toDouble(value, null);
+    }
+
+    /**
+     * 转换为Float<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Float toFloat(Object value, Float defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Float)
+        {
+            return (Float) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).floatValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Float.parseFloat(valueStr.trim());
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为Float<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Float toFloat(Object value)
+    {
+        return toFloat(value, null);
+    }
+
+    /**
+     * 转换为boolean<br>
+     * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Boolean toBool(Object value, Boolean defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Boolean)
+        {
+            return (Boolean) value;
+        }
+        String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        valueStr = valueStr.trim().toLowerCase();
+        switch (valueStr)
+        {
+            case "true":
+                return true;
+            case "false":
+                return false;
+            case "yes":
+                return true;
+            case "ok":
+                return true;
+            case "no":
+                return false;
+            case "1":
+                return true;
+            case "0":
+                return false;
+            default:
+                return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为boolean<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Boolean toBool(Object value)
+    {
+        return toBool(value, null);
+    }
+
+    /**
+     * 转换为Enum对象<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 
+     * @param clazz Enum的Class
+     * @param value 值
+     * @param defaultValue 默认值
+     * @return Enum
+     */
+    public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value, E defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (clazz.isAssignableFrom(value.getClass()))
+        {
+            @SuppressWarnings("unchecked")
+            E myE = (E) value;
+            return myE;
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Enum.valueOf(clazz, valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为Enum对象<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 
+     * @param clazz Enum的Class
+     * @param value 值
+     * @return Enum
+     */
+    public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value)
+    {
+        return toEnum(clazz, value, null);
+    }
+
+    /**
+     * 转换为BigInteger<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static BigInteger toBigInteger(Object value, BigInteger defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof BigInteger)
+        {
+            return (BigInteger) value;
+        }
+        if (value instanceof Long)
+        {
+            return BigInteger.valueOf((Long) value);
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return new BigInteger(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为BigInteger<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static BigInteger toBigInteger(Object value)
+    {
+        return toBigInteger(value, null);
+    }
+
+    /**
+     * 转换为BigDecimal<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof BigDecimal)
+        {
+            return (BigDecimal) value;
+        }
+        if (value instanceof Long)
+        {
+            return new BigDecimal((Long) value);
+        }
+        if (value instanceof Double)
+        {
+            return new BigDecimal((Double) value);
+        }
+        if (value instanceof Integer)
+        {
+            return new BigDecimal((Integer) value);
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return new BigDecimal(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为BigDecimal<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static BigDecimal toBigDecimal(Object value)
+    {
+        return toBigDecimal(value, null);
+    }
+
+    /**
+     * 将对象转为字符串<br>
+     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
+     * 
+     * @param obj 对象
+     * @return 字符串
+     */
+    public static String utf8Str(Object obj)
+    {
+        return str(obj, CharsetKit.CHARSET_UTF_8);
+    }
+
+    /**
+     * 将对象转为字符串<br>
+     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
+     * 
+     * @param obj 对象
+     * @param charsetName 字符集
+     * @return 字符串
+     */
+    public static String str(Object obj, String charsetName)
+    {
+        return str(obj, Charset.forName(charsetName));
+    }
+
+    /**
+     * 将对象转为字符串<br>
+     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
+     * 
+     * @param obj 对象
+     * @param charset 字符集
+     * @return 字符串
+     */
+    public static String str(Object obj, Charset charset)
+    {
+        if (null == obj)
+        {
+            return null;
+        }
+
+        if (obj instanceof String)
+        {
+            return (String) obj;
+        }
+        else if (obj instanceof byte[] || obj instanceof Byte[])
+        {
+            return str((Byte[]) obj, charset);
+        }
+        else if (obj instanceof ByteBuffer)
+        {
+            return str((ByteBuffer) obj, charset);
+        }
+        return obj.toString();
+    }
+
+    /**
+     * 将byte数组转为字符串
+     * 
+     * @param bytes byte数组
+     * @param charset 字符集
+     * @return 字符串
+     */
+    public static String str(byte[] bytes, String charset)
+    {
+        return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset));
+    }
+
+    /**
+     * 解码字节码
+     * 
+     * @param data 字符串
+     * @param charset 字符集,如果此字段为空,则解码的结果取决于平台
+     * @return 解码后的字符串
+     */
+    public static String str(byte[] data, Charset charset)
+    {
+        if (data == null)
+        {
+            return null;
+        }
+
+        if (null == charset)
+        {
+            return new String(data);
+        }
+        return new String(data, charset);
+    }
+
+    /**
+     * 将编码的byteBuffer数据转换为字符串
+     * 
+     * @param data 数据
+     * @param charset 字符集,如果为空使用当前系统字符集
+     * @return 字符串
+     */
+    public static String str(ByteBuffer data, String charset)
+    {
+        if (data == null)
+        {
+            return null;
+        }
+
+        return str(data, Charset.forName(charset));
+    }
+
+    /**
+     * 将编码的byteBuffer数据转换为字符串
+     * 
+     * @param data 数据
+     * @param charset 字符集,如果为空使用当前系统字符集
+     * @return 字符串
+     */
+    public static String str(ByteBuffer data, Charset charset)
+    {
+        if (null == charset)
+        {
+            charset = Charset.defaultCharset();
+        }
+        return charset.decode(data).toString();
+    }
+
+    // ----------------------------------------------------------------------- 全角半角转换
+    /**
+     * 半角转全角
+     * 
+     * @param input String.
+     * @return 全角字符串.
+     */
+    public static String toSBC(String input)
+    {
+        return toSBC(input, null);
+    }
+
+    /**
+     * 半角转全角
+     * 
+     * @param input String
+     * @param notConvertSet 不替换的字符集合
+     * @return 全角字符串.
+     */
+    public static String toSBC(String input, Set<Character> notConvertSet)
+    {
+        char c[] = input.toCharArray();
+        for (int i = 0; i < c.length; i++)
+        {
+            if (null != notConvertSet && notConvertSet.contains(c[i]))
+            {
+                // 跳过不替换的字符
+                continue;
+            }
+
+            if (c[i] == ' ')
+            {
+                c[i] = '\u3000';
+            }
+            else if (c[i] < '\177')
+            {
+                c[i] = (char) (c[i] + 65248);
+
+            }
+        }
+        return new String(c);
+    }
+
+    /**
+     * 全角转半角
+     * 
+     * @param input String.
+     * @return 半角字符串
+     */
+    public static String toDBC(String input)
+    {
+        return toDBC(input, null);
+    }
+
+    /**
+     * 替换全角为半角
+     * 
+     * @param text 文本
+     * @param notConvertSet 不替换的字符集合
+     * @return 替换后的字符
+     */
+    public static String toDBC(String text, Set<Character> notConvertSet)
+    {
+        char c[] = text.toCharArray();
+        for (int i = 0; i < c.length; i++)
+        {
+            if (null != notConvertSet && notConvertSet.contains(c[i]))
+            {
+                // 跳过不替换的字符
+                continue;
+            }
+
+            if (c[i] == '\u3000')
+            {
+                c[i] = ' ';
+            }
+            else if (c[i] > '\uFF00' && c[i] < '\uFF5F')
+            {
+                c[i] = (char) (c[i] - 65248);
+            }
+        }
+        String returnString = new String(c);
+
+        return returnString;
+    }
+
+    /**
+     * 数字金额大写转换 先写个完整的然后将如零拾替换成零
+     * 
+     * @param n 数字
+     * @return 中文大写数字
+     */
+    public static String digitUppercase(double n)
+    {
+        String[] fraction = { "角", "分" };
+        String[] digit = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
+        String[][] unit = { { "元", "万", "亿" }, { "", "拾", "佰", "仟" } };
+
+        String head = n < 0 ? "负" : "";
+        n = Math.abs(n);
+
+        String s = "";
+        for (int i = 0; i < fraction.length; i++)
+        {
+            s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", "");
+        }
+        if (s.length() < 1)
+        {
+            s = "整";
+        }
+        int integerPart = (int) Math.floor(n);
+
+        for (int i = 0; i < unit[0].length && integerPart > 0; i++)
+        {
+            String p = "";
+            for (int j = 0; j < unit[1].length && n > 0; j++)
+            {
+                p = digit[integerPart % 10] + unit[1][j] + p;
+                integerPart = integerPart / 10;
+            }
+            s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s;
+        }
+        return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整");
+    }
+}

+ 92 - 0
micro-common/src/main/java/com/poyee/common/domain/StrFormatter.java

@@ -0,0 +1,92 @@
+package com.poyee.common.domain;
+
+import com.poyee.common.utils.StringUtils;
+
+/**
+ * 字符串格式化
+ * 
+ * @author zheng
+ */
+public class StrFormatter
+{
+    public static final String EMPTY_JSON = "{}";
+    public static final char C_BACKSLASH = '\\';
+    public static final char C_DELIM_START = '{';
+    public static final char C_DELIM_END = '}';
+
+    /**
+     * 格式化字符串<br>
+     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
+     * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
+     * 例:<br>
+     * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
+     * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
+     * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
+     * 
+     * @param strPattern 字符串模板
+     * @param argArray 参数列表
+     * @return 结果
+     */
+    public static String format(final String strPattern, final Object... argArray)
+    {
+        if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray))
+        {
+            return strPattern;
+        }
+        final int strPatternLength = strPattern.length();
+
+        // 初始化定义好的长度以获得更好的性能
+        StringBuilder sbuf = new StringBuilder(strPatternLength + 50);
+
+        int handledPosition = 0;
+        int delimIndex;// 占位符所在位置
+        for (int argIndex = 0; argIndex < argArray.length; argIndex++)
+        {
+            delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition);
+            if (delimIndex == -1)
+            {
+                if (handledPosition == 0)
+                {
+                    return strPattern;
+                }
+                else
+                { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果
+                    sbuf.append(strPattern, handledPosition, strPatternLength);
+                    return sbuf.toString();
+                }
+            }
+            else
+            {
+                if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH)
+                {
+                    if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH)
+                    {
+                        // 转义符之前还有一个转义符,占位符依旧有效
+                        sbuf.append(strPattern, handledPosition, delimIndex - 1);
+                        sbuf.append(Convert.utf8Str(argArray[argIndex]));
+                        handledPosition = delimIndex + 2;
+                    }
+                    else
+                    {
+                        // 占位符被转义
+                        argIndex--;
+                        sbuf.append(strPattern, handledPosition, delimIndex - 1);
+                        sbuf.append(C_DELIM_START);
+                        handledPosition = delimIndex + 1;
+                    }
+                }
+                else
+                {
+                    // 正常占位符
+                    sbuf.append(strPattern, handledPosition, delimIndex);
+                    sbuf.append(Convert.utf8Str(argArray[argIndex]));
+                    handledPosition = delimIndex + 2;
+                }
+            }
+        }
+        // 加入最后一个占位符后所有的字符
+        sbuf.append(strPattern, handledPosition, strPattern.length());
+
+        return sbuf.toString();
+    }
+}

+ 69 - 0
micro-common/src/main/java/com/poyee/common/domain/entity/SysDictData.java

@@ -0,0 +1,69 @@
+package com.poyee.common.domain.entity;
+
+import com.alibaba.fastjson2.JSON;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.poyee.common.domain.BaseEntity;
+import com.poyee.common.dto.DictPropDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 字典数据表 sys_dict_data
+ * 
+ * @author zheng
+ */
+@EqualsAndHashCode(callSuper = true)
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class SysDictData extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 字典编码 */
+    private Long dictCode;
+
+    /** 字典排序 */
+    private Long dictSort;
+
+    /** 字典标签 */
+    private String dictLabel;
+
+    /** 字典键值 */
+    private String dictValue;
+
+    /** 字典类型 */
+    private String dictType;
+
+    /** 样式属性(其他样式扩展) */
+    private String cssClass;
+
+    /** 表格字典样式 */
+    private String listClass;
+
+    /** 是否默认(Y是 N否) */
+    private String isDefault;
+
+    /** 状态(0正常 1停用) */
+    private String status;
+
+    private Integer abroadFlag;
+
+    /** 间隔时间,默认0,不限制,单位秒 */
+    private Integer limitTime;
+    /** 配置json */
+    private String propConfig;
+
+    private DictPropDTO dictProp;
+    //对公转账信息
+    private String paymentBankInfo;
+    //对公转账 验证码
+    private String tradeNo;
+
+    public DictPropDTO getDictProp() {
+        if(StringUtils.isNotEmpty(propConfig)){
+            return JSON.parseObject(propConfig, DictPropDTO.class);
+        }
+        return dictProp;
+    }
+}

+ 47 - 0
micro-common/src/main/java/com/poyee/common/dto/DictPropDTO.java

@@ -0,0 +1,47 @@
+package com.poyee.common.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author by po'yi
+ * @Classname DictPropDTO
+ * @Description TODO
+ * @Date 2023/7/24 11:29
+ */
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class DictPropDTO implements Serializable {
+
+	/**开启时间,0-24小时*/
+	private Integer startTime=0;
+	/**结束时间,0-24小时*/
+	private Integer endTime=24;
+	/**指定组队类型,多个用逗号隔开*/
+	private String infoType;
+
+	private List<String> infoTypeList;
+	/**排除指定组队类型,多个用逗号隔开*/
+	private String unlessType;
+
+	private List<String> unlessTypeList;
+
+	public List<String> getUnlessTypeList() {
+		if(StringUtils.isNotEmpty(unlessType)){
+			return Arrays.asList(unlessType.split(","));
+		}
+		return unlessTypeList;
+	}
+
+	public List<String> getInfoTypeList() {
+		if(StringUtils.isNotEmpty(infoType)){
+			return Arrays.asList(infoType.split(","));
+		}
+		return infoTypeList;
+	}
+}

+ 166 - 0
micro-common/src/main/java/com/poyee/common/dto/InDto.java

@@ -0,0 +1,166 @@
+package com.poyee.common.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.poyee.common.exception.ServiceException;
+import com.poyee.common.utils.bean.DozerUtils;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 接口入参
+ */
+@Data
+@Slf4j
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class InDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+    //appid
+    private String appid;
+    //openid
+    private String openid;
+    //unionid
+    private String unionid;
+    //用户类型: WX_WEB (微信公众号) WX_APPLET (微信小程序) THIRD (第三方) WX_AUTH(微信授权登陆)
+    private String userType;
+    //userid
+    private Integer userId;
+    //账号
+    private String username;
+    //每页数据条数
+    private Integer pageSize =10;
+    //页码数
+    private Integer pageNo=1;
+    //其他数据
+    private Map<String,Object> data;
+    //部门id
+    private Integer departId;
+
+    private Integer offset;
+
+    private long timestamp;
+
+    private String version;
+    // 极光id
+    private String smsRegisterId;
+    //签名
+    private String sign;
+
+    public Object get(String key){
+        if(null != data && !data.isEmpty()){
+            return this.data.get(key);
+        }
+        return null;
+    }
+    public Object getDefault(String key,Object value){
+        if(null != data && !data.isEmpty()){
+            try{
+                return null == this.data.get(key) ? value : this.data.get(key);
+            }catch (Exception e){
+            }
+        }
+        return value;
+    }
+    public String getString(String key){
+        if(null != data && !data.isEmpty()&&this.data.containsKey(key)){
+            return null != this.data.get(key) ? String.valueOf(this.data.get(key)) : null;
+        }
+        return null;
+    }
+
+    public Boolean existKeyString(String key){
+        if(null != data && !data.isEmpty()&&this.data.containsKey(key)){
+            return true;
+        }
+        return false;
+    }
+
+    public Integer getIntegerParam(String key) {
+        if (CollectionUtils.isEmpty(data)) {
+            return null;
+        }
+        return (Integer) this.data.get(key);
+    }
+
+    public boolean getBooleanParam(String key) {
+        if (CollectionUtils.isEmpty(data)) {
+            return false;
+        }
+        Boolean b = (Boolean) this.data.get(key);
+        return b != null && b;
+    }
+
+    public String getStringDefault(String key,String value){
+        if(null != data && !data.isEmpty()){
+            try {
+                String ret = String.valueOf(this.data.get(key));
+                return StringUtils.isEmpty(ret) ? value : ("null".equals(ret) ? value : ret);
+            }catch (Exception e){}
+        }
+        return value;
+    }
+    public Integer getIntegerDefault(String key,Integer value){
+        if(null != data && !data.isEmpty()){
+            try {
+                Integer ret = (Integer) this.data.get(key);
+                return StringUtils.isEmpty(ret) ? value :  ret;
+            }catch (Exception e){
+            }
+        }
+        return value;
+    }
+    public InDto put(String key ,Object value){
+        if(null == this.data) this.data = new HashMap<>();
+        this.data.put(key, value);
+        return this;
+    }
+    public InDto remove(String key){
+        if(null != this.data && !this.data.isEmpty()){
+            this.data.remove(key);
+        }
+        return this;
+    }
+
+    public Integer getPageSize() {
+        if(this.pageSize == null){
+            return pageSize;
+        }
+        return this.pageSize>0? this.pageSize:10;
+    }
+
+    public Integer getPageNo() {
+        if(this.pageNo == null){
+            return pageNo;
+        }
+        return this.pageNo>0? this.pageNo:1;
+    }
+
+    public Integer getOffset(){
+        if(this.pageNo==null||this.pageSize==null){
+            return 0;
+        }
+        return((pageNo) - 1 ) * pageSize;
+    }
+
+    /**
+     * 转换indto中data为指定参数
+     *
+     * @param param
+     * @param <T>
+     * @return
+     */
+    public <T> T buildParam( T param) {
+        try {
+            DozerUtils.copy(this.data,param);
+            return param;
+        } catch (Exception e) {
+            log.error("参数转换失败:", e);
+        }
+        throw new ServiceException(500, "参数获取失败!");
+    }
+}

+ 194 - 0
micro-common/src/main/java/com/poyee/common/dto/OutDTO.java

@@ -0,0 +1,194 @@
+package com.poyee.common.dto;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 输出参数
+ */
+@Data
+@ToString
+public class OutDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private boolean success = true;
+
+    private Integer code = 0;
+
+    private String msg = "成功";
+
+    private Map<String ,Object> data;
+    //时间戳
+    private long timestamp = System.currentTimeMillis();
+    //数据总量
+    private Integer total;
+    //每页条数
+    private Integer pageSize = 10;
+    //页码
+    private Integer pageNo = 1;
+    //总页数
+    private Integer pages;
+    //
+    private String roleCode;
+
+    public OutDTO(){}
+
+    public OutDTO(boolean success, Integer code, String msg){
+        this.success =success;
+        this.code = code;
+        this.msg = msg;
+    }
+
+    /**
+     *
+     * @param pageSize 每页条数
+     * @param pageNo 页码
+     * @param total 总量
+     * @return
+     */
+    public OutDTO setCount(Integer pageSize ,Integer pageNo ,Integer total){
+        this.total = total;
+        this.pageSize = pageSize;
+        this.pageNo = pageNo;
+        if(total % pageSize > 0){
+            this.pages = total / pageSize + 1;
+        }else{
+            this.pages = total / pageSize;
+        }
+        return this;
+    }
+
+    /**
+     * @param inDto
+     * @param total
+     * 设置分页
+     * @return
+     */
+    public OutDTO setCount(InDto inDto,Integer total){
+        this.total = total;
+        this.pageSize = inDto.getPageSize();
+        this.pageNo = inDto.getPageNo();
+        if(total % this.pageSize > 0){
+            this.pages = total / this.pageSize + 1;
+        }else{
+            this.pages = total / this.pageSize;
+        }
+        return this;
+    }
+
+    public OutDTO page(InDto inDto,Integer total , String key, List datas){
+        OutDTO outDTO = this.setCount(inDto, total);
+        if(null != datas && datas.size() > 0 ){
+            if(datas.size() >= inDto.getPageSize() * inDto.getPageNo()){
+                datas = datas.subList(inDto.getPageSize() *(inDto.getPageNo()-1),inDto.getPageSize() *inDto.getPageNo() );
+            }else{
+                datas = datas.subList(inDto.getPageSize() *(inDto.getPageNo()-1),datas.size());
+            }
+        }
+        outDTO.put(key,datas);
+        return outDTO;
+    }
+
+    public OutDTO buildPage(InDto inDto,Integer total , String key, List datas){
+        OutDTO outDTO = this.setCount(inDto, total);
+        outDTO.put(key,datas);
+        return outDTO;
+    }
+
+    /**
+     *
+     * @param key
+     * @param value
+     * @return
+     */
+    public OutDTO put(String key,Object value){
+        if(null == this.data) this.data = new HashMap<>();
+        this.data.put(key,value);
+        return this;
+    }
+
+    /**
+     *
+     * @param key
+     * @param value
+     * @return
+     */
+    public OutDTO putString(String key,String value){
+        if(null == this.data) this.data = new HashMap<>();
+        this.data.put(key,value);
+        return this;
+    }
+
+    /**
+     *
+     * @param key
+     * @return
+     */
+    public Object get(String key){
+        if(null != this.data) return this.data.get(key);
+        return null;
+    }
+
+    /**
+     * get String
+     * @param key
+     * @return
+     */
+    public String getString(String key){
+        if(null != this.data)  return (String) this.data.get(key);
+        return null;
+    }
+
+    public static OutDTO ok(){
+        OutDTO outDTO = new OutDTO();
+        outDTO.put("ok","");
+        return outDTO;
+    }
+
+    public static OutDTO ok(String msg) {
+        return new OutDTO(true,0,msg);
+    }
+
+    public static OutDTO ok(Integer code ,String msg){
+        return new OutDTO(true,code,msg);
+    }
+
+    public static OutDTO ok(Map data) {
+        OutDTO r = new OutDTO();
+        r.setData(data);
+        return r;
+    }
+
+    /**
+     * 失败
+     * @param code
+     * @param msg
+     * @return
+     */
+    public static OutDTO error(Integer code,String msg){
+        return new OutDTO(false,code,msg);
+    }
+
+    /**
+     *
+     * @param message
+     * @return
+     */
+    public static OutDTO error500(String message) {
+        return new OutDTO(false,500,message);
+    }
+
+    /**
+     * 无权限访问返回结果
+     */
+    public static OutDTO noauth(String msg) {
+        return error(510, msg);
+    }
+
+
+
+}

+ 55 - 0
micro-common/src/main/java/com/poyee/common/exception/ServiceException.java

@@ -0,0 +1,55 @@
+package com.poyee.common.exception;
+
+import java.util.Map;
+
+/**
+ * 业务异常
+ * 
+ * @author zheng
+ */
+public class ServiceException extends RuntimeException {
+    private static final long serialVersionUID = 1L;
+
+    protected final String message;
+    protected int code=0;
+    /**特殊异常,抛出需要返回到前端的数据*/
+    protected Map<String, Object> data;
+
+    public ServiceException(String message)
+    {
+        this.code = -1;
+        this.message = message;
+    }
+
+    public ServiceException(int code, String message) {
+        this.message = message;
+        this.code = code;
+    }
+
+    public ServiceException(int code, String message, Map<String, Object> data) {
+        this.message = message;
+        this.code = code;
+        this.data = data;
+    }
+
+    public ServiceException(String message, Throwable e)
+    {
+        super(message, e);
+        this.message = message;
+    }
+
+    @Override
+    public String getMessage()
+    {
+        return message;
+    }
+
+    public int getCode()
+    {
+        return this.code;
+    }
+
+    public Map<String, Object> getData() {
+        return data;
+    }
+}

+ 499 - 0
micro-common/src/main/java/com/poyee/common/utils/StringUtils.java

@@ -0,0 +1,499 @@
+package com.poyee.common.utils;
+
+import com.tzy.common.core.text.StrFormatter;
+
+import java.security.SecureRandom;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Random;
+import java.util.regex.Pattern;
+
+/**
+ * 字符串工具类
+ *
+ * @author zheng
+ */
+public class StringUtils extends org.apache.commons.lang3.StringUtils
+{
+    /** 空字符串 */
+    public static final String NULLSTR = "";
+
+    /** 下划线 */
+    public static final char SEPARATOR = '_';
+
+    public static final String CHINESE_ENGLISH_DIGITS_PATTERN = "[\\p{IsHan}A-Za-z0-9]+";
+    private static final SecureRandom RANDOM = new SecureRandom();
+    /**
+     * 检查传入的内容是否仅包含中文、英文和数字。
+     *
+     * @param content 需要检查的内容。
+     * @return 返回{@code true}如果内容只包含中文、英文和数字,否则返回{@code false}。
+     */
+    public static boolean isValidChineseEnglishOnly(String content) {
+        return content != null && Pattern.compile(CHINESE_ENGLISH_DIGITS_PATTERN).matcher(content).matches();
+    }
+
+    /**
+     * 获取参数不为空值
+     *
+     * @param value defaultValue 要判断的value
+     * @return value 返回值
+     */
+    public static <T> T nvl(T value, T defaultValue)
+    {
+        return value != null ? value : defaultValue;
+    }
+
+    /**
+     * * 判断一个Collection是否为空, 包含List,Set,Queue
+     *
+     * @param coll 要判断的Collection
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Collection<?> coll)
+    {
+        return isNull(coll) || coll.isEmpty();
+    }
+
+    /**
+     * * 判断一个Collection是否非空,包含List,Set,Queue
+     *
+     * @param coll 要判断的Collection
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Collection<?> coll)
+    {
+        return !isEmpty(coll);
+    }
+
+    /**
+     * * 判断一个对象数组是否为空
+     *
+     * @param objects 要判断的对象数组
+     ** @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Object[] objects)
+    {
+        return isNull(objects) || (objects.length == 0);
+    }
+
+    /**
+     * * 判断一个对象数组是否非空
+     *
+     * @param objects 要判断的对象数组
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Object[] objects)
+    {
+        return !isEmpty(objects);
+    }
+
+    /**
+     * * 判断一个Map是否为空
+     *
+     * @param map 要判断的Map
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Map<?, ?> map)
+    {
+        return isNull(map) || map.isEmpty();
+    }
+
+    /**
+     * * 判断一个Map是否为空
+     *
+     * @param map 要判断的Map
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Map<?, ?> map)
+    {
+        return !isEmpty(map);
+    }
+
+    /**
+     * * 判断一个字符串是否为空串
+     *
+     * @param str String
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(String str)
+    {
+        return isNull(str) || NULLSTR.equals(str.trim());
+    }
+
+    /**
+     * * 判断一个字符串是否为非空串
+     *
+     * @param str String
+     * @return true:非空串 false:空串
+     */
+    public static boolean isNotEmpty(String str)
+    {
+        return !isEmpty(str);
+    }
+
+    /**
+     * * 判断一个对象是否为空
+     *
+     * @param object Object
+     * @return true:为空 false:非空
+     */
+    public static boolean isNull(Object object)
+    {
+        return object == null;
+    }
+
+    /**
+     * * 判断一个对象是否非空
+     *
+     * @param object Object
+     * @return true:非空 false:空
+     */
+    public static boolean isNotNull(Object object)
+    {
+        return !isNull(object);
+    }
+
+    /**
+     * * 判断一个对象是否是数组类型(Java基本型别的数组)
+     *
+     * @param object 对象
+     * @return true:是数组 false:不是数组
+     */
+    public static boolean isArray(Object object)
+    {
+        return isNotNull(object) && object.getClass().isArray();
+    }
+
+    /**
+     * 去空格
+     */
+    public static String trim(String str)
+    {
+        return (str == null ? "" : str.trim());
+    }
+
+    /**
+     * 截取字符串
+     *
+     * @param str 字符串
+     * @param start 开始
+     * @return 结果
+     */
+    public static String substring(final String str, int start)
+    {
+        if (str == null)
+        {
+            return NULLSTR;
+        }
+
+        if (start < 0)
+        {
+            start = str.length() + start;
+        }
+
+        if (start < 0)
+        {
+            start = 0;
+        }
+        if (start > str.length())
+        {
+            return NULLSTR;
+        }
+
+        return str.substring(start);
+    }
+
+    /**
+     * 截取字符串
+     *
+     * @param str 字符串
+     * @param start 开始
+     * @param end 结束
+     * @return 结果
+     */
+    public static String substring(final String str, int start, int end)
+    {
+        if (str == null)
+        {
+            return NULLSTR;
+        }
+
+        if (end < 0)
+        {
+            end = str.length() + end;
+        }
+        if (start < 0)
+        {
+            start = str.length() + start;
+        }
+
+        if (end > str.length())
+        {
+            end = str.length();
+        }
+
+        if (start > end)
+        {
+            return NULLSTR;
+        }
+
+        if (start < 0)
+        {
+            start = 0;
+        }
+        if (end < 0)
+        {
+            end = 0;
+        }
+
+        return str.substring(start, end);
+    }
+
+    /**
+     * 格式化文本, {} 表示占位符<br>
+     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
+     * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
+     * 例:<br>
+     * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
+     * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
+     * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
+     *
+     * @param template 文本模板,被替换的部分用 {} 表示
+     * @param params 参数值
+     * @return 格式化后的文本
+     */
+    public static String format(String template, Object... params)
+    {
+        if (isEmpty(params) || isEmpty(template))
+        {
+            return template;
+        }
+        return StrFormatter.format(template, params);
+    }
+
+    /**
+     * 下划线转驼峰命名
+     */
+    public static String toUnderScoreCase(String str)
+    {
+        if (str == null)
+        {
+            return null;
+        }
+        StringBuilder sb = new StringBuilder();
+        // 前置字符是否大写
+        boolean preCharIsUpperCase = true;
+        // 当前字符是否大写
+        boolean curreCharIsUpperCase = true;
+        // 下一字符是否大写
+        boolean nexteCharIsUpperCase = true;
+        for (int i = 0; i < str.length(); i++)
+        {
+            char c = str.charAt(i);
+            if (i > 0)
+            {
+                preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1));
+            }
+            else
+            {
+                preCharIsUpperCase = false;
+            }
+
+            curreCharIsUpperCase = Character.isUpperCase(c);
+
+            if (i < (str.length() - 1))
+            {
+                nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1));
+            }
+
+            if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase)
+            {
+                sb.append(SEPARATOR);
+            }
+            else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase)
+            {
+                sb.append(SEPARATOR);
+            }
+            sb.append(Character.toLowerCase(c));
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 是否包含字符串
+     *
+     * @param str 验证字符串
+     * @param strs 字符串组
+     * @return 包含返回true
+     */
+    public static boolean inStringIgnoreCase(String str, String... strs)
+    {
+        if (str != null && strs != null)
+        {
+            for (String s : strs)
+            {
+                if (str.equalsIgnoreCase(trim(s)))
+                {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld
+     *
+     * @param name 转换前的下划线大写方式命名的字符串
+     * @return 转换后的驼峰式命名的字符串
+     */
+    public static String convertToCamelCase(String name)
+    {
+        StringBuilder result = new StringBuilder();
+        // 快速检查
+        if (name == null || name.isEmpty())
+        {
+            // 没必要转换
+            return "";
+        }
+        else if (!name.contains("_"))
+        {
+            // 不含下划线,仅将首字母大写
+            return name.substring(0, 1).toUpperCase() + name.substring(1);
+        }
+        // 用下划线将原始字符串分割
+        String[] camels = name.split("_");
+        for (String camel : camels)
+        {
+            // 跳过原始字符串中开头、结尾的下换线或双重下划线
+            if (camel.isEmpty())
+            {
+                continue;
+            }
+            // 首字母大写
+            result.append(camel.substring(0, 1).toUpperCase());
+            result.append(camel.substring(1).toLowerCase());
+        }
+        return result.toString();
+    }
+
+    /**
+     * 驼峰式命名法
+     * 例如:user_name->userName
+     */
+    public static String toCamelCase(String s)
+    {
+        if (s == null)
+        {
+            return null;
+        }
+        if (s.indexOf(SEPARATOR) == -1)
+        {
+            return s;
+        }
+        s = s.toLowerCase();
+        StringBuilder sb = new StringBuilder(s.length());
+        boolean upperCase = false;
+        for (int i = 0; i < s.length(); i++)
+        {
+            char c = s.charAt(i);
+
+            if (c == SEPARATOR)
+            {
+                upperCase = true;
+            }
+            else if (upperCase)
+            {
+                sb.append(Character.toUpperCase(c));
+                upperCase = false;
+            }
+            else
+            {
+                sb.append(c);
+            }
+        }
+        return sb.toString();
+    }
+
+    @SuppressWarnings("unchecked")
+    public static <T> T cast(Object obj)
+    {
+        return (T) obj;
+    }
+
+
+    //public static void main(String[] args) {
+    //    boolean result= Pattern.compile(Constants.NUM_REG).matcher("12333").find();
+    //    System.out.println(result);
+    //}
+
+    /**
+     * 姓名脱敏
+     * @param name 姓名
+     * @param len 从第几个开始脱敏
+     * @return
+     */
+    public static String nameDesensitization(String name, int len){
+        if(StringUtils.isEmpty(name)) {
+            return name;
+        }
+        String prefix = name.substring(0, len);
+
+        return prefix + "***";
+    }
+
+    public static String desenstiseStr(String params,int atLength){
+        if(StringUtils.isEmpty(params)){
+            return null;
+        }
+        params = params.replaceAll("\\*", "0");
+        int strLength = params.length();
+        if(strLength <= atLength){
+            return params;
+        }
+        int i = strLength - atLength;
+        char[] chars = new char[i];
+        return params.replaceAll("\\w*(\\w{"+atLength+"})",new String(chars).replace(chars[0], '*')+"$1");
+    }
+    public static String generateRandomStr() {
+        String CHARACTERS =
+                "23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnopqrstuvwxyz";
+        StringBuilder sb = new StringBuilder(6);
+        for (int i = 0; i < 6; i++) {
+            int index = RANDOM.nextInt(CHARACTERS.length());
+            sb.append(CHARACTERS.charAt(index));
+        }
+        return sb.toString();
+    }
+    public static String desensitizeName(String name) {
+        // 如果姓名为空或长度小于4,不处理
+        if (name == null || name.length() < 4) {
+            return name;
+        }
+
+        int length = name.length();
+
+        if (length == 4) {
+            // 姓名正好是4个字,返回前两个字 + "***" + 后两个字
+            return name.substring(0, 2) + "***" + name.substring(2);
+        } else {
+            // 否则,返回前两个字 + "***" + 最后两个字
+            return name.substring(0, 2) + "***" + name.substring(length - 2);
+        }
+    }
+    /**
+     * 获取长度为 N 的随机字母+数字
+     * @return 随机数字
+     */
+    public static String getRandomNumber(int len) {
+        final String SYMBOLS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; // 数字和26个字母组成
+        final Random RANDOM = new SecureRandom();
+        char[] nonceChars = new char[len];  //指定长度为N位/自己可以要求设置
+
+        for (int index = 0; index < nonceChars.length; ++index) {
+            nonceChars[index] = SYMBOLS.charAt(RANDOM.nextInt(SYMBOLS.length()));
+        }
+        return new String(nonceChars);
+    }
+}

+ 67 - 0
micro-common/src/main/java/com/poyee/common/utils/bean/DozerUtils.java

@@ -0,0 +1,67 @@
+package com.poyee.common.utils.bean;
+
+import com.github.dozermapper.core.DozerBeanMapperBuilder;
+import com.github.dozermapper.core.Mapper;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+public class DozerUtils {
+
+    /**
+     * commonMapper,如果没有传mapper过来,默认使用这个
+     * dozer/dozer-mapping.xml 是相对resources目录的路径
+     */
+    public static Mapper  mapper = DozerBeanMapperBuilder.create()
+            .withMappingFiles("dozer/dozer-mapping.xml")
+            .build();
+
+    /**
+     * 单个对象转换
+     * 传入需要转换的对象,返回转换后的对象
+     * 用法:CommonDozerUtil.map(dto,Destination.class)
+     *
+     * @param source           源对象
+     * @param destinationClass
+     * @param <T>
+     * @return
+     */
+    public static <T> T map(Object source, Class<T> destinationClass) {
+        if (source != null) {
+            return mapper.map(source, destinationClass);
+        }
+        return null;
+    }
+
+    /**
+     * list转换
+     * 用法:CommonDozerUtil.mapList(list,Destination.class)
+     *
+     * @param sourceList
+     * @param destinationClass
+     * @param <T>
+     * @return
+     */
+    public static <T> List<T> mapList(Collection<?> sourceList, Class<T> destinationClass) {
+        List<T> destinationList = new ArrayList<>();
+        if (sourceList != null && sourceList.size() > 0) {
+            for (Object sourceObject : sourceList) {
+                T destinationObject = map(sourceObject, destinationClass);
+                destinationList.add(destinationObject);
+            }
+        }
+        return destinationList;
+    }
+
+    /**
+     * 将对象A的值拷贝到对象B中
+     *
+     * @param source            对象A
+     * @param destinationObject 对象B
+     */
+    public static void copy(Object source, Object destinationObject) {
+        mapper.map(source, destinationObject);
+    }
+
+}

+ 31 - 0
micro-dao/pom.xml

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.poyee</groupId>
+        <artifactId>poyee-micro</artifactId>
+        <version>1.0.0</version>
+    </parent>
+
+    <artifactId>micro-dao</artifactId>
+    <version>1.0.0</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.poyee</groupId>
+            <artifactId>micro-common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 21 - 0
micro-dao/src/main/java/com/poyee/dao/mapper/SysDictDataMapper.java

@@ -0,0 +1,21 @@
+package com.poyee.dao.mapper;
+
+import com.poyee.common.domain.entity.SysDictData;
+
+import java.util.List;
+
+/**
+ * 字典表 数据层
+ *
+ * @author zheng
+ */
+public interface SysDictDataMapper {
+
+    /**
+     * 根据字典类型查询字典数据
+     *
+     * @param dictType 字典类型
+     * @return 字典数据集合信息
+     */
+    public List<SysDictData> selectDictDataByType(String dictType);
+}

+ 43 - 0
micro-dao/src/main/resources/SysDictDataMapper.xml

@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.poyee.common.domain.entity.SysDictData">
+	
+	<resultMap type="SysDictData" id="SysDictDataResult">
+		<id     property="dictCode"   column="dict_code"   />
+		<result property="dictSort"   column="dict_sort"   />
+		<result property="dictLabel"  column="dict_label"  />
+		<result property="dictValue"  column="dict_value"  />
+		<result property="dictType"   column="dict_type"   />
+		<result property="cssClass"   column="css_class"   />
+		<result property="listClass"  column="list_class"  />
+		<result property="isDefault"  column="is_default"  />
+		<result property="status"     column="status"      />
+		<result property="remark"     column="remark"      />
+		<result property="createBy"   column="create_by"   />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy"   column="update_by"   />
+		<result property="updateTime" column="update_time" />
+		<result property="abroadFlag" column="abroad_flag" />
+		<result property="limitTime" column="limit_time" />
+		<result property="propConfig" column="prop_config" />
+	</resultMap>
+	
+	<sql id="selectDictDataVo">
+        select dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status,
+		remark,abroad_flag,limit_time,prop_config
+		from sys_dict_data
+    </sql>
+
+	<select id="selectDictDataList" parameterType="SysDictData" resultMap="SysDictDataResult">
+	    <include refid="selectDictDataVo"/>
+		<where>
+		    <if test="dictType != null and dictType != ''">
+				AND dict_type = #{dictType}
+			</if>
+		</where>
+		order by dict_sort
+	</select>
+
+</mapper>

+ 27 - 0
micro-manager/pom.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.poyee</groupId>
+        <artifactId>poyee-micro</artifactId>
+        <version>1.0.0</version>
+    </parent>
+
+    <artifactId>micro-manager</artifactId>
+    <version>1.0.0</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.poyee</groupId>
+            <artifactId>micro-common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.poyee</groupId>
+            <artifactId>micro-dao</artifactId>
+        </dependency>
+
+    </dependencies>
+
+</project>

+ 14 - 0
micro-manager/src/main/java/com/poyee/manager/cache/DictCache.java

@@ -0,0 +1,14 @@
+package com.poyee.manager.cache;
+
+import com.poyee.common.domain.entity.SysDictData;
+
+import java.util.List;
+
+/**
+ * 字典缓存
+ * @author zhenhua.bian
+ * @date 2025/10/23
+ */
+public interface DictCache {
+    List<SysDictData> getDict(String type);
+}

+ 22 - 0
micro-manager/src/main/java/com/poyee/manager/impl/DictCacheImpl.java

@@ -0,0 +1,22 @@
+package com.poyee.manager.impl;
+
+import com.poyee.common.domain.entity.SysDictData;
+import com.poyee.dao.mapper.SysDictDataMapper;
+import com.poyee.manager.cache.DictCache;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@Component
+public class DictCacheImpl implements DictCache {
+    @Resource
+    private SysDictDataMapper sysDictDataMapper;
+    @Override
+    @Cacheable(cacheNames = "DICT_DATA_CACHE_KEY#600", key = "#dictType", unless = "#result == null")
+    public List<SysDictData> getDict(@NotNull String type) {
+        return sysDictDataMapper.selectDictDataByType(type);
+    }
+}

+ 30 - 0
micro-service/pom.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.poyee</groupId>
+        <artifactId>poyee-micro</artifactId>
+        <version>1.0.0</version>
+    </parent>
+
+    <artifactId>micro-service</artifactId>
+    <version>1.0.0</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.poyee</groupId>
+            <artifactId>micro-manager</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 21 - 0
micro-service/src/main/java/com/poyee/service/DictService.java

@@ -0,0 +1,21 @@
+package com.poyee.service;
+
+import com.poyee.common.domain.entity.SysDictData;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 词表读取
+ * @author: zhenhua.bian
+ * @date: 2025/10/26
+ */
+public interface DictService {
+    /**
+     * 根据类型集合和状态读取
+     * @param types
+     * @param status
+     * @return
+     */
+    HashMap<String, List<SysDictData>> getDict(List<String> types, String status);
+}

+ 45 - 0
micro-service/src/main/java/com/poyee/service/impl/DictServiceImpl.java

@@ -0,0 +1,45 @@
+package com.poyee.service.impl;
+
+import com.alibaba.fastjson2.JSON;
+import com.poyee.common.constant.Constants;
+import com.poyee.common.domain.entity.SysDictData;
+import com.poyee.manager.cache.DictCache;
+import com.poyee.service.DictService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class DictServiceImpl implements DictService {
+    @Resource
+    private DictCache dictCache;
+    @Override
+    public HashMap<String, List<SysDictData>> getDict(List<String> types, String status) {
+        String sqlStatus;
+        if (StringUtils.isEmpty(status)) {
+            sqlStatus = Constants.STATUS_OK;
+        } else if (Constants.All.equals( status)) {
+            sqlStatus = null;
+        } else {
+            sqlStatus = status;
+        }
+        HashMap<String, List<SysDictData>> dictDataMap = new HashMap<>();
+        for (String type : types) {
+            List<SysDictData> dictDataList = dictCache.getDict(type);
+            List<SysDictData> collect = dictDataList.stream().filter(dictData ->
+                            StringUtils.equals(dictData.getStatus(), sqlStatus)).
+                    collect(Collectors.toList());
+            dictDataMap.put(type, collect);
+        }
+        if (log.isDebugEnabled()) {
+            log.debug("dict result {},{}, {}", JSON.toJSONString(types), sqlStatus, JSON.toJSONString(dictDataMap));
+        }
+        return dictDataMap;
+    }
+}

+ 121 - 0
pom.xml

@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>com.poyee</groupId>
+	<artifactId>poyee-micro</artifactId>
+	<version>1.0.0</version>
+    <packaging>pom</packaging>
+    <name>poyee-micro</name>
+
+    <modules>
+        <module>micro-common</module>
+        <module>micro-dao</module>
+        <module>micro-manager</module>
+        <module>micro-service</module>
+        <module>web-controller</module>
+    </modules>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <mahout.version>0.9</mahout.version>
+        <dozer.version>6.5.2</dozer.version>
+        <bee.version>1.17</bee.version>
+        <log.version>1.2.17</log.version>
+        <lombok.version>1.18.34</lombok.version>
+        <fastjson.version>2.0.10</fastjson.version>
+    </properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-web</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+			<scope>test</scope>
+		</dependency>
+    </dependencies>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>2.2.5.RELEASE</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>com.poyee</groupId>
+                <artifactId>micro-common</artifactId>
+                <version>1.0.0</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.poyee</groupId>
+                <artifactId>micro-dao</artifactId>
+                <version>1.0.0</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.poyee</groupId>
+                <artifactId>micro-manager</artifactId>
+                <version>1.0.0</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.poyee</groupId>
+                <artifactId>micro-service</artifactId>
+                <version>1.0.0</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.poyee</groupId>
+                <artifactId>web-controller</artifactId>
+                <version>1.0.0</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.projectlombok</groupId>
+                <artifactId>lombok</artifactId>
+                <version>${lombok.version}</version>
+                <scope>provided</scope>
+            </dependency>
+
+            <dependency>
+                <groupId>com.github.dozermapper</groupId>
+                <artifactId>dozer-core</artifactId>
+                <version>${dozer.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>log4j</groupId>
+                <artifactId>log4j</artifactId>
+                <version>${log.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>fastjson</artifactId>
+                <version>${fastjson.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <mainClass>com.poyee.controller.DictApplication</mainClass>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+
+</project>

+ 21 - 0
web-controller/pom.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>com.poyee</groupId>
+		<artifactId>poyee-micro</artifactId>
+        <version>1.0.0</version>
+	</parent>
+
+	<artifactId>web-controller</artifactId>
+	<version>1.0.0</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.poyee</groupId>
+            <artifactId>micro-service</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 14 - 0
web-controller/src/main/java/com/poyee/SvrApplication.java

@@ -0,0 +1,14 @@
+package com.poyee;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication(scanBasePackages = {"com.poyee"})
+public class SvrApplication {
+    public static void main(String[] args) {
+        System.out.println("SvrApplication start...");
+        SpringApplication.run(SvrApplication.class, args);
+        System.out.println("SvrApplication end...");
+    }
+}
+

+ 45 - 0
web-controller/src/main/java/com/poyee/controller/AppCommonController.java

@@ -0,0 +1,45 @@
+package com.poyee.controller;
+
+
+import com.poyee.common.domain.entity.SysDictData;
+import com.poyee.common.dto.InDto;
+import com.poyee.common.dto.OutDTO;
+import com.poyee.service.DictService;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 抽取APP部分接口
+ * @author: zhenhua.bian
+ * @date: 2025/10/26
+ */
+
+@RestController
+@RequestMapping("/api/micro")
+public class AppCommonController {
+    @Resource
+    private DictService dictService;
+
+    @RequestMapping("/getDict")
+    public OutDTO getDict(@RequestBody InDto inDto) {
+        try {
+            String type = inDto.getString("type");
+            if (StringUtils.isEmpty(type)) {
+                return OutDTO.error500("参数错误");
+            }
+            //支持逗号分隔
+            List<String> types = Arrays.asList(type.split(","));
+            HashMap<String, List<SysDictData>> dictDataMap = dictService.getDict(types, inDto.getString("status"));
+            return OutDTO.ok().put("typeData", dictDataMap);
+        } catch (Exception e) {
+            return OutDTO.error500("系统异常");
+        }
+    }
+}

+ 54 - 0
web-controller/src/main/resources/application-druid.yml

@@ -0,0 +1,54 @@
+# 数据源配置
+spring:
+    datasource:
+        type: com.alibaba.druid.pool.DruidDataSource
+        driverClassName: org.postgresql.Driver
+        druid:
+            # 主库数据源
+            master:
+                username: postgres
+                password: 123456
+                url: jdbc:postgresql://192.168.50.10:5432/tzy_system
+            # 初始连接数
+            initialSize: 5
+            # 最小连接池数量
+            minIdle: 10
+            # 最大连接池数量
+            maxActive: 20
+            # 配置获取连接等待超时的时间
+            maxWait: 60000
+            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+            timeBetweenEvictionRunsMillis: 60000
+            # 配置一个连接在池中最小生存的时间,单位是毫秒
+            minEvictableIdleTimeMillis: 300000
+            # 配置一个连接在池中最大生存的时间,单位是毫秒
+            maxEvictableIdleTimeMillis: 900000
+            # 配置检测连接是否有效
+            validationQuery: SELECT 1
+            # 检测连接超时时间(ms)
+            validationQueryTimeout: 200
+            testWhileIdle: true
+            testOnBorrow: false
+            testOnReturn: false
+            removeAbandoned: false
+            logAbandoned: false
+            webStatFilter:
+                enabled: false
+            statViewServlet:
+                enabled: true
+                # 设置白名单,不填则允许所有访问
+                allow:
+                url-pattern: /druid/*
+                # 控制台管理用户名和密码
+                login-username:
+                login-password:
+            filter:
+                stat:
+                    enabled: true
+                    # 慢SQL记录
+                    log-slow-sql: true
+                    slow-sql-millis: 1000
+                    merge-sql: true
+                wall:
+                    config:
+                        multi-statement-allow: true

+ 75 - 0
web-controller/src/main/resources/application-prod.yml

@@ -0,0 +1,75 @@
+
+# 开发环境配置
+server:
+  # 服务器的HTTP端口,默认为80
+  port: 80
+  tomcat:
+    # tomcat的URI编码
+    uri-encoding: UTF-8
+    # tomcat最大线程数,默认为200
+    max-threads: 800
+    # Tomcat启动初始化的线程数,默认值25
+    min-spare-threads: 30
+    #超时时间
+    connection-timeout: 600000
+    basedir: /tmp/logs
+    accesslog:
+      enabled: true
+      buffered: true
+      prefix: access_log
+      file-date-format: .yyyy-MM-dd
+
+
+# 日志配置
+logging:
+  console.enabled: ${CONSOLE_ENABLED:true}
+  file.enabled: ${FILE_ENABLED:false}
+  level:
+    com.tzy: info
+    org.springframework: warn
+  fluentd:
+    enabled: ${FLUENTD_ENABLED:false}
+    host: ${FLUENTD_HOST:127.0.0.1}
+    port: ${FLUENTD_PORT:24225}
+
+# Spring配置
+spring:
+  jackson:
+    time-zone: GMT+8
+    date-format: yyyy-MM-dd HH:mm:ss
+  profiles:
+    active: druid
+  # 文件上传
+  servlet:
+    multipart:
+      # 单个文件大小
+      max-file-size:  50MB
+      # 设置总上传的文件大小
+      max-request-size:  50MB
+  # 服务模块
+  devtools:
+    restart:
+      # 热部署开关
+      enabled: true
+  redis:
+    database: 1
+    host: ${REDIS_HOST:172.29.19.234}
+    #host: hobbystock.cn
+    port: ${REDIS_PORT:6379}
+    password: #Pass2021    # 密码(默认为空)
+    timeout: 60000  # 连接超时时长(毫秒)
+    pool:
+      max-active: 1000  # 连接池最大连接数(使用负值表示没有限制)
+      max-wait: -1ms    # 连接池最大阻塞等待时间(使用负值表示没有限制)
+      max-idle: 10      # 连接池中的最大空闲连接
+      min-idle: 5       # 连接池中的最小空闲连接
+
+# MyBatis
+mybatis:
+  # 搜索指定包别名
+  typeAliasesPackage: com.tzy.**.domain
+  # 配置mapper的扫描,找到所有的mapper.xml映射文件
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 加载全局的配置文件
+  configLocation: classpath:mybatis/mybatis-config.xml
+

+ 152 - 0
web-controller/src/main/resources/application.yml

@@ -0,0 +1,152 @@
+
+# 开发环境配置
+server:
+  # 服务器的HTTP端口,默认为80
+  port: 8082
+  tomcat:
+    # tomcat的URI编码
+    uri-encoding: UTF-8
+    # tomcat最大线程数,默认为200
+    max-threads: 800
+    # Tomcat启动初始化的线程数,默认值25
+    min-spare-threads: 30
+    #超时时间
+    connection-timeout: 600000
+    basedir: c://tmp/logs
+    accesslog:
+      enabled: true
+      buffered: true
+      prefix: access_log
+      file-date-format: .yyyy-MM-dd
+
+
+# 日志配置
+logging:
+  console.enabled: ${CONSOLE_ENABLED:true}
+  file.enabled: ${FILE_ENABLED:false}
+  level:
+    com.tzy: debug
+    org.teasoft: debug
+    org.springframework: warn
+    feign:
+      client:
+        config:
+          default: info
+  fluentd:
+    enabled: ${FLUENTD_ENABLED:false}
+    host: ${FLUENTD_HOST:127.0.0.1}
+    port: ${FLUENTD_PORT:24225}
+  audit:
+    enabled: ${AUDIT_ENABLED:false}
+    host: ${AUDIT_HOST:192.168.1.51}
+    port: ${AUDIT_PORT:24225}
+  bee:
+    enabled: true
+
+# Spring配置
+spring:
+  application:
+    name: app-micro
+  jackson:
+    time-zone: GMT+8
+    date-format: yyyy-MM-dd HH:mm:ss
+  profiles:
+    active: druid
+  # 文件上传
+  servlet:
+    multipart:
+      # 单个文件大小
+      max-file-size:  50MB
+      # 设置总上传的文件大小
+      max-request-size:  50MB
+  # 服务模块
+  devtools:
+    restart:
+      # 热部署开关
+      enabled: false
+  redis:
+    database: 1
+    host: 192.168.50.8
+    #host: hobbystock.cn
+    port: 6379
+    password: Pass2010    # 密码(默认为空)
+    timeout: 60000  # 连接超时时长(毫秒)
+    pool:
+      max-active: 100  # 连接池最大连接数(使用负值表示没有限制)
+      max-wait: -1ms    # 连接池最大阻塞等待时间(使用负值表示没有限制)
+      max-idle: 10      # 连接池中的最大空闲连接
+      min-idle: 5       # 连接池中的最小空闲连接
+
+# MyBatis
+mybatis:
+  # 搜索指定包别名
+  typeAliasesPackage: com.tzy.**.domain
+  # 配置mapper的扫描,找到所有的mapper.xml映射文件
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 加载全局的配置文件
+  configLocation: classpath:mybatis/mybatis-config.xml
+
+# PageHelper分页插件
+pagehelper:
+  helperDialect: postgresql
+  reasonable: false
+  supportMethodsArguments: true
+  params: count=countSql
+
+
+authenticate:
+  url: https://coresvc-dev.hobbystocks.cn/api/auth/
+#服务前缀路径
+coreService:
+  baseurl: https://coresvc-dev.hobbystocks.cn
+  smsUrl: /api/reminder/live/on
+  appSmsUrl: /api/appmsg/live/on
+  ipUrl: /api/geo/city
+
+#elasticsearch 配置
+elasticsearch:
+  rest:
+    #uris: localhost:9200,localhost:9300  #测试环境es地址
+    uris: 192.168.50.10:9202  #测试环境es地址
+
+management:
+  endpoints:
+    web:
+      exposure:
+        include: info, health,metrics,prometheus
+        exclude: shutdown
+      base-path: /actuator
+    enabled-by-default: true
+    jmx:
+      exposure:
+        include: info, health,metrics,prometheus
+  endpoint:
+    health.show-details: never
+    #health.show-details: ALWAYS
+    metrics:
+      enabled: true
+    prometheus:
+      enabled: true
+  metrics:
+    export:
+      prometheus:
+        enabled: true
+        step: 1ms
+        descriptions: true
+    tags:
+      # 为指标设置一个Tag,这里设置为应用名,Tag是Prometheus提供的一种能力,从而实现更加灵活的筛选
+      application: ${tzy.name}
+  health:
+    defaults.enabled: false
+    db.enabled: true
+    diskspace.enabled: true
+feign:
+  httpclient:
+    enabled: true            # 启用 HttpClient 作为 Feign 的 HTTP 客户端
+  client:
+    config:
+      default:
+        connectTimeout: 3000  # 连接超时
+        readTimeout: 3000     # 读取超时
+        maxConnections: 300   # 全局最大连接数
+        maxConnectionsPerRoute: 100  # 每个路由的最大连接数

+ 80 - 0
web-controller/src/main/resources/ehcache/ehcache-shiro.xml

@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ehcache name="tzy" updateCheck="false">
+
+    <!-- 磁盘缓存位置 -->
+    <diskStore path="java.io.tmpdir"/>
+    
+    <!-- maxEntriesLocalHeap:堆内存中最大缓存对象数,0没有限制 -->
+    <!-- maxElementsInMemory: 在内存中缓存的element的最大数目。-->
+    <!-- eternal:elements是否永久有效,如果为true,timeouts将被忽略,element将永不过期 -->
+    <!-- timeToIdleSeconds:失效前的空闲秒数,当eternal为false时,这个属性才有效,0为不限制 -->
+    <!-- timeToLiveSeconds:失效前的存活秒数,创建时间到失效时间的间隔为存活时间,当eternal为false时,这个属性才有效,0为不限制 -->
+    <!-- overflowToDisk: 如果内存中数据超过内存限制,是否要缓存到磁盘上 -->
+    <!-- statistics:是否收集统计信息。如果需要监控缓存使用情况,应该打开这个选项。默认为关闭(统计会影响性能)。设置statistics="true"开启统计 -->
+    
+    <!-- 默认缓存 -->
+    <defaultCache
+            maxEntriesLocalHeap="1000"
+            eternal="false"
+            timeToIdleSeconds="3600"
+            timeToLiveSeconds="3600"
+            overflowToDisk="false">
+    </defaultCache>
+
+    <!-- 登录记录缓存 锁定10分钟 -->
+    <cache name="loginRecordCache"
+           maxEntriesLocalHeap="2000"
+           eternal="false"
+           timeToIdleSeconds="600"
+           timeToLiveSeconds="0"
+           overflowToDisk="false"
+           statistics="false">
+    </cache>
+
+    <!-- 系统活跃用户缓存 -->
+    <cache name="sys-userCache"
+           maxEntriesLocalHeap="10000"
+           overflowToDisk="false"
+           eternal="false"
+           diskPersistent="false"
+           timeToLiveSeconds="0"
+           timeToIdleSeconds="0"
+           statistics="false">
+    </cache>
+
+    <!-- 系统缓存 -->
+    <cache name="sys-cache"
+           maxEntriesLocalHeap="1000"
+           eternal="true"
+           overflowToDisk="true"
+           statistics="false">
+    </cache>
+
+    <!-- 系统参数缓存 -->
+    <cache name="sys-config"
+           maxEntriesLocalHeap="1000"
+           eternal="true"
+           overflowToDisk="true"
+           statistics="false">
+    </cache>
+
+    <!-- 系统字典缓存 -->
+    <cache name="sys-dict"
+           maxEntriesLocalHeap="1000"
+           eternal="true"
+           overflowToDisk="true"
+           statistics="false">
+    </cache>
+
+    <!-- 系统会话缓存 -->
+    <cache name="shiro-activeSessionCache"
+           maxEntriesLocalHeap="10000"
+           overflowToDisk="false"
+           eternal="false"
+           diskPersistent="false"
+           timeToLiveSeconds="0"
+           timeToIdleSeconds="0"
+           statistics="false"/>
+    
+</ehcache>
+	

+ 15 - 0
web-controller/src/main/resources/mybatis/mybatis-config.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE configuration
+PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-config.dtd">
+<configuration>
+	
+	<settings>
+		<setting name="cacheEnabled"             value="true"  />  <!-- 全局映射器启用缓存 -->
+		<setting name="useGeneratedKeys"         value="true"  />  <!-- 允许 JDBC 支持自动生成主键 -->
+		<setting name="defaultExecutorType"      value="REUSE" />  <!-- 配置默认的执行器 -->
+		<setting name="logImpl"                  value="SLF4J" />  <!-- 指定 MyBatis 所用日志的具体实现 -->
+		<!-- <setting name="mapUnderscoreToCamelCase" value="true"/>  驼峰式命名 -->
+	</settings>
+	
+</configuration>