commit 889a3d26acc948300687efd26a662fceec0d40e7 Author: Yang Haoyu <2241399212@qq.com> Date: Mon Nov 20 20:02:29 2023 +0800 初始化 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/fance-menghang-common/.gitignore b/fance-menghang-common/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/fance-menghang-common/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/fance-menghang-common/pom.xml b/fance-menghang-common/pom.xml new file mode 100644 index 0000000..78d97c0 --- /dev/null +++ b/fance-menghang-common/pom.xml @@ -0,0 +1,73 @@ + + + 4.0.0 + + com.fate + fate-fence + 3.6.3 + + + org.example + fance-menghang-common + + + 17 + 17 + UTF-8 + + + + + + com.fate + fate-common-core + + + com.fate + fate-common-redis + + + org.projectlombok + lombok + + + com.fasterxml.jackson.core + jackson-annotations + + + org.springframework.boot + spring-boot-actuator-autoconfigure + + + com.baomidou + mybatis-plus-boot-starter + 3.5.0 + + + + com.fate + fate-common-datasource + + + + + com.fate + fate-common-datascope + + + + + com.fate + fate-common-log + + + + + com.fate + fate-common-swagger + + + + diff --git a/fance-menghang-common/src/main/java/com/shiyi/internet/domain/Battery.java b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/Battery.java new file mode 100644 index 0000000..a35ee5e --- /dev/null +++ b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/Battery.java @@ -0,0 +1,63 @@ +package com.shiyi.internet.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fate.common.core.annotation.Excel; +import com.fate.common.core.web.domain.BaseEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @Description : 车辆电池信息基类 + * @Author : YHY + * @Date: 2023-11-20 09:04 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("t_battery") +public class Battery extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("电池ID") + @TableId(value = "battery_id", type = IdType.AUTO) + private Integer batteryId; + + @ApiModelProperty("电池编号") + @TableField("battery_coding") + private Integer batteryCoding; + + @ApiModelProperty("电池类型") + @TableField("battery_type") + private String batteryType; + + @ApiModelProperty("电池容量") + @TableField("battery_capacity") + private Integer batteryCapacity; + + @ApiModelProperty("电池电压") + @TableField("battery_actual_voltage") + private BigDecimal batteryActualVoltage; + + @ApiModelProperty("电池质量") + @TableField("battery_actual_mass") + private Integer batteryActualMass; + + @ApiModelProperty("出厂时间") + @TableField("battery_delivery_time") + private Date batteryDeliveryTime; +} diff --git a/fance-menghang-common/src/main/java/com/shiyi/internet/domain/Car.java b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/Car.java new file mode 100644 index 0000000..e4902c5 --- /dev/null +++ b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/Car.java @@ -0,0 +1,63 @@ +package com.shiyi.internet.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fate.common.core.web.domain.BaseEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * @Description : 车辆基类 + * @Author : YHY + * @Date: 2023-11-19 20:56 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("t_car") +public class Car extends BaseEntity { + + @ApiModelProperty("车辆ID") + @TableId(value = "car_id", type = IdType.AUTO) + private Integer carId; + + @ApiModelProperty("车辆名称") + @TableField("car_name") + private String carName; + + @ApiModelProperty("车辆牌号") + @TableField("car_license") + private String carLicense; + + @ApiModelProperty("车辆状态") + @TableField("driving_id") + private Integer drivingId; + + @ApiModelProperty("车辆类型") + @TableField("type_id") + private Integer typeId; + + @ApiModelProperty("车辆围栏") + @TableField("fence_id") + private Integer fenceId; + + @ApiModelProperty("车辆零件ID") + @TableField("drive_id") + private Integer driveId; + + @ApiModelProperty("车辆电池") + @TableField("battery_id") + private Integer batteryId; + + @ApiModelProperty("车辆位置") + @TableField("car_address") + private String carAddress; +} diff --git a/fance-menghang-common/src/main/java/com/shiyi/internet/domain/Drive.java b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/Drive.java new file mode 100644 index 0000000..2269325 --- /dev/null +++ b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/Drive.java @@ -0,0 +1,42 @@ +package com.shiyi.internet.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fate.common.core.web.domain.BaseEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * @Description : 车辆零件驱动 + * @Author : YHY + * @Date: 2023-11-20 09:02 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("t_drive") +public class Drive extends BaseEntity { + + + @ApiModelProperty("驱动零件ID") + @TableField("drive_id") + private String driveId; + + @ApiModelProperty("配件型号") + @TableField("drive_name") + private String driveName; + + @ApiModelProperty("配件编号") + @TableField("drive_part_number") + private String drivePartNumber; + + @ApiModelProperty("生产厂商名称") + @TableField("drive_generate_name") + private String driveGenerateName; +} diff --git a/fance-menghang-common/src/main/java/com/shiyi/internet/domain/DrivingRecord.java b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/DrivingRecord.java new file mode 100644 index 0000000..bc5acdf --- /dev/null +++ b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/DrivingRecord.java @@ -0,0 +1,45 @@ +package com.shiyi.internet.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fate.common.core.web.domain.BaseEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.util.Date; + +/** + * @Description : 车辆行驶记录 + * @Author : YHY + * @Date: 2023-11-20 09:57 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("t_driving") +public class DrivingRecord extends BaseEntity { + + @ApiModelProperty("状态ID") + @TableId(value = "driving_id", type = IdType.AUTO) + private Integer drivingId ; + + @ApiModelProperty("车辆vin") + @TableField("driving_vin") + private String drivingVin ; + + @ApiModelProperty("上线时间") + @TableId(value = "driving_starttime") + private Date drivingStarttime ; + + @ApiModelProperty("下线时间") + @TableId(value = "driving_endtime") + private Date drivingEndtime ; +} diff --git a/fance-menghang-common/src/main/java/com/shiyi/internet/domain/Fencing.java b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/Fencing.java new file mode 100644 index 0000000..e75e2ea --- /dev/null +++ b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/Fencing.java @@ -0,0 +1,48 @@ +package com.shiyi.internet.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fate.common.core.web.domain.BaseEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * @Description : 电子围栏基类 + * @Author : YHY + * @Date: 2023-11-18 13:01 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("t_fencing") +public class Fencing extends BaseEntity { + + @ApiModelProperty(name = "电子围栏ID",notes = "") + private Integer fencingId ; + /** 围栏名称 */ + @ApiModelProperty(name = "围栏名称",notes = "") + private String fencingName ; + /** 围栏经纬度 */ + @ApiModelProperty(name = "围栏经纬度",notes = "") + private String fencingLat ; + /** 激活状态 */ + @ApiModelProperty(name = "激活状态",notes = "") + private Integer fencingStatus ; + /** 操作时间 */ + @ApiModelProperty(name = "操作时间",notes = "") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date fencingTime ; + /** 操作者 */ + @ApiModelProperty(name = "操作者",notes = "") + private Integer createUserId ; +} diff --git a/fance-menghang-common/src/main/java/com/shiyi/internet/domain/response/ResponseCar.java b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/response/ResponseCar.java new file mode 100644 index 0000000..4e17d0b --- /dev/null +++ b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/response/ResponseCar.java @@ -0,0 +1,109 @@ +package com.shiyi.internet.domain.response; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @ClassName : ResponseCar + * @Description : 车辆系统响应 + * @Author : YHY + * @Date: 2023-11-19 21:02 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ResponseCar { + /** 车辆ID */ + @ApiModelProperty(name = "车辆ID",notes = "") + private Integer carId ; + /** 车辆名称 */ + @ApiModelProperty(name = "车辆名称",notes = "") + private String carName ; + /** 车辆牌号 */ + @ApiModelProperty(name = "车辆牌号",notes = "") + private String carLicense ; + /** 状态ID */ + @ApiModelProperty(name = "状态ID",notes = "") + private Integer drivingId ; + /** 车辆vin */ + @ApiModelProperty(name = "车辆vin",notes = "") + private String drivingVin ; + /** 上线时间 */ + @ApiModelProperty(name = "上线时间",notes = "") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date drivingStarttime ; + /** 下线时间 */ + @ApiModelProperty(name = "下线时间",notes = "") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date drivingEndtime ; + /** 车辆类型 */ + @ApiModelProperty(name = "车辆类型",notes = "") + private Integer typeId ; + /** 车辆围栏 */ + @ApiModelProperty(name = "车辆围栏",notes = "") + private Integer fenceId ; + /** 围栏名称 */ + @ApiModelProperty(name = "围栏名称",notes = "") + private String fencingName ; + /** 围栏经纬度 */ + @ApiModelProperty(name = "围栏经纬度",notes = "") + private String fencingLat ; + /** 激活状态 */ + @ApiModelProperty(name = "激活状态",notes = "") + private Integer fencingStatus ; + /** 车辆零件ID */ + @ApiModelProperty(name = "车辆零件ID",notes = "") + private Integer driveId ; + /** 配件型号 */ + @ApiModelProperty(name = "配件型号",notes = "") + private String driveName ; + /** 配件编号 */ + @ApiModelProperty(name = "配件编号",notes = "") + private String drivePartNumber ; + /** 生产厂商名称 */ + @ApiModelProperty(name = "生产厂商名称",notes = "") + private String driveGenerateName ; + @ApiModelProperty("电池ID") + @TableId(value = "battery_id", type = IdType.AUTO) + private Integer batteryId; + + @ApiModelProperty("电池编号") + @TableField("battery_coding") + private Integer batteryCoding; + + @ApiModelProperty("电池类型") + @TableField("battery_type") + private String batteryType; + + @ApiModelProperty("电池容量") + @TableField("battery_capacity") + private Integer batteryCapacity; + + @ApiModelProperty("电池电压") + @TableField("battery_actual_voltage") + private BigDecimal batteryActualVoltage; + + @ApiModelProperty("电池质量") + @TableField("battery_actual_mass") + private Integer batteryActualMass; + + @ApiModelProperty("出厂时间") + @TableField("battery_delivery_time") + private Date batteryDeliveryTime; + + /** 车辆位置 */ + @ApiModelProperty(name = "车辆位置",notes = "") + private String carAddress ; +} diff --git a/fance-menghang-common/src/main/java/com/shiyi/internet/domain/response/ResponseFencing.java b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/response/ResponseFencing.java new file mode 100644 index 0000000..cfedcf5 --- /dev/null +++ b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/response/ResponseFencing.java @@ -0,0 +1,36 @@ +package com.shiyi.internet.domain.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @ClassName : RequestFencing + * @Description : 电子围栏响应实体类 + * @Author : YHY + * @Date: 2023-11-18 13:17 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ResponseFencing { + /** 电子围栏ID */ + @ApiModelProperty(name = "电子围栏ID",notes = "") + private Integer fencingId ; + /** 围栏名称 */ + @ApiModelProperty(name = "围栏名称",notes = "") + private String fencingName ; + /** 围栏经纬度 */ + @ApiModelProperty(name = "围栏经纬度",notes = "") + private String fencingLat ; + /** 激活状态 */ + @ApiModelProperty(name = "激活状态",notes = "") + private Integer fencingStatus ; + /** 操作时间 */ + @ApiModelProperty(name = "操作时间",notes = "") + private String fencingTime ; + /** 操作者 */ + @ApiModelProperty(name = "操作者",notes = "") + private Integer createUserId ; +} diff --git a/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/annotation/Excel.java b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/annotation/Excel.java new file mode 100644 index 0000000..61cbfdb --- /dev/null +++ b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/annotation/Excel.java @@ -0,0 +1,122 @@ +package com.shiyi.internet.domain.utils.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义导出Excel数据注解 + * + * @author + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Excel +{ + /** + * 导出到Excel中的名字. + */ + public String name() default ""; + + /** + * 日期格式, 如: yyyy-MM-dd + */ + public String dateFormat() default ""; + + /** + * 读取内容转表达式 (如: 0=男,1=女,2=未知) + */ + public String readConverterExp() default ""; + + /** + * 分隔符 + */ + public String splitStr() default ""; + + /** + * 可执行的反射方法值为1个 + */ + public String invokeMethod() default ""; + + /** + * 可执行的反射类 从SpringIoc容器当中取值 + */ + public Class invokeClass() default String.class; + + /** + * 导出类型(0数字 1字符串) + */ + public ColumnType cellType() default ColumnType.STRING; + + /** + * 导出时在excel中每个列的高度 单位为字符 + */ + public double height() default 14; + + /** + * 导出时在excel中每个列的宽 单位为字符 + */ + public double width() default 16; + + /** + * 文字后缀,如% 90 变成90% + */ + public String suffix() default ""; + + /** + * 当值为空时,字段的默认值 + */ + public String defaultValue() default ""; + + /** + * 提示信息 + */ + public String prompt() default ""; + + /** + * 设置只能选择不能输入的列内容. + */ + public String[] combo() default {}; + + /** + * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. + */ + public boolean isExport() default true; + + /** + * 另一个类中的属性名称,支持多级获取,以小数点隔开 + */ + public String targetAttr() default ""; + + /** + * 字段类型(0:导出导入;1:仅导出;2:仅导入) + */ + Type type() default Type.ALL; + + public enum Type { + ALL(0), EXPORT(1), IMPORT(2); + private final int value; + + Type(int value) { + this.value = value; + } + + public int value() { + return this.value; + } + } + + public enum ColumnType { + NUMERIC(0), STRING(1); + private final int value; + + ColumnType(int value) { + this.value = value; + } + + public int value() { + return this.value; + } + } +} diff --git a/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/annotation/Excels.java b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/annotation/Excels.java new file mode 100644 index 0000000..cc9a17b --- /dev/null +++ b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/annotation/Excels.java @@ -0,0 +1,18 @@ +package com.shiyi.internet.domain.utils.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Excel注解集 + * + * @author + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Excels +{ + Excel[] value(); +} diff --git a/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/date/DateUtils.java b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/date/DateUtils.java new file mode 100644 index 0000000..c140bd1 --- /dev/null +++ b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/date/DateUtils.java @@ -0,0 +1,137 @@ +package com.shiyi.internet.domain.utils.date; + +import org.apache.commons.lang3.time.DateFormatUtils; + +import java.io.File; +import java.lang.management.ManagementFactory; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 时间工具类 + * + * @author markGuo + */ +public class DateUtils extends org.apache.commons.lang3.time.DateUtils +{ + public static String YYYY = "yyyy"; + + public static String YYYY_MM = "yyyy-MM"; + + public static String YYYY_MM_DD = "yyyy-MM-dd"; + + public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; + + public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; + + private static String[] parsePatterns = { + "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", + "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", + "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; + + /** + * 获取当前Date型日期 + * + * @return Date() 当前日期 + */ + public static Date getNowDate() { + return new Date(); + } + + /** + * 获取当前日期, 默认格式为yyyy-MM-dd + * + * @return String + */ + public static String getDate() { + return dateTimeNow(YYYY_MM_DD); + } + + public static final String getTime() { + return dateTimeNow(YYYY_MM_DD_HH_MM_SS); + } + + public static final String dateTimeNow() { + return dateTimeNow(YYYYMMDDHHMMSS); + } + + public static final String dateTimeNow(final String format) { + return parseDateToStr(format, new Date()); + } + + public static final String dateTime(final Date date) { + return parseDateToStr(YYYY_MM_DD, date); + } + + public static final String parseDateToStr(final String format, final Date date) { + return new SimpleDateFormat(format).format(date); + } + + public static final Date dateTime(final String format, final String ts) { + try { + return new SimpleDateFormat(format).parse(ts); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + + /** + * 日期路径 即年/月/日 如2018/08/08 + */ + public static final String datePath() { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyy"+File.separator+"MM"+ File.separator +"dd"); + } + + /** + * 日期路径 即年/月/日 如20180808 + */ + public static final String dateTime() { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyyMMdd"); + } + + /** + * 日期型字符串转化为日期 格式 + */ + public static Date parseDate(Object str) { + if (str == null) { + return null; + } + try { + return parseDate(str.toString(), parsePatterns); + } catch (ParseException e) { + return null; + } + } + + /** + * 获取服务器启动时间 + */ + public static Date getServerStartDate() { + long time = ManagementFactory.getRuntimeMXBean().getStartTime(); + return new Date(time); + } + + /** + * 计算两个时间差 + */ + public static String getDatePoor(Date endDate, Date nowDate) { + long nd = 1000 * 24 * 60 * 60; + long nh = 1000 * 60 * 60; + long nm = 1000 * 60; + // long ns = 1000; + // 获得两个时间的毫秒时间差异 + long diff = endDate.getTime() - nowDate.getTime(); + // 计算差多少天 + long day = diff / nd; + // 计算差多少小时 + long hour = diff % nd / nh; + // 计算差多少分钟 + long min = diff % nd % nh / nm; + // 计算差多少秒//输出结果 + // long sec = diff % nd % nh % nm / ns; + return day + "天" + hour + "小时" + min + "分钟"; + } +} diff --git a/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/exception/PoiException.java b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/exception/PoiException.java new file mode 100644 index 0000000..083eae6 --- /dev/null +++ b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/exception/PoiException.java @@ -0,0 +1,27 @@ +package com.shiyi.internet.domain.utils.exception; + +/** + * 业务异常 + * + * @author + */ +public class PoiException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + protected final String message; + + public PoiException(String message) { + this.message = message; + } + + public PoiException(String message, Throwable e) { + super(message, e); + this.message = message; + } + + @Override + public String getMessage() { + return message; + } +} diff --git a/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/reflex/ReflectUtils.java b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/reflex/ReflectUtils.java new file mode 100644 index 0000000..87d4ffa --- /dev/null +++ b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/reflex/ReflectUtils.java @@ -0,0 +1,387 @@ +package com.shiyi.internet.domain.utils.reflex; + + +import com.shiyi.internet.domain.utils.date.DateUtils; +import com.shiyi.internet.domain.utils.text.Convert; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.*; +import java.util.Date; + +/** + * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. + * + * @author markGuo + */ +@SuppressWarnings("rawtypes") +public class ReflectUtils { + /** + * set方法前缀 + */ + private static final String SETTER_PREFIX = "set"; + + /** + * get方法前缀 + */ + private static final String GETTER_PREFIX = "get"; + + /** + * CGLIB 类分隔符 + */ + private static final String CGLIB_CLASS_SEPARATOR = "$$"; + + /** + * 日志 + */ + private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class); + + /** + * 调用Getter方法. + * 支持多级,如:对象名.对象名.方法 + * @param obj + * @param propertyName + * @param + * @return + */ + @SuppressWarnings("unchecked") + public static E invokeGetter(Object obj, String propertyName) { + Object object = obj; + for (String name : StringUtils.split(propertyName, ".")) { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } + return (E) object; + } + + /** + * 调用Setter方法, 仅匹配方法名。 + * 支持多级,如:对象名.对象名.方法 + * @param obj + * @param propertyName + * @param value + * @param + */ + public static void invokeSetter(Object obj, String propertyName, E value) { + Object object = obj; + String[] names = StringUtils.split(propertyName, "."); + for (int i = 0; i < names.length; i++) { + if (i < names.length - 1) { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } else { + String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]); + invokeMethodByName(object, setterMethodName, new Object[] { value }); + } + } + } + + /** + * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数. + * @param obj + * @param fieldName + * @param + * @return + */ + @SuppressWarnings("unchecked") + public static E getFieldValue(final Object obj, final String fieldName) { + Field field = getAccessibleField(obj, fieldName); + if (field == null) { + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + return null; + } + E result = null; + try { + result = (E) field.get(obj); + } catch (IllegalAccessException e) { + logger.error("不可能抛出的异常{}", e.getMessage()); + } + return result; + } + + /** + * 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数. + * @param obj + * @param fieldName + * @param value + * @param + */ + public static void setFieldValue(final Object obj, final String fieldName, final E value) { + Field field = getAccessibleField(obj, fieldName); + if (field == null) { + // throw new IllegalArgumentException("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + return; + } + try { + field.set(obj, value); + } catch (IllegalAccessException e) { + logger.error("不可能抛出的异常: {}", e.getMessage()); + } + } + + /** + * 直接调用对象方法, 无视private/protected修饰符. + * 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用. + * 同时匹配方法名+参数类型, + * @param obj + * @param methodName + * @param parameterTypes + * @param args + * @param + * @return + */ + @SuppressWarnings("unchecked") + public static E invokeMethod(final Object obj, final String methodName, final Class[] parameterTypes, + final Object[] args) { + if (obj == null || methodName == null) { + return null; + } + Method method = getAccessibleMethod(obj, methodName, parameterTypes); + if (method == null) { + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); + return null; + } + try { + return (E) method.invoke(obj, args); + } catch (Exception e) { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 直接调用对象方法, 无视private/protected修饰符, + * 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用. + * 只匹配函数名,如果有多个同名函数调用第一个。 + * @param obj + * @param methodName + * @param args + * @param + * @return + */ + @SuppressWarnings("unchecked") + public static E invokeMethodByName(final Object obj, final String methodName, final Object[] args) { + Method method = getAccessibleMethodByName(obj, methodName, args.length); + if (method == null) { + // 如果为空不报错,直接返回空。 + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); + return null; + } + try { + // 类型转换(将参数数据类型转换为目标方法参数类型) + Class[] cs = method.getParameterTypes(); + for (int i = 0; i < cs.length; i++) { + if (args[i] != null && !args[i].getClass().equals(cs[i])) { + if (cs[i] == String.class) { + args[i] = Convert.toStr(args[i]); + if (StringUtils.endsWith((String) args[i], ".0")) { + args[i] = StringUtils.substringBefore((String) args[i], ".0"); + } + } else if (cs[i] == Integer.class) { + args[i] = Convert.toInt(args[i]); + } else if (cs[i] == Long.class) { + args[i] = Convert.toLong(args[i]); + } else if (cs[i] == Double.class) { + args[i] = Convert.toDouble(args[i]); + } else if (cs[i] == Float.class) { + args[i] = Convert.toFloat(args[i]); + } else if (cs[i] == Date.class) { + if (args[i] instanceof String) { + args[i] = DateUtils.parseDate(args[i]); + } + } + } + } + return (E) method.invoke(obj, args); + } catch (Exception e) { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * @param obj + * @param fieldName + * @return + */ + public static Field getAccessibleField(final Object obj, final String fieldName) { + // 为空不报错。直接返回 null + if (obj == null) { + return null; + } + Validate.notBlank(fieldName, "fieldName can't be blank"); + for (Class superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) { + try { + Field field = superClass.getDeclaredField(fieldName); + makeAccessible(field); + return field; + } + catch (NoSuchFieldException e) { + continue; + } + } + return null; + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * 匹配函数名+参数类型。 + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) + * @param obj + * @param methodName + * @param parameterTypes + * @return + */ + public static Method getAccessibleMethod(final Object obj, final String methodName, + final Class... parameterTypes) { + // 为空不报错。直接返回 null + if (obj == null) { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) { + try { + Method method = searchType.getDeclaredMethod(methodName, parameterTypes); + makeAccessible(method); + return method; + } catch (NoSuchMethodException e) { + continue; + } + } + return null; + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * 只匹配函数名。 + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) + * @param obj + * @param methodName + * @param argsNum + * @return + */ + public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum) { + // 为空不报错。直接返回 null + if (obj == null) { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) { + Method[] methods = searchType.getDeclaredMethods(); + for (Method method : methods) { + if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) { + makeAccessible(method); + return method; + } + } + } + return null; + } + + /** + * 改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 + * @param method + */ + public static void makeAccessible(Method method) { + if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) + && !method.isAccessible()) { + method.setAccessible(true); + } + } + + /** + * 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 + * @param field + */ + public static void makeAccessible(Field field) { + if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) + || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) { + field.setAccessible(true); + } + } + + /** + * 通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处 + * 如无法找到, 返回Object.class. + * @param clazz + * @param + * @return + */ + @SuppressWarnings("unchecked") + public static Class getClassGenricType(final Class clazz) { + return getClassGenricType(clazz, 0); + } + + /** + * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. + * 如无法找到, 返回Object.class. + * @param clazz + * @param index + * @return + */ + public static Class getClassGenricType(final Class clazz, final int index) { + Type genType = clazz.getGenericSuperclass(); + + if (!(genType instanceof ParameterizedType)) { + logger.debug(clazz.getSimpleName() + "'s superclass not ParameterizedType"); + return Object.class; + } + + Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); + + if (index >= params.length || index < 0) { + logger.debug("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + + params.length); + return Object.class; + } + if (!(params[index] instanceof Class)) { + logger.debug(clazz.getSimpleName() + " not set the actual class on superclass generic parameter"); + return Object.class; + } + + return (Class) params[index]; + } + + /** + * 通过实例化对象获取反射对象 + * @param instance + * @return + */ + public static Class getUserClass(Object instance) { + if (instance == null) { + throw new RuntimeException("Instance must not be null"); + } + Class clazz = instance.getClass(); + if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) { + Class superClass = clazz.getSuperclass(); + if (superClass != null && !Object.class.equals(superClass)) { + return superClass; + } + } + return clazz; + + } + + /** + * 将反射时的checked exception转换为unchecked exception. + * @param msg + * @param e + * @return + */ + public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e) { + if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException + || e instanceof NoSuchMethodException) { + return new IllegalArgumentException(msg, e); + } else if (e instanceof InvocationTargetException) { + return new RuntimeException(msg, ((InvocationTargetException) e).getTargetException()); + } + return new RuntimeException(msg, e); + } +} diff --git a/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/string/SpringUtils.java b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/string/SpringUtils.java new file mode 100644 index 0000000..3db40c9 --- /dev/null +++ b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/string/SpringUtils.java @@ -0,0 +1,106 @@ +package com.shiyi.internet.domain.utils.string; + +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.stereotype.Component; + +/** + * spring工具类 方便在非spring管理环境中获取bean + * + * @author markGuo + */ +@Component +public final class SpringUtils implements BeanFactoryPostProcessor +{ + /** Spring应用上下文环境 */ + private static ConfigurableListableBeanFactory beanFactory; + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringUtils.beanFactory = beanFactory; + } + + /** + * 获取对象 + * + * @param name + * @return Object 一个以所给名字注册的bean的实例 + * @throws BeansException + * + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + /** + * 获取类型为requiredType的对象 + * + * @param clz + * @return + * @throws BeansException + * + */ + public static T getBean(Class clz) throws BeansException { + T result = beanFactory.getBean(clz); + return result; + } + + /** + * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true + * + * @param name + * @return boolean + */ + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + /** + * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) + * + * @param name + * @return boolean + * @throws NoSuchBeanDefinitionException + * + */ + public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException { + return beanFactory.isSingleton(name); + } + + /** + * @param name + * @return Class 注册对象的类型 + * @throws NoSuchBeanDefinitionException + * + */ + public static Class getType(String name) throws NoSuchBeanDefinitionException { + return beanFactory.getType(name); + } + + /** + * 如果给定的bean名字在bean定义中有别名,则返回这些别名 + * + * @param name + * @return + * @throws NoSuchBeanDefinitionException + * + */ + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException { + return beanFactory.getAliases(name); + } + + /** + * 获取aop代理对象 + * + * @param invoker + * @return + */ + @SuppressWarnings("unchecked") + public static T getAopProxy(T invoker) { + return (T) AopContext.currentProxy(); + } +} diff --git a/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/text/Convert.java b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/text/Convert.java new file mode 100644 index 0000000..d602326 --- /dev/null +++ b/fance-menghang-common/src/main/java/com/shiyi/internet/domain/utils/text/Convert.java @@ -0,0 +1,819 @@ +package com.shiyi.internet.domain.utils.text; + + +import com.fate.common.core.text.CharsetKit; +import org.apache.commons.lang3.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 markGuo + */ +public class Convert { + /** + * 转换为字符串
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @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(); + } + + /** + * 转换为字符串
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static String toStr(Object value) { + return toStr(value, null); + } + + /** + * 转换为字符
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @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); + } + + /** + * 转换为字符
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Character toChar(Object value) { + return toChar(value, null); + } + + /** + * 转换为byte
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Byte toByte(Object value, Byte defaultValue) { + if (value == null) { + return defaultValue; + } else if (value instanceof Byte) { + return (Byte) value; + }else 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
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Byte toByte(Object value) { + return toByte(value, null); + } + + /** + * 转换为Short
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Short toShort(Object value, Short defaultValue) { + if (value == null) { + return defaultValue; + }else if (value instanceof Short) { + return (Short) value; + } else 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
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Short toShort(Object value) { + return toShort(value, null); + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Number toNumber(Object value, Number defaultValue) { + if (value == null) { + return defaultValue; + } else 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
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Number toNumber(Object value) { + return toNumber(value, null); + } + + /** + * 转换为int
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Integer toInt(Object value, Integer defaultValue) { + if (value == null) { + return defaultValue; + } else if (value instanceof Integer) { + return (Integer) value; + } else 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
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Integer toInt(Object value) { + return toInt(value, null); + } + + /** + * 转换为Integer数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String str) { + return toIntArray(",", str); + } + + /** + * 转换为Long数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String str) { + return toLongArray(",", str); + } + + /** + * 转换为Integer数组
+ * + * @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数组
+ * + * @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数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String str) { + return toStrArray(",", str); + } + + /** + * 转换为String数组
+ * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String split, String str) { + return str.split(split); + } + + /** + * 转换为long
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Long toLong(Object value, Long defaultValue) { + if (value == null) { + return defaultValue; + } else if (value instanceof Long) { + return (Long) value; + } else 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
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Long toLong(Object value) { + return toLong(value, null); + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Double toDouble(Object value, Double defaultValue) { + if (value == null) { + return defaultValue; + } else if (value instanceof Double) { + return (Double) value; + } else 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
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Double toDouble(Object value) { + return toDouble(value, null); + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Float toFloat(Object value, Float defaultValue) { + if (value == null) { + return defaultValue; + } else if (value instanceof Float) { + return (Float) value; + } else 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
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Float toFloat(Object value) { + return toFloat(value, null); + } + + /** + * 转换为boolean
+ * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Boolean toBool(Object value, Boolean defaultValue) { + if (value == null) { + return defaultValue; + } else 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
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Boolean toBool(Object value) { + return toBool(value, null); + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * + * @param clazz Enum的Class + * @param value 值 + * @param defaultValue 默认值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value, E defaultValue) { + if (value == null) { + return defaultValue; + } else 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对象
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * + * @param clazz Enum的Class + * @param value 值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value) { + return toEnum(clazz, value, null); + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value, BigInteger defaultValue) { + if (value == null) { + return defaultValue; + } else if (value instanceof BigInteger) { + return (BigInteger) value; + } else 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
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value) { + return toBigInteger(value, null); + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) { + if (value == null) { + return defaultValue; + } else if (value instanceof BigDecimal) { + return (BigDecimal) value; + } else if (value instanceof Long) { + return new BigDecimal((Long) value); + } else if (value instanceof Double) { + return new BigDecimal((Double) value); + } else 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
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value) { + return toBigDecimal(value, null); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @return 字符串 + */ + public static String utf8Str(Object obj) { + return str(obj, CharsetKit.CHARSET_UTF_8); + } + + /** + * 将对象转为字符串
+ * 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)); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(Object obj, Charset charset) { + if (null == obj) { + return null; + } else if (obj instanceof String) { + return (String) obj; + } else if (obj instanceof byte[] || obj instanceof Byte[]) { + return str(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; + } else 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 notConvertSet) { + char c[] = input.toCharArray(); + for (int i = 0; i < c.length; i++) { + if (null != notConvertSet && notConvertSet.contains(c[i])) { + // 跳过不替换的字符 + continue; + } else 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 notConvertSet) { + char c[] = text.toCharArray(); + for (int i = 0; i < c.length; i++) { + if (null != notConvertSet && notConvertSet.contains(c[i])) { + // 跳过不替换的字符 + continue; + } else if (c[i] == '\u3000') { + c[i] = ' '; + } else if (c[i] > '\uFF00' && c[i] < '\uFF5F') { + c[i] = (char) (c[i] - 65248); + } + } + return new String(c); + } + + /** + * 数字金额大写转换 先写个完整的然后将如零拾替换成零 + * + * @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("^整$", "零元整"); + } +} diff --git a/fance-menghang-remote/.gitignore b/fance-menghang-remote/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/fance-menghang-remote/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/fance-menghang-remote/pom.xml b/fance-menghang-remote/pom.xml new file mode 100644 index 0000000..f528502 --- /dev/null +++ b/fance-menghang-remote/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + + com.fate + fate-fence + 3.6.3 + + + org.example + fance-menghang-remote + + + 17 + 17 + UTF-8 + + + + + + + org.example + fance-menghang-common + 3.6.3 + + + + diff --git a/fance-menghang-service/.gitignore b/fance-menghang-service/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/fance-menghang-service/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/fance-menghang-service/pom.xml b/fance-menghang-service/pom.xml new file mode 100644 index 0000000..e2a8f99 --- /dev/null +++ b/fance-menghang-service/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + com.fate + fate-fence + 3.6.3 + + + org.example + fance-menghang-service + + + 17 + 17 + UTF-8 + + + + + + org.example + fance-menghang-common + 3.6.3 + + + + + + + org.apache.poi + poi + 3.15 + + + org.apache.poi + poi-ooxml-schemas + 3.15 + + + org.apache.poi + poi-ooxml + 3.15 + + + + + + diff --git a/fance-menghang-service/src/main/java/com/shiyi/internet/FencingApplication.java b/fance-menghang-service/src/main/java/com/shiyi/internet/FencingApplication.java new file mode 100644 index 0000000..c6379c6 --- /dev/null +++ b/fance-menghang-service/src/main/java/com/shiyi/internet/FencingApplication.java @@ -0,0 +1,49 @@ +package com.shiyi.internet; + +import com.fate.common.security.annotation.EnableCustomConfig; +import com.fate.common.security.annotation.EnableMyFeignClients; +import com.fate.common.swagger.annotation.EnableCustomSwagger2; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @Description : 电子围栏启动类 + * @Author : YangHaoYu + * @Date: 2023-11-20 18:50 + */ +@EnableCustomConfig +@EnableCustomSwagger2 +@EnableMyFeignClients +@SpringBootApplication +@MapperScan("com.shiyi.internet.mapper") +public class FencingApplication { + public static void main(String[] args) { + SpringApplication.run(FencingApplication.class,args); + System.out.println("/**\n" + + "\n" + + " _oo0oo_\n" + + " o8888888o\n" + + " 88\" . \"88\n" + + " (| -_- |)\n" + + " 0\\ = /0\n" + + " ___/`---'\\___\n" + + " .' \\\\| |// '.\n" + + " / \\\\||| : |||// \\\n" + + " / _||||| -:- |||||- \\\n" + + " | | \\\\\\ - /// | |\n" + + " | \\_| ''\\---/'' |_/ |\n" + + " \\ .-\\__ '-' ___/-. /\n" + + " ___'. .' /--.--\\ `. .'___\n" + + " .\"\" '< `.___\\_<|>_/___.' >' \"\".\n" + + " | | : `- \\`.;`\\ _ /`;.`/ - ` : | |\n" + + " \\ \\ `_. \\_ __\\ /__ _/ .-` / /\n" + + " =====`-.____`.___ \\_____/___.-`___.-'=====\n" + + " `=---='\n" + + "\n" + + " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + + "\n" + + " 佛祖保佑 永无BUG\n" + + "*/"); + } +} diff --git a/fance-menghang-service/src/main/java/com/shiyi/internet/controller/FencingController.java b/fance-menghang-service/src/main/java/com/shiyi/internet/controller/FencingController.java new file mode 100644 index 0000000..0fe8989 --- /dev/null +++ b/fance-menghang-service/src/main/java/com/shiyi/internet/controller/FencingController.java @@ -0,0 +1,144 @@ +package com.shiyi.internet.controller; + +import com.alibaba.fastjson.JSONObject; +import com.fate.common.core.domain.Result; +import com.fate.common.core.web.controller.BaseController; +import com.shiyi.internet.domain.Fencing; +import com.shiyi.internet.domain.response.ResponseFencing; +import com.shiyi.internet.service.FencingService; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * @ClassName : 电子围栏控制层 + * @Description : FencingController + * @Author : YHY + * @Date: 2023-11-18 13:13 + */ +@RestController +@RequestMapping("/fencing") +@Log4j2 +public class FencingController extends BaseController { + @Autowired + private FencingService fencingService; + private HttpServletRequest request; + + /** + * @Description: + No such property: code for class: Script1 + * @return: com.fate.common.core.domain.Result> + * @Author: YHY + * @Updator: YHY + * @Date 2023/11/18 13:31 + */ + @GetMapping("/fencingList") + public Result> fencingList(){ + log.info("功能名称:电子围栏,请求URL:【{}】,请求方法:【{}】",request.getRequestURI(), + request.getMethod()); + Result> result = fencingService.fencingList(); + log.info("功能名称:电子围栏,请求URL:【{}】,请求方法:【{}】,响应结果:【{}】",request.getRequestURI(), + request.getMethod(), JSONObject.toJSONString(result)); + return result; + } + + /** + * @Description: + No such property: code for class: Script1 + * @return: com.fate.common.core.domain.Result + * @Author: YHY + * @Updator: YHY + * @Date 2023/11/18 13:54 + */ + @PostMapping("/addfencing") + public Result addfencing(@RequestBody Fencing fencing){ + log.info("功能名称:添加电子围栏,请求URL:【{}】,请求方法:【{}】,请求参数:【{}】",request.getRequestURI(), + request.getMethod(),fencing); + fencingService.addfencing(fencing); + Result result = Result.success(); + log.info("功能名称:添加电子围栏,请求URL:【{}】,请求方法:【{}】,响应结果:【{}】",request.getRequestURI(), + request.getMethod(), JSONObject.toJSONString(result)); + return result; + } + + /** + * @Description: + No such property: code for class: Script1 + * @return: com.fate.common.core.domain.Result + * @Author: YHY + * @Updator: YHY + * @Date 2023/11/18 14:00 + */ + @PostMapping("/deleteFencingById/{fencingId}") + public Result deleteFencingById(@PathVariable Integer fencingId){ + log.info("功能名称:获取编号删除围栏,请求URL:【{}】,请求方法:【{}】,请求参数:【{}】",request.getRequestURI(), + request.getMethod(),fencingId); + Result result = fencingService.deleteFencingById(fencingId); + log.info("功能名称:获取编号删除围栏,请求URL:【{}】,请求方法:【{}】,响应结果:【{}】",request.getRequestURI(), + request.getMethod(), JSONObject.toJSONString(result)); + return result; + } + + /** + * @Description: + No such property: code for class: Script1 + * @return: com.fate.common.core.domain.Result + * @Author: YHY + * @Updator: YHY + * @Date 2023/11/18 14:02 + */ + @PostMapping("/updateFencing") + public Result updateFencing(@RequestBody Fencing fencing){ + log.info("功能名称:修改围栏,请求URL:【{}】,请求方法:【{}】,请求参数:【{}】",request.getRequestURI(), + request.getMethod(),fencing); + Result result = fencingService.updateFencing(fencing); + log.info("功能名称:修改围栏,请求URL:【{}】,请求方法:【{}】,响应结果:【{}】",request.getRequestURI(), + request.getMethod(), JSONObject.toJSONString(result)); + return result; + } + + + /** + * @Description:精确查询电子围栏信息 + No such property: code for class: Script1 + * @return: com.fate.common.core.domain.Result + * @Author: YHY + * @Updator: YHY + * @Date 2023/11/19 19:44 + */ + @PostMapping("/findFencingById/{fencingId}") + public Result findFencingById(@PathVariable Integer fencingId){ + log.info("功能名称:精确查询电子围栏信息,请求URL:【{}】,请求方法:【{}】,请求参数:【{}】",request.getRequestURI(), + request.getMethod(),fencingId); + ResponseFencing responseFencing = fencingService.findFencingById(fencingId); + Result result = Result.success(responseFencing); + log.info("功能名称:精确查询电子围栏信息,请求URL:【{}】,请求方法:【{}】,响应结果:【{}】",request.getRequestURI(), + request.getMethod(), JSONObject.toJSONString(result)); + return result; + } + + + /** + * @Description:批量删除围栏 + No such property: code for class: Script1 + * @return: com.fate.common.core.domain.Result + * @Author: YHY + * @Updator: YHY + * @Date 2023/11/19 19:50 + */ + @PostMapping("/deleteFencingAllIds/{ids}") + public Result deleteFencingAllIds(@PathVariable Integer[] ids){ + log.info("功能名称:批量删除围栏,请求URL:【{}】,请求方法:【{}】,请求参数:【{}】",request.getRequestURI(), + request.getMethod(),ids); + Result result = fencingService.deleteFencingAllIds(ids); + log.info("功能名称:批量删除围栏,请求URL:【{}】,请求方法:【{}】,响应结果:【{}】",request.getRequestURI(), + request.getMethod(), JSONObject.toJSONString(result)); + return result; + } + + + +} diff --git a/fance-menghang-service/src/main/java/com/shiyi/internet/controller/VehicleController.java b/fance-menghang-service/src/main/java/com/shiyi/internet/controller/VehicleController.java new file mode 100644 index 0000000..d9fa94d --- /dev/null +++ b/fance-menghang-service/src/main/java/com/shiyi/internet/controller/VehicleController.java @@ -0,0 +1,140 @@ +package com.shiyi.internet.controller; + +import com.alibaba.fastjson.JSONObject; +import com.fate.common.core.domain.Result; +import com.fate.common.core.utils.poi.ExcelUtil; +import com.fate.common.core.web.controller.BaseController; +import com.shiyi.internet.domain.Car; +import com.shiyi.internet.domain.response.ResponseCar; +import com.shiyi.internet.service.VehicleService; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * @ClassName : 车辆管理系统控制层 + * @Description : CarController + * @Author : YHY + * @Date: 2023-11-19 21:00 + */ +@Log4j2 +@RestController +@RequestMapping("/car") +public class VehicleController extends BaseController { + + @Autowired + private VehicleService vehicleService; + private HttpServletRequest request; + + + /** + * @Description:车辆管理系统 + No such property: code for class: Script1 + * @return: com.fate.common.core.domain.Result> + * @Author: YHY + * @Updator: YHY + * @Date 2023/11/19 21:20 + */ + @GetMapping("/vehicleList") + public Result> vehicleList(){ + log.info("功能名称:车辆管理系统,请求URL:【{}】,请求方法:【{}】",request.getRequestURI(), + request.getMethod()); + Result> result = vehicleService.vehicleList(); + log.info("功能名称:车辆管理系统,请求URL:【{}】,请求方法:【{}】,响应结果:【{}】",request.getRequestURI(), + request.getMethod(), JSONObject.toJSONString(result)); + return result; + } + + /** + * @Description:获取编号删除车辆 + No such property: code for class: Script1 + * @return: com.fate.common.core.domain.Result + * @Author: YHY + * @Updator: YHY + * @Date 2023/11/19 21:38 + */ + @PostMapping("/deletVehiclById/{carId}") + public Result deletVehiclById(@PathVariable Integer carId){ + log.info("功能名称:获取编号删除车辆,请求URL:【{}】,请求方法:【{}】,请求参数:【{}】",request.getRequestURI(), + request.getMethod(),carId); + Result result = vehicleService.deletVehiclById(carId); + log.info("功能名称:获取编号删除车辆,请求URL:【{}】,请求方法:【{}】,响应结果:【{}】",request.getRequestURI(), + request.getMethod(), JSONObject.toJSONString(result)); + return result; + } + + /** + * @Description:添加车辆信息 + No such property: code for class: Script1 + * @return: com.fate.common.core.domain.Result + * @Author: YHY + * @Updator: YHY + * @Date 2023/11/19 22:34 + */ + @PostMapping("/addVehicl") + public Result addVehicl(@RequestBody Car car){ + log.info("功能名称:添加车辆信息,请求URL:【{}】,请求方法:【{}】,请求参数:【{}】",request.getRequestURI(), + request.getMethod(),car); + vehicleService.addVehicl(car); + Result result = Result.success(); + log.info("功能名称:添加车辆信息,请求URL:【{}】,请求方法:【{}】,响应结果:【{}】",request.getRequestURI(), + request.getMethod(), JSONObject.toJSONString(result)); + return result; + } + + /** + * 精确查询车辆系统信息 + * No such property: code for class: Script1 + * @return: com.fate.common.core.domain.Result + * @Author: YHY + * @Updator: YHY + * @Date 2023/11/20 10:20 + */ + @GetMapping("/findVehiclById/{carId}") + public Result findVehiclById(@PathVariable Integer carId){ + log.info("功能名称:精确查询车辆系统信息,请求URL:【{}】,请求方法:【{}】,请求参数:【{}】",request.getRequestURI(), + request.getMethod(),carId); + ResponseCar responseCar = vehicleService.findVehiclById(carId); + Result result = Result.success(responseCar); + log.info("功能名称:精确查询车辆系统信息,请求URL:【{}】,请求方法:【{}】,响应结果:【{}】",request.getRequestURI(), + request.getMethod(), JSONObject.toJSONString(result)); + return result; + } + + /** + * @Description:修改车辆管理 + No such property: code for class: Script1 + * @return: com.fate.common.core.domain.Result + * @Author: YHY + * @Updator: YHY + * @Date 2023/11/20 10:34 + */ + @PostMapping("/updateVehicl") + public Result updateVehicl(@RequestBody Car car){ + log.info("功能名称:修改车辆管理,请求URL:【{}】,请求方法:【{}】,请求参数:【{}】",request.getRequestURI(), + request.getMethod(),car); + Result result = vehicleService.updateVehicl(car); + log.info("功能名称:修改车辆管理,请求URL:【{}】,请求方法:【{}】,响应结果:【{}】",request.getRequestURI(), + request.getMethod(), JSONObject.toJSONString(result)); + return result; + } + + /** + * @Description: 导出车辆数据 + No such property: code for class: Script1 + * @return: void + * @Author: YHY + * @Updator: YHY + * @Date 2023/11/20 13:36 + */ + @PostMapping("/exportVehiclList") + public void exportVehiclList(HttpServletResponse response){ + Result> list = vehicleService.vehicleList(); + ExcelUtil carExcelUtil = new ExcelUtil<>(ResponseCar.class); + carExcelUtil.exportExcel(response,list.getData(),"车辆信息"); + } +} diff --git a/fance-menghang-service/src/main/java/com/shiyi/internet/mapper/FencingMapper.java b/fance-menghang-service/src/main/java/com/shiyi/internet/mapper/FencingMapper.java new file mode 100644 index 0000000..fd915a5 --- /dev/null +++ b/fance-menghang-service/src/main/java/com/shiyi/internet/mapper/FencingMapper.java @@ -0,0 +1,31 @@ +package com.shiyi.internet.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.fate.common.core.domain.Result; +import com.shiyi.internet.domain.Fencing; +import com.shiyi.internet.domain.response.ResponseFencing; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description :电子围栏数据层 + * @Author : YHY + * @Date: 2023-11-18 13:15 + */ +@Mapper +public interface FencingMapper extends BaseMapper { + List fencingList(); + + void addfencing(Fencing fencing); + + int deleteFencingById(@Param("fencingId") Integer fencingId); + + int updateFencing(Fencing fencing); + + ResponseFencing findFencingById(@Param("fencingId") Integer fencingId); + + Result deleteFencingAllIds(@Param("ids") Integer[] ids); + +} diff --git a/fance-menghang-service/src/main/java/com/shiyi/internet/mapper/VehicleMapper.java b/fance-menghang-service/src/main/java/com/shiyi/internet/mapper/VehicleMapper.java new file mode 100644 index 0000000..61c0231 --- /dev/null +++ b/fance-menghang-service/src/main/java/com/shiyi/internet/mapper/VehicleMapper.java @@ -0,0 +1,27 @@ +package com.shiyi.internet.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.shiyi.internet.domain.Car; +import com.shiyi.internet.domain.response.ResponseCar; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @Description : 车辆管理数据层 + * @Author : YHY + * @Date: 2023-11-19 21:25 + */ +@Mapper +public interface VehicleMapper extends BaseMapper { + List vehicleList(); + + int deletVehiclById(@Param("carId") Integer carId); + + void addVehicl(Car car); + + ResponseCar findVehiclById(@Param("carId") Integer carId); + + int updateVehicl(Car car); +} diff --git a/fance-menghang-service/src/main/java/com/shiyi/internet/service/FencingService.java b/fance-menghang-service/src/main/java/com/shiyi/internet/service/FencingService.java new file mode 100644 index 0000000..295686c --- /dev/null +++ b/fance-menghang-service/src/main/java/com/shiyi/internet/service/FencingService.java @@ -0,0 +1,28 @@ +package com.shiyi.internet.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fate.common.core.domain.Result; +import com.shiyi.internet.domain.Fencing; +import com.shiyi.internet.domain.response.ResponseFencing; + +import java.util.List; + +/** + * @ClassName : FencingService + * @Description : + * @Author : YHY + * @Date: 2023-11-18 13:14 + */ +public interface FencingService extends IService { + Result> fencingList(); + + void addfencing(Fencing fencing); + + Result deleteFencingById(Integer fencingId); + + Result updateFencing(Fencing fencing); + + ResponseFencing findFencingById(Integer fencingId); + + Result deleteFencingAllIds(Integer[] ids); +} diff --git a/fance-menghang-service/src/main/java/com/shiyi/internet/service/VehicleService.java b/fance-menghang-service/src/main/java/com/shiyi/internet/service/VehicleService.java new file mode 100644 index 0000000..db11e7e --- /dev/null +++ b/fance-menghang-service/src/main/java/com/shiyi/internet/service/VehicleService.java @@ -0,0 +1,26 @@ +package com.shiyi.internet.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.fate.common.core.domain.Result; +import com.shiyi.internet.domain.Car; +import com.shiyi.internet.domain.response.ResponseCar; + +import java.util.List; + +/** + * @ClassName : VehicleService + * @Description : + * @Author : YHY + * @Date: 2023-11-19 21:24 + */ +public interface VehicleService extends IService { + Result> vehicleList(); + + Result deletVehiclById(Integer carId); + + void addVehicl(Car car); + + ResponseCar findVehiclById(Integer carId); + + Result updateVehicl(Car car); +} diff --git a/fance-menghang-service/src/main/java/com/shiyi/internet/service/impl/FencingServiceimpl.java b/fance-menghang-service/src/main/java/com/shiyi/internet/service/impl/FencingServiceimpl.java new file mode 100644 index 0000000..cc7a9c6 --- /dev/null +++ b/fance-menghang-service/src/main/java/com/shiyi/internet/service/impl/FencingServiceimpl.java @@ -0,0 +1,63 @@ +package com.shiyi.internet.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fate.common.core.domain.Result; +import com.shiyi.internet.domain.Fencing; +import com.shiyi.internet.domain.response.ResponseFencing; +import com.shiyi.internet.mapper.FencingMapper; +import com.shiyi.internet.service.FencingService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + * @Description : 电子围栏业务层 + * @Author : YHY + * @Date: 2023-11-18 13:14 + */ +@Service +public class FencingServiceimpl extends ServiceImpl implements FencingService { + + @Autowired + private FencingMapper fencingMapper; + + @Override + public Result> fencingList() { + List list = fencingMapper.fencingList(); + return Result.success(list); + } + + @Override + public void addfencing(Fencing fencing) { + Date date = new Date(); + fencing.setFencingTime(date); + fencingMapper.addfencing(fencing); + } + + @Override + public Result deleteFencingById(Integer fencingId) { + int i = fencingMapper.deleteFencingById(fencingId); + return i>0?Result.success(200,"围栏已成功删除"):Result.error(500,"删除失败"); + } + + @Override + public Result updateFencing(Fencing fencing) { + Date date = new Date(); + fencing.setFencingTime(date); + int i = fencingMapper.updateFencing(fencing); + return i>0?Result.success(200,"围栏已成功修改"):Result.error(500,"修改失败"); + } + + @Override + public ResponseFencing findFencingById(Integer fencingId) { + + return fencingMapper.findFencingById(fencingId); + } + + @Override + public Result deleteFencingAllIds(Integer[] ids) { + return fencingMapper.deleteFencingAllIds(ids); + } +} diff --git a/fance-menghang-service/src/main/java/com/shiyi/internet/service/impl/VehicleServiceimpl.java b/fance-menghang-service/src/main/java/com/shiyi/internet/service/impl/VehicleServiceimpl.java new file mode 100644 index 0000000..e176552 --- /dev/null +++ b/fance-menghang-service/src/main/java/com/shiyi/internet/service/impl/VehicleServiceimpl.java @@ -0,0 +1,54 @@ +package com.shiyi.internet.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fate.common.core.domain.Result; +import com.shiyi.internet.domain.Car; +import com.shiyi.internet.domain.response.ResponseCar; +import com.shiyi.internet.mapper.FencingMapper; +import com.shiyi.internet.mapper.VehicleMapper; +import com.shiyi.internet.service.VehicleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description : 车辆系统业务层 + * @Author : YHY + * @Date: 2023-11-19 21:24 + */ +@Service +public class VehicleServiceimpl extends ServiceImpl implements VehicleService { + + @Autowired + private VehicleMapper vehicleMapper; + + @Override + public Result> vehicleList() { + List list = vehicleMapper.vehicleList(); + return Result.success(list); + } + + @Override + public Result deletVehiclById(Integer carId) { + int i = vehicleMapper.deletVehiclById(carId); + return i>0?Result.success(200,"车辆已成功删除"):Result.error(500,"删除失败"); + } + + @Override + public void addVehicl(Car car) { + + vehicleMapper.addVehicl(car); + } + + @Override + public ResponseCar findVehiclById(Integer carId) { + return vehicleMapper.findVehiclById(carId); + } + + @Override + public Result updateVehicl(Car car) { + int i = vehicleMapper.updateVehicl(car); + return i>0?Result.success(200,"车辆信息已成功修改"):Result.error(500,"修改失败"); + } +} diff --git a/fance-menghang-service/src/main/resources/banner.txt b/fance-menghang-service/src/main/resources/banner.txt new file mode 100644 index 0000000..0dd5eee --- /dev/null +++ b/fance-menghang-service/src/main/resources/banner.txt @@ -0,0 +1,2 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} diff --git a/fance-menghang-service/src/main/resources/bootstrap.yml b/fance-menghang-service/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..f016c23 --- /dev/null +++ b/fance-menghang-service/src/main/resources/bootstrap.yml @@ -0,0 +1,33 @@ +# Tomcat +server: + port: 10002 + +# Spring +spring: + application: + # 应用名称 + name: fate-fence + profiles: + # 环境配置 + active: dev + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: 182.254.222.21:8848 + config: + # 配置中心地址 + server-addr: 182.254.222.21:8848 + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} +logging: + level: + com.fate.system.mapper: DEBUG + + +#mybatis: +# configuration: +# map-underscore-to-camel-case: true diff --git a/fance-menghang-service/src/main/resources/logback.xml b/fance-menghang-service/src/main/resources/logback.xml new file mode 100644 index 0000000..2c44970 --- /dev/null +++ b/fance-menghang-service/src/main/resources/logback.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + + + + + + + + + + + + diff --git a/fance-menghang-service/src/main/resources/mapper/FencingMapper.xml b/fance-menghang-service/src/main/resources/mapper/FencingMapper.xml new file mode 100644 index 0000000..97c35e4 --- /dev/null +++ b/fance-menghang-service/src/main/resources/mapper/FencingMapper.xml @@ -0,0 +1,43 @@ + + + + + insert into( + fencing_id, + fencing_name, + fencing_lat, + fencing_status, + fencing_time, + create_user_id) values( + #{fencingId}, + #{fencingName}, + #{fencingLat}, + #{fencingStatus}, + #{fencingTime}, + #{createUserId}) + + + update t_fencing set + fencing_name=#{fencingName}, + fencing_lat=#{fencingLat}, + fencing_status=#{fencingStatus}, + fencing_time=#{fencingTime}, + create_user_id=#{createUserId} where fencing_id=#{fencingId} + + + delete from t_fencing where fencing_id=#{fencingId} + + + delete from t_fencing where fencing_id in + + #{ids} + + + + + + diff --git a/fance-menghang-service/src/main/resources/mapper/VehicleMapper.xml b/fance-menghang-service/src/main/resources/mapper/VehicleMapper.xml new file mode 100644 index 0000000..98bf7a1 --- /dev/null +++ b/fance-menghang-service/src/main/resources/mapper/VehicleMapper.xml @@ -0,0 +1,50 @@ + + + + + insert into ( + car_id, + car_name, + car_license, + driving_id, + typ_eId, + fen_ceId, + dri_veId, + bat_teryId, + car_address) values( + #{carId}, + #{carName}, + #{carLicense}, + #{drivingId}, + #{typeId}, + #{fenceId}, + #{driveId}, + #{batteryId}, + #{carAddress}) + + + update t_car set + car_name=#{carName}, + car_license=#{carLicense}, + driving_id=#{drivingId}, + type_id=#{typeId}, + fence_id=#{fenceId}, + drive_id=#{driveId}, + battery_id=#{batteryId}, + car_address=#{carAddress} where car_id=#{carId} + + + delete from t_car where car_id=#{carId} + + + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..6feecf9 --- /dev/null +++ b/pom.xml @@ -0,0 +1,106 @@ + + + 4.0.0 + + com.fate + fate-modules + 3.6.3 + + + fate-fence + pom + + + fate-modules-fence 电子围栏 + + + fance-menghang-remote + fance-menghang-common + fance-menghang-service + + + + 17 + 17 + UTF-8 + + + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + io.springfox + springfox-swagger-ui + ${swagger.fox.version} + + + + + com.mysql + mysql-connector-j + 8.0.33 + + + + + com.fate + fate-common-datasource + 3.6.3 + + + + + com.fate + fate-common-datascope + 3.6.3 + + + + + com.fate + fate-common-log + 3.6.3 + + + + + com.fate + fate-common-swagger + 3.6.3 + + + + + + + + +