Commit f13dc1c2 authored by 赵啸非's avatar 赵啸非

Initial commit

parents
Pipeline #2655 failed with stages
*.iml
node_modules/
.idea/
*.class
target/
\ No newline at end of file
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>release</id>
<formats>
<format>tar.gz</format>
</formats>
<!-- 需要打包的文件集 -->
<fileSets>
<fileSet>
<directory>${project.parent.basedir}/enterprise-manager-ui/admin/dist</directory>
<includes>
<include>**/*</include>
</includes>
<outputDirectory>/dist</outputDirectory>
</fileSet>
</fileSets>
</assembly>
\ No newline at end of file
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>release</id>
<formats>
<format>tar.gz</format>
</formats>
<fileSets>
<fileSet>
<directory>target/bin</directory>
<outputDirectory>bin</outputDirectory>
<fileMode>0755</fileMode>
</fileSet>
<fileSet>
<directory>${project.parent.basedir}/dist/${project.parent.artifactId}/boot</directory>
<outputDirectory>boot</outputDirectory>
<fileMode>0755</fileMode>
</fileSet>
<fileSet>
<directory>./db</directory>
<includes>
<include>*.sql</include>
</includes>
<outputDirectory>db</outputDirectory>
<fileMode>0755</fileMode>
</fileSet>
</fileSets>
<files>
<file>
<source>target/${project.artifactId}-${project.version}.jar</source>
<outputDirectory>boot</outputDirectory>
</file>
</files>
</assembly>
\ No newline at end of file
*.iml
node_modules/
.idea/
*.class
target/
\ No newline at end of file
<?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>
<groupId>com.mortals.xhx</groupId>
<artifactId>common-lib</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>common-lib</name>
<description>公共依赖库</description>
<parent>
<groupId>com.mortals.xhx</groupId>
<artifactId>smart-office-platform</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<properties>
<rabbitmq.version>4.8.0</rabbitmq.version>
</properties>
<dependencies>
<dependency>
<groupId>com.mortals.framework</groupId>
<artifactId>mortals-framework-springcloud</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>${rabbitmq.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>4.8.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.mortals.xhx.common;
/**
* @author: zxfei
* @date: 2021/11/22 11:17
* @description:
**/
public class BrokerConfig {
}
package com.mortals.xhx.common.code;
import com.mortals.framework.ap.SysConstains;
import com.mortals.framework.common.IBaseEnum;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 审核状态
* @author
*
*/
public enum ApproveStateEnum implements IBaseEnum {
UN_AUDIT(1, "未审核", SysConstains.STYLE_DEFAULT),
AUDITING(2, "审核中", SysConstains.STYLE_PRIMARY),
AUDIT_FIN(3, "审核完成", SysConstains.STYLE_PRIMARY);
private int value;
private String desc;
private String style;
ApproveStateEnum(int value, String desc, String style) {
this.value = value;
this.desc = desc;
this.style = style;
}
@Override
public int getValue() {
return this.value;
}
public String getDesc() {
return desc;
}
public String getStyle()
{
return style;
}
public static ApproveStateEnum getByValue(int value) {
for (ApproveStateEnum examStatus : ApproveStateEnum.values()) {
if (examStatus.getValue() == value) {
return examStatus;
}
}
return null;
}
/**
* 获取Map集合
* @param eItem 不包含项
* @return
*/
public static Map<String,String> getEnumMap(int... eItem) {
Map<String,String> resultMap= new LinkedHashMap<String,String>();
for (ApproveStateEnum item : ApproveStateEnum.values()) {
try{
boolean hasE = false;
for (int e : eItem){
if(item.getValue()==e){
hasE = true;
break;
}
}
if(!hasE){
resultMap.put(item.getValue()+"", item.getDesc());
}
}catch(Exception ex){
}
}
return resultMap;
}
}
package com.mortals.xhx.common.code;
import com.mortals.framework.ap.SysConstains;
import com.mortals.framework.common.IBaseEnum;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 区域级别
*
* @author yiqimin
* @create 2018/09/26
*/
public enum AreaLevelEnum implements IBaseEnum {
PROVINCE(1, "省", SysConstains.STYLE_DEFAULT),
CITY(2, "市", SysConstains.STYLE_DEFAULT),
AREA(3, "区/县", SysConstains.STYLE_DEFAULT),
TOWN(4, "镇", SysConstains.STYLE_DEFAULT);
private int value;
private String desc;
private String style;
AreaLevelEnum(int value, String desc, String style) {
this.value = value;
this.desc = desc;
this.style = style;
}
@Override
public int getValue() {
return this.value;
}
public String getDesc() {
return desc;
}
public String getStyle()
{
return style;
}
public static AreaLevelEnum getByValue(int value) {
for (AreaLevelEnum e : AreaLevelEnum.values()) {
if (e.getValue() == value) {
return e;
}
}
return null;
}
public static Map<String,String> getEnumMap(int... eItem) {
Map<String,String> resultMap= new LinkedHashMap<String,String>();
for (AreaLevelEnum item : AreaLevelEnum.values()) {
try{
boolean hasE = false;
for (int e : eItem){
if(item.getValue()==e){
hasE = true;
break;
}
}
if(!hasE){
resultMap.put(item.getValue()+"", item.getDesc());
}
}catch(Exception ex){
}
}
return resultMap;
}
}
package com.mortals.xhx.common.code;
import com.mortals.framework.ap.SysConstains;
import com.mortals.framework.common.IBaseEnum;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 资源类型
* @author
*
*/
public enum AuthType implements IBaseEnum {
UNLIMITED(0, "无限制", SysConstains.STYLE_DEFAULT),
UNLOGIN(1, "无需登录查看", SysConstains.STYLE_DEFAULT),
LOGIN(2, "需要登录查看", SysConstains.STYLE_DEFAULT),
AUTH(3, "需要角色权限查看", SysConstains.STYLE_PRIMARY);
//0:无限制,1:无需登录查看,2:需要登录查看,3:需要角色权限查看,默认3
private int value;
private String desc;
private String style;
AuthType(int value, String desc, String style) {
this.value = value;
this.desc = desc;
this.style = style;
}
@Override
public int getValue() {
return this.value;
}
public String getDesc() {
return desc;
}
public String getStyle()
{
return style;
}
public static AuthType getByValue(int value) {
for (AuthType examStatus : AuthType.values()) {
if (examStatus.getValue() == value) {
return examStatus;
}
}
return null;
}
/**
* 获取Map集合
* @param eItem 不包含项
* @return
*/
public static Map<String,String> getEnumMap(int... eItem) {
Map<String,String> resultMap= new LinkedHashMap<String,String>();
for (AuthType item : AuthType.values()) {
try{
boolean hasE = false;
for (int e : eItem){
if(item.getValue()==e){
hasE = true;
break;
}
}
if(!hasE){
resultMap.put(item.getValue()+"", item.getDesc());
}
}catch(Exception ex){
}
}
return resultMap;
}
}
package com.mortals.xhx.common.code;
import java.io.Serializable;
/**
* 审批模式
*
* @author: zxfei
* @date: 2021/8/26 9:58
*/
public enum CommentTypeEnum implements Serializable {
SP("审批"),
QS("签收"),
FQS("反签收"),
BH("驳回"),
CH("撤回"),
ZC("暂存"),
XTZX("系统执行"),
TJ("提交"),
CXTJ("重新提交"),
SPJS("审批结束"),
LCZZ("流程终止"),
WP("委派"),
ZH("知会"),
ZY("转阅"),
YY("已阅"),
ZB("转办"),
SQ("授权"),
SPBJQ("审批并加签"),
HJQ("后加签"),
QJQ("前加签"),
CFTG("重复跳过"),
XT("协同"),
PS("评审");
private String name;//名称
/**
* 通过type获取Msg
*
* @param type
* @return
* @Description:
*/
public static String getEnumMsgByType(String type) {
for (CommentTypeEnum e : CommentTypeEnum.values()) {
if (e.toString().equals(type)) {
return e.name;
}
}
return "";
}
CommentTypeEnum(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.mortals.xhx.common.code;
import com.mortals.framework.common.IBaseEnum;
import java.util.LinkedHashMap;
import java.util.Map;
public enum CompareTypeEnum implements IBaseEnum {
DAY(1, "按日"),
MONTH(2, "按月");
private int value;
private String desc;
CompareTypeEnum(int value, String desc) {
this.value = value;
this.desc = desc;
}
@Override
public int getValue() {
return this.value;
}
@Override
public String getDesc() {
return this.desc;
}
public static Map<String,String> getEnumMap() {
Map<String, String> resultMap= new LinkedHashMap<String, String>();
for (CompareTypeEnum item : CompareTypeEnum.values()) {
resultMap.put(item.getValue() + "", item.getDesc());
}
return resultMap;
}
}
package com.mortals.xhx.common.code;
import com.mortals.framework.ap.SysConstains;
import com.mortals.framework.common.IBaseEnum;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 资源类型
* @author
*
*/
public enum DataSatus implements IBaseEnum {
DISENABLE(0, "禁用", SysConstains.STYLE_DEFAULT),
ENABLE(1, "启用", SysConstains.STYLE_DEFAULT),
CLOSE(2, "注销", SysConstains.STYLE_DEFAULT),
DELETE(3, "已删除", SysConstains.STYLE_DEFAULT),
OVERDUE(4, "过期", SysConstains.STYLE_DEFAULT),
USEOUT(5, "用完", SysConstains.STYLE_DEFAULT);
private int value;
private String desc;
private String style;
DataSatus(int value, String desc, String style) {
this.value = value;
this.desc = desc;
this.style = style;
}
@Override
public int getValue() {
return this.value;
}
public String getDesc() {
return desc;
}
public String getStyle()
{
return style;
}
public static DataSatus getByValue(int value) {
for (DataSatus examStatus : DataSatus.values()) {
if (examStatus.getValue() == value) {
return examStatus;
}
}
return null;
}
/**
* 获取Map集合
* @param eItem 不包含项
* @return
*/
public static Map<String,String> getEnumMap(int... eItem) {
Map<String,String> resultMap= new LinkedHashMap<String,String>();
for (DataSatus item : DataSatus.values()) {
try{
boolean hasE = false;
for (int e : eItem){
if(item.getValue()==e){
hasE = true;
break;
}
}
if(!hasE){
resultMap.put(item.getValue()+"", item.getDesc());
}
}catch(Exception ex){
}
}
return resultMap;
}
}
package com.mortals.xhx.common.code;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 资源类型
* @author
*
*/
public enum DataSatusEnum {
DISENABLE(0, "禁用"),
ENABLE(1, "启用"),
CLOSE(2, "注销"),
DELETE(3, "已删除"),
OVERDUE(4, "过期"),
USEOUT(5, "用完");
private int value;
private String desc;
DataSatusEnum(int value, String desc) {
this.value = value;
this.desc = desc;
}
public int getValue() {
return this.value;
}
public String getDesc() {
return desc;
}
public static DataSatusEnum getByValue(int value) {
for (DataSatusEnum examStatus : DataSatusEnum.values()) {
if (examStatus.getValue() == value) {
return examStatus;
}
}
return null;
}
/**
* 获取Map集合
* @param eItem 不包含项
* @return
*/
public static Map<String,String> getEnumMap(int... eItem) {
Map<String,String> resultMap= new LinkedHashMap<String,String>();
for (DataSatusEnum item : DataSatusEnum.values()) {
try{
boolean hasE = false;
for (int e : eItem){
if(item.getValue()==e){
hasE = true;
break;
}
}
if(!hasE){
resultMap.put(item.getValue()+"", item.getDesc());
}
}catch(Exception ex){
}
}
return resultMap;
}
}
package com.mortals.xhx.common.code;
import com.mortals.framework.ap.SysConstains;
import com.mortals.framework.common.IBaseEnum;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 流程状态
* @author
*
*/
public enum FlowStateType implements IBaseEnum {
/** 激活 */
active(1, "激活", SysConstains.STYLE_DEFAULT),
/** 挂起 */
suspend(2, "挂起", SysConstains.STYLE_PRIMARY);
private int value;
private String desc;
private String style;
FlowStateType(int value, String desc, String style) {
this.value = value;
this.desc = desc;
this.style = style;
}
@Override
public int getValue() {
return this.value;
}
public String getDesc() {
return desc;
}
public String getStyle()
{
return style;
}
public static FlowStateType getByValue(int value) {
for (FlowStateType examStatus : FlowStateType.values()) {
if (examStatus.getValue() == value) {
return examStatus;
}
}
return null;
}
/**
* 获取Map集合
* @param eItem 不包含项
* @return
*/
public static Map<String,String> getEnumMap(int... eItem) {
Map<String,String> resultMap= new LinkedHashMap<String,String>();
for (FlowStateType item : FlowStateType.values()) {
try{
boolean hasE = false;
for (int e : eItem){
if(item.getValue()==e){
hasE = true;
break;
}
}
if(!hasE){
resultMap.put(item.getValue()+"", item.getDesc());
}
}catch(Exception ex){
}
}
return resultMap;
}
}
package com.mortals.xhx.common.code;
import com.mortals.framework.ap.SysConstains;
import com.mortals.framework.common.IBaseEnum;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 流程通知状态
* @author
*
*/
public enum FlowStatusNotifyType implements IBaseEnum {
FLOW_START(0, "流程启动", SysConstains.STYLE_DEFAULT),
FLOW_END(1, "流程结束", SysConstains.STYLE_PRIMARY),
TASK_CREATE(2, "任务创建", SysConstains.STYLE_PRIMARY),
TASK_COMPLETE(3, "任务结束", SysConstains.STYLE_PRIMARY);
private int value;
private String desc;
private String style;
FlowStatusNotifyType(int value, String desc, String style) {
this.value = value;
this.desc = desc;
this.style = style;
}
@Override
public int getValue() {
return this.value;
}
public String getDesc() {
return desc;
}
public String getStyle()
{
return style;
}
public static FlowStatusNotifyType getByValue(int value) {
for (FlowStatusNotifyType examStatus : FlowStatusNotifyType.values()) {
if (examStatus.getValue() == value) {
return examStatus;
}
}
return null;
}
/**
* 获取Map集合
* @param eItem 不包含项
* @return
*/
public static Map<String,String> getEnumMap(int... eItem) {
Map<String,String> resultMap= new LinkedHashMap<String,String>();
for (FlowStatusNotifyType item : FlowStatusNotifyType.values()) {
try{
boolean hasE = false;
for (int e : eItem){
if(item.getValue()==e){
hasE = true;
break;
}
}
if(!hasE){
resultMap.put(item.getValue()+"", item.getDesc());
}
}catch(Exception ex){
}
}
return resultMap;
}
}
package com.mortals.xhx.common.code;
import com.mortals.framework.ap.SysConstains;
import com.mortals.framework.common.IBaseEnum;
import java.util.LinkedHashMap;
import java.util.Map;
public enum MenuAuthType implements IBaseEnum{
/** 无限制 */
UNLIMIT(0, "无限制", SysConstains.STYLE_DEFAULT),
/** 无需登录查看 */
WITHOUTLOGIN(1, "无需登录查看", SysConstains.STYLE_DEFAULT),
/** 需要登录查看 */
WITHLOGIN(2, "需要登录查看", SysConstains.STYLE_DEFAULT),
/** 需要角色权限查看 */
WITHAUTHORITY(3, "需要角色权限查看", SysConstains.STYLE_DEFAULT);
private int value;
private String desc;
private String style;
MenuAuthType(int value, String desc, String style) {
this.value = value;
this.desc = desc;
this.style = style;
}
@Override
public int getValue() {
return this.value;
}
public String getDesc() {
return desc;
}
public String getStyle()
{
return style;
}
public static MenuAuthType getByValue(int value) {
for (MenuAuthType menuAuthType : MenuAuthType.values()) {
if (menuAuthType.getValue() == value) {
return menuAuthType;
}
}
return null;
}
/**
* 获取Map集合
* @param eItem 不包含项
* @return
*/
public static Map<String,String> getEnumMap(int... eItem) {
Map<String,String> resultMap= new LinkedHashMap<String,String>();
for (MenuAuthType item : MenuAuthType.values()) {
try{
boolean hasE = false;
for (int e : eItem){
if(item.getValue()==e){
hasE = true;
break;
}
}
if(!hasE){
resultMap.put(item.getValue()+"", item.getDesc());
}
}catch(Exception ex){
}
}
return resultMap;
}
}
package com.mortals.xhx.common.code;
import com.mortals.framework.ap.SysConstains;
import com.mortals.framework.common.IBaseEnum;
import java.util.LinkedHashMap;
import java.util.Map;
public enum MenuComm {
/** 非常用 */
UNCOMMON(0, "非常用"),
/** 常用 */
COMMON(1, "常用");
private int value;
private String desc;
private String style;
MenuComm(int value, String desc) {
this.value = value;
this.desc = desc;
}
public int getValue() {
return this.value;
}
public String getDesc() {
return desc;
}
public static MenuComm getByValue(int value) {
for (MenuComm menuComm : MenuComm.values()) {
if (menuComm.getValue() == value) {
return menuComm;
}
}
return null;
}
/**
* 获取Map集合
* @param eItem 不包含项
* @return
*/
public static Map<String,String> getEnumMap(int... eItem) {
Map<String,String> resultMap= new LinkedHashMap<String,String>();
for (MenuComm item : MenuComm.values()) {
try{
boolean hasE = false;
for (int e : eItem){
if(item.getValue()==e){
hasE = true;
break;
}
}
if(!hasE){
resultMap.put(item.getValue()+"", item.getDesc());
}
}catch(Exception ex){
}
}
return resultMap;
}
}
package com.mortals.xhx.common.code;
import com.mortals.framework.ap.SysConstains;
import com.mortals.framework.common.IBaseEnum;
import java.util.LinkedHashMap;
import java.util.Map;
public enum MenuLinkType implements IBaseEnum{
/** 普通 */
NORMAL(0, "普通", SysConstains.STYLE_DEFAULT),
/** 弹出 */
POP(1, "弹出", SysConstains.STYLE_DEFAULT),
/** 脚本(JavaScript) */
SCRIPT(2, "脚本", SysConstains.STYLE_DEFAULT);
private int value;
private String desc;
private String style;
MenuLinkType(int value, String desc, String style) {
this.value = value;
this.desc = desc;
this.style = style;
}
@Override
public int getValue() {
return this.value;
}
public String getDesc() {
return desc;
}
public String getStyle()
{
return style;
}
public static MenuLinkType getByValue(int value) {
for (MenuLinkType menuLinkType : MenuLinkType.values()) {
if (menuLinkType.getValue() == value) {
return menuLinkType;
}
}
return null;
}
/**
* 获取Map集合
* @param eItem 不包含项
* @return
*/
public static Map<String,String> getEnumMap(int... eItem) {
Map<String,String> resultMap= new LinkedHashMap<String,String>();
for (MenuLinkType item : MenuLinkType.values()) {
try{
boolean hasE = false;
for (int e : eItem){
if(item.getValue()==e){
hasE = true;
break;
}
}
if(!hasE){
resultMap.put(item.getValue()+"", item.getDesc());
}
}catch(Exception ex){
}
}
return resultMap;
}
}
package com.mortals.xhx.common.code;
import com.mortals.framework.ap.SysConstains;
import com.mortals.framework.common.IBaseEnum;
import java.util.LinkedHashMap;
import java.util.Map;
public enum MenuType implements IBaseEnum{
/** 主菜单 */
MAIN(0, "主菜单", SysConstains.STYLE_DEFAULT),
/** 非主菜单 */
UNMAIN(1, "非主菜单", SysConstains.STYLE_DEFAULT);
private int value;
private String desc;
private String style;
MenuType(int value, String desc, String style) {
this.value = value;
this.desc = desc;
this.style = style;
}
@Override
public int getValue() {
return this.value;
}
public String getDesc() {
return desc;
}
public String getStyle()
{
return style;
}
public static MenuType getByValue(int value) {
for (MenuType menuType : MenuType.values()) {
if (menuType.getValue() == value) {
return menuType;
}
}
return null;
}
/**
* 获取Map集合
* @param eItem 不包含项
* @return
*/
public static Map<String,String> getEnumMap(int... eItem) {
Map<String,String> resultMap= new LinkedHashMap<String,String>();
for (MenuType item : MenuType.values()) {
try{
boolean hasE = false;
for (int e : eItem){
if(item.getValue()==e){
hasE = true;
break;
}
}
if(!hasE){
resultMap.put(item.getValue()+"", item.getDesc());
}
}catch(Exception ex){
}
}
return resultMap;
}
}
package com.mortals.xhx.common.code;
import java.util.LinkedHashMap;
import java.util.Map;
/**
*
*
* @author zxfei
*/
public enum MessageProtocolEnum {
JSON("json", "未激活");
private String value;
private String desc;
MessageProtocolEnum(String value, String desc) {
this.value = value;
this.desc = desc;
}
public String getValue() {
return this.value;
}
public String getDesc() {
return this.desc;
}
public static MessageProtocolEnum getByValue(String value) {
for (MessageProtocolEnum activeEnum : MessageProtocolEnum.values()) {
if (value.equals(activeEnum.getValue())) {
return activeEnum;
}
}
return null;
}
/**
* 获取Map集合
*
* @param eItem 不包含项
* @return
*/
public static Map<String, String> getEnumMap(String... eItem) {
Map<String, String> resultMap = new LinkedHashMap<>();
for (MessageProtocolEnum item : MessageProtocolEnum.values()) {
try {
boolean hasE = false;
for (String e : eItem) {
if (item.getValue() == e) {
hasE = true;
break;
}
}
if (!hasE) {
resultMap.put(item.getValue(), item.getDesc());
}
} catch (Exception ex) {
}
}
return resultMap;
}
}
\ No newline at end of file
package com.mortals.xhx.common.code;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 参数修改状态
* @author
*
*/
public enum ModStatusEnum {
/** 页面隐藏 */
HIDDEN(0, "隐藏"),
/** 页面可查看 */
VIEW(1, "查看"),
/** 页面可修改 */
EDIT(2, "修改"),
/** 页面可删除 */
DELETE(3, "删除"),
/** 页面可修改删除 */
EDITANDDELETE(4, "修改删除");
private int value;
private String desc;
ModStatusEnum(int value, String desc) {
this.value = value;
this.desc = desc;
}
public int getValue() {
return this.value;
}
public String getDesc() {
return desc;
}
public static ModStatusEnum getByValue(int value) {
for (ModStatusEnum modStatus : ModStatusEnum.values()) {
if (modStatus.getValue() == value) {
return modStatus;
}
}
return null;
}
/**
* 获取Map集合
* @param eItem 不包含项
* @return
*/
public static Map<String,String> getEnumMap(int... eItem) {
Map<String,String> resultMap= new LinkedHashMap<String,String>();
for (ModStatusEnum item : ModStatusEnum.values()) {
try{
boolean hasE = false;
for (int e : eItem){
if(item.getValue()==e){
hasE = true;
break;
}
}
if(!hasE){
resultMap.put(item.getValue()+"", item.getDesc());
}
}catch(Exception ex){
}
}
return resultMap;
}
}
package com.mortals.xhx.common.code;
import java.util.HashMap;
import java.util.Map;
/**
* Created by chendilin on 2018/3/7.
*/
public enum OperTypeEnum {
SAVE(0,"添加"),
UPDATE(1,"更新"),
DELETE(2,"删除"),
OTHER(-1,"其它");
private int value;
private String msg;
private OperTypeEnum(int value,String msg) {
this.value = value;
this.msg = msg;
}
public int getValue() {
return this.value;
}
public static Map<String,String> getEnumMap(){
Map<String,String> resultMap = new HashMap<>();
OperTypeEnum[] operTypeEnum = OperTypeEnum.values();
for (OperTypeEnum typeEnum : operTypeEnum) {
resultMap.put(String.valueOf(typeEnum.value),typeEnum.msg);
}
return resultMap;
}
}
package com.mortals.xhx.common.code;
import java.io.Serializable;
/**
* 流程的状态
*
* @author: zxfei
* @date: 2021/8/26 9:58
*/
public enum ProcessStatusEnum implements Serializable {
SPZ("审批中"),
BH("驳回"),
CH("撤回"),
JQ("加签"),
ZC("暂存"),
ZB("转办"),
BJ("办结"),
ZZ("终止");
private String msg;
private String type;
ProcessStatusEnum(String msg) {
this.msg = msg;
}
/**
* 通过type获取Msg
*
* @param type
* @return
* @Description:
*/
public static String getEnumMsgByType(String type) {
for (ProcessStatusEnum e : ProcessStatusEnum.values()) {
if (e.toString().equals(type)) {
return e.msg;
}
}
return "";
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
\ No newline at end of file
package com.mortals.xhx.common.code;
/**
* 业务统一返回码
* @author linlc
*
*/
public enum ResultCodeEnum {
CODE_001(156001,"参数类型错误"),
CODE_002(156002,"部分参数为空"),
CODE_003(156003,"参数长度超过限制"),
CODE_004(156004,"日期格式错误"),
CODE_005(156005,"时间区间不合法"),
CODE_006(156006,"远端服务不可用"),
CODE_007(156007,"无效的签名"),
CODE_008(156008,"不合法的 AppID ,请开发者检查 AppID 的正确性,避免异常字符,注意大小写"),
CODE_009(156009,"请求来源地址不合法"),
CODE_010(156010,"没有相应的用户"),
CODE_011(156011,"不合法的文件类型"),
CODE_012(156012,"不合法的文件大小"),
CODE_013(156013,"上传文件缺失"),
CODE_014(156014,"不支持的图片格式"),
CODE_015(156015,"无效的url"),
CODE_016(156016,"设备编号不合法"),
CODE_017(356017,"设备编号不存在"),
CODE_018(356018,"设备当前在线状态为“离线”,无法使用!"),
CODE_019(356019,"设备当前投放状态为“待重投”,无法使用!"),
CODE_020(356020,"设备当前投放状态为“已报废”,无法使用!"),
CODE_021(356021,"设备当前投放状态为“初始化”,无法使用!"),
CODE_022(356022,"此设备当前启用状态为“禁用”,无法使用!"),
CODE_023(356023,"API 调用太频繁,请稍候再试"),
CODE_024(256024,"用户未授权该 api"),
CODE_025(156025,"解析 JSON/XML 内容错误"),
CODE_FAILUER(-1,"失败");
private int value;
private String desc;
ResultCodeEnum(int value, String desc) {
this.value = value;
this.desc = desc;
}
public int getValue() {
return value;
}
public String getDesc() {
return desc;
}
}
package com.mortals.xhx.common.code;
import com.mortals.framework.ap.SysConstains;
import com.mortals.framework.common.IBaseEnum;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 角色类型
* @author
*
*/
public enum RoleType implements IBaseEnum {
/** 系统内置角色 */
BUILT_IN(0, "系统内置角色", SysConstains.STYLE_DEFAULT),
/** 默认系统角色 */
SYSTEM_DEFAULT(1, "默认系统角色", SysConstains.STYLE_INFO),
/** 企业用户角色 */
CUSTOMER_DEFAULT(2, "企业用户角色", SysConstains.STYLE_PRIMARY),
/** 普通角色 */
NORMAL(4, "普通角色 ", SysConstains.STYLE_SUCCESS),;
//0:系统内置角色(不可删除),1:默认系统角色,2:默认新闻用户角色,3:默认资讯用户角色,4:普通角色,默认4
private int value;
private String desc;
private String style;
RoleType(int value, String desc, String style) {
this.value = value;
this.desc = desc;
this.style = style;
}
@Override
public int getValue() {
return this.value;
}
public String getDesc() {
return desc;
}
public String getStyle()
{
return style;
}
public static RoleType getByValue(int value) {
for (RoleType examStatus : RoleType.values()) {
if (examStatus.getValue() == value) {
return examStatus;
}
}
return null;
}
/**
* 获取Map集合
* @param eItem 不包含项
* @return
*/
public static Map<String,String> getEnumMap(int... eItem) {
Map<String,String> resultMap= new LinkedHashMap<String,String>();
for (RoleType item : RoleType.values()) {
try{
boolean hasE = false;
for (int e : eItem){
if(item.getValue()==e){
hasE = true;
break;
}
}
if(!hasE){
resultMap.put(item.getValue()+"", item.getDesc());
}
}catch(Exception ex){
}
}
return resultMap;
}
}
package com.mortals.xhx.common.code;
import com.mortals.framework.ap.SysConstains;
import com.mortals.framework.common.IBaseEnum;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 资源类型
* @author
*
*/
public enum SourceType implements IBaseEnum {
/** 系统资源 */
SYSTEM(0, "系统资源", SysConstains.STYLE_DEFAULT),
/** 开放资源 */
OPEN(1, "开放资源", SysConstains.STYLE_PRIMARY);
private int value;
private String desc;
private String style;
SourceType(int value, String desc, String style) {
this.value = value;
this.desc = desc;
this.style = style;
}
@Override
public int getValue() {
return this.value;
}
public String getDesc() {
return desc;
}
public String getStyle()
{
return style;
}
public static SourceType getByValue(int value) {
for (SourceType examStatus : SourceType.values()) {
if (examStatus.getValue() == value) {
return examStatus;
}
}
return null;
}
/**
* 获取Map集合
* @param eItem 不包含项
* @return
*/
public static Map<String,String> getEnumMap(int... eItem) {
Map<String,String> resultMap= new LinkedHashMap<String,String>();
for (SourceType item : SourceType.values()) {
try{
boolean hasE = false;
for (int e : eItem){
if(item.getValue()==e){
hasE = true;
break;
}
}
if(!hasE){
resultMap.put(item.getValue()+"", item.getDesc());
}
}catch(Exception ex){
}
}
return resultMap;
}
}
package com.mortals.xhx.common.code;
import java.io.Serializable;
/**
* 启动参数
*
* @author: zxfei
* @date: 2021/8/26 9:59
*/
public enum StartVariableEnum implements Serializable {
USER("user", "人员信息"),
UDEPT("udept", "人员部门变量"),
UCOMPANY("ucompany", "人员公司变量"),
COMPANY_ROLE("company", "公司角色层级审批领导"),
MATRIX_COMPANY_ROLE("mcompany", "矩阵公司角色"),
MATRIX_DEPT_ROLE("mdept", "矩阵部门角色"),
FORM("form", "表单"),
LCDB("lcdb", "流程底表"),
LINE("line", "汇报线");
private String code;
private String msg;
StartVariableEnum(String code, String msg) {
this.msg = msg;
this.code = code;
}
/**
* 通过code获取Msg
*
* @param code
* @return
* @Description:
*/
public static String getEnumMsgByCode(String code) {
for (StartVariableEnum e : StartVariableEnum.values()) {
if (e.getCode().equals(code)) {
return e.msg;
}
}
return "";
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
package com.mortals.xhx.common.code;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @author
* @create 2018/01/12
*/
public enum TaskExcuteStatusEnum {
WAIT_RUN(0, "待执行"),
RUNNING(1, "执行中"),
SUCCESS_RUN(2, "执行成功"),
FAIL_RUN(3, "执行失败"),
CANCEL(4, "取消");
private int value;
private String desc;
TaskExcuteStatusEnum(int value, String desc) {
this.value = value;
this.desc = desc;
}
public int getValue() {
return this.value;
}
public String getDesc() {
return this.desc;
}
public static TaskExcuteStatusEnum getByValue(int value) {
for (TaskExcuteStatusEnum taskExcuteStatusEnum : TaskExcuteStatusEnum.values()) {
if (taskExcuteStatusEnum.getValue() == value) {
return taskExcuteStatusEnum;
}
}
return null;
}
/**
* 获取Map集合
* @param eItem 不包含项
* @return
*/
public static Map<String,String> getEnumMap(int... eItem) {
Map<String,String> resultMap= new LinkedHashMap<String,String>();
for (TaskExcuteStatusEnum item : TaskExcuteStatusEnum.values()) {
try{
boolean hasE = false;
for (int e : eItem){
if(item.getValue()==e){
hasE = true;
break;
}
}
if(!hasE){
resultMap.put(item.getValue()+"", item.getDesc());
}
}catch(Exception ex){
}
}
return resultMap;
}
}
package com.mortals.xhx.common.code;
import java.util.LinkedHashMap;
import java.util.Map;
public enum TaskExcuteStrategyEnum{
/** 按日 */
DAY(1, "按日"),
/** 按周 */
WEEK(2, "按周"),
/** 按月 */
MONTH(3, "按月"),
/** 按间隔时间 */
INTERVAL(4, "按间隔时间");
private int value;
private String desc;
TaskExcuteStrategyEnum(int value, String desc) {
this.value = value;
this.desc = desc;
}
public int getValue() {
return this.value;
}
public String getDesc() {
return desc;
}
public static TaskExcuteStrategyEnum getByValue(int value) {
for (TaskExcuteStrategyEnum taskExcuteStrategy : TaskExcuteStrategyEnum.values()) {
if (taskExcuteStrategy.getValue() == value) {
return taskExcuteStrategy;
}
}
return null;
}
/**
* 获取Map集合
* @param eItem 不包含项
* @return
*/
public static Map<String,String> getEnumMap(int... eItem) {
Map<String,String> resultMap= new LinkedHashMap<String,String>();
for (TaskExcuteStrategyEnum item : TaskExcuteStrategyEnum.values()) {
try{
boolean hasE = false;
for (int e : eItem){
if(item.getValue()==e){
hasE = true;
break;
}
}
if(!hasE){
resultMap.put(item.getValue()+"", item.getDesc());
}
}catch(Exception ex){
}
}
return resultMap;
}
}
package com.mortals.xhx.common.code;
import java.util.LinkedHashMap;
import java.util.Map;
public enum TaskInterimExcuteStatusEnum{
/** 未启用 */
UNUSE(0, "未启用"),
/** 立即执行并保留 */
IMMEDIATE_EXECUTION(1, "立即执行并保留"),
/** 立即执行并删除 */
IMMEDIATE_EXECUTION_BEFORE_DELETE(2, "立即执行并删除");
private int value;
private String desc;
TaskInterimExcuteStatusEnum(int value, String desc) {
this.value = value;
this.desc = desc;
}
public int getValue() {
return this.value;
}
public String getDesc() {
return desc;
}
public static TaskInterimExcuteStatusEnum getByValue(int value) {
for (TaskInterimExcuteStatusEnum taskInterimExcuteStatus : TaskInterimExcuteStatusEnum.values()) {
if (taskInterimExcuteStatus.getValue() == value) {
return taskInterimExcuteStatus;
}
}
return null;
}
/**
* 获取Map集合
* @param eItem 不包含项
* @return
*/
public static Map<String,String> getEnumMap(int... eItem) {
Map<String,String> resultMap= new LinkedHashMap<String,String>();
for (TaskInterimExcuteStatusEnum item : TaskInterimExcuteStatusEnum.values()) {
try{
boolean hasE = false;
for (int e : eItem){
if(item.getValue()==e){
hasE = true;
break;
}
}
if(!hasE){
resultMap.put(item.getValue()+"", item.getDesc());
}
}catch(Exception ex){
}
}
return resultMap;
}
}
package com.mortals.xhx.common.code;
import com.mortals.framework.common.IBaseEnum;
/**
* 上传文件类型枚举
*
* @author pengziyuan
*/
public enum UploadFileType implements IBaseEnum {
/** 表格 */
EXCEL(1, "表格", 1024 * 1023 * 100),
/** 图片 */
IMG(2, "图片", 1024 * 1024 * 10),
/** 压缩文件 */
ZIP(3, "压缩文件", 1024 * 1024 * 100),
/** PDF */
PDF(4, "PDF", 1024 * 1024 * 100),
/** 其他 */
OTHER(99, "其他", 1024 * 1024 * 100);
private int value;
private String desc;
private int maxSize;
UploadFileType(int value, String desc, int maxSize) {
this.value = value;
this.desc = desc;
this.maxSize = maxSize;
}
@Override
public int getValue() {
return this.value;
}
@Override
public String getDesc() {
return desc;
}
public int getMaxSize() {
return maxSize;
}
public static UploadFileType getFileType(String extension) {
if ("xls".equalsIgnoreCase(extension) || "xlsx".equalsIgnoreCase(extension)) {
return EXCEL;
}
if ("jpg".equalsIgnoreCase(extension) || "jpeg".equalsIgnoreCase(extension) || "png".equalsIgnoreCase(extension)
|| "gif".equalsIgnoreCase(extension)) {
return IMG;
}
if ("zip".equalsIgnoreCase(extension)) {
return ZIP;
}
if ("pdf".equalsIgnoreCase(extension)) {
return PDF;
}
return OTHER;
}
}
package com.mortals.xhx.common.code;
import com.mortals.framework.ap.SysConstains;
import com.mortals.framework.common.IBaseEnum;
import java.util.LinkedHashMap;
import java.util.Map;
public enum ValidCodeType implements IBaseEnum{
IMAGE(0, "图片校验", SysConstains.STYLE_DEFAULT),
MOBILE(1, "手机校验", SysConstains.STYLE_DEFAULT),
EMAIL(2, "邮箱校验", SysConstains.STYLE_DEFAULT);
private int value;
private String desc;
private String style;
ValidCodeType(int value, String desc, String style) {
this.value = value;
this.desc = desc;
this.style = style;
}
@Override
public int getValue() {
return this.value;
}
public String getDesc() {
return desc;
}
public String getStyle()
{
return style;
}
public static ValidCodeType getByValue(int value) {
for (ValidCodeType validCodeType : ValidCodeType.values()) {
if (validCodeType.getValue() == value) {
return validCodeType;
}
}
return null;
}
/**
* 获取Map集合
* @param eItem 不包含项
* @return
*/
public static Map<String,String> getEnumMap(int... eItem) {
Map<String,String> resultMap= new LinkedHashMap<String,String>();
for (ValidCodeType item : ValidCodeType.values()) {
try{
boolean hasE = false;
for (int e : eItem){
if(item.getValue()==e){
hasE = true;
break;
}
}
if(!hasE){
resultMap.put(item.getValue()+"", item.getDesc());
}
}catch(Exception ex){
}
}
return resultMap;
}
}
package com.mortals.xhx.common.code;
import com.mortals.framework.common.IBaseEnum;
import java.util.LinkedHashMap;
import java.util.Map;
public enum YesNoEnum implements IBaseEnum{
NO(0, "否"),
YES(1, "是");
private int value;
private String desc;
YesNoEnum(int value, String desc) {
this.value = value;
this.desc = desc;
}
@Override
public int getValue() {
return this.value;
}
public String getDesc() {
return desc;
}
public static YesNoEnum getByValue(int value) {
for (YesNoEnum YesNoEnum : YesNoEnum.values()) {
if (YesNoEnum.getValue() == value) {
return YesNoEnum;
}
}
return null;
}
/**
* 获取Map集合
* @param eItem 不包含项
* @return
*/
public static Map<String,String> getEnumMap(int... eItem) {
Map<String,String> resultMap= new LinkedHashMap<String,String>();
for (YesNoEnum item : YesNoEnum.values()) {
try{
boolean hasE = false;
for (int e : eItem){
if(item.getValue()==e){
hasE = true;
break;
}
}
if(!hasE){
resultMap.put(item.getValue()+"", item.getDesc());
}
}catch(Exception ex){
}
}
return resultMap;
}
}
package com.mortals.xhx.common.keys;
import java.math.BigDecimal;
/**
* 业务参数类,这个类全部为field参数,可以直接从外部设置和获取
*
* @author karlhoo
*/
public final class BusizParams {
public static int WORK_ID;
/**
* 无限常量:-1
*/
public static int NO_LIMIT = -1;
/**
* 一天的分钟数
*/
public static long DAY_MINUTES = 24 * 60;
/**
* 现金类押金支付金额默认折扣
*/
public static BigDecimal DEFAULT_CASH_DEPOSIT_DISCOUNT = new BigDecimal("1.0");
/**
* 押金默认计费上限费用
*/
public static Long DEFAULT_BILL_LIMIT_FEE = 20000L;
/**
* 现金押金默认计费上限费用
*/
public static Long DEFAULT_CASH_BILL_LIMIT_FEE = 8000L;
/**
* 用户冻结的默认延时
*/
public static Integer DEFAULT_CUSTOMER_FREEZE_DELAY = 121;
/**
* 用户冻结的默认时长
*/
public static Integer DEFAULT_CUSTOMER_FREEZE_LENGHT = 1440;
/**
* 系统参数:按摩椅下发命令间隔时间(单位:秒,默认值:10秒)
*/
public static String SYS_PARAM_CHAIR_ISCMDRSP_INTERVAL = "chair_iscmdrsp_interval";
/**
* 系统参数:闪充待支付超时时间(单位:秒,默认值:600秒)
*/
public static String SYS_PARAM_WIRE_WAITLOAN_TIMEOUT = "wire_waitloan_timeout";
/**
* 系统参数:filetoken过期时间(单位:天,默认值:1天)
*/
public static String SYS_PARAM_PRINT_FILETOKEN_TIMEOUT = "print_filetoken_timeout";
/**
* 系统参数:打印机保存文件过期时间(单位:月,默认值:3)
*/
public static String SYS_PARAM_PRINT_FILE_TIMEOUT = "print_orderfile_timeout";
/**
* 系统参数:打印机保存文件存储使用方式(0:本地存储,1:fastdfs存储)
*/
public static String SYS_PARAM_PRINT_FILE_STORE_MODE = "print_file_store_mode";
/**
* 系统参数:word文件转换方式
*/
public static String SYS_PARAM_PRINT_WORD_CONVERT_METHOD = "print_word_convert_method";
/**
* 系统参数:文件访问域
*/
public static String SYS_PARAM_FILE_DOMAIN = "file_domain";
/**
* 流程参数
*/
public static String SYS_PARAM_FLOW_KEY = "oneThingKey";
}
package com.mortals.xhx.common.keys;
/**
* 关键操作失败时,用来缓存数据的logger名称
*
* @author karlhoo
*/
public interface CacheLoggers {
}
package com.mortals.xhx.common.keys;
/**
* rabbit 队列key定义
*/
public class QueueKey {
public static final String ACCESS_LOG_QUEUE = "ACCESS_LOG_QUEUE";
public static final String BIZ_LOG_QUEUE = "BIZ_LOG_QUEUE";
public static final String ERROR_LOG_QUEUE = "ERROR_LOG_QUEUE";
public static final String OPERATION_LOG_QUEUE = "OPERATION_LOG_QUEUE";
public static final String EXCHANGE = "LOG";
public static final String ROUTING_KEY = "LOG_ROUTING_KEY";
}
package com.mortals.xhx.common.keys;
/**
* redis缓存参数key
*
* @author karlhoo
*/
public final class RedisCacheKeys {
/**
* @return 文件访问的地址
*/
public static String getFileUrlKey() {
return "params:file:upload";
}
public static String getCoopsDistributedLockKey() {
return "coops:distributed:lock";
}
}
package com.mortals.xhx.common.keys;
/**
* 服务调用响应常量
*
* @author karlhoo
*/
public interface ResponseConstants {
/**
* 请求结果Code主键
*/
String KEY_RESULT_CODE = "code";
/**
* 请求结果Message主键
*/
String KEY_RESULT_MSG = "msg";
/**
* 请求结果Code值-成功
*/
int RESULT_VALUE_SUCCESS = 1;
/**
* 请求结果Code值-失败
*/
int RESULT_VALUE_FAILURE = -1;
}
\ No newline at end of file
package com.mortals.xhx.common.pdu;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.web.BaseForm;
public class LoginForm extends BaseForm {
private String loginName;
private String password;
private String securityCode;
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSecurityCode() {
return securityCode;
}
public void setSecurityCode(String securityCode) {
this.securityCode = securityCode;
}
@Override
public String toString() {
return "loginName:" + this.loginName + " password:" + this.password;
}
@Override
public boolean validate() throws AppException {
if (loginName == null || loginName.trim().length() == 0) {
throw new AppException("帐号不能为空!");
}
if (password == null || password.trim().length() == 0) {
throw new AppException("密码不能为空!");
}
// if (securityCode == null || securityCode.trim().length() == 0) {
// throw new AppException("验证码不能为空!");
// }
return super.validate();
}
}
package com.mortals.xhx.common.pdu;
import com.mortals.framework.model.PageInfo;
import lombok.Data;
/**
* @author: zxfei
* @date: 2022/7/13 14:17
* @description:
**/
@Data
public class RespData<T> {
private T data;
private T entity;
private PageInfo pageInfo;
public static void main(String[] args) {
String resp="";
//JSON.parseObject()
}
}
package com.mortals.xhx.common.pdu;
import lombok.Data;
import java.util.List;
@Data
public class UploadDeviceReq {
/**
* 行为
*/
private String action;
private List<String> deviceCodeList;
private String content;
}
package com.mortals.xhx.common.pdu.device;
import com.alibaba.fastjson.JSON;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
@Data
public class DeviceMsgReqPdu implements Serializable {
/**
* 设备编码
*/
private String deviceCode;
private String productCode;
private Long siteid;
/**
* 消息类型
*/
private String messageType;
/**
* 时间戳(毫秒)
*/
private Long timestamp;
/**
* 消息内容
*/
private String data;
public static void main(String[] args) {
ArrayList<DeviceMsgReqPdu> deq = new ArrayList<>();
DeviceMsgReqPdu deviceMsgReq = new DeviceMsgReqPdu();
deviceMsgReq.setDeviceCode("a1");
deviceMsgReq.setMessageType("heart_beat");
deviceMsgReq.setData("{xxxx}");
deviceMsgReq.setTimestamp(new Date().getTime());
deq.add(deviceMsgReq);
deviceMsgReq = new DeviceMsgReqPdu();
deviceMsgReq.setDeviceCode("a2");
deviceMsgReq.setMessageType("heart_beat");
deviceMsgReq.setData("{bbbbbb}");
deviceMsgReq.setTimestamp(new Date().getTime());
deq.add(deviceMsgReq);
System.out.println(JSON.toJSONString(deq));
}
}
package com.mortals.xhx.common.pdu.device;
import com.mortals.framework.model.BaseEntityLong;
import lombok.Data;
/**
* 设备Pdu对象
*
* @author zxfei
* @date 2023-02-25
*/
@Data
public class DevicePdu extends BaseEntityLong {
private static final long serialVersionUID = 1L;
/**
* 设备id
*/
private Long deviceId;
/**
* 设备名称
*/
private String deviceName;
/**
* 设备编码
*/
private String deviceCode;
/**
* 设备的MAC地址
*/
private String deviceMac;
/**
* 站点Id
*/
private Long siteId;
/**
* 站点编号,来源基础服务平台
*/
private String siteCode;
/**
* 站点名称
*/
private String siteName;
/**
* 产品编码
*/
private String productCode;
/**
* 产品名称
*/
private String productName;
/**
* 设备来源(0.子设备,1.网关设备,2.直连设备)
*/
private Integer deviceSrc;
/**
* 经度
*/
private String lon;
/**
* 纬度
*/
private String lati;
/**
* 负责人
*/
private String leadingOfficial;
/**
* 联系电话
*/
private String leadingOfficialTelephone;
/**
* 设备状态 (0.未激活,1.离线,2.在线)
*/
private Integer deviceStatus;
/**
* 备注
*/
private String deviceRemark;
/**
* 设备来源(0.旧设备,1.新设备)
*/
private Integer source;
public void initAttrValue(){
this.deviceId = null;
this.deviceName = null;
this.deviceCode = null;
this.deviceMac = null;
this.siteId = null;
this.siteCode = null;
this.siteName = null;
this.productCode = null;
this.productName = null;
this.deviceSrc = 2;
this.lon = null;
this.lati = null;
this.leadingOfficial = null;
this.leadingOfficialTelephone = null;
this.deviceStatus = null;
this.deviceRemark = null;
this.source = 1;
}
}
\ No newline at end of file
package com.mortals.xhx.common.pdu.device;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class DeviceReq implements Serializable {
/**
* 1:新增,2:修改,3:删除,4:激活,5:启用,6:停用
*/
private Integer receiveMethod;
/**
* 产品id
*/
private Long productId;
/**
* 产品编码
*/
private String productCode;
/**
* 设备生产厂商ID
*/
private Long deviceFirmId;
/**
* 设备生产厂商名称
*/
private String deviceFirmname;
/**
* 设备名称
*/
private String deviceName;
/**
* 设备编码(暂定mac地址)
*/
private String deviceCode;
/**
* 设备Mac
*/
private String deviceMac;
/**
* 所属站点Id
*/
private Long siteId;
/**
* 所属站点编码
*/
private String siteCode;
/**
* 所属站点名称
*/
private String siteName;
/**
* 设备备注信息
*/
private String deviceRemark;
/**
* 设备
*/
private String homeUrl;
/**
* 设备访问ip
*/
private String ip;
/**
* 中心设备编码
*/
private String centernum;
/**
* 端口
*/
private String port;
/**
* 经度
*/
private String lon;
/**
* 纬度
*/
private String lati;
/**
* 楼层
*/
private Integer deviceInBuilding;
/**
* 所属楼栋
*/
private Integer deviceInFloor;
/**
* 负责人
*/
private String leadingOfficial;
/**
* 联系电话
*/
private String leadingOfficialTelephone;
/**
* 保修期至
*/
private Date defectsLiabilityPeriod;
/**
* 设备状态 (0.未激活,1.离线,2.在线)
*/
private Integer deviceStatus;
/**
* 设备来源(0.旧设备,1.新设备)
*/
private Integer source;
/**
* 激活(0.否,1.是)
*/
private Integer active;
/**
* 设备版本信息
*/
private String deviceVersion;
}
package com.mortals.xhx.feign;
public interface IFeign {
}
package com.mortals.xhx.feign.device;
import com.mortals.framework.common.Rest;
import com.mortals.xhx.common.pdu.LoginForm;
import com.mortals.xhx.common.pdu.RespData;
import com.mortals.xhx.common.pdu.device.DevicePdu;
import com.mortals.xhx.common.pdu.device.DeviceReq;
import com.mortals.xhx.feign.IFeign;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 设备 Feign接口
*
* @author zxfei
* @date 2023-02-25
*/
@FeignClient(name = "device-manager", path = "/m", fallbackFactory = DeviceFeignFallbackFactory.class)
public interface IDeviceFeign extends IFeign {
/**
* 查看设备列表
*
* @param devicePdu
* @return
*/
@PostMapping(value = "/device/list")
Rest<RespData<List<DevicePdu>>> list(@RequestBody DevicePdu devicePdu);
/**
* 查看设备
*
* @param id
* @return
*/
@GetMapping(value = "/device/info")
Rest<DevicePdu> info(@RequestParam(value = "id") Long id);
/**
* 设备保存更新
*
* @param devicePdu
* @return
*/
@PostMapping(value = "/device/save")
Rest<RespData<DevicePdu>> save(@RequestBody DevicePdu devicePdu, @RequestHeader("Authorization") String authorization);
/**
* 获取token
*
* @param loginForm
* @return
*/
@PostMapping(value = "/api/getToken")
Rest<String> getToken(@RequestBody LoginForm loginForm);
/**
* 设备回调
*
* @param deviceReq
* @return
*/
@PostMapping(value = "/api/receive")
Rest<String> deviceCall(@RequestBody DeviceReq deviceReq, @RequestHeader("Authorization") String authorization);
}
@Slf4j
@Component
class DeviceFeignFallbackFactory implements FallbackFactory<IDeviceFeign> {
@Override
public IDeviceFeign create(Throwable t) {
return new IDeviceFeign() {
@Override
public Rest<RespData<List<DevicePdu>>> list(DevicePdu devicePdu) {
return Rest.fail("暂时无法获取设备列表,请稍后再试!");
}
@Override
public Rest<DevicePdu> info(Long id) {
return Rest.fail("暂时无法获取设备详细,请稍后再试!");
}
@Override
public Rest<RespData<DevicePdu>> save(DevicePdu devicePdu, String authorization) {
return Rest.fail("暂时无法保存设备,请稍后再试!");
}
@Override
public Rest<String> getToken(LoginForm loginForm) {
return Rest.fail("暂时无法获取token,请稍后再试!");
}
@Override
public Rest<String> deviceCall(DeviceReq deviceReq, String authorization) {
return Rest.fail("暂时无法保存设备,请稍后再试!");
}
};
}
}
package com.mortals.xhx.feign.device;
import com.mortals.framework.common.Rest;
import com.mortals.xhx.common.pdu.UploadDeviceReq;
import com.mortals.xhx.common.pdu.device.DeviceMsgReqPdu;
import com.mortals.xhx.feign.IFeign;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
* 设备 消息 Feign接口
*
* @author zxfei
* @date 2023-02-25
*/
@FeignClient(name = "device-manager", path = "/m", fallbackFactory = DeviceFeignFallbackFactory.class)
public interface IDeviceMessageFeign extends IFeign {
/**
* 设备消息通知
*
* @param devicePdu
* @return
*/
@PostMapping(value = "/api/callbackByProduct")
Rest<String> callbackByProduct(@RequestBody DeviceMsgReqPdu devicePdu);
/**
* 设备消息 下发
*
* @param req
* @return
*/
@PostMapping(value = "/notify/downMsg")
Rest<String> downMsg(@RequestBody UploadDeviceReq req);
}
@Slf4j
@Component
class DeviceMessageFeignFallbackFactory implements FallbackFactory<IDeviceMessageFeign> {
@Override
public IDeviceMessageFeign create(Throwable t) {
return new IDeviceMessageFeign() {
@Override
public Rest<String> callbackByProduct(DeviceMsgReqPdu devicePdu) {
return Rest.fail("发送消息失败,请稍后再试!");
}
@Override
public Rest<String> downMsg(UploadDeviceReq req) {
return Rest.fail("发送消息失败,请稍后再试!");
}
};
}
}
package com.mortals.xhx.feign.user;
import com.mortals.xhx.common.pdu.RespData;
import com.mortals.xhx.common.pdu.user.UserPdu;
import com.alibaba.fastjson.JSON;
import com.mortals.framework.common.Rest;
import com.mortals.xhx.feign.IFeign;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 用户信息业务 Feign接口
* @author zxfei
* @date 2022-07-06
*/
@FeignClient(name = "portal-manager", path = "/zwfw", fallbackFactory = UserFeignFallbackFactory.class)
public interface IUserFeign extends IFeign {
/**
* 查看用户信息业务列表
*
* @param userPdu
* @return
*/
@PostMapping(value = "/user/list")
Rest<RespData<List<UserPdu>>> list(@RequestBody UserPdu userPdu);
/**
* 查看用户信息业务
*
* @param id
* @return
*/
@GetMapping(value = "/user/info")
Rest<UserPdu> info(@RequestParam(value = "id") Long id);
/**
* 删除用户信息业务
*
* @param ids
* @return
*/
@GetMapping(value = "/user/delete")
Rest<Void> delete(Long[] ids,@RequestHeader("Authorization") String authorization);
/**
* 用户信息业务保存更新
*
* @param userPdu
* @return
*/
@PostMapping(value = "/user/save")
Rest<RespData<UserPdu>> save(@RequestBody UserPdu userPdu,@RequestHeader("Authorization") String authorization);
@PostMapping(value = "/login/login")
String portalLogin(@RequestBody UserPdu userPdu);
/**
* 查询用户列表
*
* @param userPdu
* @return
*/
@PostMapping("/api/user/findAllUser")
String findAllUser(@RequestBody UserPdu userPdu);
/**
* 获取token
*
* @param
* @return
*/
@PostMapping(value = "/user/token")
Rest<String> getToken(@RequestParam(value = "userKey") String userKey);
}
@Slf4j
@Component
class UserFeignFallbackFactory implements FallbackFactory<IUserFeign> {
@Override
public IUserFeign create(Throwable t) {
return new IUserFeign() {
@Override
public Rest<RespData<List<UserPdu>>> list(UserPdu userPdu) {
return Rest.fail("暂时无法获取用户信息业务列表,请稍后再试!");
}
@Override
public Rest<UserPdu> info(Long id) {
return Rest.fail("暂时无法获取用户信息业务详细,请稍后再试!");
}
@Override
public Rest<Void> delete(Long[] ids, String authorization) {
return Rest.fail("暂时无法删除用户信息业务,请稍后再试!");
}
@Override
public Rest<RespData<UserPdu>> save(UserPdu userPdu, String authorization) {
return Rest.fail("暂时无法保存用户信息业务,请稍后再试!");
}
@Override
public String portalLogin(UserPdu userPdu) {
return JSON.toJSONString(Rest.fail("登录失败!"));
}
@Override
public String findAllUser(UserPdu userPdu) {
return null;
}
@Override
public Rest<String> getToken(String userKey) {
return Rest.fail("token获取失败");
}
};
}
}
package com.mortals.xhx.system;
import com.alibaba.fastjson.JSON;
import com.mortals.framework.model.AccessLogPdu;
import com.mortals.framework.model.BizLogPdu;
import com.mortals.framework.model.ErrorLogPdu;
import com.mortals.framework.model.OperateLogPdu;
import com.mortals.framework.service.IMessageProduceService;
import com.mortals.xhx.common.keys.QueueKey;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
@Component
@Primary
@Slf4j
public class MessageProducer implements IMessageProduceService {
@Autowired
private RabbitTemplate rabbitTemplate;
public void syncAccessSend(AccessLogPdu accessLogPdu) {
//new Message(JSON.toJSONString(accessLogPdu).getBytes(StandardCharsets.UTF_8))
//rabbitTemplate.send(QueueKey.EXCHANGE, QueueKey.ACCESS_LOG_QUEUE,new Message(JSON.toJSONString(accessLogPdu).getBytes(StandardCharsets.UTF_8)));
rabbitTemplate.convertAndSend(QueueKey.EXCHANGE, QueueKey.ACCESS_LOG_QUEUE, JSON.toJSONString(accessLogPdu));
//rabbitTemplate.convertAndSend(QueueKey.EXCHANGE, QueueKey.ACCESS_LOG_QUEUE, accessLogPdu);
}
@Override
public void syncBizSend(BizLogPdu bizLogPdu) {
rabbitTemplate.convertAndSend(QueueKey.EXCHANGE, QueueKey.BIZ_LOG_QUEUE, JSON.toJSONString(bizLogPdu));
}
@Override
public void syncErrorSend(ErrorLogPdu errorLogPdu) {
rabbitTemplate.convertAndSend(QueueKey.EXCHANGE, QueueKey.ERROR_LOG_QUEUE, JSON.toJSONString(errorLogPdu));
}
@Override
public void syncOperSend(OperateLogPdu operLogPdu) {
rabbitTemplate.convertAndSend(QueueKey.EXCHANGE, QueueKey.OPERATION_LOG_QUEUE, JSON.toJSONString(operLogPdu));
}
}
/*
package com.mortals.pstation.tools.lock.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
*/
/**
* @author karlhoo
*//*
@Data
@Configuration
@ConditionalOnProperty("application.zookeeper.nodes")
public class ZookeeperConfiguration {
*/
/* *//*
*/
/**
* zookeeper节点地址
*//*
*/
/*
@Value("${application.zookeeper.nodes}")
private String zookeeperNodes;
*//*
*/
/**
* session连接超时时间(单位:ms)
*//*
*/
/*
@Value("${application.zookeeper.session-timeout-ms:60000}")
private Integer sessionTimeoutMs;
*//*
*/
/**
* 连接超时时间(单位:ms)
*//*
*/
/*
@Value("${application.zookeeper.connection-timeout-ms:5000}")
private Integer connectionTimeoutMs;
*//*
*/
/**
* 连接失败最大重试次数
*//*
*/
/*
@Value("${application.zookeeper.max-retry:3}")
private Integer maxRetry;
*//*
*/
/**
* 连接失败重试间隔时间(单位:ms)
*//*
*/
/*
@Value("${application.zookeeper.retry-interval-ms:1000}")
private Integer retryIntervalMs;
*//*
*/
/**
* 获取锁超时时间(单位:sec)
*//*
*/
/*
@Value("${application.zookeeper.lock-timeout-sec:5}")
private Integer lockTimeoutSec;
*//*
*/
/**
* 使用者标识
*//*
*/
/*
@Value("${application.user.mark}")
private String userMark;
*//*
*/
/**
* 配置文件标识
*//*
*/
/*
@Value("${spring.cloud.config.profile}")
private String configProfile;*//*
}
*/
package com.mortals.xhx.tools.lock.service;
import com.mortals.framework.exception.AppException;
import org.springframework.validation.annotation.Validated;
/**
* @author karlhoo
* <p>
* 分布式锁的加锁和解锁
*/
@Validated
public interface ILockService {
/**
* 分布式锁-加锁
*
* @param lockKey
* @return true 成功
*/
boolean lock(String lockKey);
/**
* 分布式锁-加锁
*
* @param lockKey
* @param unlockSec 自动解锁失效,单位:秒
* @return true 成功
*/
boolean lock(String lockKey, Long unlockSec);
/**
* 分布式锁-解锁(和lock方法成对使用,加锁后一定要解锁)
* @return
* @throws AppException
*/
boolean unlock() throws AppException;
}
//package com.mortals.pstation.tools.lock.service.impl;
//
//import com.mortals.pstation.tools.lock.config.ZookeeperConfiguration;
//import com.mortals.pstation.tools.lock.service.ILockService;
//import lombok.extern.apachecommons.CommonsLog;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.curator.framework.CuratorFramework;
//import org.apache.curator.framework.CuratorFrameworkFactory;
//import org.apache.curator.framework.recipes.locks.InterProcessMutex;
//import org.apache.curator.retry.RetryNTimes;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
//import org.springframework.stereotype.Service;
//
//import javax.annotation.PostConstruct;
//import java.util.concurrent.TimeUnit;
//
///**
// * @author karlhoo
// */
//@CommonsLog
//@Service("defaultLockService")
//@ConditionalOnBean(ZookeeperConfiguration.class)
//public class DefaultLockServiceImpl implements ILockService {
// @Autowired
// private ZookeeperConfiguration zookeeperConfiguration;
// private CuratorFramework curatorClient;
// private String LOCK_KEY_PREFIX;
// private ThreadLocal<InterProcessMutex> interProcessMutexThreadLocal = new ThreadLocal<>();
//
// @Override
// public boolean lock(String lockKey) {
// InterProcessMutex lock = new InterProcessMutex(getCuratorClient(), LOCK_KEY_PREFIX + (StringUtils.isBlank(lockKey) ? "/" : lockKey));
// try {
// if (lock.acquire(zookeeperConfiguration.getLockTimeoutSec(), TimeUnit.SECONDS)) {
// interProcessMutexThreadLocal.set(lock);
// return true;
// }
// } catch (Exception e) {
// log.warn("获取分布式锁报错", e);
// }
// return false;
// }
//
// @Override
// public void unlock() {
// try {
// interProcessMutexThreadLocal.get().release();
// } catch (Exception e) {
// log.warn("释放分布式锁报错", e);
// } finally {
// interProcessMutexThreadLocal.remove();
// }
// }
//
// private CuratorFramework getCuratorClient() {
// if (curatorClient == null) {
// this.curatorClient = CuratorFrameworkFactory.newClient(
// zookeeperConfiguration.getZookeeperNodes(), zookeeperConfiguration.getSessionTimeoutMs(),
// zookeeperConfiguration.getConnectionTimeoutMs(), new RetryNTimes(zookeeperConfiguration.getMaxRetry(), zookeeperConfiguration.getRetryIntervalMs()));
// this.curatorClient.start();
// }
// return this.curatorClient;
// }
//
// @PostConstruct
// public void init() {
// StringBuilder lockKeyPrefixBuilder = new StringBuilder("/sms/lock/");
// if (StringUtils.isNotEmpty(zookeeperConfiguration.getUserMark())) {
// lockKeyPrefixBuilder.append(zookeeperConfiguration.getUserMark()).append("/");
// }
// if (StringUtils.isNotEmpty(zookeeperConfiguration.getConfigProfile())) {
// lockKeyPrefixBuilder.append(zookeeperConfiguration.getConfigProfile()).append("/");
// }
// LOCK_KEY_PREFIX = lockKeyPrefixBuilder.toString();
// }
//}
//
package com.mortals.xhx.tools.lock.service.impl;
import com.mortals.framework.service.ICacheService;
import com.mortals.xhx.common.keys.RedisCacheKeys;
import com.mortals.xhx.tools.lock.service.ILockService;
import lombok.extern.apachecommons.CommonsLog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
/**
* redis 实现分布式锁机制
* @author zxfei
*/
@CommonsLog
@Service("redisLockService")
//@ConditionalOnProperty("application.cache.redis")
public class RedisLockServiceImpl implements ILockService {
private static ThreadLocal<String> threadLocal = new ThreadLocal<>();
@Autowired
private ICacheService cacheService;
@Override
public boolean lock(String lockKey) {
return lock(lockKey, null);
}
@Override
public boolean lock(String lockKey, Long unlockSec) {
try {
boolean ret;
if (ObjectUtils.isEmpty(unlockSec)) {
ret = cacheService.hincrBy(RedisCacheKeys.getCoopsDistributedLockKey(), lockKey, 1) == 1;
} else {
ret = cacheService.hincrByForTime(RedisCacheKeys.getCoopsDistributedLockKey(), lockKey, 1, unlockSec) == 1;
}
if (ret) {
threadLocal.set(lockKey);
}
return ret;
} catch (Exception e) {
log.error(String.format("分布式加锁出错 lockKey:%s%s", lockKey, ObjectUtils.isEmpty(unlockSec) ? "" : ",unlockSec:" + unlockSec), e);
return false;
}
}
@Override
public boolean unlock() {
try {
cacheService.hdel(RedisCacheKeys.getCoopsDistributedLockKey(), threadLocal.get());
threadLocal.remove();
return true;
} catch(Exception e) {
log.error(String.format("分布式解锁出错 lockKey:%s", threadLocal.get()), e);
return false;
}
}
}
package com.mortals.xhx.tools.uid;
public interface ISeqGeneratorService {
/**
* 分布式订单号(本地生成)
* <p>
* 平台唯一ID,返馈给下游进行订单回执关联以及对帐,以及提供给上游订单号中的一部份
*
* @param workerId 工作主机ID(取值:0 ~ 1023)
* @return 18位的数字
*/
long nextOrderId(int workerId);
/**
* 解析分布式订单号
*
* @param orderId
* @return [0]:距离当前的毫秒时间,[1]:工作主机ID,[2]:序号
*/
Long[] parserOrderId(long orderId);
}
package com.mortals.xhx.tools.uid.impl;
import com.mortals.xhx.tools.uid.ISeqGeneratorService;
import org.springframework.stereotype.Service;
@Service("seqGeneratorService")
public class DefaultSeqGeneratorService implements ISeqGeneratorService {
@Override
public long nextOrderId(int workerId) {
return SeqGenerator.nextId(workerId);
}
@Override
public Long[] parserOrderId(long orderId) {
return SeqGenerator.parserId(orderId);
}
}
package com.mortals.xhx.tools.uid.impl;
public class SeqGenerator {
/**
* 开始时间截 (2017-01-01)
*/
private static final long twepoch = 1483200000000L;
/**
* 时间所占的位数
*/
private static final long timestampBits = 41L;
/**
* 机器id所占的位数
*/
private static final long workerIdBits = 10L;
/**
* 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数)
*/
private static final long maxWorkerId = -1L ^ (-1L << workerIdBits);
/**
* 序列在id中占的位数
*/
private static final long sequenceBits = 12L;
/**
* 机器ID向左移12位
*/
private static final long workerIdShift = sequenceBits;
/**
* 时间截向左移22位(10+12)
*/
private static final long timestampLeftShift = sequenceBits + workerIdBits;
/**
* 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095)
*/
private static final long sequenceMask = -1L ^ (-1L << sequenceBits);
/**
* 毫秒内序列(0~4095)
*/
private static long sequence = 0L;
/**
* 上次生成ID的时间截
*/
private static long lastTimestamp = -1L;
/**
* 分布式订单号<br>
* 为一个64位Long型数字,结构如下(每部分用-分开):<br>
* 0 - 0000000000 0000000000 0000000000 0000000000 0 - 0000000000 - 000000000000 <br>
* 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0<br>
* 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截),
* 这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序twepoch属性)。
* 41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69<br>
* 10位的数据机器位,可以部署在1024个节点<br>
* 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号
*
* @param workerId 工作主机ID(取值:0 ~ 1023)
*/
public static synchronized long nextId(int workerId) {
if (workerId > maxWorkerId || workerId < 0) {
throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
}
long timestamp = timeGen();
//如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常
if (timestamp < lastTimestamp) {
throw new RuntimeException(
String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
}
//如果是同一时间生成的,则进行毫秒内序列
if (lastTimestamp == timestamp) {
sequence = (sequence + 1) & sequenceMask;
//毫秒内序列溢出
if (sequence == 0) {
//阻塞到下一个毫秒,获得新的时间戳
timestamp = tilNextMillis(lastTimestamp);
}
}
//时间戳改变,毫秒内序列重置
else {
sequence = 0L;
}
//上次生成ID的时间截
lastTimestamp = timestamp;
//移位并通过或运算拼到一起组成64位的ID
// System.out.println(String.format("timestamp:%d, workerId:%d, sequence:%d", timestamp - twepoch, workerId, sequence));
return ((timestamp - twepoch) << timestampLeftShift)
| (workerId << workerIdShift)
| sequence;
}
public static synchronized Long[] parserId(long id) {
long timestamp = id >>> timestampLeftShift;
long workerId = id << timestampBits + 1;
workerId = workerId >>> timestampBits + sequenceBits + 1;
long sequence = id << timestampBits + workerIdBits + 1;
sequence = sequence >>> timestampBits + workerIdBits + 1;
// System.out.println(String.format("timestamp:%d, workerId:%d, sequence:%d", timestamp, workerId, sequence));
return new Long[]{timestamp + twepoch, workerId, sequence};
}
/**
* 阻塞到下一个毫秒,直到获得新的时间戳
*
* @param lastTimestamp 上次生成ID的时间截
* @return 当前时间戳
*/
private static long tilNextMillis(long lastTimestamp) {
long timestamp = timeGen();
while (timestamp <= lastTimestamp) {
timestamp = timeGen();
}
return timestamp;
}
/**
* 返回以毫秒为单位的当前时间
*
* @return 当前时间(毫秒)
*/
private static long timeGen() {
return System.currentTimeMillis();
}
public static void main(String[] args) {
long id = nextId(1000);
System.out.println(id);
parserId(id);
}
}
\ No newline at end of file
package com.mortals.xhx.utils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import java.util.HashSet;
import java.util.Set;
public class BeanUtil
{
/**
*
* @Title: getNullPropertyNames
* @Description: 获取一个对象中属性值为null的属性名字符串数组
* @param source
* @return
*/
public static String[] getNullPropertyNames (Object source) {
final BeanWrapper src = new BeanWrapperImpl(source);
java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
Set<String> emptyNames = new HashSet<String>();
for(java.beans.PropertyDescriptor pd : pds) {
Object srcValue = src.getPropertyValue(pd.getName());
if (srcValue == null) emptyNames.add(pd.getName());
}
String[] result = new String[emptyNames.size()];
return emptyNames.toArray(result);
}
}
package com.mortals.xhx.utils;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
public class IotThreadFactory implements ThreadFactory {
private static final AtomicInteger poolNumber = new AtomicInteger(1);
private final ThreadGroup group;
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;
public static IotThreadFactory forName(String name) {
return new IotThreadFactory(name);
}
private IotThreadFactory(String name) {
SecurityManager s = System.getSecurityManager();
group = (s != null) ? s.getThreadGroup() :
Thread.currentThread().getThreadGroup();
namePrefix = name + "-" +
poolNumber.getAndIncrement() +
"-thread-";
}
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(group, r,
namePrefix + threadNumber.getAndIncrement(),
0);
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
}
package com.mortals.xhx.utils;//package com.mortals.coops.utils;
//
//import javax.validation.Constraint;
//import javax.validation.ConstraintValidator;
//import javax.validation.ConstraintValidatorContext;
//import javax.validation.Payload;
//import java.lang.annotation.*;
//import java.time.LocalDate;
//
//@Target({ElementType.FIELD})
//@Retention(RetentionPolicy.RUNTIME)
//@Constraint(validatedBy = PastLocalDate.PastValidator.class)
//@Documented
//public @interface PastLocalDate {
// String message() default "{javax.validation.constraints.Past.message}";
//
// Class<?>[] groups() default {};
//
// Class<? extends Payload>[] payload() default {};
//
// class PastValidator implements ConstraintValidator<PastLocalDate,
// LocalDate> {
// public void initialize(PastLocalDate past) {
// }
//
// public boolean isValid(LocalDate localDate,
// ConstraintValidatorContext context) {
// return localDate == null || localDate.isBefore(LocalDate.now());
// }
// }
//}
package com.mortals.xhx.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* @ClassName SpringUtils
* @Description TODO
* @Author finegirl
* @Date 2020/4/24 15:32
**/
@Component
public class SpringUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringUtils.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 对应的被管理类有别名时使用
* @param name
* @param <T>
* @return
* @throws BeansException
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) throws BeansException {
return (T) applicationContext.getBean(name);
}
/**
* 在对应的注解内未使用别名时 使用
*/
public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment